ZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCA1NzU2MDNmLi4wNWNjMmM1IDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0yNyw4ICsyNyw2IEBACiAgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCiAgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAogICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKLSAgICAgICAgLy8gTWVkaWFQbGF5ZXIyCi0gICAgICAgICJsaWJtZWRpYTJfam5pIiwKICAgICBdLAogICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLmtleSIsCiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvQW5kcm9pZC5icCBiL2NhbWVyYS9BbmRyb2lkLmJwCmluZGV4IDI0YjM5MTguLjIxNTg4ZDQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9BbmRyb2lkLmJwCkBAIC00Myw2ICs0Myw3IEBACiAgICAgICAgICJJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAiLAogICAgICAgICAiY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAiLAogICAgICAgICAiY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcCIsCisgICAgICAgICJjYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcCIsCiAgICAgICAgICJjYW1lcmEyL1N1Ym1pdEluZm8uY3BwIiwKICAgICAgICAgIkNhbWVyYUJhc2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVV0aWxzLmNwcCIsCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCBlMTQzZTA1Li45MmZlODRiIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQwOSw2ICs0MDgsNzkgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmFNZXRhZGF0YTo6cmVtb3ZlUGVybWlzc2lvbkVudHJpZXMobWV0YWRhdGFfdmVuZG9yX2lkX3QgdmVuZG9ySWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+ICp0YWdzUmVtb3ZlZCkgeworICAgIHVpbnQzMl90IHRhZ0NvdW50ID0gMDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdGFnc1RvUmVtb3ZlOworCisgICAgaWYgKHRhZ3NSZW1vdmVkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2VGFncyA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBpZiAoKG51bGxwdHIgPT0gdlRhZ3MuZ2V0KCkpIHx8ICgwID49IHZUYWdzLT5nZXRUYWdDb3VudCgpKSkgeworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU+IGNhY2hlID0KKyAgICAgICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKTsKKyAgICAgICAgaWYgKGNhY2hlLmdldCgpKSB7CisgICAgICAgICAgICBjYWNoZS0+Z2V0VmVuZG9yVGFnRGVzY3JpcHRvcih2ZW5kb3JJZCwgJnZUYWdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobnVsbHB0ciAhPSB2VGFncy5nZXQoKSkgJiYgKHZUYWdzLT5nZXRUYWdDb3VudCgpID4gMCkpIHsKKyAgICAgICAgdGFnQ291bnQgPSB2VGFncy0+Z2V0VGFnQ291bnQoKTsKKyAgICAgICAgdWludDMyX3QgKnZlbmRvclRhZ3MgPSBuZXcgdWludDMyX3RbdGFnQ291bnRdOworICAgICAgICBpZiAobnVsbHB0ciA9PSB2ZW5kb3JUYWdzKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHZUYWdzLT5nZXRUYWdBcnJheSh2ZW5kb3JUYWdzKTsKKworICAgICAgICB0YWdzVG9SZW1vdmUucmVzZXJ2ZSh0YWdDb3VudCk7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5pbnNlcnQodGFnc1RvUmVtb3ZlLmJlZ2luKCksIHZlbmRvclRhZ3MsIHZlbmRvclRhZ3MgKyB0YWdDb3VudCk7CisKKyAgICAgICAgZGVsZXRlIFtdIHZlbmRvclRhZ3M7CisgICAgICAgIHRhZ0NvdW50ID0gMDsKKyAgICB9CisKKyAgICBhdXRvIHRhZ3NOZWVkaW5nUGVybWlzc2lvbiA9IGdldF9jYW1lcmFfbWV0YWRhdGFfcGVybWlzc2lvbl9uZWVkZWQoJnRhZ0NvdW50KTsKKyAgICBpZiAodGFnQ291bnQgPiAwKSB7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5yZXNlcnZlKHRhZ3NUb1JlbW92ZS5jYXBhY2l0eSgpICsgdGFnQ291bnQpOworICAgICAgICB0YWdzVG9SZW1vdmUuaW5zZXJ0KHRhZ3NUb1JlbW92ZS5lbmQoKSwgdGFnc05lZWRpbmdQZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgIHRhZ3NOZWVkaW5nUGVybWlzc2lvbiArIHRhZ0NvdW50KTsKKyAgICB9CisKKyAgICB0YWdzUmVtb3ZlZC0+cmVzZXJ2ZSh0YWdzVG9SZW1vdmUuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogdGFnc1RvUmVtb3ZlKSB7CisgICAgICAgIGlmIChleGlzdHMoaXQpKSB7CisgICAgICAgICAgICBhdXRvIHJjID0gZXJhc2UoaXQpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZXJhc2UgdGFnOiAleCIsIF9fZnVuY19fLCBpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFnc1JlbW92ZWQtPnB1c2hfYmFjayhpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIGF2YWlsYWJsZSBjaGFyYWN0ZXJzdGljcyBhY2NvcmRpbmdseQorICAgIGlmIChleGlzdHMoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUykpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGN1cnJlbnRLZXlzOworCisgICAgICAgIHN0ZDo6c29ydCh0YWdzUmVtb3ZlZC0+YmVnaW4oKSwgdGFnc1JlbW92ZWQtPmVuZCgpKTsKKyAgICAgICAgYXV0byBrZXlzID0gZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgY3VycmVudEtleXMucmVzZXJ2ZShrZXlzLmNvdW50KTsKKyAgICAgICAgY3VycmVudEtleXMuaW5zZXJ0KGN1cnJlbnRLZXlzLmVuZCgpLCBrZXlzLmRhdGEuaTMyLCBrZXlzLmRhdGEuaTMyICsga2V5cy5jb3VudCk7CisgICAgICAgIHN0ZDo6c29ydChjdXJyZW50S2V5cy5iZWdpbigpLCBjdXJyZW50S2V5cy5lbmQoKSk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbmV3S2V5cyhrZXlzLmNvdW50KTsKKyAgICAgICAgYXV0byBlbmQgPSBzdGQ6OnNldF9kaWZmZXJlbmNlKGN1cnJlbnRLZXlzLmJlZ2luKCksIGN1cnJlbnRLZXlzLmVuZCgpLCB0YWdzUmVtb3ZlZC0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC0+ZW5kKCksIG5ld0tleXMuYmVnaW4oKSk7CisgICAgICAgIG5ld0tleXMucmVzaXplKGVuZCAtIG5ld0tleXMuYmVnaW4oKSk7CisKKyAgICAgICAgdXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMsIG5ld0tleXMuZGF0YSgpLCBuZXdLZXlzLnNpemUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiB2b2lkIENhbWVyYU1ldGFkYXRhOjpkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdCB7CiAgICAgZHVtcF9pbmRlbnRlZF9jYW1lcmFfbWV0YWRhdGEobUJ1ZmZlciwgZmQsIHZlcmJvc2l0eSwgaW5kZW50YXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmluZGV4IGE4NmNjODcuLmQ3MTNkMmQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTMxNSw2ICszMTUsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3QgeworICAgIHJldHVybiBtVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7Cit9CisKIHZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogCiAgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKQEAgLTQwNyw2ICs0MTEsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8bWV0YWRhdGFfdmVuZG9yX2lkX3QsIHNwPGFuZHJvaWQ6OlZlbmRvclRhZ0Rlc2NyaXB0b3I+PiAmCisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCkgeworICAgIHJldHVybiBtVmVuZG9yTWFwOworfQorCiBpbnQgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRUYWdDb3VudChtZXRhZGF0YV92ZW5kb3JfaWRfdCBpZCkgY29uc3QgewogICAgIGludCByZXQgPSAwOwogICAgIGF1dG8gZGVzYyA9IG1WZW5kb3JNYXAuZmluZChpZCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKaW5kZXggOWMwZjI4Yi4uYzAzODMxNCAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbApAQCAtMTQ5LDggKzE0OSwxMCBAQAogICAgIGNvbnN0IGludCBBUElfVkVSU0lPTl8xID0gMTsKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMiA9IDI7CiAKLSAgICAvLyBEZXRlcm1pbmVzIGlmIGEgcGFydGljdWxhciBBUEkgdmVyc2lvbiBpcyBzdXBwb3J0ZWQgZGlyZWN0bHkKKyAgICAvLyBEZXRlcm1pbmVzIGlmIGEgcGFydGljdWxhciBBUEkgdmVyc2lvbiBpcyBzdXBwb3J0ZWQgZGlyZWN0bHkgZm9yIGEgY2FtZXJhSWQuCiAgICAgYm9vbGVhbiBzdXBwb3J0c0NhbWVyYUFwaShTdHJpbmcgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKTsKKyAgICAvLyBEZXRlcm1pbmVzIGlmIGEgY2FtZXJhSWQgaXMgYSBoaWRkZW4gcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgICAgYm9vbGVhbiBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKFN0cmluZyBjYW1lcmFJZCk7CiAKICAgICB2b2lkIHNldFRvcmNoTW9kZShTdHJpbmcgY2FtZXJhSWQsIGJvb2xlYW4gZW5hYmxlZCwgSUJpbmRlciBjbGllbnRCaW5kZXIpOwogCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCmluZGV4IDRjZWQwOGMuLjQ5ZGZkZTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYU1ldGFkYXRhTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlNlc3Npb25Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi51dGlscy5TdWJtaXRJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCkBAIC04Myw2ICs4NCwxNiBAQAogICAgICAqLwogICAgIHZvaWQgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLCBpbiBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBzZXNzaW9uUGFyYW1zKTsKIAorICAgIC8qKgorICAgICAgKiBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gaGFzIGNhbWVyYSBkZXZpY2UKKyAgICAgICogc3VwcG9ydC4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHNlc3Npb25Db25maWd1cmF0aW9uIFNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbiB0byBiZSB2ZXJpZmllZC4KKyAgICAgICogQHJldHVybiB0cnVlICAtIGluIGNhc2UgdGhlIHN0cmVhbSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgICAqICAgICAgICAgZmFsc2UgLSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRldmljZSBzdXBwb3J0LgorICAgICAgKi8KKyAgICBib29sZWFuIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoaW4gU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24pOworCiAgICAgdm9pZCBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL1Nlc3Npb25Db25maWd1cmF0aW9uLmFpZGwKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtczsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIFNlc3Npb25Db25maWd1cmF0aW9uIGNwcF9oZWFkZXIgImNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmgiOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCBmZWIwNGMyLi4zMjFlYjA4IDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMTc1LDYgKzE3NSwxMiBAQAogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogfQogCitPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgaW50IHJvdGF0aW9uLCBpbnQgc3VyZmFjZVNldElELCAgaW50IHN1cmZhY2VUeXBlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgaXNTaGFyZWQpCisgIDogbUdicHMoZ2JwcyksIG1Sb3RhdGlvbihyb3RhdGlvbiksIG1TdXJmYWNlU2V0SUQoc3VyZmFjZVNldElEKSwgbVN1cmZhY2VUeXBlKHN1cmZhY2VUeXBlKSwKKyAgICBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Jc0RlZmVycmVkKGZhbHNlKSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7IH0KKwogc3RhdHVzX3QgT3V0cHV0Q29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogCiAgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzFhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2Vzc2lvbkNvbmZpZ3VyYXRpb24iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6cmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpbnQgb3BlcmF0aW5nTW9kZSA9IDA7CisKKyAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZvcGVyYXRpbmdNb2RlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBvcGVyYXRpbmcgbW9kZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0V2lkdGggPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmlucHV0V2lkdGgpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IHdpZHRoIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRIZWlnaHQgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmlucHV0SGVpZ2h0KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCBoZWlnaHQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dEZvcm1hdCA9IC0xOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmlucHV0Rm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCBmb3JtYXQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dFN0cmVhbXM7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZvdXRwdXRTdHJlYW1zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBvdXRwdXQgY29uZmlndXJhdGlvbnMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1PcGVyYXRpbmdNb2RlID0gb3BlcmF0aW5nTW9kZTsKKyAgICBtSW5wdXRXaWR0aCA9IGlucHV0V2lkdGg7CisgICAgbUlucHV0SGVpZ2h0ID0gaW5wdXRIZWlnaHQ7CisgICAgbUlucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBvdXRwdXRTdHJlYW1zKSB7CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIH0KKworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKworICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtT3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRXaWR0aCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRIZWlnaHQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0Rm9ybWF0KTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IobU91dHB1dFN0cmVhbXMpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb246Om91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiYgb3RoZXJPdXRwdXRTdHJlYW1zID0KKyAgICAgICAgICAgIG90aGVyLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpICE9ICBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtc1tpXSAhPSBvdGhlck91dHB1dFN0cmVhbXNbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uOjpvdXRwdXRzTGVzc1RoYW4oY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIG90aGVyT3V0cHV0U3RyZWFtcyA9CisgICAgICAgICAgICBvdGhlci5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSAhPSAgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXMuc2l6ZSgpIDwgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtc1tpXSAhPSBvdGhlck91dHB1dFN0cmVhbXNbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0U3RyZWFtc1tpXSA8IG90aGVyT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhhMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNhbWVyYXNlcnZlciIsCisKKyAgICBzcmNzOiBbIm1haW5fY2FtZXJhc2VydmVyLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi42ZjU1ODkwIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC0yMDYsNiArMjExLDkgQEAKICAgICAgKi8KICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgZ2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gbVZlbmRvck1hcDsKICAgICBzdHJ1Y3QgdmVuZG9yX3RhZ19jYWNoZV9vcHMgbVZlbmRvckNhY2hlT3BzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGE4MGY0NGIuLjViMTE3ZmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTY3LDYgKzY3LDExIEBACiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCiAgICAgICAgICAgICBpbnQgc3VyZmFjZVNldElEID0gSU5WQUxJRF9TRVRfSUQsIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSk7CiAKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgZ2JwcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGlvbiwgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIGludCB3aWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKKwogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoIG1Sb3RhdGlvbiA9PSBvdGhlci5tUm90YXRpb24gJiYKICAgICAgICAgICAgICAgICBtU3VyZmFjZVNldElEID09IG90aGVyLm1TdXJmYWNlU2V0SUQgJiYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYTIgeworbmFtZXNwYWNlIHBhcmFtcyB7CisKK2NsYXNzIE91dHB1dENvbmZpZ3VyYXRpb247CisKK2NsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIGdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXM7CisgICAgfQorCisgICAgaW50IGdldElucHV0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtSW5wdXRXaWR0aDsgfQorICAgIGludCBnZXRJbnB1dEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEhlaWdodDsgfQorICAgIGludCBnZXRJbnB1dEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEZvcm1hdDsgfQorICAgIGludCBnZXRPcGVyYXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbU9wZXJhdGluZ01vZGU7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIG1JbnB1dFdpZHRoKDApLAorICAgICAgICAgICAgbUlucHV0SGVpZ2h0KDApLAorICAgICAgICAgICAgbUlucHV0Rm9ybWF0KC0xKSwKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlKC0xKSB7fQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpIHsKKyAgICAgICAgcmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oaW50IGlucHV0V2lkdGgsIGludCBpbnB1dEhlaWdodCwgaW50IGlucHV0Rm9ybWF0LCBpbnQgb3BlcmF0aW5nTW9kZSkgOgorICAgICAgICBtSW5wdXRXaWR0aChpbnB1dFdpZHRoKSwgbUlucHV0SGVpZ2h0KGlucHV0SGVpZ2h0KSwgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU9wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG91dHB1dHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCA9PSBvdGhlci5tSW5wdXRXaWR0aCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEhlaWdodCA9PSBvdGhlci5tSW5wdXRIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPT0gb3RoZXIubUlucHV0Rm9ybWF0ICYmCisgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gb3RoZXIubU9wZXJhdGluZ01vZGUpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1JbnB1dFdpZHRoICE9IG90aGVyLm1JbnB1dFdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0V2lkdGggPCBvdGhlci5tSW5wdXRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRIZWlnaHQgIT0gb3RoZXIubUlucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SGVpZ2h0IDwgb3RoZXIubUlucHV0SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdCAhPSBvdGhlci5tSW5wdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRGb3JtYXQgPCBvdGhlci5tSW5wdXRGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3RoZXIubU9wZXJhdGluZ01vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3BlcmF0aW5nTW9kZSA8IG90aGVyLm1PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG91dHB1dHNMZXNzVGhhbihvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJmNvbmZpZykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soY29uZmlnKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBtT3V0cHV0U3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCwgbUlucHV0SGVpZ2h0LCBtSW5wdXRGb3JtYXQsIG1PcGVyYXRpbmdNb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIHBhcmFtcworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLjYwYzlmODUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyMSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsgYi9jYW1lcmEvbmRrL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWRkZjEuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL25kay9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYURldmljZS5jcHAgICAgICAgICAgICBcCi0gICAgTmRrQ2FwdHVyZVJlcXVlc3QuY3BwICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgICAgXAotICAgIGltcGwvQUNhbWVyYU1hbmFnZXIuY3BwICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFEZXZpY2UuY3BwICAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmEybmRrCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EIEVYUE9SVD0nX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKScKLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTERGTEFHUyArPSAtV2wsLS12ZXJzaW9uLXNjcmlwdD0kKExPQ0FMX1BBVEgpL2xpYmNhbWVyYTJuZGsubWFwLnR4dAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmxvZyBcCi0gICAgbGliZ3VpIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYW5kcm9pZF9ydW50aW1lIFwKLSAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCi0gICAgbGlibWVkaWFuZGsKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLmVmMDVlMGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC05Niw3ICsxMDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTA5LDcgKzExNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMjIsNyArMTMwLDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICgod2luZG93ID09IG51bGxwdHIpIHx8IChvdXQgPT0gbnVsbHB0cikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMzQsNyArMTQyLDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICBpZiAoYXJlV2luZG93VHlwZXNFcXVhbChvdXQtPm1XaW5kb3csIHdpbmRvdykpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKQEAgLTE0Nyw3ICsxNTUsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTE1OSw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byByZW1vdmUgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggNjBiNDc2My4uODc0MmQ5YyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCkBAIC0yMiw5ICsyMiwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgotI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgorI2Vsc2UKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogRVhQT1JUCiBBQ2FtZXJhTWFuYWdlciogQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCkgewpAQCAtMTA3LDcgKzExMywxNCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbWdyLCBjYW1lcmFJZCwgY2hhcnMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgcmV0dXJuIG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCBjaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzcENoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSBtZ3ItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnNwQ2hhcnMpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzcENoYXJzLT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MpOworICAgICpjaGFycyA9IHNwQ2hhcnMuZ2V0KCk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKIEVYUE9SVApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA2NWRlODFmLi4zNGVjMmRhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtNTcsMTMgKzU3LDE1IEBACiAgICAgICAgIEFMT0dFKCIlczogc3JjIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBuZXcgQUNhbWVyYU1ldGFkYXRhKCpzcmMpOworICAgIEFDYW1lcmFNZXRhZGF0YSogY29weSA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgY29weS0+aW5jU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2NvcHkpOworICAgIHJldHVybiBjb3B5OwogfQogCiBFWFBPUlQKIHZvaWQgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoQUNhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGVsZXRlIG1ldGFkYXRhOworICAgICAgICBtZXRhZGF0YS0+ZGVjU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2ZyZWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggYWMxODU2Yi4uYzY0ZGUzZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW5wdXQgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXF1ZXN0LT5zZXR0aW5nczsKKyAgICByZXF1ZXN0LT5zZXR0aW5ncy5jbGVhcigpOwogICAgIGRlbGV0ZSByZXF1ZXN0LT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXF1ZXN0OwogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggZjYwZTVmZC4uZmI3MmJkYiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIAogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp+QUNhbWVyYUNhcHR1cmVTZXNzaW9uKCkgewogICAgIEFMT0dWKCJ+QUNhbWVyYUNhcHR1cmVTZXNzaW9uOiAlcCBub3RpZnkgZGV2aWNlIGVuZCBvZiBsaWZlIiwgdGhpcyk7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIgJiYgIWRldi0+aXNDbG9zZWQoKSkgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgICAgIHsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgbUNsb3NlZEJ5QXBwID0gdHJ1ZTsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgIT0gbnVsbHB0cikgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgfQpAQCAtNzMsNyArNzMsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c3RvcFJlcGVhdGluZygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtOTEsNyArOTEsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6YWJvcnRDYXB0dXJlcygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiB9CiAKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTY4LDcgKzE2OCw3IEBACiBBQ2FtZXJhRGV2aWNlKgogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpnZXREZXZpY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTE4Miw5ICsxODIsOSBAQAogICAgIG1Jc0Nsb3NlZCA9IHRydWU7CiB9CiAKLXNwPENhbWVyYURldmljZT4KK3NwPGFjYW06OkNhbWVyYURldmljZT4KIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlU3AoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOwogICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0ciB8fCBkZXZpY2UtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgQUxPR1coIkRldmljZSBpcyBjbG9zZWQgYnV0IHNlc3Npb24gJWQgaXMgbm90IG5vdGlmaWVkIiwgbUlkKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKaW5kZXggYTIwNjhlNy4uMTMzYzJjOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaApAQCAtMTksMTIgKzE5LDE3IEBACiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgiCisjZWxzZQogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgewotICAgIGV4cGxpY2l0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dChBTmF0aXZlV2luZG93KiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSkgOgorICAgIGV4cGxpY2l0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dChBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKICAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKQEAgLTQwLDExICs0NSwxMiBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKLSAgICBzdGQ6OnNldDxBTmF0aXZlV2luZG93ICo+IG1TaGFyZWRXaW5kb3dzOworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFDYW1lcmFXaW5kb3dUeXBlICo+IG1TaGFyZWRXaW5kb3dzOwogICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKICAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIHsKICAgICBzdGQ6OnNldDxBQ2FwdHVyZVNlc3Npb25PdXRwdXQ+IG1PdXRwdXRzOwpAQCAtNjAsNyArNjYsNyBAQAogICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAogICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlKSA6CisgICAgICAgICAgICBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UqIGRldmljZSkgOgogICAgICAgICAgICAgbUlkKGlkKSwgbU91dHB1dCgqb3V0cHV0cyksIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrKCpjYiksCiAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSkge30KIApAQCAtOTcsMTggKzEwMywxOCBAQAogICAgIEFDYW1lcmFEZXZpY2UqIGdldERldmljZSgpOwogCiAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYURldmljZTsKKyAgICBmcmllbmQgY2xhc3MgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlOwogCiAgICAgLy8gQ2xvc2Ugc2Vzc2lvbiBiZWNhdXNlIGFwcCBjbG9zZSBjYW1lcmEgZGV2aWNlLCBjYW1lcmEgZGV2aWNlIGdvdCBFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgLy8gb3IgYSBuZXcgc2Vzc2lvbiBpcyByZXBsYWNpbmcgdGhpcyBzZXNzaW9uLgogICAgIHZvaWQgY2xvc2VCeURldmljZSgpOwogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOworICAgIHNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gZ2V0RGV2aWNlU3AoKTsKIAogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIG1PdXRwdXQ7CiAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrOwotICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICBjb25zdCB3cDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgYm9vbCAgbUlzQ2xvc2VkID0gZmFsc2U7CiAgICAgYm9vbCAgbUNsb3NlZEJ5QXBwID0gZmFsc2U7CiAgICAgTXV0ZXggbVNlc3Npb25Mb2NrOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGZmYWJmN2IuLjY1N2Q0MWYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwogLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ29udGV4dEtleSAgICAgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtEZXZpY2VLZXkgICAgICAgICA9ICJEZXZpY2UiOwpAQCAtNTAsMTEgKzUwLDExIEBACiBDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKICAgICAgICAgY29uc3QgY2hhciogaWQsCiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgogICAgICAgICBtQ2FtZXJhSWQoaWQpLAogICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCi0gICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbUNoYXJzKGNoYXJzKSwKICAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKQEAgLTQzNiw3ICs0MzYsNyBAQAogICAgIGlmIChyZXEgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXEtPnNldHRpbmdzOworICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxLT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXE7CiB9CkBAIC0xNTEzLDUgKzE1MTMsNSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLQorfSAvLyBuYW1lc3BhY2UgYWNhbQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggMTM2OTE0OC4uOGY1NmQzZiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKQEAgLTQ4LDcgKzQ5LDcgQEAKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTE1Niw3ICsxNTcsNyBAQAogICAgIG11dGFibGUgTXV0ZXggbURldmljZUxvY2s7CiAgICAgY29uc3QgU3RyaW5nOCBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcwogICAgIGNvbnN0IHNwPFNlcnZpY2VDYWxsYmFjaz4gbVNlcnZpY2VDYWxsYmFjazsKICAgICBBQ2FtZXJhRGV2aWNlKiBtV3JhcHBlcjsKIApAQCAtMjg2LDYgKzI4Nyw3IEBACiAKIH07CiAKK30gLy8gbmFtZXNwYWNlIGFjYW07CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvKioKQEAgLTI5NCw4ICsyOTYsOCBAQAogICovCiBzdHJ1Y3QgQUNhbWVyYURldmljZSB7CiAgICAgQUNhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgotICAgICAgICAgICAgbURldmljZShuZXcgQ2FtZXJhRGV2aWNlKGlkLCBjYiwgc3RkOjptb3ZlKGNoYXJzKSwgdGhpcykpIHt9CisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6CisgICAgICAgICAgICBtRGV2aWNlKG5ldyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UoaWQsIGNiLCBjaGFycywgdGhpcykpIHt9CiAKICAgICB+QUNhbWVyYURldmljZSgpIHt9OwogCkBAIC0zMzEsNyArMzMzLDcgQEAKICAgICB9CiAKICAgcHJpdmF0ZToKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOwogfTsKIAogI2VuZGlmIC8vIF9BQ0FNRVJBX0RFVklDRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCBjNTlkMGU3Li43ZDZlY2FjIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTI2LDkgKzI2LDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0gewogLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7CkBAIC0zNDUsNiArMzQ2LDcgQEAKICAgICB9CiB9CiAKK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogLyoqCkBAIC00MDIsNyArNDA0LDcgQEAKIH0KIAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBBQ2FtZXJhTWV0YWRhdGEgKipjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWRTdHIsIHNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CkBAIC00MzcsMTggKzQzOSwxNiBAQAogICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwKICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCiAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogb3V0RGV2aWNlKSB7Ci0gICAgQUNhbWVyYU1ldGFkYXRhKiByYXdDaGFyczsKLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmcmF3Q2hhcnMpOworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJmNoYXJzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycyhyYXdDaGFycyk7Ci0gICAgcmF3Q2hhcnMgPSBudWxscHRyOwogCi0gICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBzdGQ6Om1vdmUoY2hhcnMpKTsKKyAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIGNoYXJzKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKICAgICBpZiAoY3MgPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAppbmRleCBjYzQyZjc3Li41NWJmYTdlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0gewogCiAvKioKICAqIFBlci1wcm9jZXNzIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDYW1lcmFNYW5nZXIuIFNoYXJlZCBieSBhbGwgQUNhbWVyYU1hbmFnZXIKQEAgLTE3Miw2ICsxNzMsNyBAQAogICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7CiB9OwogCit9IC8vIG5hbWVzcGFjZSBhY2FtOwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogLyoqCkBAIC0xODAsMTMgKzE4MiwxMyBAQAogICovCiBzdHJ1Y3QgQUNhbWVyYU1hbmFnZXIgewogICAgIEFDYW1lcmFNYW5hZ2VyKCkgOgotICAgICAgICAgICAgbUdsb2JhbE1hbmFnZXIoJihhbmRyb2lkOjpDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpKSkge30KKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CiAgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CiAgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKICAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWQsIEFDYW1lcmFNZXRhZGF0YSAqKmNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwgYW5kcm9pZDo6c3A8QUNhbWVyYU1ldGFkYXRhPiogY2hhcmFjdGVyaXN0aWNzKTsKICAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CkBAIC0xOTYsNyArMTk4LDcgQEAKICAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQogICAgIH07CiAgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKIH07CiAKICNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAppbmRleCBmYzAwYTJkLi45NGI1NzEzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcApAQCAtMzIsNiArMzIsMTAgQEAKICAgICBpZiAobVR5cGUgPT0gQUNNX0NIQVJBQ1RFUklTVElDUykgewogICAgICAgICBmaWx0ZXJVbnN1cHBvcnRlZEZlYXR1cmVzKCk7CiAgICAgICAgIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TKTsKICAgICB9CiAgICAgLy8gVE9ETzogZmlsdGVyIHJlcXVlc3QvcmVzdWx0IGtleXMKIH0KQEAgLTgyLDYgKzg2LDcyIEBACiAKIAogdm9pZAorQUNhbWVyYU1ldGFkYXRhOjpmaWx0ZXJEdXJhdGlvbnModWludDMyX3QgdGFnKSB7CisgICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OworICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOworICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7CisgICAgY29uc3QgaW50IFNUUkVBTV9EVVJBVElPTl9PRkZTRVQgPSAzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9IG1EYXRhLmZpbmQodGFnKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCB8fCBlbnRyeS5jb3VudCAlIDQgfHwgZW50cnkudHlwZSAhPSBUWVBFX0lOVDY0KSB7CisgICAgICAgIEFMT0dFKCIlczogbWFsZm9ybWVkIGR1cmF0aW9uIGtleSAlZCEgY291bnQgJXp1LCB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRhZywgZW50cnkuY291bnQsIGVudHJ5LnR5cGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFZlY3RvcjxpbnQ2NF90PiBmaWx0ZXJlZER1cmF0aW9uczsKKyAgICBmaWx0ZXJlZER1cmF0aW9ucy5zZXRDYXBhY2l0eShlbnRyeS5jb3VudCAqIDIpOworCisgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQ2NF90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDY0X3Qgd2lkdGggPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDY0X3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUXTsKKworICAgICAgICAvLyBMZWF2ZSB0aGUgdW5maWx0ZXJlZCBmb3JtYXQgaW4gc28gYXBwcyBkZXBlbmRpbmcgb24gcHJldmlvdXMgd3JvbmcKKyAgICAgICAgLy8gZmlsdGVyIGJlaGF2aW9yIGNvbnRpbnVlIHRvIHdvcmsKKyAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworCisgICAgICAgIC8vIFRyYW5zbGF0ZSBIQUwgZm9ybWF0cyB0byBOREsgZm9ybWF0CisgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfSlBFRzsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1kxNikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0RFUFRIMTY7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rb3duIHRhZyAweCV4IiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICB9CisgICAgfQorCisgICAgbURhdGEudXBkYXRlKHRhZywgZmlsdGVyZWREdXJhdGlvbnMpOworfQorCit2b2lkCiBBQ2FtZXJhTWV0YWRhdGE6OmZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCkgewogICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKICAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOwpAQCAtMzYwLDYgKzQzMCw3IEBACiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX0hJU1RPR1JBTV9DT1VOVCwKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfU0hBUlBORVNTX01BUF9WQUxVRSwKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19TSEFSUE5FU1NfTUFQX1NJWkUsCisgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OLAogICAgIEFORFJPSURfREVQVEhfTUFYX0RFUFRIX1NBTVBMRVMsCiB9KTsKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDBmZDdlZmEuLmYyMWRiYWYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKQEAgLTIyLDcgKzIyLDEzIEBACiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KK3VzaW5nIENhbWVyYU1ldGFkYXRhID0gYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OkNhbWVyYU1ldGFkYXRhOworI2Vsc2UKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmg+CiAKQEAgLTU4LDEzICs2NCwxNiBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRUYWdzKC8qb3V0Ki9pbnQzMl90KiBudW1UYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIGNvbnN0OwogCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworCisgIHByaXZhdGU6CisKICAgICBib29sIGlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShjb25zdCBpbnQzMl90IGNhcGFiaWxpdHkpOwogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZlbmRvclRhZyhjb25zdCB1aW50MzJfdCB0YWcpOwogICAgIHN0YXRpYyBib29sIGlzQ2FwdHVyZVJlcXVlc3RUYWcoY29uc3QgdWludDMyX3QgdGFnKTsKICAgICB2b2lkIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsgLy8gSGlkZSBmZWF0dXJlcyBub3QgeWV0IHN1cHBvcnRlZCBieSBOREsKICAgICB2b2lkIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7IC8vIEhpZGUgaW5wdXQgc3RyZWFtcywgdHJhbnNsYXRlIGhhbCBmb3JtYXQgdG8gTkRLIGZvcm1hdHMKLQotICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKSBjb25zdDsKKyAgICB2b2lkIGZpbHRlckR1cmF0aW9ucyh1aW50MzJfdCB0YWcpOyAvLyB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cwogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJOQUxfVCwgdHlwZW5hbWUgTkRLX1Q+CiAgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZUltcGwodWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1QqIGRhdGEpIHsKQEAgLTk2LDcgKzEwNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgcHJpdmF0ZToKICAgICAvLyBndWFyZCBhY2Nlc3Mgb2YgcHVibGljIEFQSXM6IGdldC91cGRhdGUvZ2V0VGFncwogICAgIG11dGFibGUgTXV0ZXggICAgbUxvY2s7CiAgICAgQ2FtZXJhTWV0YWRhdGEgICBtRGF0YTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaAppbmRleCAwNmIyY2MzLi41YzgyYWI3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCkBAIC0yMSw4ICsyMSwxMSBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgiCisjZWxzZQogc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXQgewotICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQoQU5hdGl2ZVdpbmRvdyogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKKyAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OwogCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTM3LDggKzQwLDkgQEAKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OwogICAgIH0KIAotICAgIEFOYXRpdmVXaW5kb3cqIG1XaW5kb3c7CisgICAgQUNhbWVyYVdpbmRvd1R5cGUqIG1XaW5kb3c7CiB9OworI2VuZGlmCiAKIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0cyB7CiAgICAgc3RkOjpzZXQ8QUNhbWVyYU91dHB1dFRhcmdldD4gbU91dHB1dHM7CkBAIC01NSw3ICs1OSw3IEBACiAgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOwogICAgIH0KIAotICAgIEFDYW1lcmFNZXRhZGF0YSogICAgICBzZXR0aW5nczsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+ICAgc2V0dGluZ3M7CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldHMqIHRhcmdldHM7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgIGNvbnRleHQ7CiB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDVlMGRiNjAuLjEyNDQ1ODIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTM1LDEwICszNSwxMCBAQAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJOZGtDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgIk5ka0NhbWVyYVdpbmRvd1R5cGUuaCIKIAogI2lmbmRlZiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSAogI2RlZmluZSBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCkoCiAgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOwogCiB0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyB7CiAgICAgLy8vIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQuCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAppbmRleCA3YzEzYjM0Li40ZmU0M2Q1IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKQEAgLTM0LDEwICszNCwxMCBAQAogICovCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQU1FUkFfREVWSUNFX0gKICNkZWZpbmUgX05ES19DQU1FUkFfREVWSUNFX0gKQEAgLTM0NSw3ICszNDUsNyBAQAogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogRnJlZSBhIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBvYmplY3QuCkBAIC02OTQsNyArNjk0LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIEFkZCBhIG5hdGl2ZSB3aW5kb3cgdG8gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcxMiw3ICs3MTIsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZW1vdmUgYSBuYXRpdmUgd2luZG93IGZyb20gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcyOCw3ICs3MjgsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBDcmVhdGUgYSBuZXcgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBzaW1pbGFyIHRvIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufS4gVGhpcwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggYTlhZjc3ZS4uY2I0NzRmNCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC0yNzgzLDcgKzI3ODMsNyBAQAogICAgICAqICAge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgUkFXMTJ9LjwvbGk+CiAgICAgICogPGxpPlByb2Nlc3NlZCAoYnV0IG5vdC1zdGFsbGluZyk6IGFueSBub24tUkFXIGZvcm1hdCB3aXRob3V0IGEgc3RhbGwgZHVyYXRpb24uICBUeXBpY2FsbHkKICAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSwKLSAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjTlYyMSI+TlYyMTwvYT4sIG9yIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjWVYxMiI+WVYxMjwvYT4uPC9saT4KKyAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjTlYyMSI+TlYyMTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjWVYxMiI+WVYxMjwvYT4sIG9yIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSAuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TCkBAIC0zMjUxLDYgKzMyNTEsNyBAQAogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB9PC9saT4KICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCB9PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkFsbCBvdGhlciBmb3JtYXRzIG1heSBvciBtYXkgbm90IGhhdmUgYW4gYWxsb3dlZCBzdGFsbCBkdXJhdGlvbiBvbgogICAgICAqIGEgcGVyLWNhcGFiaWxpdHkgYmFzaXM7IHJlZmVyIHRvIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTCkBAIC0zMjg4LDYgKzMyODksODEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NDQUxFUl9DUk9QUElOR19UWVBFID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfY3JvcHBpbmdfdHlwZV90KQogICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxMywKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBjbGllbnQgdXNlIGNhc2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNV0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPk9wdGlvbmFsIHN1YnNldCBvZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB0aGF0IGNvbnRhaW5zCisgICAgICogc2ltaWxhciB0dXBsZXMgbGlzdGVkIGFzCisgICAgICogKGkuZS4gd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBvdXRwdXQvaW5wdXQgc3RyZWFtLCB1c2VjYXNlIGJpdCBmaWVsZCkuCisgICAgICogQ2FtZXJhIGRldmljZXMgd2lsbCBiZSBhYmxlIHRvIHN1Z2dlc3QgcGFydGljdWxhciBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICogcG93ZXIgYW5kIHBlcmZvcm1hbmNlIGVmZmljaWVudCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIHJldHJpZXZpbmcgdGhlIHN1Z2dlc3Rpb25zIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICogPHA+VGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgaW50WzVdLCB3aGljaCBtYXBzIHRvCisgICAgICogKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLiBUaGUgYXJyYXkgY2FuIGJlCisgICAgICogcGFyc2VkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHNldWRvIGNvZGU6PC9wPgorICAgICAqIDxwPnN0cnVjdCBTdHJlYW1Db25maWd1cmF0aW9uIHsKKyAgICAgKiBpbnQzMl90IGZvcm1hdDsKKyAgICAgKiBpbnQzMl90IHdpZHRoOworICAgICAqIGludDMyX3QgaGVpZ2h0OworICAgICAqIGludDMyX3QgaXNJbnB1dDsgfTs8L3A+CisgICAgICogPHA+dm9pZCBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgKiAgICAgaW50MzJfdCAqYXJyYXksIHNpemVfdCBjb3VudCwgaW50MzJfdCB1c2VjYXNlSWQsCisgICAgICogICAgIFZlY3RvciAmbHQ7IFN0cmVhbUNvbmZpZ3VyYXRpb24gJmd0OyAqIHNjcykgeworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDU7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMDsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMjsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7PC9wPgorICAgICAqIDxwcmU+PGNvZGU+Zm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBjb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgKiAgICAgaW50MzJfdCB3aWR0aCA9IGFycmF5W2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBoZWlnaHQgPSBhcnJheVtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGZvcm1hdCA9IGFycmF5W2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaXNJbnB1dCA9IGFycmF5W2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBzdXBwb3J0ZWRVc2VjYXNlcyA9IGFycmF5W2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgKiAgICAgaWYgKHN1cHBvcnRlZFVzZWNhc2VzICZhbXA7ICgxICZsdDsmbHQ7IHVzZWNhc2VJZCkpIHsKKyAgICAgKiAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gc2MgPSB7Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpc0lucHV0fTsKKyAgICAgKiAgICAgICAgIHNjcy0mZ3Q7YWRkKHNjKTsKKyAgICAgKiAgICAgfQorICAgICAqIH0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CisgICAgICogPHA+fTwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNCwKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBtYXBwaW5ncyBvZiBpbWFnZSBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzCisgICAgICogY2FtZXJhIGRldmljZSBmb3IgaW5wdXQgc3RyZWFtcywgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGEgcmVjb21tZW5kZWQgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1hcHBpbmdzIGZvdW5kIGluCisgICAgICogYW5kcm9pZC5zY2FsZXIuYXZhaWxhYmxlSW5wdXRPdXRwdXRGb3JtYXRzTWFwLiBUaGUgc2FtZSByZXF1aXJlbWVudHMgYXBwbHkgaGVyZSBhcyB3ZWxsLgorICAgICAqIFRoZSBsaXN0IGhvd2V2ZXIgZG9lc24ndCBuZWVkIHRvIGNvbnRhaW4gYWxsIGF2YWlsYWJsZSBhbmQgc3VwcG9ydGVkIG1hcHBpbmdzLiBJbnN0ZWFkIG9mCisgICAgICogdGhpcyBkZXZlbG9wZXJzIG11c3QgbGlzdCBvbmx5IHJlY29tbWVuZGVkIGFuZCBlZmZpY2llbnQgZW50cmllcy4KKyAgICAgKiBJZiBzZXQsIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgWkVST19TSFVUVEVSX0xBRyByZWNvbW1lbmRlZCBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9uIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0lOUFVUX09VVFBVVF9GT1JNQVRTX01BUCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyCisgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDE1LAogICAgIEFDQU1FUkFfU0NBTEVSX0VORCwKIAogICAgIC8qKgpAQCAtMzQ0OCw2ICszNTI0LDggQEAKICAgICAgKiA8cD5Tb21lIGRldmljZXMgbWF5IGNob29zZSB0byBwcm92aWRlIGEgc2Vjb25kIHNldCBvZiBjYWxpYnJhdGlvbgogICAgICAqIGluZm9ybWF0aW9uIGZvciBpbXByb3ZlZCBxdWFsaXR5LCBpbmNsdWRpbmcKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIgYW5kIGl0cyBjb3JyZXNwb25kaW5nIG1hdHJpY2VzLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKQEAgLTM0NzcsNiArMzU1NSw4IEBACiAgICAgICogPHA+SWYgdGhpcyBrZXkgaXMgcHJlc2VudCwgdGhlbiBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yLAogICAgICAqIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsIGFuZAogICAgICAqIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMiB3aWxsIGFsc28gYmUgcHJlc2VudC48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yCkBAIC0zNTA0LDYgKzM1ODQsOCBAQAogICAgICAqIGNvbG9yc3BhY2UpIGludG8gdGhpcyBjYW1lcmEgZGV2aWNlJ3MgbmF0aXZlIHNlbnNvciBjb2xvcgogICAgICAqIHNwYWNlIHVuZGVyIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEpLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzUzMSw2ICszNjEzLDggQEAKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyKS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNTU5LDYgKzM2NDMsOCBAQAogICAgICAqIGFuZCB0aGUgQ0lFIFhZWiBjb2xvcnNwYWNlIHdoZW4gY2FsY3VsYXRpbmcgdGhpcyB0cmFuc2Zvcm0gd2lsbAogICAgICAqIG1hdGNoIHRoZSBzdGFuZGFyZCB3aGl0ZSBwb2ludCBmb3IgdGhlIGZpcnN0IHJlZmVyZW5jZSBpbGx1bWluYW50CiAgICAgICogKGkuZS4gbm8gY2hyb21hdGljIGFkYXB0YXRpb24gd2lsbCBiZSBhcHBsaWVkIGJ5IHRoaXMgdHJhbnNmb3JtKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1ODksNiArMzY3NSw4IEBACiAgICAgICogKGkuZS4gbm8gY2hyb21hdGljIGFkYXB0YXRpb24gd2lsbCBiZSBhcHBsaWVkIGJ5IHRoaXMgdHJhbnNmb3JtKS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNjE1LDYgKzM3MDMsOCBAQAogICAgICAqIHRoaXMgbWF0cml4IGlzIGNob3NlbiBzbyB0aGF0IHRoZSBzdGFuZGFyZCB3aGl0ZSBwb2ludCBmb3IgdGhpcyByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGluIHRoZSByZWZlcmVuY2Ugc2Vuc29yIGNvbG9yc3BhY2UgaXMgbWFwcGVkIHRvIEQ1MCBpbiB0aGUKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNjQzLDYgKzM3MzMsOCBAQAogICAgICAqIENJRSBYWVogY29sb3JzcGFjZS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNjc1LDYgKzM3NjcsNyBAQAogICAgICAqIGxldmVsIHZhbHVlcy4gRm9yIHJhdyBjYXB0dXJlIGluIHBhcnRpY3VsYXIsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQogICAgICAqIHBpeGVscyBmcm9tIEFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUyB0byBjYWxjdWxhdGUgYmxhY2sKICAgICAgKiBsZXZlbCB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhIGRldmljZSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCkBAIC0zNzY5LDYgKzM4NjIsOCBAQAogICAgICAqIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGUgcHJvdmlkZWQgY29sb3IgdHJhbnNmb3JtcyB3aGVuCiAgICAgICogcHJvY2Vzc2luZyByYXcgc2Vuc29yIGRhdGEuPC9wPgogICAgICAqIDxwPlRoZSBvcmRlciBvZiB0aGUgdmFsdWVzIGlzIFIsIEcsIEI7IHdoZXJlIFIgaXMgaW4gdGhlIGxvd2VzdCBpbmRleC48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQgPSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvbmFsWzNdCiAgICAgICAgICAgICBBQ0FNRVJBX1NFTlNPUl9TVEFSVCArIDE4LApAQCAtMzc5OSw2ICszODk0LDggQEAKICAgICAgKiB0aGF0IGNoYW5uZWwuPC9wPgogICAgICAqIDxwPkEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbm9pc2UgbW9kZWwgY2FuIGJlIGZvdW5kIGluIHRoZQogICAgICAqIEFkb2JlIERORyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgTm9pc2VQcm9maWxlIHRhZy48L3A+CisgICAgICogPHA+Rm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIHRoZXJlIGlzIG9ubHkgb25lIGNvbG9yIGNoYW5uZWwuIFNvIHRoZSBub2lzZSBtb2RlbCBjb2VmZmljaWVudHMKKyAgICAgKiB3aWxsIG9ubHkgY29udGFpbiBvbmUgUyBhbmQgb25lIE8uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAogICAgICAqLwpAQCAtMzg0NCw2ICszOTQxLDggQEAKICAgICAgKiA8bGk+UiAmZ3Q7IDEuMjAgd2lsbCByZXF1aXJlIHN0cm9uZyBzb2Z0d2FyZSBjb3JyZWN0aW9uIHRvIHByb2R1Y2UKICAgICAgKiBhIHVzdWFibGUgaW1hZ2UgKCZndDsyMCUgZGl2ZXJnZW5jZSkuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9HUkVFTl9TUExJVCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdAogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAyMiwKQEAgLTM5OTYsNiArNDA5NSw3IEBACiAgICAgICogbGF5b3V0IGtleSAoc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UKSwgaS5lLiB0aGUKICAgICAgKiBudGggdmFsdWUgZ2l2ZW4gY29ycmVzcG9uZHMgdG8gdGhlIGJsYWNrIGxldmVsIG9mZnNldCBmb3IgdGhlIG50aAogICAgICAqIGNvbG9yIGNoYW5uZWwgbGlzdGVkIGluIHRoZSBDRkEuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLjwvcD4KICAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgaXMgYXZhaWxhYmxlIG9yIHRoZQogICAgICAqIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CiAgICAgICoKQEAgLTQwOTgsNyArNDE5OCw4IEBACiAgICAgLyoqCiAgICAgICogPHA+VGhlIGFycmFuZ2VtZW50IG9mIGNvbG9yIGZpbHRlcnMgb24gc2Vuc29yOwogICAgICAqIHJlcHJlc2VudHMgdGhlIGNvbG9ycyBpbiB0aGUgdG9wLWxlZnQgMngyIHNlY3Rpb24gb2YKLSAgICAgKiB0aGUgc2Vuc29yLCBpbiByZWFkaW5nIG9yZGVyLjwvcD4KKyAgICAgKiB0aGUgc2Vuc29yLCBpbiByZWFkaW5nIG9yZGVyLCBmb3IgYSBCYXllciBjYW1lcmEsIG9yIHRoZQorICAgICAqIGxpZ2h0IHNwZWN0cnVtIGl0IGNhcHR1cmVzIGZvciBNT05PQ0hST01FIGNhbWVyYS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfaW5mb19jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCk8L3A+CiAgICAgICoKQEAgLTQ1NjcsMTMgKzQ2NjgsMTMgQEAKICAgICAgKiAoeCx5KSDPtSAoMCAuLi4gTi0xLCAwIC4uLiBNLTEpIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2hhZGluZyBtYXAgYXQKICAgICAgKiBwaXhlbCAoICgoVy0xKS8oTi0xKSkgKiB4LCAoKEgtMSkvKE0tMSkpICogeSkgZm9yIHRoZSBmb3VyIGNvbG9yIGNoYW5uZWxzLgogICAgICAqIFRoZSBtYXAgaXMgYXNzdW1lZCB0byBiZSBiaWxpbmVhcmx5IGludGVycG9sYXRlZCBiZXR3ZWVuIHRoZSBzYW1wbGUgcG9pbnRzLjwvcD4KLSAgICAgKiA8cD5UaGUgY2hhbm5lbCBvcmRlciBpcyBbUiwgR2V2ZW4sIEdvZGQsIEJdLCB3aGVyZSBHZXZlbiBpcyB0aGUgZ3JlZW4KLSAgICAgKiBjaGFubmVsIGZvciB0aGUgZXZlbiByb3dzIG9mIGEgQmF5ZXIgcGF0dGVybiwgYW5kIEdvZGQgaXMgdGhlIG9kZCByb3dzLgorICAgICAqIDxwPkZvciBhIEJheWVyIGNhbWVyYSwgdGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMKKyAgICAgKiB0aGUgZ3JlZW4gY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KICAgICAgKiBUaGUgc2hhZGluZyBtYXAgaXMgc3RvcmVkIGluIGEgZnVsbHkgaW50ZXJsZWF2ZWQgZm9ybWF0LCBhbmQgaXRzIHNpemUKICAgICAgKiBpcyBwcm92aWRlZCBpbiB0aGUgY2FtZXJhIHN0YXRpYyBtZXRhZGF0YSBieSBBQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLjwvcD4KICAgICAgKiA8cD5UaGUgc2hhZGluZyBtYXAgd2lsbCBnZW5lcmFsbHkgaGF2ZSBvbiB0aGUgb3JkZXIgb2YgMzAtNDAgcm93cyBhbmQgY29sdW1ucywKICAgICAgKiBhbmQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gNjR4NjQuPC9wPgotICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHA+QXMgYW4gZXhhbXBsZSwgZ2l2ZW4gYSB2ZXJ5IHNtYWxsIG1hcCBmb3IgYSBCYXllciBjYW1lcmEgZGVmaW5lZCBhczo8L3A+CiAgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KICAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CiAgICAgICogWyAxLjMsIDEuMiwgMS4xNSwgMS4yLCAgMS4yLCAxLjIsIDEuMTUsIDEuMiwKQEAgLTQ1OTMsNiArNDY5NCwxNyBAQAogICAgICAqIGltYWdlIG9mIGEgZ3JheSB3YWxsICh1c2luZyBiaWN1YmljIGludGVycG9sYXRpb24gZm9yIHZpc3VhbCBxdWFsaXR5KQogICAgICAqIGFzIGNhcHR1cmVkIGJ5IHRoZSBzZW5zb3IgZ2l2ZXM6PC9wPgogICAgICAqIDxwPjxpbWcgYWx0PSJJbWFnZSBvZiBhIHVuaWZvcm0gd2hpdGUgd2FsbCAoaW52ZXJzZSBzaGFkaW5nIG1hcCkiIHNyYz0iLi4vaW1hZ2VzL2NhbWVyYTIvbWV0YWRhdGEvYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nTWFwL2ludl9zaGFkaW5nLnBuZyIgLz48L3A+CisgICAgICogPHA+Rm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuIEFuIGV4YW1wbGUKKyAgICAgKiBzaGFkaW5nIG1hcCBmb3Igc3VjaCBhIGNhbWVyYSBpcyBkZWZpbmVkIGFzOjwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPkFDQU1FUkFfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUgPSBbIDQsIDMgXQorICAgICAqIEFDQU1FUkFfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQID0KKyAgICAgKiBbIDEuMywgMS4zLCAxLjMsIDEuMywgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4xLCAxLjEsIDEuMSwgMS4xLCAgMS4zLCAxLjMsIDEuMywgMS4zLAorICAgICAqICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4xLCAxLjEsIDEuMSwgMS4xLAorICAgICAqICAgICAxLjAsIDEuMCwgMS4wLCAxLjAsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAxLjMsIDEuMywgMS4zLCAxLjMsICAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgICAxLjIsIDEuMiwgMS4yLCAxLjIsICAxLjMsIDEuMywgMS4zLCAxLjMgXQorICAgICAqIDwvY29kZT48L3ByZT4KICAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIFJBVyBpbWFnZSBkYXRhIG1pZ2h0IGJlIHN1YmplY3QgdG8gbGVucyBzaGFkaW5nCiAgICAgICogY29ycmVjdGlvbiBub3QgcmVwb3J0ZWQgb24gdGhpcyBtYXAuIFF1ZXJ5CiAgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19MRU5TX1NIQURJTkdfQVBQTElFRCB0byBzZWUgaWYgUkFXIGltYWdlIGRhdGEgaGFzIHN1YmplY3QKQEAgLTQ5MzYsOCArNTA0OCw4IEBACiAgICAgICogb2YgcG9pbnRzIGNhbiBiZSBsZXNzIHRoYW4gbWF4ICh0aGF0IGlzLCB0aGUgcmVxdWVzdCBkb2Vzbid0IGhhdmUgdG8KICAgICAgKiBhbHdheXMgcHJvdmlkZSBhIGN1cnZlIHdpdGggbnVtYmVyIG9mIHBvaW50cyBlcXVpdmFsZW50IHRvCiAgICAgICogQUNBTUVSQV9UT05FTUFQX01BWF9DVVJWRV9QT0lOVFMpLjwvcD4KLSAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgb25seSByZWQgY2hhbm5lbCBpcyB1c2VkLiBHcmVlbiBhbmQgYmx1ZSBjaGFubmVscwotICAgICAqIGFyZSBpZ25vcmVkLjwvcD4KKyAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgYWxsIHRocmVlIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBzZXQgb2YKKyAgICAgKiBjb250cm9sIHBvaW50cy48L3A+CiAgICAgICogPHA+QSBmZXcgZXhhbXBsZXMsIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGdyYXBoaWNhbCBtYXBwaW5nczsgdGhlc2UKICAgICAgKiBvbmx5IHNwZWNpZnkgdGhlIHJlZCBjaGFubmVsIGFuZCB0aGUgcHJlY2lzaW9uIGlzIGxpbWl0ZWQgdG8gNAogICAgICAqIGRpZ2l0cywgZm9yIGNvbmNpc2VuZXNzLjwvcD4KQEAgLTU0MTEsNiArNTUyMywzMiBAQAogICAgICAqLwogICAgIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFID0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2RlcHRoX2lzX2V4Y2x1c2l2ZV90KQogICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPk9wdGlvbmFsIHN1YnNldCBvZiB0aGUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TIHRoYXQKKyAgICAgKiBjb250YWlucyBzaW1pbGFyIHR1cGxlcyBsaXN0ZWQgYXMKKyAgICAgKiAoaS5lLiB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4KKyAgICAgKiBDYW1lcmEgZGV2aWNlcyB3aWxsIGJlIGFibGUgdG8gc3VnZ2VzdCBwYXJ0aWN1bGFyIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aGljaCBhcmUKKyAgICAgKiBwb3dlciBhbmQgcGVyZm9ybWFuY2UgZWZmaWNpZW50IGZvciBzcGVjaWZpYyB1c2UgY2FzZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0CisgICAgICogcmV0cmlldmluZyB0aGUgc3VnZ2VzdGlvbnMgc2VlCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNnZXRSZWNvbW1lbmRlZFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRSZWNvbW1lbmRlZFN0cmVhbUNvbmZpZ3VyYXRpb25NYXA8L2E+LjwvcD4KKyAgICAgKiA8cD5Gb3IgZGF0YSByZXByZXNlbnRhdGlvbiBwbGVhc2UgcmVmZXIgdG8KKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjVdCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNSwKICAgICBBQ0FNRVJBX0RFUFRIX0VORCwKIAogICAgIC8qKgpAQCAtNTQ1Nyw4ICs1NTk1LDggQEAKICAgICAgKiB3aWxsIG5vdCBzbG93IGRvd24gY2FwdHVyZSByYXRlIHdoZW4gYXBwbHlpbmcgY29ycmVjdGlvbi4gRkFTVCBtYXkgYmUgdGhlIHNhbWUgYXMgT0ZGIGlmCiAgICAgICogYW55IGNvcnJlY3Rpb24gYXQgYWxsIHdvdWxkIHNsb3cgZG93biBjYXB0dXJlIHJhdGUuICBFdmVyeSBvdXRwdXQgc3RyZWFtIHdpbGwgaGF2ZSBhCiAgICAgICogc2ltaWxhciBhbW91bnQgb2YgZW5oYW5jZW1lbnQgYXBwbGllZC48L3A+Ci0gICAgICogPHA+VGhlIGNvcnJlY3Rpb24gb25seSBhcHBsaWVzIHRvIHByb2Nlc3NlZCBvdXRwdXRzIHN1Y2ggYXMgWVVWLCBKUEVHLCBvciBERVBUSDE2OyBpdCBpcyBub3QKLSAgICAgKiBhcHBsaWVkIHRvIGFueSBSQVcgb3V0cHV0LjwvcD4KKyAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIFk4LCBKUEVHLCBvciBERVBUSDE2OyBpdCBpcworICAgICAqIG5vdCBhcHBsaWVkIHRvIGFueSBSQVcgb3V0cHV0LjwvcD4KICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgd2lsbCBiZSBvbiBieSBkZWZhdWx0IG9uIGRldmljZXMgdGhhdCBzdXBwb3J0IHRoaXMgY29udHJvbC4gQXBwbGljYXRpb25zCiAgICAgICogZGlzYWJsaW5nIGRpc3RvcnRpb24gY29ycmVjdGlvbiBuZWVkIHRvIHBheSBleHRyYSBhdHRlbnRpb24gd2l0aCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YKICAgICAgKiBtZXRlcmluZyByZWdpb25zLCBjcm9wIHJlZ2lvbiwgYW5kIGZhY2UgcmVjdGFuZ2xlcy4gV2hlbiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgT0ZGLApAQCAtNzE0Myw3ICs3MjgxLDcgQEAKICAgICAgKiBjYW1lcmEgZGV2aWNlIGNhbiBjYXB0dXJlIHRoaXMgc2l6ZSBmb3IgYXQgbGVhc3QgMTAgZnJhbWVzIHBlciBzZWNvbmQuICBBbHNvIHRoZQogICAgICAqIEFDQU1FUkFfQ09OVFJPTF9BRV9BVkFJTEFCTEVfVEFSR0VUX0ZQU19SQU5HRVMgZW50cnkgbGlzdHMgYXQgbGVhc3Qgb25lIEZQUyByYW5nZSB3aGVyZQogICAgICAqIHRoZSBtaW5pbXVtIEZQUyBpcyAmZ3Q7PSAxIC8gbWluaW11bUZyYW1lRHVyYXRpb24gZm9yIHRoZSBsYXJnZXN0IFlVVl80MjBfODg4IHNpemUuPC9wPgotICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKKyAgICAgKiA8cD5JZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCB9LCB0aGVuIHRob3NlIGNhbiBhbHNvIGJlCiAgICAgICogY2FwdHVyZWQgYXQgdGhlIHNhbWUgcmF0ZSBhcyB0aGUgbWF4aW11bS1zaXplIFlVVl80MjBfODg4IHJlc29sdXRpb24gaXMuPC9wPgogICAgICAqIDxwPkluIGFkZGl0aW9uLCB0aGUgQUNBTUVSQV9TWU5DX01BWF9MQVRFTkNZIGZpZWxkIGlzIGd1YXJhbnRlZCB0byBoYXZlIGEgdmFsdWUgYmV0d2VlbiAwCiAgICAgICogYW5kIDQsIGluY2x1c2l2ZS4gQUNBTUVSQV9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFIGFuZCBBQ0FNRVJBX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFCkBAIC03MTc3LDggKzczMTUsOCBAQAogICAgICAqIDxsaT5UaGUgQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUgZW50cnkgaXMgbGlzdGVkIGJ5IHRoaXMgZGV2aWNlLjwvbGk+CiAgICAgICogPGxpPkFzIG9mIEFuZHJvaWQgUCwgdGhlIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSBlbnRyeSBpcyBsaXN0ZWQgYnkgdGhpcyBkZXZpY2UuPC9saT4KICAgICAgKiA8bGk+QSBMSU1JVEVEIGNhbWVyYSB3aXRoIG9ubHkgdGhlIERFUFRIX09VVFBVVCBjYXBhYmlsaXR5IGRvZXMgbm90IGhhdmUgdG8gc3VwcG9ydAotICAgICAqICAgbm9ybWFsIFlVVl80MjBfODg4LCBKUEVHLCBhbmQgUFJJVi1mb3JtYXQgb3V0cHV0cy4gSXQgb25seSBoYXMgdG8gc3VwcG9ydCB0aGUgREVQVEgxNgotICAgICAqICAgZm9ybWF0LjwvbGk+CisgICAgICogICBub3JtYWwgWVVWXzQyMF84ODgsIFk4LCBKUEVHLCBhbmQgUFJJVi1mb3JtYXQgb3V0cHV0cy4gSXQgb25seSBoYXMgdG8gc3VwcG9ydCB0aGUKKyAgICAgKiAgIERFUFRIMTYgZm9ybWF0LjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5HZW5lcmFsbHksIGRlcHRoIG91dHB1dCBvcGVyYXRlcyBhdCBhIHNsb3dlciBmcmFtZSByYXRlIHRoYW4gc3RhbmRhcmQgY29sb3IgY2FwdHVyZSwKICAgICAgKiBzbyB0aGUgREVQVEgxNiBhbmQgREVQVEhfUE9JTlRfQ0xPVUQgZm9ybWF0cyB3aWxsIGNvbW1vbmx5IGhhdmUgYSBzdGFsbCBkdXJhdGlvbiB0aGF0CkBAIC03MjA5LDggKzczNDcsMTQgQEAKICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT1RJT05fVFJBQ0tJTkcgICAgICAgICAgID0gMTAsCiAKICAgICAvKioKLSAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzIHRoYXQgYXJlCi0gICAgICogYWxzbyBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIGNhbWVyYSBiYWNrZWQgYnkgdHdvIG9yIG1vcmUgcGh5c2ljYWwgY2FtZXJhcy4gSW4KKyAgICAgKiBBUEkgbGV2ZWwgMjgsIHRoZSBwaHlzaWNhbCBjYW1lcmFzIG11c3QgYWxzbyBiZSBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFJZExpc3QiPkNhbWVyYU1hbmFnZXIjZ2V0Q2FtZXJhSWRMaXN0PC9hPi4gU3RhcnRpbmcgZnJvbSBBUEkKKyAgICAgKiBsZXZlbCAyOSwgc29tZSBvciBhbGwgcGh5c2ljYWwgY2FtZXJhcyBtYXkgbm90IGJlIGluZGVwZW5kZW50bHkgZXhwb3NlZCB0byB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgcGh5c2ljYWwgY2FtZXJhIElEcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgaW4KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFJZExpc3QiPkNhbWVyYU1hbmFnZXIjZ2V0Q2FtZXJhSWRMaXN0PC9hPi4gQnV0IHRoZSBhcHBsaWNhdGlvbgorICAgICAqIGNhbiBzdGlsbCBxdWVyeSB0aGUgcGh5c2ljYWwgY2FtZXJhcycgY2hhcmFjdGVyaXN0aWNzIGJ5IGNhbGxpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MiPkNhbWVyYU1hbmFnZXIjZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9hPi48L3A+CiAgICAgICogPHA+Q2FtZXJhIGFwcGxpY2F0aW9uIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgYXQgbW9zdCAxIHJlYXIgY2FtZXJhIGFuZCAxIGZyb250CiAgICAgICogY2FtZXJhIGluIHRoZSBzeXN0ZW0uIEZvciBhbiBhcHBsaWNhdGlvbiB0aGF0IHN3aXRjaGVzIGJldHdlZW4gZnJvbnQgYW5kIGJhY2sgY2FtZXJhcywKICAgICAgKiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8gc3dpdGNoIGJldHdlZW4gdGhlIGZpcnN0IHJlYXIgY2FtZXJhIGFuZCB0aGUgZmlyc3QgZnJvbnQKQEAgLTcyNjUsNyArNzQwOSwxNSBAQAogCiAgICAgLyoqCiAgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBtb25vY2hyb21lIGNhbWVyYSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIGNvbG9yIGZpbHRlciBhcnJheSwKLSAgICAgKiBhbmQgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogYW5kIGZvciBZVVZfNDIwXzg4OCBzdHJlYW0sIHRoZSBwaXhlbCB2YWx1ZXMgb24gVSBhbmQgViBwbGFuZXMgYXJlIGFsbCAxMjguPC9wPgorICAgICAqIDxwPkEgTU9OT0NIUk9NRSBjYW1lcmEgbXVzdCBzdXBwb3J0IHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yCisgICAgICogaXRzIGRldmljZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLiBBZGRpdGlvbmFsbHksIGlmIHRoZSBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBzdXBwb3J0cyBZOCBmb3JtYXQsIGFsbCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyByZWxhdGVkIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSBhcHBseQorICAgICAqIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBhcyB3ZWxsLiBUaGVyZSBhcmUgbm8KKyAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyB3aXRoIHJlZ2FyZCB0bworICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBmb3IgQmF5ZXIgY2FtZXJhIGRldmljZXMuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGUgU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UIG9mIGEgTU9OT0NIUk9NRQorICAgICAqIGNhbWVyYSB3aWxsIGJlIGVpdGhlciBNT05PIG9yIE5JUi48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICA9IDEyLAogCkBAIC03Mjk0LDYgKzc0NDYsNjcgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfY3JvcHBpbmdfdHlwZV90OwogCisvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIC8qKgorICAgICAqIDxwPlByZXZpZXcgbXVzdCBvbmx5IGluY2x1ZGUgbm9uLXN0YWxsaW5nIHByb2Nlc3NlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aAorICAgICAqIG91dHB1dCBmb3JtYXRzIGxpa2UgWVVWXzQyMF84ODgsIElNUExFTUVOVEFUSU9OX0RFRklORUQsIGV0Yy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QUkVWSUVXCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5WaWRlbyByZWNvcmQgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IG1hdGNoIHRoZSBhZHZlcnRpc2VkCisgICAgICogc3VwcG9ydGVkIG1lZGlhIHByb2ZpbGVzIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gd2l0aAorICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JFQ09SRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gc25hcHNob3QgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhdCBsZWFzdCBhcyBiaWcgYXMKKyAgICAgKiB0aGUgbWF4aW11bSBSRUNPUkQgcmVzb2x1dGlvbnMgYW5kIG9ubHkgd2l0aCBmb3JtYXQgQkxPQiArIERBVEFTUEFDRV9KRklGCisgICAgICogZm9ybWF0L2RhdGFzcGFjZSBjb21iaW5hdGlvbiAoSlBFRykuIEFkZGl0aW9uYWxseSB0aGUgY29uZmlndXJhdGlvbnMgc2hvdWxkbid0IGNhdXNlCisgICAgICogcHJldmlldyBnbGl0Y2hlcyBhbmQgYWxzbyBiZSBhYmxlIHRvIHJ1biBhdCAzMCBmcHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVklERU9fU05BUFNIT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MiwKKworICAgIC8qKgorICAgICAqIDxwPlJlY29tbWVuZGVkIHNuYXBzaG90IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIHdpdGgKKyAgICAgKiBzaXplIGNsb3NlIHRvIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUgd2l0aCBCTE9CICsgREFUQVNQQUNFX0pGSUYKKyAgICAgKiBmb3JtYXQvZGF0YXNwYWNlIGNvbWJpbmF0aW9uIChKUEVHKS4gVGFraW5nIGludG8gYWNjb3VudCByZXN0cmljdGlvbnMgb24gYXNwZWN0CisgICAgICogcmF0aW8sIGFsaWdubWVudCBldGMuIHRoZSBhcmVhIG9mIHRoZSBtYXhpbXVtIHN1Z2dlc3RlZCBzaXplIHNob3VsZG7igJl0IGJlIGxlc3MgdGhhbgorICAgICAqIDk3JSBvZiB0aGUgc2Vuc29yIGFycmF5IHNpemUgYXJlYS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIGlucHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgYmUgYWR2ZXJ0aXNlZCB3aXRoCisgICAgICogWlNMIGFsb25nIHdpdGggb3RoZXIgcHJvY2Vzc2VkIGFuZC9vciBzdGFsbGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19aU0wgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgcmVjb21tZW5kZWQgcmF3IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgaW5jbHVkZSBSQVcgYmFzZWQKKyAgICAgKiBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SQVcgICA9IDB4NSwKKworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFVCTElDX0VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2LAorCisgICAgLyoqCisgICAgICogPHA+VmVuZG9yIGRlZmluZWQgdXNlIGNhc2VzLiBUaGVzZSBkZXBlbmQgb24gdGhlIHZlbmRvciBpbXBsZW1lbnRhdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19WRU5ET1JfU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTgsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zZW5zb3JfcmVmZXJlbmNlX2lsbHVtaW5hbnQxIHsKQEAgLTc0NzAsNiArNzY4MywyMSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX1JHQiAgICAgICAgICAgICAgICAgPSA0LAogCisgICAgLyoqCisgICAgICogPHA+U2Vuc29yIGRvZXNuJ3QgaGF2ZSBhbnkgQmF5ZXIgY29sb3IgZmlsdGVyLgorICAgICAqIFN1Y2ggc2Vuc29yIGNhcHR1cmVzIHZpc2libGUgbGlnaHQgaW4gbW9ub2Nocm9tZS4gVGhlIGV4YWN0IHdlaWdodGluZyBhbmQKKyAgICAgKiB3YXZlbGVuZ3RocyBjYXB0dXJlZCBpcyBub3Qgc3BlY2lmaWVkLCBidXQgZ2VuZXJhbGx5IG9ubHkgaW5jbHVkZXMgdGhlIHZpc2libGUKKyAgICAgKiBmcmVxdWVuY2llcy4gVGhpcyB2YWx1ZSBpbXBsaWVzIGEgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX01PTk8gICAgICAgICAgICAgICAgPSA1LAorCisgICAgLyoqCisgICAgICogPHA+U2Vuc29yIGhhcyBhIG5lYXIgaW5mcmFyZWQgZmlsdGVyIGNhcHR1cmluZyBsaWdodCB3aXRoIHdhdmVsZW5ndGggYmV0d2VlbgorICAgICAqIHJvdWdobHkgNzUwbm0gYW5kIDE0MDBubSwgYW5kIHRoZSBzYW1lIGZpbHRlciBjb3ZlcnMgdGhlIHdob2xlIHNlbnNvciBhcnJheS4gVGhpcworICAgICAqIHZhbHVlIGltcGxpZXMgYSBNT05PQ0hST01FIGNhbWVyYS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTklSICAgICAgICAgICAgICAgICA9IDYsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3Q7CiAKIC8vIEFDQU1FUkFfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorI2RlZmluZSBfTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICisKKy8qKgorICogQGFkZHRvZ3JvdXAgQ2FtZXJhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrQ2FtZXJhV2luZG93VHlwZS5oCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB3aW5kb3cgdHlwZSB1c2VkIGJ5IE5ESyBhbmQgdGhlIFZOREsgdmFyaWFudHMgb2YgdGhlCisgKiBjYW1lcmEyIE5ESy4gVGhpcyBlbmFibGVzIHVzIHRvIHNoYXJlIHRoZSBhcGkgZGVmaW5pdGlvbiBoZWFkZXJzIGFuZCBhdm9pZAorICogY29kZSBkdXBsaWNhdGlvbiAoc2luY2UgdGhlIFZOREsgdmFyaWFudCBkb2Vzbid0IHVzZSBBTmF0aXZlV2luZG93IHVubGlrZSB0aGUKKyAqIE5ESyB2YXJpYW50KS4KKyAqLworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgordHlwZWRlZiBuYXRpdmVfaGFuZGxlX3QgQUNhbWVyYVdpbmRvd1R5cGU7CisjZWxzZQorI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgordHlwZWRlZiBBTmF0aXZlV2luZG93IEFDYW1lcmFXaW5kb3dUeXBlOworI2VuZGlmCisKKyNlbmRpZiAvL19OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAppbmRleCA1MzQwZTc2Li4xMzY5ODlhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCkBAIC0zNSw5ICszNSw5IEBACiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQVBUVVJFX1JFUVVFU1RfSAogI2RlZmluZSBfTkRLX0NBUFRVUkVfUkVRVUVTVF9ICkBAIC0xMDEsNyArMTAxLDcgQEAKICAqCiAgKiBAc2VlIEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQKICAqLwotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LAogICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5ZTkwYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtV2luZG93ID09IG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPCBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKKyAgICBzdGQ6OnNldDxhbmRyb2lkOjphY2FtOjp1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcj4gbVNoYXJlZFdpbmRvd3M7CisgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOworICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7Cit9OworCisKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlNmIzYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTU5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYURldmljZVZlbmRvciIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKKy8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Vycm9yQ29kZUtleSAgICAgID0gIkVycm9yQ29kZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYWxsYmFja0ZwS2V5ICAgICA9ICJDYWxsYmFjayI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXNzaW9uU3BLZXkgICAgICA9ICJTZXNzaW9uU3AiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlcXVlc3RLZXkgPSAiQ2FwdHVyZVJlcXVlc3QiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprVGltZVN0YW1wS2V5ICAgICAgPSAiVGltZVN0YW1wIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXN1bHRLZXkgID0gIkNhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZUZhaWx1cmVLZXkgPSAiQ2FwdHVyZUZhaWx1cmUiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2VxdWVuY2VJZEtleSAgICAgPSAiU2VxdWVuY2VJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGcmFtZU51bWJlcktleSAgICA9ICJGcmFtZU51bWJlciI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtBbndLZXkgICAgICAgICAgICA9ICJBbnciOworCisvKioKKyAqIENhbWVyYURldmljZSBJbXBsZW1lbnRhdGlvbgorICovCitDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKKyAgICAgICAgY29uc3QgY2hhciogaWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKSA6CisgICAgICAgIG1DYW1lcmFJZChpZCksCisgICAgICAgIG1BcHBDYWxsYmFja3MoKmNiKSwKKyAgICAgICAgbUNoYXJzKHN0ZDo6bW92ZShjaGFycykpLAorICAgICAgICBtU2VydmljZUNhbGxiYWNrKG5ldyBTZXJ2aWNlQ2FsbGJhY2sodGhpcykpLAorICAgICAgICBtV3JhcHBlcih3cmFwcGVyKSwKKyAgICAgICAgbUluRXJyb3IoZmFsc2UpLAorICAgICAgICBtRXJyb3IoQUNBTUVSQV9PSyksCisgICAgICAgIG1JZGxlKHRydWUpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0cikgeworICAgIG1DbG9zaW5nID0gZmFsc2U7CisgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGRldmljZSBjYWxsYmFja3MgdG8gYXBwCisgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tZGV2LWxvb3BlciIpOworICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAvKnJ1bk9uQ2FsbGluZ1RocmVhZCovZmFsc2UsCisgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgfQorICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKworICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSA9IG1DaGFycy0+Z2V0SW50ZXJuYWxEYXRhKCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgIGlmIChlbnRyeS5jb3VudCAhPSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogYmFkIGNvdW50ICV6dSBmb3IgcGFydGlhbCByZXN1bHQgY291bnQiLCBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50KTsKKyAgICAgICAgbVBhcnRpYWxSZXN1bHRDb3VudCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBhcnRpYWxSZXN1bHRDb3VudCA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMikgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHNoYWRpbmcgbWFwIHNpemUiLCBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50KTsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gMDsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2hhZGluZ01hcFNpemVbMF0gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gZW50cnkuZGF0YS5pMzJbMV07CisgICAgfQorfQorCisvLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KK0NhbWVyYURldmljZTo6fkNhbWVyYURldmljZSgpIHsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICAgICAgaWYgKCFpc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBkaXNjb25uZWN0TG9ja2VkKHNlc3Npb24pOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZykgeworICAgIG1zZy0+cG9zdCgpOworICAgIG1zZy5jbGVhcigpOworICAgIHNwPEFNZXNzYWdlPiBjbGVhbnVwTXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xlYW5VcFNlc3Npb25zLCBtSGFuZGxlcik7CisgICAgY2xlYW51cE1zZy0+cG9zdCgpOworfQorCisvLyBUT0RPOiBjYWNoZWQgY3JlYXRlZCByZXF1ZXN0PworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhIHJhd1JlcXVlc3Q7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwodGVtcGxhdGVJZCksCisgICAgICAgIFsmc3RhdHVzLCAmcmF3UmVxdWVzdF0oYXV0byBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6Tk9fRVJST1IgJiYgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd1JlcXVlc3QpKSB7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgY3JlYXRlIGRlZmF1bHQgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgZGVmYXVsdCByZXF1ZXN0ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIEFDYXB0dXJlUmVxdWVzdCogb3V0UmVxID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOworICAgIG91dFJlcS0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKHJhd1JlcXVlc3QucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICBvdXRSZXEtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CisgICAgKnJlcXVlc3QgPSBvdXRSZXE7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pIHsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IGN1cnJlbnRTZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoY3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBjdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgICAgICBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uCisgICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycyk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbi4gY2Fubm90IGNvbmZpZ3VyZSBzdHJlYW1zIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBuZXdTZXNzaW9uID0gbmV3IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklkKyssIG91dHB1dHMsIGNhbGxiYWNrcywgdGhpcyk7CisKKyAgICAvLyBzZXQgbmV3IHNlc3Npb24gYXMgY3VycmVudCBzZXNzaW9uCisgICAgbmV3U2Vzc2lvbi0+aW5jU3Ryb25nKCh2b2lkICopIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24pOworICAgIG1DdXJyZW50U2Vzc2lvbiA9IG5ld1Nlc3Npb247CisgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgKnNlc3Npb24gPSBuZXdTZXNzaW9uOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordm9pZCBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpIHsKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSBhQ2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhX21ldGFkYXRhID0gbWV0YWRhdGFDb3B5LmdldEFuZExvY2soKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKGNhbWVyYV9tZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSk7CisgICAgbWV0YWRhdGFDb3B5LnVubG9jayhjYW1lcmFfbWV0YWRhdGEpOworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKDEpOworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MubWV0YWRhdGEoc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZworICAgIHN0ZDo6dmVjdG9yPGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RMaXN0OworICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+IHJlcXVlc3RzVjsKKyAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOworICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2Qgc2luY2UgYWZ0ZXIgc3VibWl0UmVxdWVzdExpc3QgaXMgY2FsbGVkLAorICAgICAgICAvLyB0aGUgcmVxdWVzdCBtZXRhZGF0YSBxdWV1ZSBtaWdodCBoYXZlIHJlbW92ZWQgdGhlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICAvLyBtZXRhZGF0YS4gVGhlcmVmb3JlIHdlIHNpbXBseSBhZGQgdGhlIG1ldGFkYXRhIHRvIGl0cyB3cmFwcGVyIGNsYXNzLAorICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSByZXRyaXZlZCBsYXRlci4KKyAgICAgICAgYWRkUmVxdWVzdFNldHRpbmdzTWV0YWRhdGEocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FwdHVyZSByZXF1ZXN0IHdpdGhvdXQgb3V0cHV0IHRhcmdldCBjYW5ub3QgYmUgc3VibWl0dGVkISIpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHV0aWxzOjpjb252ZXJ0VG9IaWRsKHJlcS5nZXQoKSkpOworICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisgICAgfQorICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgU3VibWl0SW5mbyBpbmZvOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5zdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmluZm9dKGF1dG8gcywgYXV0byAmc3VibWl0SW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHN1Ym1pdEluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBmb3Igc3VibWl0UmVxdWVzdExpc3QgY2FsbDogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gaW5mby5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLmxhc3RGcmFtZU51bWJlcjsKKyAgICBpZiAoc2VxdWVuY2VJZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgcmVxdWVzdCByZW1vdGUgZmFpbHVyZTogcmV0ICVkIiwgZ2V0SWQoKSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JIb2xkZXIoc2Vzc2lvbiwgcmVxdWVzdHNWLCBpc1JlcGVhdGluZywgY2JzKTsKKyAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgY2JIb2xkZXIpKTsKKworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCisgICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgIH0KKworICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IGZhbHNlOworICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmICghb3V0cHV0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIG91dHB1dCBjb25maWd1cmF0aW9uIGlzIG5vdCBzaGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChrdlBhaXIuc2Vjb25kLmZpcnN0LCBvdXRwdXQtPm1XaW5kb3cpKSB7CisgICAgICAgICAgICBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBJbnZhbGlkIG91dHB1dCBjb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ1c7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnID0gb3V0Q29uZmlnVy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICBvdXRDb25maWcucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRwdXQtPm1Sb3RhdGlvbik7CisgICAgb3V0Q29uZmlnLndpbmRvd0dyb3VwSWQgPSAtMTsgLy8gbmRrIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlciBPdXRwdXRDb25maWd1cmF0aW9uIGJ1ZmZlciBzaGFyaW5nLgorICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQtPm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzWzBdID0gb3V0cHV0LT5tV2luZG93OworICAgIGludCBpID0gMTsKKyAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKKyAgICAgICAgb3V0Q29uZmlnLndpbmRvd0hhbmRsZXNbaSsrXSA9IGFudzsKKyAgICB9CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oc3RyZWFtSWQsIG91dENvbmZpZyk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gdXBkYXRpbmcgT3V0cHV0Q29uZmlndXJhdGlvbjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHN3aXRjaCAocmVtb3RlUmV0KSB7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgaW52YWxpZCBvcGVyYXRpb24iLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBvdXRwdXQgc3VyZmFjZSBhbHJlYWR5IGV4aXN0cyIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgaW52YWxpZCBpbnB1dCBhcmd1bWVudCIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gYWRkIHNoYXJlZCBvdXRwdXQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIG1Db25maWd1cmVkT3V0cHV0c1tzdHJlYW1JZF0gPSBzdGQ6Om1ha2VfcGFpcihvdXRwdXQtPm1XaW5kb3csIG91dENvbmZpZ1cpOworCisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki9zcDxDYXB0dXJlUmVxdWVzdD4gJm91dFJlcSkgeworICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXEobmV3IENhcHR1cmVSZXF1ZXN0KCkpOworICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKDEpOworICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uaWQgPSBtQ2FtZXJhSWQ7CisgICAgLy8gVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdG8gY29weSB0aGUgbWV0YWRhdGEgaGVyZSA/CisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5ID0gcmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFNZXRhZGF0YSA9IG1ldGFkYXRhQ29weS5nZXRBbmRMb2NrKCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICB1dGlsczo6Y29udmVydFRvSGlkbChjYW1lcmFNZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSk7CisgICAgbWV0YWRhdGFDb3B5LnVubG9jayhjYW1lcmFNZXRhZGF0YSk7CisgICAgaWYgKHJlcXVlc3QtPnNldHRpbmdzICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oaENhbWVyYU1ldGFkYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLnNpemUoKSkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBtZXRhZGF0YSBmaWVsZCBvZiB0aGUgdW5pb24gd291bGQndmUgYmVlbiBkZXN0cnVjdHVlZCwgc28gbm8gbmVlZAorICAgICAgICAgICAgLy8gdG8gcmUtc2l6ZSBpdC4KKyAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbMF0uc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKAorICAgICAgICAgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZtcSB3cml0ZSBjYXB0dXJlIHJlc3VsdCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIpOworICAgICAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5tZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoaENhbWVyYU1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXF1ZXN0U3RyZWFtSWR4TGlzdDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXF1ZXN0U3VyZmFjZUlkeExpc3Q7CisgICAgZm9yIChhdXRvIG91dHB1dFRhcmdldCA6IHJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0cHV0VGFyZ2V0Lm1XaW5kb3c7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgcmVxLT5tU3VyZmFjZUxpc3QucHVzaF9iYWNrKGFudyk7CisgICAgICAgIC8vIGxvb2t1cCBzdHJlYW0vc3VyZmFjZSBJRAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXImIG91dENvbmZpZyA9IGt2UGFpci5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgY29uc3QgYXV0byYgd2luZG93SGFuZGxlcyA9IG91dENvbmZpZy5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICAgICAgZm9yIChpbnQgc3VyZmFjZUlkID0gMDsgc3VyZmFjZUlkIDwgKGludCkgd2luZG93SGFuZGxlcy5zaXplKCk7IHN1cmZhY2VJZCsrKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdHdvIG5hdGl2ZSBoYW5kbGVzIGFyZSBlcXVpdmFsZW50LCBzbyBhcmUgdGhlaXIgc3VyZmFjZXMuCisgICAgICAgICAgICAgICAgaWYgKHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKHdpbmRvd0hhbmRsZXNbc3VyZmFjZUlkXS5nZXROYXRpdmVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudykpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN1cmZhY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZWQgb3V0cHV0IHRhcmdldCAlcCBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgYW53KTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcy5yZXNpemUocmVxdWVzdFN0cmVhbUlkeExpc3Quc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RTdHJlYW1JZHhMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkc1tpXS5zdHJlYW1JZCA9IHJlcXVlc3RTdHJlYW1JZHhMaXN0W2ldOworICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHNbaV0ud2luZG93SWQgPSByZXF1ZXN0U3VyZmFjZUlkeExpc3RbaV07CisgICAgfQorICAgIG91dFJlcSA9IHJlcTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworQUNhcHR1cmVSZXF1ZXN0KgorQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSkgeworICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgQ2FtZXJhTWV0YWRhdGEgY2xvbmU7CisgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzWzBdLnNldHRpbmdzLm1ldGFkYXRhKCksICZjbG9uZSk7CisgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIHBSZXF1ZXN0LT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxLT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSByZXEtPm1TdXJmYWNlTGlzdFtpXTsKKyAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCBvdXRwdXRUYXJnZXQoYW53KTsKKyAgICAgICAgcFJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzLmluc2VydChvdXRwdXRUYXJnZXQpOworICAgIH0KKyAgICByZXR1cm4gcFJlcXVlc3Q7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqIHJlcSkgeworICAgIGlmIChyZXEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKKyAgICBkZWxldGUgcmVxLT50YXJnZXRzOworICAgIGRlbGV0ZSByZXE7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6bm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBpZiAoaXNDbG9zZWQoKSkgeworICAgICAgICAvLyBEZXZpY2UgaXMgY2xvc2luZyBhbHJlYWR5LiBkbyBub3RoaW5nCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKKyAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworCisgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KKyAgICBpZiAoIXNlc3Npb24tPm1Jc0Nsb3NlZCkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IHVuY2xvc2VkIHNlc3Npb24gJXAgcmVhY2hlcyBlbmQgb2YgbGlmZSEiLCBzZXNzaW9uKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIG5ldyBzZXNzaW9uLCB1bmNvbmZpZ3VyZSBub3cKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlIHN0cmVhbSBmYWlsZWQuIERldmljZSBtaWdodCBzdGlsbCBiZSBjb25maWd1cmVkISByZXQgJWQiLCByZXQpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBpZiAobUNsb3NpbmcuZXhjaGFuZ2UodHJ1ZSkpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBjbG9zaW5nLCBqdXN0IHJldHVybgorICAgICAgICBBTE9HVygiQ2FtZXJhIGRldmljZSAlcyBpcyBhbHJlYWR5IGNsb3NpbmcuIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVJlbW90ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hpbGUgZGlzY29ubmVjdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUmVtb3RlID0gbnVsbHB0cjsKKworICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OnN0b3BSZXBlYXRpbmdMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IG1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcjsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y2FuY2VsUmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oU3RhdHVzIHMsIGF1dG8gZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY2FuY2VsIGFjdGl2ZSByZXBlYXRpbmcgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChyZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmZsdXNoTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBhYm9ydCBjYXB0dXJlcyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiB3aWxsIGNsb3NlCisgICAgLy8gcHJldmlvdXMgb25lIGFuZCB0aHVzIHJlamVjdCBhbnkgQVBJIGNhbGwgZnJvbSBwcmV2aW91cyBzZXNzaW9uLgorICAgIC8vIEJ1dCBzdGlsbCBnb29kIHRvIGNoZWNrIGhlcmUgaW4gY2FzZSBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW4uCisgICAgaWYgKG1DdXJyZW50U2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc2Vzc2lvbiAlcCBpcyBub3QgY3VycmVudCBhY3RpdmUgc2Vzc2lvbiEiLCBnZXRJZCgpLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1GbHVzaGluZykgeworICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGlzIGFscmVhZHkgYWJvcnRpbmcgY2FwdHVyZXMiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgbUZsdXNoaW5nID0gdHJ1ZTsKKworICAgIC8vIFNlbmQgb25BY3RpdmUgY2FsbGJhY2sgdG8gZ3VhcmFudGVlIHRoZXJlIGlzIGFsd2F5cyBhY3RpdmUtPnJlYWR5IHRyYW5zaXRpb24KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisKKyAgICAvLyBJZiBkZXZpY2UgaXMgYWxyZWFkeSBpZGxpbmcsIHNlbmQgY2FsbGJhY2sgYW5kIGV4aXQgZWFybHkKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICBtRmx1c2hpbmcgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXI7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmZsdXNoKFsmc3RhdHVzLCAmbGFzdEZyYW1lTnVtYmVyXShhdXRvIHMsIGF1dG8gZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogQWJvcnQgY2FwdHVyZXMgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQobVJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6d2FpdFVudGlsSWRsZUxvY2tlZCgpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJXYWl0IHVudGlsIGNhbWVyYSAlcyBpZGxlIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHdvbid0IGdvIHRvIGlkbGUgd2hlbiB0aGVyZSBpcyByZXBlYXRpbmcgcmVxdWVzdCEiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT53YWl0VW50aWxJZGxlKCk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gd2FpdFVudGlsSWRsZSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gb3V0cHV0U2V0OworICAgIGZvciAoYXV0byBvdXRDb25maWcgOiBvdXRwdXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dENvbmZpZy5tV2luZG93OworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdJbnNlcnRXOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRDb25maWdJbnNlcnQgPSBvdXRDb25maWdJbnNlcnRXLm1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBvdXRDb25maWdJbnNlcnQucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRDb25maWcubVJvdGF0aW9uKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXMucmVzaXplKG91dENvbmZpZy5tU2hhcmVkV2luZG93cy5zaXplKCkgKyAxKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXNbMF0gPSBhbnc7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgd3JhcChhbncpOworICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFudywgb3V0Q29uZmlnSW5zZXJ0VykpOworICAgIH0KKyAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBhZGRTZXQgPSBvdXRwdXRTZXQ7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZGVsZXRlTGlzdDsKKworICAgIC8vIERldGVybWluZSB3aGljaCBzdHJlYW1zIG5lZWQgdG8gYmUgY3JlYXRlZCwgd2hpY2ggdG8gYmUgZGVsZXRlZAorICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgIGF1dG8mIG91dHB1dFBhaXIgPSBrdlBhaXIuc2Vjb25kOworICAgICAgICBpZiAob3V0cHV0U2V0LmNvdW50KG91dHB1dFBhaXIpKSB7CisgICAgICAgICAgICBkZWxldGVMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7IC8vIE5lZWQgdG8gZGVsZXRlIGEgbm8gbG9uZ2VyIG5lZWRlZCBzdHJlYW0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFNldC5lcmFzZShvdXRwdXRQYWlyKTsgICAgICAgIC8vIE5vIG5lZWQgdG8gYWRkIGFscmVhZHkgZXhpc3Rpbmcgc3RyZWFtCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCwgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHdhaXQgdW50aWwgaWRsZSBmYWlsZWQsIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gU2VuZCBvblJlYWR5IHRvIHByZXZpb3VzIHNlc3Npb24KKyAgICAvLyBDdXJyZW50U2Vzc2lvbiB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgY29uZmlndXJlU3RyZWFtTG9ja2VkLCBzbyBoZXJlCisgICAgLy8gbUN1cnJlbnRTZXNzaW9uIGlzIHRoZSBzZXNzaW9uIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHNlc3Npb24KKyAgICBpZiAoIW1JZGxlICYmIG1DdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVzeVNlc3Npb24gIT0gbUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgbUJ1c3lTZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIG1CdXN5U2Vzc2lvbi5jbGVhcigpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSB0cnVlOworCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKXx8IHJlbW90ZVJldCAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGJlZ2luIGNvbmZpZ3VyZSBmYWlsZWQiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICB9CisKKyAgICAvLyBkZWxldGUgdG8tYmUtZGVsZXRlZCBzdHJlYW1zCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogZGVsZXRlTGlzdCkgeworICAgICAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgcmVtb3RlUmV0ICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byByZW1vdmUgc3RyZWFtICVkIiwgZ2V0SWQoKSwgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuZXJhc2Uoc3RyZWFtSWQpOworICAgIH0KKworICAgIC8vIGFkZCBuZXcgc3RyZWFtcworICAgIGZvciAoYXV0byBvdXRwdXRQYWlyIDogYWRkU2V0KSB7CisgICAgICAgIGludCBzdHJlYW1JZDsKKyAgICAgICAgU3RhdHVzIHN0YXR1czsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0UGFpci5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc3RyZWFtSWRdKFN0YXR1cyBzLCBhdXRvIHN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0cmVhbUlkLCBvdXRwdXRQYWlyKSk7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgcGFyYW1zOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsUGFyYW1zOworICAgIGlmICgoc2Vzc2lvblBhcmFtZXRlcnMgIT0gbnVsbHB0cikgJiYgKHNlc3Npb25QYXJhbWV0ZXJzLT5zZXR0aW5ncyAhPSBudWxscHRyKSkgeworICAgICAgICBwYXJhbXMuYXBwZW5kKHNlc3Npb25QYXJhbWV0ZXJzLT5zZXR0aW5ncy0+Z2V0SW50ZXJuYWxEYXRhKCkpOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcGFyYW1zX21ldGFkYXRhID0gcGFyYW1zLmdldEFuZExvY2soKTsKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwocGFyYW1zX21ldGFkYXRhLCAmaGlkbFBhcmFtcyk7CisgICAgICAgIHBhcmFtcy51bmxvY2socGFyYW1zX21ldGFkYXRhKTsKKyAgICB9CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERSwgaGlkbFBhcmFtcyk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvcjogZW5kQ29uZmlndXJlIGZhaWxlZCAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIG1SZW1vdGUgPSByZW1vdGU7Cit9CisKK2Jvb2wKK0NhbWVyYURldmljZTo6c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICBBTE9HRSgibVJlbW90ZSBtdXN0IG5vdCBiZSBudWxsIHdoaWxlIHRyeWluZyB0byBmZXRjaCBtZXRhZGF0YSBxdWV1ZXMiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiAmcmVxUXVldWUgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlOworICAgICAgICBhdXRvIHJldCA9CisgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgWyZyZXFRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXFRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlcVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRW1wdHkgZm1xIGZyb20gY2FtZXJhc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXFRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gJnJlc1F1ZXVlID0gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlc3VsdE1ldGFkYXRhUXVldWU+KG1xRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3QgeworICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgaWYgKG1JbkVycm9yKSB7Ly8gdHJpZ2dlcmVkIGJ5IG9uRGV2aWNlRXJyb3IKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpIHsKKyAgICBtSW5FcnJvciA9IHRydWU7CisgICAgbUVycm9yID0gZXJyb3I7CisgICAgcmV0dXJuOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OkZyYW1lTnVtYmVyVHJhY2tlcjo6dXBkYXRlVHJhY2tlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCBib29sIGlzRXJyb3IpIHsKKyAgICBBTE9HVigidXBkYXRlVHJhY2tlciBmcmFtZSAlIiBQUklkNjQgIiBpc0Vycm9yICVkIiwgZnJhbWVOdW1iZXIsIGlzRXJyb3IpOworICAgIGlmIChpc0Vycm9yKSB7CisgICAgICAgIG1GdXR1cmVFcnJvclNldC5pbnNlcnQoZnJhbWVOdW1iZXIpOworICAgIH0gZWxzZSBpZiAoZnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIgZGVjcmVhc2VkISBjdXJyZW50IGZuICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBBTE9HRSgiRnJhbWUgbnVtYmVyIG91dCBvZiBvcmRlci4gRXhwZWN0ICUiIFBSSWQ2NCAiIGJ1dCBnZXQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAvLyBEbyBub3QgYXNzZXJ0IGFzIGluIGphdmEgaW1wbGVtZW50YXRpb24KKyAgICAgICAgfQorICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICB9CisgICAgdXBkYXRlKCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGUoKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVFcnJvclNldC5lbmQoKTspIHsKKyAgICAgICAgaW50NjRfdCBlcnJvckZyYW1lTnVtYmVyID0gKml0OworICAgICAgICBpZiAoZXJyb3JGcmFtZU51bWJlciA9PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIrKzsKKyAgICAgICAgICAgIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnJvckZyYW1lTnVtYmVyIDw9IG1Db21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGRlYWwgd2l0aCBpdCBhbnl3YXkKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZCBmcmFtZSBudW1iZXIgcGFzc2VkIHRocm91Z2ggY3VycmVudCBmcmFtZSBudW1iZXIhIik7CisgICAgICAgICAgICAvLyBlcmFzZSB0aGUgb2xkIGVycm9yIHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHVzZWZ1bAorICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm9ybWFsIHJlcXVlc3RzIGhhc24ndCBjYXRjaGVkIHVwIGVycm9yIGZyYW1lcywganVzdCBicmVhaworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlVwZGF0ZSBjb21wbGV0ZSBmcmFtZSAlIiBQUklkNjQsIG1Db21wbGV0ZWRGcmFtZU51bWJlcik7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6b25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGludCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCA9PSBtU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBjYXB0dXJlIHNlcXVlbmNlIGluZGV4ICVkIG5vdCBmb3VuZCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VxdWVuY2VJZCk7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworCisgICAgLy8gSGFuZGxlIGJ1ZmZlciBlcnJvcgorICAgIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9CisgICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgYXV0byBvdXRwdXRQYWlySXQgPSBtQ29uZmlndXJlZE91dHB1dHMuZmluZChzdHJlYW1JZCk7CisgICAgICAgIGlmIChvdXRwdXRQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBzdHJlYW0gaWQgJWQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYXV0byYgd2luZG93SGFuZGxlcyA9IG91dHB1dFBhaXJJdC0+c2Vjb25kLnNlY29uZC5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dEhhbmRsZSA6IHdpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW1BbmRXaW5kb3dJZCA6IHJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpbmRvd0lkID0gc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQ7CisgICAgICAgICAgICAgICAgaWYgKHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLG91dEhhbmRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4od2luZG93SGFuZGxlc1t3aW5kb3dJZF0uZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVzIExvc3Qgb3V0cHV0IGJ1ZmZlciBmb3IgQU5XICVwIGZyYW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBhbncsIGZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKSBhbncpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBIYW5kbGUgb3RoZXIgY2FwdHVyZSBmYWlsdXJlcworICAgICAgICAvLyBGaXJlIGNhcHR1cmUgZmFpbHVyZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUgcmVnaXN0ZXJlZAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkVycm9yID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlRmFpbGVkOworICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CisgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCisgICAgICAgIGZhaWx1cmUtPnJlYXNvbiAgICAgID0gQ0FQVFVSRV9GQUlMVVJFX1JFQVNPTl9FUlJPUjsKKyAgICAgICAgZmFpbHVyZS0+c2VxdWVuY2VJZCAgPSBzZXF1ZW5jZUlkOworICAgICAgICBmYWlsdXJlLT53YXNJbWFnZUNhcHR1cmVkID0gKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlRmFpbCwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uRXJyb3IpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKworICAgICAgICAvLyBVcGRhdGUgdHJhY2tlcgorICAgICAgICBtRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovdHJ1ZSk7CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPbkRpc2Nvbm5lY3RlZDoKKyAgICAgICAgY2FzZSBrV2hhdE9uRXJyb3I6CisgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgIEFMT0dWKCIlczogUmVjZWl2ZWQgbXNnICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrV2hhdENsZWFuVXBTZXNzaW9uczoKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOkVycm9yOiB1bmtub3duIGRldmljZSBjYWxsYmFjayAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBDaGVjayB0aGUgY29tbW9uIHBhcnQgb2YgYWxsIG1lc3NhZ2UKKyAgICB2b2lkKiBjb250ZXh0OworICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPbkRpc2Nvbm5lY3RlZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2sgb25EaXNjb25uZWN0ZWQ7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkRpc2Nvbm5lY3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbkRpc2Nvbm5lY3RlZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkRpc2Nvbm5lY3RlZCkoY29udGV4dCwgZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRPbkVycm9yOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXY7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKikgJmRldik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IGRldiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBkZXZpY2UgcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfRXJyb3JTdGF0ZUNhbGxiYWNrIG9uRXJyb3I7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkVycm9yKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG9uRXJyb3IhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrRXJyb3JDb2RlS2V5LCAmZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGVycm9yIGNvZGUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25FcnJvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpvbkVycm9yKShjb250ZXh0LCBkZXYsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtTZXNzaW9uU3BLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2Vzc2lvbiBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uKHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlU2Vzc2lvbio+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwID0gc3RhdGljX2Nhc3Q8Q2FwdHVyZVJlcXVlc3QqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrIG9uU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHN0YXRlIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TdGF0ZSkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHN0YXJ0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtUaW1lU3RhbXBLZXksICZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25GYWlsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25GYWlsID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlRmFpbHVyZUtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBmYWlsdXJlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmVTcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgICgqb25GYWlsKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBvblNlcUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TZXFFbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcXVlbmNlIGVuZCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblNlcUVuZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtTZXF1ZW5jZUlkS2V5LCAmc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa0ZyYW1lTnVtYmVyS2V5LCAmZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TZXFFbmQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHNlcUlkLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uU2VxQWJvcnQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU2VxQWJvcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcXVlbmNlIGVuZCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblNlcUFib3J0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa1NlcXVlbmNlSWRLZXksICZzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblNlcUFib3J0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCBzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3Qgb25CdWZmZXJMb3N0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkJ1ZmZlckxvc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGJ1ZmZlciBsb3N0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uQnVmZmVyTG9zdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudzsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtBbndLZXksICh2b2lkKiopICZhbncpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG5hdGl2ZV9oYW5kbGVfdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICAoKm9uQnVmZmVyTG9zdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgYW53LCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpIDoKKyAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLCBtQ2FsbGJhY2tzKGZpbGxDYihjYnMpKSB7fQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgKKyAgICBjb25zdCBpbnQgc2VxdWVuY2VJZCwgY29uc3QgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBTE9HVigiUmVwZWF0aW5nIHNlcUlkICVkIGxhc3RGcmFtZU51bWVyICUiIFBSSWQ2NCwgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyID09IE5PX0ZSQU1FU19DQVBUVVJFRCkgeworICAgICAgICBpZiAobVNlcXVlbmNlQ2FsbGJhY2tNYXAuY291bnQoc2VxdWVuY2VJZCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIk5vIGNhbGxiYWNrIGZvdW5kIGZvciBzZXF1ZW5jZUlkICVkIiwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICBhdXRvIGNiSXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSBjYkl0LT5zZWNvbmQ7CisgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAvLyBzZW5kIHNlcSBhYm9ydGVkIGNhbGxiYWNrCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxQWJvcnQsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVc2UgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwIHRvIHRyYWNrCisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisKKyAgICAgICAgLy8gTGFzdCBmcmFtZSBtaWdodCBoYXZlIGFycml2ZWQuIENoZWNrIG5vdworICAgICAgICBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKSB7CisgICAgaW50NjRfdCBjb21wbGV0ZWRGcmFtZU51bWJlciA9IG1GcmFtZU51bWJlclRyYWNrZXIuZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKTsKKyAgICBhdXRvIGl0ID0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5lbmQoKSkgeworICAgICAgICBpbnQgc2VxdWVuY2VJZCA9IGl0LT5maXJzdDsKKyAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBib29sIHNlcUNvbXBsZXRlZCA9IGZhbHNlOworICAgICAgICBib29sIGhhc0NhbGxiYWNrICA9IHRydWU7CisKKyAgICAgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBjbG9zZWQgd2hpbGUgY2hlY2tpbmcgc2VxdWVuY2UgY29tcGxldGUiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGNhbGxiYWNrIGZvciB0aGlzIHNlcXVlbmNlCisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYmVjYXVzZSB3ZSBhbHdheXMgcmVnaXN0ZXIgY2FsbGJhY2sgKHdpdGggbnVsbHB0ciBpbnNpZGUpCisgICAgICAgIGlmIChtU2VxdWVuY2VDYWxsYmFja01hcC5jb3VudChzZXF1ZW5jZUlkKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiTm8gY2FsbGJhY2sgZm91bmQgZm9yIHNlcXVlbmNlSWQgJWQiLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIGhhc0NhbGxiYWNrID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyIDw9IGNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBBTE9HVigic2VxICVkIHJlYWNoZWQgbGFzdCBmcmFtZSAlIiBQUklkNjQgIiwgY29tcGxldGVkICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlciwgY29tcGxldGVkRnJhbWVOdW1iZXIpOworICAgICAgICAgICAgc2VxQ29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXFDb21wbGV0ZWQgJiYgaGFzQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgICAgIGF1dG8gY2JJdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSBjYkl0LT5zZWNvbmQ7CisgICAgICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgICAgIC8vIHNlbmQgc2VxIGNvbXBsZXRlIGNhbGxiYWNrCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUVuZCwgbUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJhY2sgc2VxdWVuY2UgY29tcGxldGUgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcmVnaXN0ZXJlZAorICAgICAgICBpZiAoc2VxQ29tcGxldGVkIHx8ICFoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgICogQ2FtZXJhIHNlcnZpY2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgKi8KK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUVycm9yKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRCgiRGV2aWNlIGVycm9yIHJlY2VpdmVkLCBjb2RlICVkLCBmcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIsIHJlcXVlc3QgSUQgJWQsIHN1YnNlcSBJRCAlZCIsCisgICAgICAgICAgICBlcnJvckNvZGUsIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVzdWx0RXh0cmFzLmJ1cnN0SWQpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBkZXYtPm1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBDYW1lcmEgaXMgZGlzY29ubmVjdGVkLCBjbG9zZSB0aGUgc2Vzc2lvbiBhbmQgZXhwZWN0IG5vIG1vcmUgY2FsbGJhY2tzCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2LT5tQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRGlzY29ubmVjdGVkLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkRpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBlcnJvciBmcm9tIGNhbWVyYSBkZXZpY2U6ICVkIiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBlcnJvclZhbCA9IDo6RVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgICAgIC8vIFdlIGtlZXAgdGhpcyBzd2l0Y2ggc2luY2UgdGhpcyBibG9jayBtaWdodCBiZSBlbmNvdW50ZXJlZCB3aXRoCisgICAgICAgICAgICAvLyBtb3JlIHRoYW4ganVzdCAyIHN0YXRlcy4gVGhlIGRlZmF1bHQgZmFsbHRocm91Z2ggY291bGQgaGF2ZSB1cworICAgICAgICAgICAgLy8gaGFuZGxpbmcgbW9yZSB1bm1hdGNoZWQgZXJyb3IgY2FzZXMuCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9uRXJyb3IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQXBwQ2FsbGJhY2tzLm9uRXJyb3IpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrRXJyb3JDb2RlS2V5LCBlcnJvclZhbCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgZGV2LT5vbkNhcHR1cmVFcnJvckxvY2tlZChlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBBTE9HVigiQ2FtZXJhIGlzIG5vdyBpZGxlIik7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUlkbGUpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBpbiBpZGxlIHN0YXRlLiBQb3NzaWJseSBvdGhlciB0aHJlYWQgZGlkIHdhaXRVbnRpbElkbGUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5tQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgib25EZXZpY2VJZGxlIHNlbmRpbmcgc3RhdGUgY2IiKTsKKyAgICAgICAgaWYgKGRldi0+bUJ1c3lTZXNzaW9uICE9IGRldi0+bUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBkZXYtPm1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgc3AgZmlyc3Qgc28gdGhlIHNlc3Npb24gZGVzdHJ1Y3RvciBjYW4KKyAgICAgICAgLy8gb25seSBoYXBwZW4gb24gaGFuZGxlciB0aHJlYWQgKHdoZXJlIHdlIGRvbid0IGhvbGQgZGV2aWNlL3Nlc3Npb24gbG9jaykKKyAgICAgICAgZGV2LT5tQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgZGV2LT5tSWRsZSA9IHRydWU7CisgICAgZGV2LT5tRmx1c2hpbmcgPSBmYWxzZTsKKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkgfHwgZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworCisgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrVGltZVN0YW1wS2V5LCB0aW1lc3RhbXApOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXN1bHRSZWNlaXZlZCgKKyAgICAgICAgY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7CisgICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIGludDMyX3Qgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBib29sICAgIGlzUGFydGlhbFJlc3VsdCA9IChyZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50IDwgZGV2LT5tUGFydGlhbFJlc3VsdENvdW50KTsKKworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIEFMT0dWKCJTZXFJZCAlZCBmcmFtZSAlIiBQUklkNjQgIiByZXN1bHQgYXJyaXZlLiIsIHNlcXVlbmNlSWQsIGZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQKKyAgICB9CisKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBkZXYtPm1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi9mYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWFybHkgcmV0dXJuIHRvIGF2b2lkIGNhbGxiYWNrIHNlbnQgdG8gY2xvc2VkIGRldmljZXMKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICAgIGlmIChyZXN1bHRNZXRhZGF0YS5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CisgICAgICAgIGhDYW1lcmFNZXRhZGF0YS5yZXNpemUocmVzdWx0TWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICBib29sIHJlYWQgPSBkZXYtPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+cmVhZChoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogRG8gd2UgYWN0dWFsbHkgbmVlZCB0byBjbG9uZSBoZXJlID8KKyAgICAgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoaENhbWVyYU1ldGFkYXRhLCAmbWV0YWRhdGFDb3B5KTsKKworICAgIH0gZWxzZSB7CisgICAgICAgICAgY29udmVydGVkID0gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChyZXN1bHRNZXRhZGF0YS5tZXRhZGF0YSgpLCAmbWV0YWRhdGFDb3B5KTsKKyAgICB9CisKKyAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICBBTE9HRSgiJXMgcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLCBkZXYtPm1TaGFkaW5nTWFwU2l6ZSwgLypkYXRhX2NvdW50Ki8yKTsKKyAgICBtZXRhZGF0YUNvcHkudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsICZmcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvblJlc3VsdCA9IGlzUGFydGlhbFJlc3VsdCA/CisgICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlUHJvZ3Jlc3NlZCA6CisgICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVJlc3VsdCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25SZXN1bHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgcmVzdWx0KTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBkZXYtPm1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi9mYWxzZSk7CisgICAgICAgIGRldi0+Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICAgICAgdWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLCBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworCisgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgIGlmIChzdG9wcGVkU2VxdWVuY2VJZCA9PSByZXBlYXRpbmdTZXF1ZW5jZUlkKSB7CisgICAgICAgIGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisgICAgfQorCisgICAgZGV2LT5jaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWEyMTlmCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0FDQU1FUkFfREVWSUNFX0gKKyNkZWZpbmUgX0FDQU1FUkFfREVWSUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSUNhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBJQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBTdWJtaXRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEVycm9yQ29kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6RXJyb3JDb2RlOwordXNpbmcgRm1xU2l6ZU9yTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkZtcVNpemVPck1ldGFkYXRhOwordXNpbmcgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgdXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI7Cit1c2luZyB1dGlsczo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyB1dGlsczo6T3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI7CisKKy8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IENhbWVyYUNhcHR1cmVGYWlsdXJlIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgeyB9OworCitjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpOworICAgIH5DYW1lcmFEZXZpY2UoKTsKKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW1lcmFJZC5jX3N0cigpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0OworCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOworCisgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKKyAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgSUNhbWVyYURldmljZUNhbGxiYWNrIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgU2VydmljZUNhbGxiYWNrKENhbWVyYURldmljZSogZGV2aWNlKSA6IG1EZXZpY2UoZGV2aWNlKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlRXJyb3IoRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcih1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgb3ZlcnJpZGU7CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CisgICAgfTsKKyAgICBpbmxpbmUgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBnZXRTZXJ2aWNlQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBtU2VydmljZUNhbGxiYWNrOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgdm9pZCBzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSk7CisKKyAgICBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgaW5saW5lIEFDYW1lcmFEZXZpY2UqIGdldFdyYXBwZXIoKSBjb25zdCB7IHJldHVybiBtV3JhcHBlcjsgfTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb247CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3Q7CisKKyAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKKyAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbik7IC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQorCisgICAgY2FtZXJhX3N0YXR1c190IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCisgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4mIG91dFJlcSk7CisKKyAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSk7CisgICAgc3RhdGljIHZvaWQgZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqKTsKKworICAgIC8vIG9ubHkgRm9yIHNlc3Npb24gdG8gaG9sZCBkZXZpY2UgbG9jaworICAgIC8vIEFsd2F5cyBncmFiIGRldmljZSBsb2NrIGJlZm9yZSBncmFiYmluZyBzZXNzaW9uIGxvY2sKKyAgICB2b2lkIGxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCkgY29uc3QgeyBtRGV2aWNlTG9jay5sb2NrKCk7IH07CisgICAgdm9pZCB1bmxvY2tEZXZpY2UoKSBjb25zdCB7IG1EZXZpY2VMb2NrLnVubG9jaygpOyB9OworCisgICAgLy8gRm9yIGNhcHR1cmUgc2Vzc2lvbiB0byBub3RpZnkgaXRzIGVuZCBvZiBsaWZlCisgICAgdm9pZCBub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworCisgICAgLy8gSW5wdXQgbWVzc2FnZSB3aWxsIGJlIHBvc3RlZCBhbmQgY2xlYXJlZCBhZnRlciB0aGlzIHJldHVybnMKKyAgICB2b2lkIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZyk7CisKKyAgICBtdXRhYmxlIE11dGV4IG1EZXZpY2VMb2NrOworICAgIGNvbnN0IGhpZGxfc3RyaW5nIG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAorICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgIC8vIENhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBjb25zdCBzcDxTZXJ2aWNlQ2FsbGJhY2s+IG1TZXJ2aWNlQ2FsbGJhY2s7CisgICAgQUNhbWVyYURldmljZSogbVdyYXBwZXI7CisKKyAgICAvLyBzdHJlYW0gaWQgLT4gcGFpciBvZiAoQUNhbWVyYVdpbmRvd1R5cGUqIGZyb20gYXBwbGljYXRpb24sIE91dHB1dENvbmZpZ3VyYXRpb24gdXNlZCBmb3IKKyAgICAvLyBjYW1lcmEgc2VydmljZSkKKyAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IG1Db25maWd1cmVkT3V0cHV0czsKKworICAgIC8vIFRPRE86IG1heWJlIGEgYm9vbCB3aWxsIHN1ZmZpY2UgZm9yIHN5bmNocm9ub3VzIGltcGxlbWVudGF0aW9uPworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUNsb3Npbmc7CisgICAgaW5saW5lIGJvb2wgaXNDbG9zZWQoKSB7IHJldHVybiBtQ2xvc2luZzsgfQorCisgICAgYm9vbCBtSW5FcnJvciA9IGZhbHNlOworICAgIGNhbWVyYV9zdGF0dXNfdCBtRXJyb3IgPSBBQ0FNRVJBX09LOworICAgIHZvaWQgb25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKworICAgIGJvb2wgbUlkbGUgPSB0cnVlOworICAgIC8vIFRoaXMgd2lsbCBhdm9pZCBhIGJ1c3kgc2Vzc2lvbiBiZWluZyBkZWxldGVkIGJlZm9yZSBpdCdzIGJhY2sgdG8gaWRsZSBzdGF0ZQorICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUJ1c3lTZXNzaW9uOworCisgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IG1SZW1vdGU7CisKKyAgICAvLyBMb29wZXIgdGhyZWFkIHRvIGhhbmRsZSBjYWxsYmFjayB0byBhcHAKKyAgICBzcDxBTG9vcGVyPiBtQ2JMb29wZXI7CisgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCisgICAgZW51bSB7CisgICAgICAgIC8vIERldmljZSBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRPbkRpc2Nvbm5lY3RlZCwgICAvLyBvbkRpc2Nvbm5lY3RlZAorICAgICAgICBrV2hhdE9uRXJyb3IsICAgICAgICAgIC8vIG9uRXJyb3IKKyAgICAgICAgLy8gU2Vzc2lvbiBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQorICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcworICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Vycm9yQ29kZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXNzaW9uU3BLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Fud0tleTsKKworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKKyAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jaworICAgICAgICBWZWN0b3I8c3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPj4gbUNhY2hlZFNlc3Npb25zOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgorICAgIHdwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUN1cnJlbnRTZXNzaW9uOworICAgIGJvb2wgbUZsdXNoaW5nID0gZmFsc2U7CisKKyAgICBpbnQgbU5leHRTZXNzaW9uSWQgPSAwOworICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgYW5vdGhlciBsb29wZXIvaGFuZGxlciB0byBoYW5kbGUgY2FsbGJhY2tzIGZyb20gc2VydmljZQorCisgICAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKyAgICBpbnQgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBsYXN0IGZyYW1lIG51bWJlciBtYXAKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQ2NF90PiBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXA7CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIb2xkZXIgeworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworCisgICAgICAgIHN0YXRpYyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBmaWxsQ2IoCisgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgeworICAgICAgICAgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICpjYnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4geyBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyIH07CisgICAgICAgIH0KKworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgbVNlc3Npb247CisgICAgICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+IG1SZXF1ZXN0czsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhbGxiYWNrczsKKyAgICB9OworICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKKyAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5PX0ZSQU1FU19DQVBUVVJFRCA9IC0xOworICAgIGNsYXNzIEZyYW1lTnVtYmVyVHJhY2tlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIC8vIFRPRE86IENhbGxlZCBpbiBvblJlc3VsdFJlY2VpdmVkIGFuZCBvbkNhcHR1cmVFcnJvckxvY2tlZAorICAgICAgICB2b2lkIHVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKTsKKyAgICAgICAgaW5saW5lIGludDY0X3QgZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKSB7IHJldHVybiBtQ29tcGxldGVkRnJhbWVOdW1iZXI7IH0KKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdXBkYXRlKCk7CisgICAgICAgIHZvaWQgdXBkYXRlQ29tcGxldGVkRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgaW50NjRfdCBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBOT19GUkFNRVNfQ0FQVFVSRUQ7CisgICAgICAgIExpc3Q8aW50NjRfdD4gbVNraXBwZWRGcmFtZU51bWJlcnM7CisgICAgICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1GdXR1cmVFcnJvclNldDsKKyAgICB9OworICAgIEZyYW1lTnVtYmVyVHJhY2tlciBtRnJhbWVOdW1iZXJUcmFja2VyOworCisgICAgdm9pZCBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKworICAgIC8vIE1pc2MgdmFyaWFibGVzCisgICAgaW50MzJfdCBtU2hhZGluZ01hcFNpemVbMl07ICAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBpbnQzMl90IG1QYXJ0aWFsUmVzdWx0Q291bnQ7ICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFjYW07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOworCisvKioKKyAqIEFDYW1lcmFEZXZpY2Ugb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKKyAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorCisgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqCisgICAgICogTkRLIHB1YmxpYyBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlLT5nZXRJZCgpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHJlcXVlc3QpOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBEZXZpY2UgaW50ZXJhbCBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVEZXZpY2UoYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgICAgICBtRGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UocmVtb3RlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7Cit9OworCisjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk1YjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhTWFuYWdlclZlbmRvciIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FtZXJhSWRLZXkgICA9ICJDYW1lcmFJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FsbGJhY2tGcEtleSA9ICJDYWxsYmFja0ZwIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDb250ZXh0S2V5ICAgID0gIkNhbGxiYWNrQ29udGV4dCI7CitNdXRleCAgICAgICAgICAgICAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzTG9jazsKK0NhbWVyYU1hbmFnZXJHbG9iYWwqIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNJbnN0YW5jZSA9IG51bGxwdHI7CisKK0NhbWVyYU1hbmFnZXJHbG9iYWwmCitDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOworICAgIENhbWVyYU1hbmFnZXJHbG9iYWwqIGluc3RhbmNlID0gc0luc3RhbmNlOworICAgIGlmIChpbnN0YW5jZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluc3RhbmNlID0gbmV3IENhbWVyYU1hbmFnZXJHbG9iYWwoKTsKKyAgICAgICAgc0luc3RhbmNlID0gaW5zdGFuY2U7CisgICAgfQorICAgIHJldHVybiAqaW5zdGFuY2U7Cit9CisKK0NhbWVyYU1hbmFnZXJHbG9iYWw6On5DYW1lcmFNYW5hZ2VyR2xvYmFsKCkgeworICAgIC8vIGNsZWFyIHNJbnN0YW5jZSBzbyBuZXh0IGdldEluc3RhbmNlIGNhbGwga25vd3MgdG8gY3JlYXRlIGEgbmV3IG9uZQorICAgIE11dGV4OjpBdXRvbG9jayBfc2woc0xvY2spOworICAgIHNJbnN0YW5jZSA9IG51bGxwdHI7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUNhbWVyYVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2FtZXJhU2VydmljZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVMaXN0ZW5lcihtQ2FtZXJhU2VydmljZUxpc3RlbmVyKTsKKyAgICB9CisgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY2xlYXIoKTsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCitzdGF0aWMgYm9vbCBpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIiwgdmFsdWUsICIwIik7CisgICAgcmV0dXJuIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDAgJiYgc3RybmNhc2VjbXAodmFsdWUsICJmYWxzZSIsIDYpICE9IDApOworfQorCisvLyBUT0RPOiBBZGQgYmFjayB3aGVuIHZlbmRvciB0YWdzIGFyZSBzdXBwb3J0ZWQgZm9yIGxpYmNhbWVyYTJuZGtfdmVuZG9yIHdoZW4KKy8vICAgICAgIHRoZSBISURMIGludGVyZmFjZSBzdXBwb3J0cyBxdWVyeWluZyBieSB2ZW5kb3IgaWQuCisKK3NwPElDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjYW1lcmFTZXJ2aWNlQmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyID0gSUNhbWVyYVNlcnZpY2U6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTZXJ2aWNlQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FtZXJhU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChtRGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlQmluZGVyOworCisgICAgICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBhdmFpbGlhYmlsaXR5IGNhbGxiYWNrcworICAgICAgICBpZiAobUNiTG9vcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tbWdyLWxvb3BlciIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIHNlcnZpY2UgbGlzdGVuZXIgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgorICAgICAgICBpZiAobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gbmV3IENhbWVyYVNlcnZpY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX3ZlYzxDYW1lcmFTdGF0dXNBbmRJZD4gY2FtZXJhU3RhdHVzZXN7fTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmY2FtZXJhU3RhdHVzZXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZyZXRTdGF0dXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzID0gcmV0U3RhdHVzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGxpc3RlbmVyIHRvIGNhbWVyYSBzZXJ2aWNlICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBjIDogY2FtZXJhU3RhdHVzZXMpIHsKKyAgICAgICAgICAgIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbUNhbWVyYVNlcnZpY2U7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6RGVhdGhOb3RpZmllcjo6c2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxJQmFzZT4gJndobykgeworICAgICh2b2lkKSBjb29raWU7CisgICAgKHZvaWQpIHdobzsKKyAgICBBTE9HRSgiQ2FtZXJhIHNlcnZpY2UgYmluZGVyRGllZCEiKTsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhjbS0+bUxvY2spOworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBjbS0+bURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgQ2FtZXJhU3RhdHVzQW5kSWQgY2FtZXJhU3RhdHVzQW5kSWQ7CisgICAgICAgICAgICBjYW1lcmFTdGF0dXNBbmRJZC5jYW1lcmFJZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjYW1lcmFTdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXMgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIGNtLT5vblN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhU3RhdHVzQW5kSWQpOworICAgICAgICB9CisgICAgICAgIGNtLT5tQ2FtZXJhU2VydmljZS5jbGVhcigpOworICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgcmUtY29ubmVjdCBjYWxsIGhlcmU/CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBhdXRvIHBhaXIgPSBtQ2FsbGJhY2tzLmluc2VydChjYik7CisgICAgLy8gU2VuZCBpbml0aWFsIGNhbGxiYWNrcyBpZiBjYWxsYmFjayBpcyBuZXdseSByZWdpc3RlcmVkCisgICAgaWYgKHBhaXIuc2Vjb25kKSB7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzID0gcGFpci5zZWNvbmQ7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU2luZ2xlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiID0gaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSA6IGNhbGxiYWNrLT5vbkNhbWVyYVVuYXZhaWxhYmxlOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCAqKSBjYik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNhbGxiYWNrLT5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtDYW1lcmFJZEtleSwgQVN0cmluZyhjYW1lcmFJZC5jX3N0cigpKSk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp1bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBtQ2FsbGJhY2tzLmVyYXNlKGNiKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFJZExpc3Qoc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+KiBjYW1lcmFJZHMpIHsKKyAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGluaXRpYWxpemVkL3JlZnJlc2hlZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZGV2aWNlcworICAgIGF1dG8gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGZvcihhdXRvJiBkZXZpY2VTdGF0dXMgOiBtRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgIGlmIChkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UIHx8CisgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhSWRzLT5wdXNoX2JhY2soZGV2aWNlU3RhdHVzLmZpcnN0KTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6dmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORzoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIENhbWVyYU1hbmFnZXJHbG9iYWw6OmlzU3RhdHVzQXZhaWxhYmxlKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZW5kU2luZ2xlQ2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiOworICAgICAgICAgICAgdm9pZCogY29udGV4dDsKKyAgICAgICAgICAgIEFTdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgICAgICBib29sIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJmNiKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbWVyYSBjYWxsYmFjayBmcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ29udGV4dEtleSwgJmNvbnRleHQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FsbGJhY2sgY29udGV4dCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKGtDYW1lcmFJZEtleSwgJmNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbWVyYSBJRCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqY2IpKGNvbnRleHQsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5rbm93biBtZXNzYWdlIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZChzdGF0dXNBbmRJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBkZWxpdmVyIHN0YXR1cyBjaGFuZ2UuIEdsb2JhbCBjYW1lcmEgbWFuYWdlciBkaWVkIik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChzdGF0dXNBbmRJZCk7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6b25TdGF0dXNDaGFuZ2VkTG9ja2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBoaWRsX3N0cmluZyBjYW1lcmFJZCA9IHN0YXR1c0FuZElkLmNhbWVyYUlkOworICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBzdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXM7CisgICAgaWYgKCF2YWxpZFN0YXR1cyhzdGF0dXMpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGZpcnN0U3RhdHVzID0gKG1EZXZpY2VTdGF0dXNNYXAuY291bnQoY2FtZXJhSWQpID09IDApOworICAgIENhbWVyYURldmljZVN0YXR1cyBvbGRTdGF0dXMgPSBmaXJzdFN0YXR1cyA/CisgICAgICAgICAgICBzdGF0dXMgOiAvLyBmaXJzdCBzdGF0dXMKKyAgICAgICAgICAgIG1EZXZpY2VTdGF0dXNNYXBbY2FtZXJhSWRdOworCisgICAgaWYgKCFmaXJzdFN0YXR1cyAmJgorICAgICAgICAgICAgaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA9PSBpc1N0YXR1c0F2YWlsYWJsZShvbGRTdGF0dXMpKSB7CisgICAgICAgIC8vIE5vIHN0YXR1cyB1cGRhdGUuIE5vIG5lZWQgdG8gc2VuZCBjYWxsYmFjaworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcworICAgIG1EZXZpY2VTdGF0dXNNYXBbY2FtZXJhSWRdID0gc3RhdHVzOworICAgIGZvciAoYXV0byBjYiA6IG1DYWxsYmFja3MpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYkZwID0gaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA/CisgICAgICAgICAgICAgICAgY2IubUF2YWlsYWJsZSA6IGNiLm1VbmF2YWlsYWJsZTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCAqKSBjYkZwKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYi5tQ29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtDYW1lcmFJZEtleSwgQVN0cmluZyhjYW1lcmFJZC5jX3N0cigpKSk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UKSB7CisgICAgICAgIG1EZXZpY2VTdGF0dXNNYXAuZXJhc2UoY2FtZXJhSWQpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvKioKKyAqIEFDYW1lcmFNYW5nZXIgSW1wbGVtZW50YXRpb24KKyAqLworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqKiBjYW1lcmFJZExpc3QpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+IGlkTGlzdDsKKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYUlkTGlzdCgmaWRMaXN0KTsKKworICAgIGludCBudW1DYW1lcmFzID0gaWRMaXN0LnNpemUoKTsKKyAgICBBQ2FtZXJhSWRMaXN0ICpvdXQgPSBuZXcgQUNhbWVyYUlkTGlzdDsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIG91dC0+bnVtQ2FtZXJhcyA9IG51bUNhbWVyYXM7CisgICAgb3V0LT5jYW1lcmFJZHMgPSBuZXcgY29uc3QgY2hhcipbbnVtQ2FtZXJhc107CisgICAgaWYgKCFvdXQtPmNhbWVyYUlkcykgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KG91dCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyKiBzcmMgPSBpZExpc3RbaV0uY19zdHIoKTsKKyAgICAgICAgc2l6ZV90IGRzdFNpemUgPSBzdHJsZW4oc3JjKSArIDE7CisgICAgICAgIGNoYXIqIGRzdCA9IG5ldyBjaGFyW2RzdFNpemVdOworICAgICAgICBpZiAoIWRzdCkgeworICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHN0cmxjcHkoZHN0LCBzcmMsIGRzdFNpemUpOworICAgICAgICBvdXQtPmNhbWVyYUlkc1tpXSA9IGRzdDsKKyAgICB9CisgICAgKmNhbWVyYUlkTGlzdCA9IG91dDsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZAorQUNhbWVyYU1hbmFnZXI6OmRlbGV0ZUNhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiBjYW1lcmFJZExpc3QpIHsKKyAgICBpZiAoY2FtZXJhSWRMaXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlW10gY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHM7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGNhbWVyYUlkTGlzdDsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZFN0ciwgc3A8QUNhbWVyYU1ldGFkYXRhPiAqY2hhcmFjdGVyaXN0aWNzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWNoIGNhbWVyYSBzZXJ2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhIHJhd01ldGFkYXRhOworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gc2VydmljZVJldCA9CisgICAgICAgIGNzLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZyYXdNZXRhZGF0YV0gKGF1dG8gcyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZnJvbSBjYW1lcmEgc2VydmljZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsgLy8gc2hvdWxkIG5vdCByZWFjaCBoZXJlCisgICAgfQorCisgICAgKmNoYXJhY3RlcmlzdGljcyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoCisgICAgICAgICAgICByYXdNZXRhZGF0YS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX0NIQVJBQ1RFUklTVElDUyk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYU1hbmFnZXI6Om9wZW5DYW1lcmEoCisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAorICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBvdXREZXZpY2UpIHsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJhd0NoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZyYXdDaGFycyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNhbWVyYSAlcy4gZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCByZXQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIHN0ZDo6bW92ZShyYXdDaGFycykpOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrcyA9IGRldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IGRldmljZVJlbW90ZTsKKworICAgIC8vIE5vIHdheSB0byBnZXQgcGFja2FnZSBuYW1lIGZyb20gbmF0aXZlLgorICAgIC8vIFNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrYWdlIG5hbWUgYW5kIGxldCBjYW1lcmEgc2VydmljZSBmaWd1cmUgaXQgb3V0IGZyb20gVUlECisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0gY3MtPmNvbm5lY3REZXZpY2UoCisgICAgICAgICAgICBjYWxsYmFja3MsIGNhbWVyYUlkLCBbJnN0YXR1cywgJmRldmljZVJlbW90ZV0oYXV0byBzLCBhdXRvICZkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVJlbW90ZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IGNvbm5lY3QgY2FtZXJhIGRldmljZSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvLyBUT0RPOiBDb252ZXJ0IHNlcnZpY2VSZXQgdG8gY2FtZXJhX3N0YXR1c190CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmIChkZXZpY2VSZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNvbm5lY3QgY2FtZXJhIGRldmljZSBmYWlsZWQhIHJlbW90ZSBkZXZpY2UgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIGRldmljZS0+c2V0UmVtb3RlRGV2aWNlKGRldmljZVJlbW90ZSk7CisgICAgZGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgICpvdXREZXZpY2UgPSBkZXZpY2U7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0FDYW1lcmFNYW5hZ2VyOjp+QUNhbWVyYU1hbmFnZXIoKSB7CisKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDY0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQUNBTUVSQV9NQU5BR0VSX0gKKyNkZWZpbmUgX0FDQU1FUkFfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBJQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBWZW5kb3JUYWdTZWN0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7Cit1c2luZyBJQmFzZSA9IGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKKy8qKgorICogUGVyLXByb2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbWVyYU1hbmdlci4gU2hhcmVkIGJ5IGFsbCBBQ2FtZXJhTWFuYWdlcgorICogaW5zdGFuY2VzLiBDcmVhdGVkIHdoZW4gZmlyc3QgQUNhbWVyYU1hbmFnZXIgaXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHdoZW4KKyAqIGFsbCBBQ2FtZXJhTWFuYWdlciBpbnN0YW5jZXMgYXJlIGRlbGV0ZWQuCisgKgorICogVE9ETzogbWF5YmUgQ2FtZXJhTWFuYWdlckdsb2JhbCBpcyBiZXR0ZXIgc3VpdGVkIGluIGxpYmNhbWVyYWNsaWVudD8KKyAqLworY2xhc3MgQ2FtZXJhTWFuYWdlckdsb2JhbCBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsJiBnZXRJbnN0YW5jZSgpOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICB2b2lkIHJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGNhbWVyYSBJRHMgdGhhdCBzdXBwb3J0IGNhbWVyYTIKKyAgICAgKi8KKyAgICB2b2lkIGdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gKmNhbWVyYUlkcyk7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gbUNhbWVyYVNlcnZpY2U7CisgICAgY29uc3QgaW50ICAgICAgICAgIGtDYW1lcmFTZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgTXV0ZXggICAgICAgICAgICAgIG1Mb2NrOworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgRGVhdGhOb3RpZmllcihDYW1lcmFNYW5hZ2VyR2xvYmFsKiBjbSkgOiBtQ2FtZXJhTWFuYWdlcihjbSkge30KKyAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+ICZ3aG8pOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcjsKKworICAgIGNsYXNzIENhbWVyYVNlcnZpY2VMaXN0ZW5lciBmaW5hbCA6IHB1YmxpYyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2FtZXJhU2VydmljZUxpc3RlbmVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgb3ZlcnJpZGU7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPENhbWVyYU1hbmFnZXJHbG9iYWw+IG1DYW1lcmFNYW5hZ2VyOworICAgIH07CisgICAgc3A8Q2FtZXJhU2VydmljZUxpc3RlbmVyPiBtQ2FtZXJhU2VydmljZUxpc3RlbmVyOworCisgICAgLy8gV3JhcHBlciBvZiBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mgc28gd2UgY2FuIHN0b3JlIGl0IGluIHN0ZDo6c2V0CisgICAgc3RydWN0IENhbGxiYWNrIHsKKyAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2soY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUpLAorICAgICAgICAgICAgbVVuYXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYVVuYXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChtQXZhaWxhYmxlID09IG90aGVyLm1BdmFpbGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbVVuYXZhaWxhYmxlID09IG90aGVyLm1VbmF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlICE9IG90aGVyLm1BdmFpbGFibGUpIHJldHVybiBtQXZhaWxhYmxlIDwgb3RoZXIubUF2YWlsYWJsZTsKKyAgICAgICAgICAgIHJldHVybiBtVW5hdmFpbGFibGUgPCBvdGhlci5tVW5hdmFpbGFibGU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgbUF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgbVVuYXZhaWxhYmxlOworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKKyAgICB9OworICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOworCisgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbWVyYUlkS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FsbGJhY2tGcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NvbnRleHRLZXk7CisgICAgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkge30KKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgfTsKKyAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyOworICAgIHNwPEFMb29wZXI+ICAgICAgICAgbUNiTG9vcGVyOyAvLyBMb29wZXIgdGhyZWFkIHdoZXJlIGNhbGxiYWNrcyBhY3R1YWxseSBoYXBwZW4gb24KKworICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkKGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCk7CisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICAvLyBVdGlscyBmb3Igc3RhdHVzCisgICAgc3RhdGljIGJvb2wgdmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBUaGUgc29ydCBsb2dpYyBtdXN0IG1hdGNoIHRoZSBsb2dpYyBpbgorICAgIC8vIGxpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHA6OmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzCisgICAgc3RydWN0IENhbWVyYUlkQ29tcGFyYXRvciB7CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBoaWRsX3N0cmluZyYgYSwgY29uc3QgaGlkbF9zdHJpbmcmIGIpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGFVaW50ID0gMCwgYlVpbnQgPSAwOworICAgICAgICAgICAgYm9vbCBhSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGEuY19zdHIoKSwgJmFVaW50KTsKKyAgICAgICAgICAgIGJvb2wgYklzVWludCA9IGJhc2U6OlBhcnNlVWludChiLmNfc3RyKCksICZiVWludCk7CisKKyAgICAgICAgICAgIC8vIFVpbnQgZGV2aWNlIElEcyBmaXJzdAorICAgICAgICAgICAgaWYgKGFJc1VpbnQgJiYgYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhVWludCA8IGJVaW50OworICAgICAgICAgICAgfSBlbHNlIGlmIChhSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW1wbGUgc3RyaW5nIGNvbXBhcmUgaWYgYm90aCBpZCBhcmUgbm90IHVpbnQKKyAgICAgICAgICAgIHJldHVybiBhIDwgYjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBNYXAgY2FtZXJhX2lkIC0+IHN0YXR1cworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBDYW1lcmFEZXZpY2VTdGF0dXMsIENhbWVyYUlkQ29tcGFyYXRvcj4gbURldmljZVN0YXR1c01hcDsKKworICAgIC8vIEZvciB0aGUgc2luZ2xldG9uIGluc3RhbmNlCisgICAgc3RhdGljIE11dGV4IHNMb2NrOworICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBzSW5zdGFuY2U7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCgpIHt9OworICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhTWFuYWdlciBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKKyAgICBBQ2FtZXJhTWFuYWdlcigpIDoKKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQorICAgIH07CisgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKK307CisKKyNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyAhPSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKK307CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MzAwNgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYVZlbmRvclV0aWxzIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0Citjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCkgeworICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgaENhcHR1cmVSZXF1ZXN0OworICAgIGhDYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgIGhDYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMgPSBjYXB0dXJlUmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkczsKKyAgICByZXR1cm4gaENhcHR1cmVSZXF1ZXN0OworfQorCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pIHsKKyAgICBIUm90YXRpb24gaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMDsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjkwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGhSb3RhdGlvbjsKK30KKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpidWZmZXIgPSAoY2FtZXJhX21ldGFkYXRhX3QqKShtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICpyYXdNZXRhZGF0YSA9IGJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBjYWxsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIEFMT0dFKCJDb252ZXJ0aW5nIG1ldGFkYXRhIHNpemU6ICVkIiwgKGludClzaXplKTsKKyAgICBkc3QtPnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QgKikgc3JjLCBzaXplKTsKKyAgICByZXR1cm47Cit9CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCkgeworICAgIHN3aXRjaCh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpTVElMTF9DQVBUVVJFOworICAgICAgICBjYXNlIFRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpSRUNPUkQ7CisgICAgICAgIGNhc2UgVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6VklERU9fU05BUFNIT1Q7CisgICAgICAgIGNhc2UgVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpaRVJPX1NIVVRURVJfTEFHOworICAgICAgICBjYXNlIFRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpNQU5VQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6UFJFVklFVzsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBBQ0FNRVJBX09LOworICAgIHN3aXRjaChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkNBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfTUFYX0NBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpERVBSRUNBVEVEX0hBTDoKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZSBzaW5jZSB3ZSBmaWx0ZXJlZCBsZWdhY3kgSEFMcyBlYXJsaWVyCisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpESVNBQkxFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpQRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICBpZiAobmgxLT5udW1GZHMgIT0wIHx8IG5oMi0+bnVtRmRzICE9MCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB3aW5kb3cgbmF0aXZlIGhhbmRsZXMgYmVpbmcgY29tcGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobmgxLT52ZXJzaW9uICE9IG5oMi0+dmVyc2lvbiB8fCBuaDEtPm51bUZkcyAhPSBuaDItPm51bUZkcyB8fAorICAgICAgICBuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZihuaDEtPmRhdGFbaV0gIT0gbmgyLT5kYXRhW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICBpZiAoaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChuaDEsIG5oMikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobmgxLT5udW1JbnRzICE9IG5oMi0+bnVtSW50cykgeworICAgICAgICByZXR1cm4gbmgxLT5udW1JbnRzIDwgbmgyLT5udW1JbnRzOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmgxLT5udW1JbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBuaDEtPmRhdGFbaV0gPCBuaDItPmRhdGFbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG5oMSwgbmgyKSAmJiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChuaDEsIG5oMik7Cit9CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMyKSB7CisgICAgaWYgKGhhbmRsZXMxLnNpemUoKSAhPSBoYW5kbGVzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICghaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChoYW5kbGVzMVtpXSwgaGFuZGxlczJbaV0pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlczEuc2l6ZSgpIDwgaGFuZGxlczIuc2l6ZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMSA9IGhhbmRsZXMxW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZTIgPSBoYW5kbGVzMltpXS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZTEsIGhhbmRsZTIpKSB7CisgICAgICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihoYW5kbGUxLCBoYW5kbGUyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEwMDZkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgorCisjaWZuZGVmIENBTUVSQV9OREtfVkVORE9SX0gKKyNkZWZpbmUgQ0FNRVJBX05ES19WRU5ET1JfSAorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIENhbWVyYU1ldGFkYXRhID0gaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYU1ldGFkYXRhICA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOwordXNpbmcgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhSb3RhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb247Cit1c2luZyBPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOworCisvLyBVdGlsaXR5IGNsYXNzIHNvIHRoYXQgQ2FwdHVyZVJlcXVlc3QgY2FuIGJlIHN0b3JlZCBieSBzcDw+CitzdHJ1Y3QgQ2FwdHVyZVJlcXVlc3QgOiBwdWJsaWMgUmVmQmFzZSB7CisgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgbUNhcHR1cmVSZXF1ZXN0OworICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QgKj4gbVN1cmZhY2VMaXN0OworICAvL1BoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncyBtZXRhZGF0YSBpcyBzdG9yZWQgaGVyZSwgc2luY2UgdGhlIGNhcHR1cmUgcmVxdWVzdAorICAvL21pZ2h0IG5vdCBjb250YWluIGl0LiBUaGF0J3Mgc2luY2UsIGZtcSBtaWdodCBoYXZlIGNvbnN1bWVkIGl0LgorICBoaWRsX3ZlYzxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBtUGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK307CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCisvLyBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIgaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbiBhbmQgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbAorYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhlIG5hdGl2ZV9oYW5kbGVfdCBjYW4gYmUgY29tcGFyZWQgd2l0aCAgaXRzIGNvbnRlbnRzIGluc3RlYWQKKy8vIG9mIGp1c3QgcmF3IHBvaW50ZXIgY29tcGFyaXNvbnMuCitzdHJ1Y3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciB7CisgICAgbmF0aXZlX2hhbmRsZV90ICptV2luZG93ID0gbnVsbHB0cjsKKworICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIobmF0aXZlX2hhbmRsZV90ICpuaCkgOiBtV2luZG93KG5oKSB7IH0KKworICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBvcGVyYXRvciBuYXRpdmVfaGFuZGxlX3QgKigpIGNvbnN0IHsgcmV0dXJuIG1XaW5kb3c7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKK307CisKKy8vIFdyYXBwZXIgYXJvdW5kIE91dHB1dENvbmZpZ3VyYXRpb24uIFRoaXMgaXMgbmVlZGVkIHNpbmNlIEhJREwKKy8vIE91dHB1dENvbmZpZ3VyYXRpb24gaXMgYXV0by1nZW5lcmF0ZWQgYW5kIG1hcmtlZCBmaW5hbC4gVGhlcmVmb3JlLCBvcGVyYXRvcgorLy8gb3ZlcmxvYWRzIG91dHNpZGUgdGhlIGNsYXNzLCB3aWxsIG5vdCBnZXQgcGlja2VkIGJ5IGNsYW5nIHdoaWxlIHRyeWluZyB0bworLy8gc3RvcmUgT3V0cHV0Q29uZmlndXJhdGlvbiBpbiBtYXBzL3NldHMuCitzdHJ1Y3QgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gbU91dHB1dENvbmZpZ3VyYXRpb247CisKKyAgICBvcGVyYXRvciBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKE91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICA6IG1PdXRwdXRDb25maWd1cmF0aW9uKChvdXRwdXRDb25maWd1cmF0aW9uKSkgeyB9CisKKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgcmV0dXJuIHNlbGYucm90YXRpb24gPT0gb3RoZXIucm90YXRpb24gJiYgc2VsZi53aW5kb3dHcm91cElkID09IG90aGVyLndpbmRvd0dyb3VwSWQgJiYKKyAgICAgICAgICAgICAgICBzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgPT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCAmJiBzZWxmLndpZHRoID09IG90aGVyLndpZHRoICYmCisgICAgICAgICAgICAgICAgc2VsZi5oZWlnaHQgPT0gb3RoZXIuaGVpZ2h0ICYmIHNlbGYuaXNEZWZlcnJlZCA9PSBvdGhlci5pc0RlZmVycmVkICYmCisgICAgICAgICAgICAgICAgYXJlV2luZG93TmF0aXZlSGFuZGxlc0VxdWFsKHNlbGYud2luZG93SGFuZGxlcywgb3RoZXIud2luZG93SGFuZGxlcyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZzZWxmID0gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIGlmIChzZWxmLndpbmRvd0dyb3VwSWQgIT0gb3RoZXIud2luZG93R3JvdXBJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYud2luZG93R3JvdXBJZCA8IG90aGVyLndpbmRvd0dyb3VwSWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi53aWR0aCAhPSBvdGhlci53aWR0aCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYud2lkdGggPCBvdGhlci53aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLmhlaWdodCAhPSBvdGhlci5oZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhlaWdodCA8IG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnJvdGF0aW9uICE9IG90aGVyLnJvdGF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlbGYucm90YXRpb24pIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG90aGVyLnJvdGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLmlzRGVmZXJyZWQgIT0gb3RoZXIuaXNEZWZlcnJlZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaXNEZWZlcnJlZCA8IG90aGVyLmlzRGVmZXJyZWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5waHlzaWNhbENhbWVyYUlkICE9IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgPCBvdGhlci5waHlzaWNhbENhbWVyYUlkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyKSAmJiAhKCp0aGlzIDwgb3RoZXIpOworICAgIH0KK307CisKKy8vIENvbnZlcnQgQ2FwdHVyZVJlcXVlc3Qgd3JhcHBhYmxlIGJ5IHNwPD4gdG8gaGlkbCBDYXB0dXJlUmVxdWVzdC4KK2ZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpOworCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pOworCitib29sIGNvbnZlcnRGcm9tSGlkbENsb25lZChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBDYW1lcmFNZXRhZGF0YSAqcmF3TWV0YWRhdGEpOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpOworCitUZW1wbGF0ZUlkIGNvbnZlcnRUb0hpZGwoQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQpOworCitjYW1lcmFfc3RhdHVzX3QgY29udmVydEZyb21IaWRsKFN0YXR1cyBzdGF0dXMpOworCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0FNRVJBX05ES19WRU5ET1JfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTQxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFFcnJvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisvLyNkZWZpbmUgQUxPR1YoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsIF9fVkFfQVJHU19fKQorLy8jZGVmaW5lIEFMT0dEKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19ERUJVRywgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dJKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR1coLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1dBUk4sIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBTE9HRSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsIExPR19UQUcsIF9fVkFfQVJHU19fKQorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIGludCBrRHVtbXlGZW5jZUZkID0gLTE7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRVcyA9IDEwMCAqIDEwMDA7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRSZXRyeSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZVdpZHRoID0gNjQwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworCitjbGFzcyBDYW1lcmFIZWxwZXIgeworICAgcHVibGljOgorICAgIENhbWVyYUhlbHBlcihuYXRpdmVfaGFuZGxlX3QqIGltZ1JlYWRlckFudykgOiBtSW1nUmVhZGVyQW53KGltZ1JlYWRlckFudykge30KKyAgICB+Q2FtZXJhSGVscGVyKCkgeyBjbG9zZUNhbWVyYSgpOyB9CisKKyAgICBpbnQgaW5pdENhbWVyYSgpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgcmV0OworCisgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCk7CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBBQ2FtZXJhTWFuYWdlci4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChtQ2FtZXJhTWFuYWdlciwgJm1DYW1lcmFJZExpc3QpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgY2FtZXJhSWRMaXN0OiByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhcyA8IDEpIHsKKyAgICAgICAgICAgIEFMT0dXKCJEZXZpY2UgaGFzIG5vIGNhbWVyYSBvbiBib2FyZC4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QgY2FtZXJhLgorICAgICAgICBtQ2FtZXJhSWQgPSBtQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbMF07CisgICAgICAgIGlmIChtQ2FtZXJhSWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgY2FtZXJhSWQuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhKG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWQsICZtRGV2aWNlQ2IsICZtRGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbURldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gY2FtZXJhLCByZXQ9JWQsIG1EZXZpY2U9JXAuIiwgcmV0LCBtRGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkLCAmbUNhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LIHx8IG1DYW1lcmFNZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZmFpbHVyZS4gcmV0ICVkLCBtZXRhZGF0YSAlcCIsIG1DYW1lcmFJZCwgcmV0LAorICAgICAgICAgICAgICAgICAgbUNhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNDYXBhYmlsaXR5U3VwcG9ydGVkKEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0JBQ0tXQVJEX0NPTVBBVElCTEUpKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgQkFDS1dBUkRfQ09NUEFUSUJMRS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgc2Vzc2lvbgorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlKCZtT3V0cHV0cyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbihtRGV2aWNlLCBtT3V0cHV0cywgJm1TZXNzaW9uQ2IsICZtU2Vzc2lvbik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KG1EZXZpY2UsIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IHRydWU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgaXNDYXBhYmlsaXR5U3VwcG9ydGVkKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190IGNhcCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgIG1DYW1lcmFNZXRhZGF0YSwgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMsICZlbnRyeSk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS51OFtpXSA9PSBjYXApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpc0NhbWVyYVJlYWR5KCkgeyByZXR1cm4gbUlzQ2FtZXJhUmVhZHk7IH0KKworICAgIHZvaWQgY2xvc2VDYW1lcmEoKSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmIChtUmVxSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtUmVxSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0aWxsUmVxdWVzdCkgeworICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWUobVN0aWxsUmVxdWVzdCk7CisgICAgICAgICAgICBtU3RpbGxSZXF1ZXN0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXN0cm95IGNhcHR1cmUgc2Vzc2lvbgorICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Nsb3NlKG1TZXNzaW9uKTsKKyAgICAgICAgICAgIG1TZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUltZ1JlYWRlck91dHB1dCkgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWUobUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9mcmVlKG1PdXRwdXRzKTsKKyAgICAgICAgICAgIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXN0cm95IGNhbWVyYSBkZXZpY2UKKyAgICAgICAgaWYgKG1EZXZpY2UpIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfY2xvc2UobURldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbWVyYU1ldGFkYXRhKSB7CisgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUobUNhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgICBtQ2FtZXJhTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIG1hbmFnZXIKKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlcikgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IGZhbHNlOworICAgIH0KKworICAgIGludCB0YWtlUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUobVNlc3Npb24sICZtQ2FwdHVyZUNhbGxiYWNrcywgMSwgJm1TdGlsbFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxSWQpOworICAgIH0KKworICAgIGJvb2wgY2hlY2tDYWxsYmFja3MoaW50IHBpY3R1cmVDb3VudCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ICE9IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRlZCBjYXB0dXJlIGNhbGxhYmFjayBjb3VudCBub3QgYXMgZXhwZWN0ZWQuIGV4cGVjdGVkICVkIGFjdHVhbCAlZCIsCisgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQsIG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25EZXZpY2VEaXNjb25uZWN0ZWQodm9pZCogLypvYmoqLywgQUNhbWVyYURldmljZSogLypkZXZpY2UqLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRXJyb3Iodm9pZCogLypvYmoqLywgQUNhbWVyYURldmljZSogLypkZXZpY2UqLywgaW50IC8qZXJyb3JDb2RlKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25DbG9zZWQodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLykge30KKworICAgIHN0YXRpYyB2b2lkIG9uU2Vzc2lvblJlYWR5KHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25BY3RpdmUodm9pZCogLypvYmoqLywgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiAvKnNlc3Npb24qLykge30KKworICAgcHJpdmF0ZToKKyAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1EZXZpY2VDYnt0aGlzLCBvbkRldmljZURpc2Nvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRldmljZUVycm9yfTsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MgbVNlc3Npb25DYnsKKyAgICAgICAgdGhpcywgb25TZXNzaW9uQ2xvc2VkLCBvblNlc3Npb25SZWFkeSwgb25TZXNzaW9uQWN0aXZlfTsKKworICAgIG5hdGl2ZV9oYW5kbGVfdCogbUltZ1JlYWRlckFudyA9IG51bGxwdHI7ICAvLyBub3Qgb3duZWQgYnkgdXMuCisKKyAgICAvLyBDYW1lcmEgbWFuYWdlcgorICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlciA9IG51bGxwdHI7CisgICAgQUNhbWVyYUlkTGlzdCogbUNhbWVyYUlkTGlzdCA9IG51bGxwdHI7CisgICAgLy8gQ2FtZXJhIGRldmljZQorICAgIEFDYW1lcmFNZXRhZGF0YSogbUNhbWVyYU1ldGFkYXRhID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhRGV2aWNlKiBtRGV2aWNlID0gbnVsbHB0cjsKKyAgICAvLyBDYXB0dXJlIHNlc3Npb24KKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG1PdXRwdXRzID0gbnVsbHB0cjsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG1JbWdSZWFkZXJPdXRwdXQgPSBudWxscHRyOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbVNlc3Npb24gPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgcmVxdWVzdAorICAgIEFDYXB0dXJlUmVxdWVzdCogbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCogbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisKKyAgICBib29sIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogbUNhbWVyYUlkOworICAgIGludCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQgPSAwOworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIG1DYXB0dXJlQ2FsbGJhY2tzID0geworICAgICAgICAvLyBUT0RPOiBBZGQgdGVzdHMgZm9yIG90aGVyIGNhbGxiYWNrcworICAgICAgICB0aGlzLCAvLyBjb250ZXh0CisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZAorICAgICAgICAvLyBvbkNhcHR1cmVDb21wbGV0ZWQsIGNhbGxlZCBzZXJpYWxseSwgc28gbm8gbG9jayBuZWVkZWQuCisgICAgICAgIFtdKHZvaWQqIGN0eCAsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqLCBBQ2FwdHVyZVJlcXVlc3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqKSB7CisgICAgICAgICAgICBDYW1lcmFIZWxwZXIgKmNoID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVscGVyICo+KGN0eCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhjaC0+bU11dGV4KTsKKyAgICAgICAgICAgIGNoLT5tQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQrKzsKKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlRmFpbGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVCdWZmZXJMb3N0CisgIH07CisKK307CisKK2NsYXNzIEltYWdlUmVhZGVyVGVzdENhc2UgeworICAgcHVibGljOgorICAgIEltYWdlUmVhZGVyVGVzdENhc2UoaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc3luYykKKyAgICAgICAgOiBtV2lkdGgod2lkdGgpLAorICAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKKyAgICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgICAgbVVzYWdlKHVzYWdlKSwKKyAgICAgICAgICBtTWF4SW1hZ2VzKG1heEltYWdlcyksCisgICAgICAgICAgbUFzeW5jKGFzeW5jKSB7fQorCisgICAgfkltYWdlUmVhZGVyVGVzdENhc2UoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyQW53KSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKG1JbWdSZWFkZXIpOworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjYWxsIG5hdGl2ZV9oYW5kbGVfdF9yZWxlYXNlIG9uIGltYWdlUmVhZGVyQW53CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgaW5pdEltYWdlUmVhZGVyKCkgeworICAgICAgICBpZiAobUltZ1JlYWRlciAhPSBudWxscHRyIHx8IG1JbWdSZWFkZXJBbncgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZS1pbml0YWxpemUgaW1hZ2UgcmVhZGVyLCBtSW1nUmVhZGVyPSVwLCBtSW1nUmVhZGVyQW53PSVwIiwgbUltZ1JlYWRlciwKKyAgICAgICAgICAgICAgICAgIG1JbWdSZWFkZXJBbncpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Vc2FnZSwgbU1heEltYWdlcywgJm1JbWdSZWFkZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtSW1nUmVhZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG5ldyBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlcj0lcCIsIHJldCwgbUltZ1JlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckF2YWlsYWJsZUNiKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGltYWdlIGF2YWlsYWJsZSBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihtSW1nUmVhZGVyLCAmbVJlYWRlckRldGFjaGVkQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgYnVmZmVyIGRldGFjaGluZyBsaXN0ZW5lciwgcmV0PSVkLiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShtSW1nUmVhZGVyLCAmbUltZ1JlYWRlckFudyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgbmF0aXZlX2hhbmRsZV90IGZyb20gQUltYWdlUmVhZGVyLCByZXQ9JWQsIG1JbWdSZWFkZXJBbnc9JXAuIiwgcmV0LAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGdldE5hdGl2ZVdpbmRvdygpIHsgcmV0dXJuIG1JbWdSZWFkZXJBbnc7IH0KKworICAgIGludCBnZXRBY3F1aXJlZEltYWdlQ291bnQoKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHJldHVybiBtQWNxdWlyZWRJbWFnZUNvdW50OworICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKworICAgICAgICBBSW1hZ2UqIG91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0OworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBBSW1hZ2Ugd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBnb2VzIG91dCBvZgorICAgICAgICAvLyBzY29wZS4KKyAgICAgICAgYXV0byBpbWFnZURlbGV0ZXIgPSBbdGhpc10oQUltYWdlKiBpbWcpIHsKKyAgICAgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlQXN5bmMoaW1nLCBrRHVtbXlGZW5jZUZkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUltYWdlX2RlbGV0ZShpbWcpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICBpZiAobUFzeW5jKSB7CisgICAgICAgICAgICBpbnQgb3V0RmVuY2VGZCA9IDA7CisgICAgICAgICAgICAvLyBWZXJpdHkgdGhhdCBvdXRGZW5jZUZkJ3MgdmFsdWUgd2lsbCBiZSBjaGFuZ2VkIGJ5CisgICAgICAgICAgICAvLyBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jLgorICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2VBc3luYyhyZWFkZXIsICZvdXRJbWFnZSwgJm91dEZlbmNlRmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0ciB8fCBvdXRGZW5jZUZkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjcXVpcmUgaW1hZ2UsIHJldD0lZCwgb3V0SWFtZ2U9JXAsIG91dEZlbmNlRmQ9JWQuIiwgcmV0LCBvdXRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRGZW5jZUZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UocmVhZGVyLCAmb3V0SW1hZ2UpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0SW1hZ2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcC4iLCByZXQsIG91dEltYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICB9CisKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBvdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgb3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZCB0byBnZXQgaGFyZHdhcmUgYnVmZmVyLCByZXQ9JWQsIG91dEJ1ZmZlcj0lcC4iLCByZXQsIG91dEJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBuZWVkIHRvIHJlbGVhc2UgQUhhcmR3YXJlQnVmZmVyLCBzaW5jZSB3ZSBkb24ndCBhY3F1aXJlIGFkZGl0aW9uYWwKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGl0LgorICAgICAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBvdXREZXNjOworICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZGVzY3JpYmUob3V0QnVmZmVyLCAmb3V0RGVzYyk7CisgICAgICAgIGludDMyX3QgaW1hZ2VXaWR0aCA9IDA7CisgICAgICAgIGludDMyX3QgaW1hZ2VIZWlnaHQgPSAwOworICAgICAgICBpbnQzMl90IGJ1ZmZlcldpZHRoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy53aWR0aCk7CisgICAgICAgIGludDMyX3QgYnVmZmVySGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ob3V0RGVzYy5oZWlnaHQpOworCisgICAgICAgIEFJbWFnZV9nZXRXaWR0aChvdXRJbWFnZSwgJmltYWdlV2lkdGgpOworICAgICAgICBBSW1hZ2VfZ2V0SGVpZ2h0KG91dEltYWdlLCAmaW1hZ2VIZWlnaHQpOworICAgICAgICBpZiAoaW1hZ2VXaWR0aCAhPSBtV2lkdGggfHwgaW1hZ2VIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGltYWdlIGRpbWVuc2lvbjogZXhwZWN0ZWQ9JWR4JWQsIGFjdHVhbD0lZHglZCIsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCWF84ODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQl81NjUgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBX0ZQMTYgfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1k4KSB7CisgICAgICAgICAgICAvLyBDaGVjayBvdXRwdXQgYnVmZmVyIGRpbWVuc2lvbiBmb3IgY2VydGFpbiBmb3JtYXRzLiBEb24ndCBkbyB0aGlzIGZvciBibG9iIGJhc2VkCisgICAgICAgICAgICAvLyBmb3JtYXRzLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcldpZHRoICE9IG1XaWR0aCB8fCBidWZmZXJIZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3V0RGVzYy51c2FnZSAmIG1Vc2FnZSkgIT0gbVVzYWdlKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgYnVmZmVyIHVzYWdlOiBhY3R1YWwgKCUiIFBSSXU2NCAiKSwgZXhwZWN0ZWQgKCUiIFBSSXU2NCAiKSIsCisgICAgICAgICAgICAgICAgICBvdXREZXNjLnVzYWdlLCBtVXNhZ2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludCBkYXRhTGVuZ3RoID0gMDsKKyAgICAgICAgcmV0ID0gQUltYWdlX2dldFBsYW5lRGF0YShpbWcuZ2V0KCksIDAsICZkYXRhLCAmZGF0YUxlbmd0aCk7CisgICAgICAgIGlmIChtVXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4pIHsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBDUFVfUkVBRF9PRlRFTiB1c2FnZSBiaXRzLCB3ZSBjYW4gbG9jayB0aGUgaW1hZ2UuCisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBkYXRhID09IG51bGxwdHIgfHwgZGF0YUxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX0lNR1JFQURFUl9DQU5OT1RfTE9DS19JTUFHRSB8fCBkYXRhICE9IG51bGxwdHIgfHwgZGF0YUxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFjY2VzcyBDUFUgZGF0YSwgcmV0PSVkLCBkYXRhPSVwLCBkYXRhTGVuZ3RoPSVkIiwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBPbmx5IGluY3JlYXNlIG1BY3F1aXJlZEltYWdlQ291bnQgaWYgYWxsIGNoZWNrcyBwYXNzLgorICAgICAgICBtQWNxdWlyZWRJbWFnZUNvdW50Kys7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkKiBvYmosIEFJbWFnZVJlYWRlciogcmVhZGVyKSB7CisgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRoaXogPSByZWludGVycHJldF9jYXN0PEltYWdlUmVhZGVyVGVzdENhc2UqPihvYmopOworICAgICAgICB0aGl6LT5IYW5kbGVJbWFnZUF2YWlsYWJsZShyZWFkZXIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkCisgICAgb25CdWZmZXJSZW1vdmVkKHZvaWQqIC8qb2JqKi8sIEFJbWFnZVJlYWRlciogLypyZWFkZXIqLywgQUhhcmR3YXJlQnVmZmVyKiAvKmJ1ZmZlciovKSB7CisgICAgICAgIC8vIE5vLW9wLCBqdXN0IHRvIGNoZWNrIHRoZSBsaXN0ZW5lciBjYW4gYmUgc2V0IHByb3Blcmx5LgorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgaW50MzJfdCBtRm9ybWF0OworICAgIHVpbnQ2NF90IG1Vc2FnZTsKKyAgICBpbnQzMl90IG1NYXhJbWFnZXM7CisgICAgYm9vbCBtQXN5bmM7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBpbnQgbUFjcXVpcmVkSW1hZ2VDb3VudHswfTsKKworICAgIEFJbWFnZVJlYWRlciogbUltZ1JlYWRlciA9IG51bGxwdHI7CisgICAgbmF0aXZlX2hhbmRsZV90KiBtSW1nUmVhZGVyQW53ID0gbnVsbHB0cjsKKworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIG1SZWFkZXJBdmFpbGFibGVDYnt0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIG1SZWFkZXJEZXRhY2hlZENie3RoaXMsIG9uQnVmZmVyUmVtb3ZlZH07Cit9OworCitib29sIHRha2VQaWN0dXJlcyh1aW50NjRfdCByZWFkZXJVc2FnZSwgaW50IHJlYWRlck1heEltYWdlcywgYm9vbCByZWFkZXJBc3luYywgaW50IHBpY3R1cmVDb3VudCkgeworICAgIGludCByZXQgPSAwOworICAgIEltYWdlUmVhZGVyVGVzdENhc2UgdGVzdENhc2UoCisgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICByZWFkZXJBc3luYyk7CisgICAgcmV0ID0gdGVzdENhc2UuaW5pdEltYWdlUmVhZGVyKCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIEltYWdlUmVhZGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDYW1lcmFIZWxwZXIgY2FtZXJhSGVscGVyKHRlc3RDYXNlLmdldE5hdGl2ZVdpbmRvdygpKTsKKyAgICByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgaGVscGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWNhbWVyYUhlbHBlci5pc0NhbWVyYVJlYWR5KCkpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSBpcyBub3QgcmVhZHkgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbi4gSXQncyBlaXRoZXIgZHVlIHRvIGNhbWVyYSBvbiAiCisgICAgICAgICAgICAgICJib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBjYW1lcmEgb24gIgorICAgICAgICAgICAgICAiYm9hcmQuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VQaWN0dXJlKCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHRha2UgcGljdHVyZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2xlZXAgdW50aWwgYWxsIGNhcHR1cmUgZmluaXNoZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgdXNsZWVwKGtDYXB0dXJlV2FpdFVzKTsKKyAgICAgICAgaWYgKHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQgJiYKKyAgICAgICAgICAgIGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrcyhwaWN0dXJlQ291bnQpOworfQorCitjbGFzcyBBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICB9CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKworICAgIH0KKworfTsKKworYm9vbCB0ZXN0VGFrZVBpY3R1cmVzTmF0aXZlKCkgeworICAgIGZvciAoYXV0byYgcmVhZGVyVXNhZ2UgOgorICAgICAgICAge0FIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTn0pIHsKKyAgICAgICAgZm9yIChhdXRvJiByZWFkZXJNYXhJbWFnZXMgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyQXN5bmMgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBwaWN0dXJlQ291bnQgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMocmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJUZXN0IHRha2VQaWN0dXJlcyBmYWlsZWQgZm9yIHRlc3QgY2FzZSB1c2FnZT0lIiBQUkl1NjQgIiwgbWF4SW1hZ2VzPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXN5bmM9JWQsIHBpY3R1cmVDb3VudD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitURVNUX0YoQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgRVhQRUNUX1RSVUUodGVzdFRha2VQaWN0dXJlc05hdGl2ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDY1OTQ4NGYuLmU1YzE2MzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw4IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBcCiAJQ2FtZXJhQmluZGVyVGVzdHMuY3BwIFwKLQlDYW1lcmFaU0xUZXN0cy5jcHAKKwlDYW1lcmFaU0xUZXN0cy5jcHAgXAorCUNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmxvZyBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCAxZGU3MDEzLi5mYThhN2EzIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KQEAgLTU1LDYgKzU3LDggQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VEZWZhdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7CiAKICNkZWZpbmUgQVNTRVJUX05PVF9OVUxMKHgpIFwKICAgICBBU1NFUlRfVFJVRSgoeCkgIT0gbnVsbHB0cikKQEAgLTQ5MCw2ICs0OTQsMTkgQEAKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGJhY2tzLT5oYWRFcnJvcigpKTsKIAorICAgICAgICAvLyBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gbXVzdCBhbHNvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGNhc2UKKyAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSB7IC8qaW5wdXRXaWR0aCovIDAsIC8qaW5wdXRIZWlnaHQqLzAsCisgICAgICAgICAgICAgICAgLyppbnB1dEZvcm1hdCovIC0xLCBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFfTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWRkT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQpOworICAgICAgICBib29sIHF1ZXJ5U3RhdHVzOworICAgICAgICByZXMgPSBkZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24sICZxdWVyeVN0YXR1cyk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAocmVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpID09IElDYW1lcmFTZXJ2aWNlRGVmYXVsdDo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04pKQorICAgICAgICAgICAgICAgIDw8IHJlczsKKyAgICAgICAgaWYgKHJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHF1ZXJ5U3RhdHVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIENhbiB3ZSBtYWtlIHJlcXVlc3RzPwogICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXF1ZXN0VGVtcGxhdGU7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoLypwcmV2aWV3IHRlbXBsYXRlKi8xLApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24iCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOworCitjbGFzcyBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisKKyAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uKCkgOiBudW1DYW1lcmFzKDApe30KKyAgICAvL0d0ZXN0IGludGVyZmFjZQorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQzMl90IG51bUNhbWVyYXM7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworfTsKKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpTZXRVcCgpIHsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHJjOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYSIpKTsKKyAgICBtQ2FtZXJhU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlPihiaW5kZXIpOworICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldE51bWJlck9mQ2FtZXJhcygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQUxMLCAmbnVtQ2FtZXJhcyk7CisgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKK30KKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpUZWFyRG93bigpIHsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCisvLyBSZXZva2luZyBhbmQgYWNxdWlyaW5nIHBlcm1pc3Npb25zIGF1dG9tYXRpY2FsbHkgbWlnaHQgbm90IGJlIHBvc3NpYmxlLgorLy8gVGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZhbCBvZiBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcKKy8vIGEgY2FtZXJhIHBlcm1pc3Npb24uCitURVNUX0YoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiwgVGVzdENhbWVyYVBlcm1pc3Npb24pIHsKKyAgICBmb3IgKGludDMyX3QgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IG51bUNhbWVyYXM7IGNhbWVyYUlkKyspIHsKKworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZFN0ciA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpOworICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGF1dG8gcmMgPSBtQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICBFWFBFQ1RfVFJVRShyYy5pc09rKCkpOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzTmVlZGluZ1Blcm1pc3Npb247CisgICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGFkYXRhLmlzRW1wdHkoKSk7CisgICAgICAgIEVYUEVDVF9FUShtZXRhZGF0YS5yZW1vdmVQZXJtaXNzaW9uRW50cmllcyhDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQsCisgICAgICAgICAgICAgICAgICAgICZ0YWdzTmVlZGluZ1Blcm1pc3Npb24pLCBOT19FUlJPUik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoMCA8IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGF2YWlsYWJsZUtleXM7CisgICAgICAgIGF2YWlsYWJsZUtleXMucmVzZXJ2ZShhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworICAgICAgICBhdmFpbGFibGVLZXlzLmluc2VydChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5kYXRhLmkzMiwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIgKyBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAma2V5IDogdGFnc05lZWRpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobWV0YWRhdGEuZXhpc3RzKGtleSkpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUtleXMuZW5kKCksIGtleSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpdCA9PSBhdmFpbGFibGVLZXlzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGI3Mzk1MWYuLjc4MDNjY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtMTAyLDcgKzEwMiw3IEBACiBzdGF0aWMgYm9vbCBnTW9ub3RvbmljVGltZSA9IGZhbHNlOyAgICAgLy8gdXNlIHN5c3RlbSBtb25vdG9uaWMgdGltZSBmb3IgdGltZXN0YW1wcwogc3RhdGljIGJvb2wgZ1BlcnNpc3RlbnRTdXJmYWNlID0gZmFsc2U7IC8vIHVzZSBwZXJzaXN0ZW50IHN1cmZhY2UKIHN0YXRpYyBlbnVtIHsKLSAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKKyAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX1dFQk0sIEZPUk1BVF8zR1BQLCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUwogfSBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsgICAgICAgICAgIC8vIGRhdGEgZm9ybWF0IGZvciBvdXRwdXQKIHN0YXRpYyBBU3RyaW5nIGdDb2RlY05hbWUgPSAiIjsgICAgICAgICAvLyBjb2RlYyBuYW1lIG92ZXJyaWRlCiBzdGF0aWMgYm9vbCBnU2l6ZVNwZWNpZmllZCA9IGZhbHNlOyAgICAgLy8gd2FzIHNpemUgZXhwbGljaXRseSByZXF1ZXN0ZWQ/CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICBmb3JtYXQtPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZGlzcGxheUZwcyk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c2V0TmFtZSgic2NyZWVucmVjb3JkX2xvb3BlciIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKICAgICBBTE9HVigiQ3JlYXRpbmcgY29kZWMiKTsKQEAgLTI2NCwxMCArMjY0LDEwIEBACiAKICAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyCiAgICAgLy8gY2FzZSBpcyAiYWxsIG9mIGl0Ii4KLSAgICBSZWN0IGxheWVyU3RhY2tSZWN0KG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgpOworICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgpOwogCiAgICAgLy8gV2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBkaXNwbGF5LgotICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSAoZmxvYXQpIG1haW5EcHlJbmZvLmggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnc7CisgICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8udmlld3BvcnRIIC8gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydFc7CiAKIAogICAgIC8vIFNldCB0aGUgd2F5IHdlIG1hcCB0aGUgb3V0cHV0IG9udG8gdGhlIGRpc3BsYXkgc3VyZmFjZSAod2hpY2ggd2lsbApAQCAtMzQ0LDIyICszNDQsNiBAQAogfQogCiAvKgotICogU2V0IHRoZSBtYWluIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCB0byB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQKLSAqLwotc3RhdGljIHN0YXR1c190IGdldEFjdHVhbERpc3BsYXlTaXplKGNvbnN0IHNwPElCaW5kZXI+JiBtYWluRHB5LCBEaXNwbGF5SW5mbyogbWFpbkRweUluZm8pIHsKLSAgICBSZWN0IHZpZXdwb3J0OwotICAgIHN0YXR1c190IGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheVZpZXdwb3J0KG1haW5EcHksICZ2aWV3cG9ydCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gZ2V0IGRpc3BsYXkgdmlld3BvcnRcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBtYWluRHB5SW5mby0+dyA9IHZpZXdwb3J0LndpZHRoKCk7Ci0gICAgbWFpbkRweUluZm8tPmggPSB2aWV3cG9ydC5oZWlnaHQoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoKICAqIFJ1bnMgdGhlIE1lZGlhQ29kZWMgZW5jb2Rlciwgc2VuZGluZyB0aGUgb3V0cHV0IHRvIHRoZSBNZWRpYU11eGVyLiAgVGhlCiAgKiBpbnB1dCBmcmFtZXMgYXJlIGNvbWluZyBmcm9tIHRoZSB2aXJ0dWFsIGRpc3BsYXkgYXMgZmFzdCBhcyBTdXJmYWNlRmxpbmdlcgogICogd2FudHMgdG8gc2VuZCB0aGVtLgpAQCAtNDI5LDIyICs0MTMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZnVsIHN0dWZmIGlzIGhhcmQgdG8gZ2V0IGF0IHdpdGhvdXQgYSBEYWx2aWsgVk0uCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8obWFpbkRweSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgdmlydHVhbERweSwgbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheUluZm8obWFpbikgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC02MTgsMjUgKzU5NCwxOSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc2V0IGFjdHVhbCBkaXNwbGF5IHNpemVcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQogICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICBwcmludGYoIk1haW4gZGlzcGxheSBpcyAlZHglZCBAJS4yZmZwcyAob3JpZW50YXRpb249JXUpXG4iLAotICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgsIG1haW5EcHlJbmZvLmZwcywKKyAgICAgICAgICAgICAgICBtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCwgbWFpbkRweUluZm8uZnBzLAogICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgfQogCiAgICAgLy8gRW5jb2RlciBjYW4ndCB0YWtlIG9kZCBudW1iZXIgYXMgY29uZmlnCiAgICAgaWYgKGdWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby53KTsKKyAgICAgICAgZ1ZpZGVvV2lkdGggPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydFcpOwogICAgIH0KICAgICBpZiAoZ1ZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8uaCk7CisgICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAgICAgfQogCiAgICAgLy8gQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgZW5jb2Rlci4KQEAgLTcxNCw3ICs2ODQsOSBAQAogICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyID0gTlVMTDsKICAgICBGSUxFKiByYXdGcCA9IE5VTEw7CiAgICAgc3dpdGNoIChnT3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgRk9STUFUX01QNDogeworICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6CisgICAgICAgIGNhc2UgRk9STUFUX1dFQk06CisgICAgICAgIGNhc2UgRk9STUFUXzNHUFA6IHsKICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBtdXhlci4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIENTRCBibG9iIGZyb20gdGhlIGVuY29kZXIKICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBjYW4gc3RhcnQgaXQuCiAgICAgICAgICAgICBlcnIgPSB1bmxpbmsoZmlsZU5hbWUpOwpAQCAtNzI3LDcgKzY5OSwxMyBAQAogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNvdWxkbid0IG9wZW4gZmlsZVxuIik7CiAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9NUDQpIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1dFQk0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgICBpZiAoZ1JvdGF0ZSkgewogICAgICAgICAgICAgICAgIG11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoOTApOyAgLy8gVE9ETzogZG9lcyB0aGlzIGRvIGFueXRoaW5nPwpAQCAtMTA0Nyw2ICsxMDI1LDEwIEBACiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJoMjY0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfSDI2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIndlYm0iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9XRUJNOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiM2dwcCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUXzNHUFA7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJmcmFtZXMiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9GUkFNRVM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJyYXctZnJhbWVzIikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCA5ODBkMWQyLi5hNDYzZWM1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKICAgICBDSEVDSyghc3RhdGVCeVRyYWNrLmlzRW1wdHkoKSk7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggNjMwZGUyNS4uZjBlZTBlMSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGJvb2wgcmVuZGVyU3VyZmFjZSwKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIGZpbHRlclN0YXRlLT5tU2lnbmFsbGVkSW5wdXRFT1MgPSBmYWxzZTsKICAgICBmaWx0ZXJTdGF0ZS0+bVNhd091dHB1dEVPUyA9IGZhbHNlOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC02NDMsNyArNjQzLDcgQEAKICAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXAsICZzdGFydFRpbWVSZW5kZXIpOwogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC03MzcsNyArNzM3LDcgQEAKIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIAotICAgIGFuZHJvaWQ6OnNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIGFuZHJvaWQ6OnNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggNDRiMDAxNS4uOTVhMTZmMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzExNjc3Li44NmU5MDQwIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTUwLDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CkBAIC03OCw2ICs3OCw3IEBACiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOworc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsKIHN0YXRpYyBib29sIHNob3dQcm9ncmVzcyA9IHRydWU7CiBzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKIHN0YXRpYyBTdHJpbmc4IGdDb21wb25lbnROYW1lT3ZlcnJpZGU7CkBAIC0xNTksNiArMTYwLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KKwogICAgICAgICBDSEVDS19FUSgKICAgICAgICAgICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSwKQEAgLTM0OCw3ICszNTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVGltZXNVcy5wdXNoKGRlbGF5RGVjb2RlVXMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJWxkIHNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBudW1GcmFtZXMsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dQcm9ncmVzcyAmJiAobisrICUgMTYpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CiAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU3OSwxMiArNTg4LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKKwogICAgICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLQogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICB9CkBAIC02MzAsNiArNjM5LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtVCBhbGxvY2F0ZSBidWZmZXJzIGZyb20gYSBzdXJmYWNlIHRleHR1cmVcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1kKHVtcCkgb3V0cHV0X2ZpbGVuYW1lIChyYXcgc3RyZWFtIGRhdGEgdG8gYSBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLUQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKGRlY29kZWQgUENNIGRhdGEgdG8gYSBmaWxlKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXYgYmUgbW9yZSB2ZXJib3NlXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgZHVtcENvZGVjUHJvZmlsZXMoYm9vbCBxdWVyeURlY29kZXJzKSB7CkBAIC02NDAsNyArNjUwLDggQEAKICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAogICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQworICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNAogICAgIH07CiAKICAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiZGVjb2RlciIgOiAiZW5jb2RlciI7CkBAIC03MDUsMTAgKzcxNiwxMCBAQAogICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogICAgIGdEaXNwbGF5SGlzdG9ncmFtID0gZmFsc2U7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAidmhhcW46bG06YjpwdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTgzMiw2ICs4NDMsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBiMDE5OWQ4Li5iMmYzOWRjIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCmluZGV4IGY3MzQ5MDUuLmFlYzU5NTkgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcApAQCAtNzksMTIgKzc5LDEyIEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmNvbnN1bWVSaWdodHMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICByZXR1cm4gb25Db25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHJldHVybiBvblNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogfQogCkBAIC0xMjAsNyArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBpZiAoIW1pbWUgfHwgbWltZVswXSA9PSAnXDAnKSB7CkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKICAgICAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmkpOwpAQCAtMTM5LDMzICsxMzksMzMgQEAKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSwgbWltZSk7CiB9CiAKLXN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWYsIG1pbWVUeXBlKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIHJldHVybiBvbkNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHJldHVybiBvbkluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmRlY3J5cHQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgcmV0dXJuIG9uRGVjcnlwdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICByZXR1cm4gb25GaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKIH0KIAogc3NpemVfdCBEcm1FbmdpbmVCYXNlOjpwcmVhZCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgcmV0dXJuIG9uUHJlYWQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCA0NGY5OGRkLi5hNmQzM2IwIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zOSw3ICszOSw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIHZvaWQgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKAotICAgICAgICBjb25zdCBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgeworICAgICAgICBjb25zdCBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGhhbmRsZSwgY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgaWYgKDAgPT0gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTksNyArOTksNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKERlY3J5cHRIYW5kbGUqIGhhbmRsZSkgeworc3RhdGljIHZvaWQgY2xlYXJEZWNyeXB0SGFuZGxlKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUpIHsKICAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQxNCw3ICs0MTQsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIEFMT0dWKCJjb25zdW1lUmlnaHRzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC00MzEsNyArNDMxLDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoInNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02MDMsNyArNjAzLDcgQEAKICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNjIxLDcgKzYyMSw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbWltZT0lcyIsIG1pbWU/IG1pbWU6ICJOVUxMIik7CkBAIC02NDYsNyArNjQ2LDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02NTYsNyArNjU2LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02NzMsNyArNjczLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GT1JfU1RSRUFNSU5HLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY4Myw3ICs2ODMsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoImluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTcxOCw3ICs3MTgsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpkZWNyeXB0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIEFMT0dWKCJkZWNyeXB0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzU0LDcgKzc1NCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIEFMT0dWKCJmaW5hbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC03NzAsNyArNzcwLDcgQEAKIH0KIAogc3NpemVfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBBTE9HVigicmVhZCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTExMjgsMTYgKzExMjgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGFjdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGJvb2wgcmVzZXJ2ZSA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgJmhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgID0gY29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMTQ4LDE2ICsxMTQ4LDE2IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBwbGF5YmFja1N0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsICZoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBoYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTEzMjksMTMgKzEzMjksMTMgQEAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZQogICAgICAgICAgICAgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xMzQ5LDEzICsxMzQ5LDEzIEBACiAgICAgICAgIGNvbnN0IFN0cmluZzggdXJpID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCksIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CiAKLSAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7Ci0gICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgeworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZS5nZXQoKSwgcmVwbHkpOwogCiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM3MywxMyArMTM3MywxMiBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUpOwogICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlKGRhdGEucmVhZFN0cmluZzgoKSk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBidWYsIG1pbWVUeXBlKTsKIAogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKICAgICAgICAgfQpAQCAtMTM5Myw3ICsxMzkyLDcgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBjbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUpOwpAQCAtMTQwOCw4ICsxNDA3LDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCkBAIC0xNDE3LDE3ICsxNDE2LDE3IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IGRhdGEuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgRHJtQnVmZmVyKiBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgaGVhZGVySW5mbyA9IG5ldyBEcm1CdWZmZXIoKGNoYXIgKilkYXRhLnJlYWRJbnBsYWNlKGJ1ZmZlclNpemUpLCBidWZmZXJTaXplKTsKIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICAgICAgICAgID0gaW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBoZWFkZXJJbmZvOyBoZWFkZXJJbmZvID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CkBAIC0xNDM5LDggKzE0MzgsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCB1aW50MzJfdCBkZWNCdWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTE0NTAsNyArMTQ0OSw3IEBACiAgICAgICAgICAgICBkZWNCdWZmZXJTaXplID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTQ3MCw3ICsxNDY5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKKyAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKIAogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCkBAIC0xNDgwLDcgKzE0NzksNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlKGRlY0J1ZmZlci0+ZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgZW5jQnVmZmVyOyBlbmNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgZGVjQnVmZmVyOyBkZWNCdWZmZXIgPSBOVUxMOwogICAgICAgICBkZWxldGUgW10gYnVmZmVyOyBidWZmZXIgPSBOVUxMOwpAQCAtMTQ5NSwxMyArMTQ5NCwxMyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAotICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTUxMiw4ICsxNTExLDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtQnl0ZXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpZiAobnVtQnl0ZXMgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKQEAgLTE1MjQsMTMgKzE1MjMsMTMgQEAKIAogICAgICAgICBjb25zdCBvZmY2NF90IG9mZnNldCA9IGRhdGEucmVhZEludDY0KCk7CiAKLSAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgJmhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgc3NpemVfdCByZXN1bHQgPSBwcmVhZCh1bmlxdWVJZCwgaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICBpZiAoMCA8IHJlc3VsdCkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlKGJ1ZmZlciwgcmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXIsIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggNDE3MTA3Zi4uNzNmMTFhNCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC01OSwxMCArNTksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC04MCwyNyArODEsMjggQEAKICAgICBEcm1TdXBwb3J0SW5mbyogZ2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKICAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogcHJvdGVjdGVkOgpAQCAtMjY1LDcgKzI2Nyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCkBAIC0yODAsNyArMjgyLDggQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpID0gMDsKIAogICAgIC8qKgpAQCAtMzk4LDcgKzQwMSw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBmZCAqLywgb2ZmNjRfdCAvKiBvZmZzZXQgKi8sIG9mZjY0X3QgLyogbGVuZ3RoICovLAogICAgICAgICAgICAgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCkBAIC00MTUsNyArNDE4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSA9IDA7CiAKICAgICAvKioKQEAgLTQzMCw3ICs0MzMsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiB1cmkgKi8sIGNvbnN0IGNoYXIqIC8qIG1pbWUgKi8pIHsKIAogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NDcsNyArNDUwLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiAvKiBidWYgKi8sCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKiBtaW1lVHlwZSAqLykgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CkBAIC00NjEsNyArNDY0LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC00NzMsNyArNDc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAogICAgIC8qKgpAQCAtNDkzLDcgKzQ5Niw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC01MDYsNyArNTA5LDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtNTE5LDcgKzUyMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggYWNjOGVkOS4uMTgzN2ExMSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5mb3JtcyB0aGUgRFJNIEVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KQEAgLTIyMyw3ICsyMjMsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICAvKioKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzQyLDcgKzM0Miw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAogICAgIC8qKgpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICogQHJldHVybgogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAogICAgIC8qKgpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIC8qKgpAQCAtNDExLDcgKzQxMSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCAwMzc2YjQ5Li44MzZhZTBhIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCkBAIC0xMTUsMTAgKzExNSwxMSBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCkBAIC0xMzgsMjggKzEzOSwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcyxvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApAQCAtMjAzLDEwICsyMDQsMTAgQEAKICAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMjI1LDI4ICsyMjYsMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKaW5kZXggYmYwNGE4OS4uYWZiY2IzOSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCkBAIC0yNjcsNyArMjY3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0yNzgsNyArMjc4LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtMzk2LDE1ICszOTYsMTUgQEAKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQyMCwxOSArNDIwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00NDgsMjAgKzQ0OCwyMCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICBBTE9HVigiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ3NywyMCArNDc3LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsKLSAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Ci0gICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0ICYmIE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLnJlbW92ZUl0ZW0oZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5OCw3ICs0OTcsOCBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtNTA4LDcgKzUwOCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MzIsNyArNTMyLDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBzc2l6ZV90IHJlc3VsdCA9IERFQ1JZUFRfRklMRV9FUlJPUjsKIApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmggYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAppbmRleCBlN2NkZDM2Li4yNjIyMmJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaApAQCAtODksMTAgKzg5LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMTA5LDI1ICsxMTAsMjYgQEAKIAogICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOworICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2b2lkIG9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KTsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggZGFkNTk5Yi4uMjUzMjI3NSAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTIwNiw3ICsyMDYsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY29uc3VtZVJpZ2h0cyIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDT05TVU1FX1JJR0hUUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjE1LDcgKzIxNSw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigiRW50ZXJpbmcgc2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoU0VUX1BMQVlCQUNLX1NUQVRVUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRBbGxTdXBwb3J0SW5mbyh1bmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gd2l0aCB1cmkiKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gZm9yIHN0cmVhbWluZyIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjkyLDcgKzI5Miw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKENMT1NFX0RFQ1JZUFRfU0VTU0lPTikpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCkpIHsKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZGVjcnlwdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChERUNSWVBUKSkgewpAQCAtMzIwLDcgKzMyMCw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChGSU5BTElaRV9ERUNSWVBUX1VOSVQpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMyOCw3ICszMjgsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHByZWFkIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFBSRUFEKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDQ1Y2VlMmUuLjdhYWVhYjUgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTk1LDEwICs5NSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCxpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKICAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMTUsMjYgKzExNiwyNyBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCmluZGV4IGMwNDdlYjEuLmIwYTQ0MWIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjY3LDcgKzI2Nyw3IEBACiBzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKE5VTEwgIT0gdXJpKSB7CiAgICAgICAgIGhhbmRsZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLCBtaW1lKTsKICAgICB9CkBAIC0yODQsNyArMjg0LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNsb3NlRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI5NSw3ICsyOTUsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBoZWFkZXJJbmZvKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBlbmNCdWZmZXIpCiAgICAgICAgICYmIChOVUxMICE9IGRlY0J1ZmZlcikgJiYgKE5VTEwgIT0gKmRlY0J1ZmZlcikpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+ZGVjcnlwdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5maW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMyOSw3ICszMjksNyBAQAogICAgIHNzaXplX3QgcmV0Q29kZSA9IElOVkFMSURfVkFMVUU7CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGJ1ZmZlcikgJiYgKDAgPCBudW1CeXRlcykpIHsKICAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByZWFkKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgIH0KICAgICByZXR1cm4gcmV0Q29kZTsKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAppbmRleCBhNTcxYjNhLi5iNjJkZGI5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0xOTgsNyArMTk4LDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbik7CiAjZWxzZQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CiAjZW5kaWYKQEAgLTMzMCwxMSArMzMwLDExIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogI2Vsc2UKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7CiAjZW5kaWYKIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpOwogCiAvKioKQEAgLTM2MCw3ICszNjAsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAogLyoqCiAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KQEAgLTM3Myw3ICszNzMsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCkBAIC0zOTQsNyArMzk0LDcgQEAKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwogc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcik7CkBAIC00MTYsNyArNDE2LDcgQEAKICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAqLwotc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCkBAIC00MzAsNyArNDMwLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKIC8qKgpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCiAgKi8KIHNzaXplX3Qgb25SZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgIHZvaWQqIHBCdWZmZXIsCiAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpOwogCkBAIC00NjMsMTIgKzQ2MywxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIG9mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbHNlCiBvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwKICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZW5kaWYKQEAgLTQ4NiwxMyArNDg2LDEzIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKICNlbHNlCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDczZWVhODkuLjc2OWRlMGMgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMjk0LDcgKzI5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ29uc3VtZVJpZ2h0cyhpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYWN0aW9uICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyogcmVzZXJ2ZSAqLykgewogICAgIC8vIE5vIHJpZ2h0cyBjb25zdW1wdGlvbgpAQCAtMzcyLDExICszNzIsMTMgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywKKyAgICAgICAgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgewogI2Vsc2UKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludCAvKiBwb3NpdGlvbiAqLykgewogI2VuZGlmCiAgICAgLy8gTm90IHVzZWQKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOwpAQCAtNDcwLDEzICs0NzIsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgLyogbGVuZ3RoICovKSB7CiAjZWxzZQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBsZW5ndGggKi8pIHsKQEAgLTQ4Nyw3ICs0ODksNyBAQAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogCiAgICAgaWYgKCgtMSA8IGZkKSAmJgotICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoIWRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSB7CiAgICAgICAgIGZpbGVEZXNjID0gZHVwKGZkKTsKICAgICB9IGVsc2UgewpAQCAtNTMzLDEyICs1MzUsMTIgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKICAgICAgICAgU3RyaW5nOCB1cmlUYWcgPSBTdHJpbmc4KHVyaSk7CiAgICAgICAgIHVyaVRhZy50b0xvd2VyKCk7CiAKQEAgLTU2MiwxMSArNTY0LDExIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKHNlc3Npb24tPmZpbGVEZXNjKTsKQEAgLTU3Niw3ICs1NzgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsKICAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKQEAgLTU4NCw5ICs1ODYsNyBAQAogCiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmNsZWFyKCk7CiAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmV4dGVuZGVkRGF0YS5jbGVhcigpOwotCi0gICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlOwotICAgICAgICBkZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgZGVjcnlwdEhhbmRsZS5jbGVhcigpOwogICAgIH0KIAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBoZWFkZXJJbmZvICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCgKICAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8sCkBAIC02MTMsNyArNjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLykgewpAQCAtNjIyLDE5ICs2MjIsMTkgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBkZWNyeXB0VW5pdElkICovKSB7CiAgICAgQUxPR0UoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25SZWFkKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CeXRlcykgewogICAgIHNzaXplX3Qgc2l6ZSA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgorICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYKICAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgogICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgogICAgICAgICBudW1CeXRlcyA+IC0xKSB7CkBAIC02NTQsMTUgKzY1NCwxNSBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLW9mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2Vsc2UKLW9mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbmRpZgogICAgIG9mZl90IG9mZnZhbCA9IC0xOwogCi0gICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgewogICAgICAgICAgICAgb2ZmdmFsID0gRndkTG9ja0ZpbGVfbHNlZWsoc2Vzc2lvbi0+ZmlsZURlc2MsIG9mZnNldCwgd2hlbmNlKTsKQEAgLTY3NSwxMyArNjc1LDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7CiAjZWxzZQogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCkgewpAQCAtNjkwLDcgKzY5MCw3IEBACiAKICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVyU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKE5VTEwgIT0gKGRlY29kZXJTZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgJiYKICAgICAgICAgKE5VTEwgIT0gYnVmZmVyKSAmJgogICAgICAgICAobnVtQnl0ZXMgPiAtMSkgJiYKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCmluZGV4IDdiNjZkYzcuLjRhYjUyNzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaApAQCAtNTMsMTAgKzUzLDExIEBACiAKICAgICBpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgb25WYWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTc0LDI2ICs3NSwyNSBAQAogICAgIERybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKIAotICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKLQotcHJpdmF0ZToKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb25JbXBsKCk7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAppbmRleCBkN2YyZDI4Li4wZmEzNDc4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApAQCAtMTgzLDEzICsxODMsMTMgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpAQCAtMjM2LDcgKzIzNiw4IEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgIG9mZjY0X3QgLypsZW5ndGgqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogCiAjaWZkZWYgRU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04KQEAgLTI0NiwzNiArMjQ3LDM4IEBACiAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAjZWxzZQotICAgICh2b2lkKShkZWNyeXB0SGFuZGxlKTsgLy8gdW51c2VkCisgICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUuZ2V0KCkpOyAvLyB1bnVzZWQKICNlbmRpZgogCiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgeworICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIC8qSVYqLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLAorICAgICAgICBEcm1CdWZmZXIqIC8qSVYqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICAvKioKICAgICAgKiBBcyBhIHdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gcGFzc3RocnUgd291bGQgY29weSB0aGUgZ2l2ZW4KQEAgLTI5NiwxMiArMjk5LDEyIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAorc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKICAgICAgICAgICAgIHZvaWQqIC8qYnVmZmVyKi8sIHNzaXplX3QgLypudW1CeXRlcyovLCBvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA5MWQxZjdlLi40MWQxODMzIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCBjZjA4NjEwLi4xNGZmNDkzIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAKQEAgLTQzLDEyICs0MywxMyBAQAogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOzsKIHVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC0xMzksNiArMTQwLDE4IEBACiAgICAgfQogfQogCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKKyAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7CisgICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlSW5hY3RpdmU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKwogc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbCBsZXZlbCkgewogICAgIHN3aXRjaChsZXZlbCkgewogICAgIGNhc2UgSGRjcExldmVsOjpIRENQX05PTkU6CkBAIC0xOTksNiArMjEyLDE1IEBACiAgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgorICAgICAgICBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKIHN0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIHN0YXR1cykgewogICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgY2FzZSBTdGF0dXM6Ok9LOgpAQCAtMzA1LDYgKzMyNyw3IEBACiAgICAgfQogICAgIG1QbHVnaW4uY2xlYXIoKTsKICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiB9CiAKIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKQEAgLTMxOCw3ICszNDEsNiBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjksNyArMzUxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJRHJtRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MjcsNiArNTU4LDcgQEAKICAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTA2NSw2ICsxMDk3LDczIEBACiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSh0b0hpZGxWZWMoa2V5U2V0SWQpLAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggNTA5OTYxZi4uOGMyNjMxNyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtNjEsNyArNjEsMTAgQEAKICAgICBHRVRfTlVNQkVSX09GX1NFU1NJT05TLAogICAgIEdFVF9TRUNVUklUWV9MRVZFTCwKICAgICBSRU1PVkVfU0VDVVJFX1NUT1AsCi0gICAgR0VUX1NFQ1VSRV9TVE9QX0lEUworICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLAorICAgIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTM3Niw2ICszNzksNTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNldElkcy5jbGVhcigpOworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGtleVNldElkKTsKKyAgICAgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfT0ZGTElORV9MSUNFTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbGljZW5zZVN0YXRlID0gc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC05ODAsNiArMTAyOSw0NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+IGtleVNldElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGtleVNldElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBrZXlTZXRJZHMuc2l6ZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY291bnQpOworICAgICAgICAgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRlciA9IGtleVNldElkcy5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUoaXRlciAhPSBrZXlTZXRJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfT0ZGTElORV9MSUNFTlNFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCAmc3RhdGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihzdGF0ZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1BST1BFUlRZX1NUUklORzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNzYyODk2OC4uOWUwMTE1ZSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE3LDYgKzE3LDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgImxpYmJpbmRlciIsCiAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcAppbmRleCA5M2M2NDNiLi5kNDhiMGE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKQEAgLTI3LDQgKzI3LDE4IEBACiAgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7CiB9CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtIZXhDaGFyc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisgICAgLy8gRWFjaCBpbnB1dCBieXRlIGNyZWF0ZXMgdHdvIG91dHB1dCBoZXggY2hhcmFjdGVycy4KKyAgICBzdGQ6OnN0cmluZyBvdXRfYnVmZmVyKGxlbmd0aCAqIDIsICdcMCcpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBjaGFyIGJ5dGUgPSBpbl9idWZmZXJbaV07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKV0gPSBrSGV4Q2hhcnNbKGJ5dGUgPj4gNCkgJiAweGZdOworICAgICAgICBvdXRfYnVmZmVyWyhpICogMikgKyAxXSA9IGtIZXhDaGFyc1tieXRlICYgMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIG91dF9idWZmZXI7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCmluZGV4IDI1NDMxMjQuLmFhNTcxYzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApAQCAtMTcsMTQgKzE3LDE2IEBACiAjaWZuZGVmIENMRUFSS0VZX1VUSUxTX0hfCiAjZGVmaW5lIENMRUFSS0VZX1VUSUxTX0hfCiAKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCiAvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CiAKK3N0ZDo6c3RyaW5nIEJ5dGVBcnJheVRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGluX2J1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCmluZGV4IDJmY2UwNzkwLi4wYWM4NzljIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCAzNDFkNGY2Li5iNDRhNmM3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC0xNSw3ICsxNSw3IEBACiAvLwogCiBjY19iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIsCisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5IiwKICAgICB2ZW5kb3I6IHRydWUsCiAKICAgICBzcmNzOiBbCkBAIC0yNSwxMCArMjUsMTIgQEAKICAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAogICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAogICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEZXZpY2VGaWxlcy5jcHAiLAogICAgICAgICAiRHJtRmFjdG9yeS5jcHAiLAogICAgICAgICAiRHJtUGx1Z2luLmNwcCIsCiAgICAgICAgICJJbml0RGF0YVBhcnNlci5jcHAiLAogICAgICAgICAiSnNvbldlYktleS5jcHAiLAorICAgICAgICAiTWVtb3J5RmlsZVN5c3RlbS5jcHAiLAogICAgICAgICAiU2Vzc2lvbi5jcHAiLAogICAgICAgICAiU2Vzc2lvbkxpYnJhcnkuY3BwIiwKICAgICAgICAgInNlcnZpY2UuY3BwIiwKQEAgLTM3LDExICszOSwxMiBAQAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKIAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0gICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLApAQCAtNDksMTEgKzUyLDEzIEBACiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNsZWFya2V5Y29tbW9uIiwKKyAgICAgICAgImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zIiwKICAgICAgICAgImxpYmpzbW4iLAogICAgIF0sCiAKQEAgLTY1LDQgKzcwLDEzIEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAorICAgIHZlbmRvcjogdHJ1ZSwKIAorICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzcmNzOiBbInByb3Rvcy9EZXZpY2VGaWxlcy5wcm90byJdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCmluZGV4IGMyZWQ3NTEuLjY1N2E0MmYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAppbmRleCBlNThmNThhLi43NWY4Mzk1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCkBAIC00Nyw3ICs0Nyw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMWJhNWM2YS4uMTQxMGQ3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogZXh0ZXJuICJDIiB7CkBAIC0zOCw3ICszOCw3IEBACiB9IC8vIGV4dGVybiAiQyIKIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCmluZGV4IDA4NDhjZWYuLjJhNDhkYjYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKApAQCAtNjAsNyArNjAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGYzM2Y5NGUuLmE0ODhmODYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKQEAgLTE3OSw3ICsxNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKy8vIFByb3RvYnVmIGdlbmVyYXRlZCBjbGFzc2VzLgordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Ok9mZmxpbmVGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Okhhc2hlZEZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOworCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrTGljZW5zZUZpbGVOYW1lRXh0W10gPSAiLmxpYyI7CisKK2Jvb2wgSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSwgc3RkOjpzdHJpbmcqIGhhc2gpIHsKKyAgICBpZiAoIWhhc2gpIHJldHVybiBmYWxzZTsKKworICAgIGhhc2gtPnJlc2l6ZShTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEuZGF0YSgpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBvdXRwdXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmKCpoYXNoKVswXSk7CisgICAgU0hBMjU2KGlucHV0LCBkYXRhLnNpemUoKSwgb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlTGljZW5zZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWNlbnNlUmVzcG9uc2UpIHsKKworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goc2VyaWFsaXplZEZpbGUsICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlV2l0aEhhc2g6IEZhaWxlZCB0byBjb21wdXRlIGhhc2giKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaGFzaEZpbGUuc2V0X2ZpbGUoc2VyaWFsaXplZEZpbGUpOworICAgIGhhc2hGaWxlLnNldF9oYXNoKGhhc2gpOworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIGhhc2hGaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVJhdyhmaWxlTmFtZSwgc2VyaWFsaXplZEhhc2hGaWxlKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRIYXNoRmlsZSkgeworICAgIE1lbW9yeUZpbGVTeXN0ZW06Ok1lbW9yeUZpbGUgbWVtRmlsZTsKKyAgICBtZW1GaWxlLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKKyAgICBtZW1GaWxlLnNldENvbnRlbnQoc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICBtZW1GaWxlLnNldEZpbGVTaXplKHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpOworICAgIHNpemVfdCBsZW4gPSBtRmlsZUhhbmRsZS5Xcml0ZShmaWxlTmFtZSwgbWVtRmlsZSk7CisKKyAgICBpZiAobGVuICE9IHN0YXRpY19jYXN0PHNpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVJhdzogRmFpbGVkIHRvIHdyaXRlICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IGV4cGVjdGVkPSV6ZCwgYWN0dWFsPSV6dSIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGxlbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiB3cm90ZSAlenUgYnl0ZXMgdG8gJXMiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVMaWNlbnNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGlmICghUmV0cmlldmVIYXNoZWRGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgJmZpbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS50eXBlKCkgIT0gT2ZmbGluZUZpbGU6OkxJQ0VOU0UpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnZlcnNpb24oKSAhPSBPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWZpbGUuaGFzX2xpY2Vuc2UoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBMaWNlbnNlIG5vdCBwcmVzZW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMaWNlbnNlIGxpY2Vuc2UgPSBmaWxlLmxpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKGxpY2Vuc2Uuc3RhdGUoKSkgeworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRToKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVBY3RpdmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlUmVsZWFzaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiUmV0cmlldmVMaWNlbnNlOiBVbnJlY29nbml6ZWQgbGljZW5zZSBzdGF0ZTogJXUiLAorICAgICAgICAgICAgICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93bik7CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqb2ZmbGluZUxpY2Vuc2UgPSBsaWNlbnNlLmxpY2Vuc2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVBbGxMaWNlbnNlcygpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlQWxsRmlsZXMoKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6TGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGV2aWNlRmlsZXM6Okxpc3RMaWNlbnNlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZXMgPSBtRmlsZUhhbmRsZS5MaXN0RmlsZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpY2Vuc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBsaWNlbnNlID0gbGljZW5zZXNbaV07CisgICAgICAgIGxpY2Vuc2UgPSBsaWNlbnNlLnN1YnN0cigwLCBsaWNlbnNlLnNpemUoKSAtIHN0cmxlbihrTGljZW5zZUZpbGVOYW1lRXh0KSk7CisgICAgfQorICAgIHJldHVybiBsaWNlbnNlczsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFGaWxlRXhpc3RzKGZpbGVOYW1lKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiAlcyBkb2VzIG5vdCBleGlzdCIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlcyA9IEdldEZpbGVTaXplKGZpbGVOYW1lKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgc2l6ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBzZXJpYWxpemVkSGFzaEZpbGUucmVzaXplKGJ5dGVzKTsKKyAgICBieXRlcyA9IG1GaWxlSGFuZGxlLlJlYWQoZmlsZU5hbWUsICZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgaWYgKGJ5dGVzICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogZXhwZWN0ZWQ6ICV6ZCwgYWN0dWFsOiAlemQiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBieXRlcyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiByZWFkICV6ZCBmcm9tICVzIiwgYnl0ZXMsIGZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBpZiAoIWhhc2hGaWxlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkSGFzaEZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBoYXNoIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChoYXNoRmlsZS5maWxlKCksICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhhc2ggIT0gaGFzaEZpbGUuaGFzaCgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggbWlzbWF0Y2giKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUtPlBhcnNlRnJvbVN0cmluZyhoYXNoRmlsZS5maWxlKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoZmlsZU5hbWUpOworfQorCitib29sIERldmljZUZpbGVzOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGZpbGVOYW1lKTsKK30KKworc3NpemVfdCBEZXZpY2VGaWxlczo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkdldEZpbGVTaXplKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCmluZGV4IDc3NTU3ZjkuLjlkMDQwYTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMzAsNyArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC03MSw3ICs3MSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKaW5kZXggZDUxZTI5ZC4uNzE4NGI1MyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcApAQCAtMjUsMTEgKzI1LDE1IEBACiAjaW5jbHVkZSAiQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgiCiAjaW5jbHVkZSAiU2Vzc2lvbi5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKIAogbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtLZXlTZXRJZFByZWZpeCgiY2tpZCIpOworY29uc3QgaW50IGtLZXlTZXRJZExlbmd0aCA9IDE2OwogY29uc3QgaW50IGtTZWN1cmVTdG9wSWRTdGFydCA9IDEwMDsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lTGljZW5zZSgiXCJ0eXBlXCI6XCJwZXJzaXN0ZW50LWxpY2Vuc2VcIiIpOwogY29uc3Qgc3RkOjpzdHJpbmcga1N0cmVhbWluZygiU3RyZWFtaW5nIik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrT2ZmbGluZSgiT2ZmbGluZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeUxpY2Vuc2UoIlwidHlwZVwiOlwidGVtcG9yYXJ5XCIiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtUcnVlKCJUcnVlIik7CiAKIGNvbnN0IHN0ZDo6c3RyaW5nIGtRdWVyeUtleUxpY2Vuc2VUeXBlKCJMaWNlbnNlVHlwZSIpOwpAQCAtNTQsOSArNTgsMTIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6S2V5U2V0SWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CisKIERybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAogICAgICAgICAgIG1PcGVuU2Vzc2lvbk9rQ291bnQoMCksCkBAIC02Niw2ICs3Myw4IEBACiAgICAgbVBsYXlQb2xpY3kuY2xlYXIoKTsKICAgICBpbml0UHJvcGVydGllcygpOwogICAgIG1TZWN1cmVTdG9wcy5jbGVhcigpOworICAgIG1SZWxlYXNlS2V5c01hcC5jbGVhcigpOworICAgIHN0ZDo6c3JhbmQoc3RkOjp0aW1lKG51bGxwdHIpKTsKIH0KIAogdm9pZCBEcm1QbHVnaW46OmluaXRQcm9wZXJ0aWVzKCkgewpAQCAtMTQ3LDI1ICsxNTYsNjEgQEAKICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpIHsKICAgICAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKKyAgICAvLyBHZXRLZXlSZXF1ZXN0T2ZmbGluZUtleVR5cGVOb3RTdXBwb3J0ZWQoKSBpbiB2dHMgMS4wIGFuZCAxLjEgZXhwZWN0cworICAgIC8vIEtleVR5cGU6Ok9GRkxJTkUgdG8gcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFIGluIGNsZWFya2V5IHBsdWdpbi4KKyAgICAvLyBUaG9zZSB0ZXN0cyBwYXNzIGluIGFuIGVtcHR5IGluaXREYXRhLCB3ZSB1c2UgdGhlIGVtcHR5IGluaXREYXRhIHRvCisgICAgLy8gc2lnbmFsIHN1Y2ggc3BlY2lmaWMgdXNlIGNhc2UuCisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSAmJiAwID09IGluaXREYXRhLnNpemUoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKICAgICAqZGVmYXVsdFVybCA9ICIiOwogICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOwogICAgICpyZXF1ZXN0ID0gc3RkOjp2ZWN0b3I8dWludDhfdD4oKTsKIAotICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCkgeworICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgICAgIGtleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gdG9WZWN0b3Ioc2NvcGUpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb247CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6U1RSRUFNSU5HIHx8IGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOwogICAgIH0KIAotICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7Ci0gICAgfQorICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgcmVxdWVzdCk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIHJlcXVlc3QpOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOworICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdFN0cmluZyhyZXF1ZXN0LT5iZWdpbigpLCByZXF1ZXN0LT5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKGtleVNldElkU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgZW1wdHlSZXNwb25zZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiUHJvYmxlbSByZWxlYXNpbmcgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbGVhc2VLZXlzTWFwLmZpbmQoa2V5U2V0SWRTdHJpbmcpID09IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICBtUmVsZWFzZUtleXNNYXBba2V5U2V0SWRTdHJpbmddID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dJKCJrZXkgaXMgaW4gdXNlLCBpZ25vcmUgcmVsZWFzZSByZXF1ZXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiT2ZmbGluZSBsaWNlbnNlIG5vdCBmb3VuZCwgbm90aGluZyB0byByZWxlYXNlIik7CisgICAgICAgIH0KKyAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIyNyw2ICsyNzIsMzAgQEAKICAgICBtUGxheVBvbGljeS5wdXNoX2JhY2socG9saWN5KTsKIH0KIAorYm9vbCBEcm1QbHVnaW46Om1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpIHsKKyAgICBpZiAoIWtleVNldElkKSB7CisgICAgICAgIEFMT0dFKCJrZXlTZXRJZCBkZXN0aW5hdGlvbiBub3QgcHJvdmlkZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrc2lkKGtLZXlTZXRJZFByZWZpeC5iZWdpbigpLCBrS2V5U2V0SWRQcmVmaXguZW5kKCkpOworICAgIGtzaWQucmVzaXplKGtLZXlTZXRJZExlbmd0aCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmFuZG9tRGF0YSgoa0tleVNldElkTGVuZ3RoIC0ga0tleVNldElkUHJlZml4LnNpemUoKSkgLyAyLCAwKTsKKworICAgIHdoaWxlIChrZXlTZXRJZC0+ZW1wdHkoKSkgeworICAgICAgICBmb3IgKGF1dG8gaXRyID0gcmFuZG9tRGF0YS5iZWdpbigpOyBpdHIgIT0gcmFuZG9tRGF0YS5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgICAgICppdHIgPSBzdGQ6OnJhbmQoKSAlIDB4ZmY7CisgICAgICAgIH0KKyAgICAgICAgKmtleVNldElkID0ga0tleVNldElkUHJlZml4ICsgQnl0ZUFycmF5VG9IZXhTdHJpbmcoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmFuZG9tRGF0YS5kYXRhKCkpLCByYW5kb21EYXRhLnNpemUoKSk7CisgICAgICAgIGlmIChtRmlsZUhhbmRsZS5MaWNlbnNlRXhpc3RzKCprZXlTZXRJZCkpIHsKKyAgICAgICAgICAgIC8vIGNvbGxpc2lvbiwgcmVnZW5lcmF0ZQorICAgICAgICAgICAgQUxPR1YoIlJldHJ5IGdlbmVyYXRpbmcgS2V5U2V0SWQiKTsKKyAgICAgICAgICAgIGtleVNldElkLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3BvbnNlLApAQCAtMjM3LDI4ICszMDYsMTE5IEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IHRvVmVjdG9yKHNjb3BlKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgYm9vbCBpc1JlbGVhc2UgPSAobWVtY21wKHNjb3BlSWQuZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSA9PSAwKTsKKyAgICBpZiAoaXNSZWxlYXNlKSB7CisgICAgICAgIGtleVNldElkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworCisgICAgICAgIGF1dG8gaXRlciA9IG1SZWxlYXNlS2V5c01hcC5maW5kKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSk7CisgICAgICAgIGlmIChpdGVyICE9IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihpdGVyLT5zZWNvbmQuYmVnaW4oKSwgaXRlci0+c2Vjb25kLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgLy8gbm9uIG9mZmxpbmUgbGljZW5zZSByZXR1cm5zIGVtcHR5IGtleVNldElkCisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVELCBoaWRsX3ZlYzx1aW50OF90PigpKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0KICAgICBzZXRQbGF5UG9saWN5KCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOwogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KLSAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIDAsIHNjb3BlKTsKLSAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICAgICAgaWYgKGlzT2ZmbGluZUxpY2Vuc2UpIHsKKyAgICAgICAgICAgIGlmIChpc1JlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICBtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGtleVNldElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFtYWtlS2V5U2V0SWQoJmtleVNldElkKSkgeworICAgICAgICAgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sIG9rID0gbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKAorICAgICAgICAgICAgICAgICAgICAgICAga2V5U2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlc3BvbnNlLmJlZ2luKCksIHJlc3BvbnNlLmVuZCgpKSk7CisgICAgICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0b3JlIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3QgY2FsbGluZyBBTWVkaWFEcm0gbGlzdGVuZXJzLgorICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgc2Vzc2lvbklkLCBzZXNzaW9uSWQpOworCisgICAgICAgIHNlbmRFeHBpcmF0aW9uVXBkYXRlKHNlc3Npb25JZCwgMTAwKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxLZXlTdGF0dXM+IGtleXNTdGF0dXM7CisgICAgICAgIEtleVN0YXR1cyBrZXlTdGF0dXM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQxID0geyAweEEsIDB4QiwgMHhDIH07CisgICAgICAgIGtleVN0YXR1cy5rZXlJZCA9IGtleUlkMTsKKyAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8wOjpLZXlTdGF0dXNUeXBlOjpVU0FCTEU7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQyID0geyAweEQsIDB4RSwgMHhGIH07CisgICAgICAgIGtleVN0YXR1cy5rZXlJZCA9IGtleUlkMjsKKyAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8wOjpLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOworICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOworCisgICAgICAgIHNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5c1N0YXR1cywgdHJ1ZSk7CisKKyAgICAgICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2Vzc2lvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJvdmlkZUtleVJlc3BvbnNlIHJldHVybnMgZXJyb3I9JWQiLCBzdGF0dXMpOwogICAgIH0KIAotICAgIGluc3RhbGxTZWN1cmVTdG9wKHNjb3BlKTsKLQotICAgIC8vIFJldHVybnMgc3RhdHVzIGFuZCBlbXB0eSBrZXlTZXRJZAotICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWRWZWMoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkVmVjKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZXN0b3JlS2V5cygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOworICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKKyAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd24gPT0gbGljZW5zZVN0YXRlIHx8CisgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBsaWNlbnNlIHN0YXRlPSVkIiwgbGljZW5zZVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2Uoc3RkOjp2ZWN0b3I8dWludDhfdD4ob2ZmbGluZUxpY2Vuc2UuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBvZmZsaW5lTGljZW5zZS5lbmQoKSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBrZXlzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZShwcm9wZXJ0eU5hbWUuY19zdHIoKSk7CkBAIC0zMjgsNiArNDg4LDkgQEAKICAgIGlmIChuYW1lID09IGtEZXZpY2VJZEtleSkgewogICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0NsaWVudElkS2V5XSA9IHRvVmVjdG9yKHZhbHVlKTsKKyAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKICAgIH0KIAogICAgLy8gU2V0dGluZyBvZiB1bmRlZmluZWQgcHJvcGVydGllcyBpcyBub3Qgc3VwcG9ydGVkCkBAIC00NjUsNiArNjI4LDUxIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZU5hbWVzID0gbUZpbGVIYW5kbGUuTGlzdExpY2Vuc2VzKCk7CisgICAgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+IGtleVNldElkczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBsaWNlbnNlTmFtZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhrZXlTZXRJZCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGtleVNldElkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlbW92ZU9mZmxpbmVMaWNlbnNlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCkgeworICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICBpZiAobUZpbGVIYW5kbGUuRGVsZXRlTGljZW5zZShsaWNlbnNlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQsCisgICAgICAgIGdldE9mZmxpbmVMaWNlbnNlU3RhdGVfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlOworICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZTsKKyAgICBpZiAobUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKGxpY2Vuc2VOYW1lLCAmc3RhdGUsICZsaWNlbnNlKSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmU6CisgICAgICAgICAgICBoTGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmc6CisgICAgICAgICAgICBoTGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd246CisgICAgICAgICAgICBoTGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGhMaWNlbnNlU3RhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0U2VjdXJlU3RvcHMoZ2V0U2VjdXJlU3RvcHNfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wPiBzdG9wczsKICAgICBmb3IgKGF1dG8gaXRyID0gbVNlY3VyZVN0b3BzLmJlZ2luKCk7IGl0ciAhPSBtU2VjdXJlU3RvcHMuZW5kKCk7ICsraXRyKSB7CkBAIC01NjcsNyArNzc1LDcgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKaW5kZXggZTJiYjY1MS4uOGViYjQyYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIG5hbWVzcGFjZSB7CkBAIC00NSwyMSArNDUsMjIgQEAKIH0KIAogU3RhdHVzIEluaXREYXRhUGFyc2VyOjpwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KSB7CiAgICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBrZXkgSURzCiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+IGtleUlkczsKIAotICAgIGlmICh0eXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtJc29CbWZmQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtDZW5jSW5pdERhdGFGb3JtYXQpIHsKKyAgICBpZiAobWltZVR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtJc29CbWZmQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CiAgICAgICAgIFN0YXR1cyByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOwogICAgICAgICBpZiAocmVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgeworICAgIH0gZWxzZSBpZiAobWltZVR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0KSB7CiAgICAgICAgIC8vIFdlYk0gImluaXQgZGF0YSIgaXMganVzdCBhIHNpbmdsZSBrZXkgSUQKICAgICAgICAgaWYgKGluaXREYXRhLnNpemUoKSAhPSBrS2V5SWRTaXplKSB7CiAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKQEAgLTY5LDggKzcwLDEyIEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAorICAgIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgLy8gcmVzdG9yZSBrZXkKKyAgICB9CisKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdAotICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleUlkcyk7CisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5VHlwZSwga2V5SWRzKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0SnNvblZlYyA9IFN0clRvVmVjdG9yKHJlcXVlc3RKc29uKTsKIAogICAgIGxpY2Vuc2VSZXF1ZXN0LT5jbGVhcigpOwpAQCAtMTMxLDkgKzEzNiwxMSBAQAogICAgIHJldHVybiBTdGF0dXM6Ok9LOwogfQogCi1zdGQ6OnN0cmluZyBJbml0RGF0YVBhcnNlcjo6Z2VuZXJhdGVSZXF1ZXN0KGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CitzdGQ6OnN0cmluZyBJbml0RGF0YVBhcnNlcjo6Z2VuZXJhdGVSZXF1ZXN0KFYxXzA6OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFByZWZpeCgie1wia2lkc1wiOlsiKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFN1ZmZpeCgiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlTZXNzaW9uKCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1BlcnNpc3RlbnRTZXNzaW9uKCJdLFwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCJ9Iik7CiAKICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0KGtSZXF1ZXN0UHJlZml4KTsKICAgICBzdGQ6OnN0cmluZyBlbmNvZGVkSWQ7CkBAIC0xNDcsNyArMTU0LDEyIEBACiAgICAgICAgIHJlcXVlc3QuYXBwZW5kKGVuY29kZWRJZCk7CiAgICAgICAgIHJlcXVlc3QucHVzaF9iYWNrKCdcIicpOwogICAgIH0KLSAgICByZXF1ZXN0LmFwcGVuZChrUmVxdWVzdFN1ZmZpeCk7CisgICAgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6U1RSRUFNSU5HKSB7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtUZW1wb3JhcnlTZXNzaW9uKTsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6T0ZGTElORSB8fAorICAgICAgICAgICAgICAgICAgIGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1BlcnNpc3RlbnRTZXNzaW9uKTsKKyAgICB9CiAKICAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KICAgICBjb25zdCBjaGFyIGtCYXNlNjRQYWRkaW5nID0gJz0nOwpAQCAtMTU3LDcgKzE2OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcAppbmRleCBjY2NiNDFlLi5kOTM3NzdkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKQEAgLTIyLDE4ICsyMiwyMSBAQAogI2luY2x1ZGUgIkJhc2U2NC5oIgogCiBuYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0Jhc2U2NFBhZGRpbmcoIj0iKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlzVGFnKCJrZXlzIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5VHlwZVRhZygia3R5Iik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleVRhZygiayIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleUlkVGFnKCJraWQiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrTWVkaWFTZXNzaW9uVHlwZSgidHlwZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1BlcnNpc3RlbnRMaWNlbnNlU2Vzc2lvbigicGVyc2lzdGVudC1saWNlbnNlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOworY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeUxpY2Vuc2VTZXNzaW9uKCJ0ZW1wb3JhcnkiKTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogSnNvbldlYktleTo6SnNvbldlYktleSgpIHsKQEAgLTI2OCw3ICsyNzEsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjZDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJNZW1vcnlGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworc3RkOjpzdHJpbmcgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBzaXplX3QgaW5kZXggPSBwYXRoLmZpbmRfbGFzdF9vZigiLyIpOworICAgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHIoaW5kZXgrMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpOworfQorCitzc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzdWx0LT5zZWNvbmQuZ2V0RmlsZVNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgc2l6ZSBmb3IgJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1lbW9yeUZpbGVTeXN0ZW06Okxpc3RGaWxlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGlzdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGVuYW1lIDogbU1lbW9yeUZpbGVTeXN0ZW0pIHsKKyAgICAgICAgbGlzdC5wdXNoX2JhY2soZmlsZW5hbWUuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OlJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBidWZmZXIpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZSA9IHJlc3VsdC0+c2Vjb25kLmdldENvbnRlbnQoKTsKKyAgICAgICAgYnVmZmVyLT5hc3NpZ24oc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci0+c2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OldyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShrZXkpOworICAgIH0KKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPihrZXksIG1lbW9yeUZpbGUpKTsKKyAgICByZXR1cm4gbWVtb3J5RmlsZS5nZXRGaWxlU2l6ZSgpOworfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBsaWNlbnNlIHRvIHJlbW92ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVBbGxGaWxlcygpIHsKKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5jbGVhcigpOworICAgIHJldHVybiBtTWVtb3J5RmlsZVN5c3RlbS5lbXB0eSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKaW5kZXggMDdjOTI2OS4uZjRjNDliOSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCkBAIC0yOCw3ICsyOCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwpAQCAtNDIsOSArNDIsMTAgQEAKIFN0YXR1cyBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3QgewogICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKLSAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5UmVxdWVzdCk7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIGtleVJlcXVlc3QpOwogfQogCiBTdGF0dXMgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSkgewpAQCAtODksNyArOTAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAppbmRleCBiNDMxOWU2Li45OWZiMzBmIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01OSw3ICs1OSw4IEBACiAKICAgICBtU2Vzc2lvbnMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwKICAgICAgICAgICAgIHNwPFNlc3Npb24+ID4oc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKSk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtNzAsNyArNzEsOCBAQAogc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7Ci0gICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9IG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHNwPFNlc3Npb24+ID46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOwogICAgIGlmIChpdHIgIT0gbVNlc3Npb25zLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBpdHItPnNlY29uZDsKICAgICB9IGVsc2UgewpAQCAtODQsNyArODYsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTg1NmEuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTEgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkKLSAgICBjbGFzcyBoYWwKLSAgICB1c2VyIG1lZGlhCi0gICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KLSAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTg0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjCkBAIC0wLDAgKzEsNiBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTIgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaAppbmRleCAwYzdlZjIwLi43MjFmNGMwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTQyLDcgKzQyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKaW5kZXggNGEzODViZC4uZWMzMGNjMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTM4LDcgKzM4LDcgQEAKIHZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaAppbmRleCA1YmJiMjhhLi5jNDk3ZTM3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTQsNyArNTQsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaAppbmRleCBkNjViMjVjLi5mODM5MDNjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCkBAIC0yMiwxMyArMjIsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yS2V5KCJ2ZW5kb3IiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yVmFsdWUoIkdvb2dsZSIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uS2V5KCJ2ZXJzaW9uIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25WYWx1ZSgiMS4xIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25WYWx1ZSgiMS4yIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uS2V5KCJkZXNjcmlwdGlvbiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvblZhbHVlKCJDbGVhcktleSBDRE0iKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc0tleSgiYWxnb3JpdGhtcyIpOwpAQCAtNDAsMTIgKzQwLDE2IEBACiBzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KICAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAogICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworCisvLyBzZXR0YWJsZSBieXRlIGFycmF5IHByb3BlcnR5CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0NsaWVudElkS2V5KCJjbGllbnRJZCIpOworCiAvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAppbmRleCA0NmNiNWU0Li43ZTliNmJkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7CkBAIC00Nyw3ICs0Nyw3IEBACiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKaW5kZXggOTk1MjAyNy4uNjM2OGYzZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMTcsMTcgKzE3LDE3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAjZGVmaW5lIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKIAogZXh0ZXJuICJDIiB7CiAgICAgSURybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKTsKQEAgLTM1LDcgKzM1LDcgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCmluZGV4IDE3NWFiNzYuLjIwM2JiMmQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgogCiAjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUyLDcgKzUyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKaW5kZXggNmE3MzgwNi4uNDgwZGM3ZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaApAQCAtMzIsNyArMzIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKQEAgLTk2LDcgKzk2LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGFlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaApAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisjaWZuZGVmIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworI2RlZmluZSBDTEVBUktFWV9ERVZJQ0VfRklMRVNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAicHJvdG9zL0RldmljZUZpbGVzLnBiLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworY2xhc3MgRGV2aWNlRmlsZXMgeworIHB1YmxpYzoKKyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93biwKKyAgICAgICAga0xpY2Vuc2VTdGF0ZUFjdGl2ZSwKKyAgICAgICAga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICB9IExpY2Vuc2VTdGF0ZTsKKworICAgIERldmljZUZpbGVzKCkge307CisgICAgdmlydHVhbCB+RGV2aWNlRmlsZXMoKSB7fTsKKworICAgIHZpcnR1YWwgYm9vbCBTdG9yZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5UmVzcG9uc2UpOworCisgICAgdmlydHVhbCBib29sIFJldHJpZXZlTGljZW5zZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc2V0X2lkLCBMaWNlbnNlU3RhdGUqIHN0YXRlLCBzdGQ6OnN0cmluZyogb2ZmbGluZUxpY2Vuc2UpOworCisgICAgdmlydHVhbCBib29sIExpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKTsKKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RMaWNlbnNlcygpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKTsKKworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVBbGxMaWNlbnNlcygpOworCisgcHJpdmF0ZToKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OworICAgIHNzaXplX3QgR2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBib29sIFJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKTsKKworICAgIGJvb2wgUmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBib29sIFN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0gbUZpbGVIYW5kbGU7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGV2aWNlRmlsZXMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUktFWV9ERVZJQ0VfRklMRVNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCmluZGV4IDZmNTgxOTUuLmZmNzE1ZWEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApAQCAtMTcsMTUgKzE3LDE1IEBACiAjaWZuZGVmIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC01Miw3ICs1Miw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCmluZGV4IGZiMDY5NWEuLjI1NmM1ZDYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKQEAgLTE3LDE4ICsxNywyMSBAQAogI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlICJEZXZpY2VGaWxlcy5oIgogI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7CkBAIC00MSw4ICs0NCwxMiBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZXNzaW9uSWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1QbHVnaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkhkY3BMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtUGx1Z2luOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpPZmZsaW5lTGljZW5zZVN0YXRlOwogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwpAQCAtNTMsNyArNjAsNyBAQAogc3RydWN0IERybVBsdWdpbiA6IHB1YmxpYyBJRHJtUGx1Z2luIHsKICAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKIAotICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkgeyBtRmlsZUhhbmRsZS5EZWxldGVBbGxMaWNlbnNlcygpOyB9CiAKICAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbl8xXzEoU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLApAQCAtOTEsMTMgKzk4LDcgQEAKIAogICAgIFJldHVybjxTdGF0dXM+IHJlc3RvcmVLZXlzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKLQotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLApAQCAtMTQxLDYgKzE0MiwxMyBAQAogCiAgICAgUmV0dXJuPHZvaWQ+IGdldE1ldHJpY3MoZ2V0TWV0cmljc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48dm9pZD4gZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPFN0YXR1cz4gcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoY29uc3QgS2V5U2V0SWQgJmtleVNldElkKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGNvbnN0IEtleVNldElkICZrZXlTZXRJZCwKKyAgICAgICAgICAgIGdldE9mZmxpbmVMaWNlbnNlU3RhdGVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPHZvaWQ+IGdldFByb3BlcnR5U3RyaW5nKAogICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwpAQCAtMzAwLDYgKzMwOCw3IEBACiBwcml2YXRlOgogICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKICAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIGJvb2wgbWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCk7CiAgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CiAKICAgICBSZXR1cm48U3RhdHVzPiBzZXRTZWN1cml0eUxldmVsKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0zMjMsNiArMzMyLDcgQEAKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gbVBsYXlQb2xpY3k7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtU3RyaW5nUHJvcGVydGllczsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPiBtQnl0ZUFycmF5UHJvcGVydGllczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPiBtUmVsZWFzZUtleXNNYXA7CiAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+IG1TZWN1cml0eUxldmVsOwogICAgIHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIFNlc3Npb25MaWJyYXJ5ICptU2Vzc2lvbkxpYnJhcnk7CkBAIC0zMzEsMTEgKzM0MSwxMyBAQAogICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50OwogICAgIHVpbnQzMl90IG1OZXh0U2VjdXJlU3RvcElkOwogCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKaW5kZXggMzE4OWM0YS4uODg5ZjUxMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtMzQsNyArMzQsOCBAQAogICAgIEluaXREYXRhUGFyc2VyKCkge30KIAogICAgIFN0YXR1cyBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CiAKIHByaXZhdGU6CkBAIC00MywxMiArNDQsMTIgQEAKICAgICBTdGF0dXMgcGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKIAotICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdCgKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCmluZGV4IDRhYjAzNGMuLmU1NzQ3MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogY2xhc3MgSnNvbldlYktleSB7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgICAgc3RydWN0IE1lbW9yeUZpbGUgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZTsgIC8vIGV4Y2x1ZGVzIHBhdGgKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBjb250ZW50OyB9CisgICAgICAgIHNpemVfdCBnZXRGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVTaXplOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeyBjb250ZW50ID0gZmlsZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVOYW1lID0gbmFtZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBjb250ZW50LnJlc2l6ZShzaXplKTsgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlGaWxlU3lzdGVtKCkge307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgcHJpdmF0ZToKKyAgICAvLyBMaWNlbnNlIGZpbGUgbmFtZSBpcyBtYWRlIHVwIG9mIGEgdW5pcXVlIGtleVNldElkLCB0aGVyZWZvcmUsCisgICAgLy8gdGhlIGZpbGVuYW1lIGNhbiBiZSB1c2VkIGFzIHRoZSBrZXkgdG8gbG9jYXRlIGxpY2Vuc2VzIGluIHRoZQorICAgIC8vIG1lbW9yeSBmaWxlIHN5c3RlbS4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CisKKyAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVtb3J5RmlsZVN5c3RlbSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKaW5kZXggY2RkZmNhNS4uZjM1NTYwZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTQyLDggKzQyLDkgQEAKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgU3RhdHVzIGdldEtleVJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWltZVR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKIAogICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCkBAIC02Myw3ICs2NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaAppbmRleCAzMjZhMGMxLi4xZTU2N2I4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTU4LDcgKzU4LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCmluZGV4IGNjMDYzMjkuLmY2ZDMwYzkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwpAQCAtNjksNyArNjksNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8gYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTExZjBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KQEAgLTAsMCArMSw0NyBAQAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGV2aWNlX2ZpbGVzLnByb3RvCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vICAgRm9ybWF0IG9mIHZhcmlvdXMgZmlsZXMgc3RvcmVkIGF0IHRoZSBkZXZpY2UuCisvLworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5kcm0uVjFfMi5jbGVhcmtleTsKKworLy8gbmVlZCB0aGlzIGlmIHdlIGFyZSB1c2luZyBsaWJwcm90b2J1Zi1jcHAtMi4zLjAtbGl0ZQorb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKKworbWVzc2FnZSBMaWNlbnNlIHsKKyAgZW51bSBMaWNlbnNlU3RhdGUgeworICAgIEFDVElWRSA9IDE7CisgICAgUkVMRUFTSU5HID0gMjsKKyAgfQorCisgIG9wdGlvbmFsIExpY2Vuc2VTdGF0ZSBzdGF0ZSA9IDE7CisgIG9wdGlvbmFsIGJ5dGVzIGxpY2Vuc2UgPSAyOworfQorCittZXNzYWdlIE9mZmxpbmVGaWxlIHsKKyAgZW51bSBGaWxlVHlwZSB7CisgICAgTElDRU5TRSA9IDE7CisgIH0KKworICBlbnVtIEZpbGVWZXJzaW9uIHsKKyAgICBWRVJTSU9OXzEgPSAxOworICB9CisKKyAgb3B0aW9uYWwgRmlsZVR5cGUgdHlwZSA9IDE7CisgIG9wdGlvbmFsIEZpbGVWZXJzaW9uIHZlcnNpb24gPSAyIFtkZWZhdWx0ID0gVkVSU0lPTl8xXTsKKyAgb3B0aW9uYWwgTGljZW5zZSBsaWNlbnNlID0gMzsKKworfQorCittZXNzYWdlIEhhc2hlZEZpbGUgeworICBvcHRpb25hbCBieXRlcyBmaWxlID0gMTsKKyAgLy8gQSByYXcgKG5vdCBoZXgtZW5jb2RlZCkgU0hBMjU2LCB0YWtlbiBvdmVyIHRoZSBieXRlcyBvZiAnZmlsZScuCisgIG9wdGlvbmFsIGJ5dGVzIGhhc2ggPSAyOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKaW5kZXggNmE5N2I3Mi4uNGNhMzFmMyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiCiAKICNpbmNsdWRlIDxDcnlwdG9GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8RHJtRmFjdG9yeS5oPgpAQCAtMjYsMTQgKzI2LDE0IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7CiAKIAogaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7Ci0gICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7CisgICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7CiAKICAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCiAgICAgLy8gL2Rldi92bmRiaW5kZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFhOTkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwotI2RlZmluZSBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIG1hc3RlcmluZ19pbmRpY2F0aW9uIHsKLSAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKLSAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAotICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKLSAgICBNQVNURVJFRF9GT1JfM0QsCi0gICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKLX07Ci0KLXN0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZDsKLSAgICBpbnQzMl90IG1Qcm9ncmFtSWQ7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhYmVsczsKLSAgICBTdHJpbmc4IG1MYW5ndWFnZTsKLSAgICBpbnQzMl90IG1NYXN0ZXJpbmdJbmRpY2F0aW9uOwotICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGU7Ci0gICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlOwotICAgIGJvb2wgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGU7Ci0KLSAgICBBdWRpb1ByZXNlbnRhdGlvbigpIHsKLSAgICAgICAgbVByZXNlbnRhdGlvbklkID0gLTE7Ci0gICAgICAgIG1Qcm9ncmFtSWQgPSAtMTsKLSAgICAgICAgbUxhbmd1YWdlID0gIiI7Ci0gICAgICAgIG1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQ7Ci0gICAgICAgIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7Ci0gICAgICAgIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBmYWxzZTsKLSAgICB9Ci19OwotCi10eXBlZGVmIFZlY3RvcjxzcDxBdWRpb1ByZXNlbnRhdGlvbj4+IEF1ZGlvUHJlc2VudGF0aW9uczsKLQotY2xhc3MgQXVkaW9QcmVzZW50YXRpb25JbmZvIDogcHVibGljIFJlZkJhc2UgewotIHB1YmxpYzoKLSAgICBBdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKLQotICAgIH5BdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKLQotICAgIHZvaWQgYWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pOwotCi0gICAgc2l6ZV90IGNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0OwotCi0gICAgY29uc3Qgc3A8QXVkaW9QcmVzZW50YXRpb24+IGdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgICBBdWRpb1ByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0V2ZW50TG9nLmggYi9pbmNsdWRlL21lZGlhL0V2ZW50TG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOWIyYzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNGIzNWZlMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0YmY4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAvLyBmb3Igc3RhdHVzX3QKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYVRyYWNrOworY2xhc3MgTWV0YURhdGFCYXNlOworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitleHRlcm4gIkMiIHsKKworc3RydWN0IENEYXRhU291cmNlIHsKKyAgICBzc2l6ZV90ICgqcmVhZEF0KSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgKCpnZXRTaXplKSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmhhbmRsZSApOworICAgIGJvb2wgKCpnZXRVcmkpKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisgICAgdm9pZCAqaGFuZGxlOworfTsKKworZW51bSBDTWVkaWFUcmFja1JlYWRPcHRpb25zIDogdWludDMyX3QgeworICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IDAsCisgICAgU0VFS19ORVhUX1NZTkMgPSAxLAorICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gMiwKKyAgICBTRUVLX0NMT1NFU1QgPSAzLAorICAgIFNFRUtfRlJBTUVfSU5ERVggPSA0LAorICAgIFNFRUsgPSA4LAorICAgIE5PTkJMT0NLSU5HID0gMTYKK307CisKKy8qKgorICogb25seSB1c2UgQ01lZGlhQnVmZmVyIGFsbG9jYXRlZCBmcm9tIHRoZSBDTWVkaWFCdWZmZXJHcm91cCB0aGF0IGlzCisgKiBwcm92aWRlZCB0byBDTWVkaWFUcmFjazo6c3RhcnQoKQorICovCitzdHJ1Y3QgQ01lZGlhQnVmZmVyIHsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmhhbmRsZSk7CisgICAgdm9pZCogKCpkYXRhKSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnNpemUpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2Vfb2Zmc2V0KSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnJhbmdlX2xlbmd0aCkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkICgqc2V0X3JhbmdlKSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworICAgIEFNZWRpYUZvcm1hdCogKCptZXRhX2RhdGEpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhQnVmZmVyR3JvdXAgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBib29sICgqaW5pdCkodm9pZCAqaGFuZGxlLCBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworICAgIHZvaWQgKCphZGRfYnVmZmVyKSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmFjcXVpcmVfYnVmZmVyKSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICBDTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKTsKKyAgICBib29sICgqaGFzX2J1ZmZlcnMpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhVHJhY2sgeworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdGFydCkodm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0b3ApKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0Rm9ybWF0KSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpyZWFkKSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKTsKKyAgICBib29sICAgICAoKnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKSh2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3IgeworICAgIHZvaWQgKmRhdGE7CisKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisgICAgc2l6ZV90ICgqY291bnRUcmFja3MpKHZvaWQgKmRhdGEpOworICAgIENNZWRpYVRyYWNrKiAoKmdldFRyYWNrKSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0VHJhY2tNZXRhRGF0YSkoCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldE1ldGFEYXRhKSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqc2V0TWVkaWFDYXMpKHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7CisgICAgY29uc3QgY2hhciAqICgqbmFtZSkodm9pZCAqZGF0YSk7Cit9OworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Cit0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOworCisvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcworLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKKy8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKKy8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCit0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciBDTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIENyZWF0b3JGdW5jIENyZWF0b3JGdW5jOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90IGJbMTZdOworfSBtZWRpYV91dWlkX3Q7CisKK3N0cnVjdCBFeHRyYWN0b3JEZWYgeworICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCisgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247CisKKyAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KKyAgICBtZWRpYV91dWlkX3QgZXh0cmFjdG9yX3V1aWQ7CisKKyAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCisgICAgLy8gYmUgdXNlZC4KKyAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKKworICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOworCisgICAgdW5pb24geworICAgICAgICBTbmlmZmVyRnVuYyB2MjsKKyAgICB9IHNuaWZmOworfTsKKworLy8gdGhlIEMrKyBiYXNlZCBBUEkgd2hpY2ggZmlyc3Qgc2hpcHBlZCBpbiBQIGFuZCBpcyBubyBsb25nZXIgc3VwcG9ydGVkCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9MRUdBQ1kgPSAxOworCisvLyB0aGUgZmlyc3QgQy9OREsgYmFzZWQgQVBJCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgPSAyOworCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMTsKKworLy8gZWFjaCBwbHVnaW4gbGlicmFyeSBleHBvcnRzIG9uZSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUKK3R5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOworCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDRkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK3N0cnVjdCBNZWRpYVRyYWNrOworCisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXI7CisKK2NsYXNzIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgZnJpZW5kIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKik7CisgICAgQ01lZGlhQnVmZmVyICptQnVmZmVyOworcHVibGljOgorICAgIE1lZGlhQnVmZmVySGVscGVyKENNZWRpYUJ1ZmZlciAqYnVmKSB7CisgICAgICAgIG1CdWZmZXIgPSBidWY7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIG1CdWZmZXItPnJlbGVhc2UobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQqIGRhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnNpemUobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9vZmZzZXQobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9sZW5ndGgobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKG1CdWZmZXItPmhhbmRsZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+bWV0YV9kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cEhlbHBlciB7Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgc3RkOjptYXA8Q01lZGlhQnVmZmVyKiwgTWVkaWFCdWZmZXJIZWxwZXIqPiBtQnVmZmVySGVscGVyczsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKENNZWRpYUJ1ZmZlckdyb3VwICpncm91cCkgeworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICB9CisgICAgfk1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoKSB7CisgICAgICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXAKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmdyb3VwICVwIG1hcCBoYXMgJXp1IGVudHJpZXMiLCB0aGlzLCBtQnVmZmVySGVscGVycy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVySGVscGVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySGVscGVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBpbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aW5pdChtR3JvdXAtPmhhbmRsZSwgYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICB9CisgICAgdm9pZCBhZGRfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtR3JvdXAtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKSB7CisgICAgICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0KKyAgICAgICAgICAgICAgICBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCAmYnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIGhlbHBlciA9IG1CdWZmZXJIZWxwZXJzLmZpbmQoYnVmKTsKKyAgICAgICAgICAgIGlmIChoZWxwZXIgPT0gbUJ1ZmZlckhlbHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciogbmV3SGVscGVyID0gbmV3IE1lZGlhQnVmZmVySGVscGVyKGJ1Zik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckhlbHBlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJ1ZiwgbmV3SGVscGVyKSk7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG5ld0hlbHBlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGhlbHBlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYm9vbCBoYXNfYnVmZmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aGFzX2J1ZmZlcnMobUdyb3VwLT5oYW5kbGUpOworICAgIH0KK307CisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXIgeworcHVibGljOgorICAgIE1lZGlhVHJhY2tIZWxwZXIoKSA6IG1CdWZmZXJHcm91cChudWxscHRyKSB7CisgICAgfQorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tIZWxwZXIoKSB7CisgICAgICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7CisgICAgfQorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gZmFsc2U7IH0KK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKK307CisKK2lubGluZSBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgeworICAgIENNZWRpYVRyYWNrICp3cmFwcGVyID0gKENNZWRpYVRyYWNrKikgbWFsbG9jKHNpemVvZihDTWVkaWFUcmFjaykpOworICAgIHdyYXBwZXItPmRhdGEgPSB0cmFjazsKKyAgICB3cmFwcGVyLT5mcmVlID0gW10odm9pZCAqZGF0YSkgLT4gdm9pZCB7CisgICAgICAgIGRlbGV0ZSAoTWVkaWFUcmFja0hlbHBlciopKGRhdGEpOworICAgIH07CisgICAgd3JhcHBlci0+c3RhcnQgPSBbXSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXApIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgaWYgKCgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPm1CdWZmZXJHcm91cCkgeworICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgaGFuZGxlIGl0IGFueXdheQorICAgICAgICAgICAgZGVsZXRlICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPm1CdWZmZXJHcm91cDsKKyAgICAgICAgfQorICAgICAgICAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cEhlbHBlcihidWZmZXJHcm91cCk7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdGFydCgpOworICAgIH07CisgICAgd3JhcHBlci0+c3RvcCA9IFtdKHZvaWQgKmRhdGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN0b3AoKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldEZvcm1hdCA9IFtdKHZvaWQgKmRhdGEsIEFNZWRpYUZvcm1hdCAqbWV0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+Z2V0Rm9ybWF0KG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+cmVhZCA9IFtdKHZvaWQgKmRhdGEsIENNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKQorICAgICAgICAgICAgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyBvcHRzKG9wdGlvbnMsIHNlZWtQb3NVcyk7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWYgPSBOVUxMOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5yZWFkKCZidWYsICZvcHRzKTsKKyAgICAgICAgaWYgKHJldCA9PSBBTUVESUFfT0sgJiYgYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICpidWZmZXIgPSBidWYtPm1CdWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9OworICAgIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkID0gW10odm9pZCAqZGF0YSkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCk7CisgICAgfTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKworCisvLyBleHRyYWN0b3IgcGx1Z2lucyBjYW4gZGVyaXZlIGZyb20gdGhpcyBjbGFzcyB3aGljaCBsb29rcyByZW1hcmthYmx5CisvLyBsaWtlIE1lZGlhRXh0cmFjdG9yIGFuZCBjYW4gYmUgZWFzaWx5IHdyYXBwZWQgaW4gdGhlIHJlcXVpcmVkIEMgQVBJCitjbGFzcyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcgoreworcHVibGljOgorICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKCkge30KKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIoKSB7fQorCitwcml2YXRlOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgJik7Cit9OworCitpbmxpbmUgQ01lZGlhRXh0cmFjdG9yICp3cmFwKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICpleHRyYWN0b3IpIHsKKyAgICBDTWVkaWFFeHRyYWN0b3IgKndyYXBwZXIgPSAoQ01lZGlhRXh0cmFjdG9yKikgbWFsbG9jKHNpemVvZihDTWVkaWFFeHRyYWN0b3IpKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gZXh0cmFjdG9yOworICAgIHdyYXBwZXItPmZyZWUgPSBbXSh2b2lkICpkYXRhKSAtPiB2b2lkIHsKKyAgICAgICAgZGVsZXRlIChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopKGRhdGEpOworICAgIH07CisgICAgd3JhcHBlci0+Y291bnRUcmFja3MgPSBbXSh2b2lkICpkYXRhKSAtPiBzaXplX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmNvdW50VHJhY2tzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFjayA9IFtdKHZvaWQgKmRhdGEsIHNpemVfdCBpbmRleCkgLT4gQ01lZGlhVHJhY2sqIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldFRyYWNrKGluZGV4KSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRUcmFja01ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldFRyYWNrTWV0YURhdGEobWV0YSwgaW5kZXgsIGZsYWdzKTsKKyAgICB9OworICAgIHdyYXBwZXItPmdldE1ldGFEYXRhID0gW10oCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+Z2V0TWV0YURhdGEobWV0YSk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5mbGFncyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSkgLT4gdWludDMyX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmZsYWdzKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zZXRNZWRpYUNhcyA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwgY29uc3QgdWludDhfdCAqY2FzVG9rZW4sIHNpemVfdCBzaXplKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+c2V0TWVkaWFDYXMoY2FzVG9rZW4sIHNpemUpOworICAgIH07CisgICAgd3JhcHBlci0+bmFtZSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSkgLT4gY29uc3QgY2hhciAqIHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5uYW1lKCk7CisgICAgfTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKworLyogYWRkcyBzb21lIGNvbnZpZW5jZSBtZXRob2RzICovCitjbGFzcyBEYXRhU291cmNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBjc291cmNlOworICAgIH0KKworICAgIGV4cGxpY2l0IERhdGFTb3VyY2VIZWxwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2UtPm1Tb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCB+RGF0YVNvdXJjZUhlbHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG1Tb3VyY2UtPmhhbmRsZSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShtU291cmNlLT5oYW5kbGUsIHNpemUpOworICAgIH0KKworICAgIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFVyaShtU291cmNlLT5oYW5kbGUsIHVyaVN0cmluZywgYnVmZmVyU2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmZsYWdzKG1Tb3VyY2UtPmhhbmRsZSk7CisgICAgfQorCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kczoKKyAgICBib29sIGdldFVJbnQxNihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVsyXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDIpICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgOCkgfCBieXRlWzFdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIDMgYnl0ZSBpbnQsIHJldHVybmVkIGFzIGEgMzItYml0IGludAorICAgIGJvb2wgZ2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDhfdCBieXRlWzNdOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMykgIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoYnl0ZVswXSA8PCAxNikgfCAoYnl0ZVsxXSA8PCA4KSB8IGJ5dGVbMl07CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IG50b2hsKHRtcCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50NjRfdCB0bXA7CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA4KSAhPSA4KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9ICgodWludDY0X3QpbnRvaGwodG1wICYgMHhmZmZmZmZmZikgPDwgMzIpIHwgbnRvaGwodG1wID4+IDMyKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCisgICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDE2KG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgdWludDhfdCB0bXA7CisgICAgICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50MzIob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICB1aW50MTZfdCB0bXA7CisgICAgICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDY0KG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIENEYXRhU291cmNlICptU291cmNlOworfTsKKworCisKKy8vIGhlbHBlcnMgdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbAorCisvLyBwdXJwb3NlbHkgbm90IGRlZmluZWQgYW55d2hlcmUgc28gdGhhdCB0aGlzIHdpbGwgZmFpbCB0byBsaW5rIGlmCisvLyBleHByZXNzaW9ucyBiZWxvdyBhcmUgbm90IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUKK2ludCBpbnZhbGlkX3V1aWRfc3RyaW5nKGNvbnN0IGNoYXIgKik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciB1aW50OF90IF9kaWdpdEF0Xyhjb25zdCBUICgmcylbTl0sIGNvbnN0IHNpemVfdCBuKSB7CisgICAgcmV0dXJuIHNbbl0gPj0gJzAnICYmIHNbbl0gPD0gJzknID8gc1tuXSAtICcwJworICAgICAgICAgICAgOiBzW25dID49ICdhJyAmJiBzW25dIDw9ICdmJyA/IHNbbl0gLSAnYScgKyAxMAorICAgICAgICAgICAgICAgICAgICA6IHNbbl0gPj0gJ0EnICYmIHNbbl0gPD0gJ0YnID8gc1tuXSAtICdBJyArIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJ1dWlkOiBiYWQgZGlnaXRzIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciB1aW50OF90IF9oZXhCeXRlQXRfKGNvbnN0IFQgKCZzKVtOXSwgc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gKF9kaWdpdEF0XyhzLCBuKSA8PCA0KSArIF9kaWdpdEF0XyhzLCBuICsgMSk7Cit9CisKK2NvbnN0ZXhwciBib29sIF9hc3NlcnRJc0Rhc2hfKGNoYXIgYykgeworICAgIHJldHVybiBjID09ICctJyA/IHRydWUgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJXcm9uZyBmb3JtYXQiKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBOPgorY29uc3RleHByIG1lZGlhX3V1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgeworICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOworICAgIHJldHVybgorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCisgICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCisgICAgICAgICAgICBtZWRpYV91dWlkX3Qge3sKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAwKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCA5KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxMSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjgpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMwKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzQpLAorICAgICAgICAgICAgfX07Cit9CisvLyBDb252ZW5pZW5jZSBtYWNybyB0byBjcmVhdGUgYSBtZWRpYV91dWlkX3QgZnJvbSBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBzaG91bGQKKy8vIGJlIGZvcm1hdHRlZCBhcyAiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjIiwgYXMgZ2VuZXJhdGVkIGJ5CisvLyBlLmcuIGh0dHBzOi8vd3d3LnV1aWRnZW5lcmF0b3IubmV0LyBvciB0aGUgJ3V1aWRnZW4nIGxpbnV4IGNvbW1hbmQuCisvLyBIZXggZGlnaXRzIG1heSBiZSB1cHBlciBvciBsb3dlciBjYXNlLgorLy8KKy8vIFRoZSBtYWNybyBjYWxsIGlzIG90aGVyd2lzZSBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseQorLy8gKGUuZy4gVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IikgaXMgdGhlIHNhbWUgYXMKKy8vICAgICAgIHt7MHg3ZCwgMHg2MSwgMHgzOCwgMHg1OCwgMHg1OCwgMHgzNywgMHg0YSwgMHgzOCwKKy8vICAgICAgICAgMHg4NCwgMHhjNSwgMHgzMywgMHgyZCwgMHgxYywgMHhkZCwgMHhlZSwgMHgyN319KQorCisjZGVmaW5lIFVVSUQoc3RyKSBbXXsgY29uc3RleHByIG1lZGlhX3V1aWRfdCB1dWlkID0gY29uc3RVVUlEKHN0cik7IHJldHVybiB1dWlkOyB9KCkKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3MuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWY3NTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA1YTYzMjg3YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI4YTdmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKK3N0cnVjdCBDTWVkaWFUcmFjazsKKworY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7CitwdWJsaWM6CisgICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTWVkaWFUcmFjaworLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgoreworICAgIE1lZGlhVHJhY2soKTsKKworICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAorICAgIC8vIGdldEZvcm1hdCgpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgorICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKKyAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKKyAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgorICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCisgICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7CisKKyAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCisgICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCisgICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCisgICAgc3RydWN0IFJlYWRPcHRpb25zIHsKKyAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgeworICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1QgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QsCisgICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucygpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtT3B0aW9ucyA9IDA7CisgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgICAgICAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgICAgICAgdm9pZCBjbGVhclNlZWtUbygpIHsKKyAgICAgICAgICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7CisgICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOworICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7CisKKyAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgorICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKKyAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGVudW0gT3B0aW9ucyB7CisgICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOworICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCisKKyAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCisgICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgLy8gaXMgcmVhY2hlZC4KKyAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgorICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCisgICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZworICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgfHJlYWR8IHN1cHBvcnRzIG5vbmJsb2NraW5nIG9wdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgorICAgIC8vIHxyZWFkTXVsdGlwbGV8IGlmIHN1cHBvcnRlZCwgYWx3YXlzIGFsbG93cyB0aGUgbm9uYmxvY2tpbmcgb3B0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFUcmFjaygpOworCitwcml2YXRlOgorICAgIE1lZGlhVHJhY2soY29uc3QgTWVkaWFUcmFjayAmKTsKKyAgICBNZWRpYVRyYWNrICZvcGVyYXRvcj0oY29uc3QgTWVkaWFUcmFjayAmKTsKK307CisKK2NsYXNzIE1lZGlhVHJhY2tDVW53cmFwcGVyIDogcHVibGljIE1lZGlhVHJhY2sgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICp3cmFwcGVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpOworCitwcml2YXRlOgorICAgIENNZWRpYVRyYWNrICp3cmFwcGVyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmJhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKGFuZHJvaWQ6OnN0YXR1c190KTsKKworYW5kcm9pZDo6c3RhdHVzX3QgcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QpOworCisjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9QUklWX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGE0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTWVzc2FnZT4gbUZvcm1hdDsKKyAgICBhbmRyb2lkOjpTdHJpbmc4IG1EZWJ1ZzsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4LCBhbmRyb2lkOjpTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKik7Cit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgc3A8QU1lc3NhZ2U+ICpkZXN0KTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCmluZGV4IGUzZWYxMzQuLjg1ZTE3ZjkgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGFkYWE0ODkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IGNhMTE5ZDUuLjVmMTlmNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTM4LDYgKzUzOCwxMCBAQAogICAgICAgICBtVGltZXN0YW1wTXV0YXRvci5wdXNoKHRpbWVzdGFtcCk7CiAgICAgfQogCisgICAgdmlydHVhbCBFeHRlbmRlZFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGltZXN0YW1wTXV0YXRvci5sYXN0KCk7CisgICAgfQorCiAgICAgLy8gRmx1c2hlcyB0aGUgc2hhcmVkIHJpbmcgYnVmZmVyIGlmIHRoZSBjbGllbnQgaGFkIHJlcXVlc3RlZCBpdCB1c2luZyBtU3RyZWFtaW5nLm1GbHVzaC4KICAgICAvLyBJZiBmbHVzaCBvY2N1cnMgdGhlbjoKICAgICAvLyAgIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQsIFNlcnZlclByb3h5OjptRmx1c2ggYW5kIFNlcnZlclByb3h5OjptRmx1c2hlZCB3aWxsIGJlIG1vZGlmaWVkCkBAIC01NTEsNiArNTU1LDkgQEAKICAgICAvLyBUb3RhbCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGZsdXNoZWQgZnJhbWVzIHNpbmNlIGNyZWF0aW9uIChuZXZlciByZXNldCkuCiAgICAgdmlydHVhbCBpbnQ2NF90ICAgICBmcmFtZXNGbHVzaGVkKCkgY29uc3QgeyByZXR1cm4gbUZsdXNoZWQ7IH0KIAorICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHdpdGggbm8gc2lkZSBlZmZlY3RzLgorICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QgPSAwOworCiAgICAgLy8gR2V0IGR5bmFtaWMgYnVmZmVyIHNpemUgZnJvbSB0aGUgc2hhcmVkIGNvbnRyb2wgYmxvY2suCiAgICAgdWludDMyX3QgICAgICAgICAgICBnZXRCdWZmZXJTaXplSW5GcmFtZXMoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoKGludDMyX3QgKikmbUNibGstPm1CdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNTg4LDggKzU5NSw3IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCi0gICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCi0gICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOyAvLyBmcmFtZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnkgc2VydmVyLgogCiAgICAgLy8gQ3VycmVudGx5IEF1ZGlvRmxpbmdlciB3aWxsIGNhbGwgZnJhbWVzUmVhZHkoKSBmb3IgYSBmYXN0IHRyYWNrIGZyb20gdHdvIHRocmVhZHM6CiAgICAgLy8gRmFzdE1peGVyIHRocmVhZCwgYW5kIG5vcm1hbCBtaXhlciB0aHJlYWQuICBUaGlzIGlzIGRhbmdlcm91cywgYXMgdGhlIHByb3h5IGlzIGludGVuZGVkCkBAIC02OTMsNiArNjk5LDggQEAKICAgICAgICAgcmV0dXJuIG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7IC8vIEZvciBjb21wbGV0ZW5lc3Mgb25seTsgbVJlYXIgd3JpdHRlbiBieSBzZXJ2ZXIuCiAgICAgfQogCisgICAgc2l6ZV90IGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOyAvLyBmcmFtZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnkgY2xpZW50LgorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSgpIHsgfQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAppbmRleCA1ZmQ4ZWIyLi5jMzU3Y2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCkBAIC00MCw2ICs0MCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CiAKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKaW5kZXggN2EyOWUzMS4uMmUyZmY3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKQEAgLTUyLDYgKzUyLDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IDFmNjg3YTIuLjFlMmQxMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTIsOCArMiwxMCBAQAogZHdrYW5nQGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGhrdWFuZ0Bnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCitqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IDcwYzI4MWEuLmYwNWM4NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtNCw3ICs0LDYgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAltYWluX2F1ZGlvc2VydmVyLmNwcCBcCi0JLi4vbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmFhdWRpb3NlcnZpY2UgXApAQCAtMTgsNiArMTcsNyBAQAogCWxpYm1lZGlhIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAogCWxpYm5iYWlvIFwKKwlsaWJuYmxvZyBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCiAJbGlidXRpbHMKIApAQCAtNDAsOSArNDAsNiBAQAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCWV4dGVybmFsL3NvbmljIFwKIAotTE9DQUxfQUlETF9JTkNMVURFUyA6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbAotCiAjIElmIEFVRElPU0VSVkVSX01VTFRJTElCIGluIGRldmljZS5tayBpcyBub24tZW1wdHkgdGhlbiBpdCBpcyB1c2VkIHRvIGNvbnRyb2wKICMgdGhlIExPQ0FMX01VTFRJTElCIGZvciBhbGwgYXVkaW9zZXJ2ZXIgZXhjbHVzaXZlIGxpYnJhcmllcy4KICMgVGhpcyBpcyByZWxldmFudCBmb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMgd2hlcmUgZWl0aGVyIG9yIGJvdGgKQEAgLTU0LDEzICs1MSw5IEBACiAjICAgYm90aCAgICB0byBidWlsZCBib3RoIDMyIGJpdCBhbmQgNjQgYml0IGxpYnJhcmllcywKICMgICAgICAgICAgIGFuZCB1c2UgcHJpbWFyeSB0YXJnZXQgYXJjaGl0ZWN0dXJlICgzMiBvciA2NCkgZm9yIGF1ZGlvc2VydmVyLgogIyAgIGZpcnN0ICAgdG8gYnVpbGQgbGlicmFyaWVzIGFuZCBhdWRpb3NlcnZlciBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSBvbmx5LgotIyAgIDxlbXB0eT4gdG8gYnVpbGQgYm90aCAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBhbmQgMzIgYml0IGF1ZGlvc2VydmVyLgorIyAgIDxlbXB0eT4gdG8gYnVpbGQgYm90aCAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBhbmQgcHJpbWFyeSB0YXJnZXQgYXVkaW9zZXJ2ZXIuCiAKLWlmZXEgKCQoc3RyaXAgJChBVURJT1NFUlZFUl9NVUxUSUxJQikpLCkKLUxPQ0FMX01VTFRJTElCIDo9IDMyCi1lbHNlCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotZW5kaWYKIAogTE9DQUxfTU9EVUxFIDo9IGF1ZGlvc2VydmVyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggMWYyZTgyZi4uZjFlODE1YiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTcsNiArNyw3IEBACiAgICAgaW9wcmlvIHJ0IDQKICAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzIC9kZXYvc3R1bmUvZm9yZWdyb3VuZC90YXNrcwogICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtMi0wCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCiAgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIG5hbWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiB1cGdyYWRpbmcKICAgICAjIE8tTVIxIGRldmljZXMgd2l0aCBmcmFtZXdvcmstb25seS4KICAgICBvbnJlc3RhcnQgcmVzdGFydCBhdWRpby1oYWwtMi0wCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZmMwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDb25uZWN0aW9uIgorCisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZCgKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBhY2Nlc3NvcikpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgYXV0byBpdCA9IG1Db25uZWN0aW9uVG9Db29raWUuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ29ubmVjdGlvblRvQ29va2llLmVuZCgpKSB7CisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoaXQpOworICAgICAgICBhdXRvIGNpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGNpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgY2l0LT5zZWNvbmQuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChjaXQtPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGRDb29raWVUb0Nvbm5lY3Rpb24oCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29ubmVjdGlvblRvQ29va2llLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGNvb2tpZSkpOworICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuaW5zZXJ0KGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGNvb2tpZSwgc3RkOjpzZXQ8aW50NjRfdD57Y29ubmVjdGlvbklkfSkpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnNlcnZpY2VEaWVkKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgKSB7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBjb25uZWN0aW9uc1RvQ2xvc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICAgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29uSXQgPSBpdC0+c2Vjb25kLmJlZ2luKCk7IGNvbkl0ICE9IGl0LT5zZWNvbmQuZW5kKCk7ICsrY29uSXQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFjY2Vzc29ySXQgPSBtQWNjZXNzb3JzLmZpbmQoKmNvbkl0KTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzb3JJdCAhPSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zVG9DbG9zZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmNvbkl0LCBhY2Nlc3Nvckl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3Nvckl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZSgqY29uSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbm5lY3Rpb25zVG9DbG9zZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29ubmVjdGlvbnNUb0Nsb3NlLmJlZ2luKCk7IGl0ICE9IGNvbm5lY3Rpb25zVG9DbG9zZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgYWNjZXNzb3IgPSBpdC0+c2Vjb25kLnByb21vdGUoKTsKKworICAgICAgICAgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3ItPmNsb3NlKGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbm5lY3Rpb24gJWxsZCBjbG9zZWQgb24gZGVhdGgiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK25hbWVzcGFjZSB7CitzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50ID0KKyAgICAgICAgbmV3IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworfQorCitzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKSB7CisgICAgcmV0dXJuIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yIGZvbGxvdy4KK1JldHVybjx2b2lkPiBBY2Nlc3Nvcjo6Y29ubmVjdChjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciogZm1xRGVzYzsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBjb25uZWN0KCZjb25uZWN0aW9uLCAmY29ubmVjdGlvbklkLCAmZm1xRGVzYywgZmFsc2UpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb25JZCwgKmZtcURlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0ciwgLTFMTCwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM8QnVmZmVyU3RhdHVzTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0FjY2Vzc29yOjpBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICA6IG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0FjY2Vzc29yOjp+QWNjZXNzb3IoKSB7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIChib29sKW1JbXBsOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIsIGJvb2wgbG9jYWwpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jb25uZWN0KHRoaXMsIGNvbm5lY3Rpb24sIHBDb25uZWN0aW9uSWQsIGZtcURlc2NQdHIpOworICAgICAgICBpZiAoIWxvY2FsICYmIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IodGhpcyk7CisgICAgICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5hZGQoKnBDb25uZWN0aW9uSWQsIGFjY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+cmVtb3ZlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vSUFjY2Vzc29yKiBISURMX0ZFVENIX0lBY2Nlc3Nvcihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IEFjY2Vzc29yKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NmY3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBBY2Nlc3NvcjsKK3N0cnVjdCBDb25uZWN0aW9uOworCisvKioKKyAqIFJlY2VpdmVzIGRlYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSByZW1vdGUgY29ubmVjdGlvbnMuCisgKiBPbiBkZWF0aCBub3RpZmljYXRpb25zLCB0aGUgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCBhbmQgdXNlZCByZXNvdXJjZXMKKyAqIGFyZSByZWxlYXNlZC4KKyAqLworc3RydWN0IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ld2x5IGNvbm5lY3RlZCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChpbnQ2NF90IGNvbm5lY3Rpb25JZCwgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvQ29ubmVjdGlvbih1aW50NjRfdCBjb29raWUsIGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8aW50NjRfdD4+ICBtQ29va2llVG9Db25uZWN0aW9uczsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCB1aW50NjRfdD4gbUNvbm5lY3Rpb25Ub0Nvb2tpZTsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IG1BY2Nlc3NvcnM7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggZW5hYmxlcyBhIGJ1ZmZlciBwb29sIHRvIGNvbW11bmljYXRlIHdpdGggYnVmZmVyCisgKiBwb29sIGNsaWVudHMuIDE6MSBjb3JyZXNwb25kZW5zZSBob2xkcyBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIGFuIGFjY2Vzc29yLgorICovCitzdHJ1Y3QgQWNjZXNzb3IgOiBwdWJsaWMgSUFjY2Vzc29yIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggdXNlcyB0aGUgc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgYnVmZmVyIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3IuICovCisgICAgfkFjY2Vzc29yKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3NvciBpcyB2YWxpZC4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSBhIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGNvbm5lY3Rpb24gaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBidWZmZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgcmVjZWl2aW5nIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCB0aGUgaWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIHRvIGJlIGZldGNoZWQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGZldGNoZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBmZXRjaGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmZXRjaCgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBUaGUgYnVmZmVyIHBvb2wgY2xpZW50IHVzZXMgdGhlCisgICAgICogY3JlYXRlZCBjb25uZWN0aW9uIGluIG9yZGVyIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGJ1ZmZlciBwb29sLiBBbgorICAgICAqIEZNUSBmb3IgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGlzIGFsc28gY3JlYXRlZCBmb3IgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uICAgIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIHRoZSBpZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgRk1RIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBidWZmZXIgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGxvY2FsICAgICAgICAgdHJ1ZSB3aGVuIGEgY29ubmVjdGlvbiByZXF1ZXN0IGNvbWVzIGZyb20gbG9jYWwgcHJvY2VzcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIsIGJvb2wgbG9jYWwpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb21zIHBlcmlvZGljIGNhY2hlCisgICAgICogY2xlYW5pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzIHdhaXRpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBoaWRsX2RlYXRoX3JlY2lwaWVudCBmb3IgcmVtb3RlIGNvbm5lY3Rpb24gZGVhdGguCisgICAgICovCisgICAgc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gZ2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExN2YxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAKQEAgLTAsMCArMSw1NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xBY2Nlc3NvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gNTAwMDAwOyAvLyBUT0RPIHR1bmUgMC41IHNlYworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrTG9nRHVyYXRpb25VcyA9IDUwMDAwMDA7IC8vIDUgc2VjcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDQwOworfQorCisvLyBCdWZmZXIgc3RydWN0dXJlIGluIGJ1ZmZlcnBvb2wgcHJvY2Vzcworc3RydWN0IEludGVybmFsQnVmZmVyIHsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgc2l6ZV90IG1Pd25lckNvdW50OworICAgIHNpemVfdCBtVHJhbnNhY3Rpb25Db3VudDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIGNvbnN0IHNpemVfdCBtQWxsb2NTaXplOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Db25maWc7CisKKyAgICBJbnRlcm5hbEJ1ZmZlcigKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFsbG9jQ29uZmlnKQorICAgICAgICAgICAgOiBtSWQoaWQpLCBtT3duZXJDb3VudCgwKSwgbVRyYW5zYWN0aW9uQ291bnQoMCksCisgICAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksIG1BbGxvY1NpemUoYWxsb2NTaXplKSwgbUNvbmZpZyhhbGxvY0NvbmZpZykge30KKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24tPmhhbmRsZSgpOworICAgIH0KK307CisKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1cyB7CisgICAgVHJhbnNhY3Rpb25JZCBtSWQ7CisgICAgQnVmZmVySWQgbUJ1ZmZlcklkOworICAgIENvbm5lY3Rpb25JZCBtU2VuZGVyOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXI7CisgICAgQnVmZmVyU3RhdHVzIG1TdGF0dXM7CisgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU2VuZGVyVmFsaWRhdGVkOworCisgICAgVHJhbnNhY3Rpb25TdGF0dXMoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgICAgICBtSWQgPSBtZXNzYWdlLnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1CdWZmZXJJZCA9IG1lc3NhZ2UuYnVmZmVySWQ7CisgICAgICAgIG1TdGF0dXMgPSBtZXNzYWdlLm5ld1N0YXR1czsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8pIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VuZGVyID0gLTFMTDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG1hcCBvZiBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBpbnNlcnQoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyID09IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBzdGQ6OnNldDxVPiB2YWx1ZVNldHt2YWx1ZX07CisgICAgICAgIG1hcE9mU2V0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZVNldCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKSAgPT0gaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgIGl0ZXItPnNlY29uZC5pbnNlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBlcmFzZShzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5lcmFzZSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1hcE9mU2V0LT5lcmFzZShpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBjb250YWlucyhzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gc2V0SXRlciA9IGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNldEl0ZXIgIT0gaXRlci0+c2Vjb25kLmVuZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNQaWQgPSBnZXRwaWQoKTsKK3VpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzU2VxSWQgPSB0aW1lKG51bGxwdHIpOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK0FjY2Vzc29yOjpJbXBsOjp+SW1wbCgpIHsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBpZiAobmV3Q29ubmVjdGlvbikgeworICAgICAgICAgICAgQ29ubmVjdGlvbklkIGlkID0gKGludDY0X3Qpc1BpZCA8PCAzMiB8IHNTZXFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLm1PYnNlcnZlci5vcGVuKGlkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb24tPmluaXRpYWxpemUoYWNjZXNzb3IsIGlkKTsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBpZDsKKyAgICAgICAgICAgICAgICArK3NTZXFJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmhhbmRsZUNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubU9ic2VydmVyLmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgLy8gU2luY2UgY2xvc2UjIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFsbCB3b3JrcyBhcmUgZmluaXNoZWQsIGl0IGlzIE9LIHRvCisgICAgLy8gZXZpY3QgdW51c2VkIGJ1ZmZlcnMuCisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCh0cnVlKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICBpZiAoIW1CdWZmZXJQb29sLmdldEZyZWVCdWZmZXIobUFsbG9jYXRvciwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKSkgeworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBzaXplX3QgYWxsb2NTaXplOworICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShwYXJhbXMsICZhbGxvYywgJmFsbG9jU2l6ZSk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLmFkZE5ld0J1ZmZlcihhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjcmVhdGUgYSBidWZmZXIgJWQgOiAldSAlcCIsCisgICAgICAgICAgICAgIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLCAqYnVmZmVySWQsICpoYW5kbGUpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG93bkJ1ZmZlciBmYWlsdXJlCisgICAgICAgIG1CdWZmZXJQb29sLmhhbmRsZU93bkJ1ZmZlcihjb25uZWN0aW9uSWQsICpidWZmZXJJZCk7CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIGF1dG8gZm91bmQgPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIGNvbnRhaW5zKCZtQnVmZmVyUG9vbC5tUGVuZGluZ1RyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCkpIHsKKyAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1CdWZmZXJJZCA9PSBidWZmZXJJZCkgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ID0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoYnVmZmVySXQgIT0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tU3RhdHMub25CdWZmZXJGZXRjaGVkKCk7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IGJ1ZmZlckl0LT5zZWNvbmQtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICAvLyB0cmFuc2FjdGlvbiB0aW1lb3V0LCBidWZmZXIgY2FjaGVpbmcgVFRMIGhhbmRsaW5nCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKGNsZWFyQ2FjaGUpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCkge30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6fkJ1ZmZlclBvb2woKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBBTE9HRCgiRGVzdHJ1Y3Rpb24gLSBidWZmZXJwb29sICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlT3duQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworCisgICAgYm9vbCBhZGRlZCA9IGluc2VydCgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGFkZGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50Kys7CisgICAgfQorICAgIGluc2VydCgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIHJldHVybiBhZGRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVE9ETzogdmVyaWZ5IHRoZXJlIGlzIHRhcmdldCBjb25uZWN0aW9uIElkCisgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkLAorICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kID09IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaXMgaXQgZmVhc2libGUgdG8gY2hlY2sgb3duZXJzaGlwIGhlcmU/CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICAgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICAgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UuY29ubmVjdGlvbklkID09IGZvdW5kLT5zZWNvbmQtPm1SZWNlaXZlcikgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgaWYgKCFmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5uZXdTdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSykgeworICAgICAgICAgICAgICAgIGhhbmRsZU93bkJ1ZmZlcihtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoZm91bmQpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ0cmFuc2ZlciBmaW5pc2hlZCAlbGx1ICV1IC0gJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCwgZGVsZXRlZCk7CisgICAgICAgIHJldHVybiBkZWxldGVkOworICAgIH0KKyAgICBBTE9HVigidHJhbnNmZXIgbm90IGZvdW5kICVsbHUgJXUiLCAodW5zaWduZWQgbG9uZyBsb25nKW1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpIHsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiBtZXNzYWdlczsKKyAgICBtT2JzZXJ2ZXIuZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhtZXNzYWdlcyk7CisgICAgbVRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgZm9yIChCdWZmZXJTdGF0dXNNZXNzYWdlJiBtZXNzYWdlOiBtZXNzYWdlcykgeworICAgICAgICBib29sIHJldCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UubmV3U3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpVU0VEOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTzoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclRvKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST006CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJGcm9tKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0xPU1Q6CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOgorICAgICAgICAgICAgICAgIC8vIG5vdCBoYXBwZW5pbmcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSzoKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUjoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlclJlc3VsdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBBTE9HVygiYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbHVyZSAtIG1lc3NhZ2UgOiAlZCBjb25uZWN0aW9uIDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cywgKGxvbmcgbG9uZyltZXNzYWdlLmNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZXMuY2xlYXIoKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIC8vIENsZWFuaW5nIGJ1ZmZlcnMKKyAgICBhdXRvIGJ1ZmZlcnMgPSBtVXNpbmdCdWZmZXJzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoYnVmZmVycyAhPSBtVXNpbmdCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgQnVmZmVySWQmIGJ1ZmZlcklkIDogYnVmZmVycy0+c2Vjb25kKSB7CisgICAgICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVVzaW5nQnVmZmVycy5lcmFzZShidWZmZXJzKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbmluZyB0cmFuc2FjdGlvbnMKKyAgICBhdXRvIHBlbmRpbmcgPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKHBlbmRpbmcgIT0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBUcmFuc2FjdGlvbklkJiB0cmFuc2FjdGlvbklkIDogcGVuZGluZy0+c2Vjb25kKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gaXRlci0+c2Vjb25kLT5tQnVmZmVySWQ7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Z2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGF1dG8gYnVmZmVySXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBmb3IgKDtidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7ICsrYnVmZmVySXQpIHsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSAqYnVmZmVySXQ7CisgICAgICAgIGlmIChhbGxvY2F0b3ItPmNvbXBhdGlibGUocGFyYW1zLCBtQnVmZmVyc1tidWZmZXJJZF0tPm1Db25maWcpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gKmJ1ZmZlckl0OworICAgICAgICBtRnJlZUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXQpOworICAgICAgICBtU3RhdHMub25CdWZmZXJSZWN5Y2xlZChtQnVmZmVyc1tpZF0tPm1BbGxvY1NpemUpOworICAgICAgICAqaGFuZGxlID0gbUJ1ZmZlcnNbaWRdLT5oYW5kbGUoKTsKKyAgICAgICAgKnBJZCA9IGlkOworICAgICAgICBBTE9HVigicmVjeWNsZSBhIGJ1ZmZlciAldSAlcCIsIGlkLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjphZGROZXdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKworICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gbVNlcSsrOworICAgIGlmIChtU2VxID09IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgbVNlcSA9IDA7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW50ZXJuYWxCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGF1dG8gcmVzID0gbUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoYnVmZmVyKSkpOworICAgICAgICBpZiAocmVzLnNlY29uZCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyQWxsb2NhdGVkKGFsbG9jU2l6ZSk7CisgICAgICAgICAgICAqaGFuZGxlID0gYWxsb2MtPmhhbmRsZSgpOworICAgICAgICAgICAgKnBJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChjbGVhckNhY2hlIHx8IG1UaW1lc3RhbXBVcyA+IG1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzKSB7CisgICAgICAgIG1MYXN0Q2xlYW5VcFVzID0gbVRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVRpbWVzdGFtcFVzID4gbUxhc3RMb2dVcyArIGtMb2dEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtTGFzdExvZ1VzID0gbVRpbWVzdGFtcFVzOworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlcnBvb2wgJXAgOiAlenUoJXp1IHNpemUpIHRvdGFsIGJ1ZmZlcnMgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1KCV6dSBzaXplKSB1c2VkIGJ1ZmZlcnMgLSAlenUvJXp1IChyZWN5Y2xlL2FsbG9jKSAtICIKKyAgICAgICAgICAgICAgICAgICIlenUvJXp1IChmZXRjaC90cmFuc2ZlcikiLAorICAgICAgICAgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1TaXplSW5Vc2UsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWNsZWFyQ2FjaGUgJiYgbVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrZnJlZUl0OworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDRkYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SSU1QTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SSU1QTF9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RydWN0IEludGVybmFsQnVmZmVyOworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Iob3IgYSBidWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4pICovCitjbGFzcyBBY2Nlc3Nvcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB+SW1wbCgpOworCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cik7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworcHJpdmF0ZToKKyAgICAvLyBDb25uZWN0aW9uSWQgPSBwaWQgOiAodGltZXN0YW1wX2NyZWF0ZWQgKyBzZXFJZCkKKyAgICAvLyBpbiBvcmRlciB0byBndWFyYW50ZWUgdW5pcXVlbmVzcyBmb3IgZWFjaCBjb25uZWN0aW9uCisgICAgc3RhdGljIHVpbnQzMl90IHNTZXFJZDsKKyAgICBzdGF0aWMgaW50MzJfdCBzUGlkOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcy4gSGFuZGxlcyBidWZmZXIgYWxsb2NhdGlvbi9yZWN5Y2xpbmcuCisgICAgICogSGFuZGxlcyBidWZmZXIgdHJhbnNmZXIgYmV0d2VlbiBidWZmZXIgcG9vbCBjbGllbnRzLgorICAgICAqLworICAgIHN0cnVjdCBCdWZmZXJQb29sIHsKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RMb2dVczsKKyAgICAgICAgQnVmZmVySWQgbVNlcTsKKyAgICAgICAgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgbU9ic2VydmVyOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8QnVmZmVySWQ+PiBtVXNpbmdCdWZmZXJzOworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjpzZXQ8Q29ubmVjdGlvbklkPj4gbVVzaW5nQ29ubmVjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPj4gbVBlbmRpbmdUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIFRyYW5zYWN0aW9ucyBjb21wbGV0ZWQgYmVmb3JlIFRSQU5TRkVSX1RPIG1lc3NhZ2UgYXJyaXZhbC4KKyAgICAgICAgLy8gRmV0Y2ggZG9lcyBub3Qgb2NjdXIgZm9yIHRoZSB0cmFuc2FjdGlvbnMuCisgICAgICAgIC8vIE9ubHkgdHJhbnNhY3Rpb24gaWQgaXMga2VwdCBmb3IgdGhlIHRyYW5zYWN0aW9ucyBpbiBzaG9ydCBkdXJhdGlvbi4KKyAgICAgICAgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4gbUNvbXBsZXRlZFRyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gQ3VycmVudGx5IGFjdGl2ZShwZW5kaW5nKSB0cmFuc2F0aW9ucycgc3RhdHVzICYgaW5mb3JtYXRpb24uCisgICAgICAgIHN0ZDo6bWFwPFRyYW5zYWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2FjdGlvblN0YXR1cz4+CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6c2V0PEJ1ZmZlcklkPiBtRnJlZUJ1ZmZlcnM7CisKKyAgICAgICAgLy8vIEJ1ZmZlciBwb29sIHN0YXRpc3RpY3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24gYW5kIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICAgIHN0cnVjdCBTdGF0cyB7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgLy8vIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVDYWNoZWQ7CisgICAgICAgICAgICAvLy8gIyBvZiBjYWNoZWQgYnVmZmVycyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzQ2FjaGVkOworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSB1c2VkLiAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplSW5Vc2U7CisgICAgICAgICAgICAvLy8gIyBvZiBjdXJyZW50bHkgdXNlZCBidWZmZXJzCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNJblVzZTsKKworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgY2FsbGVkIG9uIGJ1ZmZlcnBvb2wuICgjIG9mIGZldGNoZWQgZnJvbSBCbG9ja1Bvb2wpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsQWxsb2NhdGlvbnM7CisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyB0aGF0IHdlcmUgc2VydmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgICAgLy8vICgjIG9mIGFsbG9jYXRvciBhbGxvYyBwcmV2ZW50ZWQpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsUmVjeWNsZXM7CisgICAgICAgICAgICAvLy8gIyBvZiBidWZmZXIgdHJhbnNmZXJzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlcnM7CisgICAgICAgICAgICAvLy8gIyBvZiB0cmFuc2ZlcnMgdGhhdCBoYWQgdG8gYmUgZmV0Y2hlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxGZXRjaGVzOworCisgICAgICAgICAgICBTdGF0cygpCisgICAgICAgICAgICAgICAgOiBtU2l6ZUNhY2hlZCgwKSwgbUJ1ZmZlcnNDYWNoZWQoMCksIG1TaXplSW5Vc2UoMCksIG1CdWZmZXJzSW5Vc2UoMCksCisgICAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucygwKSwgbVRvdGFsUmVjeWNsZXMoMCksIG1Ub3RhbFRyYW5zZmVycygwKSwgbVRvdGFsRmV0Y2hlcygwKSB7fQorCisgICAgICAgICAgICAvLy8gQSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyQWxsb2NhdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQrKzsKKworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBldmljdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRXZpY3RlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyByZWN5Y2xlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyUmVjeWNsZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICAgICAgbVRvdGFsUmVjeWNsZXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJVbnVzZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIHRyYW5zZmVyIGlzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJTZW50KCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbFRyYW5zZmVycysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgZmV0Y2ggaXMgaW52b2tlZCBieSBhIGJ1ZmZlciB0cmFuc2Zlci4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJGZXRjaGVkKCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbEZldGNoZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBtU3RhdHM7CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIEJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKiogRGVzdHJveXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgfkJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIGFsbCBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgICAgICAqIEVhY2ggc3RhdHVzIG1lc3NhZ2UgaXMgaGFuZGxlZCBieSBtZXRob2RzIHdpdGggJ2hhbmRsZScgcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyBvd25lZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIGlzIG93bmVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVPd25CdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIHJlbGVhc2VkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgb3duZXJzaGlwIGlzIHJlbGVhc2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVSZWxlYXNlQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHN0YXJ0IG1lc3NhZ2UgZnJvbSB0aGUgc2VuZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfdG8gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBiZWluZyBhY2tlZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl9mcm9tIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiByZXN1bHQgbWVzc2FnZSBmcm9tIHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBleGlzaXRuZyB0cmFuc2FjdGlvbiBpcyBmaW5pc2hlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQWxsIHRoZQorICAgICAgICAgKiBidWZmZXJzIGFuZCB0cmFuc2FjdGlvbnMgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbGVhbmVkIHVwLgorICAgICAgICAgKiBUaGUgcmVsYXRlZCBGTVEgd2lsbCBiZSBjbGVhbmVkIHVwIHRvby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBjb25uZWN0aW9uIGV4aXN0ZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN5Y2xlcyBhIGV4aXN0aW5nIGZyZWUgYnVmZmVyIGlmIGl0IGlzIHBvc3NpYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBidWZmZXIgYWxsb2NhdG9yCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgaWQgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIGEgYnVmZmVyIGlzIHJlY3ljbGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBnZXRGcmVlQnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgdG8gYnVmZmVycG9vbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jICAgICB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGFsbG9jU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBidWZmZXIgaWQgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzdWx0U3RhdHVzIGFkZE5ld0J1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZQorICAgICAgICAgKiBjbGVhbmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgICAgICBmcmllbmQgY2xhc3MgQWNjZXNzb3I6OkltcGw7CisgICAgfSBtQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSB1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SSU1QTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2VhNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQWNjZXNzb3IuY3BwIiwKKyAgICAgICAgIkFjY2Vzc29ySW1wbC5jcHAiLAorICAgICAgICAiQnVmZmVyUG9vbENsaWVudC5jcHAiLAorICAgICAgICAiQnVmZmVyU3RhdHVzLmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyLmNwcCIsCisgICAgICAgICJDb25uZWN0aW9uLmNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTIwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApAQCAtMCwwICsxLDcwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENsaWVudCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVjZWl2ZVRpbWVvdXRVcyA9IDEwMDAwMDA7IC8vIDEwMG1zCitzdGF0aWMgY29uc3RleHByIGludCBrUG9zdE1heFJldHJ5ID0gMzsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDYWNoZVR0bFVzID0gMTAwMDAwMDsgLy8gVE9ETzogdHVuZQorCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICB9CisKKyAgICBib29sIGlzTG9jYWwoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQgJiYgbUxvY2FsOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbklkOworICAgIH0KKworICAgIHNwPElBY2Nlc3Nvcj4gJmdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yOworICAgIH0KKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgYm9vbCBwb3N0U2VuZCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Citwcml2YXRlOgorCisgICAgYm9vbCBwb3N0UmVjZWl2ZSgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIGJvb2wgcG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKTsKKworICAgIHZvaWQgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKworICAgIGJvb2wgc3luY1JlbGVhc2VkKCk7CisKKyAgICB2b2lkIGV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xEYXRhRHRvcjsKKyAgICBzdHJ1Y3QgQ2xpZW50QnVmZmVyOworCisgICAgYm9vbCBtTG9jYWw7CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3A8SUFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgc3A8Q29ubmVjdGlvbj4gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICBzcDxJQ29ubmVjdGlvbj4gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgdWludDMyX3QgbVNlcUlkOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbUxhc3RFdmljdENhY2hlVXM7CisKKyAgICAvLyBDYWNoZWRCdWZmZXJzCisgICAgc3RydWN0IEJ1ZmZlckNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgYm9vbCBtQ3JlYXRpbmc7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DcmVhdGVDdjsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgaW50IG1BY3RpdmU7CisgICAgICAgIGludDY0X3QgbUxhc3RDaGFuZ2VVczsKKworICAgICAgICBCdWZmZXJDYWNoZSgpIDogbUNyZWF0aW5nKGZhbHNlKSwgbUFjdGl2ZSgwKSwgbUxhc3RDaGFuZ2VVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKworICAgICAgICB2b2lkIGluY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgKyttQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZWNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgIC0tbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgIH0gbUNhY2hlOworCisgICAgLy8gRk1RIC0gcmVsZWFzZSBub3RpZmllcgorICAgIHN0cnVjdCB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmx5IG9uZSBsaXN0Pyh1c2luZyBvbmUgbGlzdCBtYXkgZGVhbHkgc2VuZGluZyBtZXNzYWdlcz8pCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2luZ0lkczsKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzZWRJZHM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiBtU3RhdHVzQ2hhbm5lbDsKKyAgICB9IG1SZWxlYXNpbmc7CisKKyAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBkdXJpbmcgc3luY2hyb25pemF0aW9uIGZyb20gcmVtb3RlIHNpZGUuCisgICAgLy8gSW4gb3JkZXIgdG8gbWluaW1pemUgcmVtb3RlIGNhbGxzIGFuZCBsb2NraW5nIGR1cnRhaW9uLCB0aGlzIGxvY2sgaXMgaGVsZAorICAgIC8vIGJ5IGJlc3QgZWZmb3J0IGFwcHJvYWNoIHVzaW5nIHRyeV9sb2NrKCkuCisgICAgc3RkOjptdXRleCBtUmVtb3RlU3luY0xvY2s7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6QmxvY2tQb29sRGF0YUR0b3IgeworICAgIEJsb2NrUG9vbERhdGFEdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sRGF0YSAqYnVmZmVyKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gYnVmZmVyLT5tSWQ7CisgICAgICAgIGRlbGV0ZSBidWZmZXI7CisKKyAgICAgICAgYXV0byBpbXBsID0gbUltcGwubG9jaygpOworICAgICAgICBpZiAoaW1wbCAmJiBpbXBsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGltcGwtPnBvc3RCdWZmZXJSZWxlYXNlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IG1JbXBsOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkNsaWVudEJ1ZmZlciB7Citwcml2YXRlOgorICAgIGJvb2wgbUludmFsaWRhdGVkOyAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICBpbnQ2NF90IG1FeHBpcmVVczsKKyAgICBib29sIG1IYXNDYWNoZTsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworICAgIHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbERhdGE+IG1DYWNoZTsKKworICAgIHZvaWQgdXBkYXRlRXhwaXJlKCkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworcHVibGljOgorICAgIENsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGlkLCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgIDogbUludmFsaWRhdGVkKGZhbHNlKSwgbUhhc0NhY2hlKGZhbHNlKSwKKyAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpLCBtSGFuZGxlKGhhbmRsZSkgeworICAgICAgICAodm9pZCltSW52YWxpZGF0ZWQ7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCisgICAgfkNsaWVudEJ1ZmZlcigpIHsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobUhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgZXhwaXJlKCkgY29uc3QgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICByZXR1cm4gbm93ID49IG1FeHBpcmVVczsKKyAgICB9CisKKyAgICBib29sIGhhc0NhY2hlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhc0NhY2hlOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gZmV0Y2hDYWNoZShuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUgPSBtQ2FjaGUubG9jaygpOworICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY3JlYXRlQ2FjaGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmICghbUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZXMgYSByYXcgcHRyIGluIG9yZGVyIHRvIGF2b2lkIHNlbmRpbmcgI3Bvc3RCdWZmZXJSZWxlYXNlCisgICAgICAgICAgICAvLyBmcm9tIGRlbGV0ZXIsIGluIGNhc2Ugb2YgbmF0aXZlX2hhbmRsZV9jbG9uZSBmYWlsdXJlLgorICAgICAgICAgICAgQnVmZmVyUG9vbERhdGEgKnB0ciA9IG5ldyBCdWZmZXJQb29sRGF0YShtQ29ubmVjdGlvbklkLCBtSWQpOworICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUocHRyLCBCbG9ja1Bvb2xEYXRhRHRvcihpbXBsKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZSA9IGNhY2hlOworICAgICAgICAgICAgICAgICAgICBtSGFzQ2FjaGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBib29sIG9uQ2FjaGVSZWxlYXNlKCkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgbUNhY2hlIGlzIG5vdCB2YWxpZDsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGlyZSgpOworICAgICAgICAgICAgbUhhc0NhY2hlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKQorICAgIDogbUxvY2FsKHRydWUpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAqZm1xRGVzYzsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICAmbUxvY2FsQ29ubmVjdGlvbiwgJm1Db25uZWN0aW9uSWQsICZmbXFEZXNjLCB0cnVlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPigqZm1xRGVzYyk7CisgICAgICAgIG1WYWxpZCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgJiYKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5pc1ZhbGlkKCk7CisgICAgfQorfQorCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKQorICAgIDogbUxvY2FsKGZhbHNlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgc3A8SUNvbm5lY3Rpb24+JiBvdXRDb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkJiBpZCA9IG1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+JiBvdXRDaGFubmVsID0KKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWw7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBbJnZhbGlkLCAmb3V0Q29ubmVjdGlvbiwgJmlkLCAmb3V0Q2hhbm5lbF0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgc3RhdHVzLCBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3ImIGRlc2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGlkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPihkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dENoYW5uZWwgJiYgb3V0Q2hhbm5lbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBtVmFsaWQgPSB0cmFuc1Jlc3VsdC5pc09rKCkgJiYgdmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoY2xlYXJDYWNoZSk7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IG1DYWNoZS5tTGFzdENoYW5nZVVzOworICAgICAgICBhY3RpdmUgPSBtQ2FjaGUubUFjdGl2ZSA+IDA7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gYWxsb2NhdGVCdWZmZXJIYW5kbGUocGFyYW1zLCAmYnVmZmVySWQsICZoYW5kbGUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBpdCBpcyByZWN5Y2xlZC4gKG5vdCBoYXZpbmcgYWN0aXZlIHJlZikKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoY2FjaGVJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IGNhY2hlIGNyZWF0aW9uIGZhaWx1cmUgJWQ6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IG51bGxwdHIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIHBvc3RCdWZmZXJSZWxlYXNlKGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKCFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIGlmICh0aW1lc3RhbXBVcyAhPSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzICs9IGtSZWNlaXZlVGltZW91dFVzOworICAgIH0KKyAgICBpZiAoIXBvc3RSZWNlaXZlKGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0LT5zZWNvbmQtPmhhc0NhY2hlKCkpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5mZXRjaENhY2hlKHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0cmFuc2ZlciB0aW1lX291dAorICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gcmVmZXJlbmNlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gY2FjaGVJdC0+c2Vjb25kLT5jcmVhdGVDYWNoZShzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSBjYWNoZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlLm1DcmVhdGluZykgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZldGNoQnVmZmVySGFuZGxlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGJ1ZmZlcklkLCBzdGQ6Om1vdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgYm9vbCBwb3N0ZWQgPSBwb3N0UmVjZWl2ZVJlc3VsdChidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA/IHRydWUgOiBmYWxzZSwgJm5lZWRzU3luYyk7CisgICAgQUxPR1YoImNsaWVudCByZWNlaXZlICVsbGQgLSAldSA6ICVzICglZCkiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICpidWZmZXIgPyAib2siIDogImZhaWwiLCBwb3N0ZWQpOworICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgaWYgKCFwb3N0ZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMucHVzaF9iYWNrKGJ1ZmZlcklkKTsKKyAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworfQorCisvLyBUT0RPOiByZXZpc2UgYWQtaG9jIHBvc3RpbmcgZGF0YSBzdHJ1Y3R1cmUKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICp0aW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICAqdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKSB8IG1TZXFJZCsrOworICAgICAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQsIHRhcmdldD8KKyAgICAgICAgcmV0ID0gIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTywgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICByZWNlaXZlciwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIG5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZSgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Bvc3RNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID09IDAgfHwgbm93IDwgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00sCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQKKyAgICBib29sIHJldCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICByZXN1bHQgPyBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LIDogQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUiwKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgKm5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjp0cnlTeW5jRnJvbVJlbW90ZSgpIHsKKyAgICBpZiAobVJlbW90ZVN5bmNMb2NrLnRyeV9sb2NrKCkpIHsKKyAgICAgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICAgICBuZWVkc1N5bmMgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNTeW5jKSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMik7CisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQ7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBtUmVtb3RlQ29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgfQorICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoQnVmZmVySWQmIGlkOiBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcykgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWxlYXNlIGJ1ZmZlciAlbGxkIC0gJXUiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChpZCk7CisgICAgICAgICAgICBpZiAoZm91bmQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm9uQ2FjaGVSZWxlYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmRlY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSByZWxlYXNlIHN0YXR1cyBpbmNvbnNpdGVudCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHN0YXR1cyBpbmNvbnNpdGVudCEiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGlmIChub3cgPj0gbUxhc3RFdmljdENhY2hlVXMgKyBrQ2FjaGVUdGxVcyB8fCBjbGVhckNhY2hlKSB7CisgICAgICAgIHNpemVfdCBldmljdGVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSAmJiAoaXQtPnNlY29uZC0+ZXhwaXJlKCkgfHwgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgKytldmljdGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjYWNoZSBjb3VudCAlbGxkIDogdG90YWwgJXp1LCBhY3RpdmUgJWQsIGV2aWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBtQ2FjaGUubUJ1ZmZlcnMuc2l6ZSgpLCBtQ2FjaGUubUFjdGl2ZSwgZXZpY3RlZCk7CisgICAgICAgIG1MYXN0RXZpY3RDYWNoZVVzID0gbm93OworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUxvY2FsQ29ubmVjdGlvbi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgcGFyYW1zLCBidWZmZXJJZCwgJmFsbG9jSGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShhbGxvY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNsaWVudCBhbGxvY2F0ZSByZXN1bHQgJWxsZCAlZCA6ICV1IGNsb25lICVwIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgKmhhbmRsZSA/ICpidWZmZXJJZCA6IDAgLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgaWYgKG1Mb2NhbCkgeworICAgICAgICBjb25uZWN0aW9uID0gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gY29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaGFuZGxlXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5idWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50Ojp+QnVmZmVyUG9vbENsaWVudCgpIHsKKyAgICAvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG9ycGhhbmVkIGJ1ZmZlcnM/Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0xvY2FsKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNMb2NhbCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtSW1wbC0+aXNBY3RpdmUobGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpOworfQorCitDb25uZWN0aW9uSWQgQnVmZmVyUG9vbENsaWVudDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Z2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICphY2Nlc3NvciA9IG1JbXBsLT5nZXRBY2Nlc3NvcigpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50Ojpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gbUltcGwtPnBvc3RTZW5kKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+bUlkLCByZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgICAgIHJldHVybiByZXN1bHQgPyBSZXN1bHRTdGF0dXM6Ok9LIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdlZmVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgY2xpZW50IGZvciBhIGJ1ZmZlciBwb29sLiBGb3IgYSBzcGVjaWZpYyBidWZmZXIgcG9vbCwgYXQgbW9zdAorICogb25lIGJ1ZmZlciBwb29sIGNsaWVudCBleGlzdHMgcGVyIHByb2Nlc3MuIFRoaXMgY2xhc3Mgd2lsbCBub3QgYmUgZXhwb3NlZAorICogb3V0c2lkZS4gQSBidWZmZXIgcG9vbCBjbGllbnQgd2lsbCBiZSB1c2VkIHZpYSBDbGllbnRNYW5hZ2VyLgorICovCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSBsb2NhbCBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNjcmVhdGUpLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSByZW1vdGUgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjcmVnaXN0ZXJTZW5kZXIpLgorICAgICAqIE5vdGU6IEEgYnVmZmVyIHBvb2wgY2xpZW50IGNyZWF0ZWQgd2l0aCByZW1vdGUgYnVmZmVyIHBvb2wgY2Fubm90CisgICAgICogYWxsb2NhdGUgYSBidWZmZXIuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgY2xpZW50LiAqLworICAgIH5CdWZmZXJQb29sQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBib29sIGlzTG9jYWwoKTsKKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OWFiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sU3RhdHVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCkgeworICAgIGludDY0X3Qgc3RhbXA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIC8vIFRPRE86IENMT0NLX01PTk9UT05JQ19DT0FSU0U/CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgc3RhbXAgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyAgICBzdGFtcCArPSAodHMudHZfc2VjICogMTAwMDAwMExMKTsKKyAgICByZXR1cm4gc3RhbXA7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1FbGVtZW50c0luUXVldWUgPSAxMDI0KjE2Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA9IDEyODsKKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpvcGVuKAorICAgICAgICBDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlkIGNvbGxpc2lvbiBsb2c/CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IHF1ZXVlLT5nZXREZXNjKCk7CisgICAgfQorICAgIGF1dG8gcmVzdWx0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihpZCwgc3RkOjptb3ZlKHF1ZXVlKSkpOworICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGlkKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgPT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lcmFzZShpZCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gaXQtPnNlY29uZC0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+cmVhZCgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiByZWFkcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyAoc3B1cmlvdXMgY2xpZW50PykKKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHJlYWQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgICAgICAgICAgLS1hdmFpbDsKKyAgICAgICAgfQorICAgIH0KK30KKworQnVmZmVyU3RhdHVzQ2hhbm5lbDo6QnVmZmVyU3RhdHVzQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6bmVlZHNTeW5jKCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHJldHVybiBhdmFpbCArIGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPCBrTnVtRWxlbWVudHNJblF1ZXVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQgJiYgcGVuZGluZy5zaXplKCkgPiAwKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBhdmFpbCA9IHN0ZDo6bWluKGF2YWlsLCBwZW5kaW5nLnNpemUoKSk7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgYXZhaWw7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IHBlbmRpbmcuc2l6ZSgpOworICAgICAgICBpZiAoYXZhaWwgPj0gbnVtUGVuZGluZyArIDEpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcmVsZWFzZSwgbWVzc2FnZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgICAgIHJlbGVhc2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJnJlbGVhc2UsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nPworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkID0gdGFyZ2V0SWQ7CisgICAgICAgICAgICAvLyBUT0RPIDogdGltZXNhdGFtcAorICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4YTkyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJTVEFUVVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJTVEFUVVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLyoqIFJldHVybnMgbW9ub3RvbmljIHRpbWVzdGFtcCBpbiBVcyBzaW5jZSBmaXhlZCBwb2ludCBpbiB0aW1lLiAqLworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgRk1RIGZvciBhIGJ1ZmZlciBwb29sLiBidWZmZXIgb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UKKyAqIG1lc3NhZ2VzIGFyZSBzZW50IHZpYSB0aGUgRk1RcyBmcm9tIHRoZSBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNPYnNlcnZlciB7Citwcml2YXRlOgorICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPj4KKyAgICAgICAgICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXM7CisKK3B1YmxpYzoKKyAgICAvKiogQ3JlYXRlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgRk1RIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBvcGVuKENvbm5lY3Rpb25JZCBpZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cik7CisKKyAgICAvKiogQ2xvc2VzIGFuIEZNUSBmb3IgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGlkKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgRk1RIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKTsKK307CisKKy8qKgorICogQW4gRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlIG1lc3NhZ2VzCisgKiBhcmUgc2VudCB2aWEgdGhlIGZtcSB0byB0aGUgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c0NoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IG1CdWZmZXJTdGF0dXNRdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGFuIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlclN0YXR1c0NoYW5uZWwoY29uc3QgUXVldWVEZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJvb2wgbmVlZHNTeW5jKCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIKKyAgICAgKiB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgYnVmZmVyIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgbmV3IHN0YXR1cyBvZiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0SWQgICAgICBjb25uZWN0aW9uIElkIG9mIHRoZSByZWNlaXZlcihvbmx5IHdoZW4gdGhlIHNlbmRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RzIGEgc3RhdHVzIG1lc3NhZ2UpLgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGlzIHBvc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJTVEFUVVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9DbGllbnRNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VhMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sTWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVnaXN0ZXJUaW1lb3V0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWMKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiAxIHNlYyB0dW5lCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsaWVudFRpbWVvdXRVcyA9IDUwMDAwMDA7IC8vIFRPRE86IDUgc2VjcyB0dW5lCisKKy8qKgorICogVGhlIGhvbGRlciBvZiB0aGUgY29va2llIG9mIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAqIFRoZSBjb29raWUgaXMgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBmb3IgZWFjaCBJQ2xpZW50TWFuYWdlci4KKyAqIChUaGUgY29va2llIGlzIHVzZWQgdG8gbm90aWZ5IGRlYXRoIG9mIGNsaWVudHMgdG8gYnVmZmVycG9vbCBwcm9jZXNzLikKKyAqLworY2xhc3MgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvb2tpZSBob2xkZXIgZm9yIHJlbW90ZSBJQ2xpZW50TWFuYWdlcihzKS4KKyAgICAgKi8KKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29va2llIGZvciBhIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICogQHBhcmFtIGFkZGVkICAgICB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIG5ld2x5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBJQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBnZXRDb29raWUoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLCBib29sICphZGRlZCk7CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbVNlcUlkOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQ2xpZW50TWFuYWdlcj4sIHVpbnQ2NF90Pj4gbU1hbmFnZXJzOworfTsKKworQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Q2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpIDogbVNlcUlkKDApe30KKwordWludDY0X3QgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Z2V0Q29va2llKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsCisgICAgICAgIGJvb2wgKmFkZGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1NYW5hZ2Vycy5iZWdpbigpOyBpdCAhPSBtTWFuYWdlcnMuZW5kKCk7KSB7CisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiBrZXkgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc0VxdWFsKGtleSwgbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAqYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCA9IG1NYW5hZ2Vycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgaWQgPSBtU2VxSWQrKzsKKyAgICAqYWRkZWQgPSB0cnVlOworICAgIG1NYW5hZ2Vycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobWFuYWdlciwgaWQpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKK2NsYXNzIENsaWVudE1hbmFnZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoKTsKKworICAgIC8vIEJuUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvLyBCcFJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIG11bHRpcGxlIGxvY2tzLAorICAgIC8vIGFsd2F5cyBsb2NrIENsaWVudENhY2hlLmxvY2sgYmVmb3JlIGxvY2tpbmcgQWN0aXZlQ2xpZW50cy5sb2NrLgorICAgIHN0cnVjdCBDbGllbnRDYWNoZSB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUFjY2Vzc29yPiwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25uZWN0Q3Y7CisgICAgICAgIGJvb2wgbUNvbm5lY3Rpbmc7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisKKyAgICAgICAgQ2xpZW50Q2FjaGUoKSA6IG1Db25uZWN0aW5nKGZhbHNlKSwgbUxhc3RDbGVhblVwVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBBY3RpdmUgY2xpZW50cyB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHZpYSBDb25uZWN0aW9uSWQKKyAgICBzdHJ1Y3QgQWN0aXZlQ2xpZW50cyB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgIH0gbUFjdGl2ZTsKKworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgbVJlbW90ZUNsaWVudENvb2tpZXM7Cit9OworCitDbGllbnRNYW5hZ2VyOjpJbXBsOjpJbXBsKCkge30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY2xlYW5VcCgpOworICAgIGludDY0X3QgdGltZW91dFVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrUmVnaXN0ZXJUaW1lb3V0VXM7CisgICAgZG8geworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gc0FjY2Vzc29yID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzQWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKHNBY2Nlc3NvciwgYWNjZXNzb3IpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlLm1DbGllbnRzLmZpbmQoKnBDb25uZWN0aW9uSWQpICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBleGlzdGluZyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2FjaGUubUNvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IHRydWU7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3Nvcik7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi53YWl0X2ZvcigKKyAgICAgICAgICAgICAgICBsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtSZWdpc3RlclRpbWVvdXRVcykpOworICAgIH0gd2hpbGUgKGdldFRpbWVzdGFtcE5vdygpIDwgdGltZW91dFVzKTsKKyAgICAvLyBUT0RPOiByZXR1cm4gdGltZW91dCBlcnJvcgorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICBib29sIGxvY2FsID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoc2VuZGVySWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIGxvY2FsID0gaXQtPnNlY29uZC0+aXNMb2NhbCgpOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5yZWdpc3RlclNlbmRlcigKKyAgICAgICAgICAgICAgICBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICBbJnJzLCByZWNlaXZlcklkXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICBycyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgKnJlY2VpdmVySWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbCAmJiBycyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudCA9IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKyAgICAgICAgICAgIGlmIChyZWNpcGllbnQpICB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCBkZWF0aCByZWNpcGllbnQgcmVnaXN0ZXJlZCAlbGxkIiwgKGxvbmcgbG9uZykqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUgPSBtUmVtb3RlQ2xpZW50Q29va2llcy5nZXRDb29raWUocmVjZWl2ZXIsICZhZGRlZCk7CisgICAgICAgICAgICAgICAgcmVjaXBpZW50LT5hZGRDb29raWVUb0Nvbm5lY3Rpb24oY29va2llLCAqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5saW5rVG9EZWF0aChyZWNpcGllbnQsIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByczsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNvbnN0IHNwPEFjY2Vzc29yPiBhY2Nlc3NvciA9IG5ldyBBY2Nlc3NvcihhbGxvY2F0b3IpOworICAgIGlmICghYWNjZXNzb3IgfHwgIWFjY2Vzc29yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3Nvcik7CisgICAgaWYgKCFjbGllbnQgfHwgIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBTaW5jZSBhIG5ldyBidWZmZXJwb29sIGlzIGNyZWF0ZWQsIGV2aWN0IG1lbW9yaWVzIHdoaWNoIGFyZSB1c2VkIGJ5CisgICAgLy8gZXhpc3RpbmcgYnVmZmVycG9vbHMgYW5kIGNsaWVudHMuCisgICAgY2xlYW5VcCh0cnVlKTsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgfQorICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICBBTE9HVigiY3JlYXRlIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIG1BY3RpdmUubUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IgfHwgKGFjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChjQWNjZXNzb3IsIGFjY2Vzc29yKSkpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2l0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gYnVmZmVyLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmdldEFjY2Vzc29yKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5nZXRBY2Nlc3NvcihhY2Nlc3Nvcik7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGludDY0X3QgbGFzdFRyYW5zYWN0aW9uVXM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIGlmIChjbGVhckNhY2hlIHx8IG1DYWNoZS5tTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcyA8IG5vdykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBpbnQgY2xlYW5lZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNBY3RpdmUoJmxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0VHJhbnNhY3Rpb25VcyArIGtDbGllbnRUaW1lb3V0VXMgPCBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgKytjbGVhbmVkOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrY2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIjIG9mIGNsZWFuZWQgY29ubmVjdGlvbnM6ICVkIiwgY2xlYW5lZCk7CisgICAgICAgIG1DYWNoZS5tTGFzdENsZWFuVXBVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gLTE7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIoYnVmZmVyUG9vbCwgJmNvbm5lY3Rpb25JZCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SLCAtMSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vIE1ldGhvZHMgZm9yIGxvY2FsIHVzZS4KK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZTsKK3N0ZDo6bXV0ZXggQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlTG9jazsKKworc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0luc3RhbmNlTG9jayk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3IENsaWVudE1hbmFnZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworQ2xpZW50TWFuYWdlcjo6Q2xpZW50TWFuYWdlcigpIDogbUltcGwobmV3IEltcGwoKSkge30KKworQ2xpZW50TWFuYWdlcjo6fkNsaWVudE1hbmFnZXIoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jcmVhdGUoYWxsb2NhdG9yLCBwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgc2VuZGVySWQsIHJlY2VpdmVySWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90KiB0aW1lc3RhbXBVcykgeworICAgIGlmIChtSW1wbCAmJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6Y2xlYW5VcCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAodHJ1ZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OGY1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDb25uZWN0aW9uOjpmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBpZiAoYnVmZmVySWQgIT0gU1lOQ19CVUZGRVJJRCkgeworICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gbUFjY2Vzc29yLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7YnVmZmVySWQsIGhhbmRsZX0pOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVyezAsIG51bGxwdHJ9KTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitDb25uZWN0aW9uOjpDb25uZWN0aW9uKCkgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpLCBtQ29ubmVjdGlvbklkKC0xTEwpIHt9CisKK0Nvbm5lY3Rpb246On5Db25uZWN0aW9uKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiYgYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBtQWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgbUNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDb25uZWN0aW9uOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIGZvbGxvdy4KKworLy9JQ29ubmVjdGlvbiogSElETF9GRVRDSF9JQ29ubmVjdGlvbihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5Y2I2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbm5lY3Rpb24gOiBwdWJsaWMgSUNvbm5lY3Rpb24geworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gUmVjeWNsZXMgYSBidWZmZXIgaWYKKyAgICAgKiBpdCBpcyBwb3NzaWJsZS4gVGhlIHJldHVybmVkIGJ1ZmZlciBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gb3RoZXIgcmVtb3RlCisgICAgICogY2xpZW50cyhDb25uZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgSWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZSBjbGVhbmluZworICAgICAqIGZyb20gYnVmZmVycG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgYnVmZmVycG9vbCBmcmVlcyBhbGwgYnVmZmVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgY29ubmVjdGlvbi4gKi8KKyAgICB+Q29ubmVjdGlvbigpOworCisgICAgLyoqIENyZWF0ZXMgYSBjb25uZWN0aW9uLiAqLworICAgIENvbm5lY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbCBhbmQgdGhlIGNvbm5lY3Rpb24gaWQuCisgICAgICogVGhlIGNvbm5lY3Rpb24gaWQgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgd2hvbGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yICAgICAgdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBJZC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBTWU5DX0JVRkZFUklEID0gVUlOVDMyX01BWCwKKyAgICB9OworCitwcml2YXRlOgorICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIHNwPEFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwZjAxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTFRZUEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTFRZUEVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGEgeworICAgIC8vIEZvciBsb2NhbCB1c2UsIHRvIHNwZWNpZnkgYSBidWZmZXJwb29sIChjbGllbnQgY29ubmVjdGlvbikgZm9yIGJ1ZmZlcnMuCisgICAgLy8gUmV0dXJuIHZhbHVlIGZyb20gY29ubmVjdCNJQWNjZXNzb3IoYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCkuCisgICAgaW50NjRfdCBtQ29ubmVjdGlvbklkOworICAgIC8vIEJ1ZmZlcklkCisgICAgdWludDMyX3QgbUlkOworCisgICAgQnVmZmVyUG9vbERhdGEoKSA6IG1Db25uZWN0aW9uSWQoMCksIG1JZCgwKSB7fQorCisgICAgQnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgaWQpCisgICAgICAgICAgICA6IG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSB7fQorCisgICAgfkJ1ZmZlclBvb2xEYXRhKCkge30KK307CisKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7CisKK3R5cGVkZWYgdWludDMyX3QgQnVmZmVySWQ7Cit0eXBlZGVmIHVpbnQ2NF90IFRyYW5zYWN0aW9uSWQ7Cit0eXBlZGVmIGludDY0X3QgQ29ubmVjdGlvbklkOworCitlbnVtIDogQ29ubmVjdGlvbklkIHsKKyAgICBJTlZBTElEX0NPTk5FQ1RJT05JRCA9IDAsCit9OworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVyU3RhdHVzTWVzc2FnZSwga1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQnVmZmVyU3RhdHVzUXVldWU7Cit0eXBlZGVmIEJ1ZmZlclN0YXR1c1F1ZXVlOjpEZXNjcmlwdG9yIFF1ZXVlRGVzY3JpcHRvcjsKKworLyoqCisgKiBBbGxvY2F0aW9uIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitzdHJ1Y3QgQnVmZmVyUG9vbEFsbG9jYXRpb24geworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUhhbmRsZTsKKyAgICB9CisKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgOiBtSGFuZGxlKGhhbmRsZSkge30KKworICAgIH5CdWZmZXJQb29sQWxsb2NhdGlvbigpIHt9OworfTsKKworLyoqCisgKiBBbGxvY2F0b3Igd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYW4gYWxsb2NhdGlvbihidWZmZXIpIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGFsbG9jICAgICBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHNpemUgb2YgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIG9mIGFuIG9sZCBhbGxvY2F0aW9uIGFyZQorICAgICAqIGNvbXBhdGlibGUgd2l0aCBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTFRZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTc3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJCdWZmZXJQb29sVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENsaWVudE1hbmFnZXIgOiBwdWJsaWMgSUNsaWVudE1hbmFnZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiByZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqIEdldHMgYW4gaW5zdGFuY2UuICovCisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IGdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYWwgY29ubmVjdGlvbiB3aXRoIGEgbmV3bHkgY3JlYXRlZCBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgICAgIGZvciBuZXcgYnVmZmVyIGFsbG9jYXRpb24uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgSWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbi4gVGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS13aWRlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBwb29sIGFuZCBhIGxvY2FsIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5CisgICAgICogICAgICAgICBjcmVhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjcmVhdGVkIGNvbm5lY3Rpb24gYXMgc2VuZGVyIGZvciByZW1vdGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlciAgICAgIFRoZSByZW1vdGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHNlbmRlcklkICAgICAgQSBsb2NhbCBjb25uZWN0aW9uIHdoaWNoIHdpbGwgc2VuZCBidWZmZXJzIHRvLgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIElkIG9mIHRoZSBjcmVhdGVkIHJlY2VpdmluZyBjb25uZWN0aW9uIG9uIHRoZSByZWNlaXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG9uIHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIgcHJvY2Vzcy4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kZXIgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQUxSRUFEWV9FWElTVFMgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFkZS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIFRoZSBpZCBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIFRoZSBpZCBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgaXMgYmVpbmcgc2VudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSByZWNlaXZlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBTZW5kcyBhIGJ1ZmZlcgorICAgICAqIHRvIG90aGVyIHJlbW90ZSBjbGllbnRzKGNvbm5lY3Rpb24pIGFmdGVyIHRoaXMgY2FsbCBoYXMgYmVlbiBzdWNjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0cmFuc2FjdGlvbiBpcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgLyoqCisgICAgICogIFRpbWUgb3V0IGluYWN0aXZlIGxpbmdlcmluZyBjb25uZWN0aW9ucyBhbmQgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKCk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIHRoZSBtYW5hZ2VyIG9mIGJ1ZmZlciBwb29sIGNsaWVudHMuICAqLworICAgIH5DbGllbnRNYW5hZ2VyKCk7Citwcml2YXRlOgorICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBzSW5zdGFuY2U7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc0luc3RhbmNlTG9jazsKKworICAgIGNsYXNzIEltcGw7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworCisgICAgQ2xpZW50TWFuYWdlcigpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVhNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0U2luZ2xlVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJzaW5nbGUuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAibXVsdGkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNmN2VhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VuaW9uIFBhcmFtcyB7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgY2FwYWNpdHk7CisgIH0gZGF0YTsKKyAgdWludDhfdCBhcnJheVswXTsKKyAgUGFyYW1zKCkgOiBkYXRhezB9IHt9CisgIFBhcmFtcyh1aW50MzJfdCBzaXplKQorICAgICAgOiBkYXRhe3NpemV9IHt9Cit9OworCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBIYW5kbGVBc2htZW0gOiBwdWJsaWMgbmF0aXZlX2hhbmRsZV90IHsKKyAgSGFuZGxlQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IHNpemUpCisgICAgOiBuYXRpdmVfaGFuZGxlX3QoY0hlYWRlciksCisgICAgbUZkc3sgYXNobWVtRmQgfSwKKyAgICBtSW50c3sgaW50IChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHt9CisKKyAgaW50IGFzaG1lbUZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQXNobWVtOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pOworCitwcm90ZWN0ZWQ6CisgIHN0cnVjdCB7CisgICAgaW50IG1Bc2htZW07CisgIH0gbUZkczsKKyAgc3RydWN0IHsKKyAgICBpbnQgbVNpemVMbzsKKyAgICBpbnQgbVNpemVIaTsKKyAgICBpbnQgbU1hZ2ljOworICB9IG1JbnRzOworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBrTWFnaWMgPSAnYWhtXHgwMCcsCisgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICB2ZXJzaW9uID0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkKKyAgfTsKKyAgY29uc3Qgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCBjSGVhZGVyOworfTsKKworY29uc3QgbmF0aXZlX2hhbmRsZV90IEhhbmRsZUFzaG1lbTo6Y0hlYWRlciA9IHsKKyAgSGFuZGxlQXNobWVtOjp2ZXJzaW9uLAorICBIYW5kbGVBc2htZW06Om51bUZkcywKKyAgSGFuZGxlQXNobWVtOjpudW1JbnRzLAorICB7fQorfTsKKworYm9vbCBIYW5kbGVBc2htZW06OmlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3QgbykgeworICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihvKTsKKyAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCitjbGFzcyBBbGxvY2F0aW9uQXNobWVtIHsKK3ByaXZhdGU6CisgIEFsbG9jYXRpb25Bc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3QgY2FwYWNpdHksIGJvb2wgcmVzKQorICAgIDogbUhhbmRsZShhc2htZW1GZCwgY2FwYWNpdHkpLAorICAgICAgbUluaXQocmVzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBBbGxvY2F0aW9uQXNobWVtICpBbGxvYyhzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciAqa0FsbG9jYXRpb25UYWcgPSAiYnVmZmVycG9vbF90ZXN0IjsKKyAgICBpbnQgYXNobWVtRmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihrQWxsb2NhdGlvblRhZywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBBbGxvY2F0aW9uQXNobWVtKGFzaG1lbUZkLCBzaXplLCBhc2htZW1GZCA+PSAwKTsKKyAgfQorCisgIH5BbGxvY2F0aW9uQXNobWVtKCkgeworICAgIGlmIChtSW5pdCkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgfQorICB9CisKKyAgY29uc3QgSGFuZGxlQXNobWVtICpoYW5kbGUoKSB7CisgICAgcmV0dXJuICZtSGFuZGxlOworICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZUFzaG1lbSBtSGFuZGxlOworICBib29sIG1Jbml0OworICAvLyBUT0RPOiBtYXBwaW5nIGFuZCBtYXAgZmQKK307CisKK3N0cnVjdCBBbGxvY2F0aW9uRHRvciB7CisgIEFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiAmYWxsb2MpCisgICAgICA6IG1BbGxvYyhhbGxvYykge30KKworICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IG1BbGxvYzsKK307CisKK30KKworCitSZXN1bHRTdGF0dXMgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtczsKKyAgbWVtY3B5KCZhc2htZW1QYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IGFzaG1lbUFsbG9jID0KKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPigKKyAgICAgICAgICBBbGxvY2F0aW9uQXNobWVtOjpBbGxvYyhhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eSkpOworICBpZiAoYXNobWVtQWxsb2MpIHsKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGFzaG1lbUFsbG9jLT5oYW5kbGUoKSk7CisgICAgaWYgKHB0cikgeworICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPihwdHIsIEFsbG9jYXRpb25EdG9yKGFzaG1lbUFsbG9jKSk7CisgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgKmFsbG9jU2l6ZSA9IGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5OworICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgfQorICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSB7CisgIHNpemVfdCBuZXdTaXplID0gbmV3UGFyYW1zLnNpemUoKTsKKyAgc2l6ZV90IG9sZFNpemUgPSBvbGRQYXJhbXMuc2l6ZSgpOworICBpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyArK2kpIHsKKyAgICAgIGlmIChuZXdQYXJhbXNbaV0gIT0gb2xkUGFyYW1zW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIHB0cltpXSA9IHZhbDsKKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChwdHJbaV0gIT0gdmFsKSB7CisgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQga0FsbG9jYXRpb25TaXplID0gMTAyNCAqIDEwOworICBQYXJhbXMgYXNobWVtUGFyYW1zKGtBbGxvY2F0aW9uU2l6ZSk7CisKKyAgcGFyYW1zLT5hc3NpZ24oYXNobWVtUGFyYW1zLmFycmF5LCBhc2htZW1QYXJhbXMuYXJyYXkgKyBzaXplb2YoYXNobWVtUGFyYW1zKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2ZTVmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICisjZGVmaW5lIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yOworCisvLyBidWZmZXIgYWxsb2NhdG9yIGZvciB0aGUgdGVzdHMKK2NsYXNzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworIHB1YmxpYzoKKyAgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSB7fQorCisgIH5UZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIEZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworICBzdGF0aWMgYm9vbCBWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworfTsKKworLy8gcmV0cmlldmUgYnVmZmVyIGFsbG9jYXRvciBwYXJhbXRlcnMKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworI2VuZGlmICAvLyBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk2ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSB0eXBlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4KK2VudW0gUGlwZUNvbW1hbmQgOiBpbnQzMl90IHsKKyAgICBJTklUX09LID0gMCwKKyAgICBJTklUX0VSUk9SLAorICAgIFNFTkQsCisgICAgUkVDRUlWRV9PSywKKyAgICBSRUNFSVZFX0VSUk9SLAorfTsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIGJldHdlZW4gcHJvY2Vzc2VzLgordW5pb24gUGlwZU1lc3NhZ2UgeworICAgIHN0cnVjdCAgeworICAgICAgICBpbnQzMl90IGNvbW1hbmQ7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIGludDY0X3QgIHRpbWVzdGFtcFVzOworICAgIH0gZGF0YTsKKyAgICBjaGFyIGFycmF5WzBdOworfTsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sTXVsdGlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCk7CisgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCk7CisKKyAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApOworCisgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbQorICAgICAgLy8gdGVhckRvd24KKyAgICAgIHBhdXNlKCk7CisgICAgfQorCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgaW50IHdzdGF0dXM7CisgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgIGJvb2wgc2VuZE1lc3NhZ2UoaW50ICpwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50ICpwaXBlcywgUGlwZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgZG9SZWNlaXZlcigpIHsKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlKTsKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKworICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmhhbmRsZSA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJidWZmZXI7CisgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUoCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkLCBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMsICZyaGFuZGxlLCAmcmJ1ZmZlcik7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCk7CisgICAgICBpZiAoc3RhdHVzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKCFUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJoYW5kbGUsIDB4NzcpKSB7CisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICB9Cit9OworCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdCBiZXR3ZWVuIHByb2Nlc3Nlcy4KK1RFU1RfRihCdWZmZXJwb29sTXVsdGlUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBQaXBlTWVzc2FnZSBtZXNzYWdlOworCisgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworCisgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICBBU1NFUlRfVFJVRSgoYm9vbClyZWNlaXZlcik7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyOworICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHBvc3RVczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZzaGFuZGxlLCAmc2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoc2hhbmRsZSwgMHg3NykpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTRU5EOworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNidWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgIH0KKyAgRVhQRUNUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNlYjYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1BbGxvY2F0aW9uVGVzdCA9IDM7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciByZWN5Y2xpbmcgdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1SZWN5Y2xlVGVzdCA9IDM7CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbFNpbmdsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihtTWFuYWdlciwgbUNvbm5lY3Rpb25JZCwgJm1SZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUyAmJgorICAgICAgICAgICAgICAgIG1SZWNlaXZlcklkID09IG1Db25uZWN0aW9uSWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcklkOworCit9OworCisvLyBCdWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgc3VjY2Vzc2Z1bGx5IHdpdGgKKy8vIHVuaXF1ZSBidWZmZXIgaWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIEFsbG9jYXRlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcltrTnVtQWxsb2NhdGlvblRlc3RdOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcltpXSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraikgeworICAgICAgQVNTRVJUX1RSVUUoYnVmZmVyW2ldLT5tSWQgIT0gYnVmZmVyW2pdLT5tSWQpOworICAgIH0KKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtQWxsb2NhdGlvblRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHJlY3ljbGUgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZGUtYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHJlY3ljbGVkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBSZWN5Y2xlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBCdWZmZXJJZCBiaWRba051bVJlY3ljbGVUZXN0XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIGJpZFtpXSA9IGJ1ZmZlci0+bUlkOworICB9CisgIGZvciAoaW50IGkgPSAxOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBBU1NFUlRfVFJVRShiaWRbaSAtIDFdID09IGJpZFtpXSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bVJlY3ljbGVUZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBidWZmZXIgaXMgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBjbGllbnQgc3VjY2Vzc2Z1bGx5LgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlciwgcmJ1ZmZlcjsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqcmVjdkhhbmRsZSA9IG51bGxwdHI7CisKKyAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICBpbnQ2NF90IHBvc3RVczsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzYnVmZmVyKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg3NykpOworICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQobVJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZShtUmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgc2J1ZmZlci0+bUlkLCBwb3N0VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmJ1ZmZlcik7CisgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCAweDc3KSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiNDYwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDb25uZWN0aW9uIgorCisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZCgKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBhY2Nlc3NvcikpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgYXV0byBpdCA9IG1Db25uZWN0aW9uVG9Db29raWUuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ29ubmVjdGlvblRvQ29va2llLmVuZCgpKSB7CisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoaXQpOworICAgICAgICBhdXRvIGNpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGNpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgY2l0LT5zZWNvbmQuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChjaXQtPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGRDb29raWVUb0Nvbm5lY3Rpb24oCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChjb25uZWN0aW9uSWQpID09IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29ubmVjdGlvblRvQ29va2llLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGNvb2tpZSkpOworICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuaW5zZXJ0KGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGNvb2tpZSwgc3RkOjpzZXQ8aW50NjRfdD57Y29ubmVjdGlvbklkfSkpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OnNlcnZpY2VEaWVkKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgKSB7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBjb25uZWN0aW9uc1RvQ2xvc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisKKyAgICAgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICAgICAgaWYgKGl0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29uSXQgPSBpdC0+c2Vjb25kLmJlZ2luKCk7IGNvbkl0ICE9IGl0LT5zZWNvbmQuZW5kKCk7ICsrY29uSXQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFjY2Vzc29ySXQgPSBtQWNjZXNzb3JzLmZpbmQoKmNvbkl0KTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzb3JJdCAhPSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zVG9DbG9zZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmNvbkl0LCBhY2Nlc3Nvckl0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3Nvckl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZSgqY29uSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbm5lY3Rpb25zVG9DbG9zZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29ubmVjdGlvbnNUb0Nsb3NlLmJlZ2luKCk7IGl0ICE9IGNvbm5lY3Rpb25zVG9DbG9zZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgYWNjZXNzb3IgPSBpdC0+c2Vjb25kLnByb21vdGUoKTsKKworICAgICAgICAgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzb3ItPmNsb3NlKGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbm5lY3Rpb24gJWxsZCBjbG9zZWQgb24gZGVhdGgiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK25hbWVzcGFjZSB7CitzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50ID0KKyAgICAgICAgbmV3IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworfQorCitzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKSB7CisgICAgcmV0dXJuIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNyZWF0ZUludmFsaWRhdG9yKCkgeworICAgIEFjY2Vzc29yOjpJbXBsOjpjcmVhdGVJbnZhbGlkYXRvcigpOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI+JiBvYnNlcnZlciwKKyAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICB1aW50MzJfdCBtc2dJZDsKKyAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiBmbXFEZXNjOworICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqIGludkRlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLCBmYWxzZSwgJmNvbm5lY3Rpb24sICZjb25uZWN0aW9uSWQsICZtc2dJZCwgJmZtcURlc2MsICZpbnZEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsIG1zZ0lkLCAqZm1xRGVzYywgKmludkRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0ciwgLTFMTCwgMCwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM8QnVmZmVyU3RhdHVzTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclVuc3luYzxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQWNjZXNzb3I6OkFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgIDogbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQWNjZXNzb3I6On5BY2Nlc3NvcigpIHsKK30KKworYm9vbCBBY2Nlc3Nvcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gKGJvb2wpbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmbHVzaCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmZsdXNoKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwgYm9vbCBsb2NhbCwKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCgKKyAgICAgICAgICAgICAgICB0aGlzLCBvYnNlcnZlciwgY29ubmVjdGlvbiwgcENvbm5lY3Rpb25JZCwgcE1zZ0lkLAorICAgICAgICAgICAgICAgIHN0YXR1c0Rlc2NQdHIsIGludkRlc2NQdHIpOworICAgICAgICBpZiAoIWxvY2FsICYmIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IodGhpcyk7CisgICAgICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5hZGQoKnBDb25uZWN0aW9uSWQsIGFjY2Vzc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+cmVtb3ZlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vSUFjY2Vzc29yKiBISURMX0ZFVENIX0lBY2Nlc3Nvcihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IEFjY2Vzc29yKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwMjUxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IEFjY2Vzc29yOworc3RydWN0IENvbm5lY3Rpb247CisKKy8qKgorICogUmVjZWl2ZXMgZGVhdGggbm90aWZpY2F0aW9ucyBmcm9tIHJlbW90ZSBjb25uZWN0aW9ucy4KKyAqIE9uIGRlYXRoIG5vdGlmaWNhdGlvbnMsIHRoZSBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGFuZCB1c2VkIHJlc291cmNlcworICogYXJlIHJlbGVhc2VkLgorICovCitzdHJ1Y3QgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmV3bHkgY29ubmVjdGVkIGNvbm5lY3Rpb24gZnJvbSByZW1vdGUgcHJvY2Vzc2VzLgorICAgICAqLworICAgIHZvaWQgYWRkKGludDY0X3QgY29ubmVjdGlvbklkLCBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZvaWQgYWRkQ29va2llVG9Db25uZWN0aW9uKHVpbnQ2NF90IGNvb2tpZSwgaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxpbnQ2NF90Pj4gIG1Db29raWVUb0Nvbm5lY3Rpb25zOworICAgIHN0ZDo6bWFwPGludDY0X3QsIHVpbnQ2NF90PiBtQ29ubmVjdGlvblRvQ29va2llOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gbUFjY2Vzc29yczsKK307CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCBlbmFibGVzIGEgYnVmZmVyIHBvb2wgdG8gY29tbXVuaWNhdGUgd2l0aCBidWZmZXIKKyAqIHBvb2wgY2xpZW50cy4gMToxIGNvcnJlc3BvbmRlbnNlIGhvbGRzIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgYW4gYWNjZXNzb3IuCisgKi8KK3N0cnVjdCBBY2Nlc3NvciA6IHB1YmxpYyBJQWNjZXNzb3IgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyPiYgb2JzZXJ2ZXIsIGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogSW52YWxpZGF0ZXMgYWxsIGJ1ZmZlcnMgd2hpY2ggYXJlIG93bmVkIGJ5IGJ1ZmZlcnBvb2wgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIC8qKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSBhIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGNvbm5lY3Rpb24gaWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBidWZmZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgcmVjZWl2aW5nIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCB0aGUgaWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIHRvIGJlIGZldGNoZWQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGZldGNoZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBmZXRjaGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmZXRjaCgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIGNvbm5lY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBUaGUgYnVmZmVyIHBvb2wgY2xpZW50IHVzZXMgdGhlCisgICAgICogY3JlYXRlZCBjb25uZWN0aW9uIGluIG9yZGVyIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGJ1ZmZlciBwb29sLiBBbgorICAgICAqIEZNUSBmb3IgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGlzIGFsc28gY3JlYXRlZCBmb3IgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYnNlcnZlciAgICAgIGNsaWVudCBvYnNlcnZlciBmb3IgYnVmZmVyIGludmFsaWRhdGlvbgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uICAgIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIHRoZSBpZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBNc2dJZCAgICAgICAgdGhlIGlkIG9mIHRoZSByZWNlbnQgYnVmZmVyIHBvb2wgbWVzc2FnZQorICAgICAqIEBwYXJhbSBzdGF0dXNEZXNjUHRyIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBpbnZEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBidWZmZXIgaW52YWxpZGF0aW9uIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBmcm9tIGEgYnVmZmVyIHBvb2wgdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IG1hZGUuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+JiBvYnNlcnZlciwKKyAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb21zIHBlcmlvZGljIGNhY2hlCisgICAgICogY2xlYW5pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzIHdhaXRpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBoaWRsX2RlYXRoX3JlY2lwaWVudCBmb3IgcmVtb3RlIGNvbm5lY3Rpb24gZGVhdGguCisgICAgICovCisgICAgc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gZ2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjA5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCituYW1lc3BhY2UgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSA1MDAwMDA7IC8vIFRPRE8gdHVuZSAwLjUgc2VjCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtMb2dEdXJhdGlvblVzID0gNTAwMDAwMDsgLy8gNSBzZWNzCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uID0gMTAyNCoxMDI0KjE1OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uID0gNDA7Cit9CisKKy8vIEJ1ZmZlciBzdHJ1Y3R1cmUgaW4gYnVmZmVycG9vbCBwcm9jZXNzCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXIgeworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBzaXplX3QgbU93bmVyQ291bnQ7CisgICAgc2l6ZV90IG1UcmFuc2FjdGlvbkNvdW50OworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgY29uc3Qgc2l6ZV90IG1BbGxvY1NpemU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUNvbmZpZzsKKyAgICBib29sIG1JbnZhbGlkYXRlZDsKKworICAgIEludGVybmFsQnVmZmVyKAorICAgICAgICAgICAgQnVmZmVySWQgaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYWxsb2NDb25maWcpCisgICAgICAgICAgICA6IG1JZChpZCksIG1Pd25lckNvdW50KDApLCBtVHJhbnNhY3Rpb25Db3VudCgwKSwKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwgbUFsbG9jU2l6ZShhbGxvY1NpemUpLCBtQ29uZmlnKGFsbG9jQ29uZmlnKSwKKyAgICAgICAgICAgIG1JbnZhbGlkYXRlZChmYWxzZSkge30KKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24tPmhhbmRsZSgpOworICAgIH0KKworICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgbUludmFsaWRhdGVkID0gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgc3RhdHVzRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgKnBNc2dJZCA9IG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb25DaGFubmVsLmdldERlc2MoaW52RGVzY1B0cik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkNvbm5lY3QoaWQsIG9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICArK3NTZXFJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgQUxPR1YoImNvbm5lY3Rpb24gY2xvc2UgJWxsZDogJXUiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCwgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5tSWQpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmhhbmRsZUNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubU9ic2VydmVyLmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgLy8gU2luY2UgY2xvc2UjIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFsbCB3b3JrcyBhcmUgZmluaXNoZWQsIGl0IGlzIE9LIHRvCisgICAgLy8gZXZpY3QgdW51c2VkIGJ1ZmZlcnMuCisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCh0cnVlKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICBpZiAoIW1CdWZmZXJQb29sLmdldEZyZWVCdWZmZXIobUFsbG9jYXRvciwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKSkgeworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBzaXplX3QgYWxsb2NTaXplOworICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShwYXJhbXMsICZhbGxvYywgJmFsbG9jU2l6ZSk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLmFkZE5ld0J1ZmZlcihhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjcmVhdGUgYSBidWZmZXIgJWQgOiAldSAlcCIsCisgICAgICAgICAgICAgIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLCAqYnVmZmVySWQsICpoYW5kbGUpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG93bkJ1ZmZlciBmYWlsdXJlCisgICAgICAgIG1CdWZmZXJQb29sLmhhbmRsZU93bkJ1ZmZlcihjb25uZWN0aW9uSWQsICpidWZmZXJJZCk7CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIGF1dG8gZm91bmQgPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIGNvbnRhaW5zKCZtQnVmZmVyUG9vbC5tUGVuZGluZ1RyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCkpIHsKKyAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1CdWZmZXJJZCA9PSBidWZmZXJJZCkgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ID0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoYnVmZmVySXQgIT0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tU3RhdHMub25CdWZmZXJGZXRjaGVkKCk7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IGJ1ZmZlckl0LT5zZWNvbmQtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICAvLyB0cmFuc2FjdGlvbiB0aW1lb3V0LCBidWZmZXIgY2FjaGVpbmcgVFRMIGhhbmRsaW5nCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKGNsZWFyQ2FjaGUpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpmbHVzaCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmZsdXNoKHNoYXJlZF9mcm9tX3RoaXMoKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmhhbmRsZUludmFsaWRhdGVBY2soKSB7CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiBvYnNlcnZlcnM7CisgICAgdWludDMyX3QgaW52YWxpZGF0aW9uSWQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5vbkhhbmRsZUFjaygmb2JzZXJ2ZXJzLCAmaW52YWxpZGF0aW9uSWQpOworICAgIH0KKyAgICAvLyBEbyBub3QgaG9sZCBsb2NrIGZvciBzZW5kIGludmFsaWRhdGlvbnMKKyAgICBmb3IgKGF1dG8gaXQgPSBvYnNlcnZlcnMuYmVnaW4oKTsgaXQgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG9ic2VydmVyLT5vbk1lc3NhZ2UoaXQtPmZpcnN0LCBpbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICAodm9pZCkgdHJhbnNSZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJQb29sLmlzVmFsaWQoKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApLAorICAgICAgbVN0YXJ0U2VxKDApIHsKKyAgICBtVmFsaWQgPSBtSW52YWxpZGF0aW9uQ2hhbm5lbC5pc1ZhbGlkKCk7Cit9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworc3RkOjphdG9taWM8c3RkOjp1aW50MzJfdD4gQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6c0ludlNlcUlkKDApOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6fkJ1ZmZlclBvb2woKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBBTE9HRCgiRGVzdHJ1Y3Rpb24gLSBidWZmZXJwb29sMiAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25Db25uZWN0KAorICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyKSB7CisgICAgbUFja3NbY29uSWRdID0gbUludmFsaWRhdGlvbklkOyAvLyBzdGFydHMgZnJvbSBjdXJyZW50IGludmFsaWRhdGlvbklkCisgICAgbU9ic2VydmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIG9ic2VydmVyKSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25DbG9zZShDb25uZWN0aW9uSWQgY29uSWQpIHsKKyAgICBtQWNrcy5lcmFzZShjb25JZCk7CisgICAgbU9ic2VydmVycy5lcmFzZShjb25JZCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25BY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwKKyAgICAgICAgdWludDMyX3QgbXNnSWQpIHsKKyAgICBhdXRvIGl0ID0gbUFja3MuZmluZChjb25JZCk7CisgICAgaWYgKGl0ID09IG1BY2tzLmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCJBQ0sgZnJvbSBpbmNvbnNpc3RlbnQgY29ubmVjdGlvbiEgJWxsZCIsIChsb25nIGxvbmcpY29uSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpc01lc3NhZ2VMYXRlcihtc2dJZCwgaXQtPnNlY29uZCkpIHsKKyAgICAgICAgbUFja3NbY29uSWRdID0gbXNnSWQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uQnVmZmVySW52YWxpZGF0ZWQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbVBlbmRpbmdzLmJlZ2luKCk7IGl0ICE9IG1QZW5kaW5ncy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGl0LT5pc0ludmFsaWRhdGVkKGJ1ZmZlcklkKSkgeworICAgICAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgICAgICAgICAgaWYgKGl0LT5tTmVlZHNBY2spIHsKKyAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIGlmIChtc2dJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgaXQtPm1Gcm9tLCBpdC0+bVRvKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgYm9vbCBuZWVkc0FjaywKKyAgICAgICAgdWludDMyX3QgZnJvbSwKKyAgICAgICAgdWludDMyX3QgdG8sCisgICAgICAgIHNpemVfdCBsZWZ0LAorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgICAgIHVpbnQzMl90IG1zZ0lkID0gMDsKKyAgICBpZiAobmVlZHNBY2spIHsKKyAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgIC8vIHdyYXAgaGFwcGVucworICAgICAgICAgICAgbXNnSWQgPSArK21JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiYnVmZmVycG9vbDIgaW52YWxpZGF0aW9uIHJlcXVlc3RlZCBhbmQgcXVldWVkIik7CisgICAgaWYgKGxlZnQgPT0gMCkgeworICAgICAgICBjaGFubmVsLnBvc3RJbnZhbGlkYXRpb24obXNnSWQsIGZyb20sIHRvKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBzZW5kaW5nIGhpbnQgbWVzc2FnZT8KKyAgICAgICAgQUxPR1YoImJ1ZmZlcnBvbzIgaW52YWxpZGF0aW9uIHJlcXVlc3RlZCBhbmQgcGVuZGluZyIpOworICAgICAgICBQZW5kaW5nIHBlbmRpbmcobmVlZHNBY2ssIGZyb20sIHRvLCBsZWZ0LCBpbXBsKTsKKyAgICAgICAgbVBlbmRpbmdzLnB1c2hfYmFjayhwZW5kaW5nKTsKKyAgICB9CisgICAgc0ludmFsaWRhdG9yLT5hZGRBY2Nlc3NvcihtSWQsIGltcGwpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpJbnZhbGlkYXRpb246Om9uSGFuZGxlQWNrKAorICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+ICpvYnNlcnZlcnMsCisgICAgICAgIHVpbnQzMl90ICppbnZhbGlkYXRpb25JZCkgeworICAgIGlmIChtSW52YWxpZGF0aW9uSWQgIT0gMCkgeworICAgICAgICAqaW52YWxpZGF0aW9uSWQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgIHN0ZDo6c2V0PGludD4gZGVhZHM7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY2tzLmJlZ2luKCk7IGl0ICE9IG1BY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZCAhPSBtSW52YWxpZGF0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+IG9ic2VydmVyID0gbU9ic2VydmVyc1tpdC0+Zmlyc3RdOworICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcnMtPmVtcGxhY2UoaXQtPmZpcnN0LCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb25uZWN0aW9uICVsbGQgd2lsbCBjYWxsIG9ic2VydmVyICgldTogJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdC0+Zmlyc3QsIGl0LT5zZWNvbmQsIG1JbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIE4uQjogb25NZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGxhdGVyLiBpZ25vcmUgcG9zc2liaWxpdHkgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gb25NZXNzYWdlIyBvbmV3YXkgY2FsbCBiZWluZyBsb3N0LgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kID0gbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXJwb29sMiBvYnNlcnZlciBkaWVkICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgIGRlYWRzLmluc2VydChpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVhZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZGVhZHMuYmVnaW4oKTsgaXQgIT0gZGVhZHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBvbkNsb3NlKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1QZW5kaW5ncy5zaXplKCkgPT0gMCkgeworICAgICAgICAvLyBBbGwgaW52YWxpZGF0aW9uIElkcyBhcmUgc3luY2VkIGFuZCBubyBtb3JlIHBlbmRpbmcgaW52YWxpZGF0aW9ucy4KKyAgICAgICAgc0ludmFsaWRhdG9yLT5kZWxBY2Nlc3NvcihtSWQpOworICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlT3duQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworCisgICAgYm9vbCBhZGRlZCA9IGluc2VydCgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGFkZGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50Kys7CisgICAgfQorICAgIGluc2VydCgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIHJldHVybiBhZGRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb24ub25CdWZmZXJJbnZhbGlkYXRlZChtZXNzYWdlLmJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OklOVkFMSURBVElPTl9BQ0s6CisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkFjayhtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IGZhbHNlKSB7CisgICAgICAgICAgICBBTE9HVygiYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbHVyZSAtIG1lc3NhZ2UgOiAlZCBjb25uZWN0aW9uIDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cywgKGxvbmcgbG9uZyltZXNzYWdlLmNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZXMuY2xlYXIoKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIC8vIENsZWFuaW5nIGJ1ZmZlcnMKKyAgICBhdXRvIGJ1ZmZlcnMgPSBtVXNpbmdCdWZmZXJzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoYnVmZmVycyAhPSBtVXNpbmdCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgQnVmZmVySWQmIGJ1ZmZlcklkIDogYnVmZmVycy0+c2Vjb25kKSB7CisgICAgICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVVzaW5nQnVmZmVycy5lcmFzZShidWZmZXJzKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbmluZyB0cmFuc2FjdGlvbnMKKyAgICBhdXRvIHBlbmRpbmcgPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKHBlbmRpbmcgIT0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBUcmFuc2FjdGlvbklkJiB0cmFuc2FjdGlvbklkIDogcGVuZGluZy0+c2Vjb25kKSB7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBtVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoaXRlciAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVyLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQodHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gaXRlci0+c2Vjb25kLT5tQnVmZmVySWQ7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcmVlYnVmZmVyIGluc2VydCBmYWlsCisgICAgICAgICAgICAgICAgICAgIGlmICghYnVmZmVySXRlci0+c2Vjb25kLT5tSW52YWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGJ1ZmZlckl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKGJ1ZmZlcklkLCBtSW52YWxpZGF0aW9uQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Z2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGF1dG8gYnVmZmVySXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBmb3IgKDtidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7ICsrYnVmZmVySXQpIHsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSAqYnVmZmVySXQ7CisgICAgICAgIGlmIChhbGxvY2F0b3ItPmNvbXBhdGlibGUocGFyYW1zLCBtQnVmZmVyc1tidWZmZXJJZF0tPm1Db25maWcpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gKmJ1ZmZlckl0OworICAgICAgICBtRnJlZUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXQpOworICAgICAgICBtU3RhdHMub25CdWZmZXJSZWN5Y2xlZChtQnVmZmVyc1tpZF0tPm1BbGxvY1NpemUpOworICAgICAgICAqaGFuZGxlID0gbUJ1ZmZlcnNbaWRdLT5oYW5kbGUoKTsKKyAgICAgICAgKnBJZCA9IGlkOworICAgICAgICBBTE9HVigicmVjeWNsZSBhIGJ1ZmZlciAldSAlcCIsIGlkLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjphZGROZXdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKworICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gbVNlcSsrOworICAgIGlmIChtU2VxID09IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgbVNlcSA9IDA7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8SW50ZXJuYWxCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGF1dG8gcmVzID0gbUJ1ZmZlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoYnVmZmVyKSkpOworICAgICAgICBpZiAocmVzLnNlY29uZCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyQWxsb2NhdGVkKGFsbG9jU2l6ZSk7CisgICAgICAgICAgICAqaGFuZGxlID0gYWxsb2MtPmhhbmRsZSgpOworICAgICAgICAgICAgKnBJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChjbGVhckNhY2hlIHx8IG1UaW1lc3RhbXBVcyA+IG1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzKSB7CisgICAgICAgIG1MYXN0Q2xlYW5VcFVzID0gbVRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVRpbWVzdGFtcFVzID4gbUxhc3RMb2dVcyArIGtMb2dEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtTGFzdExvZ1VzID0gbVRpbWVzdGFtcFVzOworICAgICAgICAgICAgQUxPR0QoImJ1ZmZlcnBvb2wyICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbDIgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjppbnZhbGlkYXRlKAorICAgICAgICBib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgKmZyZWVJdCkpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytmcmVlSXQ7CisgICAgfQorCisgICAgc2l6ZV90IGxlZnQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpc0J1ZmZlckluUmFuZ2UoZnJvbSwgdG8sIGl0LT5maXJzdCkpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICsrbGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW52YWxpZGF0aW9uLm9uSW52YWxpZGF0aW9uUmVxdWVzdChuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIG1JbnZhbGlkYXRpb25DaGFubmVsLCBpbXBsKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Zmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIEJ1ZmZlcklkIGZyb20gPSBtU3RhcnRTZXE7CisgICAgQnVmZmVySWQgdG8gPSBtU2VxOworICAgIG1TdGFydFNlcSA9IG1TZXE7CisgICAgLy8gVE9ETzogbmVlZHNBY2sgcGFyYW1zIAorICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIHJlcXVlc3QgYnA6JXUgJXUgJXUiLCBtSW52YWxpZGF0aW9uLm1JZCwgZnJvbSwgdG8pOworICAgIGlmIChmcm9tICE9IHRvKSB7CisgICAgICAgIGludmFsaWRhdGUodHJ1ZSwgZnJvbSwgdG8sIGltcGwpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgICAgIGJvb2wgJnJlYWR5KSB7CisgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+IGNvcGllZDsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGlmICghcmVhZHkpIHsKKyAgICAgICAgICAgICAgICBjdi53YWl0KGxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29waWVkLmluc2VydChhY2Nlc3NvcnMuYmVnaW4oKSwgYWNjZXNzb3JzLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Omxpc3Q8Q29ubmVjdGlvbklkPiBlcmFzZWQ7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvcGllZC5iZWdpbigpOyBpdCAhPSBjb3BpZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gaW1wbCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgaWYgKCFpbXBsKSB7CisgICAgICAgICAgICAgICAgZXJhc2VkLnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbXBsLT5oYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGVyYXNlZC5iZWdpbigpOyBpdCAhPSBlcmFzZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NvcnMuZXJhc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRyYWluaW5nIGNwdS4KKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpBY2Nlc3NvckludmFsaWRhdG9yKCkgOiBtUmVhZHkoZmFsc2UpIHsKKyAgICBzdGQ6OnRocmVhZCBpbnZhbGlkYXRvcigKKyAgICAgICAgICAgIGludmFsaWRhdG9yVGhyZWFkLAorICAgICAgICAgICAgc3RkOjpyZWYobUFjY2Vzc29ycyksCisgICAgICAgICAgICBzdGQ6OnJlZihtTXV0ZXgpLAorICAgICAgICAgICAgc3RkOjpyZWYobUN2KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1SZWFkeSkpOworICAgIGludmFsaWRhdG9yLmRldGFjaCgpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjphZGRBY2Nlc3NvcigKKyAgICAgICAgdWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBib29sIG5vdGlmeSA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoYWNjZXNzb3JJZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBpZiAoIW1SZWFkeSkgeworICAgICAgICAgICAgbVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWNjZXNzb3JJZCwgaW1wbCkpOworICAgICAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBhZGRlZCBicDoldSAlZCIsIGFjY2Vzc29ySWQsIG5vdGlmeSk7CisgICAgfQorICAgIGxvY2sudW5sb2NrKCk7CisgICAgaWYgKG5vdGlmeSkgeworICAgICAgICBtQ3Yubm90aWZ5X29uZSgpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6ZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3NvcklkKTsKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBkZWxldGVkIGJwOiV1IiwgYWNjZXNzb3JJZCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+IEFjY2Vzc29yOjpJbXBsOjpzSW52YWxpZGF0b3I7CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCkgeworICAgIGlmICghc0ludmFsaWRhdG9yKSB7CisgICAgICAgIHNJbnZhbGlkYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTcyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RydWN0IEludGVybmFsQnVmZmVyOworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Iob3IgYSBidWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4pICovCitjbGFzcyBBY2Nlc3Nvcjo6SW1wbAorICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QWNjZXNzb3I6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgdm9pZCBoYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJJZCBtU3RhcnRTZXE7CisgICAgICAgIGJvb2wgbVZhbGlkOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgbUludmFsaWRhdGlvbkNoYW5uZWw7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKworICAgICAgICBzdHJ1Y3QgSW52YWxpZGF0aW9uIHsKKyAgICAgICAgICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBzSW52U2VxSWQ7CisKKyAgICAgICAgICAgIHN0cnVjdCBQZW5kaW5nIHsKKyAgICAgICAgICAgICAgICBib29sIG1OZWVkc0FjazsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJvbTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtVG87CisgICAgICAgICAgICAgICAgc2l6ZV90IG1MZWZ0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+IG1JbXBsOworICAgICAgICAgICAgICAgIFBlbmRpbmcoYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbU5lZWRzQWNrKG5lZWRzQWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyb20oZnJvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ubyh0byksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0KGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbChpbXBsKQorICAgICAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgICAgICBib29sIGlzSW52YWxpZGF0ZWQodWludDMyX3QgYnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzQnVmZmVySW5SYW5nZShtRnJvbSwgbVRvLCBidWZmZXJJZCkgJiYgLS1tTGVmdCA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxQZW5kaW5nPiBtUGVuZGluZ3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHVpbnQzMl90PiBtQWNrczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gbU9ic2VydmVyczsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JZDsKKworICAgICAgICAgICAgSW52YWxpZGF0aW9uKCkgOiBtSW52YWxpZGF0aW9uSWQoMCksIG1JZChzSW52U2VxSWQuZmV0Y2hfYWRkKDEpKSB7fQorCisgICAgICAgICAgICB2b2lkIG9uQ29ubmVjdChDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgICAgICAgICAgdm9pZCBvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25BY2soQ29ubmVjdGlvbklkIGNvbklkLCB1aW50MzJfdCBtc2dJZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpOworCisgICAgICAgICAgICB2b2lkIG9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICAgICAgdm9pZCBvbkhhbmRsZUFjaygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiAqb2JzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaW52YWxpZGF0aW9uSWQpOworICAgICAgICB9IG1JbnZhbGlkYXRpb247CisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludmFsaWRhdGUoYm9vbCBuZWVkc0FjaywgQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIGludmFsaWRhdGUgYWxsIGN1cnJlbnQKKyAgICAgICAgICogZnJlZSBidWZmZXJzLiBBY3RpdmUgYnVmZmVycyBhcmUgaW52YWxpZGF0ZWQgYWZ0ZXIgYmVpbmcgaW5hY3RpdmUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworCisgICAgc3RydWN0ICBBY2Nlc3NvckludmFsaWRhdG9yIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBtQWNjZXNzb3JzOworICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUN2OworICAgICAgICBib29sIG1SZWFkeTsKKworICAgICAgICBBY2Nlc3NvckludmFsaWRhdG9yKCk7CisgICAgICAgIHZvaWQgYWRkQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworICAgICAgICB2b2lkIGRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpOworICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29ySW52YWxpZGF0b3I+IHNJbnZhbGlkYXRvcjsKKworICAgIHN0YXRpYyB2b2lkIGludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgIGJvb2wgJnJlYWR5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSB1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDRlMDZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQWNjZXNzb3IuY3BwIiwKKyAgICAgICAgIkFjY2Vzc29ySW1wbC5jcHAiLAorICAgICAgICAiQnVmZmVyUG9vbENsaWVudC5jcHAiLAorICAgICAgICAiQnVmZmVyU3RhdHVzLmNwcCIsCisgICAgICAgICJDbGllbnRNYW5hZ2VyLmNwcCIsCisgICAgICAgICJDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJPYnNlcnZlci5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTA3ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICB9CisKKyAgICBib29sIGlzTG9jYWwoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQgJiYgbUxvY2FsOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbklkOworICAgIH0KKworICAgIHNwPElBY2Nlc3Nvcj4gJmdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yOworICAgIH0KKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSUQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgYm9vbCBwb3N0U2VuZCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Citwcml2YXRlOgorCisgICAgYm9vbCBwb3N0UmVjZWl2ZSgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIGJvb2wgcG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKTsKKworICAgIHZvaWQgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKworICAgIGJvb2wgc3luY1JlbGVhc2VkKHVpbnQzMl90IG1zZ0lkID0gMCk7CisKKyAgICB2b2lkIGV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCk7CisKKyAgICB2b2lkIGludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0byk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4gbUludmFsaWRhdGlvbkxpc3RlbmVyOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgUmVsZWFzZUNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGVJZDsgLy8gVE9ETzogaW52YWxpZGF0aW9uIEFDSyB0byBidWZmZXJwb29sCisgICAgICAgIGJvb2wgbUludmFsaWRhdGVBY2s7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiBtU3RhdHVzQ2hhbm5lbDsKKworICAgICAgICBSZWxlYXNlQ2FjaGUoKSA6IG1JbnZhbGlkYXRlSWQoMCksIG1JbnZhbGlkYXRlQWNrKHRydWUpIHt9CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1FeHBpcmVVczsKKyAgICBib29sIG1IYXNDYWNoZTsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworICAgIHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbERhdGE+IG1DYWNoZTsKKworICAgIHZvaWQgdXBkYXRlRXhwaXJlKCkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworcHVibGljOgorICAgIENsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGlkLCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgIDogbUhhc0NhY2hlKGZhbHNlKSwgbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLAorICAgICAgICAgICAgICBtSWQoaWQpLCBtSGFuZGxlKGhhbmRsZSkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCdWZmZXJJZCBpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAqc3RhdHVzRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICppbnZEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLCB0cnVlLAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgJnN0YXR1c0Rlc2MsICZpbnZEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPigqc3RhdHVzRGVzYyk7CisgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oKmludkRlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5pc1ZhbGlkKCk7CisgICAgfQorfQorCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHVpbnQzMl90JiBvdXRNc2dJZCA9IG1SZWxlYXNpbmcubUludmFsaWRhdGVJZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+JiBvdXRPYnNlcnZlciA9CisgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRNc2dJZCwgJm91dENoYW5uZWwsICZvdXRPYnNlcnZlcl0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgc3RhdHVzLCBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCwKKyAgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yJiBzdGF0dXNEZXNjLAorICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3ImIGludkRlc2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGlkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgICAgICBvdXRNc2dJZCA9IG1zZ0lkOworICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPihzdGF0dXNEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPihpbnZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dENoYW5uZWwgJiYgb3V0Q2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciAmJiBvdXRPYnNlcnZlci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBtVmFsaWQgPSB0cmFuc1Jlc3VsdC5pc09rKCkgJiYgdmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoY2xlYXJDYWNoZSk7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IG1DYWNoZS5tTGFzdENoYW5nZVVzOworICAgICAgICBhY3RpdmUgPSBtQ2FjaGUubUFjdGl2ZSA+IDA7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgIHN5bmNSZWxlYXNlZChtZXNzYWdlSWQpOworICAgIC8vIFRPRE86IGV2aWN0IGNhY2hlIHJlcXVpcmVkPworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Zmx1c2goKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIHJldHVybiBtTG9jYWxDb25uZWN0aW9uLT5mbHVzaCgpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGRvbid0IG5lZWQgdG8gY2FsbCBzeW5jUmVsZWFzZWQgZXZlcnkgdGltZQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICB9CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICp0aW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICAqdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKSB8IG1TZXFJZCsrOworICAgICAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQsIHRhcmdldD8KKyAgICAgICAgcmV0ID0gIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTywgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICByZWNlaXZlciwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIG5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZSgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Bvc3RNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID09IDAgfHwgbm93IDwgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00sCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQKKyAgICBib29sIHJldCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICByZXN1bHQgPyBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LIDogQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUiwKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgKm5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjp0cnlTeW5jRnJvbVJlbW90ZSgpIHsKKyAgICBpZiAobVJlbW90ZVN5bmNMb2NrLnRyeV9sb2NrKCkpIHsKKyAgICAgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICAgICBuZWVkc1N5bmMgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNTeW5jKSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMik7CisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQ7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBtUmVtb3RlQ29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQodWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgYm9vbCBjbGVhcmVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoQnVmZmVySWQmIGlkOiBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuZGVjQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHJlbGVhc2Ugc3RhdHVzIGluY29uc2l0ZW50ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgc3RhdHVzIGluY29uc2l0ZW50ISIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IGludmFsaWRhdGlvbnM7CisgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5nZXRJbnZhbGlkYXRpb25zKGludmFsaWRhdGlvbnMpOworICAgIHVpbnQzMl90IGxhc3RNc2dJZCA9IDA7CisgICAgaWYgKGludmFsaWRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKGF1dG8gaXQgPSBpbnZhbGlkYXRpb25zLmJlZ2luKCk7IGl0ICE9IGludmFsaWRhdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+bWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0TXNnSWQgPSBpdC0+bWVzc2FnZUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5mcm9tQnVmZmVySWQgPT0gaXQtPnRvQnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJvbUJ1ZmZlcklkID0gVUlOVDMyX01BWAorICAgICAgICAgICAgICAgIGludmFsaWRhdGVCdWZmZXIoaXQtPmZyb21CdWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSYW5nZShpdC0+ZnJvbUJ1ZmZlcklkLCBpdC0+dG9CdWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKGxhc3RNc2dJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobGFzdE1zZ0lkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbGFzdE1zZ0lkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgLy8gbWVzc2FnZXMgYXJlIGRyYWluZWQuCisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobWVzc2FnZUlkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbWVzc2FnZUlkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaykgeworICAgICAgICAgICAgLy8gcG9zdCBBQ0sKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgJWxsZCBpbnZhbGlkYXRlaW9uIGFjayAoJWQpICV1IiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaywgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xlYXJlZDsKK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaWYgKG5vdyA+PSBtTGFzdEV2aWN0Q2FjaGVVcyArIGtDYWNoZVR0bFVzIHx8IGNsZWFyQ2FjaGUpIHsKKyAgICAgICAgc2l6ZV90IGV2aWN0ZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpICYmIChpdC0+c2Vjb25kLT5leHBpcmUoKSB8fCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNhY2hlIGNvdW50ICVsbGQgOiB0b3RhbCAlenUsIGFjdGl2ZSAlZCwgZXZpY3RlZCAlenUiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIG1DYWNoZS5tQnVmZmVycy5zaXplKCksIG1DYWNoZS5tQWN0aXZlLCBldmljdGVkKTsKKyAgICAgICAgbUxhc3RFdmljdENhY2hlVXMgPSBub3c7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCkgeworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlkID09IGl0LT5zZWNvbmQtPmlkKCkpIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiBidWZmZXIgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5jb25zaXRlbnQgaW52YWxpZGF0aW9uICVsbGQgOiBhY3RpdmVyIGJ1ZmZlciEhICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsICh1bnNpZ25lZCBpbnQpaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pIHsKKyAgICBzaXplX3QgaW52YWxpZGF0ZWQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgQnVmZmVySWQgYmlkID0gaXQtPnNlY29uZC0+aWQoKTsKKyAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgJiYgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCB8fCBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KKyAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6ICMgb2YgaW52YWxpZGF0ZWQgJXp1IiwKKyAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGludmFsaWRhdGVkKTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUxvY2FsQ29ubmVjdGlvbi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgcGFyYW1zLCBidWZmZXJJZCwgJmFsbG9jSGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShhbGxvY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNsaWVudCBhbGxvY2F0ZSByZXN1bHQgJWxsZCAlZCA6ICV1IGNsb25lICVwIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgKmhhbmRsZSA/ICpidWZmZXJJZCA6IDAgLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgaWYgKG1Mb2NhbCkgeworICAgICAgICBjb25uZWN0aW9uID0gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gY29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaGFuZGxlXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5idWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpIHsKKyAgICBBTE9HVigiYnVmZmVycG9vbDIgY2xpZW50IHJlY3YgaW52ICV1IiwgbXNnSWQpOworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgbUltcGwtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmZsdXNoKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+cG9zdFNlbmQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tSWQsIHJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IFJlc3VsdFN0YXR1czo6T0sgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDlhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBjbGllbnQgZm9yIGEgYnVmZmVyIHBvb2wuIEZvciBhIHNwZWNpZmljIGJ1ZmZlciBwb29sLCBhdCBtb3N0CisgKiBvbmUgYnVmZmVyIHBvb2wgY2xpZW50IGV4aXN0cyBwZXIgcHJvY2Vzcy4gVGhpcyBjbGFzcyB3aWxsIG5vdCBiZSBleHBvc2VkCisgKiBvdXRzaWRlLiBBIGJ1ZmZlciBwb29sIGNsaWVudCB3aWxsIGJlIHVzZWQgdmlhIENsaWVudE1hbmFnZXIuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIGxvY2FsIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI2NyZWF0ZSkuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgY2xpZW50LiAqLworICAgIH5CdWZmZXJQb29sQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBib29sIGlzTG9jYWwoKTsKKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKyAgICBmcmllbmQgc3RydWN0IE9ic2VydmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNzI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xTdGF0dXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCkgeworICAgIGludDY0X3Qgc3RhbXA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIC8vIFRPRE86IENMT0NLX01PTk9UT05JQ19DT0FSU0U/CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgc3RhbXAgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyAgICBzdGFtcCArPSAodHMudHZfc2VjICogMTAwMDAwMExMKTsKKyAgICByZXR1cm4gc3RhbXA7Cit9CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCkgeworICAgIHJldHVybiBjdXJNc2dJZCAhPSBwcmV2TXNnSWQgJiYgY3VyTXNnSWQgLSBwcmV2TXNnSWQgPCBwcmV2TXNnSWQgLSBjdXJNc2dJZDsKK30KKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCAmJiBidWZmZXJJZCA8IHRvOworICAgIH0gZWxzZSB7IC8vIHdyYXAgaGFwcGVucworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCB8fCBidWZmZXJJZCA8IHRvOworICAgIH0KK30KKworc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUVsZW1lbnRzSW5RdWV1ZSA9IDEwMjQqMTY7CitzdGF0aWMgY29uc3RleHByIGludCBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlID0gMTI4OworCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6Om9wZW4oCisgICAgICAgIENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlkIGNvbGxpc2lvbiBsb2c/CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IHF1ZXVlLT5nZXREZXNjKCk7CisgICAgfQorICAgIGF1dG8gcmVzdWx0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihpZCwgc3RkOjptb3ZlKHF1ZXVlKSkpOworICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGlkKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgPT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lcmFzZShpZCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gaXQtPnNlY29uZC0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+cmVhZCgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiByZWFkcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyAoc3B1cmlvdXMgY2xpZW50PykKKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHJlYWQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgICAgICAgICAgLS1hdmFpbDsKKyAgICAgICAgfQorICAgIH0KK30KKworQnVmZmVyU3RhdHVzQ2hhbm5lbDo6QnVmZmVyU3RhdHVzQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90IGludmFsaWRhdGVJZCwKKyAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmICEqaW52YWxpZGF0ZWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGludmFsaWRhdGVJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmludmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IHBlbmRpbmcuc2l6ZSgpOworICAgICAgICBpZiAoYXZhaWwgPj0gbnVtUGVuZGluZyArIDEpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcmVsZWFzZSwgbWVzc2FnZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgICAgIHJlbGVhc2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJnJlbGVhc2UsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nPworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkID0gdGFyZ2V0SWQ7CisgICAgICAgICAgICAvLyBUT0RPIDogdGltZXNhdGFtcAorICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworICAgIC8vIGRyYWluIHByZXZpb3VzIG1lc3NhZ2VzCisgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmF2YWlsYWJsZVRvUmVhZCgpLCAoc2l6ZV90KSBrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6Z2V0SW52YWxpZGF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgLy8gVHJ5IHR3aWNlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAgLy8gVE9ETzogaGFuZGxpbmcgb3ZlcmZsb3cgdGhvdWdoIGl0IG1heSBub3QgaGFwcGVuLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKAorICAgICAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgICAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPnJlYWQodGVtcC5kYXRhKCksIGF2YWlsKSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnJlc2VydmUobWVzc2FnZXMuc2l6ZSgpICsgYXZhaWwpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHRlbXAuYmVnaW4oKTsgaXQgIT0gdGVtcC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6QnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpCisgICAgOiBtVmFsaWQodHJ1ZSksCisgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUoCisgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUsIHRydWUpKSB7CisgICAgaWYgKCFtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgfHwgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCitib29sIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpnZXREZXNjKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKipmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+Z2V0RGVzYygpOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6cG9zdEludmFsaWRhdGlvbigKKyAgICAgICAgdWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCkgeworICAgIEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZTsKKworICAgIG1lc3NhZ2UubWVzc2FnZUlkID0gbXNnSWQ7CisgICAgbWVzc2FnZS5mcm9tQnVmZmVySWQgPSBmcm9tSWQ7CisgICAgbWVzc2FnZS50b0J1ZmZlcklkID0gdG9JZDsKKyAgICAvLyBUT0RPOiBoYW5kbGUgZmFpbHVyZSAoaXQgZG9lcyBub3QgaGFwcGVuIG5vcm1hbGx5LikKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPndyaXRlKCZtZXNzYWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjU4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCk7CisKK2Jvb2wgaXNCdWZmZXJJblJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIGJ1ZmZlcgorICogb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBGTVFzIGZyb20gdGhlIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c09ic2VydmVyIHsKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+PgorICAgICAgICAgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlczsKKworcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIC8qKiBDbG9zZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzCisgKiBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YKKyAgICAgKiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlclN0YXR1c0NoYW5uZWwoY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBpbnZhbGlhZGF0aW9uIG1lc3NnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVJZCAgaW52YWxpZGF0aW9uIGFjayB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZGF0aW9uIGlkIGlzIHplcm8sIHRoZSBhY2sgd2lsbCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVkICAgc2V0cyB7QGNvZGUgdHJ1ZX0gb25seSB3aGVuIHRoZSBpbnZhbGlkYXRpb24gYWNrIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIGludmFsaWRhdGlvbgorICogbWVzc2FnZXMgYXJlIHJlY2VpdmVkIHZpYSB0aGUgZm1xIGZyb20gdGhlIGJ1ZmZlciBwb29sLiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgaGFuZGxlZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lciB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBidWZmZXIgaW52YWxpZGF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEludmFsaWRhdGlvbnMoc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIEEgYnVmZmVyIHBvb2wgd2lsbCBzZW5kIGJ1ZmZlcgorICogaW52YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnRzIHZpYSB0aGUgRk1RLiBUaGUgRk1RIGlzIHNoYXJlZCBhbW9uZworICogYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGRlc2NyaXB0b3Igb2YgYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUS4gdGhlIGRlc2NyaXB0b3IgbWF5CisgICAgICogYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gaGFuZGxpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICB2b2lkIGdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpOworCisgICAgLyoqIFBvc3RzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBmb3IgaW52YWxpZGF0ZWQgYnVmZmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2dJZCAgICAgSW52YWxpZGF0aW9uIG1lc3NhZ2UgaWQgd2hpY2ggaXMgdXNlZCB3aGVuIGNsaWVudHMgc2VuZAorICAgICAqICAgICAgICAgICAgICAgICAgYWNrcyBiYWNrIHZpYSBCdWZmZXJTdGF0dXNNZXNzYWdlCisgICAgICogQHBhcmFtIGZyb21JZCAgICBUaGUgc3RhcnQgYnVmZmVyaWQgb2YgdGhlIGludmFsaWRhdGVkIGJ1ZmZlcnMoaW5jbHVzaXZlKQorICAgICAqIEBwYXJhbSB0b0lkICAgICAgVGhlIGVuZCBidWZmZXJJZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICovCisgICAgdm9pZCBwb3N0SW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkLCBCdWZmZXJJZCBmcm9tSWQsIEJ1ZmZlcklkIHRvSWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWQzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVnaXN0ZXJUaW1lb3V0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWMKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiAxIHNlYyB0dW5lCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsaWVudFRpbWVvdXRVcyA9IDUwMDAwMDA7IC8vIFRPRE86IDUgc2VjcyB0dW5lCisKKy8qKgorICogVGhlIGhvbGRlciBvZiB0aGUgY29va2llIG9mIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAqIFRoZSBjb29raWUgaXMgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBmb3IgZWFjaCBJQ2xpZW50TWFuYWdlci4KKyAqIChUaGUgY29va2llIGlzIHVzZWQgdG8gbm90aWZ5IGRlYXRoIG9mIGNsaWVudHMgdG8gYnVmZmVycG9vbCBwcm9jZXNzLikKKyAqLworY2xhc3MgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvb2tpZSBob2xkZXIgZm9yIHJlbW90ZSBJQ2xpZW50TWFuYWdlcihzKS4KKyAgICAgKi8KKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29va2llIGZvciBhIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICogQHBhcmFtIGFkZGVkICAgICB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIG5ld2x5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBJQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBnZXRDb29raWUoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLCBib29sICphZGRlZCk7CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbVNlcUlkOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQ2xpZW50TWFuYWdlcj4sIHVpbnQ2NF90Pj4gbU1hbmFnZXJzOworfTsKKworQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Q2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpIDogbVNlcUlkKDApe30KKwordWludDY0X3QgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Z2V0Q29va2llKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsCisgICAgICAgIGJvb2wgKmFkZGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1NYW5hZ2Vycy5iZWdpbigpOyBpdCAhPSBtTWFuYWdlcnMuZW5kKCk7KSB7CisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiBrZXkgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc0VxdWFsKGtleSwgbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAqYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCA9IG1NYW5hZ2Vycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgaWQgPSBtU2VxSWQrKzsKKyAgICAqYWRkZWQgPSB0cnVlOworICAgIG1NYW5hZ2Vycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobWFuYWdlciwgaWQpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKK2NsYXNzIENsaWVudE1hbmFnZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoKTsKKworICAgIC8vIEJuUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvLyBCcFJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIG11bHRpcGxlIGxvY2tzLAorICAgIC8vIGFsd2F5cyBsb2NrIENsaWVudENhY2hlLmxvY2sgYmVmb3JlIGxvY2tpbmcgQWN0aXZlQ2xpZW50cy5sb2NrLgorICAgIHN0cnVjdCBDbGllbnRDYWNoZSB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUFjY2Vzc29yPiwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25uZWN0Q3Y7CisgICAgICAgIGJvb2wgbUNvbm5lY3Rpbmc7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisKKyAgICAgICAgQ2xpZW50Q2FjaGUoKSA6IG1Db25uZWN0aW5nKGZhbHNlKSwgbUxhc3RDbGVhblVwVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBBY3RpdmUgY2xpZW50cyB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHZpYSBDb25uZWN0aW9uSWQKKyAgICBzdHJ1Y3QgQWN0aXZlQ2xpZW50cyB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgIH0gbUFjdGl2ZTsKKworICAgIHNwPE9ic2VydmVyPiBtT2JzZXJ2ZXI7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpCisgICAgOiBtT2JzZXJ2ZXIobmV3IE9ic2VydmVyKCkpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IsIG1PYnNlcnZlcik7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBUT0RPOiBvYnNlcnZlciBpcyBsb2NhbC4gdXNlIGRpcmVjdCBjYWxsIGluc3RlYWQgb2YgaGlkbCBjYWxsLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICBpZiAoIWNsaWVudCB8fCAhY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFNpbmNlIGEgbmV3IGJ1ZmZlcnBvb2wgaXMgY3JlYXRlZCwgZXZpY3QgbWVtb3JpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAgICAvLyBleGlzdGluZyBidWZmZXJwb29scyBhbmQgY2xpZW50cy4KKyAgICBjbGVhblVwKHRydWUpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbG9zaW5nID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvciB8fCAoYWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKGNBY2Nlc3NvciwgYWNjZXNzb3IpKSkgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NrMi51bmxvY2soKTsKKyAgICAgICAgbG9jazEudW5sb2NrKCk7CisgICAgICAgIGNsb3NpbmctPmZsdXNoKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmZsdXNoKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpOworICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Zmx1c2goY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQwZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVye2J1ZmZlcklkLCBoYW5kbGV9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcnswLCBudWxscHRyfSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6Zmx1c2goKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+Zmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDb25uZWN0aW9uOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIGZvbGxvdy4KKworLy9JQ29ubmVjdGlvbiogSElETF9GRVRDSF9JQ29ubmVjdGlvbihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwNzc0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbm5lY3Rpb24gOiBwdWJsaWMgSUNvbm5lY3Rpb24geworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZXMgYWxsIGJ1ZmZlcnMgd2hpY2ggYXJlIGFjdGl2ZSBhbmQvb3IgYXJlIHJlYWR5IHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gUmVjeWNsZXMgYSBidWZmZXIgaWYKKyAgICAgKiBpdCBpcyBwb3NzaWJsZS4gVGhlIHJldHVybmVkIGJ1ZmZlciBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gb3RoZXIgcmVtb3RlCisgICAgICogY2xpZW50cyhDb25uZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgSWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZSBjbGVhbmluZworICAgICAqIGZyb20gYnVmZmVycG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgYnVmZmVycG9vbCBmcmVlcyBhbGwgYnVmZmVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgY29ubmVjdGlvbi4gKi8KKyAgICB+Q29ubmVjdGlvbigpOworCisgICAgLyoqIENyZWF0ZXMgYSBjb25uZWN0aW9uLiAqLworICAgIENvbm5lY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbCBhbmQgdGhlIGNvbm5lY3Rpb24gaWQuCisgICAgICogVGhlIGNvbm5lY3Rpb24gaWQgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgd2hvbGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yICAgICAgdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBJZC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBTWU5DX0JVRkZFUklEID0gVUlOVDMyX01BWCwKKyAgICB9OworCitwcml2YXRlOgorICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIHNwPEFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyMzE2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk9ic2VydmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworT2JzZXJ2ZXI6Ok9ic2VydmVyKCkgeworfQorCitPYnNlcnZlcjo6fk9ic2VydmVyKCkgeworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gT2JzZXJ2ZXI6Om9uTWVzc2FnZShpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgIG1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjbGllbnQtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgT2JzZXJ2ZXI6OmFkZENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gJndjbGllbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC5sb2NrKCkgfHwgaXQtPmZpcnN0ID09IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgaXQgPSBtQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorICAgIG1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIHdjbGllbnQpKTsKKworfQorCit2b2lkIE9ic2VydmVyOjpkZWxDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmQ3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IE9ic2VydmVyIDogcHVibGljIElPYnNlcnZlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBvbk1lc3NhZ2UoaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkKSBvdmVycmlkZTsKKworICAgIH5PYnNlcnZlcigpOworCisgICAgdm9pZCBhZGRDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+ICZ3Y2xpZW50KTsKKworICAgIHZvaWQgZGVsQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCitwcml2YXRlOgorICAgIE9ic2VydmVyKCk7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7CisKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4gbUNsaWVudHM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTA2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1Vuc3luY2hyb25pemVkV3JpdGU7CisKK3R5cGVkZWYgdWludDMyX3QgQnVmZmVySWQ7Cit0eXBlZGVmIHVpbnQ2NF90IFRyYW5zYWN0aW9uSWQ7Cit0eXBlZGVmIGludDY0X3QgQ29ubmVjdGlvbklkOworCitlbnVtIDogQ29ubmVjdGlvbklkIHsKKyAgICBJTlZBTElEX0NPTk5FQ1RJT05JRCA9IDAsCit9OworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVyU3RhdHVzTWVzc2FnZSwga1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQnVmZmVyU3RhdHVzUXVldWU7Cit0eXBlZGVmIEJ1ZmZlclN0YXR1c1F1ZXVlOjpEZXNjcmlwdG9yIFN0YXR1c0Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlLCBrVW5zeW5jaHJvbml6ZWRXcml0ZT4KKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uUXVldWU7Cit0eXBlZGVmIEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOjpEZXNjcmlwdG9yIEludmFsaWRhdGlvbkRlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTNjMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogRXZpY3RzIGNhY2hlZCBhbGxvY2F0aW9ucy4gSWYgaXQncyBsb2NhbCBjb25uZWN0aW9uLCByZWxlYXNlIHRoZQorICAgICAqIHByZXZpb3VzIGFsbG9jYXRpb25zIGFuZCBkbyBub3QgcmVjeWNsZSBjdXJyZW50IGFjdGl2ZSBhbGxvY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHJlc2V0dGVkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIFRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMl8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgxZGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjY5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2VkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ3MzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBET0NVTUVOVEFUSU9OIEdFTkVSQVRJT04KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0MyX1JPT1QgOj0gJChjYWxsIG15LWRpcikKKworQzJfRE9DU19ST09UIDo9ICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9kb2NzL2NvZGVjMgorCitDMl9PVVRfVEVNUCA6PSAkKFBST0RVQ1RfT1VUKS9nZW4vRVRDL0NvZGVjMi1kb2NzX2ludGVybWVkaWF0ZXMKKworQzJfRE9YWSA6PSAkKG9yICQoc2hlbGwgY29tbWFuZCAtdiBkb3h5Z2VuKSxcCisJCSQoc2hlbGwgY29tbWFuZCAtdiAvQXBwbGljYXRpb25zL0RveHlnZW4uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9kb3h5Z2VuKSkKKworLlBIT05ZOiBjaGVjay1kb3h5Z2VuCitjaGVjay1kb3h5Z2VuOgoraWZuZGVmIEMyX0RPWFkKKwkkKGVycm9yICdkb3h5Z2VuIGlzIG5vdCBhdmFpbGFibGUnKQorZW5kaWYKKworJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwkjIG9ubHkgZG9jdW1lbnQgaW5jbHVkZSBkaXJlY3RvcnksIG5vIGludGVybmFsIHNlY3Rpb25zCisJc2VkICdzL1woXklOUFVUICo9LipcKS9cMWluY2x1ZGVcLy87IFwKKwlzL1woXklOVEVSTkFMX0RPQ1MgKj0gKlwpLiovXDFOTy87IFwKKwlzL1woXkVOQUJMRURfU0VDVElPTlMgKj0uKlwpSU5URVJOQUxcKC4qXCkuKi9cMVwyLzsgXAorCXM6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dDpcMSckKE9VVF9ESVIpJzo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKyQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwlzZWQgJ3M6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dFwoLipcKWFwaTpcMSckKE9VVF9ESVIpJ1wyaW50ZXJuYWw6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCisuUEhPTlk6IGRvY3MtYXBpCitkb2NzLWFwaTogJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEFQSSBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9hcGkKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcKKworLlBIT05ZOiBkb2NzLWludGVybmFsCitkb2NzLWludGVybmFsOiAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBJbnRlcm5hbCBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZworCisuUEhPTlk6IGRvY3MtYWxsCitkb2NzLWFsbDogZG9jcy1hcGkgZG9jcy1pbnRlcm5hbAorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoY2FsbCBteS1kaXIpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNhNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRBYWNEZWMuY3BwIiwKKyAgICAgICAgIkRyY1ByZXNNb2RlV3JhcC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2M4NDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTAsMCArMSw5NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QWFjRGVjLmgiCisKKyNkZWZpbmUgRklMRVJFQURfTUFYX0xBWUVSUyAyCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCAtMTYuMCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCAgICAgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA3MzUwLCA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9OQU1FX1NUUkVBTV9BQUNfRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0KDB1LCBDMkFhY1N0cmVhbUZvcm1hdFJhdykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWFjRm9ybWF0LCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICBDMkFhY1N0cmVhbUZvcm1hdFJhdywgQzJBYWNTdHJlYW1Gb3JtYXRBZHRzCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUFhY0Zvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkFhY1N0cmVhbUZvcm1hdEFkdHM7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIGludDMyX3QgZ2V0RHJjQ29tcHJlc3NNb2RlKCkgY29uc3QgeyByZXR1cm4gbURyY0NvbXByZXNzTW9kZS0+dmFsdWUgPT0gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA/IDEgOiAwOyB9CisgICAgaW50MzJfdCBnZXREcmNUYXJnZXRSZWZMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNFbmNUYXJnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY0VuY1RhcmdldExldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNCb29zdEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNCb29zdEZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNBdHRlbnVhdGlvbkZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNFZmZlY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gbURyY0VmZmVjdFR5cGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiOworCitDMlNvZnRBYWNEZWM6OkMyU29mdEFhY0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQUFDRGVjb2RlcihudWxscHRyKSwKKyAgICAgIG1TdHJlYW1JbmZvKG51bGxwdHIpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIobnVsbHB0cikgeworfQorCitDMlNvZnRBYWNEZWM6On5DMlNvZnRBYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgLy8gVG8gbWFrZSB0aGUgY29kZWMgYmVoYXZlIHRoZSBzYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgYSByZXNldCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZQorICAgIC8vIHN0cmVhbWluZm8gc3RydWN0LiBUaGlzIGRvZXMgdGhhdDoKKyAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7IC8vIFRPRE86IG1TdHJlYW1JbmZvIGlzIHJlYWQgb25seQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQUFDRGVjb2RlcikgeworICAgICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgbUFBQ0RlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIG1BQUNEZWNvZGVyID0gYWFjRGVjb2Rlcl9PcGVuKFRUX01QNF9BRElGLCAvKiBudW0gbGF5ZXJzICovIDEpOworICAgIGlmIChtQUFDRGVjb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1TdHJlYW1JbmZvID0gYWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgaWYgKG1TdHJlYW1JbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICoga051bURlbGF5QmxvY2tzTWF4OworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgc2hvcnRbbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemVdOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworCisgICAgaWYgKG1BQUNEZWNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBQyBkZWNvZGVyIGlzIG51bGwuIFRPRE86IENhbiBub3QgY2FsbCBhYWNEZWNvZGVyX1NldFBhcmFtIGluIHRoZSBmb2xsb3dpbmcgY29kZSIpOworICAgIH0KKworICAgIC8vYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwgMCk7CisKKyAgICAvL2luaXQgRFJDIHdyYXBwZXIKKyAgICBtRHJjV3JhcC5zZXREZWNvZGVySGFuZGxlKG1BQUNEZWNvZGVyKTsKKyAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKworICAgIC8vIGZvciBzdHJlYW1zIHRoYXQgY29udGFpbiBtZXRhZGF0YSwgdXNlIHRoZSBtb2JpbGUgcHJvZmlsZSBEUkMgc2V0dGluZ3MgdW5sZXNzIG92ZXJyaWRkZW4gYnkgcGxhdGZvcm0gcHJvcGVydGllcworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgRFJDIHNldHRpbmdzIGRlcGVuZGluZyBvbiBhdWRpbyBvdXRwdXQgZGV2aWNlIHR5cGUgKEhETUksIGxvYWRzcGVha2VyLCBoZWFkcGhvbmUpCisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCisgICAgaW50MzJfdCB0YXJnZXRSZWZMZXZlbCA9IG1JbnRmLT5nZXREcmNUYXJnZXRSZWZMZXZlbCgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgdGFyZ2V0UmVmTGV2ZWwpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgKHVuc2lnbmVkKXRhcmdldFJlZkxldmVsKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SCisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCAodW5zaWduZWQpYXR0ZW51YXRpb25GYWN0b3IpOworCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgorICAgIGludDMyX3QgYm9vc3RGYWN0b3IgPSBtSW50Zi0+Z2V0RHJjQm9vc3RGYWN0b3IoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIiwgYm9vc3RGYWN0b3IpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgKHVuc2lnbmVkKWJvb3N0RmFjdG9yKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLCAodW5zaWduZWQpY29tcHJlc3NNb2RlKTsKKworICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGludDMyX3QgZW5jVGFyZ2V0TGV2ZWwgPSBtSW50Zi0+Z2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZW5jb2Rlci1zaWRlIERSQyByZWZlcmVuY2UgbGV2ZWwgb2YgJWQiLCBlbmNUYXJnZXRMZXZlbCk7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCAodW5zaWduZWQpZW5jVGFyZ2V0TGV2ZWwpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfU0VUX0VGRkVDVCwgZWZmZWN0VHlwZSk7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVjb2RlciBjcmVhdGVzIGEgNS4xIGNoYW5uZWwgZG93bm1peCBzaWduYWwuCisgICAgLy8gRm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMsIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dAorICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwgbnVtU2FtcGxlcykgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgT1ZFUkZMT1ciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrXSA9IHNhbXBsZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3NdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkICs9IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworCisgICAgaWYgKG51bVNhbXBsZXMgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBVTkRFUlJVTiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArPSBudW1TYW1wbGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkIC09IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK2ludDMyX3QgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSAtIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6OmRyYWluUmluZ0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGJvb2wgZW9zKSB7CisgICAgd2hpbGUgKCFtQnVmZmVyc0luZm8uZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgID49IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgSW5mbyAmb3V0SW5mbyA9IG1CdWZmZXJzSW5mby5mcm9udCgpOworICAgICAgICBBTE9HVigib3V0SW5mby5mcmFtZUluZGV4ID0gJSIgUFJJdTY0LCBvdXRJbmZvLmZyYW1lSW5kZXgpOworICAgICAgICBpbnQgc2FtcGxlc2l6ZSBfX3VudXNlZCA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3V0SW5mby5kZWNvZGVkU2l6ZXMuc2l6ZSgpOworICAgICAgICBpbnQgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gYXZhaWxhYmxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJWQgc2FtcGxlcyBhdmFpbGFibGUgKCVkKSwgb3IgJWQgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzLCBhdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgIEFMT0dWKCJnZXR0aW5nICVkIGZyb20gcmluZ2J1ZmZlciIsIG51bVNhbXBsZXMpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IGZpbGxXb3JrID0KKyAgICAgICAgICAgIFsmYmxvY2ssIG51bVNhbXBsZXMsIHBvb2wsIHRoaXNdKCkKKyAgICAgICAgICAgICAgICAgICAgLT4gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Jik+IHsKKyAgICAgICAgICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLCBjMl9zdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKKyAgICAgICAgICAgICAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX09LKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gZmV0Y2ggYSBsaW5lYXIgYmxvY2sgKCVkKSIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX05PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4od1ZpZXcuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhICZvdXRwdXQgPSB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9KCk7CisKKyAgICAgICAgaWYgKHdvcmsgJiYgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGMyX2NudHI2NF90KG91dEluZm8uZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluaXNoKG91dEluZm8uZnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJSIgUFJJdTY0ICIgLyAldSIsIG91dEluZm8udGltZXN0YW1wLCBibG9jayA/IGJsb2NrLT5jYXBhY2l0eSgpIDogMCk7CisgICAgICAgIG1CdWZmZXJzSW5mby5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFVDSEFSKiBpbkJ1ZmZlcltGSUxFUkVBRF9NQVhfTEFZRVJTXTsKKyAgICBVSU5UIGluQnVmZmVyTGVuZ3RoW0ZJTEVSRUFEX01BWF9MQVlFUlNdID0gezB9OworICAgIFVJTlQgYnl0ZXNWYWxpZFtGSUxFUkVBRF9NQVhfTEFZRVJTXSA9IHswfTsKKworICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IG9mZnNldCA9IDB1OworICAgIHNpemVfdCBzaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBzaXplID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworCisgICAgLy9UT0RPCisjaWYgMAorICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVygiZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIEZMQUdfQ09ERUNfQ09ORklHIHNldCIpOworICAgICAgICBjb2RlY0NvbmZpZyA9IHRydWU7CisgICAgfQorI2VuZGlmCisgICAgaWYgKGNvZGVjQ29uZmlnICYmIHNpemUgPiAwdSkgeworICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfQ29uZmlnUmF3KG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoImFhY0RlY29kZXJfQ29uZmlnUmF3IGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbmZvIGluSW5mbzsKKyAgICBpbkluZm8uZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGluSW5mby50aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgIGluSW5mby5idWZmZXJTaXplID0gc2l6ZTsKKyAgICBpbkluZm8uZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd2hpbGUgKHNpemUgPiAwdSkgeworICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gdmlldy5kYXRhKCkgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQorICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJXp1IGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KGFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBjb25zdF9jYXN0PFVDSEFSICo+KHZpZXcuZGF0YSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQorICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CisKKyAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgIElOVCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIFVJTlQgaW5CdWZmZXJVc2VkTGVuZ3RoID0gaW5CdWZmZXJMZW5ndGhbMF0gLSBieXRlc1ZhbGlkWzBdOworICAgICAgICBzaXplIC09IGluQnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgb2Zmc2V0ICs9IGluQnVmZmVyVXNlZExlbmd0aDsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPAorICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gcmluZ2J1ZmZlciIpOworICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYnVmZmVyCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgZGVjb2RlckVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGZsYWdzICovKTsKKworICAgICAgICAgICAgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlcyAtIG51bUNvbnN1bWVkOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5JbmZvLmRlY29kZWRTaXplcy5wdXNoX2JhY2sobnVtQ29uc3VtZWQpOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ5dGVzVmFsaWRbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc1ZhbGlkWzBdICE9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IG51bU91dEJ5dGVzID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yIDB4JTQuNHgsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQodG1wT3V0QnVmZmVyLCAwLCBudW1PdXRCeXRlcyk7IC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdworCisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIHNpemUgPSAwOworCisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBhbiBlcnJvciwgcmVwbGFjZSBidWZmZXJTaXplIHdpdGggdGhlIHN1bSBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBkZWNvZGVkU2l6ZXMgdG8gcmVzeW5jaHJvbml6ZSB0aGUgaW4vb3V0IGxpc3RzLgorICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMucG9wX2JhY2soKTsKKyAgICAgICAgICAgICAgICBpbkluZm8uYnVmZmVyU2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMuYmVnaW4oKSwgaW5JbmZvLmRlY29kZWRTaXplcy5lbmQoKSwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQorICAgICAgICAgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAorICAgICAgICAgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIW1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlIHx8ICFtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiAoKG1JbnB1dEJ1ZmZlckNvdW50ID4gMikgJiYgKG1PdXRwdXRCdWZmZXJDb3VudCA8PSAxKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW52YWxpZCBBQUMgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2TnVtQ2hhbm5lbHMsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgYWx0ZXJlZCBkdXJpbmcgY29uZmlnLgorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICB9IHdoaWxlIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spOworICAgIH0KKworICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICBtQnVmZmVyc0luZm8ucHVzaF9iYWNrKHN0ZDo6bW92ZShpbkluZm8pKTsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIGlmICghZW9zICYmIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIDwgb3V0cHV0RGVsYXkpIHsKKyAgICAgICAgLy8gZGlzY2FyZCBvdXRwdXREZWxheSBhdCB0aGUgYmVnaW5uaW5nCisgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICBpZiAoZGlzY2FyZCA+IHRvQ29tcGVuc2F0ZSkgeworICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGRpc2NhcmRlZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgZGlzY2FyZCk7CisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBmYWxzZSAvKiBub3QgRU9TICovKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBib29sIGVvcyA9IChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKworICAgIGRyYWluRGVjb2RlcigpOworICAgIGRyYWluUmluZ0J1ZmZlcih3b3JrLCBwb29sLCBlb3MpOworCisgICAgaWYgKGVvcykgeworICAgICAgICBhdXRvIGZpbGxFbXB0eVdvcmsgPSBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgfTsKKyAgICAgICAgd2hpbGUgKG1CdWZmZXJzSW5mby5zaXplKCkgPiAxdSkgeworICAgICAgICAgICAgZmluaXNoKG1CdWZmZXJzSW5mby5mcm9udCgpLmZyYW1lSW5kZXgsIGZpbGxFbXB0eVdvcmspOworICAgICAgICAgICAgbUJ1ZmZlcnNJbmZvLnBvcF9mcm9udCgpOworICAgICAgICB9CisgICAgICAgIGlmICh3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGRyYWluRGVjb2RlcigpOworICAgIG1CdWZmZXJzSW5mby5jbGVhcigpOworCisgICAgaW50IGF2YWlsOworICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgeworICAgICAgICBpZiAoYXZhaWwgPiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBhdmFpbCA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMobnVsbHB0ciwgYXZhaWwpOworICAgICAgICBpZiAobnMgIT0gYXZhaWwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpkcmFpbkRlY29kZXIoKSB7CisgICAgLy8gZmx1c2ggZGVjb2RlciB1bnRpbCBvdXRwdXREZWxheSBpcyBjb21wZW5zYXRlZAorICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0QWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1YzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFhY0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtRGVsYXlCbG9ja3NNYXggICAgICA9IDgsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtQUFDRGVjb2RlcjsKKyAgICBDU3RyZWFtSW5mbyAqbVN0cmVhbUluZm87CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXA7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlY29kZWRTaXplczsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxJbmZvPiBtQnVmZmVyc0luZm87CisKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyIG1EcmNXcmFwOworCisgICAgZW51bSB7CisgICAgICAgIE5PTkUsCisgICAgICAgIEFXQUlUSU5HX0RJU0FCTEVELAorICAgICAgICBBV0FJVElOR19FTkFCTEVECisgICAgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOworCisgICAgdm9pZCBpbml0UG9ydHMoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7CisgICAgdm9pZCBkcmFpbkRlY29kZXIoKTsKKworICAgIHZvaWQgZHJhaW5SaW5nQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgYm9vbCBlb3MpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlZmJkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwCkBAIC0wLDAgKzEsNjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBYWNFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDYpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhCdWZTaXplQ2FsY3VsYXRvciwgbUNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhCdWZTaXplQ2FsY3VsYXRvcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiAmY2hhbm5lbENvdW50KSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDEwMjQgKiBzaXplb2Yoc2hvcnQpICogY2hhbm5lbENvdW50LnYudmFsdWU7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworfTsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIjsKKworQzJTb2Z0QWFjRW5jOjpDMlNvZnRBYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFBQ0VuY29kZXIobnVsbHB0ciksCisgICAgICBtU0JSTW9kZSgtMSksCisgICAgICBtU0JSUmF0aW8oMCksCisgICAgICBtQUFDUHJvZmlsZShBT1RfQUFDX0xDKSwKKyAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUoMHUpLAorICAgICAgbU91dEJ1ZmZlclNpemUoMHUpLAorICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCisgICAgICBtSW5wdXRTaXplKDApLAorICAgICAgbUlucHV0VGltZVVzKC0xbGwpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRJbmRleCgwdSkgeworfQorCitDMlNvZnRBYWNFbmM6On5DMlNvZnRBYWNFbmMoKSB7CisgICAgb25SZXNldCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY09wZW4oJm1BQUNFbmNvZGVyLCAwLCAwKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgQUFDIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBzZXRBdWRpb1BhcmFtcygpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIG1JbnB1dFRpbWVVcyA9IC0xbGw7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBhYWNFbmNDbG9zZSgmbUFBQ0VuY29kZXIpOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6b25SZWxlYXNlKCkgeworICAgIC8vIG5vLW9wCit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIENIQU5ORUxfTU9ERSBnZXRDaGFubmVsTW9kZSh1aW50MzJfdCBuQ2hhbm5lbHMpIHsKKyAgICBDSEFOTkVMX01PREUgY2hNb2RlID0gTU9ERV9JTlZBTElEOworICAgIHN3aXRjaCAobkNoYW5uZWxzKSB7CisgICAgICAgIGNhc2UgMTogY2hNb2RlID0gTU9ERV8xOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBjaE1vZGUgPSBNT0RFXzI7IGJyZWFrOworICAgICAgICBjYXNlIDM6IGNoTW9kZSA9IE1PREVfMV8yOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiBjaE1vZGUgPSBNT0RFXzFfMl8xOyBicmVhazsKKyAgICAgICAgY2FzZSA1OiBjaE1vZGUgPSBNT0RFXzFfMl8yOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiBjaE1vZGUgPSBNT0RFXzFfMl8yXzE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiBjaE1vZGU7Cit9CisKKy8vc3RhdGljIEFVRElPX09CSkVDVF9UWVBFIGdldEFPVEZyb21Qcm9maWxlKE9NWF9VMzIgcHJvZmlsZSkgeworLy8gICAgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdExDKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9BQUNfTEM7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEhFKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9TQlI7CisvLyAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEhFX1BTKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9QUzsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0TEQpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX0VSX0FBQ19MRDsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKSB7CisvLyAgICAgICAgcmV0dXJuIEFPVF9FUl9BQUNfRUxEOworLy8gICAgfSBlbHNlIHsKKy8vICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgQUFDIHByb2ZpbGUgLSBkZWZhdWx0aW5nIHRvIEFBQy1MQyIpOworLy8gICAgICAgIHJldHVybiBBT1RfQUFDX0xDOworLy8gICAgfQorLy99CisKK3N0YXR1c190IEMyU29mdEFhY0VuYzo6c2V0QXVkaW9QYXJhbXMoKSB7CisgICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHJhdGUgb3IgU0JSIG1vZGUgY2hhbmdlCisgICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCisKKyAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzLCAlaSBzYnIgbW9kZSwgJWkgc2JyIHJhdGlvIiwKKyAgICAgICAgIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCksIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldEJpdHJhdGUoKSwgbVNCUk1vZGUsIG1TQlJSYXRpbyk7CisKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19BT1QsIG1BQUNQcm9maWxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIG1JbnRmLT5nZXRCaXRyYXRlKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLAorICAgICAgICAgICAgZ2V0Q2hhbm5lbE1vZGUobUludGYtPmdldENoYW5uZWxDb3VudCgpKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfVFJBTlNNVVgsIFRUX01QNF9SQVcpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TQlJNb2RlICE9IC0xICYmIG1BQUNQcm9maWxlID09IEFPVF9FUl9BQUNfRUxEKSB7CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9NT0RFLCBtU0JSTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU0JSIHJhdGlvIHBhcmFtZXRlciBjb25maWd1cmF0aW9uczoKKyAgICAgICAwOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlcmVpbiBTQlIgcmF0aW8gaXMgY29uZmlndXJlZCBkZXBlbmRpbmcgb24gYXVkaW8gb2JqZWN0IHR5cGUgYnkKKyAgICAgICAgICB0aGUgRkRLLgorICAgICAgIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKQorICAgICAgIDI6IER1YWxyYXRlIFNCUiAoZGVmYXVsdCBmb3IgSEUtQUFDKQorICAgICAqLworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9SQVRJTywgbVNCUlJhdGlvKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworCisgICAgaWYgKCFtU2VudENvZGVjU3BlY2lmaWNEYXRhKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYworICAgICAgICAvLyBkYXRhLgorCisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGVuY29kZXIgZm9yIHByb2ZpbGUgLyBzYW1wbGUtcmF0ZSAvIGJpdC1yYXRlIC8gY2hhbm5lbHMiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGUoKTsKKyAgICAgICAgdWludDMyX3QgYWN0dWFsQml0UmF0ZSA9IGFhY0VuY29kZXJfR2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFKTsKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gYWN0dWFsQml0UmF0ZSkgeworICAgICAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBiaXRyYXRlICV1IHVuc3VwcG9ydGVkLCB1c2luZyAldSIsIGJpdHJhdGUsIGFjdHVhbEJpdFJhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgZW5jSW5mbzsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNJbmZvKG1BQUNFbmNvZGVyLCAmZW5jSW5mbykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IEFBQyBlbmNvZGVyIGluZm8iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUNzZEluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoZW5jSW5mby5jb25mU2l6ZSwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBlbmNJbmZvLmNvbmZCdWYsIGVuY0luZm8uY29uZlNpemUpOworICAgICAgICBBTE9HVigicHV0IGNzZCIpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgaGV4ZHVtcChjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworI2VuZGlmCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBtT3V0QnVmZmVyU2l6ZSA9IGVuY0luZm8ubWF4T3V0QnVmQnl0ZXM7CisgICAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUgPSBlbmNJbmZvLmZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKworICAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90IHRlbXBbMV07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHRlbXA7CisgICAgc2l6ZV90IGNhcGFjaXR5ID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBkYXRhID0gdmlldy5kYXRhKCk7CisgICAgICAgIGNhcGFjaXR5ID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKworICAgIHNpemVfdCBudW1GcmFtZXMgPSAoY2FwYWNpdHkgKyBtSW5wdXRTaXplICsgKGVvcyA/IG1OdW1CeXRlc1BlcklucHV0RnJhbWUgLSAxIDogMCkpCisgICAgICAgICAgICAvIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgQUxPR1YoImNhcGFjaXR5ID0gJXp1OyBtSW5wdXRTaXplID0gJXp1OyBudW1GcmFtZXMgPSAlenUgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9ICV1IiwKKyAgICAgICAgICBjYXBhY2l0eSwgbUlucHV0U2l6ZSwgbnVtRnJhbWVzLCBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXcml0ZVZpZXc+IHdWaWV3OworICAgIHVpbnQ4X3QgKm91dFB0ciA9IHRlbXA7CisgICAgc2l6ZV90IG91dEF2YWlsYWJsZSA9IDB1OworICAgIHVpbnQ2NF90IGlucHV0SW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKworICAgIEFBQ0VOQ19JbkFyZ3MgaW5hcmdzOworICAgIEFBQ0VOQ19PdXRBcmdzIG91dGFyZ3M7CisgICAgbWVtc2V0KCZpbmFyZ3MsIDAsIHNpemVvZihpbmFyZ3MpKTsKKyAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCogaW5CdWZmZXJbXSAgICAgICAgPSB7ICh1bnNpZ25lZCBjaGFyICopZGF0YSB9OworICAgIElOVCAgIGluQnVmZmVySWRzW10gICAgID0geyBJTl9BVURJT19EQVRBIH07CisgICAgSU5UICAgaW5CdWZmZXJTaXplW10gICAgPSB7IChJTlQpY2FwYWNpdHkgfTsKKyAgICBJTlQgICBpbkJ1ZmZlckVsU2l6ZVtdICA9IHsgc2l6ZW9mKGludDE2X3QpIH07CisKKyAgICBBQUNFTkNfQnVmRGVzYyBpbkJ1ZkRlc2M7CisgICAgaW5CdWZEZXNjLm51bUJ1ZnMgICAgICAgICAgID0gc2l6ZW9mKGluQnVmZmVyKSAvIHNpemVvZih2b2lkKik7CisgICAgaW5CdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmaW5CdWZmZXI7CisgICAgaW5CdWZEZXNjLmJ1ZmZlcklkZW50aWZpZXJzID0gaW5CdWZmZXJJZHM7CisgICAgaW5CdWZEZXNjLmJ1ZlNpemVzICAgICAgICAgID0gaW5CdWZmZXJTaXplOworICAgIGluQnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IGluQnVmZmVyRWxTaXplOworCisgICAgdm9pZCogb3V0QnVmZmVyW10gICAgICAgPSB7IG91dFB0ciB9OworICAgIElOVCAgIG91dEJ1ZmZlcklkc1tdICAgID0geyBPVVRfQklUU1RSRUFNX0RBVEEgfTsKKyAgICBJTlQgICBvdXRCdWZmZXJTaXplW10gICA9IHsgMCB9OworICAgIElOVCAgIG91dEJ1ZmZlckVsU2l6ZVtdID0geyBzaXplb2YoVUNIQVIpIH07CisKKyAgICBBQUNFTkNfQnVmRGVzYyBvdXRCdWZEZXNjOworICAgIG91dEJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2Yob3V0QnVmZmVyKSAvIHNpemVvZih2b2lkKik7CisgICAgb3V0QnVmRGVzYy5idWZzICAgICAgICAgICAgICA9ICh2b2lkKiopJm91dEJ1ZmZlcjsKKyAgICBvdXRCdWZEZXNjLmJ1ZmZlcklkZW50aWZpZXJzID0gb3V0QnVmZmVySWRzOworICAgIG91dEJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBvdXRCdWZmZXJTaXplOworICAgIG91dEJ1ZkRlc2MuYnVmRWxTaXplcyAgICAgICAgPSBvdXRCdWZmZXJFbFNpemU7CisKKyAgICBBQUNFTkNfRVJST1IgZW5jb2RlckVyciA9IEFBQ0VOQ19PSzsKKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIH0KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICB3aGlsZSAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0sgJiYgaW5hcmdzLm51bUluU2FtcGxlcyA+IDApIHsKKyAgICAgICAgaWYgKG51bUZyYW1lcyAmJiAhYmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3Vmlldy5yZXNldChuZXcgQzJXcml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKSk7CisgICAgICAgICAgICBvdXRQdHIgPSB3Vmlldy0+ZGF0YSgpOworICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gd1ZpZXctPnNpemUoKTsKKyAgICAgICAgICAgIC0tbnVtRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZvdXRhcmdzLCAwLCBzaXplb2Yob3V0YXJncykpOworCisgICAgICAgIG91dEJ1ZmZlclswXSA9IG91dFB0cjsKKyAgICAgICAgb3V0QnVmZmVyU2l6ZVswXSA9IG91dEF2YWlsYWJsZTsKKworICAgICAgICBlbmNvZGVyRXJyID0gYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YXJncyk7CisKKyAgICAgICAgaWYgKGVuY29kZXJFcnIgPT0gQUFDRU5DX09LKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtSW5wdXRUaW1lVXM7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtT3V0Qnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGNvbnN1bWVkID0gKChjYXBhY2l0eSAvIHNpemVvZihpbnQxNl90KSkgLSBpbmFyZ3MubnVtSW5TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoY29uc3VtZWQgKiAxMDAwMDAwbGwgLyBjaGFubmVsQ291bnQgLyBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dGFyZ3MubnVtT3V0Qnl0ZXMpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgICAgICAgICBoZXhkdW1wKG91dFB0ciwgc3RkOjptaW4ob3V0YXJncy5udW1PdXRCeXRlcywgMjU2KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvdXRQdHIgPSB0ZW1wOworICAgICAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSArPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKGludDE2X3QgKilpbkJ1ZmZlclswXSArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSAtPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJlbmNvZGVyRXJyID0gJWQgbUlucHV0U2l6ZSA9ICV6dSBpbmFyZ3MubnVtSW5TYW1wbGVzID0gJWQsIG1JbnB1dFRpbWVVcyA9ICVsbGQiLAorICAgICAgICAgICAgICBlbmNvZGVyRXJyLCBtSW5wdXRTaXplLCBpbmFyZ3MubnVtSW5TYW1wbGVzLCBtSW5wdXRUaW1lVXMucGVla2xsKCkpOworICAgIH0KKworICAgIGlmIChlb3MgJiYgaW5CdWZmZXJTaXplWzBdID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIC8vIEZsdXNoCisgICAgICAgIGluYXJncy5udW1JblNhbXBsZXMgPSAtMTsKKworICAgICAgICAodm9pZClhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworICAgIH0KKworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUlucHV0VGltZVVzOworICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZW9zID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDApLAorICAgICAgICAgICAgIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgKHZvaWQpcG9vbDsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworCisgICAgLy8gVE9ETzogd2UgZG9uJ3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrIGF0IHRoaXMgdGltZSB0byBkcmFpbi4KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QWFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmI0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJhYWNlbmNfbGliLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QWFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIEhBTkRMRV9BQUNFTkNPREVSIG1BQUNFbmNvZGVyOworCisgICAgaW50MzJfdCBtU0JSTW9kZTsKKyAgICBpbnQzMl90IG1TQlJSYXRpbzsKKyAgICBBVURJT19PQkpFQ1RfVFlQRSBtQUFDUHJvZmlsZTsKKyAgICBVSU5UIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgVUlOVCBtT3V0QnVmZmVyU2l6ZTsKKworICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKKyAgICBzaXplX3QgbUlucHV0U2l6ZTsKKyAgICBjMl9jbnRyNjRfdCBtSW5wdXRUaW1lVXM7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9QYXJhbXMoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWFlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEcmNXcmFwcGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisKKyNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNDAKKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworCisgICAgLyogRGF0YSBmcm9tIHN0cmVhbUluZm8uICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1TdHJlYW1QUkwgPSAtMTsKKyAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSAtMTsKKyAgICBtU3RyZWFtTnJBQUNDaGFuID0gMDsKKyAgICBtU3RyZWFtTnJPdXRDaGFuID0gMDsKKworICAgIC8qIERlc2lyZWQgdmFsdWVzIChzZXQgYnkgdXNlcikuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1EZXNUYXJnZXQgPSAtMTsKKyAgICBtRGVzQXR0RmFjdG9yID0gMDsKKyAgICBtRGVzQm9vc3RGYWN0b3IgPSAwOworICAgIG1EZXNIZWF2eSA9IDA7CisKKyAgICBtRW5jb2RlclRhcmdldCA9IC0xOworCisgICAgLyogVmFsdWVzIGZyb20gbGFzdCB0aW1lLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgZGVzaXJlZCB2YWx1ZXMgKi8KKyAgICBtTGFzdFRhcmdldCA9IC0xOworICAgIG1MYXN0QXR0RmFjdG9yID0gMDsKKyAgICBtTGFzdEJvb3N0RmFjdG9yID0gMDsKKyAgICBtTGFzdEhlYXZ5ID0gMDsKK30KKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6fkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSkKK3sKKyAgICBtSGFuZGxlRGVjb2RlciA9IGhhbmRsZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyogcFN0cmVhbUluZm8pCit7CisgICAgYXNzZXJ0KHBTdHJlYW1JbmZvKTsKKworICAgIGlmIChtU3RyZWFtUFJMICE9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2KSB7CisgICAgICAgIG1TdHJlYW1QUkwgPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldjsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1Byb2dSZWZMZXYgaXMgJWRcbiIsIG1TdHJlYW1QUkwpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1EUkNQcmVzTW9kZSAhPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUpIHsKKyAgICAgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJlc01vZGUgaXMgJWRcbiIsIG1TdHJlYW1EUkNQcmVzTW9kZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiAhPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGFhY051bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJBQUNDaGFuKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuICE9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJPdXRDaGFuID0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogbnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1Ock91dENoYW4pOworI2VuZGlmCisgICAgfQorCisKKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuPG1TdHJlYW1OckFBQ0NoYW4pIHsKKyAgICAgICAgbUlzRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIChtU3RyZWFtTnJPdXRDaGFuID09IDEpKSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIG1TdHJlYW1Ock91dENoYW4gPT0gMil7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUOgorICAgICAgICBtRGVzVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0F0dEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0Jvb3N0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlk6CisgICAgICAgIG1EZXNIZWF2eSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVDoKKyAgICAgICAgbUVuY29kZXJUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6dXBkYXRlKCkKK3sKKyAgICAvLyBHZXQgRGF0YSBmcm9tIERlY29kZXIKKyAgICBpbnQgcHJvZ1JlZkxldmVsID0gbVN0cmVhbVBSTDsKKyAgICBpbnQgZHJjUHJlc01vZGUgPSBtU3RyZWFtRFJDUHJlc01vZGU7CisKKyAgICAvLyBieSBkZWZhdWx0LCBkbyBhcyBkZXNpcmVkCisgICAgaW50IG5ld1RhcmdldCAgICAgICAgID0gbURlc1RhcmdldDsKKyAgICBpbnQgbmV3QXR0RmFjdG9yICAgICAgPSBtRGVzQXR0RmFjdG9yOworICAgIGludCBuZXdCb29zdEZhY3RvciAgICA9IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbmV3SGVhdnkgICAgICAgICAgPSBtRGVzSGVhdnk7CisKKyAgICBpZiAobURhdGFVcGRhdGUpIHsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7CisgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTAgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZywgY2FsY3VsYXRlZCBzY2FsaW5nIG9mIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYXMgbGl0dGxlIGNvbXByZXNzaW9uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0IDwgbURlc1RhcmdldCkgeyAvLyBpZiBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGNGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FsY0ZhY3Rvcl9ub3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAuMGYgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3Rvcl9ub3JtID0gKGZsb2F0KShtRGVzVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1FbmNvZGVyVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yID0gKGludCkoY2FsY0ZhY3Rvcl9ub3JtKjEyNy4wZik7IC8vIDAgPD0gY2FsY0ZhY3RvciA8IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGNGYWN0b3IgaXMgdGhlIGxvd2VyIGxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gKGNhbGNGYWN0b3I+bmV3QXR0RmFjdG9yKSA/IGNhbGNGYWN0b3IgOiBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEF0dEZhY3RvciB3aWxsIGJlIGFsd2F5cyA9IGNhbGNGYWN0b3IsIGFzIGl0IGlzIHNldCB0byAwIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGxldmVsID4gbUVuY29kZXJUYXJnZXQgPiBQUkwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0PDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQjogbGlnaHQgRFJDIG9ubHkgbmVlZGVkIGlmIHdlIHBlcmZvcm0gZG93bm1peGluZworICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKKyAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZHJjUHJlc01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7IC8vIGF0IGxlYXN0LCB1c2UgbGlnaHQgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldCA8IDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUHJlc2VudGF0aW9uIG1vZGUgMSBhbmQgMiBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0OgorICAgICAgICAgICAgLy8gRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgKERWQik7IFNwZWNpZmljYXRpb24gZm9yIHRoZSB1c2Ugb2YgVmlkZW8gYW5kIEF1ZGlvIENvZGluZworICAgICAgICAgICAgLy8gaW4gQnJvYWRjYXN0aW5nIEFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0sCisgICAgICAgICAgICAvLyBzZWN0aW9uIEMuNS40LiwgIkRlY29kaW5nIiwgYW5kIFRhYmxlIEMuMzMKKyAgICAgICAgICAgIC8vIElTTyBEUkMgICAgICAgICAgICAtPiBuZXdIZWF2eSA9IDAgIChVc2UgbGlnaHQgY29tcHJlc3Npb24sIE1QRUctc3R5bGUpCisgICAgICAgICAgICAvLyBDb21wcmVzc2lvbl92YWx1ZSAgLT4gbmV3SGVhdnkgPSAxICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpCisgICAgICAgICAgICAvLyBzY2FsaW5nIHJlc3RyaWN0ZWQgLT4gbmV3QXR0RmFjdG9yID0gMTI3CisKKyAgICAgICAgICAgIGNhc2UgMTogLy8gcHJlc2VudGF0aW9uIG1vZGUgMSwgTGlnaHQ6LTMxL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDIsIExpZ2h0Oi0yMy9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNb25vRG93bm1peCkgeyAvLyBpZiBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKKyAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKKworICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKKyAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKKyAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVjb2RlcgorICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1MYXN0VGFyZ2V0KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIG1MYXN0VGFyZ2V0ID0gbmV3VGFyZ2V0OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtRGVzVGFyZ2V0KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIHRhcmdldCBsZXZlbCB0byAlZCAoZnJvbSAlZClcbiIsIG5ld1RhcmdldCwgbURlc1RhcmdldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgdGFyZ2V0IGxldmVsIHRvICVkXG4iLCBuZXdUYXJnZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1MYXN0QXR0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgbmV3QXR0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtRGVzQXR0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGF0dGVudWF0aW9uIGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsIG5ld0F0dEZhY3RvciwgbURlc0F0dEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkXG4iLCBuZXdBdHRGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbUxhc3RCb29zdEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIG5ld0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSBuZXdCb29zdEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtRGVzQm9vc3RGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYm9vc3QgZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yLCBtRGVzQm9vc3RGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGJvb3N0IGZhY3RvciB0byAlZFxuIiwgbmV3Qm9vc3RGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3SGVhdnkgIT0gbUxhc3RIZWF2eSkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgbmV3SGVhdnkpOworICAgICAgICAgICAgbUxhc3RIZWF2eSA9IG5ld0hlYXZ5OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1EZXNIZWF2eSkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSwgbURlc0hlYXZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZFxuIiwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIGNvbmZpZzogdGd0X2xldjogJTNkLCBjdXQ6ICUzZCwgYm9vc3Q6ICUzZCwgaGVhdnk6ICVkXG4iLCBuZXdUYXJnZXQsCisgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yLCBuZXdCb29zdEZhY3RvciwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIG1EYXRhVXBkYXRlID0gZmFsc2U7CisKKyAgICB9IC8vIGlmIChtRGF0YVVwZGF0ZSkKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUICAgICAgICAgPSAweDAwMDAsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiAgICAgPSAweDAwMDEsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SICAgPSAweDAwMDIsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkgICAgICAgICAgPSAweDAwMDMsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUICAgICAgICAgPSAweDAwMDQKK30gRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNOworCisKK2NsYXNzIENEcmNQcmVzTW9kZVdyYXBwZXIgeworcHVibGljOgorICAgIENEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB+Q0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIHZvaWQgc2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpOworICAgIHZvaWQgc2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpOworICAgIHZvaWQgc3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyopOworICAgIHZvaWQgdXBkYXRlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtSGFuZGxlRGVjb2RlcjsKKyAgICBpbnQgbURlc1RhcmdldDsKKyAgICBpbnQgbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBtRGVzSGVhdnk7CisKKyAgICBpbnQgbUVuY29kZXJUYXJnZXQ7CisKKyAgICBpbnQgbUxhc3RUYXJnZXQ7CisgICAgaW50IG1MYXN0QXR0RmFjdG9yOworICAgIGludCBtTGFzdEJvb3N0RmFjdG9yOworICAgIGludCBtTGFzdEhlYXZ5OworCisgICAgU0NIQVIgbVN0cmVhbVBSTDsKKyAgICBTQ0hBUiBtU3RyZWFtRFJDUHJlc01vZGU7CisgICAgSU5UIG1TdHJlYW1OckFBQ0NoYW47CisgICAgSU5UIG1TdHJlYW1Ock91dENoYW47CisKKyAgICBib29sIG1Jc0Rvd25taXg7CisgICAgYm9vbCBtSXNNb25vRG93bm1peDsKKyAgICBib29sIG1Jc1N0ZXJlb0Rvd25taXg7CisKKyAgICBib29sIG1EYXRhVXBkYXRlOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNWJjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTVJOQiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtck5iRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yV2JFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5MWUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIEFNUk5CCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRGVjIgorI2Vsc2UKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yV2JEZWMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yRGVjLmgiCisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIEFNUk5CCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIjsKKyNlbHNlCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRBbXJEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCisjZW5kaWYKKyAgICAgICAgICAgICAgICApKS5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJEZWM6OkMyU29mdEFtckRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQW1ySGFuZGxlKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0ciksCisgICAgICBtRGVjb2RlckNvb2tpZShudWxscHRyKSB7CisjaWZkZWYgQU1STkIKKyAgICBtSXNXaWRlID0gZmFsc2U7CisjZWxzZQorICAgIG1Jc1dpZGUgPSB0cnVlOworI2VuZGlmCit9CisKK0MyU29mdEFtckRlYzo6fkMyU29mdEFtckRlYygpIHsKKyAgICAodm9pZClvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25TdG9wKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1BbXJIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChtQW1ySGFuZGxlKSB7CisgICAgICAgICAgICBHU01EZWNvZGVGcmFtZUV4aXQoJm1BbXJIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1BbXJIYW5kbGUgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgbURlY29kZXJDb29raWUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgaWYgKEdTTUluaXREZWNvZGUoJm1BbXJIYW5kbGUsIChpbnQ4X3QgKikiQU1STkJEZWNvZGVyIikpCisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBtZW1SZXEgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxKTsKKyAgICAgICAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmbUFtckhhbmRsZSwgbURlY29kZXJCdWYsICZtRGVjb2RlckNvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZNKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplTkJbMTZdID0geworICAgICAgICAxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzEsCisgICAgICAgIDUsIDYsIDUsIDUsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVTaXplV0JbMTZdID0geworICAgICAgICAxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsIDYwLAorICAgICAgICA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwLCAvLyBzcGVlY2ggbG9zdAorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworCisgICAgaWYgKEZNID4gMTUgfHwgKGlzV2lkZSAmJiBGTSA+IDkgJiYgRk0gPCAxNCkgfHwgKCFpc1dpZGUgJiYgRk0gPiAxMSAmJiBGTSA8IDE1KSkgeworICAgICAgICBBTE9HRSgiaWxsZWdhbCBBTVIgZnJhbWUgbW9kZSAlZCIsIEZNKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFkZCAxIGZvciBoZWFkZXIgYnl0ZQorICAgIHJldHVybiAoaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZNXSA6IGtGcmFtZVNpemVOQltGTV0pICsgMTsKK30KKworc3RhdGljIHN0YXR1c190IGNhbGN1bGF0ZU51bUZyYW1lcyhjb25zdCB1aW50OCAqaW5wdXQsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gKmZyYW1lU2l6ZUxpc3QsIGJvb2wgaXNXaWRlKSB7CisgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBpblNpemU7KSB7CisgICAgICAgIGludDE2X3QgRk0gPSAoKGlucHV0WzBdID4+IDMpICYgMHgwZik7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGTSk7CisgICAgICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpblNpemUgLSBrKSA+PSBmcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGlucHV0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGsgKz0gZnJhbWVTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgYnJlYWs7CisgICAgICAgIGZyYW1lU2l6ZUxpc3QtPnB1c2hfYmFjayhmcmFtZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBmcmFtZVNpemVMaXN0OworICAgIGlmIChPSyAhPSBjYWxjdWxhdGVOdW1GcmFtZXMoclZpZXcuZGF0YSgpICsgaW5PZmZzZXQsIGluU2l6ZSwgJmZyYW1lU2l6ZUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZyYW1lU2l6ZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgc2l6ZSBzbWFsbGVyIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCBvdXRTYW1wbGVzID0gbUlzV2lkZSA/IGtOdW1TYW1wbGVzUGVyRnJhbWVXQiA6IGtOdW1TYW1wbGVzUGVyRnJhbWVOQjsKKyAgICBzaXplX3QgY2FsT3V0U2l6ZSA9IG91dFNhbXBsZXMgKiBmcmFtZVNpemVMaXN0LnNpemUoKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FsT3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICBhdXRvIGl0ID0gZnJhbWVTaXplTGlzdC5iZWdpbigpOworICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGZyYW1lU2l6ZUxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHRyYWlsaW5nIGJ5dGVzLCBpZ25vcmluZyB0aGVtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgaW50MTZfdCBGTSA9ICgoKmlucHV0ID4+IDMpICYgMHgwZik7CisgICAgICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlc1JlYWQgPSBBTVJEZWNvZGUobUFtckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGcmFtZV9UeXBlXzNHUFApIEZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgKyAxLCBvdXRwdXQsIE1JTUVfSUVURik7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1CeXRlc1JlYWQgKyAxKSAhPSAqaXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicGFuaWMsIHBhcnNlZCBzaXplIGRvZXMgbm90IG1hdGNoIGRlY29kZWQgc2l6ZSIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChGTSA+PSA5KSB7CisgICAgICAgICAgICAgICAgLy8gUHJvZHVjZSBzaWxlbmNlIGluc3RlYWQgb2YgY29tZm9ydCBub2lzZSBhbmQgZm9yCisgICAgICAgICAgICAgICAgLy8gc3BlZWNoIGxvc3Qvbm8gZGF0YS4KKyAgICAgICAgICAgICAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRTYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50MTZfdCBGVDsKKyAgICAgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBpbnQxNl90IG51bVJlY1NhbXBsZXM7CisKKyAgICAgICAgICAgICAgICBtaW1lX3Vuc29ydGluZyhjb25zdF9jYXN0PHVpbnQ4X3QgKj4oJmlucHV0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRTYW1wbGVCdWZmZXIsICZGVCwgJkZNLCAxLCAmcnhfc3RhdGUpOworICAgICAgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYihGTSwgbUlucHV0U2FtcGxlQnVmZmVyLCBvdXRwdXQsICZudW1SZWNTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RlckJ1ZiwgRlQsIG1EZWNvZGVyQ29va2llKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtUmVjU2FtcGxlcyAhPSBvdXRTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgb3V0cHV0IHBlciBmcmFtZSBpbmNvcnJlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0aGUgMiBMU0JzICgxNC1iaXQgb3V0cHV0KSAqLworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVjU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFtpXSAmPSAweGZmZkM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluUG9zICs9ICppdDsKKyAgICAgICAgb3V0cHV0ICs9IG91dFNhbXBsZXM7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBTVJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QU1SRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEFtckRlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtckRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBTVJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBTVJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEFtckRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBbXJEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZU5CICAgPSAxNjAsCisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVXQiAgID0gMzIwLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQgKm1BbXJIYW5kbGU7CisgICAgdm9pZCAqbURlY29kZXJCdWY7CisgICAgaW50MTZfdCAqbURlY29kZXJDb29raWU7CisKKyAgICBpbnQxNl90IG1JbnB1dFNhbXBsZUJ1ZmZlcls0NzddOworCisgICAgYm9vbCBtSXNXaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyMTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJOYkVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNDc1MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDc1MCwgMTIyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJOYkVuYzo6QzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNTdGF0ZShudWxscHRyKSwKKyAgICAgIG1TaWRTdGF0ZShudWxscHRyKSB7Cit9CisKK0MyU29mdEFtck5iRW5jOjp+QzJTb2Z0QW1yTmJFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkluaXQoKSB7CisgICAgYm9vbCBkdHhfZW5hYmxlID0gZmFsc2U7CisKKyAgICBpZiAoQU1SRW5jb2RlSW5pdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlLCBkdHhfZW5hYmxlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA0NzUwOiBtTW9kZSA9IE1SNDc1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE1MDogbU1vZGUgPSBNUjUxNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU5MDA6IG1Nb2RlID0gTVI1OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY3MDA6IG1Nb2RlID0gTVI2NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc0MDA6IG1Nb2RlID0gTVI3NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc5NTA6IG1Nb2RlID0gTVI3OTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDIwMDogbU1vZGUgPSBNUjEwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyMjAwOiBtTW9kZSA9IE1SMTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gTVI3OTU7CisgICAgfQorICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1FbmNTdGF0ZSkgeworICAgICAgICBBTVJFbmNvZGVFeGl0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUpOworICAgICAgICBtRW5jU3RhdGUgPSBtU2lkU3RhdGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoQU1SRW5jb2RlUmVzZXQobUVuY1N0YXRlLCBtU2lkU3RhdGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKworICAgICAgICB9CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGU7CisgICAgICAgIGludCBudW1FbmNCeXRlcyA9IEFNUkVuY29kZShtRW5jU3RhdGUsIG1TaWRTdGF0ZSwgbU1vZGUsIG1JbnB1dEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcuZGF0YSgpICsgb3V0UG9zLCAmZnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1RYX1dNRik7CisgICAgICAgIGlmIChudW1FbmNCeXRlcyA8IDAgfHwgbnVtRW5jQnl0ZXMgPiAoKGludClvdXRDYXBhY2l0eSAtIChpbnQpb3V0UG9zKSkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgaGVhZGVyIGJ5dGUgZnJvbSBXTUYgdG8gSUVURiBmb3JtYXQuCisgICAgICAgIGlmIChudW1FbmNCeXRlcyA+IDApCisgICAgICAgICAgICB3Vmlldy5kYXRhKClbb3V0UG9zXSA9ICgod1ZpZXcuZGF0YSgpW291dFBvc10gPDwgMykgfCA0KSAmIDB4N2M7CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QpIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtck5iRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtck5iRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJOYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWIxNGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJnc21hbXJfZW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNTdGF0ZTsKKyAgICB2b2lkICptU2lkU3RhdGU7CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yTmJFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzODkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yV2JFbmMuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCAxNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJXYkVuYzo6QzJTb2Z0QW1yV2JFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNvZGVySGFuZGxlKG51bGxwdHIpLAorICAgICAgbUFwaUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1NZW1PcGVyYXRvcihudWxscHRyKSB7Cit9CisKK0MyU29mdEFtcldiRW5jOjp+QzJTb2Z0QW1yV2JFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkluaXQoKSB7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDY2MDA6IG1Nb2RlID0gVk9BTVJXQl9NRDY2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODg1MDogbU1vZGUgPSBWT0FNUldCX01EODg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI2NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDEyNjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDI1MDogbU1vZGUgPSBWT0FNUldCX01EMTQyNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE1ODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxNTg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE4MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTk4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzMDUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjM4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDIzODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jb2RlckhhbmRsZSkgeworICAgICAgICBDSEVDS19FUSgoVk9fVTMyKVZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKKyAgICAgICAgbUVuY29kZXJIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUFwaUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUFwaUhhbmRsZTsKKyAgICAgICAgbUFwaUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtTWVtT3BlcmF0b3IpIHsKKyAgICAgICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKKyAgICAgICAgbU1lbU9wZXJhdG9yID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvblN0b3AoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlc1BlckZyYW1lOyBpKyspIHsKKyAgICAgICAgbUlucHV0RnJhbWVbaV0gPSAweDAwMDg7IC8qIEVIRl9NQVNLICovCisgICAgfQorICAgIHVpbnQ4X3Qgb3V0QnVmZmVyW2tOdW1CeXRlc1BlcklucHV0RnJhbWVdOworICAgICh2b2lkKSBlbmNvZGVJbnB1dChvdXRCdWZmZXIsIGtOdW1CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBpZiAoIW1BcGlIYW5kbGUpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgaWYgKCFtTWVtT3BlcmF0b3IpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKKyAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOworICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OworICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKKworICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7CisgICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7CisgICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CisgICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpIG1NZW1PcGVyYXRvcjsKKworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KAorICAgICAgICAgICAgICAgICZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZ1c2VyRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgVk9BTVJXQkZSQU1FVFlQRSB0eXBlID0gVk9BTVJXQl9SRkMzMjY3OworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJnR5cGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0KKyAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICAmbU1vZGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAlZCIsIG1Nb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQgQzJTb2Z0QW1yV2JFbmM6OmVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOworICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7CisgICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIG1JbnB1dEZyYW1lOworICAgIGlucHV0RGF0YS5MZW5ndGggPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworCisgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwKKyAgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsICZpbnB1dERhdGEpKTsKKworICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKKyAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7CisgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKKyAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7CisgICAgb3V0cHV0RGF0YS5CdWZmZXIgPSBidWZmZXI7CisgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBsZW5ndGg7CisgICAgVk9fVTMyIHJldCA9IG1BcGlIYW5kbGUtPkdldE91dHB1dERhdGEoCisgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKKyAgICBpZiAocmV0ICE9IFZPX0VSUl9OT05FICYmIHJldCAhPSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKSB7CisgICAgICAgIEFMT0dEKCJlbmNvdW50ZXJlZCBlcnJvciBkdXJpbmcgZW5jb2RlIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RGF0YS5MZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtcldiRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBlbmNvZGVJbnB1dCgod1ZpZXcuZGF0YSgpICsgb3V0UG9zKSwgb3V0Q2FwYWNpdHkgLSBvdXRQb3MpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtcldiRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtcldiRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJXYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yV2JFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yV2JFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY29kZXJIYW5kbGU7CisgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGU7CisgICAgVk9fTUVNX09QRVJBVE9SICptTWVtT3BlcmF0b3I7CisgICAgVk9BTVJXQk1PREUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgaW50IGVuY29kZUlucHV0KHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtcldiRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9XQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMTQ0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRGVjLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEF2Y0VuYy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjI3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmNwcApAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNEZWMuaCIKKyNpbmNsdWRlICJpaDI2NGQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBjb2RlZCBhbmQgb3V0cHV0IHBpY3R1cmUgc2l6ZSBpcyB0aGUgc2FtZSBmb3IgdGhpcyBjb2RlYworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0h9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18zLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ180LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ181LCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwODB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwODB1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAxOTIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6QzJTb2Z0QXZjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICBtT3V0QnVmZmVyRmx1c2gobnVsbHB0ciksCisgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgIG1IZWlnaHQoMjQwKSwKKyAgICAgIG1IZWFkZXJEZWNvZGVkKGZhbHNlKSB7CisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6fkMyU29mdEF2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEF2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIMjY0RF9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3Rmcl9jaGFyczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRBdmNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICB7CisgICAgICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmYWxzZSA9PSBtSGVhZGVyRGVjb2RlZCkgeworICAgICAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjY0KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKWdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyN2E5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXworCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWgyNjRkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwgJiYgbV9vZmZzZXQgPT0gMCkgeyBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KSBtX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoZnAgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldCkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKworY2xhc3MgQzJTb2Z0QXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBdmNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgdm9pZCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDY2MjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtMCwwICsxLDE1NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdEF2Y0VuYy5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgorI2luY2x1ZGUgImloMjY0ZV9lcnJvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEF2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0VmlkZW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fVVNBR0VfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfTkFNRV9TVFJFQU1fVklERU9fU0laRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9OQU1FX1NUUkVBTV9GUkFNRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgbW9kZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIHBlcmlvZCkuYW55KCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEludHJhUmVmcmVzaFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgTEVWRUxfQVZDXzRfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFCLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzUsCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICBmbG9hdCBtYnNQZXJTZWM7CisgICAgICAgICAgICB1aW50NjRfdCBtYnM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWxMaW1pdHMga0xpbWl0c1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAgIDE0ODUsICAgIDk5LCAgICAgNjQwMDAgfSwKKyAgICAgICAgICAgIC8vIERlY29kZXIgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGxldmVsIDFiLgorICAgICAgICAgICAgLy8geyBMRVZFTF9BVkNfMUIsICAgIDE0ODUsICAgOTksICAgMTI4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsICAgMzAwMCwgICAzOTYsICAgIDE5MjAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAgIDYwMDAsICAgMzk2LCAgICAzODQwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMywgIDExODgwLCAgIDM5NiwgICAgNzY4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgICAxMTg4MCwgICAzOTYsICAgMjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAgMTk4MDAsICAgNzkyLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMiwgIDIwMjUwLCAgMTYyMCwgICA0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgICA0MDUwMCwgIDE2MjAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAxMDgwMDAsICAzNjAwLCAgMTQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMiwgMjE2MDAwLCAgNTEyMCwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDI0NTc2MCwgIDgxOTIsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCAyNDU3NjAsICA4MTkyLCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMiwgNTIyMjQwLCAgODcwNCwgIDUwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDU4OTgyNCwgMjIwODAsIDEzNTAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IG1icyA9IHVpbnQ2NF90KChzaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKHNpemUudi5oZWlnaHQgKyAxNSkgLyAxNik7CisgICAgICAgIGZsb2F0IG1ic1BlclNlYyA9IGZsb2F0KG1icykgLyBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLiBGb3IgTGV2ZWwgMWIsIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBsZXZlbCBhbnl3YXksCisgICAgICAgIC8vIHNvIHdlIHNldCBpdCB0byB0cnVlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgYm9vbCBuZWVkc1VwZGF0ZSA9IChtZS52LmxldmVsID09IExFVkVMX0FWQ18xQik7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKG1icyA8PSBsaW1pdC5tYnMgJiYgbWJzUGVyU2VjIDw9IGxpbWl0Lm1ic1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9BVkNfNTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBJbnRyYVJlZnJlc2hTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYucGVyaW9kIDwgMSkgeworICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEOworICAgICAgICAgICAgbWUuc2V0KCkucGVyaW9kID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBhcmJpdHJhcnkgbW9kZSAoY3ljbGljIGluIG91ciBjYXNlKQorICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIElWX1BST0ZJTEVfVCBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0JBU0VMSU5FOiByZXR1cm4gSVZfUFJPRklMRV9CQVNFOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX01BSU46ICAgICByZXR1cm4gSVZfUFJPRklMRV9NQUlOOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBwcm9maWxlOiAleCIsIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIElWX1BST0ZJTEVfREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGF2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgIDEwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xQiwgICA5IH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsIDExIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsIDEyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsIDEzIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgIDIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsIDIxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsIDIyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgIDMwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDMxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDMyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDQwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDQxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDQyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDUwIH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWwgJmxldmVsIDogbGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVMZXZlbC0+bGV2ZWwgPT0gbGV2ZWwuYzJMZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbC5hdmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDQxOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCisjZGVmaW5lIGl2ZV9hcGlfZnVuY3Rpb24gIGloMjY0ZV9hcGlfZnVuY3Rpb24KKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIjsKKworbmFtZXNwYWNlIHsKKworLy8gRnJvbSBleHRlcm5hbC9saWJhdmMvZW5jb2Rlci9paDI2NGVfYml0c3RyZWFtLmgKK2NvbnN0ZXhwciB1aW50MzJfdCBNSU5fU1RSRUFNX1NJWkUgPSAweDgwMDsKKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyU29mdEF2Y0VuYzo6QzJTb2Z0QXZjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbUFWQ0VuY1Byb2ZpbGUoSVZfUFJPRklMRV9CQVNFKSwKKyAgICAgIG1BVkNFbmNMZXZlbCg0MSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNhd091dHB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgLy8gVE9ETzogb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK0MyU29mdEF2Y0VuYzo6fkMyU29mdEF2Y0VuYygpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25TdG9wKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVzZXQoKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX1JFU0VUPworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgaW5pdEVuY1BhcmFtcygpOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6b25SZWxlYXNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfRkxVU0g/CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkICBDMlNvZnRBdmNFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgbU51bU1lbVJlY29yZHMgPSBERUZBVUxUX01FTV9SRUNfQ05UOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSAwOworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworICAgIG1BcmNoID0gREVGQVVMVF9BUkNIOworICAgIG1TbGljZU1vZGUgPSBERUZBVUxUX1NMSUNFX01PREU7CisgICAgbVNsaWNlUGFyYW0gPSBERUZBVUxUX1NMSUNFX1BBUkFNOworICAgIG1IYWxmUGVsRW5hYmxlID0gREVGQVVMVF9IUEVMOworICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CisgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CisgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOworICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CisgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CisgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CisgICAgbUludHJhNHg0ID0gREVGQVVMVF9JTlRSQTR4NDsKKyAgICBtQ29uc3RyYWluZWRJbnRyYUZsYWcgPSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBOworICAgIG1QU05SRW5hYmxlID0gREVGQVVMVF9QU05SX0VOQUJMRTsKKyAgICBtUmVjb25FbmFibGUgPSBERUZBVUxUX1JFQ09OX0VOQUJMRTsKKyAgICBtRW50cm9weU1vZGUgPSBERUZBVUxUX0VOVFJPUFlfTU9ERTsKKyAgICBtQmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERpbWVuc2lvbnMoKSB7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90IHNfZGltZW5zaW9uc19pcDsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3Qgc19kaW1lbnNpb25zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZGltZW5zaW9uc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGltZW5zaW9uc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRElNRU5TSU9OUzsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIHNfZGltZW5zaW9uc19pcC51NF93ZCA9IG1TaXplLT53aWR0aDsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGltZW5zaW9uc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3QpOworICAgIHNfZGltZW5zaW9uc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGltZW5zaW9uc19pcCwgJnNfZGltZW5zaW9uc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIGRpbWVuc2lvbnMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGltZW5zaW9uc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldE51bUNvcmVzKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX251bV9jb3Jlc19pcDsKKyAgICBpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX251bV9jb3Jlc19vcDsKKyAgICBzX251bV9jb3Jlc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX0NPUkVTKTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKworICAgIHNfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbigKKyAgICAgICAgICAgIG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX2lwLCAodm9pZCAqKSAmc19udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9jZXNzb3IgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lUmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3Qgc19mcmFtZV9yYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCBzX2ZyYW1lX3JhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19mcmFtZV9yYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV9yYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVJBVEU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc3JjX2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZSArIDAuNTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX2lwX3QpOworICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfcmF0ZV9pcCwgJnNfZnJhbWVfcmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHJhdGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfcmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldElwZVBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3Qgc19pcGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCBzX2lwZV9wYXJhbXNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19pcGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19pcGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9JUEVfUEFSQU1TOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuYWJsZV9pbnRyYV80eDQgPSBtSW50cmE0eDQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2VuY19zcGVlZF9wcmVzZXQgPSBtRW5jU3BlZWQ7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X2NvbnN0cmFpbmVkX2ludHJhX3ByZWQgPSBtQ29uc3RyYWluZWRJbnRyYUZsYWc7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90KTsKKyAgICBzX2lwZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2lwZV9wYXJhbXNfaXAsICZzX2lwZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpcGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2lwZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRCaXRSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCBzX2JpdHJhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90IHNfYml0cmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2JpdHJhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2JpdHJhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0JJVFJBVEU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS0+dmFsdWU7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2JpdHJhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19iaXRyYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90KTsKKyAgICBzX2JpdHJhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2JpdHJhdGVfaXAsICZzX2JpdHJhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBiaXQgcmF0ZSA9IDB4JXhcbiIsIHNfYml0cmF0ZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgZV9mcmFtZV90eXBlKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90IHNfZnJhbWVfdHlwZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3Qgc19mcmFtZV90eXBlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FVFlQRTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2ZyYW1lX3R5cGUgPSBlX2ZyYW1lX3R5cGU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9pcF90KTsKKyAgICBzX2ZyYW1lX3R5cGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3R5cGVfaXAsICZzX2ZyYW1lX3R5cGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSB0eXBlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3R5cGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRRcCgpIHsKKyAgICBpdmVfY3RsX3NldF9xcF9pcF90IHNfcXBfaXA7CisgICAgaXZlX2N0bF9zZXRfcXBfb3BfdCBzX3FwX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfcXBfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3FwX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9RUDsKKworICAgIHNfcXBfaXAudTRfaV9xcCA9IERFRkFVTFRfSV9RUDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9pX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9wX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfcF9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X2JfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9iX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfYl9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcXBfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9pcF90KTsKKyAgICBzX3FwX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcXBfaXAsICZzX3FwX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcXAgMHgleFxuIiwgc19xcF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90IHNfZW5jX21vZGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCBzX2VuY19tb2RlX29wOworCisgICAgc19lbmNfbW9kZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZW5jX21vZGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0VOQ19NT0RFOworCisgICAgc19lbmNfbW9kZV9pcC5lX2VuY19tb2RlID0gZV9lbmNfbW9kZTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZW5jX21vZGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9pcF90KTsKKyAgICBzX2VuY19tb2RlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX21vZGVfaXAsICZzX2VuY19tb2RlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaW4gaGVhZGVyIGVuY29kZSBtb2RlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2VuY19tb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0VmJ2UGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCBzX3Zidl9pcDsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3Qgc192YnZfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc192YnZfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Zidl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfVkJWX1BBUkFNUzsKKworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZfc2l6ZSA9IDA7CisgICAgc192YnZfaXAudTRfdmJ2X2J1ZmZlcl9kZWxheSA9IDEwMDA7CisKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfdmJ2X2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90KTsKKyAgICBzX3Zidl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmJ2X2lwLCAmc192YnZfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBWQlYgcGFyYW1zID0gMHgleFxuIiwgc192YnZfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRBaXJQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90IHNfYWlyX2lwOworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCBzX2Fpcl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2Fpcl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYWlyX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9BSVJfUEFSQU1TOworCisgICAgc19haXJfaXAuZV9haXJfbW9kZSA9CisgICAgICAgIChtSW50cmFSZWZyZXNoLT5tb2RlID09IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEIHx8IG1JbnRyYVJlZnJlc2gtPnBlcmlvZCA8IDEpCisgICAgICAgICAgICA/IElWRV9BSVJfTU9ERV9OT05FIDogSVZFX0FJUl9NT0RFX0NZQ0xJQzsKKyAgICBzX2Fpcl9pcC51NF9haXJfcmVmcmVzaF9wZXJpb2QgPSBtSW50cmFSZWZyZXNoLT5wZXJpb2Q7CisKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYWlyX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19pcF90KTsKKyAgICBzX2Fpcl9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYWlyX2lwLCAmc19haXJfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBhaXIgcGFyYW1zID0gMHgleFxuIiwgc19haXJfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRNZVBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3Qgc19tZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3Qgc19tZV9wYXJhbXNfb3A7CisKKyAgICBzX21lX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfbWVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9NRV9QQVJBTVM7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfZmFzdF9zYWQgPSBtRW5hYmxlRmFzdFNhZDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfYWx0X3JlZiA9IG1FbmFibGVBbHRSZWY7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfaHBlbCA9IG1IYWxmUGVsRW5hYmxlOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9xcGVsID0gREVGQVVMVF9RUEVMOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X21lX3NwZWVkX3ByZXNldCA9IERFRkFVTFRfTUVfU1BFRUQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeCA9IERFRkFVTFRfU1JDSF9STkdfWDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ195ID0gREVGQVVMVF9TUkNIX1JOR19ZOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90KTsKKyAgICBzX21lX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19tZV9wYXJhbXNfaXAsICZzX21lX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IG1lIHBhcmFtcyA9IDB4JXhcbiIsIHNfbWVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0R29wUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3Qgc19nb3BfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCBzX2dvcF9wYXJhbXNfb3A7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dvcF9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0dPUF9QQVJBTVM7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaV9mcm1faW50ZXJ2YWwgPSBtSUludGVydmFsOworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pZHJfZnJtX2ludGVydmFsID0gbUlEUkludGVydmFsOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCk7CisgICAgc19nb3BfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19nb3BfcGFyYW1zX2lwLCAmc19nb3BfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgR09QIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19nb3BfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UHJvZmlsZVBhcmFtcygpIHsKKyAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90IHNfcHJvZmlsZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCBzX3Byb2ZpbGVfcGFyYW1zX29wOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1BST0ZJTEVfUEFSQU1TOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgaWYgKHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID09IElWX1BST0ZJTEVfQkFTRSkgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfZW50cm9weV9jb2RpbmdfbW9kZSA9IDE7CisgICAgfQorICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19pcF90KTsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfb3BfdCk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19wcm9maWxlX3BhcmFtc19pcCwgJnNfcHJvZmlsZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBwcm9maWxlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldERlYmxvY2tQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3Qgc19kZWJsb2NrX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90IHNfZGVibG9ja19wYXJhbXNfb3A7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfREVCTE9DS19QQVJBTVM7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X2Rpc2FibGVfZGVibG9ja19sZXZlbCA9IG1EaXNhYmxlRGVibGtMZXZlbDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90KTsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZGVibG9ja19wYXJhbXNfaXAsICZzX2RlYmxvY2tfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBlbmFibGUvZGlzYWJsZSBkZWJsb2NrIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHUxX3ZlcnNpb24gPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSAmc19jdGxfaXAsICh2b2lkICopICZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbjogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJdHRpYW0gZW5jb2RlciB2ZXJzaW9uOiAlcyIsIChjaGFyICopc19jdGxfaXAucHUxX3ZlcnNpb24pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiBsZXZlbDsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnJUeXBlID0gQzJfT0s7CisKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtQVZDRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSUludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgIH0KKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgbVN0cmlkZSA9IHdpZHRoOworCisgICAgLy8gVE9ETworICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKworICAgIEFMT0dEKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIiwgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsIG1BVkNFbmNMZXZlbCwgbUl2VmlkZW9Db2xvckZvcm1hdCk7CisKKyAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX251bV9tZW1fcmVjX2lwLCAmc19udW1fbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IG51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgaWYgKG1OdW1NZW1SZWNvcmRzID4gU0laRV9NQVggLyBzaXplb2YoaXZfbWVtX3JlY190KSkgeworICAgICAgICBBTE9HRSgicmVxdWVzdGVkIG1lbW9yeSBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobnVsbHB0ciA9PSBtTWVtUmVjb3JkcykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IG51bGxwdHI7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPmVfbWVtX3R5cGUgPSBJVl9OQV9NRU1fVFlQRTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0dGluZyBNZW1SZWNvcmRzIEF0dHJpYnV0ZXMgKi8KKyAgICB7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1fcmVjX2lwOworICAgICAgICBpdl9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX3JlY19vcDsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY29sb3JfZm9ybWF0ID0gREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19maWxsX21lbV9yZWNfaXAsICZzX2ZpbGxfbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRmlsbCBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIE1lbW9yeSBmb3IgTWVtIFJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHRvdGFsX3NpemUgPSAwOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZlX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlenUgc2l6ZSAldVxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBzX21lbV9yZWMtPnU0X21lbV9zaXplOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLworICAgIHsKKyAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisKKyAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19pbml0X2lwLmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgaWYgKG1SZWNvbkVuYWJsZSB8fCBtUFNOUkVuYWJsZSkgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMDsKKyAgICAgICAgfQorICAgICAgICBzX2luaXRfaXAuZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOworICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisgICAgICAgIHNfaW5pdF9pcC5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOworICAgICAgICBzX2luaXRfaXAudTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKKyAgICAgICAgc19pbml0X2lwLmVfYXJjaCA9IG1BcmNoOworICAgICAgICBzX2luaXRfaXAuZV9zb2MgPSBERUZBVUxUX1NPQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaW5pdF9pcCwgJnNfaW5pdF9vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgQ29kZWMgVmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIHNldCBwcm9jZXNzb3IgZGV0YWlscyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSBkaW1lbnNpb25zICovCisgICAgc2V0RGltZW5zaW9ucygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgcmF0ZXMgKi8KKyAgICBzZXRGcmFtZVJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IElQRSBQYXJhbXMgKi8KKyAgICBzZXRJcGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEJpdHJhdGUgKi8KKyAgICBzZXRCaXRSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBRUCAqLworICAgIHNldFFwKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBBSVIgcGFyYW1zICovCisgICAgc2V0QWlyUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBWQlYgcGFyYW1zICovCisgICAgc2V0VmJ2UGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBNb3Rpb24gZXN0aW1hdGlvbiBwYXJhbXMgKi8KKyAgICBzZXRNZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgR09QIHBhcmFtcyAqLworICAgIHNldEdvcFBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRGVibG9jayBwYXJhbXMgKi8KKyAgICBzZXREZWJsb2NrUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBQcm9maWxlIHBhcmFtcyAqLworICAgIHNldFByb2ZpbGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IGluIEVuY29kZSBoZWFkZXIgbW9kZSAqLworICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX0hFQURFUik7CisKKyAgICBBTE9HVigiaW5pdF9jb2RlYyBzdWNjZXNzZnVsbCIpOworCisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IElWX1NVQ0NFU1M7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzX3JldHJpZXZlX21lbV9pcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3QpOworICAgIHNfcmV0cmlldmVfbWVtX2lwLmVfY21kID0gSVZfQ01EX1JFVFJJRVZFX01FTVJFQzsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcmV0cmlldmVfbWVtX2lwLCAmc19yZXRyaWV2ZV9tZW1fb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgbWVtb3J5IHJlY29yZHMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgICAgICBpZiAocHNfbWVtX3JlYykgaXZlX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibWVtb3J5IHJlY29yZCBpcyBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBwc19tZW1fcmVjKys7CisgICAgfQorCisgICAgaWYgKG1NZW1SZWNvcmRzKSBmcmVlKG1NZW1SZWNvcmRzKTsKKworICAgIC8vIGNsZWFyIG90aGVyIHBvaW50ZXJzIGludG8gdGhlIHNwYWNlIGJlaW5nIGZyZWUoKWQKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNvZGVBcmdzKAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgKmNvbnN0IGlucHV0LAorICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgaXZfcmF3X2J1Zl90ICpwc19pbnBfcmF3X2J1ZjsKKworICAgIHBzX2lucF9yYXdfYnVmID0gJnBzX2VuY29kZV9pcC0+c19pbnBfYnVmOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnB2X2J1ZiA9IGJhc2U7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnl0ZXMgPSAwOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J1ZnNpemUgPSBjYXBhY2l0eTsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9pcF90KTsKKyAgICBwc19lbmNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZlX3ZpZGVvX2VuY29kZV9vcF90KTsKKworICAgIHBzX2VuY29kZV9pcC0+ZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0VOQ09ERTsKKyAgICBwc19lbmNvZGVfaXAtPnB2X2J1ZnMgPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfbWJfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9waWNfaW5mbyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT51NF9tYl9pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfcGljX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gdGltZXN0YW1wID4+IDMyOworICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2xvdyA9IHRpbWVzdGFtcCAmIDB4RkZGRkZGRkY7CisgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYucHZfYnVmID0gbnVsbHB0cjsKKworICAgIC8qIEluaXRpYWxpemUgY29sb3IgZm9ybWF0cyAqLworICAgIG1lbXNldChwc19pbnBfcmF3X2J1ZiwgMCwgc2l6ZW9mKGl2X3Jhd19idWZfdCkpOworICAgIHBzX2lucF9yYXdfYnVmLT51NF9zaXplID0gc2l6ZW9mKGl2X3Jhd19idWZfdCk7CisgICAgcHNfaW5wX3Jhd19idWYtPmVfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVNhd0lucHV0RU9TKXsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGlmIChpbnB1dC0+d2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbnB1dC0+aGVpZ2h0KCkgPCBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIC8qIEV4cGVjdCB3aWR0aCBoZWlnaHQgdG8gYmUgY29uZmlndXJlZCAqLworICAgICAgICBBTE9HVygidW5leHBlY3RlZCBDYXBhY2l0eSBBc3BlY3QgJWQoJWQpIHggJWQoJWQpIiwgaW5wdXQtPndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5wdXQtPmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIndpZHRoID0gJWQsIGhlaWdodCA9ICVkIiwgaW5wdXQtPndpZHRoKCksIGlucHV0LT5oZWlnaHQoKSk7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90ICp5UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKnVQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqdlBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIEFMT0dWKCJ5UGxhbmVTaXplID0gJXp1IiwgeVBsYW5lU2l6ZSk7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwgY29udmVyc2lvbkJ1ZmZlci5zaXplKCksICppbnB1dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0geVN0cmlkZSAvIDI7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9IENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHlTdHJpZGUsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICppbnB1dCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN3aXRjaCAobUl2VmlkZW9Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIElWX1lVVl80MjBQOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgaXMgc3VwcG9zZWQgdG8gYmUgY29uc3QgYnV0IEl0dGlhbSBBUEkgd2FudHMgYmFyZSBwb2ludGVyLgorICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzJdID0gdlBsYW5lOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gaW5wdXQtPndpZHRoKCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzFdID0gaW5wdXQtPndpZHRoKCkgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsyXSA9IGlucHV0LT53aWR0aCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFswXSA9IGlucHV0LT5oZWlnaHQoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMV0gPSBpbnB1dC0+aGVpZ2h0KCkgLyAyOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsyXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzJdID0gdlN0cmlkZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIySUxFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSBwdTFfYnVmOworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IG1XaWR0aCAqIDI7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gbUhlaWdodDsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IG1TdHJpZGUgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9VVjoKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1sxXSA9IHVQbGFuZTsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFswXSA9IGlucHV0LT53aWR0aCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF93ZFsxXSA9IGlucHV0LT53aWR0aCgpOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gaW5wdXQtPmhlaWdodCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKG1Db2RlY0N0eCA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnJvcjsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOworCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWFkZXJMZW5ndGggPSBNSU5fU1RSRUFNX1NJWkU7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tIZWFkZXJMZW5ndGhdOworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQ6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBoZWFkZXIgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcywgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgbU91dEZpbGUsIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBzZXRCaXRSYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBzZXRBaXJQYXJhbXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBzZXRGcmFtZVR5cGUoSVZfSURSX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgIH0KKworICAgIC8qIEluIG5vcm1hbCBtb2RlLCBzdG9yZSBpbnB1dEJ1ZmZlckluZm8gYW5kIHRoaXMgd2lsbCBiZSByZXR1cm5lZAorICAgICAgIHdoZW4gZW5jb2RlciBjb25zdW1lcyB0aGlzIGlucHV0ICovCisgICAgLy8gaWYgKCFtSW5wdXREYXRhSXNNZXRhICYmIChpbnB1dEJ1ZmZlckluZm8gIT0gTlVMTCkpIHsKKyAgICAvLyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgIC8vICAgICAgICAgaWYgKE5VTEwgPT0gbUlucHV0QnVmZmVySW5mb1tpXSkgeworICAgIC8vICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBpbnB1dEJ1ZmZlckluZm87CisgICAgLy8gICAgICAgICAgICAgYnJlYWs7CisgICAgLy8gICAgICAgICB9CisgICAgLy8gICAgIH0KKyAgICAvLyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIGRvIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2ggbGluZWFyIGJsb2NrIGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBlcnIgPSAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgdmlldy5nZXQoKSwgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCB0aW1lc3RhbXApOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycm9yOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRFVNUF9UT19GSUxFKAorICAgICAgICAvLyAgICAgICAgIG1JbkZpbGUsIHNfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSwKKyAgICAgICAgLy8gICAgICAgICAobUhlaWdodCAqIG1TdHJpZGUgKiAzIC8gMikpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmICgoc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpID09IElIMjY0RV9CSVRTVFJFQU1fQlVGRkVSX09WRVJGTE9XKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0dFVEJVRklORk8gZm9yIHByb3BlciBtYXggaW5wdXQgc2l6ZT8KKyAgICAgICAgICAgICAgICBtT3V0QnVmZmVyU2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChJVl9TVUNDRVNTICE9IHN0YXR1cyk7CisKKyAgICAvLyBIb2xkIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICBpZiAoaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUJ1ZmZlcnNbc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdXSA9IGlucHV0QnVmZmVyOworICAgIH0KKworICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKworICAgIHZvaWQgKmZyZWVkID0gc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdOworICAgIC8qIElmIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KKyAgICBpZiAoZnJlZWQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUJ1ZmZlcnMuY291bnQoZnJlZWQpID09IDB1KSB7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIG5vdCB0cmFja2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZWxlYXNlIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPQorICAgICAgICAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8IHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIGlmIChzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICBpZiAoSVZfSURSX0ZSQU1FID09IHNfZW5jb2RlX29wLnU0X2VuY29kZWRfZnJhbWVfdHlwZSkgeworICAgICAgICAgICAgQUxPR1YoIklEUiBmcmFtZSBwcm9kdWNlZCIpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyUGljdHVyZVR5cGVLZXlGcmFtZSkpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKworICAgIGlmIChzX2VuY29kZV9vcC51NF9pc19sYXN0KSB7CisgICAgICAgIC8vIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJj0gfk9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9GTFVTSD8KKyAgICAodm9pZClkcmFpbk1vZGU7CisgICAgKHZvaWQpcG9vbDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKworY2xhc3MgQzJTb2Z0QXZjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzY2E2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2Mi5oIgorI2luY2x1ZGUgIml2ZTIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CisjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKKyNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKKyNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVGX0ZSTSAgICAgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVPUkRFUl9GUk0gICAgIDAKKyNkZWZpbmUgREVGQVVMVF9RUF9NSU4gICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFRkFVTFRfUVBfTUFYICAgICAgICAgICAgICA0MAorI2RlZmluZSBERUZBVUxUX01BWF9CSVRSQVRFICAgICAgICAgMjAwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YICAgIDI1NgorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1kgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX0ZSQU1FUkFURSAgICAgICAxMjAwMDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVMgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9OVU1fQ09SRVNfUFJFX0VOQyAgIDAKKyNkZWZpbmUgREVGQVVMVF9GUFMgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfRU5DX1NQRUVEICAgICAgICAgICBJVkVfTk9STUFMCisKKyNkZWZpbmUgREVGQVVMVF9NRU1fUkVDX0NOVCAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRUNPTl9FTkFCTEUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9DSEtTVU1fRU5BQkxFICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TVEFSVF9GUk0gICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9OVU1fRlJNUyAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUICAgICAgIElWX1lVVl80MjBTUF9WVQorI2RlZmluZSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVCAgICAgSVZfWVVWXzQyMFAKKyNkZWZpbmUgREVGQVVMVF9MT09QQkFDSyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TUkNfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfVEdUX0ZSQU1FX1JBVEUgICAgICAzMAorI2RlZmluZSBERUZBVUxUX01BWF9XRCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9IVCAgICAgICAgICAgICAgMTkyMAorI2RlZmluZSBERUZBVUxUX01BWF9MRVZFTCAgICAgICAgICAgNDEKKyNkZWZpbmUgREVGQVVMVF9TVFJJREUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9XRCAgICAgICAgICAgICAgICAgIDEyODAKKyNkZWZpbmUgREVGQVVMVF9IVCAgICAgICAgICAgICAgICAgIDcyMAorI2RlZmluZSBERUZBVUxUX1BTTlJfRU5BQkxFICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX01FX1NQRUVEICAgICAgICAgICAgMTAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEICAgICAwCisjZGVmaW5lIERFRkFVTFRfRU5BQkxFX0FMVF9SRUYgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkNfTU9ERSAgICAgICAgICAgICBJVkVfUkNfU1RPUkFHRQorI2RlZmluZSBERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgNjAwMDAwMAorI2RlZmluZSBERUZBVUxUX0lfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfSV9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX1BfUVAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfUF9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0JfUVAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01BWCAgICAgICAgICAgIERFRkFVTFRfUVBfTUFYCisjZGVmaW5lIERFRkFVTFRfQl9RUF9NSU4gICAgICAgICAgICBERUZBVUxUX1FQX01JTgorI2RlZmluZSBERUZBVUxUX0FJUiAgICAgICAgICAgICAgICAgSVZFX0FJUl9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9BSVJfUkVGUkVTSF9QRVJJT0QgIDMwCisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWCAgICAgICAgICA2NAorI2RlZmluZSBERUZBVUxUX1NSQ0hfUk5HX1kgICAgICAgICAgNDgKKyNkZWZpbmUgREVGQVVMVF9JX0lOVEVSVkFMICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfSURSX0lOVEVSVkFMICAgICAgICAxMDAwCisjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTCAwCisjZGVmaW5lIERFRkFVTFRfSFBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfUVBFTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfSTQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFRkFVTFRfRVBST0ZJTEUgICAgICAgICAgICBJVl9QUk9GSUxFX0JBU0UKKyNkZWZpbmUgREVGQVVMVF9FTlRST1BZX01PREUgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9NT0RFICAgICAgICAgIElWRV9TTElDRV9NT0RFX05PTkUKKyNkZWZpbmUgREVGQVVMVF9TTElDRV9QQVJBTSAgICAgICAgIDI1NgorI2RlZmluZSBERUZBVUxUX0FSQ0ggICAgICAgICAgICAgICAgQVJDSF9BUk1fQTlRCisjZGVmaW5lIERFRkFVTFRfU09DICAgICAgICAgICAgICAgICBTT0NfR0VORVJJQworI2RlZmluZSBERUZBVUxUX0lOVFJBNHg0ICAgICAgICAgICAgMAorI2RlZmluZSBTVFJMRU5HVEggICAgICAgICAgICAgICAgICAgNTAwCisjZGVmaW5lIERFRkFVTFRfQ09OU1RSQUlORURfSU5UUkEgICAwCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikpPyAoYSkgOiAoYikKKyNkZWZpbmUgQUxJR04xNih4KSAoKCgoeCkgKyAxNSkgPj4gNCkgPDwgNCkKKyNkZWZpbmUgQUxJR04xMjgoeCkgKCgoKHgpICsgMTI3KSA+PiA3KSA8PCA3KQorI2RlZmluZSBBTElHTjQwOTYoeCkgKCgoKHgpICsgNDA5NSkgPj4gMTIpIDw8IDEyKQorCisvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBpdmVfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZV9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworc3RydWN0IEMyU29mdEF2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRBdmNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jKCk7CisKK3ByaXZhdGU6CisgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludDY0X3QgbVRpbWVVczsKKyAgICAgICAgaW50MzJfdCBtRmxhZ3M7CisgICAgfSBJbnB1dEJ1ZmZlckluZm87CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgaW50MzJfdCBtU3RyaWRlOworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICBJVl9QUk9GSUxFX1QgbUFWQ0VuY1Byb2ZpbGUgX191bnVzZWQ7CisgICAgV09SRDMyICAgbUFWQ0VuY0xldmVsOworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKKworICAgIGJvb2wgICAgIG1TYXdJbnB1dEVPUzsKKyAgICBib29sICAgICBtU2F3T3V0cHV0RU9TOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sICAgICBtSW50cmE0eDQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUZhc3RTYWQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUFsdFJlZjsKKyAgICBib29sICAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbUVudHJvcHlNb2RlOworICAgIGJvb2wgICAgIG1Db25zdHJhaW5lZEludHJhRmxhZzsKKyAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYworCisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgVVdPUkQzMiBtSGVhZGVyR2VuZXJhdGVkOworICAgIFVXT1JEMzIgbUJmcmFtZXM7CisgICAgSVZfQVJDSF9UIG1BcmNoOworICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKKyAgICBVV09SRDMyIG1TbGljZVBhcmFtOworICAgIGJvb2wgbUhhbGZQZWxFbmFibGU7CisgICAgVVdPUkQzMiBtSUludGVydmFsOworICAgIFVXT1JEMzIgbUlEUkludGVydmFsOworICAgIFVXT1JEMzIgbURpc2FibGVEZWJsa0xldmVsOworICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKworICAgIHZvaWQgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIGMyX3N0YXR1c190IHNldEZyYW1lVHlwZShJVl9QSUNUVVJFX0NPRElOR19UWVBFX1QgIGVfZnJhbWVfdHlwZSk7CisgICAgYzJfc3RhdHVzX3Qgc2V0UXAoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpOworICAgIGMyX3N0YXR1c190IHNldERpbWVuc2lvbnMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIGMyX3N0YXR1c190IHNldEZyYW1lUmF0ZSgpOworICAgIGMyX3N0YXR1c190IHNldElwZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEJpdFJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRBaXJQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRNZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldEdvcFBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICpjb25zdCBpbnB1dCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmY1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMzggQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgICAgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkgYXMgaXRzIHN0YWJpbGl0eSBpcyBub3QgZ3VhcmFudGVlZAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgQ29sb3JVdGlscyBhbmQgTUlNRQorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBzb2Z0d2FyZSBjb2RlYyBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2NvZGVjcy8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8gVEVNUDogdXNlZCBieSBjaGVldHMyIHByb2plY3QgLSByZW1vdmUgd2hlbiBubyBsb25nZXIgdXNlZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc2ltcGxlX2NvbXBvbmVudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMySW50ZXJmYWNlLmNwcCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjRkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJDb21wb25lbnQiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6dW5pcXVlX3B0cjxDMldvcms+IFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnBvcF9mcm9udCgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gc3RkOjptb3ZlKG1RdWV1ZS5mcm9udCgpLndvcmspOworICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICByZXR1cm4gd29yazsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpwdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaykgeworICAgIG1RdWV1ZS5wdXNoX2JhY2soeyBzdGQ6Om1vdmUod29yayksIE5PX0RSQUlOIH0pOworfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBtUXVldWUuZW1wdHkoKTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpjbGVhcigpIHsKKyAgICBtUXVldWUuY2xlYXIoKTsKK30KKwordWludDMyX3QgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZHJhaW5Nb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtUXVldWUuZnJvbnQoKS5kcmFpbk1vZGU7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6bWFya0RyYWluKHVpbnQzMl90IGRyYWluTW9kZSkgeworICAgIG1RdWV1ZS5wdXNoX2JhY2soeyBudWxscHRyLCBkcmFpbk1vZGUgfSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6V29ya0hhbmRsZXIoKSA6IG1SdW5uaW5nKGZhbHNlKSB7fQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+ICZ0aGl6KSB7CisgICAgbVRoaXogPSB0aGl6OworfQorCitzdGF0aWMgdm9pZCBSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50MzJfdCAqZXJyID0gbnVsbHB0cikgeworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SWQpKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgaWYgKGVycikgeworICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsICplcnIpOworICAgIH0KKyAgICByZXBseS0+cG9zdFJlcGx5KHJlcGx5SWQpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+IHRoaXogPSBtVGhpei5sb2NrKCk7CisgICAgaWYgKCF0aGl6KSB7CisgICAgICAgIEFMT0dEKCJjb21wb25lbnQgbm90IHlldCBzZXQ7IG1zZyA9ICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJZDsKKyAgICAgICAgaWYgKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SWQpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIEMyX0NPUlJVUFRFRCk7CisgICAgICAgICAgICByZXBseS0+cG9zdFJlcGx5KHJlcGx5SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRQcm9jZXNzOiB7CisgICAgICAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpei0+cHJvY2Vzc1F1ZXVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2Nlc3MsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yZSBwcm9jZXNzIG1lc3NhZ2UgYXMgd2UncmUgbm90IHJ1bm5pbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRJbml0OiB7CisgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uSW5pdCgpOworICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uU3RvcCgpOworICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZXNldDogeworICAgICAgICAgICAgdGhpei0+b25SZXNldCgpOworICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlcGx5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZTogeworICAgICAgICAgICAgdGhpei0+b25SZWxlYXNlKCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbXNnOiAlZCIsIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRHVtbXlSZWFkVmlldyA6IHB1YmxpYyBDMlJlYWRWaWV3IHsKKyAgICBEdW1teVJlYWRWaWV3KCkgOiBDMlJlYWRWaWV3KEMyX05PX0lOSVQpIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU2ltcGxlQzJDb21wb25lbnQ6OlNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKQorICAgIDogbUR1bW15UmVhZFZpZXcoRHVtbXlSZWFkVmlldygpKSwKKyAgICAgIG1JbnRmKGludGYpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtSGFuZGxlcihuZXcgV29ya0hhbmRsZXIpIHsKKyAgICBtTG9vcGVyLT5zZXROYW1lKGludGYtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAodm9pZCltTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9WSURFTyk7Cit9CisKK1NpbXBsZUMyQ29tcG9uZW50Ojp+U2ltcGxlQzJDb21wb25lbnQoKSB7CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICh2b2lkKW1Mb29wZXItPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnNldExpc3RlbmVyX3ZiKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIHsKKyAgICBtSGFuZGxlci0+c2V0Q29tcG9uZW50KHNoYXJlZF9mcm9tX3RoaXMoKSk7CisKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmICghbWF5QmxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0ZS0+bUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgLy8gVE9ETzogd2FpdCBmb3IgbGlzdGVuZXIgY2hhbmdlIHRvIGhhdmUgdGFrZW4gcGxhY2UgYmVmb3JlIHJldHVybmluZworICAgIC8vIChlLmcuIGlmIHRoZXJlIGlzIGFuIG9uZ29pbmcgbGlzdGVuZXIgY2FsbGJhY2spCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAqIGNvbnN0IGl0ZW1zKSB7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHdoaWxlICghaXRlbXMtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHF1ZXVlLT5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW1zLT5mcm9udCgpKSk7CisgICAgICAgICAgICBpdGVtcy0+cG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgeworICAgICh2b2lkKWl0ZW1zOworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6Zmx1c2hfc20oCisgICAgICAgIGZsdXNoX21vZGVfdCBmbHVzaE1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpZmx1c2hNb2RlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmluY0dlbmVyYXRpb24oKTsKKyAgICAgICAgLy8gVE9ETzogcXVldWUtPnNwbGljZWRCeShmbHVzaGVkV29yaywgZmx1c2hlZFdvcmstPmVuZCgpKTsKKyAgICAgICAgd2hpbGUgKCFxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHdoaWxlICghcGVuZGluZy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgZmx1c2hlZFdvcmstPnB1c2hfYmFjayhzdGQ6Om1vdmUocGVuZGluZy0+YmVnaW4oKS0+c2Vjb25kKSk7CisgICAgICAgICAgICBwZW5kaW5nLT5lcmFzZShwZW5kaW5nLT5iZWdpbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OmRyYWluX25iKGRyYWluX21vZGVfdCBkcmFpbk1vZGUpIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgcXVldWUtPm1hcmtEcmFpbihkcmFpbk1vZGUpOworICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICBpZiAoc3RhdGUtPm1TdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgfQorICAgIGJvb2wgbmVlZHNJbml0ID0gKHN0YXRlLT5tU3RhdGUgPT0gVU5JTklUSUFMSVpFRCk7CisgICAgc3RhdGUudW5sb2NrKCk7CisgICAgaWYgKG5lZWRzSW5pdCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0SW5pdCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgIENIRUNLKHJlcGx5LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0YXJ0LCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorICAgIHN0YXRlLmxvY2soKTsKKyAgICBzdGF0ZS0+bVN0YXRlID0gUlVOTklORzsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bVN0YXRlID0gU1RPUFBFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWUtPmNsZWFyKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgIHBlbmRpbmctPmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0b3AsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIEFMT0dWKCJyZXNldCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBVTklOSVRJQUxJWkVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgcGVuZGluZy0+Y2xlYXIoKTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVzZXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBBTE9HVigicmVsZWFzZSIpOworICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFJlbGVhc2UsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IFNpbXBsZUMyQ29tcG9uZW50OjppbnRmKCkgeworICAgIHJldHVybiBtSW50ZjsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB2ZWMoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHJldDsKKyAgICByZXQucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OmZpbmlzaCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmsgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICBwZW5kaW5nLT5lcmFzZShmcmFtZUluZGV4KTsKKyAgICB9CisgICAgaWYgKHdvcmspIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gbUV4ZWNTdGF0ZS5sb2NrKCktPm1MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICBBTE9HVigicmV0dXJuaW5nIHBlbmRpbmcgd29yayIpOworICAgIH0KK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6Y2xvbmVBbmRTZW5kKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmY3VycmVudFdvcmssCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIGlmIChjdXJyZW50V29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID09IGZyYW1lSW5kZXgpIHsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBjdXJyZW50V29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBjdXJyZW50V29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgaWYgKHBlbmRpbmctPmNvdW50KGZyYW1lSW5kZXgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGZyYW1lIGluZGV4OiAlIiBQUkl1NjQsIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gcGVuZGluZy0+YXQoZnJhbWVJbmRleCktPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gcGVuZGluZy0+YXQoZnJhbWVJbmRleCktPmlucHV0Lm9yZGluYWw7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJjbG9uZWQgYW5kIHNlbmRpbmcgd29yayIpOworICAgIH0KK30KKworYm9vbCBTaW1wbGVDMkNvbXBvbmVudDo6cHJvY2Vzc1F1ZXVlKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgdWludDY0X3QgZ2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IGRyYWluTW9kZTsKKyAgICBib29sIGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgYm9vbCBoYXNRdWV1ZWRXb3JrID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0aW9uID0gcXVldWUtPmdlbmVyYXRpb24oKTsKKyAgICAgICAgZHJhaW5Nb2RlID0gcXVldWUtPmRyYWluTW9kZSgpOworICAgICAgICBpc0ZsdXNoUGVuZGluZyA9IHF1ZXVlLT5wb3BQZW5kaW5nRmx1c2goKTsKKyAgICAgICAgd29yayA9IHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgaGFzUXVldWVkV29yayA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICB9CisgICAgaWYgKGlzRmx1c2hQZW5kaW5nKSB7CisgICAgICAgIEFMT0dWKCJwcm9jZXNzaW5nIHBlbmRpbmcgZmx1c2giKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRCgiZmx1c2ggZXJyOiAlZCIsIGVycik7CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvcgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtT3V0cHV0QmxvY2tQb29sKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgICAgICAvLyBUT0RPOiBkb24ndCB1c2UgcXVlcnlfdmIKKyAgICAgICAgICAgIEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQgb3V0cHV0Rm9ybWF0KDB1KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICAgICAgeyAmb3V0cHV0Rm9ybWF0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInF1ZXJ5IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0KKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQudmFsdWUgPT0gQzJGb3JtYXRWaWRlbworICAgICAgICAgICAgICAgICAgICAgICAgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgKm91dHB1dFBvb2xzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBvb2xzICYmIG91dHB1dFBvb2xzLT5mbGV4Q291bnQoKSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xJZCA9IG91dHB1dFBvb2xzLT5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IEdldENvZGVjMkJsb2NrUG9vbChwb29sSWQsIHNoYXJlZF9mcm9tX3RoaXMoKSwgJm1PdXRwdXRCbG9ja1Bvb2wpOworICAgICAgICAgICAgQUxPR0QoIlVzaW5nIG91dHB1dCBibG9jayBwb29sIHdpdGggcG9vbElEICVsbHUgPT4gZ290ICVsbHUgLSAlZCIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QmxvY2tQb29sID8gbU91dHB1dEJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0oKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF3b3JrKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGRyYWluKGRyYWluTW9kZSwgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcl9uYihzaGFyZWRfZnJvbV90aGlzKCksIGVycik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHVwZGF0ZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbTogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhwYXJhbS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1cGRhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYoKS0+Y29uZmlnX3ZiKHVwZGF0ZXMsIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIEFMT0dEKCJhcHBsaWVkICV6dSBjb25maWdVcGRhdGVzID0+ICVzICglZCkiLCB1cGRhdGVzLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJzdGFydCBwcm9jZXNzaW5nIGZyYW1lICMlIiBQUkl1NjQsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAvLyBJZiBpbnB1dCBidWZmZXIgbGlzdCBpcyBub3QgZW1wdHksIGl0IG1lYW5zIHdlIGhhdmUgc29tZSBpbnB1dCB0byBwcm9jZXNzIG9uLgorICAgIC8vIEhvd2V2ZXIsIGlucHV0IGNvdWxkIGJlIGEgbnVsbCBidWZmZXIuIEluIHN1Y2ggY2FzZSwgY2xlYXIgdGhlIGJ1ZmZlciBsaXN0CisgICAgLy8gYmVmb3JlIG1ha2luZyBjYWxsIHRvIHByb2Nlc3MoKS4KKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSAmJiAhd29yay0+aW5wdXQuYnVmZmVyc1swXSkgeworICAgICAgICBBTE9HRCgiRW5jb3VudGVyZWQgbnVsbCBpbnB1dCBidWZmZXIuIENsZWFyaW5nIHRoZSBpbnB1dCBidWZmZXIiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIH0KKyAgICBwcm9jZXNzKHdvcmssIG1PdXRwdXRCbG9ja1Bvb2wpOworICAgIEFMT0dWKCJwcm9jZXNzZWQgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIGlmIChxdWV1ZS0+Z2VuZXJhdGlvbigpICE9IGdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIEFMT0dEKCJ3b3JrIGZvcm0gb2xkIGdlbmVyYXRpb246IHdhcyAlIiBQUkl1NjQgIiBub3cgJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+Z2VuZXJhdGlvbigpLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIHF1ZXVlLnVubG9jaygpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAod29yay0+d29ya2xldHNQcm9jZXNzZWQgIT0gMHUpIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgdGhpcyB3b3JrIik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigicXVldWUgcGVuZGluZyB3b3JrIik7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gdW5leHBlY3RlZDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz46OkxvY2tlZCBwZW5kaW5nKG1QZW5kaW5nV29yayk7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSBzdGQ6Om1vdmUocGVuZGluZy0+YXQoZnJhbWVJbmRleCkpOworICAgICAgICAgICAgICAgIHBlbmRpbmctPmVyYXNlKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGVuZGluZy0+aW5zZXJ0KHsgZnJhbWVJbmRleCwgc3RkOjptb3ZlKHdvcmspIH0pOworICAgICAgICB9CisgICAgICAgIGlmICh1bmV4cGVjdGVkKSB7CisgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQtPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh1bmV4cGVjdGVkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUob2Zmc2V0LCBzaXplLCA6OkMyRmVuY2UoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywgY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZShjcm9wLCA6OkMyRmVuY2UoKSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJJbnRlcmZhY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIHVzZSBNZWRpYURlZnMgaGVyZSB2cy4gTWVkaWFDb2RlY0NvbnN0YW50cyBhcyB0aGlzIGlzIG5vdCBNZWRpYUNvZGVjIHNwZWNpZmljL2RlcGVuZGVudAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIFNpbXBsZUludGVyZmFjZSAqLworCitTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6OkJhc2VQYXJhbXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJnJlZmxlY3RvciwKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzKQorICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU5hbWUsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+KG5hbWUuY19zdHIoKSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBpZiAoYWxpYXNlcy5zaXplKCkpIHsKKyAgICAgICAgQzJTdHJpbmcgam9pbmVkOworICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChqb2luZWQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBqb2luZWQgKz0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgam9pbmVkICs9IGFsaWFzOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWxpYXNlcywgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FMSUFTRVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+KGpvaW5lZC5jX3N0cigpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUtpbmQsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9LSU5EKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEtpbmRTZXR0aW5nKGtpbmQpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obURvbWFpbiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTikKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnREb21haW5TZXR0aW5nKGRvbWFpbikpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzaW1wbGUgaW50ZXJmYWNlcyBoYXZlIHNpbmdsZSBzdHJlYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFN0cmVhbUNvdW50LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6b3V0cHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gc2V0IHVwIGJ1ZmZlciBmb3JtYXRzIGFuZCBhbGxvY2F0b3JzCisKKyAgICAvLyBkZWZhdWx0IHRvIGxpbmVhciBidWZmZXJzIGFuZCBubyBtZWRpYSB0eXBlCisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyU3RyaW5nIHJhd01lZGlhVHlwZTsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgIEMyQnVmZmVyRGF0YTo6dHlwZV90IGNvZGVkQnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyQWxsb2NhdG9yOjppZF90IGNvZGVkQWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgY29kZWRQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworCisgICAgc3dpdGNoIChkb21haW4pIHsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOgorICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZGVmaW5lIHJhdyBpbWFnZT8gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aW1lc3RhbXAgaGFuZGxpbmcKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM7CisgICAgICAgICAgICByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgICAgICByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBib29sIGlzRW5jb2RlciA9IGtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKworICAgIC8vIGhhbmRsZSByYXcgZGVjb2RlcnMKKyAgICBpZiAobWVkaWFUeXBlID09IHJhd01lZGlhVHlwZSkgeworICAgICAgICBjb2RlZEJ1ZmZlclR5cGUgPSByYXdCdWZmZXJUeXBlOworICAgICAgICBjb2RlZEFsbG9jYXRvciA9IHJhd0FsbG9jYXRvcjsKKyAgICAgICAgY29kZWRQb29sSWQgPSByYXdQb29sSWQ7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gcmF3QnVmZmVyVHlwZSA6IGNvZGVkQnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyByYXdNZWRpYVR5cGUgOiBtZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gY29kZWRCdWZmZXJUeXBlIDogcmF3QnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyBtZWRpYVR5cGUgOiByYXdNZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JzWzFdID0geyBpc0VuY29kZXIgPyByYXdBbGxvY2F0b3IgOiBjb2RlZEFsbG9jYXRvciB9OworICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IGNvZGVkQWxsb2NhdG9yIDogcmF3QWxsb2NhdG9yIH07CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRQb29sSWQgOiByYXdQb29sSWQgfTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX0lOUFVUX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OkFsbG9jU2hhcmVkKGlucHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dEFsbG9jYXRvcnMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0UG9vbElkcywgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0UG9vbElkcykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIGFkZCBzdGF0ZWxlc3MgcGFyYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN1YnNjcmliZWRQYXJhbUluZGljZXMsIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXMpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8qIFRPRE8KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1DdXJyZW50V29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0NVUlJFTlRfV09SSykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJDdXJyZW50V29ya1R1bmluZygpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkN1cnJlbnRXb3JrVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9JTlBVVF9RVUVVRUQpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0xBU1RfT1VUUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworCisgICAgKi8KK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9QaXBlbGluZUxhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZFBpcGVsaW5lRGVsYXksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1ByaXZhdGVCdWZmZXJzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcml2YXRlQWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfUFJJVkFURV9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhQcml2YXRlQnVmZmVyQ291bnQsIEMyX1BBUkFNS0VZX01BWF9QUklWQVRFX0JVRkZFUl9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVQb29sSWRzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9BR0UpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2UsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9UaW1lU3RyZXRjaCgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtVGltZVN0cmV0Y2gsIEMyX1BBUkFNS0VZX1RJTUVfU1RSRVRDSCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZygxLmYpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCisvKgorICAgIENsaWVudHMgbmVlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBiYXNlIHBhcmFtcyBkdWUgdG8gY3VzdG9tIGRlcGVuZGVuY3kuCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlMZXZlbFNldHRpbmc+IG1BcGlMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ+IG1TdWdnZXN0ZWRJbnB1dEJ1ZmZlckNvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJUcmlwcGVkVHVuaW5nPiBtVHJpcHBlZDsKKworKi8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2E5OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKyNkZWZpbmUgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTaW1wbGVDMkNvbXBvbmVudAorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U2ltcGxlQzJDb21wb25lbnQ+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpOworICAgIHZpcnR1YWwgflNpbXBsZUMyQ29tcG9uZW50KCk7CisKKyAgICAvLyBDMkNvbXBvbmVudAorICAgIC8vIEZyb20gQzJDb21wb25lbnQKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBmb3IgaGFuZGxlcgorICAgIGJvb2wgcHJvY2Vzc1F1ZXVlKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50IGFjY29yZGluZyB0byB0aGUgY29uZmlnIHNldAorICAgICAqIGluIHRoZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0KCksIGJ1dCBvbmx5IGF0IHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9yCisgICAgICogYWZ0ZXIgcmVzZXQoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uSW5pdCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uU3RvcCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uUmVsZWFzZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgPSAwOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZ2l2ZW4gd29yayBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbixvdXRdICAgd29yayAgICB0aGUgd29yayB0byBwcm9jZXNzCisgICAgICogXHBhcmFtW2luXSAgICAgICBwb29sICAgIHRoZSBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyBvdXRwdXQgYmxvY2tzLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEcmFpbiB0aGUgY29tcG9uZW50IGFuZCBmaW5pc2ggcGVuZGluZyB3b3JrIHVzaW5nIGZpbmlzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGRyYWluTW9kZSAgIG1vZGUgb2YgZHJhaW4uCisgICAgICogXHBhcmFtW2luXSAgIHBvb2wgICAgICAgIHRoZSBwb29sIHRvIHVzZSBmb3IgYWxsb2NhdGluZyBvdXRwdXQgYmxvY2tzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIFRoZSBjb21wb25lbnQgaGFzIGRyYWluZWQgYWxsIHBlbmRpbmcgb3V0cHV0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgICAgIFVuc3VwcG9ydGVkIG1vZGUgKGUuZy4gRFJBSU5fQ0hBSU4pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpID0gMDsKKworICAgIC8vIGZvciBkZXJpdmVkIGNsYXNzZXMKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggcGVuZGluZyB3b3JrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSB0aGUgcGVuZGluZyB3b3JrIGFjY29yZGluZyB0byB8ZnJhbWVJbmRleHwgYW5kCisgICAgICogZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wgbXVzdCBiZQorICAgICAqICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZSByZXR1cm5lZAorICAgICAqIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHBlbmRpbmcgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGZpbmlzaCh1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworICAgIC8qKgorICAgICAqIENsb25lIHBlbmRpbmcgb3IgY3VycmVudCB3b3JrIGFuZCBzZW5kIHRoZSB3b3JrIGJhY2sgdG8gY2xpZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbmQgY2xvbmUgdGhlIHBlbmRpbmcgb3IgY3VycmVudCB3b3JrIGFjY29yZGluZworICAgICAqIHRvIHxmcmFtZUluZGV4fCBhbmQgZmVlZCB0aGUgd29yayBpbnRvIHxmaWxsV29ya3wgZnVuY3Rpb24uIHxmaWxsV29ya3wKKyAgICAgKiBtdXN0IGJlICJub24tYmxvY2tpbmciLiBPbmNlIHxmaWxsV29ya3wgcmV0dXJucyB0aGUgZmlsbGVkIHdvcmsgd2lsbCBiZQorICAgICAqIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZnJhbWVJbmRleCAgICB0aGUgaW5kZXggb2YgdGhlIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgY3VycmVudFdvcmsgICB0aGUgY3VycmVudCB3b3JrIHVuZGVyIHByb2Nlc3NpbmcKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJmN1cnJlbnRXb3JrLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZjcm9wKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTk9fRFJBSU4gPSB+MHU7CisKKyAgICBDMlJlYWRWaWV3IG1EdW1teVJlYWRWaWV3OworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisKKyAgICBjbGFzcyBXb3JrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIGtXaGF0UHJvY2VzcywKKyAgICAgICAgICAgIGtXaGF0SW5pdCwKKyAgICAgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgICAgICBrV2hhdFJlc2V0LAorICAgICAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICB9OworCisgICAgICAgIFdvcmtIYW5kbGVyKCk7CisgICAgICAgIH5Xb3JrSGFuZGxlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U2ltcGxlQzJDb21wb25lbnQ+ICZ0aGl6KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OndlYWtfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiBtVGhpejsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIFNUT1BQRUQsCisgICAgICAgIFJVTk5JTkcsCisgICAgfTsKKworICAgIHN0cnVjdCBFeGVjU3RhdGUgeworICAgICAgICBFeGVjU3RhdGUoKSA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7fQorCisgICAgICAgIGludCBtU3RhdGU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICB9OworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPiBtRXhlY1N0YXRlOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxXb3JrSGFuZGxlcj4gbUhhbmRsZXI7CisKKyAgICBjbGFzcyBXb3JrUXVldWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgaW5saW5lIFdvcmtRdWV1ZSgpIDogbUZsdXNoKGZhbHNlKSwgbUdlbmVyYXRpb24oMHVsKSB7fQorCisgICAgICAgIGlubGluZSB1aW50NjRfdCBnZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUdlbmVyYXRpb247IH0KKyAgICAgICAgaW5saW5lIHZvaWQgaW5jR2VuZXJhdGlvbigpIHsgKyttR2VuZXJhdGlvbjsgbUZsdXNoID0gdHJ1ZTsgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHBvcF9mcm9udCgpOworICAgICAgICB2b2lkIHB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKTsKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBtYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKTsKKyAgICAgICAgaW5saW5lIGJvb2wgcG9wUGVuZGluZ0ZsdXNoKCkgeworICAgICAgICAgICAgYm9vbCBmbHVzaCA9IG1GbHVzaDsKKyAgICAgICAgICAgIG1GbHVzaCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZsdXNoOworICAgICAgICB9CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlOworICAgICAgICB9OworCisgICAgICAgIGJvb2wgbUZsdXNoOworICAgICAgICB1aW50NjRfdCBtR2VuZXJhdGlvbjsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUXVldWU7CisgICAgfTsKKyAgICBNdXRleGVkPFdvcmtRdWV1ZT4gbVdvcmtRdWV1ZTsKKworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gUGVuZGluZ1dvcms7CisgICAgTXV0ZXhlZDxQZW5kaW5nV29yaz4gbVBlbmRpbmdXb3JrOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtT3V0cHV0QmxvY2tQb29sOworCisgICAgU2ltcGxlQzJDb21wb25lbnQoKSA9IGRlbGV0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lNUExFX0MyX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUxZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworI2RlZmluZSBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXcmFwIGEgY29tbW9uIGludGVyZmFjZSBvYmplY3QgKHN1Y2ggYXMgQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UsIG9yIEMySW50ZXJmYWNlSGVscGVyIGludG8KKyAqIGEgQzJDb21wb25lbnRJbnRlcmZhY2UuCisgKgorICogXHBhcmFtIFQgY29tbW9uIGludGVyZmFjZSB0eXBlCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU2ltcGxlQzJJbnRlcmZhY2UgOiBwdWJsaWMgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIFNpbXBsZUMySW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFQ+ICZpbXBsKQorICAgICAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgICAgIG1JZChpZCksCisgICAgICAgICAgbUltcGwoaW1wbCkgeworICAgIH0KKworICAgIH5TaW1wbGVDMkludGVyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vIEZyb20gQzJDb21wb25lbnRJbnRlcmZhY2UKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtSWQ7IH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBtYXlCbG9jaywgaGVhcFBhcmFtcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyU3RyaW5nIG1OYW1lOworICAgIGNvbnN0IGMyX25vZGVfaWRfdCBtSWQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFQ+IG1JbXBsOworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzZXMgZm9yIGNvbW1vbiBpbnRlcmZhY2VzLgorICovCit0ZW1wbGF0ZTw+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZTx2b2lkPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmFzZSBDb2RlYyAyLjAgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgYWxsIGNvbXBvbmVudHMuCisgICAgICovCisgICAgc3RydWN0IEJhc2VQYXJhbXMgOiBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgIGV4cGxpY2l0IEJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyLAorICAgICAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzID0gc3RkOjp2ZWN0b3I8QzJTdHJpbmc+KCkpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBpbnB1dCBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0IGFuZCBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQuCisgICAgICAgIHZvaWQgbm9JbnB1dExhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gb3V0cHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0IGFuZCBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0LgorICAgICAgICB2b2lkIG5vT3V0cHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBwaXBlbGluZSBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nIGFuZCBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcuCisgICAgICAgIHZvaWQgbm9QaXBlbGluZUxhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gbmVlZCBmb3IgcHJpdmF0ZSBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmcsIEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmcgYW5kCisgICAgICAgIC8vLyBDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nLgorICAgICAgICB2b2lkIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBob2xkcyBubyByZWZlcmVuY2VzIHRvIGlucHV0IGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0UmVmZXJlbmNlcygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gb3V0cHV0IGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0IGFuZAorICAgICAgICAvLy8gQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0LgorICAgICAgICB2b2lkIG5vT3V0cHV0UmVmZXJlbmNlcygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGRvZXMgbm90IHN0cmV0Y2ggdGltZS4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmcuCisgICAgICAgIHZvaWQgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUxldmVsU2V0dGluZz4gbVBsYXRmb3JtTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtRmVhdHVyZXNTZXR0aW5nPiBtUGxhdGZvcm1GZWF0dXJlczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnROYW1lU2V0dGluZz4gbU5hbWU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nPiBtQWxpYXNlczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50S2luZFNldHRpbmc+IG1LaW5kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnREb21haW5TZXR0aW5nPiBtRG9tYWluOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmc+IG1UaW1lU3RyZXRjaDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dD4gbVJlcXVlc3RlZElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdGVkT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1SZXF1ZXN0ZWRQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ+IG1BY3R1YWxJbnB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dD4gbUFjdHVhbE91dHB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nPiBtQWN0dWFsUGlwZWxpbmVEZWxheTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dD4gbU1heElucHV0UmVmZXJlbmNlQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0PiBtTWF4T3V0cHV0UmVmZXJlbmNlQWdlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0PiBtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZz4gbU1heFByaXZhdGVCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0PiBtSW5wdXRTdHJlYW1Db3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRTdHJlYW1Db3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBtU3Vic2NyaWJlZFBhcmFtSW5kaWNlczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ3VycmVudFdvcmtUdW5pbmc+IG1DdXJyZW50V29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dD4gbUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0PiBtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gbUlucHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD4gbU91dHB1dEFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nPiBtUHJpdmF0ZUFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRQb29sSWRzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQcml2YXRlQmxvY2tQb29sc1R1bmluZz4gbVByaXZhdGVQb29sSWRzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjppbnB1dD4gbUlucHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworICAgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordXNpbmcgU2ltcGxlSW50ZXJmYWNlID0gU2ltcGxlQzJJbnRlcmZhY2U8VD47CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CitzdGQ6OnNoYXJlZF9wdHI8VD4gQWxsb2NTaGFyZWRTdHJpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHN0cikgKyAxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChsZW4sIGFyZ3MuLi4pOworICAgIHN0cmNweShyZXQtPm0udmFsdWUsIHN0cik7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcmV0ID0gVDo6QWxsb2NTaGFyZWQoc3RyLmxlbmd0aCgpICsgMSwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyLmNfc3RyKCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNldHRlciB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgdHlwZTsKKworICAgIHN0YXRpYyBDMlIgTm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtZS52LmZsZXhDb3VudCgpOyArK2l4KSB7CisgICAgICAgICAgICByZXMucGx1cyhtZS5GKG1lLnYubS52YWx1ZXNbaXhdKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYubS52YWx1ZXNbaXhdKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFN0cmljdFZhbHVlV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBjb25zdCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZvbGQsCisgICAgICAgICAgICBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYudmFsdWUpLnN1cHBvcnRzTm93KG1lLnYudmFsdWUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IG9sZC52LnZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA5NzdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzcgQEAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNvZGVjMnBsYXkiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjb2RlYzIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2Y1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKQEAgLTAsMCArMSw0ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPHRocmVhZD4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzIiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcih7IGJsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKSB9KSB7fQorfTsKKworY2xhc3MgTGlzdGVuZXI7CisKK2NsYXNzIFNpbXBsZVBsYXllciB7CitwdWJsaWM6CisgICAgU2ltcGxlUGxheWVyKCk7CisgICAgflNpbXBsZVBsYXllcigpOworCisgICAgdm9pZCBvbldvcmtEb25lKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpOworICAgIHZvaWQgb25UcmlwcGVkKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCk7CisgICAgdm9pZCBvbkVycm9yKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKTsKKworICAgIHZvaWQgcGxheShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgIHNwPElQcm9kdWNlckxpc3RlbmVyPiBtUHJvZHVjZXJMaXN0ZW5lcjsKKworICAgIHN0ZDo6YXRvbWljX2ludCBtTGluZWFyUG9vbElkOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NJb247CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjptdXRleCBtUHJvY2Vzc2VkTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUHJvY2Vzc2VkQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVByb2Nlc3NlZFdvcms7CisKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1Db21wb3NlckNsaWVudDsKKyAgICBzcDxTdXJmYWNlQ29udHJvbD4gbUNvbnRyb2w7Cit9OworCitjbGFzcyBMaXN0ZW5lciA6IHB1YmxpYyBDMkNvbXBvbmVudDo6TGlzdGVuZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpc3RlbmVyKFNpbXBsZVBsYXllciAqdGhpeikgOiBtVGhpcyh0aGl6KSB7fQorICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vbldvcmtEb25lKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uVHJpcHBlZChjb21wb25lbnQsIHNldHRpbmdSZXN1bHQpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uRXJyb3IoY29tcG9uZW50LCBlcnJvckNvZGUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTaW1wbGVQbGF5ZXIgKiBjb25zdCBtVGhpczsKK307CisKKworU2ltcGxlUGxheWVyOjpTaW1wbGVQbGF5ZXIoKQorICAgIDogbUxpc3RlbmVyKG5ldyBMaXN0ZW5lcih0aGlzKSksCisgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgRHVtbXlQcm9kdWNlckxpc3RlbmVyKSwKKyAgICAgIG1MaW5lYXJQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKKyAgICAgIG1Db21wb3NlckNsaWVudChuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KSB7CisgICAgQ0hFQ0tfRVEobUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZtQWxsb2NJb24pLCBDMl9PSyk7CisgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtQWxsb2NJb24sIG1MaW5lYXJQb29sSWQrKyk7CisKKyAgICBtQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKKyAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAorICAgICAgICAgICAgMTI4MCwKKyAgICAgICAgICAgIDgwMCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7CisgICAgICAgICAgICAvL1BJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKKworICAgIENIRUNLKG1Db250cm9sICE9IG51bGxwdHIpOworICAgIENIRUNLKG1Db250cm9sLT5pc1ZhbGlkKCkpOworCisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAuc2V0TGF5ZXIobUNvbnRyb2wsIElOVF9NQVgpCisgICAgICAgICAgICAuc2hvdyhtQ29udHJvbCkKKyAgICAgICAgICAgIC5hcHBseSgpOworCisgICAgbVN1cmZhY2UgPSBtQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgIENIRUNLKG1TdXJmYWNlICE9IG51bGxwdHIpOworICAgIG1TdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgbVByb2R1Y2VyTGlzdGVuZXIpOworfQorCitTaW1wbGVQbGF5ZXI6On5TaW1wbGVQbGF5ZXIoKSB7CisgICAgbUNvbXBvc2VyQ2xpZW50LT5kaXNwb3NlKCk7Cit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgQUxPR1YoIlNpbXBsZVBsYXllcjo6b25Xb3JrRG9uZSIpOworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgVUxvY2sgbChtUHJvY2Vzc2VkTG9jayk7CisgICAgZm9yIChhdXRvICYgaXRlbSA6IHdvcmtJdGVtcykgeworICAgICAgICBtUHJvY2Vzc2VkV29yay5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW0pKTsKKyAgICB9CisgICAgbVByb2Nlc3NlZENvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Cit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvblRyaXBwZWQoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIHsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgICh2b2lkKSBzZXR0aW5nUmVzdWx0OworICAgIC8vIFRPRE8KK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgICh2b2lkKSBlcnJvckNvZGU7CisgICAgLy8gVE9ETworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6cGxheShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBTE9HVigiU2ltcGxlUGxheWVyOjpwbGF5Iik7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAodm9pZCkgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHNvdXJjZS0+Z2V0Rm9ybWF0KCksICZmb3JtYXQpOworCisgICAgc3A8QUJ1ZmZlcj4gY3NkMCwgY3NkMTsKKyAgICBmb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJmNzZDApOworICAgIGZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnN0YXJ0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAic291cmNlIHJldHVybmVkIGVycm9yICVkICgweCUwOHgpXG4iLCBlcnIsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgKHZvaWQpc3RvcmUtPmNyZWF0ZUNvbXBvbmVudCgiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIsICZjb21wb25lbnQpOworCisgICAgKHZvaWQpY29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihtTGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xzID0KKyAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7ICh1aW50NjRfdClDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyB9KTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0OworICAgICh2b2lkKWNvbXBvbmVudC0+aW50ZigpLT5jb25maWdfdmIoe3Bvb2xzLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJnJlc3VsdCk7CisgICAgY29tcG9uZW50LT5zdGFydCgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgfQorCisgICAgc3RkOjphdG9taWNfYm9vbCBydW5uaW5nKHRydWUpOworICAgIHN0ZDo6dGhyZWFkIHN1cmZhY2VUaHJlYWQoW3RoaXMsICZydW5uaW5nXSgpIHsKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmlnYnAgPSBtU3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICB3aGlsZSAocnVubmluZykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTG9jayBsKG1Qcm9jZXNzZWRMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2Nlc3NlZFdvcmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc2VkQ29uZGl0aW9uLndhaXRfZm9yKGwsIDEwMG1zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZWRXb3JrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtUHJvY2Vzc2VkV29yay5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBtUHJvY2Vzc2VkV29yay5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzbG90OworICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlOworICAgICAgICAgICAgQUxPR1YoIlJlbmRlcjogRnJhbWUgIyVsbGQiLCB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICAgICAgaWYgKG91dHB1dCkgeworICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2sgPSBvdXRwdXQtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPSBVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGJsb2NrLmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIobmV3IEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sud2lkdGgoKSkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGdyYWxsb2NIYW5kbGUpOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaWdicC0+YXR0YWNoQnVmZmVyKCZzbG90LCBidWZmZXIpOworCisgICAgICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCisgICAgICAgICAgICAgICAgICAgICAgICAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wICogMTAwMGxsKS5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVjdChibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgICAgICAgICAgICAgIGVyciA9IGlnYnAtPnF1ZXVlQnVmZmVyKHNsb3QsIHFiaSwgJnFibyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVuZGVyIGxvb3AgZmluaXNoZWQiKTsKKyAgICB9KTsKKworICAgIGxvbmcgbnVtRnJhbWVzID0gMDsKKyAgICBtTGluZWFyUG9vbC5yZXNldChuZXcgQzJQb29sZWRCbG9ja1Bvb2wobUFsbG9jSW9uLCBtTGluZWFyUG9vbElkKyspKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICAgICAgdm9pZCAqZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gMHU7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICBpZiAoY3NkMCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjc2QgPSBjc2QwOworICAgICAgICAgICAgY3NkMCA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3NkMSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjc2QgPSBjc2QxOworICAgICAgICAgICAgY3NkMSA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyID09IG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIENIRUNLKG1ldGEuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wKSk7CisKKyAgICAgICAgICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc2QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZSA9IGNzZC0+c2l6ZSgpOworICAgICAgICAgICAgZGF0YSA9IGNzZC0+ZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICB3aGlsZSAoIXdvcmspIHsKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCAxMDBtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG51bUZyYW1lczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIG1MaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJmJsb2NrKTsKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlbGQgc2l6ZSA9ICV6dSIsIG51bUZyYW1lcywgc2l6ZSk7CisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBjb21wb25lbnQtPnF1ZXVlX25iKCZpdGVtcyk7CisKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgKytudW1GcmFtZXM7CisgICAgfQorICAgIEFMT0dWKCJtYWluIGxvb3AgZmluaXNoZWQiKTsKKyAgICBzb3VyY2UtPnN0b3AoKTsKKyAgICBydW5uaW5nLnN0b3JlKGZhbHNlKTsKKyAgICBzdXJmYWNlVGhyZWFkLmpvaW4oKTsKKworICAgIGNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgIHByaW50ZigiXG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dF9maWxlbmFtZV1cbiIsIG1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaChlbHApXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgaW50IHJlczsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaCIpKSA+PSAwKSB7CisgICAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGFyZ2MgLT0gb3B0aW5kOworICAgIGFyZ3YgKz0gb3B0aW5kOworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBTaW1wbGVQbGF5ZXIgcGxheWVyOworCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjICYmIGVyciA9PSBPSzsgKytrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltrXTsKKworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKG51bGxwdHIgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKKworICAgICAgICBpZiAoc3RybmNhc2VjbXAoZmlsZW5hbWUsICJzaW5lOiIsIDUpICYmIGRhdGFTb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxzcDxJTWVkaWFTb3VyY2U+ID4gbWVkaWFTb3VyY2VzOworICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOworCisgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZGF0YVNvdXJjZSk7CisKKyAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZXh0cmFjdG9yLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgaWYgKCFtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXh0cmFjdG9yIGRpZCBub3QgcHJvdmlkZSBNSU1FIHR5cGUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSwgMCk7CisKKyAgICAgICAgICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKworICAgICAgICAgICAgLy8gVE9ETzogYWxsb3dpbmcgQVZDIG9ubHkgZm9yIHRoZSB0aW1lIGJlaW5nCisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby9hdmMiLCA5KSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXRhID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gQVZDIHRyYWNrIGZvdW5kLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYVNvdXJjZSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgIGlmIChtZWRpYVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgTlVMTCB0cmFjayAlenUsIHRvdGFsIHRyYWNrcyAlenUuXG4iLCBpLCBudW1UcmFja3MpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcGxheWVyLnBsYXkobWVkaWFTb3VyY2UpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODU5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliRkxBQy1oZWFkZXJzIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMmY1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEZsYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0RmxhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDY1NTM1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzI3NjgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRGbGFjRGVjOjpDMlNvZnRGbGFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GTEFDRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNEZWM6On5DMlNvZnRGbGFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICBtRkxBQ0RlY29kZXIgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgeworICAgICAgICBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIH0KKyAgICBtRkxBQ0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CisgICAgaWYgKCFtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIEZMQUNEZWNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworLy8gKFRPRE8pIGFkZCBtdWx0aWZyYW1lIHN1cHBvcnQsIGluIHBsdWdpbiBhbmQgRkxBQ0RlY29kZXIuY3BwCit2b2lkIEMyU29mdEZsYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVigiRmlyc3QgZnJhbWUgaGFzIHRvIGluY2x1ZGUgY29uZmlndXJhdGlvbiwgZm9yY2luZyBjb25maWciKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbnB1dCwgaW5TaXplKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0sgJiYgZGVjb2RlckVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIHBhcnNlTWV0YURhdGEgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HVigicHJvY2VzczogcGFyc2VNZXRhZGF0YSBpcyBCbG9ja2luZywgQ29udGludWUgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbUZMQUNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7CisgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8uc2FtcGxlX3JhdGUgJiYgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoInByb2Nlc3M6IGRlY29kZXIgY29uZmlndXJhdGlvbiA6ICVkIEh6LCAlZCBjaGFubmVscywgJWQgc2FtcGxlcywiCisgICAgICAgICAgICAgICAgICAiICVkIGJsb2NrIHNpemUiLCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoaW50KW1TdHJlYW1JbmZvLnRvdGFsX3NhbXBsZXMsIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3Qgb3V0U2l6ZTsKKyAgICBpZiAobUhhc1N0cmVhbUluZm8pCisgICAgICAgIG91dFNpemUgPSBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzaXplb2Yoc2hvcnQpOworICAgIGVsc2UKKyAgICAgICAgb3V0U2l6ZSA9IGtNYXhCbG9ja1NpemUgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2hvcnQgKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgaW5TaXplLCBvdXRwdXQsICZvdXRTaXplKTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIHNpemUgJXp1Iiwgb3V0U2l6ZSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChtRkxBQ0RlY29kZXIpIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRGbGFjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEZsYWNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDkxYmZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEZsYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhCbG9ja1NpemUgICA9IDQwOTYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOworICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUhhc1N0cmVhbUluZm87CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTkyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRGbGFjRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0RmxhY0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgNjU1MzUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNzY4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAyMTAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA0NjA4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciI7CisKK0MyU29mdEZsYWNFbmM6OkMyU29mdEZsYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMzIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRW5jOjp+QzJTb2Z0RmxhY0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25Jbml0KCkgeworICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX25ldygpOworICAgIGlmICghbUZsYWNTdHJlYW1FbmNvZGVyKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2MoCisgICAgICAgICAgICBrSW5CbG9ja1NpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoRkxBQ19faW50MzIpKTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTMyKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Db21wcmVzc2lvbkxldmVsID0gRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUZsYWNTdHJlYW1FbmNvZGVyKSB7CisgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2RlbGV0ZShtRmxhY1N0cmVhbUVuY29kZXIpOworICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTMyKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlc2V0KCkgeworICAgIG1Db21wcmVzc2lvbkxldmVsID0gRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUOworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZHJhaW4oRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgbnVsbHB0cik7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpZiAoZXJyICE9IE9LKSBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUpIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbVdyb3RlSGVhZGVyKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUNzZEluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShtSGVhZGVyT2Zmc2V0LCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG1IZWFkZXIsIG1IZWFkZXJPZmZzZXQpOworICAgICAgICBBTE9HVigicHV0IGNzZCwgJWQgYnl0ZXMiLCBtSGVhZGVyT2Zmc2V0KTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgIG1Xcm90ZUhlYWRlciA9IHRydWU7CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGluU2l6ZTsKKyAgICBvdXRDYXBhY2l0eSArPSBtQmxvY2tTaXplICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gdHJ1ZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgc2l6ZV90IHByb2Nlc3NTaXplID0gTUlOKGtJbkJsb2NrU2l6ZSAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSwgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBwcm9jZXNzU2l6ZSAvIChjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IHByb2Nlc3NTaXplIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBjb25zdCBpbnQxNl90ICpwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgQUxPR1YoImFib3V0IHRvIGVuY29kZSAlenUgYnl0ZXMiLCBwcm9jZXNzU2l6ZSk7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgfQorCisgICAgICAgIEZMQUNfX2Jvb2wgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkKAorICAgICAgICAgICAgICAgIG1GbGFjU3RyZWFtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMzIsIG5iSW5wdXRGcmFtZXMpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gcHJvY2Vzc1NpemU7CisgICAgfQorICAgIGlmIChlb3MgJiYgKEMyX09LICE9IGRyYWluKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCkpKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZW5jb2RpbmciKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChtRW5jb2RlclJldHVybmVkTmJCeXRlcyAhPSAwKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShtT3V0cHV0QmxvY2spLCAwLCBtRW5jb2RlclJldHVybmVkTmJCeXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJlbmNvZGVyIHByb2Nlc3NfaW50ZXJsZWF2ZWQgcmV0dXJuZWQgd2l0aG91dCBkYXRhIHRvIHdyaXRlIik7CisgICAgfQorICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7Cit9CisKK0ZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBDMlNvZnRGbGFjRW5jOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKKyAgICAodm9pZCkgY3VycmVudF9mcmFtZTsKKyAgICBBTE9HVigiJXMgKGJ5dGVzPSV6dSwgc2FtcGxlcz0ldSwgY3Vycl9mcmFtZT0ldSkiLCBfX2Z1bmNfXywgYnl0ZXMsIHNhbXBsZXMsCisgICAgICAgICAgY3VycmVudF9mcmFtZSk7CisKKyAgICBpZiAoc2FtcGxlcyA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJzYXZpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKKyAgICAgICAgbWVtY3B5KG1IZWFkZXIgKyBtSGVhZGVyT2Zmc2V0LCBidWZmZXIsIGJ5dGVzKTsKKyAgICAgICAgbUhlYWRlck9mZnNldCArPSBieXRlczsvLyB3aWxsIGNvbnRhaW4gaGVhZGVyIHNpemUgd2hlbiBmaW5pc2hlZCByZWNlaXZpbmcgaGVhZGVyCisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgaWYgKChzYW1wbGVzID09IDApIHx8ICFtRW5jb2RlcldyaXRlRGF0YSkgeworICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIGVuY29kZXIgYmVjYXVzZSB0aGVyZSdzIGhlYWRlciBkYXRhIHRvIHNhdmUsIGJ1dCBpdCdzIG5vdCB0aGUgcm9sZQorICAgICAgICAvLyBvZiB0aGlzIGNvbXBvbmVudCAodW5sZXNzIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUiBpcyBkZWZpbmVkKQorICAgICAgICBBTE9HVigiaWdub3JpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciBkYXRhIChzYW1wbGVzPSVkKSIsIGJ5dGVzLCBzYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSBlbmNvZGVkIGRhdGEKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgdWludDhfdCogb3V0RGF0YSA9IHdWaWV3LmRhdGEoKTsKKyAgICBBTE9HVigid3JpdGluZyAlenUgYnl0ZXMgb2YgZW5jb2RlZCBkYXRhIG9uIG91dHB1dCIsIGJ5dGVzKTsKKyAgICAvLyBpbmNyZW1lbnQgbVByb2Nlc3NlZFNhbXBsZXMgdG8gbWFpbnRhaW4gYXVkaW8gc3luY2hyb25pemF0aW9uIGR1cmluZworICAgIC8vIHBsYXkgYmFjaworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IHNhbXBsZXM7CisgICAgaWYgKGJ5dGVzICsgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPiBtT3V0cHV0QmxvY2stPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV6dSBieXRlcyIsIGJ5dGVzKTsKKyAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKyAgICBtZW1jcHkob3V0RGF0YSArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyArPSBieXRlczsKKyAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworfQorCisKK3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmNvbmZpZ3VyZUVuY29kZXIoKSB7CisgICAgQUxPR1YoIiVzIG51bUNoYW5uZWw9JWQsIHNhbXBsZVJhdGU9JWQiLCBfX2Z1bmNfXywgbUludGYtPmdldENoYW5uZWxDb3VudCgpLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgIW1GbGFjU3RyZWFtRW5jb2RlcikgeworICAgICAgICBBTE9HRSgiY2FuJ3QgY29uZmlndXJlIGVuY29kZXI6IG5vIGVuY29kZXIgb3IgaW52YWxpZCBzdGF0ZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCAxNik7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY29tcHJlc3Npb25fbGV2ZWwobUZsYWNTdHJlYW1FbmNvZGVyLCBtQ29tcHJlc3Npb25MZXZlbCk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoInVua25vd24gZXJyb3Igd2hlbiBjb25maWd1cmluZyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG9rICY9IEZMQUNfX1NUUkVBTV9FTkNPREVSX0lOSVRfU1RBVFVTX09LID09CisgICAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9pbml0X3N0cmVhbShtRmxhY1N0cmVhbUVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIGZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjayAgICAvKndyaXRlX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLypzZWVrX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyp0ZWxsX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyptZXRhZGF0YV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSB0aGlzIC8qY2xpZW50X2RhdGEqLyk7CisKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtQmxvY2tTaXplID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2Jsb2Nrc2l6ZShtRmxhY1N0cmVhbUVuY29kZXIpOworCisgICAgQUxPR1YoImVuY29kZXIgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQiKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0ZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBDMlNvZnRGbGFjRW5jOjpmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICosCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLAorICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSkgeworICAgIHJldHVybiAoKEMyU29mdEZsYWNFbmMqKSBjbGllbnRfZGF0YSktPm9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgICAgICBidWZmZXIsIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgTk9fRFJBSU46CisgICAgICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBEUkFJTl9DSEFJTjoKKyAgICAgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGZsYWcgaXMgbm90IGJlaW5nIHNlbnQgYmFjayB0byB0aGUgY2xpZW50CisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpdGVtcyBpbiBQZW5kaW5nV29yayBxdWV1ZSBhcyBhbGwgdGhlCisgICAgICAgICAgICAvLyBpbnB1dHMgYXJlIGJlaW5nIHNlbnQgYmFjayB3aXRoIGVtcHR5d29yayBvciB2YWxpZCBlbmNvZGVkIGRhdGEKKyAgICAgICAgICAgIC8vIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9OT19FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIEZMQUNfX2Jvb2wgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9maW5pc2gobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICBpZiAoIW9rKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYzMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2VuY29kZXIuaCIKKworI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01JTiAgICAgMAorI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQgNQorI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01BWCAgICAgOAorCisjZGVmaW5lIEZMQUNfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAxMjgKKworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEZsYWNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIGZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKmVuY29kZXIsIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIG9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGtJbkJsb2NrU2l6ZSA9IDExNTI7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhOdW1DaGFubmVscyA9IDI7CisgICAgRkxBQ19fU3RyZWFtRW5jb2RlciogbUZsYWNTdHJlYW1FbmNvZGVyOworICAgIEZMQUNfX2ludDMyKiBtSW5wdXRCdWZmZXJQY20zMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbU91dHB1dEJsb2NrOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50MzJfdCBtQ29tcHJlc3Npb25MZXZlbDsKKyAgICB1aW50MzJfdCBtQmxvY2tTaXplOworICAgIGJvb2wgbUlzRmlyc3RGcmFtZTsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIC8vIHNob3VsZCB0aGUgZGF0YSByZWNlaXZlZCBieSB0aGUgY2FsbGJhY2sgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHBvcnQKKyAgICBib29sIG1FbmNvZGVyV3JpdGVEYXRhOworICAgIHNpemVfdCBtRW5jb2RlclJldHVybmVkTmJCeXRlczsKKyAgICB1bnNpZ25lZCBtSGVhZGVyT2Zmc2V0OworICAgIGJvb2wgbVdyb3RlSGVhZGVyOworICAgIGNoYXIgbUhlYWRlcltGTEFDX0hFQURFUl9TSVpFXTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWRlNjhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjMgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQUxBVyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzFkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRHNzExRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHNzExRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIEFMQVcKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRHNzExRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisjaWZkZWYgQUxBVworICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXCisjZW5kaWYKKyAgICAgICAgICAgICAgICApKS5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbyg2NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRHNzExRGVjOjpDMlNvZnRHNzExRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSB7Cit9CisKK0MyU29mdEc3MTFEZWM6On5DMlNvZnRHNzExRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvbkluaXQoKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpvblJlbGVhc2UoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGludCBvdXRTaXplID0gaW5TaXplICogc2l6ZW9mKGludDE2X3QpOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqaW5wdXRwdHIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MTZfdCAqb3V0cHV0cHRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisKKyNpZmRlZiBBTEFXCisgICAgRGVjb2RlQUxhdyhvdXRwdXRwdHIsIGlucHV0cHRyLCBpblNpemUpOworI2Vsc2UKKyAgICBEZWNvZGVNTGF3KG91dHB1dHB0ciwgaW5wdXRwdHIsIGluU2l6ZSk7CisjZW5kaWYKKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaykpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworI2lmZGVmIEFMQVcKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlQUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgIGluU2l6ZS0tOworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7CisgICAgICAgIGl4ICY9IDB4N2Y7CisKKyAgICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKKyAgICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOworCisgICAgICAgIGlmIChpZXhwID4gMCkgeworICAgICAgICAgICAgbWFudCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7CisKKyAgICAgICAgaWYgKGlleHAgPiAxKSB7CisgICAgICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgKm91dCsrID0gKHggPiAxMjcpID8gbWFudCA6IC1tYW50OworICAgIH0KK30KKyNlbHNlCit2b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZU1MYXcoCisgICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICBpblNpemUtLTsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OworICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgICBtYW50aXNzYSAmPSAweDBmOworCisgICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKKyAgICB9Cit9CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0RzcxMURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRHNzExRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEc3MTFEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEc3MTFEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlOGZmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0RzcxMURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRHNzExRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRHNzExRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworI2lmZGVmIEFMQVcKKyAgICB2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisjZWxzZQorICAgIHZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyNlbmRpZgorCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RzcxMURlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzMwYzAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEdzbURlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmdzbSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTAxYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEdzbURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0R3NtRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0R3NtRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgMTMyMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5lcXVhbFRvKDEzMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTAyNCAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX0lOX0ZSTV9TWikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEdzbURlYzo6QzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtR3NtKG51bGxwdHIpIHsKK30KKworQzJTb2Z0R3NtRGVjOjp+QzJTb2Z0R3NtRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uSW5pdCgpIHsKKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25TdG9wKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgc2l6ZV90IGRlY29kZUdTTShnc20gaGFuZGxlLCBpbnQxNl90ICpvdXQsIHNpemVfdCBvdXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgc2l6ZV90IG91dFNpemUgPSAwOworCisgICAgaWYgKGluU2l6ZSAlIE1TR1NNX0lOX0ZSTV9TWiA9PSAwCisgICAgICAgICAgICAmJiAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZigqb3V0KQorICAgICAgICAgICAgICAgICAgICA8PSBvdXRDYXBhY2l0eSkpIHsKKyAgICAgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXRTaXplICogc2l6ZW9mKGludDE2X3QpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKSAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3QgKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IGRlY29kZUdTTShtR3NtLCBvdXRwdXQsIG91dENhcGFjaXR5LCBpbnB1dCwgaW5TaXplKTsKKyAgICBpZiAoIW91dFNpemUpIHsKKyAgICAgICAgQUxPR0UoImVuY291bnRlcmVkIGltcHJvcGVyIGluc2l6ZSBvciBvdXRzaXplIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0R1NNRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEdTTURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHc21EZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEdTTURlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEdTTURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjA5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgImdzbS5oIgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgRlJHU01fSU5fRlJNX1NaICAgICAgICAgICAgIDMzCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xICAgICAzMgorI2RlZmluZSBGUkdTTV9PVVRfRlJNX1NaICAgICAgICAgICAgMTYwCisjZGVmaW5lIE1TR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAoRlJHU01fSU5fRlJNX1NaICsgRlJHU01fSU5fRlJNX1NaX01JTlVTXzEpCisjZGVmaW5lIE1TR1NNX09VVF9GUk1fU1ogICAgICAgICAgICAoRlJHU01fT1VUX0ZSTV9TWiAqIDIpCisKK3N0cnVjdCBDMlNvZnRHc21EZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEdzbURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgZ3NtIG1Hc207CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0R3NtRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTA0NWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0SGV2Y0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliaGV2Yy9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYmhldmMvY29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4OTJjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTAsMCArMSw5NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRIZXZjRGVjLmgiCisjaW5jbHVkZSAiaWhldmNkX2N4YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9IEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwOTZ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKHZvaWQgKmN0eHQsIFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqY3R4dCwgdm9pZCAqbWVtKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRIZXZjRGVjOjpDMlNvZnRIZXZjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtT3V0QnVmZmVyRmx1c2gobnVsbHB0ciksCisgICAgICAgIG1JdkNvbG9yZm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgICAgbVdpZHRoKDMyMCksCisgICAgICAgIG1IZWlnaHQoMjQwKSwKKyAgICAgICAgbUhlYWRlckRlY29kZWQoZmFsc2UpIHsKK30KKworQzJTb2Z0SGV2Y0RlYzo6fkMyU29mdEhldmNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9jcmVhdGVfaXBfdCBzX2NyZWF0ZV9pcDsKKyAgICBpdmRleHRfY3JlYXRlX29wX3Qgc19jcmVhdGVfb3A7CisKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfaXBfdCk7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0NSRUFURTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9hbGxvYyA9IGl2ZF9hbGlnbmVkX21hbGxvYzsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2ZyZWUgPSBpdmRfYWxpZ25lZF9mcmVlOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnB2X21lbV9jdHh0ID0gbnVsbHB0cjsKKyAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCopc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QucHZfaGFuZGxlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0SGV2Y0RlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRmx1c2g7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisgICAgcHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVCkgSUhFVkNEX0NYQV9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtU3RyaWRlID0gMDsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyRGVjb2RlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXA7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfb3BfdCBzX2RlbGV0ZV9vcDsKKworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CisgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9vcF90KTsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRIZXZjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgPT0gbUhlYWRlckRlY29kZWQpIHsKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICB9CisgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjY0KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAodm9pZCkgZ2V0VnVpUGFyYW1zKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRIZXZjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0SGV2Y0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEhldmNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxMTFmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloZXZjZF9jeGFfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9pcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2RlbGV0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfb3BfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QgIGloZXZjZF9jeGFfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSEVWQ0RfQ1hBX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisKK3N0cnVjdCBDMlNvZnRIZXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEhldmNEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEhldmNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpOworICAgIHN0YXR1c190IGdldFZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpOworICAgIGJvb2wgZ2V0VnVpUGFyYW1zKCk7CisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIGNvbG9yQXNwZWN0cyBmdW5jdGlvbnMuIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGJvb2wgY29sb3JBc3BlY3RzRGlmZmVyKGNvbnN0IENvbG9yQXNwZWN0cyAmYSwgY29uc3QgQ29sb3JBc3BlY3RzICZiKTsKKyAgICB2b2lkIHVwZGF0ZUZpbmFsQ29sb3JBc3BlY3RzKAorICAgICAgICAgICAgY29uc3QgQ29sb3JBc3BlY3RzICZvdGhlckFzcGVjdHMsIGNvbnN0IENvbG9yQXNwZWN0cyAmcHJlZmVycmVkQXNwZWN0cyk7CisgICAgc3RhdHVzX3QgaGFuZGxlQ29sb3JBc3BlY3RzQ2hhbmdlKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yZm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2NjVlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcDNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiODM5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcDNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcDNEZWMuaCIKKyNpbmNsdWRlICJwdm1wM2RlY29kZXJfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0TVAzOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHs4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAzMjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0TVAzOjpDMlNvZnRNUDMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvbmZpZyhudWxscHRyKSwKKyAgICAgIG1EZWNvZGVyQnVmKG51bGxwdHIpIHsKK30KKworQzJTb2Z0TVAzOjp+QzJTb2Z0TVAzKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvblN0b3AoKSB7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE1QMzo6b25SZWxlYXNlKCkgeworICAgIG1HYXBsZXNzQnl0ZXMgPSBmYWxzZTsKKyAgICBpZiAobURlY29kZXJCdWYpIHsKKyAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIG1EZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUNvbmZpZykgeworICAgICAgICBkZWxldGUgbUNvbmZpZzsKKyAgICAgICAgbUNvbmZpZyA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRNUDM6OmluaXREZWNvZGVyKCkgeworICAgIG1Db25maWcgPSBuZXcgdFBWTVAzRGVjb2RlckV4dGVybmFse307CisgICAgaWYgKCFtQ29uZmlnKSByZXR1cm4gTk9fTUVNT1JZOworICAgIG1Db25maWctPmVxdWFsaXplclR5cGUgPSBmbGF0OworICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKKworICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKyAgICBpZiAoIW1EZWNvZGVyQnVmKSByZXR1cm4gTk9fTUVNT1JZOworCisgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworCisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1HYXBsZXNzQnl0ZXMgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCisvKiBUaGUgYmVsb3cgY29kZSBpcyBib3Jyb3dlZCBmcm9tIC4vdGVzdC9tcDNyZWFkZXIuY3BwICovCitzdGF0aWMgYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2NoYW5uZWxzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cikgeworICAgICpmcmFtZV9zaXplID0gMDsKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpICpvdXRfc2FtcGxpbmdfcmF0ZSA9IDA7CisgICAgaWYgKG91dF9jaGFubmVscykgKm91dF9jaGFubmVscyA9IDA7CisgICAgaWYgKG91dF9iaXRyYXRlKSAqb3V0X2JpdHJhdGUgPSAwOworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworCisgICAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCB2ZXJzaW9uID0gKGhlYWRlciA+PiAxOSkgJiAzOworICAgIGlmICh2ZXJzaW9uID09IDB4MDEpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGxheWVyID0gKGhlYWRlciA+PiAxNykgJiAzOworICAgIGlmIChsYXllciA9PSAweDAwKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBiaXRyYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMikgJiAweDBmOworICAgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ19yYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMCkgJiAzOworICAgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHJldHVybiBmYWxzZTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsaW5nUmF0ZVYxW10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKKyAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKKyAgICBpZiAodmVyc2lvbiA9PSAyIC8qIFYyICovKSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCAvKiBWMi41ICovKSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgICBpZiAobGF5ZXIgPT0gMykgeyAvLyBsYXllciBJCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NgorICAgICAgICB9OworCisgICAgICAgIGludCBiaXRyYXRlID0gKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXSA6CisgICAgICAgICAgICAgICAga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisgICAgICAgICpmcmFtZV9zaXplID0gKDEyMDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nKSAqIDQ7CisgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBsYXllciBJSSBvciBJSUkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDNbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAorICAgICAgICB9OworCisgICAgICAgIGludCBiaXRyYXRlOworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICBiaXRyYXRlID0gKGxheWVyID09IDIgLyogTDIgKi8pID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXSA6CisgICAgICAgICAgICAgICAgICAgIGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gVjIgKG9yIDIuNSkKKyAgICAgICAgICAgIGJpdHJhdGUgPSBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKyAgICAgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gKGxheWVyID09IDEgLyogTDMgKi8pID8gNTc2IDogMTE1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gMTQ0MDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9IGVsc2UgeyAvLyBWMiBvciBWMi41CisgICAgICAgICAgICBzaXplX3QgdG1wID0gKGxheWVyID09IDEgLyogTDMgKi8pID8gNzIwMDAgOiAxNDQwMDA7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IHRtcCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgeworICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOworICAgIH0KKworICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICAgICAgaW50IGNoYW5uZWxfbW9kZSA9IChoZWFkZXIgPj4gNikgJiAzOworCisgICAgICAgICpvdXRfY2hhbm5lbHMgPSAoY2hhbm5lbF9tb2RlID09IDMpID8gMSA6IDI7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBVMzJfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clswXSA8PCAyNCB8IHB0clsxXSA8PCAxNiB8IHB0clsyXSA8PCA4IHwgcHRyWzNdOworfQorCitzdGF0aWMgc3RhdHVzX3QgY2FsY3VsYXRlT3V0U2l6ZSh1aW50OCAqaGVhZGVyLCBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAqZGVjb2RlZFNpemVzKSB7CisgICAgdWludDMyX3QgY2hhbm5lbHM7CisgICAgdWludDMyX3QgbnVtU2FtcGxlczsKKyAgICBzaXplX3QgZnJhbWVTaXplOworICAgIHNpemVfdCB0b3RhbEluU2l6ZSA9IDA7CisKKyAgICB3aGlsZSAodG90YWxJblNpemUgKyA0IDwgaW5TaXplKSB7CisgICAgICAgIGlmICghcGFyc2VNcDNIZWFkZXIoVTMyX0FUKGhlYWRlciArIHRvdGFsSW5TaXplKSwgJmZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmY2hhbm5lbHMsIG51bGxwdHIsICZudW1TYW1wbGVzKSkgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIHBhcnNlIG1wMyBoZWFkZXIgZHVyaW5nIG91dFNpemUgZXN0aW1hdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxJblNpemUgKz0gZnJhbWVTaXplOworICAgICAgICBkZWNvZGVkU2l6ZXMtPnB1c2hfYmFjayhudW1TYW1wbGVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworICAgIH0KKworICAgIGlmIChkZWNvZGVkU2l6ZXMtPmVtcHR5KCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBDYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8gQXMgaW4gdGhlIGNoZWNrIGZvciB2YWxpZGl0eSBvZgorLy8gICAgICAgd29yaywgcG9vbCBwdHIsIHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDEsIC4uLgorLy8gVE9ETzogQmxpbmQgcmVtb3ZhbCBvZiA1Mjkgc2FtcGxlcyBmcm9tIHRoZSBvdXRwdXQgbWF5IG5vdCB3b3JrLiBCZWNhdXNlCisvLyAgICAgICBtcGVnIGxheWVyIDEgZnJhbWUgc2l6ZSBpcyAzODQgc2FtcGxlcyBwZXIgZnJhbWUuIFRoaXMgc2hvdWxkIGludHJvZHVjZQorLy8gICAgICAgbmVnYXRpdmUgdmFsdWVzIGFuZCBjYW4gY2F1c2UgU0VHIGZhdWx0cy4gU29mdCBvbXggbXAzIHBsdWdpbiBjYW4gaGF2ZQorLy8gICAgICAgdGhpcyBwcm9ibGVtIChDSEVDSyEpCit2b2lkIEMyU29mdE1QMzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCAmJiAoIW1HYXBsZXNzQnl0ZXMgfHwgIWVvcykpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworICAgIHNpemVfdCBjYWxPdXRTaXplOworICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gZGVjb2RlZFNpemVzOworICAgIGlmIChpblNpemUgJiYgT0sgIT0gY2FsY3VsYXRlT3V0U2l6ZShjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwgJmRlY29kZWRTaXplcykpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhbE91dFNpemUgPSBzdGQ6OmFjY3VtdWxhdGUoZGVjb2RlZFNpemVzLmJlZ2luKCksIGRlY29kZWRTaXplcy5lbmQoKSwgMCk7CisgICAgaWYgKGVvcykgeworICAgICAgICBjYWxPdXRTaXplICs9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYWxPdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRTaXplID0gMDsKKyAgICBpbnQgb3V0T2Zmc2V0ID0gMDsKKyAgICBhdXRvIGl0ID0gZGVjb2RlZFNpemVzLmJlZ2luKCk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGRlY29kZWRTaXplcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgdHJhaWxpbmcgYnl0ZXMsIGlnbm9yaW5nIHRoZW0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gY29uc3RfY2FzdDx1aW50OCAqPihyVmlldy5kYXRhKCkgKyBpblBvcyk7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gKGNhbE91dFNpemUgLSBvdXRTaXplKTsKKyAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpICsgb3V0U2l6ZSk7CisKKyAgICAgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgICAgICBpZiAoKGRlY29kZXJFcnIgPSBwdm1wM19mcmFtZWRlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpKQorICAgICAgICAgICAgICAgICE9IE5PX0RFQ09ESU5HX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgibXAzIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVjb2RlckVyciAhPSBTSURFX0lORk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCisgICAgICAgICAgICBBTE9HVigiaWdub3JpbmcgZXJyb3IgYW5kIHNlbmRpbmcgc2lsZW5jZSIpOworICAgICAgICAgICAgaWYgKG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gKml0IC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KG1Db25maWctPnBPdXRwdXRCdWZmZXIsIDAsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIH0gZWxzZSBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZQorICAgICAgICAgICAgICAgIHx8IG1Db25maWctPm51bV9jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpOworICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisKKyAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCppdCAhPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJwYW5pYywgcGFyc2VkIHNpemUgZG9lcyBub3QgbWF0Y2ggZGVjb2RlZCBzaXplIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dFNpemUgKz0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpblBvcyArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIGlmIChtSXNGaXJzdCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtR2FwbGVzc0J5dGVzID0gdHJ1ZTsKKyAgICAgICAgLy8gVGhlIGRlY29kZXIgZGVsYXkgaXMgNTI5IHNhbXBsZXMsIHNvIHRyaW0gdGhhdCBtYW55IHNhbXBsZXMgb2ZmCisgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgb3V0cHV0IGJ1ZmZlci4gVGhpcyBlc3NlbnRpYWxseSBtYWtlcyB0aGlzCisgICAgICAgIC8vIGRlY29kZXIgaGF2ZSB6ZXJvIGRlbGF5LCB3aGljaCB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUgYXNzdW1lcy4KKyAgICAgICAgb3V0T2Zmc2V0ID0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgaWYgKGNhbE91dFNpemUgPj0KKyAgICAgICAgICAgIG91dFNpemUgKyBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgaWYgKCFtZW1zZXQocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4od1ZpZXcuZGF0YSgpICsgb3V0U2l6ZSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkFkZGluZyA1Mjkgc2FtcGxlcyBhdCBlbmQiKTsKKyAgICAgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsaW5nUmF0ZTsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSAoKG91dFNpemUgLSBvdXRPZmZzZXQpIC8gKG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSk7CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gb2Zmc2V0ICVkIHNpemUgJWQgdGltZXN0YW1wICV1Iiwgb3V0T2Zmc2V0LCBvdXRTaXplIC0gb3V0T2Zmc2V0LAorICAgICAgICAgICh1aW50MzJfdCkobUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcCkpOworICAgIGRlY29kZWRTaXplcy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0TXAzRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wM0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICBuZXcgQzJTb2Z0TVAzKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TVAzOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1QMzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcDNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcDNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmJkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRQVk1QM0RlY29kZXJFeHRlcm5hbDsKKworYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TVAzIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNUDMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSA9IDUyOSAvLyBzYW1wbGVzCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworCisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtR2FwbGVzc0J5dGVzOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TVAzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWYwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWcyRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMmVjMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApAQCAtMCwwICsxLDEwNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWcyRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzJEZWMuaCIKKyNpbmNsdWRlICJpbXBlZzJkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWcyLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE5MjAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTA4OCwgNCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAxCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpICogMzg0KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqbWVtKSB7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRNcGVnMkRlYzo6QzJTb2Z0TXBlZzJEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1NZW1SZWNvcmRzKG51bGxwdHIpLAorICAgICAgICBtT3V0QnVmZmVyRHJhaW4obnVsbHB0ciksCisgICAgICAgIG1JdkNvbG9yZm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgICAgbVdpZHRoKDMyMCksCisgICAgICAgIG1IZWlnaHQoMjQwKSB7CisgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKK30KKworQzJTb2Z0TXBlZzJEZWM6On5DMlNvZnRNcGVnMkRlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoT0sgIT0gcmVzZXREZWNvZGVyKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckRyYWluKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU91dEJ1ZmZlckRyYWluKTsKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRHJhaW4gPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckRyYWluKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckRyYWluKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU91dEJ1ZmZlckRyYWluKTsKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpnZXROdW1NZW1SZWNvcmRzKCkgeworICAgIGl2X251bV9tZW1fcmVjX2lwX3Qgc19udW1fbWVtX3JlY19pcDsKKyAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19pcCk7CisgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisgICAgc19udW1fbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfb3ApOworCisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX251bV9tZW1fcmVjX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19udW1fbWVtX3JlY19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIG1lbSByZWNvcmRzOiAweCV4Iiwgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmZpbGxNZW1SZWNvcmRzKCkgeworICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYyA9IChpdl9tZW1fcmVjX3QgKikgaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgMTI4LCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAoIXBzX21lbV9yZWMpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQocHNfbWVtX3JlYywgMCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKQorICAgICAgICBwc19tZW1fcmVjW2ldLnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKKyAgICBtTWVtUmVjb3JkcyA9IHBzX21lbV9yZWM7CisKKyAgICBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9pcDsKKyAgICBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9vcDsKKworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgIHNfZmlsbF9tZW1faXAudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfZmlsbF9tZW1faXAuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19maWxsX21lbV9pcC51NF9kZWludGVybGFjZSA9IDE7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV93ZCA9IG1XaWR0aDsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1faHQgPSBtSGVpZ2h0OworICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19maWxsX21lbV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZmlsbF9tZW1fb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZmlsbGluZyBtZW0gcmVjb3JkczogMHgleCIsCisgICAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIENIRUNLX0VRKG1OdW1NZW1SZWNvcmRzLCBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X251bV9tZW1fcmVjX2ZpbGxlZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrLCBwc19tZW1fcmVjKyspIHsKKyAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgIGlmICghcHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtb3J5IHJlY29yZCAjJXp1IG9mIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgaSwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgaXZkZXh0X2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2luaXRfaXBfdCk7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF93ZCA9IG1XaWR0aDsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfaHQgPSBtSGVpZ2h0OworICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19pbml0X2lwLnU0X2RlaW50ZXJsYWNlID0gMTsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2luaXRfb3BfdCk7CisKKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfaW5pdF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfaW5pdF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBJVkRfREVDT0RFX0ZSQU1FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldCA9IGdldE51bU1lbVJlY29yZHMoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmlsbE1lbVJlY29yZHMoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSByZXR1cm4gcmV0OworCisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOworICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdE1wZWcyRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJEcmFpbjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRHJhaW4gKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRHJhaW4gKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQzJTb2Z0TXBlZzJEZWM6OmdldFNlcUluZm8oKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCBzX2N0bF9nZXRfc2VxX2luZm9faXA7CisgICAgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCBzX2N0bF9nZXRfc2VxX2luZm9fb3A7CisKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90KTsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9faXAuZV9zdWJfY21kID0KKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfR0VUX1NFUV9JTkZPOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jdGxfZ2V0X3NlcV9pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jdGxfZ2V0X3NlcV9pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR1coIkVycm9yIGluIGdldHRpbmcgU2VxdWVuY2UgaW5mbzogMHgleCIsIHNfY3RsX2dldF9zZXFfaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfY3RsX2dldF9zZXFfaW5mb19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfY3RsX2dldF9zZXFfaW5mb19vcC51MV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfY3RsX2dldF9zZXFfaW5mb19vcC51MV9tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSAgZmFsc2U7ICAvLyBtcGVnMiB2aWRlbyBoYXMgbGltaXRlZCByYW5nZS4KKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TdHJpZGUgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKywgcHNfbWVtX3JlYysrKSB7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICB9CisgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpyZUluaXREZWNvZGVyKCkgeworICAgIGRlbGV0ZURlY29kZXIoKTsKKworICAgIHN0YXR1c190IHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlciIpOworICAgICAgICBkZWxldGVEZWNvZGVyKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQorICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNvZGVfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNvZGVfaXAudTRfbnVtX0J5dGVzKTsKKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCAiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElNUEVHMkRfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HVigidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgc19kZWNvZGVfb3AudTRfcGljX3dkLCBzX2RlY29kZV9vcC51NF9waWNfaHQpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXI6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChPSyAhPSByZUluaXREZWNvZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXIgb3V0OiBtV2lkdGggJWQgLCBtSGVpZ2h0ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpIGdldFNlcUluZm8oKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisKKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzJEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzJEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWcyRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk5ODcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlICJpdl9kYXRhdHlwZWRlZi5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGltcGVnMmRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9pbml0X2lwX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9fb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvbXBlZzJkX2lucHV0IgorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAibTJ2IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAodWludDMyX3QpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworc3RydWN0IEMyU29mdE1wZWcyRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWcyRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgc3RhdHVzX3QgZmlsbE1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRTZXFJbmZvKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckRyYWluOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnMkRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU0ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLURNUEVHNCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUc0IiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtMCwwICsxLDc0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RGVjIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RGVjLmgiCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QNFZfMykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfM0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzZ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAxOTIwLCAxMDg4KSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDM1MiwgMjg4KSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTkyMCAqIDEwODggKiAzIC8gMikpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM1MiAqIDI4OCAqIDMgLyAyKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyNpZmRlZiBNUEVHNAorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworI2Vsc2UKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDM1MnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMjg4dSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0TWF4V2lkdGgoKSBjb25zdCB7IHJldHVybiBtTWF4U2l6ZS0+d2lkdGg7IH0KKyAgICB1aW50MzJfdCBnZXRNYXhIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtTWF4U2l6ZS0+aGVpZ2h0OyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworQzJTb2Z0TXBlZzREZWM6OkMyU29mdE1wZWc0RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICBtT3V0cHV0QnVmZmVye30sCisgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpIHsKK30KKworQzJTb2Z0TXBlZzREZWM6On5DMlNvZnRNcGVnNERlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgKHZvaWQpb25Jbml0KCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgICAgICBkZWxldGUgbURlY0hhbmRsZTsKKyAgICAgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKFBWX1RSVUUgIT0gUFZSZXNldFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6aW5pdERlY29kZXIoKSB7CisjaWZkZWYgTVBFRzQKKyAgICBtSXNNcGVnNCA9IHRydWU7CisjZWxzZQorICAgIG1Jc01wZWc0ID0gZmFsc2U7CisjZW5kaWYKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICAgIH0KKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1EZWNIYW5kbGUgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQobURlY0hhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKKworICAgIC8qIFRPRE86IGJyaW5nIHRoZXNlIHZhbHVlcyB0byAzNTIgYW5kIDI4OC4gSXQgY2Fubm90IGJlIGRvbmUgYXMgb2Ygbm93CisgICAgICogYmVjYXVzZSwgaDI2MyBkb2Vzbid0IHNlZW0gdG8gYWxsb3cgcG9ydCByZWNvbmZpZ3VyYXRpb24uIEluIE9NWCwgdGhlCisgICAgICogcHJvYmxlbSBvZiBsYXJnZXIgd2lkdGggYW5kIGhlaWdodCB0aGFuIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCBpcworICAgICAqIG92ZXJjb21lIGJ5IGFkYXB0aXZlUGxheUJhY2soKSBhcGkgY2FsbC4gVGhpcyBjYWxsIGdldHMgd2lkdGggYW5kIGhlaWdodAorICAgICAqIGluZm9ybWF0aW9uIGZyb20gZXh0cmFjdG9yLiBTdWNoIGEgdGhpbmcgaXMgbm90IHBvc3NpYmxlIGhlcmUuCisgICAgICogU28gd2UgYXJlIGNvbmZpZ3VyaW5nIHRvIGxhcmdlciB2YWx1ZXMuKi8KKyAgICBtV2lkdGggPSAxNDA4OworICAgIG1IZWlnaHQgPSAxMTUyOworICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4XShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obUludGYtPmdldE1heFdpZHRoKCksIDE2KSAqIGFsaWduKG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgMTYpICogMyAvIDI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSAodWludDhfdCAqKW1hbGxvYyhtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gYWxpZ24obVdpZHRoLCAxNikgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitib29sIEMyU29mdE1wZWc0RGVjOjpoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodDsKKyAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmZGlzcF93aWR0aCwgKGludDMyICopJmRpc3BfaGVpZ2h0KTsKKworICAgIHVpbnQzMl90IGJ1Zl93aWR0aCwgYnVmX2hlaWdodDsKKyAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmJ1Zl93aWR0aCwgKGludDMyICopJmJ1Zl9oZWlnaHQpOworCisgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKKyAgICBDSEVDS19MRShkaXNwX2hlaWdodCwgYnVmX2hlaWdodCk7CisKKyAgICBBTE9HVigiZGlzcGxheSBzaXplICglZHglZCksIGJ1ZmZlciBzaXplICglZHglZCkiLAorICAgICAgICAgICBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0KTsKKworICAgIGJvb2wgcmVzQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChkaXNwX3dpZHRoICE9IG1XaWR0aCB8fCBkaXNwX2hlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGRpc3Bfd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBkaXNwX2hlaWdodDsKKyAgICAgICAgcmVzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUlzTXBlZzQpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKworICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV17fTsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgSDI2M19NT0RFKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBQVkluaXRWaWRlb0RlY29kZXIgSDI2M19NT0RFIHdoaWxlIHJlc0NoYW5nZWQgd2FzIHNldCB0byB0cnVlIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc0NoYW5nZWQ7Cit9CisKKy8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKKyAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7CisgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisgICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgIHNyYyArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorICAgIC8qIFUgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIC8qIFYgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgdWludDMyX3QgKnN0YXJ0X2NvZGUgPSAodWludDMyX3QgKiliaXRzdHJlYW07CisgICAgYm9vbCB2b2xIZWFkZXIgPSAqc3RhcnRfY29kZSA9PSAweEIwMDEwMDAwOworICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAoY29kZWNDb25maWcgfHwgdm9sSGVhZGVyKSB7CisgICAgICAgICAgICB2b2xfZGF0YVswXSA9IGJpdHN0cmVhbTsKKyAgICAgICAgICAgIHZvbF9zaXplID0gaW5TaXplOworICAgICAgICB9CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBtb2RlID0gKG1Jc01wZWc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgbW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkLiBVbnN1cHBvcnRlZCBjb250ZW50PyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gYWN0dWFsTW9kZSkgeworICAgICAgICAgICAgQUxPR0UoIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKG1EZWNIYW5kbGUsIDApOworICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCk7CisgICAgICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHlGcmFtZVNpemUgPSBzaXplb2YodWludDgpICogbURlY0hhbmRsZS0+c2l6ZTsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJTaXplIDwgeUZyYW1lU2l6ZSAqIDMgLyAyKXsKKyAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgb3V0cHV0IGJ1ZmZlcjogJXp1IGJ5dGVzIiwgbU91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgICAgIFZvcEhlYWRlckluZm8gaGVhZGVyX2luZm87CisgICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IChpblBvcyA9PSAwKTsKKyAgICAgICAgaW50MzJfdCB0bXBJblNpemUgPSAoaW50MzJfdClpblNpemU7CisgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbVRtcCA9IGJpdHN0cmVhbTsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gd29ya0luZGV4OworICAgICAgICBpZiAoUFZEZWNvZGVWb3BIZWFkZXIoCisgICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0bXBJblNpemUsCisgICAgICAgICAgICAgICAgICAgICZoZWFkZXJfaW5mbywgJnVzZUV4dFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdKSAhPSBQVl9UUlVFKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2b3AgaGVhZGVyLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKKyAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVm9wSGVhZGVyLgorICAgICAgICBib29sIHJlc0NoYW5nZSA9IGhhbmRsZVJlc0NoYW5nZSh3b3JrKTsKKyAgICAgICAgaWYgKG1Jc01wZWc0ICYmIHJlc0NoYW5nZSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNDaGFuZ2UpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRtcEluU2l6ZSkgIT0gUFZfVFJVRSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZWNvZGUgdmlkZW8gZnJhbWUuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChoYW5kbGVSZXNDaGFuZ2Uod29yaykpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJZID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKG91dHB1dEJ1ZmZlclksIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWaWV3LndpZHRoKCksIGFsaWduKG1XaWR0aCwgMTYpLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIGluUG9zICs9IGluU2l6ZSAtIChzaXplX3QpdG1wSW5TaXplOworICAgICAgICBmaW5pc2hXb3JrKHdvcmtJbmRleCwgd29yayk7CisgICAgICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgICAgIGlmIChpblNpemUgLSBpblBvcyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzREZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzREZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnNERlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZhMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfREVDX0hfCisjZGVmaW5lIEMyX1NPRlRfTVBFRzRfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB0YWd2aWRlb0RlY0NvbnRyb2xzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRNcGVnNERlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnNERlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzID0gMiwKKyAgICB9OworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYm9vbCBoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB0YWd2aWRlb0RlY0NvbnRyb2xzICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRwdXRCdWZmZXJba051bU91dHB1dEJ1ZmZlcnNdOworICAgIHNpemVfdCAgbU91dHB1dEJ1ZmZlclNpemU7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtTnVtU2FtcGxlc091dHB1dDsKKworICAgIGJvb2wgbUlzTXBlZzQ7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnNERlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfTVBFRzRfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Nzk2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApAQCAtMCwwICsxLDY3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIE1QRUc0CisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzRFbmMiCisjZWxzZQorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdEgyNjNFbmMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzRFbmMuaCIKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIE1QRUc0Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRWaWRlbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9VU0FHRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfTkFNRV9TVFJFQU1fVklERU9fU0laRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0KDB1LCAxNzYsIDE0NCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE3NiwgMTYpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTQ0LCAxNiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5vbmVPZih7MTc2LCAzNTJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLm9uZU9mKHsxNDQsIDI4OH0pLAorI2VuZGlmCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9OQU1FX1NUUkVBTV9GUkFNRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMTcuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIE1QRUc0CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9NUDRWX1NJTVBMRSwgTEVWRUxfTVA0Vl8yKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0gyNjNfQkFTRUxJTkUsIExFVkVMX0gyNjNfNDUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9IMjYzX0JBU0VMSU5FKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDV9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX01QNFZfU0lNUExFOworI2Vsc2UKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0gyNjNfQkFTRUxJTkU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5sZXZlbCkuc3VwcG9ydHNBdEFsbChtZS52LmxldmVsKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX01QNFZfMjsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0gyNjNfNDU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCitDMlNvZnRNcGVnNEVuYzo6QzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1IYW5kbGUobnVsbHB0ciksCisgICAgICBtRW5jUGFyYW1zKG51bGxwdHIpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbU91dEJ1ZmZlclNpemUoNTI0Mjg4KSB7Cit9CisKK0MyU29mdE1wZWc0RW5jOjp+QzJTb2Z0TXBlZzRFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkluaXQoKSB7CisjaWZkZWYgTVBFRzQKKyAgICBtRW5jb2RlTW9kZSA9IENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVM7CisjZWxzZQorICAgIG1FbmNvZGVNb2RlID0gSDI2M19NT0RFOworI2VuZGlmCisgICAgaWYgKCFtSGFuZGxlKSB7CisgICAgICAgIG1IYW5kbGUgPSBuZXcgdGFndmlkZW9FbmNDb250cm9sczsKKyAgICB9CisKKyAgICBpZiAoIW1FbmNQYXJhbXMpIHsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG5ldyB0YWd2aWRlb0VuY09wdGlvbnM7CisgICAgfQorCisgICAgaWYgKCEobUVuY1BhcmFtcyAmJiBtSGFuZGxlKSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBpbml0RW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25TdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAodm9pZClQVkNsZWFuVXBWaWRlb0VuY29kZXIobUhhbmRsZSk7CisgICAgfQorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6b25SZXNldCgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpbml0RW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlbGVhc2UoKSB7CisgICAgb25TdG9wKCk7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgZGVsZXRlIG1FbmNQYXJhbXM7CisgICAgICAgIG1FbmNQYXJhbXMgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUhhbmRsZTsKKyAgICAgICAgbUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9FbmNDb250cm9scykpOworICAgIH0gZWxzZSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGlmIChtRW5jUGFyYW1zKSB7CisgICAgICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YodGFndmlkZW9FbmNPcHRpb25zKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICBpZiAoIVBWR2V0RGVmYXVsdEVuY09wdGlvbihtRW5jUGFyYW1zLCAwKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZWZhdWx0IGVuY29kaW5nIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZyYW1lUmF0ZS0+dmFsdWUgPT0gMCkgeworICAgICAgICBBTE9HRSgiRnJhbWVyYXRlIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1FbmNQYXJhbXMtPmVuY01vZGUgPSBtRW5jb2RlTW9kZTsKKyAgICBtRW5jUGFyYW1zLT5lbmNXaWR0aFswXSA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLT5lbmNIZWlnaHRbMF0gPSBtU2l6ZS0+aGVpZ2h0OworICAgIG1FbmNQYXJhbXMtPmVuY0ZyYW1lUmF0ZVswXSA9IG1GcmFtZVJhdGUtPnZhbHVlICsgMC41OworICAgIG1FbmNQYXJhbXMtPnJjVHlwZSA9IFZCUl8xOworICAgIG1FbmNQYXJhbXMtPnZidkRlbGF5ID0gNS4wZjsKKyAgICBtRW5jUGFyYW1zLT5wcm9maWxlX2xldmVsID0gQ09SRV9QUk9GSUxFX0xFVkVMMjsKKyAgICBtRW5jUGFyYW1zLT5wYWNrZXRTaXplID0gMzI7CisgICAgbUVuY1BhcmFtcy0+cnZsY0VuYWJsZSA9IFBWX09GRjsKKyAgICBtRW5jUGFyYW1zLT5udW1MYXllcnMgPSAxOworICAgIG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgPSAxMDAwOworICAgIG1FbmNQYXJhbXMtPnRpY2tQZXJTcmMgPSBtRW5jUGFyYW1zLT50aW1lSW5jUmVzIC8gKG1GcmFtZVJhdGUtPnZhbHVlICsgMC41KTsKKyAgICBtRW5jUGFyYW1zLT5iaXRSYXRlWzBdID0gbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMtPmlRdWFudFswXSA9IDE1OworICAgIG1FbmNQYXJhbXMtPnBRdWFudFswXSA9IDEyOworICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CisgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CisKKyAgICAvLyBQVidzIE1QRUc0IGVuY29kZXIgcmVxdWlyZXMgdGhlIHZpZGVvIGRpbWVuc2lvbiBvZiBtdWx0aXBsZQorICAgIGlmIChtU2l6ZS0+d2lkdGggJSAxNiAhPSAwIHx8IG1TaXplLT5oZWlnaHQgJSAxNiAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJWaWRlbyBmcmFtZSBzaXplICVkeCVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiIsCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2V0IElEUiBmcmFtZSByZWZyZXNoIGludGVydmFsCisgICAgbUVuY1BhcmFtcy0+aW50cmFQZXJpb2QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgbUVuY1BhcmFtcy0+bnVtSW50cmFNQiA9IDA7CisgICAgbUVuY1BhcmFtcy0+c2NlbmVEZXRlY3QgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5zZWFyY2hSYW5nZSA9IDE2OworICAgIG1FbmNQYXJhbXMtPm12OHg4RW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPmdvYkhlYWRlckludGVydmFsID0gMDsKKyAgICBtRW5jUGFyYW1zLT51c2VBQ1ByZWQgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5pbnRyYURDVmxjVGggPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGVyciA9IGluaXRFbmNQYXJhbXMoKTsKKyAgICBpZiAoQzJfT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZWQgZW5jb2RlciBwYXJhbXMiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKCFQVkluaXRWaWRlb0VuY29kZXIobUhhbmRsZSwgbUVuY1BhcmFtcykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gMXN0IGJ1ZmZlciBmb3IgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0xOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmICghbVN0YXJ0ZWQgJiYgQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKXdWaWV3LmRhdGEoKTsKKyAgICBpZiAobU51bUlucHV0RnJhbWVzIDwgMCkgeworICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMgZGF0YS4KKyAgICAgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgICAgIGlmICghUFZHZXRWb2xIZWFkZXIobUhhbmRsZSwgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFZPTCBoZWFkZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwgb3V0cHV0U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Dc2RJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG91dHB1dFNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXctPmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPSBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGluQnVmZmVyLndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgdVN0cmlkZSA9PSB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgICYmIHlTdHJpZGUgPT0gMiAqIHZTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSBwbGFuZXMgYXJlIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKnJWaWV3KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLKE5VTEwgIT0geVBsYW5lKTsKKyAgICAvKiBFbmNvZGUgZnJhbWVzICovCisgICAgVmlkZW9FbmNGcmFtZUlPIHZpbiwgdm91dDsKKyAgICBtZW1zZXQoJnZpbiwgMCwgc2l6ZW9mKHZpbikpOworICAgIG1lbXNldCgmdm91dCwgMCwgc2l6ZW9mKHZvdXQpKTsKKyAgICB2aW4ueUNoYW4gPSB5UGxhbmU7CisgICAgdmluLnVDaGFuID0gdVBsYW5lOworICAgIHZpbi52Q2hhbiA9IHZQbGFuZTsKKyAgICB2aW4udGltZXN0YW1wID0gKGlucHV0VGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcworICAgIHZpbi5oZWlnaHQgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICB2aW4ucGl0Y2ggPSBhbGlnbih3aWR0aCwgMTYpOworCisgICAgdWludDMyX3QgbW9kVGltZU1zID0gMDsKKyAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICBpZiAoIVBWRW5jb2RlVmlkZW9GcmFtZShtSGFuZGxlLCAmdmluLCAmdm91dCwgJm1vZFRpbWVNcywgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgJm5MYXllcikgfHwKKyAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW50IHRyYWNrIGF0IGZyYW1lICUiIFBSSWQ2NCwgbU51bUlucHV0RnJhbWVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJvdXRwdXRTaXplIGZpbGxlZCA6ICVkIiwgb3V0cHV0U2l6ZSk7CisgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgQ0hFQ0soTlVMTCA9PSBQVkdldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworCisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0cHV0U2l6ZSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IGlucHV0VGltZVN0YW1wOworICAgICAgICBpZiAoaGludFRyYWNrLkNvZGVUeXBlID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMlBpY3R1cmVUeXBlS2V5RnJhbWUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZSh5UGxhbmUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0NjFmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0VOQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzRFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIHRhZ3ZpZGVvRW5jQ29udHJvbHMgKm1IYW5kbGU7CisgICAgdGFndmlkZW9FbmNPcHRpb25zICAqbUVuY1BhcmFtczsKKworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworCisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIE1QNEVuY29kaW5nTW9kZSBtRW5jb2RlTW9kZTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8dm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwY2RiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM5YzNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApAQCAtMCwwICsxLDU0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0T3B1c0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8b3B1cy5oPgorICAgICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE9wdXNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oNDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjAwMCwgNTEwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgOTYwICogNikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQml0cmF0ZVR1bmluZzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNEZWM6OkMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY29kZXIobnVsbHB0cikgeworfQorCitDMlNvZnRPcHVzRGVjOjp+QzJTb2Z0T3B1c0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBtZW1zZXQoJm1IZWFkZXIsIDAsIHNpemVvZihtSGVhZGVyKSk7CisgICAgbUNvZGVjRGVsYXkgPSAwOworICAgIG1TZWVrUHJlUm9sbCA9IDA7CisgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBSZWFkTEUxNihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfb2Zmc2V0KSB7CisgICAgaWYgKHJlYWRfb2Zmc2V0ICsgMSA+IGRhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IGRhdGFbcmVhZF9vZmZzZXRdOworICAgIHZhbCB8PSBkYXRhW3JlYWRfb2Zmc2V0ICsgMV0gPDwgODsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgY29uc3QgaW50IGtSYXRlID0gNDgwMDA7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHMgPSA4OworCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworLy8gUGFyc2VzIE9wdXMgSGVhZGVyLiBIZWFkZXIgc3BlYzogaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIKK3N0YXRpYyBib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXNIZWFkZXIqIGhlYWRlcikgeworICAgIC8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKworICAgIC8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIHByZS1za2lwIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCA9IDEwOworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworCisgICAgLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKyAgICAvLyBiZXlvbmQgdGhlIGFsd2F5cyBwcmVzZW50IHxrT3B1c0hlYWRlclNpemV8IGJ5dGVzIG9mIGRhdGEuIFRoZSBtYXBwaW5nCisgICAgLy8gZGF0YSBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZworICAgIC8vIHZhbHVlczoKKyAgICAvLyAgIC0gQnl0ZSAwOiBOdW1iZXIgb2Ygc3RyZWFtcy4KKyAgICAvLyAgIC0gQnl0ZSAxOiBOdW1iZXIgY291cGxlZC4KKyAgICAvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisgICAgLy8gICAgICAgICAgICAgdmFsdWVzLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgPSBrT3B1c0hlYWRlclNpemU7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDE7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMjsKKworICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclNpemUpIHsKKyAgICAgICAgQUxPR0UoIkhlYWRlciBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPmNoYW5uZWxzID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCk7CisgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPD0gMCB8fCBoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIEhlYWRlciwgd3JvbmcgY2hhbm5lbCBjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQpOworCisgICAgaGVhZGVyLT5nYWluX2RiID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oUmVhZExFMTYoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJHYWluT2Zmc2V0KSk7CisKKyAgICBoZWFkZXItPmNoYW5uZWxfbWFwcGluZyA9ICooZGF0YSArIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQpOworICAgIGlmICghaGVhZGVyLT5jaGFubmVsX21hcHBpbmcpIHsKKyAgICAgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgSGVhZGVyLCBtaXNzaW5nIHN0cmVhbSBtYXAuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IDE7CisgICAgICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSBoZWFkZXItPmNoYW5uZWxzID4gMTsKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwWzBdID0gMDsKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwWzFdID0gMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIG1hcDsgaW5zdWZmaWNpZW50IGRhdGEgZm9yIGN1cnJlbnQgY2hhbm5lbCAiCisgICAgICAgICAgICAgICJjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gKihkYXRhICsga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0KTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gKihkYXRhICsga09wdXNIZWFkZXJOdW1Db3VwbGVkT2Zmc2V0KTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HRSgiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gKihkYXRhICsga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBuYW5vc2Vjb25kcyB0byBudW1iZXIgb2Ygc2FtcGxlcy4KK3N0YXRpYyB1aW50NjRfdCBuc190b19zYW1wbGVzKHVpbnQ2NF90IG5zLCBpbnQgcmF0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIHJhdGUgLyAxMDAwMDAwMDAwOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA8IDMpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIGluU2l6ZSwgJm1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIFBhcnNpbmcgT3B1cyBIZWFkZXIuIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyLmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuc3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLm51bV9jb3VwbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLmdhaW5fZGIpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpblNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMgPSBuc190b19zYW1wbGVzKCAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfY2FzdDx1aW50OF90ICo+IChkYXRhKSkpLCBrUmF0ZSk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gc2FtcGxlczsKKworICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgaWYgKHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkgPT0gMCkgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtU2FtcGxlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAobnVtU2FtcGxlcyA8IDApIHsKKyAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkIG51bVNhbXBsZXMgJWQiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgIG91dE9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1TYW1wbGVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkICIsIG91dE9mZnNldCwgb3V0U2l6ZSk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE9wdXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjc0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgaW50IGNoYW5uZWxzOworICBpbnQgc2tpcF9zYW1wbGVzOworICBpbnQgY2hhbm5lbF9tYXBwaW5nOworICBpbnQgbnVtX3N0cmVhbXM7CisgIGludCBudW1fY291cGxlZDsKKyAgaW50MTZfdCBnYWluX2RiOworICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitzdHJ1Y3QgQzJTb2Z0T3B1c0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRPcHVzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgPSA5NjAgKiA2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgT3B1c01TRGVjb2RlciAqbURlY29kZXI7CisgICAgT3B1c0hlYWRlciBtSGVhZGVyOworCisgICAgaW50NjRfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbDsKKyAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0T3B1c0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9PUFVTX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk0NGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0UmF3RGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgzNDgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFJhd0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0UmF3RGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnJhdy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0UmF3RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRDb21wcmVzc2VkKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQoMHUsIEMyRm9ybWF0QXVkaW8pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9OQU1FX0lOUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX05BTUVfU1RSRUFNX1NBTVBMRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAxOTIwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfTkFNRV9TVFJFQU1fQ0hBTk5FTF9DT1VOVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDEwMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgNjQgKiAxMDI0KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QY21FbmNvZGluZ0luZm8sIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRSYXdEZWM6OkMyU29mdFJhd0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRSYXdEZWM6On5DMlNvZnRSYXdEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pOworICAgIH0KKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0UmF3RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFJhd0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRSYXdEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFJhd0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0UmF3RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFJhd0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0UmF3RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmNDg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWb3JiaXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2b3JiaXNpZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODI1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0Vm9yYmlzRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWb3JiaXNEZWMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KKworICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Gb3JtYXRDb25maWc6Om91dHB1dCgwdSwgQzJGb3JtYXRBdWRpbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9OQU1FX09VVFBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX05BTUVfU1RSRUFNX0NIQU5ORUxfQ09VTlRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX05BTUVfU1RSRUFNX0JJVFJBVEVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyQml0cmF0ZVR1bmluZzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgzMjAwMCwgNTAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MiAqIDIgKiBzaXplb2YoaW50MTZfdCkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRWb3JiaXNEZWM6OkMyU29mdFZvcmJpc0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtU3RhdGUobnVsbHB0ciksCisgICAgICBtVmkobnVsbHB0cikgeworfQorCitDMlNvZnRWb3JiaXNEZWM6On5DMlNvZnRWb3JiaXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIChpbml0RGVjb2RlcigpID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRWb3JiaXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mb3t9OworICAgIGlmICghbVZpKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisKKyAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZXt9OworICAgIGlmICghbVN0YXRlKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbmZvVW5wYWNrZWQgPSBmYWxzZTsKKyAgICBtQm9va3NVbnBhY2tlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmIChtU3RhdGUpIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIHZvaWQgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIG9nZ19idWZmZXIgKmJ1Ziwgb2dnX3JlZmVyZW5jZSAqcmVmLCBvZ2dwYWNrX2J1ZmZlciAqYml0cykgeworICAgIGJ1Zi0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+cmVmY291bnQgPSAxOworICAgIGJ1Zi0+cHRyLm93bmVyID0gbnVsbHB0cjsKKworICAgIHJlZi0+YnVmZmVyID0gYnVmOworICAgIHJlZi0+YmVnaW4gPSAwOworICAgIHJlZi0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZWYtPm5leHQgPSBudWxscHRyOworCisgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOworfQorCisvLyAoQ0hFQ0shKSBtdWx0aWZyYW1lIGlzIHRyaWNreS4gZGVjb2RlIGNhbGwgZG9lc250IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisvLyBjb25zdW1lZCBieSB0aGUgY29tcG9uZW50LiBBbHNvIGl0IGlzIHVuY2xlYXIgd2h5IG51bVBhZ2VGcmFtZXMgaXMgYmVpbmcKKy8vIHRhZ2dlZCBhdCB0aGUgZW5kIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIG5ldyBwYWdlcy4gUmVmZXIgbGluZXMgMjk3LTMwMCBpbgorLy8gU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaW50MzJfdCBudW1DaGFubmVscyAgPSBtVmktPmNoYW5uZWxzOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgIGlmIChpblNpemUgPiA3ICYmICFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgeworICAgICAgICBpZiAoKGRhdGFbMF0gIT0gMSkgJiYgKGRhdGFbMF0gIT0gNSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHR5cGUgcmVjZWl2ZWQgJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgLy8gc2tpcCA3IDx0eXBlICsgInZvcmJpcyI+IGJ5dGVzCisgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgaW5TaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworICAgICAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBpbmZvIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVZpLT5jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmZvVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtSW5mb1VucGFja2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRhdGEgd2l0aCB0eXBlOjUgc2VudCBiZWZvcmUgc2VuZGluZyB0eXBlOjEiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgYm9va3MiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIGRzcCBpbml0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvb2tzVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBDT0RFQ19DT05GSUcgZGF0YSBtSW5mb1VucGFja2VkOiAlZCBtQm9va3NVbnBhY2sgJWQiLCBtSW5mb1VucGFja2VkLCBtQm9va3NVbnBhY2tlZCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgbnVtUGFnZUZyYW1lcyA9IDA7CisgICAgaWYgKGluU2l6ZSA8IHNpemVvZihudW1QYWdlRnJhbWVzKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgaGVhZGVyIGhhcyBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwgaW5TaXplLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgeworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CisgICAgfQorCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBidWYuc2l6ZSA9IGluU2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgcmVmLm5leHQgPSBudWxscHRyOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgc2l6ZV90IG1heFNhbXBsZXNJbkJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCAqIG1WaS0+Y2hhbm5lbHM7CisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gIG1heFNhbXBsZXNJbkJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUZyYW1lcyA9IDA7CisgICAgaW50IHJldCA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgIGlmICgwICE9IHJldCkgeworICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQ7IGlnbm9yZWQiLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDlkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFZQOSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZweERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOUVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAorCisgICAgY2ZsYWdzOiBbIi1EVlA5Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA4RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNzE3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOEVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA4LmVuY29kZXIiOworCitDMlNvZnRWcDhFbmM6OkMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLCBtRENUUGFydGl0aW9ucygwKSwgbVByb2ZpbGUoMSkge30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOF9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1RPS0VOX1BBUlRJVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EQ1RQYXJ0aXRpb25zKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBkY3QgcGFydGl0aW9ucyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgfQorICAgIHJldHVybiBjb2RlY19yZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOEVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDhFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOEVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNmYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOCBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRva2VuIHBhcnRpdGlvbmluZworc3RydWN0IEMyU29mdFZwOEVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gTWF4IHZhbHVlIHN1cHBvcnRlZCBmb3IgRENUIHBhcnRpdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERDVFBhcnRpdGlvbnMgPSAzOworCisgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgorICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCisgICAgaW50MzJfdCBtRENUUGFydGl0aW9uczsKKworICAgIC8vIEMyIFByb2ZpbGUgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOEVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA5RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOUVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciI7CisKK0MyU29mdFZwOUVuYzo6QzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksCisgICAgICBtUHJvZmlsZSgxKSwKKyAgICAgIG1MZXZlbCgwKSwKKyAgICAgIG1UaWxlQ29sdW1ucygwKSwKKyAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcoZmFsc2UpIHsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSB7CisgICAgbUNvZGVjSW50ZXJmYWNlID0gdnB4X2NvZGVjX3ZwOV9jeCgpOworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSB7CisgICAgc3dpdGNoIChtUHJvZmlsZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgfQorfQorCit2cHhfY29kZWNfZXJyX3QgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSB7CisgICAgdnB4X2NvZGVjX2Vycl90IGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9USUxFX0NPTFVNTlMsIG1UaWxlQ29sdW1ucyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9USUxFX0NPTFVNTlMgdG8gJWQuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBtVGlsZUNvbHVtbnMsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcsCisgICAgICAgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HIHRvICVkLiIKKyAgICAgICAgICAgICAgInZweF9jb2RlY19jb250cm9sKCkgcmV0dXJuZWQgJWQiLCBtRnJhbWVQYXJhbGxlbERlY29kaW5nLAorICAgICAgICAgICAgICBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9ST1dfTVQsIDEpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfUk9XX01UIHRvIDEuIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB3ZSBhbHdheXMgc2V0IENQVV9VU0VEIHRvIDggKGJlY2F1c2UgdGhlIHJlYWx0aW1lIGRlZmF1bHQgaXMgMAorICAgIC8vIHdoaWNoIGlzIHRvbyBzbG93KS4KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOEVfU0VUX0NQVVVTRUQsIDgpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA4RV9TRVRfQ1BVVVNFRCB0byA4LiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIHJldHVybiBjb2RlY1JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA5RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOUVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA5RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA5RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZjhmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA5IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdGlsZSByb3dzCisvLyAgICAtIHRpbGUgY29sdW1ucworLy8gICAgLSBmcmFtZSBwYXJhbGxlbCBtb2RlCitzdHJ1Y3QgQzJTb2Z0VnA5RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA5RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBDMiBQcm9maWxlICYgTGV2ZWwgcGFyYW1ldGVyCisgICAgaW50MzJfdCBtUHJvZmlsZTsKKyAgICBpbnQzMl90IG1MZXZlbCBfX3VudXNlZDsKKworICAgIGludDMyX3QgbVRpbGVDb2x1bW5zOworCisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbERlY29kaW5nOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA5RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTIzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcHhEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZGVjb2RlciI7CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0VnB4RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBWUDkKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBWUDkKKyAgICAgICAgLy8gVE9ETzogQWRkIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8ySERSID8/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV81LAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmIDAKKyAgICAgICAgLy8gc2FtcGxlIEJULjIwMjAgc3RhdGljIGluZm8KKyAgICAgICAgbUhkclN0YXRpY0luZm8gPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigpOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWFzdGVyaW5nID0geworICAgICAgICAgICAgLnJlZCAgID0geyAueCA9IDAuNzA4LCAgLnkgPSAwLjI5MiB9LAorICAgICAgICAgICAgLmdyZWVuID0geyAueCA9IDAuMTcwLCAgLnkgPSAwLjc5NyB9LAorICAgICAgICAgICAgLmJsdWUgID0geyAueCA9IDAuMTMxLCAgLnkgPSAwLjA0NiB9LAorICAgICAgICAgICAgLndoaXRlID0geyAueCA9IDAuMzEyNywgLnkgPSAwLjMyOTAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IDAuMSwKKyAgICAgICAgfTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heENsbCA9IDEwMDA7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhGYWxsID0gMTIwOworCisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhMdW1pbmFuY2UgPSAwOyAvLyBkaXNhYmxlIHN0YXRpYyBpbmZvCisKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCwgQzJDb2xvclh5U3RydWN0PigpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkclN0YXRpY0luZm8sIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkclN0YXRpY0luZm8pCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkclN0YXRpY0luZm8sIG1hc3RlcmluZy5yZWQueCkuaW5SYW5nZSgwLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyU3RhdGljSW5mb1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlZpZGVvU2l6ZVN0cmVhbUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMjA0OHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMjA0OHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZ2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSGRyMTBQbHVzSW5mb091dHB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworI2lmZGVmIFZQOQorI2lmIDAKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+IG1IZHJTdGF0aWNJbmZvOworI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+IG1IZHIxMFBsdXNJbmZvSW5wdXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBtSGRyMTBQbHVzSW5mb091dHB1dDsKKyNlbmRpZgorfTsKKworQzJTb2Z0VnB4RGVjOjpDMlNvZnRWcHhEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpIHsKK30KKworQzJTb2Z0VnB4RGVjOjp+QzJTb2Z0VnB4RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykKKyAgICB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggZGVjb2Rlci4gVHJ5IHRvIGhhcmQgcmVzZXQgZGVjb2RlciIpOworICAgICAgICBkZXN0cm95RGVjb2RlcigpOworICAgICAgICAodm9pZClpbml0RGVjb2RlcigpOworICAgIH0KK30KKwordm9pZCBDMlNvZnRWcHhEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBkZXN0cm95RGVjb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgeworICAgICAgICAvLyBGbHVzaCBkZWNvZGVyIGJ5IHBhc3NpbmcgbnVsbHB0ciBkYXRhIHB0ciBhbmQgMCBzaXplLgorICAgICAgICAvLyBJZGVhbGx5LCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLgorICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIG9uMiBkZWNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERyb3AgYWxsIHRoZSBkZWNvZGVkIGZyYW1lcyBpbiBkZWNvZGVyLgorICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgd2hpbGUgKHZweF9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcikpIHsKKyAgICB9CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBpbnQgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiBjcHVDb3JlQ291bnQ7Cit9CisKK3N0YXR1c190IEMyU29mdFZweERlYzo6aW5pdERlY29kZXIoKSB7CisjaWZkZWYgVlA5CisgICAgbU1vZGUgPSBNT0RFX1ZQOTsKKyNlbHNlCisgICAgbU1vZGUgPSBNT0RFX1ZQODsKKyNlbmRpZgorCisgICAgbVdpZHRoID0gMzIwOworICAgIG1IZWlnaHQgPSAyNDA7CisgICAgbUZyYW1lUGFyYWxsZWxNb2RlID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICB9CisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgQUxPR0UoIm1Db2RlY0N0eCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdnB4X2NvZGVjX2RlY19jZmdfdCBjZmc7CisgICAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZih2cHhfY29kZWNfZGVjX2NmZ190KSk7CisgICAgY2ZnLnRocmVhZHMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKworICAgIHZweF9jb2RlY19mbGFnc190IGZsYWdzOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZih2cHhfY29kZWNfZmxhZ3NfdCkpOworICAgIGlmIChtRnJhbWVQYXJhbGxlbE1vZGUpIGZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfRlJBTUVfVEhSRUFESU5HOworCisgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CisgICAgaWYgKCh2cHhfZXJyID0gdnB4X2NvZGVjX2RlY19pbml0KAorICAgICAgICAgICAgICAgICBtQ29kZWNDdHgsIG1Nb2RlID09IE1PREVfVlA4ID8gJnZweF9jb2RlY192cDhfZHhfYWxnbyA6ICZ2cHhfY29kZWNfdnA5X2R4X2FsZ28sCisgICAgICAgICAgICAgICAgICZjZmcsIGZsYWdzKSkpIHsKKyAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgdnB4X2Vycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkZXN0cm95RGVjb2RlcigpIHsKKyAgICBpZiAgKG1Db2RlY0N0eCkgeworICAgICAgICB2cHhfY29kZWNfZGVzdHJveShtQ29kZWNDdHgpOworICAgICAgICBkZWxldGUgbUNvZGVjQ3R4OworICAgICAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdFZweERlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleCwgaW50ZiA9IHRoaXMtPm1JbnRmXSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworCisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbTogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0ICpoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkZyb20ocGFyYW0uZ2V0KCkpOworCisgICAgICAgICAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBvdXRQYXJhbSA9IEMyUGFyYW06OkNvcHlBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW0uZ2V0KCksIHRydWUgLypvdXRwdXQqLywgcGFyYW0tPnN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgb3V0UGFyYW0uZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqb3V0UGFyYW0uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmaW5pc2hXb3JrOiBDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKwordm9pZCBDMlNvZnRWcHhEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPTApOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIC8vIFNvZnR3YXJlIFZQOSBEZWNvZGVyIGRvZXMgbm90IG5lZWQgdGhlIENvZGVjIFNwZWNpZmljIERhdGEgKENTRCkKKyAgICAvLyAoc3BlY2lmaWVkIGluIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3ZwOS9wcm9maWxlcy8pLiBJZ25vcmUgaXQgaWYKKyAgICAvLyBpdCB3YXMgcGFzc2VkLgorICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAvLyBJZ25vcmUgQ1NEIGJ1ZmZlciBmb3IgVlA5LgorICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9WUDkpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUb2xlcmF0ZSB0aGUgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBUaGlzIGlzIGEgd29ya2Fyb3VuZAorICAgICAgICAgICAgLy8gZm9yIGIvMjg2ODk1MzYuIGNvbnRpbnVlCisgICAgICAgICAgICBBTE9HVygiV0FSTklORzogR290IENTRCBidWZmZXIgZm9yIFZQOC4gQ29udGludWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKKworICAgIGlmIChpblNpemUpIHsKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgdnB4X2NvZGVjX2Vycl90IGVyciA9IHZweF9jb2RlY19kZWNvZGUoCisgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgsIDApOworICAgICAgICBpZiAoZXJyICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAodm9pZClvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBhbGlnbih3aWR0aCwgMTYpOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOworCisgICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOworICAgICAgICBzaXplX3QgeCA9IDA7CisgICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKKworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7CisgICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7CisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFN0cmlkZSAqIGhlaWdodDsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RTdHJpZGUgLyAyLCAxNik7CisgICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIHJldHVybjsKK30KK2Jvb2wgQzJTb2Z0VnB4RGVjOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQoreworICAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKKworICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGltZy0+ZF93ICE9IG1XaWR0aCB8fCBpbWctPmRfaCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGltZy0+ZF93OworICAgICAgICBtSGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgQzJWaWRlb1NpemVTdHJlYW1JbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KKyAgICBDSEVDSyhpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwIHx8IGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICB9CisgICAgfQorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LCAoaW50KSooaW50NjRfdCAqKWltZy0+dXNlcl9wcml2KTsKKworICAgIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKyAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKworICAgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1kgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKworICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICBmaW5pc2hXb3JrKCooaW50NjRfdCAqKWltZy0+dXNlcl9wcml2LCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHdoaWxlICgob3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspKSkgeworICAgIH0KKworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TICYmCisgICAgICAgICAgICB3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0VnB4RmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZweEZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnB4RGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweERlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnB4RmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnB4RmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjODQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFZweERlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWcHhEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0VnB4RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIE1PREVfVlA4LAorICAgICAgICBNT0RFX1ZQOSwKKyAgICB9IG1Nb2RlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2cHhfY29kZWNfY3R4X3QgKm1Db2RlY0N0eDsKKyAgICBib29sIG1GcmFtZVBhcmFsbGVsTW9kZTsgIC8vIEZyYW1lIHBhcmFsbGVsIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFZQOSBkZWNvZGVyLgorCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcHhEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTVhODRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKQEAgLTAsMCArMSw2NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgIDIxNDc0ODM2NDcKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiAwCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorI2VuZGlmCisKK0MyU29mdFZweEVuYzo6QzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0NvbnRleHQobnVsbHB0ciksCisgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKG51bGxwdHIpLAorICAgICAgbUNvZGVjSW50ZXJmYWNlKG51bGxwdHIpLAorICAgICAgbVN0cmlkZUFsaWduKDIpLAorICAgICAgbUNvbG9yRm9ybWF0KFZQWF9JTUdfRk1UX0k0MjApLAorICAgICAgbUJpdHJhdGVDb250cm9sTW9kZShWUFhfVkJSKSwKKyAgICAgIG1FcnJvclJlc2lsaWVuY2UoZmFsc2UpLAorICAgICAgbU1pblF1YW50aXplcigwKSwKKyAgICAgIG1NYXhRdWFudGl6ZXIoMCksCisgICAgICBtVGVtcG9yYWxMYXllcnMoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZShWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpLAorICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCgwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgoMCksCisgICAgICBtTGFzdFRpbWVzdGFtcCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKKyAgICBtZW1zZXQobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIDAsIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdID0gMTAwOworfQorCitDMlNvZnRWcHhFbmM6On5DMlNvZnRWcHhFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQ29kZWNDb250ZXh0KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0NvbnRleHQpOworICAgICAgICBkZWxldGUgbUNvZGVjQ29udGV4dDsKKyAgICAgICAgbUNvZGVjQ29udGV4dCA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db2RlY0NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbmZpZ3VyYXRpb247CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBudWxscHRyOworICAgIH0KKworICAgIC8vIHRoaXMgb25lIGlzIG5vdCBhbGxvY2F0ZWQgYnkgdXMKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uU3RvcCgpIHsKKyAgICBvblJlbGVhc2UoKTsKKyAgICBtTGFzdFRpbWVzdGFtcCA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm47CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlTW9kZSA9IG1JbnRmLT5nZXRCaXRyYXRlTW9kZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtUmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSBtSW50Zi0+Z2V0VGVtcG9yYWxMYXllcnNfbCgpLT5tLmxheWVyQ291bnQ7CisgICAgfQorCisgICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEU6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX1ZCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUJpdHJhdGVDb250cm9sTW9kZSA9IFZQWF9DQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworICAgIGlmICghbUNvZGVjSW50ZXJmYWNlKSBnb3RvIENsZWFuVXA7CisKKyAgICBBTE9HRCgiVlB4OiBpbml0RW5jb2Rlci4gQlJNb2RlOiAldS4gVFNMYXllcnM6ICV6dS4gS0Y6ICV1LiBRUDogJXUgLSAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpLAorICAgICAgICAgIG1NaW5RdWFudGl6ZXIsIG1NYXhRdWFudGl6ZXIpOworCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbiA9IG5ldyB2cHhfY29kZWNfZW5jX2NmZ190OworICAgIGlmICghbUNvZGVjQ29uZmlndXJhdGlvbikgZ290byBDbGVhblVwOworICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQobUNvZGVjSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBwb3B1bGF0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICB9CisKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3cgPSBtU2l6ZS0+d2lkdGg7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19oID0gbVNpemUtPmhlaWdodDsKKyAgICAvL21Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGhyZWFkcyA9IGdldENwdUNvcmVDb3VudCgpOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGhyZWFkcyA9IDA7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSBtRXJyb3JSZXNpbGllbmNlOworCisgICAgLy8gdGltZWJhc2UgdW5pdCBpcyBtaWNyb3NlY29uZAorICAgIC8vIGdfdGltZWJhc2UgaXMgaW4gc2Vjb25kcyAoaS5lLiAxLzEwMDAwMDAgc2Vjb25kcykKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLm51bSA9IDE7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5kZW4gPSAxMDAwMDAwOworICAgIC8vIHJjX3RhcmdldF9iaXRyYXRlIGlzIGluIGticHMsIG1CaXRyYXRlIGluIGJwcworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gKG1CaXRyYXRlLT52YWx1ZSArIDUwMCkgLyAxMDAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2VuZF91c2FnZSA9IG1CaXRyYXRlQ29udHJvbE1vZGU7CisgICAgLy8gRGlzYWJsZSBmcmFtZSBkcm9wIC0gbm90IGFsbG93ZWQgaW4gTWVkaWFDb2RlYyBub3cuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZHJvcGZyYW1lX3RocmVzaCA9IDA7CisgICAgLy8gRGlzYWJsZSBsYWdnZWQgZW5jb2RpbmcuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19sYWdfaW5fZnJhbWVzID0gMDsKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIC8vIERpc2FibGUgc3BhdGlhbCByZXNpemluZy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfcmVzaXplX2FsbG93ZWQgPSAwOworICAgICAgICAvLyBTaW5nbGUtcGFzcyBtb2RlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Bhc3MgPSBWUFhfUkNfT05FX1BBU1M7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdW5kZXJzaG9vdF9wY3QgPSAxMDA7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19vdmVyc2hvb3RfcGN0ID0gMTU7CisgICAgICAgIC8vIEluaXRpYWwgdmFsdWUgb2YgdGhlIGJ1ZmZlciBsZXZlbCBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX2luaXRpYWxfc3ogPSA1MDA7CisgICAgICAgIC8vIEFtb3VudCBvZiBkYXRhIHRoYXQgdGhlIGVuY29kZXIgc2hvdWxkIHRyeSB0byBtYWludGFpbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogPSA2MDA7CisgICAgICAgIC8vIFRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSBidWZmZXJlZCBieSB0aGUgZGVjb2RpbmcKKyAgICAgICAgLy8gYXBwbGljYXRpb24gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9zeiA9IDEwMDA7CisgICAgICAgIC8vIEVuYWJsZSBlcnJvciByZXNpbGllbmNlIC0gbmVlZGVkIGZvciBwYWNrZXQgbG9zcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSAxOworICAgICAgICAvLyBNYXhpbXVtIGtleSBmcmFtZSBpbnRlcnZhbCAtIGZvciBDQlIgYm9vc3QgdG8gMzAwMAorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IDMwMDA7CisgICAgICAgIC8vIEVuY29kZXIgZGV0ZXJtaW5lcyBvcHRpbWFsIGtleSBmcmFtZSBwbGFjZW1lbnQgYXV0b21hdGljYWxseS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKworICAgIC8vIEZyYW1lcyB0ZW1wb3JhbCBwYXR0ZXJuIC0gZm9yIG5vdyBXZWJSVEMgbGlrZSBwYXR0ZXJuIGlzIG9ubHkgc3VwcG9ydGVkLgorICAgIHN3aXRjaCAobVRlbXBvcmFsTGF5ZXJzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAzOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbM10gPSAyOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzICV6dSIsIG1UZW1wb3JhbExheWVycyk7CisgICAgICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorICAgIC8vIFNldCBiaXRyYXRlIHZhbHVlcyBmb3IgZWFjaCBsYXllcgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVyczsgaSsrKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3RhcmdldF9iaXRyYXRlW2ldID0KKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlICoKKyAgICAgICAgICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldIC8gMTAwOworICAgIH0KKyAgICBpZiAobUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpID49IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21pbl9kaXN0ID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorICAgIGlmIChtTWluUXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19taW5fcXVhbnRpemVyID0gbU1pblF1YW50aXplcjsKKyAgICB9CisgICAgaWYgKG1NYXhRdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21heF9xdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgIH0KKyAgICBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworICAgIG1Db2RlY0NvbnRleHQgPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIGlmICghbUNvZGVjQ29udGV4dCkgZ290byBDbGVhblVwOworICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfaW5pdChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgLy8gZmxhZ3MKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW5pdGlhbGl6aW5nIHZweCBlbmNvZGVyIik7CisgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICB9CisKKyAgICAvLyBFeHRyYSBDQlIgc2V0dGluZ3MKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgdWludDMyX3QgcmNfbWF4X2ludHJhX3RhcmdldCA9CisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiAqIG1GcmFtZVJhdGUtPnZhbHVlIC8gMjAgKyAwLjUpOworICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgMyB0aW1lcyBwZXIgZnJhbWUgYmFuZHdpZHRoLgorICAgICAgICAgICAgaWYgKHJjX21heF9pbnRyYV90YXJnZXQgPCAzMDApIHsKKyAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0ID0gMzAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgY2JyIHBhcmFtZXRlcnMgZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICAgICAgZ290byBDbGVhblVwOworICAgICAgICB9CisgICAgfQorCisgICAgY29kZWNfcmV0dXJuID0gc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIGdvdG8gQ2xlYW5VcDsKKworICAgIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgICAgIGlmICgoKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0KSA+CisgICAgICAgICAgICAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yNTgxMjc5NCwgQnVmZmVyIHNpemUgaXMgdG9vIGJpZywgd2lkdGg9JXUsIGhlaWdodD0ldS4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSA9ICh3aWR0aCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHZzdHJpZGUgPSAoaGVpZ2h0ICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBNZW1vcnlCbG9jazo6QWxsb2NhdGUoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIGlmICghbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTnVtSW5wdXRGcmFtZXMgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK0NsZWFuVXA6CisgICAgb25SZWxlYXNlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordnB4X2VuY19mcmFtZV9mbGFnc190IEMyU29mdFZweEVuYzo6Z2V0RW5jb2RlRmxhZ3MoKSB7CisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKyAgICBpZiAobVRlbXBvcmFsUGF0dGVybkxlbmd0aCA+IDApIHsKKyAgICAgIGludCBwYXR0ZXJuSWR4ID0gbVRlbXBvcmFsUGF0dGVybklkeCAlIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4Kys7CisgICAgICBzd2l0Y2ggKG1UZW1wb3JhbFBhdHRlcm5bcGF0dGVybklkeF0pIHsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3Q6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmU6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKKy8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBZVVYgaW5wdXQgY29sb3IgZm9ybWF0cworLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIFNWQywgQVJGLiBTVkMgYW5kIEFSRiByZXR1cm5zIG11bHRpcGxlIGZyYW1lcworLy8gKGhpZXJhcmNoaWNhbCAvIG5vc2hvdykgaW4gb25lIGNhbGwuIFRoZXNlIGZyYW1lcyBzaG91bGQgYmUgY29tYmluZWQgaW4gdG8KKy8vIGEgc2luZ2xlIGJ1ZmZlciBhbmQgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkKKyAgICBpZiAoIW1Db2RlY0NvbnRleHQgJiYgT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gclZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHJWaWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmIChyVmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCByVmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiRW1wdHkgaW5wdXQgQnVmZmVyIik7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPQorICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpICE9IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbkJ1ZmZlci5oZWlnaHQoKSAhPSBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIElucHV0IGJ1ZmZlciBhdHRyaWJ1dGVzICVkKCVkKSB4ICVkKCVkKSIsCisgICAgICAgICAgICAgIGluQnVmZmVyLndpZHRoKCksIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksCisgICAgICAgICAgICAgIG1TaXplLT5oZWlnaHQpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgdnB4X2ltYWdlX3QgcmF3X2ZyYW1lOworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSByVmlldy0+bGF5b3V0KCk7CisgICAgdWludDMyX3Qgd2lkdGggPSByVmlldy0+d2lkdGgoKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSByVmlldy0+aGVpZ2h0KCk7CisgICAgaWYgKHdpZHRoID4gMHg4MDAwIHx8IGhlaWdodCA+IDB4ODAwMCkgeworICAgICAgICBBTE9HRSgiSW1hZ2UgdG9vIGJpZzogJXUgeCAldSIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDMyX3Qgc3RyaWRlID0gKHdpZHRoICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgIHVpbnQzMl90IHZzdHJpZGUgPSAoaGVpZ2h0ICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgc3RyaWRlLCB2c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKnJWaWV3LmdldCgpKTsKKyAgICAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgbUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCpyVmlldykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIHRob3VnaCB3aXRoIGN1c3RvbSBvZmZzZXQgYW5kIHN0cmlkZQorICAgICAgICAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzBdKTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUucGxhbmVzWzFdID0gKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMV07CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnBsYW5lc1syXSA9ICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzJdOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMF0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yb3dJbmM7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVsxXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvd0luYzsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzJdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm93SW5jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkgPj0gc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICpyVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgc3RyaWRlLCB2c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCAodWludDhfdCopclZpZXctPmRhdGEoKVswXSk7CisgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfc2V0X3JlY3QoJnJhd19mcmFtZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnNpb24gYnVmZmVyIGlzIHRvbyBzbWFsbDogJXUgeCAldSBmb3IgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHZzdHJpZGUsIG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IGdldEVuY29kZUZsYWdzKCk7CisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChpbnRyYVJlZnJlc2ggIT0gbUludHJhUmVmcmVzaCkgeworICAgICAgICAgICAgbUludHJhUmVmcmVzaCA9IGludHJhUmVmcmVzaDsKKyAgICAgICAgICAgIEFMT0dWKCJHb3QgbUludHJhUmVmcmVzaCByZXF1ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdFN5bmMgIT0gbVJlcXVlc3RTeW5jKSB7CisgICAgICAgICAgICAvLyB3ZSBjYW4gaGFuZGxlIElEUiBpbW1lZGlhdGVseQorICAgICAgICAgICAgaWYgKHJlcXVlc3RTeW5jLT52YWx1ZSkgeworICAgICAgICAgICAgICAgIC8vIHVuc2V0IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCBjbGVhclN5bmMoMHUsIEMyX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7ICZjbGVhclN5bmMgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3Qgc3luYyByZXF1ZXN0Iik7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlBYX0VGTEFHX0ZPUkNFX0tGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RTeW5jID0gcmVxdWVzdFN5bmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYml0cmF0ZSAhPSBtQml0cmF0ZSkgeworICAgICAgICAgICAgbUJpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPQorICAgICAgICAgICAgICAgIChtQml0cmF0ZS0+dmFsdWUgKyA1MDApIC8gMTAwMDsKKyAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXQobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ2cHggZW5jb2RlciBmYWlsZWQgdG8gdXBkYXRlIGJpdHJhdGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCBpbnB1dFRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgIGlmIChpbnB1dFRpbWVTdGFtcCA+IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKGlucHV0VGltZVN0YW1wIC0gbUxhc3RUaW1lc3RhbXApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBkZWZhdWx0IG9mIDMwIGZwcyBpbiBjYXNlIG9mIDAgZnJhbWUgcmF0ZS4KKyAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIGlmIChmcmFtZVJhdGUgPCAwLjAwMSkgeworICAgICAgICAgICAgZnJhbWVSYXRlID0gMzA7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoMTAwMDAwMCAvIGZyYW1lUmF0ZSArIDAuNSk7CisgICAgfQorICAgIG1MYXN0VGltZXN0YW1wID0gaW5wdXRUaW1lU3RhbXA7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZShtQ29kZWNDb250ZXh0LCAmcmF3X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb24sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQWF9ETF9SRUFMVElNRSk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoInZweCBlbmNvZGVyIGZhaWxlZCB0byBlbmNvZGUgZnJhbWUiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBwb3B1bGF0ZWQgPSBmYWxzZTsKKyAgICB2cHhfY29kZWNfaXRlcl90IGVuY29kZWRfcGFja2V0X2l0ZXJhdG9yID0gbnVsbHB0cjsKKyAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QqIGVuY29kZWRfcGFja2V0OworICAgIHdoaWxlICgoZW5jb2RlZF9wYWNrZXQgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoCisgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsICZlbmNvZGVkX3BhY2tldF9pdGVyYXRvcikpKSB7CisgICAgICAgIGlmIChlbmNvZGVkX3BhY2tldC0+a2luZCA9PSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6LCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KHdWaWV3LmRhdGEoKSwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuYnVmLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeik7CisgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKworICAgICAgICAgICAgQUxPR0QoImJ5dGVzIGdlbmVyYXRlZCAlenUiLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeik7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayk7CisgICAgICAgICAgICBpZiAoZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuZmxhZ3MgJiBWUFhfRlJBTUVfSVNfS0VZKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMlBpY3R1cmVUeXBlS2V5RnJhbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUucHRzOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHBvcHVsYXRlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXBvcHVsYXRlZCkgeworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWQxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBUaGVzZSBkZWZzIHRha2VuIGZyb20gZGVwcmVjYXRlZCBPTVhfVmlkZW9FeHQuaC4gTW92ZSB0aGVzZSBkZWZpbml0aW9ucworLy8gdG8gYSBuZXcgaGVhZGVyIGZpbGUgYW5kIGluY2x1ZGUgaXQuCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgKi8KKyNkZWZpbmUgTUFYVEVNUE9SQUxMQVlFUlMgMworCisvKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KK3R5cGVkZWYgZW51bSBUZW1wb3JhbFBhdHRlcm5UeXBlIHsKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgPSAwLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDID0gMSwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk1heCA9IDB4N0ZGRkZGRkYKK30gVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYSBWUFggRW5jb2RlciBDb21wb25lbnQKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKGNvZGVjIHNwZWNpZmljIHNldHRpbmdzIG1pZ2h0CisvLyBiZSBhdmFpbGFibGUgaW4gdGhlIHN1Yi1jbGFzc2VzKToKKy8vICAgIC0gdmlkZW8gcmVzb2x1dGlvbgorLy8gICAgLSB0YXJnZXQgYml0cmF0ZQorLy8gICAgLSByYXRlIGNvbnRyb2wgKGNvbnN0YW50IC8gdmFyaWFibGUpCisvLyAgICAtIGZyYW1lIHJhdGUKKy8vICAgIC0gZXJyb3IgcmVzaWxpZW5jZQorLy8gICAgLSByZWNvbnN0cnVjdGlvbiAmIGxvb3AgZmlsdGVycyAoZ19wcm9maWxlKQorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGNvbG9yIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkEKKy8vCisvLyBGb2xsb3dpbmcgc2V0dGluZ3MgYXJlIG5vdCBjb25maWd1cmFibGUgYnkgdGhlIGNsaWVudAorLy8gICAgLSBlbmNvZGluZyBkZWFkbGluZSBpcyByZWFsdGltZQorLy8gICAgLSBtdWx0aXRocmVhZGVkIGVuY29kaW5nIHV0aWxpemVzIGEgbnVtYmVyIG9mIHRocmVhZHMgZXF1YWwKKy8vIHRvIG9ubGluZSBjcHUncyBhdmFpbGFibGUKKy8vICAgIC0gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGVuY29kZXIgaXMgZGVjaWRlZCBieSB0aGUgc3ViLWNsYXNzIGluIHVzZQorLy8gICAgLSBmcmFjdGlvbmFsIGJpdHMgb2YgZnJhbWUgcmF0ZSBpcyBkaXNjYXJkZWQKKy8vICAgIC0gdGltZXN0YW1wcyBhcmUgaW4gbWljcm9zZWNvbmRzLCB0aGVyZWZvcmUgZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZAorLy8gdG8gMS8xMDAwMDAwCisKK3N0cnVjdCBDMlNvZnRWcHhFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlIGZpbmFsOworCisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworCisgcHJvdGVjdGVkOgorICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgICB2aXJ0dWFsIH5DMlNvZnRWcHhFbmMoKTsKKworICAgICAvLyBJbml0aWFsaXplcyB2cHggZW5jb2RlciB3aXRoIGF2YWlsYWJsZSBzZXR0aW5ncy4KKyAgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgICAvLyBQb3B1bGF0ZXMgbUNvZGVjSW50ZXJmYWNlIHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBjb250cm9scy4KKyAgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgPSAwOworCisgICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncy4KKyAgICAgdmlydHVhbCB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKworICAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgIH07CisgICAgIGVudW0geworICAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICAgfTsKKworICAgICAvLyB2cHggc3BlY2lmaWMgb3BhcXVlIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgc3RhdGUKKyAgICAgdnB4X2NvZGVjX2N0eF90KiBtQ29kZWNDb250ZXh0OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCogbUNvZGVjQ29uZmlndXJhdGlvbjsKKworICAgICAvLyB2cHggc3BlY2lmaWMgcmVhZC1vbmx5IGRhdGEgc3RydWN0dXJlCisgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFsZ29yaXRobSBpbnRlcmZhY2UgKGUuZy4gdnA4KQorICAgICB2cHhfY29kZWNfaWZhY2VfdCogbUNvZGVjSW50ZXJmYWNlOworCisgICAgIC8vIGFsaWduIHN0cmlkZSB0byB0aGUgcG93ZXIgb2YgMgorICAgICBpbnQzMl90IG1TdHJpZGVBbGlnbjsKKworICAgICAvLyBDb2xvciBmb3JtYXQgZm9yIHRoZSBpbnB1dCBwb3J0CisgICAgIHZweF9pbWdfZm10X3QgbUNvbG9yRm9ybWF0OworCisgICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKKyAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKKworICAgICAvLyBQYXJhbWV0ZXIgdGhhdCBkZW5vdGVzIHdoZXRoZXIgZXJyb3IgcmVzaWxpZW5jZQorICAgICAvLyBpcyBlbmFibGVkIGluIGVuY29kZXIKKyAgICAgYm9vbCBtRXJyb3JSZXNpbGllbmNlOworCisgICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bTUFYVEVNUE9SQUxMQVlFUlNdOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgICBUZW1wb3JhbFBhdHRlcm5UeXBlIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgIHVpbnQ2NF90IG1MYXN0VGltZXN0YW1wOworCisgICAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMKKyAgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGlucHV0IHRvCisgICAgIC8vIHl1djQyMCBwbGFuYXIgZm9ybWF0LgorICAgICBNZW1vcnlCbG9jayBtQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgICAvLyBTaWduYWxsZWQgRU9TCisgICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgICAvLyBTaWduYWxsZWQgRXJyb3IKKyAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweEVuYyk7Cit9OworCitjbGFzcyBDMlNvZnRWcHhFbmM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX05BTUVfSU5QVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dCgwdSwgQzJGb3JtYXRWaWRlbykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX05BTUVfT1VUUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdENvbXByZXNzZWQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX05BTUVfSU5QVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfTkFNRV9PVVRQVVRfUE9SVF9NSU1FX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4oCisjaWZkZWYgVlA5CisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fVVNBR0VfU0VUVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX05BTUVfU1RSRUFNX1ZJREVPX1NJWkVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9DT05TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9OQU1FX1NUUkVBTV9GUkFNRV9SQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXllcmluZywgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwdSwgMCwgMCwgMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmxheWVyQ291bnQpLmluUmFuZ2UoMCwgNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0uYkxheWVyQ291bnQpLmluUmFuZ2UoMCwgMCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0uYml0cmF0ZVJhdGlvcykuaW5SYW5nZSgwLiwgMS4pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihMYXllcmluZ1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDlfMCwgTEVWRUxfVlA5XzRfMSkpCisgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA5XzAKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgTEVWRUxfVlA5XzRfMSksCisgICAgICAgIH0pCisgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+IDQpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0ubGF5ZXJDb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgbWUuc2V0KCkubS5iTGF5ZXJDb3VudCA9IDA7CisgICAgICAgIC8vIGVuc3VyZSByYXRpb3MgYXJlIG1vbm90b25pYyBhbmQgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0uYml0cmF0ZVJhdGlvc1tpeF0gPSBjMl9jbGFtcCgKKyAgICAgICAgICAgICAgICBpeCA+IDAgPyBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeCAtIDFdIDogMCwgbWUudi5tLmJpdHJhdGVSYXRpb3NbaXhdLCAxLik7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0koInNldHRpbmcgdGVtcG9yYWwgbGF5ZXJpbmcgJXUgKyAldSIsIG1lLnYubS5sYXllckNvdW50LCBtZS52Lm0uYkxheWVyQ291bnQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7IHJldHVybiBtTGF5ZXJpbmc7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Gb3JtYXRDb25maWc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1pbWVDb25maWc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBtTGF5ZXJpbmc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCaXRyYXRlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWQ1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTVjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF94YWFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRYYWFjRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlieGFhY2RlYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwZTcwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAKQEAgLTAsMCArMSwxNTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRYYWFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFhhYWNEZWMuaCIKKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIC0xNi4wICAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEuMCAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgwLjI1KSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUX1RZUEUgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisKKyNkZWZpbmUgUkVUVVJOX0lGX0ZBVEFMKHJldHZhbCwgc3RyKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChyZXR2YWwgJiBJQV9GQVRBTF9FUlJPUikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dFKCJFcnJvciBpbiAlczogUmV0dXJuZWQ6ICVkIiwgc3RyLCByZXR2YWwpOyAgIFwKKyAgICAgICAgcmV0dXJuIHJldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAocmV0dmFsICE9IElBX05PX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dXKCJXYXJuaW5nIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7IFwKKyAgICB9CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQueGFhYy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0WGFhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfTkFNRV9JTlBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6aW5wdXQoMHUsIEMyRm9ybWF0Q29tcHJlc3NlZCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9OQU1FX09VVFBVVF9TVFJFQU1fRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0KDB1LCBDMkZvcm1hdEF1ZGlvKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9OQU1FX1NUUkVBTV9TQU1QTEVfUkFURV9TRVRUSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9OQU1FX1NUUkVBTV9CSVRSQVRFX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkJpdHJhdGVUdW5pbmc6OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9OQU1FX1NUUkVBTV9BQUNfRk9STUFUX1NFVFRJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0KDB1LCBDMkFhY1N0cmVhbUZvcm1hdFJhdykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWFjRm9ybWF0LCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICBDMkFhY1N0cmVhbUZvcm1hdFJhdywgQzJBYWNTdHJlYW1Gb3JtYXRBZHRzCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUFhY0Zvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0NvbXByZXNzTW9kZSwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNDb21wcmVzc01vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0NvbXByZXNzTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjVGFyZ2V0UmVmTGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY1RhcmdldFJlZkxldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNUYXJnZXRSZWZMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRW5jVGFyZ2V0TGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjRW5jVGFyZ2V0TGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VuY1RhcmdldExldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNCb29zdEZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNCb29zdEZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNCb29zdEZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQXR0ZW51YXRpb25GYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0F0dGVudWF0aW9uRmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0F0dGVudWF0aW9uRmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFZmZlY3RUeXBlLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjRWZmZWN0VHlwZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VmZmVjdFR5cGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBib29sIGlzQWR0cygpIGNvbnN0IHsgcmV0dXJuIG1BYWNGb3JtYXQtPnZhbHVlID09IEMyQWFjU3RyZWFtRm9ybWF0QWR0czsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIGludDMyX3QgZ2V0RHJjQ29tcHJlc3NNb2RlKCkgY29uc3QgeyByZXR1cm4gbURyY0NvbXByZXNzTW9kZS0+dmFsdWUgPT0gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA/IDEgOiAwOyB9CisgICAgaW50MzJfdCBnZXREcmNUYXJnZXRSZWZMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNFbmNUYXJnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY0VuY1RhcmdldExldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNCb29zdEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNCb29zdEZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNBdHRlbnVhdGlvbkZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNFZmZlY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gbURyY0VmZmVjdFR5cGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRm9ybWF0Q29uZmlnOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJpdHJhdGVUdW5pbmc6OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitDMlNvZnRYYWFjRGVjOjpDMlNvZnRYYWFjRGVjKAorICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1NcGVnRERyY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0WGFhY0RlYzo6fkMyU29mdFhhYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0OworICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbVNhbXBGcmVxID0gMDsKKyAgICBtTnVtQ2hhbm5lbHMgPSAwOworICAgIG1QY21XZFN6ID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAwOworICAgIG1OdW1PdXRCeXRlcyA9IDA7CisgICAgbUN1ckZyYW1lSW5kZXggPSAwOworICAgIG1DdXJUaW1lc3RhbXAgPSAwOworICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1EUkNGbGFnID0gMDsKKyAgICBtTXBlZ0REUkNQcmVzZW50ID0gMDsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgSUFfRVJST1JDT0RFIGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBJQV9OT19FUlJPUiA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworCit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0OworICAgIGRyYWluRGVjb2RlcigpOworICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKKyAgICBtU2FtcEZyZXEgPSAwOworICAgIG1OdW1DaGFubmVscyA9IDA7CisgICAgbVBjbVdkU3ogPSAwOworICAgIG1DaGFubmVsTWFzayA9IDA7CisgICAgbU51bU91dEJ5dGVzID0gMDsKKyAgICBtQ3VyRnJhbWVJbmRleCA9IDA7CisgICAgbUN1clRpbWVzdGFtcCA9IDA7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtRFJDRmxhZyA9IDA7CisgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgSUFfRVJST1JDT0RFIGVyckNvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJDb2RlKSBBTE9HRSgiZGVJbml0WEFBQ0RlY29kZXIoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKworICAgIGVyckNvZGUgPSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyQ29kZSkgQUxPR0UoImRlSW5pdE1QRUdERERyYygpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworCisgICAgaWYgKG1PdXRwdXREcmFpbkJ1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7CisgICAgICAgIC8qIENhbGwgZGVJbml0IHRvIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIGlmICghbU91dHB1dERyYWluQnVmZmVyKSB7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW2tPdXRwdXREcmFpbkJ1ZmZlclNpemVdOworICAgICAgICBpZiAoIW1PdXRwdXREcmFpbkJ1ZmZlcikgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEcmMoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiaW5pdFhBQUNEcmMiKTsKKworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6OmZpbmlzaFdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIEFMT0dWKCJtQ3VyRnJhbWVJbmRleCA9ICUiIFBSSXU2NCwgbUN1ckZyYW1lSW5kZXgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaW50MTZfdCogb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4od1ZpZXcuZGF0YSgpKTsKKyAgICBtZW1jcHkob3V0QnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gYzJfY250cjY0X3QobUN1ckZyYW1lSW5kZXgpKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChtQ3VyRnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgIH0KKworICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICUiIFBSSXU2NCAiIC8gJXUiLCBtQ3VyVGltZXN0YW1wLCBibG9jay0+Y2FwYWNpdHkoKSk7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50OF90KiBpbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSAwOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBvZmZzZXQgPSAwdTsKKyAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgc2l6ZSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisgICAgaWYgKHNpemUgJiYgdmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBpZiAoc2l6ZSA9PSAwdSkgeworICAgICAgICAgICAgQUxPR0UoImVtcHR5IGNvZGVjIGNvbmZpZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90Kj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IHNpemU7CisKKyAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLworICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb25maWdYQUFDRGVjb2RlciBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUN1ckZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBtQ3VyVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgY2hhciogdGVtcE91dHB1dERyYWluQnVmZmVyID0gbU91dHB1dERyYWluQnVmZmVyOworICAgIHdoaWxlIChzaXplID4gMHUpIHsKKyAgICAgICAgaWYgKChrT3V0cHV0RHJhaW5CdWZmZXJTaXplICogc2l6ZW9mKGludDE2X3QpIC0KKyAgICAgICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcykgPAorICAgICAgICAgICAgKG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBkZWNvZGU6IG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiBEcmFpbkJ1ZmZlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiaW5BdHRyaWJ1dGUgc2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBBTE9HVigiQURUUyIpOworICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KKworICAgICAgICAgICAgY29uc3QgdWludDhfdCogYWR0c0hlYWRlciA9IHZpZXcuZGF0YSgpICsgb2Zmc2V0OworICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0gKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkdHNIZWFkZXJbNF0gPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLCBzaXplLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJOb24gQURUUyIpOworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBzaWduZWQgaW50IHByZXZTYW1wbGVSYXRlID0gbVNhbXBGcmVxOworICAgICAgICBzaWduZWQgaW50IHByZXZOdW1DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKworICAgICAgICAvKiBYQUFDIGRlY29kZXIgZXhwZWN0cyBmaXJzdCBmcmFtZSB0byBiZSBmZWQgdmlhIGNvbmZpZ1hBQUNEZWNvZGVyIEFQSQorICAgICAgICAgKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZQorICAgICAgICAgKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAqLworICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobVNhbXBGcmVxICE9IHByZXZTYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgICAgIChtTnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVNhbXBGcmVxLCBwcmV2TnVtQ2hhbm5lbHMsIG1OdW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TYW1wRnJlcSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaWduZWQgaW50IGJ5dGVzQ29uc3VtZWQgPSAwOworICAgICAgICBJQV9FUlJPUkNPREUgZXJyb3JDb2RlID0gSUFfTk9fRVJST1I7CisgICAgICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgZXJyb3JDb2RlID0gZGVjb2RlWEFBQ1N0cmVhbShpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc0NvbnN1bWVkLCAmbU51bU91dEJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgICAgICBBTE9HVygiQXNzdW1wdGlvbiB0aGF0IGZpcnN0IGZyYW1lIGFmdGVyIGhlYWRlciBpbml0aWFsaXplcyBkZWNvZGVyIEZhaWxlZCEiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICAgICBvZmZzZXQgKz0gYnl0ZXNDb25zdW1lZDsKKworICAgICAgICBpZiAoaW5CdWZmZXJMZW5ndGggIT0gKHVpbnQzMl90KWJ5dGVzQ29uc3VtZWQpCisgICAgICAgICAgICBBTE9HVygiQWxsIGRhdGEgbm90IGNvbnN1bWVkIik7CisKKyAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciwgZGVjb2RlciB3b3VsZCBoYXZlIGdpdmVuIG91dCBlbXB0eSBidWZmZXIgKi8KKyAgICAgICAgaWYgKChJQV9OT19FUlJPUiAhPSBlcnJvckNvZGUpICYmICgwID09IG1OdW1PdXRCeXRlcykgJiYgbUlzQ29kZWNJbml0aWFsaXplZCkKKyAgICAgICAgICAgIG1OdW1PdXRCeXRlcyA9IG1PdXRwdXRGcmFtZUxlbmd0aCAqIChtUGNtV2RTeiAvIDgpICogbU51bUNoYW5uZWxzOworCisgICAgICAgIGlmICghYnl0ZXNDb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR1coImJ5dGVzQ29uc3VtZWQgPSAwIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodWludDMyX3QpbU51bU91dEJ5dGVzID4KKyAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscykgeworICAgICAgICAgICAgQUxPR0UoIm1OdW1PdXRCeXRlcyA+IG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscywgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdywgQVNBTgorICAgICAgICAgICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIsIDAsIG1OdW1PdXRCeXRlcyk7CisKKyAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisgICAgICAgIG1lbWNweSh0ZW1wT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXRCdWZmZXIsIG1OdW1PdXRCeXRlcyk7CisgICAgICAgIHRlbXBPdXRwdXREcmFpbkJ1ZmZlciArPSBtTnVtT3V0Qnl0ZXM7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zICs9IG1OdW1PdXRCeXRlczsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpIHsKKyAgICAgICAgZmluaXNoV29yayh3b3JrLCBwb29sKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKyAgICBpZiAoZW9zKSBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKKyAgICB1aW50MzJfdCB1aV9pbml0X2RvbmU7CisgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSA4MjAzOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9GTFVTSF9NRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9GTFVTSF9NRU0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9GTFVTSF9NRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9GTFVTSF9NRU0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZIik7CisKKyAgICBpZiAodWlfaW5pdF9kb25lKSB7CisgICAgICAgIGVycl9jb2RlID0gZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiZ2V0WEFBQ1N0cmVhbUluZm8iKTsKKyAgICAgICAgQUxPR1YoIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdmbHVzaERlY29kZSgpOworICAgICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBjb25maWdmbHVzaERlY29kZTogRXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIC8qIE91dHB1dCBkZWxheSBjb21wZW5zYXRpb24gbG9naWMgc2hvdWxkIHNpdCBoZXJlLiAqLworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSBhcyBYQUFDIGRlY29kZXIgZG9lcyBub3QgaW50cm9kdWNlIG91dHB1dCBidWZmZXIgZGVsYXkgKi8KKworICAgIHJldHVybiAwOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdFhBQUNEZWNvZGVyKCkgeworICAgIC8qIEZpcnN0IHBhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBFcnJvciBIYW5kbGVyIEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogR2V0IExpYnJhcnkgTmFtZSwgTGlicmFyeSBWZXJzaW9uIGFuZCBBUEkgVmVyc2lvbiAqLworICAgIC8qIEluaXRpYWxpemUgQVBJIHN0cnVjdHVyZSArIERlZmF1bHQgY29uZmlnIHNldCAgICAgKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtcyBmcm9tIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW5pdGlhbGl6ZSBtZW1vcnkgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBtZW1vcnkgaW5mb3JtYXRpb24gYW5kIGFsbG9jYXRlIG1lbW9yeSAgICAgICAgKi8KKworICAgIG1JbnB1dEJ1ZmZlclNpemUgPSAwOworICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIEFQSSBzdHJ1Y3R1cmUgYW5kIHNldCBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEFQSSBzaXplICovCisgICAgdWludDMyX3QgcHVpX2FwaV9zaXplOworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVpX2FwaV9zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAoIW1YaGVhYWNDb2RlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChtWGhlYWFjQ29kZWNIYW5kbGUpOworCisgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiBHZXQgdGhlIEFQSSBzaXplICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShudWxscHRyLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmICghbU1wZWdERHJjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKG1NcGVnRERyY0hhbmRsZSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsIG51bGxwdHIpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQzMl90IHVpX21wNF9mbGFnID0gMTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9JU01QNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX21wNF9mbGFnKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0lTTVA0Iik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBNZW1vcnkgaW5mbyB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzJfdCB1aV9wcm9jX21lbV90YWJzX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworCisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAoIXB2X2FsbG9jX3B0cikgeworICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLCB1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIEFQSSwgcG9zdCBjb25maWcsIGZpbGwgbWVtb3J5IHRhYmxlcyAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEFsbG9jYXRlIE1lbW9yeSB3aXRoIGluZm8gZnJvbSBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IHR5cGVzIG9mIG1lbW9yaWVzLCB0aGF0IG5lZWRzIHRvIGJlIGFsbG9jYXRlZCAqLworICAgIC8qIHBlcnNpc3RlbnQsc2NyYXRjaCxpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IHVpX3NpemUgPSAwLCB1aV9hbGlnbm1lbnQgPSAwLCB1aV90eXBlID0gMDsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3NpemUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2FsaWdubWVudCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7CisgICAgICAgIGlmICghcHZfYWxsb2NfcHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9zaXplICsgdWlfYWxpZ25tZW50KSA9ICVkIGZhaWxlZCEiLAorICAgICAgICAgICAgICAgICAgIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX01FTV9QVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9JTlBVVCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gdWlfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlfdHlwZSA9PSBJQV9NRU1UWVBFX09VVFBVVCkKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXIgPSAocFdPUkQ4KXB2X2FsbG9jX3B0cjsKKyAgICB9CisgICAgLyogRW5kIGZpcnN0IHBhcnQgKi8KKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6aW5pdFhBQUNEcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgdW5zaWduZWQgaW50IHVpX2RyY192YWw7CisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVAorICAgIGludDMyX3QgdGFyZ2V0UmVmTGV2ZWwgPSBtSW50Zi0+Z2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIHRhcmdldFJlZkxldmVsKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCl0YXJnZXRSZWZMZXZlbDsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisKKyAgICAvKiBVc2UgdWlfZHJjX3ZhbCBmcm9tIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCBvciBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMCisgICAgICogZm9yIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MgdG9vICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludClhdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SCisgICAgaW50MzJfdCBib29zdEZhY3RvciA9IG1JbnRmLT5nZXREcmNCb29zdEZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQiLCBib29zdEZhY3Rvcik7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpYm9vc3RGYWN0b3I7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWNvbXByZXNzTW9kZTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCIpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWVmZmVjdFR5cGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUsICZ1aV9kcmNfdmFsKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CisgICAgQUxPR1YoImRlSW5pdFhBQUNEZWNvZGVyIik7CisKKyAgICAvKiBFcnJvciBjb2RlICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpZiAobVhoZWFhY0NvZGVjSGFuZGxlKSB7CisgICAgICAgIC8qIFRlbGwgdGhhdCB0aGUgaW5wdXQgaXMgb3ZlciBpbiB0aGlzIGJ1ZmZlciAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTlBVVF9PVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIH0KKworICAgIC8qIElycmVzcGVjdGl2ZSBvZiBlcnJvciByZXR1cm5lZCBpbiBJQV9BUElfQ01EX0lOUFVUX09WRVIsIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGZvciAodm9pZCogYnVmIDogbU1lbW9yeVZlYykgeworICAgICAgICBpZiAoYnVmKSBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVJbml0TVBFR0RERHJjKCkgeworICAgIEFMT0dWKCJkZUluaXRNUEVHREREcmMiKTsKKworICAgIGZvciAodm9pZCogYnVmIDogbURyY01lbW9yeVZlYykgeworICAgICAgICBpZiAoYnVmKSBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICBpZiAobUlucHV0QnVmZmVyU2l6ZSA8IGluQnVmZmVyTGVuZ3RoKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgY29uZmlnIEFBQywgaW5wdXQgYnVmZmVyIHNpemUgJWQgPCBpbkJ1ZmZlckxlbmd0aCAlZCIsIG1JbnB1dEJ1ZmZlclNpemUsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKiBDb3B5IHRoZSBidWZmZXIgcGFzc2VkIGJ5IEFuZHJvaWQgcGx1Z2luIHRvIGNvZGVjIGlucHV0IGJ1ZmZlciAqLworICAgIG1lbWNweShtSW5wdXRCdWZmZXIsIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIGlmIChtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQpIHsKKyAgICAgICAgLyogSWYgY29kZWMgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlbiBHQSBoZWFkZXIgaXMgcGFzc2VkIGFnYWluICovCisgICAgICAgIC8qIE5lZWQgdG8gY2FsbCB0aGUgRmx1c2ggQVBJIGluc3RlYWQgb2YgSU5JVF9QUk9DRVNTICovCisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsgLyogQ29kZWMgbmVlZHMgdG8gYmUgUmVpbml0aWFsaXplZCBhZnRlciBmbHVzaCAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfR0FfSERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9HQV9IRFIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworICAgIH0KKworICAgIHVpbnQzMl90IHVpX2luaXRfZG9uZTsKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIGluaXRpYWxpemF0aW9uICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9pbml0X2RvbmUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlkiKTsKKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBpbnQzMl90IGlfYnl0ZXNfY29uc3VtZWQ7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfYnl0ZXNfY29uc3VtZWQpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGIik7CisKKyAgICBpZiAodWlfaW5pdF9kb25lKSB7CisgICAgICAgIGVycl9jb2RlID0gZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiZ2V0WEFBQ1N0cmVhbUluZm8iKTsKKyAgICAgICAgQUxPR0koIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgZXJyX2NvZGUgPSBjb25maWdNUEVHRERyYygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJjb25maWdNUEVHRERyYyIpOworICAgIH0KKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgeworICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOworICAgICAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLCAmdWlfYWxpZ25tZW50KTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EcmNNZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgIH0KKworICAgIFdPUkQzMiB1aV9zaXplOworICAgIHVpX3NpemUgPSA4MTkyICogMjsKKworICAgIG1EcmNJbkJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjSW5CdWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY0luQnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLCBtRHJjSW5CdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY091dEJ1ZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjT3V0QnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLCBtRHJjT3V0QnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitpbnQgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnTVBFR0REcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgaW50IGlfZWZmZWN0X3R5cGU7CisgICAgaW50IGlfbG91ZF9ub3JtOworICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKKyAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKKworICAgIC8qIFNhbXBsaW5nIEZyZXF1ZW5jeSAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEsICZtU2FtcEZyZXEpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSIpOworICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZtTnVtQ2hhbm5lbHMpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworCisgICAgLyogUENNIHdvcmQgc2l6ZSAgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osICZtUGNtV2RTeik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKworICAgIC8qU2V0IEVmZmVjdCBUeXBlKi8KKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSwgJmlfZWZmZWN0X3R5cGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIC8qU2V0IHRhcmdldCBsb3VkbmVzcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTLCAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIC8qU2V0IGxvdWRfbm9ybV9mbGFnKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfTE9VRF9OT1JNIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSwgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNIik7CisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSwgJmlfc2JyX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgbnVsbHB0cik7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgTVBFRyBEIERyYyBzbyBmYXIgKi8KKyAgICBkZUluaXRNUEVHREREcmMoKTsKKworICAgIGVycl9jb2RlID0gaW5pdE1QRUdERERyYygpOworICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKKyAgICB9CisKKyAgICAvKiBEUkMgYnVmZmVycworICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCisgICAgICAgIGJ1ZlsxXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkKi8KKyAgICB7CisgICAgICAgIFZPSUQqIHBfYXJyYXlbMl1bMTZdOworICAgICAgICBXT1JEMzIgaWk7CisgICAgICAgIFdPUkQzMiBidWZfc2l6ZXNbMl1bMTZdOworICAgICAgICBXT1JEMzIgbnVtX2VsZW1lbnRzOworICAgICAgICBXT1JEMzIgbnVtX2NvbmZpZ19leHQ7CisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisKKyAgICAgICAgV09SRDMyIHVvX251bV9jaGFuOworCisgICAgICAgIG1lbXNldChidWZfc2l6ZXMsIDAsIDMyICogc2l6ZW9mKFdPUkQzMikpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUywgJmJ1Zl9zaXplc1swXVswXSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX0JVRl9TSVpFUyIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfRVhUX0VMRV9QVFIiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwgSUFfQ01EX1RZUEVfSU5JVF9TRVRfQlVGRl9QVFIsIG51bGxwdHIpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fRUxFLCAmbnVtX2VsZW1lbnRzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUiKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0NPTkZJR19FWFQsICZudW1fY29uZmlnX2V4dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCIpOworCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9jb25maWdfZXh0OyBpaSsrKSB7CisgICAgICAgICAgICAvKmNvcHkgbG91ZG5lc3MgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMF1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMF1baWldLCBidWZfc2l6ZXNbMF1baWldKTsKKworICAgICAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQsICZiaXRfc3RyX2ZtdCk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1swXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lMX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQ1BZX0lMX0JTRl9CVUZGIik7CisKKyAgICAgICAgICAgICAgICBtRFJDRmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBudW1fZWxlbWVudHM7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBjb25maWcgYml0c3RyZWFtKi8KKyAgICAgICAgICAgIGlmIChidWZfc2l6ZXNbMV1baWldID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXlbMV1baWldLCBidWZfc2l6ZXNbMV1baWldKTsKKyAgICAgICAgICAgICAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0lDX0JTIik7CisKKyAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUNfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRFJDRmxhZyA9PSAxKSB7CisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLypSZWFkIGludGVyZmFjZSBidWZmZXIgY29uZmlnIGZpbGUgYml0c3RyZWFtKi8KKyAgICAgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICAgICAgV09SRDMyIGludGVyZmFjZV9pc19wcmVzZW50ID0gMTsKKworICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpX3Nicl9tb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMjA0ODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlfc2JyX21vZGUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSA0MDk2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFLCAoV09SRDMyICopJm1PdXRwdXRGcmFtZUxlbmd0aCk7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9GUkFNRV9TSVpFIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9JTlRfUFJFU0VOVCwgJmludGVyZmFjZV9pc19wcmVzZW50KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5UIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSU5fQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTLCBudWxscHRyKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZ1b19udW1fY2hhbik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJfY29kZTsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENvcHkgdGhlIGJ1ZmZlciBwYXNzZWQgYnkgQW5kcm9pZCBwbHVnaW4gdG8gY29kZWMgaW5wdXQgYnVmZmVyICovCisgICAgbWVtY3B5KG1JbnB1dEJ1ZmZlciwgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET19FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgLyogQ2hlY2tpbmcgZm9yIGVuZCBvZiBwcm9jZXNzaW5nICovCisgICAgdWludDMyX3QgdWlfZXhlY19kb25lOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2V4ZWNfZG9uZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0RPTkVfUVVFUlkiKTsKKworICAgIGlmICh1aV9leGVjX2RvbmUgIT0gMSkgeworICAgICAgICBWT0lEKiBwX2FycmF5OyAgICAgICAgLy8gSVRUSUFNOmJ1ZmZlciB0byBoYW5kbGUgZ2FpbiBwYXlsb2FkCisgICAgICAgIFdPUkQzMiBidWZfc2l6ZSA9IDA7ICAvLyBJVFRJQU06Z2FpbiBwYXlsb2FkIGxlbmd0aAorICAgICAgICBXT1JEMzIgYml0X3N0cl9mbXQgPSAxOworICAgICAgICBXT1JEMzIgZ2Fpbl9zdHJlYW1fZmxhZyA9IDE7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4sICZidWZfc2l6ZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19HQUlOX1BBWUxPQURfTEVOIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYsICZwX2FycmF5KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9CVUYiKTsKKworICAgICAgICBpZiAoYnVmX3NpemUgPiAwKSB7CisgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIHBfYXJyYXksIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFU19CUywgMCwgJmJ1Zl9zaXplKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0dBSU5fU1RSRUFNX0ZMQUcsICZnYWluX3N0cmVhbV9mbGFnKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9DUFlfQlNGX0JVRkYsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIb3cgbXVjaCBidWZmZXIgaXMgdXNlZCBpbiBpbnB1dCBidWZmZXJzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb25zdW1lZCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX0NVUklEWF9JTlBVVF9CVUYiKTsKKworICAgIC8qIEdldCB0aGUgb3V0cHV0IGJ5dGVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCeXRlcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX09VVFBVVF9CWVRFUyIpOworCisgICAgaWYgKG1NcGVnRERSQ1ByZXNlbnQgPT0gMSkgeworICAgICAgICBtZW1jcHkobURyY0luQnVmLCBtT3V0cHV0QnVmZmVyLCAqb3V0Qnl0ZXMpOworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsIDAsIG91dEJ5dGVzKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfRVhFQ1VURSwgSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0RPX0VYRUNVVEUiKTsKKworICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKKyAgICB9CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICAvKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2FtcEZyZXEpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRIik7CisKKyAgICAvKiBUb3RhbCBOdW1iZXIgb2YgQ2hhbm5lbHMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTnVtQ2hhbm5lbHMpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogUENNIHdvcmQgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBjbVdkU3opOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgeworICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNoYW5uZWxNYXNrKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTUFTSyIpOworCisgICAgLyogQ2hhbm5lbCBtb2RlIHRvIHRlbGwgTU9OTy9TVEVSRU8vRFVBTC1NT05PL05PTkVfT0ZfVEhFU0UgKi8KKyAgICB1aW50MzJfdCB1aV9jaGFubmVsX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfY2hhbm5lbF9tb2RlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0NIQU5ORUxfTU9ERSIpOworICAgIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogTU9OT19PUl9QU1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDEpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IFNURVJFT1xuIik7CisgICAgZWxzZSBpZiAodWlfY2hhbm5lbF9tb2RlID09IDIpCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IERVQUwtTU9OT1xuIik7CisgICAgZWxzZQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBOT05FX09GX1RIRVNFIG9yIE1VTFRJQ0hBTk5FTFxuIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBTQlIgUFJFU0VOVC9OT1RfUFJFU0VOVCAqLworICAgIHVpbnQzMl90IHVpX3Nicl9tb2RlOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfc2JyX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKKyAgICBpZiAodWlfc2JyX21vZGUgPT0gMCkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBOT1RfUFJFU0VOVFxuIik7CisgICAgZWxzZSBpZiAodWlfc2JyX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBQUkVTRU5UXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJTQlIgTW9kZTogSUxMRUdBTFxuIik7CisKKyAgICAvKiBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyBTQlJfTU9ERSkgZm9yIEFBQyAqLworICAgIC8qIEZvciBVU0FDIGl0IGNvdWxkIGJlIDEwMjQgKiAzICwgc3VwcG9ydCB0byBxdWVyeSAgKi8KKyAgICAvKiBub3QgeWV0IGFkZGVkIGluIGNvZGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNCAqICgxICsgdWlfc2JyX21vZGUpOworICAgIEFMT0dJKCJtT3V0cHV0RnJhbWVMZW5ndGggJWQgdWlfc2JyX21vZGUgJWQiLCBtT3V0cHV0RnJhbWVMZW5ndGgsIHVpX3Nicl9tb2RlKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OnNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpbnQzMl90IHVpX2RyY19lbmFibGUgPSAxOworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9kcmNfZW5hYmxlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSIpOworICAgIGlmIChkcmNDdXQgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19DVVQsICZkcmNDdXQpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCIpOworICAgIH0KKworICAgIGlmIChkcmNCb29zdCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QsICZkcmNCb29zdCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX1RBUkdFVF9MRVZFTCwgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisgICAgfQorCisgICAgaWYgKGRyY1JlZkxldmVsICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUywgJmRyY1JlZkxldmVsKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworICAgIH0KKworICAgIGlmIChkcmNIZWF2eUNvbXByZXNzaW9uICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyY0hlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QIik7CisgICAgfQorCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSwgJmRyRWZmZWN0VHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBpbnQzMl90IGlfZWZmZWN0X3R5cGUsIGlfdGFyZ2V0X2xvdWRuZXNzLCBpX2xvdWRfbm9ybTsKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgZXJyX2NvZGUgPQorICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIC8qU2V0IHRhcmdldCBsb3VkbmVzcyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTLCAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUyIpOworCisgICAgLypTZXQgbG91ZF9ub3JtX2ZsYWcqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19MT1VEX05PUk0iKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNLCAmaV9sb3VkX25vcm0pOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitjbGFzcyBDMlNvZnRYYWFjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFhhYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0WGFhY0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFhhYWNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRYYWFjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg1NjdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfWEFBQ19ERUNfSF8KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaXhoZWFhY2RfdHlwZV9kZWYuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9lcnJvcl9oYW5kbGVyLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX21lbW9yeV9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hYWNfY29uZmlnLmgiCisKKyNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKKyNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCisKKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKyNkZWZpbmUgTUFYX05VTV9CTE9DS1MgICAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGJsb2NrcyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LCBwVk9JRCBwdl92YWx1ZSk7CitleHRlcm4gIkMiICBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZ2V0X2NvbmZpZ19wYXJhbShwVk9JRCBwX2lhX3Byb2Nlc3NfYXBpX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfc2FtcF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9udW1fY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXT1JEMzIgcGlfcGNtX3dkX3N6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9jaGFubmVsX21hc2spOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRYYWFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFhhYWNEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtPdXRwdXREcmFpbkJ1ZmZlclNpemUgICAgICA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIE1BWF9OVU1fQkxPQ0tTLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvaWQqIG1YaGVhYWNDb2RlY0hhbmRsZTsKKyAgICB2b2lkKiBtTXBlZ0REcmNIYW5kbGU7CisgICAgdWludDMyX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RnJhbWVMZW5ndGg7CisgICAgaW50OF90KiBtSW5wdXRCdWZmZXI7CisgICAgaW50OF90KiBtT3V0cHV0QnVmZmVyOworICAgIGludDMyX3QgbVNhbXBGcmVxOworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVBjbVdkU3o7CisgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CisgICAgaW50MzJfdCBtTnVtT3V0Qnl0ZXM7CisgICAgdWludDY0X3QgbUN1ckZyYW1lSW5kZXg7CisgICAgdWludDY0X3QgbUN1clRpbWVzdGFtcDsKKyAgICBib29sIG1Jc0NvZGVjSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQ7CisgICAgaW50OF90KiBtRHJjSW5CdWY7CisgICAgaW50OF90KiBtRHJjT3V0QnVmOworICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKKyAgICBpbnQzMl90IG1EUkNGbGFnOworCisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudCBfX3VudXNlZDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBjaGFyKiBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgdWludDMyX3QgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3M7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdERlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0RHJjUGFyYW1ldGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGRyYWluRGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCk7CisKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgaW50IGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7CisgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CisgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY1JlZkxldmVsLCBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJFZmZlY3RUeXBlKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFhhYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX1hBQUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjM3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsiQzIuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogZmFsc2UsIC8vIHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvcmUvQzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKy8qKgorICogVGhlcmUgaXMgbm90aGluZyBoZXJlIHlldC4gVGhpcyBsaWJyYXJ5IGlzIGJ1aWx0IHRvIHNlZSB3aGF0IHN5bWJvbHMgYW5kIG1ldGhvZHMgZ2V0CisgKiBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIEFQSSBpbmNsdWRlIGZpbGVzLgorICoKKyAqIEdvaW5nIGZvcndhcmQsIHRoZSBDb2RlYzIgbGlicmFyeSB3aWxsIGNvbnRhaW4gdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHVzZWZ1bCBmb3IKKyAqIENvZGVjMiBjbGllbnRzLgorICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzQ2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX0hfCisjZGVmaW5lIEMyX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvKiogbmFub3NlY29uZHMgd2l0aCBhcmJpdHJhcnkgb3JpZ2luLiAqLwordHlwZWRlZiBpbnQ2NF90IGMyX25zZWNzX3Q7CisKKy8qKiBcbWFpbnBhZ2UgQ29kZWMyCisgKgorICogQ29kZWMyIGlzIGEgZ2VuZXJpYyBmcmFtZS1iYXNlZCBkYXRhIHByb2Nlc3NpbmcgQVBJLgorICoKKyAqIFRoZSBtZWRpYSBzdWJzeXN0ZW0gYWNjZXNzZXMgY29tcG9uZW50cyB2aWEgdGhlIFxyZWYgQVBJLgorICovCisKKy8qKiBcaW5ncm91cCBBUEkKKyAqCisgKiBUaGUgQ29kZWMyIEFQSSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb2YgZGF0YSBwcm9jZXNzaW5nIGNvbXBvbmVudHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGgKKyAqIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCisgKgorICogQ29kaW5nIENvbnZlbnRpb25zCisgKgorICogTWl0aWdhdGluZyBCaW5hcnkgQ29tcGF0aWJpbGl0eS4KKyAqCisgKiBXaGlsZSBmdWxsIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIG5vdCBhIGdvYWwgb2YgdGhlIEFQSSAoZHVlIHRvIG91ciB1c2Ugb2YgU1RMKSwgd2UgdHJ5IHRvCisgKiBtaXRpZ2F0ZSBiaW5hcnkgYnJlYWtzIGJ5IGFkaGVyaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgKgorICogLSBhdCBtb3N0IG9uZSB2dGFibGUgd2l0aCBwbGFjZWhvbGRlciB2aXJ0dWFsIG1ldGhvZHMKKyAqIC0gYWxsIG9wdGlvbmFsL3BsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcyByZXR1cm5pbmcgYSBjMl9zdGF0dXNfdCwgd2l0aCBDMl9PTUlUVEVEIG5vdCByZXF1aXJpbmcKKyAqICAgYW55IHVwZGF0ZSB0byBpbnB1dC9vdXRwdXQgYXJndW1lbnRzLgorICogLSBsaW1pdGluZyBzeW1ib2wgZXhwb3J0IG9mIGlubGluZSBtZXRob2RzCisgKiAtIHVzZSBvZiBwaW1wbCAob3Igc2hhcmVkLXBpbXBsKQorICoKKyAqIE5hbWluZworICoKKyAqIC0gYWxsIGNsYXNzZXMgYW5kIHR5cGVzIHByZWZpeCB3aXRoIEMyCisgKiAtIGNsYXNzZXMgZm9yIGludGVybmFsIHVzZSBwcmVmaXggd2l0aCBfQzIKKyAqIC0gZW51bSB2YWx1ZXMgaW4gZ2xvYmFsIG5hbWVzcGFjZSBwcmVmaXggd2l0aCBDMl8gYWxsIGNhcHMKKyAqIC0gZW51bSB2YWx1ZXMgaW5zaWRlIGNsYXNzZXMgaGF2ZSBubyBDMl8gcHJlZml4IGFzIGNsYXNzIGFscmVhZHkgaGFzIGl0CisgKiAtIHN1cHBvcnRpbmcgdHdvIGtpbmRzIG9mIGVudW0gbmFtaW5nOiBhbGwtY2FwcyBhbmQga0NhbWVsQ2FzZQorICogXHRvZG8gcmV2aXNpdCBrQ2FtZWxDYXNlIGZvciBwYXJhbS10eXBlCisgKgorICogQXNwZWN0cworICoKKyAqIEFzcGVjdHMgZGVmaW5lIGNlcnRhaW4gY29tbW9uIGJlaGF2aW9yIGFjcm9zcyBhIGdyb3VwIG9mIG9iamVjdHMuCisgKiAtIGNsYXNzZXMgd2hvc2UgbmFtZSBtYXRjaGVzIF9DMi4qQXNwZWN0CisgKiAtIG9ubHkgcHJvdGVjdGVkIGNvbnN0cnVjdG9ycworICogLSBubyBkZXNjdHJ1Y3RvciBhbmQgY29waWFibGUKKyAqIC0gYWxsIG1ldGhvZHMgYXJlIGlubGluZSBvciBzdGF0aWMgKHRoaXMgaXMgb3Bwb3NpdGUgb2YgdGhlIGludGVyZmFjZSBwYXJhZGlnbSB3aGVyZSBhbGwgbWV0aG9kcworICogICBhcmUgdmlydHVhbCwgd2hpY2ggd291bGQgbm90IHdvcmsgZHVlIHRvIHRoZSBhdCBtb3N0IG9uZSB2dGFibGUgcnVsZS4pCisgKiAtIG9ubHkgcHJpdmF0ZSB2YXJpYWJsZXMgKHRoaXMgcHJldmVudHMgc3ViY2xhc3NlcyBpbnRlcmZlcmluZyB3aXRoIHRoZSBhc3BlY3RzLikKKyAqLworCisvLy8gXGRlZmdyb3VwIHR5cGVzIENvbW1vbiBUeXBlcworLy8vIEB7CisKKy8qKgorICogQzJTdHJpbmc6IGJhc2ljIHN0cmluZyBpbXBsZW1lbnRhdGlvbgorICovCit0eXBlZGVmIHN0ZDo6c3RyaW5nIEMyU3RyaW5nOworCisvKioKKyAqIEMyU3RyaW5nTGl0ZXJhbDogYmFzaWMgc3RyaW5nIGxpdGVyYWwgaW1wbGVtZW50YXRpb24uCisgKiBcbm90ZSB0aGVzZSBhcmUgbmV2ZXIgb3duZWQgYnkgYW55IG9iamVjdCwgYW5kIGNhbiBvbmx5IHJlZmVyIHRvIEMgc3RyaW5nIGxpdGVyYWxzLgorICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKkMyU3RyaW5nTGl0ZXJhbDsKKworLyoqCisgKiBjMl9zdGF0dXNfdDogc3RhdHVzIGNvZGVzIHVzZWQuCisgKi8KK2VudW0gYzJfc3RhdHVzX3QgOiBpbnQzMl90IHsKKy8qCisgKiBVc2UgUE9TSVggZXJybm8gY29uc3RhbnRzLgorICovCisgICAgQzJfT0sgICAgICAgID0gMCwgICAgICAgICAgICAvLy88IG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisKKyAgICAvLyBiYWQgaW5wdXQKKyAgICBDMl9CQURfVkFMVUUgPSBFSU5WQUwsICAgICAgIC8vLzwgYXJndW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKHVzZXIgZXJyb3IpCisgICAgQzJfQkFEX0lOREVYID0gRU5YSU8sICAgICAgICAvLy88IGFyZ3VtZW50IHVzZXMgaW52YWxpZCBpbmRleCAodXNlciBlcnJvcikKKyAgICBDMl9DQU5OT1RfRE8gPSBFTk9UU1VQLCAgICAgIC8vLzwgYXJndW1lbnQvaW5kZXggaXMgdmFsaWQgYnV0IG5vdCBwb3NzaWJsZQorCisgICAgLy8gYmFkIHNlcXVlbmNpbmcgb2YgZXZlbnRzCisgICAgQzJfRFVQTElDQVRFID0gRUVYSVNULCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cworICAgIEMyX05PVF9GT1VORCA9IEVOT0VOVCwgICAgICAgLy8vPCBvYmplY3Qgbm90IGZvdW5kCisgICAgQzJfQkFEX1NUQVRFID0gRVBFUk0sICAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIGluIHRoZSBjdXJyZW50IHN0YXRlCisgICAgQzJfQkxPQ0tJTkcgID0gRVdPVUxEQkxPQ0ssICAvLy88IG9wZXJhdGlvbiB3b3VsZCBibG9jayBidXQgYmxvY2tpbmcgaXMgbm90IHBlcm1pdHRlZAorICAgIEMyX0NBTkNFTEVEICA9IEVJTlRSLCAgICAgICAgLy8vPCBvcGVyYXRpb24gaW50ZXJydXB0ZWQvY2FuY2VsZWQKKworICAgIC8vIGJhZCBlbnZpcm9ubWVudAorICAgIEMyX05PX01FTU9SWSA9IEVOT01FTSwgICAgICAgLy8vPCBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBvcGVyYXRpb24KKyAgICBDMl9SRUZVU0VEICAgPSBFQUNDRVMsICAgICAgIC8vLzwgbWlzc2luZyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorCisgICAgQzJfVElNRURfT1VUID0gRVRJTUVET1VULCAgICAvLy88IG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiB0aW1lb3V0CisKKyAgICAvLyBiYWQgdmVyc2lvbmluZworICAgIEMyX09NSVRURUQgICA9IEVOT1NZUywgICAgICAgLy8vPCBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkL3N1cHBvcnRlZCAob3B0aW9uYWwgb25seSkKKworICAgIC8vIHVua25vd24gZmF0YWwKKyAgICBDMl9DT1JSVVBURUQgPSBFRkFVTFQsICAgICAgIC8vLzwgc29tZSB1bmV4cGVjdGVkIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uCisgICAgQzJfTk9fSU5JVCAgID0gRU5PREVWLCAgICAgICAvLy88IHN0YXR1cyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQKK307CisKKy8qKgorICogVHlwZSB0aGF0IGRlc2NyaWJlcyB0aGUgZGVzaXJlZCBibG9ja2luZyBiZWhhdmlvciBmb3IgdmFyaWFibGUgYmxvY2tpbmcgY2FsbHMuIEJsb2NraW5nIGluIHRoaXMKKyAqIEFQSSBpcyB1c2VkIGluIGEgc29tZXdoYXQgbW9kaWZpZWQgbWVhbmluZyBzdWNoIHRoYXQgb3BlcmF0aW9ucyB0aGF0IG1lcmVseSB1cGRhdGUgdmFyaWFibGVzCisgKiBwcm90ZWN0ZWQgYnkgbXV0ZXhlcyBhcmUgc3RpbGwgY29uc2lkZXJlZCAibm9uLWJsb2NraW5nIiAoYWx3YXlzIHVzZWQgaW4gcXVvdGVzKS4KKyAqLworZW51bSBjMl9ibG9ja2luZ190IDogaW50MzJfdCB7CisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBTSEFMTCBiZSAibm9uLWJsb2NraW5nIi4gVGhpcyBtZWFucyB0aGF0IGl0IHNoYWxsIG5vdCBwZXJmb3JtIGFueSBmaWxlCisgICAgICogb3BlcmF0aW9ucywgb3IgY2FsbC93YWl0IG9uIG90aGVyIHByb2Nlc3Nlcy4gSXQgbWF5IHVzZSBhIHByb3RlY3RlZCByZWdpb24gYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBtdXRleCBpcyBuZXZlciB1c2VkIHRvIHByb3RlY3QgY29kZSB0aGF0IGlzIG90aGVyd2lzZSAibWF5IGJsb2NrIi4KKyAgICAgKi8KKyAgICBDMl9ET05UX0JMT0NLID0gZmFsc2UsCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBNQVkgYmUgdGVtcG9yYXJpbHkgYmxvY2tpbmcuCisgICAgICovCisgICAgQzJfTUFZX0JMT0NLID0gdHJ1ZSwKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIHV0aWxzIFV0aWxpdGllcworLy8vIEB7CisKKyNkZWZpbmUgQzJfRE9fTk9UX0NPUFkodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisgICAgdHlwZShjb25zdCB0eXBlICYpID0gZGVsZXRlOyBcCisKKyNkZWZpbmUgQzJfREVGQVVMVF9NT1ZFKHR5cGUpIFwKKyAgICB0eXBlJiBvcGVyYXRvcj0odHlwZSAmJikgPSBkZWZhdWx0OyBcCisgICAgdHlwZSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKworI2RlZmluZSBDMl9BTExPV19PVkVSRkxPVyBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKKyNkZWZpbmUgQzJfQ09OU1QgICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorI2RlZmluZSBDMl9ISURFICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZGVmaW5lIEMyX0lOTElORSAgIGlubGluZSBDMl9ISURFCisjZGVmaW5lIEMyX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKQorI2RlZmluZSBDMl9QQUNLICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkKKyNkZWZpbmUgQzJfUFVSRSAgICAgX19hdHRyaWJ1dGVfXygocHVyZSkpCisKKyNkZWZpbmUgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpIFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gKCp0aGlzID09IG90aGVyKSB8fCAoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcik7IH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKSAmJiAhKCp0aGlzID09IG90aGVyKTsgfQorCisjZGVmaW5lIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPCBvdGhlci5maWVsZDsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gZmllbGQgPT0gb3RoZXIuZmllbGQ7IH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlLCBmaWVsZCwgbWFzaykgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyBcCisgICAgICAgIHJldHVybiAoZmllbGQgJiBtYXNrKSA8IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spID09IChvdGhlci5maWVsZCAmIChtYXNrKSk7IFwKKyAgICB9IFwKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkKKworI2RlZmluZSBERUZJTkVfRU5VTV9PUEVSQVRPUlMoZXR5cGUpIFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfChldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSB8IHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yfD0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3ImKGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpICYgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3ImPShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvcl4oZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgXiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvcl49KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yfihldHlwZSBhKSB7IHJldHVybiAoZXR5cGUpKH5zdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkpOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdDsKKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX2MyX2NudHJfY29tcGF0X2hlbHBlciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwoc2l6ZW9mKFUpID49IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgVCBnZXQoY29uc3QgYzJfY250cl90PFUsIHZvaWQ+ICZ2YWx1ZSkgeworICAgICAgICByZXR1cm4gVCh2YWx1ZS5tVmFsdWUpOworICAgIH0KK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBJbnRlZ3JhbCBjb3VudGVyIHR5cGUuCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0aGF0IGlzIE5FVkVSIGNoZWNrZWQgZm9yIG92ZXJmbG93L3VuZGVyZmxvdyAtIGFuZAorICogY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHJlZGVmaW5lZC4KKyAqCisgKiBcbm90ZSBDb21wYXJpc29uIG9mIGNvdW50ZXIgdHlwZXMgaXMgbm90IGZ1bGx5IHRyYW5zaXRpdmUsIGUuZy4KKyAqIGl0IGNvdWxkIGJlIHRoYXQgYSA+IGIgPiBjIGJ1dCBhICE+IGMuCisgKiBzdGQ6Omxlc3M8PiwgZ3JlYXRlcjw+LCBsZXNzX2VxdWFsPD4gYW5kIGdyZWF0ZXJfZXF1YWw8PiBzcGVjaWFsaXphdGlvbnMgeWllbGQgdG90YWwgb3JkZXJpbmcsCisgKiBidXQgbWF5IG5vdCBtYXRjaCBzZW1hbnRpYyBvcmRlcmluZyBvZiB0aGUgdmFsdWVzLgorICoKKyAqIFRlY2huaWNhbGx5OiBjb3VudGVyIHR5cGVzIHJlcHJlc2VudCBpbnRlZ2VyIHZhbHVlczogQSAqIDJeTiArIHZhbHVlLCB3aGVyZSBBIGNhbiBiZSBhcmJpdHJhcnkuCisgKiBUaGlzIG1ha2VzIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgbXVsdGlwbGljYXRpb24gKGFzIHdlbGwgYXMgYml0d2lzZSBvcGVyYXRpb25zKSB3ZWxsIGRlZmluZWQuCisgKiBIb3dldmVyLCBkaXZpc2lvbiBpcyBpbiBnZW5lcmFsIG5vdCB3ZWxsIGRlZmluZWQsIGFzIHRoZSByZXN1bHQgbWF5IGRlcGVuZCBvbiBBLiBUaGlzIGlzIGFsc28KKyAqIHRydWUgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCBib29sZWFuIGNvbnZlcnNpb24uCisgKgorICogRXZlbiB0aG91Z2ggd2VsbCBkZWZpbmVkLCBiaXR3aXNlIG9wZXJhdG9ycyBhcmUgbm90IGltcGxlbWVudGVkIGZvciBjb3VudGVyIHR5cGVzIGFzIHRoZXkgYXJlIG5vdAorICogbWVhbmluZ2Z1bC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiBzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZT46OnR5cGU+CitjbGFzcyBDMl9ISURFIGMyX2NudHJfdCB7CisgICAgdXNpbmcgY29tcGF0ID0gX2MyX2NudHJfY29tcGF0X2hlbHBlcjxUPjsKKworICAgIFQgbVZhbHVlOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBIQUxGX1JBTkdFID0gVCh+MCkgXiAoVCh+MCkgPj4gMSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGZyaWVuZCBzdHJ1Y3QgX2MyX2NudHJfY29tcGF0X2hlbHBlcjsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEluaXRpYWxpemVkIGNvdW50ZXIgdG8gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdCgpIDogbVZhbHVlKFQoMCkpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgZnJvbSBhIGNvbXBhdGlibGUgdHlwZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KGNvbnN0IFUgJnZhbHVlKSA6IG1WYWx1ZShjb21wYXQ6OmdldCh2YWx1ZSkpIHt9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGUgcGVlaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyB1bmRlcmx5aW5nIHVuc2lnbmVkIHR5cGUuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBUIHBlZWt1KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGxvbmcgbG9uZyBwZWVrbGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobG9uZyBsb25nKW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuc2lnbmVkIGxvbmcgbG9uZyAtIGUuZy4gZm9yIHByaW50aW5nLgorICAgICAqLworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGxvbmcgcGVla3VsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gYSBzbWFsbGVyIGNvdW50ZXIgdHlwZS4gVGhpcyBpcyBhbHdheXMgc2FmZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4KKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGMyX2NudHJfdDxVPigpIHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihtVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFyaXRobWV0aWMgb3BlcmF0b3JzCisgICAgICovCisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKGF0dHJpYiwgb3AsIG9wX2Fzc2lnbikgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiYgb3BlcmF0b3Igb3BfYXNzaWduKGNvbnN0IFUgJnZhbHVlKSB7IFwKKyAgICAgICAgbVZhbHVlIG9wX2Fzc2lnbiBjb21wYXQ6OmdldCh2YWx1ZSk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9ZGVjbHR5cGUoY29tcGF0OjpnZXQoVSgwKSkpPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGNvbnN0IFUgJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgb3AgY29tcGF0OjpnZXQodmFsdWUpKTsgXAorICAgIH0gXAorICAgIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPCBzaXplb2YoVCkpPjo6dHlwZT4gXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxVPiBvcGVyYXRvciBvcChjb25zdCBjMl9jbnRyX3Q8VT4gJnZhbHVlKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxVPihVKG1WYWx1ZSkgb3AgdmFsdWUucGVla3UoKSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoYXR0cmliLCBvcCkgXAorICAgIGF0dHJpYiBpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcCgpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG9wIG1WYWx1ZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjMl9jbnRyX3Q8VD4gJm9wZXJhdG9yIG9wKCkgeyBcCisgICAgICAgIG9wIG1WYWx1ZTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiBvcGVyYXRvciBvcChpbnQpIHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQsIHZvaWQ+KG1WYWx1ZSBvcCk7IFwKKyAgICB9CisKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICssICs9KQorICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgLSwgLT0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAqLCAqPSkKKworICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtKQorICAgIERFRklORV9DMl9DTlRSX1VOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKQorCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgKyspCisgICAgREVGSU5FX0MyX0NOVFJfQ1JFTUVOVF9PUChDMl9BTExPV19PVkVSRkxPVywgLS0pCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yPDwoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGMyX2NudHJfdDxUPihtVmFsdWUgPDwgdmFsdWUpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3I8PD0oY29uc3QgVSAmdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlIDw8PSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmlzb24gb3BlcmF0b3JzCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG90aGVyLm1WYWx1ZSAtIG1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gVChtVmFsdWUgLSBvdGhlci5tVmFsdWUpIDwgSEFMRl9SQU5HRTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWUgPT0gb3RoZXIubVZhbHVlOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKnRoaXMgPD0gb3RoZXIgJiYgKnRoaXMgIT0gb3RoZXI7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA+PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKyhjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiArIGE7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3ItKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBjMl9jbnRyX3Q8VD4oYSkgLSBiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KK2lubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yKihjb25zdCBVICZhLCBjb25zdCBjMl9jbnRyX3Q8VD4gJmIpIHsKKyAgICByZXR1cm4gYiAqIGE7Cit9CisKK3R5cGVkZWYgYzJfY250cl90PHVpbnQzMl90PiBjMl9jbnRyMzJfdDsgLyoqIDMyLWJpdCBjb3VudGVyIHR5cGUgKi8KK3R5cGVkZWYgYzJfY250cl90PHVpbnQ2NF90PiBjMl9jbnRyNjRfdDsgLyoqIDY0LWJpdCBjb3VudGVyIHR5cGUgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKy8vLyBAeworCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPiBzdHJ1Y3QgYzJfdHlwZXM7CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgYSBzaW5nbGUgdHlwZSAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBjMl90eXBlczxUPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlIHdpZGVfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHdpZGVfdHlwZSBtaW5fdHlwZTsgLy8gdHlwZSBmb3IgbWluKFQuLi4pCit9OworCisvKiogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB0eXBlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBjMl90eXBlczxULCBVPiB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJtaXhpbmcgZmxvYXRpbmcgcG9pbnQgYW5kIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcyBpcyBkaXNhbGxvd2VkIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPT0gc3RkOjppc19zaWduZWQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBzaWduZWQgYW5kIHVuc2lnbmVkIHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIGRlY2x0eXBlKHRydWUgPyBzdGQ6OmRlY2x2YWw8VD4oKSA6IHN0ZDo6ZGVjbHZhbDxVPigpKT46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c2l6ZW9mKFQpIDwgc2l6ZW9mKFUpLCBULCBVPjo6dHlwZT46OnR5cGUgbmFycm93X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAorICAgICAgICAgICAgc3RkOjppc19zaWduZWQ8VD46OnZhbHVlLCB3aWRlX3R5cGUsIG5hcnJvd190eXBlPjo6dHlwZSBtaW5fdHlwZTsKK307CisKKy8vLyBAfQorCisvLy8gXGVuZGNvbmQKKworLyoqCisgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcy4gT25seSBzdXBwb3J0cyBzaW1pbGFyIGNsYXNzZXMsIHN1Y2ggYXM6CisgKiAtIGFsbCBmbG9hdGluZyBwb2ludAorICogLSBhbGwgdW5zaWduZWQvYWxsIHNpZ25lZAorICogLSBhbGwgcG9pbnRlcgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorc3RydWN0IGMyX3R5cGVzPFQsIFUsIFYuLi4+IHsKKyAgICAvKiogQ29tbW9uIHR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgYWxsIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIC8qKiBOYXJyb3dlc3QgdHlwZSBvZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om5hcnJvd190eXBlLCBWLi4uPjo6bmFycm93X3R5cGUgbmFycm93X3R5cGU7CisgICAgLyoqIFR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpbnB1dCBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSwgVi4uLj46Om1pbl90eXBlIG1pbl90eXBlOworfTsKKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYik7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWF4IHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Citjb25zdGV4cHIgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSBjMl9tYXgoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeyB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21heChiLCBjLi4uKSk7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKK30KKworLyoqCisgKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKKyAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogRmluZHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYSBsaXN0IG9mICJzaW1pbGFybHkgdHlwZWQiIHZhbHVlcy4KKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byBzdGQ6Om1pbiB3aGVyZSB0aGUgdHlwZXMgZG8gbm90IGhhdmUgdG8gYmUgaWRlbnRpY2FsLCBhbmQgdGhlIHNtYWxsZXN0CisgKiByZXN1bHRpbmcgdHlwZSBpcyB1c2VkIHRoYXQgYWNjb21tb2RhdGVzIHRoZSBhcmd1bWVudCB0eXBlcy4KKyAqCisgKiBcbm90ZSBWYWx1ZSB0eXBlcyBtdXN0IGJlIHNpbWlsYXIsIGUuZy4gYWxsIGZsb2F0aW5nIHBvaW50LCBhbGwgcG9pbnRlcnMsIGFsbCBzaWduZWQsIG9yIGFsbAorICogdW5zaWduZWQuCisgKgorICogQHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6bWluX3R5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIC4uLiBjKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxVLCBWLi4uPjo6bWluX3R5cGUgcmVzdF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgcmVzdF90eXBlPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsKKyAgICAgICAgd2lkZV90eXBlIGFfKGEpLCBiXyhjMl9taW4oYiwgYy4uLikpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+OjptaW5fdHlwZT4oYV8gPCBiXyA/IGFfIDogYl8pOworICAgIH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgoraW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlIGMyX2NsYW1wKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFY+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpLCBjXyhjKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVj46OndpZGVfdHlwZT4oYl8gPCBhXyA/IGFfIDogYl8gPiBjXyA/IGNfIDogYl8pOworICAgIH0pOworfQorCisvLy8gQH0KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzczw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPCByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6bGVzc19lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPD0gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXI8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID4gcmgucGVla3UoKTsKKyAgICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBzdGQ6OmdyZWF0ZXJfZXF1YWw8OjpjMl9jbnRyX3Q8VD4+IHsKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKGNvbnN0IDo6YzJfY250cl90PFQ+ICZsaCwgY29uc3QgOjpjMl9jbnRyX3Q8VD4gJnJoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaC5wZWVrdSgpID49IHJoLnBlZWt1KCk7CisgICAgfQorfTsKKworI2VuZGlmICAvLyBDMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTdmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKQEAgLTAsMCArMSwyMzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkJVRkZFUl9IXworI2RlZmluZSBDMkJVRkZFUl9IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+IC8vIGZvciBDMkluZm8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJCdWZmZXIuaD4KKyNlbHNlCisKK3R5cGVkZWYgdm9pZCogQzJIYW5kbGU7CisKKyNlbmRpZgorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlciBCdWZmZXJzCisvLy8gQHsKKworLy8vIFxkZWZncm91cCBidWZmZXJfc3luYyBTeW5jaHJvbml6YXRpb24KKy8vLyBAeworCisvKioKKyAqIFN5bmNocm9uaXphdGlvbiBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgZXZlbnQgYW5kIGZlbmNlIG9iamVjdHMuCisgKgorICogVGhlc2UgYXJlIGNyb3NzLXByb2Nlc3MgZXh0ZW5zaW9ucyBvZiBwcm9taXNlL2Z1dHVyZSBpbmZyYXN0cnVjdHVyZS4KKyAqIEV2ZW50cyBhcmUgYW5hbG9nb3VzIHRvIHN0ZDo6cHJvbWlzZTx2b2lkPiwgd2hlcmVhcyBmZW5jZXMgYXJlIHRvIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPi4KKyAqCisgKiBGZW5jZXMgYW5kIGV2ZW50cyBhcmUgc2hhcmVhYmxlL2NvcHlhYmxlLgorICoKKyAqIEZlbmNlcyBhcmUgdXNlZCBpbiB0d28gc2NlbmFyaW9zLCBhbmQgYWxsIGNvcGllZCBpbnN0YW5jZXMgcmVmZXIgdG8gdGhlIHNhbWUgZXZlbnQuCisgKiBcdG9kbyBkbyBldmVudHMgbmVlZCB0byBiZSBjb3B5YWJsZSBvciBzaG91bGQgdGhleSBiZSB1bmlxdWU/CisgKgorICogYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdDogc2lnbmFsZWQgd2hlbiBpdCBpcyBzYWZlIGZvciB0aGUgY29tcG9uZW50IG9yIGNsaWVudCB0byBhY2Nlc3MKKyAqICh0aGUgY29udGVudHMgb2YpIGFuIG9iamVjdC4KKyAqCisgKiByZWxlYXNlIHN5bmMgZmVuY2Ugb2JqZWN0OiBcdG9kbworICoKKyAqIEZlbmNlcyBjYW4gYmUgYmFja2VkIGJ5IGhhcmR3YXJlLiBIYXJkd2FyZSBmZW5jZXMgYXJlIGd1YXJhbnRlZWQgdG8gc2lnbmFsIE5PIE1BVFRFUiBXSEFUIHdpdGhpbgorICogYSBzaG9ydCAocGxhdGZvcm0gc3BlY2lmaWMpIGFtb3VudCBvZiB0aW1lOyB0aGlzIGd1YXJhbnRlZSBpcyB1c3VhbGx5IGxlc3MgdGhhbiAxNSBtc2Vjcy4KKyAqLworCisvKioKKyAqIEZlbmNlIG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgd2FpdGluZyBmb3IgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdmdXR1cmUnLgorICoKKyAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHZlbmRvcnMgaWYgdXNpbmcgSFcgZmVuY2VzLgorICovCitjbGFzcyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBXYWl0cyBmb3IgYSBmZW5jZSB0byBiZSBzaWduYWxlZCB3aXRoIGEgdGltZW91dC4KKyAgICAgKgorICAgICAqIFx0b2RvIGEgbWVjaGFuaXNtIHRvIGNhbmNlbCBhIHdhaXQgLSBmb3Igbm93IHRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGlzIHRvIGFiYW5kb24gdGhlCisgICAgICogZXZlbnQsIGJ1dCBmZW5jZXMgYXJlIHNoYXJlZCBzbyBjYW5jZWxpbmcgYSB3YWl0IHdpbGwgY2FuY2VsIGFsbCB3YWl0cy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB0aW1lb3V0TnMgICAgICAgICAgIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBuc2VjcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgZmVuY2UgaGFzIG5vdCBiZWVuIHNpZ25hbGVkIHdpdGhpbiB0aGUgdGltZW91dAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGFzIGJlZW4gYWJhbmRvbmVkIHdpdGhvdXQgYmVpbmcgc2lnbmFsZWQgKGl0IHdpbGwgbmV2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2lnbmFsZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gd2FpdCBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHdhaXRpbmcgZm9yIHRoZSBmZW5jZSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB3YWl0KGMyX25zZWNzX3QgdGltZW91dE5zKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBpcyB2YWxpZCAoaWYgdGhlcmUgaXMgYSBjaGFuY2UgZm9yIGl0IHRvIGJlIHNpZ25hbGVkLikKKyAgICAgKiBBIGZlbmNlIGJlY29tZXMgaW52YWxpZCBpZiB0aGUgY29udHJvbGluZyBldmVudCBpcyBkZXN0cm95ZWQgd2l0aG91dCBpdCBzaWduYWxpbmcgdGhlIGZlbmNlLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgdmFsaWQKKyAgICAgKi8KKyAgICBib29sIHZhbGlkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQgKGlzIHJlYWR5KS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICovCisgICAgYm9vbCByZWFkeSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoaXMgZmVuY2UgaW4gYSBzZWxlY3Qgc3lzdGVtIGNhbGwuCisgICAgICogXG5vdGUgVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciwgaWYgdmFsaWQsIG11c3QgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGUuZy4gcG9sbCgpIHN5c3RlbSBjYWxscy4gVGhpcyBmaWxlIGJlY29tZXMgcmVhZGFibGUgKFBPTExJTikgd2hlbiB0aGUKKyAgICAgKiBmZW5jZSBpcyBzaWduYWxlZCwgYW5kIGJhZCAoUE9MTEVSUikgaWYgdGhlIGZlbmNlIGlzIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmaWxlIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIHRoaXMgZmVuY2UgKHdpdGggb3duZXJzaGlwKSwgb3IgLTEgaWYgdGhlIGZlbmNlCisgICAgICogaGFzIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoXHRvZG8gb3IgYWJhbmRvbmVkKS4KKyAgICAgKgorICAgICAqIFx0b2RvIHRoaXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggZmVuY2VzIHVzZWQgYnkgZ3JhbGxvYworICAgICAqLworICAgIGludCBmZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmVuY2UgaXMgYSBoYXJkd2FyZS1iYWNrZWQgZmVuY2UuCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBoYXJkd2FyZSBmZW5jZQorICAgICAqLworICAgIGJvb2wgaXNIVygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogTnVsbC1mZW5jZS4gQSBmZW5jZSB0aGF0IGhhcyBmaXJlZC4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJGZW5jZSgpIDogbUltcGwobnVsbHB0cikgeyB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgQzJGZW5jZShzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZnJpZW5kIHN0cnVjdCBfQzJGZW5jZUZhY3Rvcnk7Cit9OworCisvKioKKyAqIEV2ZW50IG9iamVjdCB1c2VkIGJ5IGNvbXBvbmVudHMgYW5kIHRoZSBmcmFtZXdvcmsuCisgKgorICogSW1wbGVtZW50cyB0aGUgc2lnbmFsaW5nIG9mIGFuIGV2ZW50LCBhbmFsb2dvdXMgdG8gYSAncHJvbWlzZScuCisgKgorICogSGFyZHdhcmUgYmFja2VkIGV2ZW50cyBkbyBub3QgZ28gdGhyb3VnaCB0aGlzIG9iamVjdCwgYW5kIG11c3QgYmUgZXhwb3NlZCBkaXJlY3RseSBhcyBmZW5jZXMKKyAqIGJ5IHZlbmRvcnMuCisgKi8KK2NsYXNzIEMyRXZlbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBmZW5jZSBmb3IgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWxzIChhbGwpIGFzc29jaWF0ZWQgZmVuY2UocykuCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBzaWduYWwgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHNpZ25hbGluZyB0aGUgZmVuY2UocykgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmlyZSgpOworCisgICAgLyoqCisgICAgICogVHJpZ2dlciB0aGlzIGV2ZW50IGZyb20gdGhlIG1lcmdpbmcgb2YgdGhlIHN1cHBsaWVkIGZlbmNlcy4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgYmUKKyAgICAgKiBhYmFuZG9uZWQgaWYgYW55IG9mIHRoZXNlIGZlbmNlcyBoYXZlIGJlZW4gYWJhbmRvbmVkLCBhbmQgaXQgd2lsbCBiZSBmaXJlZCBpZiBhbGwgb2YgdGhlc2UKKyAgICAgKiBmZW5jZXMgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBtZXJnaW5nIHdhcyBzdWNjZXNzZnVsbHkgZG9uZQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBtZXJnaW5nCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZSBoYXZlIGFscmVhZHkgYmVlbiBtZXJnZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIGFiYW5kb25lZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIG1lcmdlIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBtZXJnaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBtZXJnZShzdGQ6OnZlY3RvcjxDMkZlbmNlPiBmZW5jZXMpOworCisgICAgLyoqCisgICAgICogQWJhbmRvbnMgdGhlIGV2ZW50IGFuZCBhbnkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBcbm90ZSBDYWxsIHRoaXMgdG8gZXhwbGljaXRseSBhYmFuZG9uIGFuIGV2ZW50IGJlZm9yZSBpdCBpcyBkZXN0cnVjdGVkIHRvIGF2b2lkIGEgd2FybmluZy4KKyAgICAgKgorICAgICAqIFRoaXMgaGFzIG5vIGVmZmVjdCBubyBlZmZlY3QgaWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNpZ25hbGVkIG9yIGFiYW5kb25lZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgZmVuY2Uocykgd2VyZSBzdWNjZXNzZnVsbHkgc2lnbmFsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlKHMpIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gYWJhbmRvbiB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgYnVmX2ludGVybmFsIEludGVybmFsCisvLy8gQHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBlbmNhcHN1bGF0ZSBhbiB1cGRhdGFibGUgc3RhdHVzIHZhbHVlLgorICovCitzdHJ1Y3QgX0MySW5uYXRlU3RhdHVzIHsKKyAgICBpbmxpbmUgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCitwcm90ZWN0ZWQ6CisgICAgX0MySW5uYXRlU3RhdHVzKGMyX3N0YXR1c190IHN0YXR1cykgOiBtU3RhdHVzKHN0YXR1cykgeyB9CisKKyAgICBjMl9zdGF0dXNfdCBtU3RhdHVzOyAvLyB0aGlzIHN0YXR1cyBpcyB1cGRhdGFibGUgYnkgdGhlIG9iamVjdAorfTsKKworLy8vIEB9CisKKy8qKgorICogVGhpcyBpcyBhIHV0aWxpdHkgdGVtcGxhdGUgZm9yIG9iamVjdHMgcHJvdGVjdGVkIGJ5IGFuIGFjcXVpcmUgZmVuY2UsIHNvIHRoYXQgZXJyb3JzIGR1cmluZworICogYWNxdWlyaW5nIHRoZSBvYmplY3QgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkFjcXVpcmFibGUgOiBwdWJsaWMgQzJGZW5jZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWNxdWlyZXMgdGhlIG9iamVjdCBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZS4gQW55IGVycm9ycyBkdXJpbmcgdGhlIG1hcHBpbmcgd2lsbCBiZQorICAgICAqIHBhc3NlZCB0byB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogXHJldHVybiBhY3F1aXJlZCBvYmplY3QgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQgaWYgd2FpdGluZyBmb3IgdGhlIGZlbmNlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBUIGdldCgpIHsKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gd2FpdCgpOworICAgICAgICByZXR1cm4gbVQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJBY3F1aXJhYmxlKGMyX3N0YXR1c190IGVycm9yLCBDMkZlbmNlIGZlbmNlLCBUIHQpIDogQzJGZW5jZShmZW5jZSksIG1Jbml0aWFsRXJyb3IoZXJyb3IpLCBtVCh0KSB7IH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdGlhbEVycm9yOworICAgIFQgbVQ7IC8vIFRPRE86IG1vdmUgaW5zdGVhZCBvZiBjb3B5Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBsaW5lYXIgTGluZWFyIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIExJTkVBUiBBU1BFQ1RTLCBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBCYXNpYyBzZWdtZW50IG1hdGggc3VwcG9ydC4KKyAqLworc3RydWN0IEMyU2VnbWVudCB7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IHNpemU7CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCh1aW50MzJfdCBvZmZzZXRfLCB1aW50MzJfdCBzaXplXykKKyAgICAgICAgOiBvZmZzZXQob2Zmc2V0XyksCisgICAgICAgICAgc2l6ZShzaXplXykgeworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZSA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IH5zaXplOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzVmFsaWQoKSAmJiAhaXNFbXB0eSgpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhYm9vbCgqdGhpcyk7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgY29udGFpbnMoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICBpZiAoIWlzVmFsaWQoKSB8fCAhb3RoZXIuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IG90aGVyLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAmJiBvZmZzZXQgKyBzaXplID49IG90aGVyLm9mZnNldCArIG90aGVyLnNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPT0gb3RoZXIub2Zmc2V0ICYmIHNpemUgPT0gb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb250YWlucyhvdGhlcikgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG9mZnNldCArIHNpemU7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBpbnRlcnNlY3QoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGVuZCgpLCBvdGhlci5lbmQoKSkgLSBjMl9tYXgob2Zmc2V0LCBvdGhlci5vZmZzZXQpKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBvZmZzZXQgaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG9mZnNldCwgYzJfbWF4KG9mZnNldCwgZW5kKCkpIC0gb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIGVuZCB0byBtYXggaWYgaXQgb3ZlcmZsb3dzICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlNlZ21lbnQgc2F0dXJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9taW4oc2l6ZSwgfm9mZnNldCkpOworICAgIH0KKworfTsKKworLyoqCisgKiBDb21tb24gYXNwZWN0IGZvciBhbGwgb2JqZWN0cyB0aGF0IGhhdmUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKi8KK2NsYXNzIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBMaW5lYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIEMyU2VnbWVudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudCgwLCBtQ2FwYWNpdHkpOworICAgIH0KKworcHJvdGVjdGVkOgorCisjaWYgVUlOVFBUUl9NQVggPT0gMHhmZmZmZmZmZgorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSwgInNpemVfdCBpcyB0b28gYmlnIik7CisjZWxzZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHNpemVfdCkgPiBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBzbWFsbCIpOworICAgIC8vIGV4cGxpY2l0bHkgZGlzYWJsZSBjb25zdHJ1Y3Rpb24gZnJvbSBzaXplX3QKKyAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Qoc2l6ZV90IGNhcGFjaXR5KSA9IGRlbGV0ZTsKKyNlbmRpZgorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eSkKKyAgICAgIDogbUNhcGFjaXR5KGNhcGFjaXR5KSB7IH0KKworICAgIGlubGluZSBleHBsaWNpdCBjb25zdGV4cHIgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBtQ2FwYWNpdHkocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5jYXBhY2l0eSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQ2FwYWNpdHk7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciByYW5nZSBpbnNpZGUgYSBsaW5lYXIgY2FwYWNpdHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldCArIG1TaXplOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KG1PZmZzZXQsIG1TaXplKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gc3VicmFuZ2Ugb2YgY2FwYWNpdHkgWzAsIGNhcGFjaXR5XSAmIFtzaXplLCBzaXplICsgb2Zmc2V0XQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QodWludDMyX3QgY2FwYWNpdHlfLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjYXBhY2l0eV8pLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIChubyBlcnJvciBjaGVjaykKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZvdGhlcikKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChvdGhlci5jYXBhY2l0eSgpKSwKKyAgICAgICAgICBtT2Zmc2V0KG90aGVyLm9mZnNldCgpKSwKKyAgICAgICAgICBtU2l6ZShvdGhlci5zaXplKCkpIHsKKyAgICB9CisKKyAgICAvLyBwYXJlbnQgY2FwYWNpdHkgcmFuZ2UgWzAsIGNhcGFjaXR5XQorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoMCksCisgICAgICAgICAgbVNpemUoY2FwYWNpdHkoKSkgeworICAgIH0KKworICAgIC8vIHN1YnJhbmdlIG9mIHBhcmVudCBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpLAorICAgICAgICAgIG1TaXplKGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKKyAgICAvLyBzdWJzZWN0aW9uIG9mIHRoZSBwYXJlbnQncyBhbmQgW29mZnNldCwgb2Zmc2V0ICsgc2l6ZV0gcmFuZ2VzCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1PZmZzZXQoYzJfbWluKGMyX21heChvZmZzZXQsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+b2Zmc2V0KCkpLCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoc3RkOjptaW4oYzJfbWluKHNpemUsIHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+c2l6ZSgpKSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpKSB7CisgICAgfQorCitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCBjaGlsZFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgKKyAgICAgICAgICAgIG1TaXplLAorICAgICAgICAgICAgYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSAtIG1PZmZzZXQsCisgICAgICAgICAgICBjMl9taW4oYzJfbWluKHNpemUsIG1TaXplKSwgY2FwYWNpdHkoKSAtIGMyX21pbihjMl9tYXgob2Zmc2V0LCBtT2Zmc2V0KSwgY2FwYWNpdHkoKSkpKTsKKyAgICB9CisKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdDsKKyAgICAvLyBpbnZhcmlhbnRzIDAgPD0gbU9mZnNldCA8PSBtT2Zmc2V0ICsgbVNpemUgPD0gY2FwYWNpdHkoKQorICAgIHVpbnQzMl90IG1PZmZzZXQ7CisgICAgdWludDMyX3QgbVNpemU7CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyTGluZWFyUmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmcGFyZW50LCBvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UgaW50ZXJzZWN0KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIGNhcGFjaXR5IGFuZCByYW5nZSBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyTGluZWFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJMaW5lYXJDYXBhY2l0eShzaXplX3QgY2FwYWNpdHkpCisgICAgICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKGNhcGFjaXR5LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSByYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0LCBzaXplKTsKKyAgICB9Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYW4gZWRpdGFibGUgbGluZWFyIHJhbmdlLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgIHVzaW5nIF9DMkxpbmVhclJhbmdlQXNwZWN0OjpfQzJMaW5lYXJSYW5nZUFzcGVjdDsKKworcHVibGljOgorLy8vIFxuYW1lIEVkaXRhYmxlIGxpbmVhciByYW5nZSBpbnRlcmZhY2UKKy8vLyBAeworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb2Zmc2V0IHRvIHxvZmZzZXR8LCB3aGlsZSB0cnlpbmcgdG8ga2VlcCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdW5jaGFuZ2VkIChlLmcuCisgICAgICogc2l6ZSB3aWxsIGdyb3cgaWYgb2Zmc2V0IGlzIGRlY3JlYXNlZCwgYW5kIG1heSBzaHJpbmsgaWYgb2Zmc2V0IGlzIGluY3JlYXNlZC4pIFJldHVybnMKKyAgICAgKiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gaWYgMCA8PSB8b2Zmc2V0fCA8PSBjYXBhY2l0eSgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgPiBtT2Zmc2V0ICsgbVNpemUpIHsKKyAgICAgICAgICAgIG1TaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaXplID0gbU9mZnNldCArIG1TaXplIC0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8LiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0bworICAgICAqIGlmIDAgPD0gfHNpemV8IDw9IGNhcGFjaXR5KCkgLSBvZmZzZXQoKS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZQorICAgICAqIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRTaXplKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSgpIC0gbU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRPZmZzZXQoKSBleGNlcHQgdGhhdCBvZmZzZXQgd2lsbAorICAgICAqIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIChldmVuIHVzaW5nIGJlc3QgZWZmb3J0KSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nCisgICAgICogb24gdGhlIG9yZGVyIG9mIHRoZSBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0T2Zmc2V0X2JlKHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICAodm9pZClzZXRPZmZzZXQoYzJfbWluKG9mZnNldCwgY2FwYWNpdHkoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8IHdpdGggYmVzdCBlZmZvcnQuIFNhbWUgYXMgc2V0U2l6ZSgpIGV4Y2VwdCB0aGF0IHRoZSBzZWxlY3RlZCByZWdpb24KKyAgICAgKiB3aWxsIGJlIGNsYW1wZWQgdG8gdGhlIGJ1ZmZlciBjYXBhY2l0eSAoZS5nLiBzaXplIGlzIGNsYW1wZWQgdG8gWzAsIGNhcGFjaXR5KCkgLSBvZmZzZXQoKV0pLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRTaXplX2JlKHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgbVNpemUgPSBjMl9taW4oc2l6ZSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpOworICAgIH0KKy8vLyBAfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEFMTE9DQVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxpbmdyb3VwIGFsbG9jYXRvciBBbGxvY2F0aW9uIGFuZCBtZW1vcnkgcGxhY2VtZW50CisvLy8gQHsKKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiAgQWxsb2NhdG9ycyBhcmUgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGFsbG9jYXRlIG1lbW9yeSAoYWxsb2NhdGlvbnMpIGZvciBidWZmZXJzLiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIDFEIG9yIDJEIGFsbG9jYXRpb25zLgorICoKKyAqICBcbm90ZSBJbiB0aGVvcnkgdGhleSBjb3VsZCBzdXBwb3J0IGJvdGgsIGJ1dCBpbiBwcmFjdGljZSwgd2Ugd2lsbCB1c2Ugb25seSBvbmUgb3IgdGhlIG90aGVyLgorICoKKyAqICBOZXZlciBjb25zdHJ1Y3RlZCBvbiBzdGFjay4KKyAqCisgKiAgQWxsb2NhdG9ycyBhcmUgcHJvdmlkZWQgYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRvciBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgaWRfdDsKKyAgICBlbnVtIDogaWRfdCB7CisgICAgICAgIEJBRF9JRCA9IDB4QkFERCwgLy8gaW52YWxpZCBhbGxvY2F0b3IgSUQKKyAgICB9OworCisgICAgLyoqCisgICAgICogQWxsb2NhdGlvbiB0eXBlcy4gVGhpcyBpcyBhIGJpdG1hc2sgYW5kIGlzIHVzZWQgaW4gQzJBbGxvY2F0b3I6OkluZm8KKyAgICAgKiB0byBsaXN0IHRoZSBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcyBvZiBhbiBhbGxvY2F0b3IuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIExJTkVBUiAgPSAxIDw8IDAsIC8vCisgICAgICAgIEdSQVBISUMgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IGFuIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEFsbG9jYXRvcnMgZG9uJ3QgaGF2ZSBhIHF1ZXJ5IEFQSSBzbyBhbGwgcXVlcmlhYmxlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlLgorICAgICAqLworICAgIHN0cnVjdCBUcmFpdHMgeworICAgICAgICBDMlN0cmluZyBuYW1lOyAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgbmFtZQorICAgICAgICBpZF90IGlkOyAgICAgICAgICAgICAgICAgICAgLy8vPCBhbGxvY2F0b3IgSUQKKyAgICAgICAgdHlwZV90IHN1cHBvcnRlZFR5cGVzOyAgICAgIC8vLzwgc3VwcG9ydGVkIGFsbG9jYXRpb24gdHlwZXMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5pbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtaW5pbWFsbHkgcmVxdWlyZWQgZm9yIGFsbG9jYXRpb25zCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4aW11bVVzYWdlOyAvLy88IHVzYWdlIHRoYXQgaXMgbWF4aW1hbGx5IGFsbG93ZWQgZm9yIGFsbG9jYXRpb25zCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yLgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBhbGxvY2F0b3IgZnJvbSB0aGUKKyAgICAgKiBhbGxvY2F0b3Igc3RvcmUsIGFuZCB0byBpZGVudGlmeSB0aGlzIGFsbG9jYXRvciBhY3Jvc3MgYWxsIHByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBhbGxvY2F0b3IuCisgICAgICovCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIHRyYWl0cy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgZnVsbC1mbGVkZ2VkIHF1ZXJ5IEFQSSwgb25seSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYWxsb2NhdG9yIGluZm9ybWF0aW9uCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSAxRCBhbGxvY2F0aW9uIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzCisgICAgICogc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgIHRoZSBzaXplIG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDFEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSB8aGFuZGxlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkCisgICAgICogaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uLiBPbiBzdWNjZXNzLCB0aGUgYWxsb2NhdGlvbiB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRha2Ugb3duZXJzaGlwIG9mIHxoYW5kbGV8LgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHJlY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSByZWNyZWF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgaW52YWxpZCBoYW5kbGUgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDFEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDJEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggICAgICAgICB0aGUgd2lkdGggb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFRoaXMgY291bGQgYmUgYSB2ZW5kb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaG91bGQgbGF5b3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBhbGxvY2F0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpY3JlYXRlcyBhIDJEIGFsbG9jYXRpb24gZnJvbSBhIG5hdGl2ZSBoYW5kbGUuICBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjcmVhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK3Byb3RlY3RlZDoKKyAgICBDMkFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogXGluZ3JvdXAgbGluZWFyIGFsbG9jYXRvcgorICogMUQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbiBzdGFydGluZyBmcm9tIHxvZmZzZXR8IHdpdGggfHNpemV8IGludG8gbG9jYWwgcHJvY2VzcyBtZW1vcnkuCisgICAgICogU3RvcmVzIHRoZSBzdGFydGluZyBhZGRyZXNzIGludG8gfGFkZHJ8LCBvciBOVUxMIGlmIHRoZSBvcGVyYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKiB8ZmVuY2V8IHdpbGwgY29udGFpbiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5CisgICAgICogc2FmZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGNvbnRhaW4gYW4gZW1wdHkgKGFscmVhZHkgZmlyZWQpIGZlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgICAgICAgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHBvcnRpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiZSBwYWdlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBwYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBwb3J0aW9uIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKgorICAgICAqIFx0b2RvIE9ubHkgb25lIHBvcnRpb24gY2FuIGJlIG1hcHBlZCBhdCB0aGUgc2FtZSB0aW1lIC0gdGhpcyBpcyB0cnVlIGZvciBncmFsbG9jLCBidXQgdGhlcmUKKyAgICAgKiAgICAgICBpcyBubyBuZWVkIGZvciB0aGlzIGZvciAxRCBidWZmZXJzLgorICAgICAqIFx0b2RvIERvIHdlIG5lZWQgdG8gc3VwcG9ydCBzeW5jIG9wZXJhdGlvbiBhcyB3ZSBjb3VsZCBqdXN0IHdhaXQgZm9yIHRoZSBmZW5jZT8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIG1hcCB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgaWYgdGhlIGFsbG9jYXRpb24gaXMgYWxyZWFkeSBtYXBwZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChvZmZzZXQvc2l6ZSkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovLAorICAgICAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxzaXplfC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgbWFwcGVkIHJlZ2lvbgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyB1bm1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhIHJlbGVhc2UgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eSBmZW5jZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIGZhaWx1cmUuIFRoaXMgZmVuY2Ugc2lnbmFscyB3aGVuIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIGNvbnRhaW5zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYWxsIGNoYW5nZXMgdGhhdCBoYXBwZW5lZCB0byB0aGUgbWFwcGVkIHJlZ2lvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdGlvbiB3YXMgbm90IG1hcHBlZCBwcmV2aW91c2x5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChhZGRyL3NpemUpIGRvIG5vdCBjb3JyZXNwb25kIHRvIHByZXZpb3VzbHkgbWFwcGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmVnaW9ucyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgcG9ydGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gXHRvZG8gc2hvdWxkIHdlIGxpbWl0IGFsbG9jYXRpb24gZGlyZWN0bHk/CisgICAgQzJMaW5lYXJBbGxvY2F0aW9uKHNpemVfdCBjYXBhY2l0eSkgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIFVJTlQzMl9NQVgpKSB7fQorICAgIHZpcnR1YWwgfkMyTGluZWFyQWxsb2NhdGlvbigpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ2lyY3VsYXJCbG9jazsKK2NsYXNzIEMyTGluZWFyQmxvY2s7CitjbGFzcyBDMkdyYXBoaWNCbG9jazsKKworLyoqCisgKiAgQmxvY2sgcG9vbHMgYXJlIHVzZWQgYnkgY29tcG9uZW50cyB0byBvYnRhaW4gb3V0cHV0IGJ1ZmZlcnMgaW4gYW4gZWZmaWNpZW50IHdheS4gVGhleSBjYW4KKyAqICBzdXBwb3J0IGVpdGhlciBsaW5lYXIgKDFEKSwgY2lyY3VsYXIgKDFEKSBvciBncmFwaGljICgyRCkgYmxvY2tzLgorICoKKyAqICBCbG9jayBwb29scyBkZWNvdXBsZSB0aGUgcmVjeWNsaW5nIG9mIG1lbW9yeS9hbGxvY2F0aW9ucyBmcm9tIHRoZSBjb21wb25lbnRzLiBUaGV5IGFyZSBtZWFudCB0bworICogIGJlIGFuIG9wYXF1ZSBzZXJ2aWNlICh0aGVyZSBhcmUgbm8gcHVibGljIEFQSXMgb3RoZXIgdGhhbiBvYnRhaW5pbmcgYmxvY2tzKSBwcm92aWRlZCBieSB0aGUKKyAqICBwbGF0Zm9ybS4gQmxvY2sgcG9vbHMgYXJlIGFsc28gbWVhbnQgdG8gZGVjb3VwbGUgYWxsb2NhdGlvbnMgZnJvbSBtZW1vcnkgdXNlZCBieSBidWZmZXJzLiBUaGlzCisgKiAgaXMgYWNjb21wbGlzaGVkIGJ5IGFsbG93aW5nIHBvb2xzIHRvIGFsbG90IG11bHRpcGxlIG1lbW9yeSAnYmxvY2tzJyBvbiBhIHNpbmdsZSBhbGxvY2F0aW9uLiBBcworICogIHRoZWlyIG5hbWUgc3VnZ2VzdCwgYmxvY2sgcG9vbHMgbWFpbnRhaW4gYSBwb29sIG9mIG1lbW9yeSBibG9ja3MuIFdoZW4gYSBjb21wb25lbnQgYXNrcyBmb3IKKyAqICBhIG1lbW9yeSBibG9jaywgcG9vbHMgd2lsbCB0cnkgdG8gcmV0dXJuIGEgZnJlZSBtZW1vcnkgYmxvY2sgYWxyZWFkeSBpbiB0aGUgcG9vbC4gSWYgbm8gc3VjaAorICogIGJsb2NrIGV4aXN0cywgdGhleSB3aWxsIGFsbG9jYXRlIG1lbW9yeSB1c2luZyB0aGUgYmFja2luZyBhbGxvY2F0b3IgYW5kIGFsbG90IGEgYmxvY2sgb24gdGhhdAorICogIGFsbG9jYXRpb24uIFdoZW4gYmxvY2tzIGFyZSBubyBsb25nZXIgdXNlZCBpbiB0aGUgc3lzdGVtLCB0aGV5IGFyZSByZWN5Y2xlZCBiYWNrIHRvIHRoZSBibG9jaworICogIHBvb2wgYW5kIGFyZSBhdmFpbGFibGUgYXMgZnJlZSBibG9ja3MuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICovCitjbGFzcyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmxvY2sgcG9vbCBJRCB0eXBlLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDY0X3QgbG9jYWxfaWRfdDsKKworICAgIGVudW0gOiBsb2NhbF9pZF90IHsKKyAgICAgICAgQkFTSUNfTElORUFSID0gMCwgIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAxRCBibG9ja3MKKyAgICAgICAgQkFTSUNfR1JBUEhJQyA9IDEsIC8vLzwgSUQgb2YgYmFzaWMgKHVub3B0aW1pemVkKSBibG9jayBwb29sIGZvciBmZXRjaGluZyAyRCBibG9ja3MKKyAgICAgICAgUExBVEZPUk1fU1RBUlQgPSAweDEwLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBmb3IgdGhpcyBibG9jayBwb29sLiBUaGlzIElEIGlzIHVzZWQgdG8gZ2V0IHRoaXMgYmxvY2sgcG9vbCBmcm9tIHRoZSBwbGF0Zm9ybS4KKyAgICAgKiBJdCBpcyBvbmx5IHZhbGlkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBsb2NhbCBJRCBmb3IgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIG9mIHRoaXMgYmxvY2sgcG9vbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGxpbmVhciB3cml0ZWFibGUgYmxvY2sgb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlCisgICAgICogYmxvY2sgaXMgc3RvcmVkIGluIHxibG9ja3wuIE90aGVyd2lzZSwgfGJsb2NrfCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5IHRoZSBzaXplIG9mIHJlcXVlc3RlZCBibG9jay4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgbGluZWFyIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIGNpcmN1bGFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGNpcmN1bGFyIGJsb2NrLiAobm90ZTogdGhlIHNpemUgb2YgdGhlIG9idGFpbmVkCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLiB0byBhY2NvbW1vZGF0ZSBhbnkgc3lzdGVtLXJlcXVpcmVkCisgICAgICogICAgICAgICAgICAgICAgIGFsaWdubWVudCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgY2lyY3VsYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ2lyY3VsYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIDJEIGdyYXBoaWMgYmxvY2sgb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAorICAgICAqIHRoZSBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gd2lkdGggIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsIGUuZy4KKyAgICAgKiAgICAgICAgICAgICAgIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYmxvY2sgKHRoZSBvYnRhaW5lZCBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsCisgICAgICogICAgICAgICAgICAgICBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSBmb3JtYXQgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYmxvY2suIFRoaXMgY291bGQgYmUgYSB2ZW5kb3Igc3BlY2lmaWMgZm9ybWF0LgorICAgICAqIFxwYXJhbSB1c2FnZSAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLCBidXQgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246CisgICAgICogICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgcG9vbCBkb2VzIG5vdCBzdXBwb3J0IDJEIGJsb2NrcworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgICpibG9jayA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OworfTsKKworLy8vIEB9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIEJMT0NLUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qKgorICogQmxvY2tzIGFyZSBzZWN0aW9ucyBvZiBhbGxvY2F0aW9ucy4gVGhleSBjYW4gYmUgZWl0aGVyIDFEIG9yIDJELgorICovCisKK2NsYXNzIEMyTGluZWFyQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDFEIGJsb2NrLgorICoKKyAqIFxub3RlIGNhcGFjaXR5KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCBzaXplKCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZQorICogdXNhYmxlIHBvcnRpb24uIFVzZSBhbmQgb2Zmc2V0KCkgYW5kIHNpemUoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrIGRpcmVjdGx5IHRocm91Z2ggaXRzIGhhbmRsZQorICogdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIHRvIHRoaXMgYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2sxRCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBoYW5kbGUgZm9yIHRoaXMgYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFxub3RlIHRoYXQgdGhlIGJsb2NrIGFuZCBpdHMgYmxvY2sgcG9vbCBoYXMgc2hhcmVkIG93bmVyc2hpcCBvZiB0aGUgaGFuZGxlCisgICAgICogICAgICAgYW5kIGlmIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBibG9jayBhcmUgcmVsZWFzZWQsIHRoZSB1bmRlcmx5aW5nIGJsb2NrCisgICAgICogICAgICAgYWxsb2NhdGlvbiBtYXkgZ2V0IHJldXNlZCBldmVuIGlmIGEgY2xpZW50IGtlZXBzIGEgY2xvbmUgb2YgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgdGhhdCBjcmVhdGVkIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gZm9yIHRoaXMgYmxvY2suIFRoaXMKKyAgICAgKiBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgaGFuZGxlLgorICAgICAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIC8qKiBjb25zdHJ1Y3QgYSBibG9jay4gKi8KKyAgICBDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIFJlYWQgdmlldyBwcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBDMlJlYWRWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHBhcmFtIG9mZnNldCAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGlzCisgICAgICogICAgICAgICAgICAgIHZpZXcuCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIEMyUmVhZFZpZXcgc3ViVmlldyhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGVycm9yIGR1cmluZyB0aGUgY3JlYXRpb24vbWFwcGluZyBvZiB0aGlzIHZpZXcuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoaXMgdmlldy4gVGhpcyBzZXRzIGVycm9yIHRvIEMyX05PX0lOSVQuCisgICAgICovCisgICAgLy92b2lkIHJlbGVhc2UoKTsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJSZWFkVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKTsKKyAgICBleHBsaWNpdCBDMlJlYWRWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgdWludDMyX3QgbU9mZnNldDsgLyoqPCBvZmZzZXQgaW50byB0aGUgbGluZWFyIGJsb2NrIGJhY2tpbmcgdGhpcyByZWFkIHZpZXcgKi8KK307CisKKy8qKgorICogV3JpdGUgdmlldyBwcm92aWRlcyByZWFkL3dyaXRlIGFjY2VzcyBmb3IgYSBsaW5lYXIgbWVtb3J5IHNlZ21lbnQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4gXHRvZG8gbW92YWJsZSBvbmx5PworICovCitjbGFzcyBDMldyaXRlVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBibG9jayBhdCB0aGUgY3VycmVudCBvZmZzZXQgb3IgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgKiAgICAgICAgIFRoaXMgcG9pbnRlciBpcyBvbmx5IHZhbGlkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhpcyB2aWV3IG9yIHVudGlsIGl0IGlzIHJlbGVhc2VkLgorICAgICAqLworICAgIHVpbnQ4X3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgZXhwbGljaXQgQzJXcml0ZVZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBsaW5lYXIgYmxvY2sgKHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbikgd2l0aCBhbiBhY3F1aXJlIGZlbmNlLgorICogQmxvY2tzIGFyZSB1bm1hcHBlZCB3aGVuIGNyZWF0ZWQsIGFuZCBjYW4gYmUgbWFwcGVkIGludG8gYSByZWFkIHZpZXcgb24gZGVtYW5kLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUgYW5kIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2F0aW9uIHRoYXQgaXQgaXMgYmFzZWQgb24uCisgKi8KK2NsYXNzIEMyQ29uc3RMaW5lYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgYmxvY2suCisgICAgICogXHBhcmFtIHNpemUgICAgdGhlIHNpemUgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgcmVtYWluaW5nIGRhdGEgZnJvbSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGluZWFyIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc3ViQmxvY2soc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmb3IgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBmZW5jZSB0aGF0IG11c3QgYmUgd2FpdGVkIG9uIGJlZm9yZSByZWFkaW5nIHRoZSBibG9jay4KKyAgICAgKi8KKyAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3QgeyByZXR1cm4gbUZlbmNlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkNvbnN0TGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSwgQzJGZW5jZSBtRmVuY2UpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIEMyRmVuY2UgbUZlbmNlOworfTsKKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaXMgYSB3cml0ZWFibGUgMUQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0cyB3aXRoCisgKiBjb25zdW1lcnMvcmVhZGVycyBhcyByZWFkLW9ubHkgY29uc3QgbGluZWFyIGJsb2NrKHMpLgorICovCitjbGFzcyBDMkxpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdExpbmVhckJsb2NrIHNoYXJlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworcHJvdGVjdGVkOgorICAgIEMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSk7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ0lSQ1VMQVIgQkxPQ0tTIEFORCBWSUVXUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLyBcZGVmZ3JvdXAgY2lyY3VsYXIgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQKKy8vLyBAeworCisvKioKKyAqIENpcmN1bGFyIGJsb2NrcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBkYXRhIGJldHdlZW4gYSB3cml0ZXIgYW5kIGEgcmVhZGVyIChhbmQvb3Igb3RoZXIgY29uc3VtZXJzKS0KKyAqIGluIGEgbWVtb3J5LWVmZmljaWVudCB3YXkgYnkgcmV1c2luZyBhIHNlY3Rpb24gb2YgbWVtb3J5LiBDaXJjdWxhciBibG9ja3MgYXJlIGEgYml0IG1vcmUgY29tcGxleAorICogdGhhbiBzaW5nbGUgcmVhZGVyL3NpbmdsZSB3cml0ZXIgc2NoZW1lcyB0byBmYWNpbGl0YXRlIGJsb2NrLWJhc2VkIGNvbnN1bWluZyBvZiBkYXRhLgorICoKKyAqIFRoZXkgY2FuIG9wZXJhdGUgaW4gdHdvIG1vZGVzOgorICoKKyAqIDEpIG9uZSB3cml0ZXIgdGhhdCBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZCAodGhpcyBtb2RlbCBjYW4gYmUgdXNlZCBieSBjb21wb25lbnRzKQorICoKKyAqIDIpIG9uZSB3cml0ZXIgdGhhdCB3cml0ZXMgY29udGludW91c2x5LCBhbmQgb25lIHJlYWRlciB0aGF0IGNhbiBjcmVhdGVzIGJsb2NrcyB0byBiZSBjb25zdW1lZAorICogICAgYnkgZnVydGhlciByZWNpcGllbnRzICh0aGlzIG1vZGVsIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yaywgYW5kIGNhbm5vdCBiZSB1c2VkIGJ5IGNvbXBvbmVudHMuKQorICoKKyAqIENpcmN1bGFyIGJsb2NrcyBoYXZlIGZvdXIgc2VnbWVudHMgd2l0aCBydW5uaW5nIHBvaW50ZXJzOgorICogIC0gcmVzZXJ2ZWQ6IGRhdGEgcmVzZXJ2ZWQgYW5kIGF2YWlsYWJsZSBmb3IgdGhlIHdyaXRlcgorICogIC0gY29tbWl0dGVkOiBkYXRhIGNvbW1pdHRlZCBieSB0aGUgd3JpdGVyIGFuZCBhdmFpbGFibGUgdG8gdGhlIHJlYWRlciAoaWYgcHJlc2VudCkKKyAqICAtIHVzZWQ6IGRhdGEgdXNlZCBieSBjb25zdW1lcnMgKGlmIHByZXNlbnQpCisgKiAgLSBhdmFpbGFibGU6IHVudXNlZCBkYXRhIGF2YWlsYWJsZSB0byBiZSByZXNlcnZlZAorICovCitjbGFzcyBDMkNpcmN1bGFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKKyAgICAvLyBUT0RPOiBhZGQgbWV0aG9kcworCitwcml2YXRlOgorICAgIHNpemVfdCBtUmVzZXJ2ZWQgX191bnVzZWQ7ICAgLy8gZW5kIG9mIHJlc2VydmVkIHNlY3Rpb24KKyAgICBzaXplX3QgbUNvbW1pdHRlZCBfX3VudXNlZDsgIC8vIGVuZCBvZiBjb21taXR0ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtVXNlZCBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIHVzZWQgc2VjdGlvbgorICAgIHNpemVfdCBtRnJlZSBfX3VudXNlZDsgICAgICAgLy8gZW5kIG9mIGZyZWUgc2VjdGlvbgorfTsKKworY2xhc3MgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGN1cnJlbnRseSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhpcyBzZWdtZW50CisgICAgICovCisgICAgc2l6ZV90IGF2YWlsYWJsZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVzZXJ2ZSBzb21lIHNwYWNlIGZvciB0aGlzIHNlZ21lbnQgZnJvbSBpdHMgY3VycmVudCBzdGFydC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIGRlc2lyZWQgc3BhY2UgaW4gYnl0ZXMKKyAgICAgKiBccGFyYW0gZmVuY2UgICBhIHBvaW50ZXIgdG8gYW4gYWNxdWlyZSBmZW5jZS4gSWYgbm9uLW51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBhc3luY2hyb25vdXMgYW5kCisgICAgICogICAgICAgICAgICAgIGEgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSB0aGF0IHdpbGwgYmUgc2lnbmFsZWQgd2hlbiB0aGUgcmVzZXJ2YXRpb24gaXMKKyAgICAgKiAgICAgICAgICAgICAgY29tcGxldGUuIElmIG51bGwsIHRoZSByZXNlcnZhdGlvbiBpcyBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgc3BhY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICB0aGUgc3BhY2UgcmVxdWVzdGVkIGNhbm5vdCBiZSByZXNlcnZlZAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgcmVzZXJ2YXRpb24gdGltZWQgb3V0IFx0b2RvIHdoZW4/CisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXJ2aW5nIHNwYWNlLiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZXNlcnZlKHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50LiBUaGlzIHdpbGwgbW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYWJhbmRvbgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgYWJhbmRvbmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGFiYW5kb25pbmcgdGhlIGRhdGEgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgYWJhbmRvbihzaXplX3Qgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBTaGFyZSBhIHBvcnRpb24gYXMgYmxvY2socykgd2l0aCBjb25zdW1lcnMgKHRoZXNlIGFyZSBtb3ZlZCB0byB0aGUgdXNlZCBzZWN0aW9uKS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCisgICAgICogXG5vdGUgU2hhcmUgZG9lcyBub3QgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LiAoXHRvZG8gYWRkIGFiYW5kb24vb2Zmc2V0PykKKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBzaGFyZQorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZWN0aW9uCisgICAgICogXHBhcmFtIGJsb2NrcyAgdmVjdG9yIHdoZXJlIHRoZSBibG9ja3Mgb2YgdGhlIHNlY3Rpb24gYXJlIGFwcGVuZGVkIHRvCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIHBvcnRpb24gd2FzIHN1Y2Nlc3NmdWxseSBzaGFyZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gc2hhcmUgdGhlIHBvcnRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2hhcmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzaGFyZShzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSwgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJlZ2lubmluZyBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgYmVnaW4oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVuZCBvZmZzZXQKKyAgICAgKi8KKyAgICBzaXplX3QgZW5kKCk7Cit9OworCisvKioKKyAqIEEgY2lyY3VsYXIgd3JpdGUtdmlldyBpcyBhIGR5bmFtaWMgbWFwcGVkIHZpZXcgZm9yIGEgc2VnbWVudCBvZiBhIGNpcmN1bGFyIGJsb2NrLiBDYXJlIG11c3QgYmUKKyAqIHRha2VuIHdoZW4gdXNpbmcgdGhpcyB2aWV3IHNvIHRoYXQgb25seSB0aGUgc2VjdGlvbiBvd25lZCBieSB0aGUgc2VnbWVudCBpcyBtb2RpZmllZC4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlVmlldyA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogU3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrLgorICAgICAqIFxub3RlIHRoZSBzZWdtZW50IGRvZXMgbm90IG93biB0aGlzIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmJhc2UoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworfTsKKworLyoqCisgKiBUaGUgd3JpdGVyIG9mIGEgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIENhbiBjb21taXQgZGF0YSB0byBhIHJlYWRlciAobm90IHN1cHBvcnRlZCBmb3IgY29tcG9uZW50cykgT1Igc2hhcmUgZGF0YSBibG9ja3MgZGlyZWN0bHkgd2l0aCBhCisgKiBjb25zdW1lci4KKyAqCisgKiBJZiBhIGNvbXBvbmVudCBzdXBwb3J0cyBvdXRwdXR0aW5nIGRhdGEgaW50byBjaXJjdWxhciBidWZmZXJzLCBpdCBtdXN0IGFsbG9jYXRlIGEgY2lyY3VsYXIKKyAqIGJsb2NrIGFuZCB1c2UgYSBjaXJjdWxhciB3cml0ZXIuCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJXcml0ZXIgOiBwdWJsaWMgX0MyQ2lyY3VsYXJCbG9ja1NlZ21lbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbW1pdHMgYSBwb3J0aW9uIG9mIHRoaXMgc2VnbWVudCB0byB0aGUgbmV4dCBzZWdtZW50LiBUaGlzIG1vdmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICogc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBjb21taXQgdG8gdGhlIG5leHQgc2VnbWVudAorICAgICAqIFxwYXJhbSBmZW5jZSAgIGZlbmNlIHVzZWQgZm9yIHRoZSBjb21taXQgKHRoZSBmZW5jZSBtdXN0IHNpZ25hbCBiZWZvcmUgdGhlIGRhdGEgaXMgY29tbWl0dGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGNvbW1pdChzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSk7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMkNpcmN1bGFyV3JpdGVWaWV3PiBtYXAoKTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGdyYXBoaWMgR3JhcGhpYyBEYXRhIEJsb2NrcworLy8vIEB7CisKKy8qKgorICogQzJSZWN0OiByZWN0YW5nbGUgdHlwZSB3aXRoIG5vbi1uZWdhdGl2ZSBjb29yZGluYXRlcy4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdCBoYXMgcHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4gQWxsIG1ldGhvZHMgYXJlIGlubGluZS4KKyAqLworc3RydWN0IEMyUmVjdCB7CisvLyBwdWJsaWM6CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QoKQorICAgICAgICA6IEMyUmVjdCgwLCAwLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiBDMlJlY3Qod2lkdGhfLCBoZWlnaHRfLCAwLCAwKSB7IH0KKworICAgIGNvbnN0ZXhwciBDMlJlY3QgaW5saW5lIGF0KHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3Qod2lkdGgsIGhlaWdodCwgbGVmdF8sIHRvcF8pOworICAgIH0KKworICAgIC8vIHV0aWxpdHkgbWV0aG9kcworCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8PSB+d2lkdGggJiYgdG9wIDw9IH5oZWlnaHQ7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0IDw9IG90aGVyLmxlZnQgJiYgdG9wIDw9IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiBsZWZ0ICsgd2lkdGggPj0gb3RoZXIubGVmdCArIG90aGVyLndpZHRoCisgICAgICAgICAgICAgICAgICAgICYmIHRvcCArIGhlaWdodCA+PSBvdGhlci50b3AgKyBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzVmFsaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ID09IG90aGVyLmxlZnQgJiYgdG9wID09IG90aGVyLnRvcAorICAgICAgICAgICAgICAgICAgICAmJiB3aWR0aCA9PSBvdGhlci53aWR0aCAmJiBoZWlnaHQgPT0gb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgcmlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkdGg7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IGJvdHRvbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHRvcCArIGhlaWdodDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGludGVyc2VjdChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWluKHJpZ2h0KCksIG90aGVyLnJpZ2h0KCkpIC0gYzJfbWF4KGxlZnQsIG90aGVyLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihib3R0b20oKSwgb3RoZXIuYm90dG9tKCkpIC0gYzJfbWF4KHRvcCwgb3RoZXIudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWF4KHRvcCwgb3RoZXIudG9wKSk7CisgICAgfQorCisgICAgLyoqIGNsYW1wcyByaWdodCBhbmQgYm90dG9tIHRvIHRvcCwgbGVmdCBpZiB0aGV5IG92ZXJmbG93ICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3Qgbm9ybWFsaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KGMyX21heChsZWZ0LCByaWdodCgpKSAtIGxlZnQsIGMyX21heCh0b3AsIGJvdHRvbSgpKSAtIHRvcCwgbGVmdCwgdG9wKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIG5vdGU6IHBvdGVudGlhbGx5IHVudXN1YWwgYXJndW1lbnQgb3JkZXIKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCh1aW50MzJfdCB3aWR0aF8sIHVpbnQzMl90IGhlaWdodF8sIHVpbnQzMl90IGxlZnRfLCB1aW50MzJfdCB0b3BfKQorICAgICAgICA6IHdpZHRoKHdpZHRoXyksCisgICAgICAgICAgaGVpZ2h0KGhlaWdodF8pLAorICAgICAgICAgIGxlZnQobGVmdF8pLAorICAgICAgICAgIHRvcCh0b3BfKSB7IH0KK307CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHdpZHRoIGFuZCBoZWlnaHQgKHBsYW5hciBjYXBhY2l0eSkuCisgKi8KK2NsYXNzIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgY2FwYWNpdHkgaW50ZXJmYWNlCisvLy8gQHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gX21XaWR0aDsgfQorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gX21IZWlnaHQ7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJSZWN0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJSZWN0KF9tV2lkdGgsIF9tSGVpZ2h0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCisgICAgICA6IF9tV2lkdGgod2lkdGgpLCBfbUhlaWdodChoZWlnaHQpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9tV2lkdGgocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT53aWR0aCgpKSwKKyAgICAgICAgICBfbUhlaWdodChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmhlaWdodCgpKSB7IH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBfbVdpZHRoOworICAgIHVpbnQzMl90IF9tSGVpZ2h0OworLy8vIEB9Cit9OworCisvKioKKyAqIEMyUGxhbmVJbmZvOiBpbmZvcm1hdGlvbiBvbiB0aGUgbGF5b3V0IG9mIGEgc2luZ2UgZmxleGlibGUgcGxhbmUuCisgKgorICogUHVibGljIGZpZWxkcyB3aXRob3V0IGdldHRlcnMvc2V0dGVycy4KKyAqLworc3RydWN0IEMyUGxhbmVJbmZvIHsKKy8vcHVibGljOgorICAgIGVudW0gY2hhbm5lbF90IDogdWludDMyX3QgeworICAgICAgICBDSEFOTkVMX1ksICAvLy88IGx1bWEKKyAgICAgICAgQ0hBTk5FTF9SLCAgLy8vPCByZWQKKyAgICAgICAgQ0hBTk5FTF9HLCAgLy8vPCBncmVlbgorICAgICAgICBDSEFOTkVMX0IsICAvLy88IGJsdWUKKyAgICAgICAgQ0hBTk5FTF9BLCAgLy8vPCBhbHBoYQorICAgICAgICBDSEFOTkVMX0NSLCAvLy88IENyCisgICAgICAgIENIQU5ORUxfQ0IsIC8vLzwgQ2IKKyAgICB9IGNoYW5uZWw7CisKKyAgICBpbnQzMl90IGNvbEluYzsgICAgICAgLy8vPCBjb2x1bW4gaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKyAgICBpbnQzMl90IHJvd0luYzsgICAgICAgLy8vPCByb3cgaW5jcmVtZW50IGluIGJ5dGVzLiBtYXkgYmUgbmVnYXRpdmUKKworICAgIHVpbnQzMl90IGNvbFNhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIHdpZHRoIChtdXN0IGJlIGEgcG93ZXIgb2YgMikKKyAgICB1aW50MzJfdCByb3dTYW1wbGluZzsgLy8vPCBzdWJzYW1wbGluZyBjb21wYXJlZCB0byBoZWlnaHQgKG11c3QgYmUgYSBwb3dlciBvZiAyKQorCisgICAgdWludDMyX3QgYWxsb2NhdGVkRGVwdGg7IC8vLzwgc2l6ZSBvZiBlYWNoIHNhbXBsZSAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDgpCisgICAgdWludDMyX3QgYml0RGVwdGg7ICAgICAgIC8vLzwgc2lnbmlmaWNhbnQgYml0cyBwZXIgc2FtcGxlCisgICAgLyoqCisgICAgICogdGhlIHJpZ2h0IHNoaWZ0IG9mIHRoZSBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBzYW1wbGUuIEUuZy4gaWYgYSAxMC1iaXQgc2lnbmlmaWNhbnQKKyAgICAgKiB2YWx1ZSBpcyBsYWlkIG91dCBpbiBhIDE2LWJpdCBhbGxvY2F0aW9uIGFsaWduZWQgdG8gTFNCICh2YWx1ZXMgMC0xMDIzKSwgcmlnaHRTaGlmdAorICAgICAqIHdvdWxkIGJlIDAgYXMgdGhlIDE2LWJpdCB2YWx1ZSByZWFkIGZyb20gdGhlIHNhbXBsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJpZ2h0IHNoaWZ0ZWQKKyAgICAgKiBhbmQgY2FuIGJlIHVzZWQgYXMgaXMgKGFmdGVyIGFwcGx5aW5nIGEgMTAtYml0IG1hc2sgb2YgMHgzRkYpLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHwgICAgICBWVnxWVlZWVlZWVnwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICoKKyAgICAgKiBJZiB0aGUgdmFsdWUgaXMgbGFpZCBvdXQgYWxpZ25lZCB0byBNU0IsIHJpZ2h0U2hpZnQgd291bGQgYmUgNiwgYXMgdGhlIHZhbHVlIHJlYWQKKyAgICAgKiBmcm9tIHRoZSBhbGxvY2F0ZWQgc2FtcGxlIG11c3QgYmUgcmlnaHQtc2hpZnRlZCBieSA2IHRvIGdldCB0aGUgYWN0dWFsIHNhbXBsZSB2YWx1ZS4KKyAgICAgKgorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiB8VlZWVlZWVlZ8VlYgICAgICB8CisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqICAxNSAgICAgOCA3ICAgICAgMAorICAgICAqLworICAgIHVpbnQzMl90IHJpZ2h0U2hpZnQ7CisKKyAgICBlbnVtIGVuZGlhbm5lc3NfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTkFUSVZFLAorICAgICAgICBMSVRUTEVfRU5ELCAvLyBMSVRUTEVfRU5ESUFOIGlzIHJlc2VydmVkIG1hY3JvCisgICAgICAgIEJJR19FTkQsICAgIC8vIEJJR19FTkRJQU4gaXMgYSByZXNlcnZlZCBtYWNybworICAgIH0gZW5kaWFubmVzczsgLy8vPCBlbmRpYW5uZXNzIG9mIHRoZSBzYW1wbGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgZGVmaW5lIHRoZSByZWxhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBsYW5lcy4gSWYgbXVsdGlwbGUgcGxhbmVzIGFyZQorICAgICAqIGludGVybGVhdmVkLCB0aGV5IHNoYXJlIGEgcm9vdCBwbGFuZSAod2hpY2hldmVyIHBsYW5lJ3Mgc3RhcnQgYWRkcmVzcyBpcyB0aGUgbG93ZXN0KSwgYW5kCisgICAgICogfG9mZnNldHwgaXMgdGhlIG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSB0aGUgcm9vdCBwbGFuZSAoaW4gYnl0ZXMpLiB8cm9vdEl4fCBpcyB0aGUgaW5kZXgKKyAgICAgKiBvZiB0aGUgcm9vdCBwbGFuZS4gSWYgYSBwbGFuZSBpcyBpbmRlcGVuZGVudCwgcm9vdEl4IGlzIGl0cyBpbmRleCBhbmQgb2Zmc2V0IGlzIDAuCisgICAgICovCisgICAgdWludDMyX3Qgcm9vdEl4OyAvLy88IGluZGV4IG9mIHRoZSByb290IHBsYW5lCisgICAgdWludDMyX3Qgb2Zmc2V0OyAvLy88IG9mZnNldCBvZiB0aGlzIHBsYW5lIGluc2lkZSBvZiB0aGUgcm9vdCBwbGFuZQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBzc2l6ZV90IG1pbk9mZnNldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgICAgIHNzaXplX3Qgb2ZmcyA9IDA7CisgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgY29sSW5jIDwgMCkgeworICAgICAgICAgICAgb2ZmcyArPSBjb2xJbmMgKiAoc3NpemVfdCkod2lkdGggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVpZ2h0ID4gMCAmJiByb3dJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IHJvd0luYyAqIChzc2l6ZV90KShoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2ZmczsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWF4T2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gKGFsbG9jYXRlZERlcHRoICsgNykgPj4gMzsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPiAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KK30gQzJfUEFDSzsKKworc3RydWN0IEMyUGxhbmFyTGF5b3V0IHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBUWVBFX1VOS05PV04gPSAwLAorICAgICAgICBUWVBFX1lVViA9IDB4MTAwLCAgIC8vLzwgWVVWIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9ZVVZBLCAgICAgICAgICAvLy88IFlVVkEgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgICAgICBUWVBFX1JHQiwgICAgICAgICAgIC8vLzwgUkdCIGltYWdlIHdpdGggMyBwbGFuZXMKKyAgICAgICAgVFlQRV9SR0JBLCAgICAgICAgICAvLy88IFJCR0EgaW1hZ2Ugd2l0aCA0IHBsYW5lcworICAgIH07CisKKyAgICB0eXBlX3QgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIHR5cGUKKyAgICB1aW50MzJfdCBudW1QbGFuZXM7ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBjb21wb25lbnQgcGxhbmVzCisgICAgdWludDMyX3Qgcm9vdFBsYW5lczsgICAgICAgICAgICAvLyBudW1iZXIgb2YgbGF5b3V0IHBsYW5lcyAocm9vdCBwbGFuZXMpCisKKyAgICBlbnVtIHBsYW5lX2luZGV4X3QgOiB1aW50MzJfdCB7CisgICAgICAgIFBMQU5FX1kgPSAwLAorICAgICAgICBQTEFORV9VID0gMSwKKyAgICAgICAgUExBTkVfViA9IDIsCisgICAgICAgIFBMQU5FX1IgPSAwLAorICAgICAgICBQTEFORV9HID0gMSwKKyAgICAgICAgUExBTkVfQiA9IDIsCisgICAgICAgIFBMQU5FX0EgPSAzLAorICAgICAgICBNQVhfTlVNX1BMQU5FUyA9IDQsCisgICAgfTsKKworICAgIEMyUGxhbmVJbmZvIHBsYW5lc1tNQVhfTlVNX1BMQU5FU107Cit9OworCisvKioKKyAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7Citwcml2YXRlOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Qod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgbUNyb3AoQzJSZWN0KHN0ZDo6bWluKHdpZHRoIC0gc3RkOjptaW4oY3JvcC5sZWZ0LCB3aWR0aCksIGNyb3Aud2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihoZWlnaHQgLSBzdGQ6Om1pbihjcm9wLnRvcCwgaGVpZ2h0KSwgY3JvcC5oZWlnaHQpKS5hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjcm9wLmhlaWdodCwgaGVpZ2h0KSkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjaGlsZCBwbGFuYXIgc2VjdGlvbiBmb3IgfGNyb3B8LCB3aGVyZSB0aGUgY2FwYWNpdHkgcmVwcmVzZW50cyB0aGlzIHNlY3Rpb24uCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IGNoaWxkU2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoCisgICAgICAgICAgICAgICAgbUNyb3Aud2lkdGgsIG1Dcm9wLmhlaWdodCwKKyAgICAgICAgICAgICAgICAvLyBjcm9wIGFuZCB0cmFuc2xhdGUgfGNyb3B8IHJlY3QKKyAgICAgICAgICAgICAgICBDMlJlY3QoYzJfbWluKG1Dcm9wLnJpZ2h0KCkgLSBjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihtQ3JvcC5ib3R0b20oKSAtIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAuYXQoYzJfY2xhbXAobUNyb3AubGVmdCwgY3JvcC5sZWZ0LCBtQ3JvcC5yaWdodCgpKSAtIG1Dcm9wLmxlZnQsCisgICAgICAgICAgICAgICAgICAgIGMyX2NsYW1wKG1Dcm9wLnRvcCwgY3JvcC50b3AsIG1Dcm9wLmJvdHRvbSgpKSAtIG1Dcm9wLnRvcCkpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksIG1Dcm9wKHdpZHRoKCksIGhlaWdodCgpKSB7fQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAorICAgICAgICAgIG1Dcm9wKHBhcmVudCA9PSBudWxscHRyID8gQzJSZWN0KCkgOiAoKEMyUmVjdCkqcGFyZW50KS5pbnRlcnNlY3QoY3JvcCkubm9ybWFsaXplKCkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6IHBhcmVudC0+Y3JvcCgpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdDsKKyAgICBDMlJlY3QgbUNyb3A7CisvLy8gQH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIF9DMkVkaXRhYmxlUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKKy8vLyBcbmFtZSBQbGFuYXIgc2VjdGlvbiBpbnRlcmZhY2UKKy8vLyBAeworICAgIHVzaW5nIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q6Ol9DMlBsYW5hclNlY3Rpb25Bc3BlY3Q7CisKK3B1YmxpYzoKKyAgICAvLyBjcm9wIGNhbiBiZSBhbiBlbXB0eSByZWN0LCBkb2VzIG5vdCBoYXZlIHRvIGxpbmUgdXAgd2l0aCBzdWJzYW1wbGluZworICAgIC8vIE5PVEU6IHdlIGRvIG5vdCBzdXBwb3J0IGZsb2F0aW5nLXBvaW50IGNyb3AKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBjcm9wKCkgY29uc3QgeyByZXR1cm4gbUNyb3A7IH0KKworICAgIC8qKgorICAgICAqICBTZXRzIGNyb3AgdG8gY3JvcCBpbnRlcnNlY3RlZCB3aXRoIFsoMCwwKSAuLiAod2lkdGgsIGhlaWdodCldCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0Q3JvcF9iZShjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICAgICAgbUNyb3AubGVmdCA9IHN0ZDo6bWluKHdpZHRoKCksIGNyb3AubGVmdCk7CisgICAgICAgIG1Dcm9wLnRvcCA9IHN0ZDo6bWluKGhlaWdodCgpLCBjcm9wLnRvcCk7CisgICAgICAgIC8vIEl0J3MgZ3VhcmFudGVlZCB0aGF0IG1Dcm9wLmxlZnQgPD0gd2lkdGgoKSAmJiBtQ3JvcC50b3AgPD0gaGVpZ2h0KCkKKyAgICAgICAgbUNyb3Aud2lkdGggPSBzdGQ6Om1pbih3aWR0aCgpIC0gbUNyb3AubGVmdCwgY3JvcC53aWR0aCk7CisgICAgICAgIG1Dcm9wLmhlaWdodCA9IHN0ZDo6bWluKGhlaWdodCgpIC0gbUNyb3AudG9wLCBjcm9wLmhlaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QsIGl0IHNldHMgY3JvcCB0byBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBzZXRDcm9wKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBpZiAod2lkdGgoKSA8IGNyb3Aud2lkdGggfHwgaGVpZ2h0KCkgPCBjcm9wLmhlaWdodAorICAgICAgICAgICAgICAgIHx8IHdpZHRoKCkgLSBjcm9wLndpZHRoIDwgY3JvcC5sZWZ0IHx8IGhlaWdodCgpIC0gY3JvcC5oZWlnaHQgPCBjcm9wLnRvcCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1Dcm9wID0gY3JvcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorLy8vIEB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNhZmUgcmFuZ2UgY2FsY3VsYXRpb25zIHVzaW5nIHNpemVfdC1zLgorICovCitjbGFzcyBDMlBsYW5hclNlY3Rpb24gOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24oY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZwYXJlbnQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KCZwYXJlbnQsIGNyb3ApIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJQbGFuYXJTZWN0aW9uKCp0aGlzLCBjcm9wKTsKKyAgICB9Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHNpbXBsZSBhbmQgc2FmZSBwbGFuYXIgY2FwYWNpdHkgYW5kIHNlY3Rpb24gY29uc3RydWN0aW9uLgorICovCitjbGFzcyBDMlBsYW5hckNhcGFjaXR5IDogcHVibGljIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIGV4cGxpY2l0IEMyUGxhbmFyQ2FwYWNpdHkoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGMyX21pbih3aWR0aCwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oaGVpZ2h0LCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uIHNlY3Rpb24oY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKworLyoqCisgKiBcaW5ncm91cCBncmFwaGljIGFsbG9jYXRvcgorICogMkQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2NsYXNzIEMyR3JhcGhpY0FsbG9jYXRpb24gOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgYSByZWN0YW5ndWxhciBzZWN0aW9uIChhcyBkZWZpbmVkIGJ5IHxyZWN0fCkgb2YgYSAyRCBhbGxvY2F0aW9uIGludG8gbG9jYWwgcHJvY2VzcworICAgICAqIG1lbW9yeSBmb3IgZmxleGlibGUgYWNjZXNzLiBPbiBzdWNjZXNzLCBpdCBmaWxscyBvdXQgfGxheW91dHwgd2l0aCB0aGUgcGxhbmUgc3BlY2lmaWNhdGlvbnMKKyAgICAgKiBhbmQgZmlsbHMgdGhlIHxhZGRyfCBhcnJheSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiBlYWNoCisgICAgICogcGxhbmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCBsZWF2ZXMgfGxheW91dHwgYW5kIHxhZGRyfCB1bnRvdWNoZWQuIHxmZW5jZXwgd2lsbCBjb250YWluCisgICAgICogYW4gYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdC4gSWYgaXQgaXMgYWxyZWFkeSBzYWZlIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBidWZmZXIgY29udGVudHMsIHRoZW4gaXQgd2lsbCBiZSBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBTYWZlIHJlZ2lvbnMgZm9yIHRoZSBwb2ludGVyIGFkZHJlc3NlcyByZXR1cm5lZCBjYW4gYmUgZ290dGVuIHZpYSBDMkxheW91dEluZm8ubWluT2Zmc2V0KCkvCisgICAgICogbWF4T2Zmc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICAgICAgICBzZWN0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQpCisgICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgdGhlIGRlc2lyZWQgdXNhZ2UuIFx0b2RvIHRoaXMgbXVzdCBiZSBrU29mdHdhcmVSZWFkIGFuZC9vcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGtTb2Z0d2FyZVdyaXRlLgorICAgICAqIFxwYXJhbSBmZW5jZSAgICAgICAgIGEgcG9pbnRlciB0byBhIGZlbmNlIG9iamVjdCBpZiBhbiBhc3luYyBtYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYW5kIGFjcXVpcmUgZmVuY2Ugd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciBlbXB0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZlbmNlIG9uIGZhaWx1cmUuIElmIG51bGwsIHRoZSBtYXBwaW5nIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICogXHBhcmFtIGxheW91dCAgICAgICAgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBtYXBwZWQgcGxhbmVzJyBkZXNjcmlwdG9ycyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3RvcmVkLiBPbiBmYWlsdXJlLCBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUuCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLiBPbmx5IGxheW91dC5udW1QbGFuZXMgZWxlbWVudHMgd2lsbCBiZSBtb2RpZmllZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBzZWN0aW9uCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlcmUgaXMgYWxyZWFkeSBhIG1hcHBlZCByZWdpb24gYW5kIHRoaXMgYWxsb2NhdGlvbiBjYW5ub3Qgc3VwcG9ydAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG11bHRpLW1hcHBpbmcgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAocmVjdCkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFVubWFwcyBhIHNlY3Rpb24gb2YgYW4gYWxsb2NhdGlvbiBhdCB8YWRkcnwgd2l0aCB8cmVjdHwuIFRoZXNlIG11c3QgYmUgcGFyYW1ldGVycyBwcmV2aW91c2x5CisgICAgICogcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBieSB8bWFwfDsgb3RoZXJ3aXNlLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorICAgICAqCisgICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgcG9pbnRlciB0byBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGNvbnRhaW5pbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3NlcyBvZiB0aGUgbWFwcGVkIGxheWVycworICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIGJvdW5kYXJpZXMgb2YgdGhlIG1hcHBlZCBzZWN0aW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgc2VjdGlvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGVyZSBpcyBubyBzdWNoIG1hcHBlZCByZWdpb24gKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gdW5tYXAgdGhlIHNlY3Rpb24gKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxsb2NhdG9yIElEIGZvciB0aGlzIGFsbG9jYXRpb24uIFRoaXMgaXMgdXNlZnVsIHRvIHB1dCB0aGUgaGFuZGxlIGludG8gY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHVzaW5nIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OjpfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdDsKKyAgICB2aXJ0dWFsIH5DMkdyYXBoaWNBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbjsKKworLyoqCisgKiBBIDJEIGJsb2NrLgorICoKKyAqIFxub3RlIHdpZHRoKCkvaGVpZ2h0KCkgaXMgbm90IG1lYW5pbmdmdWwgZm9yIHVzZXJzIG9mIGJsb2NrczsgaW5zdGVhZCwgY3JvcCgpLndpZHRoKCkgYW5kCisgKiBjcm9wKCkuaGVpZ2h0KCkgaXMgdGhlIGNhcGFjaXR5IG9mIHRoZSB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBjcm9wKCkgaWYgYWNjZXNzaW5nIHRoZSBibG9jaworICogZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlIHRvIHJlcHJlc2VudCB0aGUgYWxsb3R0ZWQgcmVnaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcworICogYmxvY2suCisgKi8KK2NsYXNzIEMyQmxvY2syRCA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgQzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogR3JhcGhpYyB2aWV3IHByb3ZpZGVzIHJlYWQgb3IgcmVhZC13cml0ZSBhY2Nlc3MgZm9yIGEgZ3JhcGhpYyBibG9jay4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICoKKyAqIFxub3RlIER1ZSB0byB0aGUgc3Vic2FtcGxpbmcgb2YgZ3JhcGhpYyBidWZmZXJzLCBhIHJlYWQgdmlldyBtdXN0IHN0aWxsIGNvbnRhaW4gYSBjcm9wIHJlY3RhbmdsZQorICogdG8gZW5zdXJlIHN1YnNhbXBsaW5nIGlzIGZvbGxvd2VkLiBUaGlzIHJlc3VsdHMgaW4gbmVhcmx5IGlkZW50aWNhbCBpbnRlcmZhY2UgYmV0d2VlbiByZWFkIGFuZAorICogd3JpdGUgdmlld3MsIHNvIEMyR3JhcGhpY1ZpZXcgY2FuIGVuY29tcGFzcyBib3RoIG9mIHRoZW0uCisgKi8KK2NsYXNzIEMyR3JhcGhpY1ZpZXcgOiBwdWJsaWMgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGFycmF5IG9mIHBvaW50ZXJzIChvZiBsYXlvdXQoKS5udW1QbGFuZXMgZWxlbWVudHMpIHRvIHRoZSBzdGFydCBvZiB0aGUgcGxhbmVzIG9yCisgICAgICogbnVsbHB0ciBvbiBlcnJvci4gUmVnYXJkbGVzcyBvZiBjcm9wIHJlY3QsIHRoZXkgYWx3YXlzIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaAorICAgICAqIHBsYW5lLiBBY2Nlc3Mgb3V0c2lkZSBvZiB0aGUgY3JvcCByZWN0IHJlc3VsdHMgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgICAqLworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGxheW91dCBvZiB0aGUgZ3JhcGhpYyBibG9jayB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgZGltZW5zaW9uIG9mIHRoZSBzZWN0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNyb3Agb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogXHJldHVybiBhIHJlYWQgdmlldyBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgc2VjdGlvbiBvZiB0aGlzIHZpZXcKKyAgICAgKi8KKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKyAgICBDMkdyYXBoaWNWaWV3IHN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKTsKKyAgICBleHBsaWNpdCBDMkdyYXBoaWNWaWV3KGMyX3N0YXR1c190IGVycm9yKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEEgY29uc3RhbnQgKHJlYWQtb25seSkgZ3JhcGhpYyBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdEdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHJlYWQgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBtYXAoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVjdCAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCByZWN0YW5nbGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBncmFwaGljIGJsb2NrIGNvbnRhaW5pbmcgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2sKKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHN1YkJsb2NrKGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbiwgQzJGZW5jZSBmZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaXMgYSB3cml0ZWFibGUgMkQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBncmFwaGljIGJsb2NrLgorICovCitjbGFzcyBDMkdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IG1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAorICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKKyAgICAgKgorICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCisgICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCisgICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCisgICAgICovCisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJHcmFwaGljQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7Cit9OworCisvLy8gQH0KKworLy8vIFxkZWZncm91cCBidWZmZXJfb25qIEJ1ZmZlciBvYmplY3RzCisvLy8gQHsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQlVGRkVSUworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBcdG9kbzogRG8gd2Ugc3RpbGwgbmVlZCB0aGlzPworLy8vCisvLyBUaGVyZSBhcmUgMiBraW5kcyBvZiBidWZmZXJzOiBsaW5lYXIgb3IgZ3JhcGhpYy4gTGluZWFyIGJ1ZmZlcnMgY2FuIGNvbnRhaW4gYSBzaW5nbGUgYmxvY2ssIG9yCisvLyBhIGxpc3Qgb2YgYmxvY2tzIChMSU5FQVJfQ0hVTktTKS4gU3VwcG9ydCBmb3IgbGlzdCBvZiBibG9ja3MgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYWxsb3cgY29uc3VtaW5nCisvLyBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVycyBvciBzY2F0dGVyZWQgZGF0YSBzb3VyY2VzIHdpdGhvdXQgZXh0cmEgbWVtY3B5LiBDdXJyZW50bHksIGxpc3Qgb2YKKy8vIGdyYXBoaWMgYmxvY2tzIGlzIG5vdCBzdXBwb3J0ZWQuCisKK2NsYXNzIEMyTGluZWFyQnVmZmVyOyAgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkdyYXBoaWNCdWZmZXI7ICAvLyByZWFkLXdyaXRlIGJ1ZmZlcgorY2xhc3MgQzJMaW5lYXJDaHVua3NCdWZmZXI7CisKKy8qKgorICogQzJCdWZmZXJEYXRhOiB0aGUgbWFpbiwgbm9uLW1ldGEgZGF0YSBvZiBhIGJ1ZmZlci4gQSBidWZmZXIgY2FuIGNvbnRhaW4gZWl0aGVyIGxpbmVhciBibG9ja3MKKyAqIG9yIGdyYXBoaWMgYmxvY2tzLCBhbmQgY2FuIGNvbnRhaW4gZWl0aGVyIGEgc2luZ2xlIGJsb2NrIG9yIG11bHRpcGxlIGJsb2Nrcy4gVGhpcyBpcyBkZXRlcm1pbmVkCisgKiBieSBpdHMgdHlwZS4KKyAqLworY2xhc3MgQzJCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgVGhlIHR5cGUgb2YgYnVmZmVyIGRhdGEuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIElOVkFMSUQsICAgICAgICAgICAgLy8vPCBpbnZhbGlkIGJ1ZmZlciB0eXBlLiBEbyBub3QgdXNlLgorICAgICAgICBMSU5FQVIsICAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBsaW5lYXIgYmxvY2sKKyAgICAgICAgTElORUFSX0NIVU5LUywgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9yIG1vcmUgbGluZWFyIGJsb2NrcworICAgICAgICBHUkFQSElDLCAgICAgICAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBhIHNpbmdsZSBncmFwaGljIGJsb2NrCisgICAgICAgIEdSQVBISUNfQ0hVTktTLCAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uZSBvZiBtb3JlIGdyYXBoaWMgYmxvY2tzCisgICAgfTsKKyAgICB0eXBlZGVmIHR5cGVfdCBUeXBlOyAvLyBkZXByZWNhdGVkCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgYnVmZmVyIChkYXRhKS4KKyAgICAgKiBccmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgYnVmZmVyIGRhdGEuCisgICAgICovCisgICAgdHlwZV90IHR5cGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpbmVhciBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgbGluZWFyIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dmFsIGVtcHR5IGxpc3QgaWYgdGhpcyBidWZmZXIgZG9lcyBub3QgY29udGFpbiBsaW5lYXIgYmxvY2socykuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiBsaW5lYXJCbG9ja3MoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGdyYXBoaWMgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGNvbnN0IGdyYXBoaWMgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR2YWwgZW1wdHkgbGlzdCBpZiB0aGlzIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGdyYXBoaWMgYmxvY2socykuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrcygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCitwcm90ZWN0ZWQ6CisgICAgLy8gbm8gcHVibGljIGNvbnN0cnVjdG9yCisgICAgZXhwbGljaXQgQzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpOworfTsKKworLyoqCisgKiBDMkJ1ZmZlcjogYnVmZmVyIGJhc2UgY2xhc3MuIFRoZXNlIGFyZSBhbHdheXMgdXNlZCBhcyBzaGFyZWRfcHRycy4gVGhvdWdoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcgorICogb2JqZWN0cyAobmF0aXZlIGJ1ZmZlcnMsIGlvbiBidWZmZXJzLCBvciBkbWFidWZzKSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYnkgdGhlIHN5c3RlbSwKKyAqIEMyQnVmZmVycyBob2xkIG9ubHkgYSBzaW5nbGUgcmVmZXJlbmNlLgorICoKKyAqIFRoZXNlIG9iamVjdHMgY2Fubm90IGJlIHVzZWQgb24gdGhlIHN0YWNrLgorICovCitjbGFzcyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIHdpbGwgc3RpbGwgd29yayBpZiB1c2VkIGluIG9uRGVhdGhOb3RpZnkuCisgICAgICovCisjaWYgMAorICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCdWZmZXI+IGFzTGluZWFyQnVmZmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGUgPT0gTElORUFSID8gc3RkOjpzaGFyZWRfcHRyOjpyZWludGVycHJldF9jYXN0PEMyTGluZWFyQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGFzR3JhcGhpY0J1ZmZlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlID09IEdSQVBISUMgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJHcmFwaGljQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkNpcmN1bGFyQnVmZmVyPiBhc0NpcmN1bGFyQnVmZmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGUgPT0gQ0lSQ1VMQVIgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJDaXJjdWxhckJ1ZmZlcj4odGhpcykgOiBudWxscHRyOworICAgIH0KKyNlbmRpZgorCisgICAgLy8vQG5hbWUgUHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uIGhhbmRsaW5nCisgICAgLy8vQHsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24ganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgdHlwZWRlZiB2b2lkICgqT25EZXN0cm95Tm90aWZ5KSAoY29uc3QgQzJCdWZmZXIgKmJ1Ziwgdm9pZCAqYXJnKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBmb3IgYSBwcmUtZGVzdHJveSBub3RpZmljYXRpb24uIFRoaXMgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gdGhlIGRlc3RydWN0aW9uIG9mCisgICAgICogdGhpcyBidWZmZXIgKHdoZW4gdGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGNhbGxiYWNrIGFuZCBhcmd1bWVudAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlZ2lzdGVyIGZvciB0aGlzIGNhbGxiYWNrCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHVucmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBub3RpZmljYXRpb24gd2FzIG5vdCBmb3VuZAorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGFuIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWdpc3RyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKKworICAgIC8vL0B9CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIC8vL0BuYW1lIEJ1ZmZlci1zcGVjaWZpYyBhcmJpdHJhcnkgbWV0YWRhdGEgaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBpbmZvIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiBpbmZvKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2hlcyAob3IgdXBkYXRlcykgYW4gKGV4aXN0aW5nKSBtZXRhZGF0YSBmb3IgdGhpcyBidWZmZXIuCisgICAgICogSWYgdGhlIG1ldGFkYXRhIGlzIHN0cmVhbSBzcGVjaWZpYywgdGhlIHN0cmVhbSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGluZm8gTWV0YWRhdGEgdG8gdXBkYXRlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgbWV0YWRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZC91cGRhdGVkLgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGF0dGFjaCB0aGUgbWV0YWRhdGEgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaWYgdGhlIHNhbWUga2luZCBvZiBtZXRhZGF0YSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBidWZmZXIpLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHNldEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gJmluZm8pOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEgY2VydGFpbiB0eXBlIG9mIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlcmUgaXMgYSBtZXRhZGF0YSB3aXRoIHRoZSBwYXJhbWV0ZXIgdHlwZSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBib29sIGhhc0luZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIsIGFuZCByZXR1cm5zIGEKKyAgICAgKiBzaGFyZWQgcG9pbnRlciB0byBpdCBpZiB0aGVyZSBpcy4gUmV0dXJucyBhbiBlbXB0eSBzaGFyZWQgcG9pbnRlciBvYmplY3QgKG51bGxwdHIpIGlmIHRoZXJlCisgICAgICogaXMgbm90LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBwYXJhbWV0ZXIgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIG1ldGFkYXRhLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+IGdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbWV0YWRhdGEgZnJvbSB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCk7CisgICAgLy8vQH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBsaW5lYXIgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgY29udGFpbmluZyBhIHNpbmdsZSBncmFwaGljIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKTsKKworCisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworICAgIGV4cGxpY2l0IEMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworLy8gICAgVHlwZSBfbVR5cGU7Cit9OworCisvKioKKyAqIEFuIGV4dGVuc2lvbiBvZiBDMkluZm8gb2JqZWN0cyB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KKyAqCisgKiBcbm90ZSBUaGlzIG9iamVjdCBpcyBub3QgZGVzY3JpYmFibGUgYW5kIGNvbnRhaW5zIG9wYXF1ZSBkYXRhLgorICovCitjbGFzcyBDMkluZm9CdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgaW5mbyBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBwYXJhbWV0ZXIgaW5kZXguCisgICAgICovCisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqLworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7Cit9OworCisvLy8gQH0KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8vLyBcdG9kbyBUaGVzZSBhcmUgbm8gbG9uZ2VyIHVzZWQKKworLy8vIFxhZGR0b2dyb3VwIGxpbmVhcgorLy8vIEB7CisKKy8qKiBcZGVwcmVjYXRlZCAqLworY2xhc3MgQzJMaW5lYXJCdWZmZXIKKyAgICA6IHB1YmxpYyBDMkJ1ZmZlciwgcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0LAorICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJMaW5lYXJCdWZmZXI+IHsKK3B1YmxpYzoKKyAgICAvKiogXHRvZG8gd2hhdCBpcyB0aGlzPyAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGlubGluZSBDMkxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIEltcGwgKm1JbXBsOworfTsKKworY2xhc3MgQzJSZWFkQ3Vyc29yOworCitjbGFzcyBDMldyaXRlQ3Vyc29yIHsKK3B1YmxpYzoKKyAgICB1aW50MzJfdCByZW1haW5pbmcoKSBjb25zdDsgLy8gcmVtYWluaW5nIGRhdGEgdG8gYmUgcmVhZAorICAgIHZvaWQgY29tbWl0KCk7IC8vIGNvbW1pdHMgdGhlIGN1cnJlbnQgcG9zaXRpb24uIGRpc2NhcmQgZGF0YSBiZWZvcmUgY3VycmVudCBwb3NpdGlvbgorICAgIHZvaWQgcmVzZXQoKSBjb25zdDsgIC8vIHJlc2V0cyBwb3NpdGlvbiB0byB0aGUgbGFzdCBjb21taXR0ZWQgcG9zaXRpb24KKyAgICAvLyBzbGljZXMgb2ZmIGF0IG1vc3QgfHNpemV8IGJ5dGVzLCBhbmQgbW92ZXMgY3Vyc29yIGFoZWFkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyBzbGljZWQgb2ZmLgorICAgIEMyUmVhZEN1cnNvciBzbGljZSh1aW50MzJfdCBzaXplKSBjb25zdDsKKyAgICAvLyBzbGljZXMgb2ZmIGF0IG1vc3QgfHNpemV8IGJ5dGVzLCBhbmQgbW92ZXMgY3Vyc29yIGFoZWFkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyBzbGljZWQgb2ZmLgorICAgIEMyV3JpdGVDdXJzb3IgcmVzZXJ2ZSh1aW50MzJfdCBzaXplKTsKKyAgICAvLyBib29sIHJlYWQoVCYpOworICAgIC8vIGJvb2wgd3JpdGUoVCYpOworICAgIEMyRmVuY2Ugd2FpdEZvclNwYWNlKHVpbnQzMl90IHNpemUpOworfTsKKworLy8vIEB9CisKKy8vLyBcYWRkdG9ncm91cCBncmFwaGljCisvLy8gQHsKKworc3RydWN0IEMyQ29sb3JTcGFjZSB7CisvL3B1YmxpYzoKKyAgICBlbnVtIFN0YW5kYXJkIHsKKyAgICAgICAgQlQ2MDEsCisgICAgICAgIEJUNzA5LAorICAgICAgICBCVDIwMjAsCisgICAgICAgIC8vIFRPRE8KKyAgICB9OworCisgICAgZW51bSBSYW5nZSB7CisgICAgICAgIExJTUlURUQsCisgICAgICAgIEZVTEwsCisgICAgICAgIC8vIFRPRE8KKyAgICB9OworCisgICAgZW51bSBUcmFuc2ZlckZ1bmN0aW9uIHsKKyAgICAgICAgQlQ3MDlUcmFuc2ZlciwKKyAgICAgICAgQlQyMDIwVHJhbnNmZXIsCisgICAgICAgIEh5YnJpZExvZ0dhbW1hMiwKKyAgICAgICAgSHlicmlkTG9nR2FtbWE0LAorICAgICAgICAvLyBUT0RPCisgICAgfTsKK307CisKKy8qKiBcZGVwcmVjYXRlZCAqLworY2xhc3MgQzJHcmFwaGljQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvLyBjb25zdGFudCBhdHRyaWJ1dGVzCisgICAgaW5saW5lIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgIHsgcmV0dXJuIG1XaWR0aDsgfQorICAgIGlubGluZSB1aW50MzJfdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtSGVpZ2h0OyB9CisgICAgaW5saW5lIHVpbnQzMl90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICBpbmxpbmUgY29uc3QgQzJNZW1vcnlVc2FnZSB1c2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1Vc2FnZTsgfQorCisgICAgLy8gbW9kaWZpYWJsZSBhdHRyaWJ1dGVzCisKKworICAgIHZpcnR1YWwgY29uc3QgQzJDb2xvclNwYWNlIGNvbG9yU3BhY2UoKSBjb25zdCA9IDA7CisgICAgLy8gYmVzdCBlZmZvcnQKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29sb3JTcGFjZV9iZShjb25zdCBDMkNvbG9yU3BhY2UgJmNvbG9yU3BhY2UpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JTcGFjZShjb25zdCBDMkNvbG9yU3BhY2UgJmNvbG9yU3BhY2UpID0gMDsKKworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1Gb3JtYXQ7CisgICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7CisKKyAgICBjbGFzcyBJbXBsOworICAgIEltcGwgKm1JbXBsOworfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNDhmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJCVUZGRVJfQkFTRV9IXworI2RlZmluZSBDMkJVRkZFUl9CQVNFX0hfCisKKy8vLyBcZGVmZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCisvKioKKyAqIEJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4gVGhlc2Ugc2hhbGwgYmUgdXNlZCBieSB0aGUgYWxsb2NhdG9ycyB0byBzZWxlY3Qgb3B0aW1hbCBtZW1vcnkgdHlwZS8KKyAqIHBvb2wgYW5kIGJ1ZmZlciBsYXlvdXQuIFVzYWdlIGJpdHMgYXJlIGNvbmNlcHR1YWxseSBzZXBhcmF0ZWQgaW50byByZWFkIGFuZCB3cml0ZSB1c2FnZSwgd2hpbGUKKyAqIHRoZSBidWZmZXIgdXNlIGxpZmUtY3ljbGUgaXMgc2VwYXJhdGVkIGludG8gcHJvZHVjZXJzICh3cml0ZXJzKSBhbmQgY29uc3VtZXJzIChyZWFkZXJzKS4KKyAqIFRoZXNlIHR3byBjb25jZXB0cyBhcmUgcmVsYXRlZCBidXQgbm90IGVxdWl2YWxlbnQ6IGNvbnN1bWVycyBtYXkgb25seSByZWFkIGJ1ZmZlcnMgYW5kIG9ubHkKKyAqIHByb2R1Y2VycyBtYXkgd3JpdGUgdG8gYnVmZmVyczsgbm90ZSwgaG93ZXZlciwgdGhhdCBidWZmZXIgcHJvZHVjZXJzIG1heSBhbHNvIHdhbnQgb3IgbmVlZCB0bworICogcmVhZCB0aGUgYnVmZmVycy4KKyAqCisgKiBSZWFkIGFuZCB3cml0ZSBidWZmZXIgdXNhZ2UgYml0cyBzaGFsbCBiZSBvci1lZCB0byBhcnJpdmUgYXQgdGhlIGZ1bGwgYnVmZmVyIHVzYWdlLiBBZG1pdHRlZGx5LAorICogdGhpcyBkb2VzIG5vdCBhY2NvdW50IGZvciB0aGUgYW1vdW50IG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgKGUuZy4gYSBidWZmZXIgbWF5IGhhdmUgb25lIG9yIG1vcmUKKyAqIHJlYWRlcnMpOyBob3dldmVyLCB0aGUgcHJvcGVyIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwcm9wZXJseSB3ZWlnaCB0aGUgdmFyaW91cyB1c2FnZXMgd291bGQgYmUKKyAqIHRoZSBhbW91bnQgb2YgZGF0YSByZWFkL3dyaXR0ZW4gZm9yIGVhY2ggdXNhZ2UgdHlwZS4gVGhpcyB3b3VsZCByZXN1bHQgaW4gYW4gaW50ZWdlciBhcnJheSBvZgorICogc2l6ZSA2NCAob3IgdGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2FnZXMpIGZvciBtZW1vcnkgdXNhZ2UsIGFuZCBsaWtlbHkgc3VjaCBkZXRhaWxlZCBpbmZvcm1hdGlvbgorICogd291bGQgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuCisgKgorICogVGhhdCBwbGF0Zm9ybS1hZ25vc3RpYyBDb2RlYyAyLjAgQVBJIG9ubHkgZGVmaW5lcyB0aGUgYmFyZSBtaW5pbXVtIHVzYWdlcy4gUGxhdGZvcm1zIHNoYWxsIGRlZmluZQorICogdXNhZ2UgYml0cyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtLgorICovCitzdHJ1Y3QgQzJNZW1vcnlVc2FnZSB7CisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogQnVmZmVyIHJlYWQgdXNhZ2UuCisgICAgICovCisgICAgZW51bSByZWFkX3QgOiB1aW50NjRfdCB7CisgICAgICAgIC8qKiBCdWZmZXIgaXMgcmVhZCBieSB0aGUgQ1BVLiAqLworICAgICAgICBDUFVfUkVBRCAgICAgICAgPSAxIDw8IDAsCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgc2hhbGwgb25seSBiZSByZWFkIGJ5IHRydXN0ZWQgaGFyZHdhcmUuIFRoZSBkZWZpbml0aW9uIG9mIHRydXN0ZWQgaGFyZHdhcmUgaXMKKyAgICAgICAgICogcGxhdGZvcm0gc3BlY2lmaWMsIGJ1dCB0aGlzIGZsYWcgaXMgcmVzZXJ2ZWQgdG8gcHJldmVudCBtYXBwaW5nIHRoaXMgYmxvY2sgaW50byBDUFUKKyAgICAgICAgICogcmVhZGFibGUgbWVtb3J5IHJlc3VsdGluZyBpbiBidXMgZmF1bHQuIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCB3aGVuIGJ1ZmZlciBhY2Nlc3MgbXVzdCBiZQorICAgICAgICAgKiBwcm90ZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBSRUFEX1BST1RFQ1RFRCAgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciB3cml0ZSB1c2FnZS4KKyAgICAgKi8KKyAgICBlbnVtIHdyaXRlX3QgOiB1aW50NjRfdCB7CisgICAgICAgIC8qKiBCdWZmZXIgaXMgd3JpdHRlZCB0byBieSB0aGUgQ1BVLiAqLworICAgICAgICBDUFVfV1JJVEUgICAgICAgID0gMSA8PCAyLAorICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHNoYWxsIG9ubHkgYmUgd3JpdHRlbiB0byBieSB0cnVzdGVkIGhhcmR3YXJlLiBUaGUgZGVmaW5pdGlvbiBvZiB0cnVzdGVkIGhhcmR3YXJlCisgICAgICAgICAqIGlzIHBsYXRmb3JtIHNwZWNpZmljLCBidXQgdGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHByZXZlbnQgbWFwcGluZyB0aGlzIGJsb2NrIGludG8gQ1BVCisgICAgICAgICAqIHdyaXRhYmxlIG1lbW9yeSByZXN1bHRpbmcgaW4gYnVzIGZhdWx0LiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2hlbiBidWZmZXIgaW50ZWdyaXR5IG11c3QKKyAgICAgICAgICogYmUgcHJvdGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgV1JJVEVfUFJPVEVDVEVEICA9IDEgPDwgMywKKyAgICB9OworCisgICAgZW51bSA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciB1c2FnZSBiaXRzIHJlc2VydmVkIGZvciB0aGUgcGxhdGZvcm0uIFdlIGRvbid0IHNlcGFyYXRlbHkgcmVzZXJ2ZSByZWFkIGFuZAorICAgICAgICAgKiB3cml0ZSB1c2FnZXMgYXMgcGxhdGZvcm1zIG1heSBoYXZlIGFzeW1tZXRyaWMgZGlzdHJpYnV0aW9uIGJldHdlZW4gdGhlbS4KKyAgICAgICAgICovCisgICAgICAgIFBMQVRGT1JNX01BU0sgICAgID0gfihDUFVfUkVBRCB8IENQVV9XUklURSB8IFJFQURfUFJPVEVDVEVEIHwgV1JJVEVfUFJPVEVDVEVEKSwKKyAgICB9OworCisgICAgLyoqIENyZWF0ZSBhIHVzYWdlIGZyb20gc2VwYXJhdGUgY29uc3VtZXIgYW5kIHByb2R1Y2VyIHVzYWdlIG1hc2suIFxkZXByZWNhdGVkICovCisgICAgaW5saW5lIEMyTWVtb3J5VXNhZ2UodWludDY0X3QgY29uc3VtZXIsIHVpbnQ2NF90IHByb2R1Y2VyKQorICAgICAgICA6IGV4cGVjdGVkKGNvbnN1bWVyIHwgcHJvZHVjZXIpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IEMyTWVtb3J5VXNhZ2UodWludDY0X3QgZXhwZWN0ZWRfKQorICAgICAgICA6IGV4cGVjdGVkKGV4cGVjdGVkXykgeyB9CisKKyAgICB1aW50NjRfdCBleHBlY3RlZDsgLy8gZXhwZWN0ZWQgYnVmZmVyIHVzYWdlCit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkJVRkZFUl9CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODEwNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsOTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTVBPTkVOVF9IXworCisjZGVmaW5lIEMyQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworLy8vIFxkZWZncm91cCBjb21wb25lbnRzIENvbXBvbmVudHMKKy8vLyBAeworCitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IHsKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUE9TU0lCTEUsIC8vLzwgcXVlcnkgYWxsIHBvc3NpYmxlIHZhbHVlcyByZWdhcmRsZXNzIG9mIG90aGVyIHNldHRpbmdzCisgICAgICAgIENVUlJFTlQsICAvLy88IHF1ZXJ5IGN1cnJlbnRseSBwb3NzaWJsZSB2YWx1ZXMgZ2l2ZW4gZGVwZW5kZW50IHNldHRpbmdzCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworcHVibGljOgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHZhbHVlczsKKworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXywgdHlwZV90IHR5cGVfKQorICAgICAgICA6IF9tRmllbGQoZmllbGRfKSwgX21UeXBlKHR5cGVfKSwgc3RhdHVzKEMyX05PX0lOSVQpIHsgfQorCisgICAgc3RhdGljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorICAgIEN1cnJlbnQoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8pIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShmaWVsZF8sIENVUlJFTlQpOworICAgIH0KKworICAgIHN0YXRpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKKyAgICBQb3NzaWJsZShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXykgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGZpZWxkXywgUE9TU0lCTEUpOworICAgIH0KKworICAgIGlubGluZSBDMlBhcmFtRmllbGQgZmllbGQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkOyB9OworCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9Cit9OworCisvKioKKyAqIENvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBwb3RlbnRpYWwgb3IKKyAqIGFjdHVhbCBjb21wb25lbnQuIEl0IGNhbiBiZSBjcmVhdGVkIGFuZCB1c2VkIGluZGVwZW5kZW50bHkgb2YgYW4gYWN0dWFsIEMyQ29tcG9uZW50IGluc3RhbmNlIHRvCisgKiBxdWVyeSBzdXBwb3J0IGFuZCBwYXJhbWV0ZXJzIGZvciB2YXJpb3VzIGNvbXBvbmVudCBzZXR0aW5ncyBhbmQgY29uZmlndXJhdGlvbnMgZm9yIGEgcG90ZW50aWFsCisgKiBjb21wb25lbnQuIEFjdHVhbCBjb21wb25lbnRzIGFsc28gZXhwb3NlIHRoaXMgaW50ZXJmYWNlLgorICovCisKK2NsYXNzIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvLyBBTFdBWVMgQVZBSUxBQkxFIE1FVEhPRFMKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogVGhpcyBpcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlICdjbGFzcyc7IGhvd2V2ZXIsIG11bHRpcGxlCisgICAgICogaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IFNIQUxMIGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgSUQgaXMgdXNlZCBhcyB3b3JrIHRhcmdldHMsIHVuaXF1ZSB3b3JrIElEcywgYW5kIHdoZW4gY29uZmlndXJpbmcgdHVubmVsaW5nLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBub2RlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIGluc3RhbmNlLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBxdWVyeSBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYW5kCisgICAgICogc2tpcCB1bnN1cHBvcnRlZCBvbmVzLCBoZWFwIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIGFsbG9jYXRlZCBvciBwYXJhbWV0ZXJzCisgICAgICogdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCB3aXRob3V0IGJsb2NraW5nLiBBbnkgZXJyb3JzIGFyZSBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBxdWVyaWVkIGFyZSBpbnZhbGlkYXRlZC4KKyAgICAgKiBJbnZhbGlkIG9yIGJsb2NraW5nIHBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBxdWVyeSBpbmZvLWJ1ZmZlcnMuIElzIHRoYXQgYSBwcm9ibGVtPworICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gc3RhY2tQYXJhbXMgIGEgbGlzdCBvZiBwYXJhbXMgcXVlcmllZC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHNwZWNpZmljIHRvIGVhY2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZzsgZS5nLiBzaXplIGFuZCBpbmRleCBhcmUgc2V0IGFuZCByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbm90ZSBGbGV4aWJsZSBzZXR0aW5ncyB0aGF0IGFyZSBvZiBpbmNvcnJlY3Qgc2l6ZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVkLgorICAgICAqIFxwYXJhbVtpbl0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZCBwYXJhbSBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgICAgICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqIFxwYXJhbVtvdXRdIGhlYXBQYXJhbXMgICAgICBhIGxpc3Qgb2YgcGFyYW1zIHdoZXJlIHRvIHdoaWNoIHRoZSBzdXBwb3J0ZWQgaGVhcCBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIGhlYXBQYXJhbUluZGljZXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQsIGJ1dCBzb21lIHBhcmFtZXRlcnMgd2VyZSBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcXVlcnkgdGhlIHBhcmFtZXRlcnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBwcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIHVwZGF0ZXMgaW4KKyAgICAgKiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gfHBhcmFtc3wuIElmIGFueSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxzLCB0aGUgY29tcG9uZW50IHNoYWxsCisgICAgICogY29tbXVuaWNhdGUgdGhlIGZhaWx1cmUgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgaW4gfGZhaWx1cmVzfCwgYW5kIHN0aWxsIHByb2Nlc3MgdGhlCisgICAgICogcmVtYWluaW5nIHBhcmFtZXRlcnMuIFVuc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIHNraXBwZWQsIHRob3VnaCB0aGV5IGFyZSBjb21tdW5pY2F0ZWQgaW4KKyAgICAgKiB0aGVyIHJldHVybiB2YWx1ZS4gTW9zdCBwYXJhbWV0ZXJzIGFyZSB1cGRhdGVkIGF0IGJlc3QgZWZmb3J0IC0gc3VjaCB0aGF0IGV2ZW4gaWYgY2xpZW50CisgICAgICogc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIHZhbHVlIGZvciBhIGZpZWxkLCB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUgaXMgdXNlZC4gT24gdGhlCisgICAgICogb3RoZXIgaGFuZCwgc3RyaWN0IHBhcmFtZXRlcnMgb25seSBhY2NlcHQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGVpciBmaWVsZHMsIGFuZCBpZiB0aGUgY2xpZW50CisgICAgICogc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLCB0aGUgcGFyYW1ldGVyIHNldHRpbmcgc2hhbGwgZmFpbCBmb3IgdGhhdCBmaWVsZC4KKyAgICAgKiBJZiB0aGUgY2xpZW50IHRyaWVzIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBmaWVsZCB0aGF0IHJlcXVpcmVzIG1vbWVudGFyeSBibG9ja2luZyB3aXRob3V0CisgICAgICogc2V0dGluZyB8bWF5QmxvY2t8IHRvIEMyX01BWV9CTE9DSywgdGhhdCBwYXJhbWV0ZXIgc2hhbGwgYWxzbyBiZSBza2lwcGVkIGFuZCBhIHNwZWNpZmljCisgICAgICogcmV0dXJuIHZhbHVlIHNoYWxsIGJlIHVzZWQuIEZpbmFsIHZhbHVlcyBmb3IgYWxsIHBhcmFtZXRlcnMgc2V0IGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlCisgICAgICogY2FsbGVyIGluIHxwYXJhbXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgdmFsdWVzIGZvciBmdXJ0aGVyIHBhcmFtZXRlciB1cGRhdGVzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gcGFyYW1zIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdXBkYXRlcy4gVGhlc2Ugd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBwYXJhbXMgdGhhdCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhcmUgbm90IG1hcmtlZCBoZXJlLCBzbyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/CisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBmYWlsdXJlcyAgYSBsaXN0IG9mIHBhcmFtZXRlciBmYWlsdXJlcyBhbmQgb3B0aW9uYWwgZ3VpZGFuY2UKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLCBidXQgY291bGQgbm90IGFsbG9jYXRlIGEgZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhlbS4KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3Qgc2V0IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSB1cGRhdGUgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKworICAgIC8vIFRVTk5FTElORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqCisgICAgICogSWYgdGhlIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBtYXkgaW5jbHVkZSBhCisgICAgICogdHVubmVsZWQgcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB0dW5uZWwgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIHRhcmdldCBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgdHVubmVsIGFscmVhZHkgZXhpc3RzCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgc3BlY2lmaWMgdHVubmVsIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgdHVubmVsIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGUgcmVsZWFzZSBvZiBhIHR1bm5lbCBpcyBkZWxheWVkIHdoaWxlIHRoZXJlIGFyZSBwZW5kaW5nIHdvcmsgaXRlbXMgZm9yIHRoZSB0dW5uZWwuCisgICAgICogQWZ0ZXIgcmVsZWFzaW5nIGEgdHVubmVsLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIE1VU1QgTk9UIGluY2x1ZGUgYSB0dW5uZWxlZAorICAgICAqIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBtYXJrZWQgZm9yIHJlbGVhc2Ugc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIHRhcmdldCBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgdHVubmVsIGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IG1hcmsgdGhlIHR1bm5lbCBmb3IgcmVsZWFzZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVsZWFzZSBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcGFyYW1zIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcyB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBjb21wb25lbnQgU0hBTEwgZmlsbCBpbiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIGZpZWxkcyBsaXN0ZWQgYXMgd2VsbAorICAgICAqIGFzIGEgc3RhdHVzIGZvciBlYWNoIGZpZWxkLiBDb21wb25lbnQgc2hhbGwgcHJvY2VzcyBhbGwgZmllbGRzIHF1ZXJpZWQgZXZlbiBpZiBzb21lIHF1ZXJpZXMKKyAgICAgKiBmYWlsLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luIG91dF0gZmllbGRzIGEgdmVjdG9yIG9mIGZpZWxkcyBkZXNjcmlwdG9yIHN0cnVjdHVyZXMuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGF0IGxlYXN0IG9uZSBmaWVsZCB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSBjb21wb25lbnQgZmllbGQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcXVlcnkgc3VwcG9ydGVkIHZhbHVlcyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgPSAwOworCisgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvblR1bm5lbFJlbGVhc2VkKDxmcm9tPiwgPHRvPikgPSAwOworCisgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvbkNvbXBvbmVudFJlbGVhc2VkKDxpZD4pID0gMDsKKworICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdGVuZXIgZm9yIHRoaXMgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgc3RhdGVzIGV4Y2VwdCByZWxlYXNlZC4KKyAgICAgKiBUaGUgbGlzdGVuZXIgY2FuIG9ubHkgYmUgc2V0IHRvIG5vbi1udWxsIHZhbHVlIGluIHN0b3BwZWQgc3RhdGUgKHRoYXQgZG9lcyBub3QgaW5jbHVkZQorICAgICAqIHRyaXBwZWQgb3IgZXJyb3IpLiBJdCBjYW4gYmUgc2V0IHRvIG51bGxwdHIgaW4gYm90aCBzdG9wcGVkIGFuZCBydW5uaW5nIHN0YXRlcy4KKyAgICAgKiBDb21wb25lbnRzIG9ubHkgdXNlIHRoZSBsaXN0ZW5lciBpbiBydW5uaW5nIHN0YXRlLgorICAgICAqCisgICAgICogSWYgbGlzdGVuZXIgaXMgbnVsbHB0ciwgdGhlIGNvbXBvbmVudCBTSEFMTCBndWFyYW50ZWUgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyBhcmUKKyAgICAgKiBkb25lIHRvIHRoZSBvcmlnaW5hbCBsaXN0ZW5lciBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuIChBbnkgcGVuZGluZyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbAorICAgICAqIG5lZWQgdG8gYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwgLSBoZW5jZSB0aGlzIGNhbGwgbWF5IGJlIHRlbXBvcmFyaWx5IGJsb2NraW5nLikKKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogQ29tcG9uZW50IFNIQUxMIGhhbmRsZSBsaXN0ZW5lciBub3RpZmljYXRpb25zIGZyb20gdGhlIHNhbWUgdGhyZWFkICh0aGUgdGhyZWFkIHVzZWQgaXMKKyAgICAgKiBhdCB0aGUgY29tcG9uZW50J3MgZGlzY3JldGlvbi4pCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGNvdWxkIGFsc28gYmUgYWNjb21wbGlzaGVkIGJ5IHBhc3NpbmcgYSB3ZWFrX3B0ciB0byBhIGNvbXBvbmVudC1zcGVjaWZpYyBsaXN0ZW5lcgorICAgICAqIGhlcmUgYW5kIHJlcXVpcmluZyB0aGUgY2xpZW50IHRvIGFsd2F5cyBwcm9tb3RlIHRoZSB3ZWFrX3B0ciBiZWZvcmUgYW55IGNhbGxiYWNrLiBUaGlzIHdvdWxkCisgICAgICogcHV0IHRoZSBidXJkZW4gb24gdGhlIGNsaWVudCB0byBjbGVhciB0aGUgbGlzdGVuZXIgLSB3YWl0IGZvciBpdHMgZGVsZXRpb24gLSBhdCB3aGljaCBwb2ludAorICAgICAqIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIG9jY3VyLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBsaXN0ZW5lciB0aGUgY29tcG9uZW50IGxpc3RlbmVyIG9iamVjdAorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHRoZSBsaXN0ZW5lciBpbiB0aGUgcnVubmluZyBzdGF0ZSB0byBhIG5vbi1udWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKHVzZXIgZXJyb3IpLCBvciBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGxpc3RlbmVyIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spID0gMDsKKworICAgIC8vLyBjb21wb25lbnQgZG9tYWluIChlLmcuIGF1ZGlvIG9yIHZpZGVvKQorICAgIGVudW0gZG9tYWluX3QgOiB1aW50MzJfdDsKKworICAgIC8vLyBjb21wb25lbnQga2luZCAoZS5nLiBlbmNvZGVyLCBkZWNvZGVyIG9yIGZpbHRlcikKKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90OworCisgICAgLy8vIGNvbXBvbmVudCByYW5rLiBUaGlzIG51bWJlciBpcyB1c2VkIHRvIGRldGVybWluZSBjb21wb25lbnQgb3JkZXJpbmcgKHRoZSBsb3dlciB0aGUgc29vbmVyKQorICAgIC8vLyBpbiB0aGUgY29tcG9uZW50IGxpc3QuCisgICAgdHlwZWRlZiB1aW50MzJfdCByYW5rX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IGF0dHJpYnV0ZXMKKyAgICBlbnVtIGF0dHJpYl90IDogdWludDY0X3Q7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAvLyBwdWJsaWM6CisgICAgICAgIEMyU3RyaW5nIG5hbWU7IC8vLzwgbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgICAgIGRvbWFpbl90IGRvbWFpbjsgLy8vPCBjb21wb25lbnQgZG9tYWluCisgICAgICAgIGtpbmRfdCBraW5kOyAvLy88IGNvbXBvbmVudCBraW5kCisgICAgICAgIHJhbmtfdCByYW5rOyAvLy88IGNvbXBvbmVudCByYW5rCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZTsgLy8vPCBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5hbWUgYWxpYXMoZXMpIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgKiBcbm90ZSBNdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzIGFzIGxvbmcgYXMgdGhlaXIgbWVkaWEtdHlwZSBkaWZmZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBhbGlhc2VzOyAvLy88IG5hbWUgYWxpYXNlcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIH07CisKKyAgICAvLyBNRVRIT0RTIEFWQUlMQUJMRSBXSEVOIFJVTk5JTkcKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFF1ZXVlcyB1cCB3b3JrIGZvciB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDEgbXMKKyAgICAgKgorICAgICAqIEl0IGlzIGFjY2VwdGFibGUgZm9yIHRoaXMgbWV0aG9kIHRvIHJldHVybiBPSyBhbmQgcmV0dXJuIGFuIGVycm9yIHZhbHVlIHVzaW5nIHRoZQorICAgICAqIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIHdhcyBzdWNjZXNzZnVsbHkgcXVldWVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggc29tZSBjb21wb25lbnQocykgaW4gdGhlIHdvcmsgZG8oZXMpIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfQ0FOTk9UX0RPIHRoZSBjb21wb25lbnRzIGFyZSBub3QgdHVubmVsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHF1ZXVlIHRoZSB3b3JrCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBxdWV1aW5nIHRoZSB3b3JrICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpID0gMDsKKworICAgIC8qKgorICAgICAqIEFubm91bmNlcyBhIHdvcmsgdG8gYmUgcXVldWVkIGxhdGVyIGZvciB0aGUgY29tcG9uZW50LiBUaGlzIHJlc2VydmVzIGEgc2xvdCBmb3IgdGhlIHF1ZXVlCisgICAgICogdG8gZW5zdXJlIGNvcnJlY3Qgd29yayBvcmRlcmluZyBldmVuIGlmIHRoZSB3b3JrIGlzIHF1ZXVlZCBsYXRlci4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxIG1zCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayBhbm5vdW5jZW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY29yZGVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggc29tZSBjb21wb25lbnQocykgaW4gdGhlIHdvcmsgb3V0bGluZSBkbyhlcykgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9DQU5OT1RfRE8gdGhlIGNvbXBvbmVudGVzIGFyZSBub3QgdHVubmVsZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY29yZCB0aGUgd29yayBhbm5vdW5jZW1lbnQKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlY29yZGluZyB0aGUgYW5ub3VuY2VtZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHRvZG8gQ2FuIHRoaXMgYmUgcm9sbGVkIGludG8gcXVldWVfbmI/CisgICAgICogXHRvZG8gRXhwb3NlIG5leHQgd29yayBpdGVtIGZvciBlYWNoIGNvbXBvbmVudCB0byBkZXRlY3Qgc3RhbGxzCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBhbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpID0gMDsKKworICAgIGVudW0gZmx1c2hfbW9kZV90IDogdWludDMyX3QgeworICAgICAgICAvLy8gZmx1c2ggd29yayBmcm9tIHRoaXMgY29tcG9uZW50IG9ubHkKKyAgICAgICAgRkxVU0hfQ09NUE9ORU5ULAorCisgICAgICAgIC8vLyBmbHVzaCB3b3JrIGZyb20gdGhpcyBjb21wb25lbnQgYW5kIGFsbCBjb21wb25lbnRzIGNvbm5lY3RlZCBkb3duc3RyZWFtIGZyb20gaXQgdmlhCisgICAgICAgIC8vLyB0dW5uZWxpbmcKKyAgICAgICAgRkxVU0hfQ0hBSU4gPSAoMSA8PCAxNiksCisgICAgfTsKKworICAgIC8qKgorICAgICAqIERpc2NhcmRzIGFuZCBhYmFuZG9ucyBhbnkgcGVuZGluZyB3b3JrIGZvciB0aGUgY29tcG9uZW50LCBhbmQgb3B0aW9uYWxseSBhbnkgY29tcG9uZW50CisgICAgICogZG93bnN0cmVhbS4KKyAgICAgKgorICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOiB3ZSBjb3VsZCBmbHVzaCBhbGwgd29yayBiZWZvcmUgbGFzdCBpdGVtIHF1ZXVlZCBmb3IgY29tcG9uZW50IGFjcm9zcyBhbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyBsaW5rZWQgdG8gdGhpczsgZmx1c2ggb25seSB3b3JrIGl0ZW1zIHRoYXQgYXJlIHF1ZXVlZCB0byB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudAorICAgICAqIFx0b2RvIHJldHVybiB3b3JrICMgb2YgbGFzdCBmbHVzaGVkIGl0ZW07IG9yIGFsbCBmbHVzaGVkIChidXQgbm90IHJldHVybmVkIGl0ZW1zKQorICAgICAqIFx0b2RvIHdlIGNvdWxkIG1ha2UgZmx1c2ggdGFrZSBhIHdvcmsgaXRlbSBhbmQgZmx1c2ggYWxsIHdvcmsgYmVmb3JlL2FmdGVyIHRoYXQgaXRlbSB0byBhbGxvdworICAgICAqICAgICAgIFRCRCAoc2xpY2luZy9zZWVrPykKKyAgICAgKiBcdG9kbyB3ZSBjb3VsZCBzaW1wbHkgdGFrZSBhIGxpc3Qgb2YgbnVtYmVycyBhbmQgZmx1c2ggdGhvc2UuLi4gdGhpcyBpcyBiYWQgZm9yIGRlY29kZXJzCisgICAgICogICAgICAgYWxzbywgd2hhdCB3b3VsZCBoYXBwZW4gdG8gZmluZSBncmFkZSByZWZlcmVuY2VzPworICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQgYW5kIGVycm9yKSBzdGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBtdXN0IHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogV29yayB0aGF0IGNvdWxkIGJlIGltbWVkaWF0ZWx5IGFiYW5kb25lZC9kaXNjYXJkZWQgU0hBTEwgYmUgcmV0dXJuZWQgaW4gfGZsdXNoZWRXb3JrfDsgdGhpcworICAgICAqIGNhbiBiZSBkb25lIGluIGFuIGFyYml0cmFyeSBvcmRlci4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBjb3VsZCBub3QgYmUgYWJhbmRvbmVkIG9yIGRpc2NhcmRlZCBpbW1lZGlhdGVseSBTSEFMTCBiZSBtYXJrZWQgdG8gYmUKKyAgICAgKiBkaXNjYXJkZWQgYXQgdGhlIGVhcmxpZXN0IG9wcG9ydHVuaXR5LCBhbmQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICogVGhpcyBzaGFsbCBiZSBjb21wbGV0ZWQgd2l0aGluIDUwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIG1vZGUgZmx1c2ggbW9kZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZmx1c2hlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBmbHVzaCBjb3VsZCBub3QgYmUgY29tcGxldGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGZsdXNoaW5nIGZyb20gY29tcGxldGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgPSAwOworCisgICAgZW51bSBkcmFpbl9tb2RlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBkcmFpbiBjb21wb25lbnQgb25seSBhbmQgYWRkIGFuICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIuIENvbXBvbmVudCBzaGFsbCBwcm9jZXNzIGFsbAorICAgICAgICAvLy8gcXVldWVkIHdvcmsgYW5kIGNvbXBsZXRlIHRoZSBjdXJyZW50IHN0cmVhbS4gSWYgbmV3IGlucHV0IGlzIHJlY2VpdmVkLCBpdCBzaGFsbCBzdGFydAorICAgICAgICAvLy8gYSBuZXcgc3RyZWFtLiBcdG9kbyBkZWZpbmUgd2hhdCBhIHN0cmVhbSBpcy4KKyAgICAgICAgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLAorICAgICAgICAvLy8gZHJhaW4gY29tcG9uZW50IHdpdGhvdXQgc2V0dGluZyAiZW5kLW9mLXN0cmVhbSIgbWFya2VyLiBDb21wb25lbnQgc2hhbGwgcHJvY2VzcyBhbGwKKyAgICAgICAgLy8vIHF1ZXVlZCB3b3JrIGJ1dCBzaGFsbCBleHBlY3QgbW9yZSB3b3JrIGl0ZW1zIGZvciB0aGUgc2FtZSBzdHJlYW0uCisgICAgICAgIERSQUlOX0NPTVBPTkVOVF9OT19FT1MgPSAoMSA8PCAwKSwKKworICAgICAgICAvLy8gbWFya3MgdGhlIGxhc3Qgd29yayBpdGVtIHdpdGggYSBwZXJzaXN0ZW50ICJlbmQtb2Ytc3RyZWFtIiBtYXJrZXIgdGhhdCB3aWxsIGRyYWluCisgICAgICAgIC8vLyBkb3duc3RyZWFtIGNvbXBvbmVudHMKKyAgICAgICAgLy8vIFx0b2RvIHRoaXMgbWF5IGNvbmZ1c2Ugd29yay1vcmRlcmluZyBkb3duc3RyZWFtCisgICAgICAgIERSQUlOX0NIQUlOID0gKDEgPDwgMTYpLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBcdG9kbyBkZWZpbmUgdGhpczsgd2UgY291bGQgcGxhY2UgRU9TIHRvIGFsbCB1cHN0cmVhbSBjb21wb25lbnRzLCBqdXN0IHRoaXMgY29tcG9uZW50LCBvcgorICAgICAgICAgKiAgICAgICBhbGwgdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gY29tcG9uZW50LgorICAgICAgICAgKiBcdG9kbyBzaG91bGQgRU9TIGNhcnJ5IG92ZXIgdG8gZG93bnN0cmVhbSBjb21wb25lbnRzPworICAgICAgICAgKi8KKyAgICB9OworCisgICAgLyoqCisgICAgICogRHJhaW5zIHRoZSBjb21wb25lbnQsIGFuZCBvcHRpb25hbGx5IGRvd25zdHJlYW0gY29tcG9uZW50cy4gVGhpcyBpcyBhIHNpZ25hbGxpbmcgbWV0aG9kOworICAgICAqIGFzIHN1Y2ggaXQgZG9lcyBub3Qgd2FpdCBmb3IgYW55IHdvcmsgY29tcGxldGlvbi4KKyAgICAgKgorICAgICAqIE1hcmtzIGxhc3Qgd29yayBpdGVtIGFzICJkcmFpbi10aWxsLWhlcmUiLCBzbyBjb21wb25lbnQgaXMgbm90aWZpZWQgbm90IHRvIHdhaXQgZm9yIGZ1cnRoZXIKKyAgICAgKiB3b3JrIGJlZm9yZSBpdCBwcm9jZXNzZXMgd29yayBhbHJlYWR5IHF1ZXVlZC4gVGhpcyBtZXRob2QgY2FuIGFsc28gdXNlZCB0byBzZXQgdGhlCisgICAgICogZW5kLW9mLXN0cmVhbSBmbGFnIGFmdGVyIHdvcmsgaGFzIGJlZW4gcXVldWVkLiBDbGllbnQgY2FuIGNvbnRpbnVlIHRvIHF1ZXVlIGZ1cnRoZXIgd29yaworICAgICAqIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgaXMgY29tcGxldGVkIFNIQUxMIGJlIHJldHVybmVkIHZpYSB0aGUgb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHBhcmFtIG1vZGUgZHJhaW4gbW9kZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGRyYWluIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY29yZGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGRyYWluIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHRvZG8gZGVmaW5lIHN1cHBvcnRlZCBtb2RlcyBkaXNjb3ZlcnkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgZmx1c2ggY291bGQgbm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBmbHVzaGluZyBmcm9tIGNvbXBsZXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgPSAwOworCisgICAgLy8gU1RBVEUgQ0hBTkdFIE1FVEhPRFMKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZSwgYXMgd2VsbCBhcyBkdXJpbmcgdGhlIHRyaXBwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEMyX09LLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBydW5uaW5nIHN0YXRlLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogT3RoZXJ3aXNlLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXG5vdGUgSWYgYSBjb21wb25lbnQgaXMgaW4gdGhlIHRyaXBwZWQgc3RhdGUgYW5kIHN0YXJ0KCkgaXMgY2FsbGVkIHdoaWxlIHRoZSBjb21wb25lbnQKKyAgICAgKiBjb25maWd1cmF0aW9uIHN0aWxsIHJlc3VsdHMgaW4gYSB0cmlwLCBzdGFydCBzaGFsbCBzdWNjZWVkIGFuZCBhIG5ldyBvblRyaXBwZWQgY2FsbGJhY2sKKyAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB0aGUgY29uZmlndXJhdGlvbiBjb25mbGljdCB0aGF0IHJlc3VsdHMgaW4gdGhlIG5ldyB0cmlwLgorICAgICAqCisgICAgICogXHRvZG8gVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluIDUwMG1zLiBTZWVtcyB0aGlzIHNob3VsZCBiZSBhYmxlIHRvIHJldHVybiBxdWlja2x5LCBhcworICAgICAqIHRoZXJlIGFyZSBubyBpbW1lZGlhdGUgZ3VhcmFudGVlcy4gVGhvdWdoIHRoZXJlIGFyZSBndWFyYW50ZWVzIGZvciByZXNwb25zaXZlbmVzcyBpbW1lZGlhdGVseQorICAgICAqIGFmdGVyIHN0YXJ0IHJldHVybnMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBzdGFydGVkIChvciByZXN1bWVkKSBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGFydCBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiBhbnkgc3RhdGUgb3RoZXIgdGhhbiB0aGUgc3RvcHBlZCBzdGF0ZSBvciB0cmlwcGVkIHN0YXRlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgY2FsbCBmcm9tIGFub3RoZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gc3RhcnQgdGhlIGNvbXBvbmVudAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0YXJ0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RhcnRpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuCisgICAgICoKKyAgICAgKiBVcG9uIHRoaXMgY2FsbCwgYWxsIHBlbmRpbmcgd29yayBTSEFMTCBiZSBhYmFuZG9uZWQgYW5kIGFsbCBidWZmZXIgcmVmZXJlbmNlcyBTSEFMTCBiZQorICAgICAqIHJlbGVhc2VkLgorICAgICAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgQzJfQkFEX1NUQVRFIG9yIEMyX0RVUExJQ0FURSwgbm8gc3RhdGUgY2hhbmdlIGlzIGV4cGVjdGVkIGFzIGEKKyAgICAgKiByZXNwb25zZSB0byB0aGlzIGNhbGwuCisgICAgICogRm9yIGFsbCBvdGhlciByZXR1cm4gdmFsdWVzLCB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGluIHRoZSBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IFBlcmhhcHMganVzdCB0bworICAgICAqIHZlcmlmeSBhY2NvdW50aW5nLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCBhbHRlciBhbnkgc2V0dGluZ3MgYW5kIHR1bmluZ3MgdGhhdCBtYXkgaGF2ZSByZXN1bHRlZCBpbiBhIHRyaXBwZWQgc3RhdGUuCisgICAgICogKElzIHRoaXMgbWF0ZXJpYWwgZ2l2ZW4gdGhlIGRlZmluaXRpb24/IFBlcmhhcHMgaW4gY2FzZSB3ZSB3YW50IHRvIHN0YXJ0IGFnYWluLikKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RvcCBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiBhbnkgc3RhdGUgb3RoZXIgdGhhbiB0aGUgcnVubmluZyBzdGF0ZSwgaW5jbHVkaW5nIHdoZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhdGUgY2hhbmdlIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZCAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBzdG9wcGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHN0b3BwaW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMgb3RoZXIgdGhhbiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGR1cmluZyBhbnkgb3RoZXIgYmxvY2tpbmcgY2FsbC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuCisgICAgICoKKyAgICAgKiBBZnRlciB0aGlzIGNhbGwgcmV0dXJucyBhbGwgd29yayBTSEFMTCBiZSBhYmFuZG9uZWQsIGFsbCBidWZmZXIgcmVmZXJlbmNlcyBTSEFMTCBiZSByZWxlYXNlZC4KKyAgICAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEMyX0JBRF9TVEFURSBvciBDMl9EVVBMSUNBVEUsIG5vIHN0YXRlIGNoYW5nZSBpcyBleHBlY3RlZCBhcyBhCisgICAgICogcmVzcG9uc2UgdG8gdGhpcyBjYWxsLgorICAgICAqIEZvciBhbGwgb3RoZXIgcmV0dXJuIHZhbHVlcywgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHNob3VsZCB0aGlzIHJldHVybiBjb21wbGV0ZWQgd29yaywgc2luY2UgY2xpZW50IHdpbGwganVzdCBmcmVlIGl0PyBBbHNvLCBpZiBpdCB1bmJsb2NrcworICAgICAqIGEgc3RvcCwgd2hlcmUgc2hvdWxkIGNvbXBsZXRlZCB3b3JrIGJlIHJldHVybmVkPworICAgICAqCisgICAgICogVGhpcyBicmluZ3Mgc2V0dGluZ3MgYmFjayB0byB0aGVpciBkZWZhdWx0IC0gImd1YXJhbnRlZWluZyIgbm8gdHJpcHBlZCBzcGFjZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHJlY2xhaW0gc3VwcG9ydCAtIGl0IHNlZW1zIHRoYXQgc2luY2Ugb3duZXJzaGlwIGlzIHBhc3NlZCwgdGhpcyB3aWxsIGFsbG93IHJlY2xhaW1pbmcKKyAgICAgKiBzdHVmZi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVzZXQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB3aGVuIGNhbGxlZCBkdXJpbmcgYW5vdGhlciByZXNldCBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgc3RhdGUKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSByZXNldCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZXNldHRpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlc2V0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLiBVcG9uIHJldHVybiBhbGwgcmVmZXJlbmNlcyBzaGFsbCBiZSBhYmFuZG9uZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHJlbGVhc2VkCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgdGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IHJlbGVhc2VkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgdGhlIGNvbXBvbmVudCBpcyBydW5uaW5nCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgcmVsZWFzZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVsZWFzaW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpID0gMDsKKworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50KCkgPSBkZWZhdWx0OworfTsKKworQzJFTlVNKEMyQ29tcG9uZW50OjpraW5kX3QsIHVpbnQzMl90LAorICAgIEtJTkRfT1RIRVIsCisgICAgS0lORF9ERUNPREVSLAorICAgIEtJTkRfRU5DT0RFUgorKTsKKworQzJFTlVNKEMyQ29tcG9uZW50Ojpkb21haW5fdCwgdWludDMyX3QsCisgICAgRE9NQUlOX09USEVSLAorICAgIERPTUFJTl9WSURFTywKKyAgICBET01BSU5fQVVESU8sCisgICAgRE9NQUlOX0lNQUdFCispOworCitjbGFzcyBDMkZyYW1lSW5mb1BhcnNlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogXHJldHVybiB0aGUgY29udGVudCB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIGluZm8gcGFyc2VyLgorICAgICAqCisgICAgICogXHRvZG8gdGhpcyBtYXkgYmUgcmVkdW5kYW50CisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZ0xpdGVyYWwgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlciBpbmRpY2VzIHBhcnNlZCBieSB0aGlzIGluZm8gcGFyc2VyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBcdG9kbyBzdGlja3kgdnMuIG5vbi1zdGlja3kgcGFyYW1zPyB0aGlzIG1heSBiZSBjb21tdW5pY2F0ZWQgYnkgcGFyYW0tcmVmbGVjdG9yLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldFBhcnNlZFBhcmFtcygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGlzIGluZm8gcGFyc2VyLiBUaGlzIGJyaW5ncyB0aGlzIHBhcnNlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhZnRlciBjcmVhdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGluZm8gcGFyc2VyIHdhcyByZXNldAorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCByZXNldCB0aGUgcGFyc2VyIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZXNldHRpbmcgb2YgdGhlIHBhcnNlciAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlc2V0KCkgeyByZXR1cm4gQzJfT0s7IH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcGFyc2VGcmFtZShDMkZyYW1lRGF0YSAmZnJhbWUpOworCisgICAgdmlydHVhbCB+QzJGcmFtZUluZm9QYXJzZXIoKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkFsbG9jYXRvclN0b3JlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEMyQWxsb2NhdG9yOjppZF90IGlkX3Q7CisKKyAgICBlbnVtIDogQzJBbGxvY2F0b3I6OmlkX3QgeworICAgICAgICBERUZBVUxUX0xJTkVBUiwgICAgIC8vLzwgYmFzaWMgbGluZWFyIGFsbG9jYXRvciB0eXBlCisgICAgICAgIERFRkFVTFRfR1JBUEhJQywgICAgLy8vPCBiYXNpYyBncmFwaGljIGFsbG9jYXRvciB0eXBlCisgICAgICAgIFBMQVRGT1JNX1NUQVJUID0gMHgxMCwKKyAgICAgICAgVkVORE9SX1NUQVJUICAgPSAweDEwMCwKKyAgICAgICAgQkFEX0lEICAgICAgICAgPSBDMkFsbG9jYXRvcjo6QkFEX0lELCAvLy88IERPIE5PVCBVU0UKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3Igc3RvcmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3Igc3RvcmUuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsb2NhdG9ycyBzdXBwb3J0ZWQgYnkgdGhpcyBhbGxvY2F0b3Igc3RvcmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgdmVjdG9yIG9mIGFsbG9jYXRvciBpbmZvcm1hdGlvbiAoYXMgc2hhcmVkIHBvaW50ZXJzKQorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgdmVjdG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgd2hvbGUgdmVjdG9yLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PiBsaXN0QWxsb2NhdG9yc19uYigpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcy9jcmVhdGVzIGEgc2hhcmVkIGFsbG9jYXRvciBvYmplY3QuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogVGhlIGFsbG9jYXRvciBpcyBjcmVhdGVkIG9uIGZpcnN0IHVzZSwgYW5kIHRoZSBzYW1lIGFsbG9jYXRvciBpcyByZXR1cm5lZCBvbiBzdWJzZXF1ZW50CisgICAgICogY29uY3VycmVudCB1c2VzIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoZSBhbGxvY2F0b3IgaXMgZnJlZWQgd2hlbiBpdCBpcyBubyBsb25nZXIgcmVmZXJlbmNlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgIHRoZSBJRCBvZiB0aGUgYWxsb2NhdG9yIHRvIGNyZWF0ZS4gVGhpcyBpcyBkZWZpbmVkIGJ5IHRoZSBzdG9yZSwgYnV0CisgICAgICogICAgICAgICAgICAgICAgdGhlIElEIG9mIHRoZSBkZWZhdWx0IGxpbmVhciBhbmQgZ3JhcGhpYyBhbGxvY2F0b3JzIGlzIGZvcm1hbGl6ZWQuCisgICAgICogXHBhcmFtIGFsbG9jYXRvciBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLiBDbGVhcmVkIG9uIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdG9yIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGFsbG9jYXRvciB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGFsbG9jYXRvciAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggYWxsb2NhdG9yCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBhbGxvY2F0b3IKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQWxsb2NhdG9yKGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIGNvbnN0IGFsbG9jYXRvcikgPSAwOworCisgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JTdG9yZSgpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogVGhpcyBpcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlICdjbGFzcyc7IGhvd2V2ZXIsIG11bHRpcGxlCisgICAgICogaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IFNIQUxMIGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZQorICAgICAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gY3JlYXRlCisgICAgICogXHBhcmFtIGNvbXBvbmVudCAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGlzIHN0b3JlZC4gQ2xlYXJlZCBvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgbm8gc3VjaCBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudAorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHRvIGNyZWF0ZQorICAgICAqIFxwYXJhbSBpbnRlcmZhY2UgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggY29tcG9uZW50IGludGVyZmFjZQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqCisgICAgICogXHRvZG8gRG8gd2UgbmVlZCBhbiBpbnRlcmZhY2UsIG9yIGNvdWxkIHRoaXMganVzdCBiZSBhIGNvbXBvbmVudCB0aGF0IGlzIG5ldmVyIHN0YXJ0ZWQ/CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQgc3RvcmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIHZlY3RvciBvZiBjb21wb25lbnQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgPSAwOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUWSBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBvbi1kZW1hbmQgYnVmZmVyIGxheW91dCBjb252ZXJzaW9uIChzd2l6emxpbmcpCisgICAgLy8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBzcmMsIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdCkgPSAwOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBlLmcuIGZvciBnbG9iYWwgc2V0dGluZ3MgKHN5c3RlbS13aWRlIHN0cmlkZSwgZXRjLikKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgYSBzZXQgb2Ygc3lzdGVtLXdpZGUgcGFyYW1ldGVycy4KKyAgICAgKiBRdWVyeWluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBzdG9yZSBTSEFMTCBxdWVyeSBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYW5kCisgICAgICogc2tpcCB1bnN1cHBvcnRlZCBvbmVzLCBvciBoZWFwIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gQW55IGVycm9ycworICAgICAqIGFyZSBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZS4gQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdAorICAgICAqIGNvdWxkIG5vdCBiZSBxdWVyaWVkIGFyZSBpbnZhbGlkYXRlZC4gUGFyYW1ldGVycyB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYXJlIG9taXR0ZWQgZnJvbQorICAgICAqIHRoZSByZXN1bHQuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdGFja1BhcmFtcyAgIGEgbGlzdCBvZiBwYXJhbXMgcXVlcmllZC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHNwZWNpZmljIHRvIGVhY2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nOyBlLmcuIHNpemUgYW5kIGluZGV4IGFyZSBzZXQgYW5kIHJlc3Qgb2YgdGhlIG1lbWJlcnMgYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBGbGV4aWJsZSBzZXR0aW5ncyB0aGF0IGFyZSBvZiBpbmNvcnJlY3Qgc2l6ZSB3aWxsIGJlIGludmFsaWRhdGVkLgorICAgICAqIFxwYXJhbSBoZWFwUGFyYW1JbmRpY2VzIGEgdmVjdG9yIG9mIHBhcmFtIGluZGljZXMgZm9yIHBhcmFtcyB0byBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBoZWFwLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQgaW4gaGVhcFBhcmFtcy4gVW5zdXBwb3J0ZWQgcGFyYW0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBccGFyYW0gaGVhcFBhcmFtcyAgICBhIGxpc3Qgb2YgcGFyYW1zIHdoZXJlIHRvIHdoaWNoIHRoZSBzdXBwb3J0ZWQgaGVhcCBwYXJhbWV0ZXJzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gaGVhcFBhcmFtSW5kaWNlcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZCwgYnV0IHNvbWUgcGFyYW1ldGVycyB3ZXJlIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgc2V0IG9mIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGVyZSBhcmUgbm8gc2V0dGFibGUgc3lzdGVtLXdpZGUgcGFyYW1ldGVycyBkZWZpbmVkIHRodXMgZmFyLCBidXQgbWF5IGJlIGFkZGVkIGluIHRoZQorICAgICAqIGZ1dHVyZS4KKyAgICAgKgorICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBzdG9yZSBTSEFMTCB1cGRhdGUgYWxsIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIGF0CisgICAgICogYmVzdCBlZmZvcnQgKHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZSkgYW5kIHNraXAgdW5zdXBwb3J0ZWQgb25lcy4gQW55IGVycm9ycyBhcmUKKyAgICAgKiBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgaW4gfGZhaWx1cmVzfC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB0dW5pbmcgRE9FUyBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHRoZSB0dW5pbmcgcGFyYW1ldGVycy4gRS5nLiBzb21lIHBhcmFtZXRlcgorICAgICAqIHVwZGF0ZSBtYXkgYWxsb3cgc29tZSBzdWJzZXF1ZW50IHBhcmFtZXRlciB1cGRhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtcyAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/CisgICAgICogXHBhcmFtIGZhaWx1cmVzICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciBmYWlsdXJlcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgYWxsIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHksIGJ1dCBzb21lCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gfGZhaWx1cmVzfC4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLCBidXQgY291bGQgbm90IGFsbG9jYXRlIGEgZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhlbS4KKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSB1cGRhdGUgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworCisgICAgLy8gUkVGTEVDVElPTiBNRUNIQU5JU00gKFVTRUQgRk9SIEVYVEVOU0lPTikKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZGVzY3JpYmUgcGFyYW1ldGVyIGZpZWxkcy4gVGhpcyBpcyBzaGFyZWQgZm9yIGFsbCBjb21wb25lbnRzIGNyZWF0ZWQgYnkKKyAgICAgKiB0aGlzIGNvbXBvbmVudCBzdG9yZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHNoYXJlZCBwYXJhbWV0ZXIgcmVmbGVjdG9yIG9iamVjdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcGFyYW1zIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcyB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBxdWVyaWVkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIENsaWVudCBTSEFMTCBzZXQgdGhlIHBhcmFtZXRlci1maWVsZCBzcGVjaWZpZXIgYW5kIHRoZSB0eXBlIG9mIHN1cHBvcnRlZCB2YWx1ZXMgcXVlcnkgKGUuZy4KKyAgICAgKiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcywgb3IgcG90ZW50aWFsIHN1cHBvcnRlZCB2YWx1ZXMpIGluIGZpZWxkcy4KKyAgICAgKiBVcG9uIHJldHVybiB0aGUgc3RvcmUgU0hBTEwgZmlsbCBpbiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIGZpZWxkcyBsaXN0ZWQgYXMgd2VsbAorICAgICAqIGFzIGEgc3RhdHVzIGZvciBlYWNoIGZpZWxkLiBTdG9yZSBzaGFsbCBwcm9jZXNzIGFsbCBmaWVsZHMgcXVlcmllZCBldmVuIGlmIHNvbWUgcXVlcmllcworICAgICAqIGZhaWwuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luIG91dF0gZmllbGRzIGEgdmVjdG9yIG9mIGZpZWxkcyBkZXNjcmlwdG9yIHN0cnVjdHVyZXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYXQgbGVhc3Qgb25lIGZpZWxkIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIGNvbXBvbmVudCBzdG9yZSBmaWVsZAorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfkMyQ29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJDT01QT05FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FhMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCkBAIC0wLDAgKzEsMjE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJDT05GSUdfSF8KKyNkZWZpbmUgQzJDT05GSUdfSF8KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKy8vLyBcZGVmZ3JvdXAgY29uZmlnIENvbXBvbmVudCBjb25maWd1cmF0aW9uCisvLy8gQHsKKworLyoqCisgKiBFbnVtZXJhdGVkIGJvb2xlYW4uCisgKi8KK0MyRU5VTShjMl9ib29sX3QsIHVpbnQzMl90LAorICAgIEMyX0ZBTFNFLCAvLy88IHRydWUKKyAgICBDMl9UUlVFLCAgLy8vPCBmYWxzZQorKQorCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8YzJfYm9vbF90PiBDMkJvb2xWYWx1ZTsKKwordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08YzJfYm9vbF90Pj4gQzJFYXN5Qm9vbFZhbHVlOworCisvKioKKyAqIEVudW1lcmF0ZWQgc2V0IHRyaS1zdGF0ZS4KKyAqCisgKiBVc2VkIGZvciBvcHRpb25hbCBjb25maWd1cmF0aW9ucyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhbHVlcyBzZXQgYnkgdGhlIGNsaWVudCwKKyAqIGRlZmF1bHQgdmFsdWVzIHNldCBieSB0aGUgY29tcG9uZW50LCBvciB1bnNldCB2YWx1ZXMuCisgKi8KK0MyRU5VTShjMl9zZXRfdCwgdWludDMyX3QsCisgICAgQzJfVU5TRVQsICAgLy8gcGFyYW1ldGVyIGlzIHVuc2V0IGFuZCBoYXMgbm8gdmFsdWUKKyAgICBDMl9TRVQsICAgICAvLyBwYXJhbWV0ZXIgaXMvaGFzIGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQKKyAgICBDMl9ERUZBVUxULCAvLyBwYXJhbWV0ZXIgaGFzIG5vdCBiZWVuIHNldCBieSB0aGUgY2xpZW50LCBidXQgaXMgc2V0IGJ5IHRoZSBjb21wb25lbnQKKykKKworLyoqIEVudW1lcmF0aW9ucyB1c2VkIGJ5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworc3RydWN0IEMyQ29uZmlnIHsKKyAgICBlbnVtIGFhY19wYWNrYWdpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgLy8vPCBBQUMgcGFja2FnaW5nIChSQVcgdnMgQURUUykKKyAgICBlbnVtIGFhY19zYnJfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgLy8vPCBBQUMgU0JSIG1vZGUKKyAgICBlbnVtIGFwaV9mZWF0dXJlX3QgOiB1aW50NjRfdDsgICAgICAgICAgLy8vPCBBUEkgZmVhdHVyZXMKKyAgICBlbnVtIGFwaV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgLy8vPCBBUEkgbGV2ZWwKKyAgICBlbnVtIGJpdHJhdGVfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgLy8vPCBiaXRyYXRlIGNvbnRyb2wgbW9kZQorICAgIGVudW0gZHJjX2NvbXByZXNzaW9uX21vZGVfdCA6IGludDMyX3Q7ICAvLy88IERSQyBjb21wcmVzc2lvbiBtb2RlCisgICAgZW51bSBkcmNfZWZmZWN0X3R5cGVfdCA6IGludDMyX3Q7ICAgICAgIC8vLzwgRFJDIGVmZmVjdCB0eXBlCisgICAgZW51bSBpbnRyYV9yZWZyZXNoX21vZGVfdCA6IHVpbnQzMl90OyAgIC8vLzwgaW50cmEgcmVmcmVzaCBtb2RlcworICAgIGVudW0gbGV2ZWxfdCA6IHVpbnQzMl90OyAgICAgICAgICAgICAgICAvLy88IGNvZGluZyBsZXZlbAorICAgIGVudW0gb3JkaW5hbF9rZXlfdCA6IHVpbnQzMl90OyAgICAgICAgICAvLy88IHdvcmsgb3JkZXJpbmcga2V5cworICAgIGVudW0gcGNtX2VuY29kaW5nX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IFBDTSBlbmNvZGluZworICAgIGVudW0gcGljdHVyZV90eXBlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IHBpY3R1cmUgdHlwZXMKKyAgICBlbnVtIHBsYXRmb3JtX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgLy8vPCBwbGF0Zm9ybSBmZWF0dXJlcworICAgIGVudW0gcGxhdGZvcm1fbGV2ZWxfdCA6IHVpbnQzMl90OyAgICAgICAvLy88IHBsYXRmb3JtIGxldmVsCisgICAgZW51bSBwcmVwZW5kX2hlYWRlcl9tb2RlX3QgOiB1aW50MzJfdDsgIC8vLzwgcHJlcGVuZCBoZWFkZXIgb3BlcmF0aW9uYWwgbW9kZXMKKyAgICBlbnVtIHByb2ZpbGVfdCA6IHVpbnQzMl90OyAgICAgICAgICAgICAgLy8vPCBjb2RpbmcgcHJvZmlsZQorICAgIGVudW0gc2NhbGluZ19tZXRob2RfdCA6IHVpbnQzMl90OyAgICAgICAvLy88IHNjYWxpbmcgbWV0aG9kcworICAgIGVudW0gc2Nhbl9vcmRlcl90IDogdWludDMyX3Q7ICAgICAgICAgICAvLy88IHNjYW4gb3JkZXJzCisgICAgZW51bSBzZWN1cmVfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgc2VjdXJlL3Byb3RlY3RlZCBtb2RlcworICAgIGVudW0gc3VwcGxlbWVudGFsX2luZm9fdCA6IHVpbnQzMl90OyAgICAvLy88IHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiB0eXBlcworICAgIGVudW0gdGlsaW5nX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgICAvLy88IHRpbGluZyBtb2RlcworfTsKKworbmFtZXNwYWNlIHsKKworZW51bSBDMlBhcmFtSW5kZXhLaW5kIDogQzJQYXJhbTo6dHlwZV9pbmRleF90IHsKKyAgICBDMl9QQVJBTV9JTkRFWF9JTlZBTElEICAgICAgICAgICAgID0gMHgwLCAgICAvLy88IGRvIG5vdCB1c2UKKyAgICBDMl9QQVJBTV9JTkRFWF9TVFJVQ1RfU1RBUlQgICAgICAgID0gMHgxLCAgICAvLy88IHN0cnVjdCBvbmx5IGluZGljZXMKKyAgICBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCAgICAgICAgID0gMHg4MDAsICAvLy88IHJlZ3VsYXIgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX0NPREVSX1BBUkFNX1NUQVJUICAgPSAweDEwMDAsIC8vLzwgZW4vdHJhbnNjb2RlciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfUElDVFVSRV9QQVJBTV9TVEFSVCA9IDB4MTgwMCwgLy8vPCBpbWFnZS92aWRlbyBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfVklERU9fUEFSQU1fU1RBUlQgICA9IDB4MjAwMCwgLy8vPCB2aWRlbyBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfSU1BR0VfUEFSQU1fU1RBUlQgICA9IDB4MjgwMCwgLy8vPCBpbWFnZSBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQVVESU9fUEFSQU1fU1RBUlQgICA9IDB4MzAwMCwgLy8vPCBpbWFnZSBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfUExBVEZPUk1fU1RBUlQgICAgICA9IDB4NDAwMCwgLy8vPCBwbGF0Zm9ybS1kZWZpbmVkIHBhcmFtZXRlcnMKKworICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IHN0cnVjdHVyZSBpbmRpY2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBrUGFyYW1JbmRleENvbG9yWHkgPSBDMl9QQVJBTV9JTkRFWF9TVFJVQ1RfU1RBUlQsCisgICAga1BhcmFtSW5kZXhNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWUsCisgICAga1BhcmFtSW5kZXhDaHJvbWFPZmZzZXQsCisgICAga1BhcmFtSW5kZXhHb3BMYXllciwKKworICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IHBhcmFtZXRlciBpbmRpY2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBrUGFyYW1JbmRleEFwaUxldmVsID0gQzJfUEFSQU1fSU5ERVhfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhBcGlGZWF0dXJlcywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhbGwgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qIGdlbmVyaWMgY29tcG9uZW50IGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TmFtZSwKKyAgICBrUGFyYW1JbmRleEFsaWFzZXMsCisgICAga1BhcmFtSW5kZXhLaW5kLAorICAgIGtQYXJhbUluZGV4RG9tYWluLAorICAgIGtQYXJhbUluZGV4QXR0cmlidXRlcywKKyAgICBrUGFyYW1JbmRleFRpbWVTdHJldGNoLAorCisgICAgLyogY29kaW5nIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4UHJvZmlsZUxldmVsLAorICAgIGtQYXJhbUluZGV4SW5pdERhdGEsCisgICAga1BhcmFtSW5kZXhTdXBwbGVtZW50YWxEYXRhLAorICAgIGtQYXJhbUluZGV4U3Vic2NyaWJlZFN1cHBsZW1lbnRhbERhdGEsCisKKyAgICAvKiBwaXBlbGluZSBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBrUGFyYW1JbmRleE1lZGlhVHlwZSwKKyAgICBrUGFyYW1JbmRleERlbGF5UmVxdWVzdCwKKyAgICBrUGFyYW1JbmRleERlbGF5LAorICAgIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQWdlLAorICAgIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQ291bnQsCisgICAga1BhcmFtSW5kZXhSZW9yZGVyQnVmZmVyRGVwdGgsCisgICAga1BhcmFtSW5kZXhSZW9yZGVyS2V5LAorICAgIGtQYXJhbUluZGV4U3RyZWFtQ291bnQsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkUGFyYW1JbmRpY2VzLAorICAgIGtQYXJhbUluZGV4U3VnZ2VzdGVkQnVmZmVyQ291bnQsCisgICAga1BhcmFtSW5kZXhCYXRjaFNpemUsCisgICAga1BhcmFtSW5kZXhDdXJyZW50V29yaywKKyAgICBrUGFyYW1JbmRleExhc3RXb3JrUXVldWVkLAorCisgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICBrUGFyYW1JbmRleEFsbG9jYXRvcnMsCisgICAga1BhcmFtSW5kZXhCbG9ja1Bvb2xzLAorICAgIGtQYXJhbUluZGV4QnVmZmVyVHlwZSwKKyAgICBrUGFyYW1JbmRleFVzYWdlLAorICAgIGtQYXJhbUluZGV4T3V0T2ZNZW1vcnksCisgICAga1BhcmFtSW5kZXhNYXhCdWZmZXJTaXplLAorCisgICAgLyogbWlzYy4gc3RhdGUgKi8KKyAgICBrUGFyYW1JbmRleFRyaXBwZWQsCisgICAga1BhcmFtSW5kZXhDb25maWdDb3VudGVyLAorCisgICAgLyogcmVzb3VyY2VzICovCisgICAga1BhcmFtSW5kZXhSZXNvdXJjZXNOZWVkZWQsCisgICAga1BhcmFtSW5kZXhSZXNvdXJjZXNSZXNlcnZlZCwKKyAgICBrUGFyYW1JbmRleE9wZXJhdGluZ1JhdGUsCisgICAga1BhcmFtSW5kZXhSZWFsVGltZVByaW9yaXR5LAorCisgICAgLyogcHJvdGVjdGVkIGNvbnRlbnQgKi8KKyAgICBrUGFyYW1JbmRleFNlY3VyZU1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKHRyYW5zL2VuKWNvZGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4Qml0cmF0ZSA9IEMyX1BBUkFNX0lOREVYX0NPREVSX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Qml0cmF0ZU1vZGUsCisgICAga1BhcmFtSW5kZXhRdWFsaXR5LAorICAgIGtQYXJhbUluZGV4Q29tcGxleGl0eSwKKyAgICBrUGFyYW1JbmRleFByZXBlbmRIZWFkZXJNb2RlLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFBpY3R1cmVTaXplID0gQzJfUEFSQU1fSU5ERVhfUElDVFVSRV9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleENyb3BSZWN0LAorICAgIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQsCisgICAga1BhcmFtSW5kZXhSb3RhdGlvbiwKKyAgICBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8sCisgICAga1BhcmFtSW5kZXhTY2FsZWRQaWN0dXJlU2l6ZSwKKyAgICBrUGFyYW1JbmRleFNjYWxlZENyb3BSZWN0LAorICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZCwKKyAgICBrUGFyYW1JbmRleENvbG9ySW5mbywKKyAgICBrUGFyYW1JbmRleENvbG9yQXNwZWN0cywKKyAgICBrUGFyYW1JbmRleEhkclN0YXRpY01ldGFkYXRhLAorICAgIGtQYXJhbUluZGV4RGVmYXVsdENvbG9yQXNwZWN0cywKKworICAgIGtQYXJhbUluZGV4QmxvY2tTaXplLAorICAgIGtQYXJhbUluZGV4QmxvY2tDb3VudCwKKyAgICBrUGFyYW1JbmRleEJsb2NrUmF0ZSwKKworICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrLAorICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4RnJhbWVSYXRlID0gQzJfUEFSQU1fSU5ERVhfVklERU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhNYXhCaXRyYXRlLAorICAgIGtQYXJhbUluZGV4TWF4RnJhbWVSYXRlLAorICAgIGtQYXJhbUluZGV4TWF4UGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhHb3AsCisgICAga1BhcmFtSW5kZXhTeW5jRnJhbWVJbnRlcnZhbCwKKyAgICBrUGFyYW1JbmRleFJlcXVlc3RTeW5jRnJhbWUsCisgICAga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nLAorICAgIGtQYXJhbUluZGV4TGF5ZXJJbmRleCwKKyAgICBrUGFyYW1JbmRleExheWVyQ291bnQsCisgICAga1BhcmFtSW5kZXhJbnRyYVJlZnJlc2gsCisgICAga1BhcmFtSW5kZXhIZHIxMFBsdXNNZXRhZGF0YSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbWFnZSBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhUaWxlTGF5b3V0ID0gQzJfUEFSQU1fSU5ERVhfSU1BR0VfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhUaWxlSGFuZGxpbmcsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXVkaW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4U2FtcGxlUmF0ZSA9IEMyX1BBUkFNX0lOREVYX0FVRElPX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q2hhbm5lbENvdW50LAorICAgIGtQYXJhbUluZGV4UGNtRW5jb2RpbmcsCisgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmcsCisgICAga1BhcmFtSW5kZXhNYXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhBYWNTYnJNb2RlLCAvLyBhYWMgZW5jb2RlLCBlbnVtCisgICAga1BhcmFtSW5kZXhEcmNFbmNvZGVkVGFyZ2V0TGV2ZWwsICAvLyBkcmMsIGZsb2F0IChkQkZTKQorICAgIGtQYXJhbUluZGV4RHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWwsIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNDb21wcmVzc2lvbiwgLy8gZHJjLCBlbnVtCisgICAga1BhcmFtSW5kZXhEcmNCb29zdEZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjQXR0ZW51YXRpb25GYWN0b3IsIC8vIGRyYywgZmxvYXQgKDAtMSkKKyAgICBrUGFyYW1JbmRleERyY0VmZmVjdFR5cGUsIC8vIGRyYywgZW51bQorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4UGxhdGZvcm1MZXZlbCA9IEMyX1BBUkFNX0lOREVYX1BMQVRGT1JNX1NUQVJULCAvLyBhbGwsIHUzMgorICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcywgLy8gYWxsLCB1NjQgbWFzaworICAgIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZSwgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4QXNwZWN0c1RvRGF0YVNwYWNlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvciwgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzLCAvLyBzdG9yZSwgc3RydWN0W10KKyAgICBrUGFyYW1JbmRleERhdGFTcGFjZVRvQXNwZWN0cywgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlLCAvLyB1MzIKKyAgICBrUGFyYW1JbmRleFN1cmZhY2VTY2FsaW5nLCAvLyB1MzIKKworICAgIC8vIGlucHV0IHN1cmZhY2UKKyAgICBrUGFyYW1JbmRleElucHV0U3VyZmFjZUVvcywgLy8gaW5wdXQtc3VyZmFjZSwgZW9zCisgICAga1BhcmFtSW5kZXhUaW1lZENvbnRyb2wsIC8vIHN0cnVjdAorICAgIGtQYXJhbUluZGV4U3RhcnRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdXNwZW5kQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4UmVzdW1lQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4U3RvcEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFRpbWVPZmZzZXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4TWluRnJhbWVSYXRlLCAvLyBpbnB1dC1zdXJmYWNlLCBmbG9hdAorICAgIGtQYXJhbUluZGV4VGltZXN0YW1wR2FwQWRqdXN0bWVudCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisKKyAgICBrUGFyYW1JbmRleFN1cmZhY2VBbGxvY2F0b3IsIC8vIHUzMgorCisgICAgLy8gZGVwcmVjYXRlZCBpbmRpY2VzIGR1ZSB0byByZW5hbWluZworICAgIGtQYXJhbUluZGV4QWFjU3RyZWFtRm9ybWF0ID0ga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmcsCisgICAga1BhcmFtSW5kZXhDc2QgPSBrUGFyYW1JbmRleEluaXREYXRhLAorICAgIGtQYXJhbUluZGV4TWF4VmlkZW9TaXplSGludCA9IGtQYXJhbUluZGV4TWF4UGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhNaW1lID0ga1BhcmFtSW5kZXhNZWRpYVR5cGUsCisgICAga1BhcmFtSW5kZXhSZXF1ZXN0ZWRJbmZvcyA9IGtQYXJhbUluZGV4U3Vic2NyaWJlZFBhcmFtSW5kaWNlcywKKworCisgICAgLy8gZGVwcmVjYXRlZCBpbmRpY2VzIGR1ZSB0byByZW1vdmFsCisgICAga1BhcmFtSW5kZXhTdXBwb3J0ZWRQYXJhbXMgPSAweERFQUQwMDAwLAorICAgIGtQYXJhbUluZGV4UmVhZE9ubHlQYXJhbXMsCisgICAga1BhcmFtSW5kZXhUZW1wb3JhbCwKK307CisKK30KKworLyoqCisgKiBDb2RlYyAyLjAgcGFyYW1ldGVyIHR5cGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIG5hbWluZyBjb252ZW50aW9uOgorICoKKyAqIEMyPGdyb3VwPjxkb21haW4+PGluZGV4Pjx0eXBlPgorICoKKyAqIEUuZy4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86IGdyb3VwPSIiIGRvbWFpbj0iU3RyZWFtIiBpbmRleD0iUGljdHVyZVNpemUiIHR5cGU9IkluZm8iLgorICogR3JvdXAgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBidXQgZGVub3RlcyBraW5kIG9mIG9iamVjdHMgdGhlIHBhcmFtZXRlciBpcyBkZWZpbmVkLgorICogQXQgdGhpcyBwb2ludCB3ZSB1c2UgQ29tcG9uZW50IGFuZCBTdG9yZSB0byBkaXN0aW5ndWlzaCBiYXNpYyBjb21wb25lbnQvc3RvcmUgcGFyYW1ldGVycy4KKyAqCisgKiBQYXJhbWV0ZXIga2V5cyBhcmUgbmFtZWQgQzJfUEFSQU1LRVlfWzxncm91cD5fXTxkb21haW4+XzxpbmRleD4gYXMgdHlwZSBpcyBub3QgZXhwZWN0ZWQKKyAqIHRvIGRpc3Rpbmd1aXNoIHBhcmFtZXRlcnMuIEUuZy4gYSBjb21wb25lbnQgY291bGQgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgYW5kIGl0CisgKiBpcyBub3QgZXhwZWN0ZWQgdXNlcnMgd291bGQgbmVlZCB0byBjaGFuZ2UgdGhlIGtleS4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUEkgbGV2ZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBDMkNvbmZpZzo6YXBpX2xldmVsX3QgOiB1aW50MzJfdCB7CisgICAgQVBJX0wwXzEgPSAwLCAgIC8vLzwgc3VwcG9ydCBmb3IgQVBJIGxldmVsIDAuMQorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphcGlfbGV2ZWxfdD4sIGtQYXJhbUluZGV4QXBpTGV2ZWw+CisgICAgICAgIEMyQXBpTGV2ZWxTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVBJX0xFVkVMW10gPSAiYXBpLmxldmVsIjsKKworZW51bSBDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICBBUElfUkVGTEVDVElPTiAgICAgICA9ICgxVSA8PCAwKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IHN1cHBvcnRlZCBwYXJhbWV0ZXJzCisgICAgQVBJX1ZBTFVFUyAgICAgICAgICAgPSAoMVUgPDwgMSksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9DVVJSRU5UX1ZBTFVFUyAgID0gKDFVIDw8IDIpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3QgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggcGFyYW1ldGVyCisgICAgQVBJX0RFUEVOREVOQ1kgICAgICAgPSAoMVUgPDwgMyksICAvLy88IGhhdmUgYSBkZWZpbmVkIHBhcmFtZXRlciBkZXBlbmRlbmN5CisKKyAgICBBUElfU1RSRUFNUyAgICAgICAgICA9ICgxVUxMIDw8IDMyKSwgIC8vLzwgc3VwcG9ydGluZyB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyZWFtcworCisgICAgQVBJX1RVTk5FTElORyAgICAgICAgPSAoMVVMTCA8PCA0OCksICAvLy88IHR1bm5lbGluZyBBUEkKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdD4sIGtQYXJhbUluZGV4QXBpRmVhdHVyZXM+CisgICAgICAgIEMyQXBpRmVhdHVyZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVBJX0ZFQVRVUkVTW10gPSAiYXBpLmZlYXR1cmVzIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBUaGlzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGRvdCAnLicsIGh5cGhlbiAnLScsIHBsdXMgJysnLCBvcgorICogdW5kZXJsaW5lICdfJy4gVGhlIG5hbWUgb2YgZWFjaCBjb21wb25lbnQgbXVzdCBiZSB1bmlxdWUuCisgKgorICogRm9yIEFuZHJvaWQ6IENvbXBvbmVudCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggJ2MyLicgZm9sbG93ZWQgYnkgdGhlIGNvbXBhbnkgbmFtZSBvciBhYmJyZXZpYXRpb24KKyAqIGFuZCBhbm90aGVyIGRvdCwgZS5nLiAnYzIuYW5kcm9pZC4nLiBVc2Ugb2YgbG93ZXJjYXNlIGlzIHByZWZlcnJlZCBidXQgbm90IHJlcXVpcmVkLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TmFtZT4gQzJDb21wb25lbnROYW1lU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FW10gID0gImNvbXBvbmVudC5uYW1lIjsKKworLyoqCisgKiBBbHRlcm5hdGUgbmFtZXMgKGFsaWFzZXMpIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBpcyBhIGNvbW1hICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbHRlcm5hdGUgY29tcG9uZW50IG5hbWVzLiBVbmxpa2UgY29tcG9uZW50IG5hbWVzIHRoYXQKKyAqIG11c3QgYmUgdW5pcXVlLCBtdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4QWxpYXNlcz4gQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BTElBU0VTW10gID0gImNvbXBvbmVudC5hbGlhc2VzIjsKKworLyoqCisgKiBDb21wb25lbnQga2luZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjpraW5kX3Q+LCBrUGFyYW1JbmRleEtpbmQ+CisgICAgICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfS0lORFtdICA9ICJjb21wb25lbnQua2luZCI7CisKKy8qKgorICogQ29tcG9uZW50IGRvbWFpbi4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50Ojpkb21haW5fdD4sIGtQYXJhbUluZGV4RG9tYWluPgorICAgICAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmc7Cit0eXBlZGVmIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBDMkNvbXBvbmVudERvbWFpbkluZm87IC8vIGRlcHJlY2F0ZWQKK3R5cGVkZWYgQzJDb21wb25lbnQ6OmRvbWFpbl90IEMyRG9tYWluS2luZDsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTltdICA9ICJjb21wb25lbnQuZG9tYWluIjsKKworY29uc3RleHByIEMyQ29tcG9uZW50Ojpkb21haW5fdCBDMkRvbWFpbkF1ZGlvID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIEMyQ29tcG9uZW50Ojpkb21haW5fdCBDMkRvbWFpbk90aGVyID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsgLy8gZGVwcmVjYXRlCitjb25zdGV4cHIgQzJDb21wb25lbnQ6OmRvbWFpbl90IEMyRG9tYWluVmlkZW8gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOyAvLyBkZXByZWNhdGUKKworLyoqCisgKiBDb21wb25lbnQgYXR0cmlidXRlcy4KKyAqCisgKiBUaGVzZSBhcmUgYSBzZXQgb2YgZmxhZ3MgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBjaGFyYWN0ZXJpemluZyBpdHMgcHJvY2Vzc2luZyBhbGdvcml0aG0uCisgKi8KK0MyRU5VTShDMkNvbXBvbmVudDo6YXR0cmliX3QsIHVpbnQ2NF90LAorICAgIEFUVFJJQl9JU19URU1QT1JBTCA9IDF1IDw8IDAsIC8vLzwgY29tcG9uZW50IGlucHV0IG9yZGVyaW5nIG1hdHRlcnMgZm9yIHByb2Nlc3NpbmcKKykKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjphdHRyaWJfdD4sIGtQYXJhbUluZGV4QXR0cmlidXRlcz4KKyAgICAgICAgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTW10gPSAiY29tcG9uZW50LmF0dHJpYnV0ZXMiOworCisvLyBkZXByZWNhdGVkCit0eXBlZGVmIEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcgQzJDb21wb25lbnRUZW1wb3JhbEluZm87CisKKy8qKgorICogVGltZSBzdHJldGNoaW5nLgorICoKKyAqIFRoaXMgaXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHJhdGUgb2YgdGhlIGlucHV0IHRpbWVzdGFtcCwgYW5kIHRoZSByYXRlIG9mIHRoZSBvdXRwdXQgdGltZXN0YW1wLgorICogRS5nLiBpZiB0aGlzIGlzIDQuMCwgZm9yIGV2ZXJ5IDEgc2Vjb25kcyBvZiBpbnB1dCB0aW1lc3RhbXAgZGlmZmVyZW5jZSwgdGhlIG91dHB1dCBzaGFsbCBkaWZmZXIKKyAqIGJ5IDQgc2Vjb25kcy4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USU1FX1NUUkVUQ0hbXSAgPSAiYWxnby50aW1lLXN0cmV0Y2giOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogUHJvZmlsZSBhbmQgbGV2ZWwuCisgKgorICogUHJvZmlsZSBkZXRlcm1pbmVzIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKiBMZXZlbCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiByZXNvdXJjZXMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICovCisKK25hbWVzcGFjZSB7CisKK2VudW0gOiB1aW50MzJfdCB7CisgICAgX0MyX1BMX01QMlZfQkFTRSA9IDB4MTAwMCwKKyAgICBfQzJfUExfQUFDX0JBU0UgID0gMHgyMDAwLAorICAgIF9DMl9QTF9IMjYzX0JBU0UgPSAweDMwMDAsCisgICAgX0MyX1BMX01QNFZfQkFTRSA9IDB4NDAwMCwKKyAgICBfQzJfUExfQVZDX0JBU0UgID0gMHg1MDAwLAorICAgIF9DMl9QTF9IRVZDX0JBU0UgPSAweDYwMDAsCisgICAgX0MyX1BMX1ZQOV9CQVNFICA9IDB4NzAwMCwKKyAgICBfQzJfUExfRFZfQkFTRSAgID0gMHg4MDAwLAorCisgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAorfTsKKworfQorCitlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CisgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCisKKyAgICAvLyBBQUMgKE1QRUctMiBQYXJ0IDcgYW5kIE1QRUctNCBQYXJ0IDMpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BQUNfTEMgPSBfQzJfUExfQUFDX0JBU0UsICAgICAgICAgICAvLy88IEFBQyBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTWFpbgorICAgIFBST0ZJTEVfQUFDX1NTUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUgU2FtcGxpbmcgUmF0ZQorICAgIFBST0ZJTEVfQUFDX0xUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24KKyAgICBQUk9GSUxFX0FBQ19IRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfQUFDX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19FUl9MQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVycm9yIFJlc2lsaWVudCBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IFNjYWxhYmxlCisgICAgUFJPRklMRV9BQUNfTEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19IRV9QUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeSBQYXJhbWV0cmljIFN0ZXJlbworICAgIFBST0ZJTEVfQUFDX0VMRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5CisgICAgUFJPRklMRV9BQUNfWEhFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFeHRlbmRlZCBIaWdoLUVmZmljaWVuY3kKKworICAgIC8vIE1QRUctMiBWaWRlbyBwcm9maWxlcworICAgIFBST0ZJTEVfTVAyVl9TSU1QTEUgPSBfQzJfUExfTVAyVl9CQVNFLCAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTaW1wbGUKKyAgICBQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbgorICAgIFBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTTlIgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU3BhdGlhbGx5IFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2gKKyAgICBQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgNDoyOjIKKyAgICBQUk9GSUxFX01QMlZfTVVMVElWSUVXLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTXVsdGktdmlldworCisgICAgLy8gSC4yNjMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUgPSBfQzJfUExfSDI2M19CQVNFLCAgIC8vLzwgSC4yNjMgQmFzZWxpbmUgKFByb2ZpbGUgMCkKKyAgICBQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMSkKKyAgICBQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAxIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMikKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgMykKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAzIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgNCkKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiAoUHJvZmlsZSA1KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCAoUHJvZmlsZSA2KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgKFByb2ZpbGUgNykKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSGlnaCBMYXRlbmN5IChQcm9maWxlIDgpCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgTmF0dXJhbCBWaXN1YWwgUHJvZmlsZXMKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlCisgICAgUFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBNYWluCisgICAgUFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBOLUJpdAorICAgIFBST0ZJTEVfTVA0Vl9BUlRTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgUmVhbHRpbWUgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0FDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgQ29yZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTywgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZSBTdHVkaW8KKyAgICBQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9GR1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZQorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBwcm9maWxlcworICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgLy8vPCBBVkMgKEguMjY0KSBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNYWluCisgICAgUFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEV4dGVuZGVkCisgICAgUFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaAorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfSElHSF8xMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6MjoyCisgICAgUFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDo0OjQgUHJlZGljdGl2ZQorICAgIFBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDEwIEludHJhCisgICAgUFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDQVZMQyA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFICsgMHgxMDAsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdILCAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBIaWdoIEludHJhCisgICAgUFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDIwMCwgIC8vLzwgQVZDIChILjI2NCkgTXVsdGl2aWV3IEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCwgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU3RlcmVvIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NRkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTUZDIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MzAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdILCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHg0MDAsICAvLy88IEFWQyAoSC4yNjQpIEVuaGFuY2VkIE11bHRpdmlldyBEZXB0aCBIaWdoCisKKyAgICAvLyBIRVZDIHByb2ZpbGVzCisgICAgUFJPRklMRV9IRVZDX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fU1RJTEwsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xNiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0ID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE2IEludHJhCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHgzMDAsICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE11bHRpdmlldyBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg1MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg2MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDEyCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDE2CisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0LCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDXzNEX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg3MDAsICAvLy88IEhFVkMgKEguMjY1KSAzRCBNYWluCisKKyAgICAvLyBWUDkgcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOV8wID0gX0MyX1BMX1ZQOV9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMCAoNDoyOjApCisgICAgUFJPRklMRV9WUDlfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDEgKDQ6MjoyIG9yIDQ6NDo0KQorICAgIFBST0ZJTEVfVlA5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAyICg0OjI6MCwgMTAgb3IgMTIgYml0KQorICAgIFBST0ZJTEVfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAzICg0OjI6MiBvciA0OjQ6NCwgMTAgb3IgMTIgYml0KQorCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGVzCisgICAgUFJPRklMRV9EVl9BVl9QRVIgPSBfQzJfUExfRFZfQkFTRSArIDAsICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlciBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfQVZfUEVOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi5wZW4gcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFUiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV9ERU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmRlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfMDQgPSBfQzJfUExfRFZfQkFTRSArIDQsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV8wNSA9IF9DMl9QTF9EVl9CQVNFICsgNSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA1IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFX0RUSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZHRoIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNyA9IF9DMl9QTF9EVl9CQVNFICsgNywgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA3IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA4ID0gX0MyX1BMX0RWX0JBU0UgKyA4LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDggcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfQVZfMDkgPSBfQzJfUExfRFZfQkFTRSArIDksICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi4wOSBwcm9maWxlCit9OworCitlbnVtIEMyQ29uZmlnOjpsZXZlbF90IDogdWludDMyX3QgeworICAgIExFVkVMX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZXZlbCBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIE1QRUctMiBWaWRlbyBsZXZlbHMKKyAgICBMRVZFTF9NUDJWX0xPVyA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTG93IExldmVsCisgICAgTEVWRUxfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE1haW4gTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCAxNDQwIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2ggTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hQLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaFAgTGV2ZWwKKworICAgIC8vIEguMjYzIGxldmVscworICAgIExFVkVMX0gyNjNfMTAgPSBfQzJfUExfSDI2M19CQVNFLCAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAxMAorICAgIExFVkVMX0gyNjNfMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAyMAorICAgIExFVkVMX0gyNjNfMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAzMAorICAgIExFVkVMX0gyNjNfNDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0MAorICAgIExFVkVMX0gyNjNfNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0NQorICAgIExFVkVMX0gyNjNfNTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA1MAorICAgIExFVkVMX0gyNjNfNjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA2MAorICAgIExFVkVMX0gyNjNfNzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA3MAorCisgICAgLy8gTVBFRy00IFBhcnQgMiAoVmlkZW8pIGxldmVscworICAgIExFVkVMX01QNFZfMCA9IF9DMl9QTF9NUDRWX0JBU0UsICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMAorICAgIExFVkVMX01QNFZfMEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMGIKKyAgICBMRVZFTF9NUDRWXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDEKKyAgICBMRVZFTF9NUDRWXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDIKKyAgICBMRVZFTF9NUDRWXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDMKKyAgICBMRVZFTF9NUDRWXzNCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDNiCisgICAgTEVWRUxfTVA0Vl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0CisgICAgTEVWRUxfTVA0Vl80QSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0YQorICAgIExFVkVMX01QNFZfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNQorICAgIExFVkVMX01QNFZfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNgorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBsZXZlbHMKKyAgICBMRVZFTF9BVkNfMSA9IF9DMl9QTF9BVkNfQkFTRSwgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMQorICAgIExFVkVMX0FWQ18xQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxYgorICAgIExFVkVMX0FWQ18xXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjEKKyAgICBMRVZFTF9BVkNfMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4yCisgICAgTEVWRUxfQVZDXzFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMworICAgIExFVkVMX0FWQ18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyCisgICAgTEVWRUxfQVZDXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMQorICAgIExFVkVMX0FWQ18yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVkNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMworICAgIExFVkVMX0FWQ18zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjEKKyAgICBMRVZFTF9BVkNfM18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVZDXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQKKyAgICBMRVZFTF9BVkNfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVZDXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQuMgorICAgIExFVkVMX0FWQ181LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1CisgICAgTEVWRUxfQVZDXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMQorICAgIExFVkVMX0FWQ181XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1LjIKKworICAgIC8vIEhFVkMgKEguMjY1KSB0aWVycyBhbmQgbGV2ZWxzCisgICAgTEVWRUxfSEVWQ19NQUlOXzEgPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMQorICAgIExFVkVMX0hFVkNfTUFJTl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDIKKyAgICBMRVZFTF9IRVZDX01BSU5fMl8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyLjEKKyAgICBMRVZFTF9IRVZDX01BSU5fMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAzCisgICAgTEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMy4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfTUFJTl80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfTUFJTl81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX01BSU5fNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX01BSU5fNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19NQUlOXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNi4yCisKKyAgICBMRVZFTF9IRVZDX0hJR0hfNCA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA0CisgICAgTEVWRUxfSEVWQ19ISUdIXzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNC4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNQorICAgIExFVkVMX0hFVkNfSElHSF81XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUuMQorICAgIExFVkVMX0hFVkNfSElHSF81XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUuMgorICAgIExFVkVMX0hFVkNfSElHSF82LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDYKKyAgICBMRVZFTF9IRVZDX0hJR0hfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2LjIKKworICAgIC8vIFZQOSBsZXZlbHMKKyAgICBMRVZFTF9WUDlfMSA9IF9DMl9QTF9WUDlfQkFTRSwgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDEKKyAgICBMRVZFTF9WUDlfMV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDEuMQorICAgIExFVkVMX1ZQOV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMgorICAgIExFVkVMX1ZQOV8yXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMi4xCisgICAgTEVWRUxfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAzCisgICAgTEVWRUxfVlA5XzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAzLjEKKyAgICBMRVZFTF9WUDlfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDQKKyAgICBMRVZFTF9WUDlfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDQuMQorICAgIExFVkVMX1ZQOV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNQorICAgIExFVkVMX1ZQOV81XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4xCisgICAgTEVWRUxfVlA5XzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA1LjIKKyAgICBMRVZFTF9WUDlfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYKKyAgICBMRVZFTF9WUDlfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMQorICAgIExFVkVMX1ZQOV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNi4yCisKKyAgICAvLyBEb2xieSBWaXNpb24gbGV2ZWwKKyAgICBMRVZFTF9EVl9NQUlOX0hEXzI0ID0gX0MyX1BMX0RWX0JBU0UsICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBoZDI0CisgICAgTEVWRUxfRFZfTUFJTl9IRF8zMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgaGQzMAorICAgIExFVkVMX0RWX01BSU5fRkhEXzI0LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDI0CisgICAgTEVWRUxfRFZfTUFJTl9GSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkMzAKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQ2MAorICAgIExFVkVMX0RWX01BSU5fVUhEXzI0LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDI0CisgICAgTEVWRUxfRFZfTUFJTl9VSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMzAKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF80OCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQ0OAorICAgIExFVkVMX0RWX01BSU5fVUhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDYwCisKKyAgICBMRVZFTF9EVl9ISUdIX0hEXzI0ID0gX0MyX1BMX0RWX0JBU0UgKyAweDEwMCwgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDI0CisgICAgTEVWRUxfRFZfSElHSF9IRF8zMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgaGQzMAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzI0LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDI0CisgICAgTEVWRUxfRFZfSElHSF9GSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkMzAKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQ2MAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzI0LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDI0CisgICAgTEVWRUxfRFZfSElHSF9VSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMzAKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF80OCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQ0OAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDYwCit9OworCitzdHJ1Y3QgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QgeworICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgcHJvZmlsZTsgIC8vLzwgY29kaW5nIHByb2ZpbGUKKyAgICBDMkNvbmZpZzo6bGV2ZWxfdCAgIGxldmVsOyAgICAvLy88IGNvZGluZyBsZXZlbAorCisgICAgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QoCisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IHByb2ZpbGVfID0gQzJDb25maWc6OlBST0ZJTEVfVU5VU0VELAorICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWxfID0gQzJDb25maWc6OkxFVkVMX1VOVVNFRCkKKyAgICAgICAgOiBwcm9maWxlKHByb2ZpbGVfKSwgbGV2ZWwobGV2ZWxfKSB7IH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoUHJvZmlsZUxldmVsKQorICAgIEMyRklFTEQocHJvZmlsZSwgInByb2ZpbGUiKQorICAgIEMyRklFTEQobGV2ZWwsICAgImxldmVsIikKK307CisKKy8vIFRPRE86IG1heSBuZWVkIHRvIG1ha2UgdGhpcyBleHBsaWNpdCAoaGF2ZSAuc2V0IG1lbWJlcikKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUHJvZmlsZUxldmVsU3RydWN0LCBrUGFyYW1JbmRleFByb2ZpbGVMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTFtdID0gImNvZGVkLnBsIjsKKyNkZWZpbmUgQzJfUEFSQU1LRVlfU1RSRUFNX1BST0ZJTEVfTEVWRUwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTAorCisvKioKKyAqIENvZGVjLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGRhdGEuCisgKgorICogVGhpcyBpcyBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgY29kZWMuCisgKgorICogRm9yIEFWQy9IRVZDLCB0aGVzZSBhcmUgdGhlIGNvbmNhdGVuYXRlZCBTUFMvUFBTL1ZQUyBOQUxzLgorICoKKyAqIFRPRE86IGRlZmluZSBmb3Igb3RoZXIgY29kZWNzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhJbml0RGF0YT4gQzJTdHJlYW1Jbml0RGF0YUluZm87Cit0eXBlZGVmIEMyU3RyZWFtSW5pdERhdGFJbmZvIEMyU3RyZWFtQ3NkSW5mbzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5JVF9EQVRBW10gPSAiY29kZWQuaW5pdC1kYXRhIjsKKyNkZWZpbmUgQzJfUEFSQU1LRVlfU1RSRUFNX0lOSVRfREFUQSBDMl9QQVJBTUtFWV9JTklUX0RBVEEKKworLyoqCisgKiBTdXBwbGVtZW50YWwgRGF0YS4KKyAqCisgKiBUaGlzIGlzIGNvZGluZy1zcGVjaWZpYyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb25hbCBkYXRhLCBlLmcuIFNFSSBmb3IgQVZDL0hFVkMuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBub3QgYSBjb25maWd1cmF0aW9uIHNvIGl0IGRvZXMgbm90IGhhdmUgYSBwYXJhbWV0ZXIga2V5LgorICogVGhpcyBzdHJ1Y3R1cmUgc2hhbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdXBkYXRlLCBhbmQgY2FuIGJlIHJlcGVhdGVkIGFzIG5lZWRlZAorICogaW4gdGhlIHNhbWUgdXBkYXRlLgorICovCitDMkVOVU0oQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QsIHVpbnQzMl90LAorICAgIElORk9fTk9ORSA9IDAsCisKKyAgICBJTkZPX1BSRUZJWF9TRUlfVU5JVCA9IDB4MTAwMDAsIC8vLzwgcHJlZml4IFNFSSBwYXlsb2FkIHR5cGVzIGFkZCB0aGlzIGZsYWcKKyAgICBJTkZPX1NVRkZJWF9TRUlfVU5JVCA9IDB4MjAwMDAsIC8vLzwgc3VmZml4IFNFSSBwYXlsb2FkIHR5cGVzIGFkZCB0aGlzIGZsYWcKKworICAgIElORk9fU0VJX1VTRVJfREFUQSA9IElORk9fUFJFRklYX1NFSV9VTklUIHwgNCwgICAgLy8vPCBjbG9zZWQtY2FwdGlvbmluZyBkYXRhIChJVFUtVCBUMzUpCisgICAgSU5GT19TRUlfTURDViAgICAgID0gSU5GT19QUkVGSVhfU0VJX1VOSVQgfCAxMzcsICAvLy88IG1hc3RlcmluZyBkaXNwbGF5IGNvbG9yIHZvbHVtZQorICAgIElORk9fU0VUX1VTRVJfREFUQV9TRlggPSBJTkZPX1NVRkZJWF9TRUlfVU5JVCB8IDQsIC8vLzwgY2xvc2VkLWNhcHRpb25pbmcgZGF0YSAoSVRVLVQgVDM1KQorCisgICAgSU5GT19WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwCispCisKK3N0cnVjdCBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QgeworICAgIEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCgpCisgICAgICAgIDogdHlwZV8oSU5GT19OT05FKSB7IH0KKworICAgIEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190IHR5cGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfKQorICAgICAgICA6IHR5cGVfKHR5cGUpIHsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCAmZGF0YV9bMF0sIGMyX21pbihkYXRhXy5zaXplKCksIGZsZXhDb3VudCkpOworICAgIH0KKworICAgIEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190IHR5cGVfOworICAgIHVpbnQ4X3QgZGF0YVtdOworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFN1cHBsZW1lbnRhbERhdGEsIGRhdGEpCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQoZGF0YSwgImRhdGEiKQorfTsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCwga1BhcmFtSW5kZXhTdXBwbGVtZW50YWxEYXRhPgorICAgICAgICBDMlN0cmVhbVN1cHBsZW1lbnRhbERhdGFJbmZvOworCisvKioKKyAqIFN1cHBsZW1lbnRhbCBEYXRhIFN1YnNjcmlwdGlvbgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U3Vic2NyaWJlZFN1cHBsZW1lbnRhbERhdGE+CisgICAgICAgIEMyU3RyZWFtU3Vic2NyaWJlZFN1cHBsZW1lbnRhbERhdGFUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1NVUFBMRU1FTlRBTF9EQVRBW10gPSAib3V0cHV0LnN1YnNjcmliZWQtc3VwcGxlbWVudGFsIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaXBlbGluZSBjaGFyYWN0ZXJpc3RpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE1lZGlhLXR5cGUuCisgKgorICogVGhpcyBpcyBkZWZpbmVkIGZvciBib3RoIHBvcnQgYW5kIHN0cmVhbSwgYnV0IHN0cmVhbSBtZWRpYSB0eXBlIG1heSBiZSBhIHN1YnR5cGUgb2YgdGhlCisgKiBwb3J0IG1lZGlhIHR5cGUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE1lZGlhVHlwZT4gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzsKK3R5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBDMlBvcnRNaW1lQ29uZmlnOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFW10gPSAiaW5wdXQubWVkaWEtdHlwZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRVtdID0gIm91dHB1dC5tZWRpYS10eXBlIjsKKyNkZWZpbmUgQzJfTkFNRV9JTlBVVF9QT1JUX01JTUVfU0VUVElORyBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFCisjZGVmaW5lIEMyX05BTUVfT1VUUFVUX1BPUlRfTUlNRV9TRVRUSU5HIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc7CisKKy8qKgorICogUGlwZWxpbmUgZGVsYXlzLgorICoKKyAqIElucHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbnB1dCBmcmFtZXMgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQgdG8gcHJvY2VzcworICogYW4gaW5wdXQgZnJhbWUuCisgKgorICogT3V0cHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFuCisgKiBvdXRwdXQgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogUGlwZWxpbmUgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lcyB0aGF0IGFyZSBwcm9jZXNzZWQgYXQgb25lIHRpbWUgYnkgdGhlCisgKiBjb21wb25lbnQuCisgKgorICogQXMgdGhlc2UgbWF5IHZhcnkgZnJvbSBmcmFtZSB0byBmcmFtZSwgdGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSByZXF1aXJlZCB2YWx1ZS4gRS5nLiBpZgorICogaW5wdXQgZGVsYXkgaXMgMCwgdGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBjb25zdW1lIGVhY2ggZnJhbWUgcXVldWVkIGV2ZW4gaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBxdWV1ZWQuIFNpbWlsYXJseSwgaWYgaW5wdXQgZGVsYXkgaXMgMSwgYXMgbG9uZyBhcyB0aGVyZSBhcmUgYWx3YXlzIGV4YWN0bHkgMgorICogb3V0c3RhbmRpbmcgaW5wdXQgZnJhbWVzIHF1ZXVlZCB0byB0aGUgY29tcG9uZW50LCBpdCBzaGFsbCBwcm9kdWNlIG91dHB1dC4KKyAqLworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4gQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nIEMyUG9ydFJlcXVlc3RlZExhdGVuY3lUdW5pbmc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJpbnB1dC5kZWxheS5yZXF1ZXN0ZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJvdXRwdXQuZGVsYXkucmVxdWVzdGVkIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4KKyAgICAgICAgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nOwordHlwZWRlZiBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgQzJDb21wb25lbnRSZXF1ZXN0ZWRMYXRlbmN5VHVuaW5nOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWV9SRVFVRVNUW10gPSAicGlwZWxpbmUtZGVsYXkucmVxdWVzdGVkIjsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5PiBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzsKK3R5cGVkZWYgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmcgQzJQb3J0TGF0ZW5jeUluZm87IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZW10gPSAiaW5wdXQuZGVsYXkuYWN0dWFsIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWVtdID0gIm91dHB1dC5kZWxheS5hY3R1YWwiOworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheT4gQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOwordHlwZWRlZiBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcgQzJDb21wb25lbnRMYXRlbmN5SW5mbzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlbXSA9ICJhbGdvLmRlbGF5LmFjdHVhbCI7CisKKy8qKgorICogUmVmZXJlbmNlIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBUaGUgY29tcG9uZW50IG1heSBob2xkIG9udG8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGV2ZW4gYWZ0ZXIgY29tcGxldGluZyB0aGUgY29ycmVzcG9uZGluZworICogd29yayBpdGVtLgorICoKKyAqIE1heCByZWZlcmVuY2UgYWdlIGlzIHRoZSBsb25nZXN0IG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lIHByb2Nlc3NpbmcgdGhhdCBhIGNvbXBvbmVudCBtYXkKKyAqIGhvbGQgb250byBhIGJ1ZmZlciBmb3IuIE1heCByZWZlcmVuY2UgY291bnQgaXMgdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYSBjb21wb25lbnQgbWF5CisgKiBob2xkIG9udG8gYXQgdGhlIHNhbWUgdGltZSBhdCB0aGUgd29yc3QgY2FzZS4gVGhlc2UgbnVtYmVycyBhc3N1bWUgc2luZ2xlIGZyYW1lIHBlciBidWZmZXJzLgorICoKKyAqIFVzZSBtYXgtdWludDMyIGlmIHRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbWF4IGFnZSBvciBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUFnZT4KKyAgICAgICAgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRVtdID0gImlucHV0LnJlZmVyZW5jZS5tYXgtYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRVtdID0gIm91dHB1dC5yZWZlcmVuY2UubWF4LWFnZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudD4KKyAgICAgICAgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlRbXSA9ICJpbnB1dC5yZWZlcmVuY2UubWF4LWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UW10gPSAib3V0cHV0LnJlZmVyZW5jZS5tYXgtY291bnQiOworCisvKioKKyAqIE91dHB1dCByZW9yZGVyaW5nLgorICoKKyAqIFRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gdXNlIGZvciBvdXRwdXQgYnVmZmVyIHJlb3JkZXJpbmcuIDAgaXMgaW50ZXJwcmV0ZWQgYXMgMS4KKyAqLworLy8gb3V0cHV0IG9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UmVvcmRlckJ1ZmZlckRlcHRoPgorICAgICAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSFtdID0gIm91dHB1dC5yZW9yZGVyLmRlcHRoIjsKKworQzJFTlVNKEMyQ29uZmlnOjpvcmRpbmFsX2tleV90LCB1aW50MzJfdCwKKyAgICAgICAgT1JESU5BTCwKKyAgICAgICAgVElNRVNUQU1QLAorICAgICAgICBDVVNUT00pCisKKy8vIHJlYWQtb25seSwgb3V0cHV0IG9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpvcmRpbmFsX2tleV90Piwga1BhcmFtSW5kZXhSZW9yZGVyS2V5PgorICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU9SREVSX0tFWVtdID0gIm91dHB1dC5yZW9yZGVyLmtleSI7CisKKy8qKgorICogU3RyZWFtIGNvdW50LgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN0cmVhbUNvdW50PiBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzsKK3R5cGVkZWYgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmcgQzJQb3J0U3RyZWFtQ291bnRDb25maWc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVFtdID0gImlucHV0LnN0cmVhbS1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UW10gPSAib3V0cHV0LnN0cmVhbS1jb3VudCI7CisKKy8qKgorICogQ29uZmlnIHVwZGF0ZSBzdWJzY3JpcHRpb24uCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhTdWJzY3JpYmVkUGFyYW1JbmRpY2VzPgorICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1BBUkFNX0lORElDRVNbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1pbmRpY2VzIjsKKworLyoqCisgKiBTdWdnZXN0ZWQgYnVmZmVyIChDMkZyYW1lKSBjb3VudC4gVGhpcyBpcyBhIHN1Z2dlc3Rpb24gYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIG51bWJlciBvZgorICogaW5wdXQgYW5kIG91dHB1dCBmcmFtZXMgYWxsb2NhdGVkIGZvciB0aGUgY29tcG9uZW50J3MgdXNlIGluIHRoZSBidWZmZXIgcG9vbHMuCisgKgorICogQ29tcG9uZW50IHNoYWxsIHNldCB0aGUgYWNjZXB0YWJsZSByYW5nZSBvZiBidWZmZXJzIGFsbG9jYXRlZCBmb3IgaXQuIEUuZy4gY2xpZW50IHNoYWxsCisgKiBhbGxvY2F0ZSBhdCBsZWFzdCB0aGUgbWluaW11bSByZXF1aXJlZCB2YWx1ZS4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFN1Z2dlc3RlZEJ1ZmZlckNvdW50PgorICAgICAgICBDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVR0dFU1RFRF9CVUZGRVJfQ09VTlRbXSA9ICJpbnB1dC5idWZmZXJzLnBvb2wtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1VHR0VTVEVEX0JVRkZFUl9DT1VOVFtdID0gIm91dHB1dC5idWZmZXJzLnBvb2wtc2l6ZSI7CisKKy8qKgorICogSW5wdXQvb3V0cHV0IGJhdGNoaW5nLgorICoKKyAqIEZvciBpbnB1dCwgY29tcG9uZW50IHJlcXVlc3RzIHRoYXQgY2xpZW50IGJhdGNoZXMgd29yayBpbiBiYXRjaGVzIG9mIHNwZWNpZmllZCBzaXplLiBGb3Igb3V0cHV0LAorICogY2xpZW50IHJlcXVlc3RzIHRoYXQgdGhlIGNvbXBvbmVudCBiYXRjaGVzIHdvcmsgY29tcGxldGlvbiBpbiBnaXZlbiBiYXRjaCBzaXplLgorICogVmFsdWUgMCBtZWFucyBkb24ndCBjYXJlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleEJhdGNoU2l6ZT4gQzJQb3J0QmF0Y2hTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQkFUQ0hfU0laRVtdID0gImlucHV0LmJ1ZmZlcnMuYmF0Y2gtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQkFUQ0hfU0laRVtdID0gIm91dHB1dC5idWZmZXJzLmJhdGNoLXNpemUiOworCisvKioKKyAqIEN1cnJlbnQgJiBsYXN0IHdvcmsgb3JkaW5hbHMuCisgKgorICogaW5wdXQgcG9ydDogbGFzdCB3b3JrIHF1ZXVlZCB0byBjb21wb25lbnQuCisgKiBvdXRwdXQgcG9ydDogbGFzdCB3b3JrIGNvbXBsZXRlZCBieSBjb21wb25lbnQuCisgKiBnbG9iYWw6IGN1cnJlbnQgd29yay4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJXb3JrT3JkaW5hbFN0cnVjdCwga1BhcmFtSW5kZXhMYXN0V29ya1F1ZXVlZD4gQzJMYXN0V29ya1F1ZXVlZFR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJXb3JrT3JkaW5hbFN0cnVjdCwga1BhcmFtSW5kZXhDdXJyZW50V29yaz4gQzJDdXJyZW50V29ya1R1bmluZzsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbW9yeSBhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBBbGxvY2F0b3JzIHRvIHVzZS4KKyAqCisgKiBUaGVzZSBhcmUgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogSWYgbm9uZSBzcGVjaWZpZWQsIGNsaWVudCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgSUQgYmFzZWQgb24gdGhlIGNvbXBvbmVudCBkb21haW4gYW5kCisgKiBraW5kLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQWxsb2NhdG9yOjppZF90Piwga1BhcmFtSW5kZXhBbGxvY2F0b3JzPgorICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SU1tdID0gImlucHV0LmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SU1tdID0gIm91dHB1dC5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJBbGxvY2F0b3I6OmlkX3Q+LCBrUGFyYW1JbmRleEFsbG9jYXRvcnM+CisgICAgICAgIEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlNbXSA9ICJhbGdvLmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7CisKKy8qKgorICogQWxsb2NhdG9yIHRvIHVzZSBmb3Igb3V0cHV0dGluZyB0byBzdXJmYWNlLgorICoKKyAqIENvbXBvbmVudHMgY2FuIG9wdGlvbmFsbHkgcmVxdWVzdCBhbGxvY2F0b3IgdHlwZSBmb3Igb3V0cHV0dGluZyB0byBzdXJmYWNlLgorICoKKyAqIElmIG5vbmUgc3BlY2lmaWVkLCBjbGllbnQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgQnVmZmVyUXVldWUtYmFja2VkIGFsbG9jYXRvciBJRCBmb3Igb3V0cHV0dGluZyB0bworICogc3VyZmFjZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdXJmYWNlQWxsb2NhdG9yPgorICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NVUkZBQ0VfQUxMT0NBVE9SW10gPSAib3V0cHV0LmJ1ZmZlcnMuc3VyZmFjZS1hbGxvY2F0b3ItaWQiOworCisvKioKKyAqIEJsb2NrIHBvb2xzIHRvIHVzZS4KKyAqCisgKiBUaGVzZSBhcmUgYWxsb2NhdGVkIGJ5IHRoZSBjbGllbnQgZm9yIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGFsbG9jYXRvciBJRHMgc3BlY2lmaWVkIGJ5IHRoZQorICogY29tcG9uZW50LiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0aGUgaW5wdXQgcG9ydC4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4sIGtQYXJhbUluZGV4QmxvY2tQb29scz4KKyAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9CTE9DS19QT09MU1tdID0gIm91dHB1dC5idWZmZXJzLnBvb2wtaWRzIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90Piwga1BhcmFtSW5kZXhCbG9ja1Bvb2xzPgorICAgICAgICBDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJJVkFURV9CTE9DS19QT09MU1tdID0gImFsZ28uYnVmZmVycy5wb29sLWlkcyI7CisKKy8qKgorICogVGhlIG1heCBudW1iZXIgb2YgcHJpdmF0ZSBhbGxvY2F0aW9ucyBhdCBhbnkgb25lIHRpbWUgYnkgdGhlIGNvbXBvbmVudC4KKyAqIChUaGlzIGlzIGFuIGFycmF5IHdpdGggYSBjb3JyZXNwb25kaW5nIHZhbHVlIGZvciBlYWNoIHByaXZhdGUgYWxsb2NhdG9yKQorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQ291bnQ+CisgICAgICAgIEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UW10gPSAiYWxnby5idWZmZXJzLm1heC1jb3VudCI7CisKKy8qKgorICogQnVmZmVyIHR5cGUKKyAqCisgKiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBjbGllbnQgdG8gYWxsb2NhdGUgdGhlIHByb3BlciBidWZmZXIgdHlwZSBmb3IgdGhlCisgKiBpbnB1dCBwb3J0LCBhbmQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgdG8gY29udHJvbCB0aGUgYnVmZmVyIHR5cGUgZm9yIHRoZSBvdXRwdXQuCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkJ1ZmZlckRhdGE6OnR5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4QnVmZmVyVHlwZT4KKyAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzsKKworY29uc3RleHByIEMyQnVmZmVyRGF0YTo6dHlwZV90IEMyRm9ybWF0QXVkaW8gICAgICA9IEMyQnVmZmVyRGF0YTo6TElORUFSOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJGb3JtYXRDb21wcmVzc2VkID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBDMkJ1ZmZlckRhdGE6OnR5cGVfdCBDMkZvcm1hdFZpZGVvICAgICAgPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM7IC8vIGRlcHJlY2F0ZWQKK3R5cGVkZWYgQzJCdWZmZXJEYXRhOjp0eXBlX3QgQzJGb3JtYXRLaW5kOyAvLyBkZXByZWNhdGVkCisKK3R5cGVkZWYgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZyBDMlN0cmVhbUZvcm1hdENvbmZpZzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFW10gPSAiaW5wdXQuYnVmZmVycy50eXBlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJvdXRwdXQuYnVmZmVycy50eXBlIjsKKworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX0lOUFVUX1NUUkVBTV9GT1JNQVRfU0VUVElORyBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUKKyNkZWZpbmUgQzJfTkFNRV9PVVRQVVRfU1RSRUFNX0ZPUk1BVF9TRVRUSU5HIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUKKworLyoqCisgKiBNZW1vcnkgdXNhZ2UuCisgKgorICogU3VnZ2VzdGVkIGJ5IGNvbXBvbmVudCBmb3IgaW5wdXQgYW5kIG5lZ290aWF0ZWQgYmV0d2VlbiBjbGllbnQgYW5kIGNvbXBvbmVudCBmb3Igb3V0cHV0LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4VXNhZ2U+IEMyU3RyZWFtVXNhZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0VbXSA9ICJpbnB1dC5idWZmZXJzLnVzYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fVVNBR0VbXSA9ICJvdXRwdXQuYnVmZmVycy51c2FnZSI7CisvLyBkZXByZWNhdGVkCisjZGVmaW5lIEMyX05BTUVfSU5QVVRfU1RSRUFNX1VTQUdFX1NFVFRJTkcgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFCisKKy8qKgorICogUGljdHVyZSAodmlkZW8gb3IgaW1hZ2UgZnJhbWUpIHNpemUuCisgKi8KK3N0cnVjdCBDMlBpY3R1cmVTaXplU3RydWN0IHsKKyAgICBpbmxpbmUgQzJQaWN0dXJlU2l6ZVN0cnVjdCgpCisgICAgICAgIDogd2lkdGgoMCksIGhlaWdodCgwKSB7IH0KKworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XykKKyAgICAgICAgOiB3aWR0aCh3aWR0aF8pLCBoZWlnaHQoaGVpZ2h0XykgeyB9CisKKyAgICB1aW50MzJfdCB3aWR0aDsgICAgIC8vLzwgdmlkZW8gd2lkdGgKKyAgICB1aW50MzJfdCBoZWlnaHQ7ICAgIC8vLzwgdmlkZW8gaGVpZ2h0CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFBpY3R1cmVTaXplKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorfTsKKworLyoqCisgKiBPdXQgb2YgbWVtb3J5IHNpZ25hbGluZworICoKKyAqIFRoaXMgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2xpZW50IHRvIG1hcmsgdGhhdCBpdCBjYW5ub3QgYWxsb2NhdGUgbmVjZXNzYXJ5IHByaXZhdGUgYW5kLworICogb3Igb3V0cHV0IGJ1ZmZlcnMgdG8gY29udGludWUgb3BlcmF0aW9uLCBhbmQgdG8gc2lnbmFsIHRoZSBmYWlsaW5nIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCBDMk91dE9mTWVtb3J5U3RydWN0IHsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sOyAgIC8vLzwgcG9vbCBJRCB0aGF0IGZhaWxlZCB0aGUgYWxsb2NhdGlvbgorICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgICAgICAgICAgLy8vPCBtZW1vcnkgdXNhZ2UgdXNlZAorICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgcGxhbmFyOyAgICAgLy8vPCBidWZmZXIgZGltZW5zaW9ucyB0byBiZSBhbGxvY2F0ZWQgaWYgMkQKKyAgICB1aW50MzJfdCBmb3JtYXQ7ICAgICAgICAgICAgICAgIC8vLzwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQgaWYgMkQKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgICAgICAgICAgIC8vLzwgYnVmZmVyIGNhcGFjaXR5IHRvIGJlIGFsbG9jYXRlZCBpZiAxRAorICAgIGMyX2Jvb2xfdCBvdXRPZk1lbW9yeTsgICAgICAgICAgIC8vLzwgdHJ1ZSBpZiBjb21wb25lbnQgaXMgb3V0IG9mIG1lbW9yeQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChPdXRPZk1lbW9yeSkKKyAgICBDMkZJRUxEKHBvb2wsICJwb29sIikKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQocGxhbmFyLCAicGxhbmFyIikKKyAgICBDMkZJRUxEKGZvcm1hdCwgImZvcm1hdCIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKG91dE9mTWVtb3J5LCAib3V0LW9mLW1lbW9yeSIpCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyT3V0T2ZNZW1vcnlTdHJ1Y3QsIGtQYXJhbUluZGV4T3V0T2ZNZW1vcnk+IEMyT3V0T2ZNZW1vcnlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRfT0ZfTUVNT1JZW10gPSAiYWxnby5vb20iOworCisvKioKKyAqIE1heCBidWZmZXIgc2l6ZQorICoKKyAqIFRoaXMgaXMgYSBoaW50IHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGV4cGVjdGVkIG9uIGEgc3RyZWFtIGZvciB0aGUKKyAqIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvbiBpdHMgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiBUaGlzIGlzIGNvbW11bmljYXRlZCB0byBjbGllbnRzIHNvIHRoZXkKKyAqIGNhbiBwcmVhbGxvY2F0ZSBpbnB1dCBidWZmZXJzLCBvciBjb25maWd1cmUgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhIG1heGltdW0gc2l6ZSBvbgorICogdGhlaXIgYnVmZmVycy4KKyAqCisgKiBSZWFkLW9ubHkuIFJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGJ5IGNvbXBvbmVudHMgb24gYWxsIGNvbXByZXNzZWQgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhCdWZmZXJTaXplPiBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAiaW5wdXQuYnVmZmVycy5tYXgtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX0JVRkZFUl9TSVpFW10gPSAib3V0cHV0LmJ1ZmZlcnMubWF4LXNpemUiOworCisjZGVmaW5lIEMyX05BTUVfU1RSRUFNX01BWF9CVUZGRVJfU0laRV9TRVRUSU5HIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1pc2MuIHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBUcmlwcGVkIHN0YXRlLAorICoKKyAqIFRoaXMgc3RhdGUgZXhpc3RzIHRvIGJlIGFibGUgdG8gcHJvdmlkZSByZWFzb25pbmcgZm9yIGEgdHJpcHBlZCBzdGF0ZSBkdXJpbmcgbm9ybWFsCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucywgYXMgd2VsbCBhcyB0byBhbGxvdyBjbGllbnQgdG8gdHJpcCB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUcmlwcGVkPgorICAgICAgICBDMlRyaXBwZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UUklQUEVEW10gPSAiYWxnby50cmlwcGVkIjsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGNvdW50ZXJzLgorICoKKyAqIENvbmZpZ3VyYXRpb25zIGFyZSB0cmFja2VkIHVzaW5nIHRocmVlIGNvdW50ZXJzLiBUaGUgaW5wdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGFjY2VwdGVkIGJ5IHRoZSBjb21wb25lbnQuIFRoZSBvdXRwdXQgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5CisgKiBvbmNlIHdpdGggZWFjaCB3b3JrIGNvbXBsZXRlZCBieSB0aGUgY29tcG9uZW50IChpbiB0aGUgb3JkZXIgb2Ygd29yayBjb21wbGV0aW9uKS4gVGhlCisgKiBnbG9iYWwgY291bnRlciBpcyBpbmNyZW1lbnRlZCBleGFjdGx5IG9uY2UgZHVyaW5nIHRvIGVhY2ggY29uZmlnKCkgY2FsbC4gVGhlc2UgY291bnRlcnMKKyAqIHNoYWxsIGJlIHJlYWQtb25seS4KKyAqCisgKiBUT0RPOiB0aGVzZSBzaG91bGQgYmUgY291bnRlcnMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlcj4gQzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMkNvbmZpZ0NvdW50ZXJUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9DT1VOVEVSW10gPSAiaW5wdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9DT1VOVEVSW10gPSAib3V0cHV0LmJ1ZmZlcnMuY291bnRlciI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT05GSUdfQ09VTlRFUltdID0gImFsZ28uY29uZmlnLmNvdW50ZXIiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNvdXJjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBSZXNvdXJjZXMgbmVlZGVkIGFuZCByZXNvdXJjZXMgcmVzZXJ2ZWQgZm9yIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAqCisgKiBSZXNvdXJjZXMgYXJlIHRyYWNrZWQgYXMgYSB2ZWN0b3Igb2YgcG9zaXRpdmUgbnVtYmVycy4gQXZhaWxhYmxlIHJlc291cmNlcyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4KKyAqCisgKiBCeSBkZWZhdWx0LCBubyByZXNvdXJjZXMgYXJlIHJlc2VydmVkIGZvciBhIGNvbXBvbmVudC4gSWYgcmVzb3VyY2UgcmVzZXJ2YXRpb24gaXMgc3VjY2Vzc2Z1bCwKKyAqIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgYWJsZSB0byB1c2UgdGhvc2UgcmVzb3VyY2VzIGV4Y2x1c2l2ZWx5LiBJZiBob3dldmVyLCB0aGUgY29tcG9uZW50IGlzCisgKiBub3QgdXNpbmcgYWxsIG9mIHRoZSByZXNlcnZlZCByZXNvdXJjZXMsIHRob3NlIG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlciBjb21wb25lbnRzLgorICoKKyAqIFRPRE86IGRlZmluZSBzb21lIG9mIHRoZSByZXNvdXJjZXMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhSZXNvdXJjZXNOZWVkZWQ+IEMyUmVzb3VyY2VzTmVlZGVkVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkPgorICAgICAgICBDMlJlc291cmNlc1Jlc2VydmVkVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX05FRURFRFtdID0gInJlc291cmNlcy5uZWVkZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVTT1VSQ0VTX1JFU0VSVkVEW10gPSAicmVzb3VyY2VzLnJlc2VydmVkIjsKKworLyoqCisgKiBPcGVyYXRpbmcgcmF0ZS4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBpcyB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiB3b3JrIHRocm91Z2ggdGhlIGNvbXBvbmVudC4gTmVnYXRpdmUgdmFsdWVzIGlzCisgKiBpbnZhbGlkLgorICoKKyAqIFRPRE86IHRoaXMgY291bGQgZGlzdGluZ3Vpc2ggc2V0IHZhbHVlCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE9wZXJhdGluZ1JhdGU+IEMyT3BlcmF0aW5nUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFW10gPSAiYWxnby5yYXRlIjsKKworLyoqCisgKiBSZWFsdGltZSAvIG9wZXJhdGluZyBwb2ludC4KKyAqCisgKiBQcmlvcml0eSB2YWx1ZSBkZWZpbmVzIHRoZSBvcGVyYXRpbmcgcG9pbnQgZm9yIHRoZSBjb21wb25lbnQuIE9wZXJhdGluZyBwb2ludHMgYXJlIGRlZmluZWQgYnkKKyAqIHRoZSB2ZW5kb3IuIFByaW9yaXR5IHZhbHVlIG9mIDAgbWVhbnMgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIG9wZXJhdGlvbiBhdCB0aGUgZ2l2ZW4gb3BlcmF0aW5nCisgKiByYXRlLiBQcmlvcml0eSB2YWx1ZXMgLTEgYW5kIGJlbG93IGRlZmluZSBvcGVyYXRpbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgcGVyZm9ybWFuY2UuIEluIHRoaXMKKyAqIGNhc2UgY2xpZW50IGV4cGVjdHMgYmVzdCBlZmZvcnQgd2l0aG91dCBleGNlZWRpbmcgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBwb2ludC4gVGhpcyBhbGxvd3MKKyAqIGNsaWVudCB0byBydW4gY29tcG9uZW50cyBkZWVwZXIgaW4gdGhlIGJhY2tncm91bmQgYnkgdXNpbmcgbGFyZ2VyIHByaW9yaXR5IHZhbHVlcy4gSW4gdGhlc2UKKyAqIGNhc2VzIG9wZXJhdGluZyByYXRlIGlzIGEgaGludCBmb3IgdGhlIG1heGltdW0gcmF0ZSB0aGF0IHRoZSBjbGllbnQgYW50aWNpcGF0ZXMuCisgKgorICogT3BlcmF0aW5nIHJhdGUgYW5kIHByaW9yaXR5IGFyZSB1c2VkIGluIHRhbmRlbS4gRS5nLiBpZiB0aGVyZSBhcmUgY29tcG9uZW50cyB0aGF0IHJ1biBhdCBhCisgKiBoaWdoZXIgb3BlcmF0aW5nIHBvaW50IChwcmlvcml0eSkgaXQgd2lsbCBtYWtlIG1vcmUgcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgY29tcG9uZW50cyBhdAorICogYSBsb3dlciBvcGVyYXRpbmcgcG9pbnQsIHNvIG9wZXJhdGluZyByYXRlIGNhbiBiZSB1c2VkIHRvIGdhdGUgdGhvc2UgY29tcG9uZW50cy4KKyAqCisgKiBQb3NpdGl2ZSBwcmlvcml0eSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkIGF0IHRoZSBtb21lbnQgYW5kIHNoYWxsIGJlIHRyZWF0ZWQgZXF1aXZhbGVudCB0byAwLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhSZWFsVGltZVByaW9yaXR5PgorICAgICAgICBDMlJlYWxUaW1lUHJpb3JpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklPUklUWVtdID0gImFsZ28ucHJpb3JpdHkiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBjb250ZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBTZWN1cmUgbW9kZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBTTV9VTlBST1RFQ1RFRCwgICAgLy8vPCBubyBjb250ZW50IHByb3RlY3Rpb24KKyAgICBTTV9SRUFEX1BST1RFQ1RFRCwgLy8vPCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhbGwgYmUgcHJvdGVjdGVkIGZyb20gcmVhZGluZworKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNlY3VyZV9tb2RlX3Q+LCBrUGFyYW1JbmRleFNlY3VyZU1vZGU+CisgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFW10gPSAiYWxnby5zZWN1cmUtbW9kZSI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5DT0RFUiBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBCaXRyYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Qml0cmF0ZT4gQzJTdHJlYW1CaXRyYXRlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1CaXRyYXRlSW5mbyBDMkJpdHJhdGVUdW5pbmc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVbXSA9ICJjb2RlZC5iaXRyYXRlIjsKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fQklUUkFURV9TRVRUSU5HIEMyX1BBUkFNS0VZX0JJVFJBVEUKKworLyoqCisgKiBCaXRyYXRlIG1vZGUuCisgKgorICogVE9ETzogcmVmaW5lIHRoaXMgd2l0aCBiaXRyYXRlIHJhbmdlcyBhbmQgc3VnZ2VzdGVkIHdpbmRvdworICovCitDMkVOVU0oQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCB1aW50MzJfdCwKKyAgICBCSVRSQVRFX0NPTlNUX1NLSVBfQUxMT1dFRCA9IDAsICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9DT05TVCA9IDEsICAgICAgICAgICAgICAgICAgIC8vLzwgY29uc3RhbnQgYml0cmF0ZSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9WQVJJQUJMRV9TS0lQX0FMTE9XRUQgPSAyLCAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwgZnJhbWUgc2tpcHBpbmcgYWxsb3dlZAorICAgIEJJVFJBVEVfVkFSSUFCTEUgPSAzLCAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIHZhcnksIGtlZXAgYWxsIGZyYW1lcworICAgIEJJVFJBVEVfSUdOT1JFID0gNywgICAgICAgICAgICAgICAgICAvLy88IGJpdHJhdGUgY2FuIGJlIGV4Y2VlZGVkIGF0IHdpbGwgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHF1YWxpdHkgb3Igb3RoZXIgc2V0dGluZ3MKKworICAgIC8vIGJpdHJhdGUgbW9kZXMgYXJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3MKKyAgICBCSVRSQVRFX0ZMQUdfS0VFUF9BTExfRlJBTUVTID0gMSwKKyAgICBCSVRSQVRFX0ZMQUdfQ0FOX1ZBUlkgPSAyLAorICAgIEJJVFJBVEVfRkxBR19DQU5fRVhDRUVEID0gNCwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZT4KKyAgICAgICAgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERVtdID0gImFsZ28uYml0cmF0ZS1tb2RlIjsKKworLyoqCisgKiBRdWFsaXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhlIGhpZ2hlciB0aGUgYmV0dGVyIHRoZSBvdXRwdXQgcXVhbGl0eSBhdCB0aGUgZXhwZW5zZSBvZgorICogbGVzcyBjb21wcmVzc2lvbiBlZmZpY2llbmN5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBxdWFsaXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UXVhbGl0eT4gQzJTdHJlYW1RdWFsaXR5VHVuaW5nOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlF1YWxpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9RVUFMSVRZW10gPSAiYWxnby5xdWFsaXR5IjsKKworLyoqCisgKiBDb21wbGV4aXR5LgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBieSBlYWNoIGNvbXBvbmVudCwgdGhpcyBoaWdoZXIgdGhlIHZhbHVlLCB0aGUgbW9yZSByZXNvdXJjZXMgdGhlIGNvbXBvbmVudAorICogd2lsbCB1c2UgdG8gcHJvZHVjZSBiZXR0ZXIgcXVhbGl0eSBhdCB0aGUgc2FtZSBjb21wcmVzc2lvbiBlZmZpY2llbmN5IG9yIGJldHRlciBjb21wcmVzc2lvbgorICogZWZmaWNpZW5jeSBhdCB0aGUgc2FtZSBxdWFsaXR5LiBUaGlzIHNldHRpbmcgaXMgZGVmaW5lZCBmb3IgdGhlIG91dHB1dCBzdHJlYW1zIGluIGNhc2UgdGhlCisgKiBjb21wb25lbnQgY2FuIHN1cHBvcnQgdmFyeWluZyBjb21wbGV4aXR5IG9uIGVhY2ggc3RyZWFtLCBvciBhcyBhbiBvdXRwdXQgcG9ydCB0dW5pbmcgaW4gY2FzZSB0aGUKKyAqIHF1YWxpdHkgaXMgZ2xvYmFsIHRvIGFsbCBzdHJlYW1zCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDb21wbGV4aXR5PiBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyQ29tcGxleGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFlbXSA9ICJhbGdvLmNvbXBsZXhpdHkiOworCisvKioKKyAqIEhlYWRlciAoaW5pdC1kYXRhKSBoYW5kbGluZyBhcm91bmQgc3luYyBmcmFtZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90LCB1aW50MzJfdCwKKyAgICAvKioKKyAgICAgKiBkb24ndCBwcmVwZW5kIGhlYWRlci4gU2lnbmFsIGhlYWRlciBvbmx5IHRocm91Z2ggQzJTdHJlYW1Jbml0RGF0YUluZm8uCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfVE9fTk9ORSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lIGFuZCB0aGVyZWFmdGVyIGJlZm9yZSB0aGUgbmV4dCBzeW5jIGZyYW1lCisgICAgICogaWYgaXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9PTl9DSEFOR0UsCisKKyAgICAvKioKKyAgICAgKiBwcmVwZW5kIGhlYWRlciBiZWZvcmUgZXZlcnkgc3luYyBmcmFtZS4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQywKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCb29sVmFsdWUsIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGU+CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERVtdID0gIm91dHB1dC5idWZmZXJzLnByZXBlbmQtaGVhZGVyIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UvVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogT3JkZXIgb2YgdHJhbnNmb3JtYXRpb24gaXM6CisgKgorICogY3JvcCA9PiAoc2NhbGluZyA9PiBzY2FsZWQtY3JvcCkgPT4gc2FtcGxlLWFzcGVjdC1yYXRpbyA9PiBmbGlwID0+IHJvdGF0aW9uCisgKi8KKworLyoqCisgKiBQaWN0dXJlIChpbWFnZS0gYW5kIHZpZGVvIGZyYW1lKSBzaXplLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgdmlkZW8gZGVjb2RlciwgYW5kIHRoZSBpbnB1dCBvZiB0aGUgdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlBpY3R1cmVTaXplU3RydWN0IEMyVmlkZW9TaXplU3RydWN0OyAvLyBkZXByZWNhdGVkCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUGljdHVyZVNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4UGljdHVyZVNpemU+IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFW10gPSAicmF3LnNpemUiOworI2RlZmluZSBDMl9QQVJBTUtFWV9TVFJFQU1fUElDVFVSRV9TSVpFIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRQorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9WSURFT19TSVpFX0lORk8gQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFCit0eXBlZGVmIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvIEMyVmlkZW9TaXplU3RyZWFtSW5mbzsgLy8gZGVwcmVjYXRlZAordHlwZWRlZiBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbyBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzsgLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9WSURFT19TSVpFX1NFVFRJTkcgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFCisKKy8qKgorICogQ3JvcCByZWN0YW5nbGUuCisgKi8KK3N0cnVjdCBDMlJlY3RTdHJ1Y3QgOiBDMlJlY3QgeworICAgIEMyUmVjdFN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBDMlJlY3RTdHJ1Y3QoY29uc3QgQzJSZWN0ICZyZWN0KSA6IEMyUmVjdChyZWN0KSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3RTdHJ1Y3QgJikgPSBkZWxldGU7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChSZWN0KQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobGVmdCwgImxlZnQiKQorICAgIEMyRklFTEQodG9wLCAidG9wIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUmVjdFN0cnVjdCwga1BhcmFtSW5kZXhDcm9wUmVjdD4gQzJTdHJlYW1Dcm9wUmVjdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DUk9QX1JFQ1RbXSA9ICJyYXcuY3JvcCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DUk9QX1JFQ1RbXSA9ICJjb2RlZC5jcm9wIjsKKworLyoqCisgKiBQaXhlbCBmb3JtYXQuCisgKi8KKy8vIFRPRE86IGRlZmluZSBzb21lCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQ+IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUW10gPSAicmF3LnBpeGVsLWZvcm1hdCI7CisKKy8qKgorICogRXh0ZW5kZWQgcm90YXRpb24gaW5mb3JtYXRpb24gYWxzbyBpbmNvcnBvcmF0aW5nIGEgZmxpcC4KKyAqCisgKiBSb3RhdGlvbiBpcyBjb3VudGVyIGNsb2NrLXdpc2UuCisgKi8KK3N0cnVjdCBDMlJvdGF0aW9uU3RydWN0IHsKKyAgICBDMlJvdGF0aW9uU3RydWN0KGludDMyX3Qgcm90YXRpb24gPSAwKQorICAgICAgICA6IGZsaXAoMCksIHZhbHVlKHJvdGF0aW9uKSB7IH0KKworICAgIGludDMyX3QgZmxpcDsgICAvLy88IGhvcml6b250YWwgZmxpcCAobGVmdC1yaWdodCBmbGlwIGFwcGxpZWQgcHJpb3IgdG8gcm90YXRpb24pCisgICAgaW50MzJfdCB2YWx1ZTsgIC8vLzwgcm90YXRpb24gaW4gZGVncmVlcyBjb3VudGVyIGNsb2Nrd2lzZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJvdGF0aW9uKQorICAgIEMyRklFTEQoZmxpcCwgImZsaXAiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlJvdGF0aW9uU3RydWN0LCBrUGFyYW1JbmRleFJvdGF0aW9uPiBDMlN0cmVhbVJvdGF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JPVEFUSU9OW10gPSAicmF3LnJvdGF0aW9uIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTltdID0gImNvZGVkLnZ1aS5yb3RhdGlvbiI7CisKKy8qKgorICogUGl4ZWwgKHNhbXBsZSkgYXNwZWN0IHJhdGlvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8+CisgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJyYXcuc2FyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJjb2RlZC52dWkuc2FyIjsKKworLyoqCisgKiBJbi1saW5lIHNjYWxpbmcuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSBzdXBwb3J0IHNjYWxpbmcgb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcy4gIE9yIHNjYWxpbmcgb25seSBhCisgKiBwb3J0aW9uIG9mIHJhdyBpbWFnZS92aWRlbyBmcmFtZXMgKHNjYWxlZC1jcm9wKS4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3QsIHVpbnQzMl90LAorICAgIFNDQUxJTkdfQVJCSVRSQVJZLCAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZD4KKyAgICAgICAgQzJTdHJlYW1TY2FsaW5nTWV0aG9kVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTElOR19NT0RFW10gPSAicmF3LnNjYWxpbmctbWV0aG9kIjsKKyNkZWZpbmUgQzJfUEFSQU1LRVlfU1RSRUFNX1NDQUxJTkdfTU9ERSBDMl9QQVJBTUtFWV9TQ0FMSU5HX01PREUKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbVNjYWxlZFBpY3R1cmVTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zY2FsZWQtc2l6ZSI7CisjZGVmaW5lIEMyX1BBUkFNS0VZX1NUUkVBTV9TQ0FMRURfUElDVFVSRV9TSVpFIEMyX1BBUkFNS0VZX1NDQUxFRF9QSUNUVVJFX1NJWkUKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlJlY3RTdHJ1Y3QsIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3Q+CisgICAgICAgIEMyU3RyZWFtU2NhbGVkQ3JvcFJlY3RUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMRURfQ1JPUF9SRUNUW10gPSAicmF3LnNjYWxlZC1jcm9wIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2xvciBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQ29sb3IgSW5mbworICoKKyAqIENocm9tYSBsb2NhdGlvbiBjYW4gdmFyeSBmb3IgdG9wIGFuZCBib3R0b20gZmllbGRzLCBzbyB1c2UgYW4gYXJyYXksIHRoYXQgY2FuIGhhdmUgMCB0byAyCisgKiB2YWx1ZXMuIEVtcHR5IGFycmF5IGlzIHVzZWQgZm9yIG5vbiBZVVYgZm9ybWF0cy4KKyAqLworCitzdHJ1Y3QgQzJDb2xvciB7CisgICAgZW51bSBtYXRyaXhfdCA6IHVpbnQzMl90OyAgLy8vPCBtYXRyaXggY29lZmZpY2llbnQgKFlVViA8PT4gUkdCKQorICAgIGVudW0gcGxhbmVfbGF5b3V0X3QgOiB1aW50MzJfdDsgIC8vLzwgcGxhbmUgbGF5b3V0IGZvciBmbGV4aWJsZSBmb3JtYXRzCisgICAgZW51bSBwcmltYXJpZXNfdCA6IHVpbnQzMl90OyAgLy8vPCBjb2xvciBwcmltYXJpZXMgYW5kIHdoaXRlIHBvaW50CisgICAgZW51bSByYW5nZV90IDogdWludDMyX3Q7ICAvLy88IHJhbmdlIG9mIGNvbG9yIGNvbXBvbmVudCB2YWx1ZXMKKyAgICBlbnVtIHN1YnNhbXBsaW5nX3QgOiB1aW50MzJfdDsgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nCisgICAgZW51bSB0cmFuc2Zlcl90IDogdWludDMyX3Q7ICAvLy88IHRyYW5zZmVyIGZ1bmN0aW9uCit9OworCisvLy8gQ2hyb21hIHN1YnNhbXBsaW5nCitDMkVOVU0oQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCwgdWludDMyX3QsCisgICAgTU9OT0NIUk9NRSwgICAgIC8vLzwgdGhlcmUgYXJlIG5vIENyIG5vciBDYiBwbGFuZXMKKyAgICBNT05PQ0hST01FX0FMUEhBLCAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzLCBidXQgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKyAgICBSR0IsICAgICAgICAgICAgLy8vPCBSR0IKKyAgICBSR0JBLCAgICAgICAgICAgLy8vPCBSR0JBCisgICAgWVVWXzQyMCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBieSAyIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5CisgICAgWVVWXzQyMiwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBob3Jpem9udGFsbHkKKyAgICBZVVZfNDQ0LCAgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZAorICAgIFlVVkFfNDQ0LCAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIG5vdCBzdWJzYW1wbGVkLCB0aGVyZSBpcyBhbiBhbHBoYSBwbGFuZQorKQorCitzdHJ1Y3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgeworICAgIC8vIGNocm9tYSBvZmZzZXRzIGRlZmluZWQgYnkgSVRVCisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQ0NCgpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8wKCkgeyByZXR1cm4geyAwLjBmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzEoKSB7IHJldHVybiB7IDAuNWYsIDAuNWYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8zKCkgeyByZXR1cm4geyAwLjVmLCAwLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzQoKSB7IHJldHVybiB7IDAuMGYsIDEuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfNSgpIHsgcmV0dXJuIHsgMC41ZiwgMS4wZiB9OyB9CisKKyAgICBmbG9hdCB4OyAgICAvLy88IHggb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyByaWdodCkKKyAgICBmbG9hdCB5OyAgICAvLy88IHkgb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyBkb3duKQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDaHJvbWFPZmZzZXQpCisgICAgQzJGSUVMRCh4LCAieCIpCisgICAgQzJGSUVMRCh5LCAieSIpCit9OworCitzdHJ1Y3QgQzJDb2xvckluZm9TdHJ1Y3QgeworICAgIEMyQ29sb3JJbmZvU3RydWN0KCkKKyAgICAgICAgOiBiaXREZXB0aCg4KSwgc3Vic2FtcGxpbmcoQzJDb2xvcjo6WVVWXzQyMCkgeyB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aDsKKyAgICBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nOworICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1tdOyAvLyBtYXggMiBlbGVtZW50cworCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgLyogZmxleENvdW50ICovLCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeyB9CisKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIHVpbnQzMl90IGJpdERlcHRoXywgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZ18sCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+IGxvY2F0aW9uc18pCisgICAgICAgIDogYml0RGVwdGgoYml0RGVwdGhfKSwgc3Vic2FtcGxpbmcoc3Vic2FtcGxpbmdfKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgJmxvY2F0aW9uIDogbG9jYXRpb25zXykgeworICAgICAgICAgICAgaWYgKGl4ID09IGZsZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYXRpb25zW2l4XSA9IGxvY2F0aW9uOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChDb2xvckluZm8sIGxvY2F0aW9ucykKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobG9jYXRpb25zLCAibG9jYXRpb25zIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQ29sb3JJbmZvU3RydWN0LCBrUGFyYW1JbmRleENvbG9ySW5mbz4gQzJTdHJlYW1Db2xvckluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9JTkZPW10gPSAicmF3LmNvbG9yLWZvcm1hdCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPW10gPSAiY29kZWQuY29sb3ItZm9ybWF0IjsKKworLyoqCisgKiBDb2xvciBBc3BlY3RzCisgKi8KKworLyogVGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZyBlbnVtZXJhdG9ycyBpcyBhcyBkZXNjcmliZWQgaW4gSVRVLVQgSC4yNzMuICovCisKKy8vLyBSYW5nZQorQzJFTlVNKEMyQ29sb3I6OnJhbmdlX3QsIHVpbnQzMl90LAorICAgIFJBTkdFX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHJhbmdlIGlzIHVuc3BlY2lmaWVkCisgICAgUkFOR0VfRlVMTCwgICAgICAgICAgICAgICAgIC8vLzwgZnVsbCByYW5nZQorICAgIFJBTkdFX0xJTUlURUQsICAgICAgICAgICAgICAvLy88IGxpbWl0ZWQgcmFuZ2UKKworICAgIFJBTkdFX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyByYW5nZSB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFJBTkdFX09USEVSID0gMFhGRiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIENvbG9yIHByaW1hcmllcworQzJFTlVNKEMyQ29sb3I6OnByaW1hcmllc190LCB1aW50MzJfdCwKKyAgICBQUklNQVJJRVNfVU5TUEVDSUZJRUQsICAgICAgICAgIC8vLzwgcHJpbWFyaWVzIGFyZSB1bnNwZWNpZmllZAorICAgIFBSSU1BUklFU19CVDcwOSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNzA5LTYgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDQ3MF9NLCAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNDcwLTYgU3lzdGVtIE0gb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDYwMV82MjUsICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNTI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDUyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgICAgICAgICAvLy88IEdlbmVyaWMgRmlsbQorICAgIFBSSU1BUklFU19CVDIwMjAsICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX1JQNDMxLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFJQIDQzMS0yIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUc0MzIsICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgRUcgNDMyLTEgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19FQlUzMjEzLCAgICAgICAgICAgICAgLy8vPCBFQlUgVGVjaC4zMjEzLUUgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgUFJJTUFSSUVTX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyBwcmltYXJpZXMgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBQUklNQVJJRVNfT1RIRVIgPSAweGZmICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworKQorCisvLy8gVHJhbnNmZXIgZnVuY3Rpb24KK0MyRU5VTShDMkNvbG9yOjp0cmFuc2Zlcl90LCB1aW50MzJfdCwKKyAgICBUUkFOU0ZFUl9VTlNQRUNJRklFRCwgICAgICAgICAgIC8vLzwgdHJhbnNmZXIgaXMgdW5zcGVjaWZpZWQKKyAgICBUUkFOU0ZFUl9MSU5FQVIsICAgICAgICAgICAgICAgIC8vLzwgTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcworICAgIFRSQU5TRkVSX1NSR0IsICAgICAgICAgICAgICAgICAgLy8vPCBzUkdCIG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl8xNzBNLCAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMTcwTSBvciBlcXVpdmFsZW50IChlLmcuIEJULjYwMS83MDkvMjAyMCkKKyAgICBUUkFOU0ZFUl9HQU1NQTIyLCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuMgorICAgIFRSQU5TRkVSX0dBTU1BMjgsICAgICAgICAgICAgICAgLy8vPCBBc3N1bWVkIGRpc3BsYXkgZ2FtbWEgMi44CisgICAgVFJBTlNGRVJfU1QyMDg0LCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFNUIDIwODQgZm9yIDEwLzEyLzE0LzE2IGJpdCBzeXN0ZW1zCisgICAgVFJBTlNGRVJfSExHLCAgICAgICAgICAgICAgICAgICAvLy88IEFSSUIgU1RELUI2NyBoeWJyaWQtbG9nLWdhbW1hCisKKyAgICBUUkFOU0ZFUl8yNDBNID0gMHg0MCwgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfWFZZQ0MsICAgICAgICAgICAgICAgICAvLy88IElFQyA2MTk2Ni0yLTQgb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX0JUMTM2MSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMTM2MSBleHRlbmRlZCBnYW11dAorICAgIFRSQU5TRkVSX1NUNDI4LCAgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCA0MjgtMSBvciBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8KKyAgICBUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgPSAweDgwLCAgIC8vLzwgdmVuZG9yLXNwZWNpZmljIHRyYW5zZmVyIHZhbHVlcyBzdGFydCBoZXJlCisgICAgVFJBTlNGRVJfT1RIRVIgPSAweGZmICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIE1hdHJpeCBjb2VmZmljaWVudAorQzJFTlVNKEMyQ29sb3I6Om1hdHJpeF90LCB1aW50MzJfdCwKKyAgICBNQVRSSVhfVU5TUEVDSUZJRUQsICAgICAgICAgICAgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50cyBhcmUgdW5zcGVjaWZpZWQKKyAgICBNQVRSSVhfQlQ3MDksICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS01IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfRkNDNDdfNzNfNjgyLCAgICAgICAgICAgIC8vLzwgRkNDIFRpdGxlIDQ3IENGUiA3My42ODIgb3IgZXF1aXZhbGVudCAoS1I9MC4zMCwgS0I9MC4xMSkKKyAgICBNQVRSSVhfQlQ2MDEsICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MCwgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfMjQwTSwgICAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0JUMjAyMCwgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2UKKyAgICBNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAgICAvLy88IHZlbmRvci1zcGVjaWZpYyBtYXRyaXggY29lZmZpY2llbnQgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBNQVRSSVhfT1RIRVIgPSAweGZmLCAgICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworCisgICAgTUFUUklYX1NNUFRFMjQwTSA9IE1BVFJJWF8yNDBNLCAvLyBkZXByZWNhdGVkCisgICAgTUFUUklYX0JUMjAyMENPTlNUQU5UID0gTUFUUklYX0JUMjAyMF9DT05TVEFOVCwgLy8gZGVwcmVjYXRlZAorKQorCitjb25zdGV4cHIgQzJDb2xvcjo6bWF0cml4X3QgTUFUUklYX0JUNDcwXzZNID0gTUFUUklYX0ZDQzQ3XzczXzY4MjsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIEMyQ29sb3I6Om1hdHJpeF90IE1BVFJJWF9CVDcwOV81ID0gTUFUUklYX0JUNzA5OyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgQzJDb2xvcjo6bWF0cml4X3QgTUFUUklYX0JUNjAxXzYgPSBNQVRSSVhfQlQ2MDE7IC8vIGRlcHJlY2F0ZWQKKworc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0IHsKKyAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlOworICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyOworICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0KCkKKyAgICAgICAgOiByYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCksCisgICAgICAgICAgcHJpbWFyaWVzKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCksCisgICAgICAgICAgdHJhbnNmZXIoQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQpLAorICAgICAgICAgIG1hdHJpeChDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsgfQorCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoQzJDb2xvcjo6cmFuZ2VfdCByYW5nZV8sIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2Zlcl8sIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeF8pCisgICAgICAgIDogcmFuZ2UocmFuZ2VfKSwgcHJpbWFyaWVzKHByaW1hcmllc18pLCB0cmFuc2Zlcih0cmFuc2Zlcl8pLCBtYXRyaXgobWF0cml4Xykge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JBc3BlY3RzKQorICAgIEMyRklFTEQocmFuZ2UsICJyYW5nZSIpCisgICAgQzJGSUVMRChwcmltYXJpZXMsICJwcmltYXJpZXMiKQorICAgIEMyRklFTEQodHJhbnNmZXIsICJ0cmFuc2ZlciIpCisgICAgQzJGSUVMRChtYXRyaXgsICJtYXRyaXgiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTW10gPSAicmF3LmNvbG9yIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTW10gPSAiY29kZWQudnVpLmNvbG9yIjsKKworLyoqCisgKiBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gdXNlLiBUaGVzZSBjb21lIGZyb20gdGhlIGNvbnRhaW5lciBvciBjbGllbnQgYW5kIHNoYWxsIGJlIGhhbmRsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kaW5nIHN0YW5kYXJkLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyQ29sb3JBc3BlY3RzU3RydWN0LCBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qKgorICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQmxvY2stc2l6ZSwgYmxvY2sgY291bnQgYW5kIGJsb2NrIHJhdGUuIFVzZWQgdG8gZGV0ZXJtaW5lIG9yIGNvbW11bmljYXRlIHByb2ZpbGUtbGV2ZWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhCbG9ja1NpemU+IEMyU3RyZWFtQmxvY2tTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1NJWkVbXSA9ICJjb2RlZC5ibG9jay1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja0NvdW50PiBDMlN0cmVhbUJsb2NrQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfQ09VTlRbXSA9ICJjb2RlZC5ibG9jay1jb3VudCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja1JhdGU+IEMyU3RyZWFtQmxvY2tSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1JBVEVbXSA9ICJjb2RlZC5ibG9jay1yYXRlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEZyYW1lIHJhdGUgKGNvZGVkIGFuZCBwb3J0IGZvciByYXcgZGF0YSkKKyAqCisgKiBDb2RlZCBmcmFtZSByYXRlcyBhcmUgd2hhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvCisgKiB0aGUgdGltZXN0YW1wLgorICoKKyAqIEZyYW1lIHJhdGVzIG9uIHJhdyBwb3J0cyBzaG91bGQgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgdGltZXN0YW1wcy4KKyAqCisgKiBGb3Igc2xvdyBtb3Rpb24gb3IgdGltZWxhcHNlIHJlY29yZGluZywgdGhlIHRpbWVzdGFtcCBzaGFsbCBiZSBhZGp1c3RlZCBwcmlvciB0byBmZWVkaW5nIGFuCisgKiBlbmNvZGVyLCBhbmQgdGhlIHRpbWUgc3RyZXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICogdGltZXN0YW1wIGFuZCByZWFsLXdvcmxkIHRpbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEVbXSA9ICJjb2RlZC5mcmFtZS1yYXRlIjsKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fRlJBTUVfUkFURV9TRVRUSU5HIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyUG9ydEZyYW1lUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9GUkFNRV9SQVRFW10gPSAiaW5wdXQuZnJhbWUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfRlJBTUVfUkFURVtdID0gIm91dHB1dC5mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2guIFJhdGlvIGJldHdlZW4gcmVhbC13b3JsZCB0aW1lIGFuZCB0aW1lc3RhbXAuIEUuZy4gdGltZSBzdHJldGNoIG9mIDQuMCBtZWFucyB0aGF0CisgKiB0aW1lc3RhbXAgZ3Jvd3MgMS80IHRoZSBzcGVlZCBvZiByZWFsLXdvcmxkIHRpbWUgKGUuZy4gNHggc2xvLW1vIGlucHV0KS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogb3B0aW1pemUgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyUG9ydFRpbWVTdHJldGNoSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSFtdID0gImlucHV0LnRpbWUtc3RyZXRjaCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVElNRV9TVFJFVENIW10gPSAib3V0cHV0LnRpbWUtc3RyZXRjaCI7CisKKy8qKgorICogTWF4IHZpZGVvIGZyYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZT4KKyAgICAgICAgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZyBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkVbXSA9ICJyYXcubWF4LXNpemUiOworCisvKioKKyAqIFBpY3R1cmUgdHlwZSBtYXNrLgorICovCitDMkVOVU0oQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCB1aW50MzJfdCwKKyAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCisgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAorICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKykKKwordHlwZWRlZiBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgQzJQaWN0dXJlVHlwZU1hc2s7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgQzJQaWN0dXJlVHlwZUtleUZyYW1lID0gQzJDb25maWc6OlNZTkNfRlJBTUU7IC8vIGRlcHJlY2F0ZWQKKworLyoqCisgKiBBbGxvd2VkIHBpY3R1cmUgdHlwZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRV9NQVNLW10gPSAiY29kaW5nLnBpY3R1cmUtdHlwZS1tYXNrIjsKKworLyoqCisgKiBSZXN1bHRpbmcgcGljdHVyZSB0eXBlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm8gQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFW10gPSAiY29kZWQucGljdHVyZS10eXBlIjsKKworLyoqCisgKiBHT1Agc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHT1AgaXMgc3BlY2lmaWVkIGluIGxheWVycyBiZXR3ZWVuIHN5bmMgZnJhbWVzLCBieSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWMgdHlwZSBvZgorICogZnJhbWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgKHN0YXJ0aW5nIHdpdGggc3luYyBmcmFtZXMgZm9yIHRoZSBmaXJzdCBsYXllcik6CisgKgorICogRS5nLgorICogICAgICAtIDQgSSBmcmFtZXMgYmV0d2VlbiBlYWNoIHN5bmMgZnJhbWUKKyAqICAgICAgLSAyIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgICAgIC0gMSBCIGZyYW1lIGJldHdlZW4gZWFjaCBQIGZyYW1lCisgKgorICogICAgICBbIHsgSSwgNCB9LCB7IFAsIDIgfSwgeyBCLCAxIH0gXSA9PT4gKFN5bmMpQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgSUJQQlBCIChTeW5jKUJQQlBCCisgKgorICogRm9yIGluZmluaXRlIEdPUCwgSSBsYXllciBjYW4gYmUgb21pdHRlZCAoYXMgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhIHN5bmMgZnJhbWUuKToKKyAqCisgKiAgICAgIFsgeyBQLCBNQVhfVUlOVCB9IF0gICA9PT4gKFN5bmMpUFBQUFBQUFBQUFBQUFBQUFBQLi4uCisgKgorICogU3luYyBmcmFtZXMgY2FuIGFsc28gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCwgYW5kIGFzIGEgdGltZS1iYXNlZCBpbnRlcnZhbC4gRm9yIHRpbWUtYmFzZWQKKyAqIGludGVydmFsLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhlIGdpdmVuIHRpbWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwKKyAqIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiAgRm9yIHN5bmMgcmVxdWVzdCwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4KKyAqCisgKiBUZW1wb3JhbCBsYXllcmluZyB3aWxsIGRldGVybWluZSBHT1Agc3RydWN0dXJlIG90aGVyIHRoYW4gdGhlIEkgZnJhbWUgY291bnQgYmV0d2VlbiBzeW5jCisgKiBmcmFtZXMuCisgKi8KK3N0cnVjdCBDMkdvcExheWVyU3RydWN0IHsKKyAgICBDMkdvcExheWVyU3RydWN0KEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlLCB1aW50MzJfdCBjb3VudF8pCisgICAgICAgIDogdHlwZV8odHlwZSksIGNvdW50KGNvdW50XykgeyB9CisKKyAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZV87CisgICAgdWludDMyX3QgY291bnQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEdvcExheWVyKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGNvdW50LCAiY291bnQiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyR29wTGF5ZXJTdHJ1Y3Q+LCBrUGFyYW1JbmRleEdvcD4KKyAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9HT1BbXSA9ICJjb2RpbmcuZ29wIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGNhbiBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kIGJ5IHRoZSBjbGllbnQuCisgKgorICogSWYgdHJ1ZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4gVGhpcyBjb25maWcgY2FuIGJlIHBhc3NlZAorICogc3luY2hyb25vdXNseSB3aXRoIHRoZSB3b3JrLCBvciBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50IC0gbGVhZGluZyB0byBkaWZmZXJlbnQgcmVzdWx0LgorICogSWYgaXQgaXMgcGFzc2VkIHdpdGggd29yaywgaXQgc2hhbGwgdGFrZSBlZmZlY3Qgd2hlbiB0aGF0IHdvcmsgaXRlbSBpcyBiZWluZyBwcm9jZXNzZWQgKHNvCisgKiB0aGUgZmlyc3QgSSBmcmFtZSBhdCBvciBhZnRlciB0aGF0IHdvcmsgaXRlbSBzaGFsbCBiZSBhIHN5bmMgZnJhbWUpLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lPgorICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJjb2RpbmcucmVxdWVzdC1zeW5jLWZyYW1lIjsKKworLyoqCisgKiBTeW5jIGZyYW1lIGludGVydmFsIGluIHRpbWUgZG9tYWluICh0aW1lc3RhbXApLgorICoKKyAqIElmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGlzIHZhbHVlLCB0aGUgbmV4dCBpbnRyYSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkCisgKiBhcyBhIHN5bmMgZnJhbWUuIFRoZSB2YWx1ZSBvZiBNQVhfSTY0IG9yIGEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgbm8gc3luYyBmcmFtZXMgYWZ0ZXIgdGhlIGZpcnN0CisgKiBmcmFtZS4gQSB2YWx1ZSBvZiAwIG1lYW5zIGFsbCBzeW5jIGZyYW1lcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWw+CisgICAgICAgIEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMW10gPSAiY29kaW5nLnN5bmMtZnJhbWUtaW50ZXJ2YWwiOworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX1BFUklPRCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMCisKKy8qKgorICogVGVtcG9yYWwgbGF5ZXJpbmcKKyAqCisgKiBMYXllciBpbmRleCBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgbGF5ZXIgY291bnQgLSAxLiBMYXllcnMgd2l0aCBoaWdoZXIgaW5kZXggaGF2ZSBoaWdoZXIKKyAqIGZyZXF1ZW5jeToKKyAqICAgICAwCisgKiAgIDEgICAxCisgKiAgMiAyIDIgMgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExheWVySW5kZXg+IEMyU3RyZWFtTGF5ZXJJbmRleEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9MQVlFUl9JTkRFWFtdID0gImNvZGVkLmxheWVyLWluZGV4IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckNvdW50PiBDMlN0cmVhbUxheWVyQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfQ09VTlRbXSA9ICJjb2RlZC5sYXllci1jb3VudCI7CisKK3N0cnVjdCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QgeworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCgpCisgICAgICAgIDogbGF5ZXJDb3VudCgwKSwgYkxheWVyQ291bnQoMCkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7IH0KKworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdChzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBsYXllckNvdW50XywgdWludDMyX3QgYkxheWVyQ291bnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8ZmxvYXQ+IHJhdGlvcykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoZmxvYXQgcmF0aW8gOiByYXRpb3MpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdHJhdGVSYXRpb3NbaXgrK10gPSByYXRpbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7ICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBsYXllcnMgKDAgbWVhbnMgbm8gdGVtcG9yYWwgbGF5ZXJpbmcpCisgICAgdWludDMyX3QgYkxheWVyQ291bnQ7ICAgIC8vLzwgdG90YWwgbnVtYmVyIG9mIGJpZGlyZWN0aW9uYWwgbGF5ZXJzICg8PSBudW0gbGF5ZXJzKQorICAgIC8qKgorICAgICAqIEJpdHJhdGUgYnVkZ2V0cyBmb3IgZWFjaCBsYXllciBhbmQgdGhlIGxheWVycyBiZWxvdywgZ2l2ZW4gYXMgYSByYXRpbyBvZiB0aGUgdG90YWwKKyAgICAgKiBzdHJlYW0gYml0cmF0ZS4gVGhpcyBjYW4gYmUgb21pdHRlZCBvciBwYXJ0aWFsbHkgc3BlY2lmaWZlZCBieSB0aGUgY2xpZW50IHdoaWxlIGNvbmZpZ3VyaW5nLAorICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBvbmVudCBzaGFsbCBmaWxsIGluIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIG1pc3NpbmcgbGF5ZXJzLgorICAgICAqIFRoaXMgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdoZW4gcXVlcmllZCBmb3IgYXQgbGVhc3QgbGF5ZXIgY291bnQgLSAxIChhcyB0aGUKKyAgICAgKiBsYXN0IGxheWVyJ3MgYnVkZ2V0IGlzIGFsd2F5cyAxLjApLgorICAgICAqLworICAgIGZsb2F0IGJpdHJhdGVSYXRpb3NbXTsgICAvLy88IDEuMC1iYXNlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlbXBvcmFsTGF5ZXJpbmcsIGJpdHJhdGVSYXRpb3MpCisgICAgQzJGSUVMRChsYXllckNvdW50LCAibGF5ZXItY291bnQiKQorICAgIEMyRklFTEQoYkxheWVyQ291bnQsICJiLWxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJpdHJhdGVSYXRpb3MsICJiaXRyYXRlLXJhdGlvcyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCwga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nPgorICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklOR1tdID0gImNvZGluZy50ZW1wb3JhbC1sYXllcmluZyI7CisKKy8qKgorICogSW50cmEtcmVmcmVzaC4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90LCB1aW50MzJfdCwKKyAgICBJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAgICAgLy8vPCBubyBpbnRyYSByZWZyZXNoCisgICAgSU5UUkFfUkVGUkVTSF9BUkJJVFJBUlksICAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCitzdHJ1Y3QgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QgeworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KCkKKyAgICAgICAgOiBtb2RlKEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEKSwgcGVyaW9kKDAuKSB7IH0KKworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlXywgZmxvYXQgcGVyaW9kXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgcGVyaW9kKHBlcmlvZF8pIHsgfQorCisgICAgQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90IG1vZGU7IC8vLzwgcmVmcmVzaCBtb2RlCisgICAgZmxvYXQgcGVyaW9kOyAgICAgICAgIC8vLzwgaW50cmEgcmVmcmVzaCBwZXJpb2QgaW4gZnJhbWVzIChtdXN0IGJlID49IDEpLCAwIG1lYW5zIGRpc2FibGVkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEludHJhUmVmcmVzaCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHBlcmlvZCwgInBlcmlvZCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50cmFSZWZyZXNoU3RydWN0LCBrUGFyYW1JbmRleEludHJhUmVmcmVzaD4KKyAgICAgICAgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIW10gPSAiY29kaW5nLmludHJhLXJlZnJlc2giOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTUFHRSBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGlsZSBsYXlvdXQuCisgKgorICogVGhpcyBkZXNjcmliZWQgaG93IHRoZSBpbWFnZSBpcyBkZWNvbXBvc2VkIGludG8gdGlsZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c2Nhbl9vcmRlcl90LCB1aW50MzJfdCwKKyAgICBTQ0FOX0xFRlRfVE9fUklHSFRfVEhFTl9ET1dOCispCisKK3N0cnVjdCBDMlRpbGVMYXlvdXRTdHJ1Y3QgeworICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgdGlsZTsgICAgICAgLy8vPCB0aWxlIHNpemUKKyAgICB1aW50MzJfdCBjb2x1bW5Db3VudDsgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIGhvcml6b250YWxseQorICAgIHVpbnQzMl90IHJvd0NvdW50OyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdGlsZXMgdmVydGljYWxseQorICAgIEMyQ29uZmlnOjpzY2FuX29yZGVyX3Qgb3JkZXI7ICAgLy8vPCB0aWxlIG9yZGVyCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbGVMYXlvdXQpCisgICAgQzJGSUVMRCh0aWxlLCAidGlsZSIpCisgICAgQzJGSUVMRChjb2x1bW5Db3VudCwgImNvbHVtbnMiKQorICAgIEMyRklFTEQocm93Q291bnQsICJyb3dzIikKKyAgICBDMkZJRUxEKG9yZGVyLCAib3JkZXIiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVMYXlvdXQ+IEMyU3RyZWFtVGlsZUxheW91dEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVFtdID0gImNvZGVkLnRpbGUtbGF5b3V0IjsKKworLyoqCisgKiBUaWxlIGhhbmRsaW5nLgorICoKKyAqIFdoZXRoZXIgdG8gY29uY2F0ZW5hdGUgdGlsZXMgb3Igb3V0cHV0IHRoZW0gZWFjaC4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjp0aWxpbmdfbW9kZV90LCB1aW50MzJfdCwKKyAgICBUSUxJTkdfU0VQQVJBVEUsICAgIC8vLzwgb3V0cHV0IGVhY2ggdGlsZSBpbiBhIHNlcGFyYXRlIG9uV29ya0RvbmUKKyAgICBUSUxJTkdfQ09OQ0FURU5BVEUgIC8vLzwgb3V0cHV0IG9uZSB3b3JrIGNvbXBsZXRpb24gcGVyIGZyYW1lIChjb25jYXRlbmF0ZSB0aWxlcykKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRpbGVMYXlvdXRTdHJ1Y3QsIGtQYXJhbUluZGV4VGlsZUhhbmRsaW5nPgorICAgICAgICBDMlN0cmVhbVRpbGVIYW5kbGluZ1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTEVfSEFORExJTkdbXSA9ICJjb2RpbmcudGlsZS1oYW5kbGluZyI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFVRElPIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBTYW1wbGUgcmF0ZQorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFNhbXBsZVJhdGU+IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURVtdID0gInJhdy5zYW1wbGUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURVtdID0gImNvZGVkLnNhbXBsZS1yYXRlIjsKKy8vIGRlcHJlY2F0ZWQKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fU0FNUExFX1JBVEVfU0VUVElORyBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURQorCisvKioKKyAqIENoYW5uZWwgY291bnQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Q2hhbm5lbENvdW50PiBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UW10gPSAicmF3LmNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ0hBTk5FTF9DT1VOVFtdID0gImNvZGVkLmNoYW5uZWwtY291bnQiOworLy8gZGVwcmVjYXRlZAorI2RlZmluZSBDMl9OQU1FX1NUUkVBTV9DSEFOTkVMX0NPVU5UX1NFVFRJTkcgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVAorCisvKioKKyAqIE1heCBjaGFubmVsIGNvdW50LiBVc2VkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29kZWQgb3IgZGVjb2RlZCBjaGFubmVscy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtTWF4Q2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5UW10gPSAicmF3Lm1heC1jaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQubWF4LWNoYW5uZWwtY291bnQiOworCisvKioKKyAqIEF1ZGlvIHNhbXBsZSBmb3JtYXQgKFBDTSBlbmNvZGluZykKKyAqLworQzJFTlVNKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgdWludDMyX3QsCisgICAgUENNXzE2LAorICAgIFBDTV84LAorICAgIFBDTV9GTE9BVAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdD4sIGtQYXJhbUluZGV4UGNtRW5jb2Rpbmc+CisgICAgICAgIEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HW10gPSAicmF3LnBjbS1lbmNvZGluZyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9QQ01fRU5DT0RJTkdbXSA9ICJjb2RlZC5wY20tZW5jb2RpbmciOworCisvKioKKyAqIEFBQyBTQlIgTW9kZS4gVXNlZCBkdXJpbmcgZW5jb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3Nicl9tb2RlX3QsIHVpbnQzMl90LAorICAgIEFBQ19TQlJfT0ZGLAorICAgIEFBQ19TQlJfU0lOR0xFX1JBVEUsCisgICAgQUFDX1NCUl9EVUFMX1JBVEUsCisgICAgQUFDX1NCUl9BVVRPIC8vLzwgbGV0IHRoZSBjb2RlYyBkZWNpZGUKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YWFjX3Nicl9tb2RlX3Q+LCBrUGFyYW1JbmRleEFhY1Nick1vZGU+CisgICAgICAgIEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERVtdID0gImNvZGluZy5hYWMtc2JyLW1vZGUiOworCisvKioKKyAqIERSQyBDb21wcmVzc2lvbi4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdCwgaW50MzJfdCwKKyAgICBEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsIC8vLzwgb2RtJ3MgZGVmYXVsdAorICAgIERSQ19DT01QUkVTU0lPTl9OT05FLAorICAgIERSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICBEUkNfQ09NUFJFU1NJT05fSEVBVlkgLy8vPAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uPgorICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFW10gPSAiY29kaW5nLmRyYy5jb21wcmVzc2lvbi1tb2RlIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY1RhcmdldFJlZmVyZW5jZUxldmVsPgorICAgICAgICBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLnJlZmVyZW5jZS1sZXZlbCI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNFbmNvZGVkVGFyZ2V0TGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMW10gPSAiY29kaW5nLmRyYy5lbmNvZGVkLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yPgorICAgICAgICBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUltdID0gImNvZGluZy5kcmMuYm9vc3QtZmFjdG9yIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0F0dGVudWF0aW9uRmFjdG9yPgorICAgICAgICBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUltdID0gImNvZGluZy5kcmMuYXR0ZW51YXRpb24tZmFjdG9yIjsKKworLyoqCisgKiBEUkMgRWZmZWN0IFR5cGUgKHNlZSBJU08gMjMwMDMtNCkgVW5pZm9ybSBEeW5hbWljIFJhbmdlIENvbnRyb2wuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmRyY19lZmZlY3RfdHlwZV90LCBpbnQzMl90LAorICAgIERSQ19FRkZFQ1RfT0RNX0RFRkFVTFQgPSAtMiwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0VGRkVDVF9PRkYgPSAtMSwgICAgLy8vPCBubyBEUkMKKyAgICBEUkNfRUZGRUNUX05PTkUgPSAwLCAgICAvLy88IG5vIERSQyBleGNlcHQgdG8gcHJldmVudCBjbGlwcGluZworICAgIERSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICBEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgIERSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICBEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICBEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICBEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT04KKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZT4KKyAgICAgICAgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFW10gPSAiY29kaW5nLmRyYy5lZmZlY3QtdHlwZSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBQUMgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBBQUMgc3RyZWFtIGZvcm1hdAorICovCitDMkVOVU0oQzJDb25maWc6OmFhY19wYWNrYWdpbmdfdCwgdWludDMyX3QsCisgICAgQUFDX1BBQ0tBR0lOR19SQVcsCisgICAgQUFDX1BBQ0tBR0lOR19BRFRTCispCisKK3R5cGVkZWYgQzJDb25maWc6OmFhY19wYWNrYWdpbmdfdCBDMkFhY1N0cmVhbUZvcm1hdEtpbmQ7IC8vIGRlcHJlY2F0ZWQKKy8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190IEMyQWFjU3RyZWFtRm9ybWF0UmF3ID0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXOworY29uc3RleHByIEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3QgQzJBYWNTdHJlYW1Gb3JtYXRBZHRzID0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3Q+PiwKKyAgICAgICAga1BhcmFtSW5kZXhBYWNQYWNrYWdpbmc+IEMyU3RyZWFtQWFjUGFja2FnaW5nSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvIEMyU3RyZWFtQWFjRm9ybWF0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkdbXSA9ICJjb2RlZC5hYWMtcGFja2FnaW5nIjsKKyNkZWZpbmUgQzJfTkFNRV9TVFJFQU1fQUFDX0ZPUk1BVF9TRVRUSU5HIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUExBVEZPUk0tREVGSU5FRCBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogUGxhdGZvcm0gbGV2ZWwgYW5kIGZlYXR1cmVzLgorICovCitlbnVtIEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3QgeworICAgIFBMQVRGT1JNX1AsICAgLy8vPCBzdXBwb3J0IGZvciBBbmRyb2lkIDkuMCBmZWF0dXJlIHNldAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9sZXZlbF90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWw+CisgICAgICAgIEMyUGxhdGZvcm1MZXZlbFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QTEFURk9STV9MRVZFTFtdID0gImFwaS5wbGF0Zm9ybS1sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICAvLyBubyBwbGF0Zm9ybS1zcGVjaWZpYyBmZWF0dXJlcyBoYXZlIGJlZW4gZGVmaW5lZAorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwbGF0Zm9ybV9mZWF0dXJlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1GZWF0dXJlcz4KKyAgICAgICAgQzJQbGF0Zm9ybUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0ZFQVRVUkVTW10gPSAiYXBpLnBsYXRmb3JtLWZlYXR1cmVzIjsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHByZWZlcnJlZCBpb24gYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuIG1lbW9yeSB1c2FnZS4KKyAqLworc3RydWN0IEMyU3RvcmVJb25Vc2FnZVN0cnVjdCB7CisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIGlubGluZSBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QodWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgaGVhcE1hc2soMCksIGFsbG9jRmxhZ3MoMCksIG1pbkFsaWdubWVudCgwKSB7IH0KKworICAgIHVpbnQ2NF90IHVzYWdlOyAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAvLy88IGNhcGFjaXR5CisgICAgaW50MzJfdCBoZWFwTWFzazsgICAgICAvLy88IGlvbiBoZWFwTWFzaworICAgIGludDMyX3QgYWxsb2NGbGFnczsgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIHVpbnQzMl90IG1pbkFsaWdubWVudDsgLy8vPCBtaW5pbXVtIGFsaWdubWVudAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChTdG9yZUlvblVzYWdlKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChjYXBhY2l0eSwgImNhcGFjaXR5IikKKyAgICBDMkZJRUxEKGhlYXBNYXNrLCAiaGVhcC1tYXNrIikKKyAgICBDMkZJRUxEKGFsbG9jRmxhZ3MsICJhbGxvYy1mbGFncyIpCisgICAgQzJGSUVMRChtaW5BbGlnbm1lbnQsICJtaW4tYWxpZ25tZW50IikKK307CisKKy8vIHN0b3JlLCBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcmVJb25Vc2FnZT4KKyAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbzsKKworLyoqCisgKiBGbGV4aWJsZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcnMKKyAqLworc3RydWN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgeworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0OworICAgIHVpbnQzMl90IGJpdERlcHRoOworICAgIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmc7CisgICAgQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QgbGF5b3V0OworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcikKKyAgICBDMkZJRUxEKHBpeGVsRm9ybWF0LCAicGl4ZWwtZm9ybWF0IikKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobGF5b3V0LCAibGF5b3V0IikKK307CisKKy8qKgorICogUGxhbmUgbGF5b3V0IG9mIGZsZXhpYmxlIHBpeGVsIGZvcm1hdHMuCisgKgorICogYnBwOiBieXRlcyBwZXIgY29sb3IgY29tcG9uZW50LCBlLmcuIDEgZm9yIDgtYml0IGZvcm1hdHMsIGFuZCAyIGZvciAxMC0xNi1iaXQgZm9ybWF0cy4KKyAqLworQzJFTlVNKEMyQ29sb3I6OnBsYW5lX2xheW91dF90LCB1aW50MzJfdCwKKyAgICAgICAvKiogVW5rbm93biBsYXlvdXQgKi8KKyAgICAgICBVTktOT1dOX0xBWU9VVCwKKworICAgICAgIC8qKiBQbGFuYXIgbGF5b3V0IHdpdGggcm93cyBvZiBlYWNoIHBsYW5lIHBhY2tlZCAoY29sSW5jID0gYnBwKSAqLworICAgICAgIFBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogU2VtaXBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmNfWS9BID0gYnBwIChwbGFuYXIpLAorICAgICAgICAqICBjb2xJbmNfQ2IvQ3IgPSAyKmJwcCAoaW50ZXJsZWF2ZWQpLiBVc2VkIG9ubHkgZm9yIFlVVihBKSBmb3JtYXRzLiAqLworICAgICAgIFNFTUlQTEFOQVJfUEFDS0VELAorCisgICAgICAgLyoqIEludGVybGVhdmVkIHBhY2tlZC4gY29sSW5jID0gTipicHAgKE4gYXJlIHRoZSBudW1iZXIgb2YgY29sb3IgY29tcG9uZW50cykgKi8KKyAgICAgICBJTlRFUkxFQVZFRF9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgYWxpZ25lZC4gY29sSW5jID0gc21hbGxlc3QgcG93ZXIgb2YgMiA+PSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvcgorICAgICAgICAqICBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX0FMSUdORUQKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycz4KKyAgICAgICAgQzJTdG9yZUZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yc0luZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIGRhdGFzcGFjZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGF0YVNwYWNlPiBDMlN0cmVhbURhdGFTcGFjZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFW10gPSAicmF3LmRhdGEtc3BhY2UiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYW5kcm9pZCBzdXJmYWNlIHNjYWxpbmcgbW9kZSBmb3IgYSByYXcgdmlkZW8vaW1hZ2UgZnJhbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmc+IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc3VyZmFjZS1zY2FsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElOUFVUIFNVUkZBQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW5wdXQgc3VyZmFjZSBFT1MKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkVhc3lCb29sVmFsdWUsIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zPgorICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TW10gPSAiaW5wdXQtc3VyZmFjZS5lb3MiOworI2RlZmluZSBDMl9OQU1FX0lOUFVUX1NVUkZBQ0VfRU9TX1RVTklORyBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPUworCisvKioKKyAqIFN0YXJ0L3N1c3BlbmQvcmVzdW1lL3N0b3AgY29udHJvbHMgYW5kIHRpbWVzdGFtcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogVE9ETzogbWFrZSB0aGVzZSBjb3VudGVycworICovCisKK3N0cnVjdCBDMlRpbWVkQ29udHJvbFN0cnVjdCB7CisgICAgYzJfYm9vbF90IGVuYWJsZWQ7IC8vLzwgY29udHJvbCBpcyBlbmFibGVkCisgICAgaW50NjRfdCB0aW1lc3RhbXA7IC8vLzwgaWYgZW5hYmxlZCwgdGltZSB0aGUgY29udHJvbCBzaG91bGQgdGFrZSBlZmZlY3QKKworICAgIEMyVGltZWRDb250cm9sU3RydWN0KCkKKyAgICAgICAgOiBlbmFibGVkKEMyX0ZBTFNFKSwgdGltZXN0YW1wKDApIHsgfQorCisgICAgLyogaW1wbGljaXQgKi8gQzJUaW1lZENvbnRyb2xTdHJ1Y3QodWludDY0X3QgdGltZXN0YW1wXykKKyAgICAgICAgOiBlbmFibGVkKEMyX1RSVUUpLCB0aW1lc3RhbXAodGltZXN0YW1wXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVkQ29udHJvbCkKKyAgICBDMkZJRUxEKGVuYWJsZWQsICAgImVuYWJsZWQiKQorICAgIEMyRklFTEQodGltZXN0YW1wLCAidGltZXN0YW1wIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0YXJ0QXQ+CisgICAgICAgIEMyUG9ydFN0YXJ0VGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVEFSVF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RhcnQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3VzcGVuZEF0PgorICAgICAgICBDMlBvcnRTdXNwZW5kVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVVNQRU5EX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdXNwZW5kIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFJlc3VtZUF0PgorICAgICAgICBDMlBvcnRSZXN1bWVUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1JFU1VNRV9BVFtdID0gImlucHV0LXN1cmZhY2UucmVzdW1lIjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN0b3BBdD4KKyAgICAgICAgQzJQb3J0U3RvcFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1RPUF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3RvcCI7CisKKy8qKgorICogVGltZSBvZmZzZXQgZm9yIGlucHV0IHN1cmZhY2UuIElucHV0IHRpbWVzdGFtcCB0byBjb2RlYyBpcyBzdXJmYWNlIGJ1ZmZlciB0aW1lc3RhbXAgcGx1cyB0aGlzCisgKiB0aW1lIG9mZnNldC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4VGltZU9mZnNldD4gQzJDb21wb25lbnRUaW1lT2Zmc2V0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FX09GRlNFVFtdID0gImlucHV0LXN1cmZhY2UudGltZS1vZmZzZXQiOworCisvKioKKyAqIE1pbmltdW0gZnBzIGZvciBpbnB1dCBzdXJmYWNlLgorICoKKyAqIFJlcGVhdCBmcmFtZSB0byBtZWV0IHRoaXMuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGU+IEMyUG9ydE1pbkZyYW1lUmF0ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfTUlOX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC1zdXJmYWNlLm1pbi1mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lc3RhbXAgYWRqdXN0bWVudCAob3ZlcnJpZGUpIGZvciBpbnB1dCBzdXJmYWNlIGJ1ZmZlcnMuIFRoZXNlIGNvbnRyb2wgdGhlIGlucHV0IHRpbWVzdGFtcAorICogZmVkIHRvIHRoZSBjb2RlYywgYnV0IGRvIG5vdCBpbXBhY3QgdGhlIG91dHB1dCB0aW1lc3RhbXAuCisgKi8KK3N0cnVjdCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QgeworICAgIC8vLyBjb250cm9sIG1vZGVzCisgICAgZW51bSBtb2RlX3QgOiB1aW50MzJfdDsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QoKTsKKworICAgIGlubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QobW9kZV90IG1vZGVfLCB1aW50NjRfdCB2YWx1ZV8pCisgICAgICAgIDogbW9kZShtb2RlXyksIHZhbHVlKHZhbHVlXykgeyB9CisKKyAgICBtb2RlX3QgbW9kZTsgICAgLy8vPCBjb250cm9sIG1vZGUKKyAgICB1aW50NjRfdCB2YWx1ZTsgLy8vPCBjb250cm9sIHZhbHVlIGZvciBnYXAgYmV0d2VlbiB0d28gdGltZXN0YW1wCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbWVzdGFtcEdhcEFkanVzdG1lbnQpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK0MyRU5VTShDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6Om1vZGVfdCwgdWludDMyX3QsCisgICAgTk9ORSwKKyAgICBNSU5fR0FQLAorICAgIEZJWEVEX0dBUCwKKyk7CisKK2lubGluZSBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6OkMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpCisgICAgOiBtb2RlKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6Tk9ORSksIHZhbHVlKDApIHsgfQorCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q+IEMyUG9ydFRpbWVzdGFtcEdhcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRVNUQU1QX0FESlVTVE1FTlRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWVzdGFtcC1hZGp1c3RtZW50IjsKKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJDT05GSUdfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmFkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkVOVU1fSF8KKyNkZWZpbmUgQzJFTlVNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVG9vbHMgZm9yIGVhc2llciBlbnVtIHN1cHBvcnQuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGlnbm9yaW5nIGVudW0gdmFsdWUgYXNzaWdubWVudCAoZS5nLiBib3RoICcoX0MyRW51bUNvbnN0KWtWYWx1ZSA9IHgnCisgKiBhbmQgJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlJyB3aWxsIGV2YWwgdG8ga1ZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgX0MyRW51bUNvbnN0IHsKK3B1YmxpYzoKKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gVAorICAgIGlubGluZSBfQzJFbnVtQ29uc3QoVCB2YWx1ZSkgOiBfbVZhbHVlKHZhbHVlKSB7fQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVAorICAgIGlubGluZSBvcGVyYXRvciBUKCkgeyByZXR1cm4gX21WYWx1ZTsgfQorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gQzJWYWx1ZTo6UHJpbWl0aXZlCisgICAgaW5saW5lIG9wZXJhdG9yIEMyVmFsdWU6OlByaW1pdGl2ZSgpIHsgcmV0dXJuIChUKV9tVmFsdWU7IH0KKyAgICAvLyBpZ25vcmUgYXNzaWdubWVudCBhbmQgcmV0dXJuIFQgaGVyZSB0byBhdm9pZCBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQgbGF0ZXIKKyAgICBpbmxpbmUgVCAmb3BlcmF0b3IgPShUIHZhbHVlIF9fdW51c2VkKSB7IHJldHVybiBfbVZhbHVlOyB9Citwcml2YXRlOgorICAgIFQgX21WYWx1ZTsKK307CisKKy8vLyBtYXBwZXIgdG8gZ2V0IG5hbWUgb2YgZW51bQorLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKKyNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKKy8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KKyNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAorCisvLy8gXGVuZGNvbmQKKworY2xhc3MgX0MyRW51bVV0aWxzIHsKKyAgICBzdGF0aWMgQzJTdHJpbmcgY2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSk7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplRW51bVZhbHVlTmFtZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXggPSBudWxscHRyKTsKKworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X0VudW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorICAgIC8vIHRoaXMgbWF5IG5vdCBiZSB1c2VkLi4uCisgICAgc3RhdGljIEMyX0hJREUgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBzYW5pdGl6ZUVudW1WYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIHByZWZpeCA9IG51bGxwdHIpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzID0gc2FuaXRpemVFbnVtVmFsdWVOYW1lcyhuYW1lcywgcHJlZml4KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpICYmIGkgPCBzYW5pdGl6ZWROYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKHNhbml0aXplZE5hbWVzW2ldLCB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0YXRpYyBDMl9ISURFIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgY3VzdG9tRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIEU+PiBpdGVtcykgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBmb3IgKGF1dG8gJml0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7CisgICAgfQorfTsKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIHR5cGUsIHByZWZpeCwgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUiMjZW5hYmxlZChuYW1lLCB0eXBlLCBwcmVmaXgsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCit0ZW1wbGF0ZTw+IFwKK0MyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAorICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgcHJlZml4KTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUl9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikKKworI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIjI2VuYWJsZWQobmFtZSwgbmFtZXMpCisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6Y3VzdG9tRW51bVZhbHVlcyggXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgbmFtZT4+IG5hbWVzKTsgXAorfQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyLiBUaGUgZGVmYXVsdCBtYXBwZXIKKyAqIGZpbmRzIGFuZCByZW1vdmVzIHRoZSBsb25nZXN0IGNvbW1vbiBwcmVmaXggYWNyb3NzIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcywgYW5kCisgKiByZXBsYWNlcyBjYW1lbC1jYXNlIHNlcGFyYXRvcnMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTShjMl9lbnVtX3QsIHVpbnQzMl90LAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICIxIiwgQzJfVkFMVUUyID0+ICIyIiwgLi4uCisgKiAgLy8gbG9uZ2VzdCBjb21tb24gcHJlZml4IGlzICJDMl9WQUxVRSIKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIChUaGlzIGNhbiBiZSBhbiBpbm5lciBjbGFzcyBlbnVtLikKKyAqIFxwYXJhbSB0eXBlIHVuZGVybHlpbmcgdHlwZQorICovCisjZGVmaW5lIEMyRU5VTShuYW1lLCB0eXBlLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBudWxscHRyLCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIHRoZSBkZWZhdWx0IG5hbWVkIHZhbHVlIG1hcHBlciBidXQgY3VzdG9tIHByZWZpeC4gVGhlIGRlZmF1bHQKKyAqIG1hcHBlciByZW1vdmVzIHRoZSBwcmVmaXggZnJvbSBhbGwgb2YgdGhlIGVudW0gdmFsdWUgbmFtZXMgKGlmIHByZXNlbnQpLCBhbmQKKyAqIGluc2VydHMgZGFzaGVzIGF0IGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyAobG93SGlnaCBiZWNvbWVzIGxvdy1oaWdoKSBhbmQgYWxzbyByZXBsYWNlcworICogbm9uLWxlYWRpbmcgdW5kZXJzY29yZXMgd2l0aCBkYXNoZXMgKCctJykuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fUFJFRklYKGMyX2VudW1fdCwgdWludDMyX3QsICJDMl8iLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJWQUxVRTEiLCBDMl9WQUxVRTIgPT4gIlZBTFVFMiIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKiBccGFyYW0gcHJlZml4IHByZWZpeCB0byByZW1vdmUKKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX1BSRUZJWChuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgX19WQV9BUkdTX18pCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCBjdXN0b20gbmFtZXMuCisgKgorICogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gdGhlIGdsb2JhbCBzY29wZSBhbmQgbmFtZXNwYWNlLgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIEMyRU5VTV9DVVNUT01fTkFNRVMoU29tZVN0cnVjdDo6YzJfZW51bV90LCB1aW50MzJfdCwgKHsKKyAqICAgICAgeyAiT25lIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUxIH0sCisgKiAgICAgIHsgIlR3byIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMiB9LAorICogICAgICB7ICJUaHJlZSIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMyB9IH0pLAorICogICAgQzJfVkFMVUUxLAorICogICAgQzJfVkFMVUUyID0gNSwKKyAqICAgIEMyX1ZBTFVFMyA9IEMyX1ZBTFVFMSArIDEpCisgKgorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiT25lIiwgQzJfVkFMVUUyID0+ICJUd28iLCAuLi4KKyAqICB+fn5+fn5+fn5+fn5+CisgKi8KKyNkZWZpbmUgQzJFTlVNX0NVU1RPTV9OQU1FUyhuYW1lLCB0eXBlLCBuYW1lcywgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykKKworLyoqCisgKiBNYWtlIGVudW1zIHVzYWJsZSBhcyB0aGVpciBpbnRlZ3JhbCB0eXBlcy4KKyAqCisgKiBOb3RlOiB0aGlzIG1ha2VzIHRoZW0gbm90IHVzYWJsZSBpbiBwcmludGYoKQorICovCit0ZW1wbGF0ZTxjbGFzcyBFPgorc3RydWN0IEMyRWFzeUVudW0geworICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICBFIHZhbHVlOworICAgIC8vIGRlZmluZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgRSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKEUgdmFsdWVfKSA6IHZhbHVlKHZhbHVlXykgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKFUgdmFsdWVfKSA6IHZhbHVlKEUodmFsdWVfKSkgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkVhc3lFbnVtKCkgPSBkZWZhdWx0OworfTsKKworLy8gbWFrZSBDMkVhc3lFbnVtIGJlaGF2ZSBsaWtlIGEgcmVndWxhciBlbnVtCisKK25hbWVzcGFjZSBzdGQgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IHVuZGVybHlpbmdfdHlwZTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RydWN0IGlzX2VudW08QzJFYXN5RW51bTxFPj4geworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQzJFTlVNX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiZTNiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCkBAIC0wLDAgKzEsMTY3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJQQVJBTV9IXworI2RlZmluZSBDMlBBUkFNX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGludGVybmFsIEludGVybmFsIGhlbHBlcnMuCisKKy8qIQorICogXGZpbGUKKyAqIFBBUkFNRVRFUlM6IFNFVFRJTkdzLCBUVU5JTkdzLCBhbmQgSU5GT3MKKyAqID09PQorICoKKyAqIFRoZXNlIHJlcHJlc2VudCBtaXNjZWxsYW5lb3VzIGNvbnRyb2wgYW5kIG1ldGFkYXRhIGluZm9ybWF0aW9uIGFuZCBhcmUgbGlrZWx5IGNvcGllZCBpbnRvCisgKiBrZXJuZWwgc3BhY2UuIFRoZXJlZm9yZSwgdGhlc2UgYXJlIEMtbGlrZSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIGNhcnJ5IGp1c3QgYSBzbWFsbCBhbW91bnQgb2YKKyAqIGluZm9ybWF0aW9uLiBXZSBhcmUgdXNpbmcgQysrIHRvIGJlIGFibGUgdG8gYWRkIGNvbnN0cnVjdG9ycywgYXMgd2VsbCBhcyBub24tdmlydHVhbCBhbmQgY2xhc3MKKyAqIG1ldGhvZHMuCisgKgorICogPT1TcGVjaWZpY2F0aW9uIGRldGFpbHM6CisgKgorICogUmVzdHJpY3Rpb25zOgorICogICAtIG11c3QgYmUgUE9EIHN0cnVjdCwgZS5nLiBubyB2dGFibGUgKG5vIHZpcnR1YWwgZGVzdHJ1Y3RvcikKKyAqICAgLSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBpbiA2NC1iaXQgYW5kIDMyLWJpdCBtb2RlIChubyBzaXplX3QpCisgKiAgIC0gYXMgc3VjaCwgbm8gcG9pbnRlciBtZW1iZXJzCisgKiAgIC0gc29tZSBjb21tb24gbWVtYmVyIGZpZWxkIG5hbWVzIGFyZSByZXNlcnZlZCBhcyB0aGV5IGFyZSBkZWZpbmVkIGFzIG1ldGhvZHMgZm9yIGFsbAorICogICAgIHBhcmFtZXRlcnM6CisgKiAgICAgdGhleSBhcmU6IHNpemUsIHR5cGUsIGtpbmQsIGluZGV4IGFuZCBzdHJlYW0KKyAqCisgKiBCZWhhdmlvcjoKKyAqIC0gUGFyYW1zIGNhbiBiZSBnbG9iYWwgKG5vdCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCksIHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0LAorICogICBvciByZWxhdGVkIHRvIGFuIGlucHV0L291dHB1dCBzdHJlYW0uCisgKiAtIEFsbCBwYXJhbXMgYXJlIHF1ZXJpZWQvc2V0IHVzaW5nIGEgdW5pcXVlIHBhcmFtIGluZGV4LCB3aGljaCBpbmNvcnBvcmF0ZXMgYSBwb3RlbnRpYWwgc3RyZWFtCisgKiAgIGluZGV4IGFuZC9vciBwb3J0LgorICogLSBRdWVyeWluZyAoc3VwcG9ydGVkKSBwYXJhbXMgTVVTVCBuZXZlciBmYWlsLgorICogLSBBbGwgcGFyYW1zIE1VU1QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4KKyAqIC0gSWYgc29tZSBmaWVsZHMgaGF2ZSAidW5zdXBwb3J0ZWQiIG9yICJpbnZhbGlkIiB2YWx1ZXMgZHVyaW5nIHNldHRpbmcsIHRoaXMgU0hPVUxEIGJlCisgKiAgIGNvbW11bmljYXRlZCB0byB0aGUgYXBwLgorICogICBhKSBJZGVhbGx5LCB0aGlzIHNob3VsZCBiZSBhdm9pZGVkLiAgV2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMsIGluIGdlbmVyYWwsIGNvbXBvbmVudCBzaG91bGQgZG8KKyAqICAgICAiYmVzdCBlZmZvcnQiIHRvIGFwcGx5IGFsbCBzZXR0aW5ncy4gSXQgc2hvdWxkIGNoYW5nZSAiaW52YWxpZC91bnN1cHBvcnRlZCIgdmFsdWVzIHRvIHRoZQorICogICAgIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlcy4KKyAqICAgLSBUaGlzIGlzIGNvbW11bmljYXRlZCB0byB0aGUgY2xpZW50IGJ5IGNoYW5naW5nIHRoZSBzb3VyY2UgdmFsdWVzIGluIHR1bmUoKS8KKyAqICAgICBjb25maWd1cmUoKS4KKyAqICAgYikgSWYgZmFsbGluZyBiYWNrIHRvIGEgc3VwcG9ydGVkIHZhbHVlIGlzIGFic29sdXRlbHkgaW1wb3NzaWJsZSwgdGhlIGNvbXBvbmVudCBTSEFMTCByZXR1cm4KKyAqICAgICBhbiBlcnJvciBmb3IgdGhlIHNwZWNpZmljIHNldHRpbmcsIGJ1dCBzaG91bGQgY29udGludWUgdG8gYXBwbHkgb3RoZXIgc2V0dGluZ3MuCisgKiAgICAgVE9ETzogdGhpcyBjdXJyZW50bHkgbWF5IHJlc3VsdCBpbiB1bmludGVuZGVkIHJlc3VsdHMuCisgKgorICogKipOT1RFOioqIHVubGlrZSBPTVgsIHBhcmFtcyBhcmUgbm90IHZlcnNpb25lZC4gSW5zdGVhZCwgYSBuZXcgc3RydWN0IHdpdGggbmV3IHBhcmFtIGluZGV4CisgKiBTSEFMTCBiZSBhZGRlZCBhcyBuZXcgdmVyc2lvbnMgYXJlIHJlcXVpcmVkLgorICoKKyAqIFRoZSBwcm9wZXIgc3VidHlwZSAoU2V0dGluZywgSW5mbyBvciBQYXJhbSkgaXMgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNsYXNzIHR5cGUuIERlZmluZSBzdHJ1Y3RzCisgKiB0byBkZWZpbmUgbXVsdGlwbGUgc3VidHlwZWQgdmVyc2lvbnMgb2YgcmVsYXRlZCBwYXJhbWV0ZXJzLgorICoKKyAqID09SW1wbGVtZW50YXRpb24gZGV0YWlsczoKKyAqCisgKiAtIFVzZSBtYWNyb3MgdG8gZGVmaW5lIHBhcmFtZXRlcnMKKyAqIC0gQWxsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAtIFRoaXMgaXMgb25seSB1c2VkIGZvciBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbiBzb3VyY2UgKGUuZy4gd2lsbCBub3QgYmUgdXNlZAorICogICAgIHdoZW4gYnVpbGRpbmcgYSBwYXJhbWV0ZXIgYnkgdGhlIGZyYW1ld29yayBmcm9tIGtleS92YWx1ZSBwYWlycy4pCisgKi8KKworLy8vIFxpbmdyb3VwIGludGVybmFsCisKKy8qKgorICogUGFyYW1ldGVyIGJhc2UgY2xhc3MuCisgKi8KK3N0cnVjdCBDMlBhcmFtIHsKKyAgICAvLyBwYXJhbSBpbmRleCBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gLSBraW5kIChzZXR0aW5nLCB0dW5pbmcsIGluZm8sIHN0cnVjdCkKKyAgICAvLyAtIHNjb3BlCisgICAgLy8gICAtIGRpcmVjdGlvbiAoZ2xvYmFsLCBpbnB1dCwgb3V0cHV0KQorICAgIC8vICAgLSBzdHJlYW0gZmxhZworICAgIC8vICAgLSBzdHJlYW0gSUQgKHVzdWFsbHkgMCkKKyAgICAvLyAtIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdHlwZSAoY29yZSBpbmRleCkKKyAgICAvLyAgIC0gZmxleGlibGUgcGFyYW1ldGVyIGZsYWcKKyAgICAvLyAgIC0gdmVuZG9yIGV4dGVuc2lvbiBmbGFnCisgICAgLy8gICAtIHR5cGUgaW5kZXggKHRoaXMgaW5jbHVkZXMgdGhlIHZlbmRvciBleHRlbnNpb24gZmxhZykKKyAgICAvLworICAgIC8vIGxheW91dDoKKyAgICAvLworICAgIC8vICAgICAgICBraW5kIDogPC0tLS0tLS0gc2NvcGUgLS0tLS0tLT4gOiA8LS0tLS0gY29yZSBpbmRleCAtLS0tLT4KKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tfC0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgICAgIHwga2luZCB8IGRpciB8IC0gfHN0cmVhbXxzdHJlYW1JRHxmbGV4fHZlbmRvcnwgIHR5cGUgaW5kZXggIHwKKyAgICAvLyAgICAgICstLS0tLS0rLS0tLS0rLS0tKy0tLS0tLSstLS0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLSsKKyAgICAvLyAgYml0OiAzMS4uMzAgMjkuMjggICAgICAgMjUgICAyNCAuLiAxNyAgMTYgICAgMTUgICAxNCAgICAuLiAgICAgMAorICAgIC8vCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQzJQYXJhbSBraW5kcywgdXNhYmxlIGFzIGJpdG1hcHMuCisgICAgICovCisgICAgZW51bSBraW5kX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PTkUgICAgPSAwLAorICAgICAgICBTVFJVQ1QgID0gKDEgPDwgMCksCisgICAgICAgIElORk8gICAgPSAoMSA8PCAxKSwKKyAgICAgICAgU0VUVElORyA9ICgxIDw8IDIpLAorICAgICAgICBUVU5JTkcgID0gKDEgPDwgMykgfCBTRVRUSU5HLCAvLyB0dW5pbmdzIGFyZSBzZXR0aW5ncworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyYW1ldGVyIHR5cGUgaW5kZXggc3BlY2lmaWVzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIG9mIGEgcGFyYW1ldGVyIGFzCisgICAgICogYW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlciB0eXBlcyBhcmUgZGl2aWRlZCBpbnRvIHR3byBncm91cHM6IHBsYXRmb3JtIHR5cGVzIGFuZCB2ZW5kb3IgdHlwZXMuCisgICAgICoKKyAgICAgKiBQbGF0Zm9ybSB0eXBlcyBhcmUgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gYW5kIGFyZSBjb21tb24gZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMuCisgICAgICoKKyAgICAgKiBWZW5kb3IgdHlwZXMgYXJlIGRlZmluZWQgYnkgZWFjaCB2ZW5kb3JzLCBzbyB0aGV5IG1heSBkaWZmZXIgYmV0d2VlbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB2ZW5kb3IgdHlwZXMgYmUgdGhlIHNhbWUgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgYnkgYSBzcGVjaWZpYworICAgICAqIHZlbmRvci4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHVpbnQzMl90IHR5cGVfaW5kZXhfdDsKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgVFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQgPSAweDAwMDA4MDAwLCAvLy88IHZlbmRvciBpbmRpY2VzIFNIQUxMIHN0YXJ0IGFmdGVyIHRoaXMKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29yZSBpbmRleCBpcyB0aGUgdW5kZXJseWluZyBwYXJhbWV0ZXIgdHlwZSBmb3IgYSBwYXJhbWV0ZXIuIEl0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAgICogbGF5b3V0IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbXBvbmVudCBvciBwYXJhbWV0ZXIga2luZC9zY29wZS4KKyAgICAgKgorICAgICAqIEl0IGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIGRpc3Rpbmd1aXNoIGdsb2JhbCBwYXJhbWV0ZXJzLCBhbmQgYWxzbyBwYXJhbWV0ZXJzIG9uIGEgZ2l2ZW4KKyAgICAgKiBwb3J0IG9yIHN0cmVhbS4gVGhleSBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHNldCBvZiBnbG9iYWwgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBmb3IgdGhlCisgICAgICogc2V0IG9mIHBhcmFtZXRlcnMgb24gZWFjaCBwb3J0IG9yIGVhY2ggc3RyZWFtLCBidXQgdGhlIHNhbWUgY29yZSBpbmRleCBjYW4gYmUgdXNlZCBmb3IKKyAgICAgKiBwYXJhbWV0ZXJzIG9uIGRpZmZlcmVudCBzdHJlYW1zIG9yIHBvcnRzLCBhcyB3ZWxsIGFzIGZvciBnbG9iYWwgcGFyYW1ldGVycyBhbmQgcG9ydC9zdHJlYW0KKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogTXVsdGlwbGUgcGFyYW1ldGVyIHR5cGVzIGNhbiBzaGFyZSB0aGUgc2FtZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgbGF5b3V0IGZvciBhbGwgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIGNvcmUgaW5kZXggYWNyb3NzIGFsbCBjb21wb25lbnRzIG11c3QKKyAgICAgKiBiZSBpZGVudGljYWwuCisgICAgICovCisgICAgc3RydWN0IENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBJU19GTEVYX0ZMQUcgPSAweDAwMDEwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDIwMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAxRkUwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMTcsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+PiBTVFJFQU1fSURfU0hJRlQsCisgICAgICAgICAgICBTVFJFQU1fTUFTSyAgICAgPSBJU19TVFJFQU1fRkxBRyB8IFNUUkVBTV9JRF9NQVNLLAorCisgICAgICAgICAgICBJU19WRU5ET1JfRkxBRyAgPSAweDAwMDA4MDAwLAorICAgICAgICAgICAgVFlQRV9JTkRFWF9NQVNLID0gMHgwMDAwRkZGRiwKKyAgICAgICAgICAgIENPUkVfTUFTSyAgICAgICA9IFRZUEVfSU5ERVhfTUFTSyB8IElTX0ZMRVhfRkxBRywKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAorICAgICAgICBpbmxpbmUgQ29yZUluZGV4KHVpbnQzMl90IGluZGV4KSA6IG1JbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1ZFTkRPUl9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlciAod2l0aCB2YXJpYWJsZSBzaXplKQorICAgICAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfRkxFWF9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXgKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBhbmQgdGhlIGZsZXhpYmxlIGZsYWcuCisgICAgICAgIGlubGluZSB1aW50MzJfdCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBDT1JFX01BU0s7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgaW5kZXgKKyAgICAgICAgaW5saW5lIHR5cGVfaW5kZXhfdCB0eXBlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBUWVBFX0lOREVYX01BU0s7IH0KKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQ29yZUluZGV4LCBtSW5kZXgsIENPUkVfTUFTSykKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdWludDMyX3QgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGVuY29tcGFzc2VzIHRoZSBwYXJhbWV0ZXIncyBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCBpdHMgc2NvcGUgKHdoZXRoZXIgdGhlCisgICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0pIGFuZCB0aGUgaXRzIGJhc2UKKyAgICAgKiBpbmRleCAod2hpY2ggYWxzbyBkZXRlcm1pbmVzIGl0cyBsYXlvdXQpLgorICAgICAqLworICAgIHN0cnVjdCBUeXBlIDogcHVibGljIENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfR0xPQkFMOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX0lOUFVUOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX09VVFBVVDsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1NUUkVBTV9GTEFHOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5TVFJFQU1fSURfTUFTSyk7IH0KKworICAgICAgICAvLy8gcmV0dXJuIHRoZSBraW5kIChzdHJ1Y3QsIGluZm8sIHNldHRpbmcgb3IgdHVuaW5nKSBvZiB0aGlzIHBhcmFtCisgICAgICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAobUluZGV4ICYgS0lORF9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NUUlVDVDogcmV0dXJuIFNUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfSU5GTzogcmV0dXJuIElORk87CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NFVFRJTkc6IHJldHVybiBTRVRUSU5HOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9UVU5JTkc6IHJldHVybiBUVU5JTkc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PTkU7IC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQzMl90IGluZGV4KSA6IENvcmVJbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoVHlwZSwgbUluZGV4LCB+U1RSRUFNX0lEX01BU0spCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQorICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIEtJTkRfVFVOSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3IgS0lORF9TRVRUSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3IgS0lORF9JTkZPCisgICAgICAgIC8vIGZvciBESVJfR0xPQkFMCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IChvdXRwdXQgPyBESVJfT1VUUFVUIDogRElSX0lOUFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KKworICAgICAgICAvLy8gY29weSBjb25zdHJ1Y3RvcgorICAgICAgICBpbmxpbmUgSW5kZXgoY29uc3QgSW5kZXggJmluZGV4KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW5kZXggd2l0aCBzdHJlYW0gZmllbGQgc2V0IHRvIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhTdHJlYW0odW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorCisgICAgICAgIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhJbmRleCwgbUluZGV4KQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZCwgZS5nLiBkaXJlY3Rpb24gaXMgbm90IHVuZGVmaW5lZCBBTkQKKyAgICAgICAgICogc3RyZWFtIGlzIDAgaWYgbm90IGEgc3RyZWFtIHBhcmFtLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIFR5cGU6OmlzVmFsaWQgKGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhpcyBjaGVjayBjb3VsZCBiZQorICAgICAgICAgICAgLy8gcGVyZm9ybWVkIG9uIHR5cGVzKSBhcyB0aGlzIGlzIG9ubHkgdXNlZCBvbiBpbmRleC4uLgorICAgICAgICAgICAgcmV0dXJuIChmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRCA6IHJhd1N0cmVhbSgpID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBESVJfTUFTSykgIT0gRElSX1VOREVGSU5FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCisgICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIFNUUkVBTV9JRF9NQVNLKSA+PiBTVFJFQU1fSURfU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtSWQgYml0ZmllbGQgZm9yIGEgZ2l2ZW4gfHN0cmVhbXwuIElmIHN0cmVhbSBpcyBpbnZhbGlkLAorICAgICAgICAvLy8gcmV0dXJucyBhbiBpbnZhbGlkIGJpdGZpZWxkLgorICAgICAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IE1ha2VTdHJlYW1JZCh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIC8vIHNhdHVyYXRlIHN0cmVhbSBJRCAobWF4IHZhbHVlIGlzIGludmFsaWQpCisgICAgICAgICAgICBpZiAoc3RyZWFtID4gTUFYX1NUUkVBTV9JRCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBTVFJFQU1fSURfU0hJRlQpICYgU1RSRUFNX0lEX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBjb252ZXJ0VG9TdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5ESVJfTUFTSykgfCBJU19TVFJFQU1fRkxBRzsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1BvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKTsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb0dsb2JhbCgpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKSB8IERJUl9HTE9CQUw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgorICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5TVFJFQU1fSURfTUFTSykgfCBNYWtlU3RyZWFtSWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworcHVibGljOgorICAgIC8vIHB1YmxpYyBnZXR0ZXJzIGZvciBJbmRleCBtZXRob2RzCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWZW5kb3IoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0ZsZXhpYmxlKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZ2xvYmFsIHBhcmFtZXRlciAobm90IGZvciBpbnB1dCBub3Igb3V0cHV0KQorICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0dsb2JhbCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9ySW5wdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvcklucHV0KCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIG91dHB1dCBvciBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yT3V0cHV0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JTdHJlYW0oKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuIF9tSW5kZXguZm9yUG9ydCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgIGlubGluZSB1bnNpZ25lZCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnN0cmVhbSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAvLy8gXHRvZG86IHNob3VsZCB3ZSByZXN0cmljdCB0aGlzIHRvIEMyUGFyYW1GaWVsZD8KKyAgICBpbmxpbmUgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpX21JbmRleDsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgQ29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguY29yZUluZGV4KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5raW5kKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgb3IgMCBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWYWxpZCgpICYmIF9tU2l6ZSA+IDA7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciBib29sKCk7IH0KKworICAgIC8vIGVxdWFsaXR5IGlzIGRvbmUgYnkgbWVtY21wICh1c2UgZXF1YWxzKCkgdG8gcHJldmVudCBhbnkgb3ZlcnJlYWQpCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBlcXVhbHMobykgJiYgbWVtY21wKHRoaXMsICZvLCBfbVNpemUpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0obyk7IH0KKworICAgIC8vLyBzYWZlKHIpIHR5cGUgY2FzdCBmcm9tIHBvaW50ZXIgYW5kIHNpemUKKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW0qIEZyb20odm9pZCAqYWRkciwgc2l6ZV90IGxlbikgeworICAgICAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICAgICAgaWYgKGxlbiA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7CisgICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weShjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIGlmIChvcmlnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB2b2lkICptZW0gPSA6Om9wZXJhdG9yIG5ldyAob3JpZy5zaXplKCkpOworICAgICAgICBDMlBhcmFtICpwYXJhbSA9IG5ldyAobWVtKSBDMlBhcmFtKG9yaWcuc2l6ZSgpLCBvcmlnLl9tSW5kZXgpOworICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShvcmlnKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPihwYXJhbSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBwb3J0IHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1BvcnQoY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBnbG9iYWwgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzR2xvYmFsKGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUCwgY2xhc3M9ZGVjbHR5cGUoQzJQYXJhbShQKCkpKT4KKyAgICBQICpBcygpIHsgcmV0dXJuIFA6OkZyb20odGhpcyk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQPgorICAgIGNvbnN0IFAgKkFzKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBQKj4oUDo6RnJvbShjb25zdF9jYXN0PEMyUGFyYW0qPih0aGlzKSkpOyB9CisjZW5kaWYKKworcHJvdGVjdGVkOgorICAgIC8vLyBzZXRzIHRoZSBzdHJlYW0gZmllbGQuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIC8vLyBzZXRzIHRoZSBwb3J0IChkaXJlY3Rpb24pLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCisgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICByZXR1cm4gX21JbmRleC5zZXRQb3J0KG91dHB1dCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8vIGludmFsaWRhdGUgdGhpcyBwYXJhbWV0ZXIuIFRoZXJlIGlzIG5vIHJlY292ZXJ5IGZyb20gdGhpcyBjYWxsOyBlLmcuIHBhcmFtZXRlcgorICAgIC8vLyBjYW5ub3QgYmUgJ2NvcnJlY3RlZCcgdG8gYmUgdmFsaWQuCisgICAgaW5saW5lIHZvaWQgaW52YWxpZGF0ZSgpIHsgX21TaXplID0gMDsgfQorCisgICAgLy8gaWYgb3RoZXIgaXMgdGhlIHNhbWUga2luZCBvZiAodmFsaWQpIHBhcmFtIGFzIHRoaXMsIGNvcHkgaXQgaW50byB0aGlzIGFuZCByZXR1cm4gdHJ1ZS4KKyAgICAvLyBvdGhlcndpc2UsIGRvIG5vdCBjb3B5IGFueXRoaW5nLCBhbmQgcmV0dXJuIGZhbHNlLgorICAgIGlubGluZSBib29sIHVwZGF0ZUZyb20oY29uc3QgQzJQYXJhbSAmb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLl9tU2l6ZSA8PSBfbVNpemUgJiYgb3RoZXIuX21JbmRleCA9PSBfbUluZGV4ICYmIF9tU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweSh0aGlzLCAmb3RoZXIsIG90aGVyLl9tU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gcmV0dXJucyB8b3wgaWYgaXQgaXMgYSBudWxsIHB0ciwgb3IgaWYgY2FuIHN1aXRhYmx5IGJlIGEgcGFyYW0gb2YgZ2l2ZW4gfHR5cGV8IChlLmcuIGhhcworICAgIC8vIHNhbWUgdHlwZSAoaWdub3Jpbmcgc3RyZWFtIElEKSwgYW5kIHNpemUpLiBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4gSWYgfGNoZWNrRGlyfCBpcyBmYWxzZSwKKyAgICAvLyBhbGxvdyB1bmRlZmluZWQgb3IgZGlmZmVyZW50IGRpcmVjdGlvbiAoZS5nLiBhcyBjb25zdHJ1Y3RlZCBmcm9tIEMyUG9ydFBhcmFtKCkgdnMuCisgICAgLy8gQzJQb3J0UGFyYW06OmlucHV0KSwgYnV0IHN0aWxsIHJlcXVpcmUgZXF1aXZhbGVudCB0eXBlIChzdHJlYW0sIHBvcnQgb3IgZ2xvYmFsKTsgb3RoZXJ3aXNlLAorICAgIC8vIHJldHVybiBudWxsLgorICAgIGlubGluZSBzdGF0aWMgY29uc3QgQzJQYXJhbSogSWZTdWl0YWJsZSgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0qIG8sIHNpemVfdCBzaXplLCBUeXBlIHR5cGUsIHNpemVfdCBmbGV4U2l6ZSA9IDAsIGJvb2wgY2hlY2tEaXIgPSB0cnVlKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIgfHwgby0+X21TaXplIDwgc2l6ZSB8fCAoZmxleFNpemUgJiYgKChvLT5fbVNpemUgLSBzaXplKSAlIGZsZXhTaXplKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrRGlyKSB7CisgICAgICAgICAgICByZXR1cm4gby0+X21JbmRleC50eXBlKCkgPT0gdHlwZS5tSW5kZXggPyBvIDogbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChvLT5fbUluZGV4LmlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoby0+X21JbmRleC50eXBlKCkgXiB0eXBlLm1JbmRleCkgJiB+VHlwZTo6RElSX01BU0spID8gbnVsbHB0ciA6IG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXgpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGJhc2UgY29uc3RydWN0b3Igd2l0aCBzdHJlYW0gc2V0CisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4LCB1bnNpZ25lZCBzdHJlYW0pCisgICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgX21JbmRleChwYXJhbUluZGV4IHwgSW5kZXg6Ok1ha2VTdHJlYW1JZChzdHJlYW0pKSB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHxvfCBoYXMgdGhlIHNhbWUgc2l6ZSBhbmQgaW5kZXggYXMgdGhpcy4gVGhpcyBwZXJmb3JtcyB0aGUKKyAgICAvLy8gYmFzaWMgY2hlY2sgZm9yIGVxdWFsaXR5LgorICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVNpemUgPT0gby5fbVNpemUgJiYgX21JbmRleCA9PSBvLl9tSW5kZXg7CisgICAgfQorCisgICAgdWludDMyX3QgX21TaXplOworICAgIEluZGV4IF9tSW5kZXg7Cit9OworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBhbGxvdyBDMlBhcmFtcyBhY2Nlc3MgdG8gcHJpdmF0ZSBtZXRob2RzLCBlLmcuIGNvbnN0cnVjdG9ycworI2RlZmluZSBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgXAorCisvKioKKyAqIFNldHRpbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmcgOiBwdWJsaWMgQzJQYXJhbSB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTZXR0aW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfU0VUVElORyB9OworfTsKKworLyoqCisgKiBUdW5pbmcgYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMlR1bmluZyA6IHB1YmxpYyBDMlNldHRpbmcgeworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyVHVuaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlNldHRpbmcoYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9UVU5JTkcgfTsKK307CisKKy8qKgorICogSW5mbyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMySW5mbyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkluZm8oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9JTkZPIH07Cit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgZmllbGQgaW4gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KKyAqCisgKiBcbm90ZSBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGRpZmZlcmVudGx5IGluIEMyRmllbGREZXNjcmlwdG9yIHRvCisgKiBpZGVudGlmeSBhcnJheSBmaWVsZHMsIHN1Y2ggdGhhdCBfbVNpemUgaXMgdGhlIHNpemUgb2YgZWFjaCBlbGVtZW50LiBUaGlzIGlzCisgKiBiZWNhdXNlIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBhcnJheS1sZW5ndGgsIGFuZCB3ZSB3YW50IHRvIGtlZXAKKyAqIGEgcmVsZXZhbnQgZWxlbWVudCBzaXplIGZvciB2YXJpYWJsZSBsZW5ndGggYXJyYXlzLgorICovCitzdHJ1Y3QgX0MyRmllbGRJZCB7CisvL3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciBDMkZpZWxkRGVzY3JpcHRvciB0aGF0IHJlbW92ZXMgdGhlIGFycmF5IGV4dGVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IHBvaW50ZXIgdG8gdGhlIGZpZWxkIGluIGFuIG9iamVjdCBhdCBhZGRyZXNzIDAuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVCogb2Zmc2V0KQorICAgICAgICA6IC8vIG9mZnNldCBpcyBmcm9tICIwIiBzbyB3aWxsIGZpdCBvbiAzMi1iaXRzCisgICAgICAgICAgX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKG9mZnNldCkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogRGlyZWN0IGNvbnN0cnVjdG9yIGZyb20gb2Zmc2V0IGFuZCBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KKyAgICAgKiBccGFyYW1baW5dIHNpemUgc2l6ZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgaW5saW5lIF9DMkZpZWxkSWQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX21PZmZzZXQob2Zmc2V0KSwgX21TaXplKHNpemUpIHt9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIFVbdHlwZV0gcG9pbnRlciB0byB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUKKyAgICAgKiAgICAgICAgZmllbGQgaXMgaW4gYW4gKGluaGVyaXRlZCkgYmFzZSBjbGFzcywgaW4gd2hpY2ggY2FzZSBUIHdpbGwgYmUgdGhhdCBiYXNlIGNsYXNzLgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoVSAqLCBSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChVKikyNTYpLT4qcG0pKSAtIDI1NnUpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwbVtpbV0gbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uj46OnR5cGU+CisgICAgaW5saW5lIF9DMkZpZWxkSWQoUiBUOjoqIHBtKQorICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVCopMCktPipwbSkpKSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA9PSBvdGhlci5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU9mZnNldCA8IG90aGVyLl9tT2Zmc2V0IHx8CisgICAgICAgICAgICAvLyBOT1RFOiBvcmRlciBwYXJlbnQgc3RydWN0dXJlIGJlZm9yZSBzdWIgZmllbGQKKyAgICAgICAgICAgIChfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPiBvdGhlci5fbVNpemUpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhfQzJGaWVsZElkKQorCisjaWYgMAorICAgIGlubGluZSB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBfbU9mZnNldDsgfQorICAgIGlubGluZSB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisjZW5kaWYKKworI2lmIGRlZmluZWQoRlJJRU5EX1RFU1QpCisgICAgZnJpZW5kIHZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZkLCA6OnN0ZDo6b3N0cmVhbSopOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKyAgICBmcmllbmQgc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOworCisgICAgdWludDMyX3QgX21PZmZzZXQ7IC8vIG9mZnNldCBvZiBmaWVsZAorICAgIHVpbnQzMl90IF9tU2l6ZTsgICAvLyBzaXplIG9mIGZpZWxkCit9OworCisvKioKKyAqIFN0cnVjdHVyZSB1bmlxdWVseSBzcGVjaWZ5aW5nIGEgJ2ZpZWxkJyBpbiBhIGNvbmZpZ3VyYXRpb24uIFRoZSBmaWVsZAorICogY2FuIGJlIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLCBhIHN1YmZpZWxkIG9mIGEgZmllbGQgb2YgYSBjb25maWd1cmF0aW9uLAorICogYW5kIGV2ZW4gdGhlIHdob2xlIGNvbmZpZ3VyYXRpb24uIE1vcmVvdmVyLCBpZiB0aGUgZmllbGQgY2FuIHBvaW50IHRvIGFuCisgKiBlbGVtZW50IGluIGEgYXJyYXkgZmllbGQsIG9yIHRvIHRoZSBlbnRpcmUgYXJyYXkgZmllbGQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcXVlcnlpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCwgYXMgd2VsbAorICogYXMgY29tbXVuaWNhdGluZyBjb25maWd1cmF0aW9uIGZhaWx1cmVzIGFuZCBjb25mbGljdHMgd2hlbiB0cnlpbmcgdG8gY2hhbmdlCisgKiBhIGNvbmZpZ3VyYXRpb24gZm9yIGEgY29tcG9uZW50L2ludGVyZmFjZSBvciBhIHN0b3JlLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdXNpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLAorICAgICAqIGFuZCBhIHBvaW50ZXIgdG8gbWVtYmVyLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIHN0cnVjdCBDMlNvbWVQYXJhbSB7CisgICAgICogICB1aW50MzJfdCBtRmllbGQ7CisgICAgICogICB1aW50MzJfdCBtQXJyYXlbMl07CisgICAgICogICBDMk90aGVyU3RydWN0IG1TdHJ1Y3Q7CisgICAgICogICB1aW50MzJfdCBtRmxleEFycmF5W107CisgICAgICogfSAqbVBhcmFtOworICAgICAqCisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZpZWxkKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tQXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheVswXSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bVN0cnVjdC5tU3ViRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXkpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GbGV4QXJyYXlbMl0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHRvZG8gZml4IHdoYXQgdGhpcyBpcyBmb3IgVFtdIChmb3Igbm93IHNpemUgYmVjb21lcyBUWzFdKQorICAgICAqCisgICAgICogXG5vdGUgdGhpcyBkb2VzIG5vdCB3b3JrIGZvciA2NC1iaXQgbWVtYmVycyBhcyBpdCB0cmlnZ2VycyBhCisgICAgICogJ3Rha2luZyBhZGRyZXNzIG9mIHBhY2tlZCBtZW1iZXInIHdhcm5pbmcuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG1lbWJlciBwb2ludGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtLCBUKiBvZmZzZXQpCisgICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZElkKChUKikoKHVpbnRwdHJfdClvZmZzZXQgLSAodWludHB0cl90KXBhcmFtKSkge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtRmllbGQgTWFrZShTJiBwYXJhbSwgVCYgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQocGFyYW0uaW5kZXgoKSwgKHVpbnRwdHJfdCkmb2Zmc2V0IC0gKHVpbnRwdHJfdCkmcGFyYW0sIHNpemVvZihUKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgbWVtYmVyIHBvaW50ZXIuIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFuCisgICAgICogYXJyYXkgZWxlbWVudCBvciBhIHN1YmZpZWxkLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIEMyU29tZVBhcmFtIG1QYXJhbTsKKyAgICAgKiBDMlBhcmFtRmllbGQoJm1QYXJhbSwgJkMyU29tZVBhcmFtOjptTWVtYmVyRmllbGQpOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHAgcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gVCBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQgbWVtYmVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFUgKnAsIFIgVDo6KiBwbSkgOiBfbUluZGV4KHAtPmluZGV4KCkpLCBfbUZpZWxkSWQocCwgcG0pIHsgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB0byBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSkuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChTKiBwYXJhbSkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwgX21GaWVsZElkKDB1LCBwYXJhbS0+c2l6ZSgpKSB7IH0KKworICAgIC8qKiBDb3B5IGNvbnN0cnVjdG9yLiAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRXF1YWxpdHkgb3BlcmF0b3IuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkID09IG90aGVyLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21JbmRleCA8IG90aGVyLl9tSW5kZXggfHwKKyAgICAgICAgICAgIChfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkIDwgb3RoZXIuX21GaWVsZElkKTsKKyAgICB9CisKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQzJQYXJhbUZpZWxkKQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7fQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBDMlBhcmFtOjpJbmRleCBfbUluZGV4OyAvLy88IHBhcmFtZXRlciBpbmRleAorICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vLzwgZmllbGQgaWRlbnRpZmllcgorfTsKKworLyoqCisgKiBBIHNoYXJlZCAodW5pb24pIHJlcHJlc2VudGF0aW9uIG9mIG51bWVyaWMgdmFsdWVzCisgKi8KK2NsYXNzIEMyVmFsdWUgeworcHVibGljOgorICAgIC8vLyBBIHVuaW9uIG9mIHN1cHBvcnRlZCBwcmltaXRpdmUgdHlwZXMuCisgICAgdW5pb24gUHJpbWl0aXZlIHsKKyAgICAgICAgLy8gZmlyc3QgbWVtYmVyIGlzIGFsd2F5cyB6ZXJvIGluaXRpYWxpemVkIHNvIGl0IG11c3QgYmUgdGhlIGxhcmdlc3QKKyAgICAgICAgdWludDY0X3QgICAgdTY0OyAgIC8vLzwgdWludDY0X3QgdmFsdWUKKyAgICAgICAgaW50NjRfdCAgICAgaTY0OyAgIC8vLzwgaW50NjRfdCB2YWx1ZQorICAgICAgICBjMl9jbnRyNjRfdCBjNjQ7ICAgLy8vPCBjMl9jbnRyNjRfdCB2YWx1ZQorICAgICAgICB1aW50MzJfdCAgICB1MzI7ICAgLy8vPCB1aW50MzJfdCB2YWx1ZQorICAgICAgICBpbnQzMl90ICAgICBpMzI7ICAgLy8vPCBpbnQzMl90IHZhbHVlCisgICAgICAgIGMyX2NudHIzMl90IGMzMjsgICAvLy88IGMyX2NudHIzMl90IHZhbHVlCisgICAgICAgIGZsb2F0ICAgICAgIGZwOyAgICAvLy88IGZsb2F0IHZhbHVlCisKKyAgICAgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ2NF90IHZhbHVlKSAgICA6IHU2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQ2NF90IHZhbHVlKSAgICAgOiBpNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjY0X3QgdmFsdWUpIDogYzY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQzMl90IHZhbHVlKSAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShpbnQzMl90IHZhbHVlKSAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoYzJfY250cjMyX3QgdmFsdWUpIDogYzMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKHVpbnQ4X3QgdmFsdWUpICAgICA6IHUzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjaGFyIHZhbHVlKSAgICAgICAgOiBpMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoZmxvYXQgdmFsdWUpICAgICAgIDogZnAodmFsdWUpICB7IH0KKworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBlbnVtIHR5cGUKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08RT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgUHJpbWl0aXZlKEUgdmFsdWUpCisgICAgICAgICAgICA6IFByaW1pdGl2ZShzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZT4odmFsdWUpKSB7IH0KKworICAgICAgICBQcmltaXRpdmUoKSA6IHU2NCgwKSB7IH0KKworICAgICAgICAvKiogZ2V0cyB2YWx1ZSBvdXQgb2YgdGhlIHVuaW9uICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQgJnJlZigpIGNvbnN0OworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBhc3N1bWUgc3RhbmRhcmQgYWxpYXNpbmcKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTY0KSA9PSBzaXplb2YoaTY0KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihjNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHUzMikgPT0gc2l6ZW9mKGkzMiksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoYzMyKSwgIiIpOworICAgIH07CisgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1NjQpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzY0KSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgaTMyKSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoUHJpbWl0aXZlLCB1MzIpID09IG9mZnNldG9mKFByaW1pdGl2ZSwgYzMyKSwgIiIpOworCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIE5PX0lOSVQsCisgICAgICAgIElOVDMyLAorICAgICAgICBVSU5UMzIsCisgICAgICAgIENOVFIzMiwKKyAgICAgICAgSU5UNjQsCisgICAgICAgIFVJTlQ2NCwKKyAgICAgICAgQ05UUjY0LAorICAgICAgICBGTE9BVCwKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IFR5cGVGb3IoKSB7CisgICAgICAgIHVzaW5nIFUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZTsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VT4oKTsKKyAgICB9CisKKyAgICAvLyBkZXByZWN0YXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgQiA9IHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgdHlwZV90IHR5cGVGb3IoKSB7CisgICAgICAgIHJldHVybiBUeXBlRm9yPFQsIEI+KCk7CisgICAgfQorCisgICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyVmFsdWUoVCB2YWx1ZSkgIDogX21UeXBlKHR5cGVGb3I8VD4oKSksIF9tVmFsdWUodmFsdWUpIHsgfQorCisgICAgQzJWYWx1ZSgpIDogX21UeXBlKE5PX0lOSVQpIHsgfQorCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBib29sIGdldChUICp2YWx1ZSkgY29uc3QgeworICAgICAgICBpZiAoX21UeXBlID09IHR5cGVGb3I8VD4oKSkgeworICAgICAgICAgICAgKnZhbHVlID0gX21WYWx1ZS5yZWY8VD4oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUKKyAgICB2b2lkICpnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVR5cGUgPT0gTk9fSU5JVCA/IG51bGxwdHIgOiAodm9pZCopJl9tVmFsdWU7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZQorICAgIHNpemVfdCBpbmxpbmUgc2l6ZU9mKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU2l6ZUZvcihfbVR5cGUpOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QgU2l6ZUZvcih0eXBlX3QgdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSU5UMzI6CisgICAgICAgICAgICBjYXNlIFVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQ05UUjMyOiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGNhc2UgSU5UNjQ6CisgICAgICAgICAgICBjYXNlIFVJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQ05UUjY0OiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuaTY0KTsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5mcCk7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB0eXBlX3QgX21UeXBlOworICAgIFByaW1pdGl2ZSBfbVZhbHVlOworfTsKKwordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiBpMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gaTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50MzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gdTMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB1aW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8dWludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gdTY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyMzJfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjMyX3Q+KCkgY29uc3QgeyByZXR1cm4gYzMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBjMl9jbnRyNjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8YzJfY250cjY0X3Q+KCkgY29uc3QgeyByZXR1cm4gYzY0OyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBmbG9hdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8ZmxvYXQ+KCkgY29uc3QgeyByZXR1cm4gZnA7IH0KKworLy8gcHJvdmlkZSB0eXBlcyBmb3IgZW51bXMgYW5kIHVpbnQ4X3QsIGNoYXIgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgcHJvdmlkZSByZWFkaW5nIGFzIHRoZW0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGNoYXIsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQzMl90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gSU5UNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQ4X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIFVJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFIzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8YzJfY250cjY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIENOVFI2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8ZmxvYXQsIGZhbHNlPigpIHsgcmV0dXJuIEZMT0FUOyB9CisKKy8vIGZvcndhcmQgZGVjbGFyZSBlYXN5IGVudW0gdGVtcGxhdGUKK3RlbXBsYXRlPHR5cGVuYW1lIEU+IHN0cnVjdCBDMkVhc3lFbnVtOworCisvKioKKyAqIGZpZWxkIGRlc2NyaXB0b3IuIEEgZmllbGQgaXMgdW5pcXVlbHkgZGVmaW5lZCBieSBhbiBpbmRleCBpbnRvIGEgcGFyYW1ldGVyLgorICogKE5vdGU6IFN0cmVhbS1pZCBpcyBub3QgY2FwdHVyZWQgYXMgYSBmaWVsZC4pCisgKgorICogT3JkZXJpbmcgb2YgZmllbGRzIGlzIGJ5IG9mZnNldC4gSW4gY2FzZSBvZiBzdHJ1Y3R1cmVzLCBpdCBpcyBkZXB0aCBmaXJzdCwKKyAqIHdpdGggYSBzdHJ1Y3R1cmUgdGFraW5nIGFuIGluZGV4IGp1c3QgYmVmb3JlIGFuZCBpbiBhZGRpdGlvbiB0byBpdHMgbWVtYmVycy4KKyAqLworc3RydWN0IEMyRmllbGREZXNjcmlwdG9yIHsKKy8vcHVibGljOgorICAgIC8qKiBmaWVsZCB0eXBlcyBhbmQgZmxhZ3MKKyAgICAgKiBcbm90ZTogb25seSAzMi1iaXQgYW5kIDY0LWJpdCBmaWVsZHMgYXJlIHN1cHBvcnRlZCAoZS5nLiBubyBib29sZWFuLCBhcyB0aGF0CisgICAgICogaXMgcmVwcmVzZW50ZWQgdXNpbmcgSU5UMzIpLgorICAgICAqLworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICAvLyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgSU5UMzIgICA9IEMyVmFsdWU6OklOVDMyLCAgLy8vPCAzMi1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDMyICA9IEMyVmFsdWU6OlVJTlQzMiwgLy8vPCAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcgorICAgICAgICBDTlRSMzIgID0gQzJWYWx1ZTo6Q05UUjMyLCAvLy88IDMyLWJpdCBjb3VudGVyCisgICAgICAgIElOVDY0ICAgPSBDMlZhbHVlOjpJTlQ2NCwgIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIFVJTlQ2NCAgPSBDMlZhbHVlOjpVSU5UNjQsIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFI2NCAgPSBDMlZhbHVlOjpDTlRSNjQsIC8vLzwgNjQtYml0IGNvdW50ZXIKKyAgICAgICAgRkxPQVQgICA9IEMyVmFsdWU6OkZMT0FULCAgLy8vPCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQKKworICAgICAgICAvLyBhcnJheSB0eXBlcworICAgICAgICBTVFJJTkcgPSAweDEwMCwgLy8vPCBmaXhlZC1zaXplIHN0cmluZyAoUE9EKQorICAgICAgICBCTE9CLCAgICAgICAgICAgLy8vPCBibG9iLiBCbG9icyBoYXZlIG5vIHN1Yi1lbGVtZW50cyBhbmQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYnl0ZSBhcnJheXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvd2V2ZXIsIGJ5dGVzIGNhbm5vdCBiZSBpbmRpdmlkdWFsbHkgYWRkcmVzc2VkIGJ5IGNsaWVudHMuCisKKyAgICAgICAgLy8gY29tcGxleCB0eXBlcworICAgICAgICBTVFJVQ1RfRkxBRyA9IDB4MjAwMDAsIC8vLzwgc3RydWN0cy4gTWFya2VkIHdpdGggdGhpcyBmbGFnIGluIGFkZGl0aW9uIHRvIHRoZWlyIGNvcmVJbmRleC4KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8QzJTdHJpbmcsIEMyVmFsdWU6OlByaW1pdGl2ZT4gTmFtZWRWYWx1ZVR5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxOYW1lZFZhbHVlVHlwZT4gTmFtZWRWYWx1ZXNUeXBlOworICAgIC8vdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8QzJTdHJpbmc+LCBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+PiBOYW1lZFZhbHVlc1R5cGU7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWVkIHZhbHVlcyBmb3IgYSB0eXBlLgorICAgICAqCisgICAgICogXHRvZG8gaGlkZSBmcm9tIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2YgbmFtZS12YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorICAgIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQiAmKTsKKworICAgIC8qKiBzcGVjaWFsaXphdGlvbiBmb3IgZWFzeSBlbnVtcyAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgaW5saW5lIHN0YXRpYyBOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXNGb3IoY29uc3QgQzJFYXN5RW51bTxFPiAmKSB7CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlc0ZvcigqKEUqKW51bGxwdHIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCLCBib29sIGVuYWJsZWQ9c3RkOjppc19hcml0aG1ldGljPEI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX2VudW08Qj46OnZhbHVlPgorICAgIHN0cnVjdCBDMl9ISURFIF9OYW1lZFZhbHVlc0dldHRlcjsKKworcHVibGljOgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcih1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBleHRlbnQsIEMyU3RyaW5nIG5hbWUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9tVHlwZSgodHlwZV90KXR5cGUpLCBfbUV4dGVudChleHRlbnQpLCBfbU5hbWUobmFtZSksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpID0gZGVmYXVsdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBUKiBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbU5hbWVkVmFsdWVzKF9OYW1lZFZhbHVlc0dldHRlcjxCPjo6Z2V0TmFtZWRWYWx1ZXMoKSksCisgICAgICAgICAgX21GaWVsZElkKG9mZnNldCkge30KKworLyoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I8VCwgQiwgZmFsc2U+KFQqIG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRmllbGRJZChvZmZzZXQpIHt9CisqLworCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKFMqLCBUIFM6OiogZmllbGQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbUZpZWxkSWQoJigoKFMqKTApLT4qZmllbGQpKSB7fQorCisgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAvLy8gVFtdIGFycmF5cywgcmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgaW5saW5lIHNpemVfdCBleHRlbnQoKSBjb25zdCB7IHJldHVybiBfbUV4dGVudDsgfQorICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gX21OYW1lZFZhbHVlczsgfQorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIDo6c3RkOjpvc3RyZWFtKik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKTsKKyAgICBGUklFTkRfVEVTVChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBvZmZzZXRlZCBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZGVzYywgc2l6ZV90IG9mZnNldCkKKyAgICAgICAgOiBfbVR5cGUoZGVzYy5fbVR5cGUpLCBfbUV4dGVudChkZXNjLl9tRXh0ZW50KSwKKyAgICAgICAgICBfbU5hbWUoZGVzYy5fbU5hbWUpLCBfbU5hbWVkVmFsdWVzKGRlc2MuX21OYW1lZFZhbHVlcyksCisgICAgICAgICAgX21GaWVsZElkKGRlc2MuX21GaWVsZElkLl9tT2Zmc2V0ICsgb2Zmc2V0LCBkZXNjLl9tRmllbGRJZC5fbVNpemUpIHsgfQorCisgICAgdHlwZV90IF9tVHlwZTsKKyAgICB1aW50MzJfdCBfbUV4dGVudDsgLy8gdGhlIGxhc3QgbWVtYmVyIGNhbiBiZSBhcmJpdHJhcnkgbGVuZ3RoIGlmIGl0IGlzIFRbXSBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHBhcmFtZXRlciAodGhpcyBpcyBtYXJrZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAvLyAwKS4gVFswXS1zIGFyZSBub3QgZmllbGRzLgorICAgIEMyU3RyaW5nIF9tTmFtZTsKKyAgICBOYW1lZFZhbHVlc1R5cGUgX21OYW1lZFZhbHVlczsKKworICAgIF9DMkZpZWxkSWQgX21GaWVsZElkOyAgIC8vIGZpZWxkIGlkZW50aWZpZXIgKG9mZnNldCBhbmQgc2l6ZSkKKworICAgIC8vIE5PVEU6IFdlIGRvIG5vdCBjYXB0dXJlIGRlZmF1bHQgdmFsdWUocykgaGVyZSBhcyB0aGF0IG1heSBkZXBlbmQgb24gdGhlIGNvbXBvbmVudC4KKyAgICAvLyBOT1RFOiBXZSBhbHNvIGRvIG5vdCBjYXB0dXJlIGJlc3RFZmZvcnQsIGFzIDEpIHRoaXMgc2hvdWxkIGJlIHRydWUgZm9yIG1vc3QgZmllbGRzLAorICAgIC8vIDIpIHRoaXMgaXMgYXQgcGFyYW1ldGVyIGdyYW51bGFyaXR5LgorCisgICAgLy8gdHlwZSByZXNvbHV0aW9uCisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShpbnQzMl90KikgICAgIHsgcmV0dXJuIElOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50MzJfdCopICAgIHsgcmV0dXJuIFVJTlQzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoYzJfY250cjMyX3QqKSB7IHJldHVybiBDTlRSMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDY0X3QqKSAgICAgeyByZXR1cm4gSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ2NF90KikgICAgeyByZXR1cm4gVUlOVDY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyNjRfdCopIHsgcmV0dXJuIENOVFI2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoZmxvYXQqKSAgICAgICB7IHJldHVybiBGTE9BVDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoY2hhciopICAgICAgICB7IHJldHVybiBTVFJJTkc7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQ4X3QqKSAgICAgeyByZXR1cm4gQkxPQjsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBjbGFzcz10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlPjo6dHlwZT4KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKFQqKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHVuZGVybHlpbmcoMCk7CisgICAgICAgIHJldHVybiBHZXRUeXBlKCZ1bmRlcmx5aW5nKTsKKyAgICB9CisKKyAgICAvLyB2ZXJpZnkgQzJTdHJ1Y3QgYnkgaGF2aW5nIGEgRmllbGRMaXN0KCkgYW5kIGEgQ09SRV9JTkRFWC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPWRlY2x0eXBlKFQ6OkNPUkVfSU5ERVggKyAxKSwgY2xhc3M9ZGVjbHR5cGUoVDo6RmllbGRMaXN0KCkpPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19iYXNlX29mPEMyUGFyYW0sIFQ+Ojp2YWx1ZSwgImNhbm5vdCB1c2UgQzJQYXJhbXMgYXMgZmllbGRzIik7CisgICAgICAgIHJldHVybiAodHlwZV90KShUOjpDT1JFX0lOREVYIHwgU1RSVUNUX0ZMQUcpOworICAgIH0KKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCisvLyBubyBuYW1lZCB2YWx1ZXMgZm9yIGNvbXBvdW5kIHR5cGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgZmFsc2U+IHsKKyAgICBpbmxpbmUgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgZ2V0TmFtZWRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBOYW1lZFZhbHVlc1R5cGUoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBCPgorc3RydWN0IEMyRmllbGREZXNjcmlwdG9yOjpfTmFtZWRWYWx1ZXNHZXR0ZXI8QiwgdHJ1ZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKEIqKW51bGxwdHIpOworICAgIH0KK307CisKKyNkZWZpbmUgREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodHlwZSkgXAordGVtcGxhdGU8PiBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgdHlwZSAmKSB7IFwKKyAgICByZXR1cm4gTmFtZWRWYWx1ZXNUeXBlKCk7IFwKK30KKworLy8gV2UgY2Fubm90IHN1YnR5cGUgY29uc3RydWN0b3IgZm9yIGVudW1lcmF0ZWQgdHlwZXMgc28gaW5zdGVkIGRlZmluZSBubyBuYW1lZCB2YWx1ZXMgZm9yCisvLyBub24tZW51bWVyYXRlZCBpbnRlZ3JhbCB0eXBlcy4KK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGMyX2NudHIzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50NjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50OF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoY2hhcikKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGZsb2F0KQorCisvKioKKyAqIERlc2NyaWJlcyB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgQzJTdHJ1Y3REZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvLy8gUmV0dXJucyB0aGUgY29yZSBpbmRleCBvZiB0aGUgc3RydWN0CisgICAgaW5saW5lIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBfbVR5cGUuY29yZUluZGV4KCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCisgICAgLy8gTXVzdCBiZSBhdCBsZWFzdCAxIGZvciB2YWxpZCBzdHJ1Y3RzLgorICAgIGlubGluZSBzaXplX3QgbnVtRmllbGRzKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuc2l6ZSgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGRpcmVjdCBmaWVsZHMgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXJhdG9yOworICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jYmVnaW4oKTsgfQorICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICAvLyBvbmx5IHN1cHBseWluZyBjb25zdCBpdGVyYXRvciAtIGJ1dCB0aGVzZSBuYW1lcyBhcmUgbmVlZGVkIGZvciByYW5nZSBiYXNlZCBsb29wcworICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNlbmQoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKFQqKQorICAgICAgICA6IEMyU3RydWN0RGVzY3JpcHRvcihUOjpDT1JFX0lOREVYLCBUOjpGaWVsZExpc3QoKSkgeyB9CisKKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJmZpZWxkcykKKyAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKGZpZWxkcykgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykKKyAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKHN0ZDo6bW92ZShmaWVsZHMpKSB7IH0KKworICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBfbVR5cGU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9tRmllbGRzOworfTsKKworLyoqCisgKiBEZXNjcmliZXMgcGFyYW1ldGVycyBmb3IgYSBjb21wb25lbnQuCisgKi8KK3N0cnVjdCBDMlBhcmFtRGVzY3JpcHRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHNldHRpbmcgdGhpcyBwYXJhbSBpcyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhpcyBjb21wb25lbnQuCisgICAgICogVGhpcyBjYW4gb25seSBiZSB0cnVlIGZvciBidWlsdGluIHBhcmFtcyBmb3IgcGxhdGZvcm0tZGVmaW5lZCBjb21wb25lbnRzIChlLmcuIHZpZGVvIGFuZAorICAgICAqIGF1ZGlvIGVuY29kZXJzL2RlY29kZXJzLCB2aWRlby9hdWRpbyBmaWx0ZXJzKS4KKyAgICAgKiBGb3IgdmVuZG9yLWRlZmluZWQgY29tcG9uZW50cywgaXQgY2FuIGJlIHRydWUgZXZlbiBmb3IgdmVuZG9yLWRlZmluZWQgcGFyYW1zLAorICAgICAqIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWQsIGluIGNhc2UgdGhlIGNvbXBvbmVudCBiZWNvbWVzIHBsYXRmb3JtLWRlZmluZWQuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUkVRVUlSRUQ7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBwZXJzaXN0ZW50LiBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBDMlR1bmluZyBhbmQgQzJTZXR0aW5nLAorICAgICAqIGJ1dCBtYXkgYmUgZmFsc2UgZm9yIEMySW5mby4gSWYgdHJ1ZSwgdGhpcyBwYXJhbWV0ZXIgcGVyc2lzdHMgYWNyb3NzIGZyYW1lcyBhbmQgYXBwbGllcyB0bworICAgICAqIHRoZSBjdXJyZW50IGFuZCBzdWJzZXF1ZW50IGZyYW1lcy4gSWYgZmFsc2UsIHRoaXMgQzJJbmZvIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gdGhlCisgICAgICogY3VycmVudCBmcmFtZSBhbmQgaXMgbm90IGFzc3VtZWQgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSAob3IgZXZlbiBiZSBwcmVzZW50KSBvbiBzdWJzZXF1ZW50CisgICAgICogZnJhbWVzLCB1bmxlc3MgaXQgaXMgc3BlY2lmaWVkIGZvciB0aG9zZSBmcmFtZXMuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNQZXJzaXN0ZW50KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19QRVJTSVNURU5UOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1N0cmljdCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfU1RSSUNUOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRUFEX09OTFk7IH0KKworICAgIGlubGluZSBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuICEoX21BdHRyaWIgJiBJU19ISURERU4pOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1B1YmxpYygpIGNvbnN0IHsgcmV0dXJuICEoX21BdHRyaWIgJiBJU19JTlRFUk5BTCk7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW0uCisgICAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHVuZGVybHlpbmcgQzJTdHJ1Y3QncyBuYW1lLCBidXQgY291bGQgYmUgYWx0ZXJlZCBmb3IgYSBjb21wb25lbnQuCisgICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgaW5kZXgKKyAgICBpbmxpbmUgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBfbUluZGV4OyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5kaWNlcyBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaGFzIGEgZGVwZW5kZW5jeSBvbgorICAgIGlubGluZSBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmRlcGVuZGVuY2llcygpIGNvbnN0IHsgcmV0dXJuIF9tRGVwZW5kZW5jaWVzOyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcihib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBjb25zdCBUKikKKyAgICAgICAgOiBfbUluZGV4KFQ6OlBBUkFNX1RZUEUpLAorICAgICAgICAgIF9tQXR0cmliKElTX1BFUlNJU1RFTlQgfCAoaXNSZXF1aXJlZCA/IElTX1JFUVVJUkVEIDogMCkpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyUGFyYW06OkluZGV4IGluZGV4KQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKElTX1BFUlNJU1RFTlQgfCAoaXNSZXF1aXJlZCA/IElTX1JFUVVJUkVEIDogMCkpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIGVudW0gYXR0cmliX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvbgorICAgICAgICBJU19SRVFVSVJFRCAgID0gMXUgPDwgMCwgLy8vPCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkCisgICAgICAgIElTX1BFUlNJU1RFTlQgPSAxdSA8PCAxLCAvLy88IHBhcmFtZXRlciByZXRhaW5zIGl0cyB2YWx1ZQorICAgICAgICAvLyBmbGFncyB0aGF0IGRlZmF1bHQgb2ZmCisgICAgICAgIElTX1NUUklDVCAgICAgPSAxdSA8PCAyLCAvLy88IHBhcmFtZXRlciBpcyBzdHJpY3QKKyAgICAgICAgSVNfUkVBRF9PTkxZICA9IDF1IDw8IDMsIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IHJlYWQtb25seQorICAgICAgICBJU19ISURERU4gICAgID0gMXUgPDwgNCwgLy8vPCBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHZpc2libGUgdG8gY2xpZW50cworICAgICAgICBJU19JTlRFUk5BTCAgID0gMXUgPDwgNSwgLy8vPCBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHVzZWQgYnkgZnJhbWV3b3JrIChvdGhlciB0aGFuIHRlc3RpbmcpCisgICAgICAgIElTX0NPTlNUICAgICAgPSAxdSA8PCA2IHwgSVNfUkVBRF9PTkxZLCAvLy88IHBhcmFtZXRlciBpcyBwdWJsaWNseSBjb25zdCAoaGVuY2UgcmVhZC1vbmx5KQorICAgIH07CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgYXR0cmliX3QgYXR0cmliLCBDMlN0cmluZyAmJm5hbWUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmJmRlcGVuZGVuY2llcykKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihhdHRyaWIpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbURlcGVuZGVuY2llcyhzdGQ6Om1vdmUoZGVwZW5kZW5jaWVzKSkgeyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggX21JbmRleDsKKyAgICBjb25zdCB1aW50MzJfdCBfbUF0dHJpYjsKKyAgICBjb25zdCBDMlN0cmluZyBfbU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IF9tRGVwZW5kZW5jaWVzOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyg6OkMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCkKKworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBDT1JFX0lOREVYLgorLy8vIFxub3RlIF9GSUVMRF9MSVNUIGlzIHVzZWQgb25seSBkdXJpbmcgZGVjbGFyYXRpb24gc28gdGhhdCBDMlN0cnVjdCBkZWNsYXJhdGlvbnMgY2FuIGVuZCB3aXRoCisvLy8gYSBzaW1wbGUgbGlzdCBvZiBDMkZJRUxELXMgYW5kIGNsb3NpbmcgYnJhY2tldC4gTWFyayBpdCB1bnVzZWQgYXMgaXQgaXMgbm90IHVzZWQgaW4gdGVtcGxhdGVkCisvLy8gc3RydWN0cy4KKyNkZWZpbmUgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorcHJpdmF0ZTogXAorICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1QgX191bnVzZWQ7IC8qKjwgc3RydWN0dXJlIGZpZWxkcyAqLyBcCitwdWJsaWM6IFwKKyAgICB0eXBlZGVmIEMyIyNuYW1lIyNTdHJ1Y3QgX3R5cGU7IC8qKjwgdHlwZSBuYW1lIHNob3J0aGFuZCAqLyBcCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzIGZhY3RvcnkgKi8KKworLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9DMlNUUlVDVChuYW1lKSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXgjI25hbWUgfTsgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aG91dCBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCitwdWJsaWM6IFwKKyAgICBGTEVYKEMyIyNuYW1lIyNTdHJ1Y3QsIGZsZXhNZW1iZXIpIFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXgjI25hbWUgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gRGVzY3JpYmUgYSBzdHJ1Y3R1cmUgb2YgYSB0ZW1wbGF0ZWQgc3RydWN0dXJlLgorLy8gVXNlIGxpc3QuLi4gYXMgdGhlIGFyZ3VtZW50IGdldHMgcmVzdWJzaXRpdHV0ZWQgYW5kIGl0IGNvbnRhaW5zIGNvbW1hcy4gQWx0ZXJuYXRpdmUgd291bGQgYmUKKy8vIHRvIHdyYXAgbGlzdCBpbiBhbiBleHByZXNzaW9uLCBlLmcuICh7IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBsaXN0OyB9KSkgd2hpY2ggY29udmVydHMKKy8vIGl0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhIHZlY3Rvci4KKyNkZWZpbmUgREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKHN0cnVrdCwgbGlzdC4uLikgXAorICAgIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZTw+LCBzdHJ1a3QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbGlzdCkKKworLy8vIFxkZXByZWNhdGVkCisvLy8gRGVzY3JpYmUgdGhlIGZpZWxkcyBvZiBhIHN0cnVjdHVyZSB1c2luZyBhbiBpbml0aWFsaXplciBsaXN0LgorI2RlZmluZSBERVNDUklCRV9DMlNUUlVDVChuYW1lLCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKCwgQzIjI25hbWUjI1N0cnVjdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBNYWNybyBsYXllciB0byBnZXQgdmFsdWUgb2YgZW5hYmxlZCB0aGF0IGlzIHBhc3NlZCBpbiBhcyBhIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0Li4uKSBcCisgICAgX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0KQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBNYWNybyBsYXllciB0byByZXNvbHZlIHRvIHRoZSBzcGVjaWZpYyBtYWNybyBiYXNlZCBvbiBtYWNybyB2YXJpYWJsZQorI2RlZmluZSBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCMjZW5hYmxlZCh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0KQorCisjZGVmaW5lIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QuLi4pIFwKKyAgICB0ZW1wbGF0ZSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IHN0cnVrdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gbGlzdDsgfQorCisjZGVmaW5lIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QuLi4pCisKKy8qKgorICogRGVzY3JpYmUgYSBmaWVsZCBvZiBhIHN0cnVjdHVyZS4KKyAqIFRoZXNlIG11c3QgYmUgaW4gb3JkZXIuCisgKgorICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzIG1hY3JvOgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvV2lkdGhTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoOworICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSB7fSAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgpCisgKiAgICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpID0gZGVmYXVsdDsgLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogd2lkdGgoX3dpZHRoKSB7fQorICoKKyAqICAgICAgREVGSU5FX0MyU1RSVUNUKFZpZGVvV2lkdGgpCisgKiAgfSBDMl9QQUNLOworICoKKyAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb1dpZHRoLCB7CisgKiAgICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgKiAgfSkKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIEZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzICh0aG9zZSBlbmRpbmcgaW4gVFtdKSwgdXNlIHRoZSBmbGV4aWJsZSBtYWNyb3M6CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aHNbXTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICoKKyAqICBwcml2YXRlOgorICogICAgICAvLyBtYXkgaGF2ZSBwcml2YXRlIGNvbnN0cnVjdG9ycyB0YWtpbmcgbnVtYmVyIG9mIHdpZHRocyBhcyB0aGUgZmlyc3QgYXJndW1lbnQKKyAqICAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHNpemVfdCwgaW50MzJfdCk7CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGludDMyX3QgdmFsdWUpIHsKKyAqICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxleENvdW50OyArK2kpIHsKKyAqICAgICAgICAgICAgICB3aWR0aHNbaV0gPSB2YWx1ZTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgLy8gSWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgVFtOXSBvciBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIHRoZSBmbGV4Q291bnQgd2lsbAorICogICAgICAvLyBiZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KKyAqICAgICAgLy8gICBpbnQgd2lkdGhzW10gPSB7IDEsIDIsIDMgfTsKKyAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjpBbGxvY1VuaXF1ZSh3aWR0aHMpOworICogICAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBpbnQzMl90KCZpbml0KVtOXSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IGluaXRbaV07CisgKiAgICAgICAgICB9CisgKiAgICAgIH0KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHdpZHRocykKKyAqICAgICAgQzJGSUVMRCh3aWR0aHMsICJ3aWR0aHMiKQorICogIH07CisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCB7CisgKiAgICAgIGludDMyX3QgbVdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogICAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIG1XaWR0aHMpCisgKiAgfSBDMl9QQUNLOworICoKKyAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHsKKyAqICAgICAgQzJGSUVMRChtV2lkdGhzLCAid2lkdGhzIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKi8KKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRChtZW1iZXIsIG5hbWUpIFwKKyAgQzJGaWVsZERlc2NyaXB0b3IoJigoX3R5cGUqKShudWxscHRyKSktPm1lbWJlciwgbmFtZSksCisKKyNkZWZpbmUgQzJGSUVMRChtZW1iZXIsIG5hbWUpIF9DMkZJRUxEKG1lbWJlciwgbmFtZSwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorLy8vIFxpZiAwCisjZGVmaW5lIF9DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkgX19DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkKKyNkZWZpbmUgX19DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkgREVTQ1JJQkVfQzJGSUVMRCMjZW5hYmxlZChtZW1iZXIsIG5hbWUpCisjZGVmaW5lIERFU0NSSUJFX0MyRklFTERfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obWVtYmVyLCBuYW1lKQorLy8vIFxlbmRpZgorCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgREVGSU5FX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQkFTRV9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKCBcCisgICAgICAgICAgICBuYW1lLCBmbGV4TWVtYmVyLCBERUZJTkVfRkxFWF9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgYmFzZSBzdHJ1Y3R1cmUgKHdpdGggbm8gQ09SRV9JTkRFWCkgYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKCBcCisgICAgICAgICAgICBuYW1lLCBmbGV4TWVtYmVyLCBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBcaWYgMAorLyoKKyAgIEFsdGVybmF0ZSBkZWNsYXJhdGlvbiBvZiBmaWVsZCBkZWZpbml0aW9ucyBpbiBjYXNlIG5vIGZpZWxkIGxpc3QgaXMgdG8gYmUgZ2VuZXJhdGVkLgorICAgVGhlIHNwZWNpZmljIG1hY3JvIGlzIGNob3NlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fICh3aGV0aGVyIGl0IGlzCisgICBkZWZpbmVkICh0byBiZSBlbXB0eSkgb3Igbm90LiBUaGlzIHJlcXVpcmVzIHR3byBsZXZlbCBvZiBtYWNybyBzdWJzdGl0dXRpb24uCisgICBUUklDS1k6IHVzZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG8gaGFuZGxlIGNsb3NpbmcgYnJhY2tldCB0aGF0IGlzIG5vcm1hbGx5IGFmdGVyCisgICB0aGVzZSBtYWNyb3MuCisqLworCisjZGVmaW5lIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKQorI2RlZmluZSBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSkgfSBDMl9QQUNLOyBuYW1lc3BhY2UgeworI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSkgfSBDMl9QQUNLOyBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIF9GSUVMRF9MSVNUOyB9IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6X0ZJRUxEX0xJU1QgPSB7CisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKQorI2RlZmluZSBfX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCMjZW5hYmxlZChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSwgZmxleE1lbWJlcikgfSBDMl9QQUNLOyBuYW1lc3BhY2UgeworI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKy8vLyBcZW5kaWYKKworCisvKioKKyAqIFBhcmFtZXRlciByZWZsZWN0b3IgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBjZW50cmFsaXplcyB0aGUgZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVyIHN0cnVjdHVyZXMuIFRoaXMgY2FuIGJlIHNoYXJlZAorICogYnkgbXVsdGlwbGUgY29tcG9uZW50cyBhcyBkZXNjcmliaW5nIGEgcGFyYW1ldGVyIGRvZXMgbm90IGltcGx5IHN1cHBvcnQgb2YgdGhhdAorICogcGFyYW1ldGVyLiBIb3dldmVyLCBlYWNoIHN1cHBvcnRlZCBwYXJhbWV0ZXIgYW5kIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcyB3aXRoaW4KKyAqIG11c3QgYmUgZGVzY3JpYmVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yIHByb3ZpZGVkIGJ5IGEgY29tcG9uZW50LgorICovCitjbGFzcyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgRGVzY3JpYmVzIGEgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqICBccGFyYW1baW5dIGNvcmVJbmRleCB0aGUgY29yZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGF0IGxlYXN0IHRoZQorICAgICAqICBjb3JlIGluZGV4CisgICAgICoKKyAgICAgKiAgXHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAgICAgKiAgXHJldHZhbCBudWxscHRyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlZmxlY3RvcgorICAgICAqCisgICAgICogIFRoaXMgbWV0aG9kcyBzaGFsbCBub3QgYmxvY2sgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqICBcbm90ZSB0aGlzIGNsYXNzIGRvZXMgbm90IHRha2UgYSBzZXQgb2YgaW5kaWNlcyBiZWNhdXNlIHdlIHdvdWxkIHRoZW4gcHJlZmVyCisgICAgICogIHRvIGFsc28gcmV0dXJuIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcywgYW5kIHdlIGRvbid0IHdhbnQgdGhpcyBsb2dpYyB0byBiZQorICAgICAqICByZXBlYXRlZCBpbiBlYWNoIHJlZmxlY3Rvci4gQWx0ZXJuYXRlbHksIHRoaXMgY291bGQganVzdCByZXR1cm4gYSBtYXAgb2YgYWxsCisgICAgICogIGRlc2NyaXB0aW9ucywgYnV0IHdlIHdhbnQgdG8gY29uc2VydmUgbWVtb3J5IGlmIGNsaWVudCBvbmx5IHdhbnRzIHRoZSBkZXNjcmlwdGlvbgorICAgICAqICBvZiBhIGZldyBpbmRpY2VzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QzJQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogR2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLgorICoKKyAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHJhbmdlIG9yIGEgc2V0IG9mIHZhbHVlcy4gVGhlIHJhbmdlIGNhbiBiZSBhIHNpbXBsZSByYW5nZSwgYW4gYXJpdGhtZXRpYywKKyAqIGdlb21ldHJpYyBvciBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyB3aXRoIGEgY2xlYXIgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZS4gVmFsdWVzIGNhbgorICogYmUgZGlzY3JldGUgdmFsdWVzLCBvciBjYW4gb3B0aW9uYWxseSByZXByZXNlbnQgZmxhZ3MgdG8gYmUgb3ItZWQuCisgKgorICogXG5vdGUgRG8gbm90IHVzZSBmbGFncyB0byByZXByZXNlbnQgYml0ZmllbGRzLiBVc2UgaW5kaXZpZHVhbCB2YWx1ZXMgb3Igc2VwYXJhdGUgZmllbGRzIGluc3RlYWQuCisgKi8KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgRU1QVFksICAgICAgLy8vPCBubyBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIFJBTkdFLCAgICAgIC8vLzwgYSBudW1lcmljIHJhbmdlIHRoYXQgY2FuIGJlIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUKKyAgICAgICAgVkFMVUVTLCAgICAgLy8vPCBhIGxpc3Qgb2YgdmFsdWVzCisgICAgICAgIEZMQUdTICAgICAgIC8vLzwgYSBsaXN0IG9mIGZsYWdzIHRoYXQgY2FuIGJlIE9SLWVkCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAvKiogVHlwZSBvZiB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCisKKyAgICB0eXBlZGVmIEMyVmFsdWU6OlByaW1pdGl2ZSBQcmltaXRpdmU7CisKKyAgICAvKioKKyAgICAgKiBSYW5nZSBzcGVjaWZpZXIgZm9yIHN1cHBvcnRlZCB2YWx1ZS4gVXNlZCBpZiB0eXBlIGlzIFJBTkdFLgorICAgICAqCisgICAgICogSWYgc3RlcCBpcyAwIGFuZCBudW0gYW5kIGRlbm9tIGFyZSBib3RoIDEsIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBhbnkgdmFsdWUsIGZvciB3aGljaAorICAgICAqIG1pbiA8PSB2YWx1ZSA8PSBtYXguCisgICAgICoKKyAgICAgKiBPdGhlcndpc2UsIHRoZSByYW5nZSByZXByZXNlbnRzIGEgZ2VvbWV0cmljL2FyaXRobWV0aWMvbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMsIHdoZXJlCisgICAgICogc3VjY2Vzc2l2ZSBzdXBwb3J0ZWQgdmFsdWVzIGNhbiBiZSBkZXJpdmVkIGZyb20gcHJldmlvdXMgdmFsdWVzIChzdGFydGluZyBhdCBtaW4pLCB1c2luZyB0aGUKKyAgICAgKiBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgKiAgdlswXSA9IG1pbgorICAgICAqICB2W2ldID0gdltpLTFdICogbnVtIC8gZGVub20gKyBzdGVwIGZvciBpID49IDEsIHdoaWxlIG1pbiA8IHZbaV0gPD0gbWF4LgorICAgICAqLworICAgIHN0cnVjdCB7CisgICAgICAgIC8qKiBMb3dlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUpLiAqLworICAgICAgICBQcmltaXRpdmUgbWluOworICAgICAgICAvKiogVXBwZXIgZW5kIG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlIGlmIHBlcm1pdHRlZCBieSBzZXJpZXMpLiAqLworICAgICAgICBQcmltaXRpdmUgbWF4OworICAgICAgICAvKiogU3RlcCBiZXR3ZWVuIHN1cHBvcnRlZCB2YWx1ZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBzdGVwOworICAgICAgICAvKiogTnVtZXJhdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG51bTsKKyAgICAgICAgLyoqIERlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIGRlbm9tOworICAgIH0gcmFuZ2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZhbHVlcy4gVXNlZCBpZiB0eXBlIGlzIFZBTFVFUyBvciBGTEFHUy4KKyAgICAgKgorICAgICAqIElmIHR5cGUgaXMgVkFMVUVTLCB0aGlzIGlzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZXMgaW4gZGVjcmVhc2luZyBwcmVmZXJlbmNlLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBGTEFHUywgdGhpcyB2ZWN0b3IgY29udGFpbnMgeyBtaW4tbWFzaywgZmxhZzEsIGZsYWcyLi4uIH0uIEJhc2ljYWxseSwgdGhlIGZpcnN0CisgICAgICogdmFsdWUgaXMgdGhlIHJlcXVpcmVkIHNldCBvZiBmbGFncyB0byBiZSBzZXQsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdmFsdWVzIGFyZSBmbGFncyB0aGF0IGNhbgorICAgICAqIGJlIHNldCBpbmRlcGVuZGVudGx5LiBGTEFHUyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgaW50ZWdyYWwgdHlwZXMuIFN1cHBvcnRlZCBmbGFncyBzaG91bGQKKyAgICAgKiBub3Qgb3ZlcmxhcCwgYXMgaXQgY2FuIG1ha2UgdmFsaWRhdGlvbiBub24tZGV0ZXJtaW5pc3RpYy4gVGhlIHN0YW5kYXJkIHZhbGlkYXRpb24gbWV0aG9kCisgICAgICogaXMgdGhhdCBzdGFydGluZyBmcm9tIHRoZSBvcmlnaW5hbCB2YWx1ZSwgaWYgZWFjaCBmbGFnIGlzIHJlbW92ZWQgd2hlbiBmdWxseSBwcmVzZW50ICh0aGUKKyAgICAgKiBtaW4tbWFzayBtdXN0IGJlIGZ1bGx5IHByZXNlbnQpLCB3ZSBzaGFsbCBhcnJpdmUgYXQgMC4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxQcmltaXRpdmU+IHZhbHVlczsKKworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKQorICAgICAgICA6IHR5cGUoRU1QVFkpIHsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IHR5cGUoUkFOR0UpLAorICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCAoVCkxLCAoVCkxfSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbikgOgorICAgICAgICB0eXBlKFJBTkdFKSwKKyAgICAgICAgcmFuZ2V7bWluLCBtYXgsIChUKTAsIG51bSwgZGVufSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVuKQorICAgICAgICA6IHR5cGUoUkFOR0UpLAorICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCBudW0sIGRlbn0geyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvciAoVCB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBsaXN0KQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICBmb3IoVCB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFxpbnRlcm5hbAorICAgIC8vLyBcdG9kbzogY3JlYXRlIHNlcGFyYXRlIHZhbHVlcyB2cy4gZmxhZ3MgaW5pdGlhbGl6ZXIgYXMgZm9yIGZsYWdzIHdlIHdhbnQKKyAgICAvLy8gdG8gbGlzdCBib3RoIGFsbG93ZWQgYW5kIHJlcXVpcmVkIGZsYWdzCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRT1kZWNsdHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKikwKSk+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBUKikKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZCA9IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKTApOworICAgICAgICBpZiAoZmxhZ3MpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soMCk7IC8vIG1pbi1tYXNrIGRlZmF1bHRzIHRvIDAKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmaXRlbSA6IG5hbWVkKXsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorfTsKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhIHNwZWNpZmljIGZpZWxkLgorICoKKyAqIFRoaXMgaXMgYSBwYWlyIG9mIHRoZSBmaWVsZCBzcGVjaWZpZXIgdG9nZXRoZXIgd2l0aCBhbiBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdC4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiByZXBvcnRpbmcgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cy4KKyAqLworc3RydWN0IEMyUGFyYW1GaWVsZFZhbHVlcyB7CisgICAgQzJQYXJhbUZpZWxkIHBhcmFtT3JGaWVsZDsgLy8vPCB0aGUgZmllbGQgb3IgcGFyYW1ldGVyCisgICAgLy8vIG9wdGlvbmFsIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZCBpZiBwYXJhbU9yRmllbGQgc3BlY2lmaWVzIGFuIGFjdHVhbCBmaWVsZCB0aGF0IGlzCisgICAgLy8vIG51bWVyaWMgKG5vbiBzdHJ1Y3QsIGJsb2Igb3Igc3RyaW5nKS4gU3VwcG9ydGVkIHZhbHVlcyBmb3IgYXJyYXlzIChpbmNsdWRpbmcgc3RyaW5nIGFuZAorICAgIC8vLyBibG9icykgZGVzY3JpYmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggZWxlbWVudCAoY2hhcmFjdGVyIGZvciBzdHJpbmcsIGFuZCBieXRlcyBmb3IKKyAgICAvLy8gYmxvYnMpLiBJdCBpcyBvcHRpb25hbCBmb3IgcmVhZC1vbmx5IHN0cmluZ3MgYW5kIGJsb2JzLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiB2YWx1ZXM7CisKKyAgICAvLyBUaGlzIHN0cnVjdCBpcyBtZWFudCB0byBiZSBtb3ZlIGNvbnN0cnVjdGVkLgorICAgIEMyX0RFRkFVTFRfTU9WRShDMlBhcmFtRmllbGRWYWx1ZXMpOworCisgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci9hc3NpZ25tZW50IGlzIGFsc28gcHJvdmlkZWQgYXMgdGhpcyBvYmplY3QgbWF5IGdldCBjb3BpZWQuCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpCisgICAgICAgIDogcGFyYW1PckZpZWxkKG90aGVyLnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgdmFsdWVzKG90aGVyLnZhbHVlcyA/IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKm90aGVyLnZhbHVlcykgOiBudWxscHRyKSB7IH0KKworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpIHsKKyAgICAgICAgcGFyYW1PckZpZWxkID0gb3RoZXIucGFyYW1PckZpZWxkOworICAgICAgICB2YWx1ZXMgPSBvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggbm8gdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8sIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlc18pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pLAorICAgICAgICAgIHZhbHVlcyhzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KHZhbHVlc18pKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGZpZWxkcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptb3ZlKHZhbHVlc18pKSB7IH0KK307CisKKy8vLyBAfQorCisvLyBpbmNsdWRlIGRlYnVnIGhlYWRlciBmb3IgQzJQYXJhbXMuaCBpZiBDMkRlYnVnLmggd2FzIGFscmVhZHkgaW5jbHVkZWQKKyNpZmRlZiBDMlVUSUxTX0RFQlVHX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlBBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzMyODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApAQCAtMCwwICsxLDkzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKiBcZmlsZQorICogVGVtcGxhdGVzIHVzZWQgdG8gZGVjbGFyZSBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIEMyUEFSQU1fREVGX0hfCisjZGVmaW5lIEMyUEFSQU1fREVGX0hfCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gVVRJTElUWSBURU1QTEFURVMgRk9SIFBBUkFNRVRFUiBERUZJTklUSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGVfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSA9PSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RFcXVhbCguLi4pOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoUygpICE9IFMoKSk+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3ROb3RFcXVhbChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdE5vdEVxdWFsKC4uLik7Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCisgKgorICogVXNlIGFzIF9DMkNvbXBhcmFibGU8dHlwZW5hbWUgUz46OnZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0RXF1YWw8Uz4oMCkpOjp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0Tm90RXF1YWw8Uz4oMCkpOjp2YWx1ZT4geworfTsKKworLy8vICBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhIENPUkVfSU5ERVggY29uc3RhbnQuCitzdHJ1Y3QgQzJfSElERSBfQzJDb3JlSW5kZXhIZWxwZXJfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIGludD1TOjpDT1JFX0lOREVYPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Q29yZUluZGV4KGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0Q29yZUluZGV4KC4uLik7Cit9OworCisvLy8gTWFjcm8gdGhhdCBkZWZpbmVzIGFuZCB0aHVzIG92ZXJyaWRlcyBhIHR5cGUncyBDT1JFX0lOREVYIGZvciBhIHNldHRpbmcKKyNkZWZpbmUgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoY29yZUluZGV4KSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gY29yZUluZGV4IH07CisKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGFkZHMgYSBDT1JFX0lOREVYIHRvIGEgdHlwZSBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZSAoZm9yIHRlc3RpbmcpCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4Pgorc3RydWN0IEMyX0hJREUgX0MyQWRkQ29yZUluZGV4IDogcHVibGljIFMgeworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKENvcmVJbmRleCkKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGZvciBwYXJhbWV0ZXJzLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gdmVyaWZ5IGRlZmF1bHQgY29uc3RydWN0b3IsIG5vIHZpcnR1YWwgbWV0aG9kcywgYW5kIG5vIGVxdWFsaXR5IG9wZXJhdG9ycy4KKyAqICAtIGV4cG9zZSBQQVJBTV9UWVBFLCBhbmQgbm9uLWZsZXggRkxFWF9TSVpFLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4LCB1bnNpZ25lZCBUeXBlRmxhZ3M+CitzdHJ1Y3QgQzJfSElERSBfQzJTdHJ1Y3RDaGVjayB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcG9seW1vcnBoaWM8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgdmlydHVhbCBtZXRob2RzIik7CisgICAgc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSBvcGVyYXRvcj09IG9yICE9Iik7CisKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBQQVJBTV9UWVBFID0gQ29yZUluZGV4IHwgVHlwZUZsYWdzCisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIEZMRVhfU0laRSA9IDAsCisgICAgfTsKK307CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZV9pbXBsIHsKKyAgICAvLy8gc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIEZMRVhfU0laRSBtZW1iZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB1bnNpZ25lZD1TOjpGTEVYX1NJWkU+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RGbGV4U2l6ZShpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdEZsZXhTaXplKC4uLik7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgRkxFWF9TSVpFIG1lbWJlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyRmxleGlibGVfaW1wbDo6VGVzdEZsZXhTaXplPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyBNYWNybyB0byB0ZXN0IGlmIGEgdHlwZSBpcyBmbGV4aWJsZSAoaGFzIGEgRkxFWF9TSVpFIG1lbWJlcikuCisjZGVmaW5lIElGX0ZMRVhJQkxFKFMpIEVOQUJMRV9JRihfQzJGbGV4aWJsZTxTPjo6dmFsdWUpCisvLy8gU2hvcnRoYW5kIGZvciBzdGQ6OmVuYWJsZV9pZgorI2RlZmluZSBFTkFCTEVfSUYoY29uZCkgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Y29uZD46OnR5cGUKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVj12b2lkPgorc3RydWN0IEMyX0hJREUgX2MyX2VuYWJsZV9pZl90eXBlIHsKKyAgICB0eXBlZGVmIFYgdHlwZTsKK307CisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBleHBvc2VzIHRoZSBmbGV4aWJsZSBzdWJ0eXBlIG9mIGEgc3RydWN0LgordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgRT12b2lkPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlciB7CisgICAgdHlwZWRlZiB2b2lkIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IDAgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleGlibGUgdHlwZXMuIFRoaXMgb25seSB3b3JrcyBpZiBfRmxleE1lbWJlclR5cGUgaXMgcHVibGljLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8UywKKyAgICAgICAgdHlwZW5hbWUgX2MyX2VuYWJsZV9pZl90eXBlPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RmxleFR5cGUgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleCBhcnJheXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTW10sCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBfQzJGbGV4SGVscGVyPFM+OjpGbGV4VHlwZT46OnZhbHVlPjo6dHlwZT4geworICAgIHR5cGVkZWYgUyBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBzaXplb2YoUykgfTsKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBmbGV4aWJsZSBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGFuZCBhZGQgY29tbW9uIG9wZXJhdGlvbnMuCisgKgorICogRmVhdHVyZXM6CisgKiAgLSBleHBvc2UgQ09SRV9JTkRFWCBhbmQgRmllbGRMaXN0ICh0aGlzIGlzIG5vcm1hbGx5IGluaGVyaXRlZCBmcm9tIHRoZSBzdHJ1Y3QsIGJ1dCBmbGV4aWJsZQorICogICAgc3RydWN0cyBjYW5ub3QgYmUgYmFzZSBjbGFzc2VzIGFuZCB0aHVzIGluaGVyaXRlZCBmcm9tKQorICogIC0gZGlzYWJsZSBjb3B5IGFzc2lnbm1lbnQgYW5kIGNvbnN0cnVjdGlvbiAoVE9ETzogdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGhlIEZMRVggbWFjcm8gZm9yIHRoZQorICogICAgZmxleGlibGUgc3RydWN0LCBzbyBtYXkgbm90IGJlIG5lZWRlZCBoZXJlKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyRmxleFN0cnVjdENoZWNrIDoKKy8vIGFkZCBmbGV4aWJsZSBmbGFnIGFzIF9DMlN0cnVjdENoZWNrIGRlZmluZXMgUEFSQU1fVFlQRQorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCBUeXBlRmxhZ3M+IHsKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBDT1JFX0lOREVYID0gUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCAvLy88IGZsZXhpYmxlIHN0cnVjdCBjb3JlLWluZGV4CisgICAgfTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpIHsgcmV0dXJuIFM6OkZpZWxkTGlzdCgpOyB9CisKKyAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBkaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yCisgICAgaW5saW5lIF9DMkZsZXhTdHJ1Y3RDaGVjaygpID0gZGVmYXVsdDsKKworcHJvdGVjdGVkOgorICAgIC8vIGNhbm5vdCBjb3B5IGZsZXhpYmxlIHBhcmFtcworICAgIF9DMkZsZXhTdHJ1Y3RDaGVjayhjb25zdCBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVHlwZUZsYWdzPiAmKSA9IGRlbGV0ZTsKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2smIG9wZXJhdG9yPSAoY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisKKyAgICAvLyBjb25zdGFudHMgdXNlZCBmb3IgaGVscGVyIG1ldGhvZHMKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPFM+OjpGTEVYX1NJWkUsIC8vLzwgc2l6ZSBvZiBmbGV4aWJsZSB0eXBlCisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIE1BWF9TSVpFID0gKHVpbnQzMl90KXN0ZDo6bWluKChzaXplX3QpVUlOVDMyX01BWCwgU0laRV9NQVgpLCAvLyBUT0RPOiBpcyB0aGlzIGFsd2F5cyB1MzIgbWF4PworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBCQVNFX1NJWkUgPSBzaXplb2YoUykgKyBzaXplb2YoQzJQYXJhbSksIC8vLzwgc2l6ZSBvZiB0aGUgYmFzZSBwYXJhbQorICAgIH07CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWxsb2NhdGVkIHNpemUgb2YgdGhpcyBwYXJhbSB3aXRoIGZsZXhDb3VudCwgb3IgMCBpZiBpdCB3b3VsZCBvdmVyZmxvdy4KKyAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBDYWxjU2l6ZShzaXplX3QgZmxleENvdW50LCBzaXplX3Qgc2l6ZSA9IEJBU0VfU0laRSkgeworICAgICAgICBpZiAoZmxleENvdW50IDw9IChNQVhfU0laRSAtIHNpemUpIC8gUzo6RkxFWF9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSArIFM6OkZMRVhfU0laRSAqIGZsZXhDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gZHluYW1pYyBuZXcgb3BlcmF0b3IgdXNhYmxlIGZvciBwYXJhbXMgb2YgdHlwZSBTCisgICAgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGZsZXhDb3VudCkgbm9leGNlcHQgeworICAgICAgICAvLyBUT0RPOiBhc3NlcnQoc2l6ZSA9PSBCQVNFX1NJWkUpOworICAgICAgICBzaXplID0gQ2FsY1NpemUoZmxleENvdW50LCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKworLy8vIERlZmluZSBGcm9tKCkgY2FzdCBvcGVyYXRvcnMgZm9yIHBhcmFtcy4KKyNkZWZpbmUgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiAoX1R5cGUqKUMyUGFyYW06OklmU3VpdGFibGUoIFwKKyAgICAgICAgICAgICAgICBvdGhlciwgc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUsIF9UeXBlOjpGTEVYX1NJWkUsIFwKKyAgICAgICAgICAgICAgICAoX1R5cGU6OlBBUkFNX1RZUEUgJiBUOjpJbmRleDo6RElSX1VOREVGSU5FRCkgIT0gVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBfVHlwZSogRnJvbShjb25zdCBDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IF9UeXBlKj4oRnJvbShjb25zdF9jYXN0PEMyUGFyYW0gKj4ob3RoZXIpKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgc3RhdGljIF9UeXBlKiBGcm9tKHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgYWxsb2NhdG9ycyAoQWxsb2NTaGFyZWQgb3IgQWxsb2NVbmlxdWUpIGZvciBmbGV4aWJsZSBwYXJhbXMuCisgKiAgLSBQOjpBbGxvY1h5eihmbGV4Q291bnQsIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3IgZ2l2ZW4gZmxleC1jb3VudC4gVGhpcyBtYXBzIHRvCisgKiAgICAgICAgICBUKGZsZXhDb3VudCwgYXJncy4uLilcCisgKgorICogQ2xhbmcgZG9lcyBub3Qgc3VwcG9ydCBhcmdzLi4uIGZvbGxvd2VkIGJ5IHRlbXBsYXRlZCBwYXJhbSBhcyBhcmdzLi4uIGVhdHMgaXQuIEhlbmNlLAorICogcHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgd2hlcmUgdGhlIGluaXRpYWxpemVyIHJlcGxhY2VzIHRoZSBmbGV4Q291bnQuCisgKgorICogU3BlY2lhbGl6YXRpb25zIHRoYXQgZGVkdWNlIGZsZXhDb3VudDoKKyAqICAtIFA6OkFsbG9jWHl6KFRbXSwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCBhcnJheS4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdGlhbGl6ZXIKKyAqICAgICAgICAgICAgbGlzdC4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6dmVjdG9yPFQ+LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IHZlY3Rvci4KKyAqICBUaGVzZSBzcGVjaWFsaXphdGlvbnMgbWFwIHRvIFQoZmxleENvdW50ID0gc2l6ZS1vZi1pbml0LCBhcmdzLi4uLCBpbml0KQorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgcHRyLCBQdHIpIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0cihzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhmbGV4Q291bnQpIF9UeXBlKGZsZXhDb3VudCwgYXJncy4uLikpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiAmaW5pdCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoaW5pdC5zaXplKCkpIF9UeXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0ciggXAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZSwgdW5zaWduZWQgTj4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoY29uc3QgVSgmaW5pdClbTl0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KE4pIF9UeXBlKE4sIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorCisvKioKKyAqIERlZmluZSBmbGV4aWJsZSBtZXRob2RzIEFsbG9jU2hhcmVkLCBBbGxvY1VuaXF1ZSBhbmQgZmxleENvdW50LgorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKSBcCisgICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCBzaGFyZWQsIFNoYXJlZCkgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgdW5pcXVlLCBVbmlxdWUpIFwKKyAgICBpbmxpbmUgc2l6ZV90IGZsZXhDb3VudCgpIGNvbnN0IHsgXAorICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHlwZSkgPT0gX1R5cGU6OkJBU0VfU0laRSwgImluY29ycmVjdCBCQVNFX1NJWkUiKTsgXAorICAgICAgICBzaXplX3Qgc3ogPSB0aGlzLT5zaXplKCk7IFwKKyAgICAgICAgaWYgKHN6ID49IHNpemVvZihfVHlwZSkpIHsgXAorICAgICAgICAgICAgcmV0dXJuIChzeiAtIHNpemVvZihfVHlwZSkpIC8gX1R5cGU6OkZMRVhfU0laRTsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKworLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KKyNkZWZpbmUgRkxFWChjbHMsIG0pIFwKKyAgICBDMl9ET19OT1RfQ09QWShjbHMpIFwKK3ByaXZhdGU6IFwKKyAgICBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgLyoqIFxpZiAwICovIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgX0MyRmxleEhlbHBlcjsgXAorcHVibGljOiBcCisgICAgdHlwZWRlZiBkZWNsdHlwZShtKSBfRmxleE1lbWJlclR5cGU7IFwKKyAgICAvKiBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggZmxleENvdW50ICovIFwKKyAgICBpbmxpbmUgY2xzKHNpemVfdCkgOiBjbHMoKSB7fSBcCisgICAgLyogY29uc3RleHByIHN0YXRpYyBfRmxleE1lbWJlclR5cGUgY2xzOjoqIGZsZXhNZW1iZXIgPSAmY2xzOjptOyAqLyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPF9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOyBcCisgICAgc3RhdGljX2Fzc2VydChcCisgICAgICAgICAgICAhc3RkOjppc192b2lkPEZsZXhUeXBlPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJtZW1iZXIgaXMgbm90IGZsZXhpYmxlLCBvciBhIGZsZXhpYmxlIGFycmF5IG9mIGEgZmxleGlibGUgdHlwZSIpOyBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsgXAorICAgIC8qKiBcZW5kaWYgKi8gXAorCisvLy8gQH0KKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqIHN0cnVjdHVyZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlBvcnRQYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfSU5QVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCisgKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9VTkRFRklORUQ+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBiYXNpYyBhbGxvY2F0aW9uOiBuZXcoZmxleENvdW50KSBQLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFKSwKKyAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHJpdmF0ZSBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAorICAgIC8vLyBzdHJlYW0tSUQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dCgpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFN0cmVhbS1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBzdHJlYW0gc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKKyAqIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQorICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKKyAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0CisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwKKyAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSwgMHUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfSU5QVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhpbnB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gU0lNUExFIFZBTFVFIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogXGluZ3JvdXAgaW50ZXJuYWwKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3QgeworICAgIFQgdmFsdWU7IC8vLzwgc2ltcGxlIHZhbHVlIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIC8vIENvbnN0cnVjdG9yIHdpdGggYW4gaW5pdGlhbCB2YWx1ZS4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChUIHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorfTsKKworLy8gVE9ETzogbW92ZSB0aGlzIGFuZCBuZXh0IHRvIHNvbWUgZ2VuZXJpYyBwbGFjZQorLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiAobWFwcGVkKSBtZW1vcnkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyTWVtb3J5QmxvY2sgeworICAgIC8vLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmxvY2suCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKyAgICAvLy8gXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3V0c2lkZQorICAgIC8vLyB0aGUgYmxvY2suCisgICAgdmlydHVhbCBjb25zdCBUICpkYXRhKCkgY29uc3QgPSAwOyAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBmcmllbmQgYWNjZXNzIG9ubHkgaW4gc29tZSBDMk1lbW9yeSBtb2R1bGU/CisgICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG9yIHdyaXRlCisgICAgLy8vIG91dHNpZGUgdGhlIGJsb2NrLgorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gY29uc3RfY2FzdDxUKj4oY29uc3RfY2FzdDxjb25zdCBDMk1lbW9yeUJsb2NrKj4odGhpcyktPmRhdGEoKSk7IH0KKworcHJvdGVjdGVkOgorICAgIC8vIFRPRE86IGZvciBub3cgaXQgc2hvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgYXMgQzJNZW1vcnlCbG9jaworICAgIHZpcnR1YWwgfkMyTWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIG1lbW9yeSBjb250YWluaW5nIGEgY29uc3RhbnQgKGNvbnN0ZXhwcikgYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkNvbnN0TWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazxUPiB7CisgICAgdmlydHVhbCBjb25zdCBUICogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIF9tRGF0YTsgfQorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBjb25zdGV4cHIgQzJDb25zdE1lbW9yeUJsb2NrKGNvbnN0IFQoJmluaXQpW05dKSA6IF9tRGF0YShpbml0KSwgX21TaXplKE4pIHt9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVCAqX21EYXRhOworICAgIGNvbnN0IHNpemVfdCBfbVNpemU7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKKy8vLyBAeworCisvLy8gSGVscGVyIGNsYXNzIHRvIGluaXRpYWxpemUgZmxleGlibGUgYXJyYXlzIHdpdGggdmFyaW91cyBpbml0YWxpemVycy4KK3N0cnVjdCBfQzJWYWx1ZUFycmF5SGVscGVyIHsKKyAgICAvLyBjaGFyW10tcyBhcmUgdXNlZCBhcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgc28gdGhlIGxhc3QgZWxlbWVudCBpcyBuZXZlciBpbml0ZWQuCisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgY29uc3RleHByIG1lbW9yeSBibG9jay4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2NrLmRhdGEoKSkgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBibG9jay5kYXRhKCksIHN0ZDo6bWluKGFycmF5TGVuLCBibG9jay5zaXplKCkpICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIHZlY3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgeworICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IFQoJnN0cilbTl0pIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5TGVuKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJyYXksIHN0ciwgc3RkOjptaW4oYXJyYXlMZW4sIChzaXplX3QpTikgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgfQorfTsKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3IgYSBmbGV4aWJsZSBibG9iIGFuZCBzdHJpbmcgYXJyYXlzLiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlCisgKiBmbGV4aWJsZSBhcnJheSBtZW1iZXIgd2l0aCBkZWZhdWx0IGZsZXhpYmxlIGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZQorICogY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUgaXMgMC4KKyAqCisgKiBcaW50ZXJuYWwgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBDMlNpbXBsZUFycmF5U3RydWN0PFRbXT4gc2ltcGx5IGJlY2F1c2UgaXRzIG1lbWJlciBoYXMgdGhlIG5hbWUKKyAqIGFzIHZhbHVlIHRvIHJlZmxlY3QgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4geworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBvbmx5IGZvciBCTE9CIG9yIFNUUklORyIpOworICAgIFQgdmFsdWVbXTsKKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorICAgIEZMRVgoQzJTaW1wbGVWYWx1ZVN0cnVjdCwgdmFsdWUpCisKK3ByaXZhdGU6CisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBmbGV4aWJsZSBhcnJheSBlbGVtZW50IG9mIGEgc3BlY2lmaWMgdHlwZSAoVCkgd2l0aAorICogZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUKKyAqIGlzIDAuIEluc3RlYWQsIGl0IGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIsIGUuZy4KKyAqCisgKiAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJNeUZhbmN5U3RydWN0PiwKKyAqICAgICAgICAgICBrUGFyYW1JbmRleE15RmFuY3lBcnJheVN0cmVhbVBhcmFtPiBDMk15RmFuY3lBcnJheVN0cmVhbUluZm87CisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVBcnJheVN0cnVjdCB7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1c2UgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIGZvciBCTE9CIG9yIFNUUklORyIpOworCisgICAgVCB2YWx1ZXNbXTsgLy8vPCBhcnJheSBtZW1iZXIKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QoU2ltcGxlQXJyYXksIHZhbHVlcykKKyAgICAvL0ZMRVgoQzJTaW1wbGVBcnJheVN0cnVjdCwgdmFsdWVzKQorCitwcml2YXRlOgorICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIEMyTWVtb3J5QmxvY2suCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGJsb2NrKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiB2ZWN0b3IuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8qKgorICogXGFkZHRvZ3JvdXAgc2ltcGxldmFsdWUgU2ltcGxlIHZhbHVlIGFuZCBhcnJheSBzdHJ1Y3R1cmVzLgorICogQHsKKyAqCisgKiBTaW1wbGUgdmFsdWUgc3RydWN0dXJlcy4KKyAqCisgKiBTdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYSBzaW5nbGUgc2ltcGxlIHZhbHVlLiBUaGVzZSBjYW4gYmUgcmV1c2VkIHRvIGVhc2lseSBkZWZpbmUgc2ltcGxlCisgKiBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgdHlwZXM6CisgKgorICogICB0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TXlJbnRlZ2VyUG9ydFBhcmFtPgorICogICAgICAgICAgIEMyTXlJbnRlZ2VyUG9ydFBhcmFtVHVuaW5nOworICoKKyAqIFRoZXkgY29udGFpbiBhIHNpbmdsZSBtZW1iZXIgKHZhbHVlIG9yIHZhbHVlcykgdGhhdCBpcyBkZXNjcmliZWQgYXMgInZhbHVlIiBvciAidmFsdWVzIi4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmVzIGRvbid0IGRlZmluZSBhIGNvcmUgaW5kZXgsIGFuZCBhcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIHN0cnVjdHVyZQorICogZGVjbGFyYXRpb25zLiBVc2UgdHlwZVtdIGluc3RlYWQsIHN1Y2ggYXMgaW50MzJfdCBmaWVsZFtdLgorICovCisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+IEMySW50MzJWYWx1ZTsKKy8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQzMl90PiBDMkludDMyQXJyYXk7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJBcnJheTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NFZhbHVlOworLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGludDY0X3Q+IEMySW50NjRBcnJheTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NEFycmF5OworLy8vIEEgZmxvYXQgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGZsb2F0PiBDMkZsb2F0VmFsdWU7CisvLy8gQSBmbG9hdCBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxmbG9hdD4gQzJGbG9hdEFycmF5OworLy8vIEEgYmxvYiBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDhfdFtdPiBDMkJsb2JWYWx1ZTsKKy8vLyBBIHN0cmluZyBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8Y2hhcltdPiBDMlN0cmluZ1ZhbHVlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VD46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZUFycmF5U3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZXMsICJ2YWx1ZXMiKSB9OworfQorCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJQQVJBTV9ERUZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMldPUktfSF8KKworI2RlZmluZSBDMldPUktfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvLy8gXGRlZmdyb3VwIHdvcmsgV29yayBhbmQgZGF0YSBwcm9jZXNzaW5nCisvLy8gQHsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSByZWFzb24gYSBwYXJhbWV0ZXIgc2V0dGluZ3MgbWF5IGZhaWwsIG9yCisgKiBtYXkgYmUgb3ZlcnJpZGVuLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0IHsKKyAgICBlbnVtIEZhaWx1cmUgOiB1aW50MzJfdCB7CisgICAgICAgIC8qIHBhcmFtZXRlciBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVFlQRSwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIEJBRF9QT1JULCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHBvcnQKKyAgICAgICAgQkFEX0lOREVYLCAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgc3RyZWFtCisgICAgICAgIFJFQURfT05MWSwgIC8vLzwgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldAorICAgICAgICBNSVNNQVRDSCwgICAvLy88IHBhcmFtZXRlciBtaXNtYXRjaGVzIGlucHV0IGRhdGEKKworICAgICAgICAvKiBmaWVsZCBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVkFMVUUsICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZG9lcyBub3QgYWNjZXB0IHZhbHVlIGZvciB0aGUgZmllbGQgYXQgYWxsCisgICAgICAgIENPTkZMSUNULCAgIC8vLzwgc3RyaWN0IHBhcmFtZXRlciBmaWVsZCB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKworICAgICAgICAvLy8gcGFyYW1ldGVyIGZpZWxkIGlzIG91dCBvZiByYW5nZSBkdWUgdG8gb3RoZXIgc2V0dGluZ3MgKHRoaXMgZmFpbHVyZSBtb2RlCisgICAgICAgIC8vLyBjYW4gb25seSBiZSB1c2VkIGZvciBzdHJpY3QgY2FsY3VsYXRlZCBwYXJhbWV0ZXJzKQorICAgICAgICBVTlNVUFBPUlRFRCwKKworICAgICAgICAvLy8gZmllbGQgZG9lcyBub3QgYWNjZXNzIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGF0IGFsbC4gSXQgaGFzIGJlZW4gY29ycmVjdGVkIHRvCisgICAgICAgIC8vLyB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUuIFRoaXMgZmFpbHVyZSBtb2RlIGlzIHByb3ZpZGVkIHRvIGdpdmUgZ3VpZGFuY2UgYXMgdG8gd2hhdAorICAgICAgICAvLy8gYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZCAod2hpY2ggbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBhdC1hbGwtCisgICAgICAgIC8vLyBwb3RlbnRpYWwgdmFsdWVzKQorICAgICAgICBJTkZPX0JBRF9WQUxVRSwKKworICAgICAgICAvLy8gcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKyAgICAgICAgLy8vIGFuZCBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUKKyAgICAgICAgLy8vIG1vZGUgaXMgZ2l2ZW4gdG8gcHJvdmlkZSBndWlkYW5jZSBhcyB0byB3aGF0IGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYXMgd2VsbAorICAgICAgICAvLy8gYXMgdG8gb3B0aW9uYWxseSBwcm92aWRlIHN1Z2dlc3Rpb24gdG8gdGhlIGNsaWVudCBhcyB0byBob3cgdG8gZW5hYmxlIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgLy8vIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgSU5GT19DT05GTElDVCwKKyAgICB9OworCisgICAgRmFpbHVyZSBmYWlsdXJlOyAgICAvLy88IGZhaWx1cmUgY29kZQorCisgICAgLy8vIEZhaWxpbmcgKG9yIGNvcnJlY3RlZCkgZmllbGQgb3IgcGFyYW1ldGVyYW5kIG9wdGlvbmFsbHksIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUKKyAgICAvLy8gZmllbGQuIFZhbHVlcyBtdXN0IG9ubHkgYmUgc2V0IGZvciBmaWVsZCBmYWlsdXJlcyBvdGhlciB0aGFuIEJBRF9WQUxVRSwgYW5kIG9ubHkgaWYgdGhleSBhcmUKKyAgICAvLy8gZGlmZmVyZW50IGZyb20gdGhlIGdsb2JhbGx5IHN1cHBvcnRlZCB2YWx1ZXMgKGUuZy4gZHVlIHRvIHJlc3RyaWN0aW9ucyBieSBhbm90aGVyIHBhcmFtIG9yCisgICAgLy8vIGlucHV0IGRhdGEpLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyBmaWVsZDsKKworICAgIC8vLyBDb25mbGljdGluZyBwYXJhbWV0ZXJzIG9yIGZpZWxkcyB3aXRoIG9wdGlvbmFsIHN1Z2dlc3Rpb25zIHdpdGggKG9wdGlvbmFsKSBzdWdnZXN0ZWQgdmFsdWVzCisgICAgLy8vIGZvciBhbnkgY29uZmxpY3RpbmcgZmllbGRzIHRvIGF2b2lkIHRoZSBjb25mbGljdC4gTXVzdCBvbmx5IGJlIHNldCBmb3IgQ09ORkxJQ1QsIFVOU1VQUE9SVEVECisgICAgLy8vIGFuZCBJTkZPX0NPTkZMSUNUIGZhaWx1cmUgY29kZXMuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBjb25mbGljdHM7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBXT1JLCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqIFVuaXF1ZSBJRCBmb3IgYSBwcm9jZXNzaW5nIG5vZGUuICovCit0eXBlZGVmIHVpbnQzMl90IGMyX25vZGVfaWRfdDsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhXb3JrT3JkaW5hbCwKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIG9yZGVyaW5nIHdvcmsgaXRlbXMgb24gYSBjb21wb25lbnQgcG9ydC4KKyAqLworc3RydWN0IEMyV29ya09yZGluYWxTdHJ1Y3QgeworLy9wdWJsaWM6CisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wOyAgICAgLyoqIGZyYW1lIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMgKi8KKyAgICBjMl9jbnRyNjRfdCBmcmFtZUluZGV4OyAgICAvKiogc3VibWlzc2lvbiBvcmRpbmFsIG9uIHRoZSBpbml0aWFsIGNvbXBvbmVudCAqLworICAgIGMyX2NudHI2NF90IGN1c3RvbU9yZGluYWw7IC8qKiBjYW4gYmUgZ2l2ZW4gYnkgdGhlIGNvbXBvbmVudCwgZS5nLiBkZWNvZGUgb3JkZXIgKi8KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoV29ya09yZGluYWwpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorICAgIEMyRklFTEQoZnJhbWVJbmRleCwgImZyYW1lLWluZGV4IikKKyAgICBDMkZJRUxEKGN1c3RvbU9yZGluYWwsICJjdXN0b20tb3JkaW5hbCIpCit9OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBDb2RlYyAyLjAgZnJhbWUgd2l0aCBpdHMgbWV0YWRhdGEuCisgKgorICogQSBmcmFtZSBiYXNpY2FsbHkgY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBzZXRzIG9mIGJ1ZmZlcnMsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgaW5mbyBidWZmZXJzCisgKiBhbG9uZyB3aXRoIHNvbWUgbm9uLWNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuCisgKi8KK3N0cnVjdCBDMkZyYW1lRGF0YSB7CisvL3B1YmxpYzoKKyAgICBlbnVtIGZsYWdzX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgaW5wdXQgZnJhbWVzOiBubyBvdXRwdXQgZnJhbWUgc2hhbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcHJvY2Vzc2luZyB0aGlzIGZyYW1lLCBidXQKKyAgICAgICAgICogbWV0YWRhdGEgc2hhbGwgc3RpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICAgKiBGb3Igb3V0cHV0IGZyYW1lczogdGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgYW5kIGJ1dCBtZXRhZGF0YSBpcyBzdGlsbCB2YWxpZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRFJPUF9GUkFNRSAgICA9ICgxIDw8IDApLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgY3VycmVudCBzdHJlYW0uIEZ1cnRoZXIgZnJhbWVzIGFyZSBwYXJ0IG9mIGEgbmV3CisgICAgICAgICAqIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRU5EX09GX1NUUkVBTSA9ICgxIDw8IDEpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgd2l0aCBpdHMgbWV0YWRhdGEuCisgICAgICAgICAqIFRoaXMgZmxhZyBpcyBvbmx5IHNldCBieSBjb21wb25lbnRzIC0gZS5nLiBhcyBhIHJlc3BvbnNlIHRvIHRoZSBmbHVzaCBjb21tYW5kLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19ESVNDQVJEX0ZSQU1FID0gKDEgPDwgMiksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGlzIG5vdCB0aGUgbGFzdCBmcmFtZSBwcm9kdWNlZCBmb3IgdGhlIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgbm9ybWFsbHkgc2V0IGJ5IHRoZSBjb21wb25lbnQgLSBlLmcuIHdoZW4gYW4gaW5wdXQgZnJhbWUgcmVzdWx0cyBpbiBtdWx0aXBsZQorICAgICAgICAgKiBvdXRwdXQgZnJhbWVzLCB0aGlzIGZsYWcgaXMgc2V0IG9uIGFsbCBidXQgdGhlIGxhc3Qgb3V0cHV0IGZyYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBBbHNvLCB3aGVuIGNvbXBvbmVudHMgYXJlIGNoYWluZWQsIHRoaXMgZmxhZyBzaG91bGQgYmUgcHJvcGFnYXRlZCBkb3duIHRoZQorICAgICAgICAgKiB3b3JrIGNoYWluLiBUaGF0IGlzLCBpZiBzZXQgb24gYW4gZWFybGllciBmcmFtZSBvZiBhIHdvcmstY2hhaW4sIGl0IHNob3VsZCBiZSBwcm9wYWdhdGVkCisgICAgICAgICAqIHRvIGFsbCBsYXRlciBmcmFtZXMgaW4gdGhhdCBjaGFpbi4gQWRkaXRpb25hbGx5LCBjb21wb25lbnRzIGRvd24gdGhlIGNoYWluIGNvdWxkIHNldAorICAgICAgICAgKiB0aGlzIGZsYWcgZXZlbiBpZiBub3Qgc2V0IGVhcmxpZXIsIGUuZy4gaWYgbXVsdGlwbGUgb3V0cHV0IGZyYW1lIGlzIGdlbmVyYXRlZCBhdCB0aGF0CisgICAgICAgICAqIGNvbXBvbmVudCBmb3IgdGhlIGlucHV0IGZyYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19JTkNPTVBMRVRFID0gKDEgPDwgMyksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGNvbnRhaW5zIG9ubHkgY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLCBhbmQgbm8gYWN0dWFsIGFjY2VzcyB1bml0LgorICAgICAgICAgKgorICAgICAgICAgKiBcZGVwcmVjYXRlZCBwYXNzIGNvZGVjIGNvbmZpZ3VyYXRpb24gd2l0aCB1c2luZyB0aGUgXHRvZG8gY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpbmZvIHRvZ2V0aGVyIHdpdGggdGhlIGFjY2VzcyB1bml0LgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19DT0RFQ19DT05GSUcgID0gKDF1IDw8IDMxKSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRnJhbWUgZmxhZ3MgKi8KKyAgICBmbGFnc190ICBmbGFnczsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVyczsKKyAgICAvLzwgZm9yIGluaXRpYWwgd29yayBpdGVtLCB0aGVzZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIHBhcnNlciAtIGlmIHByb3ZpZGVkCisgICAgLy88IGZvciBvdXRwdXQgYnVmZmVycywgdGhlc2UgYXJlIHRoZSByZXNwb25zZXMgdG8gcmVxdWVzdGVkSW5mb3MKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICAgICAgY29uZmlnVXBkYXRlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkluZm9CdWZmZXI+PiBpbmZvQnVmZmVyczsKK307CisKK3N0cnVjdCBDMldvcmtsZXQgeworLy9wdWJsaWM6CisgICAgLy8gSU4KKyAgICBjMl9ub2RlX2lkX3QgY29tcG9uZW50OworCisgICAgLyoqIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBiZSBhcHBsaWVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoaXMgd29ya2xldC4gKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiB0dW5pbmdzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIE9VVAorICAgIEMyRnJhbWVEYXRhIG91dHB1dDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgcGFydGlhbCB3b3JrLWNoYWlucyBub3QgcGFydCBvZiB0aGUgY3VycmVudCB3b3JrIGl0ZW1zLgorICoKKyAqIFRvIGJlIGRlZmluZWQgbGF0ZXIuCisgKi8KK3N0cnVjdCBDMldvcmtDaGFpbkluZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGEgc2luZ2xlIHdvcmsgaXRlbS4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY29tcG9uZW50IGZvciB0aGUgZmlyc3Qgd29ya2xldC4gQXMgc3VjaCwKKyAqIHdvcmtsZXRzIG11c3Qgbm90IGJlIGVtcHR5LiBUaGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IGlzIHBhc3NlZC4KKyAqLworc3RydWN0IEMyV29yayB7CisvL3B1YmxpYzoKKyAgICAvLy8gYWRkaXRpb25hbCB3b3JrIGNoYWluIGluZm8gbm90IHBhcnQgb2YgdGhpcyB3b3JrCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyV29ya0NoYWluSW5mbz4gY2hhaW5JbmZvOworCisgICAgLy8vIFRoZSBpbnB1dCBkYXRhIHRvIGJlIHByb2Nlc3NlZCBhcyBwYXJ0IG9mIHRoaXMgd29yay93b3JrLWNoYWluLiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2l0aCBvd25lcnNoaXAuIFdoZW4gdGhlIHdvcmsgaXMgcmV0dXJuZWQgKHZpYSBvbldvcmtEb25lKSwgdGhlIGlucHV0IGJ1ZmZlci1wYWNrJ3MKKyAgICAvLy8gYnVmZmVyIHZlY3RvciBzaGFsbCBjb250YWluIG51bGxwdHJzLgorICAgIEMyRnJhbWVEYXRhIGlucHV0OworCisgICAgLy8vIFRoZSBjaGFpbiBvZiBjb21wb25lbnRzLCB0dW5pbmdzIChpbmNsdWRpbmcgb3V0cHV0IGJ1ZmZlciBwb29sIElEcykgYW5kIGluZm8gcmVxdWVzdHMgdGhhdCB0aGUKKyAgICAvLy8gZGF0YSBtdXN0IHBhc3MgdGhyb3VnaC4gSWYgdGhpcyBoYXMgbW9yZSB0aGFuIGEgc2luZ2xlIGVsZW1lbnQsIHRoZSB0dW5uZWxzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgIC8vLyBjb21wb25lbnRzIG9mIHRoZSB3b3JrbGV0IGNoYWluIG11c3QgaGF2ZSBiZWVuIChzdWNjZXNzZnVsbHkpIHByZS1yZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoYXQKKyAgICAvLy8gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBBbGxvY2F0aW5nIHRoZSBvdXRwdXQgYnVmZmVycyBpbiB0aGUgd29ya2xldHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgICAgLy8vIGVhY2ggY29tcG9uZW50LiBVcG9uIHdvcmsgc3VibWlzc2lvbiwgZWFjaCBvdXRwdXQgYnVmZmVyLXBhY2sgc2hhbGwgYmUgYW4gYXBwcm9wcmlhdGVseSBzaXplZAorICAgIC8vLyB2ZWN0b3IgY29udGFpbmluZyBudWxscHRycy4gV2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZWQvcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwgb3V0cHV0IGJ1ZmZlcnMKKyAgICAvLy8gcG9pbnRlcnMgZnJvbSBhbGwgYnV0IHRoZSBmaW5hbCB3b3JrbGV0IHNoYWxsIGJlIG51bGxwdHJzLgorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0Pj4gd29ya2xldHM7CisKKyAgICAvLy8gTnVtYmVyIG9mIHdvcmtsZXRzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgaW4gdGhpcyBjaGFpbi4gVGhpcyBzaGFsbCBiZSBpbml0aWFsaXplZCB0byAwIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2hlbiB0aGUgd29yayBpcyBzdWJtaXR0ZWQuIEl0IHNoYWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB3b3JrbGV0cyB0aGF0IHdlcmUKKyAgICAvLy8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB3aGVuIHRoZSB3b3JrIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuIElmIHRoaXMgaXMgbGVzcyB0aGVuIHRoZSBudW1iZXIKKyAgICAvLy8gb2Ygd29ya2xldHMsIHJlc3VsdCBtdXN0IG5vdCBiZSBzdWNjZXNzLiBJdCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBbMCwgd29ya2xldHMuc2l6ZSgpXS4KKyAgICB1aW50MzJfdCB3b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgIC8vLyBUaGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgd29yayAoY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3JrbGV0c1Byb2Nlc3NlZCkuIElmIDAgd2hlbgorICAgIC8vLyB3b3JrIGlzIHJldHVybmVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHdvcmtsZXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgYzJfc3RhdHVzX3QgcmVzdWx0OworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGZ1dHVyZSB3b3JrIHRvIGJlIHN1Ym1pdHRlZCB0byB0aGUgY29tcG9uZW50LiBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZCB0bworICogcmVzZXJ2ZSB0aGUgd29yayBmb3Igd29yayBvcmRlcmluZyBwdXJwb3Nlcy4KKyAqLworc3RydWN0IEMyV29ya091dGxpbmUgeworLy9wdWJsaWM6CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPGMyX25vZGVfaWRfdD4gY2hhaW47Cit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMldPUktfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlOWJhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KKworLyoqIFxmaWxlCisgKiBNYWNybyB1dGlsaXRpZXMgZm9yIHRoZSB1dGlscyBsaWJyYXJ5IHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGlmIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPVU5USU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gX0MyX0FSRygpIGV4cGFuZHMgdG8gJycsIHdoaWxlIF9DMl9BUkcoeCkgZXhwYW5kcyB0byAnLCB4JworLy8gX0MyX0FSR24oLi4uKSBkb2VzIHRoZSBzYW1lIGZvciBuIGFyZ3VtZW50cworI2RlZmluZSBfQzJfQVJHKC4uLikgLCAjI19fVkFfQVJHU19fCisjZGVmaW5lIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRyhfMSkgX0MyX0FSRyhfMikKKyNkZWZpbmUgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRzIoXzMsIF80KQorI2RlZmluZSBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHNChfNSwgXzYsIF83LCBfOCkKKyNkZWZpbmUgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgICAgICBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc4KF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpCisKKy8vIHJldHVybiB0aGUgNjV0aCBhcmd1bWVudAorI2RlZmluZSBfQzJfQVJHQ18zKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXzY0CisKKy8vLyBcZW5kaWYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICovCisvLyBXZSBkbyB0aGlzIGJ5IHByZXBlbmRpbmcgMSBhbmQgYXBwZW5kaW5nIDY1IGRlc2lnbmVkIHZhbHVlcyBzdWNoIHRoYXQgdGhlIDY1dGggZWxlbWVudAorLy8gd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyNkZWZpbmUgX0MyX0FSR0MoLi4uKSBfQzJfQVJHQ18xKDAsICMjX19WQV9BUkdTX18sIFwKKyAgICAgICAgNjQsIDYzLCA2MiwgNjEsIDYwLCA1OSwgNTgsIDU3LCA1NiwgNTUsIDU0LCA1MywgNTIsIDUxLCA1MCwgNDksIDQ4LCA0NywgNDYsIDQ1LCA0NCwgNDMsIFwKKyAgICAgICAgNDIsIDQxLCA0MCwgMzksIDM4LCAzNywgMzYsIDM1LCAzNCwgMzMsIDMyLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIzLCAyMiwgMjEsIFwKKyAgICAgICAgMjAsIDE5LCAxOCwgMTcsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKQorCisvLy8gXGlmIDAKKworLy8gc3RlcCAxLiByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gdGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bSBkZWZpbml0aW9ucworLy8gKE5PVEU6IHdlIGRvbid0IGtub3cgd2hpY2ggYXJndW1lbnQgd2lsbCBoYXZlIHRoaXMgdHJhaWxpbmcgY29tbWEgc28gd2UgaGF2ZSB0byB0cnkgYWxsKQorI2RlZmluZSBfQzJfQVJHQ18xKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXAorICAgIF9DMl9BUkdDXzIoXyBfQzJfQVJHKF8wKSBcCisgICAgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgIF9DMl9BUkcxNihfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIpIFwKKyAgICBfQzJfQVJHMTYoXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4KSBcCisgICAgX0MyX0FSRzE2KF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCksIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisvLyBzdGVwIDIuIHRoaXMgaXMgbmVlZGVkIGFzIHJlbW92ZWQgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgZW1wdHkgaW50byBhIG1hY3JvCisjZGVmaW5lIF9DMl9BUkdDXzIoLi4uKSBfQzJfQVJHQ18zKF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPTlZFUlNJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8vIFxpZiAwCisKKy8vIG1hY3JvcyB0aGF0IGNvbnZlcnQgXzEsIF8yLCBfMywgLi4uIHRvIGZuKF8xLCBhcmcpLCBmbihfMiwgYXJnKSwgZm4oXzMsIGFyZyksIC4uLgorI2RlZmluZSBfQzJfTUFQXzY0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzExKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF85KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF83KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKQorCisvLy8gXGVuZGlmCisKKy8qKgorICogTWFwcyBlYWNoIGFyZ3VtZW50IHVzaW5nIGFub3RoZXIgbWFjcm8geCAtPiBmbih4LCBhcmcpCisgKi8KKy8vIHVzZSB3cmFwcGVyIHRvIGNhbGwgdGhlIHByb3BlciBtYXBwZXIgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX01BUChmbiwgYXJnLCAuLi4pIF9DMl9NQVBfXyhfQzJfQVJHQyhfX1ZBX0FSR1NfXyksIGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisKKy8vLyBcaWYgMAorCisvLyBldmFsdWF0ZSBfbiBzbyBpdCBiZWNvbWVzIGEgbnVtYmVyCisjZGVmaW5lIF9DMl9NQVBfXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgX19WQV9BUkdTX18pCisvLyBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyCisjZGVmaW5lIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfIyNfbiAoZm4sIGFyZywgX19WQV9BUkdTX18pCisKKy8vLyBcZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmVhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyQlVGRkVSX0hfCisjZGVmaW5lIEFORFJPSURfQzJCVUZGRVJfSF8KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisvKiBVc2UgYW5kcm9pZCBuYXRpdmUgaGFuZGxlIGZvciBDMkhhbmRsZSAqLwordHlwZWRlZiA6Om5hdGl2ZV9oYW5kbGVfdCBDMkhhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEFuZHJvaWQgcGxhdGZvcm0gYnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLgorICovCitzdHJ1Y3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgOiBwdWJsaWMgQzJNZW1vcnlVc2FnZSB7CisgICAgaW5saW5lIEMyQW5kcm9pZE1lbW9yeVVzYWdlKGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlKSA6IEMyTWVtb3J5VXNhZ2UodXNhZ2UpIHsgfQorCisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV1c2UgZ3JhbGxvYyBmbGFncyB3aGVyZSBwb3NzaWJsZSwgYXMgQ29kZWMgMi4wIEFQSSBvbmx5IHVzZXMgYml0cyAwIGFuZCAxLgorICAgICAqLworICAgIGVudW0gY29uc3VtZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1JFQUQgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9SRUFEICAgPSBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsCisgICAgICAgIEhXX0NPTVBPU0VSX1JFQUQgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB2aWRlbyBkZWNvZGVyIHJlYWQgdXNhZ2UgZmxhZywgc28gdXNlIGVuY29kZXIgZm9yCisgICAgICAgIC8vIG5vdworICAgICAgICBIV19DT0RFQ19SRUFEICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgUkVBRF9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgZW51bSBwcm9kdWNlcl90IDogdWludDY0X3QgeworICAgICAgICBSRU5ERVJTQ1JJUFRfV1JJVEUgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9XUklURSAgID0gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPTVBPU0VSX1dSSVRFICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgSFdfQ09ERUNfV1JJVEUgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICAvLyBncmFsbG9jIGRvZXMgbm90IGRlZmluZSBhIHdyaXRlIHByb3RlY3RlZCB1c2FnZSBmbGFnLCBzbyB1c2UgcmVhZCBwcm90ZWN0ZWQKKyAgICAgICAgLy8gbm93CisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJNZW1vcnlVc2FnZSBGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBhc0dyYWxsb2NVc2FnZSgpIGNvbnN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMWEwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBUT0RPOiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPElJbnB1dFN1cmZhY2U+Cit0eXBlZGVmIDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gSW5wdXRTdXJmYWNlQmFzZTsKKworY2xhc3MgSW5wdXRTdXJmYWNlIDogcHVibGljIElucHV0U3VyZmFjZUJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIC8vIE1ldGhvZHMgZnJvbSBJSW5wdXRTdXJmYWNlCisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdFRvQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6QzJDb21wb25lbnQ+ICZjb21wKTsKKyAgICAvLyBUT0RPOiBpbnRmKCkKKworICAgIHN0YXRpYyBzcDxJbnB1dFN1cmZhY2U+IENyZWF0ZSgpOworCitwcml2YXRlOgorICAgIElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZiYXNlLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTsKKworICAgIHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0YTQxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBUT0RPOiBpbmhlcml0IGZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KK2NsYXNzIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpOworCisgICAgLy8gRnJvbSBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgIHZvaWQgZGlzY29ubmVjdCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBJbnB1dFN1cmZhY2U7CisKKyAgICAvLyBGb3IgSW5wdXRTdXJmYWNlCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIGJvb2wgaW5pdCgpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworCisgICAgY2xhc3MgSW1wbDsKKworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8SW1wbD4gbUltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dFN1cmZhY2VDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5ZmlsdGVyLnNoIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kODEzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworaW1wb3J0IHJlLCBzeXMKKworZ2xvYmFsIGluX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZAoraW5fY29tbWVudCwgY3VycmVudCwgaW5kZW50LCBob2xkID0gRmFsc2UsIE5vbmUsICcnLCBbXQorCitjbGFzcyBDaGFuZ2VDU3R5bGVDb21tZW50c1RvRG94eToKKyAgICBkZWYgZHVtcF9ob2xkKCk6CisgICAgICAgIGdsb2JhbCBob2xkCisgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIGRveHlfaG9sZCgpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaG9sZAorICAgICAgICBpZiBjdXJyZW50ID09ICcvLyc6CisgICAgICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgICAgIHByaW50KHJlLnN1YihyJ14oICovLyg/IS8pKScsIHInXDEvJywgaCksIGVuZD0nJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBpZiBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgaCA9IHJlLnN1YihyJ14oICovWypdKD8hWypdKSknLCByJ1wxKicsIGgpCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIHByb2Nlc3NfY29tbWVudCh0LCBpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50LCBob2xkCisgICAgICAgIGlmIHQgIT0gY3VycmVudCBvciBpbmQgbm90IGluIChpbmRlbnQsIGluZGVudCArICcgJyk6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICAgICAgY3VycmVudCwgaW5kZW50ID0gdCwgaW5kCisgICAgICAgIGhvbGQuYXBwZW5kKGxpbmUpCisKKyAgICBkZWYgcHJvY2Vzc19saW5lKGluZCwgbGluZSk6CisgICAgICAgIGdsb2JhbCBjdXJyZW50LCBpbmRlbnQKKyAgICAgICAgaWYgaW5kIGluIChpbmRlbnQsICcnKToKKyAgICAgICAgICAgIGRveHlfaG9sZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICBjdXJyZW50LCBpbmRlbnQgPSBOb25lLCBOb25lCisgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpbmQgPSByZS5tYXRjaChyJ14oICopJywgbGluZSkuZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIGluX2NvbW1lbnQ6CisgICAgICAgICAgICAgICAgIyBUT0RPOiB0aGlzIGlzIG5vdCBxdWl0ZSByaWdodCwgYnV0IGdvb2QgZW5vdWdoCisgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgaW5fY29tbWVudCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqLy8nLCBsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAjIG9uZS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8vJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtID0gcmUubWF0Y2gocideICovWypdJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBtdWx0aS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8qJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBub3QgcmUubWF0Y2gocideICpbKl0vJywgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJvY2Vzc19saW5lKGluZCwgbGluZSkKKworY2xhc3MgQXV0b0dyb3VwOgorICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgaWYgJy9jb2RlYzIvaW5jbHVkZS8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdBUEkgQ29kZWMyIEFQSScKKyAgICAgICAgZWxpZiBGYWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmICcvY29kZWMyL3ZuZGsvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnVk5ESyBQbGF0Zm9ybSBwcm92aWRlZCBnbHVlJworICAgICAgICBlbGlmICcvY29kZWMyL3Rlc3RzLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1Rlc3RzIFVuaXQgdGVzdHMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncm91cCA9ICdSYW5kb20gTWlzYy4gc2FuZGJveCcKKworICAgICAgICBwcmludCgnI3VuZGVmIF9fQVBQTEVfXycpCisKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpZiByZS5tYXRjaChyJ15uYW1lc3BhY2UgYW5kcm9pZCB7JywgbGluZSk6CisgICAgICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorICAgICAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBcYWRkdG9ncm91cCB7fScuZm9ybWF0KGdyb3VwKSkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAeycpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcmUubWF0Y2gocidefSArLy8gK25hbWVzcGFjZScsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KHInLy8vIEB9JykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKK1AgPSBBdXRvR3JvdXAoKQorZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgorICAgIHdpdGggb3BlbihwYXRoLCAncnQnKSBhcyBpbnB1dDoKKyAgICAgICAgUC5wcm9jZXNzKGlucHV0LCBwYXRoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcgYi9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5Z2VuLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNiZWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKQEAgLTAsMCArMSwyNDQ2IEBACisjIERveHlmaWxlIDEuOC4xMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IENvZGVjMgorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcworIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KKyMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCisjIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0gCisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYSBsb2dvIG9yIGFuIGljb24gdGhhdCBpcyBpbmNsdWRlZAorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1CisjIHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkKKyMgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gb3V0L3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIvYXBpCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIElmIHRoZSBBTExPV19VTklDT0RFX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWxsb3cgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgdG8gYXBwZWFyIGluIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgZmlsZXMuIElmIHNldCB0byBOTywgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZSBfeEUzX3g4MV94ODQgd2lsbCBiZSB1c2VkIGZvciBVbmljb2RlCisjIFUrMzA0NC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExPV19VTklDT0RFX05BTUVTICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgYnJpZWYgbWVtYmVyCisjIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGZpbGUgYW5kIGNsYXNzCisjIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YWRvYykuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbCBwYXRoCisjIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCB0byBOTyB0aGUKKyMgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMgorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IAorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlciAoYnV0CisjIGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyBkb2Vzbid0CisjIHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUKKyMgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhZG9jLXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhZG9jLXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LQorIyBzdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhIG5ldworIyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlIHBhcnQKKyMgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcgImNsYXNzPWl0Y2w6OmNsYXNzIgorIyB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPSAKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiAoZml4ZWQgZm9ybWF0IEZvcnRyYW46CisjIEZvcnRyYW5GaXhlZCwgZnJlZSBmb3JtYXR0ZWQgRm9ydHJhbjogRm9ydHJhbkZyZWUsIHVua25vd24gZm9ybWF0dGVkIEZvcnRyYW46CisjIEZvcnRyYW4uIEluIHRoZSBsYXRlciBjYXNlIHRoZSBwYXJzZXIgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciB0aGUgY29kZSBpcyBmaXhlZAorIyBvciBmcmVlIGZvcm1hdHRlZCBjb2RlLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBGb3J0cmFuIHR5cGUgZmlsZXMpLCBWSERMLiBGb3IKKyMgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdCBpcyBQSFApLAorIyBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuCisjCisjIE5vdGU6IEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPSAKKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKKyMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgorIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCisjIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7CisjIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IFlFUworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBJZiBvbmUgYWRkcyBhIHN0cnVjdCBvciBjbGFzcyB0byBhIGdyb3VwIGFuZCB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGVuIGFsc28KKyMgYW55IG5lc3RlZCBjbGFzcyBvciBzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhlIHNhbWUgZ3JvdXAuIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KKyMgaXMgZGlzYWJsZWQgYW5kIG9uZSBoYXMgdG8gYWRkIG5lc3RlZCBjb21wb3VuZHMgZXhwbGljaXRseSB2aWEgXGluZ3JvdXAuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR1JPVVBfTkVTVEVEX0NPTVBPVU5EUyA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBZRVMKKworIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzCisjIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZQorIyBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlIHNhbWUgc3ltYm9sIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gdGhlCisjIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZiBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbAorIyBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4gSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlCisjIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZQorIyBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2PTY1NTM2CisjIHN5bWJvbHMuIEF0IHRoZSBlbmQgb2YgYSBydW4gZG94eWdlbiB3aWxsIHJlcG9ydCB0aGUgY2FjaGUgdXNhZ2UgYW5kIHN1Z2dlc3QKKyMgdGhlIG9wdGltYWwgY2FjaGUgc2l6ZSBmcm9tIGEgc3BlZWQgcG9pbnQgb2Ygdmlldy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOSwgZGVmYXVsdCB2YWx1ZTogMC4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBJZiBzZXQgdG8gWUVTLCBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCisjIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQorIyBhcmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8sIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uCisjIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PLCB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCisjIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCisjIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIGZpbGUKKyMgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTLCB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMsIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfQ09NUE9VTkRfUkVGRVJFTkNFIHRhZyBpcyBzZXQgdG8gTk8gKGRlZmF1bHQpIHRoZW4gZG94eWdlbiB3aWxsCisjIGFwcGVuZCBhZGRpdGlvbmFsIHRleHQgdG8gYSBwYWdlJ3MgdGl0bGUsIHN1Y2ggYXMgQ2xhc3MgUmVmZXJlbmNlLiBJZiBzZXQgdG8KKyMgWUVTIHRoZSBjb21wb3VuZCByZWZlcmVuY2Ugd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9DT01QT1VORF9SRUZFUkVOQ0U9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKKyMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgorIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0CisjIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAorIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKKyMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCisjIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgorIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZworIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKKyMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAorIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKKyMgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdG9kbworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0CisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgYnVnCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKQorIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IElOVEVSTkFMCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUKKyMgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIC8gZGVmaW5lIGNhbiBoYXZlIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIGhlcmUKKyMgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gVGhlCisjIGFwcGVhcmFuY2Ugb2YgdGhlIHZhbHVlIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgLyBkZWZpbmVzIGNhbiBiZQorIyBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciBjb21tYW5kIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogMzAuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAorIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMsIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBTZWUgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoc3RkZXJyKSBieSBkb3h5Z2VuLiBJZiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTCisjIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB3YXJuaW5ncyBhcmUgb24uCisjCisjIFRpcDogVHVybiB3YXJuaW5ncyBvbiB3aGlsZSB3cml0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfVU5ET0NVTUVOVEVEIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZworIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9ET0NfRVJST1IgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSBwYXJhbWV0ZXJzCisjIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4aXN0IG9yIHVzaW5nCisjIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCisKKyMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0CisjIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgorIyB2YWx1ZS4gSWYgc2V0IHRvIE5PLCBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IHdyb25nIG9yIGluY29tcGxldGUKKyMgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KKworIyBJZiB0aGUgV0FSTl9BU19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbW1lZGlhdGVseSBzdG9wIHdoZW4KKyMgYSB3YXJuaW5nIGlzIGVuY291bnRlcmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fQVNfRVJST1IgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgbXlmaWxlLmNwcCBvcgorIyBkaXJlY3RvcmllcyBsaWtlIC91c3Ivc3JjL215cHJvamVjdC4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpdGgKKyMgc3BhY2VzLiBTZWUgYWxzbyBGSUxFX1BBVFRFUk5TIGFuZCBFWFRFTlNJT05fTUFQUElORworIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcworIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgorIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCisjIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHJlYWQgYnkgZG94eWdlbi4KKyMKKyMgSWYgbGVmdCBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsCisjICouYysrLCAqLmphdmEsICouaWksICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsCisjICouaGgsICouaHh4LCAqLmhwcCwgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywKKyMgKi5tLCAqLm1hcmtkb3duLCAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5weXcsICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwKKyMgKi52aGQsICoudmhkbCwgKi51Y2YsICoucXNmLCAqLmFzIGFuZCAqLmpzLgorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gQzIqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5oCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyBzaG91bGQKKyMgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMKKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAuXyoKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcworIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKKyMgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCisjIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgorIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gWUVTCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0gCisKKyMgSWYgdGhlIFVTRV9NREZJTEVfQVNfTUFJTlBBR0UgdGFnIHJlZmVycyB0byB0aGUgbmFtZSBvZiBhIG1hcmtkb3duIGZpbGUgdGhhdAorIyBpcyBwYXJ0IG9mIHRoZSBpbnB1dCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBtYWluIHBhZ2UKKyMgKGluZGV4Lmh0bWwpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9qZWN0IG9uIGZvciBpbnN0YW5jZSBHaXRIdWIKKyMgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIGludHJvZHVjdGlvbiBwYWdlIGFsc28gZm9yIHRoZSBkb3h5Z2VuIG91dHB1dC4KKworVVNFX01ERklMRV9BU19NQUlOUEFHRSA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKKyMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55CisjIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAorIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUyB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgdXNlIHRoZQorIyBjbGFuZyBwYXJzZXIgKHNlZTogaHR0cDovL2NsYW5nLmxsdm0ub3JnLykgZm9yIG1vcmUgYWNjdXJhdGUgcGFyc2luZyBhdCB0aGUKKyMgY29zdCBvZiByZWR1Y2VkIHBlcmZvcm1hbmNlLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCB3aXRoIHRlbXBsYXRlCisjIHJpY2ggQysrIGNvZGUgZm9yIHdoaWNoIGRveHlnZW4ncyBidWlsdC1pbiBwYXJzZXIgbGFja3MgdGhlIG5lY2Vzc2FyeSB0eXBlCisjIGluZm9ybWF0aW9uLgorIyBOb3RlOiBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgZG94eWdlbiB3YXMKKyMgZ2VuZXJhdGVkIHdpdGggdGhlIC1EdXNlLWxpYmNsYW5nPU9OIG9wdGlvbiBmb3IgQ01ha2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IFlFUworCisjIElmIGNsYW5nIGFzc2lzdGVkIHBhcnNpbmcgaXMgZW5hYmxlZCB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbXBpbGVyIHdpdGggY29tbWFuZAorIyBsaW5lIG9wdGlvbnMgdGhhdCB5b3Ugd291bGQgbm9ybWFsbHkgdXNlIHdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQKKyMgdGhlIGluY2x1ZGUgcGF0aHMgd2lsbCBhbHJlYWR5IGJlIHNldCBieSBkb3h5Z2VuIGZvciB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisjIHNwZWNpZmllZCB3aXRoIElOUFVUIGFuZCBJTkNMVURFX1BBVEguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIGlzIHNldCB0byBZRVMuCisKK0NMQU5HX09QVElPTlMgICAgICAgICAgPSAtc3RkPWMrKzE0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvcmUgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCisjIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPSAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgorIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gWUVTIGNhbiBoZWxwIHRvIHNob3cgd2hlbiBkb3h5Z2VuIHdhcyBsYXN0IHJ1biBhbmQgdGh1cyBpZiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBOTworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBZRVMKKworIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIGVudHJpZXMKKyMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlciBjYW4gZXhwYW5kCisjIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kIHRoZSB0cmVlIHRvCisjIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUgdmlzaWJsZSAodW5sZXNzCisjIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4gU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mCisjIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5IGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCisjIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkCisjIHRyZWUgYnkgZGVmYXVsdC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTk5OSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudAorIyBlbnZpcm9ubWVudCAoc2VlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy94Y29kZS8pLCBpbnRyb2R1Y2VkIHdpdGgKKyMgT1NYIDEwLjUgKExlb3BhcmQpLiBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgTWFrZWZpbGUgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluCisjIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nIG1ha2UgaW5zdGFsbCB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQgaXQgYXQKKyMgc3RhcnR1cC4gU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZG9jc2V0IGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzCisjIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyCisjIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSBjYW4gYmUgZ3JvdXBlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IERveHlnZW4gZ2VuZXJhdGVkIGRvY3MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbgorIyBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuCisjIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4gd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5CisjIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCisjIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIGdlbmVyYXRlcyB0aHJlZQorIyBhZGRpdGlvbmFsIEhUTUwgaW5kZXggZmlsZXM6IGluZGV4LmhocCwgaW5kZXguaGhjLCBhbmQgaW5kZXguaGhrLiBUaGUKKyMgaW5kZXguaGhwIGlzIGEgcHJvamVjdCBmaWxlIHRoYXQgY2FuIGJlIHJlYWQgYnkgTWljcm9zb2Z0J3MgSFRNTCBIZWxwIFdvcmtzaG9wCisjIChzZWU6IGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MjExMzgpIG9uCisjIFdpbmRvd3MuCisjCisjIFRoZSBIVE1MIEhlbHAgV29ya3Nob3AgY29udGFpbnMgYSBjb21waWxlciB0aGF0IGNhbiBjb252ZXJ0IGFsbCBIVE1MIG91dHB1dAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpbnRvIGEgc2luZ2xlIGNvbXBpbGVkIEhUTUwgZmlsZSAoLmNobSkuIENvbXBpbGVkIEhUTUwKKyMgZmlsZXMgYXJlIG5vdyB1c2VkIGFzIHRoZSBXaW5kb3dzIDk4IGhlbHAgZm9ybWF0LCBhbmQgd2lsbCByZXBsYWNlIHRoZSBvbGQKKyMgV2luZG93cyBoZWxwIGZvcm1hdCAoLmhscCkgb24gYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGluIHRoZSBmdXR1cmUuIENvbXByZXNzZWQKKyMgSFRNTCBmaWxlcyBhbHNvIGNvbnRhaW4gYW4gaW5kZXgsIGEgdGFibGUgb2YgY29udGVudHMsIGFuZCB5b3UgY2FuIHNlYXJjaCBmb3IKKyMgd29yZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBIVE1MIHdvcmtzaG9wIGFsc28gY29udGFpbnMgYSB2aWV3ZXIgZm9yCisjIGNvbXByZXNzZWQgSFRNTCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KKyMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSwKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQKKyMgKFlFUykgb3IgYSBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLiBGdXJ0aGVybW9yZSBpdAorIyBlbmFibGVzIHRoZSBQcmV2aW91cyBhbmQgTmV4dCBidXR0b25zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycyB0bworIyB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdAorIyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscAorIyAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCisjIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0IEhlbHAKKyMgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gTmFtZXNwYWNlCisjIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQKKyMgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBWaXJ0dWFsCisjIEZvbGRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtCisjIGZvbGRlcnMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogZG9jLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9IAorCisjIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCisjIHByb2plY3QncyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLiBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlcyAoc2VlOgorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKKyMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAorIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCisjIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAorIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcworIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KKyMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZSBzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KKyMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQorIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKKyMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCisjIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCisjIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBJZiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmUtcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3JzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUgRVhURVJOQUxfU0VBUkNICisjIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yIHNlYXJjaGluZyBhbmQKKyMgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQgdGhlIGluZGV4aW5nCisjIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZSB0aGUgc2VjdGlvbgorIyAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgTGFUZVggb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBMYVRlWAorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIExhVGVYIHBhY2thZ2UgbmFtZXMKKyMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBqdXN0CisjIGJ5IGl0cyBuYW1lIG9yIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IGFzIHRvIGJlIHVzZWQgd2l0aCB0aGUgTGFUZVgKKyMgXHVzZXBhY2thZ2UgY29tbWFuZC4gVG8gZ2V0IHRoZSB0aW1lcyBmb250IGZvciBpbnN0YW5jZSB5b3UgY2FuIHNwZWNpZnkgOgorIyBFWFRSQV9QQUNLQUdFUz10aW1lcyBvciBFWFRSQV9QQUNLQUdFUz17dGltZXN9CisjIFRvIHVzZSB0aGUgb3B0aW9uIGludGxpbWl0cyB3aXRoIHRoZSBhbXNtYXRoIHBhY2thZ2UgeW91IGNhbiBzcGVjaWZ5OgorIyBFWFRSQV9QQUNLQUdFUz1baW50bGltaXRzXXthbXNtYXRofQorIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlciwKKyMgJHByb2plY3RicmllZiwgJHByb2plY3Rsb2dvLiBEb3h5Z2VuIHdpbGwgcmVwbGFjZSAkdGl0bGUgd2l0aCB0aGUgZW1wdHkKKyMgc3RyaW5nLCBmb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlcyBvZiB0aGUgb3RoZXIgY29tbWFuZHMgdGhlIHVzZXIgaXMgcmVmZXJyZWQKKyMgdG8gSFRNTF9IRUFERVIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgZm9vdGVyLiBTZWUKKyMgTEFURVhfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgZm9vdGVyIGFuZCB3aGF0CisjIHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgTGFUZVggc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMgY3JlYXRlZAorIyBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gRG94eWdlbgorIyB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX1NUWUxFU0hFRVQgPSAKKworIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIGlzCisjIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIFBERiAodXNpbmcgcHMycGRmIG9yIHBkZmxhdGV4KS4gVGhlIFBERiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKKyMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgUERGIHZpZXdlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUywgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXGJhdGNobW9kZQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIHJ1bm5pbmcKKyMgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4gVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkCisjIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQorIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlCisjIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcworIyBTT1VSQ0VfQlJPV1NFUi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBhbmQgXGNpdGUgZm9yIG1vcmUgaW5mby4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBsYWluLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluCisKKyMgSWYgdGhlIExBVEVYX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9USU1FU1RBTVAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0LiBUaGUKKyMgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB0b28gcHJldHR5IHdpdGggb3RoZXIgUlRGCisjIHJlYWRlcnMvZWRpdG9ycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogcnRmLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCB3aWxsCisjIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MCisjIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lCisjIGJyb3dzaW5nIHVzaW5nIFdvcmQgb3Igc29tZSBvdGhlciBXb3JkIGNvbXBhdGlibGUgcmVhZGVycyB0aGF0IHN1cHBvcnQgdGhvc2UKKyMgZmllbGRzLgorIworIyBOb3RlOiBXb3JkUGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcKKyMgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlIHJlcGxhY2VtZW50cywKKyMgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisjCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgc3R5bGUgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIyBJZiB0aGUgUlRGX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlIGNvZGUKKyMgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBSVEYgb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfU09VUkNFX0NPREUgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgVGhlIE1BTl9TVUJESVIgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjcmVhdGVkIHdpdGhpbgorIyBNQU5fT1VUUFVUIGluIHdoaWNoIHRoZSBtYW4gcGFnZXMgYXJlIHBsYWNlZC4gSWYgZGVmYXVsdHMgdG8gbWFuIGZvbGxvd2VkIGJ5CisjIE1BTl9FWFRFTlNJT04gd2l0aCB0aGUgaW5pdGlhbCAuIHJlbW92ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX1NVQkRJUiAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKKyMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAorIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKKyMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBkdW1wIHRoZSBwcm9ncmFtCisjIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvCisjIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUKKyMgb2YgdGhlIFhNTCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBET0NCT09LIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9ET0NCT09LIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIyBJZiB0aGUgRE9DQk9PS19QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgdGhlCisjIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZworIyBpbmZvcm1hdGlvbikgdG8gdGhlIERPQ0JPT0sgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkKKyMgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIERPQ0JPT0sgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4KKyMgQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZQorIyBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzCisjIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQorIyBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkKKyMgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTywgdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTywgb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gL1ZvbHVtZXMvQS9hb3NwL3ByZWJ1aWx0cy9jbGFuZy9kYXJ3aW4teDg2L2hvc3QvMy42L2xpYi9jbGFuZy8zLjYvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2xpYmN4eC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybTY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvZXh0ZXJuYWwvZ3Rlc3QKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBfX0FQUExFX189IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0FORFJPSURfXz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEOj0xIFwKKwkJCSBfX3VudXNlZD0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUworCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlCisjIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MKKyMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCisjIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIGluY2x1ZGUgZGlhZ3JhbXMgbWFkZSB3aXRoIGRpYSBpbiBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIERveHlnZW4gd2lsbAorIyB0aGVuIHJ1biBkaWEgdG8gcHJvZHVjZSB0aGUgZGlhZ3JhbSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUKKyMgRElBX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkaWEgYmluYXJ5IHJlc2lkZXMuCisjIElmIGxlZnQgZW1wdHkgZGlhIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK0RJQV9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBJZiBzZXQgdG8gWUVTIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgaW4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCisjIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbgorIyBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUKKyMgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCisjIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKKyMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKKyMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKKyMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKKyMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKKyMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bworIyAxMC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAorCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZ3JhcGguCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsZXIgZ3JhcGggY2FuIGJlCisjIGFjY29tcGxpc2hlZCBieSBtZWFucyBvZiB0aGUgY29tbWFuZCBcaGlkZWNhbGxlcmdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCisjIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKKyMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQorIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbWFnZSBmb3JtYXRzIHNlZSB0aGUgc2VjdGlvbgorIyBvdXRwdXQgZm9ybWF0cyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZG90IHRvb2wgKEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLykpLgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYsIHN2ZywgcG5nOmdkLCBwbmc6Z2Q6Z2QsIHBuZzpjYWlybywKKyMgcG5nOmNhaXJvOmdkLCBwbmc6Y2Fpcm86Y2Fpcm8sIHBuZzpjYWlybzpnZGlwbHVzLCBwbmc6Z2RpcGx1cyBhbmQKKyMgcG5nOmdkaXBsdXM6Z2RpcGx1cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgUExBTlRVTUxfSkFSX1BBVEggdGFnIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlCisjIHBhdGggd2hlcmUgamF2YSBjYW4gZmluZCB0aGUgcGxhbnR1bWwuamFyIGZpbGUuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQKKyMgUGxhbnRVTUwgaXMgbm90IHVzZWQgb3IgY2FsbGVkIGR1cmluZyBhIHByZXByb2Nlc3Npbmcgc3RlcC4gRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBcc3RhcnR1bWwgY29tbWFuZCBpbiB0aGlzIGNhc2UgYW5kCisjIHdpbGwgbm90IGdlbmVyYXRlIG91dHB1dCBmb3IgdGhlIGRpYWdyYW0uCisKK1BMQU5UVU1MX0pBUl9QQVRIICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgc3BlY2lmaWVkIHBhdGhzIGFyZSBzZWFyY2hlZCBmb3IgZmlsZXMgc3BlY2lmaWVkIGJ5CisjIHRoZSAhaW5jbHVkZSBzdGF0ZW1lbnQgaW4gYSBwbGFudHVtbCBibG9jay4KKworUExBTlRVTUxfSU5DTFVERV9QQVRIICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgdG8gYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKKyMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCisjIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jb21wb25lbnRfd3JhcHBlciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50V3JhcHBlci5jcHAiLAorICAgICAgICAiU2ltcGxlTWV0aG9kU3RhdGUuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRXcmFwcGVyIgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworYzJfc3RhdHVzX3QgV3JhcFNpbXBsZU1ldGhvZCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdCh2b2lkKT4gb3AsIGNvbnN0IFNpbXBsZU1ldGhvZFN0YXRlICZzdGF0ZSkgeworICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IEMyX09LOworICAgIHN3aXRjaCAoc3RhdGUuZ2V0TW9kZSgpKSB7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkVYRUNVVEU6CisgICAgICAgICAgICByZXN1bHQgPSBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6Ok5PX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkhBTkc6CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpc3RhdGUub3ZlcnJpZGVSZXN1bHQoJnJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OkluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeikgOiBtVGhpeih0aGl6KSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3Rlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFNpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3RlcigmbVRoaXotPm1TdGFydFN0YXRlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6TGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcikgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKK3ZvaWQgQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgbUxpc3RlbmVyLT5vbldvcmtEb25lX25iKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgbUxpc3RlbmVyLT5vblRyaXBwZWRfbmIoY29tcG9uZW50LHNldHRpbmdSZXN1bHQpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uRXJyb3JfbmIoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgbUxpc3RlbmVyLT5vbkVycm9yX25iKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpDMkNvbXBvbmVudFdyYXBwZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApIDogbUNvbXAoY29tcCkge30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUxpc3RlbmVyID0gc3RkOjptYWtlX3NoYXJlZDxMaXN0ZW5lcj4obGlzdGVuZXIpOworICAgIHJldHVybiBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBtYXlCbG9jayk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPmFubm91bmNlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpmbHVzaF9zbSgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgIHJldHVybiBtQ29tcC0+Zmx1c2hfc20obW9kZSwgZmx1c2hlZFdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OmRyYWluX25iKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBtQ29tcC0+ZHJhaW5fbmIobW9kZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFdyYXBTaW1wbGVNZXRob2QoW3RoaXNdIHsgcmV0dXJuIG1Db21wLT5zdGFydCgpOyB9LCBtU3RhcnRTdGF0ZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpyZXNldCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlbGVhc2UoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBDMkNvbXBvbmVudFdyYXBwZXI6OmludGYoKXsKKyAgICByZXR1cm4gbUNvbXAtPmludGYoKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3RlciBDMkNvbXBvbmVudFdyYXBwZXI6OmluamVjdCgpIHsKKyAgICByZXR1cm4gSW5qZWN0ZXIodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MzUwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworI2RlZmluZSBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIlNpbXBsZU1ldGhvZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDcmVhdGVzIGEgV3JhcHBlciBhcm91bmQgdGhlIGNsYXNzIEMyQ29tcG9uZW50IGFuZCBpdHMgbWV0aG9kcy4gVGhlIHdyYXBwZXIgaXMgdXNlZCB0bworICogc2ltdWxhdGUgZXJyb3JzIGluIHRoZSBhbmRyb2lkIG1lZGlhIGNvbXBvbmVudHMgYnkgZmF1bHQgaW5qZWN0aW9uIHRlY2huaXF1ZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBjaGVjayBob3cgdGhlIGZyYW1ld29yayBoYW5kbGVzIHRoZSBlcnJvciBzaXR1YXRpb24uCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50V3JhcHBlcgorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJDb21wb25lbnRXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoQzJDb21wb25lbnRXcmFwcGVyICp0aGl6KTsKKworICAgICAgICBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgc3RhcnQoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDMkNvbXBvbmVudFdyYXBwZXIgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBsaXN0ZW5lciBjbGFzcyBpbnNpZGUgQzJDb21wb25lbnQgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisKKyAgICBleHBsaWNpdCBDMkNvbXBvbmVudFdyYXBwZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgdmlydHVhbCB+QzJDb21wb25lbnRXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICBJbmplY3RlciBpbmplY3QoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wOworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUgbVN0YXJ0U3RhdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5jcHAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVNZXRob2RTdGF0ZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3Rlcjo6SW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopIDogbVRoaXoodGhpeikge30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmhhbmcoKSB7CisgICAgbVRoaXotPm1Nb2RlID0gSEFORzsKK30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmZhaWwoYzJfc3RhdHVzX3QgZXJyLCBib29sIGV4ZWN1dGUpIHsKKyAgICBtVGhpei0+bU1vZGUgPSBleGVjdXRlID8gRVhFQ1VURSA6IE5PX09QOworICAgIG1UaGl6LT5tT3ZlcnJpZGUgPSB0cnVlOworICAgIG1UaGl6LT5tUmVzdWx0T3ZlcnJpZGUgPSBlcnI7Cit9CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpTaW1wbGVNZXRob2RTdGF0ZSgpCisgICAgOiBtTW9kZShFWEVDVVRFKSwgbU92ZXJyaWRlKGZhbHNlKSwgbVJlc3VsdE92ZXJyaWRlKEMyX09LKSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6TW9kZSBTaW1wbGVNZXRob2RTdGF0ZTo6Z2V0TW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1vZGU7Cit9CisKK2Jvb2wgU2ltcGxlTWV0aG9kU3RhdGU6Om92ZXJyaWRlUmVzdWx0KGMyX3N0YXR1c190ICpyZXN1bHQpIGNvbnN0IHsKKyAgICBpZiAoIW1PdmVycmlkZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpyZXN1bHQgPSBtUmVzdWx0T3ZlcnJpZGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisjZGVmaW5lIFNJTVBMRV9NRVRIT0RfU1RBVEVfSF8KKworI2luY2x1ZGUgPEMyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTdGF0ZSBmb3IgYSBzaW1wbGUgbWV0aG9kIHdoaWNoIHJldHVybnMgYzJfc3RhdHVzX3QgYW5kIHRha2VzIG5vIHBhcmFtZXRlcnMuCisgKi8KK2NsYXNzIFNpbXBsZU1ldGhvZFN0YXRlIHsKK3B1YmxpYzoKKyAgICBlbnVtIE1vZGUgeworICAgICAgICAvLyBFeGVjdXRlIHRoZSBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIEVYRUNVVEUsCisgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nCisgICAgICAgIE5PX09QLAorICAgICAgICAvLyBIYW5nOyBuZXZlciByZXR1cm4KKyAgICAgICAgSEFORywKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5qZWN0ZXIgY2xhc3MgdGhhdCBtb2RpZmllcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5nIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGhhbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmFpbCB0aGUgb3BlcmF0aW9uIHdpdGggZ2l2ZW4gcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm9yIGNvZGUgdG8gcmVwbGFjZSB0aGUgYWN0dWFsIHJldHVybiB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZXhlY3V0ZSAgIHdoZXRoZXIgdGhlIHdyYXBwZXIgc2hvdWxkIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlID0gZmFsc2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGUgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICBTaW1wbGVNZXRob2RTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGV4ZWN1dGlvbiBtb2RlLgorICAgICAqLworICAgIE1vZGUgZ2V0TW9kZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcmVzdWx0IGZyb20gcnVubmluZyB0aGUgb3BlcmF0aW9uIGlmIGNvbmZpZ3VyZWQgc28uCisgICAgICovCisgICAgYm9vbCBvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbU92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG1SZXN1bHRPdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWQ2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRTdG9yZS5jcHAiLAorICAgICAgICAiQ29uZmlndXJhYmxlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2UuY3BwIiwKKyAgICAgICAgIklucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgInR5cGVzLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzeXN0ZW1faGVhZGVycyIsCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLCAvLyBwcml2YXRlCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgQ29kZWMgMi4wIEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDEwNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgQ29uZmlndXJhYmxlQzJJbnRmIGJhc2VkIG9uIEMyQ29tcG9uZW50SW50ZXJmYWNlCitzdHJ1Y3QgQ29tcEludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBDb21wSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRmKSA6CisgICAgICAgIENvbmZpZ3VyYWJsZUMySW50ZihpbnRmLT5nZXROYW1lKCkpLAorICAgICAgICBtSW50ZihpbnRmKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR1YoImNvbmZpZyIpOworICAgICAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigicXVlcnkiKTsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwgaW5kaWNlcywgbWF5QmxvY2ssIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigicXVlcnlTdXBwb3J0ZWRQYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyIpOworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIElucHV0QnVmZmVyTWFuYWdlcgorLy8gPT09PT09PT09PT09PT09PT09CisvLworLy8gSW5wdXRCdWZmZXJNYW5hZ2VyIHByZXNlbnRzIGEgd2F5IHRvIHRyYWNrIGFuZCB1bnRyYWNrIGlucHV0IGJ1ZmZlcnMgaW4gdGhpcworLy8gKGNvZGVjKSBwcm9jZXNzIGFuZCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGEgbGlzdGVuZXIsIHBvc3NpYmx5IGluIGEKKy8vIGRpZmZlcmVudCBwcm9jZXNzLCB3aGVuIGEgdHJhY2tlZCBidWZmZXIgbm8gbG9uZ2VyIGhhcyBhbnkgcmVmZXJlbmNlcyBpbiB0aGlzCisvLyBwcm9jZXNzLiAoSW4gZmFjdCwgdGhpcyBjbGFzcyB3b3VsZCB3b3JrIGZvciBsaXN0ZW5lcnMgaW4gdGhlIHNhbWUgcHJvY2VzcworLy8gdG9vLCBidXQgdGhlIG9wdGltaXphdGlvbiBkaXNjdXNzZWQgYmVsb3cgd2lsbCBub3QgYmUgYmVuZWZpY2lhbC4pCisvLworLy8gSW5wdXRCdWZmZXJNYW5hZ2VyIGhvbGRzIGEgY29sbGVjdGlvbiBvZiByZWNvcmRzIHJlcHJlc2VudGluZyB0cmFja2VkIGJ1ZmZlcnMKKy8vIGFuZCB0aGVpciBjYWxsYmFjayBsaXN0ZW5lcnMuIENvbmNlcHR1YWxseSwgb25lIHJlY29yZCBpcyBhIHRyaXBsZSAobGlzdGVuZXIsCisvLyBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgd2hlcmUKKy8vCisvLyAtIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgaXMgYSBwYWlyIG9mIGluZGljZXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYnVmZmVyLgorLy8gLSBsaXN0ZW5lciBpcyBvZiB0eXBlIElDb21wb25lbnRMaXN0ZW5lci4gSXRzIG9uRnJhbWVzUmVuZGVyZWQoKSBmdW5jdGlvbgorLy8gICB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgYXNzb2NpYXRlZCBidWZmZXIgZGllcy4gVGhlIGFyZ3VtZW50IG9mCisvLyAgIG9uRnJhbWVzUmVuZGVyZWQoKSBpcyBhIGxpc3Qgb2YgUmVuZGVyZWRGcmFtZSBvYmplY3RzLCBlYWNoIG9mIHdoaWNoIGhhcworLy8gICB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisvLworLy8gICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQKKy8vICAgICBpbnQzMl90ICBzbG90SWQKKy8vICAgICBpbnQ2NF90ICB0aW1lc3RhbXBOcworLy8KKy8vIFdoZW4gYSB0cmFja2VkIGJ1ZmZlciBhc3NvY2lhdGVkIHRvIHRoZSB0cmlwbGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorLy8gYnVmZmVySW5kZXgpIGdvZXMgb3V0IG9mIHNjb3BlLCBsaXN0ZW5lci0+b25GcmFtZXNSZW5kZXJlZCgpIHdpbGwgYmUgY2FsbGVkCisvLyB3aXRoIGEgUmVuZGVyZWRGcmFtZSBvYmplY3Qgd2hvc2UgbWVtYmVycyBhcmUgc2V0IGFzIGZvbGxvd3M6CisvLworLy8gICAgIGJ1ZmZlclF1ZXVlSWQgPSBmcmFtZUluZGV4CisvLyAgICAgc2xvdElkICAgICAgICA9IH5idWZmZXJJbmRleAorLy8gICAgIHRpbWVzdGFtcE5zICAgPSBzeXN0ZW1UaW1lKCkgYXQgdGhlIHRpbWUgb2Ygbm90aWZpY2F0aW9uCisvLworLy8gVGhlIHJlYXNvbiBmb3IgdGhlIGJpdHdpc2UgbmVnYXRpb24gb2YgYnVmZmVySW5kZXggaXMgdGhhdCBvbkZyYW1lc1JlbmRlcmVkKCkKKy8vIG1heSBiZSB1c2VkIGZvciBhIGRpZmZlcmVudCBwdXJwb3NlIHdoZW4gc2xvdElkIGlzIG5vbi1uZWdhdGl2ZSAod2hpY2ggaXMgYQorLy8gbW9yZSBnZW5lcmFsIHVzZSBjYXNlKS4KKy8vCisvLyBJUEMgT3B0aW1pemF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2luY2Ugb25GcmFtZXNSZW5kZXJlZCgpIGdlbmVyYWxseSBpcyBhbiBJUEMgY2FsbCwgSW5wdXRCdWZmZXJNYW5hZ2VyIHRyaWVzCisvLyBub3QgdG8gY2FsbCBpdCB0b28gb2Z0ZW4uIFRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIGd1YXJhbnRlZSB0aGF0IGFueSB0d28KKy8vIGNhbGxzIHRvIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhdCBsZWFzdCBrTm90aWZpY2F0aW9uUGVyaW9kTnMgbmFub3NlY29uZHMKKy8vIGFwYXJ0LgorLy8KK3N0cnVjdCBJbnB1dEJ1ZmZlck1hbmFnZXIgeworICAgIC8vIFRoZSBtaW5pbXVtIHRpbWUgcGVyaW9kIGJldHdlZW4gSVBDIGNhbGxzIHRvIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IHRoZQorICAgIC8vIGRlc3RydWN0aW9uIG9mIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtOb3RpZmljYXRpb25QZXJpb2ROcyA9IDEwMDAwMDA7CisKKyAgICAvLyBUcmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAvLworICAgIC8vIGlucHV0IChDMkZyYW1lRGF0YSkgaGFzIHRoZSBmb2xsb3dpbmcgdHdvIG1lbWJlcnMgdGhhdCBhcmUgb2YgaW50ZXJlc3Q6CisgICAgLy8KKyAgICAvLyAgIEMyV29ya09yZGluYWwgICAgICAgICAgICAgICAgb3JkaW5hbAorICAgIC8vICAgdmVjdG9yPHNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIHJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCkgd2lsbCByZWdpc3RlciBtdWx0aXBsZQorICAgIC8vIHRyaXBsZXMgKCwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHdoZXJlIGZyYW1lSW5kZXggaXMgZXF1YWwgdG8KKyAgICAvLyBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggYW5kIGJ1ZmZlckluZGV4IHJ1bnMgdGhyb3VnaCB0aGUgaW5kaWNlcyBvZgorICAgIC8vIGlucHV0LmJ1ZmZlcnMgc3VjaCB0aGF0IGlucHV0LmJ1ZmZlcnNbYnVmZmVySW5kZXhdIGlzIG5vdCBudWxsLgorICAgIC8vCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gcXVldWUoKS4KKyAgICBzdGF0aWMgdm9pZCByZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8vIFVudHJhY2sgYWxsIGJ1ZmZlcnMgaW4gYSBDMkZyYW1lRGF0YSBvYmplY3QuCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgIC8vIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZpLCBidWZmZXJJbmRleCkgc3VjaCB0aGF0CisgICAgLy8gbCA9IGxpc3RlbmVyIGFuZCBmaSA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC4KKyAgICAvLworICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIG9uV29ya0RvbmUoKSBhbmQgZmx1c2goKS4KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLy8gVW50cmFjayBhbGwgYnVmZmVycyBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gbGlzdGVuZXIuCisgICAgLy8KKyAgICAvLyBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgLy8gcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHN1Y2gKKyAgICAvLyB0aGF0IGwgPSBsaXN0ZW5lci4KKyAgICAvLworICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgY2xlYW5zIHVwIGFsbCBpbnB1dCBidWZmZXJzLAorICAgIC8vIGkuZS4sIHdoZW4gcmVzZXQoKSwgcmVsZWFzZSgpLCBzdG9wKCkgb3IgfkNvbXBvbmVudCgpIGlzIGNhbGxlZC4KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworCitwcml2YXRlOgorICAgIHZvaWQgX3JlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworICAgIHZvaWQgX3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKworICAgIC8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aWVkIHRvIEMyQnVmZmVyIG9iamVjdHMuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBzSW5zdGFuY2UgaXMgdGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcworICAgIC8vICAgICAgIGNsYXNzLgorICAgIHN0YXRpYyB2b2lkIG9uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisgICAgdm9pZCBfb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKTsKKworICAgIC8vIENvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHdlYWsgcG9pbnRlcnMuCisgICAgc3RydWN0IENvbXBhcmVXZWFrQ29tcG9uZW50TGlzdGVuZXIgeworICAgICAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcigpKAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIHgsCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgeSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHguZ2V0X3JlZnMoKSA8IHkuZ2V0X3JlZnMoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBQZXJzaXN0ZW50IGRhdGEgdG8gYmUgcGFzc2VkIGFzICJhcmciIGluIG9uQnVmZmVyRGVzdHJveWVkKCkuCisgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHBsdXMgYQorICAgIC8vIHdlYWsgcG9pbnRlciB0byB0aGUgQzJCdWZmZXIgb2JqZWN0LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSAia2V5IiBpcyBidWZmZXJJbmRleCBhY2NvcmRpbmcgdG8gb3BlcmF0b3I8KCkuIFRoaXMgaXMKKyAgICAvLyBkZXNpZ25lZCB0byB3b3JrIHdpdGggVHJhY2tlZEJ1ZmZlcnNNYXAgZGVmaW5lZCBiZWxvdy4KKyAgICBzdHJ1Y3QgVHJhY2tlZEJ1ZmZlciB7CisgICAgICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgICAgOiBsaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgZnJhbWVJbmRleChmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleChidWZmZXJJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCBUcmFja2VkQnVmZmVyJikgPSBkZWZhdWx0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBUcmFja2VkQnVmZmVyJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4IDwgb3RoZXIuYnVmZmVySW5kZXg7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwOiBsaXN0ZW5lciAtPiBmcmFtZUluZGV4IC0+IHNldDxUcmFja2VkQnVmZmVyPi4KKyAgICAvLyBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICAgIC8vIGJ1ZmZlckluZGV4KSB0aGF0J3Mgc2VhcmNoYWJsZSBieSBsaXN0ZW5lciBhbmQgKGxpc3RlbmVyLCBmcmFtZUluZGV4KS4KKyAgICAvLyBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGlubmVybW9zdCBtYXAgaXMgVHJhY2tlZEJ1ZmZlciwgd2hpY2ggYWxzbworICAgIC8vIGNvbnRhaW5zIGFuIGV4dHJhIGNvcHkgb2YgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXguIFRoaXMgaXMgbmVlZGVkCisgICAgLy8gYmVjYXVzZSBvbkJ1ZmZlckRlc3Ryb3llZCgpIG5lZWRzIHRvIGtub3cgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXggdG9vLgorICAgIHR5cGVkZWYgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+LAorICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZVdlYWtDb21wb25lbnRMaXN0ZW5lcj4gVHJhY2tlZEJ1ZmZlcnNNYXA7CisKKyAgICAvLyBTdG9yYWdlIGZvciBwZW5kaW5nICh1bnNlbnQpIGRlYXRoIG5vdGlmaWNhdGlvbnMgZm9yIG9uZSBsaXN0ZW5lci4KKyAgICAvLyBFYWNoIHBhaXIgaW4gbWVtYmVyIG5hbWVkICJpbmRpY2VzIiBhcmUgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBmcm9tCisgICAgLy8gdGhlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHRyaXBsZS4KKyAgICBzdHJ1Y3QgRGVhdGhOb3RpZmljYXRpb25zIHsKKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci4KKyAgICAgICAgLy8gY291bnQgbWF5IGJlIDAsIGluIHdoaWNoIGNhc2UgdGhlIERlYXRoTm90aWZpY2F0aW9ucyBvYmplY3Qgd2lsbAorICAgICAgICAvLyByZW1haW4gdmFsaWQgZm9yIG9ubHkgYSBzbWFsbCBwZXJpb2QgKGtOb3RpZmljYXRpb25QZXJpb2ROcworICAgICAgICAvLyBuYW5vc2Vjb25kcykuCisgICAgICAgIHNpemVfdCBjb3VudDsKKworICAgICAgICAvLyBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBjYWxsYmFjayBvbiB0aGlzIGxpc3RlbmVyLiBUaGlzIGlzCisgICAgICAgIC8vIHVzZWQgdG8gZ3VhcmFudGVlIHRoYXQgY2FsbGJhY2tzIGRvIG5vdCBvY2N1ciB0b28gZnJlcXVlbnRseSwgYW5kCisgICAgICAgIC8vIGFsc28gdG8gdHJpZ2dlciBleHBpcmF0aW9uIG9mIGEgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB0aGF0IGhhcworICAgICAgICAvLyBjb3VudCA9IDAuCisgICAgICAgIG5zZWNzX3QgbGFzdFNlbnROczsKKworICAgICAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gdmVjdG9yIG9mIGJ1ZmZlckluZGljZXMKKyAgICAgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbGxlY3Rpb24gb2YgKGZyYW1kZUluZGV4LCBidWZmZXJJbmRleCkuCisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzaXplX3Q+PiBpbmRpY2VzOworCisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucygpCisgICAgICAgICAgICAgIDogY291bnQoMCksCisgICAgICAgICAgICAgICAgbGFzdFNlbnROcyhzeXN0ZW1UaW1lKCkgLSBrTm90aWZpY2F0aW9uUGVyaW9kTnMpLAorICAgICAgICAgICAgICAgIGluZGljZXMoKSB7fQorICAgIH07CisKKyAgICAvLyBNdXRleCBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBUcmFja2VkIGlucHV0IGJ1ZmZlcnMuCisgICAgVHJhY2tlZEJ1ZmZlcnNNYXAgbVRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gRGVhdGggbm90aWZpY2F0aW9ucyB0byBiZSBzZW50LgorICAgIC8vCisgICAgLy8gQSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IGlzIGFzc29jaWF0ZWQgdG8gZWFjaCBsaXN0ZW5lci4gQW4gZW50cnkgaW4KKyAgICAvLyB0aGlzIG1hcCB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIGFzc29jaWF0ZWQgRGVhdGhOb3RpZmljYXRpb25zIGhhcyBjb3VudCA9CisgICAgLy8gMCBhbmQgbGFzdFNlbnROcyA8IHN5c3RlbVRpbWUoKSAtIGtOb3RpZmljYXRpb25QZXJpb2ROcy4KKyAgICBzdGQ6Om1hcDx3cDxJQ29tcG9uZW50TGlzdGVuZXI+LCBEZWF0aE5vdGlmaWNhdGlvbnM+IG1EZWF0aE5vdGlmaWNhdGlvbnM7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgc2lnbmFsZWQgd2hlbiBhbiBlbnRyeSBpcyBhZGRlZCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1PbkJ1ZmZlckRlc3Ryb3llZDsKKworICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorICAgIC8vIFJldHVybiBmYWxzZSBpZiBhbGwgZGVzdHJ1Y3Rpb25zIGhhdmUgYmVlbiBub3RpZmllZC4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSBkdXJhdGlvbiB0byB3YWl0IGZvciBiZWZvcmUKKyAgICAvLyByZXRyeWluZyBpZiBzb21lIGRlc3RydWN0aW9ucyBoYXZlIG5vdCBiZWVuIG5vdGlmaWVkLgorICAgIGJvb2wgcHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcyk7CisKKyAgICAvLyBNYWluIGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQgYnVmZmVyIG1hbmFnZXIgdGhyZWFkLgorICAgIHZvaWQgbWFpbigpOworCisgICAgLy8gVGhlIHRocmVhZCB0aGF0IG1hbmFnZXMgbm90aWZpY2F0aW9ucy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgbGFzdCBzbyBpdHMgaW5pdGlhbGl6YXRpb24gd2lsbCBoYXBwZW4KKyAgICAvLyBhZnRlciBhbGwgb3RoZXIgbWVtYmVyIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgc3RkOjp0aHJlYWQgbU1haW5UaHJlYWQ7CisKKyAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yLgorICAgIElucHV0QnVmZmVyTWFuYWdlcigpOworCisgICAgLy8gVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyJiBnZXRJbnN0YW5jZSgpOworCit9OworCisvLyBDb21wb25lbnRJbnRlcmZhY2UKK0NvbXBvbmVudEludGVyZmFjZTo6Q29tcG9uZW50SW50ZXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRmLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKSA6CisgICAgQ29uZmlndXJhYmxlKG5ldyBDYWNoZWRDb25maWd1cmFibGUoc3RkOjptYWtlX3VuaXF1ZTxDb21wSW50Zj4oaW50ZikpKSwKKyAgICBtSW50ZXJmYWNlKGludGYpIHsKKyAgICBtSW5pdCA9IGluaXQoc3RvcmUuZ2V0KCkpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnRJbnRlcmZhY2U6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKKy8vIENvbXBvbmVudExpc3RlbmVyIHdyYXBwZXIKK3N0cnVjdCBDb21wb25lbnQ6Okxpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisKKyAgICBMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBjb21wb25lbnQpIDoKKyAgICAgICAgbUNvbXBvbmVudChjb21wb25lbnQpLAorICAgICAgICBtTGlzdGVuZXIoY29tcG9uZW50LT5tTGlzdGVuZXIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCJvbkVycm9yIik7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbkVycm9yKFN0YXR1czo6T0ssIGVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvbkVycm9yIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMnNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigib25UcmlwcGVkIik7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IHNldHRpbmdSZXN1bHRzKGMyc2V0dGluZ1Jlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmMycmVzdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYzJzZXR0aW5nUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJnNldHRpbmdSZXN1bHRzW2l4KytdLCAqYzJyZXN1bHQpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5yZXNpemUoaXgpOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uVHJpcHBlZChzZXR0aW5nUmVzdWx0cyk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvblRyaXBwZWQgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR1YoIm9uV29ya0RvbmUiKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKworICAgICAgICAgICAgc3A8Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPSBtQ29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChvYmpjcHkoJndvcmtCdW5kbGUsIGMyd29ya0l0ZW1zLCBzdHJvbmdDb21wb25lbnQgPworICAgICAgICAgICAgICAgICAgICAmc3Ryb25nQ29tcG9uZW50LT5tQnVmZmVyUG9vbFNlbmRlciA6IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25Xb3JrRG9uZSgpIHJlY2VpdmVkIGNvcnJ1cHRlZCB3b3JrIGl0ZW1zLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbldvcmtEb25lKHdvcmtCdW5kbGUpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25Xb3JrRG9uZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB3cDxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgd3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7Cit9OworCisvLyBDb21wb25lbnQKK0NvbXBvbmVudDo6Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpIDoKKyAgICBDb25maWd1cmFibGUobmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+KGNvbXBvbmVudC0+aW50ZigpKSkpLAorICAgIG1Db21wb25lbnQoY29tcG9uZW50KSwKKyAgICBtSW50ZXJmYWNlKGNvbXBvbmVudC0+aW50ZigpKSwKKyAgICBtTGlzdGVuZXIobGlzdGVuZXIpLAorICAgIG1TdG9yZShzdG9yZSksCisgICAgbUJ1ZmZlclBvb2xTZW5kZXIoY2xpZW50UG9vbE1hbmFnZXIpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgLy8gVE9ETzogV2UgY291bGQgY2FjaGUgdGhpcyBwZXIgY29tcG9uZW50L2ludGVyZmFjZSB0eXBlCisgICAgbUluaXQgPSBpbml0KHN0b3JlLmdldCgpKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50OjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50CitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIHsKKyAgICBBTE9HVigicXVldWUgLS0gY29udmVydGluZyBpbnB1dCIpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrczsKKworICAgIGlmIChvYmpjcHkoJmMyd29ya3MsIHdvcmtCdW5kbGUpICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSAtLSBjb3JydXB0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6Q09SUlVQVEVEOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya3MpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInF1ZXVlIC0tIGNhbGxpbmciKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5xdWV1ZV9uYigmYzJ3b3JrcykpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJmbHVzaGVkV29ya3M7CisgICAgQUxPR1YoImZsdXNoIC0tIGNhbGxpbmciKTsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1Db21wb25lbnQtPmZsdXNoX3NtKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICZjMmZsdXNoZWRXb3Jrcyk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyZmx1c2hlZFdvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXb3JrQnVuZGxlIGZsdXNoZWRXb3JrQnVuZGxlOworICAgIFN0YXR1cyByZXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKTsKKyAgICBpZiAoYzJyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgQUxPR1YoImZsdXNoIC0tIGNvbnZlcnRpbmcgb3V0cHV0Iik7CisgICAgICAgIHJlcyA9IG9iamNweSgmZmx1c2hlZFdvcmtCdW5kbGUsIGMyZmx1c2hlZFdvcmtzLCAmbUJ1ZmZlclBvb2xTZW5kZXIpOworICAgIH0KKyAgICBfaGlkbF9jYihyZXMsIGZsdXNoZWRXb3JrQnVuZGxlKTsKKyAgICB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGMyZmx1c2hlZFdvcmtzLCB0cnVlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRyYWluKGJvb2wgd2l0aEVvcykgeworICAgIEFMT0dWKCJkcmFpbiIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPmRyYWluX25iKHdpdGhFb3MgPworICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyA6CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX05PX0VPUykpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBHZXRDb2RlYzJCbG9ja1Bvb2woYmxvY2tQb29sSWQsIG1Db21wb25lbnQsICZwb29sKTsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5nZXRBbGxvY2F0b3JJZCgpID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+IGJxUG9vbCA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KHBvb2wpOworICAgICAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpPblJlbmRlckNhbGxiYWNrIGNiID0KKyAgICAgICAgICAgIFt0aGlzXSh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYmF0Y2ggdGhpcworICAgICAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6UmVuZGVyZWRGcmFtZT4gcmVuZGVyZWQ7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQucmVzaXplKDEpOworICAgICAgICAgICAgICAgIHJlbmRlcmVkWzBdID0geyBwcm9kdWNlciwgc2xvdCwgbnNlY3MgfTsKKyAgICAgICAgICAgICAgICAodm9pZCltTGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQocmVuZGVyZWQpLmlzT2soKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGJxUG9vbCkgeworICAgICAgICAgICAgYnFQb29sLT5zZXRSZW5kZXJDYWxsYmFjayhjYik7CisgICAgICAgICAgICBicVBvb2wtPmNvbmZpZ3VyZVByb2R1Y2VyKHN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgICh2b2lkKXByb2R1Y2VyOworICAgICh2b2lkKXNvdXJjZTsKKyAgICByZXR1cm4gU3RhdHVzOjpPTUlUVEVEOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgeworICAgIC8vIFRPRE8gaW1wbGVtZW50CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IEJsb2NrUG9vbEludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBCbG9ja1Bvb2xJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIDoKKyAgICAgICAgQ29uZmlndXJhYmxlQzJJbnRmKCJDMkJsb2NrUG9vbDoiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb29sID8gc3RkOjp0b19zdHJpbmcocG9vbC0+Z2V0TG9jYWxJZCgpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCIpKSwKKyAgICAgICAgbVBvb2wocG9vbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKWZhaWx1cmVzOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClpbmRpY2VzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClmaWVsZHM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90PihhbGxvY2F0b3JJZCksCisgICAgICAgICAgICBtQ29tcG9uZW50LAorICAgICAgICAgICAgJmJsb2NrUG9vbCk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBibG9ja1Bvb2wgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoYmxvY2tQb29sKSB7CisgICAgICAgIG1CbG9ja1Bvb2xzTXV0ZXgubG9jaygpOworICAgICAgICBtQmxvY2tQb29scy5lbXBsYWNlKGJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpLCBibG9ja1Bvb2wpOworICAgICAgICBtQmxvY2tQb29sc011dGV4LnVubG9jaygpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyksCisgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDAsCisgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCbG9ja1Bvb2xJbnRmPihibG9ja1Bvb2wpKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgcmV0dXJuIG1CbG9ja1Bvb2xzLmVyYXNlKGJsb2NrUG9vbElkKSA9PSAxID8KKyAgICAgICAgICAgIFN0YXR1czo6T0sgOiBTdGF0dXM6OkNPUlJVUFRFRDsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdGFydCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RvcCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBBTE9HVigicmVzZXQiKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZXNldCgpKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgICAgICBtQmxvY2tQb29scy5jbGVhcigpOworICAgIH0KKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgQUxPR1YoInJlbGVhc2UiKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZWxlYXNlKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQ29tcG9uZW50OjpzZXRMb2NhbElkKGNvbnN0IENvbXBvbmVudDo6TG9jYWxJZCYgbG9jYWxJZCkgeworICAgIG1Mb2NhbElkID0gbG9jYWxJZDsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgobUxvY2FsSWQpOworfQorCitDb21wb25lbnQ6OkludGVyZmFjZUtleTo6SW50ZXJmYWNlS2V5KGNvbnN0IHNwPElDb21wb25lbnQ+JiBjb21wb25lbnQpIHsKKyAgICBpc1JlbW90ZSA9IGNvbXBvbmVudC0+aXNSZW1vdGUoKTsKKyAgICBpZiAoaXNSZW1vdGUpIHsKKyAgICAgICAgcmVtb3RlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dG9CaW5kZXIoY29tcG9uZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2NhbCA9IGNvbXBvbmVudDsKKyAgICB9Cit9CisKKy8vIElucHV0QnVmZmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorCitjb25zdGV4cHIgbnNlY3NfdCBJbnB1dEJ1ZmZlck1hbmFnZXI6OmtOb3RpZmljYXRpb25QZXJpb2ROczsKKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fcmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl91bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGdldEluc3RhbmNlKCkuX3VucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSBjYWxsZWQgIgorICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgZnJhbWVJbmRleCA9ICVsbHUpIiwKKyAgICAgICAgICBsaXN0ZW5lci5nZXQoKSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXBbbGlzdGVuZXJdW2ZyYW1lSW5kZXhdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5idWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghaW5wdXQuYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhOiAiCisgICAgICAgICAgICAgICAgICAiSW5wdXQgYnVmZmVyIGF0IGluZGV4ICV6dSBpcyBudWxsIiwgaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBUcmFja2VkQnVmZmVyICZidWZmZXJJZCA9CisgICAgICAgICAgICAgICAgKmJ1ZmZlcklkcy5lbXBsYWNlKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBpLCBpbnB1dC5idWZmZXJzW2ldKS4KKyAgICAgICAgICAgICAgICBmaXJzdDsKKworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbnB1dC5idWZmZXJzW2ldLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckRlc3Ryb3llZCwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPigmYnVmZmVySWQpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5IGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAiKGxpc3RlbmVyIEAgJXAsIGZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dSkgIgorICAgICAgICAgICAgICAgICAgIj0+ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KGZyYW1lSW5kZXgpLAorICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHN0YXR1cyksIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRGVhdGhOb3RpZmljYXRpb25zLmVtcGxhY2UobGlzdGVuZXIsIERlYXRoTm90aWZpY2F0aW9ucygpKTsKK30KKworLy8gUmVtb3ZlIGEgcGFpciAobGlzdGVuZXIsIGZyYW1lSW5kZXgpIGZyb20gbVRyYWNrZWRCdWZmZXJzTWFwIGFuZAorLy8gbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzIGFsbCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhIGNhbGxlZCAiCisgICAgICAgICAgIihsaXN0ZW5lciBAICVwLCBmcmFtZUluZGV4ID0gJWxsdSkiLAorICAgICAgICAgIGxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgVHJhY2tlZEJ1ZmZlciYgYnVmZmVySWQgOiBidWZmZXJJZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcklkLmJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdWZmZXJEZXN0cm95ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJmJ1ZmZlcklkKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW5wdXRCdWZmZXJNYW5hZ2VyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihsaXN0ZW5lciBAICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVJbmRleCA9ICVsbHUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJJbmRleCA9ICV6dSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj0+ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLmJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoc3RhdHVzKSwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhbWVJbmRleDJCdWZmZXJJZHMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKGZyYW1lSW5kZXgyQnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gZmluZExpc3RlbmVyRCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lckQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKSkgeworICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IGZpbmRMaXN0ZW5lckQtPnNlY29uZDsKKyAgICAgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmaW5kRnJhbWVJbmRleCAhPSBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmYnVmZmVySW5kaWNlcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgLT0gYnVmZmVySW5kaWNlcy5zaXplKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFJlbW92ZSBsaXN0ZW5lciBmcm9tIG1UcmFja2VkQnVmZmVyc01hcCBhbmQgbURlYXRoTm90aWZpY2F0aW9ucy4gVGhpcyBpbXBsaWVzCisvLyBhbGwgZnJhbWVJbmRpY2VzIGFuZCBidWZmZXJJbmRpY2VzIGFyZSByZW1vdmVkLgorLy8KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBjbGVhbnMgdXAgYWxsIGlucHV0IGJ1ZmZlcnMsIGkuZS4sIHdoZW4KKy8vIHJlc2V0KCksIHJlbGVhc2UoKSwgc3RvcCgpIG9yIH5Db21wb25lbnQoKSBpcyBjYWxsZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEgY2FsbGVkIChsaXN0ZW5lciBAICVwKSIsCisgICAgICAgICAgICBsaXN0ZW5lci51bnNhZmVfZ2V0KCkpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lciA9IG1UcmFja2VkQnVmZmVyc01hcC5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyICE9IG1UcmFja2VkQnVmZmVyc01hcC5lbmQoKSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+ICZmcmFtZUluZGV4MkJ1ZmZlcklkcyA9CisgICAgICAgICAgICAgICAgZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZmluZEZyYW1lSW5kZXggIT0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytmaW5kRnJhbWVJbmRleCkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIklucHV0QnVmZmVyTWFuYWdlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lSW5kZXggPSAlbGx1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVySW5kZXggPSAlenUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oYnVmZmVySWQuZnJhbWVJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZC5idWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHN0YXR1cyksIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgfQorCisgICAgbURlYXRoTm90aWZpY2F0aW9ucy5lcmFzZShsaXN0ZW5lcik7Cit9CisKKy8vIE1vdmUgYSBidWZmZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgdG8gbURlYXRoTm90aWZpY2F0aW9ucy4KKy8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZWdpc3RlcmVkIEMyQnVmZmVyIG9iamVjdCBpcyBkZXN0cm95ZWQuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6b25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fb25CdWZmZXJEZXN0cm95ZWQoYnVmLCBhcmcpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZykgeworICAgIGlmICghYnVmIHx8ICFhcmcpIHsKKyAgICAgICAgQUxPR1coIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIGNhbGxlZCAiCisgICAgICAgICAgICAgICJ3aXRoIG51bGwgYXJndW1lbnQocykgKGJ1ZiBAICVwLCBhcmcgQCAlcCkiLAorICAgICAgICAgICAgICBidWYsIGFyZyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2tlZEJ1ZmZlciBpZCgqcmVpbnRlcnByZXRfY2FzdDxUcmFja2VkQnVmZmVyKj4oYXJnKSk7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIGNhbGxlZCAiCisgICAgICAgICAgIihsaXN0ZW5lciBAICVwLCBmcmFtZUluZGV4ID0gJWxsdSwgYnVmZmVySW5kZXggPSAlenUpIiwKKyAgICAgICAgICBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICBpZC5idWZmZXJJbmRleCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChpZC5saXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciA9PSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgImludmFsaWQgbGlzdGVuZXIgIgorICAgICAgICAgICAgICAiKGxpc3RlbmVyIEAgJXAsIGZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dSkiLAorICAgICAgICAgICAgICBpZC5saXN0ZW5lci51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oaWQuZnJhbWVJbmRleCksCisgICAgICAgICAgICAgIGlkLmJ1ZmZlckluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPj4gJmZyYW1lSW5kZXgyQnVmZmVySWRzCisgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5maW5kKGlkLmZyYW1lSW5kZXgpOworICAgIGlmIChmaW5kRnJhbWVJbmRleCA9PSBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbmQoKSkgeworICAgICAgICBBTE9HRCgiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAiaW52YWxpZCBmcmFtZSBpbmRleCAiCisgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgZnJhbWVJbmRleCA9ICVsbHUsIGJ1ZmZlckluZGV4ID0gJXp1KSIsCisgICAgICAgICAgICAgIGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgaWQuYnVmZmVySW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgYXV0byBmaW5kQnVmZmVySWQgPSBidWZmZXJJZHMuZmluZChpZCk7CisgICAgaWYgKGZpbmRCdWZmZXJJZCA9PSBidWZmZXJJZHMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgImludmFsaWQgYnVmZmVyIGluZGV4OiAiCisgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCwgZnJhbWVJbmRleCA9ICVsbHUsIGJ1ZmZlckluZGV4ID0gJXp1KSIsCisgICAgICAgICAgICAgIGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihpZC5mcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgaWQuYnVmZmVySW5kZXgpOworICAgIH0KKworICAgIGJ1ZmZlcklkcy5lcmFzZShmaW5kQnVmZmVySWQpOworICAgIGlmIChidWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICBmcmFtZUluZGV4MkJ1ZmZlcklkcy5lcmFzZShmaW5kRnJhbWVJbmRleCk7CisgICAgICAgIGlmIChmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtVHJhY2tlZEJ1ZmZlcnNNYXAuZXJhc2UoZmluZExpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERlYXRoTm90aWZpY2F0aW9ucyAmZGVhdGhOb3RpZmljYXRpb25zID0gbURlYXRoTm90aWZpY2F0aW9uc1tpZC5saXN0ZW5lcl07CisgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXNbaWQuZnJhbWVJbmRleF0uZW1wbGFjZV9iYWNrKGlkLmJ1ZmZlckluZGV4KTsKKyAgICArK2RlYXRoTm90aWZpY2F0aW9ucy5jb3VudDsKKyAgICBtT25CdWZmZXJEZXN0cm95ZWQubm90aWZ5X29uZSgpOworfQorCisvLyBOb3RpZnkgdGhlIGNsaWVudHMgYWJvdXQgYnVmZmVyIGRlc3RydWN0aW9ucy4KKy8vIFJldHVybiBmYWxzZSBpZiBhbGwgZGVzdHJ1Y3Rpb25zIGhhdmUgYmVlbiBub3RpZmllZC4KKy8vIFJldHVybiB0cnVlIGFuZCBzZXQgdGltZVRvUmV0cnkgdG8gdGhlIHRpbWUgcG9pbnQgdG8gd2FpdCBmb3IgYmVmb3JlCisvLyByZXRyeWluZyBpZiBzb21lIGRlc3RydWN0aW9ucyBoYXZlIG5vdCBiZWVuIG5vdGlmaWVkLgorYm9vbCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zKG5zZWNzX3QqIHRpbWVUb1JldHJ5TnMpIHsKKworICAgIHN0cnVjdCBOb3RpZmljYXRpb24geworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJlbmRlcmVkRnJhbWVzOworICAgICAgICBOb3RpZmljYXRpb24oY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbCwgc2l6ZV90IHMpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobCksIHJlbmRlcmVkRnJhbWVzKHMpIHt9CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8Tm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zOworCisgICAgYm9vbCByZXRyeSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBrTm90aWZpY2F0aW9uUGVyaW9kTnM7CisgICAgICAgIG5zZWNzX3QgdGltZU5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbURlYXRoTm90aWZpY2F0aW9ucy5lbmQoKTsgKSB7CisgICAgICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICBuc2Vjc190IHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zID0KKyAgICAgICAgICAgICAgICAgICAgdGltZU5vd05zIC0gZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnM7CisgICAgICAgICAgICAvLyBJZiBub3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjYWxsYmFjaywgbGVhdmUgdGhlCisgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIHVudG91Y2hlZCBmb3Igbm93IGFuZCByZXRyeQorICAgICAgICAgICAgLy8gbGF0ZXIuCisgICAgICAgICAgICBpZiAodGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPCBrTm90aWZpY2F0aW9uUGVyaW9kTnMpIHsKKyAgICAgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBzdGQ6Om1pbigqdGltZVRvUmV0cnlOcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtOb3RpZmljYXRpb25QZXJpb2ROcyAtIHRpbWVTaW5jZUxhc3ROb3RpZmllZE5zKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiSW5wdXRCdWZmZXJNYW5hZ2VyOiBOb3RpZmljYXRpb25zIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgImxpc3RlbmVyIEAgJXAgd2lsbCBiZSBwb3N0cG9uZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBub3RpZmljYXRpb24gdG8gdGhpcworICAgICAgICAgICAgLy8gbGlzdGVuZXIgYnV0IHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gcGVuZGluZyBub3RpZmljYXRpb25zLCB0aGUKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyIGNhbiBiZSByZW1vdmVkIGZyb20gbURlYXRoTm90aWZpY2F0aW9ucy0tLXRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgbm90aWZpY2F0aW9uIHRpbWUgYW55bW9yZS4KKyAgICAgICAgICAgIGlmIChkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGl0ID0gbURlYXRoTm90aWZpY2F0aW9ucy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgYXJndW1lbnQgZm9yIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuZW1wbGFjZV9iYWNrKGxpc3RlbmVyLCBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQpOworICAgICAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMgPQorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zLmJhY2soKS5yZW5kZXJlZEZyYW1lczsKKyAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoc3RkOjpwYWlyPGNvbnN0IHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzaXplX3Q+PiYgcCA6CisgICAgICAgICAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHAuZmlyc3Q7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmYnVmZmVySW5kaWNlcyA9IHAuc2Vjb25kOworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2l6ZV90JiBidWZmZXJJbmRleCA6IGJ1ZmZlckluZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgSUNvbXBvbmVudExpc3RlbmVyOjpSZW5kZXJlZEZyYW1lICZyZW5kZXJlZEZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByZW5kZXJlZEZyYW1lc1tpKytdOworICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnNsb3RJZCA9IH5idWZmZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS5idWZmZXJRdWV1ZUlkID0gZnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS50aW1lc3RhbXBOcyA9IHRpbWVOb3dOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZGluZyBkZWF0aCBub3RpZmljYXRpb24gKGxpc3RlbmVyIEAgJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIHVuc2lnbmVkPihmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xlYXIgZGVhdGhOb3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyIGFuZCBzZXQgcmV0cnkgdG8gdHJ1ZQorICAgICAgICAgICAgLy8gc28gcHJvY2Vzc05vdGlmaWNhdGlvbnMgd2lsbCBiZSBjYWxsZWQgYWdhaW4uIFRoaXMgd2lsbAorICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoYXQgYSBsaXN0ZW5lciB3aXRoIG5vIHBlbmRpbmcgbm90aWZpY2F0aW9ucyB3aWxsCisgICAgICAgICAgICAvLyBldmVudHVhbGx5IGJlIHJlbW92ZWQgZnJvbSBtRGVhdGhOb3RpZmljYXRpb25zIGFmdGVyCisgICAgICAgICAgICAvLyBrTm90aWZpY2F0aW9uUGVyaW9kTnMgbmFub3NlY29uZHMgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIHJldHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPSAwOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnMgPSB0aW1lTm93TnM7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsbCBvbkZyYW1lc1JlbmRlcmVkIG91dHNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgZm9yIChjb25zdCBOb3RpZmljYXRpb24mIG5vdGlmaWNhdGlvbiA6IG5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgaWYgKCFub3RpZmljYXRpb24ubGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnJlbmRlcmVkRnJhbWVzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaWYgdGhlIGNsaWVudCBoYXMgZGllZC4KKyAgICAgICAgICAgIEFMT0dEKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IG9uRnJhbWVzUmVuZGVyZWQgdHJhbnNhY3Rpb24gZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICIobGlzdGVuZXIgQCAlcCkiLAorICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmV0cnkpIHsKKyAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogUGVuZGluZyBkZWF0aCBub3RpZmljYXRpb25zIgorICAgICAgICAgICAgICAid2lsbCBiZSBzZW50IGluICVsbGRucy4iLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KCp0aW1lVG9SZXRyeU5zKSk7CisgICAgfQorICAgIHJldHVybiByZXRyeTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Om1haW4oKSB7CisgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogU3RhcnRpbmcgbWFpbiB0aHJlYWQiKTsKKyAgICBuc2Vjc190IHRpbWVUb1JldHJ5TnM7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlIChtRGVhdGhOb3RpZmljYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IFdhaXRpbmcgZm9yIGJ1ZmZlciBkZWF0aHMiKTsKKyAgICAgICAgICAgIG1PbkJ1ZmZlckRlc3Ryb3llZC53YWl0KGxvY2spOworICAgICAgICB9CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIEFMT0dWKCJJbnB1dEJ1ZmZlck1hbmFnZXI6IFNlbmRpbmcgYnVmZmVyIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICAgICAgd2hpbGUgKHByb2Nlc3NOb3RpZmljYXRpb25zKCZ0aW1lVG9SZXRyeU5zKSkgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZVRvUmV0cnlOcykpOworICAgICAgICAgICAgQUxPR1YoIklucHV0QnVmZmVyTWFuYWdlcjogU2VuZGluZyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiSW5wdXRCdWZmZXJNYW5hZ2VyOiBObyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMiKTsKKyAgICB9Cit9CisKK0lucHV0QnVmZmVyTWFuYWdlcjo6SW5wdXRCdWZmZXJNYW5hZ2VyKCkKKyAgICAgIDogbU1haW5UaHJlYWQoJklucHV0QnVmZmVyTWFuYWdlcjo6bWFpbiwgdGhpcykgeworfQorCitJbnB1dEJ1ZmZlck1hbmFnZXImIElucHV0QnVmZmVyTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RhdGljIElucHV0QnVmZmVyTWFuYWdlciBpbnN0YW5jZXt9OworICAgIHJldHVybiBpbnN0YW5jZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNTAxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRTdG9yZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGVDMkludGYuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKworI2lmZGVmIExPRworI3VuZGVmIExPRworI2VuZGlmCisKKyNpZmRlZiBQTE9HCisjdW5kZWYgUExPRworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBTdG9yZUludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBTdG9yZUludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkgOgorICAgICAgICBDb25maWd1cmFibGVDMkludGYoc3RvcmUgPyBzdG9yZS0+Z2V0TmFtZSgpIDogIiIpLAorICAgICAgICBtU3RvcmUoc3RvcmUpIHsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBwYXJhbXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5jb25maWdfc20ocGFyYW1zLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgaW5kaWNlcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5X3NtKHt9LCBpbmRpY2VzLCBwYXJhbXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKHBhcmFtcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgZmllbGRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oZmllbGRzKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkgOgorICAgIENvbmZpZ3VyYWJsZShuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8U3RvcmVJbnRmPihzdG9yZSkpKSwKKyAgICBtU3RvcmUoc3RvcmUpIHsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBwbGF0Zm9ybVN0b3JlID0gYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworICAgIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0b3JlKTsKKworICAgIC8vIFJldHJpZXZlIHN0cnVjdCBkZXNjcmlwdG9ycworICAgIG1QYXJhbVJlZmxlY3RvciA9IG1TdG9yZS0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICBtSW5pdCA9IGluaXQodGhpcyk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcG9uZW50LT5pbml0TGlzdGVuZXIoY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnQtPnNldExvY2FsSWQoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50Um9zdGVyLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50OjpJbnRlcmZhY2VLZXkoY29tcG9uZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMmNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjMmludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtU3RvcmUtPmNyZWF0ZUludGVyZmFjZShuYW1lLCAmYzJpbnRlcmZhY2UpOworICAgIHNwPElDb21wb25lbnRJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgdGhpcyk7CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpcmVzLCBpbnRlcmZhY2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGMydHJhaXRzID0KKyAgICAgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKyAgICBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4gdHJhaXRzKGMydHJhaXRzLnNpemUoKSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmYzJ0cmFpdCA6IGMydHJhaXRzKSB7CisgICAgICAgIGlmIChjMnRyYWl0KSB7CisgICAgICAgICAgICBvYmpjcHkoJnRyYWl0c1tpeCsrXSwgKmMydHJhaXQpOworICAgICAgICB9CisgICAgfQorICAgIHRyYWl0cy5yZXNpemUoaXgpOworICAgIF9oaWRsX2NiKHRyYWl0cyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHNwPElJbnB1dFN1cmZhY2U+PiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdicDsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdicD4gQjJIR2JwOworICAgIHJldHVybiBuZXcgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBuZXcgQjJIR2JwKHNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgIHNvdXJjZSk7Cit9CisKK3ZvaWQgQ29tcG9uZW50U3RvcmU6Om9uSW50ZXJmYWNlTG9hZGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICAvLyBpbnZhbGlkYXRlIHVuc3VwcG9ydGVkIHN0cnVjdCBkZXNjcmlwdG9ycyBpZiBhIG5ldyBpbnRlcmZhY2UgaXMgbG9hZGVkIGFzIGl0IG1heSBoYXZlCisgICAgLy8gZXhwb3NlZCBuZXcgZGVzY3JpcHRvcnMKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgaWYgKCFtTG9hZGVkSW50ZXJmYWNlcy5jb3VudChpbnRmLT5nZXROYW1lKCkpKSB7CisgICAgICAgIG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmNsZWFyKCk7CisgICAgICAgIG1Mb2FkZWRJbnRlcmZhY2VzLmVtcGxhY2UoaW50Zi0+Z2V0TmFtZSgpKTsKKyAgICB9Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgZ2V0U3RydWN0RGVzY3JpcHRvcnNfY2IgX2hpZGxfY2IpIHsKKyAgICBoaWRsX3ZlYzxTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyhpbmRpY2VzLnNpemUoKSk7CisgICAgc2l6ZV90IGRzdEl4ID0gMDsKKyAgICBTdGF0dXMgcmVzID0gU3RhdHVzOjpPSzsKKyAgICBmb3IgKHNpemVfdCBzcmNJeCA9IDA7IHNyY0l4IDwgaW5kaWNlcy5zaXplKCk7ICsrc3JjSXgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgICAgICBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gQzJQYXJhbTo6Q29yZUluZGV4KGluZGljZXNbc3JjSXhdKS5jb3JlSW5kZXgoKTsKKyAgICAgICAgY29uc3QgYXV0byBpdGVtID0gbVN0cnVjdERlc2NyaXB0b3JzLmZpbmQoY29yZUluZGV4KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbVN0cnVjdERlc2NyaXB0b3JzLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBub3QgaW4gdGhlIGNhY2hlLCBhbmQgbm90IGtub3duIHRvIGJlIHVuc3VwcG9ydGVkLCBxdWVyeSBsb2NhbCByZWZsZWN0b3IKKyAgICAgICAgICAgIGlmICghbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY291bnQoY29yZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJ1Y3REZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmVtcGxhY2UoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RydWN0RGVzY3JpcHRvcnMuaW5zZXJ0KHsgY29yZUluZGV4LCBzdHJ1Y3REZXNjIH0pOworICAgICAgICAgICAgICAgICAgICBvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4KytdLCAqc3RydWN0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgb2JqY3B5KCZkZXNjcmlwdG9yc1tkc3RJeCsrXSwgKml0ZW0tPnNlY29uZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudERlYXRoKAorICAgICAgICBjb25zdCBDb21wb25lbnQ6OkxvY2FsSWQmIGNvbXBvbmVudExvY2FsSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2UoY29tcG9uZW50TG9jYWxJZCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gQ29tcG9uZW50U3RvcmU6OmZpbmRDMkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgQ29tcG9uZW50OjpMb2NhbElkIGl0ID0gbUNvbXBvbmVudFJvc3Rlci5maW5kKAorICAgICAgICAgICAgQ29tcG9uZW50OjpJbnRlcmZhY2VLZXkoY29tcG9uZW50KSk7CisgICAgaWYgKGl0ID09IG1Db21wb25lbnRSb3N0ZXIuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oKTsKKyAgICB9CisgICAgcmV0dXJuIGl0LT5zZWNvbmQubG9jaygpOworfQorCisvLyBEZWJ1ZyBkdW1wCisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gRHVtcCBjb21wb25lbnQgdHJhaXRzCitzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBjb21wLT5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJkb21haW46ICIgPDwgY29tcC0+ZG9tYWluIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJraW5kOiAiIDw8IGNvbXAtPmtpbmQgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgInJhbms6ICIgPDwgY29tcC0+cmFuayA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAibWVkaWFUeXBlOiAiIDw8IGNvbXAtPm1lZGlhVHlwZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiYWxpYXNlczoiOworICAgIGZvciAoY29uc3QgYXV0byYgYWxpYXMgOiBjb21wLT5hbGlhc2VzKSB7CisgICAgICAgIG91dCA8PCAnICcgPDwgYWxpYXM7CisgICAgfQorICAgIG91dCA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gb3V0OworfQorCisvLyBEdW1wIGNvbXBvbmVudAorc3RkOjpvc3RyZWFtJiBkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCkgeworCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAgICI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wLT5pbnRmKCk7CisgICAgaWYgKCFpbnRmKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlVua25vd24gLS0gbnVsbCBpbnRlcmZhY2UiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBpbnRmLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImlkOiAiIDw8IGludGYtPmdldElkKCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBvdXQ7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpkZWJ1ZygKKyAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+JiAvKiBhcmdzICovKSB7CisgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nLi4uIjsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmggPSBoYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgaWYgKCFoIHx8IGgtPm51bUZkcyAhPSAxKSB7CisgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gIgorICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIHRvIGR1bXAgdG8iOworICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgICB7IC8vIFBvcHVsYXRlICJvdXQiLgorCisgICAgICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgIjsKKworICAgICAgICAvLyBTaG93IG5hbWUuCisgICAgICAgIG91dCA8PCAiQmVnaW5uaW5nIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gdHJhaXRzTGlzdCA9CisgICAgICAgICAgICAgICAgbVN0b3JlLT5saXN0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIER1bXAgdGhlIHRyYWl0cyBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiU3VwcG9ydGVkIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICBpZiAodHJhaXRzTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWl0cyA6IHRyYWl0c0xpc3QpIHsKKyAgICAgICAgICAgICAgICBkdW1wKG91dCwgdHJhaXRzKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhY3RpdmUgY29tcG9uZW50cy4KKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4+IGFjdGl2ZUNvbXBzOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgICAgICAgICAgYXV0byBpID0gbUNvbXBvbmVudFJvc3Rlci5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUgKGkgIT0gbUNvbXBvbmVudFJvc3Rlci5lbmQoKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gYzJjb21wID0gaS0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoIWMyY29tcCkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGogPSBpOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2Uoaik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb21wcy5lbXBsYWNlX2JhY2soYzJjb21wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEdW1wIGFjdGl2ZSBjb21wb25lbnRzLgorICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJBY3RpdmUgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGlmIChhY3RpdmVDb21wcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGMyY29tcCA6IGFjdGl2ZUNvbXBzKSB7CisgICAgICAgICAgICAgICAgZHVtcChvdXQsIGMyY29tcCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJFbmQgb2YgZHVtcCAtLSBDMkNvbXBvbmVudFN0b3JlOiAiCisgICAgICAgICAgICAgICAgPDwgbVN0b3JlLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZkKG91dC5zdHIoKSwgaC0+ZGF0YVswXSkpIHsKKyAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gd3JpdGUoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIHN1Y2NlZWRlZCI7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDIzYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db25maWd1cmFibGUiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitDYWNoZWRDb25maWd1cmFibGU6OkNhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKSA6CisgICAgbUludGYoc3RkOjptb3ZlKGludGYpKSB7Cit9CisKK2MyX3N0YXR1c190IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpIHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgYzJfc3RhdHVzX3QgaW5pdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmbVN1cHBvcnRlZFBhcmFtcyk7CisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUgPSBzdG9yZS0+dmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMobVN1cHBvcnRlZFBhcmFtcyk7CisgICAgcmV0dXJuIGluaXQgPT0gQzJfT0sgPyBDMl9PSyA6IHZhbGlkYXRlOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgeworICAgIF9oaWRsX2NiKG1JbnRmLT5nZXROYW1lKCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJbmRleDsKKyAgICBzdGQ6OnZlY3RvcjxJbmRleD4gYzJoZWFwUGFyYW1JbmRpY2VzKAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSwKKyAgICAgICAgICAgIChJbmRleCopaW5kaWNlcy5kYXRhKCkgKyBpbmRpY2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjMmhlYXBQYXJhbXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnkoCisgICAgICAgICAgICBjMmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJoZWFwUGFyYW1zKTsKKworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICBjcmVhdGVQYXJhbXNCbG9iKCZwYXJhbXMsIGMyaGVhcFBhcmFtcyk7CisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihjMnJlcyksIHBhcmFtcyk7CisKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpjb25maWcoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gaW5QYXJhbXMgaXMgbm90IHdyaXRhYmxlLCBzbyBjcmVhdGUgYSBjb3B5IGFzIGNvbmZpZyBtb2RpZmllcyB0aGUgcGFyYW1ldGVycworICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGluUGFyYW1zQ29weSA9IGluUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjMnBhcmFtczsKKyAgICBpZiAocGFyc2VQYXJhbXNCbG9iKCZjMnBhcmFtcywgaW5QYXJhbXNDb3B5KSAhPSBDMl9PSykgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkNPUlJVUFRFRCwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PigpLAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBjaGVjayBpZiBibG9iIHdhcyBpbnZhbGlkCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgYzJwYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJmYWlsdXJlcyk7CisgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZmFpbHVyZXMoYzJmYWlsdXJlcy5zaXplKCkpOworICAgIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgYzJyZXN1bHQgOiBjMmZhaWx1cmVzKSB7CisgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBvYmpjcHkoJmZhaWx1cmVzW2l4KytdLCAqYzJyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWx1cmVzLnJlc2l6ZShpeCk7CisgICAgfQorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IG91dFBhcmFtczsKKyAgICBjcmVhdGVQYXJhbXNCbG9iKCZvdXRQYXJhbXMsIGMycGFyYW1zKTsKKyAgICBfaGlkbF9jYigoU3RhdHVzKWMycmVzLCBmYWlsdXJlcywgb3V0UGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgdWludDMyX3Qgc3RhcnQsCisgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgeworICAgIEMyTGluZWFyUmFuZ2UgcmVxdWVzdCA9IEMyTGluZWFyQ2FwYWNpdHkobVN1cHBvcnRlZFBhcmFtcy5zaXplKCkpLnJhbmdlKAorICAgICAgICAgICAgc3RhcnQsIGNvdW50KTsKKyAgICBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+IHBhcmFtcyhyZXF1ZXN0LnNpemUoKSk7CisgICAgU3RhdHVzIHJlcyA9IFN0YXR1czo6T0s7CisgICAgc2l6ZV90IGRzdEl4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBzcmNJeCA9IHJlcXVlc3Qub2Zmc2V0KCk7IHNyY0l4IDwgcmVxdWVzdC5lbmRPZmZzZXQoKTsgKytzcmNJeCkgeworICAgICAgICBpZiAobVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pIHsKKyAgICAgICAgICAgIG9iamNweSgmcGFyYW1zW2RzdEl4KytdLCAqbVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpCQURfSU5ERVg7CisgICAgICAgIH0KKyAgICB9CisgICAgcGFyYW1zLnJlc2l6ZShkc3RJeCk7CisgICAgX2hpZGxfY2IocmVzLCBwYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgaW5GaWVsZHMsCisgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgIHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBjMmZpZWxkczsKKyAgICB7CisgICAgICAgIC8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSBvYmplY3RzIGFyZSByZXN0cmljdGVkIGluIHRoYXQgc29tZQorICAgICAgICAvLyBtZW1iZXJzIGFyZSBjb25zdC4KKyAgICAgICAgLy8gQzJQYXJhbUZpZWxkIC0gcmVxdWlyZWQgZm9yIGl0cyBjb25zdHJ1Y3RvciAtIGhhcyBubyBjb25zdHJ1Y3RvcnMKKyAgICAgICAgLy8gZnJvbSBmaWVsZHMuIFVzZSBDMlBhcmFtSW5zcGVjdG9yLgorICAgICAgICBmb3IgKGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogaW5GaWVsZHMpIHsKKyAgICAgICAgICAgIGMyZmllbGRzLmVtcGxhY2VfYmFjayhfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlUGFyYW1GaWVsZCgKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmZpZWxkSWQub2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5maWVsZElkLnNpemUpLAorICAgICAgICAgICAgICAgICAgICBxdWVyeS50eXBlID09IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFID8KKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRSA6CisgICAgICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBjMmZpZWxkcywKKyAgICAgICAgICAgIG1heUJsb2NrID8gQzJfTUFZX0JMT0NLIDogQzJfRE9OVF9CTE9DSyk7CisgICAgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdD4gb3V0RmllbGRzKGluRmllbGRzLnNpemUoKSk7CisgICAgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcmVzdWx0IDogYzJmaWVsZHMpIHsKKyAgICAgICAgICAgIG9iamNweSgmb3V0RmllbGRzW2l4KytdLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIG91dEZpZWxkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1JbnB1dFN1cmZhY2UiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitjbGFzcyBJbnB1dFN1cmZhY2U6OkNvbmZpZ3VyYWJsZUltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IENvbmZpZ3VyYWJsZUltcGwoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRW9zLCBDMl9OQU1FX0lOUFVUX1NVUkZBQ0VfRU9TX1RVTklORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nKGZhbHNlKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Fb3MsIHZhbHVlKS5vbmVPZih7dHJ1ZSwgZmFsc2V9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRW9zU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEVvc1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBib29sIGVvcygpIGNvbnN0IHsgcmV0dXJuIG1Fb3MtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nPiBtRW9zOworfTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29uZmlndXJhYmxlV3JhcHBlciA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworcHVibGljOgorICAgIENvbmZpZ3VyYWJsZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlOjpDb25maWd1cmFibGVJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpCisgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmKCJpbnB1dC1zdXJmYWNlIiksCisgICAgICAgICAgbUltcGwoaW1wbCksCisgICAgICAgICAgbVNvdXJjZShzb3VyY2UpIHsKKyAgICB9CisKKyAgICB+Q29uZmlndXJhYmxlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBtYXlCbG9jaywgcGFyYW1zKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbXBsLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgICAgICBpZiAobUltcGwtPmVvcygpKSB7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0ciB8fCBzb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHB1dCBzb21ldGhpbmcgaW4gfGZhaWx1cmVzfAorICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlc2V0IGVvcz8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkNvbmZpZ3VyYWJsZUltcGw+IG1JbXBsOworICAgIHdwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpjb25uZWN0VG9Db21wb25lbnQoCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbm5lY3RUb0NvbXBvbmVudF9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubjsKKyAgICBpZiAoIWNvbXBvbmVudCkgeworICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBtU3RvcmUtPmZpbmRDMkNvbXBvbmVudChjb21wb25lbnQpOworICAgICAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgICAgIGNvbm4gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBjb21wb25lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29ubiA9IG5ldyBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKG1Tb3VyY2UsIGNvbXApOworICAgICAgICB9CisgICAgICAgIGlmICghY29ubi0+aW5pdCgpKSB7CisgICAgICAgICAgICBjb25uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm4pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gSW5wdXRTdXJmYWNlOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKKy8vIERlcml2ZWQgbWV0aG9kcyBmcm9tIElHcmFwaGljQnVmZmVyUHJvZHVjZXIKKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6cmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgaW50MzJfdCBzbG90LAorICAgICAgICByZXF1ZXN0QnVmZmVyX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5yZXF1ZXN0QnVmZmVyKHNsb3QsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudCgKKyAgICAgICAgaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQobWF4RGVxdWV1ZWRCdWZmZXJzKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6c2V0QXN5bmNNb2RlKAorICAgICAgICBib29sIGFzeW5jKSB7CisgICAgcmV0dXJuIG1CYXNlLT5zZXRBc3luY01vZGUoYXN5bmMpOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHVzYWdlLAorICAgICAgICBib29sIGdldEZyYW1lVGltZXN0YW1wcywKKyAgICAgICAgZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgeworICAgIHJldHVybiBtQmFzZS0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGdldEZyYW1lVGltZXN0YW1wcywgX2hpZGxfY2IpOworfQorCitSZXR1cm48aW50MzJfdD4gSW5wdXRTdXJmYWNlOjpkZXRhY2hCdWZmZXIoCisgICAgICAgIGludDMyX3Qgc2xvdCkgeworICAgIHJldHVybiBtQmFzZS0+ZGV0YWNoQnVmZmVyKHNsb3QpOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpkZXRhY2hOZXh0QnVmZmVyKAorICAgICAgICBkZXRhY2hOZXh0QnVmZmVyX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5kZXRhY2hOZXh0QnVmZmVyKF9oaWRsX2NiKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6YXR0YWNoQnVmZmVyKAorICAgICAgICBjb25zdCBBbndCdWZmZXImIGJ1ZmZlciwKKyAgICAgICAgYXR0YWNoQnVmZmVyX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5hdHRhY2hCdWZmZXIoYnVmZmVyLCBfaGlkbF9jYik7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OnF1ZXVlQnVmZmVyKAorICAgICAgICBpbnQzMl90IHNsb3QsCisgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICBxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgeworICAgIHJldHVybiBtQmFzZS0+cXVldWVCdWZmZXIoc2xvdCwgaW5wdXQsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6Y2FuY2VsQnVmZmVyKAorICAgICAgICBpbnQzMl90IHNsb3QsCisgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBmZW5jZSkgeworICAgIHJldHVybiBtQmFzZS0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6cXVlcnkoCisgICAgICAgIGludDMyX3Qgd2hhdCwKKyAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIHsKKyAgICByZXR1cm4gbUJhc2UtPnF1ZXJ5KHdoYXQsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8SFByb2R1Y2VyTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgIGJvb2wgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCisgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICByZXR1cm4gbUJhc2UtPmNvbm5lY3QobGlzdGVuZXIsIGFwaSwgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsIF9oaWRsX2NiKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6ZGlzY29ubmVjdCgKKyAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgIERpc2Nvbm5lY3RNb2RlIG1vZGUpIHsKKyAgICByZXR1cm4gbUJhc2UtPmRpc2Nvbm5lY3QoYXBpLCBtb2RlKTsKK30KKworUmV0dXJuPGludDMyX3Q+IElucHV0U3VyZmFjZTo6c2V0U2lkZWJhbmRTdHJlYW0oCisgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBzdHJlYW0pIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldFNpZGViYW5kU3RyZWFtKHN0cmVhbSk7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmFsbG9jYXRlQnVmZmVycygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCB1c2FnZSkgeworICAgIHJldHVybiBtQmFzZS0+YWxsb2NhdGVCdWZmZXJzKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UpOworfQorCitSZXR1cm48aW50MzJfdD4gSW5wdXRTdXJmYWNlOjphbGxvd0FsbG9jYXRpb24oCisgICAgICAgIGJvb2wgYWxsb3cpIHsKKyAgICByZXR1cm4gbUJhc2UtPmFsbG93QWxsb2NhdGlvbihhbGxvdyk7Cit9CisKK1JldHVybjxpbnQzMl90PiBJbnB1dFN1cmZhY2U6OnNldEdlbmVyYXRpb25OdW1iZXIoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbk51bWJlcik7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmdldENvbnN1bWVyTmFtZSgKKyAgICAgICAgZ2V0Q29uc3VtZXJOYW1lX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5nZXRDb25zdW1lck5hbWUoX2hpZGxfY2IpOworfQorCitSZXR1cm48aW50MzJfdD4gSW5wdXRTdXJmYWNlOjpzZXRTaGFyZWRCdWZmZXJNb2RlKAorICAgICAgICBib29sIHNoYXJlZEJ1ZmZlck1vZGUpIHsKKyAgICByZXR1cm4gbUJhc2UtPnNldFNoYXJlZEJ1ZmZlck1vZGUoc2hhcmVkQnVmZmVyTW9kZSk7Cit9CisKK1JldHVybjxpbnQzMl90PiBJbnB1dFN1cmZhY2U6OnNldEF1dG9SZWZyZXNoKAorICAgICAgICBib29sIGF1dG9SZWZyZXNoKSB7CisgICAgcmV0dXJuIG1CYXNlLT5zZXRBdXRvUmVmcmVzaChhdXRvUmVmcmVzaCk7Cit9CisKK1JldHVybjxpbnQzMl90PiBJbnB1dFN1cmZhY2U6OnNldERlcXVldWVUaW1lb3V0KAorICAgICAgICBpbnQ2NF90IHRpbWVvdXROcykgeworICAgIHJldHVybiBtQmFzZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dE5zKTsKK30KKworUmV0dXJuPHZvaWQ+IElucHV0U3VyZmFjZTo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgZ2V0TGFzdFF1ZXVlZEJ1ZmZlcl9jYiBfaGlkbF9jYikgeworICAgIHJldHVybiBtQmFzZS0+Z2V0TGFzdFF1ZXVlZEJ1ZmZlcihfaGlkbF9jYik7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmdldEZyYW1lVGltZXN0YW1wcygKKyAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzX2NiIF9oaWRsX2NiKSB7CisgICAgcmV0dXJuIG1CYXNlLT5nZXRGcmFtZVRpbWVzdGFtcHMoX2hpZGxfY2IpOworfQorCitSZXR1cm48dm9pZD4gSW5wdXRTdXJmYWNlOjpnZXRVbmlxdWVJZCgKKyAgICAgICAgZ2V0VW5pcXVlSWRfY2IgX2hpZGxfY2IpIHsKKyAgICByZXR1cm4gbUJhc2UtPmdldFVuaXF1ZUlkKF9oaWRsX2NiKTsKK30KKworLy8gQ29uc3RydWN0b3IgaXMgZXhjbHVzaXZlIHRvIENvbXBvbmVudFN0b3JlLgorSW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIHJlZmxlY3RvciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIDoKKyAgICBtU3RvcmUoc3RvcmUpLAorICAgIG1CYXNlKGJhc2UpLAorICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICBtSGVscGVyKHN0ZDo6bWFrZV9zaGFyZWQ8Q29uZmlndXJhYmxlSW1wbD4ocmVmbGVjdG9yKSksCisgICAgbUNvbmZpZ3VyYWJsZShuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25maWd1cmFibGVXcmFwcGVyPihtSGVscGVyLCBzb3VyY2UpKSkgeworCisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTdjMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbXBvbmVudFdyYXBwZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCitjb25zdGV4cHIgaW50MzJfdCBrQnVmZmVyQ291bnQgPSAxNjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7CisgICAgfQorfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdHJ1Y3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbCA6IHB1YmxpYyBDb21wb25lbnRXcmFwcGVyIHsKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wKSA6CisgICAgICAgICAgICBtU291cmNlKHNvdXJjZSksIG1Db21wKGNvbXApLCBtUmVtb3RlQ29tcCgpLAorICAgICAgICAgICAgbUZyYW1lSW5kZXgoMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBjb21wLT5pbnRmKCk7CisgICAgICAgIG1Db21wTmFtZSA9IGludGYgPyBpbnRmLT5nZXROYW1lKCkgOiAiIjsKKyAgICB9CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgY29tcCkgOgorICAgICAgICAgICAgbVNvdXJjZShzb3VyY2UpLCBtQ29tcCgpLCBtUmVtb3RlQ29tcChjb21wKSwKKyAgICAgICAgICAgIG1GcmFtZUluZGV4KDApIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gY29tcC0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0gbmFtZS5jX3N0cigpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0QoImdldE5hbWUgLS0gQ2Fubm90IG9idGFpbiByZW1vdGUgY29tcG9uZW50IG5hbWUuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBpbml0KCkgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0QoIkltcGw6OmluaXQgLS0gR0JTIGluaXQgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIHNldHRpbmdzIHByb3Blcmx5IGZyb20gdGhlIGludGVyZmFjZQorICAgICAgICBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzo6aW5wdXQgaW5wdXRTaXplOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJTdGF0dXMgPSBjb21wUXVlcnkoeyAmaW5wdXRTaXplLCAmdXNhZ2UgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIGlmIChjMlN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoIkltcGw6OmluaXQgLS0gY2Fubm90IHF1ZXJ5IGluZm9ybWF0aW9uIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAidGhlIGNvbXBvbmVudCBpbnRlcmZhY2U6ICVzLiIsIGFzU3RyaW5nKGMyU3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgY29sb3IgYXNwZWN0ICYgZGF0YXNwYWNlCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisKKyAgICAgICAgLy8gVE9ETzogdXNlIHRoZSB1c2FnZSByZWFkIGZyb20gaW50ZgorICAgICAgICAvLyB1aW50MzJfdCBncmFsbG9jVXNhZ2UgPQorICAgICAgICAvLyAgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2UodXNhZ2UudmFsdWUpKS4KKyAgICAgICAgLy8gICAgICAgICBhc0dyYWxsb2NVc2FnZSgpOworCisgICAgICAgIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lLmNvbXBhcmUoMCwgMTEsICJjMi5hbmRyb2lkLiIpID09IDAgPworICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworCisgICAgICAgIGVyciA9IHNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHRoaXMsIGRhdGFTcGFjZSwga0J1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIGlucHV0U2l6ZS53aWR0aCwgaW5wdXRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiSW1wbDo6aW5pdCAtLSBHQlMgY29uZmlndXJlIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJJbXBsOjppbml0OiBwb3B1bGF0aW5nIEdCUyBzbG90cyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2UtPnN0YXJ0KCkuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRCgiSW1wbDo6aW5pdCAtLSBHQlMgc3RhcnQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUFsbG9jYXRvck11dGV4LmxvY2soKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCktPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OlBMQVRGT1JNX1NUQVJUICsgMSwgIC8vIEdSQUxMT0MKKyAgICAgICAgICAgICAgICAmbUFsbG9jYXRvcik7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC51bmxvY2soKTsKKyAgICAgICAgaWYgKGMyZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiSW1wbDo6aW5pdCAtLSBmYWlsZWQgdG8gZmV0Y2ggZ3JhbGxvYyBhbGxvY2F0b3I6ICVkIiwgYzJlcnIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZyb20gQ29tcG9uZW50V3JhcHBlcgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dWKCJJbXBsOjpzdWJtaXRCdWZmZXIgLS0gYnVmZmVySWQgPSAlZCIsIGJ1ZmZlcklkKTsKKyAgICAgICAgLy8gVE9ETzogVXNlIGZkIHRvIGNvbnN0cnVjdCBmZW5jZQorICAgICAgICAodm9pZClmZW5jZUZkOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgQzJIYW5kbGUqIGhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUoYnVmZmVyLT5oYW5kbGUpLAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LCBidWZmZXItPnVzYWdlLCBidWZmZXItPnN0cmlkZSk7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC5sb2NrKCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXguZmV0Y2hfYWRkKAorICAgICAgICAgICAgICAgIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXJJZCwgc3JjID0gbVNvdXJjZV0oQzJCdWZmZXIqIHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBzcmMucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIGVyciA9IGNvbXBRdWV1ZSgmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCAvKiBidWZmZXJJZCAqLykgb3ZlcnJpZGUgeworICAgICAgICBBTE9HVigiSW1wbDo6c3VibWl0RW9zIik7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXguZmV0Y2hfYWRkKAorICAgICAgICAgICAgICAgIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcFF1ZXVlKCZpdGVtcyk7CisgICAgICAgIHJldHVybiAoZXJyID09IEMyX09LKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClkYXRhU3BhY2U7CisgICAgICAgICh2b2lkKWFzcGVjdHM7CisgICAgICAgICh2b2lkKXBpeGVsRm9ybWF0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBjb21wUXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wID0gbUNvbXAubG9jaygpOworICAgICAgICBpZiAoY29tcCkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmID0gY29tcC0+aW50ZigpOworICAgICAgICAgICAgaWYgKGludGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Zi0+cXVlcnlfdmIoc3RhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2UuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1SZW1vdGVDb21wKSB7CisgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIGNvbXBvbmVudCBubyBsb25nZXIgZXhpc3RzLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoCisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXMuc2l6ZSgpICsgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCkpOworICAgICAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHN0YWNrUGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICAgICAgaWYgKCFzdGFja1BhcmFtKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhY2tQYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXgmIGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgICAgIH0KKyAgICAgICAgaW5kaWNlcy5yZXNpemUobnVtSW5kaWNlcyk7CisgICAgICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgICAgICBoZWFwUGFyYW1zLT5yZXNlcnZlKGhlYXBQYXJhbXMtPnNpemUoKSArIG51bUluZGljZXMpOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVJlbW90ZUNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtU3RhY2tJbmRpY2VzLCAmc3RhY2tQYXJhbXMsIGhlYXBQYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFBhcmFtcyYgcCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBjYWxsIGZhaWxlZDogJXMuIiwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHBhcnNlU3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlU3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIGVycm9yIHdoaWxlIHBhcnNpbmcgcGFyYW1zOiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocGFyc2VTdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhcnNlU3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0YWNrUGFyYW1zW2ldOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIHBhcmFtIHNraXBwZWQuIGluZGV4ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNvbXBRdWVyeSAtLSBwYXJhbSB1cGRhdGUgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCA9ICVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocGFyYW1Qb2ludGVyLT5pbmRleCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVhcFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY29tcFF1ZXJ5IC0tIHRvbyBtYW55IHN0YWNrIHBhcmFtcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjb21wUXVlcnkgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGNvbXBRdWV1ZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgICAgIGlmIChjb21wKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcC0+cXVldWVfbmIoaXRlbXMpOworICAgICAgICB9CisKKyAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgICAgICBTdGF0dXMgaGlkbFN0YXR1cyA9IG9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCBudWxscHRyKTsKKyAgICAgICAgaWYgKGhpZGxTdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0QoImNvbXBRdWV1ZSAtLSBiYWQgaW5wdXQuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbVJlbW90ZUNvbXAtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0QoImNvbXBRdWV1ZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR1YoImNvbXBRdWV1ZSAtLSBjYWxsIGZhaWxlZDogJXMuIiwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB3cDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IG1Db21wOworICAgIHNwPElDb21wb25lbnQ+IG1SZW1vdGVDb21wOworICAgIHN0ZDo6c3RyaW5nIG1Db21wTmFtZTsKKworICAgIC8vIE5lZWRlZCBmb3IgQ29tcG9uZW50V3JhcHBlciBpbXBsZW1lbnRhdGlvbgorICAgIHN0ZDo6bXV0ZXggbUFsbG9jYXRvck11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKK307CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXApIDoKKyAgICBtU291cmNlKHNvdXJjZSksCisgICAgbUltcGwobmV3IEltcGwoc291cmNlLCBjb21wKSkgeworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgY29tcCkgOgorICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICBtSW1wbChuZXcgSW1wbChzb3VyY2UsIGNvbXApKSB7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246On5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgeworICAgIGlmIChtU291cmNlKSB7CisgICAgICAgICh2b2lkKW1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgKHZvaWQpbVNvdXJjZS0+cmVsZWFzZSgpOworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgfQorICAgIG1JbXBsLmNsZWFyKCk7Cit9CisKK2Jvb2wgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6aW5pdCgpIHsKKyAgICBtTXV0ZXgubG9jaygpOworICAgIHNwPEltcGw+IGltcGwgPSBtSW1wbDsKKyAgICBtTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoIWltcGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gaW1wbC0+aW5pdCgpOworfQorCitSZXR1cm48U3RhdHVzPiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEFMT0dWKCJkaXNjb25uZWN0Iik7CisgICAgbU11dGV4LmxvY2soKTsKKyAgICBpZiAobVNvdXJjZSkgeworICAgICAgICAodm9pZCltU291cmNlLT5zdG9wKCk7CisgICAgICAgICh2b2lkKW1Tb3VyY2UtPnJlbGVhc2UoKTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICBtSW1wbC5jbGVhcigpOworICAgIG1NdXRleC51bmxvY2soKTsKKyAgICBBTE9HVigiZGlzY29ubmVjdGVkIik7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA4MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQmluZGVyOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBDb25maWd1cmFibGU8SUNvbXBvbmVudEludGVyZmFjZT4geworICAgIENvbXBvbmVudEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGVyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7Cit9OworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIENvbmZpZ3VyYWJsZTxJQ29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRlc3Ryb3lCbG9ja1Bvb2wodWludDY0X3QgYmxvY2tQb29sSWQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZWxlYXNlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtQmxvY2tQb29sc011dGV4OworICAgIC8vIFRoaXMgbWFwIGtlZXBzIEMyQmxvY2tQb29sIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBieSBjcmVhdGVCbG9ja1Bvb2woKQorICAgIC8vIGFsaXZlLiBUaGVzZSBDMkJsb2NrUG9vbCBvYmplY3RzIGNhbiBiZSBkZWxldGVkIGJ5IGNhbGxpbmcKKyAgICAvLyBkZXN0cm95QmxvY2tQb29sKCksIHJlc2V0KCkgb3IgcmVsZWFzZSgpLCBvciBieSBkZXN0cm95aW5nIHRoZSBjb21wb25lbnQuCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworCisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgYSBjb21wYXJhYmxlIHdyYXBwZXIgZm9yIElDb21wb25lbnQuCisgICAgLy8KKyAgICAvLyBBbiBJQ29tcG9uZW50IG9iamVjdCBpcyBlaXRoZXIgbG9jYWwgb3IgcmVtb3RlLiBJZiBpdCBpcyBsb2NhbCwgd2UgY2FuCisgICAgLy8gdXNlIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIgYXMgYSBrZXkuIElmIGl0IGlzIHJlbW90ZSwgd2UgaGF2ZSB0byB1c2UgdGhlCisgICAgLy8gdW5kZXJseWluZyBwb2ludGVyIG9mIHRoZSBhc3NvY2lhdGVkIGJpbmRlciBvYmplY3QgYXMgYSBrZXkuCisgICAgLy8KKyAgICAvLyBTZWUgaW50ZXJmYWNlc0VxdWFsKCkgZm9yIG1vcmUgZGV0YWlsLgorICAgIHN0cnVjdCBJbnRlcmZhY2VLZXkgeworICAgICAgICAvLyBBbiBJbnRlcmZhY2VLZXkgaXMgY29uc3RydWN0ZWQgZnJvbSBJQ29tcG9uZW50LgorICAgICAgICBJbnRlcmZhY2VLZXkoY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCk7CisgICAgICAgIC8vIG9wZXJhdG9yPCBpcyBkZWZpbmVkIGhlcmUgdG8gY29udHJvbCB0aGUgZGVmYXVsdCBkZWZpbml0aW9uIG9mCisgICAgICAgIC8vIHN0ZDo6bGVzczxJbnRlcmZhY2VLZXk+LCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gdHlwZSBSb3N0ZXIgZGVmaW5lZAorICAgICAgICAvLyBiZWxvdy4KKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSW50ZXJmYWNlS2V5JiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGlzUmVtb3RlID8KKyAgICAgICAgICAgICAgICAgICAgKG90aGVyLmlzUmVtb3RlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW90ZSAmIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPElCaW5kZXIqPigpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIucmVtb3RlLnVuc2FmZV9nZXQoKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3RlICYgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSA6CisgICAgICAgICAgICAgICAgICAgIChvdGhlci5pc1JlbW90ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCAmIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCAmIGxvY2FsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8SUNvbXBvbmVudCo+KCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwudW5zYWZlX2dldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmxvY2FsLnVuc2FmZV9nZXQoKSkpOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc1JlbW90ZTsKKyAgICAgICAgd3A8SUJpbmRlcj4gcmVtb3RlOworICAgICAgICB3cDxJQ29tcG9uZW50PiBsb2NhbDsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxJbnRlcmZhY2VLZXksIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PiBSb3N0ZXI7CisgICAgdHlwZWRlZiBSb3N0ZXI6OmNvbnN0X2l0ZXJhdG9yIExvY2FsSWQ7CisgICAgTG9jYWxJZCBtTG9jYWxJZDsKKyAgICB2b2lkIHNldExvY2FsSWQoY29uc3QgTG9jYWxJZCYgbG9jYWxJZCk7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWUxNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIENvbmZpZ3VyYWJsZTxJQ29tcG9uZW50U3RvcmU+IHsKKyAgICBDb21wb25lbnRTdG9yZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKyAgICB2aXJ0dWFsIH5Db21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcyk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKKyAgICBSZXR1cm48dm9pZD4gY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgY3JlYXRlSW50ZXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIFJldHVybjxzcDxJSW5wdXRTdXJmYWNlPj4gY3JlYXRlSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgUmV0dXJuPHZvaWQ+IGdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICAgICAgZ2V0U3RydWN0RGVzY3JpcHRvcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IGdldFBvb2xDbGllbnRNYW5hZ2VyKCkgb3ZlcnJpZGU7CisgICAgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworCisgICAgLy8gRGVidWcgZHVtcAorICAgIFJldHVybjx2b2lkPiBkZWJ1ZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgLy8gZG9lcyBib29ra2VlcGluZyBmb3IgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIGJlZW4gbG9hZGVkCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnQgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIENvbXBvbmVudDo6Um9zdGVyIG1Db21wb25lbnRSb3N0ZXI7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Db21wb25lbnRSb3N0ZXJNdXRleDsKKyAgICB2b2lkIHJlcG9ydENvbXBvbmVudERlYXRoKGNvbnN0IENvbXBvbmVudDo6TG9jYWxJZCYgY29tcG9uZW50TG9jYWxJZCk7CisKKyAgICBmcmllbmQgQ29tcG9uZW50OworCisgICAgLy8gQzJDb21wb25lbnQgbG9va3VwCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kQzJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgY29tcG9uZW50KSBjb25zdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTMzYTZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGVDMkludGYuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIElDb25maWd1cmFibGUgaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMgY2FjaGluZyBvZgorICogc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBhIHN1cHBsaWVkIENvbXBvbmVudFN0b3JlLgorICoKKyAqIFRoaXMgaXMgbWFpbmx5IHRoZSBzYW1lIGZvciBhbGwgb2YgdGhlIGNvbmZpZ3VyYWJsZSBDMiBpbnRlcmZhY2VzIHRob3VnaAorICogdGhlcmUgYXJlIHNsaWdodCBkaWZmZXJlbmNlcyBpbiB0aGUgYmxvY2tpbmcgYmVoYXZpb3IuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUKKyAqIENvbmZpZ3VyYWJsZUMySW50ZiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK3N0cnVjdCBDYWNoZWRDb25maWd1cmFibGUgOiBwdWJsaWMgSUNvbmZpZ3VyYWJsZSB7CisgICAgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6dW5pcXVlX3B0cjxDb25maWd1cmFibGVDMkludGY+JiYgaW50Zik7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlCisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXROYW1lKGdldE5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbmZpZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb21tb24gQ29kZWMyLjAgaW50ZXJmYWNlIHdyYXBwZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiBtSW50ZjsKKworICAgIC8vIENhY2hlZCBzdXBwb3J0ZWQgcGFyYW1zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVN1cHBvcnRlZFBhcmFtczsKK307CisKKy8qKgorICogVGVtcGxhdGUgdGhhdCBpbXBsZW1lbnRzIHRoZSBgSUNvbmZpZ3VyYWJsZWAgaW50ZXJmYWNlIGZvciBhbiBpbmhlcml0ZWQKKyAqIGludGVyZmFjZS4gQ2xhc3NlcyB0aGF0IGltcGxlbWVudCBhIGNoaWxkIGludGVyZmFjZSBgSWAgb2YgYElDb25maWd1cmFibGVgCisgKiBjYW4gZGVyaXZlIGZyb20gYENvbmZpZ3VyYWJsZTxJPmAuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBJPgorc3RydWN0IENvbmZpZ3VyYWJsZSA6IHB1YmxpYyBJIHsKKyAgICBDb25maWd1cmFibGUoY29uc3Qgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiYgaW50Zik6IG1JbnRmKGludGYpIHsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBpbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSkgeworICAgICAgICByZXR1cm4gbUludGYtPmluaXQoc3RvcmUpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUKKworICAgIHVzaW5nIGdldE5hbWVfY2IgPSB0eXBlbmFtZSBJOjpnZXROYW1lX2NiOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldE5hbWUoZ2V0TmFtZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPmdldE5hbWUoX2hpZGxfY2IpOworICAgIH0KKworICAgIHVzaW5nIHF1ZXJ5X2NiID0gdHlwZW5hbWUgSTo6cXVlcnlfY2I7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeShpbmRpY2VzLCBtYXlCbG9jaywgX2hpZGxfY2IpOworICAgIH0KKworICAgIHVzaW5nIGNvbmZpZ19jYiA9IHR5cGVuYW1lIEk6OmNvbmZpZ19jYjsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25maWcoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5QYXJhbXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgY29uZmlnX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+Y29uZmlnKGluUGFyYW1zLCBtYXlCbG9jaywgX2hpZGxfY2IpOworICAgIH0KKworICAgIHVzaW5nIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX2NiID0gdHlwZW5hbWUgSTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2I7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhzdGFydCwgY291bnQsIF9oaWRsX2NiKTsKKyAgICB9CisKKyAgICB1c2luZyBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiA9IHR5cGVuYW1lIEk6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGluRmllbGRzLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoaW5GaWVsZHMsIG1heUJsb2NrLCBfaGlkbF9jYik7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtSW50ZjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZUMySW50Zi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZUMySW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODAxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlQzJJbnRmLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVDMklOVEZfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRUMySU5URl9ICisKKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKKy8qKgorICogQ29tbW9uIENvZGVjIDIuMCBpbnRlcmZhY2Ugd3JhcHBlci4KKyAqLworc3RydWN0IENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpxdWVyeV92YiBzYW5zIHN0YWNrIHBhcmFtcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpjb25maWdfdmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlQzJJbnRmKCkgPSBkZWZhdWx0OworCisgICAgQ29uZmlndXJhYmxlQzJJbnRmKGNvbnN0IEMyU3RyaW5nJiBuYW1lKSA6IG1OYW1lKG5hbWUpIHt9CisKK3Byb3RlY3RlZDoKKyAgICBDMlN0cmluZyBtTmFtZTsgLyogY2FjaGUgY29tcG9uZW50IG5hbWUgKi8KK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVDMklOVEZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjI1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK2NsYXNzIEMyUmVmbGVjdG9ySGVscGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6QW53QnVmZmVyOworCitzdHJ1Y3QgSW5wdXRTdXJmYWNlIDogcHVibGljIElJbnB1dFN1cmZhY2UgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIElCYXNlOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSVByb2R1Y2VyTGlzdGVuZXIgSFByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBHcmFwaGljQnVmZmVyU291cmNlIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKKy8vIFR5cGUgZGlzYW1iaWd1YXRpb24KKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpTdGF0dXMgU3RhdHVzOworCisvLyBOZXcgbWV0aG9kcyBmcm9tIElJbnB1dFN1cmZhY2UKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25uZWN0VG9Db21wb25lbnRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisvLyBNZXRob2RzIGRlcml2ZWQgZnJvbSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiByZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBzbG90LAorICAgICAgICAgICAgcmVxdWVzdEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxpbnQzMl90PiBzZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAorICAgICAgICAgICAgaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48aW50MzJfdD4gc2V0QXN5bmNNb2RlKAorICAgICAgICAgICAgYm9vbCBhc3luYykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCB1c2FnZSwKKyAgICAgICAgICAgIGJvb2wgZ2V0RnJhbWVUaW1lc3RhbXBzLAorICAgICAgICAgICAgZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxpbnQzMl90PiBkZXRhY2hCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IHNsb3QpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZGV0YWNoTmV4dEJ1ZmZlcigKKyAgICAgICAgICAgIGRldGFjaE5leHRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gYXR0YWNoQnVmZmVyKAorICAgICAgICAgICAgY29uc3QgQW53QnVmZmVyJiBidWZmZXIsCisgICAgICAgICAgICBhdHRhY2hCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVldWVCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IHNsb3QsCisgICAgICAgICAgICBjb25zdCBRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICAgICAgICAgIHF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IGNhbmNlbEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3Qgc2xvdCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBmZW5jZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeSgKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdCwKKyAgICAgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgICAgICBib29sIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLAorICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxpbnQzMl90PiBkaXNjb25uZWN0KAorICAgICAgICAgICAgaW50MzJfdCBhcGksCisgICAgICAgICAgICBEaXNjb25uZWN0TW9kZSBtb2RlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IHNldFNpZGViYW5kU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIHN0cmVhbSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBhbGxvY2F0ZUJ1ZmZlcnMoCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IGFsbG93QWxsb2NhdGlvbigKKyAgICAgICAgICAgIGJvb2wgYWxsb3cpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48aW50MzJfdD4gc2V0R2VuZXJhdGlvbk51bWJlcigKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0Q29uc3VtZXJOYW1lKAorICAgICAgICAgICAgZ2V0Q29uc3VtZXJOYW1lX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IHNldFNoYXJlZEJ1ZmZlck1vZGUoCisgICAgICAgICAgICBib29sIHNoYXJlZEJ1ZmZlck1vZGUpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48aW50MzJfdD4gc2V0QXV0b1JlZnJlc2goCisgICAgICAgICAgICBib29sIGF1dG9SZWZyZXNoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPGludDMyX3Q+IHNldERlcXVldWVUaW1lb3V0KAorICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0TGFzdFF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgICAgIGdldExhc3RRdWV1ZWRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0RnJhbWVUaW1lc3RhbXBzKAorICAgICAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldFVuaXF1ZUlkKAorICAgICAgICAgICAgZ2V0VW5pcXVlSWRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgY2xhc3MgQ29uZmlndXJhYmxlSW1wbDsKKworcHJvdGVjdGVkOgorICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJhc2U7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uZmlndXJhYmxlSW1wbD4gbUhlbHBlcjsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0ZmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcG9uZW50KTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGNvbXBvbmVudCk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oY29uc3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKworICAgIHN0cnVjdCBJbXBsOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNTBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxjaHJvbm8+CisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDb25uZWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFR5cGVzIG9mIG1ldGFkYXRhIGZvciBCbG9ja3MuCitzdHJ1Y3QgQzJIaWRsX1JhbmdlIHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgbGVuZ3RoOyAvLyBEbyBub3QgdXNlICJzaXplIiBiZWNhdXNlIHRoZSBuYW1lIGNvbGxpZGVzIHdpdGggQzJJbmZvOjpzaXplKCkuCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJIaWRsX1JhbmdlLCAwPiBDMkhpZGxfUmFuZ2VJbmZvOworCitzdHJ1Y3QgQzJIaWRsX1JlY3QgeworICAgIHVpbnQzMl90IGxlZnQ7CisgICAgdWludDMyX3QgdG9wOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmVjdCwgMT4gQzJIaWRsX1JlY3RJbmZvOworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgU2V0dGluZ1Jlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJTZXR0aW5nUmVzdWx0JiBzKTsKKworLy8gU2V0dGluZ1Jlc3VsdCAtPiBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorU3RhdHVzIG9iamNweSgKKyAgICAgICAgUGFyYW1EZXNjcmlwdG9yKiBkLAorICAgICAgICBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+CitjMl9zdGF0dXNfdCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CitTdGF0dXMgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2MyX3N0YXR1c190IG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworU3RhdHVzIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMqIGQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMmIHMpOworCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KKy8vIE5vdGU6IFRoZSBvdXRwdXQgZCBpcyBvbmx5IHZhbGlkIGFzIGxvbmcgYXMgYWxpYXNlc0J1ZmZlciByZW1haW5zIGFsaXZlLgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiogYWxpYXNlc0J1ZmZlciwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpOworCisvLyBDMlN0cnVjdERlc2NyaXB0b3IgLT4gU3RydWN0RGVzY3JpcHRvcgorU3RhdHVzIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFN0cnVjdERlc2NyaXB0b3ImIHMpOworCisvLyBBYnN0cmFjdCBjbGFzcyB0byBiZSB1c2VkIGluCisvLyBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KK3N0cnVjdCBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBSZXN1bHRTdGF0dXM7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIEJ1ZmZlclN0YXR1c01lc3NhZ2U7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6CisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSBCdWZmZXJQb29sRGF0YTsKKworICAgIC8qKgorICAgICAqIFNlbmQgYnBEYXRhIGFuZCByZXR1cm4gQnVmZmVyU3RhdHVzTWVzc2FnZSB0aGF0IGNhbiBiZSBzdXBwbGllZCB0bworICAgICAqIElDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKCkgaW4gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24KKyAgICAgKiBvYmpjcHkoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gYnBEYXRhIEJ1ZmZlclBvb2xEYXRhIGlkZW50aWZ5aW5nIHRoZSBidWZmZXIgdG8gc2VuZC4KKyAgICAgKiBccGFyYW1bb3V0XSBicE1lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEluZm9ybWF0aW9uCisgICAgICogICAgaW5zaWRlIFxwIGJwTWVzc2FnZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBieSBzb21lCisgICAgICogICAgb3RoZXIgbWVhbnMgc28gaXQgY2FuIGNhbGwgcmVjZWl2ZSgpIHByb3Blcmx5LgorICAgICAqIFxyZXR1cm4gUmVzdWx0U3RhdHVzIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3VjY2VzcyBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqICAgIChTZWUgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBSZXN1bHRTdGF0dXMgaW4KKyAgICAgKiAgICBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmhhbC4pCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgPSAwOworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbFNlbmRlcigpID0gZGVmYXVsdDsKK307CisKKy8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlci4KKy8vCisvLyBUbyB1c2UgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIsIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nCisvLyBwcm9jZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBzZW5kKCkgY2FuIG9wZXJhdGUuIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyIHdpbGwKKy8vIGhvbGQgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvIGNhbGwKKy8vIElDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigpIHRvIGVzdGFibGlzaCB0aGUgYnVmZmVycG9vbCBjb25uZWN0aW9uIHdoZW4KKy8vIHNlbmQoKSBpcyBjYWxsZWQuCitzdHJ1Y3QgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgOiBCdWZmZXJQb29sU2VuZGVyIHsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyIENsaWVudE1hbmFnZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBJQ2xpZW50TWFuYWdlciBJQ2xpZW50TWFuYWdlcjsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCA9IDQ1MDBtcyk7CisKKyAgICAvLyBTZXQgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBhbmQgdGhlIHJlZnJlc2gKKyAgICAvLyBpbnRlcnZhbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZSBkZWZhdWx0IGludGVydmFsIGlzIDQuNSBzZWNvbmRzLCB3aGljaAorICAgIC8vIGlzIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJ1ZmZlcnBvb2wgd2lsbCBrZWVwIGFuCisgICAgLy8gaW5hY3RpdmUgY29ubmVjdGlvbiBmb3IuCisgICAgdm9pZCBzZXRSZWNlaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoKS4gc2VuZCgpIHdpbGwgZXN0YWJsaXNoIGEKKyAgICAvLyBidWZmZXJwb29sIGNvbm5lY3Rpb24gaWYgbmVlZGVkLCB0aGVuIHNlbmQgdGhlIGJ1ZmZlcnBvb2wgZGF0YSBvdmVyIHRvCisgICAgLy8gdGhlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIHNlbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPENsaWVudE1hbmFnZXI+IG1TZW5kZXJNYW5hZ2VyOworICAgIHNwPElDbGllbnRNYW5hZ2VyPiBtUmVjZWl2ZXJNYW5hZ2VyOworICAgIGludDY0X3QgbVJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbVNvdXJjZUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1MYXN0U2VudDsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBtUmVmcmVzaEludGVydmFsOworfTsKKworLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAtPiBXb3JrQnVuZGxlCisvLyBOb3RlOiBJZiBidWZmZXJwb29sIHdpbGwgYmUgdXNlZCwgYnBTZW5kZXIgbXVzdCBub3QgYmUgbnVsbC4KK1N0YXR1cyBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLAorICAgICAgICBjb25zdCBXb3JrQnVuZGxlJiBzKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgcmV0dXJucyBDMlBhcmFtIHBvaW50ZXJzIHRvIGl0cyBwYXJhbXMuCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICogXHBhcmFtW291dF0gYmxvYiB0YXJnZXQgYmxvYgorICogXHBhcmFtW2luXSBwYXJhbXMgcGFyYW1ldGVycyB0byBjb25jYXRlbmF0ZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGlmIHRoZSBibG9iIHdhcyBub3Qgc3VjY2Vzc2Z1bCAodGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZQorICogICAgICAgICBub3QgY29uc3QpCisgKi8KK1N0YXR1cyBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpOworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcyk7CitTdGF0dXMgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICogXHBhcmFtW291dF0gcGFyYW1zIHRoZSByZXN1bHRpbmcgdmVjdG9yCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKTsKKworLyoqCisgKiBQYXJzZXMgYSBwYXJhbXMgYmxvYiBhbmQgYXBwbGllcyB1cGRhdGVzIHRvIHBhcmFtcworICogXHBhcmFtW2luLG91dF0gcGFyYW1zIHBhcmFtcyB0byBiZSB1cGRhdGVkCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgY29udGFpbmluZyB1cGRhdGVzCisgKiBccmV0dmFsIEMyX09LIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBvdGhlcndpc2UKKyAqLworYzJfc3RhdHVzX3QgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpOworCisvKioKKyAqIENvbnZlcnRzIGEgQnVmZmVyUG9vbCBzdGF0dXMgdmFsdWUgdG8gYzJfc3RhdHVzX3QuCisgKiBccGFyYW0gQnVmZmVyUG9vbCBzdGF0dXMKKyAqIFxyZXR1cm4gQ29ycmVzcG9uZGluZyBjMl9zdGF0dXNfdAorICovCitjMl9zdGF0dXNfdCB0b0MyU3RhdHVzKDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgUmVzdWx0U3RhdHVzIHJzKTsKKworLy8gQnVmZmVyUXVldWUtQmFzZWQgQmxvY2sgT3BlcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jayBhbmQgYXR0YWNoIGl0IHRvIGFuCisvLyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLgorc3RhdHVzX3QgYXR0YWNoVG9CdWZmZXJRdWV1ZShjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCk7CisKKy8vIFJldHVybiBmYWxzZSBpZiBibG9jayBkb2VzIG5vdCBjb21lIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wuCisvLyBPdGhlcndpc2UsIGV4dHJhY3QgZ2VuZXJhdGlvbiwgYnFJZCBhbmQgYnFTbG90IGFuZCByZXR1cm4gdHJ1ZS4KK2Jvb2wgZ2V0QnVmZmVyUXVldWVBc3NpZ25tZW50KGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCk7CisKKy8vIERpc2Fzc29jaWF0ZSB0aGUgZ2l2ZW4gYmxvY2sgd2l0aCBpdHMgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSBzbyB0aGF0CisvLyBjYW5jZWxCdWZmZXIoKSB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLiBJZiB0aGUgYmxvY2sKKy8vIGRvZXMgbm90IGhhdmUgYSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKy8vIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0cnVlLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhdHRhY2hCdWZmZXIoKSBvciBxdWV1ZUJ1ZmZlcigpIGlzCisvLyBjYWxsZWQgbWFudWFsbHkuCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7CisKKy8vIENhbGwgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4gcHJvY2Vzc0lucHV0CisvLyBkZXRlcm1pbmVzIHdoZXRoZXIgaW5wdXQgYmxvY2tzIGFyZSB5aWVsZGVkLiBwcm9jZXNzT3V0cHV0IHdvcmtzIHNpbWlsYXJseSBvbgorLy8gb3V0cHV0IGJsb2Nrcy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mIHByb2Nlc3NJbnB1dCBpcyBmYWxzZSB3aGlsZSB0aGUgZGVmYXVsdAorLy8gdmFsdWUgb2YgcHJvY2Vzc091dHB1dCBpcyB0cnVlLiBUaGlzIGltcGxpZXMgdGhhdCBpbiBtb3N0IGNhc2VzLCBvbmx5IG91dHB1dAorLy8gYnVmZmVycyBjb250YWluIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2Nrcy4pCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisvLyBzZW50IG92ZXIgdGhlIFRyZWJsZSBib3VuZGFyeSB0byBhbm90aGVyIHByb2Nlc3MuCit2b2lkIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NPdXRwdXQgPSB0cnVlKTsKKworLy8gQXNzaWduIHRoZSBnaXZlbiBibG9jayB0byBhIGJ1ZmZlcnF1ZXVlIHNvIHRoYXQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBiZSBjYWxsZWQuCisvLworLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgdGhpcyBmdW5jdGlvbgorLy8gcmV0dXJucyBmYWxzZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLAorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCisvLyBnaXZlbiBvbmUsIHRoZSBibG9jayB3aWxsIGJlIHJlYXNzaWduZWQgdG8gdGhlIGdpdmVuIGJ1ZmZlcnF1ZXVlLiBUaGlzCisvLyB3aWxsIGNhbGwgYXR0YWNoQnVmZmVyKCkgb24gdGhlIGdpdmVuIGlnYnAuIFRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgdHJ1ZSBvbgorLy8gc3VjY2VzcyBvciBmYWxzZSBvbiBhbnkgZmFpbHVyZSBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZGV0YWNoQnVmZmVyKCkgb3IgZGVxdWV1ZUJ1ZmZlcigpCisvLyBpcyBjYWxsZWQgbWFudWFsbHkuCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKy8vIENhbGwgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBpbnB1dCBvciBvdXRwdXQgYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4KKy8vIFNpbmNlIHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgY2FuIGJlCisvLyBkaWZmZXJlbnQsIHRoaXMgZnVuY3Rpb24gdGFrZXMgZm9ySW5wdXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuCisvLyBidWZmZXJxdWV1ZSBpcyBmb3IgaW5wdXQgYnVmZmVycyBvciBvdXRwdXQgYnVmZmVycy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mCisvLyBmb3JJbnB1dCBpcyBmYWxzZS4pCisvLworLy8gSW4gdGhlIChyYXJlKSBjYXNlIHRoYXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGJ1ZmZlcnF1ZXVlLWJhc2VkLAorLy8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgdGhlIGlucHV0IGJ1ZmZlcnMgYW5kIG9uY2UgZm9yCisvLyB0aGUgb3V0cHV0IGJ1ZmZlcnMuCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbQorLy8gYW5vdGhlciBwcm9jZXNzLgordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCA9IGZhbHNlKTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTNiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTgwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OkJ1ZmZlclN0YXR1c01lc3NhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgQ2xpZW50TWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIFRyYW5zYWN0aW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb21tb24sIHR5cGVuYW1lIERzdFZlY3RvciwgdHlwZW5hbWUgU3JjVmVjdG9yPgordm9pZCBjb3B5VmVjdG9yKERzdFZlY3RvciogZCwgY29uc3QgU3JjVmVjdG9yJiBzKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29tbW9uKSA9PSBzaXplb2YoZGVjbHR5cGUoKCpkKVswXSkpLAorICAgICAgICAgICAgIkRzdFZlY3RvcidzIGNvbXBvbmVudCBzaXplIGRvZXMgbm90IG1hdGNoIENvbW1vbiIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKHNbMF0pKSwKKyAgICAgICAgICAgICJTcmNWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBkLT5yZXNpemUocy5zaXplKCkpOworICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0pLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21tb24qPigmc1swXSArIHMuc2l6ZSgpKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q29tbW9uKj4oJigqZClbMF0pKTsKK30KKworLy8gQzJQYXJhbUZpZWxkIC0+IFBhcmFtRmllbGQKK3ZvaWQgb2JqY3B5KFBhcmFtRmllbGQgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZCAmcykgeworICAgIGQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHMpKTsKKyAgICBkLT5maWVsZElkLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHMpKTsKKyAgICBkLT5maWVsZElkLnNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocykpOworfQorCitzdHJ1Y3QgQzJQYXJhbUZpZWxkQnVpbGRlciA6IHB1YmxpYyBDMlBhcmFtRmllbGQgeworICAgIEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSA6IEMyUGFyYW1GaWVsZCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW06OkluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oMCkpLCAwLCAwKSB7CisgICAgfQorICAgIC8vIFBhcmFtRmllbGQgLT4gQzJQYXJhbUZpZWxkCisgICAgQzJQYXJhbUZpZWxkQnVpbGRlcihjb25zdCBQYXJhbUZpZWxkJiBzKSA6IEMyUGFyYW1GaWVsZCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW06OkluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuZmllbGRJZC5vZmZzZXQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuZmllbGRJZC5zaXplKSkgeworICAgIH0KK307CisKKy8vIEMyV29ya09yZGluYWxTdHJ1Y3QgLT4gV29ya09yZGluYWwKK3ZvaWQgb2JqY3B5KFdvcmtPcmRpbmFsICpkLCBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZzKSB7CisgICAgZC0+ZnJhbWVJbmRleCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgZC0+dGltZXN0YW1wVXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy50aW1lc3RhbXAucGVla3UoKSk7CisgICAgZC0+Y3VzdG9tT3JkaW5hbCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmN1c3RvbU9yZGluYWwucGVla3UoKSk7Cit9CisKKy8vIFdvcmtPcmRpbmFsIC0+IEMyV29ya09yZGluYWxTdHJ1Y3QKK3ZvaWQgb2JqY3B5KEMyV29ya09yZGluYWxTdHJ1Y3QgKmQsIGNvbnN0IFdvcmtPcmRpbmFsICZzKSB7CisgICAgZC0+ZnJhbWVJbmRleCA9IGMyX2NudHI2NF90KHMuZnJhbWVJbmRleCk7CisgICAgZC0+dGltZXN0YW1wID0gYzJfY250cjY0X3Qocy50aW1lc3RhbXBVcyk7CisgICAgZC0+Y3VzdG9tT3JkaW5hbCA9IGMyX2NudHI2NF90KHMuY3VzdG9tT3JkaW5hbCk7Cit9CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlJ3MgdHlwZSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UKK3ZvaWQgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UqIGQsCisgICAgICAgIGNvbnN0IGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSYgcykgeworICAgIGQtPm1pbiA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm1pbi51NjQpOworICAgIGQtPm1heCA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm1heC51NjQpOworICAgIGQtPnN0ZXAgPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5zdGVwLnU2NCk7CisgICAgZC0+bnVtID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMubnVtLnU2NCk7CisgICAgZC0+ZGVub20gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5kZW5vbS51NjQpOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzCitTdGF0dXMgb2JqY3B5KEZpZWxkU3VwcG9ydGVkVmFsdWVzICpkLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzKSB7CisgICAgZC0+dHlwZU90aGVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocy50eXBlKTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6UkFOR0U7CisgICAgICAgIG9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpOworICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKKyAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkZMQUdTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6Ok9USEVSOworICAgICAgICAgICAgLy8gQ29weSBhbGwgZmllbGRzIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZShzLnZhbHVlcy5zaXplKCkpOworICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlJ3MgdHlwZQordm9pZCBvYmpjcHkoCisgICAgICAgIGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlJiBzKSB7CisgICAgZC0+bWluLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1pbik7CisgICAgZC0+bWF4LnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1heCk7CisgICAgZC0+c3RlcC51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5zdGVwKTsKKyAgICBkLT5udW0udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubnVtKTsKKyAgICBkLT5kZW5vbS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5kZW5vbSk7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMKK2MyX3N0YXR1c190IG9iamNweShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpkLCBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlcyAmcykgeworICAgIHN3aXRjaCAocy50eXBlKSB7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpFTVBUWTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlJBTkdFOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U7CisgICAgICAgIG9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpOworICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICAgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOgorICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdD4ocy50eXBlT3RoZXIpOworICAgICAgICAgICAgLy8gQ29weSBhbGwgZmllbGRzIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgY29weVZlY3Rvcjx1aW50NjRfdD4oJmQtPnZhbHVlcywgcy52YWx1ZXMpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5CitTdGF0dXMgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBvYmpjcHkoJmQtPmZpZWxkLCBzLmZpZWxkKCkpOworICAgIHN3aXRjaCAocy50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQ6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVW5rbm93biB0eXBlIG9mIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTogJXUiLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzLnR5cGUoKSkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCBkVHlwZTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlVua25vd24gdHlwZSBvZiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OiAldSIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHMudHlwZSkpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICAqZCA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShDMlBhcmFtRmllbGRCdWlsZGVyKHMuZmllbGQpLCBkVHlwZSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorU3RhdHVzIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKSB7CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihzLnN0YXR1cyk7CisgICAgcmV0dXJuIG9iamNweSgmZC0+dmFsdWVzLCBzLnZhbHVlcyk7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4KKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHNxLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0JiBzcikgeworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG9iamNweShkLCBzcSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3Iuc3RhdHVzKTsKKyAgICByZXR1cm4gb2JqY3B5KCZkLT52YWx1ZXMsIHNyLnZhbHVlcyk7Cit9CisKKy8vIEMyQ29tcG9uZW50OjpUcmFpdHMgLT4gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMKK1N0YXR1cyBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzICpkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzICZzKSB7CisgICAgZC0+bmFtZSA9IHMubmFtZTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgIGQtPmRvbWFpbiA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkLT5kb21haW4gPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpPVEhFUjsKKyAgICB9CisgICAgZC0+ZG9tYWluT3RoZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5kb21haW4pOworCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6REVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkVOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6T1RIRVI7CisgICAgfQorICAgIGQtPmtpbmRPdGhlciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmtpbmQpOworCisgICAgZC0+cmFuayA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnJhbmspOworCisgICAgZC0+bWVkaWFUeXBlID0gcy5tZWRpYVR5cGU7CisKKyAgICBkLT5hbGlhc2VzLnJlc2l6ZShzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpeCA9IHMuYWxpYXNlcy5zaXplKCk7IGl4ID4gMDsgKSB7CisgICAgICAgIC0taXg7CisgICAgICAgIGQtPmFsaWFzZXNbaXhdID0gcy5hbGlhc2VzW2l4XTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKKy8vIENvbXBvbmVudFRyYWl0cyAtPiBDMkNvbXBvbmVudDo6VHJhaXRzLCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiogYWxpYXNlc0J1ZmZlciwKKyAgICAgICAgY29uc3QgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMmIHMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lLmNfc3RyKCk7CisKKyAgICBzd2l0Y2ggKHMuZG9tYWluKSB7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpWSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpBVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90PihzLmRvbWFpbk90aGVyKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMua2luZCkgeworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PEMyQ29tcG9uZW50OjpraW5kX3Q+KHMua2luZE90aGVyKTsKKyAgICB9CisKKyAgICBkLT5yYW5rID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OnJhbmtfdD4ocy5yYW5rKTsKKyAgICBkLT5tZWRpYVR5cGUgPSBzLm1lZGlhVHlwZS5jX3N0cigpOworCisgICAgLy8gYWxpYXNlc0J1ZmZlciBtdXN0IG5vdCBiZSByZXNpemVkIGFmdGVyIHRoaXMuCisgICAgKmFsaWFzZXNCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4oCisgICAgICAgICAgICBzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICAoKmFsaWFzZXNCdWZmZXIpLT5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBkQWxpYXNlcyhzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMuYWxpYXNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAoKiphbGlhc2VzQnVmZmVyKVtpXSA9IHMuYWxpYXNlc1tpXS5jX3N0cigpOworICAgICAgICBkLT5hbGlhc2VzW2ldID0gKCoqYWxpYXNlc0J1ZmZlcilbaV0uY19zdHIoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEMyUGFyYW1GaWVsZFZhbHVlcyAtPiBQYXJhbUZpZWxkVmFsdWVzCitTdGF0dXMgb2JqY3B5KFBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIG9iamNweSgmZC0+cGFyYW1PckZpZWxkLCBzLnBhcmFtT3JGaWVsZCk7CisgICAgaWYgKHMudmFsdWVzKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMSk7CisgICAgICAgIHJldHVybiBvYmpjcHkoJmQtPnZhbHVlc1swXSwgKnMudmFsdWVzKTsKKyAgICB9CisgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworLy8gUGFyYW1GaWVsZFZhbHVlcyAtPiBDMlBhcmFtRmllbGRWYWx1ZXMKK2MyX3N0YXR1c190IG9iamNweShDMlBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IFBhcmFtRmllbGRWYWx1ZXMgJnMpIHsKKyAgICBkLT5wYXJhbU9yRmllbGQgPSBDMlBhcmFtRmllbGRCdWlsZGVyKHMucGFyYW1PckZpZWxkKTsKKyAgICBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgZC0+dmFsdWVzID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigpOworICAgICAgICByZXR1cm4gb2JqY3B5KGQtPnZhbHVlcy5nZXQoKSwgcy52YWx1ZXNbMF0pOworICAgIH0gZWxzZSBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2V0KCk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0UoIk11bHRpcGxlIEZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdHMuICIKKyAgICAgICAgICAgICIoT25seSBvbmUgaXMgYWxsb3dlZC4pIik7CisgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorU3RhdHVzIG9iamNweShTZXR0aW5nUmVzdWx0ICpkLCBjb25zdCBDMlNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICBkLT5mYWlsdXJlT3RoZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5mYWlsdXJlKTsKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpNSVNNQVRDSDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1RZUEU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9QT1JUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpJTkZPX0NPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6T1RIRVI7CisgICAgfQorICAgIFN0YXR1cyBzdGF0dXMgPSBvYmpjcHkoJmQtPmZpZWxkLCBzLmZpZWxkKTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZC0+Y29uZmxpY3RzLnJlc2l6ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgUGFyYW1GaWVsZFZhbHVlcyAmZENvbmZsaWN0ID0gZC0+Y29uZmxpY3RzW2krK107CisgICAgICAgIHN0YXR1cyA9IG9iamNweSgmZENvbmZsaWN0LCBzQ29uZmxpY3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2MyX3N0YXR1c190IG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAqZCwgY29uc3QgU2V0dGluZ1Jlc3VsdCAmcykgeworICAgICpkID0gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4obmV3IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICAuZmllbGQgPSBDMlBhcmFtRmllbGRWYWx1ZXMoQzJQYXJhbUZpZWxkQnVpbGRlcigpKSB9KTsKKyAgICBpZiAoISpkKSB7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgLy8gZmFpbHVyZQorICAgIHN3aXRjaCAocy5mYWlsdXJlKSB7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpSRUFEX09OTFk6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpNSVNNQVRDSDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1ZBTFVFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1RZUEU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9QT1JUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfSU5ERVg6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpDT05GTElDVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6VU5TVVBQT1JURUQ6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OlVOU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBzdGF0aWNfY2FzdDxDMlNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZU90aGVyKTsKKyAgICB9CisKKyAgICAvLyBmaWVsZAorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG9iamNweSgmKCpkKS0+ZmllbGQsIHMuZmllbGQpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBjb25mbGljdHMKKyAgICAoKmQpLT5jb25mbGljdHMuY2xlYXIoKTsKKyAgICAoKmQpLT5jb25mbGljdHMucmVzZXJ2ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgKCpkKS0+Y29uZmxpY3RzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXN7IEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSwgbnVsbHB0ciB9KTsKKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCYoKmQpLT5jb25mbGljdHMuYmFjaygpLCBzQ29uZmxpY3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQzJQYXJhbURlc2NyaXB0b3IgLT4gUGFyYW1EZXNjcmlwdG9yCitTdGF0dXMgb2JqY3B5KFBhcmFtRGVzY3JpcHRvciAqZCwgY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuaW5kZXgoKSk7CisgICAgZC0+YXR0cmliID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxQYXJhbURlc2NyaXB0b3I6OkF0dHJpYj4+KAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEF0dHJpYihzKSk7CisgICAgZC0+bmFtZSA9IHMubmFtZSgpOworICAgIGNvcHlWZWN0b3I8dWludDMyX3Q+KCZkLT5kZXBlbmRlbmNpZXMsIHMuZGVwZW5kZW5jaWVzKCkpOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gQzJQYXJhbURlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICpkLCBjb25zdCBQYXJhbURlc2NyaXB0b3IgJnMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZERlcGVuZGVuY2llczsKKyAgICBkRGVwZW5kZW5jaWVzLnJlc2VydmUocy5kZXBlbmRlbmNpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IFBhcmFtSW5kZXgmIHNEZXBlbmRlbmN5IDogcy5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgZERlcGVuZGVuY2llcy5lbXBsYWNlX2JhY2soc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNEZXBlbmRlbmN5KSk7CisgICAgfQorICAgICpkID0gc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90PihzLmF0dHJpYiksCisgICAgICAgICAgICBDMlN0cmluZyhzLm5hbWUuY19zdHIoKSksCisgICAgICAgICAgICBzdGQ6Om1vdmUoZERlcGVuZGVuY2llcykpOworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK1N0YXR1cyBvYmpjcHkoU3RydWN0RGVzY3JpcHRvciAqZCwgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzKSB7CisgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuY29yZUluZGV4KCkuY29yZUluZGV4KCkpOworICAgIGQtPmZpZWxkcy5yZXNpemUocy5udW1GaWVsZHMoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgc0ZpZWxkIDogcykgeworICAgICAgICBGaWVsZERlc2NyaXB0b3ImIGRGaWVsZCA9IGQtPmZpZWxkc1tpKytdOworICAgICAgICBkRmllbGQuZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzRmllbGQpKTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQuc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShzRmllbGQpKTsKKyAgICAgICAgZEZpZWxkLnR5cGUgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4+KAorICAgICAgICAgICAgICAgIHNGaWVsZC50eXBlKCkpOworICAgICAgICBkRmllbGQubGVuZ3RoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC5leHRlbnQoKSk7CisgICAgICAgIGRGaWVsZC5uYW1lID0gc3RhdGljX2Nhc3Q8aGlkbF9zdHJpbmc+KHNGaWVsZC5uYW1lKCkpOworICAgICAgICBjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZXMgPSBzRmllbGQubmFtZWRWYWx1ZXMoKTsKKyAgICAgICAgZEZpZWxkLm5hbWVkVmFsdWVzLnJlc2l6ZShzTmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNOYW1lZFZhbHVlIDogc05hbWVkVmFsdWVzKSB7CisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWUmIGROYW1lZFZhbHVlID0gZEZpZWxkLm5hbWVkVmFsdWVzW2orK107CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS5uYW1lID0gc3RhdGljX2Nhc3Q8aGlkbF9zdHJpbmc+KHNOYW1lZFZhbHVlLmZpcnN0KTsKKyAgICAgICAgICAgIGROYW1lZFZhbHVlLnZhbHVlID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KAorICAgICAgICAgICAgICAgICAgICBzTmFtZWRWYWx1ZS5zZWNvbmQudTY0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2MyX3N0YXR1c190IG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAqZCwgY29uc3QgU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIEMyUGFyYW06OkNvcmVJbmRleCBkSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMudHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBkRmllbGRzOworICAgIGRGaWVsZHMucmVzZXJ2ZShzLmZpZWxkcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc0ZpZWxkIDogcy5maWVsZHMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZEZpZWxkID0geworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC50eXBlKSwKKyAgICAgICAgICAgIHNGaWVsZC5sZW5ndGgsCisgICAgICAgICAgICBzRmllbGQubmFtZSwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLnNpemUgfTsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgbmFtZWRWYWx1ZXMucmVzZXJ2ZShzRmllbGQubmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNGaWVsZC5uYW1lZFZhbHVlcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLm5hbWUsCisgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzTmFtZWRWYWx1ZS52YWx1ZSkpKTsKKyAgICAgICAgfQorICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6QWRkTmFtZWRWYWx1ZXMoZEZpZWxkLCBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpKTsKKyAgICAgICAgZEZpZWxkcy5lbXBsYWNlX2JhY2soZEZpZWxkKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlU3RydWN0RGVzY3JpcHRvcihkSW5kZXgsIHN0ZDo6bW92ZShkRmllbGRzKSkpOworICAgIHJldHVybiBDMl9PSzsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBGaW5kIG9yIGFkZCBhIGhpZGwgQmFzZUJsb2NrIG9iamVjdCBmcm9tIGEgZ2l2ZW4gQzJIYW5kbGUqIHRvIGEgbGlzdCBhbmQgYW4KKy8vIGFzc29jaWF0ZWQgbWFwLgorLy8gTm90ZTogVGhlIGhhbmRsZSBpcyBub3QgY2xvbmVkLgorU3RhdHVzIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBBTE9HRSgiYWRkQmFzZUJsb2NrIGNhbGxlZCBvbiBhIG51bGwgQzJIYW5kbGUuIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoaGFuZGxlLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisgICAgICAgIGRCYXNlQmxvY2sudHlwZSA9IEJhc2VCbG9jazo6VHlwZTo6TkFUSVZFOworICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuCisgICAgICAgIGRCYXNlQmxvY2submF0aXZlQmxvY2sgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKTsKKworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEJ1ZmZlclBvb2xEYXRhIHRvIGEgbGlzdCBhbmQKKy8vIGFuIGFzc29jaWF0ZWQgbWFwLgorU3RhdHVzIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFicERhdGEpIHsKKyAgICAgICAgQUxPR0UoImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEJ1ZmZlclBvb2xEYXRhLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGJwRGF0YS5nZXQoKSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGJwRGF0YS5nZXQoKSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworICAgICAgICBkQmFzZUJsb2NrLnR5cGUgPSBCYXNlQmxvY2s6OlR5cGU6OlBPT0xFRDsKKworICAgICAgICBpZiAoYnVmZmVyUG9vbFNlbmRlcikgeworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIGJwU3RhdHVzID0gYnVmZmVyUG9vbFNlbmRlci0+c2VuZCgKKyAgICAgICAgICAgICAgICAgICAgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAmZEJhc2VCbG9jay5wb29sZWRCbG9jayk7CisKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZW5kIGJ1ZmZlciB3aXRoIEJ1ZmZlclBvb2wuIEVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihicFN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworU3RhdHVzIGFkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGJsb2NrUG9vbERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFibG9ja1Bvb2xEYXRhKSB7CisgICAgICAgIC8vIE5vIEJ1ZmZlclBvb2xEYXRhID09PiBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgfQorICAgIHN3aXRjaCAoYmxvY2tQb29sRGF0YS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0w6IHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlclBvb2xEYXRhCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlclBvb2xEYXRhIHVuYXZhaWxhYmxlIGluIGEgYmxvY2suIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9hZGRCYXNlQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBicERhdGEsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgICAgICB9CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFOgorICAgICAgICAvLyBEbyB0aGUgc2FtZSB0aGluZyBhcyBhIE5BVElWRSBibG9jay4KKyAgICAgICAgcmV0dXJuIF9hZGRCYXNlQmxvY2soCisgICAgICAgICAgICAgICAgaW5kZXgsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KK30KKworLy8gQzJGZW5jZSAtPiBoaWRsX2hhbmRsZQorLy8gTm90ZTogRmlsZSBkZXNjcmlwdG9ycyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBmaWxlIGRlc2NyaXB0b3IgbXVzdAorLy8gbm90IGJlIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorU3RhdHVzIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZW5jZUZkOworICAgICAgICBkLT5zZXRUbyhoYW5kbGUsIHRydWUgLyogb3ducyAqLyk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBDMkNvbnN0TGluZWFyQmxvY2sgLT4gQmxvY2sKKy8vIE5vdGU6IE5hdGl2ZSBoYW5kbGVzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGhhbmRsZXMgbXVzdCBub3QgYmUKKy8vIGNsb3NlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorU3RhdHVzIG9iamNweShCbG9jayogZCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKHMpOworICAgIFN0YXR1cyBzdGF0dXMgPSBhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPnsgJmRSYW5nZUluZm8gfSk7CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmZW5jZQorICAgIHJldHVybiBvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK1N0YXR1cyBvYmpjcHkoQmxvY2sqIGQsIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKHMpOworICAgIFN0YXR1cyBzdGF0dXMgPSBhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKworICAgIC8vIENyZWF0ZSB0aGUgbWV0YWRhdGEuCisgICAgQzJIaWRsX1JlY3RJbmZvIGRSZWN0SW5mbzsKKyAgICBDMlJlY3Qgc1JlY3QgPSBzLmNyb3AoKTsKKyAgICBkUmVjdEluZm8ubGVmdCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5sZWZ0KTsKKyAgICBkUmVjdEluZm8udG9wID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LnRvcCk7CisgICAgZFJlY3RJbmZvLndpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LndpZHRoKTsKKyAgICBkUmVjdEluZm8uaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNSZWN0LmhlaWdodCk7CisgICAgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPnsgJmRSZWN0SW5mbyB9KTsKKyAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgcmV0dXJuIG9iamNweSgmZC0+ZmVuY2UsIHMuZmVuY2UoKSk7Cit9CisKKy8vIEMyQnVmZmVyRGF0YSAtPiBCdWZmZXIKKy8vIFRoaXMgZnVuY3Rpb24gb25seSBmaWxscyBpbiBkLT5ibG9ja3MuCitTdGF0dXMgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgZC0+YmxvY2tzLnJlc2l6ZSgKKyAgICAgICAgICAgIHMubGluZWFyQmxvY2tzKCkuc2l6ZSgpICsKKyAgICAgICAgICAgIHMuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgQzJDb25zdExpbmVhckJsb2NrJiBsaW5lYXJCbG9jayA6IHMubGluZWFyQmxvY2tzKCkpIHsKKyAgICAgICAgQmxvY2smIGRCbG9jayA9IGQtPmJsb2Nrc1tpKytdOworICAgICAgICBzdGF0dXMgPSBvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KAorICAgICAgICAgICAgICAgICZkQmxvY2ssIGdyYXBoaWNCbG9jaywKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK1N0YXR1cyBvYmpjcHkoQnVmZmVyKiBkLCBjb25zdCBDMkJ1ZmZlciYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmZC0+aW5mbywgcy5pbmZvKCkpOworICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKK30KKworLy8gQzJJbmZvQnVmZmVyIC0+IEluZm9CdWZmZXIKK1N0YXR1cyBvYmpjcHkoSW5mb0J1ZmZlciogZCwgY29uc3QgQzJJbmZvQnVmZmVyJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIC8vIFRPRE86IEMySW5mb0J1ZmZlciBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgKHZvaWQpZDsKKyAgICAodm9pZClzOworICAgICh2b2lkKWJ1ZmZlclBvb2xTZW5kZXI7CisgICAgKHZvaWQpYmFzZUJsb2NrczsKKyAgICAodm9pZCliYXNlQmxvY2tJbmRpY2VzOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIC8qCisgICAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1heSB3b3JrIGluIHRoZSBmdXR1cmUuCisgICAgZC0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCgpKTsKKyAgICBkLT5idWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgcmV0dXJuIG9iamNweSgmZC0+YnVmZmVyLCBzLmRhdGEoKSwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgKi8KK30KKworLy8gQzJGcmFtZURhdGEgLT4gRnJhbWVEYXRhCitTdGF0dXMgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCk7CisKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGQtPmJ1ZmZlcnMucmVzaXplKHMuYnVmZmVycy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIHNCdWZmZXIgOiBzLmJ1ZmZlcnMpIHsKKyAgICAgICAgQnVmZmVyJiBkQnVmZmVyID0gZC0+YnVmZmVyc1tpKytdOworICAgICAgICBpZiAoIXNCdWZmZXIpIHsKKyAgICAgICAgICAgIC8vIEEgbnVsbCAocG9pbnRlciB0bykgQzJCdWZmZXIgY29ycmVzcG9uZHMgdG8gYSBCdWZmZXIgd2l0aCBlbXB0eQorICAgICAgICAgICAgLy8gaW5mbyBhbmQgYmxvY2tzLgorICAgICAgICAgICAgZEJ1ZmZlci5pbmZvLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIGRCdWZmZXIuYmxvY2tzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IGNyZWF0ZVBhcmFtc0Jsb2IoJmQtPmNvbmZpZ1VwZGF0ZSwgcy5jb25maWdVcGRhdGUpOworICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgQUxPR0UoIk51bGwgQzJJbmZvQnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyJ3MgaW1wbGVtZW50YXRpb24KKworRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OkRlZmF1bHRCdWZmZXJQb29sU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsKQorICAgIDogbVJlY2VpdmVyTWFuYWdlcihyZWNlaXZlck1hbmFnZXIpLAorICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCgwKSwKKyAgICAgIG1MYXN0U2VudChzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSksCisgICAgICBtUmVmcmVzaEludGVydmFsKHJlZnJlc2hJbnRlcnZhbCkgeworfQorCit2b2lkIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpzZXRSZWNlaXZlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1SZWNlaXZlck1hbmFnZXIgIT0gcmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIG1SZWNlaXZlck1hbmFnZXIgPSByZWNlaXZlck1hbmFnZXI7CisgICAgfQorICAgIG1SZWZyZXNoSW50ZXJ2YWwgPSByZWZyZXNoSW50ZXJ2YWw7Cit9CisKK1Jlc3VsdFN0YXR1cyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2VuZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpIHsKKyAgICBpZiAoIW1SZWNlaXZlck1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIik7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICBtU2VuZGVyTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICghbVNlbmRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgbG9jYWwgQnVmZmVyUG9vbCBDbGllbnRNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyU2VuZGVyIC0tIHJldHVybmVkIGVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHJzKSk7CisgICAgICAgICAgICByZXR1cm4gcnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJTZW5kZXIgLS0gc3VjY2VlZGVkLiIpOworICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkID0gcmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cG9zdFNlbmQoCisgICAgICAgICAgICBtUmVjZWl2ZXJDb25uZWN0aW9uSWQsIGJwRGF0YSwgJnRyYW5zYWN0aW9uSWQsICZ0aW1lc3RhbXBVcyk7CisgICAgaWYgKHJzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgQUxPR0UoIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAlZC4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocnMpKTsKKyAgICAgICAgcmV0dXJuIHJzOworICAgIH0KKyAgICBpZiAoIWJwTWVzc2FnZSkgeworICAgICAgICBBTE9HRSgiTnVsbCBvdXRwdXQgcGFyYW1ldGVyIGZvciBCdWZmZXJTdGF0dXNNZXNzYWdlLiIpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorU3RhdHVzIG9iamNweSgKKyAgICAgICAgV29ya0J1bmRsZSogZCwKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlcikgeworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworCisgICAgLy8gYmFzZUJsb2NrcyBob2xkcyBhIGxpc3Qgb2YgQmFzZUJsb2NrIG9iamVjdHMgdGhhdCBCbG9ja3MgY2FuIHJlZmVyIHRvLgorICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+IGJhc2VCbG9ja3M7CisKKyAgICAvLyBiYXNlQmxvY2tJbmRpY2VzIG1hcHMgYSByYXcgcG9pbnRlciB0byBuYXRpdmVfaGFuZGxlX3Qgb3IgQnVmZmVyUG9vbERhdGEKKyAgICAvLyBpbnNpZGUgYmFzZUJsb2NrcyB0byB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBpbnRvIGJhc2VCbG9ja3MuIFRoZSBrZXlzCisgICAgLy8gKHBvaW50ZXJzKSBhcmUgdXNlZCB0byBpZGVudGlmeSBibG9ja3MgdGhhdCBoYXZlIHRoZSBzYW1lICJiYXNlIGJsb2NrIiBpbgorICAgIC8vIHMsIGEgbGlzdCBvZiBDMldvcmsgb2JqZWN0cy4gQmVjYXVzZSBiYXNlQmxvY2tzIHdpbGwgYmUgY29waWVkIGludG8gYQorICAgIC8vIGhpZGxfdmVjIGV2ZW50dWFsbHksIHRoZSB2YWx1ZXMgb2YgYmFzZUJsb2NrSW5kaWNlcyBhcmUgemVyby1iYXNlZAorICAgIC8vIGludGVnZXIgaW5kaWNlcyBpbnN0ZWFkIG9mIGxpc3QgaXRlcmF0b3JzLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwb2ludGVycyBjYW4gYmUgcmF3IGJlY2F1c2UgYmFzZUJsb2NrSW5kaWNlcyBoYXMgYSBzaG9ydGVyCisgICAgLy8gbGlmZXNwYW4gdGhhbiBhbGwgb2YgYmFzZSBibG9ja3MuCisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiBiYXNlQmxvY2tJbmRpY2VzOworCisgICAgZC0+d29ya3MucmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgc1dvcmsgOiBzKSB7CisgICAgICAgIFdvcmsgJmRXb3JrID0gZC0+d29ya3NbaSsrXTsKKyAgICAgICAgaWYgKCFzV29yaykgeworICAgICAgICAgICAgQUxPR1coIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkV29yay5pbnB1dCwgc1dvcmstPmlucHV0LAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiV29yayB3aXRoIG5vIHdvcmtsZXRzLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNXb3JrLT53b3JrbGV0cy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIldvcmsgd2l0aCBtdWx0aXBsZSB3b3JrbGV0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgdGhlIGZpcnN0IHdvcmtsZXQgd2lsbCBiZSBtYXJzaGFsbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzV29yay0+d29ya2xldHMuZnJvbnQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJOdWxsIHdvcmtsZXQgZW5jb3VudGVyZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYXJjZWwgdGhlIGZpcnN0IHdvcmtsZXQuCisgICAgICAgICAgICBjb25zdCBDMldvcmtsZXQgJnNXb3JrbGV0ID0gKnNXb3JrLT53b3JrbGV0cy5mcm9udCgpOworICAgICAgICAgICAgV29ya2xldCAmZFdvcmtsZXQgPSBkV29yay53b3JrbGV0OworCisgICAgICAgICAgICBkV29ya2xldC50dW5pbmdzLnJlc2l6ZShzV29ya2xldC50dW5pbmdzLnNpemUoKSk7CisgICAgICAgICAgICBzaXplX3QgaiA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4mIHNUdW5pbmcgOiBzV29ya2xldC50dW5pbmdzKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgICAgICAgICAgICAgICAgICZkV29ya2xldC50dW5pbmdzW2orK10sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVpbnRlcnByZXRfY2FzdDxDMlBhcmFtKj4oc1R1bmluZy5nZXQoKSkgfSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkV29ya2xldC5mYWlsdXJlcy5yZXNpemUoc1dvcmtsZXQuZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICBzV29ya2xldC5mYWlsdXJlcykgeworICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk51bGwgQzJTZXR0aW5nUmVzdWx0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1tqKytdLCAqc0ZhaWx1cmUpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkV29ya2xldC5vdXRwdXQsIHNXb3JrbGV0Lm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZFdvcmsud29ya2xldFByb2Nlc3NlZCA9IHNXb3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA+IDA7CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitjMl9zdGF0dXNfdCBvYmpjcHkoQzJGZW5jZSogZCwgY29uc3QgaGlkbF9oYW5kbGUmIHMpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQuCisgICAgKHZvaWQpczsKKyAgICAqZCA9IEMyRmVuY2UoKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEMyTGluZWFyQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2MyX3N0YXR1c190IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJsb2NrIG1ldGFkYXRhIGZvciBpb24gYmxvY2suIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJsb2NrIG1ldGFkYXRhIGZvciBpb24gYmxvY2s6IHJhbmdlLiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBDMkhpZGxfUmFuZ2VJbmZvICpyYW5nZUluZm8gPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDMkhpZGxfUmFuZ2VJbmZvKj4obWV0YVswXSk7CisKKyAgICAvLyBDcmVhdGUgQzJCdWZmZXIgZnJvbSBDMkxpbmVhckJsb2NrLgorICAgICpidWZmZXIgPSBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIHJhbmdlSW5mby0+b2Zmc2V0LCByYW5nZUluZm8tPmxlbmd0aCwKKyAgICAgICAgICAgIGZlbmNlKSk7CisgICAgaWYgKCEoKmJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgYSBsaW5lYXIgYnVmZmVyLiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEMyR3JhcGhpY0Jsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitjMl9zdGF0dXNfdCBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+KiBidWZmZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JlY3RJbmZvLgorICAgIGlmICgobWV0YS5zaXplKCkgIT0gMSkgfHwgIW1ldGFbMF0pIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYmxvY2sgbWV0YWRhdGEgZm9yIGdyYXBoaWMgYmxvY2suIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SZWN0SW5mbykpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYmxvY2sgbWV0YWRhdGEgZm9yIGdyYXBoaWMgYmxvY2s6IGNyb3AgcmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBhIGdyYXBoaWMgYnVmZmVyLiIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEJ1ZmZlciAtPiBDMkJ1ZmZlcgorLy8gTm90ZTogVGhlIG5hdGl2ZSBoYW5kbGVzIHdpbGwgYmUgY2xvbmVkLgorYzJfc3RhdHVzX3Qgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICpkID0gbnVsbHB0cjsKKworICAgIC8vIEN1cnJlbnRseSwgYSBub24tbnVsbCBDMkJ1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLgorICAgIGlmIChzLmJsb2Nrcy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfSBlbHNlIGlmIChzLmJsb2Nrcy5zaXplKCkgIT0gMSkgeworICAgICAgICBBTE9HRSgiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgQmxvY2sgJnNCbG9jayA9IHMuYmxvY2tzWzBdOworICAgIGlmIChzQmxvY2suaW5kZXggPj0gYmFzZUJsb2Nrcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIkluZGV4IGludG8gYmFzZUJsb2NrcyBpcyBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IEMyQmFzZUJsb2NrICZiYXNlQmxvY2sgPSBiYXNlQmxvY2tzW3NCbG9jay5pbmRleF07CisKKyAgICAvLyBQYXJzZSBtZXRhLgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzQmxvY2tNZXRhOworICAgIHN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmc0Jsb2NrTWV0YSwgc0Jsb2NrLm1ldGEpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYmxvY2sgcGFyYW1zIGJsb2IuIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ29weSBmZW5jZS4KKyAgICBDMkZlbmNlIGRGZW5jZTsKKyAgICBzdGF0dXMgPSBvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKTsKKworICAgIC8vIENvbnN0cnVjdCBhIGJsb2NrLgorICAgIHN3aXRjaCAoYmFzZUJsb2NrLnR5cGUpIHsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpMSU5FQVI6CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBzdGF0dXMgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGQsIGJhc2VCbG9jay5ncmFwaGljLCBzQmxvY2tNZXRhLCBkRmVuY2UpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiSW52YWxpZCBCYXNlQmxvY2sgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIFBhcnNlIGluZm8KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgYnVmZmVyIHBhcmFtcyBibG9iLiIpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiTnVsbCBidWZmZXIgcGFyYW0gZW5jb3VudGVyZWQuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBjMnBhcmFtKAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKnBhcmFtKS5yZWxlYXNlKCkpOworICAgICAgICBpZiAoIWMycGFyYW0pIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJ1ZmZlciBwYXJhbSBpbnNpZGUgYSBibG9iLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoKmQpLT5zZXRJbmZvKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkluZm8+KGMycGFyYW0pKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZCgpLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gRnJhbWVEYXRhIC0+IEMyRnJhbWVEYXRhCitjMl9zdGF0dXNfdCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIGQtPmZsYWdzID0gc3RhdGljX2Nhc3Q8QzJGcmFtZURhdGE6OmZsYWdzX3Q+KHMuZmxhZ3MpOworICAgIG9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKTsKKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkQnVmZmVyLCBzQnVmZmVyLCBiYXNlQmxvY2tzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBkLT5idWZmZXJzLmVtcGxhY2VfYmFjayhkQnVmZmVyKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHN0YXR1cyA9IHBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlIGZyYW1lIGRhdGEgcGFyYW1zLiIpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBlcnJvciB3aGlsZSBwYXJzaW5nIGZyYW1lIGRhdGEgcGFyYW1zLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIEJhc2VCbG9jayAtPiBDMkJhc2VCbG9jaworYzJfc3RhdHVzX3Qgb2JqY3B5KEMyQmFzZUJsb2NrKiBkLCBjb25zdCBCYXNlQmxvY2smIHMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpUeXBlOjpOQVRJVkU6IHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogc0hhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUocy5uYXRpdmVCbG9jayk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk51bGwgbmF0aXZlIGhhbmRsZSBpbiBhIGJsb2NrLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqc0MySGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDMkhhbmRsZSo+KHNIYW5kbGUpOworCisgICAgICAgICAgICBkLT5saW5lYXIgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKHNDMkhhbmRsZSk7CisgICAgICAgICAgICBpZiAoZC0+bGluZWFyKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpMSU5FQVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0UoIlVua25vd24gaGFuZGxlIHR5cGUgaW4gbmF0aXZlIEJhc2VCbG9jay4iKTsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICBjYXNlIEJhc2VCbG9jazo6VHlwZTo6UE9PTEVEOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrOworICAgICAgICAgICAgc3A8Q2xpZW50TWFuYWdlcj4gYnAgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGE7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGU7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBicC0+cmVjZWl2ZSgKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIGJwTWVzc2FnZS5idWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLnRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAmY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJwRGF0YSk7CisgICAgICAgICAgICBpZiAoYnBTdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVjZWl2ZSBidWZmZXIgZnJvbSBidWZmZXJwb29sIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHRTdGF0dXMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJwU3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvQzJTdGF0dXMoYnBTdGF0dXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5saW5lYXIgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGNIYW5kbGUsIGJwRGF0YSk7CisgICAgICAgICAgICBpZiAoZC0+bGluZWFyKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpMSU5FQVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0UoIlVua25vd24gaGFuZGxlIHR5cGUgaW4gcG9vbGVkIEJhc2VCbG9jay4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiQ29ycnVwdGVkIEJhc2VCbG9jayB0eXBlOiAlZCIsIHN0YXRpY19jYXN0PGludD4ocy50eXBlKSk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYzJfc3RhdHVzX3Qgb2JqY3B5KHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGQsIGNvbnN0IFdvcmtCdW5kbGUmIHMpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisKKyAgICAvLyBDb252ZXJ0IEJhc2VCbG9ja3MgdG8gQzJCYXNlQmxvY2tzLgorICAgIHN0ZDo6dmVjdG9yPEMyQmFzZUJsb2NrPiBkQmFzZUJsb2NrcyhzLmJhc2VCbG9ja3Muc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMuYmFzZUJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgZC0+Y2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IFdvcmsmIHNXb3JrIDogcy53b3JrcykgeworICAgICAgICBkLT5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxDMldvcms+KCkpOworICAgICAgICBDMldvcmsmIGRXb3JrID0gKmQtPmJhY2soKTsKKworICAgICAgICAvLyBpbnB1dAorICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgY29uc3RydWN0aW5nIEMyV29yaydzIGlucHV0LiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdvcmtsZXQocykKKyAgICAgICAgZFdvcmsud29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB0dW5uZWxpbmcgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgaWYgKHNXb3JrLndvcmtsZXRQcm9jZXNzZWQpIHsKKyAgICAgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gMTsKKworICAgICAgICAgICAgY29uc3QgV29ya2xldCAmc1dvcmtsZXQgPSBzV29yay53b3JrbGV0OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gdHVuaW5ncworICAgICAgICAgICAgZFdvcmtsZXQtPnR1bmluZ3MuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT50dW5pbmdzLnJlc2VydmUoc1dvcmtsZXQudHVuaW5ncy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBQYXJhbXMmIHNUdW5pbmcgOiBzV29ya2xldC50dW5pbmdzKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGRQYXJhbXM7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZkUGFyYW1zLCBzVHVuaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgQzJUdW5pbmcgaW4gQzJXb3JrbGV0LiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogZFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gZFBhcmFtID0gQzJQYXJhbTo6Q29weSgqcGFyYW0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRQYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk51bGwgQzJUdW5pbmcgZW5jb3VudGVyZWQgd2hpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2luZyBDMldvcmtsZXQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRXb3JrbGV0LT50dW5pbmdzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJUdW5pbmcqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkUGFyYW0ucmVsZWFzZSgpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRGYWlsdXJlLCBzRmFpbHVyZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBDMlNldHRpbmdSZXN1bHQgaW4gQzJXb3JrbGV0LiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkRmFpbHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmRXb3JrbGV0LT5vdXRwdXQsIHNXb3JrbGV0Lm91dHB1dCwgZEJhc2VCbG9ja3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBDMkZyYW1lRGF0YS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8QzJXb3JrbGV0PigpKTsKKyAgICAgICAgICAgIGRXb3JrLndvcmtsZXRzUHJvY2Vzc2VkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3VsdAorICAgICAgICBkV29yay5yZXN1bHQgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc1dvcmsucmVzdWx0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2MyX3N0YXR1c190IHBhcnNlUGFyYW1zQmxvYihzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpIHsKKyAgICAvLyBhc3N1bWluZyBibG9iIGlzIGNvbnN0IGhlcmUKKyAgICBzaXplX3Qgc2l6ZSA9IGJsb2Iuc2l6ZSgpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJsb2IuZGF0YSgpOworICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworCisgICAgZG8geworICAgICAgICBwID0gQzJQYXJhbVV0aWxzOjpQYXJzZUZpcnN0KGRhdGEgKyBpeCwgc2l6ZSAtIGl4KTsKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZW1wbGFjZV9iYWNrKHApOworICAgICAgICAgICAgaXggKz0gcC0+c2l6ZSgpOworICAgICAgICAgICAgaXggPSBhbGlnbihpeCwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChwKTsKKworICAgIHJldHVybiBpeCA9PSBzaXplID8gQzJfT0sgOiBDMl9CQURfVkFMVUU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLyoqCisgKiBDb25jYXRlbmF0ZXMgYSBsaXN0IG9mIEMyUGFyYW1zIGludG8gYSBwYXJhbXMgYmxvYi4KKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgKHRoaXMgb25seSBoYXBwZW5zIGlmIHRoZSBwYXJhbWV0ZXJzIHdlcmUKKyAqICAgICAgICAgbm90IGNvbnN0KQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorU3RhdHVzIF9jcmVhdGVQYXJhbXNCbG9iKGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLCBjb25zdCBUICZwYXJhbXMpIHsKKyAgICAvLyBhc3N1bWluZyB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29uc3QKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZwIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBwLT5zaXplKCk7CisgICAgICAgIHNpemUgPSBhbGlnbihzaXplLCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKHNpemUpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZwIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gTkVWRVIgb3ZlcndyaXRlIGV2ZW4gaWYgcGFyYW0gdmFsdWVzIChlLmcuIHNpemUpIGNoYW5nZWQKKyAgICAgICAgc2l6ZV90IHBhcmFtU2l6ZSA9IHN0ZDo6bWluKHAtPnNpemUoKSwgc2l6ZSAtIGl4KTsKKyAgICAgICAgc3RkOjpjb3B5KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCksCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oJipwKSArIHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAmKCpibG9iKVtpeF0pOworICAgICAgICBpeCArPSBwYXJhbVNpemU7CisgICAgICAgIGl4ID0gYWxpZ24oaXgsIFBBUkFNU19BTElHTk1FTlQpOworICAgIH0KKyAgICBibG9iLT5yZXNpemUoaXgpOworICAgIHJldHVybiBpeCA9PSBzaXplID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Q09SUlVQVEVEOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIHN0ZDo6dmVjdG9yPGNvbnN0IEMyUGFyYW0qPiAtPiBQYXJhbXMKK1N0YXR1cyBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IC0+IFBhcmFtcworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gLT4gUGFyYW1zCitTdGF0dXMgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworU3RhdHVzIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBQYXJhbXMgLT4gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PgorYzJfc3RhdHVzX3QgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBibG9iKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJjb3B5UGFyYW1zRnJvbUJsb2IgLS0gYmxvYiBwYXJzaW5nIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcGFyYW1zLT5yZXNpemUocGFyYW1Qb2ludGVycy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbVBvaW50ZXIgOiBwYXJhbVBvaW50ZXJzKSB7CisgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICBBTE9HRSgiY29weVBhcmFtc0Zyb21CbG9iIC0tIGNvcnJ1cHRlZCBwYXJhbXMgYmxvYi4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10gPSBDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFBhcmFtcyAtPiB1cGRhdGUgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PgorYzJfc3RhdHVzX3QgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBBTE9HRSgidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gY29ycnVwdGVkIGlucHV0IHBhcmFtcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4MnBhcmFtLmZpbmQocGFyYW0tPmluZGV4KCkpID09IGluZGV4MnBhcmFtLmVuZCgpKSB7CisgICAgICAgICAgICBpbmRleDJwYXJhbS5lbXBsYWNlKHBhcmFtLT5pbmRleCgpLCBwYXJhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGJsb2IgcGFyc2luZyBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgQUxPR0UoInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGNvcnJ1cHRlZCBwYXJhbSBpbiBibG9iLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZWNsdHlwZShpbmRleDJwYXJhbSk6Oml0ZXJhdG9yIGkgPSBpbmRleDJwYXJhbS5maW5kKAorICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSk7CisgICAgICAgIGlmIChpID09IGluZGV4MnBhcmFtLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVygidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gdW5zZWVuIHBhcmFtIGluZGV4LiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpLT5zZWNvbmQtPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBtaXNtYXRjaGluZyBzaXplczogIgorICAgICAgICAgICAgICAgICAgICAiJXUgdnMgJXUgKGluZGV4ID0gJXUpLiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihwYXJhbXMuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHBhcmFtUG9pbnRlci0+c2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGktPmZpcnN0KSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgQnVmZmVyUG9vbCBSZXN1bHRTdGF0dXM6ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihycykpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jay4KK3NwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgZm9ybWF0OworICAgIHVpbnQ2NF90IHVzYWdlOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgIGJsb2NrLmhhbmRsZSgpLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwKKyAgICAgICAgICAgICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZicVNsb3QpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPQorICAgICAgICAgICAgVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9CisgICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcihncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdXNhZ2UsIHN0cmlkZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKEMyRnJhbWVEYXRhJiBmcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIgOiBmcmFtZURhdGEuYnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrIDoKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgcHJvY2VzcyhibG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc0lucHV0KSB7CisgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29yay0+aW5wdXQsIHByb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzT3V0cHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29ya2xldC0+b3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRIZ2JwKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9IGlnYnAtPmdldEhhbEludGVyZmFjZSgpOworICAgIHJldHVybiBoZ2JwID8gaGdicCA6CisgICAgICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oaWdicCk7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworc3RhdHVzX3QgYXR0YWNoVG9CdWZmZXJRdWV1ZShjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmICghaWdicCkgeworICAgICAgICBBTE9HVygiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBudWxsIHByb2R1Y2VyLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jayk7CisgICAgZ3JhcGhpY0J1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKworICAgIEFMT0dWKCJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaGluZyBidWZmZXI6ICIKKyAgICAgICAgICAgICJibG9jayBkaW1lbnNpb24gJXV4JXUsICIKKyAgICAgICAgICAgICJncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAldXgldSwgIgorICAgICAgICAgICAgImZvcm1hdCAlI3gsIHVzYWdlICUjbGx4LCBzdHJpZGUgJXUsIGdlbmVyYXRpb24gJXUuIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihibG9jay53aWR0aCgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihibG9jay5oZWlnaHQoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGdyYXBoaWNCdWZmZXItPmdldFBpeGVsRm9ybWF0KCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihncmFwaGljQnVmZmVyLT5nZXRTdHJpZGUoKSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ3JhcGhpY0J1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpKSk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaEJ1ZmZlciBmYWlsZWQuIEVycm9yIGNvZGUgPSAlZCIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HVigiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgcmV0dXJuZWQgc2xvdCAlZCIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KCpicVNsb3QpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgcmV0dXJuIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayksCisgICAgICAgICAgICBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QpOworfQorCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmIChkYXRhICYmIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKGRhdGEpKSB7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcygKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3JFYWNoQmxvY2sod29ya0xpc3QsIHlpZWxkQnVmZmVyUXVldWVCbG9jaywgcHJvY2Vzc0lucHV0LCBwcm9jZXNzT3V0cHV0KTsKK30KKworYm9vbCBob2xkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG9sZEdlbmVyYXRpb247CisgICAgdWludDY0X3Qgb2xkSWQ7CisgICAgaW50MzJfdCBvbGRTbG90OworICAgIC8vIElmIHRoZSBibG9jayBpcyBub3QgYnVmZmVycXVldWUtYmFzZWQsIGRvIG5vdGhpbmcuCisgICAgaWYgKCFfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGRhdGEsICZvbGRHZW5lcmF0aW9uLCAmb2xkSWQsICZvbGRTbG90KSB8fAorICAgICAgICAgICAgKG9sZElkID09IDApKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgYmxvY2sncyBicUlkIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXNpcmVkIGJxSWQsIGp1c3QgaG9sZC4KKyAgICBpZiAoKG9sZElkID09IGJxSWQpICYmIChvbGRHZW5lcmF0aW9uID09IGdlbmVyYXRpb24pKSB7CisgICAgICAgIEFMT0dWKCJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBpbXBvcnQgd2l0aG91dCBhdHRhY2hpbmc6ICIKKyAgICAgICAgICAgICAgICAiYnFJZCAlbGx1LCBicVNsb3QgJWQsIGdlbmVyYXRpb24gJXUuIiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KG9sZElkKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG9sZFNsb3QpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihnZW5lcmF0aW9uKSk7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKGRhdGEsIGdldEhnYnAoaWdicCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGF0dGFjaCB0byB0aGUgZ2l2ZW4gaWdicCwgd2hpY2ggbXVzdCBub3QgYmUgbnVsbC4KKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYnFTbG90OworICAgIHN0YXR1c190IHJlc3VsdCA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssIGlnYnAsIGdlbmVyYXRpb24sICZicVNsb3QpOworCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HRSgiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gZmFpbCB0byBhdHRhY2g6ICIKKyAgICAgICAgICAgICAgICAidGFyZ2V0IGJxSWQgJWxsdSwgZ2VuZXJhdGlvbiAldS4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oYnFJZCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGdlbmVyYXRpb24pKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoImhvbGRCdWZmZXJRdWV1ZUJsb2NrIC0tIGF0dGFjaGVkOiAiCisgICAgICAgICAgICAiYnFJZCAlbGx1LCBicVNsb3QgJWQsIGdlbmVyYXRpb24gJXUuIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZyB1bnNpZ25lZD4oYnFJZCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZ2VuZXJhdGlvbikpOworICAgIF9DMkJsb2NrRmFjdG9yeTo6QXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgZGF0YSwgZ2V0SGdicChpZ2JwKSwgYnFJZCwgYnFTbG90LCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKGhvbGRCdWZmZXJRdWV1ZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgZm9ySW5wdXQsICFmb3JJbnB1dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc3NTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIiwKKyAgICAgICAgLy8ibWVkaWFfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5jcHAiCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTg3ZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDg4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludCBieXRlc0NvdW50OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgdGltZXN0YW1wOworfTsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgQXVkaW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsieGFhYyIsIHhhYWN9LAorICAgICAgICAgICAgeyJtcDMiLCBtcDN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7InZvcmJpcyIsIHZvcmJpc30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsicGNtIiwgcGNtfSwKKyAgICAgICAgICAgIHsiZzcxMS5hbGF3IiwgZzcxMWFsYXd9LAorICAgICAgICAgICAgeyJnNzExLm1sYXciLCBnNzExbWxhd30sCisgICAgICAgICAgICB7ImdzbSIsIGdzbX0sCisgICAgICAgICAgICB7InJhdyIsIHJhd30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmRlY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgb3V0cHV0TWV0YURhdGEgeworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGg7CisgICAgfTsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5nZUxlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyc1swXS0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgICAgICAvL0xpc3Qgb2YgdGltZXN0YW1wIHZhbHVlcyBhbmQgb3V0cHV0IHNpemUgdG8gY2FsY3VsYXRlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1ldGFEYXRhIG1ldGEgPSB7bVRpbWVzdGFtcFVzLCByYW5nZUxlbmd0aH07CisgICAgICAgICAgICAgICAgICAgICAgICBvQnVmZmVyTWV0YURhdGEucHVzaF9iYWNrKG1ldGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgbUNzZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgICAgICAodm9pZCltQ3NkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICB4YWFjLAorICAgICAgICBtcDMsCisgICAgICAgIGFtcm5iLAorICAgICAgICBhbXJ3YiwKKyAgICAgICAgYWFjLAorICAgICAgICB2b3JiaXMsCisgICAgICAgIG9wdXMsCisgICAgICAgIHBjbSwKKyAgICAgICAgZzcxMWFsYXcsCisgICAgICAgIGc3MTFtbGF3LAorICAgICAgICBnc20sCisgICAgICAgIHJhdywKKyAgICAgICAgZmxhYywKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtVGltZXN0YW1wVXNsaXN0OworICAgIDo6YW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT4gb0J1ZmZlck1ldGFEYXRhOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIGF1ZGlvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJhdWRpby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEF1ZGlvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgordm9pZCBzZXR1cENvbmZpZ1BhcmFtKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgYml0U3RyZWFtSW5mb1swXSk7CisgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgYml0U3RyZWFtSW5mb1sxXSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKTsKK30KKworLy8gSW4gZGVjb2RlciBjb21wb25lbnRzLCBvZnRlbiB0aGUgaW5wdXQgcGFyYW1ldGVycyBnZXQgdXBkYXRlZCB1cG9uCisvLyBwYXJzaW5nIHRoZSBoZWFkZXIgb2YgZWxlbWVudGFyeSBzdHJlYW0uIENsaWVudCBuZWVkcyB0byBjb2xsZWN0IHRoaXMKKy8vIGluZm9ybWF0aW9uIGFuZCByZWNvbmZpZ3VyZQordm9pZCBnZXRJbnB1dENoYW5uZWxJbmZvKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKKyAgICAvLyBxdWVyeSBuU2FtcGxlUmF0ZSBhbmQgbkNoYW5uZWxzCisgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzeworICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgIH07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBpblBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9ET05UX0JMT0NLLCAmaW5QYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgaW5QYXJhbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5QYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvbXBOYW1lKSB7CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcm5iOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1yd2I6IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgMTYwMDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6Z3NtOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBpbmZvKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyKiBtVVJMOworICAgICAgICBjb25zdCBjaGFyKiBpbmZvOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnhhYWMsCisgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXAzLAorICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiLAorICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKKyAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKKyAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsCisgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCisgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZvcmJpcywKKyAgICAgICAgICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIiwKKyAgICAgICAgICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsCisgICAgICAgICAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFhbGF3LAorICAgICAgICAiYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdyIsCisgICAgICAgICAiYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8ifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMW1sYXcsCisgICAgICAgICJiYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyIsCisgICAgICAgICAiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmdzbSwKKyAgICAgICAgImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyIsCisgICAgICAgICAiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpyYXcsCisgICAgICAgICJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdyIsCisgICAgICAgICAiYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvIn0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCisgICAgICAgICAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKKyAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8ifSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkwpOworICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mbyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIGNvbmZpZ0NvbXApIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29tcG9uZW50IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgIHVpbnQ2NF90IGV4cFRzOworICAgICAgICB1aW50MzJfdCBzYW1wbGVzUmVjZWl2ZWQgPSAwOworICAgICAgICAvLyBVcGRhdGUgU2FtcGxlUmF0ZSBhbmQgQ2hhbm5lbENvdW50CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICAgICAgaW50IG5TYW1wbGVSYXRlID0gYml0U3RyZWFtSW5mb1swXTsKKyAgICAgICAgaW50IG5DaGFubmVscyA9IGJpdFN0cmVhbUluZm9bMV07CisgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGl0SW4gPSBtVGltZXN0YW1wVXNsaXN0LmJlZ2luKCk7CisgICAgICAgIGFuZHJvaWQ6Okxpc3Q8b3V0cHV0TWV0YURhdGE+OjppdGVyYXRvciBpdE91dCA9IG9CdWZmZXJNZXRhRGF0YS5iZWdpbigpOworICAgICAgICBFWFBFQ1RfRVEoKml0SW4sIGl0T3V0LT50aW1lc3RhbXBVcyk7CisgICAgICAgIGV4cFRzID0gKml0SW47CisgICAgICAgIHdoaWxlIChpdE91dCAhPSBvQnVmZmVyTWV0YURhdGEuZW5kKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBUcywgaXRPdXQtPnRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgIGlmIChleHBUcyAhPSBpdE91dC0+dGltZXN0YW1wVXMpIGJyZWFrOworICAgICAgICAgICAgLy8gYnVmZmVyIHNhbXBsZXMgPSAoKHRvdGFsIGJ5dGVzKSAvIChhYyAqIChiaXRzIHBlciBzYW1wbGUgLyA4KSkKKyAgICAgICAgICAgIHNhbXBsZXNSZWNlaXZlZCArPSAoKGl0T3V0LT5yYW5nZUxlbmd0aCkgLyAobkNoYW5uZWxzICogMikpOworICAgICAgICAgICAgZXhwVHMgPSBzYW1wbGVzUmVjZWl2ZWQgKiAxMDAwMDAwbGwgLyBuU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGl0T3V0Kys7CisgICAgICAgIH0KKyAgICAgICAgaXRJbiA9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCk7CisgICAgICAgIC0taXRJbjsKKyAgICAgICAgRVhQRUNUX0dUKGV4cFRzLCAqaXRJbik7CisgICAgICAgIG9CdWZmZXJNZXRhRGF0YS5jbGVhcigpOworICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmNsZWFyKCk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKworICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAvLyBzaWduYWwgRU9TIGZsYWcgd2l0aCBsYXN0IGZyYW1lCisgICAgc2l6ZV90IGkgPSAtMTsKKyAgICBkbyB7CisgICAgICAgIGkrKzsKKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBpZiAoSW5mb1tpXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpXS5mbGFncyAtIDEpOworCisgICAgfSB3aGlsZSAoIShmbGFncyAmIFNZTkNfRlJBTUUpKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGkgKyAxKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgRVhQRUNUX0dFKG1GcmFtZXNSZWNlaXZlZCwgMVUpOworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAvLyBQcmVwYXJlIEMyV29yaworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAibVdvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmIChtV29ya1F1ZXVlLnNpemUoKSAhPSBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Xb3JrUXVldWUuc2l6ZSgpLCAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgRmx1c2ggY2FsbHMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmcmFtZUlkID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gZmFsc2U7CisgICAgLy8gVGhpcyB0ZXN0IGludHJvZHVjZXMgZW1wdHkgQ1NEIGFmdGVyIGV2ZXJ5IDIwdGggZnJhbWUKKyAgICAvLyBhbmQgZW1wdHkgaW5wdXQgZnJhbWVzIGF0IGFuIGludGVydmFsIG9mIDUgZnJhbWVzLgorICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGZyYW1lSWQgJSA1KSkgeworICAgICAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDIwKSkgZmxhZ3MgPSAzMjsKKyAgICAgICAgICAgIGVsc2UgZmxhZ3MgPSAwOworICAgICAgICAgICAgYnl0ZXNDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICB9CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgIGZyYW1lSWQrKzsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NmVlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBBdWRpbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZW5jb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK3ZvaWQgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIGludDMyX3QgblNhbXBsZVJhdGUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG5TYW1wbGVSYXRlKTsKKyAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG5DaGFubmVscyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKTsKK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIqIG1VUkw7CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLAorICAgICAgICAgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyJ9LAorICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKKyAgICAgICAgICJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6b3B1cywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgaW50MzJfdCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSwgYm9vbCBmbHVzaGVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgZnJhbWVJRCA9IDA7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gc2FtcGxlc1BlckZyYW1lICogbkNoYW5uZWxzICogMjsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPQorICAgICAgICAoaW50KSgoKGZsb2F0KXNhbXBsZXNQZXJGcmFtZSAvIG5TYW1wbGVSYXRlKSAqIDEwMDAwMDApOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKG5GcmFtZXMgPT0gMSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAoZmx1c2hlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU1lOQ19GUkFNRTsKKyAgICAgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvdW50LCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYnl0ZXNDb3VudCwgdmlldy5zaXplKCkpOworCisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBBTE9HVigiRW5jb2RlVGVzdCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMKTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAyOworICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSA0NDEwMDsKKyAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBmbGFjOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugb3B1czoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gOTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1ybmI6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW1yd2I6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSAxNjAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IDEyODsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpOworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IG51bUZyYW1lcykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXUiLCBtRnJhbWVzUmVjZWl2ZWQsIG51bUZyYW1lcyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKChtQ29tcE5hbWUgPT0gZmxhYyB8fCBtQ29tcE5hbWUgPT0gb3B1cyB8fCBtQ29tcE5hbWUgPT0gYWFjKSkgeworICAgICAgICBpZiAoIW1Dc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYnVmZmVyIG1pc3NpbmciKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICBzd2l0Y2ggKG1Db21wTmFtZSkgeworICAgICAgICBjYXNlIGFhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIHNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDMwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IDEyODsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgblNhbXBsZVJhdGUsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvYXVkaW8vbWVkaWFfYzJfYXVkaW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzczY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisKKworI2VuZGlmICAvLyBNRURJQV9DMl9BVURJT19ISURMX1RFU1RfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjQ2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAiVnRzTWVkaWFDMlYxXzBDb21tb25VdGlsIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vUkVBRE1FLm1kIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTY5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwyMiBAQAorIyMgQ29kZWMyIEhhbCBAIDEuMCB0ZXN0cyAjIworLS0tCisjIyMjIG1hc3RlciA6CitGdW5jdGlvbmFsaXR5IG9mIG1hc3RlciBpcyB0byBlbnVtZXJhdGUgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0TWFzdGVyVGVzdCAtSSBzb2Z0d2FyZQorCisjIyMjIGNvbXBvbmVudCA6CitGdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudCBpcyB0byB0ZXN0IGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFjcm9zcyBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLiBGb3IgYSBzdGFuZGFyZCBDMiBjb21wb25lbnQsIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBwYXNzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+CisKKyMjIyMgYXVkaW8gOgorRnVuY3Rpb25hbGl0eSBvZiBhdWRpbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIGF1ZGlvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKKyMjIyMgdmlkZW8gOgorRnVuY3Rpb25hbGl0eSBvZiB2aWRlbyB0ZXN0IGlzIHRvIHZhbGlkYXRlIHZpZGVvIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgQ29kZWMyIGNvbXBvbmVudHMuIFRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZSB0YWtlbiBmcm9tIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCAvc2RjYXJkL21lZGlhCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNDU4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbiIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvLyBUZXN0IHRoZSBjb2RlY3MgZm9yIE51bGxCdWZmZXIsIEVtcHR5IElucHV0IEJ1ZmZlciB3aXRoKG91dCkgZmxhZ3Mgc2V0Cit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJ3b3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSB7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG51bGxwdHIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworfQorCisvLyBXYWl0IGZvciBhbGwgdGhlIGlucHV0cyB0byBiZSBjb25zdW1lZCBieSB0aGUgcGx1Z2luLgordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCit2b2lkIHdvcmtEb25lKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLCBib29sJiBlb3MsIGJvb2wmIGNzZCwKKyAgICB1aW50MzJfdCYgZnJhbWVzUmVjZWl2ZWQpIHsKKyAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUNzZEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgICAgIGNzZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyVmlkZW9TaXplU3RyZWFtSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICB9CisgICAgZnJhbWVzUmVjZWl2ZWQrKzsKKyAgICBlb3MgPSAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBhdXRvIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZChmbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBmbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgQUxPR1YoIldvcmtEb25lOiBmcmFtZUlEIHJlY2VpdmVkICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgeworICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgd29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgIH0KKyAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4ODUzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4ZWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZS5oPgorCisjZGVmaW5lIE1BWF9SRVRSWSAyMAorI2RlZmluZSBUSU1FX09VVCA0MDBtcworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSUyA4CisKKy8qCisgKiBIYW5kbGUgQ2FsbGJhY2sgZnVuY3Rpb25zIG9uV29ya0RvbmUoKSwgb25UcmlwcGVkKCksCisgKiBvbkVycm9yKCksIG9uRGVhdGgoKSwgb25GcmFtZXNSZW5kZXJlZCgpCisgKi8KK3N0cnVjdCBDb2RlY0xpc3RlbmVyIDogcHVibGljIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworICAgcHVibGljOgorICAgIENvZGVjTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBmbiA9CisgICAgICAgICAgICBudWxscHRyKQorICAgICAgICA6IGNhbGxCYWNrKGZuKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zLAorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgQUxPR0QoIm9uV29ya0RvbmUgY2FsbGVkIik7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgICh2b2lkKW51bURpc2NhcmRlZElucHV0QnVmZmVyczsKKyAgICAgICAgaWYgKGNhbGxCYWNrKSBjYWxsQmFjayh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzKQorICAgICAgICBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdHM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HRCgib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpcmVuZGVyZWRGcmFtZXM7CisgICAgfQorICAgIC8vIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICAvLyBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKKy8vIEEgY2xhc3MgZm9yIHRlc3QgZW52aXJvbm1lbnQgc2V0dXAKK2NsYXNzIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdFNlcnZpY2U8SUNvbXBvbmVudFN0b3JlPigpOworICAgIH0KKworICAgIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvc2RjYXJkL21lZGlhLyIpIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChjb25zdCBjaGFyKiBfY29tcG9uZW50KSB7IGNvbXBvbmVudCA9IF9jb21wb25lbnQ7IH0KKworICAgIHZvaWQgc2V0SW5zdGFuY2UoY29uc3QgY2hhciogX2luc3RhbmNlKSB7IGluc3RhbmNlID0gX2luc3RhbmNlOyB9CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyKiBfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldEluc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gaW5zdGFuY2U7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldENvbXBvbmVudCgpIGNvbnN0IHsgcmV0dXJuIGNvbXBvbmVudDsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgICAgICAgICB7Imluc3RhbmNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJ30sCisgICAgICAgICAgICB7ImNvbXBvbmVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQyd9LAorICAgICAgICAgICAgeyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJJOkM6UDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIHNldEluc3RhbmNlKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBzZXRDb21wb25lbnQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgIi1JLCAtLWluc3RhbmNlOiBzb2Z0d2FyZSBmb3IgQzIgY29tcG9uZW50cywgZWxzZSBkZWZhdWx0XG4iCisgICAgICAgICAgICAgICAgICAgICItQywgLS1jb21wb25lbnQ6IEMyIGNvbXBvbmVudCB0byB0ZXN0XG4iCisgICAgICAgICAgICAgICAgICAgICItUCwgLS1yZXM6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIGhpZGxfc3RyaW5nIGluc3RhbmNlOworICAgIGhpZGxfc3RyaW5nIGNvbXBvbmVudDsKKyAgICBoaWRsX3N0cmluZyByZXM7Cit9OworCisvKgorICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKKyAqLwordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcik7CisKK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBNQVhfSU5QVVRfQlVGRkVSUyk7CisKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCk7CisKKyNlbmRpZiAgLy8gTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbXBvbmVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkxM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODAzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9jb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCisvLyBnb29nbGUuY29kZWMyIENvbXBvbmVudCB0ZXN0IHNldHVwCitjbGFzcyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gSWYgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBmYXRhbCBmYWlsdXJlLCBpdCBpcyBwb3NzaWJsZSB0aGF0CisgICAgICAgICAgICAvLyBmcmVlTm9kZSgpIHdpbGwgbm90IGdvIHRocm91Z2guIEluc3RlYWQgb2YgaGFuZ2luZyB0aGUgYXBwLgorICAgICAgICAgICAgLy8gbGV0IGl0IHBhc3MgdGhyb3VnaCBhbmQgcmVwb3J0IGVycm9ycworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG1Fb3M7CisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCisvLyBUZXN0IEVtcHR5IEZsdXNoCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIEVtcHR5Rmx1c2gpIHsKKyAgICBBTE9HVigiRW1wdHkgRmx1c2ggVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgLy8gRW1wdHkgRmx1c2ggc2hvdWxkIG5vdCByZXR1cm4gYW55IHdvcmsKKyAgICBBU1NFUlRfRVEoZmx1c2hlZFdvcmsuc2l6ZSgpLCAwdSk7Cit9CisKKy8vIFRlc3QgUXVldWUgRW1wdHkgV29yaworVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBRdWV1ZUVtcHR5V29yaykgeworICAgIEFMT0dWKCJRdWV1ZSBFbXB0eSBXb3JrIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXVlaW5nIGFuIGVtcHR5IFdvcmtCdW5kbGUKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtMaXN0OworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZ3b3JrTGlzdCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24KK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgQ29uZmlnKSB7CisgICAgQUxPR1YoIkNvbmZpZ3VyYXRpb24gVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb21wb25lbnQgTmFtZSI7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRvdGFsIHBhcmFtcyAtICV6dSIsIHBhcmFtcy5zaXplKCkpOworCisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBBTE9HRCgiUXVlcnlpbmcgaW5kZXggJWQiLCAoaW50KXAtPmluZGV4KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworICAgICAgICBFWFBFQ1RfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KK30KKworLy8gVGVzdCBNdWx0aXBsZSBTdGFydCBTdG9wIFJlc2V0IFRlc3QKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVTdGFydFN0b3BSZXNldCkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBTdGFydCBTdG9wIGFuZCBSZXNldCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFNlY29uZCBzdG9wIHNob3VsZCByZXR1cm4gZXJyb3IKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX05FKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBSZWxlYXNlIEFQSQorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVJlbGVhc2UpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgUmVsZWFzZSBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWVyeSBDb21wb25lbnQgRG9tYWluIFR5cGUKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworCisgICAgLy8gQ29uZmlndXJlIENvbXBvbmVudCBEb21haW4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqIHBvcnRNZWRpYVR5cGUgPQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3BvcnRNZWRpYVR5cGV9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KK30KKworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjx1aW50MzJfdCwgYm9vbD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBpc051bGxCdWZmZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSBBTE9HRCgiVGVzdGluZyBmb3IgbnVsbCBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgZWxzZSBBTE9HRCgiVGVzdGluZyBmb3IgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOworICAgIG1Fb3MgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RJbnB1dEJ1ZmZlcigKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwgZmxhZ3MsIGlzTnVsbEJ1ZmZlcikpOworCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAoZmxhZ3MgPT0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChOb25TdGRJbnB1dHMsIENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcsIGZhbHNlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCB3b3JrLAorLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgc3RhdGVzCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9tYXN0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE2NGQ2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU2NGNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfbWFzdGVyX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgTWFzdGVyIHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMk1hc3RlckhhbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworfTsKKwordm9pZCBkaXNwbGF5Q29tcG9uZW50SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcExpc3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbXBMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBjb21wTGlzdFtpXS5uYW1lIDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmRvbWFpbjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIgfCAiIDw8IGNvbXBMaXN0W2ldLmtpbmQgPDwgIlxuIjsKKyAgICB9Cit9CisKKy8vIExpc3QgQ29tcG9uZW50cworVEVTVF9GKENvZGVjMk1hc3RlckhhbFRlc3QsIExpc3RDb21wb25lbnRzKSB7CisgICAgQUxPR1YoIkxpc3RDb21wb25lbnRzIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29kZWMyQ2xpZW50IE5hbWUiOworCisgICAgLy8gR2V0IExpc3Qgb2YgY29tcG9uZW50cyBmcm9tIEhJREwgQ29kZWMyQ2xpZW50IGluc3RhbmNlCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9CisgICAgICAgIG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisKKyAgICBpZiAobGlzdFRyYWl0cy5zaXplKCkgPT0gMCkKKyAgICAgICAgQUxPR0UoIldhcm5pbmcsIENvbXBvbmVudEluZm8gbGlzdCBlbXB0eSIpOworICAgIGVsc2UgeworICAgICAgICAodm9pZClkaXNwbGF5Q29tcG9uZW50SW5mbzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0VHJhaXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShjb21wb25lbnQsIG51bGxwdHIpIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbGlzdFRyYWl0c1tpXS5uYW1lLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhM2U0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2CkBAIC0wLDAgKzEgQEAKK8rKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS0tPT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PD87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0REQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc8Oz46PTo6Ojg4Ojs7ODg6Ojs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PjtEPD06PDw5ODo5Ojo5Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vLzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra2tvb29nZ2dnZ2dnZ2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vc3Nzc3Nzc3N3c29vb29rU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjM7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2NkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqLh4GCgoKCgoKCgYGBgX+R09PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe6+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTVE1DREREREREQ0NDREM/XdHT09PT09PS0tLS0tLS3+rr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1hRSUlJSUlJSUlISEhIRGDQ09LS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFhYmJiYmJiXoysqampqampqampqamqo2dhYmJiYmJiYmJiYmJiXFRUVFRUVFRUVFRUVVFr0NLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs3MzMzOz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXFxsbGy8zLzMvMzMzMzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy8rKysrKysrKy8vKysvLzdXV1dbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9LUz8/S1NXUz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NDR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbV1tbW1tbW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmszPzs7Ozs7Sq5zP0NO5n9HQnIKEisjPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1tXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9Wyl5i1tpO4ua+i0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3DnaKmq9KRfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COTY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmKrUz8/P0b+YoJuyrciGma3V0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT4/Pjo4RUA/Qjs3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZiq1M/Pz9O0mZaquKTbo5it1dPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+g2KGYrdXVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWodmhmK3V1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PTo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmanaoZiu1s2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpu02qOYr9jCn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tPT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SazNihma3asqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNXUsYTD1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR0tHD1dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f39/g4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxEREREPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FRERFPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QTw7PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29va2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBRD8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW2tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm4uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU0Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6vs7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfnJ2hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLW0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZmamZeXl5eXlpmbmJmZmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW2tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2uq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iZmpucnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2sq6qnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKampaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWlqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnJyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alpKWkpaWmqKinqKelpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmbnKGko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKKioqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fn5+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnZ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5uanJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ycnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5iZnJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52doKGio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+dnZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qbmpuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KTk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cmpubm5uamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pjs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucm5ubnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz1DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnZ+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPj4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7Pzw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8/QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9OTk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPj9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg5ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBvcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFEXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFLzhbbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PS2+heEF7d2NiUFBaR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0tLS5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGC/1qZDe4yAdU9tjnVSZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XUF5lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPD48OTk8QUJFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLOybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkKKXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6OhpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNgHdydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BCPkM9Ozk+OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqidiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoainpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoF2eHl4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs+Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloaSnp6GfnZ6Wk5ygl5mSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ6dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ojw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1XoyMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5M1uTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMzNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCPDg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKKnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJeXnJufnqOcnpaYl5OWnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojs7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbOrqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOMlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmlqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjMysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmlqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvBw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1paWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnZ6WnKOgoaKko6SinpqZm5ubnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VUTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg6PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Odn6JVkxvpMvUxba/v8C/urq9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnJ+eo6CmmXl6eYBzcGZlZ2RrZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8PDxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3aoOQmG+pyMjH0cGvvb24ubu7vri1sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbCnpqWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2joJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs7QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj06OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm2uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1RMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e1uLa2vLu5trS4urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLWzs764ubi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJO9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y2tbfBvbu8wMO7v8K/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBub69xL/Av8LIvcfGxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7nDvr65wL3DxsLKzsfGvbrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gYFRJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC7wru5tLu7w8PBzdDKxL21vLu5v7m6tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6dsLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PD86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9vsC4yL6roaGhprnBycW4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsC7yKy8rbq4n5ORm6O3tLC0tLW8ub65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u667u5SPztzm4tG4mpKGf52tr66zure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7Cms7ma6OPb1dfVz7qJdWpsmKynr7azsrq1u7u7tbi2sLXEsr68vry5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennauivcurqLXKz8/LmXRrbHKgpKqtrqewrK+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiarrNaOEt5qsXKxqKAhZKIiJ6jqaigpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJU0ROQz04ODc1Ojc8PTo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aXjKx9MlJoVnSvtbGejJqiopuWnaOin56koKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45hZGKArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUlYugY16Gh3RajKOZm5idoaSnpp2en6CcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzYFtecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpSPiG6Hur+jY2eTh5SRjp6joqainZ+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fWV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD07Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODU1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko11lfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZaWmYh6pMfW1Z9PbH+JgIOUmpibq6OhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmpePd5/K2rKyZ0Zmenh/g4F7irWvprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZilnaCak3CGvbJTinV5cWVpamVeUGusuqy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR05HQ0dOPT5MPjU8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqaKsoJKCe4iDeoGQpYdzWktfWklAp8G1ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoV1xRRlVIREpQST9GQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg7Ojk7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKSioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamptJF5jIeHlqOkpohibmuRroBMRLfEv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tLu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oj8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKutsqdzdnlubGyChHuFWVZ5jMCnYW7MxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb6+v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaSalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqG3tZmXb2VmXE1Wg4BwkHpob1+0p2yf08/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoaqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdm5SUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2DrJiLmmlXY1hfZHCAbX6Pck9zm5mAxtDRws/T1tjV1dLLyc7Qy8bN0snS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz9DGx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoaNi45iT1xUXGBRZl5YZVpNand5h9XR0MvQzdPX1tPV0M/S09HJ09HH0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHRyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0f3txa2VUR0lRUEdFPUpQXF91W3PV1NDJzszS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19dXGJtcm5tcXFycXdpT36NalFYS1dPS2BAS1tSbWJ20dLOxs3MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzszQxcfBuLm9xMK9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWlucGZ9i3pmZ1tKVl1jPEFWS2Fpd87NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp2g5GSfWhoVFdmUEJFXFZXXXnKxL/Cv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH+SnY5zZVpbU0FCRU9SU1aRwre4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbW1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWtyiaKSf2ZZUVFTTkA7R0xwoLOusrKysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xurawt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhnanWRj4NtX1NYZF1PRERdlZijpq2qqKqnsqy0r7Gnraarsrq5tcK5ubmvqrS5urPBua/Asb28u7W7x7nDtq2qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DAvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcPGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqeId+b2hcY2xpcXOElJePkp2kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Ozu7ezvK+4ubWyu8Gywa+lqaOrsbOzqL2qq6irrK61tKaorqGksKmzpqeorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG16d3FxaHR/f2hrk5qQjYaYm6SgoJ6jo6WlrJ6bmqOlq7Cvtramr6umqbOrs7mwtbWttrmysLq6sbaloKSgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGFgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmaXZ4dG98g3xSZ42VioqAlJmcopmcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqagqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubqwtry7uquzsrmzvbS3srG1tL+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRtenJud35nPWWMkoaKgpGZmqKbl5qhpKCimp2fmZesrKytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezr6mtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnJwa3J7UDlbfY2GjIWMmJaamZKcnaahnJ2lm5qYqaStrqmaoaG2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpacmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsa+wr6+nqKeyrbG0sLu0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbW1lbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncGlubjkuMEyAiY2HipOYlpqRm5qjoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGtq7WeoJ2VlamhopStsbGfoqOenpmbk4ugk5GTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk7Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhra2EuHytMdYSKhYiOmpOakZeboZ6poqGhoaKgmqeoopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in56XmZOKnZGNkpOVkJiYk5yho5ykoaKVoKKkpZujq6WipKqkq62lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9iaWpiPSs9TG6Ah4OHiJKTm5WVmqSkpqSopKekoJajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvo624paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozo6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNuc1NEUFtgfIJ9iYaOkJmYlJmmpKKqqKWtoaWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgamlmbl9uXGp/eIh/ioqQk5GXo5aapaOiqJuklZ2imZCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW8tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEQ/OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSU1BRVFFTVVFOTUtLU1dXVldXV1daXGFlWV9cbF9eeG+DeoSAi4mLlpuKlZefnqCWo5OemZOKhJeZi3OMgn2NlpWFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6io46JmqCho6SborSvrK+tn5imuKalsKGxrpyxu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraehppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlmYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTk9OT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaV2ltZWRFT2mIeY1+hZWQho6Mm5WalJWUkYyUiH6SiF47Vm57ipOJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6QmJqZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVFJibmNFODd5jYmHdYCNhoCFiJaJlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEiomVhJuNgoSSm5aenZSko6ippaWem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4qUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZlxUYGdXWFBKiHyMgGx3f3t3f4eOfo+Zi454g41+c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFMUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iXlxhVWV+jZKJinNgcnlwc3mDi3iAmJJ+boSNenR5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNiIBtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLS4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeomPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXFxbV1Z3l5u7emtvW3NwaHZzgot1eIiDbGmJj3Zyd2hofoFxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRTWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRVlJQmHpXkF9ob112aWd5dIWEcX2DgXFqlo9ycXpoaJyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2RjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhQRl2lqZdmcW5kdWZrfHt/fHZ/goJ2b5yRcXd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKHlZGdpKeer5WltKmtsa7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRntpdHJybXZmcIGBdnh/fnuIenOelnd8hH+DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQEREP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWTkZfd31xf3F0anWIhXV3hIJ6kYN0nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhJGph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhIeRjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZpV1haYX+He4p4fHl9iox5gISMfJWSf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaUExOV1JRSVBKRE5HQ0pEQ0BEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVV9ed2NiZ2yPj4KPiIuDhoiTg42LmYecnI+fpqKhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc6P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFdaYF3bXp1kpCOnJuZkpmQnJCXmqSao6acpainqLOWqr2qtMbItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5p3en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktQT0lKTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeNfXuTjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWl+iXKMgpWbnaq0sJ2npaejpLCnrbKurqq4r7G8m7HDqrjJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZDRkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLjQ+Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd9i5h/pZumoKe3wLylrsCzqK+8r7S6sryyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZN9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NkFCNzY0MC82Q0hDUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09eip2nnqusuKuvuMXEsbfBurCwvrS1vrG8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCilpuikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6NhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfYqDgouEln14enVmUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVRgX0xST0RBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXY+osa+1ssG3s7fFybe5v7q1s7m4tbyyuLDEX3OwpLGanaq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjqLG0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGNfWWNgamdTWGFWUlVJRUVNSkA+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeoGKgpd+dH16bGVwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0ubHBurW1x8i3tLi0t7ixtbOyrbS1mGN0p5ytcF6irJuXoKKbpJ6qpZSfn5CTjpWYmKiepp+empmDpJ2tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeW2BjWmRjUVxgU1FKQ0FFRkU8QEY/QUhCP0M8OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWlfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGDc3yKg4V7iXSBioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVlZVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrPCrbWvt7myr8LEs663r6+5qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE5QQUJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnKPkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHZscHh+cXpteHNtaYFxbWNqbXB4aXd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstamxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PWzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYVRfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp0hoWKd2x3cH1+f6GenqGMjJiTk4uMk4+VhXmFj5CNi4mIkIZ+gntxfoCBh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuBc3JpcHF6eXJ6vsuafYuxhHZyhHZnYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn52fpqSprreppbKhoaygoq2hprGeiKaak5KRiY6NiIGTiGqVooyZhIGGfpGDg5OXrYuVjZSZjoaSkZ6XqLCioaGlpKnJzc/Iw8zR1dLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVltUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCioCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9goh3f3qGkZWAg253cG12f3Z4fHSGfHpth3Z0b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6Swo6OxnqGknJ+on6Kxm4WdkZGSkIqKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIuakquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdTXFhGR0tJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoSJgYd8eIWWlomOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qcqJ6gq5qhmZidpJ2fq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmYaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycrMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaPdYJ0dYF+dICDb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWm493cGVPZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlZmWlaSblp6VnZKRlqKdmKqVkJCJjJGCi4OIiIGFj5GdmpmIhYuBhZd6iImfl5CIjYmLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsTNytHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzk1NTU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn9zfpKekZ6CkHuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSlI2cmZKTj5WMi5Sem5OflJCNjY+Kfo6NjYqDiJKWmZ6eiIuUkZ2RgYp/pZiIhI2BhYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WcoZudlJF/jIiAmIiAnJJviKiFeqGLfJGNg4iEnH2akImMo6OgkKSvoIqQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmZuOlJWQipGThX+Kh5GMiomclpihoYaSnZWfiomIjZuQg4eOf4KHhqSFjJGymJ2SlZehop+ZkpydqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfW2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Sg25td4t4eX56gXyGe3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXc4qyjYSokoSZk4WZjKKVn5iSiJqeo5OpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZiZjo+TkoaTloN+j4uZh42QqpaWoqGImJ6WmoiOh5eXiYSOjIF/h4+liY6TqJqXk5eZoZmfmZOdm6OztaajvMK+yMXFycjJwsvUzc3UqdLR1tXW2NrU0tnOhXWDa2ZhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX2IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6SdmJCol6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko6GgIWGiJGXk4uKk5KGk5eFg5CPm3OQmLKVlqOgh5uak4+KkIqWmoiKlo2GfYyYnoqQkJyamZOZmJ+UoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjWGNZUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6e22Fhnl8hHiAhIF9cHh8fXxvcox5fYF7eIaLiYaEk6i8ramzvbClrrO0qaOisK2KmrWeo7mllayjl6mtuKako5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieo6uSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46VjIqMlpiRm5mzlpSqnYqblJGMkJGLmJqJkZ2PiomVn6GOlY2XmZ2SnJielKGglJydpq6ooqSzuKvCyMS1ur27xsjIwtChxsnNzcTX1tDK1KNzfWxfXVZiU1FIRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoBzh4d8gYl1gYqDfm19fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO3jKiyrq69q5u6o6itubirp6aioaOjqq+ysaudnKOZm5iXnqKlpZKjua6ov7usrbK5paOnfYiGna28sIKLi4qQg4+DkY56gYaQjI2bh4eNloyKlJaTkJmWm6eZsJmQqpyOmo+RjpWQj5WWjpCgkIiVm6OslZaPlJyelKCdm5ifoJSan6inpKKjsLOmwMbDsLC7tsXFw7/Np8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYWQioFufnuBfnF+gXqUepKUlZiQk5aotMbJwMLMwsO5yL26sKu5u5iytrmywK6lwKOrsLy9qq6ro6Oep6yvtbGqm6CqnKKclp+vs6eMo7q6tcG8q6icsqSjqJSEjqrEw6SCi46Gh4SGlZSMeoOMkI6RoIuLk5COh5efl5KYlJaln66ci6mbjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZqkn5qgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmFk4+BcoB7jX93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprLO8vqqwqqSlo6yuta63tqCfrp+mo5ijs7ypnKi8waO2t6+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjZGPnZ+RjpKKjouTopeWmpSToZ2pnpCkmYuOj4+Vloh8jpWSkaKalKCinLamkJ+XpaSjpZ+eppielZebpaOoqKKyrKi7v8OvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFxZXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6QnY2Wjp6SiYp/iJ6ShHeFf5R+f5CIiZCAlqCarqekmMS+yMTIxtLNzs3LvMK4sLq8tL3Lu8PCt7a8rbS/uryur6ihqai2rq+qsrianqyiqKKdq7e3qqWvvsSxvbmzp6q0s62ulpWlramgkY6SscWnlI58kZV9h5GYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi4+Onohaj5aXkpakmWaZpJ+zpZajlausq6icn6aXmZaYlaKkqKaetaupurzCtKa0tcvBuKq2rLO7uK6ouLq8t4RvcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeolYyQg4alkoiBh4KahIOVkJCTjpqhn6++rqHIvsXFyMfOzs/Syr68trG7u7y/z7bEvri5t7OztrO4tKynnKusuaupqK+wmKOupaikpbXAsKustL7DucC4s6e4tLeyr5WkrbCwpYuTlKCNc8GZfJaZhI6WmouwlZmZlJGRmZikopSempWZp5yaoJ+YioyPlZ1fSpacmpSZpZdUlrCfr52fpZWvr62mm6GmlJOZmI6doKahmbSpqrO8u7ursLLHwLilq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUZNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlXPDpCQ0A9UkVXU3RiVkZIqpeZn6GorpiRl4eKp5aOiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjMzse/u7OvurnAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+uLKywrC3vKyjrrWtuqaImpalm3W+n4SYnI6SmJqLrpagm5qWlJmen6idpp+YmamZoKadl4+MkJ2CbXWSopqVnKKfkK6yoquWqquYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOmqKWmnJytqamNZmlkYlRNTkhJT0pWTD1MRE1JSkBDRDxRVTxBQUJFTzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NntmVzw6PS4uU2FMVkh+ZV5IRqyUm6Gfu66YlJ6LkqqbkZKTiKqNh6KejKOtlKOktse9tMG7wsLIycbCzsjCvrqyr7m1wcPKtsaywby1u6ypra2xpKOZqrW7p6qnrKqdqK+opKurvruorb20t77HvLa1uMCwvcCzqrW2rL+mj6KWkKCfu56Jmp+Zlp2dj7aeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqG1r6Wlk7Ksmqutn5+lpKuSlpWghJCen5yVqKShobO0uratqLWysp2do6Wal5WZqqGeeGRgYmBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6SensOsm5ekl5iom5WZmo6qlpWoppWsrZmhq7fFwbu/uMHCwMjEv83HvL66srC4tL/DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2/sLe3x7e0ubi/sb7BtrSytbC+pJajlZKak62fkKGipKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqylnJezp5qwqaCbq5+ijpqWoIWOoZqckqWkmpersbayq6WqraycmKCgko6QlqmflGlmXGNfUUpIS09NSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57FrKCeq52crZ+Rop6WpKCmqquXt7GjqrO2xcK9wLa/wbzJwr/KyLa4trSxtLS3wsa3v7G4tbq2oKetq62fnp+lpMGloaquoKSprbCipqi9taWxvLe2tsSys7e6vrLDwLe4rbS1taOcpJSRk6CsnpihnKioqqKawqyonautmpqdmKWfvaGcpJeqq6uloJiNmp+SnYiOV3+WnqWhoLmrp5OZt6Ofs6KhnLGYoZCblp6Cj6CXl46io5WQpa6yrKmioqWklZWdmIuPkpOkn4ljZ1xlYk5KS0tPRkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1FTUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6foZiew6elorOgm7Gmkqmjn6Oframrnbyxqay1ssjDwcOzwsO9x8S9xcq9sLG2rrG1sL/FtbqxsLq2rZupsKqrnJ6moajBrZytsZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq2qoqWVlJOiq6Cfn5qnqq6vr7uxpZ+pqZiYl5Kho7igoKORrq+rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco7CboJ2wkaGVmZWbgZKilpCOoKCTi6WssKWmop2gnpKSmpOGi5KNnJ+AZGhdaWdLSk1KU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTU1JOE5kXExFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDt2XV4/W1VfZ3JAODxIlndlQTSfpJ6bn8Kno6mxoKO0qZSxqqaipLKsram7s62wtLTHv8TDtb/EvsrFtsHJwrastamxuKzAxLS4r622uqWZq7Ksq5mhp5itu7ScqLCbrJ+utLKoq7qyp7m0t7K5waq3s8O9tMWnvq6tt7WpqKyhlpWRpaOiopeXpK63rbG0tp+eqKSZlJSTo6C2oqSlla2xsaWopKCdmpmZlZeooJ+Zop6vs6KmjZivmqWtmJugp5OekJaam4aXoJSNkJ2ek4uoqauhp6CanpaNj5mQgoaWiZWfemVrXm1rTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2FdQklTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW/paiurqCptamct6+ro6q0trGwuLewt7e4xbzDx728w8LIwbrCxsK7qralrbuuwcO4uKuusryjla6xrrOXpqiRqrqpoaewnaqgr7Szq6q2tay7rLOyuresubDCur6/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6qfmZaSl6aftqikoqKvsLOrsaaqn5ufn5udpZ2hmJ2jtLCcn5GUppuhqpyWpKKYm4yXmpSWl56UiZGbmZSOqainn6ObmZuTh4+Zi32Ml4aPmmxpbmJub1hRUlpUQUNEVUA7OklBNzpYUGReUFdXRVlfXk1MU05eTEo/WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2VAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKGqr6qisLeopLOyq6Gstb2us7m9u723tsHCv8nDucTDwcG5xb7BubC2qKy3sry/v7Wqr7K4n5esramvmKmpjqe7nqWts5+rorGws6yqtbO1vK2vsbWssLWywLrFt6u9r7G3rK2porGlnqWonqOWj5ifsqmyqamymZ2nm5qUjKCmpLSup6KsrK2wp7KqsKmim56oo56UoZmcqLepmJqTkp+an6Kgkq2hm5uIl5qMnpqdlIuPl5eal6alo6CdlpaWk4CQlYR7j5OEjJdnbXJocXNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUhbX15OTVNYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MT1gVl84KUMzWVVcaEs1jHpmTEClmqCkrLWjrKilrq21qK6yuKansLfFt7G3v8HCtrW6xb7LxLnDwbvAusW4wbqztKyqure7u761q6+xt5mZqKysrJ2tq4+rvZ6rr7GjqZ+xrbOvrraxubaqra+yqLawtLq8yrKqtbSxtLCvp6Gzn5qorJ+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy5o5iUkY+ZnaGZmJWuoqCXg5abj56dmZeRipSTnpqloqOhmZaTkpV7jJCFeo2Lg4uTbG55b3Z9YUZgalpJSFpcPXtKR0U2QWNUaVtNXGFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2srejrLO3ybu1u7zAvrW0t8PAzMe8w724v8DAuMC9sr2uqLq6uLfDt6yusrqWl6evraiksqqUr7ukrLKyp6ejsrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp6fp7Gfo5SbmJSxnqebn6mNqaOdnJWXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVj4+MmZ2imJGZqaWimYaUmJGenJiXl4mXkJeaqJ2koJKWkpCVdoSQhnuGg4SMjG5xeHZ8gFxMZWxcS05jXT5ie0dJOEdoV2VbTF5iTVlaV1RYVWpdUFBIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNxakxFRJGYpK2krK2qpaOwsbOptq+1n6u0uci6rsK9w7izsrXCw87EwMK+tb7BwLu/vbTEqau6sbe4wLywrbS0nqGnsa6mprGlnbG1rKmysKuoqbW6rLWytauzrKqrqaypua6ysMe/uKS5r6mtraanrbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoqpygmpuTpLSZj4qOiJGjoZaPlZ+jl5aHkJWVnpuZlpWImJOVmaedoZ+Nk5GOkHd+j4R8fX6HiopydHN/fn1cU2NuX05ZZ1xGRJZbRzpNblhiW05hYk9WV1ZXVFloXlFTTWNbW1VLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoaivpKais7Ows7SvsKCrrb3Mu67BvcextK60wsPRxMW/wrO/wsO8v7i9xaitt6y0ub3AsayzrqKkp66qqKWwo6mwqq2qsa6urKuzu6e2sLKps6mrpqWkrrqsqrHDubSruampqK2pp7GlqaSjramoop6boqyVpJ2XnpmsnaKnqKGspqOtrLexsKCpoqCqrrCsnZ6nqKmao5iZkKGomIeEj4uLn6GQjY+Yn5OSiImTl6GdlpmWh5eTk5elnJ2djJKQjYl/f4iEe3eAh4WHdHRyiXdsX1lgbmNRc3JcSzuEfEY+V3VYYVlPZFxOVlZVV1FcYl9TUE9oWVdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQU5GlZasp6CpsZynqLC1rLe0raqkq6q9ybyxv7nDr7Gts8TDzc7Dv8C0wMPEusG0ycSsr7eus7rAvrSvr6ynqKqxqaeosaWzrKqvra2xrrKts7uluLOsq66nq6CjnrG4q6qturaktbWkqqesrKqtoKinp7Cxo6aloaGslqqhk5ugpp6koqqjrKKeprG2rKyhpaKaqaquqpyhpaSkmaCZlpCYnpSCg5CJhZ2hjYyQjpySlI6Fj5qlm5OSm4yTkpKUo5qcmouPi4t8hoGCgXp1gYOBf3V4iqKGeGpeYG5mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVUtPaVdWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQ0pJRJaQr6Shqq+XqKettaq1sKqkq6qovMHAubq0vLWmsq/EycvRv8G7uL/Aw7rCusLErrK1srS8wb2zsq+trK2ntqqmra+qt62nsLCusau1qra2p7W3q6ykqamcpJ60s6mopLO0n7Wtoaqoqqisp5+rrKm4tampqqmhqaCtm5GqoZ2gpKOmo6qdnKa0rqekqaKjl6Smp6qcoqSjoJqYoJGPj5mOf4iNh4SenomGjIyRkZOPhYmXo5qOjZuRkpCPkqCYmpeNi4R/dIaCf354dYN/e3h+f4ecj3BxZmdxeFxhdIhqT12YVkhteVVlVlNkUE1WVVVRT1hbYlZJUGpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JbDhSRjuVjK+gpKqrmamjra6ytK+ppa+pqLu/vMGysLmtoravyMfH0MC/vbu8w767xMK/v6+ys7K2vrzCsbK0q7SppbWppa2ysreuoqy0sa+xuau4rqmut6yqnqqroKOhtq2poZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqGop56nm5mpsKminquhoZKhoqOnmJmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJKekpOQjZGdlZePi4aHeHSBgHx0d3mAe3V0e2uCh6R2aV5lbIF1Z4iMfFJWb15LeHNUZFNSX01NU1pnTk1XWWVZR1NpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WUQzj42xoKSlqaOkoqyms7KwqKSwp6q4vsG8sam5qqeusMnGx9DDvsC+ub/Avcm8wbixsLWyury5wLO0vKy5rKO0pqarsLW3saWmubSss7uvvKWtrbarrZypr6SfpKyqqJyeqrKks6iaq6eqpKidoqmnqr2qtLCunamkoK6cmrOjlqWcpaSfpZqaqKulnpqooZuRm6CknZmXqaqSmZqSkIuDj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWTo46UkYuRm5OWh4p/gHF6eX18aHZ8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGFQUllMTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07Rl1AKo2RsJien6ikoqGrpLaxsaSpsKatucG9trGkuayoqLDCyMjMwre9v7W4wbnItsK1tbO1sr25ur22r7m2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6upp6Gpm6OooK28p66wrqGqoqSunp6tppifmqGinJ+bmaOqopqaoqSVlpSfoZablqWsjJ+RkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKOLkpGIkJmQlIGJfXlrfXZ4eGJ6enFvcXR4a4J1a4JnY2dibnOObWJqb2BvQFx5bFVeTlFSS0pNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62hr6+orLjDu7SuoLmvq6i0usfKx7+4wb2vtL+3xLfDs7C6sbLAtru+t6q5uL6qpLWnqKmvrLivp5i5u6OtvrS0oK23taemp7CzoJ6lpqegpJmerKeonqCqr6egppaiqJ+xuJ+ksa+gq6GspJymp6iam5yfo5Wcm5qdqaaWm56okZiTmZ2TmZahqpGbio6Qh32Hf4KOfXyhjY2JeoSOhoyOjYaKk5qOiJWfiZGVgoyXjZJ9hXxzcHxxc3RfeHdpbnFxcGuAdGV6bGdlZGJmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXEZPPVJaZ0gqPzBdXDUolZummJuVrJ6doaOgtqqvo7Szqam5xbezrqC3ra2ssLXFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1p6eqr6qxrqSXu7Wjqrq1r56xuK+ppaevsZuhpKCko6CWm6+loZ6iqK+hoKGSo6Sit7ChprGrn6ujrpidqqWon5ibnaSTmZuanaWpmZubpZWUl5WcjpOYoqmikYqLkIZ6hH6Ei3qOl4qOh3uDiYSKjo+GkJOYjI6VmYuPl36Gl4yQeoF7cHJ3bm9zXnd3ZGxsbGtqhW9ncmlqZWldZHOBYFtrdmlaSn9eW1lOT0tISFNWRzM4Xl9sUEVZVlplTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobapraC7t6WsvcW0sK+jtrCsrK60w8O8s766trCzubi6t7qvrsCzs7mvv8C3rL26taWisqmmqLGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CxpJmepKmonKGfkqSgpLippKeup52koaiToKmioaGZm5yfkpmblp+iqpuamKCUkZWXmo2Tk6SppJCJio+GeoR7hIV8nY2Ki4d7goWIiYqRhpeSkouQlJSNjpR6g5eQi3d+fGx0cmxrc2B3dGhoamdncIdoaGhkZmlqYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1FWFVfYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGhbSldHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequramrMPBuLGso7aup62utr+/vLLBtrCtsra2uLa2raq9s66ysby+t6+8u7Gln7WppKSzpqitnZzAqqekr7OprLW7nqmprLClmJ2pnaakkZilrKGYnaSpoZuhm5afnae1prCqrqCgnZ2hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZiLjpibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeHkYSXlI+Oj5GRkYyTeoOVj4Zzfn5meW9qamtldHNrYmdkZHaBY2VmZmVqamNrcltfWV1sY2FOaVhaYFZKR0hLTVNXPjlebGhIRFZUXVtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpW0xaSlZiZkA6M0JoSCU1mqOgj4yroZaWoJaksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7K4s6mrubGvrrO1urWwuL2spp60qZ+gsKKorZuiv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio98gnOBgYqYhYd9iYqGhouNi5OFlZuTko6PkZaOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gmJmZ2pubGdqamluXWxscnBgVGNpY2ZaSUZNTU9YUVBVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Zk6GaqbGvnri/taC0wbu+urGmt7CnraS3uLe2rLuurKqrt6qzt66msrWyrqmwtbWwsrW5pqiftKecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSVmp+bkJukqququ6CnpKCYmpmdoY9ropaZnHCClZmjgHWSqaeelJSekImYmoCWiqKQeYeUjYNtan93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVFVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qsqqO9xa6pt8K3vbytp7ewpKqit7OxsrC5rKmmrLSlr7Sjqbe1tainq7ayrbSts6Gon7KpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dqKmktrCko6KclpiXl6OIoY6Smoagh5KcoH+lf6aqnpKSmpGIhHN4jY6FiKF2iY1pl4lmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcW+IWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU3MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeWg52rnZiYnZ+qqaeqv8Ousbq8t8C/qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyqK2dqaCwp5+jopifoZqtspOjpaW1vaatp6uqrKiloJ+Yn6ajmZiloqOYnKSolpOim5OTo6WmobikpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytaa7kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFzlHOaoaqQV09XYk9WTkZVW1hRUFONXVdbUUFdRFBORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYunk4GnqZ+XnJ2lrLGosMK9srXAtba+waums6ysqKaus6mutrOmp6W0pae3rZyzsbWrpqSnsK2ssKapnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZuamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5eWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tPWGBcV1Y7TotPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTQuLjUzLysvKC4wLjo2LyckMjAzQi8+O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLG3usGmqLCqrqior66jsLqvo6StsqOpt6eesrKwo6Whqayuq6+mpp2ioa+aoZuWlJaam6yklZqhnrOzoqyco62toJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4OgjoOwdnefcWxsbHyLTqRYSGJimX5jaKZfeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSlxlWVxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YtMC45NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCVh7OmpqGvqaiyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns62jqrSjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUmJ2soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mdoqmbppqcm6Khl5ORkpOcg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFRXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCos6ijm5ydqpWYl5WWk5agqZyZlqetsKmjn4+toqiWnZWboKWgmKGgoaCaoaGnmp6hnpSYmqagnKeVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPy8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKksa2jq7ytprSmp7W6vLK6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CSoaeflZOlqrCmopeTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlZuhnZyllZ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmxl7TCrqiyqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKKkmpKQpq2vpqGWmamgoo6QoZmnpJ+VmaSonZyknqycoZyfjJOfmp2hmZmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkheQjI/OKOemZrBq5e0wq6rrKmmtLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi1q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5ien5CMjKmwsKeel5uopqCMkaOXp6qmlJeop56eoKKtpKGeoYyToZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtTPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGcssCvraurp7ept661v7S6r663tqrAtaipoJulo6Gckampp7SisqetqaCXnKefpKu4naKsmpWYjqOilYydoJuYnJ+Rk5SrtrGomZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOQmKKWoJuWnJahk5ypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYerfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYGZnY214b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5qJueo72hl7LDsK2pqqyxprevtsOwuLCtuK6twLCro6Kdo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn5Ckn5KMnKKel52akZWTr7myrJaYpKinlJCWpJyjrJ2Qn6irnpqfqKKzn6OljqehlKKbnZiVo5iPr5+RlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbZ0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZFpUZmBjXmNRZ2dwbHVDTlFMQzpaTT9LMjsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKieoaLApZa1xLSsqqisqqm5rrDFrbOyrbWmtLisqaGhpZ6gnZmTqqOsqqW1p6afm5Wgo52spLyloKmWk5uQoZuSj6GnoZKdl5SYlbK1t62ZnqSkoouSkaWbpKqblaikpZuZoaimp6SqoZKtnpeknpiXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgZqVlGVeYGJwmYhpcot9hpVna39ydHh9f2JceHSBaFBdboN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtYZmNfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2oqylrqentLGsx6uvsqqzor2wsKWfoqedo5uZmaumrqOktKmkm5iVoJqmrai9p6iklJOalZ+ZkpakqaiQnpGQmJ2ws7+sm6eep6KIk5Gpmqejm5qqoKOZmqOnrKOgrKObsZuUp6CXlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNh5iWjoqMmJaHlJWLhJOUkomOk5SZlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWLioFxgnh5dnWJf3yJanOBdIN1ZXZ9d2tvem1fZF1waE1ZWmZqX1dab3ltbWZVT0ZSOU5ZTVJPKCs6S0I2MzU9QEE6OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6Gzo8ChpLKyt6CppbKnpa+0qseqrK+ks6TAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6qo5WRmpeemJKToZ6eoqeTkpqpqLPEsJqrnaufj5aWqJ2qnJyfq5igmpuipK+noqaooK+Yl6edmZmgnp2cr6CcoKWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYGZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GBiWt1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWt7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLShubC/rKuvsrGgqqeyraKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52ZmbClrb6gq6KQkJ2ZmZSRlaGcl6idhJ6srKO0yLSgqqSrl5WXmqadqJqeo6qTnp+doKqvqqakrKOvm5+goJiknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpF/iIJtd4F4f3NueYR0domHjoN8aodZXmx1ZV1ziWlre3BrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2loLq8uq+stLGqpaitrrCmraywu7CopqOsrbCerJafo52imZmmqpyto6WnqLKunpSij6KvpbW4pa2ijo2ZoJmTkpugmZmllnylr6OotcW4paKnr56clJ6inqOboqiokZ6gnaGqsKuspKuhqpunn6efq5agm6Wvo5abqJWfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558lpiJncC9gZadnYycwcF8gnyTjZrDwH5spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUYmdgeGRfZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6iwrq2lsrOuqaSlpa+rnqqYmqKfnJqqpqGdq6KkqKSktKScopKlrau3s6etopGQmJylkpCgoZicn52Ip62lrK7BwLGhqa6plpKenaGZoaKpo5KgoJ2erK+rrqekpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1leod2dmt8h259hZCRfm2DkGBxbHBoYF95ZVxxZ2pkZ2BSVFJXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrpbKqq6qiq6auqZ+mm5mlmJyir5+gn6ino6WgnrCrmp2Vpq2rsKqoq5+UkZqfpJKPn6WXnqejn6+mrbGpwMezqKmxrpaSnZuhl5+oqZ6UoJ+dna2wqayrnKiopaKrkquylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYudfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmWFb2F3bnJviYqSjoNuk5JmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOfnKKOo6KirK62rqixpaippq2qqqeho52ZopWfpaufoaWfqKiinp2wrJealqmnrquopqeel5SZo6GSlKGtm52no6+tpa62q7rOsa2mrquWlZydopierauclqCZnZ+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJCUoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoGWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6prKKnpamqqqikpqCbpJ6dpqeno5yrmaKsoaOfr6GdmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23ybK1qquplpGcnKKYn6WznJmglJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSpqZCSm42AnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ6SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraykopuyuKyqoKWaqKSpq6qnn6ammKqjoK+rnqWgrJqeqaWdp7WeopeTqaq1saybpJyglI+lrJGanKejoaqnrqKmqKqxtcOys6qsqJOJl5ykmqGjrqWXoZWZnKWmrZyxnq6pp5+rorasoLC4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycICaYLx9UlV0jpKjlnt+lJOMdntzh4BxXW1ueHJqgm9bZF9qb2NlXUtNUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SquKquoJugrLKzpZ6glaWtra2qp5ymp5ujqKGzr6Opp7KgmKiklKK1oqKVl6KptLijm6Gco5KPobGZnpynpqGisK6dpqmjtrPFsK2prKmRh5Ccp5yipJyllp6YmZqmpaucsaKvpaaYr6S7raG1taycnLOwtq+wpJWcrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF+n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq29vry5tJ6Wp6SttaGhmJWjp6atq6yZpqOfpqGhtqijqaewo5Sro46lraOdkJmaqrOzpJyjnKiRlJeun6Cep6SdqJ22mqOrpLatxLCpq6mijISOnKKgpqKVmZmcmZuZp6aoma2or6Olm6ymvayUvK+snaGusLepsKSYp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGpwhpldYFuMoG2VkaaZgpWPmo58fISagGtugGN/dG6AemBnZnFvaWhnQ1phWz1LVTNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcG2wLOemqygrbelo46bpKKgsLCrn6Wgnq2Zn7mho6ugr6maraGQq6iklombkK2wrKaepZutl5iPrKGhnaWhmqWdr5miqae3qsGvpaiknouAjZuan6aekpSYmpSbmqalppuqrK2kpJ6pqL6llsGqqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIWmmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ9Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1ia2hybmdmZVBVZFxBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqp+koZ62maG0qKqsnrCtnqucla+noY6Im4+vq6imoaWZrpKYj6iZop2ln5qko6aaoaOqs6q9r6Sonp2OfYublaCgmY+RmZuSmpipoKOaqa6opaWipKi6np/EpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRfta9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxmbWtjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BQ0VHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraalsqadi5ilwKq4sqiiwKeos52fsp26qJ+ur6WmlZSwq5eMgpuRrqWirKCjnKqfl4qjk6eep5yboamkmaCirK6quq2oo5uXknyImZGlm5KOkJeZj5iTqZqhmaqpoaqnoKOqup2ow6KfrKGpsLKoraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqikm5ivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGhtY0tkWEprWjtRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREZIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XLvrern8GtrqSiqa2guqOkrqytpY2WrqmPi4WWlqyepqqgnaSjoJGLpJOnmamal6Sropefp6aosLurrJqbkpJ8hJeNpZiNkZCYlI6YlaiVoJmpo5uwpp2iq7mfr7+no7Gkqq6vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+WhoGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkXRrkXdyjHh4fXpqbWZlcGVVYFlAaltIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xaV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn6C1sZCNrMi+xru6q6Omn52nn7KqpLennam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiaoba7p6qZmpCNfIGVi6CUipWRlpCPlJemkaCbqaCctaOdpqq2p67AraK1pK2trqqnprC2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5GXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoaOkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9dJd0fIyAc3yAam9mX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY1ODk9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQkJ2ktb2wra2jpJt8n6SzpaaxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqpqpjZqpkJ+5tqSlmZyNiHmBk4uak4qUkZOQjZKXo42fn6ien7iif4OutaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKmraqjZZ2fknN5mpdxgZmpmG1/o6iKZZymnZKXmJaMk52Rhp6bkZaEk4iQkJKJhXdqjoZ2hXB6hX9/YGiHipORilp1lJBnaI+Pc3yonJxme5uKhXqZaoaMhHB6gGtxZmB3cGxraVxmZmJjcVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ipq2lkpWrt7Gzp5usqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56Mq5milaehnY6Xkp2Fdq2PiaecqpKZpIqcu7OnoJmYi4h1d5KNlpOJk5GQlIyQlKGPnKGnmZyxlYGMm7Scs4ySjbmln32nonmgrLR/jY2lnoOLhpCxqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qHnIGXp4OCe52zeoqGoZialZiWgpGXl4SbmmN6h5GFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjoeGmmuQjodseXxycWhmeXBqbGtcZWxqZ3VdXklUTFJARTYuW1VVNykhMDk+Pjc0MzQ2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWVFIOUVMOz5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqapppmTr8nAsqKXqKq3n5GFn62cp6KgjpC+npqNn5qgkH2GjpmXh6ucopagoZGNk4qFgJKnjYejnqWVmZ6HoLqxp56bko6FcHaQiZWQipSPj5uLj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIugnaWnkpjCgH+riJihcp6AmqV+l4WVs4GhfaGUoZCYl4GPlJyLmZKMfYWTh46WkoqDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhZqBj5GJjJpxkJWGanl2fHhoaXZxaGhsXmRwbWduWWdHXVFNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYl5qbVxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6ealaCjpaylmKasuaSwgaKpnaaenYqUvJqTjaGSno96hJaWkYermZubmqKFjox3mpyPn5CIn6WcmJqZiKO5raSZnI2MfmJtj4qTkI2QjI2XjJCSoI+UoKCZoad+oaeHrZ2fla2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZduX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm52dGxqcF9rcW5sallpT11YRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eY3ZgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgY2RjYWNqa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6jmZihoqWtrqGesLakqZOioaCnnJqOmbSakIuejJWLdYGUko2Kp5WVmZ6ffpOFhaylh5uQi5qqmZubkommsaehlZqIiYBpboiHi46OiYuNkouQk6OMlJ+fm6Gkf5OBj6Kgk6B2nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZq0l3N9mJ+zdXRcnrKDa2NwdXhyaXBZa210c2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tK2soJqinaSkpq+dnLOvrZSZopuhpZqblZ6rm4uIknmLhXGBlo6KkKCPkpSemH2Rio6ooYeXjoqSpJWdm42Mqailno+Xh4R+anuGfn2PjYKLkJCJj5Shg5een5yfnouJd5yYoYyfcaGKhqmHmqONlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfnNpdKuDn4N0qmiVml2bhXaFnmeqa4C4Zlyob4GcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRb6iaXql/ebxsf6pcjoRdtGhdb3J7eGxqXHFrenpkYGdYYkJRRk83V0RSbzVLW1tfTlpEQDE1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlYl5iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGwrJ6mnJypoJ+vnJ6yqa6fmKWcoaCZl5ago5mGiY1qiYBye5eIi5aWg5GUmZB6i4SVpJyKlY+GjZ+Tnp2JkKmjoJqMkoqAgGmBhnh/lox6iI6OiI+Wm3+Top6foJOYcmifiZ6Oi3CSjICphpedoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXlVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWR2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mysqmao4ycrJydqpWiraWjqZCgn52bmpaYoZ2WiIeJd4aCb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGcho+qnJuVi4uKfINshIVxgaGLeIWNiIeTmZZ8k6OfnaKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkX+jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn2Gm3B7e5hsnH14mHNuqaRnYWZ6coGFbGhmZW93eGlhY1NcZ1JSYkhYSlVhWFRcZmtcZVFFQ0tNSktCS0U4T0BRTlhTWU9TUWBmZWpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiGe3B9hGh9j4OVm4F3kY6PiW9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAboGfhneAkoaImaOXepSiopmfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpOYi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtueHmYapp8dplzUUV9s19qd2x6iGdraGN1dnFvV19UWWlRU2lKV01ZVFZeaWxvVmdXTUtBSk1LSEtPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq+1oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIJphIWRg4yFnY16jYyXp5SEmKqYjJGLgol6gH2LeHCQoYZ5gpWHiZaglX+UpKablZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11b4hiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallrVlFSRlZdTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnYnBnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafjICYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJmbc3WJfpB7ZYOGlIqJlZqCfImImKiSgaOtkYaQi4KKfoCAjnJpj6aEfYeTjYmYoI+Hk6mlnIimeJWbfqWIloqxl52Pgq6WnqR2k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZuffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3irkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66MtnV4vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlcYFtndWVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkZG5zZFJrZ2hvbHJqZmlhX15cYWtibGx6b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqDmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Zk3R0hnKRg25/i5GHhZSPfXyDh5mnj4Cnp4+BjomFlXaCh5JubIupgIOLlI6JnJ+JjJOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJidoIN7fYlrjIVbeXlyenFpbn6SinKAdYGPlJRxh4SDZYx/YIGAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWMp5l9dHuVaomIcIF2fYd3bm5pjXR6fJh4hVxsWHmPaW94c3NweHhwXWyHb2poV1tgV11ma2RXY1VfUmBweXlta3dnamtrd31yc3VzYW92YnR7gnh1eYJ2f4CAgXmLhYN+e25/bGR5bl5WbmdpdWt4amlpZVxgWmNpZWxxdG5aW2JsZGxseW5obG9hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90coRxlYV7fJGLhoaQhXl+gImbpY58qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIyapp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xpXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqWThGWLjYNud4uEcYaPenFoaWZ9hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x+c3x5dWRudWhtfH52enx7eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGptYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4SGioF7gYWNnKGRg6iiiHiOl4mVioucl4SDea2CkZialYqenYiIoKmeoaGjioeTm5yimZWpoKaknpGahZOLeXaMjYOnfn+SkJOUnbKmm5WfkI2xkpeDpIuMlJqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yRiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6jj4KEjIaCjJCMfYeMi5GEem6Fhn56mWtzaWF0i3F+e3d3cHd1gl1eb4dobmFfWl1dU2lxVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBeH99f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZ3JxbVZebHRtaHl6cWdpa2SMh5y4npahoJeUmJmUmKSgnnyAmqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRzipCGkpGLnJF9jXqqhI6TmJePnJaHhpuknqGZnIWCkpqZmI+Zpp+knJuPlX6Oh3R6hY2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2LiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOQg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8e3FweoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJugIJ9b2lsbmheeoBofn13dnd1fHhdYHF+bnVhZFtdX1JnblRmXF5ia2l3e39ybG1ka2pogX9sdIJsbXVwenCGeW6HgHaCgH2FdnGCjYh+e3x8f3yCi2Boe2p1aWmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop6SkZWYipqfn597eZ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaFh32Qg5GdnZOKqZ2BcYuLjJKGoKGJhYx8p5GJkJOYlJaTeIyinp+dlZh+gJCamJKLmqKgopiVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakYmSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKNf4OGh49peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouBlKOSioSPeoaGh4R2g4SJiXxodH6BenxybWxoX35zaX12dnV+c4FrX2F0d3F4ZWRZX19Sa2lWZlpgYWhqd3qCcmdsZGxoZoCBa25+aG9ybH95h3tsjIFzgYF+gnR2go2Gf3x7f4F+f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgY2ji4malnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gcf3CLgZGThaWbiI2Jg6aVhZOMl5iSkneRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4VxiJSAkoJsiYSCgYqFZnZve4WRmIx8kniLh3t/hnt6cH13iIR4go6HiZaflIGCinaIg4OCd3yDiod4Ynp6f3V/eGhtZmJ/amt4dHV3fnJ9ZGRhc251c25hWmFfW21lU2RZYWFpa3Z6h3Jja2NtZmh9gmxpdWlucGmAfYJ6bpCGcn+Dg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXuYnoyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5aZjqWjmYBzh3uTkommj4yOipKgkYSSkJWXkYuBjpeempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaThJV4cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgoqSoY94g4F0iYd9gHR1gomFcWN8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGplamNod4duZ21pa21ogX17eG+QiHOAg4V9dIGGiXuDfXqChH19jnJ5inh4bWyHa2hfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ8gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnpSnnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6Jh4uRm5KOjIxthJCPkYiemaGglpSIlY9shpeCZYSYjpN6iYSQinCWm5Sjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+Gko+TcXWBfIKDiX1mcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLk6aLeoZ7fYqEd35xcIGHhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtRWFllY2dxcoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZvjoV0gYKDfHWCiIZ4hXx4hIV6f4l3fot7e3N4gmprX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoaabhouLgY+ch5OddoKslpOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26KdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlZ6ZopaYeYp/gIyInJ2Kj4aSmJaFiZWakJaLi4uNi5uJjY+CbYmLkJCJnJahm5aThJaGaIKhgWWEm4mQfouDi4F3k5mTn5KRiYiUjH59jpd7kIyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYN6Z3NudYCZjnqHhHmTkHl1h3Nvh3qEiniJhICGjJmhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXFrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJWThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyhHuDooSUg5aUmZ2Tm3mSe4OMkqOZk46JlZmShIeXmoyTioiNjoacg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPj4yLj4x3epGQeo6KjJKWjHyIfIBrdmtva2xte39hen6QmIJ3e4J4g419emh0bHOGlYp9h4V7ko5xeYNvdot5h4t4h3x/iY6cm4N7enaBinx2cGpsgoR7YXlxb21zdFZfcGNyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hoB1dn6MeXuFgXiIg3OGhX+MjIN7epR4ZnFrg2CIfW9va3pgam51f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHNSTYLfyJLWkntwdYV3haKElXiWkpqdkZp8lHOFkJ6hkpOQiZOclIZ/l5aIjI2HkIyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4ehhJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXt/bXxlcm9rbXt6XIF6kZCBe36AgIePe3tpc2pzio6IgIWEfJSKbH5+bX+JfYqGe4N4f4ySmJiJfHV3g494cm1ncYCFbmt1cGprdm5UX3BlcFpgbXN5aGxrY2d5c3FxZGB4YWBWbGBfd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ+i3N/hn97iX9yiYiCkIqHfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e413c3eKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4VwbW9/c2VleXF9bXl9amhrY6Sawdyu8KBybHaFd4alh5NvmJKXopacgpJyhouil4iNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNm5qYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLj4mOi4qEiW17lYF9iIWJkY+GdoV9fmt9ZHh2a295c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYGCf4qVhGuAdW2Gj4COgnyBeH2Nk5CXj3Ryd4eMdXNxZ3V6hGN1bnFja3doU2FyaGxWYG91emFzZGBpf3Fzb1tkc2FiV25bXnlOTU1lZ2Jed3SKblxdZXlfYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol7dIuJiJaGi39+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYeMaXeAinJ/nIaYp5yjkoR9cYyUeHmMnoWGoY2PfJaNgJqIhHtzeHB0anCCbGptfXVfYXl3e3F1e2dgZHzr2rXJw9yHcmx0g3eLnYuPa5qRkZ6WlIKJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYODiY6NgnGGfn9xd2h2c2p1eGxajX2ShIZ+goWChYuDd2Fya4eBjomAfn6Qj3xtgWt3hI2EkIF6gHt9jpCOlIdtcHmMhXRrcWtyeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGFdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5X15kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WCfX+Id3aKho+YgYyCe5N1bHd2eXiTdG54e31YeoZxf29neHeSgmR2hoZwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lnbXh4XGB5e3txcYBpYWdhf9W2j5Gmd25xeH1ylJKOiWybkIqdk4yHe2mHi5iGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDenCHgJWZjpOSgId0goR0gX6IkZuehpWPn36IYn+Th4WJhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46CkIGGf32GgIWJgHBfcW+Ee42KgHt+kId6cINleYGIhYqBeoR8fZGMj5GCbW55i351bW5qbHx/ZGlsa1pud1lTanNpYlFjc3htY2ZeWmuFb3VjXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BbY2x3ZWVdXVpsbWNtanR3h39xcH98fXR4hniFgn2AiHV5iYGSlXyIhnaIgG94eXuDk29ue4F3XoN/dIJtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIuOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB+ZWNnZ1edj19ydJe+xYV4cpaLkYB0mY2HnpSNiXNqiI+VgHuUi4GEm4x8ioZ9fIiMfpKHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloWSjZ2AiGZ9k4KBhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCjIB6g4KEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhomEgXeCen6Uio6LfG1reoh8dnRvaGh+eGVdcmNZcXRUVG9zaWJOaHV5Z2FeXVhwgXB1WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4KDcW9+e390dYN6g4J8goZ2fomBlpB4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfYx2anmZj4CDi4OWmIp5j5ZveXNxbGpkYHR7aV9mcntbYXN9emZwemFlZI6xsndLY1ql29KYc3yTjZJ6gJeNhpqSjYdvbIWSkXl5k4aAhJmKfIeAeXiIioOUf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5OJko+UhYhwepKEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2HhIx9eHmBhXuDa1xvfHJ/hoOIfISHeohxgG1vgoWNgoJxg3d/loqMgnZsbH2EfnZ6ZWhqf3JhWnhcWnJuT1hydGdgS253dWJeXFtZdn90cFhnXmdrcmBvT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/iG9sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fm9yfHuTcG+Bf3hnkYqCoZidkoOGZ4eEcGd6l4p/gIWCmoqCfI2NaXhybGxmX2Fvem5fY3B5XWRsg3pgcHZfZGXV676LMzo+jI+Ac3qHi5GPeIWZjoCUj41/bm2FjIt1fI9/hYKViXyDeG52hoWClXZth4RrdHt1ZXmDhKeMg46LgnxtfnJ0gniEmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3dheYSCcmRxaX9udnJ1g52NgoGHgHR2foBzgXBba3xzd4iBiXqGf3yIeHlwaoaCjoKIcIB3fZOIiX1zbWp1gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXFeXFtaXXaAdmpaYltoZm9kak5YZ1I+X2ZcXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugHt9gX+Ce3aCgoyThXCAi254fYB7e4iTiYBpe35qdHxyhntzd35/jHp4hH58a4uMg5udloyCgG2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGJsdWFocIl6YXNzXmJkm6CQbl02W7C2dWuBi3+UiHeImYh1kIyKd3BthYKGdHmJeIl9k4h6f3NndYd9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8j4pxfH6GfGl+bWuAe3lqeneCh4FyX3eCfnJkcmh2g251fIaWk4J+g4FweHp8dX9tV219dXOJgIV2hnWBiXp3cmyHf45/g3F9e3yQhod5bW1obIKBdG5caGZ1clJcfE9dcl1PXHNwZFZLdHlrWFpZWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin19cH9+fIF/gnt3gICKjIRxe4dvcneDf3uJjY+Ean57bnh5dot3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWKknl+fIKSgIB+i4NwcnBjZl5YZ19wcGBhaHFmam+JdGFzb1thY2p2e3+/nailyrlyh4Z0lX56iZWEdZKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeH+SaHGDdmZ2dWNqfISInoJ/fo6NfHF9coJ3fY+OgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9Z2B3h31ranRofIFqdoGNkpZ/fH9/cn13fHV/YlV1e3Fyh4GBe4Jwhol3d29ugYCLfXx3fHpzjISAdGdwZ2uIgXFvXWhjdG9MZndNX29WVVp0bmJRUHV5Y1NYWF1icoN0XWJcaWVlZGxlUVxxSURlYlxkcl9deGhVV1Z4XltmbmlXbF5hamdlb25pcHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHeDc253goJ+iYuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWHjZF6f4B8ioaEd4+AZ3BuYGVcWGVabnNhYWFxbWxoiW5gc2lYXmNtgHep2qnIh4izc4t6cY93fYmRgnuUi4B1dHV9dn9vcH9uhXSUhnh1bGB5gHiHjWRxgm5ndW1bbX2BkJOAgHiSkXx3emyFc32PioNylYqRj4iGhnt/hm51d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y358aHWHj46XfXaBd3KAe31ugFpWcXxvc4GFfX93a4iGc3hqc36Cgnx5e3d6cYl/enJmcmRsi4Nsc1pqYHZmSW9vTV1jWFdWeW5iUFN1d1pRVlheYXOFcF1hY25lZF5vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn93eH13gYSBfHV9g4iIg29xf3VxdX6FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXFmV1xja398ys6HuqJrbm+MbnOGc36GjIB7koV6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZHmAeGl1eWeCd2h1iIyPln5ziGtwf4B5bn1dV298bHJ9iHqAbW6JgHB2ZnZ+f36AdHpveXKFendwZHFgbYyBa3JXa195XUlwbE5YVl9UVXxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZZHFIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6UinV/e3h+eYOIgHV0f4aFjoNwb3t4d3V6hoWGjIZ6fH91i399hoSEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSi3CFhYJ6g3VjbmpZYFpdXlRoc2VhWWRycmeBcmFrZVdaX2l/eL6ue6C3bmN1iGl2fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV/cJmScH92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNh5eAcYxobHuDdW11YlttempyeYl6gGV0hn1tcGd0fXZ9fnB6anl5f3d2b2RrYGyKfWxtVWpgeFZMbG1QU1BoTll9aGJPVXZsTVFUVV9od4RnXmFxaWdgV2pdXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312dIKIgJWDbnN5e3tzc4WGiIiEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dqdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1aXFtUZXFlX1hjc3VpdnBlZWNXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bXmIfGdsd2ZqZFVXc3COpnyEe3aWj3N7cXp4bHl5j4N1l3yIhoSHhH11cXNtaHVdbWlgbHVkZ2dpem97cllngXZ1aHCAeIJ2YneFi32Wgm+MbG58gXFmc2VganhmcHWIeXxhdIN2aWtwc3lveXhye2V9fX12dW1iZGBshnxsalVpYnJUTGtsUE1PcEhefGZhTlZ1ZUtPU1hibHh/Zl5nc2tlYFdkWGNyXkxMbFhkYlVUVnRXTVl3ZVpfbGFcW2RlX3ZnbWJwanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdnSRgHyBlY6BhYR8foyGen6Adnqjpop5iYaFbHV9fHaEg417b4ZzeoV9goN1b2ppZVZdW1taU2NvZVtZYXR7amhtaGBhWF5aaYBpbG+AaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnhuaW9mZl1VWG9oj6h2gXp8kI14dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNydGpvgX56eGJ3hYV5kYZ0iXNwen9yY3FoW211ZG9xhnp3YXJ/cGdpd3Nxa3d2c3Vignl8dXRvY2JhbHx8a2tVaWJnVExuaVBIU2tGYnlmYk1Ucl5KTlVaZm14e2ZfbnJqZF1WYVZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZmB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4Rxc3R+enZ0hYiQfoF9kWxzlYF8g5+Ff4d9gX+GgoCKe3aEq59/eoiIhWxxgnt2gYCCdW+Ibn2AdIqAanBuZWRYX1paWlVia2dcWl91gmlebWxcYVdbXGuBZXJ0fWprXm14d2l2eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCnbn53gIuNeXBue2V3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX2x1ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB5c3Z+dGFwbFhwcWFub4J6c2NxgGxhbHluaWh5eHNwZIRzeHhzb2NgY2xzfWlrVGheX1VMdWRRSFZiSGN3ZmJMVHFZS01YWWlsd3tlZW5yZ2NaWF5ZeGdVSl1kWGlZWUlXZlBJY3lbXl9tW15dYmRef2lqYG90eW1vbnaDl3lygYB9f4mMhn52doZ4hox9c3V1gnl6eoKMjn1/hYlqdJeBe4udfn6GeoB7fnyGiXNxj62Me3yHj35mcYl7dH59d3Nwhmx8fm2QemNwcGJlXmVWWllXZGZsYF1ddIVoWHBtW15YWlxse2Nxd3ZuY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3VmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpGh4dIKFkHdsbXhmdmx7g3l0h3KBeX15gGlmd21hZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOEk4CJhIl7d3BzfXJheGNZbm5gbm9/enJlcYBkXm11aGNmd3pybG2Bc3F7cXBhXWRsbnxlaVNnWVpVTnpgUktaWUhjdWRhSlVuVUtNWldqbXN7ZGxtdGNhWVpcYnhdVExkXllqVFdIWWFOSGt3WV9hblxcX2JjXIVpaGJueHptb2p2gZB5bYJ+gIGSiISBd3WJdIuGdHJ2doF4fX1+jI+Bf5N+cHiWg32Zk3mAgXd5fn9ziIRzcJmhe3t/iZV5ZXWJenN5d2x1cH9seXxwknNecG9haGJsVFtaV2lkbmZcXHKJZVNybltaWVdgbHZjanVra19bb3VybnV1dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fXCAXGFjXlNaYVxkkp5lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmJbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiICGdnRrcHxsZndXW2lsYW9wfndzZW99W2BvcGJeaXB9a2pyfXBvdmluX1pka2x6YWZTZlVYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhXFpYWm1xWFNRZ1dXalRVRlpdT0lzdllgY25jWWFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG6PhnFudnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBc3+BcIeDdm+il3N7hoyHe2Z3i29ufHBneXJ7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21dVlhVZmlzaGN1ZWVeW3B3b3F2dnpsiH1/fYh3j3NjZGtvYVxubWNzeIdrWlRWYWJ2e3tvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFteV2JkWWJ1ZVVgYW1kYXFdXH5vaGlzcXRxdXdsbYWVg4p9hnJzZ298b3FvUlplaWRvcX50cmJsdVVicWpaXm5ke2RrdHtwcXFobF5YY2lqeF5lU2RVV1FWb1hSV1RQSGVzYGJGWGtPSVhUV25pZXxpbHlrYlddVlx1ZVRTWGlSWmdVVElbWlBOeXdbX2VtaVpiYV9ej25iZ2t5dm5vaXZ2f35sg4B9hph7f4eBin9rk4hyZ3OAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2lUYF9VZ2BtcFxebo5oTWlsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7f3ecenlrYWVsbV5gb2plcXl+Z1pVV19rdnp5boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKfIhucWZwe2xxbGFYX2dmbXF/cnJeaWxTZXBkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT1xPUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVX1VedlxVU2FoT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHFzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPiJGbhIB7jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp8fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fX1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJOTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6PjYyNjY2Oj4+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4V3ZWdmZmZoXENEREREQ0dkaGdnZ2dna29ubW5ucUorLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyOLhodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoKCg3JdX19fX2FSNDU1NTU0OVxgX19fX19lZ2dnZ2dqPBgcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYqKioqKiomFg4ODg4ODhYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5CNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo2NjY2NjY6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYmJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd3eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWHjYmQiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z3e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMiY+Hjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEioyIjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjYuNjI+Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgICAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqLh4eJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Pj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj5CQkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhYWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkVFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BAQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BAQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtAPz08PTw8QD09PDw+Oz08PT5BQEJBQEBAQkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnl7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4+Pj09Nzk/PT0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09Pk5TVVJMQ0BAPz5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFHZmhsaGFfT0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJSVdqamhpaGZnT0RHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NU213cGltb3FlS0pJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1Ucnh4cm5vb2xNR0lHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpISUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNSlt3eoJxbm1tbEtDQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHJydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SkpHW2doamZpc3pxQz07OjxBQUA+PDk5ODw8PDs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVZkamxhZWx4gGU3OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYplYm9wbGhrcW14UTM4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk4NjY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hxdXZwcHVwam5LNDg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAgICAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoh2eHd2eHJtbUo4Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjYJ1eHt4cnFqSEFBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjH94e3p6a1dMSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkRGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ6Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH55endZTlNNS0tJSkpKSUVEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyOiXp6dV1RVE9MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMjI2NhHl6dF5RUE5OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyNdnZ4bVRTUE1MSUdESEtITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5/ZGdtWVhVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VEZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvYWNvZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gYCAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmpZPltbWlVSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9dHNbXl5dVFVTV1dWW1t1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUU9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIqAal1dXltWV1VYVFNYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BOTUtKRUM/QDtQUFpaW1NTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gX1gVVlbVlRXVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6alhbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpwc1pOT1FRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1ZVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFgUEhCRUVERERBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl1cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQz08PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBQTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVFQkJDPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSUNGPzo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn59e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTUtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRUNBOz08PDo9RzY2NzdEbXB0dnl7e318fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3t7fXt8e3l8ent+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFdXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEZDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUlBST1NPT1BMTU9NTE1NTk9OW1dLTVFPR0lIQ0lKTExLRkZGRT9CQz48Qkc/Qj9BZHBzdnp6e3t8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0pGREhIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hJR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pFSUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtMSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRkdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDRUVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0lISU9SUlNOUmZmZnJvc3h2e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NFR0lJR01RSkZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09NT05PT05KSklMUlVVU09XZGBgbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86Pj1AQj5AQURHSkZJRklIRkZHRENCQUFGRkNCQkNERUVHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MT05PT01OT0tLS09VV1ZVU1hfXlxpYW5qbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJra3JNR0dGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtJUU1KS0hISUVGSEhFQ0lKSUtMS1BTTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWNqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERkNERkVGSkVFSUdDR0hGSEdFQ0ZLSkhOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhISElEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tJTUtKS0xITEtMS0pOS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVtdXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QkFGQ0VFRUlGRkVHRkdIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTVBMUFBRVVZXT0tWVVRSU1FSTE9SUlFWWlpdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2Zrb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTVRVVFJRUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ2xvc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRTw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdjaGhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxIS0xLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkI/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpKTlBPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFREVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUUtHS0pKTkpISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjY2dgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXV0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFpQSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlWXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkNHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQEhGS0lLTEpMSkhGRElGREZHRUZKSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdJS0pKSURGS0tLRUZJSk5LTktITE5HR0U+R0dLSUtMSktLSUdESURDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdIRkdISEZHSUdIR0hLSUxEREtLTk1MS0hKSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19jaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0tJSUdESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYWZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0pMS0lKR0VKTlFRTk9PTU5MTUhLQURCQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBgZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUEhLS0tLTk1VTk9KSktHR0tQU1NOUE9OT05OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYF9hYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTR0pPSklPTVJQTE1MTE9SVVJPT0lLTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZlteYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01PU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdsd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVMTUdKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUFRQUFBRS0hneGxjeHJtW0xOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Jydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWFXbkxxcF5GaHlXdlRLaHl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ3VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NcWmRcYW1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWW11cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNTWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFNaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xaWllYV1xaXFtgXl9bXl5hYF9iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WW15qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFpZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltZWlNPU1FWVlZUT1dSUlpSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFlbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVltYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllUV1RXW1paW1lYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXVVSWFdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFphZWJmZmVeYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZVWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VYWFtaX2BcX1lZXFxdXl9cW11ZW2BhXmBkY2RlZWViWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fW1peXV5eYV1bW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFddXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZWZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVNWFdcaGlraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3p6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7enp7fHt7fHx9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPTxL2+v76+wKKKjIyNjY6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OXTzMzMzMzPqo2Pj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDg4KCgoKCgoJ+fH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5eXl5eXl5ent7e3x8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18ent4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXt5e3h8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9enl7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGBfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIioiGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoKBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHN0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcXBxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcm9vbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJwcHBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXBufIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxb3KYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJh4eJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgIGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQioqKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJudnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4OEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgIGBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOPlZiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4eFhoaGh4iRk5GQjpCOkZGMiYiFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIiHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4F/f3+BgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4ODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4OChISFhIODg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoODgYucmqGaioKCgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGJkpCMlqOjj4GCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhYWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgpOUlpiSl56ciYGCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SEi5mUmpmXlpWShISEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhISRlYOJlpiWlZSIhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhZ2TgYGYmZiYlouFhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hYWIoaCbm5+eko2QioeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAiJqgmpqjopuMgYyKiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uUoZeWmZ+fm5iLi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgoODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGVk5CXmJOYmpeNh4eHiIeHiYeHhoiHhomJhIOEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKDg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCRjo+QjpOYmYqDhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoWQjYyPlJeUhICCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp7e4iPjY2Pj4Z/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fH1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4uPjZCGfn5+fn9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf31+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIp/f39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g5CNlYyBgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7h4iUlYSDgYKDgYCCgIKBgYOCg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goeRhIOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp9gYd/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSMgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp6e3+CgIGBg4KAfn1/f3uIkXx8jpaAfX5/goaKhYODhIOCg4yJf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4ODhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4GBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgYCAfX59fn9+i4SBh359fHx/foKCf318fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX59fXx7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn5/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7fHt7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX1+fXx7e3t8e3x8e3p7e3p6ent+fYKGiIeIioqLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCCg4OBgICBgYCBf4CBgoF/f35/fn6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x7fXx7ent7eXp6eXp7fn+Dg4SIiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYCBf3+Af4CBf4CAgYKBgYSDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enp5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgYCAgoSBf36Bf31+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fn6Afn1+foCAfoF+f4B/f3+Af31/f39+f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOEg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX2AgH+BgIGBgICAgYF+foB/gYCAgYGAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgX+Af35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B+fHp7enx7fIKBf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEg4KEg4GDgYCAgX9/f3+AfH19foB9fn9/f399f3x+fn6Bf4F/f35/gH+Bg4KDgH9/gYGBgoGBgYCAgYCAgH+AgYGBgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f31/gHx/f319gYCAfn19f35+goCBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSBhISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fX9/f4GAgX9/fH6AfoCBgoOBgICBg4WCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIWDgoOEhIOCgoKDgYKCgX+BgX2AgH6AfX59fn+AgH9/f39+fH6Af4GAgYB/f31/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf31/gX9/gIKCgIGDgoSFhoSAfn18fXx8e3l2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R1hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoKBgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fX19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHt7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9/f4B/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fX59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4F/f39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgYGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBf4CAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+Bg4J/gIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx9fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGBf4KDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCgoODhIOBgoKDg4ODgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4KCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiISFhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhISGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4aFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIRqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhYSGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6Bf397f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSFeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgX9+fn9/f3p+fXx+fX9/fn2AgYODgIKDgYKEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoaDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4GBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t9fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4SEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fH59fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIh4eGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J+f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhISGhoeGhYSDhYWGhoaGhoWGh4aGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn5+foB+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaFh4WFhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDgoJ9gYGAf4OBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aHh4WEhoWFhoWEh4SEhYSIhoaIhYWEgoWFhoWGhoeEhoaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5/gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhYSFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgISAfIF/fX6Cfn6AfoB+f319fn1+e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeGhISEgoWDg4aCg4WFhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+AhH98gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHt9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaHhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX6BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx7fH5+fX+AfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B+f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4WFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fX+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn1+fX+AgICGg4SFhIWChIKChIKBgIKAfn1+f35/foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeGhYWEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af3+Af4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QUE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGRJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb28vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlJiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3LzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbV1tbW1tbX1tbX2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExCQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ68lYicnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuyrsHJmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquKTWlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+ks5/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uVodCKkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW19fX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmarR26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2rkqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6SdsaSlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNadko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLSD02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEA+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg4OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtxdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dXx2fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU0Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NDczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5urm5uLe3trW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7a1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkJAP0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rrK+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQUE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ2NTczODo6Ojo6PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6enpaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzk5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpOSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTk4OTw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODY2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqGhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc1Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohER/n56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FHg6CdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg6Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIagnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD45Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpMgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX6inp6enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3OTg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU6Aop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BShp6bnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9slqWVn4CJf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xwlIaCTGBwcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41VLzA9d4d3dkFFXmtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVRiUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQVpIO3d5a2dFMDhZbHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSm+heEF7d2RhUFFbR2BuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDA1qZDe4yAdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCvd56jmpRlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6bQoZmxqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPybGbp69rVaqwYlqHpp+loqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26PzbmVkaOXdFRvenNue5Wmqqejn56jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQD9CQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRZn7fApqmdiHdrcW94eHp9ho6SmJyipaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuXiYmIfnhxbmdmbGlrcXJxcXJ0fIypxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUUNpemxvdW5rZWVZV15YXGNpaWhlYGiJtMDAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdHVyrmnnZSGcl5RVEtEW2ZeZGtlYWBoWVRYUlZYWVxYWnSZtrurtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5rXl9lYmBdZGFTVlZVU1RXcpursKqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJhaGNgW2NfV1FOT09Vf7S6rK6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVhSTVR/oqq5tbKsqaOhraqsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdTVXaZtr67vLq8rK2mqbu6ube/s7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05PcKnIyMLExsC8vrSxsLDBvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpMvUxba/v8C/uru9tbOzwL+5v8K5wbe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQmG+pyMjH0cGvvb24ubu7vre0sbq/tLy+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYuJ0cW/v8m/sMG/ure7vrm1uLS4vLW9uLW0r7O8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjbe/u8O1use2tbi6vLi5tqqjmI5/g8m/v7vBvrnGvcK/vMW4t7e0uLa2vLu5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ29qZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHenzL3Ht7m3rba0t7mztbG8ycOVS3rKvr++vby/yMPFxb7HuLaztb24uLi+u7q5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtKREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q90f7rIz8LAuK60tLu9t7mxvcPKj0N0zcPCv769vMfMx8fEx7y0wMHAvbu8wMO6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKacXKr0tHMysS1ur/EyL6+tL/AwHlSbcvGwr7BvL/DzMrHxcbBucK6xb/Av8LIvcfHxsW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvE0MO6vrzEvre8wL/Jz8fIysrCh3Jzo8vMy83KxsLDy87BvLi9urFwY2K7yMTAwL/EwMrJw8PDw7u3tMG5wL3CxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2moZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXp2eJrEx8vIwcPAwMnKwb+7ubGhfXNqrcjFxL/Awb/Lx8PAyMC9rKvAs7u7wb7Ays7KxL21vLu5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN5dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKt+bmhubHKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmZB+gJvKwsO8vb+/w8O+v8i9v6WVw7S2tb2+vs7MzMK4sri4t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM20doCzvba1wqWHaVpdYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuZiJF+wMTDvry/u7u4tsHCtsKggae2qrC+wrrSycjDsbC0tLW8ub66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2d3hucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ5rZWZWWF9JSU1QU2x3haWwt765srWyu7m8trm+tJWcp5ahcK7JxMC9v7mzrrK9u66/n3J6o42TnJ+lw8K/vayqr62yure6vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaMoJlgVENXVkhha1ZPRklgjaCrr7a6tbSyrLy5uLW4wb2LmbKjpnKly8K/ubq1rqWss7CmtKF5hKeXkY+Qjo6ZsLSlqKmuwbWzsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/Y1pBTneAlGtNQVyBsLWztbK0r6y7uri2ub/GdoSqn5tlp7+4tbKxra2fpKennaequsXL08CkkJSXgoOgoKSlvMSsrqewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBToZaSkpYdo2AY0BSormztLKwsa2wubi2u7e6vZCisqykc6uwqautq6OooJ2enZiYzubh4d/VxqeRiXltcZehqcGmqKihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGsqqmur7CtpaaqpKizrq2rqKamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsbuqmZmVaU5AUnhxUElJS2ebgVlFUa27sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5aVm9vPxsbMz8y/m31samV7pcaql6Kin5+loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeYN8dn96Y3htblxRaVVQT0dQTU1DUFJAPjs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi8wqukvmlFUpyCUVdJSV9LU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52ok5mUk66cY3KQtMbHx6t8aWluZpS1i5uen6GcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJuam6SZl5SVmp2gnaeopaCjoqGjn5ygqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfn2AdXZ9bmx7ZGhWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamhqsa/yqFQQXKeeE9uS0tiZXVzX1pecI+xr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlpehSy1IWoizwsGrgHGDiYN4fZSinp+mnp2fo6aonqOmn6qdqq2qrqeosKWjpKanrKahpaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyXm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehn6CloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaPHx49XU0lko1xlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYmZWchFJrf2lglK+unoOBnZ6jmn+qqqWhsKOao6amqqKhqqKppKiyq7Gyq7mopqunq6uorKynoaCjsa6ysbSqsq+jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKKno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVocnV1cWJ2dlhXY2BjZ1lYV2Wsrqyvp5+eoqGXkZScoJyZmJKTn5yho5qempaemZ2WmHxrkKKLXnCZmI+LjZ6jpaent7WwprOsoa2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWoJybmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBg398eHZqd3ZebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1Hl6yqqaWgn5qRkpSYmJaWlYyIi46VnZydnJ6WnZiln5GBgLPKypNig4WGj4iVoKOhrry+uKy0tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG4t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmooJ+fqKilpZ+dqqKinpufqKCkp62ZoKOenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhoV+dnJtaXdtaG5dWFtDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKitqaqmoJ6foaOen56bnZyUk5WVnp6YlIWdmZ+ZqqWNfoGw1NKxdGFze4N4jZaZlaXAwL61ubvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa6joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q9Qz9FPD85Nk5/qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ioamtkH1wpNWUe4dLWnB0cYKDeniTvcjCv8TIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMK9x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyrru3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZlpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqeiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxwYkI9XI6urKGZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpKuuro6FZoOof3x2X2JgZGloY1tSdsDKxMTL0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz7/J0c3HxsnGwr3Ewb+/v7W+s62/wMPEyMXIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ19aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4WepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqK2spd0fXx6en55e5KEZVxQbGlaPG7Oz9DEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKy8LHzMfJyca/w7OzyMXLy8zPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d3amVXWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2OTo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ1jU0xKREM/QlKt0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2EpJmGZXx4d3+Pl5yQaWhmZKildT+k2M/Rws/T1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srO0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2Flc2NdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKjW0lAQURBRlB1sa+mmpSXn5yaoKCem52alYl3aWRhX2BgX15fX11hbHVzcG9ua3BucoSQhl5fXllXcYN9fFxTcVWKt4ljz9XS0MzQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1NbMz8/JzdLMz9HAx8TJx8/O0tHSyMzNwMvNxtTPzc/IxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRkNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCPDo8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWptb3N0hn5PT1JKUW97bH5sU3JakqyCkdDV1NDJz8zS1tLR1s3P1dXRxdHTytDU1dbO09HY19fXzMjOxMrPzcrNwMrBycrOz9DM0M7OzM/QyMzR0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkVNWUU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5tcXFycnZxVE9OTVxhdWZ6hXZZZ4OMdJ7M0tHNxs7MzdTLztLMytbW0MzQ08vM0NLTys7R1dLV1srAysLGzcPJysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/NzczQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR01JUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvb3aPmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltcnFdSkNNTl1bYHFiSF1vZ1aRxs3NxsTGzcrRx8rNzcXQ0s/NzNTKx8rOz8fGztLL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MTFyLvHw8nJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqGpk42Nlo+Fg4ODgX2EhH9zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWl3g2BGREhHQj9NTFFUZ15Ol73HxMDCv8LHycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenudkYqSloZ6gISFf3V4dXJwX1pbXGBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobH5xW01JRzhGP0NTSlRkWJSvv7i4u7m3wMHBw729uLy+uMPJxMbBvMa/t7rDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMeyx8nDzszAxcK/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3eAkouIi4R4f4aGf32De3R0Y1xcXV5fYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt0gW1YS0NOVzk6TUZIW1SVorOws7KysrK6tLuwtq+zrrG6wbvAxLu/urSxur7AuMe4tLy2wcK9uL3GwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8XAxMbGx8zFv8XGu8fLv8/Jx8PFwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQURGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6FiIl6eH6FhnZ3gXxzaF1dXV1eYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhoand7X09RWUU5OEZJREphn5ekp66qqKqnsqy0r7Gnraarsru5tcK5ubmvqrS5u7PBuq/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PCucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXN0svDxcHEz8bNwcLGv8TEw8PKwsnKv8C8wrqztbXDr6qxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdqemxPWltEQDs2Oj1NipqRlJ+kqqGmoamoq6mvoqWeqay0tbC8uK+2rqett7Szu7ezvK+4ubWyu8GywK+lqaOrsbOzqL2qq6irrK61tKaorqGlsKmzp6eorqaot6yxs7e6uruyvL6+vsS/tcHAx8i3vr/Ft8XDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrjBw8K1try2sa+1vK6oq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG13XUxKVlZRUT5Cep2RjoeZnKWgoJ6jo6WlrJ6bmqOkq7Gutramr6umqbOrs7mwtbWttrmysLq6sbaloKWgprGorKm5qqWnp6ins62gp6afnKSlrJ+fp6ShobGtrayytbOzsLW8trvBwLK6vsPBsbm5wrPAvcC1uLu9vrzCx8TDxL+/xKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVma3JXUGBnb2pafI+WjIuClpqcopqcnaGjoaWcmaGanamurLC0oqioqaurpLS4rLavrLK0rrO1r7Cqn56fpKKypKaquK2ipqafqK2qmZ+fnpmdn6WamaOcnJ6wqayoqqusrbCyuK+4ubuwtry7uquzsrmzvbS3srG1tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGRvbGV0fG9KT4KQlIqMhZOam6Obl5mipKCimp2fmZesq6ytsKCkoayqpqG0r7CxrKivsqe6s6a1oKKfnKOiraOiqraqoqOmnqamo5aYnZeZmp2gmpednJ2craGsqKOkpq2rsrOqtbCyq7K5ta+qr7Kys7ezrqmtrrG3sbq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGv8W2wcDHzrfAw72zubmywLaxubutsrWvn5qkqqCUm5B4f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFxdnlgPkxgco2JjoiOmJebmZKdnaahnJ2mm5qYqaStrqmaoaK2qKCfrai1qaanrbCkt7Cjt6CjnJmZqqahmq25r6OhpJyioJ+TlaGUlpabmZiWl5yVn6meqqSinaOqqrCtqLSsqqatsrClq62zsbCwr6+nqKeyrbG0sLy0ureuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczIxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoaqVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJncG90UjEsKT94jo6JjJSYlpqRm5ukoqCkpJ2bnaSdqa2knqChtaagoKKnsqGlp6WvpbGuq7WeoJ2VlamhopStsbGfoqOenpibk4ugk5GTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wiq6ytpqmur6+rqKqqs6amq6+0sa68trGwr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC8sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmaCkjIp0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWhvbkkrHylFb5ONh4qOm5ObkpeboZ6poqGioaGgmqepopicorCpoKCcpKmdp6KerKyqqa2toqGhlZiimpyPq6iwnJ+in5+XmZOKnZGNkpOWkJiYk5yho5yloaKVoKKkpZujq6WipKqkqq2lrbKppqWmprWmqaits7W0ubqvq6yejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvbG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUFhcWltcXFxdXF9ia2pKOy89SVyHjoWJiZOUnJaWm6SkpqSppKekoZajq6KTl6Otp5+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZqcn6Ggm5SQjJmNi5GNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuvpK64paOkoqytqqirr7S3sr21s6uumIV1dGlcWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBQWFlZWVxbWltdXmNwbE1CT3Rsa4SAi4ePkZqZlZqmpKKqqKWtoqWWnKmdk5Oip6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThYiNg4+LkZWRoJ6hpJmWn5WaoaKelJulpaioqKCwsKexvaefo6y0qq6nr7SwubXAsa6wq5F/c3RiV1RVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkRDPkI3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tgaWpmbGR1dmF7fIuBjIuQlJKXo5abpqOiqJuklZ2imJCMnaGZlpaFhJGao4+Vo5yVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GLjYCQi5KSkqGaoKKWlJmYlaKmmo2Zpaeop6GgtLKos7ihnaO2rKqtpLKyprW7tKussaKKenRuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODU4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOsur20uMCvramwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJSUlBRVFFTVVFOTUtLU1dXVldXV1daXGFlWmBbbnhldnKFeoWBjImMl5uKlZegnqCXo5OemZOLhZeZi3OMgn2Nl5WFkpmQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn5zio56kIeTkJCdm5qakpaQno6jo46JmqCho6SborSvrK+toJimuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqamsqemtMG4r7SwycS4ucDOxr6zrbvBrK3EraihppKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFpcaFhaWGlxa2ZGUGmJeo5/hZaRho6Mm5WalZWUkYyUiH6SiF47Vm57i5OJgIyRjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxb4aNfomBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqJ6WrbOipa2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTExGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCnqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVXWWBgVVNkbGNGOTh6joqIdoGNh3+FiJeKlJWJkYWDkoR3h35fSVBtd4qRg32EjIqEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTk1NVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6evrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1VaZl1WYWlaWlFLiH2NgGx3f3t3gIePfpCZi455g419c353cW10cHSNjYB6fomqhHp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVi4iKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaenqSCc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVORklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5iYWBjVmiBjpKJi3Rgcnpwc3qEjHmBmJJ+b4SNenV5bmp9rXx0kIp+eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeW9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7q+uLOsp5uwp6ybj5acpamkoZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXF5gXFl5mZy8e21wXHRxaXZzg4x2eYmDbWqJkHdyd2hpf4FxlpGKgH2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fX57d3B1dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCWgG9qb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJqfpKyvoq2qqLWvrqyzv6u8wr+mopqVpJiejYSLlKGimJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QkZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0pNTk9SVlpRV1VTm3tYkGBqcF53amh5dYaFcn6EgXFqlo9ycXppaZyOTHmEkYiEjWYxdodya319g3RmZXV+hISFgGZpbHVrcIB8aHFxfG6TjY97dH19cXFvdm2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUhPR16mqphncm9ldmdsfXyAfXaAgoJ2b52Scnd+cXOShjVxnKecjaChhKKFdnCGe4Z8c4ytjYmBaGZiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnx0cnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZOHlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhXWDg2yViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSEtMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTVBMN0NNUFFCRnxqdXJybndncIGCd3mAf3uIe3Oel3h8hH6DmIOanGCFqZ6ci4OQjnp2h36JiI5zipePhHtcZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldQVFhbVUdKSkVMRz9GQERDP0FBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKugsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTI3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01OUUtKU1pWT0dgeH9ygHJ0a3aJhnV4hIN6koN1nZaGhIyQk6SMrKlIhqyvroqBgJSKgYqBhZKph4GYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGR22Ad3J5dmhta192fYKIf4eEi3mUnJuJioiRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQT9DQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs7yzl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XX1ZrV1laYoGJfIt5fHp/i4x6gYSMfZaRf52elZKZmaSskpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWKj4eQaWhwhIF0jIaEinKGgneHgHt2hHxtdnVmf5SOhoiIhoeHoKqiloiOl396gYh6eW9na3h+fIB1bGZeWlteal5hZ2BaT0xOV1JRSFBKRE5HQ0pEQ0FEQ0I8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251b2Z3gnp/jH+BkI6KmpqknKGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQTQuLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pOVl9femRjaG2Qj4OQiouEh4iUg46LmYecnI+gp6KhqZKntKGnwcKtx694uZSafI2hnpiEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKCh5KDfX9ramp8goODdWNeZWBbaGxdbWxfV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZwdpGGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYZ4eH9nTVI+Ly8uLC8uLS8wMDAyMTI1Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlFeaoR4b3t2k5KPnpyak5uQnZGYmqSapKecpqmnqLOWqr2qtcfItsjQz76boHBpqqmfhJOShZygmpuZppGRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckZinhpaPjYCIbHNzfYF+c2piXmJgYmhlYGdnXFJFSktPTklJTEZHTUNITUZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuTjo6Kn5KXnZabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHdl5iUDU2MC0xLywuMC8uLy4uMDAxNT5BQU1QUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU5QWWqBinONg5ecn6u1sZ6opqijpLCorbOurqq4r7G8m7HDqrnJy7fDv7elorCzrKyqo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqY+bsIuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYeZiJKJlXl6foaBaWJpXWZjX2RkX2dnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldob1h5hHaBk4WHgpyDkZCMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVNW1BHSEQ8Pj5GSENEQTc7PDVDOz1GS0lGSFFOUFd+jpqAppyooKi4wb2lr8GzqbC9sLW6s7yyv7S5uaK3xKe1yMe1vbi0qKOzrbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqsr7Wisauxtbu2tK20n6anoqaZqK+ssbi3t6eataiLpI2Qkp6GeIKFeFtjZldnY2JkYWFnYVtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYWJXeXRxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeRe3huXVdARE48Njo0NUFCNzY0MC82Q0hDUVtPUVVXVVxXT19VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU09ei56on6ytuaywucbEsrjBu7GxvrS1v7K8rrVzr7KkucSjr8a4sLOxs6ektbaqsKCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH2Dfm1YZWNZbGZrZldcZFlWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6OhICOhW56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgouEln14enVlUFxkR0VMO1FjYVteU0c/O0hQRFpjUVFZWFpnWVNgX0xTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZCqsrC2ssK3tLfFyri5v7q2s7m5tbyyuLDEX3OwpLGanqq8qKSoq6qjorK1oaqon5WWnpigrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGwsXMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhZGRfWWNgamdTWGFWUlVJRUVNSkE+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42FkHNrcnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+dH16a2VwdVleXFBlZGJgZWRdXFhXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhIR0JJOkQ/SEtTVFVcWluQtLu0urHBura1x8i3tLi0t7ixtbOyrbS1l2N0p5ytb16irJuXoKKbpJ6qpZSfn5CTjpWYmKiepqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxuX2JeWmBjWmRkUVxgU1FKQ0FFRkU8QEY+QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRua290dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmampoYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlglrTDrrWuuLmyr8LEs663r6+6qrGwpaq2q4u1p5yapppNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXm5WWh5+ap5usr6mwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpmWlFdWE5QQUJIRUJIO0FDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveHmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscHh+cXpteHNtaYBwbWNqbXB4aHd8fsu+wd+nbWN4bmNbYWBKUFJVTlleT11cTlBOVFBUVFxubXaCcZWstaqxpK2zqKu6vq+ps6Wjt6WqraCrs6KNsK2Zl5iMjpGRhI6bgY2mkZyJg4uEi4mEi4SUlpiXk5uRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRxs3S09PXzNHRxNHWxcDOx8fCqL22zp58cWhgZF9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3ZzbHN9e3d7c4J4cmuAc3JpcHF6eXJ6vsuafYuxhHZyhHZoYWpdQ1pZW1ZlY1hjalNYXF1gY11jd3p9i4GXqKOjn56fpqSprreppbKhoa2goq2hprGeiKaak5KRiY6NiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSZjoaTkZ6XqLCioaGlpKnJzc/Iw8zR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3I19fRyqvCwsuNdXFlYmFaVlpUXVFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhyeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZWAg253cG12f3Z4fXSFfHpth3Z1b312hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25obYCCh5GKnJ2fnJCWl52io6SwoqOxnqGknJ+on6Kxm4WdkZGRj4qKioaDj4N+nJuLjYKEhXmUf4KplaONkoqXkox+mIubkquzmJucqJynvsPGubfHztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFhGR0tJRUU9Ojc6QEBCOkdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtvfHBweoBxe4Bxg4eBbo56dXd8fIJ1fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXmLho2TkZqVn5SGi5Kan5qdqJ6gq5uhmZidpJ2eq5mKmYuPkY2Ee4eHg4SLjZ+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamuvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTKlnx+a2tdXFFVVGFKQ0ZKSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goGBhH6De3yEmI2Hi32Fh4B3gnlve3uGgXR5kp6OoHaOdYJ0dYF+dICEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuYGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeQgomOlpmWlaSbl56VnZKRlqKdmaqVkJCJjJGCi4OIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGpsaGJWWVdYTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1JVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe35/foB8hHp9gZGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfnmKim6CmoB0mYZ9gYmFfH6Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJOflJCNjY+Kfo6NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLeYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUU9JRExCPDw+OTk6Ojk5Ozw2Pz0+PD05OTs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ5c22AfoR+d4WboZudlJJ/jIiAmIiAnJJuiKiFeqGLfJGNg4iEnH2akImMo6OgkKSvn4qQi4WLgZKGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyOlJaQipGThX+Kh5GMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGymJ2SlJehop+ZkpydqLO5raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWFlDQElDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX56gX2Ge3t3hoR/c3CFgnp1dnZ0hIKEfn+SpqOfpaKWip2QlZeLiqeXcoqyjYSokoSZk4WZjKKVn5eSiZueo5OqsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCxkWSkzciVjoaHiI+SjIyRk4iEiYiFlZmajo+TkoaTloN+j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztaajvMK+x8XFycjJwsvUzc3UqdLR1tXW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBg352doCCe2xuin55fHd4fISGi36Lo7SopKuzoZanoKaklpWvooOQuJWRs5qMoaCMpJuvo6WdmJCnl6mZrrCkl5SVlJCLmJqWoMCOo8m4q5qjpa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKXk4uKk5KGk5eFg5CPm3OQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Unpuhsa6jpLi/tMTHxL3Dw7/HzsvJ0qfPzNPS0NbY0s/YvHV9emBjV2NYUklLT0ZCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxLPD47PEJBNzU8OzUyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxdWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox5fYF7eIaLiYaEkqi8ramzvbClrrO0qaOisK2KmrWeo7mllaykl6mtuKalo5+ZqZiqpLCxqpmYnJSVkZegl5q7u63KoWm2uKqwlZieoquSl72jXqmygomJjJSGkHyOjXyDhY2Pk5OIhpKVi46UjIqMlpiRm5m0lpSqnYublJGNkJKLmJqJkZ2Pi4qWn6KNlY2YmZ2SnJielKGglJydpq6noqSzuKvCyMS1ur28xsjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBNz84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBnSGFgYnBKQIuJfoByh4d8gYl1goqDf219fHx+cHeHd42Bh3uNj4yGjJqrw8Cwvca8s7TBvbStrLO2jKiyra69q5u7o6itubirp6aioaOjqq+ysaqdnKOYm5iXnqKmpZKjua+ov7ysrbK5paOnfYiGna28sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCem5ifoJSan6inpKKjsLOmwMbDsLC7tsXEw77Mp8fDx8O81tDMxMqKd3ZlX11iXk9MQ0xARUc/QT5CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk0+R0BDTkNBPUM8Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaUZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlZiQk5WotMbJwMLMwsO5yL26sKu5u5eytrmywK6lwKSrsLy9qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqrEw6SCi46Gh4SGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjZaPkZGUlY2QlJGOoZOGl5+fs5+Um5SfoZmkn5qgm6CUmJ+mpKWnpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCaF1NZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nusC9vMS4rMGprbO8vqqxqqSlo6yutK63taCfrp+mopijtLypnKi8waO2tq+rk7CsqqyXhpqqp6WQgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYuPj4+Vloh8jpWSkaKalKCinLamkJ+XpKSjpZ+eppielZebpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73BuazCwsG/mnF8ZFtaXl1MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDRUU6RUxCPDdFVj08PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxKX1hhWmRlWJ6PnY6Wjp6SiYp/iZ+ShHiFf5R+f5CIiZCAlqCarqekmMO+yMTIxtLNzs3LvMK4sLq9tL3Lu8TCtra8rbS/uryur6ihqKi2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tl5WlramgkY6SscWnlI58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKjI+Pnohaj5aXkpakmWaZo56zpZajlqutq6ecn6aXmZaYlaGkqKaetaupurzCtKa0tcvBuKq1rLO7uK6ouLq8t4RwcV1bV1hQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyVoZeoloyQg4alkoiBh4Kag4OVkJCTjpqhn6++rqHHvsXFyMfOzs7Syr67trG7u7y/z7bEvre5t7OytbO4tKynnKusuaupqLCwmKOupaikpbTAsKustL7CucC5s6e4tLeyr5WkrbCwpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YioyPlZ1fSpacmpSZpJdUlrCfr52fpZWvsK2lm6GllJOZmI6dn6ahmbSpqrO8u7ursLLHwLimq6utsbGjobKytKVzcmhfXVFTTUZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RkE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiRl4eKp5aNiJKEn4eEnZeOnaCao6W1ybWpx7zDxMnLycjNzce/u7OvurjAws21yLvBuba6sq+vtLWnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaImpalm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJ2CbXWSopqVnKKfkK6yoquWqqqYq6+lpaGlqpKSmZyJlZyinpawpqmqura+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTkhJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FMVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvrqyr7m1wMLKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvbuorL20t77HvLa1uMCwvcCzqrW3rL+mj6KWkKCfu56JmqCYlp2djraeqJukopqboJmnpLGgmp2lnKepnJeTjpSbipaIjKShlJyinqC1sKSlk7Krmqutn5+lpKqSlpWghJCen5yVqaWhobO0uratqLWysp6co6Wal5WZqqGeeGRgYWBMSUdITlFJTUVGRkJRSkhAREdBVlNESDxBR1ExOkI3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5WZmo6qlpWoppWsrZmiq7fFwry/uMHCwMjEv83GvL65srC5tL/CyLbAsLy3urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0ubi/sL7Bt7WytbC+pJajlZKak62fkKGipKKinpC9pKidqKucnKCapZ+8opejnqGoqqCclIyUnZOdho6EjZOepKCdtqymnJezp5qwqKCcq5+ijZqWoIWOoZqckqWlmpersbayqqWqraycmKCgko6QlqmflGlmXGNfUUpIS09MR0VESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvU0Y8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa5tbSxtLS3wsa3v7G4tbq1oKesq6yenp+lpMGloKquoKSprbCipqi9taWxvLe2tsOys7e6vrLDwLe4rrS1taOcpJSRk6CsnpihnKioqqKawayonautmpqdmKWfvaGcpJeqqquloJiNmp+SnYiNV3+WnqWhoLmqp5OZt6Ofs6KhnLCYoY+blZ6Cj6CXl46io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYk5KS0tORkVBR0s+PUlBOjhKSk5dUVFJPUxWXDlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gmkqmjn6Oeramrnbuxqay1scjEwcOzwsO9x8S9xcq9sLG2rrG1r7/Ftbqxsbq2rJupsKqqm5+moafBrZussZypoq6xqqSovbemtru9r7fErbO0wr+yxrO6t6u1tq6roqWVlZOiq6Cen5qnqq6ur7uxpZ+oqZmYl5Kio7egoaORra6rpKWdkaCdlJ2OkIyUnZqin6i1p6eNmbWco6+bn5ywkaGVmZWbgJKilpCOoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjk5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0E3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7s62wtbTHv8TDtb/EvsrFtsHJwrWstamwuay/xLS4r622uqaZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyp7m0uLK5waq3s8O9tMWnvq6tt7WpqKyhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKCdmpmalZeooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZm4aXoJSNkJ2ek4upqauhp6CanpaNj5mQgoaWiZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFdLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqV0RXRox5ZkM7pKScoKW+paiurqCptaqdt6+ro6q0trGwuLewt7i4xb3Dx728w8LIwbrCxsK6qralrbutwcO4uKqtsryjla6wrrOXpqiRqrqqoKawnaqgr7Szqqq2tay7rLOyuresubDCur2/psOqsLevqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaaqn5ufn5qdpZ2hmJ2jtLCcn5GUppuhqZyWo6KYmoyXmpSWl56UiZGbmZSOqamnn6OcmZuTh4+Zi36Ml4WPm2xpbmJub1hRUVpUQUNEVUA7OklBNzpYUGReUVdXRVlfXk1MU09eTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9REZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWlcVjuJe2NDPaifnKGpvKCqr6qisLeopLOyq6Gttb2vs7m9u723t8HCv8nDucTDwcC5xb7BuLC2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1vK2wsbWssLWywLrFtqu9r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7KqsKmim56no56VoZmcqLapmJqSkp+ZnqGgkq2hm5qIl5qMnpqdlIuPl5eal6amo6CelpaWk4CQlYR7j5ODjJdnbXJocXNfR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbX15OTVNYY0pLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcaEs1jHpmTEClmZ+krLWjrKikrq21qK6zuKansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyqure7ur61q6+xt5iYqKyrrJyuq4+rvZ2rrrGjqZ+xrbOurrWxubaqra+yqLawtLq8ybKqtbSxtLCvp6Gzn5qoq5+klZWambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5idraebl56amqy4opiTkY+YnKGZmJWuoZ+Xg5Wajp6dmpeRipSTnpqlo6OhmZaTkpV7jJCFe42Lg4uTbG55b3Z9YUZgalpJSFpbPXtKR0U2QWNUaVtNXWFLXF1bUlJTYmFMS0VgYWBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKiwqayko66ttai2s7ejrLO3ybu1u7u/vrW0t8PAzMe8w723v7/BuMC9sr2uqLq6uLfCt6yusbqWl6euramksqmUr7ukrLKypqeisrSxsrG1sLezqa6ssqe4r7a0w8W2qbW1q7Ctqqejtp+fp7Cfo5SbmJSxnqebn6mNqaKdm5WXpaWkt6eisbOrp7Cnra+0rKSYoKyonJydnJWquZyVjo+MmJ2imJGZqKShmYaUmJGenJiXl4mXkJebqJ2loZKWkpCVdoSQhnuGgoSNjW5xeHZ8gFxMZWxcS09kXT9ie0dJOEdoV2VcTF5iTVlaV1RYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpaKwsbKpt6+1n6u0uci5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLywrLS0nqGnsa+mp7GlnbG1rKqysKuoqLW6rLWytauzrKqrqaypua6ysci/uKS5sKmtraaorbGlpKOuo6icnZuarpmjoqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inaOoqpygmpuTpLWaj4mOiJGjoZaPlp+jl5aHkZWVnpuZl5WImJOVmaedoaCNk5GOkHd+j4R9fH2HiopydHN/fn1cU2NuXk5aZ11GRJZbRzpNblhhW01hYk5WV1ZXVVloXlFTTWNbW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZTs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoaivpKajs7Ows7SwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6yzub3AsayyraKkp66rqKWwo6qwqq6qsa6urKuzu6e3sLGosqqrpaWjr7qsqrHCubSsuampqK2pp7GlqaSiramoop6boqyVpZ2XnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mapJiZkKGomIaEj4uKn6GQjY+YnpKSiImSlqGdlpmWh5eTk5elnZ2djJKQjYl/f4iEfHd/h4WGdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPZFxOVlZVV1FcYl9TUE5oWVhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgyPV5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1ramkq6q9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaeosaWzraqvra2wrrKts7ult7OsrK6oq5+jnrG3q6qturaktbWkqqerrKqtoKimprCxo6eloaGrlqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlpCYnZOBgpCJhZ2gjYuQjpyRk42Fj5qlm5OSm4yTkpGUo5qcmouPi4t8hoKCgXp1gYOBfnV4iqKGeGpdX25mV2WHZE5AZ5JMRGJ6V2JYUmZVTVZWVlRPXF1hVktPaVhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwuMiwmMDdYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Xqaittaq1saqkq6qpvMHAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsq+trK2nt6qmra+qt66nsK+usaq1qra2p7S3q6ykqaqcpJ60s6iopLO0n7Wtoaqoq6irp5+rrKi4tamqqamiqJ+tm5GqoZ2gpKKmoqqdnKa0rqelqaKjl6Smp6qcoqSjoJqYn5GPj5mNf4eMh4SenomGjIyRkZOPhYiXo5qOjpuSkpCPkqCYmZeNi4R/dIaCf354dYN/e3h+f4edj3BxZmZwd1xhdIhqT12YVkhteVVkVlJjUE1WVFVRT1hbYlVJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyLzIyJS8zUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+ppK+pqLu/vMGysLmtoravyMfI0MC/vbq8w767xMK/v6+ys7K1vbzBsrK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhtq2poZ+usqC0qp+op6qiqqGhrK2ova6rrq2hp6efrJmPsKKYoqCop56nm5mpsKiin6uioZKhoqKnmZmppZiYmZ2Pi4eViH2OhoSFpJeGg4SNiJGQkoaHlqGXiJGekpOQjZGdlZiPi4aGeHSBf3x0d3mAe3V0e2uDh6R2aV5la4B1Z4iMfFJWb15LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKOlqqOjoqyms7KxqKSwp6q4vsG9sam6qqeusMnGyNDDvr+9ub/Avcm8wbixsLWyury5v7O0vKy5rKO0pqarsbW3saWmubSss7yvvKWtrbWrrZypr6SfpKyqqJydqrKjs6iaq6eppKidoqmnqb2qtLCunamkoK6cmrOilqScpaSfpZqaqKqlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V+j4J/iJ+Ph4F/jYiTkZGGg5WblIWToo6UkYuRm5OWh4p/gHF6eX17Z3Z8enVxcn5qhnmFiGRfZ2NyhXttaHldXlVBV3ttVGJQUllLTE5wdF1JWltoWkZWZlBDPkpPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJien6ikoaGrpLaxsaSpsKatucG9t7GkuayoqK/DycjMwre9v7W4wbrItsK1tLK1sr25ur22rrm2v6yis6aqqq60trOom7m7qLC+srqgrrS2qaufrbCjnKWpqaOdm6Swpq+gn6qpp6Gpm6OooK28p66wrqGqoqSunp6tppifm6GinJ+bmaOqopqZo6OVlpSgoZablqWsjJ+SkJGMgoqAgI+Ae5qVjYp9gI2IkpGNi4aTmJGGlKSKk5KIkJqQlIGJfXlrfXZ4eGJ6enFvcXR4aoJ1a4JnY2dhbnOObWJqb2BvQFx5a1ZeTlFSS0lNVFlWTVxebVdFWWBQXk9ITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JePiORlqyYnpenoqCfp6O3r62ir6+orLjDu7SuoLmvq6izusfKx7+4wb2vtL+3xLbDsq+6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oK24taemp7Czn56lpqigpZierKeonqCqr6egppeiqJ+wuJ+ksa+gq6GspJymp6iam5ueo5Wcm5qdqaaWm56okZiSmZ2TmZahqpGaio2Qh32HfoKOfHyhjY2JeoSNhoyPjYaKk5qOiJSgipGVgoyXjZJ9hXxzcH1xc3NfeHdpbnFxcGuAc2R6bGdlY2FmhoBgW3Jqck1NgGlYWk1RTEtIUFNQR0xbYG9URllaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdXDUolZulmJuVrJ+doaOgtquwo7Szqam5xbezrqG4ra2sr7XFx8C3v8G5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevsZuhpKCko6CWm6+moZ6iqK+hoKGSpKSht7ChprGrn6ujrpidqqWon5ianaSTmZuanaWpmZubpJWUl5WcjpOXoqmikYqKkIZ6hH6Ei3mPl4qNh3uDiYWKjo+GkJOYjI6VmYuQl36Gl4yQeoF7cHJ3bm9zXnd2ZGxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFNWRzM5Xl9sUEVZVllmTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMZShoZaUm6qbo6GiobaqraC7t6WsvcW0sK+jta+srK+0w8O8s766trCzubi6t7qvrcCzs7ivv8C3rL26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6uZoqeco6WUl6CypJmepKmpnKKfkqSgpLippaeup52loaiToKmioaGZm5yfkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWIiYqShpeSkouQlZSOjpR7g5eQi3d+fGx0cmxrc2F3dGhoamhncIZoaGlkZmlpYGpjamhbZntiYFN0VFxbUkxKR0lQVEAhKmhfaU1EV1VeYExKSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqOnmZyenaOzrKequranrMPBuLGso7aup62vt7+/vLLBtrCusra2uLa2raq9s66ysLy+t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmprLClmJ2pnaakkZilrKKYnaSpoZuhm5afnae1prCqrqCgnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFdoGCgZ2Hi4OJfoCGiYeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrYmdkZHaBY2VmZmVqaWNrcltfWV1sY2FOaVhaYFZKR0lLTVNYPjlfbGhIQ1ZUXFtJSkdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJWksrGisr22obHFvLqysaO3rKqtqbi8urqtwLGurq62r7O4s6mrubGvrrO1urWwuLyrpp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdpqiln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd9iYqGhouMipOFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZaSUZMTU9YUVFVYWWAVUFXU1lURklGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNjAuKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvnri/taC0wru+urGmt6+nraS2t7e2rLuurKqrtqqzt66msrWxrqmwtbWws7W5pqiftaecnaigp6uap72XrKOusLW1ra2gsa2wqKGbnKOrp5uUm6ajnZqpoqSWmp+bkJukqqupu6CnpKCYmpmdoY9ropaZnHCClZmjf3WRqaeelJSekImYmoCWiqKQeYeUjYNtaX93g3FshouGfoWMh3FfZGFnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNncoVoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpIUVBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qsqqO9xa+pt8K3vbytprewpaqitrOysrC5rKmmrLSlr7Sjqbe1tainq7ayrbStsqGonrKpnaGjmaSlmKu5k6Wlr7O3ra+lqq6qrKShnpygpqablqClpJubp6adk56el4+dp6mktrCkoqKdlpiXl6OIoY6Smoagh5KcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19ORlJWVlFRUldVZ11NVklSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLigtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ6qqaeqv8Ovsbq8tsC+qqW3sKispbK0rq6ztqqopLCtpbSynK61trSmp6eysKyyp62dqaCwp5+jopifoZqss5OjpaW1vaatp6uqrKikoaCYn6ajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfZCQkcpyl7ucxXpytae6kHuAbZexq7B5aGxYsa5uZWm8krxuZ3puco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFdRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT05V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ2lrLGosMK9srXAtba+waqms6ysqKaus6mutbOmp6W0pae4rZyzsbWrpqSnsa2tsKaqnKajr6Kgn52VmZ6crauTnaKfs7qjq6mira6loZyamaGnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHCuoaR+eLt9bKGQdrFfarRbpYBlnJBhZ4N7Z4BreWupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICUeHlqpzdKr1xYU2xkW0tPWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1gzMBuQopWDraelnqOkqrG3rLW9vrC2xLK3usGmqLCqrqior66jsLqvo6StsqOpuKeesrKwo6Whqayuq6+mpp6ioa+aoZuWlJaamqullZqhnrOzoqyco62soJ2Zlp+hqJyYnqOfm5mhpqSPnKKZlqCfqp6npqGaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eBgYmQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfYaAYpwuUaFvW1NraGBMSltkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkBGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblKCViLOmpqGvqaizrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqaqsaevp6Sdn5+ulZ6ZlJSUl52soJmZpKi1r6Kqj6qoqpudlJegpaeanpyinpufoqSilZuel5mcoqmappqcm6Khl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYN6rHmPnVaveoh+n2u5W7p3h4R+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYaFpkYUpITXFQXFFPWWZaQ0U/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3SDphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sLW0urK0p7Cvoq+ypZ+ttaeap7itoq+xn7O0sKCknp+mqbCos6ijm5ydqpWYl5WVk5WgqZyZlqetsKmjn4+toqiWnZWboKWgl6GgoaCaoaGnm56hnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ+kaGmf7F3g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6Od7Nll3SEnm+eZ5RRyItawlygeWJfrGB1c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBUGtgbGhQVkdKOT1VUlpXWElEP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YEw2MjCinZKlsa2jq7ytprSmp7W6vLG6vra1s7m4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mbmaedlZOXl5CRoaaflZOlqrCmopaTraCmkpOfm6OlnpWapaagmqKfrZmhnp2QlJuhnZyllZ2VmaKelZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYqSm4uif5Oaia6EgIKzXHKzUq59goKjf3LYfniGfo+dhpqZdq+Gh5Gch3a0YZplmoKClW2SWrBYS5p1mHlmYKxedXeIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtCRUBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQl9IOjk5oJ6VoLmwl7TCrqizqKmyurezt764t7G0urSkt7Kes6yfn6irnpSntauosLGqrbOjm6mgn6ehtaalqaKYnJSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgoo6QoZmnpJ+UmaWonJyknqycoZyfjJOfmp2hmJmblpeioJOXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJmJiIo4OSiJSrfYCLnXlvsVqogoKIn3p02YB3iHSogY6bjJKke5SPn4R6sl6dZKB+g5Vtkl2rW1qTgJF/aGeqY3F8gmuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9xc19LVzdKnJhYR0U9SEdBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RkhfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubixsLW6qLqzn6+knaSmpp6Tqa+orqi0q6muoZigoKako7mhoquglpqQoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkaOXp6qmlJeop52eoKKtpKGeoYyUoZifoJKel5yVnaGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkZ2OiaSHkHe4cI17i6Jqa7ZaoYVll5dpoKKnbpRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyGklJzo2t4f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1ZY11hcHtjVFtSPj1ucTNDQkA/TDohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZMXjgxQzimnJuevKGbssCvraurp7ept661v7S6r663tqrAtaipoZulo6Gckampp7SisqetqaCXnKefpKu4naOsmpWYjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJOlmKSsopGVqrGjn56mq7GZoaOPmKKWn5uWnJahk5ypnJSPqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYi4yniHqktnV+d3bCgpqyYIO6ecB9drhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN0eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWZnY213b1lcWkNAQHRAQ0crNEciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYGBfX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qqquxprevtsOvuLCtuK6twLCro6Kdo6Gcm5Coo6mypLSlrKSelZqqmKasuJyhrZiUn4+knpKMnKKdl52ZkZWSr7myrJaYpKinlJCWpJujrJ2Qn6irn5qfqKO0n6OljqehlKKanJiVo5iPr5+SlKmehZCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfYeGjYeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF4toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpbTT9KMzsvIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Srqqisqqm5rrDFrbOyrbWms7erqaGhpJ6gnZmTqqOsqqW1p6afm5Wgo52rpL2moKmWk5uQoZqRjqGnoZKcl5SYlLG1t66ZnqSkoouSkaaapaqblaekpZuZoailp6SqoZKtnpeknpeXl52ej6+ok5uloY1qfWmapXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pfm4phY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBdbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMj1bTyc/Mj6poKiiwqObtbu2o6ylrqentLGsyKuusqqzor2wsaWfoqedo5uZmaumrqOktKikm5iUoJqlrae+p6iklJOalZ+ZkpekqaiQnpGQmJyws7+tnKeep6KJk5GpmqijmpqqoKOZmqOnrKOgrKOasZuUp6CWlZ2fnZawpJegp5iakJuboaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiWjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVT0ZSOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXGBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKyt6CppbKnpa+0qseqq6+ls6TAp7OgnaOknKOVlZ+qpqyiorarn5iWlZ+XramkwJ6ro5SRmpadmJKUoZ6eoqeTkZmop7PEsJqrnaufj5aWqJ2qm5yfq5ihmpyipK+noqaon66Yl6edmZmgnp2br6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEj56IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4aCanVkemZgamVjZGZrWWx7b2lqXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWltfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFM1tHNTwsQLSgubC/rKyvsrGgqqeyrKKssq/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytJ6Uk52Zma+lrb6gq6KQkJ2ZmZSQlaGcl6ichJ6rrKO0yLSgqqSqlpWXmqadqJqdo6qUnp+doKqvqqakrKOvm5+goZeknpyenK6jmJ6nkpaWm5Cil5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJueIJ4f3NueYR0domHjoN8aodZXmx0ZF1ziWlrfHBrY19STldJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVVdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq8uq+stLGqpaitrrCmraywu7CopqOtrbCeq5afo52hmZmmqpyto6WnqbKunpSjj6KvpbW5pa2ijo2ZoJiTkpqgmZmllXymrqOotMW4paKnr56clZ6inqOboqiokZ6hnaGqsKyspauhqpunn6igrJagm6Wvo5abqJSfnJqRopWcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3eQg46BdXmAf3lxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlFTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVUFCOy84lqO5w7WwsMGqqJSjr6mwrq2lsrOuqaSlpa+qn6uYmqKfnJqqpqGcq6KkqKOktKScopKlraq2s6etoZGQmZykkpCfoZiboJ2Ip62lrK7AwLGhqa+plpKfnaGZoqOpo5KgoZ2era+rrqikpKihpqWdrKiRo5qorKmanKeaqp+VlqOUn6GVm37OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YoOtWqPNbpB2e9p7f5lwfYiSdn1le4d2dmt8h259hZCRfm2DkGBybXBoYF95ZVxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbSrpbKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6rsKqoq5+UkZqfpJKPnqWYnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp6UoJ+dna6wqayrnKmopaKrkqyylqShqqmdoqWkn66fkZill56ZkpOQl6BxhYyXdYWohnGxfZ5yrH+in4GlkJ92q4J9rX+cc61/rIeGn3aZknt8l36qiKGLkYydfat7iZWQoIF7rVedxXuPcJPBfYGVbHVwjG1ldmSGbmF3bnJviYqSj4NukpFmcHV1cWFnbWZfb2hpbmdkV1RdYVpSU0M5SUlARDw+PUBGRUNFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg9MSkzV0BGIRxHOkMxLiuw08bGsrOgnKKOoqKirK62rqixpaippq2rq6aho52YopWfpaufoaWfqKiinp2wrJealqinrquopqeel5SZoqGSlKCtm52no7Ctpa21q7rNsa2mrquWlZydopierqyclqCZnp+ps6urq5ytq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJqGpGBhUqyFf66Dm3atgqiGhZ97mZeFemaAo4mkmIaCo32pfoKWiK5ffKlWnqOSgXqjn4B7w67Ei3Kvs7O5cWKpr8J0aIyMmI6BbpyVcW96eHlwbGZmZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTUqMlBLTCMgQTlENCwnw8nW1L+hmaunoK6inq+0sK6orKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLSurqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKYn6WznZmhlJ2fp6ytpbCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6lsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLfJgYGyX2CUqYOliIegepmVmniqyXSZpJSoqZCSm42BnYqaxsZ5Z6GCpXSBn46Cfa9db7RisHVLo4dtp0eCk2SOkJ2SfHGZlYFxe3V+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0k7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramyrKylopuyuKuqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7WeopeTqaq1saybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylmqGjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2ZraawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3x5uYJ/zMbCtniboZGLnn6alpeKdp+XiqWXpKl/sIWdhqCErH2alWOmbaRwj4WQgXyWgnKsYKNycYCaYLx9UlV0jpKjl3t+lJOMdntzh4BxXW1ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz9CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6SruKquoJugrLOypZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO1oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5Ccp5yipJyll56ZmpqmpaucsaKvpaaYr6S7raG2taydnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYKKcaqGhbVucmmapJyVip99mJmGh49zr4Kmm6OOpouTnYuVkJtucbJdpXSTepxsmH97mXxtqWGicXF/n2Jzsrhod4+Upph9jY6Vjnp9eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhHQFU0QEY+PCopNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11bWltYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVVVRT1FbVSUhMkFIJCklknOMiq2+vry5tJ6Wp6SttKGhmZSip6auqquYpqOfpaGgtqejqKewo5Sro46kraOdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqKVmZmcmZyZp6aoma2or6Omm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJB9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWuhaCVqqCil4afgZqVgHuSfquAnZqXi6p3naCSipSSgXqvXqSBfaanZJ1/fJdyaq9dpGtwhpldYFuMoG2VkaaZgpWPmo58fISZgGtugGN/dG6AemBoZnFvaWhnQ1lhWz1LVDNVOEJCQzgkJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXV1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6marqGQq6iklomakK2vrKaepZusl5iPrKGhnaWhmqWdr5miqae3qsGvpKmjnouAjZuan6aekpSZmpSbmqalppuqrK2kpZ+pqL6klsGqqaGgqrC3qauknbKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4OnlZqBrIqEsIanmqShopGFoV1sa4GzYH+te3uDgbFtZ26ZmY2JsVt+tVykhGvIomSfgHu7V3a1WbJ8Uq6AeqxXgKFtl4+om4yYkpqZfHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFtBVmA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTk9RUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxtr26s8GyopyspqS1qKCKmqCdnLOzqZ+koZ62maG0qKqsnq+tnqubla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qko6aaoaOqs6q9r6SnnpyOfYublaCgmY+RmpuSmpipoKOaqa6opaaipKi7np/FpaOnn6mys6qspJ25q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Jp5ybpquRf9a9wqpipL+9fX6jgoPXu7i1hpaUhJ69voRto4Jvq4RsnIB6srDHg2mrsLysd3ahvrxzgJaOpp2RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5Wzs7C/uLG8sqKcraWlsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WmlZSwq5eMg5uRrqWirKCjnKqfl4qjkqaep5uboamkmaCirK6quq2oo5uWknyImZGlm5KPkZiZj5iTqZuhmaqpoaqnoKOqup6ow6KfrKGpsbKnraeeuKWsrJlzdqqkuIZkiaBwaK6Ri5BubnekkJmfgXWumZRwj4txlqiknJivpHNtbW1mi3hvboKZcIF6anFpZ4qYlplyaWqFiGdxhmRdiGJqb1lcZn12pl9hcI2QbmVlf4yTj6GZmZqTmaF9iZGYd2aIeGmPbHqAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmVrLOoubixs6qpoa2eo7KqmJK/s8XKvreqn8GtrqSiqKyfuqOkrqytpY2WrqmPi4WWlqydpqqgnaSjoJGLpJOnmamal6Sropeep6aosLurrJqbkpJ8hJeNpZeNkZCYlY6YlamWoJmpo5uxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGpprediZajmYiqm5GVnZKps5maoqqgspaioZ2fop2hpaKVrKeNk5ONh5OcnJWRmZOZkY+VhYGlm5mWj4yUlIyQh4R+Z4l+dIJ1c4eKcKdsepOPk5GAgY2OkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmppLS1rq6isKOtn5+1sZCNrMi+xru6q6Omn52nn7Gpo7annam1p6eRmK2ii4eJj5unlaykn5mon56SlKOXqJqompWnoqSRnKiZora6qKqYmpCNfIGVi6CUipWRlpGQlJemkaCbqaCctqOdpqu3p67AraK1pK6trqqnp7G2n6y6mJGlo6e2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qfnp6dl6yek5qinJSQlquajpmZl5CXoJKIoZ6XlYeTjZGOlYuBfmWLhXWGdHeHgnOcaoWPkpOPiX2LlZKSmJSjlJ+ZpIWJm4p9c5dze4yAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjMxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5WjpqKvsauuo6mmrJ+ntaqQj52ktb2wra2jpJt8n6SypKWxqZebuKajlJmqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqZqqjZqpkJ+5t6SlmZyNiHmBk4yak4qUkZSQjpKXo46fn6ien7ijf4OvtaKurnSiu6GwnnZ4nqevuJN0q6OeiX+rf2RcYnagjqWfhJh9bZKznaKnraqjZZ6fknN5mphxgZmpmG1/oqmKZZymnZKXmJaMk5yRhp6bkZaEk4iPkJKJhXdqjoZ2hXB6hX9/YGiHiZORilp1lJBnaI+Pc3yonJxme5uKhXmZaoWMhG96gGtxZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXGBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpaKgrq+rq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ6Rf4mIm56MrJmilaehnY6Xkp2Fdq2PiaebqZKYpYqcu7SnoJmYi4l1d5ONlpOJk5GQlI2QlKGPnKGnmZyxlYCMm7ScsoySjbmln32nonmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ6hpqinh5WFmHelm3qInIGXp4OCe5yzeoqGoZialZiWgpGXl4SbmWN6iJCFj5CSi4NtcI6HeX9wf4CEfYVzhYOUkXeWaJJ0oJp0fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuW1VVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVtiYWhmWVFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kepaysq6esoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkH2Gj5iXh6ycoZafoZGNk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSPj5uMj5KgkpihpJaeq4eftIm0ma2KyoaorIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIygnaWnkpjCgX+riJihcp6AmqV+l4WVs4GhfaGToZCYl4GPlJyLmZKMfYWTh42WkomDbXOPhX55cYaAg3uDdISAlYCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSkpMQ1BaXVxXYV5pbFxRRT1LTUBJY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJahnq+mp6ilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvJmTjaGRno96hJeWkYermZucmqKEj4x3mpyPn5CIn6Wcl5qZh6O5raSanIyMfmJtj4qTkI2QjI2YjJCSoI+VoaGZoKd+oaeHrZ2flq2PnJuckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqnpoCpq32DoXt6p2qef5JsZ5iGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgHyDf5Zwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhFX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGFcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnJ+4n6mjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYKUkoyKppWVmJ6ffpOFhaykh5uQi5qrmZubkoimsaehlZqIiYBpboiHi46OiYuNkoyQk6ONlJ+fnKGkf5OBj6Kgk592nJSOp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+aqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZSQlpzMz1TR2BKUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSit5iqm5OfjaS3tKytoJqinaSjpq+dnLOvrZSZopqhpZmalZ+rm4uIkniLhXGAlo2JkKGPk5SdmH2Rio2ooYeXjomTpJWcm42Mqailno+Xh4R+anuHfn2QjYKLkJCJkJShg5eeoJ2fnouJd5yYoYyfcaGKhqmHmqSNlKWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46YmqWFomShfIiWkJuNbZ5om45vmpl7gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp1nmnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0RSbzVLW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOXF5ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuIqbOapohjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKSboaCZl5ago5mGiY1piIBye5eIi5aWhJGVmJB6i4SVpJyKlI+GjZ+Tnp2JkamjoJqMkoqAgGmBhnh/lox6iY6OiJCXm3+Uop6foJOYcmifiZ6Oi3CSjICphpidoKSepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iiaXF7jmyAiIOZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyfn9vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9QjhAQTpJRjhMRVhBV1JbV0RGYlxaYEtgbX1yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgK+smINTXqCms7mxsqiaooycrJycqpWiraWjqZCfnp6bmpaYoZ2WiIeJd4aBb3mVhZGbi3yRk5eIcoGJkaGbc5GQgYmalqGbhY+qnJuVi4uKfINshIVxgaGLeIaNiIeTmZZ8k6SgnqKIrYZ9tYSNnZx7pZV5qYCUmo6Inpp7p2h3bX6ZdKFzcnyehplwk4OufaODpZ2YgKNvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG17cJZtf3KicV2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhYSlVhWFRcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSZHd5d0lGRWNeZlpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vq1RbSn6pr7Gzr7Kjm5mFmaqgoqWPpqmhmquLm5mZlJmTk6GYjoiFe3B9hGh9j4OVm4F3kY6Pim9/ho+TkmyXlHyKk5Sll4OPq5uUkouGiXmDdoiAbYGfhneAk4aImaOYe5Sio5mfibOhoraLeaynpK6lb6h/mY2FgJmPeqR/oZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ6XqW16lYehnHWiiHegfpKXi4FwTWajknCah3Ole3l0YYOBa32ga3FkX5xxfXOWaHpps7WzxqZymH16nWucm6t2hZtud3mYapp8dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2lKV01ZVFZeaWxvVmhXTUtBSk1LSEpPQlFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX11dXV5pYmRpa3tfXWRoY2pmb21laWxloJuHrqWDZD+TobKqrq60oqKQgJiqoqOmjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY6JjIFphIWRg4yFnY16jYyXppSEmKqYjJGLgYl6gH2LeHCQoYZ5gpWHiZagln+UpaeblZWDZm54nGyiZHtwpXebl3BlpoCUiXqkeZ+Wg5dznneBipWXj7lukYqiYn2YoJSIbXJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii216fXNxZKVteKJkZ6domXOMmXCicFWJkHCgYGaoVYteVJhubnRsc4NucWlreXRrcFJZV1dmWlRtSlpQXUlYaWlzallsV1FSRlZcTFhTYlVpa194dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGxsbmhkZ19dXl1gamJqaXZ0XVxjaGNqanNsZmttY5yjl6V5ZHNsiqato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaIuLfJibc3SJfpB7ZYOGlIqKlpqCfImImKiSgaOtkYaQi4KJfoCAjnJpj6aEfYeTjYmYoI+Ik6mlnIimeJWbfqWIloqxl52Pgq6WnqR1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaSlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ9foqknXaffIOklZ2gapuIeKxon66NtnV4vo2kk1qDp46rYXVzdXJ8dXFja39vaG1UV1tWYWJdbE1dUl5KXm1vd2BbcVlbYFtndGVub3JicnRgeHp+eXJ5g3OEfoF7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhX15cYWtibWx7b1xcYmlibGp3bWdsbmKVpKmbgH+do5apqZ2opq2kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjI10h3uIhHCNhX6Yk3R0hnKRg25/i5GHhpSPfXyDh5mnj4Cnp4+BjomFlHaCh5JubIupgIOMlI6JnZ+JjZOpop+Of3STl4h+gXiTrqJ+gZpwj4V2jomCfXtyp4xxfn16mJabhJB5e39+h5SVk4p2kJieoIN7folrjIVbeXlyenFpbn6SinKAdYGPlJNxh4SDZYx/X4GAi3d1c5R1b3lubYdsg4ZedWd3jmV/gIWNqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11na2RXY1VfUmBweXlta3dma2trd31ycnVzYW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5WbmdodWt4amlpZVxgWmNpZWxxdW5aW2JsZGxseW5oa29hjpO2p6aKoKGapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+XlIeOiomNcoN8j31+j4R7mI90c4RxlYV7fJGLhoaQhXl+gImbpY98qKGLhY+QhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6IlqynjpGlj3dum46BeJBufaiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYJ+f4xqXWple4aEioBgaXl7m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCJjqWThGWLjYNud4uEcYaPenFoaWZ9hXuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1pZbXJcYGJaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH52en17eXqAgX5vhYmEe310fnlzf2lUXHFpbHZwdWdrZ2RdYVhqaGtrcXJuV1tlbmxnc3lvaGpsYIuKqK+gj6KgmZ6dl56YqKOifoOZro6glYido5GmlYB8mYZ9kpmKiYeHi3N+gYx2hYuChJeKcm+AcpiGhH6Rg4OGioF7gYWNnKGRg6iiiHiOl4iUioucl4SDeayCkZialYqenYiIoameoaGjioeTm5yimZWpoKaknpGahZOLenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZGbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYWQd3x6dJqgiYaKnYmEk359ioB/dG5zhIF9doWGiY6kj4KEjIaCjJCMfYeLipGEem6Ehn56mWtzaWF0i3F+e3h3cHh1gl1eb4dpb2BfWl1dU2lyVmVdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFtZ4F7c4KBd39+f4V6bYKMhnx6eHt9eoR5TmR2anNucHpla2VjYmBbdGVwZnJxbVZebHRtaHl6cWdpa2WMh5y4npahoJeUmJmUmKSgnnx/mqyPn46GoZ2MnpZ+eZWEfI6aioeEhIdueYGBc4GIfomUhG1rfnqXh4SDj36AhoSGfYiFj5yflIisoIRyipCGkpGLnZF9jXqphI6TmJePnJaHhpuknqGZnIWCkpqZmI+Ypp+knJuPlX6Oh3R6ho2DpXt9j5CRhpiroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNweIZydWB/hJCGdY2ZgYOPg4eFf4aFlW55dnSSooqMhZqEg4xzf4l8fHFxeoaCenaIjYORpI6Ego6Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBofn13dnd2e3hdYHF+bnVhZFtdX1JnblVmXF5ia2l3e39ybG1ka2pogX9sdIJsbHVwenCGeW6HgXaCgH2FdnGCjYh+e3x8f3uCimBoe2p1aGmCZGpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1ti4ietZmgop+SkZWYipqfn597eJ+nkZyLh6aVjJiZenuNhn2JkoONg4KDbnyAeXOAhX6Lkn1raH2Cl4mBiI18fYaEh32Pg5GdnZOKqZ2BcIuLjJKGn6GKhYx8p5GIkJOYlJaTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyNj3yYpKKik5qRkKaMjoGakImSlpt+k5J+h46BdXSCcXdhfoGOhnKLl32JjHKMgIOFho9peHJ4jJiRj3+WfoeJcoGGe3tvd3qJg3l4jouClKOSioSPeoaGh4R2goSJiX1oc36BenxybWxoX35zaX12dnR9dIBrX2B0d3F4ZWRZX19Sa2lWZlpgYWlqd3qCcmdsZGxoZoCBa25+aG9xbH95h3tsjIFzgIF+gnR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG5geGhtV2p0dmN1entyYmpveomMnrCRpKScjo+Xj4acoJuefHeloY6YgI2jiomalnl8hoh/g4p/iYOBf3KAe3R2goV+i5F4Z2N9hpeKgoqLeH2AjoR5l4OWmZiOl6Gbf3CLgpGThaWbh4yJg6aVhZOMl5iSkneRnJ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlY2dfoKJjYxzl6OfopSZj4+hjIqClpeDkpWZfpiNfIiNgXZxfm57ZIF9i4Vxh5OAkYJsiIOCgImFZnZve4WRmIt8kniLh3t/hnt6cH13iIR4go6HipeflIGCi3aIg4OCd3yDiod4YXp6f3V/eGhtZmJ/amt4dHR3fnJ9Y2Rhc251c25hWmFeW21lU2RZYWFpbHZ6h3Jja2NtZmh9gmxpdWhucGqAfYJ6bpCGcoCDg390fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5uslqanno2Ml4eGn5OXmX54qp2LmXqYnYyMmZB5fIGMfn2EfIGDgXh0enp0fYCEgImLgGRffYuUh3+EhnR9fouAfpmGl5WYjqWimIBzh3uTkYmmj4yOipKgkYSSkJWXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqIiI+Jb5eem6SUlYuMnouFgZGcf5KSlYaZiHuKioF6cXpsdWx8f4x+boaTg5V3cIOEfn+LgGVyant/lpeDfo10j4eCeIZ8dHZ+fIR/e4GKgouSoY94g4F0iYd9gHR1gomFcWJ8dntyfnBicGRlfGNvcHdzeXh0dWJ3YHBsdm5wXVxgXl5rXlFeWWNhaW50fIpsYGpla2Nod4duZ21pa21pgn17eG+QiHSBhIR9dIGGiXuDfXqBhH19jnJ5i3h4bWyHamhfaXJjh2dxb2V3Z25sYXppan17eHBheG2LgJiYqZ+jqJ2JipKGip2LlZl+eK+ZjZd+n5SRl5SId358in18gHd4gIBwdXR8cIZ9gYGKf3xhXH6PkYaAg4JyeoCIe5CTipOTnZSmnZWCfYF9jYqRo4mOio2Ymo2GkpmUlY6JiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5Wjk5KJi5mMgX+Qnn2SjpKMmY57ioWHdHN2bHFudn2LdG+HkY+TcXWBfIKDiHxmcW15fJmTfIOIdJCJgHOHeG1+fH+Ee4OKhoGLlKaLeoZ7foqEd35xcIGGhGZpenV2cXxjX3Fha3RfcWt7enptc3Fmel5vbXNtc1hbX2BibFtQWFllY2hycoCIZ11qaWdiZ3GNb2RqaGVpaYF6d3ZwjoV0gYKDfHWCiIV4hXx4hIV6f4l3fot7e3N4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabhouLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9zc3uGbHNwe26LdoCBh29wW1l+kY2HgH9/dnWBgYGhh5KLlJ6ZopWYeYp/gYyInJ2Kj4aSmJaFiZWakJeMi4yNi5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEm4mQfouDi4F3k5mTn5ORiYiUjH59jpd7kYyPjpqSfIqAgm92cGxtb3F8hmp0hI+Zi3F3gHWCiYJ5Z3NudYCZjnuHhHmTkHl1h3Juh3qEiniJhICGjZqhhnuDdYGKf3h4bmuBhINfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcHBrcm1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcYuAdX+DgXl2gIuAeIV/eIiGd4OFfIaLf3t3in9qcWN8Y4Z8bnFtdGpob2x2eGBxf3l8dHV0gIN+pJWZrJ6nloSNhH+XlIOQoHaMoJSThoubjZaOi3pyeHWCcHKFdHJ3iWxwbnZtiHaDfoBtbVVRgaqUhoN3fndyg3qDooOUgpaUmZ2Tm3mRe4OMkqOZk46JlJmShIeXmoyUi4mOjoacg4+Je3KLhYqOh5yan5qVk36SfGaDmoVmhZ+HkYSRgolxg5CXkJyPkI2Lj4x3epGQeo6LjJKWjHyIfIBrdmtva2xte39hen6Ql4J3eoJ4g4x8emh0bHOGlYt9h4V7ko9xeYNvdYt5iIt4h3x/iY6dm4N7enaCinx3cGpsgoR8YXlxb21zdFZfcGJyYmBtb3pyaXBmZ3V1aXJsYndlXVdmYWBzVFFPXWdlXnlwiX1gXGlyYmJmZpFqX2hlW2dwfnBscXSKfXZ9hYB1dX6MeXuFgXiIg3OGhX+MjIR8epR4ZnFrg2CIfW9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoiAjZ+AjJqUj4WImI6Pj4R3dHd0gHFwhXRwcoRwbGp3boNufX1tdHJSTYLfyJLWkntwdYR2haGElHiXkpmdkZp8lHOFj56hk5OQipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjImcm5yalJJ4jHRlhpCFa4eihJGIl4OGY4yRmY+Wi5eMjYqKcXqTiHuOiIqTkYl5hXx/bXxlcm9rbHt6XIF6kJCBe32AgIaOenppc2pzio+JgYWEfJSKbH5+bX+KfYqFe4N4f42TmZiKfHV3g494c21ncICFbmt1cGlrdW5UX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fd1FOTGJnY116cYp2XVxldmFiZmWOZGFnYllpc3Nua3J3jH10eoaCdXZ9i3N/hn97iX5yiYiCkIqIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5qump+QgoV3iJV+fYueiIagko+FjJiEk4+HgXV4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KBybHaFd4akhpNvmJKWoZWcgpJxhoqil4mNlYqQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SNnJqYmI2OdYl1bISHiXyJooSRiZyEhV6Lk5iLkImOi4qEiGx7lYF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhnp/gYGGjH96ZnJpf4mNiYKBf4qVhGuBdW2Hj4GOgn2BeH2OlJGXj3Ryd4eMdXNxZ3V6hGN1bnFja3doUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXlOTU1lZ2Jed3OKblxdZHleYGVlhWBjY19ZanNrbmtzeIx+dHeEgXh3e4lxg4R9fol6dIuJiJWGjH9+l3NodXF5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUeHmMnoWGoY2PfJWNgJqIhHtzeHBzanCCbGptfXVfYXh3e3F1e2dgZHzr2rXJw9yHcmx0gneLnIqPa5qRkJ6WlIGJcYSIn42Ei5WKjJiUfI2TiIOIkHuPi4WOgH91eIOEcoiBk5uWlJeFi3WGfW6DgIeGl6GCk4yeg4lhg5SPh4qGio2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p1d2xajXySg4Z+gYSBhYqCdmFya4eBjomBfn6RkH1ugWt3hI6EkIF6gHt9j5GOlIhtcHmMhXRrcGtyeYJhdWpwXWx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGljaVluV1x2TUtNZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZW5qdHiKfnN0gX57dnqIc4WDfH+IdnaKho+YgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwiZaFmaGaooqHdG+SjHF3j51+i5qJin2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2j5Gmd25xeH1xlJKOiGubkIqdk4yHe2iHipmGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCHgJWZjpOTgId0goR0gX6IkZudhpWPn36IYoCTh4WIhYuNf3+CZ3yQgH5/goyPkH5tg3yDdWxtd3V0d3ZsY46Cj4CGf32GgIWJf3BfcW+Ee46LgXx+kIh6cINleYGIhYqAeoR8fZGNj5GCbW55i351bW5ra3t/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9JT2dmXGhvcoBtWlxjc2BcY2x3ZWVdXVpsbWNtanR3hoBycH98fXR4hniFgn2AiHV4iYGTlXyIhnaIgG94eXuDk29ue4F3XoN/dIFtaXp0lHNnc4h8cZGQg5qfm6CGiHZ2lH9td5SYf4iRhIqOmn2Mmnd9dnFvbGphdX1nYmp1elpgeHx6bHB/ZWNnZ1edj19yc5a9xYV3cpWLkYB0mY2HnpSNiXNqiI6VgHuUjIGEm4x8ioZ9fIiMfpOHdIeFdnZ9gXF1hoGelIaUjoKCcX6Gc4J6iJabloaTjZ2AiGZ+k4OBhoSKiXKCfmd9i3t5f3+Hi499aYB9hHZmcHl4c3h0bGuPhouCi4B5g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHeBhYmEgXeCen6Vio6LfG1reol8dnRvaGh+d2VdcmRZcXRUVG9zaWJOaHV5Z2FeXVlwgXB0WmVjXmtuYXFQWmxTRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGpzd4KDcW9+e390dYN6g4J8goZ2fomBlpF4g4p0gYdyeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCi4KWmIp5j5ZveXNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql29KYc3ySjZF5f5eMhZqSjYdvbIWSkXp5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZCEkoyCfm59gXSBd4SZl5KKk4+UhYhwe5OEfoSDiYNugXhogIV4cn9/g4qHfGV8foR2Y3FzgGl6cW92mo2GhIt9d3mBhXuDa1xvfHJ/h4OIfISHeohxgG1vgoWMgoJxg3d+loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnNuT1hydGdgS253dWJeXFtZdX50b1hnXmZrcV9vT1hpUz9aZ19bcWtnenJcW1lsZVlkcXlfaF1eZWxoZmtpcXd/h29sf36BdXCCeoCBf4OAdoGFiJeKcYKNcXuFfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3hmkYqCoZmdkoOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2Fvem5fY3B5XGRsg3pgcHZfZGXV676LMzo+jI+Ac3qGipCOd4WZjn+Ujo1/bm2FjIt1fI9/hYKViXyDeG52hoSClXZth4RrdXt1ZXmDhKeMg46LgnxtfnJ0gniDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udnJ1gp2MgYCGf3N2foFzgXBba3xzeIiBinuGf3yIeHlwaoaCjoKIcIB3fZOJin1zbWp2gIB1dVxpaXlxWVd+VFtyZk1bc3JmXEpyeXBdXFtaXXaAdmpaYltoZm9jak5YZ1I+X2ZdXnZmYHVxW1lVb2RaZXF5W2heYGZtaGpraHB4fo5taoGEf3lugXt9gX+CenWBgYyThXCAi254fYB7e4iTiYBpe35qdHxyhntzdn5/jHp4hH58a4uMg5uel4yCgW2Nfmxpf4+OfH6Ag5SCf32KiGt1cWdpY1tjZ3NvYGJsdGFocIl6YXNzXmJjm6CQbl02W7C2dWuBin6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh9fJZub4V9aHZ5bmV6iYWkh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251fIaVkoJ+g4Bwd3p8dX9tV219dXOJgIV2hnSCiXp3cmyHf45/g3F9e3yQh4d5bW1obIKBdG5caGZ1clJcfU9dcl1PXHNwZFZLdHlrWFpaWmFygXZiXl1hZ2RpamZPWmlOQWJlXGF3YVx1blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnt3gICJjIRye4dvcneDf3uJjY+Ean57bnh5dop3fXiAgoeAg35+em2EjIiYo42FhHt2i3lrbYWJknl+fIKSgIB+ioRwcnBjZl5ZZ19wcGBgaHFmam+JdGFzb1tgZGp2e3+/nailyrlyhoV0lX56iZWEdJKOh3JzcIN6gnN1hnSId5SJeXlxY3aFeX+SaHGDdWZ2dWNqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3h31ranRoe4FqdoGNkpV/fH9/cnx3fHR/YlV1e3Fyh4KBe4Fwhop3eG9ugoGLfXx3fHpzjISAdWdwZ2yIgXFvXWhjdG9MZndNX29WVFp0bmNRUHV5YlJYWF1icoN0XWJcaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlXbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ9dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVufYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdpCAZ29uYGVcWGZZbnNhYWFxbGxoiW5gc2lZXmNtgHep2qnIh4izc4t6cY92fYmRgXuUi4B1dHV9dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW1bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGFieIZ6aHV2Y358aHWHj46WfXaBdnKAen1tgFpVcXxvc4GFfX93a4iGc3hqc3+Cgnx5e3d6cYl/e3Jmc2Rti4Nsc1pqYHZmSW9vTVxjWFdWeW5iUFN1d1lRVlheYXOFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWnxjUlZddltbZ2xiV2tgYW5mZmxwaHB2eI90a46Ndn92eH13gYSBe3R9g4iIg29xf3VxdX6FgYiNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydXiLjp+MiXuKd3WDel5+h5qNeYeEdIaHhXeJe2JubVxiW1thVmp0ZGFcaG9wZ4dxYXBmV1xja398ys6HuqJrbm+MbnKFc36GjH97k4V6eXR5dHR6amx2Y4R2koJ2cGdefIB4iodkcYBqanFjWG17hpyIgoFyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXmAeGl1eWeCd2h1iIyPln5ziGpwfoB4bn1dV298bHN+iHqAbm6Jf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JXa195XUlwbE5YVl9VVnxrYk9UdnNSUlRXXmN2hmpeYWtrZmNab2JZY3FIQWldYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOIgHVzf4WFjoNwb3t4d3V6hoWGjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kZSffo19i251gHpkhIiYhnOSim+FhYJ6g3VkbmpZX1tdXVRoc2ZhWWRycmeBcmFrZFdaX2l/eL6ue6C3bmN1iGl1fXN7hYh7fo2Ad3hzd256dmVqb2CHdY6Bc2piXn12eIqCZXB9Z2trWlZveIujgYV+cJmScX92c4BsfoCPhnGUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3WmZ9fXhlcn5uhXRmdoaNhpeAcYxobHuCdG11Ylttempzeol6gGV0h31tcGd0fXZ9fnB6anl5f3h2b2RrYG2JfWxtVWpgeFZMbG1QU1BpTll8aGJPVXZsTVFUVV9nd4RnXmFxaWdhV2ldXWxqSkVrW2NlV1lWelpOV29rWV1sZVxaZWNedWZsZXFnc3B0gXhwmYV2f394f3yGh312c4KHf5WDbnN5e3tzc4WGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x2dpmdmHqKg4dpdn59bYWFlYFyj4JxhoJ+goBwZmxnWF1bXFtTZXFlX1hjc3VpdnBkZWJXW1tof3BvcoBzimVmeoBrdnd0dYWGeIKFend0dm5qenBhaGtnhnSNhG5mXl57bnmIfGdsd2ZqZFZXc3COpnyEe3aWkHN7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97cllngXd1aHCAeIJ2YneFi32Vgm+Ma257gXFlc2VganhmcHWIeXxhdYN2amtwdHlveXhye2V9fX12dW1jZGBshnxsalVqYnJUTGtsUE1PcUhefGZhTlZ1ZUtOVFhha3h/Zl5nc2plYFdkWGNyXkxMbFlkYlVUVXRXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36XhW5ydHx7dHGFhY+CgXqLdnSRgHyBlY6AhYR8foyGen6Adnujpop5iYaFbHV9fHaEg417b4ZzeoV9goN1bmppZVZdW1taU2NvZVtYYXR7amhtaGBhWF5aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bnpoanlqX2VuaIF3kIRnZVhhdmh9hnluaW9mZl1VWG9oj6h3gHp8kI14dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV5kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGdpd3Nxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIU2xGYnlmYk1Ucl5KTVVaZm14e2ZfbXFqZF1WYFZvb1hLVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhb3B2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxyg3t2gYCCdW+Ibn2AdIqAam9uZWRYX1paWlVia2dcWl92gmlebWxcYVdbXGuBZXJ0fWpqXm14d2l1eHNvh3x+fnp2cmx6aGl3Z11kc2h6d5KAY2JUY25lgYR1dmZoaWFXVlloZJCob353gIuNeXBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnZjdYaMfImIgYB4cnZ+dGFwbFhwcWFub4J6c2NxgGxhbXpuamh5eHNwZIR0eHh0b2NgY21zfWlrVGheX1VMdWRRSFdiSGN3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2dVSl1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gnl6eoKLjX1/hYlqdJeBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYl7dH59d3Nwhm18fm2QemNwcGJlXWVWWllXZGZsYF1ddIZoWXBtW15YWlxse2Jxd3ZtY1xvdXVpdndyb4Z5f4F6d25vdGVodGVbZ3RmdnaReV9dUmVlaYGBc3xhYmlcVFheY2SQpWh4dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlld21gZ2FfamBedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXOElICJg4l7d3ByfXJheGNabW5gbm9/enNlcYBkXm51aGNmd3pya22Bc3F7cXBhXWRtb31kaVNoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVExkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5bYJ+gIGSiISBd3WJdIyHdHJ2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmhe3t/iZZ5ZXWJenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbmZcXHKJZVNybVtZWFdgbHZjanVqal9bb3VybnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcVlNjX3B+fnCAXGFjXlNaYVxkkp9lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dWlxgpaEiH+FdnNrcHtsZndXW2lsYW9xfnhzZW9+W2BwcGFeaXB9a2pyfXBvdmlvYFpka217YWZTZlVYU1F4XVNQWlJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uDfYCEmnyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIaBn4l1gYCBdH+CcIeDdm+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYm1tW1xxjGROb21cVldVZmlzaGN0ZWVeW3B3b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYWJ3e3xvhFxjXmNTWmBaY5aUY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXdsbYWUg4p8hnJyZ257b3FvUlpkaWRvcX50c2JtdVVicWpbXm5lfGRrdXxwcXFobF5YY2lqeF5mVGRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35tg4B9hph7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2BtcFxebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gb2plcXl+Z1pVV19rd3p6boJeYV1oVllgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZiZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bGiGjYCKe4hucWZwe2xxbGFYX2dnbXF/cnJeaWxTZXFkVWJtYXhhb3R6dGluamleV2BmaHVcZFVhVlRPWWdTT11PUEllcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2dHmCc4KDeoiPf3yKiI56bpCKdGxzgXR/f4iFh5KElY96fYyPh5GbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiYqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWGioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi317d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiMhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fXd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoB7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f35/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkI+QfHSIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx+fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZWZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkZISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bGJucmpiWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JrYW10cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tYaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJnbG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmpvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGhVQz5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+Pz9BQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0/QUE/P0BAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKS0hWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13SDg7Oj0+QTtIZD08PTw4OjtERDw8PTw8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSWBwcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6O0xSPT09OTo/PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08T2hLQDw4PEE/Pj5BPTs/QkBCQ0JAQkNBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRUU/QUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQkFQbl5UUEhBQ0NBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSVRoZ2VfYFhGTU1GRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8e31/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1NXGloamViZ1phTklJSEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTk1mdm9oa2lsbmFHSEhHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNTmx4dm5tb3FwUT9EQ0JDRkZFQkA+PkBBQkBCRD8+P0RGSERGR0lLSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChYWEhIaGhoeHhop1SklSdHqDd3BtbG5WOz87OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9nRVlrb3pubG9xc082OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYpnZGpsY2VpdYFzPDQ4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4dzcW9mZ3ByfWU0Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYd4c25vc21xYTk6Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoR3dXlyb29dQkJBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjYF7e3ZzcVZLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMjIyMjH96e3ReT1JMS0tJSkpKSUZEREdIRkRERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0VDQ0RCQUJDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt6cFxRUk5MTktKS0lLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktHRkdHRUVDRkVGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2NhHp6eGRQT01OTEpJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhIWEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMdnd0cVVSUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI5+ZGBoXVdVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05IR0pGRUhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxvX15vZEhVU1NSSzs7U1RSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUxMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hzYmlZPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NS0xKSUlMTUtPTVNvdHZ4eXh4enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x9c3NbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHiHpvc1pOTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRhc3t8f4CBgoGBf316e4B/g4KFhoeChoaGgYSBhoWGdmFeT0dBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUFVZU1VRUVRST1Zfa2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCDgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVJVSUJFPz48PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFthXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQjw6Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWlxXWV1eXl9lX11ecXZrXmBna3dvb2xqb25ubGViWUhHSEhDQkdJRkZGRE1ST2FXU1dRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVhZWlZYWFZYWV1XV1hoc2tdVmF0a2FhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTWldUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4ent7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNUV1RVUl1uX1JOWmBbV1k7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaV1hVVFdUUlhYWVlZU1VPSkdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEpIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e319fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTFFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3c3h4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4OTo/Qj88QUJBQURFR0tGQ0hIR0dIQ0Q/Qj8/QEE+Q0VDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbXBvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkFDREVJRUlKTEZJSUdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Ojw+Q0E+QUNERkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01RSUZGR0tOT0tGSElGRURFSUpIS0lGSE9LQ0lMS09MTk1PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87Pj5AQj5AQURHSkVJRklIR0ZHRENCQUFGRkNCQkJERURHR0hGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JkZmVkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2RlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz0+Oj46QEI+Pz9CRUZER0RFSEVERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUUlBST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGVoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUNFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtMS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSEhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVVRSUlFSTE9SUlFWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAREE/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSkxISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTVRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydW53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNFQUFFR0NISElIR0pHQ0dKR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05SUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSUpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bG1wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3Bvampub3Byc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExLR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR4a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGptcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmtuaW10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSEdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTUxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhUkpKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZER0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JdZGNiZGNmWFFWVFFaV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlhUlFfX2JiYGBiYmBjYmFkZGJYT1FQUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSUhESEtRT01NUExMS0tISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdTlhhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfkpORkRGRkhESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU1MTUhLQURBQ0RHRENDRkdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU1BLT1NSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MRkdYTEdISkhHTUxRUEhLS0tLTU1VTk9KSktHR0tQU1NOUE9NTk5OR0tGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiX2ZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVHRkhFRUtPU0lKRmBTSEpPSklPTVJRTE1MTE9SVVJPT0lMTkdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1fYWdtcGxfcHd0eIGBgoODgn59f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVVMS05JS1JYV1FOTk9NUVROT1FPS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ9e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTkxHYF1HQUVNTUhKSkdJT05NTUpOVl5ZVUxRU05YWk1TU1JNS09IUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh3aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFaXWJkZ2lpZGdiY2RsbHBwc3Rzc3N6cXJ4Ymx1Z3J5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQTk5PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSZ3F1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWVVNVVlVZVhSUlldU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxfdnVraXV7em1+eGt8cFxeXmJbXmFkZGZlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ21tcn1rbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVVRUYV9QTk1KVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hXWk9TVVdYWFJeWVdeV1VQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxQSUtMTE1LSlNRTVFRT0xWVVRQVFVYVVpVUVpdVVVUV1VZV09PS01WVFFOVVNOT01MUVBMSlJRS1FNS0xQUlVTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVVNaUU5TUlhWVFlXVVpWVFJWVFRVV1hWXFldYF1bWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FQTVhXVVRVV1dXWVVTXGBWV1ZZVVhSUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlZYWlVTUlhWVVdbWFleXFVYXlxeXFtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZnZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1haWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFVVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXF5eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthXF9dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hVVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtbV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX19UYVxgYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF9jXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BSUlZbVldXU1ZaWFxdW1tdVlJNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgX1ZhW2NiXWFkXlxiYWJeY2ZpZGZdW2RgYWBgY2VfYl5ZWl5bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdbVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVE5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV1lZmlkZl1dZGFgYWFiZGBiXlhaX1pcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pUWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJWUVlYWV9bWlRVVlpZWldYWlxXVVteXV5gYV9jY1xeXV1lYWFmZF5eZGNgXGdkaGVkYV9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFZZUV1VVllXV1VYX19hYWBjXV9VXV5iZWV1gXpoV1hZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmFbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWF1aW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZWllVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWFdZWV1iWl5XWFtcW1xcW1pcWlpfX2BgZGJjZGViZFphZWNmZmVdYWJgY11iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hWWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peV1VXV1tbX2BcX1hZXFxdXl5cW11ZW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVWW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWWhoYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtbXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1xcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlYVFhdXV9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ19caWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1ZYT1haXWFjZmZya39KWVdcWlpfXFteW1hdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXWFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6e3t7e3t6enp6enp6enx9fXx8fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJiJDM09LS0tPYWiUqKioqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISDhHhzc3Nzc3N9hISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9e3t9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en18e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoGCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1naF3cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHd3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWobKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI6gr6Cfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ullqSbm5agn4Z/fn1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkIeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eZl5aYoJqdnZ2ZmpeQiYaGh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5GQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4eLh4KCgoGAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Pj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4GAgYCBgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4KHiIKChIODgoODg4ODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDgoyRgYGEhYSDhIOCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOBjpuJg4ODg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGOnaGloJGEgoOEgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDg4uSj5mmpZeEioiCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4SGj5SVkpigoJiUhoOEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/fn+Ag4SDhIeYl5uYlpmYmpOGhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhYSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWDjJuJjZmZlpSTjYeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fX6Af39/f3+AgH9/gH9/hoSWmYB9kZiYl5WPiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGhoWDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgYKBgYGBgH+Af39+e3qAi5+hk42am5eVko2JiIqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoODgoKAf359fX19fn58e3uVo5yboaGfkIKKi4mIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCg4OBfn19fn5+fn5+fX59fYGTlZagoZuUh4mIh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58en+PlJmbmpqVjoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoODg4WDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoOPkY6Vl5iPgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OEhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KEhIKDg4OCfn1+f4CAgYB+fX19fX59fHp7e4aMjZGUloV/f3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB+fX9+fX6Ag4ODgoKBgX99fX5/gICAf319fX18e3t7enp6e4mNjZKJfn9/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359fn9/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f46OlIqCf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9+fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5g4+LlJSCgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl6h4iPloeDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goSNh4KChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYN/goqEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoODgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5ent9f3yFkYODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4KBgoWFhoaEhIWFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7e3+CgIGBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl4fH1+gH+Af317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn5/fn5+fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2Njo6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fXx8fH1+fXx8fH19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af35/f3+AgH9+fn59f4B/f39/gIB/gIOCgH+AgYCAgH9/gICAfnx5fH59fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXt9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foKGiIeIi4qLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fn6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fX5+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgYCAgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6enp7fH1+fX+CgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYCBgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fHx7e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoB/gICDgX5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4F/f4B/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fn99foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Af4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWEg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDhoWBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgIGCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoSEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf31/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398f39/gYCBgIB/fIB/fn5+gH59fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GBgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH9/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GBgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXx8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f359f36AgIGBgn+CgX1+gX9/gIF/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9fnh3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgICAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgoKCgYSDg4SAgoOCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6e31/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Afnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnd4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYSCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEhIOEhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4KDhIOEhIWDhIWGhIWGfYN6fX5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHem19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4WGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1+fX9/fn2AgYODgIKDgYKEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4aGhIaGiYiFhImKiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYSBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4eFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEhoWGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaGhIWFg4aGhYaFhIaHhYSEhYWDhIeGhIKDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaFhIaGh4aIhoSEhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiHh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx8fXx8fHx9fH59e3yAf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4aHhoeFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fH18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhoWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGiIWFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYGAf4OBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgYGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAhICDgHyBgH5+g4B9f3+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhoaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhoWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl5enl6e3x5enp6e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIKFgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhISFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKBgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYOFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIB/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fXx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpYGRTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29zZ19fX19fX19fW1tbW1tbT0tLT09PT09PU1dTU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIob+9vb29vb29vLy8vLu/0tLS09PT09LS09TT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTTnquqqqqqqqqqqmpqamosNLS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N9sKurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJehbOvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy87S0tLS0tLS0tLS0tPT0tXT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/O0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0q2Dg5XP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StpylpMqbvLiZtbOgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ6zpo2BjcaemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1mKOKq9a6mKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaqu4qtq5ulsZmWsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o5GNpZyWp5CZhJ2To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uWoqi0qp5/oKmFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlmavP2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlp2nkaGenpmolpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6ScuKSro57DoKukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNmpj5Cs18KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC/1tLVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRDSTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD46OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6empaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTg5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Oz06Ojs3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCSkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qampmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7OTo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6enp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1BThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFZQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5MT2OGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn9rlqWVn3+Jf19yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3xuUnWcjIxZcX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9Oz86ODw5OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndYT0xxlIaCS19wcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULzA9eId3d0BEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVNdSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI2CdU9tjnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueKCjmpVlTGF4bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6j6jRopqzqFhMrJNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Kihnd+fXLPyLCap69rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urY+Gg26RzLuUk6SWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBDQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0taCIeWRYn7a9pqeaiHdrcW94eXt+ho6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SQc2ZSRIuVhoaGfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yvpJeIdFlaUURpeGtudG5rZWVZV11YXGNqamlmYWmKtcHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmnnZSGcl5RVEtEW2VeY2plYWBoWVRYU1ZZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vIt5R1ZVVQT1RIPl5sXl9lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWJiaWNgW2NfV1JPUFBWgLS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVtfZWtlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9HXmNiamBaWFdUVneat8C7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVWZhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pdn6JVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4OQl2+qycjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2V9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI5+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSVSnvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjkN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveGRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwHlSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urJwY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGhfXNrrcjFxL/Awb/Lx8PAyMC6wb/Ds7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLltrM69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMK1rK60tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM60doCzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5F+wMTDvry/u7u4tsHCtcG6gKCwrK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iaCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJWcpZahcK7JxMC9v7mzrrK8uq7BfnCiq6asur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xauIfHaLoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLCipXKly8K/ubq1rqWss7CppFSAlqGepa22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4h49vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/GdoOqnppkp7+4tbKxra2fpKanpYhJg4+ZmJmfqa24q6qqnqSppKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3t5WMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vZCisqujcquwqautq6OooJ2enaRvSnuGiYiFj5uoraOio56rr6Gjqaihpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU5AUnhxUElJS2abgVlFUq67sayzr66srba2srS1r6mmn5qbnZ6mqJ6gqKmfoaeWm5WnemJubHuDfoCIm6ifnp+huqSlnaOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSl9JU45gY2KArrWqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn52olJqVoLWeg36NkYuDenuMmZ2cp6qSqpyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx8ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOeeE9uS0tiZXRzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaWlcPaw7q2oZGMjIRza3qZn7GBm6uhn6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx49XU0lkpFxlfm9yXVBrY1tkX11rj7SwsLispqGcnZqUmJqZkI6RlZGMjo2TmaKcl6KYlqrh3dXV0bmhioqLdWZgjryhcqquq6aisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemZ29tbK+w8TBsZSAeGxpYY20cYa3uLawp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnZ6WnZesl09ag6O3vLaif25laGlygV+qur2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmZ+ZrGZBUlp6o7K3qIJoYWhxcGCBx76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqioKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhshp+ipJtsb3tqYYOmrqZ/Zmh5iIx+s8fEwsfBwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbG+NpK2NdHyilWVmlJ6ZeWh8kJ2iqcHNy8bIxMXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qdqKxiHKPuMWbYnuKhXRxiJShpaW40czMzc/EzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm2Fn4VphLXXl2psdnJ4d4OQm5ubttTT0s/Sw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Buc4KJZmyntWh8Y19ldHB4iIqJiqfV09PR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzc/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfX2FgXmBgX2BlbXBwbWptb3N1gGheg5iKg1lMWmdicXhyamiX1MzV1NHKz8zT1tLR1c3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGBeYF9eXGJtcm5tcHBycnZzZ2lwcWRYUFFXWGFiXFdLp9DJ0tLOxs7MzdTLztLMytbW0MzQ08vM0NHTys7R1dLV1sq/ysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PDtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltdW5lcXNyeHBWT05UeXdVbsHAw87Ox8XHzcrRx8rNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChqKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWpzX2V8hoVoV1pOVqCWZZu6trvHxcHDwMPIycjIyce/xMvFx8rMycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrHyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYW5xbWlmZ2tobnJbbXBvWUtdXnmhiW2gsa6twLm5u7m4wMHBw729uLy+uMPJxMbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpaWt2d2ZgaGBGZmJ3gW9el6qoorSxtLOysrO7tLuwtq+zrrG6wbvAxLy/urSyur7AuMe4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhoanhwU2VuZF1XYl1MWpmmopimqK+rqauosqy0r7Gnraarsru5tcK5urmwqrS5u7PBua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmdseVlSaGNFS1pTPl2Yn5qTlqCmq6Kmoaqoq6qvoqWeqay0tbC8uK+3r6ituLSzu7ezvK+4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5yQkZFRERGU0lelpyTkIqbnqWhoZ6kpKalrJ+cmqOlrLKwtransKunqrSrs7mwtbWttrmysLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbWYzNUI9NUdDbpWaj42El5ydo5udnaKkoqadmqGanqqurLG0o6ipqauspLS4rLavrLK0rrO1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVxUjE6NC84Ql5jjJaNh5WcnaWcmJujpaGjm56fmJitrK2usaCkoq2rp6G1sLGxrKivsqe6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZ3BQUT8sMSskOmullYmQmpmcmpOenqeinJ2mm5qZqqausKmboqK3qaGgrqi1qqanrbCkt7Ckt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFgYV9fYGJocGhKMSIcJkpJf5aLjpWal5ySnJyko6GkpZ2bnqWeqq6ln6CitqehoaKos6Klp6WvpbGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSlpiYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV5fYWppRzo0LzppfHCEi4yQnZWck5icop+po6KioaKhm6iqo5mdo7CpoaCdpKqeqKKerKyqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKWoKKkpZujq6WipKqkq62lrrKppqWnprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFlcW1tcXFxdXF9ia0s1QkJSfYZ3e4qLi5WVnZeXnaSlp6WppailoZekrKKUmKStqJ+bmJqfnq6ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJmNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmZjVVhsbXyBeoCCjYmRk5yblpunpaOrqaauo6aXnaqelJSjp6Wcl4+OmZ2tlpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkI3NTg4OTs5Ojc6Ojc8PTo7Pz46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganBqcGV3fXiDfY2Cjo2RlpOZpJecp6SkqZyll56jmpGNnqGZlpaFhJGao4+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1daXWFnX2NecnhzfHSHfYeDjouOmZ2Llpmhn6GXpJSfmpSMhpiZi3ONgn2NlpaGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQno6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPjg0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaFxeW2x1bWlHUmuKfJCBh5eSh5CNnZablZWVko2ViH+TiV87V297i5OJgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWFjWlZocGVIOzp7kIyKeIKPiICGiZiLlZWJkYaEk4V4iH9gSlFud4qRg36EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiVhJuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTk1NVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZT1FTU1VaaGZcZG1cXVNNioCPgm95gXx4gYmQf5CZi496hI1+dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgoJaen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBJTFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXVlNVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5obWloWWuDj5SLjHZidHtydXuFjXqCmJJ/cIWNenZ6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlFPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6epsK+xq7u4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVJPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWFnY158nKC9fG5yXnZzand0hY13eomEbmuKkHdzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqTg5aWmJqQk5aWmZadloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNT0hNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqyzv6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRV1hXnX5bk2JscmB5a2l7doeFc3+Fg3Jrl49ycntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPzw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlQSF+prZpqdHFneGhtfn2BfneBg4N3cJ6ScneAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhJRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozk/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz4/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlJDSH5teHV0cHlocoOEeHqBgHyJe3Sfl3h9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkVMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqWRoKugsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4FzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSUtNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUEhie4F0gnR2bXiLh3Z5hYR7k4R1npeGho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtMTU9XYFdsWFpbZISLfo17fnyAjI57goWNfpeSgJ6flpOamaWtkpm7saa6x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdnVmf5SOhoiIhoeHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOV1JRSFBKRE5HQ0pEQ0BEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi8wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hFQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9he2VkaW+TkoaTjI2GiYqVhI+MmoidnZCgqKOiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcoiglYaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJQTkxMRklQQ0RORkJDRUZDPjo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITEtNTlJea4Z5cH14lpSSoJ+clZySnpGZm6WbpaidpqqoqbSWq76rtcfItsjQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOhk5eXgZSee3eVkqqyiIyWnnyTnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktPTklJTEZHTUNITEZGQ0JHRUI7ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTU5RWWuCjHSPhZmfoa23s6CpqKmkprGprrSvr6u5sLK9m7LDq7nJy7fDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGhqqCkqI+csYuVo6a3upugoq+SopyhnY+ioauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSEtGSkdGRkhBS0ZERkZCOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHSEQ8Pj5GSENEQTg7PDVDOz1GS0lGSFFOUFd/j5uBqJ6qo6q6wr+nsMK0qrG+sba7s72zwLW7uqK4xai1yMe1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6or7a6srqssLWisayxtbu2tK20n6anoqaZqK+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFRQSElJRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtLQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejKCqoK6uu6+yu8jFs7nDu7Kyv7W2wLO9r7Z0sLOlusSjr8a4sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uKursKSvqKy9r7y6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxQR0NISUFIRD4/QkJMQD9NRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1hVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+XkoeHe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVFZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZGrs7G3s8S5trnHyrm6wLu2tLq5tbyzubHFYHSxpLGanqq9qaWoq6qjorK1oauon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbCvtPJydPGw8XMwsrDwL28vru7trSvuLa2wrnFvcLHr564qaGrjaSntYiBgXRhY2NfWGNgamdTWGBWUlVJRUVNSkE+R0Q9S0E9QkA9Rz47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6DgIJ4e4uDh3uLeYGKgpd+c316a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr21u7PCvLe2yMm4tbq1t7iytrOyrbW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzcrGv77BybzAvMDAxMTEyb7HzbKjurC0rpqrt7uYgHxtX2JeWmBjWmRjUVtgU1BLQ0FFRkU8QEY/QUhCP0M9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpKGiop+iIaLkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlmamppYGZpaWxabXOWraS8iIZnXG9nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XErrawubqzr8LFtK64sLC7q7Kwpaq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTBydC9ycnKydHGzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0BDPkFHPz9BNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhY2KiYqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYBwbWNpbXB4aXd8fsu+wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZastquypa+0qau7v7CqtKakuKarrZ+rtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1NDU0c7Hw9TRxs3S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5EQz4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFkJCNi4mIkIZ+gntxfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafYuxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hprGeiKaak5KRiY+OiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI6PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyIiIuIfoJ4c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlth3Z0bn12hHR4e521jDtBisWlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCon6Kxm4WekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19bVFdSXFdGR0pJRUU9Ojc6QEBCOUdEP0RDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOgoeFh3qEeXF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6gq5uhmpiepJ6fq5mKmouQkY2EfIeHg4WLjp+Zk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09rb1dDa2tHWyNTLlnx+a2tdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPD9BQUFEQT4/Ojg3REI3NTU0NzkvNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36Fh4B3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQgomOlpmWlaSbl56VnZKRlqKdmauVkJCJjJGCjISIiIGFj5Gdm5mJhYuBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnKmmpq6fqLa/wMG5yMrOzsXNydHW1dXZ1dfb1NbZ2tvX2trZ2M7bxoh9fGpsaGJWWVdXTkxFTkM7PT08ODo7PTk9QDY9Pz88Pj09OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV5hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkYSIipCSk42cmZKTj5WMi5SenJSglJCNjY+Lfo+NjYqDiJKWmp6eiIuUkZ2RgYt/pZiIhI2ChYSBpYaKjLiYnZGVlqKnoZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHtubGhaYl1UUE9JRExCPDw+OTk7Ojk5Ozw2Pz0+PD05OTs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SLhoeLkpKLk5OTjouOiYeVmpyPlJaQipGThoCLiJGMiomclpiiooaSnZWgiomIjZuQg4eOf4OHhqSFjJGzmJ2SlJehop+akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amlfYFpVWVlDQUlDPz4+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs6OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIyRk4iEiYiFlZmaj4+UkoaTloN/j4uZh42QqpeWoqKImJ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZSdm6OztKajvMK+x8bFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2dhYGBRS1ZcQkJHQztBPTgzNzs8Ojk9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJeFiIiNlIuKko+GgIWGiJKYlIyKk5KGk5eGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmoiKlo2GfYyYn4qQkJyamZOZmKCUoJ2Vn5uhsa2jpLi/tMTHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBjV2NYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzUyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvcox6fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqmygomJjJSGkHyOjXyDhY2PlJSIh5KWi46VjYuMl5iRm5m0lpSqnYuclJGMkJKLmJqJkZ2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxgXVZiVFFHRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra69q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY55gYaQjI2bh4eNloyKlJaTkJmWm6easZmQqpyOmo+RjpWQj5WWjpCgkIiUm6OslZaPlJyelKCdm5ifoJWbn6enpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKd3ZlX11iXk9MQ0xARUc/QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFvfnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrmywa6lwKSrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeYOMkI6RoIuLk5COh5efl5KYlJaloK6cjKmcjpaPkZCUlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1eHxwX1tfbVROSURMTExKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompuYur7JyMrC0snLws29wbOtvL+nur+9vMS4rMGprbO8vaqwqqSlo6yutK63taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmEjJGQnZ+RjpKKjouTopeWmpSToZ6pnpCkmYyPjo+Vloh8jpWSkaKalKCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsG/mnF8ZFtaX15MTU5LR0VDSEFBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGaraekmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8TCtra8rbS/ubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY58kZV8hpCYj6mYl5KSjpKUkqSckpyYk6ChoZuYnpeKi46OnYhaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RwcV1bVldQR0tUTks/QUdEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCTjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7bEvre5t7OytbO4s6ynnKusuaupqLCwmKOupaikpbXBsKuttL7DucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZaZhI6WmYuwlZmZlJGRmZikopSempWZqJyaoZ+YiYuOlJxfSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcmhfXVFSTEZRUVBRO0hKSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnaCao6S1ybWpx7zExMnLycjMzse+urOvurjAwc21yLvBuba6sq+vs7SnpJyrtLWrqqaurJqkraalqay6v6irt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elm3W+n4SZnY6SmJqLrpagm5qWlJqen6idpp+ZmamZoKadlo+MkJyCbXWSopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmljYlRNTUdJT0pVTD1MRE1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOtlKOktse9tMG7wsLIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypra2xo6OZqrW7pqqnrKqdqK+opKuqvruorb20t77HvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCYlp2djraeqJulopqboJmnpLGgmp2lnKepnJeTjpObipaJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobO0u7atqLWysp6co6Wal5WZqqGeeGRfYWBMSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Sol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/uMHCwMjEv83Gu765srC5tL7DyLbAsLy2urenpKusraGhm6urxKKlqKymnquvraKqqL64pq2+sLe3x7e0uLi+sb7AtrSyta++o5ajlZKak62fkKGhpKKinpC+pKidqKucnKCapZ+8opejnqGoqqCclY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWlmpersbayqqWqraycmKCgko+QlqmflGlmXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqrO2xcO9wLa/wbzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaquoKSprbCipqi9taWxvLe2tsOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonautmpqdmKWfvaGcpJerq6uloJmNmqCSnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXlo6io5WQpa6yrKmioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgm7Gnkqqjn6Oeramsnbuxqay1scjEwcOzwsO9x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKqqm5+moafCrZytsZypoq6xqqSovbemtbu9r7fErbOzwr+yxrO6t6u0tq2qoqaVlZOiq6Gfn5mnqq6ur7uxpZ+pqZmYl5Kio7egoaORrq6rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilo+OoKGTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTHv8TDtb/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksq5ihp5itu7ScqLCbrJ+utLKnqrqyprizuLK5waq3ssO9tMWnvq6tt7Wpp6yhlpaRpaOhoZeXpK63rbG0tp+eqKSZk5STo6C2oqSlla2xsaWopKGdmZmalZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaWoJWMkJ2ek4upqauhp6GanpaNj5mQgoaViZWfemVrXmxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i4xb3Dx728w8LIwbrBxsG6qralrbutwcO4uKqtsryjla2wrrOXpqiRqrmqoaewnaqgr7Szqqq2tay6q7OyuresuLDBur2/psOqsLauqaurpp2YmKqgoaCRl6CwrrOqsLiZm6mfmZaRl6agtqiloqKvsLOrsaern5qfn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl52UiZGbmZSOqamnn6OcmZuTh4+Zi36Nl4aPmmxpbmJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qisLeppbSyq6Gttb2vs7i8u723t8HCv8nDucTDwcC5xb3BuK+2qKu3sry/v7Sqr7K4n5erramumKmpjqe7n6Wts5+rorGws6yqtbO1u6yvsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqmyqamymZ2nm5qUjJ+mpLSup6KsrK2wp7Krsamim56opJ6VoZmcqLapmJqSkp+Zn6Ggkq6hm5qIl5mMnZqdlIuPl5eal6amo6Cel5aWlICQlYR7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjY+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKikrq21qa+zuaansLfGt7G3v8HCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5iYqKurrJyuq4+rvZ2rrrGjqp+xrbOurrWxubeqra+yqLavs7q8ybOqtbWxtLCvp6Gzn5qorKCllZaambGiraClr5aipJmZkoyipaeyqaGmsauptKWur7Ouo5meraebl56amay4opiTkY+YnKGZmJWuoZ+WgpWZjp6dmpeRipSTnpqlo6OgmZeTkpZ7jJGFe42Lg4uTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWNUaVtNXGFLXFxaUlJSYmFMS0VgYWFRTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe8w723v7/BuMC9sr2uqLq5uLfCt6yusbqWl6eurKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6ssqe4r7WzxMW2qbW1q7Cuqqejtp+fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Cnra+0rKSYoayonJydnJSquZyVj4+MmJ2imJGZqKShmIWUl5GdnJiXl4mXkJebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcS09kXT9ie0dJOEdoV2VbTV5iTVlZV1VYVWpdT1BIYV5fUEtHUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNyakxFRJGZpK2krK2qpqKwsbKqt7C1n6u1ucm5rsG8w7izsrXCw87EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysKuoqLW6rLWytau0raqrqaypua2ysMe/uKW5sKmtraaorbGlpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayuta6inKOoq5ygmZuSpLWaj4mOiJGjoZaPlp+jl5WGkJWUnpuZl5WImJOVmaecoKCNk5KOkXh+j4V9fH2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpNblhhW05hYk5WVlZXVVloXlFTTWNaW1RLRk9UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2tASEmQmqipoamwpKejs7OwtLWwsKCrrb3Mu67CvceytK60wsPRxMW/wrO+wsO8v7i9xaitt6y0uLzAsayyraKkp66qqKWxo6qxqq6qsa6urKuzu6e3sLKpsqqrpqWkrrqsqrDCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnaGnqKGspqOtrLawsaCpoqCqrbCsnZ6np6mao5iZkKComIaEj4uLn6GQjY+YnpKSiIiSlqGdlpmWh5eTk5elnZ6djJKQjop/f4iFfHd/h4WHdXRyiXdsX1lfbmJRc3FcSzuEfEY+V3VXYVlPY1xOVVZVV1FcYl9TT09oWFhXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTg7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8TDzc7Dv8CzwMPEusG0ycSsr7eus7rAvrSurqynqaqxqaapsaa0raqvra2xrrKttLult7OsrK6oq6CjnrG3q6qtubaktbWkqqesrKqtoKimp7GxpKeloaGslqqhk5ugpp6joqqjrKKeprG2rKyipaKaqaquqZyhpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjpyRk42Fjpmlm5OSm4yTkpGUo5qcmouPi4x8hoKCgXp1gYOBfnV3i6KHeGpeX25mV2WHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPalhWVkhKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+YqKittaq1saqlq6qpvcDAuLq0vLWms6/EycvSv8G7uL+/w7rCusHErrG1srS8wb6zsa+trK2nt6qlrbCruK6nsK+usau1qra1p7S3q6ykqqqcpJ60s6iopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqqiqZ+tm5GqoZ2gpKKmoqqenKa0rqelqaKjmKSmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyRkZOPhYiWo5qOjpuSkpCPkp+YmZeNi4SAdIeCf354dYN/e3h+f4idj3BxZmZwd1xhdIhqT12YVkhteVVkVlNkUE1VVVVRT1hbYlZJUWpVV1RHT1hVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OjcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVjK+gpKqsmamjra6ytK+qpK+pqLu/vMGysLmtoravyMfH0MC/vbq8w767xMLAv66ys7O2vbzBsbK0q7SppbWppa2zsriuoay0sa+xuau5rqqut6uqnqqroKOhta2ooZ+vsqG0qp+op6qiqqGhrK2ova6rrq2hp6ifrJmPsKKYoqCop56nm5mpsKmin6yioZKhoqKnmZmpppiYmZ2Pi4eViH2OhoSFpJeGg4SNh5CQkoWGlqGXiJGdkZOQjZGdlZiPi4aGeHSBf310eHqAe3V0e2uCh6R2aV5la4B1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj42xoKSlqqOkoqyms7KxqKSwp6q4v8G9sam6qqetsMnGx9DDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO0pqarsbW3saWmubSttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaq6eppKidoqmnqb2rtLCunamkoK+cmrOilqSbpaSfpZqaqKqlnpqpoZuRm6CknZmWqaqRmZqTkIuCj4V+kIOAiJ+Ph4F/jYiSkJCFgpWblIaToY2UkYuRm5OWh4p/gHJ6eX17Z3Z8e3Vxcn5qhnmFiGRfZ2NyhXttZ3ldXlZCV3ttVGJQUllLTE5wdF1JWltoWUZWZ09DPktPRENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6RsJifn6mkoqGrpLaysaSpsKatucK9t7GkuaypqLDCyMjMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yis6aqqq60trOom7m7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Wwpq+gn6qpp6Gpm6OooK28p66xrqGqoqSunp6tppifmqGim5+bmaOqopqZo6OVlpSgoZablqasjJ+Sj5GMgoqAgI+Be5qVjYp9gIyHkZCNioWTmJGGk6OKkpGHkJmQlIGIfXpsfXZ4eGJ6enJwcXR4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlqyYn5eno6Gfp6O3r62ir6+orLjDu7SuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLSmqKmvrbivp5e4vKOtvrS0oa24taemqLCzoJ6lpaegpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynp6iam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjY2JeoSNhYuOjYWJk5qOiJSfiZCVgoyXjZF8hXx0cHxxc3NfeHhqb3FxcGuAc2R6bGdlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaOgtquwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6e0p6eqr6uyr6SXu7Wkq7q1r56xua+ppaevspyhpKCko6CWm6+loZ6iqK+hoKGSo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3uDiISJjY+Fj5OYjI6VmYuPln6Gl4yPeoF7cHJ2bm9zXnh3ZWxsbGtqhW5mcmlqZWhdZHOBYFtrdmlaSn9eW1hPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZaUm6qco6GiobapraC7t6WsvsW0sK+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGpq7Cfmb+0pKe0taiesrypqKWpr6yZoqecpKWUl6CxpJmepKmpnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo6Tk6SopJCJio+GeoR7hIZ9nY2Ki4d7goWHiIqShZaSkouQlZSOjZR7g5iPi3d+fGx0cmxrc2F3dWhoamhncIZoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSnmZyenaO0rKequranrMPBuLGso7aup62ut8C/vLLCtrCusra2uba2raq9s66ysby/t6+7u7Gln7WppaSzpqitnJzAqqelr7OqrLW7nqmqq7GlmJ6qnaakkZilrKGYnaSpoZuhm5afnae1prCqrqGhnZ6hlaCmoKKgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqaCSiYqLiXmFd4GCgZ2Hi4OJfoCFiIeGkYSXlI+Oj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBY2VmZmVqaWNrcltfWV1sZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ysoZaWoJaks7Gisr22obHFvLuysaO3rKqtqbi8u7qtwLGurq62r7O4s6mrubGvrrO2uravuL2spp60qZ+fr6KorZuhv5+wo66xr7eutZ6tr62topmdp6mln5Wap6WfmKSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjZSUm6qnjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko6PkZeOkH+AjY6Db4F/ZnltZ2tpZnBya1xnY2N0gWJmZ2pubGdqamhuXWxscnBgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QTEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42Or52Yk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rLuurKqrt6qzt66msrWyrqmwtraws7W6pqmftaecnaigp6uap72XrKSusLa1rK2fsa2wqaKbnKOrqJuUm6ajnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqKQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiFa4qNlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbk1QaWNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIU2FwdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCwwOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbmpOgm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrC5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7KpnaGjmaSlmKu5k6Wlr7O3ra6lqa6rrKWhnpyhp6ablqClpJubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2io1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9h55zho51m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWV5pW2xsW4hybnpyhWaGhFpfR04/R19NRVJWVlFRUldVZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnZiYnZ+qqaeqv8Ovsbq8tsC/qqW3sKispbK0rq6ytamopbCtpbSym621trWmp6iysKyyp62dqaCwp5+jopifoZqss5OjpaW2vaatp6uqrKiloaCYoKajmZiloqOYnKSolpOim5OSo6WmobekpKCjmJWTl5OciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGcxnl4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ucxXpytae6kHuAbZaxq7B5aGxYsa5uZWm8krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVONXVdbUUFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK9srXAtba+wauntKysqKaus6mvtbKmp6W0pae4rZyzsrarpaSnsa2ssKaqnaajr6Kgn52VmZ6crauTnaKfs7qjqqmira6loZyamqKnn5eap5+el56mp5GcppmTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9bKGQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5xZ6aLdbFqe7F4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaYIyraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TopPV1cvSVRTSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTAzLjMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqiosK6jsLmuo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+aoZuWlJaamquklZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuXi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlGpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6ye1hYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozk5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaeyrKm7tsKwu8GtuLe/qaytra2lrLGpoK67qqCns6yjq7SjprKyp6Oinqeqsaewp6Wdnp6ulZ6ZlJSUl52soZmZpKi1r6Kqj6qoqpudlZegpaeZnp2jn5ufo6WjlZuel5mcoqmbppqcm6Kgl5ORkpOdg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5d6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITXFQXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7Cvoq+ypZ+ttaiap7itoq+wn7O0sKCknp+mqbCotKijmpydqpWYl5WVk5WgqZyZlqetsKmjn4+to6iWnZaboaWfl6GhoqGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZ5RRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdKOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsa2jq7ytprSmp7a7vLK6vra2tLm4sqS0sqCwsaKeq6+jl6a4raSxsJy0t6mgpZ6hqaSxp6ypo5mamaedlZOXl5CRoaaflZOlqrCmopaTraCmkpSgm6SlnpSapaehmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZqFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZlaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kes6yfn6irnpSntauor7GqrbOjm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZinpKCUmqWonZyknq2doZyfjJOemp2gl5mblpeioJSXj6adhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5Vtkl2rW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVzdKm5ZYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprBq5e0wq6rramltLC3sLW+ubmxsLS5qLqzn6+knaSmpp6TqbCpr6m0q6muoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSWpqqnlJipp52eoKKtpKGeoIyUoZifn5Gdl5yVnqGVlo2qnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5ddrWBNoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFtSPj1ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r662tarAtaipoZulo6Gckampp7WisqetqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSll6OsopGWq7Gjn56mq7GZoaKPmKKWn5uVnJahk52pnJSPqpmH1JKau3Oww4DDhn3Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdYeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1lcWkNAQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6Keo6Gcm5Coo6qypLSlrKSelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJujrZ6RoKirn5qfqKO0n6KkjqeilKKanJeVo5iQr5+SlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfYeGjIeNfIqHjZh8pLu5vZx0ebSjdHeXdnSwdZmeZodqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlFNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc5Kk9eXT0rOlZVJz47PKeeoaLApZa1w7Ssq6isq6m6rrDFrbOyrbams7erqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZKcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SqoJGtnpeknpeXl52ej6+ok5uloY1qfWmbpXeGcn2ajnR5ZId7vb7Aum+Tg3KWiGFza1pem4lgY4iPlWtggJZkbp53Y5ZsgJqVlGVeYGJwmYhpcot9hpVna39ydHh9f2Jbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TEVYXWdhTFtXZ2NfT1ttdGlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU19WNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaWfoqedo5uZmaumrqOktKilm5eUoJqlrai9p6iklJOblZ+ZkpekqaiQnpGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6KasZuUp6CWlJ2fnZawpJegp5ibkJycoaGXpKGZnJmZmY+VgWdtfXF3kpiUkoaMtquNhpiVjoqMmJaHlJWLhJOUkomOk5SYlJiWmZ+hmZqToJyNgnqlhW1rfZB9gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1fZF1waE1ZWmZqYFdab3htbWZVUEZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAp7OgnaSknKOVlZ+qpqyio7arn5iWlZ+XramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWnn66Yl6edmZmgnp2cr6CcoaWUlpGXk56flKGdl6COlpOKio2Ol66QfJacg5KCi6uphYCZl4mEkJ6IeoSQiIaakoiHipaPm5eNkJedo5WYkpCcjX+OZ6Gzr4WKhXZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCanVkemZgamVjZGZrWWx7b2lrXVNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXFEwNU5bMTdFNFtHNTwsQLSgubC/rKyvsrGgqqayraKss6/Er6mqorGtu6Kzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqaWjq6Kvm5+goJiknpyenK6jmJ6nkpaVm5Gjl5annJqWZYKSfGV+jZqQY3mObWhre5Klq2plm5h9Z4aKZWVpaHuOoo9saI2YkaN3a2qKmKKel3NrbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8aodZXmx0ZF5ziWlrfHBrZF9STlhJZFhBSjQ+Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCeq5afo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmllXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKqgqpunn6egrJagm6Wvo5abqZSfm5mRo5WcqZedfb2DiHK0coSdhq1oeLnEuHGUo6N6ppmZcquCfMvAwLtxjKOIg558l5mJncC9gZadnYycwcF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bXiUY2dgeGRgZYJiXnNnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+qnquYmqKfnJqqpqGcq6KkqKOktKScopKlrau3s6euopGQmZylkpGfoZiboJ2Ip62lq67AwLGhqa+plpKfnaKZoqSqo5Ogop2era+qraejo6ihpaWdrKiRo5qorKmanKebqp+UlqOUn6GVm3/OlHh6pIF5lZabX66PXo6ogqOhfKeWm3Org4CvXmONqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGBybXBoYGB6ZFxxZ2lkZ2BSVFNXXUtPRDVBSEREOD42O0A/QTs9N0A+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qiq6auqp+mm5mll5yir5+gnqinoqWgn7Crmp2Vpq6ssKqoq5+UkZqfpJKPnqSXnqejn66mrLGov8ezqKmxrpaSnZyhl5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqShqqmdoqWkn66fkZill56Zk5ORl6BxhYyXdYWohnGxfZ5yrH+in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qh6KMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmSFbmF3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpaippq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZoqGSlKCtm52npLCtpa21q7rNsa2mrquWlZydopmerqycl6Canp+ps6urq5usq6WjrJqusaGnq62ll6Spp6evoJGVoqKYk5CEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ97mZeFemaAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnw8nW1L+hmaunoK+inrC0sK6prKKnpaiqq6mkpqCbpJ6dpaeno5yrmaKsoKOfr6GcmpKrpLWvrqCnmp2Vk6aikZuiqKCgpp2xpqapsq23yLK1qquplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhsq2hqbKwoZmop6yts6GRlKGllpmQe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepmVmniqyXSZpJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWap6Spq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqaq1sqybpZyglI+lrJGanKejoaqnrqKlp6qwtcOxs6qsqJSKl5ylm6GjrqWXoZWZnKamrZyxnq6pp5+so7asoLG4rp2araawsbCikpamoZiejYKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp+XiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgm9bZGBpb2NkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5ipq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpynpqGisK6dpqmjtrPFsa2prKmRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaaYr6S7raG2taycnLOwtq+wpJacrp6inIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqapJyVip99mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknKMiq2+v7y6tJ6Wp6SttaGimZSip6auqquYpqOfpaGhtqejqKewo5Sro46kraKdkJqaqrOzpJyknKiRlJaun5+ep6SdqJ22m6OrpLasxLCpq6ihjISOnKKgpqOWmZqdmZyZp6anma2or6Olm6ymvayUvK+snqGusbepsKSZp6+hppZ5qJF9fLB3ioCkpYicbbJwoYetfKGPg6iVmICsiYWthaCVqqCil4afgZqVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhnQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYGFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKgsK+qn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaWgmqWdrpiiqae3qsGvpKmjnouBjpuan6aekpSZm5WbmqalppuqrK2kpZ+pqL6klsKrqaGgqrC3qauknrKtpqiXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SnlZqBrIqEsIWmmqShopGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFumI+onIyYkpqafHqRoH9kdX9jhnh1gX1iamdxbmdmZVBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBgYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop2knpmjo6WZoaOqs6q9r6Snnp2PfoublqGgmI+RmpySmpipoKOaqa6opqaipai7np/FpqOnn6mzs6qso526q6qrlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpquRf9a9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52RnJKaoHuDk558Y357ZY9neoN8YWxma2tjUWFbU2pcQFViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaeppuaoamjmaCirK6quq2oo5uXk32ImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqup6ow6KfraKpsrKoraeeuKWsrJlzdqqluIZkiaBwaK6Ri5FubnekkJmfgXWumZRwj4txlaiknJivpHNtbWxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZqTmaF9iZGYd2aIeGmPbHuAemVtZGdtY0tkWEprWjpRZkVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epamgnaSjoJGLpZKnmaiZl6OroZedpqaosLurrJqbkpJ8hJaNpZiNkZGZlY6YlqmWoJmqo5yxpp2iq7mfr8Cmo7Gkq66vqKuppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVrKeNk5OMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4R+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpmlhImXkHRqkXdyjHh4fXpqbWVkcGVVYFlAalxIZGJQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVdZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaujn5innp6SlKOXqJqnmZSmoqWRm6eZora6qKqYmo+MfIGUi6GUipWRlpGQlJimkKCbqqCdtqOdpqu3p67AraK1pa6trqqnp7G2n6y6mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqLCXo6Cco6qenp6clqyek5qim5SQlquajpmZl5GWn5GIoZ6WlYaSjZGOlYuBfmWLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjlJ+ZpIWJm4p9c5d0fIyAc3x/am9lX3FqYFtgWm5kUWFlUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NUVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJjYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomco4+tnaKVqJ+gkpaZm66LqJWPqJqqjZmpkJ+5t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKurnSiu6GxnnZ3nqivuJN0q6OeiYCrf2RcYnagj6WfhJh9bZKznKOnraqjZZ6fknN5mphwgJipmG1/oqiKZZymnZKYmJaNkpyQhp6bkZeEkoePkJKJhXdqjoZ2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3yonJxme5uKhXmZaoaMhG96gGtyZWB3cGxraVxmZWJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVVVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urqK2YdI2fsaCoq6eUl7mgoI+cpJ2Rf4mIm56Mq5milaehnY6Wkp6Fda2PiKebqpKYpYqcu7SnoJmYi4l1d5ONlpOKk5GRlI2QlKGPnKGnmZyylYCMm7ScsoySjrqln32noXmgrLV/jY2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qInICXp4KBe5yzeoqGoZialZiWgpGXl4SbmWN7h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmEo6CJmH+VjYaFmmuPjodseXxycWhleXBqbGtcZWxrZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKewpqappZmUr8i/saKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyGj5iXh6ycopafoJGMk4mFgJKnjYejnqSVmZ+Hn7qyp52bko6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0ma2KyoeprIi2hYyvga6rgqiMppiNnX2oj3N7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVs4GhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXOPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjpCJjJpxj5SGaXl2fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U1N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJkY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+kt7Cpq6aalKCjpKylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJeWkYermZubmaGEjox3mpyPn5CInqWcl5qZh6O5raSanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2flq2PnZyckIR/oIyorIWjjamZjJp/onWBmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGmLeJnn5uYGRZg5eAjXxkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVxwjn5nWmCEgWNYUXB3Zm51c2tqcF5rcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRobW7qq6imZihoqWtr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmqmZubkoimsaehlZqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6Kgk592nJWPp4GfpX6Fp6qCpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2UdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZm0l3N9mJ+zdXRcnrKDa2NwdXdyaXBZbG1zc2ddal5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRkYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS3tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGAlo2JkKGPkpSdmH2QiY2ooYeXjomSpJWcm42Mqailno+Xh4R+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoYyfcaGKh6mHmqSOlaWofK2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXql/ebtrfqpcjoRdtGhdbnJ6eGxqXHFreXpkYWdYYkJSRk83V0NSbzVMW1tfTlpEQTI1MTw6N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ+Tnp2JkamjoJqMkoqAgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ6Oi3CSjIGphpidoaWepXuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnR+lXCadGukXpV2SGVkYXRyf39vZmFsaXd8ZWViUV9XXVVXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bF1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn56bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkaGbc5CQgYmalqGbhY+qnJuVi4uKfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSNnZx7pZZ6qYCUmo+Jnpp7p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B7e5hsnHx4mHNuqaRnYWV6coCFbGhmZG92eGhhY1NcZlFSYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNfXV1dX2hiYWllfGReZGdka2RqbGZobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoqWPpqmhmquLm5mZlJmTkqGYjoeFe3B9hGh9j4OVm4B3kY6PiW9/hY6SkmyXk3yJkpSll4OPq5uUkouGiXmDdoiAboKfhneAk4aImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmY6FgJmPeqSAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Ole3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZtud3mYapp7dphzUUV9s19qd2x6iGdraGN1dnFvV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGdsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOmjaaon56nhJuYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY15jYyXppSEmaqYjZGLgYl6gH2LeHCQoYZ6gZWHiZagln+UpKablZWDZm54nGyiZHtxpXebmHBmpoCUiXqkep+Wg5dznneBipWXj7lukYqiYn2YoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolleWmKhbF2Ii256fXNyZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVYteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNsZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fp42jopyko4GWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfIiHmKiSgaOtkYaQi4KJfoCAjnJpkKaEfYeTjYiZoI+Ik6mlnIimeJWbfqSIlouxmJ2Qgq+Xn6R1k4V4qXOlj4SabqSijJKEjYO7bn2lr4OHhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekZRffauLqnZ+foulnnaffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaG1UV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp3bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6aKnKaeq56FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlHaCh5JubIupgYOMlI6JnZ+JjJSpop+Of3STl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4CAi3d1c5R1b3lubYdsg4ZedWd3jmV/gISMqJp9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHb2poV1tgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXmLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5oa29hjZO3qKaJoKKapqOYpZyroqGEhJitkp6iipuom6qYg4KcjH+WlIeOiomNcoN8j31+j4R7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWCho6YdnKEqYaOkp2QiZ+eiIybpp6fqoOIjZWafn6Jlq2nj5Klj3dvm46BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6m3uCi4J1gYWBZ3eKhmpgb3GAdV5xiYCIjqaUhWWLjYNud4uEcYaPenFoaWZ8hHuWW11raG52XHx6eHZvdHODaF1ui2xsY1paX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWVudWhtfH53enx7eXqAgH5vhYmEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3lvaGpsYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmJiYaHinN+gYx2hYuChJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4iUioucl4SDeq2CkZialYqenYeIoameoaGjioeTm5yjmZWqoaemn5KahpSLenaNjYOnfn+TkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOGkYt8iZ6Eh4yQiYmBhYSQd3x6dJqgiYaKnYmEk359ioB/dG5yhIF9doWFiY6lkIKFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0i3F+e3h3cHh1gl1eb4hpb2BfWl1dU2hyVmRdXWJtaHZ8fXRvcGVraml/fW55gHJqcHFsZ4F7coKAeH99f4R6bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2WMh5y5npahoJiUmJmUmKShn3x/mqyPn46GoJ2MnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4ODj36Ah4SFfIeFj5yfk4isoIRzipCGkpGLnZF9jXuqhI6TmJaPnJeHh5uknqGZnIWCkpqZmI+Zpp+knJuPlX+Oh3R6ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdIyZgYOPg4eFf4WElW55dnSSooqMhZqEhIxzf4l8e3FxeoaCeneIjYORpo+Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheeoBpfn13dnd2e3hdYHF+bnVgY1tdX1JnblVmW15ia2l2en9ybG1ka2pogX9sdIJsbHVwenCGeW6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qfn597eJ+nkZyLh6WVjJmZenuNhn2JkYSMgoKDbnyAeXOBhX6Lkn1raH2Cl4mBiI17fYaEhnyPgpCdnZOJqZ2BcYuLjJKGoKGKhYx8qJGJkJKXk5aTeIyinp+dlZh+gJCamJKLmaKgo5iVkJl8i4J3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakImSlpt+k5J+h46BdXSCcXdhfoGOhnGLl32JjHKMf4KFho9oeHJ4jJiRj3+WfoiJcoGGe3tvd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWlqdnmCcmdsZGxoZoCBa25+aG9xbH95h3psjIFzgYF+gXR2go2Gf3x7f4F9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJuefHeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V+i5F4Z2N9hpeKgoqLeHyAjYN5loKWmZiOl6Gbf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnZ+gl5OWeX6Ol5eNlpqco5yXkZOZd42DgXaDlo2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpWZfpiNfIiNgXZxfm57ZIB8i4Vwh5OAkYJsiIOBgImFZnVve4WRmIt8k3iLiHt/hnt6cH13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW21lU2RZYWFpa3V5hnJja2NtZmh9gmxpdWhucGqAfYN5bZCGcoCDg350fIOMgX9+eoKDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuUh3+EhnR8fot/fZiGl5WYjaSimIBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5eempGPkHJ/jZGTiJycnqWXlouTlXGLi4lrhJePmXqHiI+Jb5eem6SUlouMnouGgZGcf5KSlYaZiHuKioF5cnpsdWx8f4t+bYWTg5V3cIOEfn6LgGVyaXt/lpeDfo10kIeCeIZ9dHZ+fISAe4GLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ2YHBsdm5vXFxgXl5rXlFeWWNhaW50e4psYGpla2Nod4duZ21pa21pgn17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZl+eK+ZjZd9n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4JyeoCHeo+SiZOSnZOmnZWCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIyRm5KOjIxthJCPkYiemaKglpSIlY9shpeCZYSYjpN6iYSQinCWm5WjlJOJi5mMgX+Qnn2SjpKMmY57ioWHc3N2bHFudXyKdG+HkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SKhoGLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3FleV5vbHNtclhbX2BibFtQWFllY2hycn+IZ11qaWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AenZxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dXSBgICgh5KLlJ6YopWYeYp/gY2InJ2Kj4aSmJaFiZWakJeMjI2Ni5uJjY+CbYmLkJCJnJahm5eUhJaGaIKhgWWEnImQfouDi4F3k5mToJOSiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0hI+Zi3F3gXWCiIN5ZnJudYCZjnuHhHmTkHl1h3NviHqEinmKhICGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbXZhcG9rcW1ZWWJhYm9YUVRbZmdjdXCFg2Nda21kYmZrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeIV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarZ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgaqUhoJ3f3Zxg3qDoYOTgpWUmZ2Tm3iRe4OMkqOZk46JlZmShIeXmYyUi4mOj4acg4+Je3KLhYqOh5yan5qUk36SfGaDmoVmhZ+HkYSRgolxg5GYkJyPkI2Mj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39hen6Pl4J3e4J4g4x9eWdzbHOGlYt9h4V6k49xeYNvdYt5iIp5iHuAio6dnIR7enaCi3x3cWpsgoR7YXlxb25zdFZfcGJyYmBtb3pxaXBmZ3N1aXJsYndlXVdmYWFzVFFPXWdlXnlwiX1gXWlyYmJmZpFqX2hlW2dwfnBscXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbGcpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFvhXRwcoRwa2l3boNufX1tdHJSTYLfyJLWk3twdYR2haGElHiXkpmdkZl7lHOFkJ6hk5SRipOclIZ/l5aIjY2HkYyHm36NgHd6jH6JjIqcm5yak5F4jHRlho+Fa4eihJGIloOGY4yRmY+Wi5eMjIqKcXqUiHuOiIqTkYl5hXx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR4gI2TmZiJfHV3g494cm1ncYCFbmx1cGlrdm9TX3BlcFpgbXN5aGxrY2d4cnBxZGB4YWBWbF9fd1FOTGJnY116cop2Xl1ldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3N/hn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amdrY6Sawdyu8KFzbHaFd4akhpNvmJKWopacgZJyhouil4iOlouQnZaDgZaQhYmPgJCJiJV9hnp0f4l3h4SOnJqYmI2OdYl1bISHiXyJooORiZyEhV6Lk5iLkImPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFja3hoUmFyaGxWYG91emFyZGBpfXBzb1tkcmFiV25bXXlPTUxlZ2Jed3SKbl1dZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPa5qRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuPi4WOgH91eIOEcoiCk5yWlJeEi3WGfW6CgIeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnGGfn9xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4eBjomBfn6RkH1tgWt3hY6EkIF7gHt9j5GOlIhtcHmMhXRrcWxzeYJhdWpwXm14YVJlc2lmU2Bxd3VhcGBdaINxdGtYaGljaVluV1x2TUtMZmdeYnN0hmtcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIdIWDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG9xeH1xlJKOiGubkIqdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17j4x9iIR6c3qDenCGgJaajpOTgId0goR0gX2IkJuehpWPn36IYoCTh4WJhYuNgICDZ3yQgH5/goyPkH5tg3yCdGxtd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pveFpTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcYBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9ycYB8fXR4hniFgn2AiHV5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB/ZWNnZ1edj19xc5a9xYV3cpWLkYB0mY2HnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gXF1hoGelYaUjoGBcX6Gc4J5h5WbloaTjZ2AiGZ+k4OBhoSKiXKBfWd9i3t5f3+Hi499aYB8g3ZmcHl4c3d0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaWh+d2VdcmRZcXVUVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXmtuYXFQWmxSRFRoYlpsb217cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcm9+e390dYN6g4J8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5eMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEkoyCfm59gXSBdoOZl5KKk4+UhYhwe5OEfoSDiYNvgXhogIV4cn9/g4qHfGV8foN1Y3FzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWMgoJxg3d/loqMg3dtbH6Ef3Z6ZWhqfnJhWnhbWnNvT1hydGdgS253dmJeXFtZdX5zcFhnXmZrcl9vT1hpUz9ZZ19bcWtneXJcW1lsZVpjcHlfaF1eZWxoZmxpcnh/h3BugH2BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnV/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1gY295XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIaZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg46LgnxsfnJ0gXiDmo+Kj5GSjYyHf3uSiHmAhY6DbIByaYB/eG18fIGKg3hieYSCcmRxaX9udXJ1gpyMgYCGf3R2foBzgXBba3xzeIiBinuGf3yId3lwa4eDj4KIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltoZm9jak5YZ1I+XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtaGpraXB4fo5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1+jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3iImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CGjIl9bX10fX97ipeGgJOQmImLhYp8kIpxfH6GfGl+bWuAe3lqeneCh4FyYHeCfnJkcmd2g251e4aVkoJ9goBwd3p8dX9tV219dXOJgIV2hnSCiXp3cm2IgI5/g3F9e3yQh4d5bm1obYKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmlOQWJkXGB3YV11blhYU3ViW2Vvc1hqX2Joa2dtbGlwd3yTbGiEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5dop3fXh/gYd/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoJ/fo6NfHF9coJ3fpCOgnaVjZSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4BqdoGNkZV/fH5+cXx3fHR/YlV1e3Fyh4KBe4Fwhol3eG9vgoKLfXx3fHpzjISAdWhwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURlYlxkcV5deGhWV1Z4XlxmbmlWbF5hamdlb25ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4foCBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gHiHjWVxgm5ndW5bbX2BkJOAgHiSkXx3emyFc36PioNylYqRj4iGhnt/hm11d39taHdlbXx2bWt3d39/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAe31tgFpVcXxvc4GFfX93a4iGc3hqdH+Dgnx5e3d6cYl/e3Jnc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1Vec0dDZ2BeZ2ldWntjUlZddltbZ2xiVmtgYG5mZmxwaHB2eI90a46Ndn92eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIB4iodkcYBqanFjWG17hpyJg4Fyl5N2fXpthm9/iIqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscnh9fHldZXqAeGl1eWeCd2h1h4yOlX1zh2pvfoB4bn1dV298bHN+iHqAbm6Kf3B2ZnZ/gH6AdXpveXKFenhxZXJgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3FIQWldYWdfXFV7Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinV/e3h+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i399hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue6C3bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9Z2trW1ZveIukgYV/cJmScX92c4BsfoCPhnKUiI2IhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdYaNhpaAcItna3uCdG11Ylttempzeol6gGV0hnxtcGd0fnd9fnB6anl5f3h2b2RsYWyJfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxqSkVsW2JlV1lUeVpOV29rWV1sZVxaZWNedGZsZXFnc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYWJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd1dYWGeIKFend0dm5renBhaGtnhnSNhG5nXl98bnmIfGdsd2ZqZFZXc3COp32Ee3aWkHR7cXp4bHl6j4N1l3yIhoSHhH11cXNtaHVdbWlgbXVkZ2dpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFlc2VgandmcHWIeXxhdYN2amtxdHpweXdye2V9fX12dW1jZWBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxMbFhkYlVUVXNXTVl3ZVpfbGFcW2RlX3dnbWJvanRvcX51dJmBeH+AeIB+hoR6fXaCg36YhW5ydHx7dXGFhY+CgXqLdXSRgHyBlY6BhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV11aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXt8kI54dG59bXF0eI1+d5R0hoOAhol2anR3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXOAcGhqeHRxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaVBIUmxFYXlmYk5Ucl5KTVVaZm14e2ZfbXFqZF1WYFZwb1dKVGlYZ15YTlZsVEtdemBcX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVZaW2uBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR1dmZoaWFXVlloZJCob393f4qOenBue2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wb1toX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGxhbXtwamd5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWRRSFdiR2N3ZmJMVHFZS0xYWWlsd3tlZW5yZmNaWF5Zd2ZUSV1kWGlZWUlXZVFJY3lbXl9tW15dYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKLjX1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWXBtW15XWVtse2Jxd3ZtY1xudHVodndyb4Z5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoGBc3xhYmlcVFheY2SQpWl5dIKFkHdsbXhmd2x7g3l0h3KBeX15gGlmd21hZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNZbm5gb3B/enNlcYBkX252amNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnpgUktaWUhjdWRhSlVuVUpMWldqbXN7ZGxsdGNhWVpcYndcVEtkXllqVFdIWWFOSGt3WV9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIuGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybVtZWFdgbHZjanVqal9bbnRybXV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF+fnCAXGFjXlNaYVxkk59lcnGFg5Bza2l4a25ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JfcGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYW9xf3hzZW9+W2FxcWJfaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F4XVNQWVJIZHRiYUdWbFFJUFpWbGxsfGVtb3JhW1pYWm1xWFNQZ1hXalRVRlpdT0lzdllgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVeWnB2b3F2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3e3xvhFxjXmNUW2BaY5eVY25wgoWJcmlmeG1kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVgYW1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn90c2JtdVVjcmtcXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hSV1RQSGVzYGJGWGtPSVlVV25pZXxpbHlrYldcVlx1ZVRTV2lSWmdVVElbWlBOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3aAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTmpsYFVWU29nc2tmeGVmXlpydm5zfHl0bol7gHece3prYWVsbV5gbmplcXl+Z1pWWF9seHp6boJeYV1oVlhgWGSciGJrcIGGfHZraXVrW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dmbnJ/cnJeaWxTZnFlVmJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgTFltZWB4aW+AZWBVXlRedlxVU2FnT15jVVRLXVpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI56bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2Njo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2dlkKKgoKCgpV4qLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fX12RpqSkpKSqVhUcHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiY2Pj4+Pj4+IgoODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi4+KipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6OjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4aLioWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYiNiYSGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiHiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOiouOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH18fn5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2FrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJuc2phWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW51cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJobG9wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh6fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1xpbW5vam9ta2psbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3NtbmxrbGlVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHNzcGhUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1qQDo7Pj0+P0BBQD8/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI9PD1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeko7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz08QVNEPzw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J6a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUBZYUdDPT1ARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSWpmUU1FQ0dGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOaWdbW1ZMSE5NSElISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTVZlZGJgZWBOX0lHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyFh4aGhoeIiId8UExNY2ppaGNmaGdfQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SU1tdW1qaWlpa0k6PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9mUXV4dG1tbm9sRDc4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYptdnyEcW9wb25LMjY4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qLi4hyc3xycW5vbkQzNjg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHh4iIioqMi4qLjYVsaGxveX1mPjs7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNj39mbG95fl5FQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjXlwcm92XUtMSEhIRUZIR0VDQUBDRURDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMjIyMjXxzcnBYTFJMS0tJSkpKSUZEREdIR0RERUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyNinl3dW9jUU5MTktKS0hLR0RHSUlJRUZJRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhYWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjIyOhXl8eHJZTk1OTEpJRkpJRktJR0tKSUpHR0dLTE5MTUhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMeXJiXVtQUE1MSUdESEpITUxHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSEpKTEpMRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI1/YFxXV1dVUU9NTEVGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NTE5HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjItuX1ttZEhVU1NSSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4hyYWhYPVtaWVRSP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh4enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhoWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJi4x8cnNbXl1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4mKgW6GiYiHhIuAaVxcXVtWV1VYVFJYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJWU1ZUV191eICFhISFhoaGhoeHh4eIiIiIh4iHg5GOiYmIhoWIiIZ+gH1gVFhbVlRWU1JSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3pvc1pNTlFRTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmFeT0ZBRUVERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1TZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsT0lCQjw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkJCPjtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZGRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUV1hUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5oaWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTU1PTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2ent4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTU9OTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHB0dnp6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0pHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTk1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hIR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0tHQ0JJSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49Ojk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHREdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZISEdGRkNCO0FCQz5AQ0RDREdMTkhLTkhESEVJTU5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RERCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LRElMS09NT05PT05KSklMUlVVUk9XZGBhbWdxcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRDxCQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdFRENJSUhLSkdLUk1CTk5MUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo8Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUk9QUU5PTU5QTUxNU1dWWFhVWF1aXWRgaWJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oz09Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNUU1BST1FNTlFOTVBXWlZaWVZaXVpYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0lNS09OT1JVVk9LVVZTUFNRUkxPUVBPVFlaWVxaWVteXl1gYl5cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QkFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTUlFSTE9SUlBWW1tdXltcXl5eYGBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkZHSUZKRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5NUEtPUFJUWFZNTlRVVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MTE1HQ0NBRDw/RUVFQz1BQUNCQ0NEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklNSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUxISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wc3V0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQ0ZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BvampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkhDR0RJRkVFQkZJSEhFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTkxMTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDRkRIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3F0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcXBudHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcXZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZDR0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJRktLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9OUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDREdFRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUhISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRyeHJ4c3FydXJ0T0JDRExNQkREQkVJRUhHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpNSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dXZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQUtMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFlRS0ZDR0VCRUhJRkdISEZGSUdIR0lLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASktIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX11eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0pNTkpMSUtKSElGQkhIUU1MS09NSktJR0dFRD9FQ0lJQ0NIR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSWl1dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSU1QRUZJSktOTExJS0xJSUhESEtRT01NUExMSktISUNEQUVESUdDQ0hGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhIWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNDRkdCTUhCS0tPT05MRk1GR0lKSEdMTE1PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU5UUlpYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaGh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OSEtGYEVEX0xFZ2RGTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1puWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoOEgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUtFUlZMS05JS1JYV1FNT09MUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFyb29vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOTE9IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh3aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3NydXl+gXN1em58fXl4cm5OS1N1TkNCRlBPSEpLSUtQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXlxfZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUV1dZV09TTk5OUUlSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5VTGxgdnVraXV7em1+eGt8cFxeXmJbXmFkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Fha2Fnc3JsZ2xtcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlJRS1FNS0xQU1VTUVJTU0lITE5PUVJRUFFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVU1RVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGBdW2JiY2dmZWRiWF9hYl5gZ2RmZWFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBOTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX15aYmJkaGdkZGJYYWBiXl5mY2RgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1BNT1ZTTlFRT1JUUUxSVFRZW1dVT1JPU1hXVFNVUlJaT1BSUlZbVldXVFZaWFxdW1tdVlNNVFVVW1xWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlWV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU9SWlNSUVRSVFVUS1JXVltZWlNPU1FWVldUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlNXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWlVaXlhfXllcWVFXUllZWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUlhTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVpcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYWNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmhoYmZpY2VeYmJjYWBgX11dWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYltjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgWmVnXmFnaGNoaGZjYGJhY2JfX19cXVtaW1lYWFhWWlZcW1pWVlZNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6enx9fX19fHx8e3x8e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPYWiUrKysqJWOSjY2MjI2Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5etUExsbGxsUXZaRkJCPkYx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4cG9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISDhHhzc3Nzc3N5fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5fH19fX19fXx7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH16e357d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fH18fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCcHJvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF0naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnNzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoJ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKiol317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1q6yjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpiyoZiWnIV8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgX5+n6uklqSbm5agn4Z/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjZ+yqKKgmJ2dpqitqKCZkYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDi5eal5aYoJqdnZ2ampiQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJOOlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4eLh4KDgoGAgICAgYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f4CAgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgIKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KFgoGEhYSDg4OCg4OEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5OQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOChZODgYOFg4OEg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKRlIGBg4OCg4ODgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDhpaVkIyCgoOEhIODg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIOEhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDhISLmaCqqJuKhI6Jg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SEhYqTmKClpJuNloeFhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYaGhoeGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhISGlZeVl5+fnp2Sh4iGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eGhoaFg4OEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYycm5qXmpybmY6HiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3p/mZeKlJmZmJWUjImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yalX+BlpiXlZONiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXj4yYlpiXk4mHh4eHiIeHiYaHhoiHh4mJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoKan5yYjYqLg4SEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYegnpqMh4iAgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEg4KDg4OBfn1+f4CAgYB+fX19fX59fHp7eo+bl5aSiX6Af3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgIOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6e46XlZeGfn5/fn5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/f39/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5f5CQj5GRf39+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9+fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5go2Jj5aHgYCAgYB/gX+AgICBgYKCgH6Afn9+fn9+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhYSCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoGCgoKAf359fX1+foB9fX19fX19fX18enp5eXl7iImHh4iDgYKDgYCCgIKBgYODg4OBgYGAgYB/gIGDgYSCgICBgIGBgYCBgIKBf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXl8goKEhYOChIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp+gYJ/gouEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5enx/gH2Gk4ODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEhIWFg4SEg4OEg4SFhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6enp7fYCCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOEhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OCgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx9fX19fX18fXx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx+foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42LioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp+fnx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39/gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4B/f39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXx9fH19fn1+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fX19fHx9fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGDgYCAgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoB/gICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoKBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISDhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SFg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foF/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fX5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/f3+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fX19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYGCgYCBgX2AgH6AfX59fn+AgIB/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+Af3+BgoGAf36AgX5/gIKCgIGDgoSFhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn18f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOBgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+fn9/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7e3x5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoGAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXx8e318e3x8fH18fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoKCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgYCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH18fXx8fX1+fX19fn5/f4B/fXt8fHx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIJ/gICAgH+Af4CAgH9+fYB/f39/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fH14eHV4eHl7fHx9e3t8fHx9fn9/f39+fX1+gH9/gYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpydnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIGAgYGBgYGDgH+Bg4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WDgoOCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOBgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH98e3d8eXl5e3p9fn18fXx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRxeHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SAgoOCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKCgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICCg4KDg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYGAgICAgYGAgH99fXx8fXt2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGDgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+BgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgn2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4SEgoOCgoGDhIOEhIWDhIWGhIWGfYR6fX5/g3uFg4GEg4F/fX5/fn6Cg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH19fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIKChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gH6AgH5+gICBgH5+f35+gX+AgH59gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SEg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoB/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhIWEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFhISEg4KBfn9+e3x7fnx8fX5/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhoSGhoSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fX18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaFh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fH18fXt8fHx8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIhoWHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fn18fXp6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoaIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhISCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp7e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4OFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx9fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8zLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy8zMy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLmwi4uLioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6OllVNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3P0dHS0tLS0tLR0tHR0dzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaueY2FiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzc7Ozs7Ozs7Ozs7Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0c3Mzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7S08/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzs3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zPz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ3FpKCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJuzp52HnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT89Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZeckJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9APDw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Uq5p+o5KKrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7Nzw/QDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uYiqGarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlm5uapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlpyvnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Saz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJKNtNbMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXR1Mq91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyNzk2NzQ1MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqainqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9BPzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGgn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeYl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1OTg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVkpSYnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKjo6SkpKSioaGem5qZl6G1npmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoKCipKGioqKhoJ6cm5ubmZ+rm5yam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ojc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpbOsoKCfn56cmZmampuuanadnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpubmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6aSm6ufoKCem5qZmpmohESAn5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eXlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6gnmKcpp6enJqam5yho1FIhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqZmXaOgm5qZm52crnVJTIahnJ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZikgFJ4opmZmp2boKRfVk6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIhbX5SamZucnKOPZFpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ+XXV12l5qcnZ2igWRZTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5qcnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZmmBhYICWnZyemHRjVU+Bop+fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs4Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ9pXltlf5ycnoxqX1FThp6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampeTc2hhVHaTl5yHXFdQV4qSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWjopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOkpqekn2go5aknG5NUGOGhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhKCdjn5qlKWVnX2IgF9yf4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f4Cii3ttUXWcjIxacX18fn18ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2YmndXTktyk4aDTV9vcXeIhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNo41ULy89eId3dkFEXWtthJCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuippxnQltIO3h5a2dFMThabHOQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa+PSnKieUF8eGRiUVReSWBuiqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6ijeGDB1qVDfI6DdU9ujnZTZH+jqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinWJ/vcCueaGkmpVlTF94bVF0laKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnZ5qhJy6jqnRopqzqFhMrZNTZY+gnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6KihXd+fXLOxq+Zpq9rVaqwY1uHpZ+loqGeoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tLW2s62urI6Gg26RzLyUlKWWdFRvenNwfZamqqekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt7u7u7m5wbi0tZ+HeWRYn7W7pqeZiHdrcW94eXt+hY6SmJ2jpaarpaSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1t8HGzM/OzMm+s6SPcmZSRIuVhYWFfXhxbmdmbGlscnJxcnJ1fY2pxMS7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb4+Pay7yuo5WIdFlaUURpd2pudG5rZWVZV11YXGNqamlmYWmLtsHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d29tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zdLVyrmmnJOFcl5RVEtEW2VeY2plYWBoWVRYU1dZWl1ZW3Wat7ystLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnZyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8LBx8vItpN0Y1VQT1RIPl5sX19lYmBdZGFTVVdWVVVYc5ytsaqoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDm2FJREdLRD1bZWFiaWNgW2NfV1JPUFBXgbS6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdzeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGtg09GTUU7TVpdZWxlX1tgWVlTTlWAo6u5tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rcG55eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsaWalhHPz9GXWJhamBaWFdUVneat7+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrLGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanVueWxeZFtWYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXGxr2pclBLMFhTVmVhU05QcanIyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra+1pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwsG8kT9Pd4CKVkxvpcvUxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28xad3a4KQl2+ryMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLq/wLy7xb26wMS/vb6vc2R9kYqK0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbi/u8O1use2tbi6vLi5tqqkmI1+hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHeozL3Ht7m3rba0t7mztbG9ycSUSXvKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1q50gLvIz8LAuK60tLu9t7mxvcPKjUN1zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqb3VveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydKZcXKr0dHMysS1ur/EyL6+tL/AwXhSbsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbXRsbW9gY19iYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MO6vrzEvre8wL/Jz8fIysrChnJzo8zMy83KxsLDy87BvLi9urFvY2K7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXl1eJnEx8vIwcPAwMnKwb+7ubGgfHJsrcjFxL/Awb/Lx8PAyMC6wru5s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLhtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmJB9gJvKwsO8vb+/w8O/v8e8vMC0s660tLy+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2zdoGzvba1wqWHaVpeYE1SW1puc3eAn7i4wrqzu7e7vb+6u7uupJuYh5B+wMTDvry/u7u4tsHCtb+6tK2urK+9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnhucmFfZ11bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJqIR4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJacpZWhca7JxMC9v7mzrrK8uq67tLOlqqasur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cm1gZGJcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJlgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2LmLChpXKly8K/ubq1rqWss7GmsrConaCepK22tMG2tbOlp6qosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfHB2c29kXmhZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+1kYJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYOqnpljqb+4tbKxra2fpKemoq6mnJWYl5meqK24q6qqnqSopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnRtdmpsXVxrVV5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7mztLKwsa2wubi2u7e6vI+hsqujcqywqautq6OooJ2dpZqFn5SQlJaOlp2nraOio5+hpqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRvZVViZFhdUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmZmVaU5AUnhxUElJS2ecgVlFUq67sayzr66srba2srS1rqimn5qbnZ6mqJ6gqKmfoaeWn5FVgZ6RjI6Ui5WZoqefn6GioaWlnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBKVI5gY2KArrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olKNVVoeVj4uMlJCWmqCnnp+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWU2ROSkhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXKed09uS0tjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJqTOmSEjYyLjpeUmZ6iqZ2hoJymp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSUlLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0llo1tlfm9yXVFrY1tkX11rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KjgD1kgIF7eX+UmJ2jo6eepqufp66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1SS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2atrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aeoINqY2Zwenh1foybpqmrpbWyn620t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZ62q39nf4Z9dXl7gZ20rrPBmKm3uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYldeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWdmaC81bmVhYiMhXpxcGyAqbvEnJC5w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfWBeZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhth5+z29S8q5yJhouCcmhdXZDOtnOtx8XFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8fCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafnNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbXCRu8PHxMC3loOChIRyYFeFuYCA0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcm9se4hnjq22taGOfXp6a2hlcYRfutTR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjU0xKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1xcXB5UVl8mKSjln5vamNmamZdk9jR0tPU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcHBubHFvdYBjWneSm5mFaWFfY2ljeczUzc/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGdDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucXJ2fGBdgJSYimdZWV5tdZfH1M7L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMrPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ8SEZCO1aNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucXFycXd3W2eHj4piVVlqgpGds83OxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NHTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFxbWlteGhVeIN8W1Rpf5Kbn67Fxr/BxM7Ox8XHzcrRx8rNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWtxX2Vvalhcd4KRl5eit7q6uLvIxcHDwMPIycjIycfBxcvFx8rNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxby/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtm1eenyekYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXV9bWVpcYm5xbmlmZ2tpbnZcWlpcYHN+hoaCkq6vsa+uwLm6u7m4wMHBw729uby/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqdgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBrZGNpamp1cEhPXFloc29pZJOlpqqoo7WxtbOysrO7tbywtq+zr7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CaW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbGZjZmhnanlfQ1BMXFxWUnOhmp6mopqnqa+rqauos621r7Gnraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysKq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqxk1tpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWl1jbW1mZGRkZWdseFE9RUxYX1qXpZadn5uVl6Gnq6Kmoaqpq6qvoqWeqq21trG9uK+3r6ituLSzvLezvLC4ubWyvMGywK6lqaOrsbOzqL2qq6irrK61tKaprqGlsKmzpqeorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3vr/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBw8K1try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG5zRkRkgXBdlJmHnK6WkoycnqahoZ+kpaalrJ+cm6SlrLKwtransKunqrSrs7mwtbWutrmzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKWmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7PDgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVlbGtZe3lfVFxEXmKTpJGHmJ2epJudnqKkoqadmqKbnqqurLG0o6ipqauspLS4rLavrbO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gn5mdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y6urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhXV1dXV1hXWl1hYmNjYmJjZGVvZllYSDIhIlxYX46UiZadnqWcmZujpaGkm56gmpitra2usaCkoq2rp6G1sLGxrKmvs6i6s6e2oaKfnKOhraOiqraqoqOmnqamo5aZnZeZmp2gmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9CQkBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1VXYGJjYWFiYGBkZnFROjMhGitolI94kYyRm5mdmpSfn6iinZ6nnJqZqqausKqboqO3qaGgrqi1qqanrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sLCxqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJpaT0zLTJOf42TjJOOj5abmJyTnZ2lpKKlpp6cnqWfqq6ln6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19dXl9cXV1gYWtYND9NdISKiYySjI6RnpWdlJmdo6CrpKOjoqOhm6mqo5mdpLGpoaCdpaqeqKKfrayqqa6toqKilZiimpyQrKmwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGFbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlNOUFldW1tcXFxdXF9jaEBScYd7hYaFj4qMjJeWnpiYnqWmqaaqpqilopikraOUmKSuqaCcmZugn66ZnKqzn6Wmn6OjoZSUm5aWkqmprZucn6Ggm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY4Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmVxeXZ/c4CFgYmEj4uSlJ2bl5yop6Ssqqevo6aYnquflJSjqKadl5GPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlJKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWFdaW1tganRscml7gnyGf4+Ej46Tl5WapZidqKWkqp2ml56kmpGOnqKal5eGhZKbpI+VopyVlpWHopqbk4yOipCapaeblZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7tKussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyxLW1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFpZGhjdnx2fneJfoiFj42Pmp2Ml5qioKKYpJWgmpSMhpiai3ONg36Ol5aGkpqQk46Ne5mPnIyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpywu6qpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWVpdaF9jYHF4cWtJU22LfZGCiJiTiJGOnpeclZWVk42ViX+TiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrayYp7Ojqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TCubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBlXlttdWlKPTt8ko2LeYSQiYKHipmMlZSJkYaElIV4iH9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqGpnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVUtRUlBHSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+OhIN+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTU1Vaa3RkaHFgX1VPjIOQhHB6gn15goqRgJGZi496hY5/dH94cm51cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2npJKgn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PDc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX93hnh8dnBvallLSElIR0VISFBUVFRXV1NVVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5xenBrXG6GkZWMjHdjdX1zdXyGjnuCmJJ/cIaOe3Z6bmt+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BtenF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpubo5aZnZudnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PS1JPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXFqbWpYS0ZHRUFAQ0RITExNUVFPUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWRtaWJ/n6O+fHB0X3d0a3h1ho54eoqEbmuLkXhzeGlqf4JxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3NsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aWmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHFtZWtrWU5ERkNAPD4+QUZGR0tLS0xPUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFpaoIFdlWNtdGF6bGp8d4iGdICFhHNrmJBzcntpap2OTHmFk4mEjWYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIeMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSUtPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVLQUlRSGCqrpxsdXJoeWluf36Cf3iChIR4cZ+Tc3eAcnSThzVwnaidjaChhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklIP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUwMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh8dXh4bXhud2RqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVJDSIBvend2cXppc4SFeXuCgX2KfHSgmHl9hYCEmYSanGGGqp6ci4OQjnp3iH6JiI50i5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjU0MjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJS01PUUtKVFtXUUlkfYN2hHV3bnmLiHd6hoR9lIV2n5iHho2RlKWMrKlIhq2vroqBgJSLgouChJKpiIGYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZVxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPRkM/ODAsI4dbPz84NC5dlnBzo1VGSUtMTU9XYFhtWFpcZYaNgI98gH2BjY98g4aOf5iTgJ+gl5SamaWtkpm7sae7x8Oni4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSFBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkY6KmpuknaGspqqusJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMS0pNVl9hfGVlanGVlIiVjo+HiouWhZCNm4menpChqaSiqpOotaGnwcKtx694uZSafI2hnpmEk4WCjqGflJmRhYqFj5qRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTkxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITEtNTlJebId6cX55mJaVoqCdlp2Tn5KanKacpqmdp6uoqbSWq76rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWjm5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNi46NfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0yLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lJTU9RWWyDjXWQhpygo6+5tKCqqaqlprKprrSwsKy6sLK9m7LDq7rJy7jDv7elorCzrK2qo4uWmISlpqCjl4GmmY2iqqiliIWUpKGgq6GkqI+csYuVo6a3upugoq+SopyhnY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lGSFFOUFeAkJ2Cqp+tpay8xMCnsMO1qrG+sba8tL2zwLW7uqK4xai1yce1vbi0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6anoaaaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVdARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRUQ7PkA3RDc/QkpKRUZWU1BejaGqoa6wvbCzvMnGtLnDvLKyv7W2wLO+r7Z0sLOlusSkr8a5sLOxs6ektbaqsaCil5uikqWwrqatq6ekmKGttLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKSvqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqcH6Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZKstLK4tcW7trrHy7m6wLu2tLq5tr2zubHFYHSxpLGanqq9qaWoq6qjorK1oKuon5WWn5mgrqWnpqWfpJSjp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgrLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluStr62u7TDvLi3yMm5tbm1t7iytrSzrrW1mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6tpaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyb3BvMHAxMTFyr7HzbKjurC0rpqrt7uYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEY+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7XFr7exubuzsMPFtK+4sLC7q7Kwpqq3q4y1p52ap5pNmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWXh5+ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uypa+0qau7v7CqtKakuKarrqCrtKOOsK2al5iMj5KRhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaOkoJ6gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZCOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnJCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4qMioaDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIubkquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWXloiOg4eFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eBbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHi5OboJqdqZ6hrJuhmpiepZ6fq5mLmouQkY2EfIeHg4WLjp+Zk4iEh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnx9a2pdXFFVVGFJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeQg4mPlpmWlaWcl5+VnpORl6KdmauVkJCKjJGCjISIiIGFj5Gdm5mJhoyBhZh6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9fGlrZ2FWWVdXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdW1NVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp+gpGJhIV6hId7dX10bXx9hn5zfpKekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCSk42cmZKTkJaNi5WfnJSglJGNjY+Lfo+OjYqDiJKWmp6eiIyVkp2RgYt/pZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h7fHpua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqGLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiLkpKLk5OTjouPioeWmpyPlJaQipGThoCLiJGMiomclpiiooaTnZagiomIjZuQg4iOf4OHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcoB3amhfX1pVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjo4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qyjYSokoSZk4WZjKKVn5iSiJueo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciVjoaHiI+SjIySk4mFiomFlpmaj4+Uk4aUl4N/j4uZh42QqpeWoqKImZ6WmoiOhpeXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhXWDa2ZgYF9RS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiNlIuLk4+HgIaHiJKYlIyKk5OGlJiGhJGQnHOQmLKVlqOhiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfPzNPR0NbY0s/YvHV9eWBiV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramzvbClrrOzqaOisK2KmrWdo7mlla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomJjJSGkHyOjn2Dho6PlJSIh5KWi4+VjYuMl5iRm5m0lpWqnYuclJKNkJKLmJqKkp2Pi4qWn6KNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWxfXFVhU1FIRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWm6easZqRq52Omo+SjpWQj5WWjpCgkIiVnKSslJaPlJyelKCdm5ifoJWbn6inpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnVkX11iXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Oep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46HiISGlZSMeoOMkY6RoYyMlJGOh5egmJOZlZaloK6djKqcjpaPkpGVlY2QlJGOoZOGl5+gsp+Um5SgoZmkn5qgm6CUmZ+npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltfbVROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTE1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KBj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4uTo5mXm5SToZ6pn5GlmoyPj5CVloh8jpWSkaKalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZX15MTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkEyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTj5OUkqWdk52Zk6ChoZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6aXmJaYlaGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKusuaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmouxlZqZlZKSmZilo5WfmpWZqJyboaCZioyPlp1gSpacmpSZpJdUlrCfr5yfpZWvr62mm6GmlJOZmI6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjQ0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnZeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyrtLWrqqetrJmkrqalqay6v6irt7e+wcC+t7Kyw7C3vayjrrStuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqeoKmep6CYmamZoaedl5CNkZ2DbXWTopqVnKKfkK6yoquVqaqYqq+mpaGlqpKSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1MRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqNh6KejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaywby1u6ypraywo6OZqrW7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7eeqJylo5qboJqnpbKhmp2lnKepnZiUj5Sbi5aJjKShlJyin6C1sKWmlLGrmqutn5+lpKqSlpWghJCen5yWqaWhobS0uratqLWysp6co6Wal5WZqqGeeGNfYV9MSUZITlFJTkVGRkJRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLXAsLy2urenpKurraGhm6urxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSytbC+o5ajlZOak62fkKGhpKKjnpC+pKidqKucnKCbpp+9opiknqKpq6CdlY2VnpOeh46EjZOepKCdtqymnZezp5qwqKCcq5+ijZqVn4SOoZqckqWkmpirsbWxqqWqraycmKCgko+QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtSUEs9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3v7G5tbq2oKesq6yen6ClpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS1taOdpJSRk6Ctn5ihnaioqqKawqyonautmpqdmKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SZt6Ofs6KhnLCYoY+alZ6Cj6CXl46io5WQpa6zq6mioqWklZWcmIuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXTlGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ6goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsbq2rZqpsKmqm5+moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u1tq6qoqaVlZSiq6Gfn5mnq6+vr7uxpZ+pqZmYl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmbWco6+boJywkaGVmJWbgJKilpCOn6CTi6assKWnop2gnpKSmpOFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl49SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6aoMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS4r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+eqKSZk5STo6C3o6Slla6xsaWppaGem5malZiooJ+Zop6vs6KmjZivmqWsmJufp5OekJWZmoaXoJWNkJ2elIupqaqip6GanpaNj5mQgoaViZWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFCV2BdQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trCwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO4uKqtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLiZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCcn5GUppqhqZyWpKKYmoyWmZSWl56UiZKbmZSOqamnoKOcmZuTh4+Zi36Nl4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUVdXRVlfXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7Sqr7K4n5esraiumKmpjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqWonqOWj5ifsqqzqaqymZ2nm5qUjKCmpLSup6GsrK2xp7Orsamjm56opJ6VoZqcqLapmJqSkp+Zn6Ggkq2hm5qIl5mMnZqelIuPl5eal6elo6Cel5aWlICQlYR7j5OEjZdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE9aXUdbXl5PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajrKilrq21qa+zuaansLfGt7G3v8LCtrW6xb7MxbnDwbrAusW4wbqztKyquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurrWxubeqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCllZaambGiraClr5ahpJqZko2ipaeyqaGmsayqtaWusLSvo5mdraebl56bmqy4opiTkY+YnKGZmJWuoZ+Xg5abjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFLXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybu1u7vAvrW0t8PAzMe7xL23v7/BuMC9sr2uqLq5uLfCt6yusrqWl6evrKiksqmUr7ukrLKypqejsrSxsrG1sLezqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKem5WXpaWkt6eisLOrp7Cnra+0rKSZoayonJydnZWquZyVj4+MmJ2jmJGYqKShmYaVmJGdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gF1MZWxcSk9kXT9ie0dJOEdnV2ZbTV5iTVlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm5rsG8w7izsrXCw8/EwMK+tb7AwLu/vbTEqaq5sba3wLyvrLS0nqGnsa6lprGlnrK1raqysauoqLW6rLWytau0raqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6icnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqayutq6inaOoq5ygmZuTpLWaj4mOiJGjoZaPlp+jl5aHkZaUnpuZlpWHmJKVmaecoKCNk5KOkXh+j4V9fX2HiopydHN/fn5dU2NuXk5aZ11GRJZbRzpObVhiW05hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamwpKejs7SwtLSwsKCrrb3Mu67CvceytK60wcPRxMa/wbK+wsO8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqqrpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqmoop6coqyVpZ2YnpmsnqKnqKGspqOtrLawsaCpo6CqrbCsnZ6np6mao5iZkKComIaEj4uLn6CQjI6XnpKSiImSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfHeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY+V3VYYFlPY1xOVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZynqLC1rLi1raqkqqq9ybyxv7nDr7Cts8PEzs7Dv8C0wMPEusG0ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLult7OsrK6oq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKeloaGrlqqhk5ugpp6ko6qjrKKeprG2rKyipaOaqauuqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZyRk42Fjpmlm5ORm4yTkpKUo5qcmouPi4x8hoKCgXp1gYSBfnV3i6KHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmZVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqq+Yqaittaq1saqlq6qpvMDAubq0vLWms6/DycvRv8G7ub+/w7rCusHErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7S3q6ykqqqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmiqZ+tm5GqoZ2gpKOmoqqenKa0rqelqaKkmKWmp6qcoqSjoJmYn5GOj5mNf4eMh4SenomGjIyQkJOPhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeCf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlNjUE1VVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpaqsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMLAv6+ys7O2vbzBsbK0q7Sppbappa2zsrivoq20sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCopp6nm5mpsKmin6yioZKioqOnmZqpppiYmZ2Pi4eViH2OhoSFpJaGg4SNiJGQkoaHlqGXiZGekZOQjZGclZiPi4aGeHSBgH10eHqAe3R0e2qCiKR2aV5la4F1Z4iLfFJWcF9LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqOko6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vKy5rKO1p6essba4sqWnubWttLyvvKWtrbarrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rtLCunamkoK+cmrOilqWbpaSfpZqaqKqlnpqpoZuRm6CknpmXqaqRmZqSkIuCj4V+kIOAiJ+Ph4F/jYmTkJGGg5WblIaToo6UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfZ2NyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v6yitKaqq661t7SpnLm7qLG+srqgrrS2qaufrbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qVjIl9gI2IkpCNi4eTmJGHlKSKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q5uL6qpLWnqKqvrbivqJi4vKStvrS0oa24taemqLCzoJ6lpaehpZmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcnJqdqaaWm56okZiSmZ2TmZahqpGbio6Qh32HfoKOfHyhjYyJeoSNhoyOjYaKk5qPiZWgiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlY2Fmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xua+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6hH6Ei3qPl4qNh3qCiIWKjY+GkJOYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW5mcmlrZWhdZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERUXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taWisqmnqbGqrbGfmb+1pKe0taiesrypqKWpr6yZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSXmo2Uk6SopJCJio+GeoR7hIZ9nY2Ki4d6gYWIiYqShpeSkouQlZSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGlkZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLGso7aup62ut8C/vLLCt7Cusra2uba2raq9s66ysby/t667u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqmqq7GlmJ6qnaakkZilrKKYnqSpoZyhm5afnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiYqLiXmFd4GCgZ2Hi4KKfYCFiIeGkYSXlJCOj5GRkYyTe4OVj4Zzfn5meW9qamtmdHNrY2dkZHaBYmVmZmZqaWNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqysaO3rKqtqbi8u7qtwLKurq62r7O4s6mrubGvrrO2uravuL2spp61qp+gr6Oprpuhv6Cwo66xr7eutZ6tr62topmdp6mln5Wap6WfmaSiqJ2an5qTnJ6sr6a6qK6ioZqbnpmepJqknZeemJuUmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo6Kio97gnOBgYqYhYd8iYqGhoqMiZKFlZuTko+QkZeOkH+AjY6Db4F/ZnltZ2tpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsc3BgVGNpY2ZZSUZMTU9YUlFVYWWAVUFXU1lUR0lGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru+urGmt6+nraS3uLe3rbuuraqrt6qzt66msrWyrqmwtraws7W6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKejnZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjYNtaX93g3FshouGfYWMh3FeY2FnhJiGa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXWBhio+DhGVOS0Q5R1RoXkpHUFBVVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqit7OysrG5rKmmrLSmr7Siqbe2tqinrLayrrSts6Gpn7OpnaGjm6WmmKu5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56el4+dp6mktrCko6KdlpiXl6OIoY6Smoahh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iY1pl4hmfnN4oG+Ih4R+j31/oaCgmYB9iJ50h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GSEc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+qqaeqv8Ovsbq8t8C/qqW3sKmspLK0rq6zt6qopbCtpbSym621trWmp6iysKyyp62dqaCxp5+jopmfoZqss5SjpaW2vaatp6uqrKiloaCYoKajmZmlo6SYnKSplpSim5OSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2WAwJy/eYSFepKEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayfoFylHOaoaqQV09XYk9WTkZVW1hRUVOMXFdbUEFcRFFORUhJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKpsMK+srW/tba+wauntKysqaaus6mvtrOnp6a0pae4rZyzsrarpaSnsa2ssKaqnaaksKKhn52Wmp6crauTnaKfs7qjqqmira6loZyamqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GQdrFfarRbpYBlnJFgZ4N7Z39qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66jsLqvo6StsqOpuKees7Owo6Wgqayvq6+mp56joa+bopuWlZaamqullZqhn7Szoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCaoKGWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJOUk3erZ2uxXKt6jYaUdIlyj4eAf4iQl3iCgYuYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDg6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPTxTfW4zK1hqXE9YTV9nVzdKOGFVNTAblKCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wdn5+ulZ6ZlJSVmJ2soJmZpKi1r6Kqj6qoqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOiKSDpYJ6rHmPnVaveoh+n2q5Wrl2hoR+poKUe5h6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhYCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJiyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYl5WVlJagqZyZlqetsKmjn4+to6iWnZaboaWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGmf7F2g5HS0nZcrnuFf6Rvm6qma4eFfa19mJmOe7Fxkp6OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ6hqaSxp6ypo5mcmaedlZOXl5GSoaaflZOlqrCmopaTraCmkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo+dhpqZdq+Gh5Gch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5eRlKGkmpKQpq2vpqGVmaqgo4+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjJKke5SPn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5VZR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m0q6quoZigoKako7mioquglpuRoZ+Uk56Zk5een5CMjKiwsKeel5uopqCMkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4cI17i6Jqa7ZaoYVll5dpoaKnbZRytHSTmX6yaoWRh61qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj9ucDNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJuevKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXnKefpKu4naKsmpWZjqOilYydoJuYnJ+Rk5SqtrComZWcrKmXjJSlmaWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV+d3bCgpqyYIO6ecB8dbhjtYKMh6l9lYGrqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQXNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I9RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Coo6qypLSlrKWelZqqmKasuJyirZeUn4+kn5KMnKKdl52akZaSr7myrJaYpKinlJCWpJykrJ6QoKirn5qfqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjZh8pLu5vZx0erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9dXT0rOlZVJz47PKeeoaK/pZa0w7Ssq6isq6m6rrDFrbOyrbams7irqaGhpZ6gnZmTqqOsqaW1p6efm5Wgo52rpL2moamWk5uQoZuRj6GnoZOcl5SYlLG1t62ZnqSkoouSkqabpaqblamlpZuZoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpneHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNwmoppcot9hpVna39ydXh9fmJbd3SBaFBcbYN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtXZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKilm5eUoJumrai9p6iklJOblZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5GpmqijmpqroKOZmqOnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqKYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpuUoJyNgnqlhW1rfZF8gHWKioFxgnh5dnWJf3yKanOBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6GzosChpLKytqCppbKnpbC0qsiqrK+ltKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KUoZ6eoqeTkpmop7LEsJurnaufkJaWqJ2qnJyfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glKKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaZk5CcjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5j4GAiWp1gXmIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgubC/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ6Uk52Zma+lrb6gq6KQkZ2ZmZSRlaGcl6ichJ+rrKO0yLSgqqSrl5aXmqadqZufpKuUnp+doKqvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbXqEjoh6WGZehoNebYyKgXZcaHN3dpGAiIJtd4F4f3NteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2moLq9uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyto6WnqbKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXymrqOotMS4paKnr5+dlZ6inqOco6mokp+hnaGqsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3aQg46BdXmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4Q0NCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqpqGcq6KkqKSktKScopKmrau3s6euopGQmZylkpGfoZibn52Ip62lrK7AwLGhqa+plpKfnaKaoqSqo5Ogop2era+qraekpKihpqWdrKiRo5qoramanKibq6CVlqSVn6KWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnuoh4WgdZeTiLNjgquGoY6Ns2qEr3R9l4i3YYOtWqPNbpB2e9p7f5lwfYeSdn1leod2dmt8h259hpGRfm2DkGFybXBoYGB6ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mll5yir5+gn6inoqWgn7Crmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn66mrLGpwMezqKmxrpaSnZyil5+pqp+VoZ+dna6wqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+cc61/rIeGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NukpFmcHV1cWFnbWVfb2lpb2dkWFRdYVpSU0Q5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5cW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZopWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52no7Ctpa22q7rOsq2mrqyXlZydopmerqycl6Canp+ps6urq5utq6Wjq5qusaGnq62lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgqiGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZn1qY11XYGpYWVVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMlBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpqCbpJ6dpaeno5yrmqKsoaOfr6GcmpKrpLWvrqCnmp2Vk6aikJqiqKCgppyxpqapsq63yLK1qqyplpGdnKKZoKWznZqhlJ2fp6ytpLCbraujo6qhs62hqrOxoZqop62utKGRlKKml5qRe6psnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOliIegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa19hWWRuXF9ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6ammKqjn66rnaWgrJqeqaWcp7aeopeTqau1sqybpZyglI+lrJGZnKijoaqnrqKlp6mwtcOys6qtqJOKl5ylm6GjrqWXoZWZnKamrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopiejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZGLn36alpeKdp6YiqSXo6l/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJONd3tzhn9xXG5ueHJqgnBbZGBpb2NkXUxNUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWVlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymp5ujqKGzrqKpprKgmKmklKO2oqKVl6KptLijm6GcopKPobGZnpunpqGisK6dpqmitrLFsa2pramRh5CcqJ2ipJyll56ZmpqmpaubsKKvpaeYr6S7rKG2tq2dnLSxt6+xpZecrp+inYWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmmapJyVip98mJmGh49zr4Klm6KOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnp+eZCDbmp5aXpzb4F1XmVlb25maGBLW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqOfpaGhtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ22m6OrpLasxLCpq6mijISOnKKgpqKWmZqdmZyZp6anma2or6Smm62mvayUva+sn6GvsrepsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWthaCVqqCil4afgJmVgHuSfquAnZqWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmo58fISZgGtuf2N/dG6AemBoZnFvaWhoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbelo46bpKKfsLCqn6Wgnq2Znrmho6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGhnaahmqWdrpihqKe3qcGvpKmknouBjpuan6efkpSZm5WbmqalppuqrK2kpZ+pqL6klsKsqqKgqrG3qKylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2hj4SmlZqBrIqEsIWmmqShoZGFoVxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa0WbJ9Uq6AeqxYgKFtmI+om4yYkpqafHqRn39ldX9jhnh0gX1iamdxbmdmZlBVZFxBVWA+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1dXVldXVldYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qaCKmqCenLOzqZ+koZ62maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6mZop6ln5qjo6WZoKKqs6m9r6Sonp2PfoublqGhmpCRmpySmpipoKKaqa6opqaipKm7nqDGpqSooKmzs6qtpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJOEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoTXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOp52Rm5KaoHuDk517ZH57ZY9neYJ8YWxma2tjUWJbU2pcP1ViQ00pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqalsqadi5ilwKq4sqiiwKeos52fsp26qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqaep5yaoamjmZ+hrK6quq2no5qXk32ImZGmnJOPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKosrKnrqmfuaatrZlzdqqluIZkiaBwaK6Ri5BubnekkJmfgXWumJRwj4txlaijmpeupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmGiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6KZmZmTmqJ+iZGYd2eJeGmPa3mAemVtZGdtY0tlWEprWjpRZkZRJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dXV1ldXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7OqmJK/s8XKv7eqn8GtrqSiqKyfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpZKnmamal6OqoZaepqeosLurq5qbk5N8hJaOppmOkpGZlY6YlqmWoJmpo5yxpp2iq7mfr8Gno7Klqq6wqauppbWirLaViqGoprediZajmYiqm5GVnZKps5mao6qgspaioZ2fopyhpaKVq6eNkpKMh5OcnZWRmZOZkY+VhYGlm5iWjouUlIyQh4V+Z4l+dIJ1c4eKcKdsepOQk5KAgY2PkI+dlaKXmpqlhImXkHNrkXdxjHh3fXpqbWVkcGVVYVlAalxIY2JQWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVFFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C2sZCOrMi+xry6q6Omn52nn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOXqJqompSmoaSRnKmaora7p6qYmpCNfYGVjKKVi5WRlpGQlJimkKCbqqCdtqOdpqu3p67AraK2pa6ur6unp7G2n627mJGlpKa2opKep6COqqCOk5+jq7CaoKOwqK+Yo6Cco6qenp6dl6ydk5mhm5SQlquajpmZl5GWn5GIoZ6WlYWSjZGOlYuBfmaLhXWGdXiHgnOcaoWPkpOQiX2LlZKSmJSjk5+ZpIWKm4p9dJd0e4yAc3x/am9lX3FqYFtgWm5kUGFmUVo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQS0FDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9gYWJiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2jpJt8n6SypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqZaPqJmojZqqkJ+6t6SkmJyNiXqClI2clIuVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKwnnd4nqevuJR1rKOeiYCrf2RcYnagj6WfhJh9bZKznKOnraqiZZ6fknN5mpdxgZmomG1/oqiKZZymnZKYmJaNkpyQhp6bkJaEkoePkJKJhXdqjod2hnB7hX9/YGiHiZORi1p1lJBnaJCPc3uonJxme5uKhXqZaoWMhG96gGtyZWB3cGxraVxmZmJicVRbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpart7Gzp5urqK2YdI2esaCoq6eUl7mgoI+cpJ2Rf4mImp6Mq5mhlKehnY6Wkp6Edq2PiKebqZKZpYqdu7SooJmYi4l1d5ONl5OKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmn32nonmgrLR/jo2lnoOLhpCwqq+Ni5ekm3qBi6yFnJ2hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWgpGXl4SbmWJ6h5CFj5CSi4NtcI2HeYBwf4CEfoVzhYOUkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseXxxcWhleHBqbGtcZWxqZnVdXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVxiYWhmWlFIOUVMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8nAsaKXqKq3n5GFnq2cp6KgjpC+npqMn5qgkHyFjpiXh6qboJWfoJGMk4mGgJGnjYejnqSVmZ+In7qyqJ6ako6FcXaQiZWQipSQj5uMkJKgkpihpJaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3N7d52Pp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh42WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxkJSGaXl1fHhoaXZyaGhsXmRwbWduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCkpaylmKasuaSwgaKpnaaenYmUvZmTjaGSno95hJaVkYeqmJqamaGEjot3m5yPn5CInqWcl5qZiKS5rqWanIyMfmJtj4uTkI2QjY2YjJGToI+VoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprIWjjamZjJp/onWBmZRsgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgWNYUXB3Zm51c2tqb11qcW5sallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+QlA+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZiho6atr6GesLakqZOioaCnnJqOmbSZkIufjJWLdYGTkoyKppSUmJ2efpKFhaykh5uQipmqmZubkomnsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+fnKKkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXRcnrKDa2NwdXdyaW9Ya21zc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARF9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq+dnLOvrZSZopqhpZmblZ+rm4uIkniLhXGBlo2Kj6COkpSdmH2QiY2ooIeXjomSpJWcm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2fnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGhdbnJ6eGtpXHFreXpkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7N0g/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6yqa6fmKWboaCZl5ego5mGiY1qiIBye5eIi5aVg5GVmJB6ioSVpJyKlI+GjJ+Tnp2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uop6foZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICJlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXpV2SGVkYXRyf39vZmBsaXd8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGVsaWlraZOcgLCtmYRTXqCms7mysqmaooycrJycqpWiraWjqZCgn52bmpaZoZ2WiIeJd4aBb3mVhZGbinuRk5aIcoCIkqGcc5GQgYmalqGchY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnp17pZZ6qYCVm4+Jn5t8p2h3bX6ZdKFzcnyehplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm218cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5dsnHx4l3NuqaRnYWV6coCFbGhmZG92eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbGdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmaqhoqWPpqmhmquLm5mZlJmTk6GYjoeFe3B9hGh9j4OUmoB3kY6PiW9/hY6SkmyXk3yKk5Sll4OPq5uUk4uGiXmDdoiBboKfhniBkoaImaOYe5Sio5mfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlosrW0xqZzmH16nWucm6t2hZtud3mYapp7dZhyUUV9s19qd2x6iGdraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRnY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJiro6Omjaaon56nhJuYl46XkJCck46Ig3pqeYdlg41/mKB5dY+JjIFphIWRgoyFnY16joyXppSEmaqYjZKLgYl6gH2MeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbF2Ii256fXFxZKVteKJkZ6domXOMmXCicFWJkG+gX2aoVIteVJhubnRrc4NucWlseXRrcFJZV1dmWlRtSVpQXUlYaWlzallsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYrJ6fp42jopyko4GWmZSOmpCMmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlImKlZmCfImImKiSgaOtkYaQi4KKfoCAj3RpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foqknneffIOklZ2gapuIeKxon66MtnR3vo2kk1qDp46rYXZzdXJ8dXFja39vaW1TV1tWYWJda01dUl5KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBg4B2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKybn6aKnKaeq56FjZuQh5yRhpKNjIxzhnqIhG+MhH2Zk3R0hnOSgm1/i5GHhpOOfXuCh5mnj4Cnp4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZpxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdsg4VddWd3jmV/gISMp5l9dHuVaomIcIF2fYd3bm5ojXR6fJh4hVxsWHmPaW94c3JweHhwXWyHbmpnVltgV11ma2RWY1VfUmBweXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6iipuom6qZg4KcjH+XlIeOiomNcYJ8j31+joR7mI90coRxlYV7fZKLhoaPhHl+gIibpY98qKKMhpCQhZWDho6YdnKEqYaOkp2QiZ+eiIybp5+fqoOJjpWafn6Jlq2nj5Glj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWple4aEiYBgaXh6mnuCioF1gYWBZ3eKhmpfb3GBdV5xiYCIjaSUhWWLjYNud4uEcYaPenFoaWZ8hHuWW1xraG52W3x5eHZvdHODaF1ui2trYlpaX1tZbHFcX2FaX15mdH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYmdo5GmlYB8mIZ9kpmKiYeHinJ9gYx2hYuBhJeKcm+AcpiGg36Sg4SGiYB6gYSNnKGRg6iiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKki4iTm5yjmZWqoaemn5KahpSMenaNjYOnfn+SkJKUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYmBhYSQd3x6dJmgiIaJnYmEk359ioB/dG5yhIF9doWFiY6kj4KFjIaCjJCMfYiMipGEem6EhX56mWtzaWF0inF+e3h3cHh1gl1eb4dobl9eWl1dU2hyVmRdXWJtaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKShnnx/mqyPn46HoJ2MnpZ9eZWEfI6ZioaEhIZueYGBc4GHfYmUhG1rfnqXh4ODj36Ah4SFfIiFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJeHh5uln6KZnIWCkpqZmI+ap5+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqEhIxzf4l7fHFxeoeCeneIjYORpY6Fg46Ag4qJineGiYuNfnJtgIJ9b2lsbmheen9pfn13dnd2e3hdYHF+bnRgY1tdX1JnblRmW15ia2l2en9ybG1ka2pogX9sdIJsbHVvenCGem6HgHaCgH6FdnGCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVjJmZenqNhn2JkYSMgoKDbnyAeXOBhH2Lkn1raH2Cl4mBiI17fYaEhnyQg5GdnZOJqZ2BcYyLjJKGoKGKhYx8qJGJkJKXk5aTeI2jn6CdlZh+gJCamJKMm6Oho5mWkJp9jIN3f4KOhqB/foyMj3yYpaKik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfoiJcoGGe3xwd3qKg3l4j4uClaSTioWPe4aGh4R2g4SJiX1oc36BenxybWxoX350aX12dnR9c4FrX2B0dnB3ZGNZX19Sa2lWZlpgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH54h3tsjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbG1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4malnl8hoh/g4l/iYKBf3J/e3R2g4V9ipF3Z2N+hpeKgoqLeHyAjYN5l4OWmZiNl6Gcf3CMgpGThqWbh4yJg6aWhZOLlpeTknaRnaChl5OVeH6Ol5eNlpudpJ2YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4aRl4t8k3iLiHt/hnt6cX13iIV4g4+HipehlYGDi3aIhIOCd3yDioZ4YXp6f3WAeWhtZmJ/amt4dHR3fnJ9Y2Rhc251cm1hWmFeW2xlU2RZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYN6bpCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidVaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmnuXnYyMmZB5fIGMfnyEfIGDgXh0eXp0fYCEf4mLgGRffYuUh3+EhnR9fot/fZmGl5WYjaSimYBzh3uTkYmmj4yOipOgkoSSkJSXkYuBj5efmpGPj3J/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5eem6SUlYuMnouGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lZaDfo10kIeCeIZ9dXd/fISAe4KLgouTo494g4F0iYd9gHR2gomFcWJ8dntyfnBjcGRlfGNvcHdzeXh0dWJ3YHBsdm5vXFxfXl5rXlBeWWNhaG50e4lsYGlla2Npd4duZ21pa21ogX17eG+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZh+n5SRl5SId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Jze4CHeo+SiZOSnZWmnJaCfYF9joqRo4mOio2Ymo2GkpmUlo6KiIySnJKPi4tthJCPkYiemaKglpWIlpBth5iDZYWYjpN6iYSQinCWm5Wjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5e5iTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7fouFeH5xcIGHhWZpenV2cXxjX3Fha3RfcWt7enlsc3Fmel5vbHNtclhbX2BhbFxQV1hlY2dxcX+IZ11paWdiZ3GNb2RqaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOPiKGNlpSQgHR8d4V4eX9yc3uGa3Nwem6LdoCBh29wW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeMjI2NjJyJjpCCbImLkZGKnZahm5eUhJeGaYOigWWEnImQfouDi4F3k5mTn5KRiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudX+YjnuHhHmTkHl1h3NviHqEinmKhYGGjZuih3uDdYKLf3h5bmyBhYNfdHV0cnJ5W19xYXBrX3Brfnxxbm5rbndhcG9rcW1ZWWJhYm9ZUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dHV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ybjZaOi3pyeXWCcHKFdHF2iGxwbnZtiHaDfoBtbVVRgauUhoJ3f3dyg3qDoYOTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKe3KLhYqOiJyan5uVk3+TfWeEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJKWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlIt+h4V6ko9xeYNvdYt5iIp5iHyAio6dnIR7enaCi3x3cWpsgoR7YXlxb21zdFZfcGJyYmBtb3pxaXBmZ3V1aXJsYndlXVdmYWBzVFFPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJqg2CIfm9va3pgam50f3VfdH15h3h0c4V9eKCPmbCcpY6Ci3+DmoeAjJ+Ai5qUj4WImI6Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1tdHNSTYLfyJLWk3twdYR2haGElHeWkZmdkZl7lHOFkJ6hkpORi5OclIZ/l5aIjY2HkY2Hm36NgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIloOGY4yRmY+Vi5eMjIqKcXqUiHuOiIqTkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3tpc2pzio+JgYWEfJSKa31+bX+KfYqFfIR5gI2TmZiJfHV3g494c21ncYCFbmx1cGlqdW5TX3BlcFpgbXN5aGxrY2d5c3BxZGB4YWBWbF9fdlBOTGJnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ9i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk4+HgXR4cHlxb4RwbW9/c2VleXF9bXl9amhrY6Sawdyu8KFzbHaFd4akhpNwl5GWoZWcgZJyhouil4mNlouQnZaDgZaQhYmPgJGLiZV9hnp1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZnJpf4mNiYKBfouVhGuBdW2Gj4GOgn2BeH6OlJGXj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFyaGxWYG91emFyZGBpf3Fzb1tkcmFiV25bXXhOTUxlZ2Jed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmR3eYaMaXaAiXJ/nIaYp5ujkoR9cYyUd3mMnoWFoY2PfJaNgJqIhHtzd3B0anCCbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yHc2x0gneLnIqPapmRkJ6WlIGJcYWIn42Ei5aLjJiUfI2TiIOJkHuQi4WOgH91eIOEcoiCk5yWlJeFjHWGfW+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hY6EkIF7gHx9j5GOlIhtcHmMhXRrcGxzeYJhdWpwXmx3YVJlc2lmU2Bxd3VhcGBdaIRydGtYaGhjaVltV1x1TEtMZmdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxf29neHeSgmR2hoVwipaFmaGaooqIdG+SjHF3j5x+i5qJiX2gf4SagIF4cnRub2Ryf2lmbXh4XGB5e3txcYBpYWdhf9W2jpGmeG9xeH1xlJKOiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBiY17jox9iIR6c3qDe3GGgJaajpOTgYh0goV1gn+JkZydhpWPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcXCEe46LgXt+kIh5cINleYGIhYqAeoR8fpKNj5GCbW55i351bW5rbHt/ZGlsa1pud1pTanNpYlFjc3htY2ZeWmuEbnRiXGhfZW1gb1VccE9IT2dmXGhvcoBuW1xjc2BcY2x3ZWVdXVpsbWNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGTlXyJhnaIgXB4eXuEk29ue4F3XoOAdIFtaXp0lHNnc4h8cZKRg5mfm6CGiHZ2lH9td5SYf4iQhIuOmn2Mmnd+dnJwbGphdX1nYmp1eltgeHx6bHB+ZWNnZ1edj19xc5a9xYV3cpWLkYB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMfpOHdIeFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaTjZ2AiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB2en2Lh4R7gI5/fnKAaHiBhYmEgXeCe3+Vio6LfG1reol8dnRvaGh+d2VdcmRZcHRTVG9zaWJOaHV5Z2FeXVlvgXB0WmVjXWtuYXFQWmxSRFRoYlpsb258cFpbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpVraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5j5ZvenNxbGpkYHR7aWBmcntbYXJ9emZwemFlZI6xsndLYlql2tKYc3ySjZF6f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioOVf26JhnFzfXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYhwepKEfoOEiYNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xwfHJ/h4OIfYWHeohxgG1wgoWNgoJxg3d/loqMg3dtbH2EfnZ6ZWhqfnJhWnhbWnJuTlhydGdgS253dmJeXFtZdX5zcFhnXmZrcV9vT1hpUz9ZZ19bcWtoenJcW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuTcG+Bf3lmkoqCoZidkYOGZ4eEcGd6l4p/gIWCmoqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMzo+i4+AcnmGipCOeIWZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4SClXZth4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIyHf3uSiHmAhY6DbIByaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKIcIB3fZOJin1zbWp2gIB1dV1paXlxWld+VFtyZk1bc3JmXEpyeXFdW1taXnaAdmlaYltnZm9jak5YZlE9XmZdXnZmX3VxW1lVb2RaZHF6XGheYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe31rdHxyhntzdn1/jHp4hH58a4yMhJudloyCgW2Nfmxpf4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQbl02W7C2dWqAiX6Uh3eImYd1kIyKd3BthYKGdHmJeIl9k4h6f3Nndoh9fJZub4V9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8kIpxfH6GfGl+bWuAe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tV219dXOJgIV2hnSCiXp3cm2If45/g3F9e3yQh4d5bW1obIKBdW5daGd1clJcfU9dcl1PXHNwZFZLdHlrWFlZWmJygXZhXl1hZ2RpamZPWmhOQWFkXGB3YVx1bVhYU3ViWmVvc1hqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHx2i3prbYWJk3p9e4KSgIB+ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3+/nailybhyhYR0lX56iZWEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeX+SaHGDdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIe4mKbHl6gHVoe2lsf3lzaXp2gIN9aGB3iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3Fyh4KBe4Fwhol3eG9vgoGLfXx3fHpzjISAdWdwZ2yIgXJwXWhjdG9MZndNX29WVFp0bmJRT3V5YlJYWF1icYN0XGJdaWVlY2tkUlxxSURkYlxkcV5ceGhVV1Z4XlxmbmlXbF5hamdlbm5ocHd6k25piIx5fnN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdYN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z8aHWHjZJ6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnIh4izcop5cY92fYmRgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjWVxgm5ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11d39taHdlbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4GFfX93a4iGc3hqdH+Cgnx5e3d6cYl/e3Jmc2Rti4Rsc1tqYHZmSW9vTVxjWFdWeW1iUFN1d1lRVlheYXKFcF1hY21lY15vY1VeckdCZl9eZ2ldWntjUlZddltbZ2thV2tgYG5mZmxxaHB2eI90a46Ndn93eH13gYOBe3R9g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iIfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeoeEdIaHhXeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbnKFc36GjH97k4V6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hkcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iHqAbm6Kf3B2ZnZ+f36AdXpveXKFenhxZXFgbYyBa3JYa195XUlwbE9YVl9VVnxrYk9UdnNSUlRXXmN1hmpdYWtrZmNab2JZY3BHQWhdYWdfXFZ8Xk9WZnFaW2poXVhoYV9yZmpocWdxc3aHeW6VinWAe3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoOEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhoJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6ue5+4bmJ0h2l1fXN7hYh7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eYuCZXB9Z2trW1ZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c3BpemFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeol6gGV0hnxtcGd0fXZ8fnB6anl5f3h2b2RrYG2JfWxuVmpheFZMbG1QU1BpTll9aGJPVXZsTVFUVV9od4RnXmFxaWdhV2ldXWxpSkRqWmJlV1lVeVpOV29rWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2gH94f3yFh311c4KHf5WDbnN5e3tzcoWGiImEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bYWFlYFzj4JxhoJ/goBwZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdnd0dIWGeIKFend0dm5renBhaGtnhnSNg21nXl98b3qJfGhsd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3uIhoSHhH11cXNtaHVdbWlgbHVkZ2Zpem97cllngXZ1aHCBeIJ3Y3iFi32Vgm+Ma217gXFmc2Vga3hmcHWIeXxhdYN1aWtxdHlveHdye2V9fX12dW1jZGBshnxta1ZqY3JUTGtsUE1PcEdefGZhTlZ1ZUtOVFhhbHh/Zl5nc2plYFdkWGNyXkxLa1lkYlZUVXNWTVl3ZVpfbGBcW2RlX3dnbWJvaXRvcX51dJmBeICBeIB/hoR6fXaCg36YhW5ydHx7dXGFhY6CgXqLdXSQgH2BlY6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4Z0eoV9goN1bmppZVZdW1taU2NuZVxZYnR7amhtaGBhV15aaYBpa3CAaG1iaXt6a3V1dXCHgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9oj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhol2anN3aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56eGJ3hYV6kYZziHJwen9yY3FoW211ZG5xhnp3YXKAb2dpeHNxa3d2c3Vignl9dXRvY2JibH18a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVaZm15e2ZfbXFqZF1WYFZvb1hLVGlYZ19ZTlVsVEtdel9cX2xdXVtiZWB6aGxhbnB2bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYCCdW+Ib32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXJ0fWpqXm14d2h1eHNvh3x+fnp2c2x6aGl3Z11kc2d6d5KAY2NUZG9mgYR2dmZoaWFXVlloZJCob393f4qOenBve2Z3bXmKenaOcYR+f4CHbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnZkdYaMfImIgH94cnV+dGFwbFhwcWFub4J6c2NxgGtgbHpuaWh5d3NwZIR0eHh0b2NgY21zfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWWltd3tlZW5yZmNaWF5Zd2ZVS11kWGlYWklXZVFJY3hbXV9tW15cYmRef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59d3Nwhm18fm2QemNwcGJlXWVWWllXY2ZrYF1ddIZoWHBtW15YWlxse2Jxd3ZtY1xudHVpdndyboZ5f4F6d29vdGVodGVbZ3VmdnaReV9dU2VlaoKBc3xhYmlcVFheY2SQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeX15gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZnODk4CJg4l6dm9yfXJheGNZbm5gb3CAenNlcYBkXm11aGNmeHpybG2Bc3F7cXBhXWRtb31laVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMW1dqbXN7ZGxsdWNhWVpcYndcVExkXllqVFdIWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHKJZVNybltZWFdgbHZjanVqal9bbnVzbnV0dWuHfX+BfHdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGFjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcX3doV2JecGhhd2FbfHZqanJueHR0dWpygpaEh3+FdnNqcHxtZndXW2lsYW9xf3lzZW9+WmBwcGFeaW98a2pyfXBvdmpwYFpka217YWdUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWm1xWFNQZ1hXaVRVR1pcT0lzdVhgY25jWGFhYV6MamNlbXp5bG9pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gYCBdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjGROb21cVldVZ2lzaGN0ZWVeWnB2cHJ2dnpsiH1/fYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjXmNUW2BaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWJ1ZVVfYG1kYXFdXX5vaGlzcXRxdXdtbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdXxwcXFpbV9YY2lqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpbHlrYldcVlx1ZVRSVmlSWWdVVElaW1BOeXdbX2VtalpiYV5ej25iZ2x6dm5vaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eW1tcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29nc2tmeGVmXlpydm90fHl0bop7f3ece3prYWVsbV5gbmplcXl+Z1pWWF9seHt6b4NeYV1oVlhgWGSciGJrcIGGfHZranZsW3VwanlpdXJub3yBc1lrbmBZXlZjZFllcWNUX2JpYWJsWmB+a2ZsdHVvbXh3bWmGjYCKe4htcWZwe2xxbGFYX2dmbnKAc3JeaWxTZXBkVWJtYXhhb3R6dGlua2pfV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aW9/ZWBVXlRedlxVUmBnUF5iVVRLXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jYRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKUk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6NjY6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD8vMTExMC9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0REQ1hoZmdnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4aJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5COi42FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFiIeKjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhYiPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiYiFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OSk5OUlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkpGRkpKTiIWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKCkpCRkY51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCFkI+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4pyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI13bXuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f39/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3Nub4R7dXaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JscWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJdamxdZmZnZWNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmp3bWJucmphWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW11cmZRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTl1jb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkZIVWJoa29wb21sWkxMTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0ZHSE1aZ2hncm5uaGZkYF5eWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1aXGVsbmtvbW1sa2loa2RTR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9S1tpbW5vam9ta2lsbWZRR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUhjb3Ntbmxqa2hVQz5DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OT1KYHN0cGdUPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbHxqPzk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtbbkA+REU/QEFEX2Q7PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkdWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6Om13STg7Oj0+QTtIZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZFdXZONzg4Ojs+P1dqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFb3R9goKBg359hHZNQUNFQD8+WXuAXT9DRUlJTFFNTUtFQ0ZHR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk5pWk9QTklHSUhISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hLVnNeVlFLSEhISERHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8UEpZbmVeXVRHQ01GQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SmBiYWFjZVNOWDw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5xaGhnZWdpZmhGNjg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIx4bWxpaGlqWTU2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4qKi4l2bW1tbGxVNzg1Njg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjYhybm9vcGVAPjo7Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoJycnFxY0dGQ0JBQj5AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2NjX5yc3JTS0pLSEhIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyMi3t6dF5nXVBLS0tJSkpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjYyOiXt4e29nVU1MTUpKS0hLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NT0xMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyNjI2OgnhyVVJST01OS0lJRkpJRUtJR0tKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMjIyMc1tWVFFRT0xLSEdDSEpITUxHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI18XFtXVldVUU5MS0VGR01QT1BXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+Mi4tsXVptYkdVU1JRSzs7U1RTYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dvX2dYPFlaWVRRP0BXVllcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJi4x7cXJaXV1cU1VTV1dVW1p1g1lVfZBhXFhdX1dJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIuAaFtcXVpVV1VYU1JYVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUVBSUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gH1fU1daVlNWVFJSTVBNTGZ6W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3pvcllMTVBQTU9MSktFRklGQz9UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTkVARERERENBRVFDRUFDPkNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhBQTw8PkBBQEA/a1FLYEVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fHx9fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTtDQ0JCREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX1xaSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhDQkdJRkZFRE1SUGFXU1hRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVVRTk9PTUlISkxKSUZDUVBTW1dUVE5RU1lTXGVVT1NUUk5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTk1OTk5MSkZRUFVZU1RPSk9PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NzVXb3Bzd3l6e3x9fX19fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1RRUFFQUU5RT1FQTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0xOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXt8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1NTk9OW1dLTVFPR0lIQ0hKTExLRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTktMTU1NTExPTlNkTkpMUkhJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QUJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSk1NT1BSUEpHQ0xHQ0JKSUxNT05JSklHQ0NDREhKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREZCPT49OTk6O0BCPz1BQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESEpMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTk5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkFDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUlNOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQ0VAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT87PT5AQj5AQkRHSkVJRklIR0ZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSk1MSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNGQ0RJRURFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRUlFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTVBMUFBRVVZXT0tWVlVTU1FSTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkZHSUZJRkdESUhHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUVJUWFZNTlRWVFJSUVBNTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NISElIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQERCRURERkJDRUdDQ0lGQ0hKS0lJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENGRURGQkZGR0RFS0ZGSk1MS0xMR0dNSUdKS0hLS0lLS05MTUxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhIREVLSEdMTk5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFBcbm1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSElFSExKR01NT0xNTkdMTUlMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEpJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEZPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZLSENKTkxMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaGhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpFQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUNASUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09NSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhLS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYCDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUlZMS05JS1JYV1FNT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIJ+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm9OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2dlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUklSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QS0hRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0xQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUlhWVFlWVVpWVFJVVFRVV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUk5NT1FVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYWFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNiT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVl1qZFZYWVpXVlNTT0pOVlRQT1VQUFBNTVJSUFJYVFFRT01QVFZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFZWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JTV1ZXWFZUWVtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgW1FOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXU1ZaWFxdW1tdVlNNVFVVXFxXUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWNfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1lSVVVZWVlVV1pcVlNXXlpdXWBcYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWl1XVVteXV5gYV9kY1xeXV1lYWJmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5XWFtcW1xbW1pcWlpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1hXWVhXXFtbYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFiYF5bYGFiZmNfXVRdYGFjZGRmZWdlZmZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9hIWEhISEhH58fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fHx6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoKCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fXx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9e3x9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3t8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKCgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYGCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXFzcXJycXFvfIJvcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgYGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeGcHJxcHOYgm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgYGBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaGCb3Jvi558b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgYGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1naF2cXefnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYKCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqJBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHmIoZ58cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5n7SppKepl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4mvpqG1qqyjfnt6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19mKWWorKgmaeTfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/foCAf39+f3+AgIGAgIGAgYGcnI6gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJeajpixoZiVnIV8fn5+f35+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn6AgX5+n6ukl6Sbm5ahn4Z/fX1/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOCg4OGjp+yqKKgmZ2dpqisqKCZkYeBgICBgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjaCtsaabmqCbnpycnaGko52Uh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDi5eal5aYoJudnZ2ZmpeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpycm5SPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4SIkJOPlJiSh4OChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCHm4iLh4KCgoGAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+DiI6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKTko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoGDgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4OCio+Cg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIR9homAfoWFhYSFgn99fX2Ag4SDg4aYj4KDhISEhIWDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDjZmVkoiEhYSFhYSEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWUm6OropOHhZCHhoeGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/iZKdpaamopOQkoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3mJmJecoaCdnZqMiImJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e36Sm5mdnpydk4eIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYCVmpmbmpmShYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoCWmZmYlZKCgoSEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt7eoaXl5WWj4GBgoGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp8e4qWlpOEgH+Af3+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7ent7fI2MiouXjH1/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6enp5foyNipGPgX9+f39/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5ho6HgoKDgoCAgYB/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhISCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX18enp5eXl7hYSCgoSDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYOBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXp/goJ/g4uEg4SEhJeXg4OEgX1+gYGCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyAgH2HlIODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8fYGCgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoaEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX5/gH+Bf317fH9+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fn9/fn5+fn18gIGAfoaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt8fHx8fHx8fHx8fX18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Af3+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjYmKh4WFg4KCg4OEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn5+f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX58fXt9fH19fn1+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fX19fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5/fH19fH19fn59fn98fXx7fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gYCAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX+AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/gIGAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfIB/gH5/gYB/f32Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgIGAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYGAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIKDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf359foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAf318foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4SEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fX5/g3uFg4CEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhISGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGBgIGAgICBgYCAgoOCgoOFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f359gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fX5/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aGh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaGhYWFg4aGhYaFhIaHhYSEhYWDhIiGhIODhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9/fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aHhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWEg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeFhYaGhYWGgoODhYGAgYCAhICDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhISEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+f4CCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5/f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l7enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9PD46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9HT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfY19fX2tva2tra2tra29zb29vZ19fX19fX19fX19fX19bU09PT09PT09PT09TU1tXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yDbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI2Li4uLi4uLi4uKioqIn7u5ubm5ubm4uLi4uLe909PT09PT09LS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vNTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxYUlNTU1NTU1NTU1NTT3eopKSjo6Ojo6Ojo6Oiq9PS0tPT09PS0tLS0tLS3+vq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzVIsMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaeXFZXV1dXV1dXV1dXV1N6qaWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM5cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqomZhYmJiYmJiYmJiYmJegq2pqampqampqampqaiw0tLS0tLS0tLS0tLS0tHf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzNxMLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMy8vLy83S0tLS0tLS0tLS0tLS0tTT1NbW1tbW1tbW1tbV19jY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7S08/Pz9PTz8/Q09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fX19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1ZKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Sq5zP0NChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09PD06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Stpylo9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pzp2ckZ65npaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+YoJu1l5+gqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9O0mZaquZymoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Uq5p+o4+lm8fJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ1Kybp4uXlJ+VlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PDw9OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NO2srKlnYaer7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxKKZlqCPo5uinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKugx9Wiq6Scvp6ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGUlFLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojs9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTyJGNtNmvjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlRMRkI8PD9GRUdLST02Njc6OTc5Ojs6Oz05Pjk4Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTIwdXS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE+Nzc1Ojg4ODk5Ojw+PD43Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR09TS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRLSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1NTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOzo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSERFQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw4Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo7ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTk6ODY4ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4aBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjUzNTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2OT07PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubm4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2PDo5PD09Ozo4NjY4ODo3Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRj44OzcyODk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjY4Pz5AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztbW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6urr7CsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzo9PkA/QDpAQkJCPz9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7OwsK2sq6qpqainqKmpqaioqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiYmZmZmZqampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTkzNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaWlpaWmqKinqKilpqiop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD46OkE8Nzw4Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2srKyrqqmopaOkpaampaanp6qopqanp6eoqKenqKinpaSkoqGhoaCfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Ctq6mprquopaWmpqelpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1Njw/PT9BPzw/QkM/QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaOio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjo6GioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZiXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj47Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpKSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk4PTs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Oio6OkpKWmpqWkpKKhoaOjo6Oio6Wmpqamp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Oj07PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6goaCkp6empaOioaOnpqalo6OmpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqOlpKWlpaWlpaWko6SjoqKioaCgoaCen5+fn5+enp+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manJ2eoaampqWko6KipqenpqOkpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5eYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6OkpaSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2dn56bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6ODY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6Ojo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaXmJeXmp6ioqGio6Sko6OmpqWkpqempaWlpqWlo6CgoaGgmZKQj5abmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqalpaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2en5+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg2ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnJ2cnp6en6ChoJ+foKCgoaKjo6SkpKSioaGenJqZl6O3n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZiZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqZl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ogn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoaChoaCgoaGipqGioqKhoJ6cm5ubmaGplpybm5mcnpqWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJGSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE9PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz48Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKloZ6goaKioqGgpbKtoKCfn56cmZmampyuZnidnZ6bmZqcmZeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOSkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6aTmKyfoJ+dm5qampmqgESBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCfnp2bmpqam5qYmZmYl5eWlZSUk5GRkJCRkpKTk5KTk5SXmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw9OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz86OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ufoqKem5ydnJycnZ6gn2GZqJ+enJqam5yjoU9IhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foKGgnZyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+enJmbmpycm5qamZaWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0JDOTw/Pzs6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPDo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYl5iZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmqdqXKKgm5mZm52cr3JKTIahnJydnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmJiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilglN3opmZmp2boKNfV06HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5qcnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWWlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoIpcYJObmpudnKOPZVpNgaKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+PkI6RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZ6ZXV51lpqcnZ2igWVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bm5ubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDk9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZycnZybm5ubm5yamJmZm2FiYH6Vnpyel3RjVU+Bop6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmZqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpmYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oj06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56dnZ2cmpubnJubm5iZmZ9pXVtjfZycnotpXlBTh5+bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+MkI6Qi4uPj5aIiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoqqxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg6OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRho2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZuampeTdm5mVnmUmJ2JW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo4Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+MkY+LjI+QkZGOk52fkn+ipZimnXRPUGSHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo6QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaKbjHxmkqWTnHuIg2N0gICCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKjiXlsUXOcjYtYcHt8f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3OTo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmXVTS0tzk4WCTF5vcXeJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo9ODg7Ojk6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S4CCiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+DgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GOo4tQMC87eIZ2dUBCW2pugpCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/Ojw4OTU4NzU3OTU6Ojo5PDg6PD06PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5xjQ19LPHh4aWZHMTZXbXKQj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZDPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqq6OSXiqfkB8eGViUVZjSl5viqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRT43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidmPC1KVFfZCEeE9tjXhWYoCjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAREJAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6qppKenmZ2kpaOinmOBu8CufKSjmpdsSVx7cFJ0laOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07QEFBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCip6GmrqamnJ9sg5i5i6zTo5u0rFxNr5pVZZChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6Ojh3d+enPRxLCZo61sVqeuZl2HpqCloqGdn6KYlZ6bn5+koZyVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbW2sq2wrY+HgW2Sy72VlaaVdFZtd3Vzf5WmqqekoZ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyuLu8vLq6wrm1tJ6GdmFWnrW7pqeZh3htcnB4eXp9hIyRlpuhpqespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMLIztLQzMi9saONcGVSRIiUhYWFfXhyb2Zla2hrcXNxcXJ0e4upxsa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWFmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxcfb5OPZybuuo5WGcllaUURmd2pudG5rZWVZWF1YXGJpamhlYWuPuMHAuamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+zNDUyrmmmpGEcFxRVEtEW2ZeY2plYmFoW1VZVFdZWlxZXXmeuLqrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnZycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJuJV0YVRPT1NIPl9sX19lY2JfZGJUVldWVFVbeaKusKqoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubjDn2ZLREdLRD1aZGJiamRhXGRfWFNQUFJch7a6rK6lpKOopKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGwilNHTUU7S1pfZmxnX1xgWVpUT1mHp6y4tbKsqaOhramsp62frLS0v8O+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnZlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsedcVxIPz9EXmJha2JbWFdTWYChub+7vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsbGxsCvelVOL1ZUV2hhUk5UerLJyMLEx8C8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLCwsPBlUNOeYOOVlB5rc3Txba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68x6Z5bYKRlnK0zMjH0cGvvb24ubu7vre0sLm+s7y+sbm1uLy2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9eoN4bmZhZWJhY2RkamNnZFtaWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb+ucGF8kYqL0cW/v8m/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqysp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWNjaGtnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5tqulmI18hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZ3BqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG9ycWVSHzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mxvcPKjUR2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFyZmxqbnVveWRoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/AwHdRb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbW9gY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0cO6vrzEvre8wL/Jz8fIysnBhXFzpczMy83KxsLDy87BvLi9urBuY2O8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkXF9gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vbw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAv8nKwb+7ubGgfHJrrsjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhzd3yXvb/GwLnAvL7FxL29uLGwmI98gJvKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpUUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1puc3eBn7i4wrqzu7e7vb+6u7uupJqXhpB+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZWdWWWBJSU1QU2x3hqWwt765srWyu7m8trm+tJabpZWgca7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUphjaCsr7a6tbSyrLy5uLW4wb2Ll6+hpXKly8K/ubq1rqWss7Cmr62onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05CP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQV2BsLWztbK0r6y7uri2ub/FdYKonZljqb+4tbKxra2fpKamnKOlnJaZmZqfqa65rKurn6WopKuur6ewq6+xsa2xrq6vubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0FTo7iztLKwsa2wubi2u7e6vI+hsaqjcqywqautq6OooJ2enZaXoZWRlZePl56orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaU1AUnhxUElJS2ecgVlEUq67sayzr66srba2srS1rqimnpqbnZ6mqJ6gqKmfoaeWmpaXjZuSjI6UjJaao6ign6GioaalnKOjoJ6loKSspaaopaKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFJBPzs+NDo6NTs6PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvmlFUp2CUVdJSmBLVI5hY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6GgnKOkn56olJmUlYqUjoqNlZGXm6Gpnp6foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjn52gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmx7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6FQQXOdd1BuS0xjZnVzYFpecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJWdmpSNj4+PkJeWmp6jqZ2goJ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKbmZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5eWFiU1ZhSElLTFNVSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXVFrY1tkX1xrj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKclqeloZWVlpGWlpSbmZ2jpKifpaOep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgm1lXFNbWk1RS09PVk1UTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SNelVpcnZ1cGN2dlhXY2BjZ1lYV2etrqyvp5+eoqCWkJOboJyZl5KTn5yho5qempijbn2XmaCbop6copyipqutp6uopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqd3VebVtSYUlSVkhGVldLQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgpIBugnBgY1hMW1NaTUxQWFJITU1ImKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ+ZSEePn5+mo66npKygqKu1sLSwsK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G3u7arrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpZ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52JYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdn56bnZuUk5WUnp6YlIWmdipgkp6jq664r6+ur6+4vLu7uLW4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMq/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qr6OerKi3sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKafmJ2VkpqemZWMioaIhnhsi1c1ZoV8eYCWvLy8sLnBw8LGv77CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3wLu6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iTjY+Xl5SPjZCMgoOCdnJwbHBsVGBrcHJuc4+uxL7BzM3QyMTI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwr3Ewb+/v7W+s62/wMPDx8XIxK+/ubK4vcTCwbu8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNGUUlEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkJCNiISEiYeDgIGBgHlxcW5qe4BkWHd3cm5yf52+z83TyrPR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXlxbGViaHJwcnuFioB1cG1wcm+Ee3aAfXRydW90ns/Q05m219PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKycDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem52alYl3aWRhX19fX15fX11hbHVzcG9ua3Bvc4OAe4F5bWloXm2+06N/0tbUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0dHSyMzNwMvNxtTPzM/JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTj88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWepaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym52TfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWpsb3N2fXJ5gHJiXFNZo61yq9rP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOz9DM0M7OzM/QyMzQ0cvOy8PKyMrNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoKCjp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcm5ucHFycXZ0b3d5dGNbXHt3iNHUyczNxM3K0tLOxs7MzdTLztLNy9fW0MzR1MvM0NLTys7R1dLV1srAysLGzcPIysPNxMbJy8vPy87N0c7UzMfJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3Fxb3BxbWltc3BocnRnZmNdd8LFx8fExL3Bxc7Ox8XGzcrRyMvNzcbR0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcvN0MnFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1VRz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDo6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBtbWhnaWp1amNiXmJlXajGuL/Bubm4uL3IxcHDwMPHysjIycjBxczGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQ0dETERGUz81NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXWBbWVpcYW5xbWlmZ2tpbndcWFZdYWmqwa21uLCwsa+vwbq6u7q4wMHBxL69ub3AucTKxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncm9rZGNpamt3ck9RV2JxmrSrrq6kp6uppLWytbOys7S7tb2xt7C1r7K7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8zFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxcvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI+GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2tvbGZjZmhobHtlSVx1h5SoqKijm5+npJuoqbCsqaups621sLKoraess7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxjbW1mZGRkZmhteWRthJCTm6KlrpqboZ2WmaKorKOnoaupq6uwo6afqa21trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6u7uyvL6+vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5NkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2VqZGJjYWRkaG15eYCHhpOYkZWtpqCYlI6eoKeiop+kpKalrZ+cm6OlrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbO0sLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYWl1eY2JgY2NjYmVmbHlzcWpYW29Fe6CflJKJmp6fpZuenqKkoqedm6KbnqqurLG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqafqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCzua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnIuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hYmNjYmJjZGVwalhBIjpxaGmHnJKSjJeenqadmpujpaGkm5+gmZiura2vsqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnqamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dmZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjCzMjGwMW2wcDHzrfAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYGJjYWFiYGBkZnJEGRxIipSQjpmRlI6TnJqem5Wfn6einZ2nm5qaq6evsKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyioKCTlaGUlpacmZiWl5yVn6meqqSinqOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCendlX2FXWVhTUlRLTV5MUExHSE1MRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmBgYV9fYGJqXyU3boeLjo6UkpaQkZicmZ2Unp2lpKKlpp6cn6agq6+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfo6Oenpick4yglJGTmJiSl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pOT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJUX19dXl9cXV1gYWxXXIeDiYeNi42VjpCToJeelZqeo6CrpKOjoqSinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwnJ+in5+XmZOKnZGNkpSWkJiYk5yho5yloaKVoKKkpZujq6WipKqkq62lrrKppqWmprWmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pDODs7PTw5NjY2Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1tcXFxdXF9ia4OJfYp/iIiHkoyPjpiYoJmZn6anqqerp6mlopikrqSVmKSvqaCcmZugn66ZnKqzn6amn6OjoZWUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWVlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2doZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWFlZWVxbWltdXmR6hHqDd4SIg4uHkYyTlp6dmJ6pqKWtq6mwo6eZnqyglJSjqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0qq6nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS0xPU0dOS0FDRkVDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk1OTVJXWFlYWFdaW1tgaXdwdm1/hX+IgpGGkJCUmJabppmeqaalq52mmJ6lm5KOnqKal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO2rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFITUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtLU1dXVldXV1ZaXWFsaW1ne396gXqMgIqGkY2Qm5+NmJujoaOYpJahm5SNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNOSUpKRUtNR0tLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVFNVWFtdaWRnZHV8dG1LVW6Mf5ODipqViZKQnpidlZSWk42ViYCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipa2ZrauYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtQSklOUEdKSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTE9SVFVYWWBpZF5xeWxMPz19k4+NeoWSioOIi5qNlpSJkYaEk4V5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNUklMS09JSEZKTkxNVUtRUlBHSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVabX1qbXZjY1hSjoaShXF8hH56g4uSgZKZi456hY9/dX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlVNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldYV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl5zfnZyYXGJlJeNjXlkd350dn2Hj3yDmJF/cIaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamloZiajoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWVvb2eDpanAfXF2YHl2bHl3ho95e4uFbmuLknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+mopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBtZWtrWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtepYZhmGVvdWJ8bWt9eImHdYGHhXNrmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Df3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjMzNTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaOlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5ud3RpempvgH+DgHmDhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTExMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaPjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2RqXklQRz0/NzQ0ODs6Oz0+QEJFSExMTExOUFFTVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfHl5c3tqdIWGenyDgn6LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xLqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoYSKfX2Bf3CBfnpod2tSWExARTIxMTM3NjY4ODo8PkFFRkZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYV4hnd5b3qNiXh7h4V+lod2oJmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiICCiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz85NC5dlnBzo1VGSUtNTVBXYFhvWVtdZ4mPg5F+gX+Dj498hIePgJmUgZ+gl5Sbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh5eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoSAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpMTEtOVl9ifmZma3KYlouXkJCIi4yXhpGOnIqfn5GiqaSjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8goODdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCDgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw4NTI8P1I1SEhITExNTlJebYl7cn97m5mXpKKfl56UoJObnaedp6qep6upqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWWyEjnaSiJ6iprG7tqKsqqump7Oqr7Wxsa26sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+So52inY+joauuq7K0oZSkqYiZiJKJlXl6foaBaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUVeAkZ6Dq6Gvp66+xcGoscS1q7K/sre9tb60wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60oKeoo6eaqa+ssbi3uKaataiMpI6Qkp+GeIKFeFtjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDk2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMk4yHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorCxv7K1vsrHtbrEvbKzwLa3wbS+sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayssaWwqa29sLy6wcGrmLmnlK2Ol5epiH6Dfm1YZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfIqCgYuDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZKttrO5tse8uLvJzLq7wLu3tbu6tr2zubHFYHWypLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL28vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXRhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQUlNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4uDh3uLeYGKgpd+dH16a2ZwdVleXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluSt763vLXEvrm4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLuYgHxtX2JeWl9jWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYe0rKGhn4uZnJmMjZWRmpGFiop+iIaMkIuIfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVpaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhlrXFsLiyuruzsMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMTCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooRxZV5fX1piWVpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoaqeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpteHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZast6uzpq+1qau7v7CqtKWkuKarrqCrtKOOsK2al5iMkJORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cWhgZV9YYlNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCAh3qEdYWTkIh/b3Zya3N9e3d7c4J4cmuAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbKhoa2ho62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXFlYmFaVlpVXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCdlZ2UhYuViY6JiI2Gjn94g5OYioyHh4uIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6OxnqGlnaCooKOxnIWekpGRj4uNi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZ19cVFdSXVdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2Nzk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoSJgYd8eIWWloiOgoeFh3qEeHF6e4OFdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKnCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+grJuhmpifpZ6fq5mLmouQko2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlJCuqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9a2pdXFFUVWBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB3gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGMvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId7dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKSdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjoqEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpYaKjLiYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXN6c22AfoR+d4WbopudlJJ/jIh/mIeAm5JuiKiFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhqSFjJGzmJ2SlJehoZ6akpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgnp1d3Z0hIKEfn+SpqSfpaKXip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiI6TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xui355fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSQmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjs3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisK2KmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqZnJSVkZigl5q7u63KoWm2t6qwlZieoquSl72kXqqygomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mSnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mWoKKNlY2XmZ2TnJielKGglJydpq6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuJf4Byhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrwsCwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKSYm5iYnqKmpZOjua+ov7ysrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqWnKeasJqRq52Omo+SjpaRj5WXjpGgkIiUm6SslJaPlJyelKGem5igoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+wtKeMo7q6tcG7q6icsqSkqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlJaloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJx8G1d3tvXltebFROSURNS0tKQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmo2WiouIko+GiXmGk5CBcoB7jH93h4KCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtL2pnKi8waO2tq+rk7CsqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5STop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQURLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlWJ6PnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qqWvvsSxvbmzp6q0s62tlpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52Zk6CioZyYn5iLjI+QnohakJaXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZkTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKuttL7CucC5s6e4tLeyr5WkrbCvpYuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1MzQ6QjM0TldOPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3RiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnqCao6S1ybSpx7zDxMnLycjMzsa+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7e+wcC+t7Kyw7C3vayjrrWtuqaIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqVnKKfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJytqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKurvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7efqZylo5qcoZqnpLOhm52lnKepnZiUj5Sbi5aJjKSilJyjn6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZq6GeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKmdqaydnaGbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCip6i9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytm5uemKagvaGdpJirq6ymoZmNmp+SnoiOWH+Wn6ahoLmqp5SYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+goJiew6ekorOgnLKnkqqjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqqSovbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmZl5OipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ+boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utbKnqruzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsaWppaGem5malZeooJ+Zop+vs6OmjJevmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GanpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoaW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2ktLCcn5CTppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmZuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVUA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGpvKCqr6qjsbeppbSyq6Gttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLWywLrFtqu8r7G3rK2qo7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Orsamjm56opJ6VoZmcqLapmJqSkZ6ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6Cel5aWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTEClmZ+kq7ajq6ilrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xt5mYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbWxtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NZVExFmpafsKixqayko66ttai3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusrqWl6evrKiks6mUr7ukrLKypqejsrSxsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Cuqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xFRJGZpK2krK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLW6rLWytauzrKqrqKypua2ysMe/uKW5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2xASEmQmqipoamvpKejs7SwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qqKWxo6qwqq6rsa6urKuzu6e3sLKpsqmqpqWjrbqtq7DCubSsuampqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0zOTc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5KZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKqxqaapsqa0raqvra2xrrKttLuluLOsrK2nq6CjnrC3rKqtubaktbWkqqesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRWJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjs6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESHQklJRJaQrqShqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa+trKynt6qlrbCruK6osK+usau1qra1p7W3rKykqaqcpJ6zs6mopLO0n7Wtoaqoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiXo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMjM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMkBmPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjra6ytK+qpK+pqLu/vMGysLmtoravyMfI0cC/vbq8w767xMHAv6+ys7O2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuau5rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6ifrJmPsKGYoqCop56nm5ipsKmin6yioZKhoqOnmJqpppiYmZ2Pi4eViHyNhoSFpJaGg4OMh5CQkoWHlaCWiZGdkZOQjZGclZiPi4aGeHSBf310eHqAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5LeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4v8G9sam6qqetsMnGyNDDvsC9ub/Avcm8wrixsLWyury5wLO1vK25rKO1pqessba4sqanubWttLyvvKWtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamkoK+cmrOilqWbpaSfpZqZqKqlnpqpoZuRm6CknZmXqaqRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSak4aToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3VxcX5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwre9v7W4wbrItsO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqSunp6sppifmqGim5+bmaOqopqZo6OVlpSfoZaclqasjJ+Sj5GMgoqAgI+Be5qUjIl9f4yHkZCNioaSl5GHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcXN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfqKS3r62ir6+orLjDurSuoLmvq6ezusfKx7+4wr2vtL+3xLbDsrC6sbLAtru9t6q6uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJynpqiam5ufopWcm5qdqaaWm56okZiSmZ2TmZahqpGbio6Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhqb3FxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xbezrqG4ra2rr7XFx8C3v8K5sLW9t7+7vrCsvrCzv7K8wriqu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpidqqWon5ianaOTmpuanaWqmpubpZWUl5WcjpOXoqmikYqLkIZ6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZWxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6uLqvrsCzs7ivv8C3rb26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiToKmioaGZm52fkZmblp+hqpuamKCUkZSWmY2Uk6SopJCJio+GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dWhoamdncIdoaGljZmpqYGtjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqSRjqSmmp2enaO0raequranrMTBuLCso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t6+8u7Gln7aqpaWzp6mtnZzAq6elr7OqrLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyinJafnae1prCqrqGhnZ6hlaCmn6GgmpuZm5KYnZOlnayhl5adlJONlZeLj5ibqZ+SiIqLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdXNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsrLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxZSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2uravuL2spp61qZ+fr6Oprpyhv6Cwo66xr7eutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjpSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6pqmftaicnaigqKyap72YrKSur7a1rK2fsa2wqaKbnKOrqJyUnKeknZqpoqSWmp+bkJukqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiYmoCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6LpJmGlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6Gpn7OqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZubp6adk56fmJCeqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHN4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqeXg5yrnJiYnZ+pqaeqv8Ovsbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqqCxp5+iopmgoZqss5SjpaW2vaatp6uqrKimoaCYoKajmZmlo6SYnKSplpSinJOTo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYynk4Gnqp+XnJ6lrLKosMK+srW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKFFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWDraelnqOkqrG3rLW9v7C2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhn7Szoquco62toJ6alqCiqJyYnaOfm5mhpqSPnKKZl6Cfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Kme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Wen5+ulZ6ZlJWVl52roJmZpKi1r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw8OD06PEM6Rjo6PzY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqitsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaJ/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjCinZOlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlq7CmopaTraClkpSgm6Smn5WapaahmqOfrZmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsYHBtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt765t7G0urSkt7Kfs6yfnqirn5Sntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknq2doZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKemprAq5i0wq6rramltLC3sLW+ubmxsLW6qLq0n6+knaSnp56TqbCpr6m1q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwsKedl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJufvKGbssCurausp7ept6+1v7S7r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZSbrKqXjJSlmKWsopGWqrKjn56mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsSwuLCtua6twLCro6Geo6Gcm5Cpo6qypLSlrKWelZmqmKasuJyirZeUn4+kn5KMnKKdl52akZWSr7myrJaYpKinlJCWpJykrZ6RoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocYBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2dwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaGhpZ6gnZmTq6SsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KWiGByalpem4lgY4iPlWtggJVjbZ13YpVsgJqVlGVeYGNxmoppcot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFtYZ2NfT1ttdWlxUlFERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqedo5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+snKeep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpiUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOk5SYlJiWmqChmpyUoZ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKa3OBdIN1ZXd9d2tvem1gY11waE1ZWmZqYFdab3ltbWZUUEZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJurnaufkJaWp52qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJacg5KCi6qphYCZl4mEkJ6IeoSQh4aakoiGipaPm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamZjZGZrWWx7b2lrXVNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX11eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSgqqSrl5aXmaWdqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWhre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAiIJueIJ4gHNteYR0domIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6aoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ2hnqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99l5mJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRkWUxWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kdq6KkqKSktKOcopKmrau3s6euopGRmZylkpGfoZebn52IpqykrK3AwLGhqa+pl5GenKKZoaOqo5Ohop2drK6qraekpKehpqWdrKiRo5qoramanKibq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdZiTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gn6inoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqSXnaejn62lq7CowMezqKmxrpaSnJqhl5+pqZ+VoZ+dnKyuqKyqnKiopKKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6in4Glj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzV0BGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCsmp2mo6+spKy1qrrOsq2mrqyXlJucopmerqycl6Canp+osaqrq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGJoJuHpGBgUquFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cmKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqip5+fpZyxpaSosa23yLK1qqyplpKcm6KZn6WznZqhlJ2fpqytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+WlqCVgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4dtp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKejn6mnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq6opp+so7esobK4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn52flIS4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpumpaChr66cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKupKaYr6S7rKG2tq2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJKEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+epqKcp521mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2orqOlm62mvayUva+sn6GvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfZdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfsLCqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqSdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrKykpZ+pqL6klsKsqqKgq7K4qaylnrKtp6iXda9+kIuchYd+uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpqafHqRn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gX2BhYV5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpuAh6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5KaoHuDk5x7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVkf42Tj6GYmZmTmqJ+iZGWdmeIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7ernsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKmmKmal6OqoZadpqanr7qsrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+WhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqlhImXj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVFFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xry6q6Olnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWp5mompSmoaSQm6iZobW6qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiX2LlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlhZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltb2wrq2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm62KqZaPqJmpjZmpj565tqSlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJxme5uJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmhYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcurOooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6HeYBwf4CEfoVzhYSVkXiWaJJ0oJp1fZmFo6CJmH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZnRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVxiYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpqytq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjpC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCZl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhZqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGduWWdHXVJNM0U0N05iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5Zwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcGxsallpT11ZRjlBNUhEX2w1LElEUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya2xyc2ddaV5iTEU9RDZRQlpzMz1TR2BKUj08Mzk1Ojk2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tK2toJqinaSjpq6dnLKurJOYopqhpJmblZ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCXh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFqeHlkYGZYYkJRRk83V0NSbzVMW1tfTlpEQTI1MTw7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGwrJ6mnJypoJ+vnJ6xqa2el6SboaCZl5ego5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZWVhUV9XXVRXQFpGUWhFVFddYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSjqI+gnp2bmpaZoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnp17pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqlndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B6e5hsnHx4l3NuqaRnYGV6cYCFbGhmZG51eGhgY1NcZlFRYkhZSlVhV1RcZmtcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqLm5mZlJmTkqGYjoeFe3B9hGh9j4OUmoB3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhneAkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vg62gk3a1trXJoXOUi4GfYJ6XqW15loegm3SiiHegfpOXi4FwTWajknCbh3Oke3l0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJV01ZVFZeaWxvVmhXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUU9sXmlca2lSamhpbGhsZmNlX1xdXV5pYmRpa3tfXWRoY2pmb21laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uYl46XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppOEmaqYjZKLgYl6gH2LeXCQoYZ5gJWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dznneBipWXj7lukYqiYn2ZoJWIbnJpqmt1oG1vpmCbaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlza1lsV1FSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5ScmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmZSOmpCLmJCOinuHcYCIaYuLfJibc3WJfpB7ZIOHlYqKlZmCfIiHl6iRgaOtkYaQi4KKfoCAjnNpkKaEfYaTjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZnnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1vd2BbcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibGp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjZuQh5yRhZKNjI10h3uIhG+NhX6Yk3R0hnOSgm1/i5GHhpOOfXuChpimjn+np4+BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xyfn16mJabhJB5e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weXlta3dma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4KcjH+WlIeOiomNcoN8j31+j4V7mI90coRxlYV7fZKLhoaPhHl+gIeapY58qKKMhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoSJjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcX6VcWtwfYKgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4J3dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH98dnB1ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX98mIZ9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4iTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4WGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHZ8fXRvcGVrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eHt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaXl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZWEfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4isoIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5uln6KanYWCkpqamI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmrop6UnZCOqY2QgJ2MiJOZnoKPl36HjoNveIZydWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeCeneJjYORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2en9ybG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnKCjYh+e3x8f3uCimBoe2p1aWmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqZ2BcYyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCbmZKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcXdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcoGGe3xwd3qKgnh4j4uBlKWSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x7gIF9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiNl6Gcf3CMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6OmJiOlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfm57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hnt6cX13iIN4g4+HiZehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg350fIOMgYB+e4KDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh3+FhnV9fot/fZiGl5WYjaSimYBzh3uTkYmmj4yOipOgkYOSkJWXkYuBj5efmpGQkHN/jZKUiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnoyGgZGcf5KSlYaZiHuKioF5cXpsdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eCeIZ9dXd/fIR/e4KLg4qTo494g4F0iYd9gHR2gomFcGJ8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lsYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+kqJ2KipKGip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYaAg4Nze4CHeo+SiZOSnZWmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2bHFudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhWZpenV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+IZ11paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6aopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi42NjJyJjZCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYGHjZqihnuDdYKLf3d5bmyBhYNfdHVzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgb29rcW1ZWWJhYm5YUVRaZmdjdXCEg2Nda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHl2gIuAeYV/eIiGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSTh4ubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauVh4N4f3dyg3qDoIKTgpWUmp2Tm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJyPj4yMj4x3e5GQeo6LjJGWjHyIfIBrd2pua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt+h4V6k49xeYNvdot5iIp5iHyBio+dnYR7enaCi3x3cWpsgoR7YXlxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiH1gXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dn6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmoiAjJ+Ai5qUj4WImI6Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2IkYyHm3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqKcXqUiHuOiIqSkYl6hnx/bXxlc29rbHp6W4F5kJCBen5/gIaOe3pocmpzio+JgYWEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBxY193YGBWa19edlBOTGFnY116cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5ucGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGJiZZ+h3p1f4l4h4SOnJqYmI6Pdol1bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoZ+fmt9ZHh2am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYKBfouVhGuBdW2Hj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBzb1tjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uPioWPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGio6HgYdpfJN/fYOEiY6NgnKHf39xd2h2c2p0d2xajX2Tg4V9gISBhIqCdmFya4iBjomBfn6RkH1tgWt3hI6EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2tXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeYZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiX2gf4OZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1goV0gn+JkZydhpSPn36IYn+Th4WIhYuNgICDZ3yQgH5/goyPkH5tg3yDdWxtd3V1eHZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnRiXGhfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmnyLmnd+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdIiFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoSKiXKBfWd9i3t5f3+Hi499aYB9hHZmcHl4dHh0bGuPhouCi395g4GEhIBrXnB3en2Lh4V7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWqCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp5jpZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCf25+gnWCd4Sal5KKk4+UhYdwepKEfoOEioNvgXhogIV4cn9/g4qHfGV8foR2Y3FzgGp6cW91mY2GhIt8d3mAhHqCa1xvfHJ/hoOIfYWHeohxgG1wgoWNgoNxg3d/l4uNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdnXmZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdnCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xwfnR/fW9yfHuUcG+Af3lmkoqCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1fYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Ujo1/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuHf3uSh3iAhY2DbIBzaYB+eG18e4GKg3hieYSCcmRxaX9udnJ1gpyMgYCGf3R2foBzgW9aa31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praXB4fY5taoKEgHlugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMhJudloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6f3NndYh+fZdvcYV9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmImLhYp8j4lyfH6FfGl+bWuBe3lqenaCh4FyYHeCfnJkcmd2g251fIaVkoJ9goBwd3p8dX5tWG19dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLdHlrWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGmEin18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKOh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSQiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4iH1ranRoe4FqdoKNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHt0jYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYqLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh1bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4iGhnt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y358aHWHj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d5cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1dllRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46Ndn92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfYSAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR6dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY254cWpscXd9fHldZXqAeGl1eWeCd2h1iIyOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweHKFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnJRUlRXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3eHeW6VinV/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+fn2Gf3x4dnl2kpSffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hzd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHlmcn5uhXRmdoaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anh5f3h3b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXVrTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVqWmJlV1hVeVpOV25qWV1sZVxaZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311dIKHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3p+i4N7d3x3dpqdmHqKg4dqdn59bISGlYFyj4JxhoJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISGeIKFend0dm5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yIhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97c1lngXZ1aHCBeIJ2YneFi32Vgm+Ma217gXFmc2Vfa3hmcXWJen1hdYN1aWtxdHlveHdye2V8fX53dW5jZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ0ZEtPVFhha3d+Zl1nc2llX1djV2NxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2RlX3dnbWJwaXRvcX51dJmBeH+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgXqLdXSQgH2BlI6AhYR8foyGen6Bdnujpop5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnd2bntoanlqX2VuaIF3kIRnZVhhdml9hnluaW9mZl1VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hoOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgX56d2F3hYV6kYZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl9KTVVZZWx4e2ZfbXBqY11WYFZwb1dKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kWxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6aGl3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYR9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt/dnVidYaMfImIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHFZS0xYWGhsdnplZG1xZmNaWF1Yd2dUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmRef2lqYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66MfHyHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboZ5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KBeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtub3B4eXR1ZXODk4CJg4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlVuVUpMWldpbHJ7ZGxsc2JhWVpbYXddVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJueHltb2p2gZB5boN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmie3t/iZZ5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdga3VkanVqal9bbnRybXR0dWuHfX+BfXdvbmxkaXBjW2tyZHR2jnNcV1RjX3B/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJueHR0dGlxgpaEh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWbFFJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYV6MamNlbXp5bG5pdnmGe2uEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4OXdHiClIWBn4l1gX+BdH+CcIeDdm+il3R7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdma1NeXFZoYmxsW1xxjWRPb21cVldVZmhzaGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmJ2fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRxdXZsbYWUg4p8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVlUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYV5ej25iZ2x5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Mk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgo2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWRnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29lcmtmeGVlXVpydm5ze3lzbop7gHece3prYWVsbV5gbmplcHl+Z1pWWF9qd3t6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3uBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2ZsdHVvbXh2bGiGjYCKe4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWh2c3mDc4KDe4iOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6NjY2NjY2Ojo6Ojo6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo6Ojo+Ojo6OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQ0dkaGdnZ2doTUJDQ0RERTkuLi4uLitIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU0OVxgX19fYGFBNTY1NTU3JxscHBwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGiImIiYmJiYeFhYWFhYWEg4ODgoOChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCQkJCQi46RkYmHjoqQkpORi5CNjI+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2NjY2Ojo6Ojo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIuFh4eHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQiIWFhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCIhYaGh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfnx2dnh8fHt8fX19fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuEiIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4qOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/gH+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f4CAgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/gIB/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f3+Af39/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpOTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQkpGRkpKTh4WTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoKBkpGRko51hpGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/fn9+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCEkY+QfHWIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+PkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fX19fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc2+Kj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI12bnuPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtboN6dHaAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkVISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0Yl5kX2JrcWZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGJebGxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISUpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1lWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bWJuc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01ba3JsYW10cmdRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxkb2tZaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJVmNna29wbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgm9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2lncm5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5JWl1bXWZsbmtvbW1sa2lpa2NSR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gICAgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Sltpbm5vam9ta2psbGVQR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTo6PUdibnNubmxrbGdUQj9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRkVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxJX3N0cWZSPzo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpCbH1pPjo7Pj0+P0BAQD4/QUBAQEFAQEA9Pz89PDo7PT08P0BBQkJBQEFERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0FEX2Q8PT07Oz0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCQ0VIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZT08PTw4Ojs/Pz08PTs8QD09PD09Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTEZGdXdNNzg4Ojs+P1dqQTs8PDo7Oz4/Pz09ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QUBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSklNTUtFQ0ZGR0VHRUVFREVDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISkxOT1BQTUlHSUdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hKT05PT01LR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiEVmyEh4aGhoeIiId8T1hkTElJR0dERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERGR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoSChoWEhIaGhoeHhop2b2lTTUA+QT8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5+bGJhUj44P0A3Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjYxvYGRlWUFXPTU2NTU4NzM1Njg6ODc2NTY1Njc2Nzc3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYqKiYmKioqKi4qLjIZqZmtpZlE3ODg1NTg4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qLjoRrbGtiPzw+Pzk5Ozw5Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLioyNjoBtbGBFREZGQkFBQj9AQ0FAPj0+PkA/Pz9AP0A9PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uLjI2MjXtta09LTUtKR0hIRUZIR0VDQUBCRUNDQUJDQj9AREhFQ0VDRURBRkVGREVGREBCPj1APj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIyNi3htYW1kTU9LS0tJSUpKSUZEREdIR0RDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2NjIyMh3l5ZWFPT01MTUpJSkhLR0RHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4yNhmlSUk9OTk1OSkhIRUpJRUtJR0tKSUpHR0dLTE5MTUhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyMjIyMYVRVU1BQT0xLSEdDSEpHTEtHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyMjI59WlhVVVZVUE5MS0VGRkxPTlBXVVFQT1FTUk1TVE9NU0xQU1VWUlNSUExKTU1NS05HR0pGRkhKRURFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxqWlhsY0dUUlJRSzs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x+YYqLi4duXWVWO1laWVRRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH17fn9+fX59fX1+fn9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BaXF1cU1VTVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af39/gH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1paXFpVV1VXUlFXVmOWgFJlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxeUldZVlNWU1JRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f39+fnp4d3ZzdXt/f4CAdGt/fmtyeV5bVlVTUk9LRkNEQU5eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3lvclhLTU9QTU9MSktERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdmBeTUVARERERENBRVBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJsTkhAQTs8PkBAP0A/a1BKYEVGSElFQj9HTE5HTVFVSUFFPj88PTw9PT89P0FDQ0A/PT1CPkpOR1VudXR1c3R2eHt8e3x8fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFZVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVEQkFCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODo4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1NZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhHSEhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNTFRUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21ydHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWl9bVlk7RFZYVFtmSkxQU1JPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQU01JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1FQTEpMTE9QT05QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1RRU0FHVVBPUVFQTk1OTUtMS0tOT09RTE9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmJcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+fHtxc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9BQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTktMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxJS0xJSk1NT1BSUEtHQ0tHQ0JJSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREE+Pz46Ozs9Ojw+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3d3Z0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBhYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5vcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQjw/PkFBRkNFQ0NJRERFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZmdyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS05NTU9MUFBRVVZXT0tWVlVTUlFRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1NTk5OUEtPUFJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21uc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HQ0NBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtOTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW5zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE9LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTExbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5MTUxGSk5ISktKSUxKSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFwcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRkVFQkZJSEhFSExKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpKT1BRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9NSlBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUktZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTktMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl9cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldgX1RQT09PWFFcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTEtMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tQU1NOUE9OTk5OR0tGYEVEX0xFZmRFTlxJXltybU9NVW1ZTERRYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRTE1MTE9SVVJPT0lMTUdITVFbWU9QUE5PT09JSlF/UUl8WVlydFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFgYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FPS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktHYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp2dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OS1N1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMUElTVFZYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l/bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbmttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1LVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RUU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBMSlFRS1FNS0tQU1VTUVFTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVVpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaYFpfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhYVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RVFZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGFYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFXV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtVVFJaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5jXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5XXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZbWFxdW1tdVlNNVFVVXFxWUlVWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWF1YXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1RT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxXVVteXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1lXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFpYWWBXUFVeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xcW1pcWlpfX2BgZGJjZGRiZFlhZmJmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11ZXGBhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhbWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3p6enp6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t6enp6enp6ent7e3t7e3t7e3t7e3t9fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiJDM09LS0tPVnoaJiYmJiYuNjIyMjI6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyKlN3m5OTl5OeliYyMjIyMj5CPj4+PkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9g4SEhISEhH58fHx8fHx8fXx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t5eXl5eXl5ent7ent7e3t7e3t8fHx8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnl9fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiY2MiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en19fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYOEhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3Z7fH18e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6eXp9fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHt4ent5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoKBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYSDhIODgoGBgYGCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGBgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoKBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKCgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3NzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnFycXFxcXFxcXFwcHBwcHFvb25ubm1tbm5ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKAgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFvfoJucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIeIcHJxcHSagW5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfaKDb3JvjZ98b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcnF1nqJ3cXegnH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZBvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3NzcnN0cpOppHuJoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3d4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHl5oLSppqmpl317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/f39+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvpKG1qqyjf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maWWorGgmaeUfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcnI2gsKCfop+AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJixoZiVnYV9fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqMjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f3+Afn6AgX5/oaullqSbm5iioId/fn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIGBgYODgYGBgoOChISHj6Gyp6GgmZ2dpqisqaGakYeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tsaabmqCbnpycnqGko52UiIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KDipeZl5aYoJudnp2ampeQiYaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYaOlJOXmpydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOTko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OIkJSOlJiRh4KChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGBgoOBgoKCgYCHm4iMh4KDgoGAgIB/gYCAgICAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CBgH+DiY6AgYKDg4B/f3+AgICAgICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIOEg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKQjYyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoOCgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4ODgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDgoOEg4SDg4SEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhoaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4OEi4aEhISEhYWEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAg4+XhoWGhYWFhYWGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+BlZaSj4iIh4eGh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qKnaekmIyJi4uIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e32Zp6SimI+Vi4iIiomIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIODhIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fIGcoJ2dnI+GhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoOcm5yVhIOCg4OEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+BhISDg4OCgoB9fX+AgIF/fX5+fXx9fXt6eYmbm5eFgIGBgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KEhIKDgoOCfn1+f4CAgYB+fX19fX59fHp6e42alYWCgH9/f3+AgH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4+TkZqPfn5/fn5/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5gIyMjIuBf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+foB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6enp5f4WAgIGBgoCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgH9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx8enp5eXl6gYKCgoWDgYKDgYCCgIKBgYODg4OBgYKAgYB/gIGDgYSCgICBgIGBgYCBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXl8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYGCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhISFg4OEg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IlYODg4SElJOAgIF/f39+foSLgH+BgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4ODgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Bf317e39+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9g4GAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx/foqCe3p7enh6e3t8fXx+fn9/fn5+fn18gIGAfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeFhICGlIiAgoGBgYGAf39/f4B+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/gIF9f3+Af32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x7fYWDg4CBgX6Af3+Af4WCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKCf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY6Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoCCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt8fXp9fn5/gICDh4mJiYqJiomFiJKPjYmKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISEgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fH17e3t8e3x8fX18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4KDgX9/gYGBgoGBgYGAgYCAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH5/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISDgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8fH59fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH+Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fXx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx9fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fH14eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4CGg4OEgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3p2enh5e3t8fX17fH19fX1+f4CBgICAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhYSCg4ODhIGEg4CDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn5+fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foWEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnVmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn1+gYB+foGCgICChIeGg4OGhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdweX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBhIOEg4WDhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnx8fH1/f319f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4mGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiFhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOEhISEhoSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fX9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWDg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiImIhYaIhYaHhoeGh4aHhYiIh4eFhoaHhYaGhYKEhIWGhYWEhISDhIWFhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHiIiHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhIOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+fnx8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIB/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWFg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaFhoaDhIOFgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAg4WEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoaFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pjw+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE9MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1svLy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88Ozk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkeo2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbLy9DR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU1Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWy8yVhYaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18vMblBTU1NTU1RUVFRUVEyg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CHhISEhISEhISEhISEiGdAREREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fLzHFVWFdXV1hYWFhYWFhRofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiioaHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw7Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzM14XmFgYGBgYWFhYWFhWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ojo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2MzMx8XFxcXFxcXFxcXFxcXK0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Oz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ozg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjNzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztLSz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9KnntDP0aWi0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9aznqOm1rCgoqrSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7QnZqTncCemJacx8/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pjw8OTY/Qj9COjY0ODo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5q0wJihnLSYnKKer7HSz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qjo3NDo6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbaZlq25hp6WsLOp1NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PTw5NjQ6OTg6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/KoKO/ypyljKet2KqZqtTPz8/Pz9WlmbatmIGglnibhJ6To9XQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+OTw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm2rpuoiJx5n6mFmaXV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatre1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTGo5eXnaWnlpiautXR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZux2J+rpJvQn6ukm9DS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLS0A+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCw9XFkI2318KPjbvU0dLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWlqW0xfTUpMSlVMRkI8PD9GRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TR1MfD1dHVxcTV0dLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QURMTEE9Nzc1Ojg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9PTc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNBTEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUUE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29va2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NjU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozs+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e3t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs7QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKWnp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJydnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QD9CQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3NTc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OSlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6emn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqampKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg5Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz5BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpqaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKQj5abmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoJ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuVk5WZnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZlqa5n5mZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCjpqGioaKhoJ6cm5ubmaOmkZybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgprGuoKCfn56cmZmamp2tYXmdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpybmpuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgn6aSla2foKCem5qZmpmre0OBn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6foWGWqJ6enJqam5ukn01JhKCdnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52bmadsWqCgm5qam52cr25LTIahnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZilhFR0opqZmp2boaFgWE6HoZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoKGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRcXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmJiZoItdYJGamZudnKOOZVpMgKKenp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1tMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmZ6ZXl9zlZqcnZ2hgGVaTX+inp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYm2FiYHyUnpyelnNjVU+BoZ6fn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmKBqXFphe5ucnolpXlBUiJ6bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSeHNrWHyVmJ6KW1RQWYuSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOlZ+fkoCkp5mmmnlVT2SHh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAhaSZi3pijqOSmHOFhWh1f4CCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjkzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foSih3ZqUHGbjYpXbnl7f358hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2ZmHJOR0lzkoOASlxub3aJhYqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPo4hMMzI7eYR1cj89VmptgZCJiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuip5tfRWROPXl3Z2RINTZUbnGPj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqa6MS4K2hkB7e2hjUl9xUVtviqGhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6iidGjF0qhJgJWMfU9sintaYICjqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKenmZ2kpaOinmKCuL+qha+jmp13R1eBclJzlKKioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ5vgpSziLbWppy4sWJQtKNWZJChnqCgnp2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKvq6OjiXd/dXjTu6mTnqhsVaGqaF+Hp6CloqGdn6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e3tbS2sqywrZCIf2yYx8SXnKqSdlppc3V1f5KlqaekoJ+jm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyt7u8vLq6wrm0s52EdF5RnbCvpKKRhHduc3F3eHl8gomOlJmgpaespqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1uMPJ0NTRzMe8r6GMbWNSQ4ONfn6AeXVvbWRkaWdqcXJxcXFyeYmpx8e8oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMfb5OPXx7mtopSEb1dYUERhcmdrcmtoY2VYV1xXW2BoaWdkYGySusC/uamvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca+y8/Uy7mlmI+CblpQVEpDXGZdYWhkYWFpXFRYVVdYWVtYX32huLmrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVyZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEvsPBx8vJupd0X1JOT1JHPV5sYF9lY2FeZGNUVVdWVFVdf6eur6qoq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDubfEo2pMQ0VKRD1ZYWFkbGRhXGVfWVNQUFVhi7e5rK6lpKOnpKCgpZmptLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn52Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmdyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExMTCxMGzkFZITUY7SVhfaG1oX1xfWVpUUF2Nqqy4tbKsqaOhramsp62frLS0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmpqaF5rb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwsijd2BIPz9BXl1ca2RbWFZSXYiour66vLq8rK2mqbu6ube/s7W4ssHGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FodmhqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcbGx8K1gV1UL1VZXWxfUU1XhLnKx8LExsC8vrSwsLDCvr7BxsC+t7bDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjouUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandtaWZ2b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHCwsXGnE5SgImVVVSDtc7Sxba/v8C/uru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZ2RsZWJrbm9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr68xad8dICRlHW8zsfH0MCvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2RkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnPwLq/wLy7xb26wMS/vb6xc2GAkYmKz8S/wMm+sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjZ2pnZ2pmal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjLi/u8O1use2tbi6vLi5trO2no10hMm/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWVlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPw3aozL3Ht7m3rba0t7mztbG7xseWQnzKvr++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmNuYFxVSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE161zgLvIz8LAuK60tLu9t7mwvcPIjEZ2zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoY1xjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLGydGYcHOs0dHMysS1ur/EyL6+tL/Av3dTb8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdHBtbHRsbG5fY19iYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysnBhnFzpczMy83KxsLDy87BvLi9urBvZGO7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsO/pXh1eJvExsvIwcPAwMnKwb+7ubGgfnNsrcjFxL/Awb/Lx8PAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKx9bmhubXKBlZhyd3yXvb/GwLnAvL7FxL29uLGwmY9+gpzKwsO8vb+/w8O/v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3BvalxgYVpTUUFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1wqWHaVpeYE1SW1puc3aBn7i4wrqzu7e7vb+6u7uvpJqXiJJ+wMTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vLSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4iqCvtZ1qZWdWWWBJSU1QU2x2hqWwt765srWyu7m8trm+tJWcppehcq7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHWMoJhgVENYVUdhalZPRUpgjaCsr7a6tbSyrLy5uLW4wb2Kl7ChpnOly8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV5TT05BP0pDQUtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL60kIJ4iI9vTko/ZFlCTneAlGpOQFyBr7WztbK0r6y7uri2ub/FdYGpnZpkp7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVF5cUE5IREdNQkdORzg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBTodZSkpYd42BY0BTo7mztLKwsa2wubi2u7e6vI+hsaukc6uwqautq6OooJ2enpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRvZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsryqmZmVaE5AUnhwUElJS2ecgFlEUq67sayzr66srba2srS1rqimnpqbnZ+mqJ6gqKmfoaeWmpaXjp2TjpCWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqmkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqWmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqulvWhFUp2CUVdJSmBKVI1gY2KBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJqVlouWkY2Pl5KYnaKqn5+foKOlqJyfoKGcoZ+jqKecp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyWk4+PkpGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnyAdXZ9bmt7ZGlWUmROSUhHT1NOS05IPEVAPTJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra2urm6t7e7rqigoamgqsa/y6BQQXOdd1BuS0tjZnRzX1pecJCxr66ztaqmrKyjm5mUjZGVl5iYnJ+iopydpJ6apJaXl5WPkZGRkpqXm6Ckqp6hoZ6mp6uin6Cnn52fo6aonqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlpqWm5eYmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXyAfnd5fGV5emBiU1ZhSElLS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHx45XU0plo1plfm9yXFFrY1tkX1xqj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6KYmZeXmJSZmJadm5+lpamgpqSep66uqqaisaOao6amqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblZablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NbWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeq6SMeVVpcnZ1cGN2dlhXY2BjZ1hXVmetrqyvp5+eoqCWkJOboJyZl5KTn5yho5qem5aemp6XmqKdpKCeo56kqKytqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO1uLO4rbK0pKCdpaCsoaGioaCamZaWn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHZqeHVebVtSYUlSVkhGVldKQ01IPUtJOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqaiuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boqGgo4BugnBgY1hMW1NaTUxQWFJHTExHmKyqqaWgn5qSkZSYmJaWloyIi46UnZydnJ6WnZmmn6CnpbCppq2iqq22sLWysK22uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5t7yvs7C1wby3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG5cWFxDV05KR01IQ0ZOPT5MPjQ8OjY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamplJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn52KYVdeZWBXTVFHPj4/Q0M/PkJReKmtqaqmoJ6foqOdnp6anZuUk5WUnp6YlIWenaCZq6Orsa+5sbGwsbC6vby8uba4w76/wr+2urvAw7m9u6yup7GtscK2uMLGwMjKwMm/sLm5vbjCvri0u8bEvcO8uLSqs62qs7Svs66qrqOerKi2sq2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIRUpQST9FQjRGSDk2PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+VfF9eZWBRR0Q8Qz5FPD85Nk5+qrOnpKOioJ6lrKael5yUkZqemZWMioaIhnhsiqWioqursry2w72+srvBw8LFv7/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcbMzMzSx76/wMO+x8bCuMTKycTBx7+6tLq7tbu3sLayq7uyr7y3v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOVlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxAP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYkI9XI6urKCZm5yenpmXl5iSjY+Xl5SPjZCMgoOCdnJwbXCHpayttLjEus3Hy77CzM3NzMfI0MzMzMfKxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbHxsrIz8DJ0c3HxsjGwrzDwb+/v7W+s62/wMPDx8XHxK+/ubK4vcTCwrq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl1c2ViZ3JvZ15aWkRPTUNFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojs+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpudlmtmXVRJREA/S4aepZqEoLKto56cn5qYl5STlJeRkI+Mh4SEiIaDgIGBgHlxcm9reKK2u7m8ysHT0tLIzc7R09HR0NDR0c3NztDEzdTV2NHXzcbHyczDxcrPytLX0tfS1dbT1MjMx8zNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkdASVFDPkI9OjIyQTxFPDc4PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxjVExKREM/Q1Ku0b2yr6acnJygpKGdmpSUlZSKfXhxa2ViaHJwcnuFioB1cG1xcm+EnK28x9HR19bV0dbN1NbW09PR0tTU0s/Rw9DT1tjV1dLLyc7Qy8bN0srS1dfZ1tjT1tjN0srP0czP0c3T0MDJyMvEzM3Mz8/Gx8i2wMvA0s3M0MfKyMDEw8jPzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2FlcmNdUlxKS0dBRklKPztBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaWloKKiW0lAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBubHBvdYB3mLjV19bX1tPXz9XU2dTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NLY0tfZ1dbMz8/JzdLMztHAx8TJx8/O0tHSyMzNwMvNxtTPzM7JxcvHx8nMy9TU0dXP0szTwrnFsaWota6om6irpZ2yqLCzrKyTj5OOiIqOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlFgSkpDRUNTTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqeqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52Ym5yTfXFlY2JfX2FfXmFgXmFgX2BlbXBwbWtucHR5dml8qc3U2NjY0cXT0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHTytDU1dbO09HY2NjXy8jOxMnPzcrMwMnBycrOztDM0M7OzM/PyMzQ0cvOy8PJx8rNy8zS087T0tHQ0Mq9yLmwrru5tau2sK2ouK2zv7uxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0lGRkRNWUU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg/OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLJ7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeX19eXGJtcW5ucnJ0dXpxYm2ex9XU0KTKz87Tys3OxM3K0tLOxs7MzdTLztLNytbW0MzR1MvM0NHTys7R1dLV1srAysHGzcPIysPNxMbJy8vPy87N0M7UzMbJ0M3Jx8vGx8LGyszO0dHH0M/OzszQxcfBuLm9w8K9w7mysr6wu8PEtaqYpaGYlpGVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUVFCO0Q/OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWJiYmBdXmFjYmBfX2BhYWBfXVtdZ3FxcHFyb2txeXRlbp/PzZuX1snDyMjFxr7Cxc7Ox8XGzcrRyMvNzcXQ0s/NzNTKx8rOz8fHz9LL0M/FusS/xsq9w8fJzsXDyMDHzsjEzcrM0MjFxdDJxsLGycW/wcjNzMzPw8rMycfM0MXFyLvHw8nJws/Bvby/sMHJx7m9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSUhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXVxeX2BgX1taXGFrcnBubmlqbW56Z1WAwKJ5u8/DuL/Curq6uL3IxcHDwMPHysjIycfAxcvGyMrNycTBysnBwcvPxMvIv7nBvMbIvsDGz8vEwMO7ysfIu8nGxcrBvsLLxsXEvsa+vcHExszGxry/ysPFx9LFwcnAysrGyMbQw8PGw67Ey8fDyre/vLqzqaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdETERGUkA1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai+uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gISFf3V4dXJwX1pbXWBgYmNkZGVkYFtcXl1eXmBbWVpcYm5xbmpoaW5tc3lWapR7q8PFwK61uLCxsrCwwbu7u7m4wMHBxL69ub2/ucTJxcbCvcbAt7vDyL/Bybu2u7vFw7+8ws7Dxr6+tcG+xLu9x7zDurW9xsTCw7fAtra/v7zNxL22usi7v77MxMLGw8bJx8nG0MbCzMiyx8nDzszAxcO/vLK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUVCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstau3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrPxcnFx8G6xb2srqZgY3aBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF1ncnBsZmVsbW97eF5mkse5v7esr66lqKyqpbeztbOys7S7tb2xt7C1rrK7wrvBxLy/urSyur7AuMi4tLy2wMK9uL3HwcO7ta+ztbu/tMW4u7Wsub2+wL2xu7awt7qzxr23r7y/tbe1xb2+w8bAxMbGx8vFv8bGu8fLv8/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKR0JEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviI6GiIl6eH6FhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tcX2tvbWdlaGtsb35taLq4trOuqKulnKCnpZypqrGsqaups621sLKoraass7u6tsO5urmwqrS5u7PCua/Asb28u7W7x7nDt62qqLCywLa4vbCxqLKztbu8q662p662rryysaq4sK67rru4u8DBvrrDv8bDxcC8xsHHyrjFx8W/x8PDucTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTExNSkVBQz9GQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltpfpKIjo97eH2JhXl7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpaWlxkbW5mZWZnaWtweom3r7Sso6KkpJieop6YmqOprKOnoauprKuwo6afqq20trG9uK+3r6ituLSzvLezvbC4ubWyvMGywK+lqaOrsbOzqL2qq6irrK61tKaprqGlr6mzpqiorqaot6yxs7e6uruyvL6/vsS/tcHAx8i3v7/Ft8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpTU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvCy767yba9w766yrfBxMG0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tYV1lcX2ZrZWNlZGZobHGCpaSqopqZnqGRmqKYlY+foKeiop+lpaelrZ+cm6SmrLKwtrensKyoqrSrs7mwtrautrqzsLq6sbakoKSgprGorKm5qqWnp6ins62gp6efnKSmrJ+fp6ShobGtrayytbOzsLW8trvBwLK7vsPBsbm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeXFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG6vbagnpWdoKa6tquzs7uzxM/Jy8LFuLfHwMy/uMq3u8W4s8W4s7/ArLa8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11eZGJhZGVlZGhqbIacp6Wilpedk5iflZOJm5+gpZuen6OloqedmqKbn6qvrbG1pKiqqayspLS4rLewrLO1r7O1r7Cqn56fpKKypaaquK2ipqagqK2rmZ+gnpmdn6WamaOcnJ6wqayoqqusrbCyua+4ubqwtry7uquzsrmzvbS3srG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU2MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXV1hXWl1hY2NkZGVmZ2lxiZCCk6uXlpOXnZKTjZmfn6adm5ykpqGkm5+hm5iura2usqCkoq2rp6G1sLGyrKmws6i6s6e2oaKfnKOhraOiqraroqOmnaamo5aZnZeZmp2fmpednJ2craGsqKOkpq2rs7OqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sLq2ur2/t7OxlIZ6dWZfZl9bWVZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/sp2lo5ilscO1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrWvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1ZWWFdYV1VXYWNkYmJjY2NmaXNzR019kJCSk5qTlpGUnZufm5agoKijnp6onJuaq6eusKqco6O3qaGgrqi1qqenrrGkuLCkt6CjnJmZqqahmq25sKOhpJyjoKCTlaGUlpacmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrK0sLy0uriuo5SCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va2dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dWVVpiYmFhYmBhY2RrcmVnboiOj4+WlJiSkpidmp2Vn56mpaOmp5+dn6agqq+mn6GjtqehoaKps6KlqKWwprGuq7WfoZ2WlamhopStsbGfoqOdnpick4yglJGTmJiSl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa68trGvr5+Se3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLi7vMHFurK5tcTJycDCxsXHtsXEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlZSVFJUX19eX2BdX19hY2mBj4WFi4mPjY6XkJGToZeelZuepKGspaSko6OinKqrpJqepbGqoaGepaqeqKKfrayqqa6toqKilZiimpyQq6mwm5+in5+XmZOKnZGNkpSWkJiYk5yho5ykoKKVoKKkpZujq6WipKqkq62lrrKppqWmprSmqqits7W0ubqvqqyejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0lDODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuxrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG+w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNOUFldW1xdXV1eXmFjbIiKfouBiouJlI+Qj5mZoZqan6eoqqirp6mmo5mlr6SVmaWvqaCcmZugn66ZnKqzn6amn6OjoZSUm5aWkqmprZucn6Ghm5SQjJiNjJGNko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64paOko6ytqqirr7S3sr21s6uumIV1dGlbWFlTVVJGWExRW1hNVU9QTFFSSU9JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqior66bqaist7asvMq7tr+szMbFuMDOz8ezxLu3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVlZWVxcXF1eX2R6hnyEeYaLhY2Jk42Ul5+emZ6qqKaurKmwpKian6yglZWkqKedmJCPmp6ulpinqpifnZSloJ6SkZKRk5WoqqWamJmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaefo6y0q66nr7SwubXAsa6wq5F+cnRjVlRVTlFKR1ZQUlJMTFhOS01PUkdOS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsbe4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucWpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUU1OTVJXWFlYWVhbW1xgaXp0eW+Ch4KLhZOHkZGVmJecp5qfqqamq52nmaClm5KPn6Oal5eGhZKbpI+VopyWlpWHopqbk4yOipCapaeclZWXnJGTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKqupLKyprW7taussaKKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExJSEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrCkp6SqpaCppqSzqqKyw7W1srPGxbe6w8rMxrOtur20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVldYWFdaXWFsbHBqfoJ9g3yNgYuHko6RnKCOmZyjoaOYpJehnJWNh5majHONg36Ol5aGkpqQlI6Ne5mPnYyCiYCKmKCjnpCTmJaFjoKUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6mZhHh0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CRlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KR05TU1NUVVRWWFpdaWZrZ3l/d3BMVm+NgJSEi5qWiZKQnpidlZSWlI+WioCUiV87Vm98jJSKgIySjI+GhnKLhJaBeYF7hpSdlYOWjpCPg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iHiJaemqGgl6euqa2pqZ6WrbOipq2ZrauYqLSjqa2ik390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKKtoaamqqCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qZh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSEZITlFRTU9SVFVYWWBqaGJ1fG9NQD5+lZCOe4aTi4OJjJqNlpSJkoeFlYZ5iX9gSlFueIuShH6EjIuEf39tfn+Td3V2eISNmnBRjYiKhnx+eZR2Z3eGiH6KiJWLjpGTl4yEioiUhZuNgoWSm5aenZSkoqippaSem7CqoaSkkaaqlqKqnKGmp4p3bmZeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpuipp2foa6hp6ilp6ivrKq2vLa4t7PBu7anuci4tqiotbaqsrynnpWOf4mUqZaVi3+Og4J+eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFVaboFucHhlZVlSjoiThnJ9hX97hIuTgZKZi497ho+AdX94c291cHSOjoF6foqrhXp7aHZ7jnBybXiBi42SeHuAe4B3c3KSeGh1hYSEhXyVioiKjYuAf4SLjYCUhHyBj5iUnJaRn52pnqChnaCppZ+dmI2no5Ogn5aen6SBc2liXV1KV1BSSEtYUk9KTUxSSkpKTFBITFFNUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX53hnd8d3BvallLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxOUVFTVl51gXl0YnOKlJeNjXpleH91d36IkHyDmJKAcYaPe3Z7b2t+rXx0kIt/eoaSgHx/dGZ1fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZudnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSU9QTEZEPTs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4q7u+uLOsp5uwp6ybj5acpamkoZiZjoSSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpZSk5PUVRYXWZwcGmFpanAfXJ3YXp3bXp3h495e4uFb2yMknhzeGlqgIJxlpGMgX2Vf0mSmW5nd36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgHBqb29vWVZYVFJSWU9SVVRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpKyvoq2qqLWvrqy0v6u8w7+lopmVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90bHBsZWxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVtfpoZhmGZwd2N8bmx+eYqIdYGHhXRsmZF0c3xpap2OTHmFk4mEjmYxdodya319g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFvdW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtOUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlZmLjoV6hJCYlY2QjJCHcYeCdIiMhnpwc3FvcGRwZ19URklDPjw7OTo/QEFEQ0VHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQklRSWKusp5weXVqe2twgoCEgHqEhYV5cqCUdHiAc3SUhzVwnaidj6GhhKKFdnCGe4Z8dIyujYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31ucm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jnxzcnFtYFxdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkg/Q0Q9Ozo3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KRgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bHdud2NqXklQRz0/NzQ0OTs6Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMOEROUlNESoRzfnp6dH1rdYaHe3yEg36LfXWhmXl+hYCEmYSanGGGqp+dioOQjnp3iH6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1Z2hgW1xeU1xnXldRVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydnqaRoKqgsaivwLK7xbqWjpGTh3qGdmt/i5GDfYqDjox4g4BzoISKfX2Bf3CBfnpodmtSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1FSU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVFxYUktngYd6iHh6cHuOinl7iIZ+lod2oZmHho6SlKWNrKlIhq6wrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4eFi3mUnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXlxjZFhnZlxVUFBXWVBETEtGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc3ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeQjpWXkpagnaygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhvWVtdaIuRhZN/goCDkJF9hYiQgJmUgaChmJSbmqatk5m7sae7x8Ooi4yhpY6TiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxtdXVmf5SOhoiIh4iHoKqilomOl396gYh6eW9na3h+fIB1bGVeW1teal5iZ2BaT0xOWFJRSVBKRE5HQ0pEQ0FEREI8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3gnp/jH+BkI6KmpuknaGspqqusJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+Kf2xwal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZmbHSamI2YkZGJjI2Yh5KPnYugn5GjqqWjq5OptqKowcKtx694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpWMjY53j4RxbYWBipaRgoWIcYigloaRiY2PlqS0qJuMlKKDh5KDfX9ramp8gYKDdWNfZWBbaGxebGxeV0tITlJRTUxMRklQQ0RORkJDRUZDPTo5Nj08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeEiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop7coB8nZqapaSgmJ+WoZScnqedqKqfqKypqrWXq7+rtsfIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOikpeXgZSee3eVkqqyiIyXn3yUnZuNkZWYo6Glta+ckJinh5aPjYCIbHNzfYF+c2phXmJgYmhkYGhnXFJFSktQT0lJTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhZKFg4aJgYCHd15iUDQ2MC0xLywuMC8uLy4uMDAxNT5BQU1RUlNRUlNVUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3aUiaCkp7K8t6Otq6umqLOrr7Wxsa27sbO9m7LDq7rJy7fDv7ilorCzrK2qo4uWmISlpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugoq+SoZ2inY+joauuq7K0oZSkqYiZiJKJlXl6foaAaWJpXWZjX2VkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpblh6hHaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKFiYeIh4dxbmFARTY0PDIvMTEwLSwrLTAuLTQ/Q0FNVVBSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeAkp+DrKKxqbC/xsKpssW1q7K/sre9tb+0wba7uqO4xai1yMe1vbm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqssLWisayxtbu2tK60n6ano6eaqa+ssbi3uKaataiMpI6Qkp+GeIGFd1tjZVdnY2JkYWFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPTg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmJXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4Z/hoiGioeQenhuXVZARU48Njo0NUFCNzY0Ly82Q0hCUVtPUVVXVVxXUF9VSUtKQT8+R0tGRkQ7PkA3RDc/QkpKRUZWVFBejqOsorGzwbS2wMvItbvEvbKzv7a3wbS/sLd0sbOmusSksMa5sLKxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+trq3uayrsKWwqa29sLy6wcGrmLmnlK2Ol5epiH6DfmxYZGJZbGZrZlhcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36Og4COhG56c3iHYrmhmaOJlJSWkpSTjY+WkYeGe4aBjZWKgISBinp8ioeGfYqCgYuDlX13enVlUFxkR0VLO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgX0xTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1lUXZOut7S5t8i+uLzJzLq7wLu3tbu6tr2zubHFYHWxpLGanqq9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfo5Ojp7G0qLKzvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr564qaGrjaSntYiBgXNhY2NfWWNgamdTWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWin6Df4J4e4qDh3uLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RUWVVKREJLS0lGSEhISEJJOkQ/SEtTVFVcWluTuL+4vbbFv7q4ycq6trm1t7myt7SzrrW2mGR1p5ytcF6irJyYoKKbpJ6qpZSfn5CTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/X0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7HzbKjurC0rpqruLqYgHttX2FdWl9iWmRjUVtgU1BLQ0FFRkU8QEU+QUhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFbWWhfb5aSkJRubG90dYezq6Chn4uZnJmMjJWRmpGFiop+iIaMkIuIfIGDc3uKgoV7iXSCioaVf3N7eWxtdXtocmVpbGlnamppYGZpaWxabXOWraS8iIZnW29nXVlaVEhLTlBKS1BLU1FJTEFKRkpPX15hZmlhl7bGsLiyury0sMTGta+4sLC7q7Kxpqq3q4y1p52ap5pOmZ2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NTU1tPM0NPVzdLPzMXCydC+ycnKydHHzM3Cz9G3r8O8w7mktbnBooNwZV5fX1phWFpnWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCZ3FveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KioqQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNtaYFwbWNpbXB4aXd8fsu/wd+nbWN4bmNbYmBKUFJVTlleT11cTlBOVFBUVFxubXaCcZatt6uzpq+1qay7v7CqtKakuKarrqCrtKOOsK2al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXlJuRnJeZmp+fq6ylqKKsrc/S1dLOzNPU1M/U0c7Hw9TRx83S09PXzNHRxNLWxcHOx8fCqL23zp58cGdfZF9XYVNfW1BRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VVFNTlp1hoWKd2x3cH1+f6GenqGMjJiTk4uMko+VhXmFj5CNioqIkIZ+gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmuAc3Jpb3F6eXF6vsuafouxhHZyhHZoYWtdQ1paW1ZlY1hkalNYXF1gY11jd3p9i4GYqaSkoZ+gp6Wqr7iqpbOioa2ho62hp7GfiKaak5KRiZKPiIGTiWqUooyZhIGGfpGDg5OXrYuVjZWZjoaSkZ6XqLCioaGlpKnJzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuNdXBlYmFZVVpUXFFLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO09MRkpYcIB1fWhzeHKCiYCclJ2UhYuViY6JiI2Gjn94g5OYioyHiIuIfoJ3c3t9god3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHR4e521jDtAi8Wlfox8aWVXSUNmY2VjZ2pjbXdbXmZoa25oboCCh5GLnJ2gnZCXmJ6jo6Wxo6Syn6GlnaCooKOxnIWekpGRj4uOi4aDj4R/nJuMjYKEhXmUf4KplaOMkYmXkot+mIuakquzmJucqJynvsPGubbGztLR0tDM0svI1M7Q1drX19jU2djN2NvOydna0dW+ysu1enlwZl9bU1dSXFdGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Cdi36HkoOJhoSJgYd8eIWWloiOg4eFhnqEeHF6e4OGdXmFjo2ceYtwfG9ven9xe4Bxg4eAbo56dXd9fIJ0fnyGh69zWKrCto2RgnBtYj1eaHJwcXBueHaBZWhvcnV4cXqLho2TkZqVn5WHjJOaoJqeqZ+hrJuhmpifpZ6fq5mLmouQkY2FfYiHg4WLjqCZk4iDh35smXqEmIaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfZ19jX1dvX09nb1dDa2tHWyNTLlnt9ampdXFFUVGBJQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg3REI3NTU0NzkuNTU2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD5DR1JqXm1kYmZrdoCIcZGQmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR5kp6OoHaOdYJzdYF9c4CEb4GQgm+ShHV8gYV6doZ7ibfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpOUjpeRg4mPlpqWlqWcl5+WnpKRl6KdmauVkJCKjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hiZGLvKGYk5iZnammpq6fqLa/wMG5x8rOzsXNydHW1dXZ1dfb1NfZ2tvX29rZ2M7bxoh9e2lrZ2FVWVZXTkxFTkM7PT08ODo7PTk9QDY9P0A8Pz08OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyKjZJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXuGfniPfniKim6CmoB0mYZ+gYmEe36Qeo+pjo/Dob2LnKScfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdi4uQkoWIipCTlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouApZmIhI2ChYSBpIeLi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pua2hZYl1UUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzczNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1DUVNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WbopudlJJ/jIh/mIeAm5Juh6iFeqCLfJGNg4iEnH2akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpKLlJSTjouPioeWmpyPlJaQipGThoCLiJKNioqclpiiooaTnZagiomIjZuQg4iOgIOHhaSGjJCzmJ2SlJehoZ6ZkpyeqLK4raa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93amhfXllVWVlDQUlDPz4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjA6Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnptYX6Sg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIKEfn+SpqSfpaKXip2QlJeLiqiXcoqxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsJ+QlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVj4aHiJCSjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ6WmoiOhpaXiYSOjIF/h4+kiY6UqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU0trOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjnx8bX6IeHp+eoGBgn52doCCe2xvin55fHd4fISGin6Lo7SopKqzoZanoKWklpWvooOQuJWSs5qNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiIiOlIyKk4+HgIaHiJOYlIyKk5OGlJiGhJGQnHSRmLKVlqShiJyZk4+KkIqWmomKlo2GfYyYn4qQkJyamZOZmKCUoZ2Vn5uhsa2jpLe+s8XHxL3Dw7/GzsrJ0qfOzNPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVxcWUpoYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc4x5fYF7eIaLiYaEkqi8ramyvbClrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqZmYm5SVkZigl5m7u63KoWm2t6qwlZieo6uSl72kXqqzgomKjJSHkHyOjn2Dho6QlJSIh5KWi4+VjYuMl5mTnJm0lpWrnouclJKNkJKLmJqKkp2Pi4mVoKKNlY2XmZ2TnJielKGglJydpa6ooqSzuKvCyMS2ur28xcjIwtChxsnNzcTX1tDK06NzfWtfW1VhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBKQIuKfoByhod8gYl1goqDfm19fHx+cHeHd42Bh3uNkIyGjJqrw8Cwvca8s7TBvLSsq7O2jKiyra29q5u7o6itubirpqaioqSjqq+ysaqdnKOYm5iYnqKlpZOjua+owLusrbK5paOnfYiGnK29sIKLi4qQg4+DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWRj5WXjpGgkIiUm6SslJaPlJyelKGem5ifoJWanqenpKKksLOmwMbDsLC7tsXFw7/Np8fDx8O81dDMxMqKdnZkX1xiXU9MQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdbXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqUepKUlJiRk5WotMfJwMLMwsO5x7y6r6u5u5eytrqywK+lwKOrsLy8qq6ro6Kep6yvtbGpm6CqnKKclp+ws6eMorq6tcG7q6icsqSjqJSEjqnExKSCi46GiISGlZSMeoOMkY+RoYyMlJGPiJegmJOZlZeloK6cjKqcjpaPkpGVlY2QlJGPoZOGl5+gsp+Um5SgoZmkoJqgm6CUmJ6npKanpK+tpb/Dwq6ot7XJw762zrLEvsO7s9HJyMG1d3tvXltebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB7jH93hoGCj3mNoZaompqYu77JyMrC0snKws29wbOtvL+nur+9vMS4rcGprLO8vaqwqqSlo6yutK62taCfrp+mopmjtLypm6m8waO2tq+rk6+rqqyWhpqqp6WRgoySpJWJgHWJkXmFjZGQnp+Sj5SLj4yUo5mXm5WUop6pn5GlmoyPj5CVloh8jpWSkqOalaCinLWmkKCXpaSjpZ+eppielZecpaOoqKKyrKi7wMSvpbO3zMC6rsOzu73Bua3CwsK/mXB7Y1tZXl1NTU5LR0RDSEJBQUNLOjRESDo7NDw3Ri4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRlV56QnY6Xjp6SiYp/iJ+ShHiFf5R+f5CIiZCAlqGarqejmMO+ycTIxtPNzs3LvMK3sLq9tL3Lu8PBtre8rbTAubyur6ihqai2rq6psreanqyiqKKdq7e3qaWvvsSxvbizp6q0s62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZl5OTjpOVk6Wdk52ZlKCioZyYn5iLjI+Qnohaj5aXkpakmWaZo56zpZailqytrKecn6eXmJaYlqGjqKaftaupurvDtKa0tcvBuKq2rLO7uK6ouLq8t4RvcFxaVldQR0xUTks/QUhEREhGRjg1Rk07Pjc+QUsuMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmZjTUamlJyWoZeoloyQg4elkoiBh4Kbg4OVkJCUjpqin6++rqHHvsbFyMfOzs/Syr67trG7u7y/z7XEvbe5t7OytrO4s6ynnKuruaupqK+vl6OupaikpbXBsKustL7DucC4s6e4tLeyr5WkrbCvpIuTlKCNc8GZfZeZhI6WmYuxlZqZlZKSmZmlo5Wfm5aaqJyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZWvr62mm6GmlJOZmY6dn6ahmbSpqrO8vLursLLHwLimrKutsbGjobKytKVzcWdeXFBTTUZRUVBRO0hLSEZHQUM9OUtUP0E6PUVNLzc1NDQ6QjM0TldOPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aNiJKFn4eEnJeOnaCao6S1ybSpx7zDxMnLycjMzse+urOvurjAwc21yLrBubW6sq+vs7SnpJyqtLWrqqetrJmkrqalqay6wKirt7a+wcC+t7Kyw7C3vKyjrrWtuqWIm5elmnW+n4SYnY6SmJqLrpahnJuXlJqfoKmep6CZmqqZoaeel5CNkZ2DbXWTopqUnKOfkK2yoquVqaqYqq+mpaGlqpOSmZyJlZyinpawp6mqure+s7Kuvrm2oKOnqKWmnJysqamNZmhjYFNNTUdJT0pVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0M6OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyUnKGfu66YlJ6Lk6qbkZGTiKqMhqGejKOslKOktse9tMK7w8LIycXCzsjCvbmyr7m1wMPKtsaxwby1u6ypraywo6OZqrS7pqqnrKqdqK+opKuqvryorby0t77GvLa1uMCwvb+zqbW3rL+lj6KXkKGfvJ6JmqCZl52dj7afqZylo5qboJqnpbOhm52lnKiqnZiUj5Sbi5aJjKShlJyin6C1sKWmk7Grmqutn5+lpKqSlpWghJCen5yWqaShobS1uratqLWysp6coqaal5WZqqGeeGNfYV9MSUZITlFJTkVGR0JRSkhAREdBVlNESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6Sen8Osm5ekl5mom5Wamo6qlpWoppWtrJmiq7fFwry/t8HCwMjEv83Gu765srC5tL7DyLW/sLy2urenpKurraGhm6uqxKKlqKymnquvrKKqqL64pq2+sLe3xre0uLi+sb7AtrSyta++o5ajlZOak62fkKGhpKKjnpC+pKidqaycnKCbpp+9opijnqKpq6CdlY2VnpOeh46EjZOepKCdtqymnJayppmwqKCcq5+hjZqVn4SOoZqckqWkmpirsbWxqqWqraybmKChko6QlqmflGllXGJeUEpIS09MSEVESUA9T0hAO0ZJSFtST0s9SE5VNEJGOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0tME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOo5ujm57Fq6Ceq52crZ+Rop6WpJ+mqquXtrGjqbO2xcK9wLbAwrzJwr/KyLa4tbSxtLS3wsa3vrG4tLq2oKesqquenp+lpMGloaqtoKSprbCipqi9taWxu7e2tcOysre6vrLDwLi4rbS0taOdpJSRk6Csn5ihnaioqqKawqyonaytmpqdmKagvaGdpJirq6umoJmNmp+SnoiOWH+Wn6ahoLmqppSYtqOes6KhnLGYoI+alZ6Cj6CXlo6io5WQpa6zq6mioqWklZWcmYuPkpOkn4ljZ1xlYU1KS0tPRkVBR0s+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMUJ+foJiew6ekorOgnLKnkqmjn6Oeramsnbuxqay1scjDwcOzwsO+x8S9xMq9sLG2rrG1sMDFtbqxsLq2rZqpsKmpm56moafCrZytsZyqoq6xqaSnvbemtru9r7fDrbOzwr+yxrO6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypZ+pqZmYl5KipLigoaOSrq+rpKWekaGelJ2OkI2UnZqjn6i1p6eNmLSco6+boJywkaGUmJWbgJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0FDQEhHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZ3JAODxIlndlQTSfpJ6boMKno6mxoKO0qZWxq6aipLKsram7sq2wtbTGv8TEtr/EvsrFtsDJwrWstamwuazAxLS3r622uqWZq7Ksqpihp5itu7ScqLCbrZ+utLGnqrqzp7mzuLK4wKq3ssO9tMWnvq6tt7Wpp6uglpaRpaShoZeXpK63rbG0tp+fqaSZk5STo6C3o6Slla6xsqWppaGem5malZeon56Zop+vs6KmjZivmqWrl5ufp5Odj5WZmoaWoJWMkJ2elIupqaqip6GZnpaMj5mQgYaViJWfemVqXWxrTlFOTlQ9Q0FOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFpVkNXRox5ZkM7pKScoKW/pqiurqCptaqdt6+ro6q0trGwuLewt7i3xL3Dx728w8LHwbrBxsG6qralrbutwcO3t6qtsryjla2xrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaurpp2YmKqhoaCRl6Cwr7OrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2hmJ2jtLCbn5GUppqhqZuWo6GYmouWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPm2xpbWJublhRUVpUQUNEVEA7O0hANzpYUGReUFdXRFleXk5MU05fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhsfWhcVjqJe2NDPaifnKGovKCpr6qisbeopLSxqqGttb2vs7i8u723tsDCv8nEucTDwMC5xb3BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts56rorGws6yqtrO1vK2wsbWssLSywLrFtqu8r7G3rK2po7GlnqSonqOWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmcqLapl5qTkp+ZnqGfkq2gmpqHl5mMnZqdlIuPl5eal6emo6CelpaWlIGQlYV7j5ODjJdnbXJocXNgR1lmVkRDTVhEWjlIQjU+XVFoXE5aXUdbXl1PTVNYZEpLQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmqCkq7ajq6ikrq21qa6zuKansLfGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbqztayquri7ur61q6+xtpmYqKurrJyuq4+rvp6rr7Gjqp+xrbOurraxuLaqra6xp7Wws7q8ybKqtbSwtLCupqCzoJqorKCklZWambGiraClr5aipJqZkoyipaeyqaGmsayqtaSusLSvo5mdraebl56amay4opeTkY+YnKGZmJWuoZ+WgpWZjp6cmpeRi5STnpmlo6OhmZeTkpZ7jJGFe42Lg4yTbG55b3Z9YkZgalpJSFpbPXtKR0U2QWJVaVtNXGFKXFxaUlNTYmFMS0VgYWBQTUlQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpagsKexqayko66ttKi3s7ejrLS3ybq0u7vAvrSzt8PAzMe7xL23v8DAuMC9sr2uqLq5uLfCt6yusbmVl6evrKiks6mUr7ukrLKypqejsrSwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp6fprCgo5SbmZSwnqebn6mNqaKdm5WXpaWkt6eisLOrp7Gnra+1rKSZoKyonJydnJSquZyVj4+MmJ2jmJGYqKSgmIWTl5GdnJiXloiXj5ebqJ2loZKWkpCWd4SRhnyGgoSNjW5xeHZ8gFxMZWxcSk9kXT9ie0dJOEdnV2ZbTF5iTFlZV1VYVWldT1BIYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2jrK2qpqOwsrKqt7C1n6u1ucm4rsG8w7ezsbXCw8/EwMK+tb7BwLu/vLTEqKq5sba3wLyvrLS0nqGnsa6lprGlnrK1rKqysauoqLS6rLSytKuzrKqrqKypua2ysMe/uKS5sKmtraanrbClpKOuo6ibnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoq5ygmZuSpLWaj4mOiJGjoZaPlp+ilpWGkJWUnpuZlpWHmJKVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2NuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVVloXlFTTWNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mpoamvpKejs7OwtLSwsKCrrb3Muq7BvMextK2zwcPRxMa/wbK+w8K8v7i9xaitt6y0uLzAsayyraGjp66qqKWxo6qwqq6rsa6urKuzuqa3sLKpsqmqpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqooZ6bo6yVpZ2YnpmrnaGnqKGspqOtrLawsaCpop+qrbCrnZ6np6mao5iZkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpmWhpeTlJelnJ6djJKQjop/f4iEfXeAh4WHdXRyiXdsX1lgbmNRc3FcSzuEe0Y/V3VYYFlPY1xNVVZVV1FcYl9TT09oWVdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZasp6CpsZuoqLC1rLi1ramkq6q9ybyxvrjDr7Css8PEzs7Dv8C0wMTEusG1ycSsr7eus7rAvrSurqymqKmxqaapsqa0raqvra2xrrKts7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaesrKqtoKimp7GxpKaloaGrlqqhk5ugpZ6jo6qjrKKeprG2rKyipaOaqautqZ2hpaSkmaCZlo+YnZOBgpCJhZ2gjYuQjZuQko2Fjpmlm5ORm4yTkpKUo5qcmouPi4x8h4GCgnt1gYSBfnV3i6OHeGpeYG5mV2aHZE5AZ5JMRGJ6V2JYUmVVTVZWVVRPXF1hVkxPaldWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJaRr6Siqa+Yqaittaq1sKqkq6qpvMDAubm0vLWmsq/DycvRv8G7ucDAwrrBusLErrG1srS8wb6zsa6trKynt6qlrbCruK6osK+usau1qra1prS3rKykqaqcpJ6zs6iopLO0n7Wtoamoq6irp5+rq6i5tqmqqqmhqZ+tm5GqoZ2go6OmoqqenKa0rqelqaKkl6Smp6qcoqSjoJmYn5GOj5mNfoeMh4WenomFjIuQj5KOhYiWo5qOjZuRkpCPkp+YmZeNi4SAdIeBf354dYOAenh+f4idj3BxZmdxeFxhdIhqT12YVkhteVVkVlJiT0xVVVVRT1hbYlZJUWpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqjrK6ytK+qpK+pqLu/vMKyr7mtoravyMfI0cC/vbq8w727w8G/v6+xs7K2vbzBsrK0q7Sppbappa2zsrivoq21sa+xuaq4rqqut6uqnqqroKOhta2poZ+usqG0qp6op6ujqqGhrK2ova6rrq2hp6efq5mPsKKYoqCop56nm5ipsKmin6yhoZKhoqOnmJqopZiYmJyPi4eViHyNhoSFpJaGg4OMh5CQkoWHlaGWiZGekZOQjZGclZiPi4aGeHSBf310eHmAe3R0e2qCiKR2aV5lbIF1Z4iLfFJWcF5KeHNUZFNRX01NU1pmTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUMzj46woKSlqqKlo6ymtLOxqKSwp6q4vsG9sKi5qqetsMnGyNDCvb+9ub+/vcm8wrixsLWxury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbWrrZypr6SfpKyqqJydqrKks6iaqqeqpKmdoqmnqb2rs7CunamjoK6bmrOilqWbpaSfpZqZqKqlnpqpoJuRmqCknZmXqamRmZqSkIuCj4V9j4OAiJ6Ph4B+jIiSkJGFgpSblIaToo2UkYuRm5OWh4p/gHJ6eX58aHZ8e3Vwcn5qhnqFiGRfaGNyhXttZ3ldXlZCV3ttVGFQUllLTE5wdF1JWltoWUZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mkoqGrpLaysaSpsKatucK9t7CkuaypqLDCyMnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq660t7SpnLm7qLG+srqgrrS2qauerbGjnKWoqaOdm6Swpq+hn6qpp6KqnKOooK28p66xrqGqoqOunp6sppifmqGim5+bmaOqopqao6OVlpOfoZaclqasi5+Rj5GMgouAgI+Be5qUjIl9f4yHkZCNioaTmJGHlKOKkpGHkJmQlIGIfXpsfXZ5eGJ6enJwcHN4aoJ1a4JnY2dhbnOObWJqb19wQV15a1ZeTlFRS0lNU1lWTVxebFdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPiORlquYn5enoqGfp6O3r62ir6+oq7jCurOtoLmvq6ezusfKx7+3wr2vtL63xLbCsrC5sbLAtru9t6q5uL6qpLWnqKqvrbiwqJi4vKOtvrS0oa23taamqLCzoJ6lpaehpJmerKeonqCqr6egppeiqJ+wuJ+jsa+hq6GspJympqiam5ufopWcm5qdqaaWm56okZiSmJ2TmZahqpCaiY2Qh32Hf4KOfHyhjIyJeoSNhYuOjYWJk5qOiZWfiZCVgoyXjZF8hXx0cHxxc3RgeHhpb3BxcGt/c2R6bGhlZGFmh4BgW3Jqck1OgGlYWk1RTEtIUFJQR01bX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7Szqam6xLeyrqG4ra2rr7XFx8C3v8G5sLS9t7+7vrCsvrCzv7G8wripu7q4p6i1qKerr6uyr6SYu7akq7q1r56xuK+ppaevspyhpKCko6CWm6+moZ+iqK+hoKKTo6SitrChprGrn6yjrpecqqWon5ianaOTmpuanaWqmpubpZSUl5WcjpOXoqihkImKj4Z6g36Ei3mPl4qNh3qCiISJjY+Fj5OYjI6WmYuPln6Gl4yPeoF7cHJ2bm9zX3h3ZGxsbGpqhW9mcmlrZmheZHOBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUEVZVVllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qco6GiobeqraC7t6WsvcW0sa+jta+srK60w8O8s7+6t7Gzubi6t7qvrsCztLmvv8C3rL26taaisqmnqbGqrbGgmb+1pKe0taiesrypqKWpsKyZoqecpKWUl6CypJmeo6ipnKKfkqSgpLippKeupp6loaiSn6mioaGZm52fkZmblp+hqpuamKGUkZSWmY2Uk6SopJCJiY6GeYR7hIZ9nY2Jiod6gYSHiIqShZaTk4uQlpSOjZR7g5iPi3d+fGx0cmxsc2F3dGhoamdncIdoaGljZmlpYGpjamhbZntjYFN0VFxbUkxKRklPU0AhKmheaUxEV1VeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKeoqOQjaSmmp2enaO0raequranrMTBt7Gso7aup62utsC/vLLCtrCusra1uLa2raq9s66ysby/t668u7Gln7aqpaWzp6mtnZzAq6ekr7KprLW7nqiqq7GlmJ6qnaakkZilrKKYnqSpoZyim5afnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnZOlnayhl5adk5ONlZeLj5ibqJ+RiImLiHiFdoGCgZ2HioKKfX+FiIeGkYSWlJCOj5GRkYyTe4OVj4Zzfn5meW9ramtmdHNrY2dkZHaBYmVmZmZqamNrcltfWV5tZGFOaVhaYFZKR0hLTVJYPjlfbGhIQ1VUXVtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4ytoZeXoJaks7Gisr22obHGvLqxsaO3rKqtqbi8u7qtwLKurq62rrK4s6mrubGvrrO2urawuL2spp21qZ+fr6Oprpyhv6Cwo66wrreutZ6tr62uopmdp6mln5Wap6WfmaSiqJ2an5qUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXOBgYqYhYd8iYmFhYqMiZKElJuTko+QkZeOkH+AjY6Db4F/ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdramhuXWxsc3BgVGNpY2ZZSUZMTU9YUVFVYWWAVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMmNJGhm42PsJ2Zk6GaqbGvn7m/taC0wru9urGmt6+nraS3t7a3rbuurKqrtqmzt66msrWyrqmwtraws7a6p6iftaicnaigqKyap72YrKOur7W1ra2fsa2wqaKbnKOrqJyUnKaknZqpoqSWmp+bkJujqquqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uOlJJ0d4uEfoOQgGeHgGd1aGVXXGhzbU5QamNnc4VoX2Vmbm1qXl9hio+DhGVOS0Q5R1RoXkpHUVBUVUxIUmBvdGVGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNzAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Ko5mFlbCbm5Ogm6qtqqO9xa+pt8K3vb2tprewpaqitrOxsrG5rKmmrLSlr7Siqbe2tqinrLayrrSts6GpnrOqnqCjm6Wml6u5lKWlr7O3ra6lqa6rrKWhnpyhp6abl6ClpZqbp6adk56fl5CdqKmktrCko6KdlpiXl6OIoY6Smoagh5OcoH+lf6WqnpKSmpGIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbWllY3pscmFThW1ibGmYcVhpcXCIWF5pW2xsW4hybnpyhWeGhFpfR04/R19NRVJWVlFRU1dUZ11NVkhSUk9GR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oiqaWgpyrnJiYnZ+pqaeqv8Ousbq8tsC/qqW3r6mspLK0rq6ztqqopbCtpbSym621trWmp6iysKyyp62dqZ+xp5+iopmgoZqss5SjpKW1vKatp6uqrKimoaCYoKajmZmlo6SYnKSplpOinJOSo6WmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbZaxq7B5aGxYsa5uZWm9krxuZ3pvco/YflNrY7ayf4FylHOaoaqQV09XYk9WTkZVW1hRUFKMXFdbUEFcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+OkI8P0E4Oko+NTIqMjJCRS8uMzIuKy8oLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ6lrLKosMK9sbW/tba+wauns6ysqaaus6mutrOnp6a0pae3rZyzsrarpaSnsa2ssKaqnaajsKKhn52Wmp6crauTnaKftLqjqqmira6loZ2amqKnn5ebp6CfmJ6np5GcppqTnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKUY25tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4yraICVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPV1cvSVRTSkNGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCraelnqOkqrG3rLS9v6+2xLK3usGmqbCqrqior66isLqvo6StsqOouKees7Owo6Wgqayvq6+mp56joa+bopqWlZaZmqullZqhnrSzoquco62toJ6ZlqCiqJyYnaOfm5mhpqSPnKKZlqCfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR+a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWxsbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVdYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFUNTAblaCViLOmpqGvqaezrKm7tsKwu8GtuLe/qaytra2mrbGpoK67qqCntKyjq7SkprKzp6Oinqeqsaewp6Sen5+ulZ6ZlJWVl52roJmZpKi0r6Kpj6moqpudlZegpaianpyinpufo6WjlZuel5mcoqmbppmcm6Kgl5ORk5Ocg9WTmblwsMF+xYZ81pSbu3yalaWPjZ2NpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2hoN9poKTfJh6qniNnY96sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamljUEBYZ1pkYUpITW5OXFFPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUDcxJZuilJmyqKimtKqltKmkvLfBsLm/sbW0urK0p7GvorCypp+ttaeap7mtoq+wn7O0sKGknp+mqbCotKijm52dqpWYlpWWlJagqJyZlqetsKmjno+toqiWnZeboKWhmKGhoaGaoaKnm56gnpSYmqagm6eVm5ufoZiQkpSQnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4aEfK19l5mOe7Bykp2OeLNll3SEnm+eZpRRyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2tgbGhQVkdJOT1VUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YUw2MjChnZKlsKyjq7ytprSmp7a7vLK6vra2tLm4sqW0s6CxsaKeq6+kl6a5raSxsJu0uKqgpZ2hqaSxp6ypo5mcmaedlZOXl5GRoaaflZKlqrCmopaTraClkpSgm6Smn5WapaahmqKfrJmgnp6QlZuhnZyllZ2VmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5Oaia6Ff4KzXHKzUq59goKkf3HXfXiFfo6dhZqadq+GiZGch3e0YZplmoKClW2SWrBYS5p1mHlmYK1edneIaJiIbF2vd5Wej3hsNXnIrrJfQlRvXmdgRVBsX3BtVlZNLmZkaVNZUDtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BIOjk5oJ6VoLmwl7TCraizqKmyurezt764t7G0urSkt7Kfs6yfnqirnpSntauor7GqrbSkm6mgn6ehtaamqaKYnZSkoJOSm5iRlKGkmpKQpq2vpqCVmamgoo+RoZmopKCVmaWonZyknqycoZ2gjZOemp2hmJmblpeioJSXkKadhql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92h3OogY6bjZKkfJaQn4R7sl6dZKB+g5VtklyrW1qTgJF/aGeqZHJ7gWuYh3Neq1qJoI5rb2VPSkOhXFtMdF1iZ05bYV9yc19LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA1Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sLW+uLixsLW6qLq0n6+knaSnp52TqbCpr6m0q6quoZign6ako7mio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6edl5uopp+MkqSXqKqnlJepp56eoKKtpKGeooyUoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoaKnbZNytHSTmH+yaoWSiK1qdbNhnWaib4eTa5dcrV9NoXyHkVJzo2x5f35vmIdyXa9WPJx3ZlRvbi5cp09jU2tlYm1aY11gcHtjVFpSPj5tbzNDQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimnJueu6GbssCurausp7ept6+1v7S6r663tqrAtaipoJqlo6Gckaqpp7WisqeuqaCXm6efpKu4naKsmpWZjqOilYycoJuYnJ+Rk5SqtrComZScrKqXjJSlmKWsopGWqrKjn52mq7GZoaOPmKKWn5uWnJahk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqktnV9d3bCgpqyYIO6ecB8dbhjtYKMh6l8lYGsqXF7f3S8iKegaZ1hpo6voX6MdIeqfb5vc7x0soN1eIGKbpqIcm6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1pcWUNBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueor2hl7LDsK2qq6yxp7evtsOwuLCtua6twLCro6GdoqGbm5Cpo6qypLSlrKWelZmqmKasuJyirZeTn4+kn5KMnKKdl52akZWSr7myrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqeilKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0n8G7vZp7gbGocIBzkbmDfIaGjIeNfIqHjJd8pLu5vZx1erSjdHeXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW56Y4uscHWFf1hbp2pFZVpUZmBjXmNRZ2ZwbHVDTlBNRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZVJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrbOyrbWms7irqaKhpZ6gnZmTq6OsqaW1p6efm5Wgo52rpL2moamWk5uQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblamkpZyaoailp6SpoZGtn5aknpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Byalpem4lgY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hpVna39ydXh9fmJbd3SBaFBcboN9e4trWGt6gnNKSm+GcE50TUVYXWdhTFpYZ2NfT1ttdWlxUlBERU07R0k9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq2o6ylrqentbGsyKuvsqqzor2wsaafoqeco5uZmaumrqOktKikm5eUoJumrai9p6iklJOalZ+ZkpekqKiQnZGQmJywsr+sm6eep6KJk5Gpmqijm5qroKOZm6OnrKOgq6OasJuVp6CWlJ2fnZewpZihp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2OgnqlhW1rfZF8gHWKioFxgnh5dnaKgHyKanOBdIN1ZXd9d2tvem1gY11waE1YWmZqYFdab3ltbWZUT0ZTOU9aTVFPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEosPC1As6CzosChpLKytqCppbKnpbC0qsiqrK+ktKXAprOgnaSknKOVlZ+qpqyio7arn5iWlZ+WramlwJ6ro5SRm5edl5KToZ6eoqeSkpmop7LEsJqrnaqfkJaWqJ2qm5yfrJihm5yipK+noqWon66Yl6edmZmgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipaOm5eNkZidpJaak5GdjX+OZ6Gzr4WKhHZ7kop9d3l6b2Z5kIGAiWt1gXqIc2lzf3t2g4eCa3VkeWZgamVjZGZrWWx7b2lrXFNMUEReVEVAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSgua+/rKuusrGgqqayraKss6/Er6mqorGtvKKzm5+moqGcmJenpamlpKWytZ2Uk52Zma+lrb6gq6KQkZ2ZmJSQlKGcl6ichJ6qq6O0yLSfqqSqlpaXmqadqZqeo6uUnp+eoKmvqqakq6Kum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmplm5h9Z4aKZWVpaHuOoY9rZ42YkaN3a2qLmaOfmHNsbnqEjoh6WGZehoNebYuJgXZcaHN3dpKAh4Jud4J4gHNteYR0doiIj4N8a4dZXmx0ZF5ziWlrfHFrZF9STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrrCmra2wvLCopqOtrrCerJafo52hmZmmqpyso6WnqLKtnpSjj6Kvpba5pa6ijo6ZoZmTkpqgmZmklXulraKotMS4paKnr5+dlJ6inqOboqmokp+hnqCpsKurpKugqpynn6egrJahm6WwpJebqZWgnZqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6ppmZcquCfMvAwLtxjKOIgp99lpiJncC9gpedno2dwsF8gnyTjZrDwH1spbJvjIFvynp/m3eRg46BdnmAgHlxen+HcHeFjJN5bniUY2dgeGRgZYJjXnRnbGRjWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6iwrq2msrOuqaSlpq+rn6qYmqKfnJqqp6Kcq6KkqKSktKOcopKmrau3s6euoZGRmZylkpCfoZibn52IpqykrK3AwLGhqa+pl5GfnaKZoaOqo5Ohop2erK+qraekpKehpqWdrKiRo5qoramanKibq6CVlqSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmOMqnuoh4WgdJeTiLNjgquGoY6Ns2qEr3V9l4i3YYOtWqPNbpB2e9p7f5lwfoeSdn5le4h2dmt8h259hpGRfm2DkGFybXBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKrq6qjqqavqZ+mm5mkl5yir5+gnqinoqWgn7Csmp2Vp66ssKqoq5+UkZqfpJKPnqWYnqejn62lq7CowMezqKmxrpaSnZuil5+pqZ+VoZ+dna2vqayqnKiopaKrkqyylqWiqqqdoqWkoK6fkZimmZ+Zk5OQl6BxhYyXdYWohnGxfZ5yrH6hnoGlj552q4J9rX+ccq1+q4eGn3aZknt8l36qiKKMkoydfqt7iZSQn4B7rVedxXuPcJPBfYGVbXVvjG1ldmWGb2F3bnJuiYqSj4Nuk5FmcHV1cWFnbWVfb2lpbmdkWFNdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqixpqiqpq2rq6aho52ZoZWfpaufoaWfqKiinp2wrJealqinrqunpqeel5SZo6GRlKCtm52mo6+spKy1qrrOsq2mrqyXlZydopmerqycl6Canp+psqurq5utq6Wjq5qusaGoq66lmKSpqKivoZGVoqOZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUqyFf66Dm3atgaeGhZ96mZeGe2aAo4mkmYaCo32pfoKWh65ffKlWnqOSgXqjn4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW96eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1L+hmaunoK+inrC0sK6prKKnpqiqq6mkpZ+bpJ6dpaeno5yrmqKsoaOfr6GcmpKro7WvrqCnmp2Vk6aikJqiqKCfpZyxpaSosa23yLK1qqyplpGdnKKZn6WznZqhlJ2fp6ytpLCbraqjo6qhs62hqrOxoZqop62utKGRlKKml5qRfKlsnoSHdat5fLBvgqWMiZ+Wlp+UgdK4tLjJgYGyX2CUqYOkiYegepiWmniqyXSapJWoqZGSmo2BnIqaxsZ5Z6GCpXSBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6RfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoaWaqKSqq6qmn6almKqjn66rnaWgrJqeqaWcp7aeopeTqKq1sqybpZyglI+lrJGZnKijoKqnrqGlp6mwtcOys6qtqJOKl5ylm6Gjr6WXoZWZnKWmrZyxnq+pp5+so7esobG4r52arqaxsrGjk5amopmejoKdTniagX+feoSjfYOkhYemn5yek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhqCErH2alWOmbaRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdntzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWFVTT0hAODgyLiwqLisqJyc/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWtra6qp5ymppqjp6GzrqKpprKgmKmklKO2oqKVl6GptLijm6GcopKPobGZnpunpqGisK6cpaiitrLFsa2pramRh5CcqJyipJyll56YmpqmpKubsKKvpaeYr6S7rKG2ta2dnLSxt6+xpZecrqCjnIWP0bXDt3mHjoWRk5CApnmUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4KmnKOOpouTnYuWkJtucbJdpXSTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6Vjnl+eZCDbmp5aXpzb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bW1pYVVJSUUY6MjIzLy8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq2+v7y6tJ6Wp6SttaGimZSiqKauq6uYpqKfpqCgtqejqKewo5Sso46kraKdkJqaqrOzpJyknKiRlJeun5+ep6SdqJ21mqKqpLasxLCpq6mhjISOnKKgpqKVmZqdmZuZpqWoma2or6Smm62mvayUva+snqGvsripsqWaqLCip5d5qJF9fLB3ioCkpYicbbJwoYetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZuWi6t4naGSipSSgXqvXqSBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY58fISZgGtuf2N/dG6AemBnZnFuaGdoQ1lhWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RUlNTVlpdX2FgYWFhXl1bWldTUE9OSTcwNDIuKixBVFZWVlRUVVRVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOoxcK2wLOemqygrbilo46bpKKfr7Cqn6Sfna2Znrmgo6ugr6mZrqGQq6ijlomakK6wrKaepZusl5ePrKGgnaahmqWdrpihqKe3qcGvpamknouAjpuan6aekpSZm5SbmqalppuqrK2kpZ+pqL6klsOsqaKgq7K4qaylnrKtp6iXda9+kIuchYd9uq2KmWWwjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCEoFxsaoGzYH+te3uDgbFtZ2+ZmYyIsVt+tVykhGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmZfHqQn39ldX5jhnh0gXxhamdwbWdlZk9VZFxBVV8+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Kxt726s8GyopyspqS1qKCKmqCenLOzqZ+joJ61maC0qKqsnq+tnaybla+noY6Im46vq6imoaWZrpKYj6iZoZ2ln5qjo6WZoKKqs6m9sKWonpyOfYublqGgmI+RmpySmpipoKKaqa6opqaipKm7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRto4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH57ZY9neYJ7YWxla2pjUGJbU2pcP1RhQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc3Oz5BQ0ZHSUtNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7C/uLG8sqKcrqaksqadi5ilwKq4sqihv6anspyesZy6qJ+tr6WnlJSwq5eMg5uRrqWirKCjnKqgl4ujkqadp5yaoamjmZ+hrK2quq6oo5qWknyImZGmm5KPkZiZj5iUqZuhmaqpoaunoKOqu56oxKKfraKps7OprqifuaatrZlzdqqluIZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJsbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iJGWd2eIeGmPa3mAeWVtY2ZsYktlWEpsWjpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6do7Kpl5K/s8XKv7eqnsCsraSip6yfuqOkrqutpo6XrqmPi4WVlq2epqqgnaSjoJGLpJKnmKmal6OqoZadpqansLusrJqbkpF7hJaNpZiNkZGZlY6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprWirLaViqGoprediZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY+VhoGlm5iWjouUlIyQhoR9Z4l+dIJ1c4eKcKdsepSRk5KBgY2PkI+dlaKXmpqkhImWj3NqkXdxjHh3fXpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpLS2rq6hsKOtn6C1sZCOrMi+xbu5q6Klnpynn7Gpo7annam0pqiRmKyii4eJj5ynlaykn5innp6SlKOWqJqompSmoaSQm6iZoba7qKuZmo+MfIGUi6GUipWRlpGQlJimkKCbqp+ctqOdpqu3p67AraK2pa6vr6uoqLG3oK27mJGlpKa2opKep6COqqCOkp+jq6+aoKOvqK+Yo6Cco6qenp6clqudk5mhm5SQlquajpmZl5GWn5KJoZ6WlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dze4yAc3x/am9kXnBqYFtgWm5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dXl9dXl9fYWFiYWFhYGJiYmRiXFtjl5Wjp6Kvsauuo6mmrJ+ntaqQj52ltbywra2io5p6nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaZm66LqpaPqJmpjZmpj5+6t6SlmZyMiHmClIybk4qVkpSRjZKXo42fn6men7ijf4OvtaKvrnSjvKKxn3d4n6iwuZR1rKOeiYCrf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiomG1/oqiKZZymnZKYmJaNkpyShp6bkJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoWMhG96gGtyZV92cWxraFxmZmJicFNbPk5OTlNHPkBVRDoxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdYUEo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrq+sq6mlqK2ip62kkpartrGzp5urp6yXc4ydsKCoq6eUl7mgoI+cpJ2Rf4mIm56MrJqilaehnY6Wkp6Eda2PiKebqZGXpImcu7SooJmYi4l1d5ONlpOKlJGRlI2QlKGPnKGnmZyylYCMm7Wds4ySjrqmoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGm52hp6inh5WFmHelm3qHnIGXp4KCe5yyeoqGoZialZiWg5GXl4WbmWJ6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo6CImH+UjIWFmmuPjoZseHtxcWdkd29qbGtcZWtqZXRcXklUTFJARTYuWlVVNykhMDk+Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWlFIOURMOz5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isoKevpqappZmUr8i/saKXqKm2npCEnaycp6KgjZC+npqMn5qgkHyGj5mXh6ycoZafoJGMk4mGgJGnjYejnaSUmJ6GnrqyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprIi2hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGUoZCYl4GPlJyLmZKLfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehaSdhJqBjo+Hi5pxj5SFaHh1fHhoaHZwaGhsXmRwbGZsWGdHXVJNM0U0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1LTUBKY1hdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7Cpq6aalKCjpKukl6aruKOvgKGonaaenYmUvZmTjaGSno95hJaWkYermZucmaGEjot3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnZyckIWAoIyprYWjjamZjJp/onWAmZRrgq12Tat4h42ckZqopoCpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5eAjXtkaItymX15lmxdfZdtX1Jwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamegbVtvjH1nWmCEgGJYUG93Zm10cmtqb11qcW1raVhpT11ZRjlBNUhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV11eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7qq6imZihoqWtrqGer7WjqJKhoKCnnJqOmbSZkIufjJWLdYGUkoyKppWVmZ6efpKFhaykh5uQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6KhlKB2nJWPp4Kgpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlthpuMmY+bqJmOh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTiIOAtahkgca4e3CVtoxygJqjYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRhnZmzlnJ9mJ+zdXNbnrKDamJvdHZxaW9Ya21zcmZdaV5iTEU9RDZRQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9fW1pYYGB8ZEhDOE1XVVdiYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OfjaS2tKytoJqinaSjpq6dnLKurJOYopqhpJmalJ6rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSpJScm42LqailnpCWh4V+anuHfn2QjYOLkZGJkJShg5eeoJ2gnouJd5yYoo2fcaGKh6mHm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WFomShfIiWkJuNbZ5om45vmpl6gIunfXJpdKuDn4N0qmiVml2bhXaFnmeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnWGk5KXjoCfb5qRbqeaXal/ebtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0NSbzVLW1pfTlpEQTI1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJurubGvrJ6mnJypoJ+vnJ6xqa2el6SboaCZlpago5mGiY1qiIBye5eIjJaWhJGVmJB6ioSVo5yKlI+GjJ+SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifiZ+Pi3CSjICph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6uZfqKOnJqWiJdxoXyFja+1fWuakaF5fpi1oqSrqISZfJt9npt/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OebnN9lXCadGukXZV2SGVkYHRxfn5vZmBsaXZ8ZGViUV9XXVRXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUI8VV9iWmVpVmdobW9iZmdeYWFcXV5gaGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqiaooycrJycqpSirKSjqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGcc5GQgYmalaGbhY+pnJuVi4uLfINshIVxgqGMeIaNiIiTmZZ8k6SgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpZ2ZgKNvXqhndaJjb6VhnNOQfXuZeHNzYqKGkH6jdKSQdmuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdnG18cJZtf3Kicl2kZ3OmYGimbZvUmn6Gm3B5e5dsnHx4l3NuqaRnYGV6cYCFbGhmZG52eGdgY1NcZlFRYkhYSlVhV1RbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWBmZmpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWllfGReZGdka2RqbWdobGiXmn+vqlRcS36pr7Gzr7Kjm5mFmamgoaSOpqmhmaqKmpiYk5mTkqGYjoeFe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yJkpOll4OPq5uUk4uGiXmDdoeAboKfhniBkoaImaOYe5SjpJmfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKSur4qXjICNpI2Vgq2gk3a1trXJoXOUi4GfYJ2XqW16lYegm3SiiHegfpOXi4FwTWajknCah3Oke3l0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUUV9s19qdmt6iGZraGN1dXFuV19UWWlQU2hJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHJzf3l8bnWJe3tUUE5sXmlca2lSamhpbGhsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqWDZD+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5qXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+JjIFphIWSg4yFnY15jYuWppODmKqYjZKLgYl6gH2LeXCQoYZ6gpWHiZagln+UpaiclZWDZm54nGyiZHtxpXebmHBnpoCVinqkep+Wg5dynneBipWXj7lukYqiYn2YoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5Z1ooF+mmCMho11cIhiaKBlnn5pm3VvY2aIgW1xolpeW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXRrcFJZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTFhTYVVpa193dHt9cHx8coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamJqaXZ1XVxjaGNqanNtZmttY5yjl6V5ZHNti6ato6mwsaafi4CYq52fpoyjopujooGWmJOOmpCLmJCOinuHcYCIaYuLfJibc3WJfZB7ZIOHlYqKlZmCfIiHl6iRgaOskIaRi4KKfoCAjnNpkKaEfYeUjYiZoI+Ik6mmnYimeJWbfqSIlouxmJ2Qgq+XnqV2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4KGhYaTlZyffKV6cqiVoJZmnn5vrGSWipaTd6htqqKBiXaJg3erkaaIa5Gwa3azjKlrioVtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1qDp46rYXVydHB8dXFja39vaW1TV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JjcnRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYWtibWx6b1xcYmlibWp4bWdsbmKVpKmcgX+do5apqZ2opq6kmYqCmKyan6WKm6adqZ2FjJqPhpyRhZKNjI10h3uIhG+NhX6Yk3R0hnKRgm1/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5JvbIupgYOMlI6JnZ+JjJSqop+PgHWUl4h+gXmUrqJ/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5SVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxh4SCZYx/X4F/i3d0cpR1b3lubYdshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm5ojHN6fJh4hVxsWHmPaW94cnFveHhwXWuHbmpnVltgV11ma2RWY1VfUV9weHlsa3Zma2trd31ycnV0YW92YnR7gnh1eoJ1gICAgXiLhYN9e25/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZO3qKaJoKKapqOYpJyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coRwlYV7fZKLhoaPhHl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybp5+fqoOIjpWafn6Jlq2nj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjotobFyCi4ubmp6Oc5WLiHF0a4F2dIFZcm6HkYF+f4xqXWpke4aEiYBgaXh6mnuCioF1gYWBZ3eKhmphcHGBdF5xioGIjqWUhWWLjYNud4uEcYaPenFoaGV8hHuWW1xraG52W3x5eHVuc3ODZ1xti2trYlpaX1tZbHFcX2FaX11ldH97dXB0ZGtra3x9c3x5dWRudWhtfH53enx7eXqAgH5vhoqEe310fnlzf2hUXHFpbHZwdWdraGRdYVhraGtrcXJuV1tlbmxnc3pvaGptYIuKqbChj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChJeKcm+AcpiGg36Sg4SGiYB6gYSMnKGRg6eiiHmOl4mVi4ucl4SDeq2CkZialYqenYeIoaqfoaKji4eTm5yjmZWqoaemn5Kah5WMenaNjYOnfn+SkJOUnbKmm5WfkI2xkpeDpYyMlZqfiZCbgoiRimt8jnd4ZYOHkYt8iZ6Eh4yQiYiBhYSQd3x6dJmgiIaJnYmEk359ioCAdW9yhIJ+d4aGio+lkIKFjIaCjJCMfYiMipGEem2DhX56mWtzaWF0inF+end3b3d0gl1eb4dobl9eWl1dU2hyVmRdXWJsaHV8fHNvcGRrammAfW55gHJqcHFsZ4F7coKAeH99f4R7bYKMhnx6eXt9eoN4TmN2anNucHpla2VjYmBbdGZwZ3JxbVVdbHRtaHl6cWdpa2SMh5y5npahoJiUmJmUmKSgnnx/mqyPn46GoJ2LnpZ9eZSDe46ZioaDhIdueYGBc4GIfomUhG1rfnqXh4SDkH+Ah4SFfIeFj5yfk4eroIRzi5CGkpGLnZF9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmI+Zpp+lnZyPlX+PiHV7ho2EpXt8jpCRhpmroZ6UnZCOqY2QgJ2MiJOZnoKPl36GjoNveIZxdWB/hJCGdY2ZgYOQg4eFf4WElW55dnSSoYqLhZqDhIxzf4l7fHJxeoeDeneJjoORpo+Fg46Ag4qJineGiYuMfnFtf4J8b2hsbWhfen9ofnx2dXZ1e3hcX3F+bnRgY1tdX1JnblRlW15ia2l2eX9xbG1ka2pogX9sdIFsbHVvenCGeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBoe2p1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4metpmgo5+SkZWYi5qen557eJ+nkZyLh6WVi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1raH2Cl4mBiI58foaEhnyPgpCdnZOJqJ2AcIyLjJKGoKGKhYx8qJGIkJKXk5aTeI2jn6Cdlpl/gJCamJKMmqKgo5mXkJp9jIN3f4KOhqB/foyMj3yYpKGik5qRkKaMj4GakYmSl5t+k5J+h46BdXOCcHdhfoCOhnKLln2IjHKMf4KFho9oeHJ4i5iRj3+WfYiKcYGGe3xwd3qKg3l5j4yClKSSi4WPe4WGh4R2g4SJiXxnc32AeXtxbWtnX35zaHx1dnR8c4BqXmB0dnB3ZGNZX19Sa2lVZVlgYWhqdnmCcWdrZGxoZoCAa25+aG9xbH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNudGlhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrGRpaScjo+Xj4acoJudfXeloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N+hpeKgoqMeX2AjYN5loKWmZiOl6GcfnCMgpGThqWbh4yJg6aVhZOLlpiTkneRnaChl5SWeX6Ol5eNlpqco52YkpSaeI2EgneDlY2dfoGJjYxzl6OfopSZj4+ijIqClpeDkpaZfpiNfIiNgXZxfW57ZIB8i4Vxh5OAkYJsh4OBgImFZnVve4WRl4t8kneLiHt/hXt6cX13iIR5g4+IipehlYGDi3aIhIOCd3yDiod4YHp5fnR/eGdtZWF/amp3c3R2fnF8Y2Ngc251cm1hWmFeW2xlUmNZYWFoa3Z5hnFja2NtZmh8g21pdWhucGmAfYJ5bZCGcoCDg390fIOMgYB9eoKDfnyQbXaJc3VtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5utl6anno2Ml4eGn5OXmX54qp2LmXqXnYuMmJB5fIGMfnyEfIGDgXh0eXp0fYCEgImLgGRffYuVh36EhnV9fot/fZiGl5WYjaSimX9yh3uTkYmmj4yOipOgkYOSkJWXkYuBj5ifmpGQkHN/jZGTiZ2dnqaXl4yUlXKLjIlrhJePmXqHiI+Jb5edmqSUlYuMnouGgZGcf5KSlYaZiHuKioF5cXlrdWx8f4t+boaTg5V4cYKEfn6LgGVyaXt/lpeDfo1zj4eDeIZ8dXd/fIR/e4KLg4uTo494g4F0iYd9gHR2gomFcGF8dntyfXBib2NkfGNucHZzeHdzdGJ2YG9sdm5vXFxfXl5qXlBdWWNhaG50e4lrYGlla2Npd4duZ2xpa21ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bWyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiYqZ+jqJ2KipKFip2LlZh+eK+ZjZd9n5SRl5OId357in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkYZ/g4Nze4CHeo+SiZOSnZOmnJaCfYF9joqRo4iOio2Ymo2GkpmUlo6KiIySnJKPjIxuhJCPkYiemaKglpWJlpBth5iDZYWYjpN6iYSQinCWmpSjk5KJi5mMgX+QnX2SjpKMmY57ioWHc3N2a3BudXyKdG6GkY+TcXWBfIGBiHxlcGx5fJmTfIOIdJCJgHOHeG5/fICFe4SLh4KLlKeMeoZ7foqFd35xcIGHhGVoeXV2cXxiX3Bha3RfcWp7eXlsc3BleV5ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1paWdiZ3GNb2RpaGVpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prX3BodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GnoKabh4uLgY+ch5OddoKrlZOOh6GNlpSPf3N8doV4eX9zc3uGa3Nwem6LdoCBiG9xW1l+kY2HgH9/dnWAgICgh5KLlJ6YopWYeIp/gY2InJ2Kj4aSmJaFiZWakJeLi4yNjJyJjpCDbYmLkJGKnZahm5eUhZeHaYOigWWEnImQfouDi4F3k5iSn5ORiYmUjX59jpd7kYyPjpqSfIqAgm92cGxtb3B7hml0g4+Zi3F3gHWCiIN5ZnJudYCZjnuHg3mTkHl1h3Nvh3qEinmKhYKHjZqihnuDdYKLf3d5bmyBhYNec3VzcXF5Wl9xYXBrXnBqfXtxbW1qbXZgcG9rcW1ZWWJhYm5YUVRaZmdjdXCEgmJda25kY2Zrkm5gZ2dfaGuBdXJzcIuAdX+DgHh1gIuAeYV/eIeGd4OFfIaLf3t2in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarJ6nloWNhH+XlIOQoHaMoJSThoubjZaOi3lxeHSCcHKFdHF2iGxwbnZtiHaDfoBublVRgauUh4N4f3dyg3qDoIKTgpWUmZyTm3iSe4OMkqOZk46JlZmShIeXmYyUi4mPj4edhJCKfHOLhYqOiJyan5uVk3+TfWiEm4ZnhZ+HkYSRgolxg5GYkJuPj4yMj4x3e5GQeo6LjJGWjHyIfIBrdmpua2xse39ien6Pl4F2e4F4g4x9eWdzbHOGlYt9h4V6k49weYNvdot5iIp5iHyBi4+dnYR7enaCi3x3cWpsgoR7YHhxbm1ydFZfcGJyYWBtb3pxaG9mZnN0aXFrYndlXVdmYGByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBrcXSKfXZ8hoB1dX6MeXuFgXiIg3OGhX6MjIR8eZV4ZnJrg2CIfW9va3pgam51f3VfdH15hnh0c4V9eKCPmbCbpY6Ci3+DmYeAjJ+Ai5qUj4WImI+Pj4R2dHd0gHFwhXRwcoRwa2l3boNufX1tdXNSTYLfyJLWk3twdYR2hKCDlHeWkZmdkZl7lHOFkJ6hk5OQiZOclIZ/l5aIjY2Iko2Im3+OgHd6jX6JjIqcm5yalJJ5jHVmh5CFa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx/bHtlc3BrbHp6W4F5kJCBen5/gIaOe3pocmpzio6JgYSEfJSKa31+bX+LfYqFfIN4gI6UmZmKfHV3g494cm1ncYCFbmt1cGhqdW5TX29lcFpgbHJ4Z2tqYmZ4cnBwY2B3YGBWa19edlBOTGFnYl16cYl1XVxldmFiZWWOZGFnYllpc3Nua3F2jHx0eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbnxliH5vcGyAWWxueXlzYHZ6e412cneKd3mei5uumqCQgoV3iJV+fIqeiIagko+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFzbHaEdoWjhpNwl5GWoZWcgZJyhouil4mNlYqQnZaDgZaQhYmPgJGKiZZ+h3p1f4l4h4SOnJqYmI6Pdol0bYWIiXyJooORiZyEhV6Lk5eLj4mPi4uEiW17loF9iIWJkY+GdoV9fmt9ZHh1am55c1iJe5KIhXp+gYGGjH95ZXJpf4mNiYGCfouVhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjanZoUmFxZ2xWX290emFyZGBpfXBybltjcmBiVm5ZXHhOTUxkZmJed3OJblxcZHleX2VlhWBjY19ZanNrbmtzd4x9dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIx7bnRxgVdxenZ5cmV3eYeNaXaAiXJ/nIaYppujkoR9cYyUd3mMnoWFoY2PfJaNgJmIhHtzd3B0anCBbGltfHVfYXh3fHF1fGhgZHzr2rXJw9yHc2x0gneLm4mPapmRkJ6WlIGJcYWIn42Ei5WKjJiUfI2TiIOJj3uQi4WPgX92eIOEcoiCk5yWlJeFjHWGfm+DgYeGmKGCk4yeg4lhg5SPh4qGiY2HgYdpfJN/fYOEiY6NgnGGfn9xd2h2cml0d2xajX2Tg4V9gISBhIqCdmFya4iAjomBfn6RkH1tgWt3hI2EkIJ7gHx+j5GPlYhucHmMhXRrcWxzeYJhdWpvXWx3YVJlcmlmU2BwdnVhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdeYnNzhWpcXGV5Xl5kZ3thZF9dWWtvZm9qdHiKfnNzgX57dnqIc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54e31YeoZxgG9neXeSg2R2hoVwipaFmaCaooqHdG+SjHF3j5x+i5qJiXygf4SZgIF4cnRub2Ryf2lmbXh4XGB5e3txcYBqYWdhf9W2jpGmeG5xd3xxk5GNiGuaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOTgYh0goV0gn+JkZydhpSPn36IYn+Th4WIhIqNgICDZ3yQgH5/goyPkH5tg3yCdGttd3V0d3ZsY46Bj4CFfn2Gf4SJf3BfcW+Ee46LgXt+kIh5cINleYGJhYqBeoR8fpKNj5GDbW55i351bW5rbHt/ZGlsallud1pTanNpYlFjcnhtY2ZeWmqDbnNiW2dfZGxfblVbcE9IT2dlXGdvcYBtWlxjc2BcY2x3ZWVdXVprbGNtanN3hn9xcH98fXR4hniFgnyAh3V5iYGSlXyJhnaIgXB4eXuEk29ue4F3XoOAdIJtaXp0lHNnc4h8cZKRg5mem6CGiHZ2lH9td5SYf4iQhIuOmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNoZ1edj19xc5a8xIR3cZSKkIB0mIyHnZSNiHNriI+VgHuUi4GEm4x8ioZ9fImMf5OHdImFdnZ9gnF1hoGelYaUj4KCcX6Hc4N6iJabloaSjZyAiGZ9k4KAhoOJiXKBfWd9i3t5f3+Hi499aYB8g3Zmb3l4c3d0bGuPhouCi395g4GEhIBrXnB3en2Lh4R7gI5/fnKAaHiBhomEgneCen+Wi46LfG1reoh8dnRvaWh+d2VdcWNYcHRTVG9zaWJOaHV5Z2FeXVhvgG90WWRhXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNvd2RnXF1ga2pjbGlzd4GDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmCeXp+bm18dpZraniEdGuTjIWemKCZhYhvfox2anmZj4CCioKWmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIWSkXl5k4aAhJmKfIeAeXiJioSVgG+Kh3F0fXtqeYaDpZGEk4yCfm5+gnWCd4Sal5KKk4+UhYdwepKEfoODiYNvgXhogIV4cn9/g4qHfGV8foN2Y3BzgGl5cW91mY2GhIt8d3mAhHqCa1xvfHJ/h4OIfYWHeohxgG1wgoWNgoNxg3d/mIuNg3dtbX6Df3Z6ZWhqfnJhWnhaWXJuTlhydGZgS213dWJeXFtZdX1ycFdmXWZqcV9vTldpUz9ZZ19bcGtneXFbW1lrZVljcHlfaF1eZWxoZmxpcXh/h29tf32BdXCCe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnR/fW9yfHuUcG+Af3lmkomCoZidkYOGZ4eEcGd6l4p+gIWCmYqBfI2NaXhybGxmX2FveW1gYm95XGRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WZjn+Uj41/bm2FjIt1fY9/hYKViXyDeG52h4WClnduh4RrdXt0ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaX9+eG18e4GKg3hieYSCcWRxaH5udXJ1gpyMgYCGf3R2foBzgW9ba31zeIiBinuGf3yId3lwa4eCjoKJcYB3fZSJin10bWp2gIB1dVxpaXlxWld9U1pyZk1bc3JmXEpxeHBdW1taXXV/dWlZYltnZW5iaU1XZlE9XmZdXnZmX3VxW1lVb2RaZHB5W2heYGdtZ2praHB4fY5taoGEf3lugXt9gX+CenWCgYyThXCAi253fYB7e4iTiYBpe35qdHxyhntzd31/jHp4hH58a4yMg5udloyCgWyNfmtof4+OfH5/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6Th3eImId1kIyKd3BthYKGdHmJeIl9k4h6fnNndYh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX10fn97ipeGgZKQmIiLhIl8j4lyfH6FfGl+bWuAe3lqenaCh4ByYHeBfnFkcmd1gm51e4aVkoJ9goBwd3p8dX5tV219dXOKf4Z2hnSCiXp3cm2If45/g3F9e3yRh4h6bW1obYKBdW5daGZ0clJcfE5ccV1PXHNwZFZLc3lqWFlZWmFxgXVhXV1gZmRoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2VvcldqX2Joa2dtbGlwd3yTbGiEiX18cH9+e4F/gnp3gICJi4Rye4dvcXeEf3uJjY+Ean57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3prbYWJknl9e4KSgIB9ioRwcnBjZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzlH15iJSEdJKNh3JzcIR6gnN1hnSId5SJeXlxZHeGeoCSaHGEdWZ3dmRqfISInoKAf46OfXF+coN4fpCOgneVjJSPiIKIeomJbHl6f3Voemlsf3lzaXp2gIN9aGB4h31qanRoe4BqdoGNkZV/fH5+cXx2fHR+YlV1e3FyiIKCe4Fwhol3eG9vgoGLfXx3fHtzjYSBdWhwZ2yIgnJwXWhjdG9MZnZMXm9WVFp0bmJRT3R5YlJYWF1hcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmhWbF5hamdlbm5ocHd6k25piIx5fXN7fnmCgYJ8dn2DiIaDcHaDc253goJ+iIuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4Z7Z3WHjZF6f4B8iYaEdo+AZ3BuYGVcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2qnHhoizcop5cI52fYiQgXuUi4B1dHV+dn9vcH9thXSUhnh0bGB5gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13emyFdH+PioNylYmRj4eFhXt/hm11dn9taHdmbXx2bWp3dn9/fGBieIZ6aHV2Y357aHWGj46WfXWAdnKAen1tgFlWcn1vc4KGfn93a4iGc3hqdH+Cgnx5e3d6cYp/e3Jnc2Rti4Rsc1tqX3ZmSW9vTFtjWFdWeW1iUFN1d1lRVlheYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI50a46MdX92eH13gYOBe3R+g4iIg29xf3VxdX2FgYmNi3t3f3iEfH2Fh3iHfH2BfoWAe35ydniLjp+MiXuKd3WDel5+h5qNeYeEdIaHhHeJe2JubVxiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6HuqJrbm+LbXKEcn6Gi397koV6eXR5dXR6amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWG17hpyJg4Jyl5N3fXtthm+AiYqGcJaOkIiGjIR7eX9ycnB+Z2hyY214cWpscXd9fHldZXmAd2l1eGaCd2h1h4yOlX1zh2pvfoB4bn1dV3B9bXN+iXuAbW6Kf3B2ZnZ+f36AdXtweXOFe3hxZXJgbYuBa3JYa194XUlwbE5XVl9UVXxrYk9UdnNSUlVXXmJ0hmldYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhoYV9yZmpocWdxc3aGeW6VinR/e3d+eYOHgHVzf4WFjoNwcHt4d3V5hoWHjIZ6fH91i359hoSEh39+f32Hf3x4dnl2kZOffo19i251gHpkhIiYhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+4bmJ0h2l1fHJ6hId7fo2Ad3hyd296dmVqb2GHdY6Bc2piXn13eIqCZXB9aGtrWlZveIukgYV/cJmScX93dIBsf4CPhnKTh4yIhYmFfXl1c29peWFqbWFtdmpna2t5d3p3W2d9fHhlcn1uhHRmdYaNhpaAcItna3uDdGx1Yltuempzeop7gGV0h3xtcGd0fXZ8fnB6anl6gHh2b2VsYWyJfWxuVmpheFZLa2xPUk9pTll9aGJPVXZsTVFUVV5mdoRnXWFxaGdhV2lcXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedGZsZXFmc3B0gXhwmYV2f394f3yFh311c4KHf5WDbnN5e3tzcoWGiIiEeYF9do9/fYSJjoSBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlYFyj4JxhYJ+goBvZmxnWF1bXFtUZXBlX1hjcnVpdnBkZWJXW1tof3BvcoBzimVmen9qdXd0dISFeIGFend0dW5renBhaGtnhnSNhG5mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cXt4bHl6j4N1l3yHhoOHhH11cXNtaHVdbWlgbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yVgm+Ma217gXFmc2Vga3hmcXWJen1hdYN1aWtxdHlveHdye2V9fX53dW5iZWBshnxta1ZqY3JUTGprUExPcEhefGZhTlZ1ZUpPU1hha3d+Zl1nc2llX1djV2JxXUtLa1hkYlVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY6BgHqLdXSQgH2BlI6AhYR9foyGen6BdnujpYp5iYaFbHV8fHWEg417b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYnR7amltaGBhV15aaYBpbG+AZ21iaXt6a3R1dW+GgnqBfnZ1bnpoanlqX2VuaIF3kIRoZVhhdml9hnluaW9mZ11VWG9pj6h3gXp8kI54dG59bXF0eI1+d5R0hYOAhYl2anN2aGlvXG1lXm5zX2dianhoe21bbYNydGpvgH55d2F3hYR4kIZziHJwen9yY3FoW212ZG9yh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2JibXx8a2tVaWJnVExuaFBIUmxFYXlmYk1Ucl5KTVVZZWx4e2ZfbXBqY11WYFVvbldKU2hYZ15YTVVsVEtdel9cX2xdXVtiZWB6aGxhb292bm93dXqYfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfoF9kGxzlYF7gp+Ff4d9gH6GgoCKe3WErJ9/eoiIhGxygnp2gYGCdW6Hb32AdIqAam9uZWRYX1paWlViamdcWl91gmlebWxcYVdbXGuBZXF1fWlqXm14d2h1eHNuh3x+fnp2c2x6Z2l3Z11kc2d6d5KBY2NUZG9mgYR2dmZoamFXVlloY5Cob393f4qOenBve2Z3bXmKenaOcYN9f3+HbmR3dGVoaV1sYl5wcFtnX211ZXpoXXSAbnJrcXt+dXVidYaMe4iIgH94cnV+dGFwbFhwcmFvcIN6dGNxgGtgbHpuaWh5d3NwZIN0eHh0cGRgY21yfWpsVGleX1VMdWNRR1diR2N3ZmFMVHBZS0xYWGhsdnplZG1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3hbXV9tW15cYmNef2lqYG50eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1+hYlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx8fm2QemNwcGJlXWVWWllXY2ZrYF1dc4ZoWXFuW15YWlxse2Jxd3ZsY1xudHVodXdxboV5f4F6d29vdGVodGVbZ3VmdnaSel9dU2VlaoKBc3xhY2lcVFdeYmSQpWl5dIKFkHhsbXlmd2x7g3l0h3KAeHx5gGlld21gZ2Ffa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR1ZXODk3+Ig4l6dm9yfXJheGNabm9gb3CAenNlcYBkXm11aGNmeHpya22Ac3J7cXFhXmVtbn1kaVRoWVpVTnlfUkpaWUhjdWRhSlRtVUpMWldpbHJ7ZGxsc2JhWVpbYXZcVEtjXVlqU1ZHWWFOSGp2WF9hbltbX2JjXYVpaGJud3ltb2p2gZB4bYN+gIKSiISBdnWJdIyGdHF2doF3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9zh4RzcJmienuAiZV5ZXWIenN5d2x0cH9seXxwknNecG9hZ2JsVFtaV2lkbWZcXHGJZVNybltZWFdgbHZkanVqal9bbnRybXR0dWuGfX+AfXdvbmxkaXBjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGFg5Bza2p4bG5ueXl6cYB2f3N7entkZnZoXmNbYWhcXndoV2JecGhhd2FbfHZqanJveHRzdGlxgpWDh3+FdnNqcHxtZndXW2lsYXBxf3hzZW9+WmBwcGFeaW98a2pyfXFvdmlvYFtka2x7YWZUZ1VYU1F3XFJQWVJIZHNiYEdWa1FJUFpVa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgY25jWGFhYl2MamNlbXp5bG5pdnmGemuEfYCFmXyChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiClIWBn4l1gX+BdH+CcIeDdm+il3N7houHe2Z3i29ufHBneHF7bHN2c41rXnRvYmdla1NeXFZoYmxsW1xxjWROb21cVldVZ2l0aGN0ZWVeWnB2b3F2dnpsiH2AfYh3kHNjZGtvYVxubWNzeIdrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wgoWJcmlmeW5kcnVxemt5dHVve392X2dzZFxfV2JkWWF1ZVVfYG1kYXFdXX5vaGlzcXRwdXZsbYWUgol8hXFyZ258b3FvUlplaWRwcn91c2JsdVVicWpbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWRVV1FWb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeXdbX2VtalpiYF9ej25hZ2t5dm5uaXZ2f35thIB+hpd7f4eBin9rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNnZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2tmeGVlXVpydm5ze3lzbol7gHece3prYWVsbV5gbmplcHl+Z1pWWF9seHt6b4NfYl5nVllgWGSciGJrcIGGfHdranZsW3VwanlpdXJub3yBc1hrb2BZXlZjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2bGiGjH+Je4htcWZwe2xxbGFYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGlua2peV2BmaHVcZFZiVlRPWWdTT11PUEhlcF1jR1pqTkpgS1htZV94aG5+ZGBVXlRddVtUUmBnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5wY2hqd3JzbWh2dHmCc4KDeoiOfnyKiI55bo+KdGxzgnN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5KOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeGiYaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiLhoWEhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuEh4SGiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4enx6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5KSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZGRkZKTkpKSk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPkpGRkpKThoWTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYKAkpCRko11h5GQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QiHCCkI+Qe3WIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+Mc26Jj4lyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIx2bXqPgnN4ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh3NtbYJ5dHWAhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWVhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnd0YV5kX2JqcGZoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGFfbWxdZmdnZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aWmt3bGJvc2piWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01banJrX2x0c2dRUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlxjbmtaaXN1cFNNT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0VJVmJma3Fwbm1sWk1MTk1OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQ0dISU5bZ2hncW5uaWZkYF9fWExKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD1IWVxbXmZsbmtvbW1sa2lpamJRR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs9Slpobm5wam5ta2psbGRPR0VER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs6PUVgbnNubmxsbGZRQj9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdHJxdHh4eX1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTxIXHR1cWVQPjo7PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PDpBanxpPTk7Pj0+P0BAQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/QEFBW2M8PT07Oj0+QUFAPkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj0+QTpJZD08PTw4Ojs/Pz08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PlZqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENyeUk7XH+Df3p8d1c8PT89PT5FaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBR3J5a2KDhIOCg4B9Xj5AQ0BAPUpze1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBFbnR9goKBg359hHZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp7e35/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUZGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJRkdHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hIRkZERENDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1S0pGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYCAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSUllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI9oQ0E9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUdPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlgQzc1NTU3NjY2NTU4NzM1Njg6ODc2NTY1Njc2NzY3OjY3ODg5Ojc1Nzg5Nzk3NzY6PEBHRklHSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA2Nzg4PTo9RUNCZYWDgYCCg4ODg4OGiYuKiYmKioqKi4mKiodmSTU5QDU4ODc0NTc4NTU3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3NjY5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHh4iIioqMi4qKjINlUFpDOjw9Pjk5Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PDo+Ozk7Ozw7PDs5Ojw4Ojo6Ojk5OTw/PDxBQkRISU1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiouLjH1qUz1CREVFQkFAQj9AQ0FAPj0+PkA/Pz9APj89PT9CPkBBP0A/PUBAQD4/QTw+PDs6Ozo5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uLi4yKi3RFQ0dKTEpKR0dIRUZIR0VCQUBDRURDQUJCQj9AREhFQ0VDRURBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMjIuLiVpKUE5OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2MjIuMgWxtVU5NT0xKTEpJSkhKRkRHSUhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozs9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyMi4uOfWBYUE9OTUxNSkhIRUlJRUtJR0pKSUpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVG5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyMi4uKX1RUUk9PTktKR0ZCR0pHTEtGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WlhUVFZUT01LSkRFR0xPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUJAQkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjY+MjIxpWVhrYkZUUVFQSjs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYWnyGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox+YYqLi4dtXGVWOllZWFNRP0BWVVhcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiox6b3BZW1xbUlRSVlZVW1p1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIt+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGddW1xdXVdST1NQUFJWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ+gHxdUVZYVVJVU1FRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbXFxeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX5+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVdKTE5PS05LSUpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t8fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXlxZVVBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0JARFBCQ0FDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hCREhHSUtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH1/g4CDg4KAgoCCgYJrTUc/QDs7Pj8/Pz8+a1BKYEVGSElFQj9HTE5HTVJVSUJFPz88PTw9PT89P0FDQ0A/PT1CPkpOR1VudHR1c3R2eHp8e3x8fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4Oj88Qkg/XHN0dXV1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QX11aSUhQUlFPTVBRTlFSVFZYU1JZVE9ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVldeWlhNS1RUU1BRVU9MUlNUWFhUVFlSTVdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk9OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQU1NPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZU1VPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtIRkxNUE1HL0VfUj4zPz5qb2FTUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTk1OTUtMS0tOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVUxMS0k8OTg3Oz5APjw9QUBCPT5FSEdDRUZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRD05Nzc5P0I+Oz9CQEA+QERJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1NTExPTlNkTkpMUklJSUVBSEpMTU5KR0lHQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSk1NT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent6eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREZCPT49OTk6O0BCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBQ0pKTUxQTUtNSktGR0dKTU5RTkxibWl2dnd6eXt6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0FDQz5AQ0RDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSEJGTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJREZGRUNDQkVAREI+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSE9LQ0lNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUdDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRGSkVJRklIRkZHRUNCQUFGRkNCQkJERURHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk5NUE5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaGhmbmpmbW1oa2ttcmlxdnRzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQURFPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBQUU5PTU5QTUxNU1dWWFhVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkU8P0JCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEVERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdOS0xLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BST1FNTlFOTVBXWlZaWVZaXVlYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V3dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TkhIR0lEQkNIRTxARUJFPTg5Pj49PDxBQj0/PkFCRkNFQ0NJRENFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOS09OT1JVVk9LVVdTUFNRUkxPUVBPVFlaWVxaWVteXl1gY15cYWNrYmBkZ2dyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRMSUtJS0ZCRUdFPEBHQ0RAOjw/QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhHSkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamRzc2ZqZ2drb3Jxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0NFREU8QEZEREM7Pz9CQEBAQ0E/Qj9BQ0hDRkVGSUZJRkdESUlHSUhKTEhISkpJTEpGSktISUtKR0tLTU1KSk1MTk5OUEtPUVJUWFZNTlRWVFJSUVBMTlRTUldbXV5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S0xMTE1HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHQ0hJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0ZFSk1MS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWZmcWxudGdwaV9hWW5uYnBwYmtqamZvcXRldG5vXG91Z3BNSnF5dmthYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTk5LTU1GSk5ISktKSUxLSkpLTE1OTk1NSk1NTltyb29ucHBsa01QUWxXTWlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4b2Nea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFSExKR01NTktNTkdMTUlMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVRZa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtJSEZKTExGTkxMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXJrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJpbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQT5EREJHREhJTUlGQ0ZKTEpHRktOTEVPSktXUktHS0pKTklISkxJS0pISEtNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam5fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVDRkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVllbXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRUFFQ0BESERGR0NJS0xIRkRHS0xJRUdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkRDQkVJRUdHRktKS0hFRUlKS0ZFSEhQS01NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUZKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0hGSEdIS0pKSURGS0tLRUZJSk5LTktITE5HSEU+R0dMSUtMS0tLSUdESERDREVBRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWFVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0eHl5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSUdIR0hLSUxEREtLTk1MS0hLSkhJRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFFbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0dJR0ZGSUxKTkZES0tNTkpMSUtKSEhGQkhIUU1LS09MSktJR0dFRD9FQ0lJQkJHRkVUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWEhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpFR0hIRUZLSk1QRUZJSktOTExJS0xJSEdESEtRT01NUExMSktISUNEQUVESUdDQkdGRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5fYmZmZWxlb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MS0tMS0lKR0VKTlFRTk9PTU5MTUhLQURBQ0RHRUNCRUdCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UU1pYWFpdXGBhZGVjZ2NrbHBzcnl5f3t6f4SEhIWEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9KSktHR0tPU1NOUE9OTk5OR0tGYEVEX0xFZmRFTltJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lMTUdITFBbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW19WVlh/anR1dV5fdl5XYVtbZltfYGFhYV1gYWdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUtFUVZMS05JS1JYV1FNT09NUVROT1FPS0tOR01PUltaU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3NvcnJ7fG9+eG6Acl9gYGJhWmBfZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym92UGVlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCAX3JmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl4cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW9tanBhY2Zjb3d4b21wc3l+bnFwa3t6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU01NSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfWnB6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7em1+eGt8cFxeXmJbXmJkZGdlZWViWmNjaWtrcnNydmdsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0hKSEhRUExOT0xLUlJST1NSV1JWVFBXWlZWVFRUYV9QTk1KVFNUUVZWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbW1VSU1dbV1hYWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5aZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2JnZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2p1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFFOVVNOT01MUVBLSlFRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1JQUlRVVlNaUU5TUldWVFlWVFpWVFJVVFRUV1hWXFleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGlnamtlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUE1PVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1ZWWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhT0xNTFFRTE9UT09TUU9RW1lXV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBNTVJSUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVVNSWVdVWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1hWVVdRTE1WU01OUk9RUk9MUVNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWFhbXl1bW1ZRTlVWVVtcV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9cYF1jYGNnaGRmYFljYGFfX2VkX2BiW1pcW1xZWllYV1xaXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUU9UVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVV1FNT1ZTTlFRT1JUUkxSVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVldXVFZaWFxdW1tdVlNNVFVVXFxWUlRWVlhZU1VaXFVTU11YWl1eXGBgYFZhW2NiXWFkXlxiYWJfY2ZpZGZeW2RgYWBgY2VfYl5ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JXVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFlTWFxYXl1ZWl1UVU5VVldeW1hSVVVZWVlVV1pcVlRXXlpdXWBdYmJdWV9bZWFfZGReXmNjYV5lZmlkZl5dZGFgYWFiZGBiXlhaX1tcW1hYWFdXW1lbYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVRQUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVFXUllYWV9bWlRVVlpZWldYWlxWVVteXF5gYV5kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNOUFZZUV1VVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoV1lZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1dVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVhUWVpaYVlcVldYW1pbWVlaW1hXXl9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWVZTXFRWV1lWVlxgYWJjYGNeX1ZbYGRhX3p1b2hZW1lVV1RXW1paXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19aXV5ZXVVSWVdZWV1iWl5WV1tcW1xbW1pcWVpfX2BgZGJjZGRiZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZZVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltcWlZXWFlcXF1fW1lbYlZUWF5dYWNcUlZZUFdXV1dXVlNVVFhcXF5gYF1gXFdhXlteW1peWFVYV1tbX2BcX1hZXFxdXl9cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY1xlaWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1lYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXF5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdiX2NeYWZkWmloYmZpY2VeYmJjYWBgX11cWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lWXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRdXFhbYmVjYVJcWk9ZWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXVlZVFhdXV9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWhiaGllZGBiYWNhX2BfXF1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWVhVW19eXWFhYF5bYGFiZmNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgWmZnXmFoaGJoaGZjYGJgY2JfX19cXVtaW1lYWFhWWlZcW1pWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeEgoKCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl6e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7ent7e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvIaJiYmJioJFPj8/Pz87m8O+v76+vcrU0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzL2eXl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKDhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh6enl+enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19fH17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX18fX14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9e3x9fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoSDhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FxcXJzdHR0dHR0dHNzdHNzc3R0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcXBwcHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0cXJycXFuf4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcIiIcHFxcHSagG5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxfKKEcHJwjp58bnBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXF1nqN4cHignH1vcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFxcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGYqZFvgqOdfnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOBg3lyc3NycnJzcnJzc3Nzc3NzcpOqpXyKoZ18cnNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH59fHZ2d3d2dXh6eHh4eHh3eHh5obOpp6mql317eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3x7e4qvoqG1qaukf3t6enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maSWobGfmKaVfYB/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGcm4yfsKGgop6AgIGAfn5/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBgJebkJewoJiUnIZ8fn5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6Aoayll6KanJmioYiAfn5/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChISIkKKypqChmZ2dpqesqaGbkoeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OGjZ+tr6SamqCbnZydnaCkopyTh4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GDiZWYlpWYn5udnp2amZePiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYWNlJOWmZydnJWPiYeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4OHj5WNlJiQhoOChYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoGCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYCGmYiMhoKCgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH+CiY6AgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+MlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKElJSMgYKBgoOCgoGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI6UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjYmFjIKCg4KDgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX2Ag4SDg4SDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDhISEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhISEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFg4OEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhYOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH+AiYWGiIiIh4eGhoiHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WDg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3uChoeJioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHh4aHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUkpCPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3uLjIiLiouKiYiIiYmIiYuKiYmIiYiKiomLiYaGhoaHhYaIiIiIhoaHhIOChIeIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fYGXkIiMjoeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYGBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KDgX18fX+Af35+fn18fX58eoSak5aKg4OBgoOEhoWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKCgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgYGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoidjYOCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICBgIGCgYOBgYKEg4OFhIGDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp7e4qFgoB/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBf35+f4CAf4CAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgYOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6e4OEg36Af35+fX9/fn+Af35/f4B/gIB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6enp5fpaTg3+Af39+f39+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9+gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6enl5gouEgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFgoGDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX18enp5eXl6gIKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgICBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWEhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh9goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgYGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHh5eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYGCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYSEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4eHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloODg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhISEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8foGDgYKBg4KAfn1/f3uIkXx8jpZ/fX9/goaKhYODhIOCg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDhIOBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYWEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEg39/h4N9goGAgoKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODg4KBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgYB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeFhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF/f4B9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fX18e318fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/gH1+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgXp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1+gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8fYGCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXt/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+fn9+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX18fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkZCOiomGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgoKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYF/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl6e35+gIGDh4SIj46LioeFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgoGCgX+AgoSBf36BgH1+gX59fn+AgH1+gISAfn5/fX59fIqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgYOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31+fn9/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX59fHx7fH17e3t8e3x8fH18ioqJiYaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgH5+gH99f4B9fX5+gIB/gn+BgICAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt9fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGAgICAgYF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAgIB/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGBf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYGAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9gH1/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn6AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fH1+fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fXl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIWEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Afn19f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19foCAgH9/f398gH9/gYCBgIB/fIB/fn9+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t/hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gH5+f39/fn19foCBgYB+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fH+AgYCAgICAfH9/gH5/gYB/f32Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIKAgICAfn9+f399fH5+gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoCBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYCBgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYGDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgHx/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHZ7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEg4CDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF/gICAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhIGCg4WFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgIGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgYKEhoSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4OCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KDhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIaFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChIWLiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fn6Bg4F9e399foB+fXx8fH19fX18fX1+gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoKEfoODfYF9fn9+f4KDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WEhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXB7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/fnx+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSFhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OHhISEhYeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIWEhYWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoOGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3yAfnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGh4aFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhYeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYaIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIKEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICBe3t+fXx8fH59fHx8fX58fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaHhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4SDhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYWEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYiDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDgoJ9gYF/foOBfn9/gHx/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfYB8fX59fnt+fXx7eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYaHhoiIhoWIh4mHhoWFhYOGhIWHg4OGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAfIF/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4aEhIaEh4aGhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+BgXx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDgoSFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoaGhoWDhISDhIWFhYOEg4OEgoSEgH+Cgn99fn5+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBgoWFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGBfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9f319fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYCBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fHx+fXx+g317fnx9gH+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz5CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQT03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNT0io2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnb3Nzc3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6epl4CCgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcmxpTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktQRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEiGdAREREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHdsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CQDg8Oj07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4pqRklJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Qc1FUVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/Pz83KysrKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19bW1tbW1tbW1dXV1dXW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9O4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9Wyl5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7UnKOostGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx1cOGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdTWo5i01NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9SkmbHU1aKZtNTVsKKp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDUpJmy1dWimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0dEQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aSas9XVopq21M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZJsXVxvZ2hiXU9GP0hIRkVAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWkmrPV1qOattfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5ux1teim7TasqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9PVsYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLST02Njc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TS0tDD1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDs5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojk7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6ubq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ioqaqnpaSjoqKio6KgoqKhoaGgoKGhoqOko6OlpaaosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpqWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKCgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT42Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoZ+XkZCQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+dnJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCgn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY2ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmpqWlo6CgoaGgmZKPjpabmZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuYlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpKSmpqWkpKOioaGenJuUmaqcm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKio6SkpKSioaGem5qZmq2qnpmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCisKehoqKioJ6cm5ubmq55epubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgpKWtp5+goJ6cmZmamaaTS4GdnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgn6OieaqkoKCem5qam52oWkmEn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqSkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eqG1vq6KfnJqanJysgktPh5+enpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmqSIVISom5qZm5yeqmRUUYignZ2dnJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5yampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUTxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmgk2Jim52Ym52bopZmXVGHoZ2dnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZnJllY32cmJudnKSHZ1xRgqKdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xMRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqkaGdmiJecnJ6ceWZaVIOinp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn25lYmyGnZ2fkG9jVleHoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmZ95c3JeeJmcoY5hWVNajp2bnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzk3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCQEFCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaSm5+UeZqooaqUfGJSYJCSjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGOoJ+OfWKJqZiaboOHa3CIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/jKiNeGlScJ2PjFZteXuCfn+CkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpCgek9DSXaUg4NJV29zd4J7ho6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCglFM0NDt5hXVyQzhOa2+Ah4qOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GPoW5GZFU/enpnZEw8OU1udY2KiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuipJhRdLCRSHuHeG1SaX9ZV3GIkIyYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqayEX7/YrEaSo5qQXWuCe15eg6KhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6imb3q9wKqazKies5pIVoRwUnifqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKinmp2kpaOionKBma6Oyc6ynrCyblO+oFRslKOioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKCNfYV7htC9mJeonHJSmqxnY46jnaCgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqCiqKqusbKuq6SpmIh7ap29w6uunol2ZHB4enaHo6Sno6GdoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e2tLO2srCyp4l1Xk6Wn5CPjYB7c3BzcXh8foWSnaGko6Kkm52hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuytru+v8C/xb+1q5NwZlhHd4BzdXpxbmloYmJpaW92d3h9g42Yo6ispqSZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1usjS2dzVx7qtn5B4XFtPRV5rZWpwaGRiZ1lXXVleZm5ubW1sboGoyMa7oqeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMXZ4t/PvbConI14YlVXTUVebGFjamVhYmldVVxXWVpeY2FcY4CpxcC9uKmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca8x8fO0MSrjXtvXFNUVktAXmxlZm5lYl5mYVVYWlhWV1dig6W2u7mrtLKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TCxsnJwKSIWkxISk5IPlpgYmxxaGFfZVxYVVNUUVaAtsOvrKqqqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMfGxMTDuLPBuqB3TEpRST1NVGJqaW5jX19aXFVTWn+arbe0q66lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIjJaUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7d25raWh2WmZyeHN6Z2deZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb27vpFlVktCSj1eVlhrZ1taWVhWcJCwsau4tbOsqaOhramsp62grLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dnVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jIv8bGtqBsS1lBUnJ7gFpSUFNrn77Aur27vLq8rK2mqbu6ubfAs7W4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxeZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcTJwKqNeG+MmZ1TT3GfwtLHxMHEx8G8vrSxsLDCvr7BxsC/uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfXhwZ2BrandsaWZ1b3RjXWNVV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMLOvHNqhZmXWpHLy83Pxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eYBzcGZlZmNrZGJrbW9vX1ldV1ZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wsGZgI6ZiH/Sy8TI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwLu/wLy7xL26wMS/vb22vsiklGaPzcS/wMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjbq/u8O1use3trm7vLi5tbrEyaZCi8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHipzL3Ht7m4rba0t7mztbK6xcqaRoDKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1650gbvIz8LAuK61tbu9t7mxvsPHjkx7zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcXSu0dHMysS1ur/EyL6+tL7AwHtZc8vGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnJ0pszMy83KxsLDy87BvLi8urFyaWa7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKmytsPApXl2eZzExsvIwcPAwMnKwb+7ubGhgXhxrsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7Sztbitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvat9bmhubXKBlZhzeH2Yvb/GwLnAvL7FxL29uLGvnJWDiJzKwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbG3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoGzvba1wqWHaVpeYE1SW1tudHeCobi4wrqzu7e7vb+6u7uuo56djpl/v8TDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4V4iqCvtZ1qZmdWWWBJSU1QVGx3h6awt765srWyvLm8trm+tZWgq52odK7JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZuVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaqIfHaMoZhgVENYVUdhalZPRUphjqGsr7a6tbSyrLy5uLW4wb2LmrOmqnSmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLbEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BP0pDQUpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iakYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBvT0o/ZFlCTneAlGpOQVyCsLWztbK0r6y7uri2ub/GdoSsoJxlqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlyd3NtdWpsXVxrVV5cUE5IREdNQkdORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BY0FTo7mztLKwsa2wubi2u7e7vJCisaukc6ywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJU0VOQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2ecgFpFU6+7sayzr66srba2srS1rqmmnpqbnZ+mqJ6gqKmfoaeWm5aXjp2Tj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQlpWWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dtbl1RaVVQT0dQTU1DUFJAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmx7ZGlWUmROSkhHT1NOS05IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFtgcZCxr66ztaqmrKyjm5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGSk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yXFFrY1tlYF5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmXFNaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhYY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqayppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCfm5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVebVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTUxQWFJITU1HmKyqqaWgn5qSkZSYmJaWloyIi46VnZ2dnJ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW5cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnp2KYldeZWBXTVFHPT9AQ0M/PkJReKmtqaqmn56foqOdnp2anZuUk5WUnp6YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRR0U8Qz5GPD45Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVpcRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdPRT5JWnxvYkI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZ15aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREE/S4aepZmEoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amVWWFJETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZxiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0srS1dbZ1tjT1tjN0srP0czP0czT0MDJyMvEzM3Mz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxKS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsTJx8/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjrGZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1c3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMnBycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo6glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcW0pGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGBeYF9eXGJtcm9vc3R1dnmkv8zV0dbT09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLJysPNxMbJy8vPys7N0M7UzMbJ0M3Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtqqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0Q/OzY4Ojg6OzU3PT1AOzo8PTk8PTk9PTo+Ojw3Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt7ZWJiYmBdXmFjYmBfYGBhYV9fXVtdZ3JycHJzcG1yeaXH087M0M/T1MnEyMjFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jKzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7q9qrGyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zYFteXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHLwsLPy83Eur/Duru6ub7IxsLDwMPIysnIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1tbXWBgYmRkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/Iu5jAzMDGwbC2ubGxs7Gwwbu7vLq4wcHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzs3BxcO/vbK3sLKnqKi5sKWtsKqtrJR6d3hrZWhgaG9kVl5ZSkZKRkhLQUZCRkpBOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5m46fxMO6wLitsLCmqa2rpbeztbSzs7S7tr2yt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8zFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVGPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15cXV5aW1tdX2xwbmlmam1uc3uKv7+4uLSvqqumnaGopp2pqrGtqqyptK22sLOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8yLnDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BHQTs6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25yhK25sLWtpKOlpZmfo5+YmqSqraSooquqrKuwo6afqq21trG9uK+3r6iuuLS0vLizvLC4ubayvMGywa+mqaOrsbO0qL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+v8W/tcLBx8i3v8DFt8TDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWro5yan6OTm6OZlo+goaijo5+lpaemrqCdm6SmrLKwt7ensKyoqrSrtLqxtrautrqzsLu6sbeloKSgp7GorKm6qqWmp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsrm5wrPAvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVVlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXlxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ2Tk5eelJmglpSLnKChppyfn6Olo6eem6Kcn6uwrbG1pKmqqqyspbS4rbewrLO1r7O2r7Gqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqusrbCzua+4ubqwtry7uqyzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy1t8XPyMjAxru7w8PPvrnHuLi/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKeakJGRmJSYnpOUjpqgoKeem52lpqKlm5+hmpmvrq6vsqGlo66rqKK1sLKyrKmws6i7s6e2oaOfnKOirqOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+qsLKys7ezrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWlZTWlVLW1FMSkVIS0lDPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscO1tr2ttLnBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqGUmo94f4OEf3hvcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmZCQjZGTlJyUl5KVnpygnJahoamjnp6onJqaq6evsKuco6S4qqGgr6i3q6enrrGkuLCkt6CjnJmZq6ahmq25sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsa+wr6+nqKiyrrG0sLy0urivo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJKOkYmOkJGXlZmTlJmem56VoJ+mpaOmp5+cn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWfoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ehopqkpaWrpKWwp6Wjq6ytpqmusK+rqKqqs6amq6+0sa68trGwr6CTe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurK5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlZSVFJVYGFfYGFfYGBiZGl+jo6GjYuQjpCZkZOVopiflpygpaGspaSko6SjnaurpZqfpbGqoaGepaqeqKKfrqyqqa6toqKilZiim5yQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoKKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkdRT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq2wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl5fX2JkbYmLf42Ci42LlpCRkJuaoZuboKipq6isp6mmpJmlr6SVmaWvqaCcmZugn66anKuzoKamn6KkoZSUm5aWkqmqrZudn6Ghm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJGWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR7iH2GeoiMho+KlI+Vl6Cfmp+rqaavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpeOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOS01PUkhOS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1hanx2e3GEiYONhpWIkpKWmpidqJugq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GTiJSOi4GMjYCQi5KSkqGaoKKWlJmYlaKmmo2ZpKepp6GgtLKos7ihnaO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxre6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFqbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFubnJsgIR/hX2Pgo2IkpCSnaGOmp2joqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnY2CiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2Njo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS4ucDOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG9jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWhtaHuBeXFNVnCOgZWFjJuXipORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOWjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQip2In5iIiJaemqGgl6euqa2pqZ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCuLO9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBramR2fnFOQT9/lZGQfIeUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+UeHZ2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiVhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNUklMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0VEQ0lOT2hZT1FTVFVaboFwc3pnZlpTj4mUh3N+hoB8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp7aXZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnqChnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPTc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51gnp2ZHSLlZiNjntmeYB2eH+IkHyDmJKAcYePfHd7b2t+rX10kIt/eoaSgX1/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVvcGqGparAfnN4Ynt3bnt4h495e4uGb22Mknl0eWpqgIJxlpGMgX2VgEqTmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYd7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpa2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdW90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWFtfpodhmWdyeGR9b2x/eYqIdYGHhXRsmpJ0dHxqap2OTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY98dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSW1hZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bZKImpCZlqSorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIiMhnpwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9wenZrfGxxgoGEgHqEhYV5cqCVdHiAc3WUhzVxnaidjqGhhKOFdnCHfId8dIyujYmBaGdiam5ybXCDdWlwWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXTEhKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dXh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUVNES4V0f3t7dX5sdoeHe3yEg36LfXWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zi5ePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hHpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygmJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjXiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfX2Bf3CBfnpodmxSWExARTIxMTM3NjY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktogod6iXl7cXyPi3l8iIZ+lod2oZqIh4+SlKWNralIhq6vrouBgJSLgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYOIf4iEi3mVnJuJi4iRf3p1inZ8eG1vd36BdXVzbVxeXltjZFhnZVxUUFBWWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4l+c4R4X2NXS0I2MC4vMzMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFlvWVxeaYyShpSAg4GEkZJ+hYiRgZqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY6UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneIgHt2hHxudnVmf5SOh4iJh4iHoauilomOl396gYh5eXBna3h/fH91bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJUUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSUlMTEtOVmBjf2ZnbXSbmY6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkYeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F8npybp6WhmaCWopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF+c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4eJgYCHdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiaGlqLO8t6Suq6umqLSrsLaysa27sbO+nLPDq7rJyrfDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoOFiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraKxqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisayxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1tjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU08Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUxLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7GzwbW3wczItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ure+t7q3uayssKWwqa29sLy6wcGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu8wbu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuon5WWn5mgrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9SkE9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg42Win6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0lGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZmKifpqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTlBKS1BLU1FITEFKRkpPX15iZ2lhl7fHsLmyur21scTGta+4sbC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPL0NTVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQiHyEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CqtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZiXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNPU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomIkYZ/gntyfoCBh3qEdYWTkIh/b3Zya3N9e3d7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOloZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuJfoN4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Szn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLR0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOgoeFhnqEeXF7e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ+hrJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfMycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg3RUI3NTU0NzkvNTY2NDM1NTQyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlve3uGgXR6kp6OoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcmJ+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mIhoyBhZd6iImfl5CIjYqLgn2hipGLvKGYlJiZnKmmpq6fqLa/wMC5x8rOzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxFTkM7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5OekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2MnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6dmpKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkp2RgouAppmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JRExCPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NjA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcopudlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSvn4uQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqdlpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehop+ZkpydqLK5rKa9wsfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUxNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjY3ptYX6Rg29td4t4eX96gXyFe3t2hYR/c3CFgXp1dnZ0hIOFfn+SpqSfpqKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5KpsKCQlJCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmbj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmWDR3WCjn18bX2IeHp+eoGBgn52doCCe2xvi355fHd4fISHi36Lo7SopKuzoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZrbCkl5SVlJCLmJqWoMCOo8m5q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJOYlIyKk5OGlJiGhJGQnHSRmbKVlqShiJyak4+KkIqXmomLlo2GfYyZnoqQj5yamZOZmKCVoZ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYF9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramzva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+xqpqYm5SVkZigl5m7u63KoWm2t6qwlZieoquSl72kXqmygomKjJSHkXyPjn2Dho6QlJSIh5KWi4+VjYuNlpmTnZq0lpWrnouclJKNkJKLmJuKkp2Pi4mVoKGNlY2XmZ2TnJmelaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDL06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqDfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqaioqSjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY55gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUc+QT9CPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4/R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6ro6OeqKyvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkoJqgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762z7LFvsO8s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcoB7jX93hoGCkHqNoZaompqYu77JyMrC0snKws28wbOtvL+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqqp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu73Bua3CwsK/mXB7Y1tYXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tL3Lu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqaeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhFREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV048TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnKuruaupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCvpYuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlp1gSpacmpWZpZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKehmbSpqrO9vLursLLHwLimrKutsbGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJOFoIiEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnBwc21yLvBubW6sa+vsrSnpJyqtLWrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrWtuqWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkZ2DbXWTopqVnaOfkK6yo6uVqaqYq6+lpaGlqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRU1JSkBDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66ZlJ6Lk6qbkZKTiaqNhqGejKOslKSktse9tMG7wsLHycXCzsjCvbmyr7m1wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKuqvryorby0uL7GvLa1uMCwvcCzqbW2q7+lj6OXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyin6G1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUZITlFJTURGRkJRS0hBREdBVlJESDxBR1ExO0E3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wnl6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwry/uMDCwMjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pq2+sLe3xra0ubi+sr/BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGplXGJeUEpIS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hOopukm57FrKGfrJ2crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLa/wbvJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSprbCipqi9taayvLe2tcOys7e6vrPEwLi4rrS0tKOdpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsO+x8S9xMq9sLC2rrG1sMDFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6xqqSnvbemt7u9r7fDrbOzwr+yx7O6t6u0tq2qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VX1JTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6qxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtcDEvsrFtsDJwrWrtamxuazAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7myuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJSTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemZqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCptaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaugr7Szqqq3tay7rLOyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWo6CXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MU09fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeppbSyq6Gttb2vs7i9u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7SqrrK4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2wsbWssLWxwLrFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHl5iMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEtLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8HCtrS6xb7MxbnDwbrAusS4wbmytayquri7ur61q6+xt5mYqKurq5yuq4+rvp6rr7Gjqp+xrbKurrayuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsayqtaSusLSvo5mdraebl52Zmay4opeTkY+ZnKGYmJStoZ+WgpWZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG55b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaU1NTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAvrSzt8TAzMe8xL23v8DAuMC9sr2uqLq5uLfCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG1sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVj4+MmJ2imJGYqKSgmIWTl5GdnJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVWldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKq5sba3wLyvrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2ysMe/uKS5sKmtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mOiJGjoJaOlZ+ilpWGkJWUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cU2RuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNEZDs2KkhkSEorOkk/M0NJUyw+j2s/SEmQm6mqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK20wsPRxMW/wbK+w8K8v7i9xaitt6y0uLzAsayyrqGjp66qp6Wxo6uxqq6rsa6urKuyuqe3sbKpsqmqpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLawsaCpop+qrbCsnZ6mp6mao5eYkKComIaDj4uLn6CQjI6XnpKRiIiSlqGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9TT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE5GlZesp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CsssTEzs7Dv7+0wcTEusG0ycSsr7eus7rAvrSurqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq6CjnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG2rKyipaOaqauuqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQk42Fjpmlm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklJRJeRr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG1srS8wb6zsa+trKyot6qmrbCruK6osbCusau1qrW2p7W3q6ykqaqcpJ6zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKkl6Wmp6qcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uQkJKOhYiWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+fpaqsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0cC/vbq8w727w8G/v6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq21sa+xuaq4rqqvt6uqnqqroKOhta2poZ+vsqG1qp6op6qjqqGhrK2ova+rrq2hp6efq5mPr6KYoqCopp6nm5ipsKmin6yioZKhoqOnmJqopZiYmJ2Pi4eUiHyNhoSFpJaGg4KMh5CPkoWHlaGWiZKdkZOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46wnqSlqqKlo6ymtLOxqaSwp6q4vsG8sKi5qqeusMnHyNHCvcC+ub+/vcm8wrixsLWyury5wLO0vK25rKO1pqessba4sqanubWttLyvu6WtrbaqrZypr6SfpayrqJydqrKktKmaqqeppKmdo6moqb2rs7CunamjoK6bmrKilqSbpaSfpZqZp6qlnpqpoZuRm6CknZmWqKmRmZqSkIuCj4V9j4J/iJ6Ph4B+jIiSkJGFgpSblIaToo2TkYuRmpKVh4p/gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltnWkZWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6Sr5ifnqmko6GqpLeysaSpsaetucG9tbCkuayoqLDDycnMwbe9v7W4wbrItcO1tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgr7S2qayerbGjnKWnqaOdnKSvpq+hn6upp6KqnKOpoK27p66xrqGqoqOunp6sppefmqGim5+amaKqopqao6OVlpOfoZaclqWsi5+Rj5GMgop/f4+AepqUjIl9f4yHkZCNioaTmJGHlKOKkZGHkJmQk4GIfXlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6uYn5eno6Gfp6O3r66ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbCsrC6sbLAtru+t6q5uL2qpLSmqKqvrbmwqJi4vKOtvrSzoa64taemqLCzoJ6kpaihpJmerKionqCqr6egppeiqKCwuJ+jsa+hq6GspJympqmampufopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Qh32HfoKNfHuhjI2IeYSNhouOjYaJk5qOiZWfiZCVg4yWjZF9hXx0cHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7S0qam6xbezrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzsKWYu7akq7q1rp6xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTpKSit7ChprGrn6yjr5ecqqWon5ianaOTmpuZnKWqmpubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYuOln+Gl4yPeYF7cHJ2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUnKqcpKGioLeqrqC7uKWsvcW0sa+jtbCsrK61w8O8s7+6t7Gzubi6t7qvrsCztLmwv8C4rb26taWisqmnqbGrrbGgmb+1pKe1taiesrypqKWpsKyZo6ecpKWUmKGxpZmfo6ipnKKfk6WgpLiopKeupp6loaiSn6iioaGZm52fkZqblp+hqpuamKCUkJOWmY2Uk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYqShZaTk4uQlpSNjZR8g5eOi3d+fGx0cmxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0raequranrMTBt7Gso7aup66utr++vLLBt7Cusra2uLa2raq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAq6elr7KprLW7nqipq7GlmJ6pnaakkZmmrKKYnqSpoZuhnJafnae1prCqrqGhnZ6hlKCmn6GgmpuZm5KYnJOlnayhl5aclJKNlZeLj5ibqZ+RiImLiHiFdoGCgZ2HioKJfX+FiIeGkYSWlJCOkJGRkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1tfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqLi7urmtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qZ+fr6OprpyiwKCxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6a6qK6ioZqbnpmepJqknZeel5uTmJ+SqJWqp5qTmpqSjJWZjZSUmqmmjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkJaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGZaSUZMTU9ZUVBWYWWBVUFXU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GaqbGvn7m/taC0wru9urGmtq+oraS2t7a2rLyvrKqrtqqzuK6ms7Wyrqmwtraxs7W6pqmftaicnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqqvJ+npKCYmpmdoY9ropaZnHCClZqjf3WRqaeelJSekImXmYCWiqGQeYeUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIU2FwdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1BQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Ogm6qtqqO9xa+puMK4vbytp7awpaujtrKxsrC5rammrLSmr7Wjqbi2tqinrLayrrSts6Gpn7OqnqCjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6adk5+fmJCeqKmktrCko6KdlpiXl6OIoI6SmYagh5OcoH+kf6WqnpKSmpKIhHJ4jY6FiKF2iIxpl4hmfXN4oG+Ih4N+jnx/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhpcXCIWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ousbq9t8C+qqW3sKmspbK0rq+ytqqppbCtpbSznK21trWmp6izsK2yp66dqp+xp5+iopmhoZqts5SjpaW1vaasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJSTo6SmobekpKCjmJWTl5KciK+Ql5SJqYuWoZyFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZGEfJCQkcpyl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdbUUFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKosMK9sbW/tbe+waqns6ysqaeus6mvtbOmp6a0pae4r5yzsrarpaSnsa6usKaqnaejsKKhn52Wmp6crauTnqKftLqiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoqGxo5+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJ2dlJmmlHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZb5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JaX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnqOkqrG3rLS9v6+2xLK3usGmqbCrrqipr66jsLquo6StsqOouKies7Owo6Wgqq2vrK+mp5+joa+bopqWlZaamqyllpuhn7Szoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpqCan6GWlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqZR/a4Gme4KGiJKUknerZ2uxXKt6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXJ1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqGvqaezrKm7tsKwu8KtuLa/qqytra2mrbGpoK68qqCntKyjq7WkprKzp6Sinqeqsqiwp6Wen5+tlZ+YlJWVl52roJmZpKi0rqKpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqmbppmcnKKgl5ORk5Odg9WTmblwsMF+xoZ81pSbu3yalaWPjZ2NpHuOh6SCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKimtKqltKmkvLfBsLnAsbW0urO1p7GvorCypp+ttqiap7mto6+xoLO0saGknp+nqbCotKikm52dqZWYl5WXlZagqJyZlqetsKmjn4+toqiWnpeboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5yfoZiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsKyjq7ytprSmp7a7vLK6v7e2s7m5sqS0s6CxsaKeq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaadlZOXmJKSoaaflZKlqrCmopaTraClkpSgm6Smn5WbpqahmqKfrZmgnp6QlZuhnZymlZ2WmqKflZiVkZuFrHt3qHajjYiGqW+tioKng5iYoYmSmouif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhZqadq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneIaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZNLmZkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwl7TCraizqKmyurezuL65t7G0u7Wkt7Kfs6yfnqisn5SntauosLGrrbSkm6mgn6ihtaamqaKZnZSjoZOSm5iRlKGkmpKQpq2vpqGVmamfoo6RoZmopaGVmaWpnZyknqydoZ2gjZOemp2hmJmblpeioJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3Ndq1qJoI5rb2VPSkOhXFtMdF1iZ01bYV9ydF9LVjdKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLq0n6+knaSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5eeno+Mi6iwr6edl5uopp+MkqOXqKunlZepp56eoKOtpKGeoo2UoZifoJKel5yVnqGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyOiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpSPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCvrausp7ept6+1wLS7r663tqrAtaipoJqlo6Gckaqpp7WjsqiuqqCXnKegpau5naOtm5aZjqSilYydoJuYnJ+Rk5SqtrComZScrKmXjJOlmaWto5GWqrKkn56mq7GZoaOQmaKWoJuWnJehk52pnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXi4yniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGKbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnY214b1pcWkRBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsK2qq6uxp7ivtsSwubCsua6twLGro6Keo6Gbm5CppKqyo7SmraWflpqqmaesuZ2jrZiUoJCln5KMnKKdmJ2akZWSr7myrJWXo6enlJCWpJykrZ6RoKirn5ufqKOzn6OljqihlKKanJiVo5iQr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZl6gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+NzA3TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0w7Ssq6isq6m6rrDFrrSxrLamtLisqaGhpZ6gnZmTq6StqaW0p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62ZnqSkoouSkqabpaqblqmlpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2FzalpdmolhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydXh9fmJbd3SBaFBcboN9fItrWGt7gnJKSm+GcE50TUVYXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwqObtbq1o6ylrqentbGsyKuvsamzor2xsaagoqicopuZmaymr6OjtKmlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnpGQmJywsr+sm6eep6KJk5GpmqijmpqsoKOZm6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqMhZeVjoqMmJaHlJWKhJOUkYmOkpSYlJiWmqChmpyUoJ2NgnqlhmxqfJF8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKytqCqprKnpbC0qsiqrK+ktKXAp7OgnaSknKOVlaCqp6yjorarn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEsJqrnaufkJeWqJ2qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCYl4mDj56IeoSQh4aakoiGipaPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXqIcmlzf3t2g4eCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYmNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rKuusrGgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6O0yLSfqqSrlpaXmqadqZqeo6yUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saI2YkaN3a2qLmaOemXNsbnqDjYd6WGVehoNebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIj4N8a4dZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8ua+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pq6jjo6aoZmTkpqfmZmklXulraKotMS4paKnr5+elJ6inqOboqmpkp+hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH5spbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpGfoJibn52Hpqykq63AwLGhqa+pl5GfnaKaoaOqo5Ogop6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYKtWqPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hpGRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qnrbOrprKsrKqiqqevqaCnm5mll5yir5+gnqino6ahn7Csmp2Vp66ssKqorJ+UkpufpJOPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2vqayqnaiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+q4eGn3aZknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCg+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6KirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKijn52wrJealqmnrqyop6iel5Sao6GSlKCtm52moq+spKy1qrnNsq2mrqyXlZydopieraydl6CZnp+psqurq5ysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoGWh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbpyVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKajkJqiqJ+gpZywpqSosay2yLK1qqyplpGdnKGYn6SznZqhlJ2fp6ytpbCbraqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiYegepiWmniqyXSapJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGZlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjoK6rnaagrJqeqaWdp7afopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOys6qtqJOJl52lmqGjrqWXoZWZnKWmrZyxnq+pp56so7esobG4r52arqaysrKjk5anopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhqCErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+lJOMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19dWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6Sruaqun5uhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmaqllKK1oqKVl6GptLikm6Kdo5KPobGZnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56YmpqmpKubsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+jnIWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYuWkJttcbJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqChtqejqaexo5Sso46lraOdkJqaqrOzpJyknKmRlJeun5+epqOcp5y1maKqpLarw7Cpq6mhjISOnKKgpqOVmpqcmZuZp6Woma2pr6Olm62mvayUvbCsnqGvsrmqsqWaqLCip5d5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4naCSipSSgXqvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5aOmY18fISYgGtuf2N/dG6AemFnZnFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlVUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbOfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklombkK6wrKaeppusl5ePrKGgnaWhmaScrpihqKe3qcGvpamknouAjpuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZGFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt+tV2khGvIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmJCom4yYkpmYfHqQnn9ldX9jhXh0gHxiamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnbOzqZ+joJ61maC0qKqsnq+tnqybla+ooo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKqs6m9r6Sonp2PfYublqGgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZWTg569voRso4Jvq4RsnH96srDHg2mrsL2seHeivrxzgJaOpp2Rm5Kan3uCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK6quq2oo5qXk3yHmZGmm5KPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4qXlphxaWmFiGdxhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmTmaF+iZGWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlZV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTKv7eqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLusrJqbk5J7hJaNpZiNkZGZlI6YlqmWoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnZWRmZOZkY6VhoGlm5iWjouUlIuQhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+dlaKXmpmkhImWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6isKOtn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6iZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qenp2clqudk5mhm5SQlquajpmZlpCWn5KJoZ6VlYWSjZGOlYuAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSmJSjk5+ZpIWKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaejk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566t6SlmZuNiHmBlIybk4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mpdwgJiol21/oqiKZZymnZKYmJaMkpyShp6akJaEkoePj5KJhXdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3uonJtmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGzp5urp6yXdIydsKCoq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2PiKabqZGXpImcu7SooJmYi4l1d5ONlpOKk5GRlIyQlKGPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoZialZiWgpGXl4WbmWN6h5CFj5CSi4NtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmFo5+ImH+UjIWFmmuOjoZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNikhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSkxHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Kfpaysq6isn6iwpqappZmUr8i/saKXqKm1npCFnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopafoZGMk4mGgJGnjYeinaSUmJ6Hn7qyqJ6ako6FcXaQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga6sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5yLmZKMfYWTh46WkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKSdhJqBjo+Hi5pxkJSFaHh1fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZTcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJain6+nqKilq5+jt7CpqqaalKCjpKukl6aruKOwgaGonaaenYmUvZqTjaGSno95hJaWkYirmZubmaKFjot3m5yPn5CInqWclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSoI+UoKGZoad+oaeHrZ2glq2PnpydkYWAoIyprYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2qef5JrZ5eGl7eJnn5uYGRZg5d/jHtkaItzmX15lmxdfZdtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJYUG93Zm10c2tqb15rcW1raVhpT15ZRjlBNEhEX2w1LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaykh5qQipmpmZqbkoimsaeilpqIiYBpboiHi46OiouNkoyRk6ONlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+Fp6uDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxygJqkY3Osq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZdaV5jTEU9RDZSQlpzMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNT1FARV9eW1pYYGB8ZEhDOExXVVdjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlZSjt5iqm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZqhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2ooIeXjomSo5Scm42LqailnpCXh4V+anuHfn2QjYOLkJGJkJShg5efoJ2gnouJd5yYooyfcqGLh6mIm6WOlKapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbZ5om45vmpl7gIunfXJodKuDnoN0qmiVml2bhXaFnWeqa4C4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qQbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljYGZYYkJRRk83V0RTbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWdYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbSap4hjlJururGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioSVpJyKlI+GjJ6SnZ2JkKmjoJqMkoqBgGmBhnl/l4x7iY6OiJCXm3+Uo5+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OjpICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF5fpm1o6SrqISZfJt9nZp/dKpaXW97lot4nmJMf3t6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRiUV9YXVVXQFpGUWhFU1dcYlheSUQ9Qjg/QTpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqGbc5CQgYmalaGbhY+pnJuVi4uLfYNshIVxgqGMeIaNiIiTmZZ8lKShnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcnydhplwk4OufaSDpp2ZgaRvXqhndaJjb6VhnNOQfXuZeHN0YqKGkH6jc6SPdWuPs4xggpiJc6qyqLx/d4Ntfr+mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEbGdmZG91d2dhY1NcZlFRYklYSlVhV1NbZWpbZVFGREtNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamhmaqKmpiYk5mTkqGYj4iGe3B9hWh9j4OUmoF3kI2PiW9/hY+TkmyXk3yJkpOlloOPq5uUk4uGinmDdoiAboKfhneAkoaImqOYe5SjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa1tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpOXi4FvTWajknCah3Oke3p0YYOBa32ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9s19qdmt5h2ZraGN1dXBuV19UWWlRU2hJVk1ZVFZdaGtuVmdXTktCSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmaqYjZKLgYl6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dyn3eBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpeW2OhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dmWlRtSVlPXUlYaWlzallrVlFSRlZcTVhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinyHcYCJaYuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaOskIaRi4KKfoCAj3NpkKaEfYaUjYiZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqWijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6htqqKBiXaIg3erkaaIa5Gwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDp46rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtndGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6adqZ2FjJqPh5yRhZKNjI10h3uJhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpimjn+mp46BjomFlXaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/X4B/i3d0cpR1b3lubodshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN6fJh4hVxrWHmPaW94cnJveHhwXWuHbmpnVltgV11ma2RWYlVfUV9weHlsa3Zmamtsd31ycnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl9XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunm6mYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58qKGLhpCQhZWDho6Yd3KEqYaOkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHuWW1xqZ252W3x5eHVuc3ODZ1xti2trYlpaX1tabHFcX2FaX11mdH57dXB0Y2tra3x+c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hVXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN+gYx2hYyChZeKcW+AcpiGg36Sg4SGioF6gYWMnKGRg6eiiHmOl4mVi4ucmISDeq2CkZealYqenYiIoaqfoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJKTnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4yQiIiAhISQd3x6dJmgiIaJnYmEk359ioCAdW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX56mWtyaGF0inF+end3cHd0gl1eb4dobl9eWl1dU2hyVmRcXWJsaHV7fHNvcGRra2qAfW55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDfI6ZioaDhIdueYGBc4GIfomUhG1rfnqXhoOCj3+Ah4SGfYeFjpyek4eroIRzi5CGkpGLnZJ9jXuqhI6TmJaPnJaHh5yln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2EpXt8jpCRhpiroZ6UnZCOqo2QgJ2MiJOZnoKPl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaFfoWElG55dXSRoYqLhZqEhIxzf4l8fHJxeoeCeneKjoORpo+Fg46Ag4qJineGiYuNfnBsf4J8bmhsbWhfen9pfnx2dXZ1e3hcX3B+bnVgY1tdX1JnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbHVveW+GeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1ti4met5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYSMgoKDbnyAeXOBhX6LkX1qaH2Cl4h/h419foaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdXSCcHdhfYCNhnGLlXyIjHGMf4KFho9od3F4i5iRj3+WfYeKcYGGe3xwd3qKg3l5j4yClKWSi4WPe4aGh4R2g4SJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX19Sa2lVZVlfYWhqdnmCcWdrZG1oZoCBa259aG9ybH55h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveomMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4l/iYKBf3J/e3R2g4V+ipF4Z2N9hpeJgImLeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2dfoGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgXZxfW57ZIB8ioVwh5N/kYJsh4OCgImFZXVue4WRl4t8k3eLiHt/hXx6cX13iIR4hI+IipehlYGDi3aIhIOCd3yDiod4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFjamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyQbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5ytl6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGMfnyDfIGDgXh0eXt0fYGEgImLgGRffYuUhn6EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmXqHiI+Jb5edmqSUlYuMn4yGgpKcf5KSlYeZiHyKioF6cXlrdWx7fot+bYWSgpR4cIGDfn6LgGRxaXt/lpeEfoxzj4eDeIZ8dXd/fIR/e4KLhIuTo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG10e4lsYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId358in18gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4Nze4CHe4+SiZOSnZOmnJaCfYF9joqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAfIGCiHxkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMe4d7fouFd35xcIGHhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhbX2Bha1tQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaYF6d3VvjoV0gYKDe3WCiIV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8d4V4eX9zc3uGa3Nwem6Ld4CBiG9xW1l+kY2IgH9/d3WBgYCghpGLk52YoZWYeIp/gY2JnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjpqRfIqAg291cGxtb3B7hWlzg46Yi3F3gHWCiYN5ZnJudYCajnuHg3mTkHl2h3NviHqEi3mKhYKHjZqih3uDdYKLf3d5bmyChYNec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWWJhYm5YUVRaZmdjdnCEgmJda25kYmZrkm5gZ2ZgaGuBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbnZtiXeDfoBublVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhJCKfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkoSRgolxg5GYkJyPkIyMj413e5KReo6LjJGWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYRvdot5iIt5h3yBi4+dnYR8e3aCi313cGpsgoR7YXlxbm1zdFZfcGJyYWBsbnpxaHBmZnN0aHFrYXdlXVdmYWByU1FPXGZlXXlwiHxgXGlyYmJlZpFqX2hlW2dwfnBscXSKfXZ8hYB1dX6MeXuFgXiIg3OGhX6MjYR8eZV4ZnJrg2CIfm9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHFwhXRwcoRwa2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ/l5aJjo2Iko2InH+OgXd6jH6JjIqcm5yblZJ5jHVmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjIqLcXqUiHuOiIqSkYl5hXx+bHtlc3Bra3p5W4B5j4+Ben1+f4aOe3pncmpyio6JgYWEfJSKa31+bX+LfoqFfIN5gI6UmZmJfHV3g5B4cm1ncYCFbmt1cGhqdW5UX29lcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cYp1XVxldmFiZWWPZGFmYllpc3Nua3J3jH10eoaCdXZ+i3OAhn97iX9yiYiBkYuIfH6YdmVzbn1liH5ucGyAWWxueXl0YXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR4cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhoujl4mOlYqRnZaDgZaQhoqQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooORiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gIGGjH95ZXJpf4mOiYGCfouWhGuBdW2HkIGOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFjandoUmFxZ2xWX290emFyZF9ofnByblpjcmBiVm5ZXHhOTUxkZ2Jed3OJblxcZHleYGRlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaGjH9+l3NndXJ5bIt7bnRxgVdxenZ5cmV3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGltfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2TiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4yeg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hY6FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmlmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZWdfYnNzhWpcXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdneKho+ZgYyCe5N1bHd2eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mHgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh1g4V1gn+JkZyehpSPn36IYn+Th4WIhIqNgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SJf3BfcW+Ee46LgXt+kId5cINleYGJhouCeoN8fpKNj5GDbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNiXGhfZGxgblVbcE5IT2dlXGdvcYBtWlxjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAiHV5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIJtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1eltgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabl4aTjZyAiGZ9k4KAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goGEhIBrXXB3en2LiIV7gI5/fXGAaHiBhoqFg3eCen+Wi46LfG1reol8dnRvaWh9d2VdcWNYcHRTVG9zaWJOaHR4ZmFeXVhvgG90WWVjXWptYHBPWWxSRFRoYlpsb217b1lbXm1jWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goZ2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBmcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZmSjYZvbIaSkXp5k4eBhJmKfId/eXiJioSVgG+Kh3F0fXtqeYaDpZGFk42Df25+gnWCd4WZl5OKk4+UhYdwe5KEfoODiYNvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHqCa1tvfHJ/h4OIfYWIeohxgG1wgoWNg4Rxg3d/mIuNg3dtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1ycFhoXmZqcV9vTldpUj9ZZ19bcGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4N/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2xvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+gIWCmoqBfI2NaXhya2tmX2FveW1fYm95XWRsg3phcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tj41/bm2FjIx1fY9/hYKViXyDeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG9aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1pZXHV/dWlZYltnZW5iaU1YZlE9XmZdXnZmX3VxW1lVb2RaZXF5W2heYGdtZ2lraXB4fY5taoGEf3lugHt9gX+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5WCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKeHBthYOHdHmJeIl9k4h6fnJndoh+fZdvcYZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3lqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKCdW5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlYWWBxgHVhXV1gZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekybhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl6f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9MZnZMXm9VVFlzbmJRT3R5YlNXV1xhcIJzW2FdaGVlY2pkUVtxSURkYlxkcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgYJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh6eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoizcop5cI52fYiQgXqUi4B1dHV+d39wcH9uhXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVVddYHKEb1xgY21kY11vY1RdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R+g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoWAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZ4dxYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koZ6eXR6dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fXpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYWZfXFZ8Xk9WZXFZW2poXVhnYV9yZmpocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHx4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHpkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2AeHhzd297d2Vqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZvd4ukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Yltuempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFxaGdhV2ldXGtpSkVrWmJlV1hVeVpOV25qWV1sZV1aZWNedWZsZXFmc3B0gXhwmYV2f394f3yFh312dIKHgJWDbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn59bISGlIByj4JxhoJ+goBwZmxnV11bXFtTZXBlX1hjcnVpdnBkZWJXW1tof3Bvcn9ziWVmen9qdXZ0dISFeIGFend0dW5renFiaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXc3COp32EfHaWkHN7cnt5bHp6j4N2l3yHhoOHhH11cXNtaHVdbWlfbHVkZ2Zpem97cllngXd1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHhye2V9fn53dW5jZWFshnxta1ZqY3JUTGtsUExPcEhee2VhTlZ1ZUtPU1dga3d+Zl1nc2llX1djV2JxXUxLa1hkYlVUVXNXTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx7dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaYBpa29/Z2xiaXt6a3R1dW+GgnuBfXZ2bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWXBpj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR5kIZziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2dHVignp9dnVvY2NibXx8a2tVaWJnVExuaFBIUmxFYXhlYU1Uc15KTVVZZWx4e2ZfbXBqZF1WYFVvb1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXF0fGlqXW14d2h1eHNuhnx+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4iIgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWd5d3RwZIN0eXl0cWRhZG1yfmprVGleX1VMdWNRR1diR2N2ZWFMVHFZS0xYWGdsdnplZW1xZmNaWF1Yd2ZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlrYG90eG1vbnaDl3lygYB9f4mMhn51doZ4hox9dHV1gnl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Jxd3VsYltudHVodXdyboZ5f4F6d29vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Ig4h6dm9xfHFhd2Nabm9gb3CAe3JlcYBkXm11aWNmeHpybG2AdHJ8cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidGNgSlVuVUpMWlZpbHJ7Y2xsc2NhWlpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGJueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doJ3fX1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdgbHZkanVqaV9bbnVybXR1dWuGfX+AfHdvbmxlaXFjW2tyZHR2jnNcV1RkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3N6entkZnZoXmNbYWhcXndpV2JecGhhd2FbfHZqanJveHRzdGhxgpWDh3+EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFFJUFpWa2xrfGVtb3JhW1pYWWxwV1NQZldXaVNURlpcT0lzdVhgZG1jWGBhYl2MamRlbXp4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIKCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZml0aGN0ZWVdWnB2b3F2dnpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5dHVven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5waGlzcXRxdXZrbYWTgol8hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVWVVVlBVb1hSV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVlt0ZFNSV2hRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBin5rk4hyZ3SAe3WAg36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpydm5ze3l0bol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJub3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zsc3VvbXh2a2iFjH+JeohtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhib3V6dGpua2pfWGBmaHVdZFdiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddVtUU2BnTl5iVVNKXFpRWnZ2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2OjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmaemxubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ13ZWdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjouKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpORi5KOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOjYmRiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiY6MiZCIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6Li5CIjYyJjoePj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOjYuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx7e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18e31/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHh4iJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX5+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTlJOTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTk5GPk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGRkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOkJGRkZKTf4STkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkoR5kJGQkohziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+QjXB7kI+Pd3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6OdWyFkIdyeIePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI14bXWOgXR2ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLiHBiZ3hzb3WChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndyXGJpXGJka2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGBjdGxeam5nZGJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aW2tza2FtdG5lWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01bZW9rWmlzdGtSUVNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlhiaG1ub3BxblNMT1BQUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFQ0ZJVmNmZ3FubWhnXVFOTk5PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRUtNTVJfam1obm1tamhmY2NjWkxKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD5FVF1fY2lsbmltbGxqamtqZ15PR0VFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R1ZfbnBxa21ramltZ1hJRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PD1RZXFyc29saFhFQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTk8S257cVZBODo8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXp7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PTw7SmxlOTo7PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/P0E6Rl8+Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent8fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLZD08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PD1JTUZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz09OTo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3p8d1c8PT89PT5GaHRMOj0+Pz09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KDhIODg4B9Xj5AQ0BBPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXZNQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydXZ5e3t7enx9fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhIS01MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRlBTUlNTUk9QUFJUZXFxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f39+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCBg4ODg4OFiYuKiYmKioqKi4mKioFHNTY2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5/f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4OEhISFhomKioiHiIiIioqMiomJjHo+PDo4Ozw9Pjk6Ojs4Ojs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo6Ojk5OTw/PDxBQkRJSkxLSUtMV29yc3VzdXh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjG9PPj5CREVFQkFAQj9AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouJjGM+REZKTEpKRkdIRUZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKh1ZITU1OTE9KSktJSUpKSUVDREZHRkRDRUZEQkhJS0hIR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQUJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE9NT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5TUU9OTUxNSkhHRUlJRUpIR0pKSUpHR0dLTE5MTUhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXp4eXp7fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLYFRUUk9PTktKSEZCR0pHTEpGS09MS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi459WVhUVFVUT01LSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4xpWVdrYUZUUVFQSTs7UlNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eHp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGVVOllZWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5b3BZW1xbUlRSVlZUW1p1g1lVfZBhXVhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+Z1lZXFlUVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHxcUVZYVVJVUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3lucVZKTE5PS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUFFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTkxMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUUxLTVdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISkxJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R21xdHd4eXt7fH19fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5NSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NPT1BMTE9NTE1MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHBzd3p6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lGSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tMTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0pGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSUxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXJtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREE+Pz46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTo6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTE5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9PT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRkhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0NFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZFSUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmhjaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdmcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnZ0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFRD9BQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk5NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSUpLT1BPTk1MTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklJSkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHR1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhLSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BESERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTUpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRklKS0ZFSEhQSk1NSk1SSUhFQUhGSklLTEpNSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JiYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURHS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlaUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0lLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhJUU1MS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGFYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhISEhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1MUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQT09PV1FcW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTUhISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVhVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goGDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBUSElPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVVJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJTWVdWUFRQUFBRS0hneGxjeHJtW0tOVnlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWNkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OSlN1TkNCRlBQSEpLSUtQT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0dLS0lKSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUExNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1ZVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl5ZXV9eVV5cXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVFYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFdXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllZWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXWJcYGZhZGZkXl9kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGNjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBlY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWVpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmVjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tdX11gX11bYGRdXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGllZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dXFpbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4KCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgoKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHp7e3t7enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz87m8O+v76+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMy6h0szMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dX6DgoKCgoKAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z3end5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8enl5eXl5enp8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3t5eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3e3l6e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6end7eXp8eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhYODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIWFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIKDhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYGBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFxcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93cHBvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnNzcnJxcHJ1cHBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJ3dHFycnFuiYZucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycIWTcnFxb3uefm5wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxd6OQcHFxlZ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJznKiBb3uinn5wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFxcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGUq5twg6OffnBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4d3h4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzcpOxqouVpp17c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh8qa+jsa2vn3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e4+rmaG0pJ+piHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19maGVo6+fnKOafn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGZm4mYsKGdnZ2DgIGAf39/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f3+AgIGBf5eknZSjm5mRnYh7fX5+gH5+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn9/gH6GqK+mnpmdn6appo+FgX9/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChYaNmquvoJujnZ+eoqSqq6WflIeBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIOGjJ+rqaCZmaKdnp6fnZ6hoJqQhoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KCho+SlJWXnJyen56ZmJONiIaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOEhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5ORj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgIOIkJWUkJedmpGKhoeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDjJuHkJSKhIKDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoGBiIeNg4KDgoGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgH9/iZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEgoGBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgJGZhoKCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGQjIOBf359fH2MnI6AgoGBgoKFlJSMgYKBgoODgoKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19e4GYjICDgYGBgI+UjJCBgoGCgoKBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX2AgoSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhYWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICFhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHh4mJg4OEg4WEhIWFh4iIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDiIiGhIOCgoOEhoWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWGh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Bg4ODg4OCgoB9fX+AgIF/fX5+fXx9fXt6eoGQhISCgYGAgYCCgoF/foGBgYKBg4GCgYKCgoGDhIB/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfn1+f4CAgYB+fX19fX59fHp5fIOCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gIGBfn19f4CBgH9+gICAgICAgIB/gIKAgIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4OCgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX9/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Mi4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+f39+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgYCAgH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl6gYKCgoWDgYKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh9g4OEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1/gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiImHiYeGhoSGhoWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6eXp7fHl5fX1/gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4OCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fn5/fn59fX18f4GAfYaPgX19gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt6enyCgIF/f4F9f35/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg4CBgX6Afn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoWDgICAfX59fn9+jISBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHp7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx9fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foKRhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISEgoGCgoKCgYGBgYKCgoGCgoGCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH58fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhISCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgYOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fX18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn6CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYSChISFhISDgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn9+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHyAfoCAf4GAgH99gX9+f39/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f36AgIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBgIKBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gH+Af4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHt9fHt9f3h3dnl5ent9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KDhIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYGCgoGAgYGBgoKCg4B+gYOBf4CBhISBg3+CgoGDgYKCgYODg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgn+BgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ/g4GChISChIOEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH1+fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChISDg4KAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX59fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIOChISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYSEhYSFhISDhIOBgoKDg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/foSEgoOCgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGEfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/f3p+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319e317fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXiFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhoSGhoSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+Egn9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHh4eFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gH1/fH19fn17fn18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+CfYB8fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB/f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/fn5+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB+fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMzMy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTU1NPT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tfa29ra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QDw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vL20i4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamsm1RTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqrZ1ZWFhXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr7GhY2JiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0czNzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtNGarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/Nk4icnsSShp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qx173JmJjFvMmXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZsdXSlJafztGSmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZsJ/Dm9qto7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1s2Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY5OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NammrTNjqeaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LXpZu0vKOlqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1LWCxNWdko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRw9TT07nH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QUE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNERUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq83dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7b3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+9vr++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ioqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+cm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeSk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkpGPlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWkpqempaWmp6alo6CgoaGfmZKVpJqamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGio6KjpaSlpaWkpKOioaGdnJqWqaqdm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+fn6CgoaKmpKOkpKSioaGem5qZqn1+nJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgsbWkoKKhoJ6cm5qaopdQg5ybnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGgoaeSsaKfn56cmZmam6piTIednZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoJ+qgX2uoqCem5mamqeMTlOKn56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6eopdZia2enJmbnJ2ralVVip6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm52ibWOeoJmZnJ2hmmlgWIygnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmbonNpf6KYm5yco4tqX1iGoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmal1cGqLl5ydnZt8aF9ch6Gdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZije2xrb4ecnJ6UcGVbX4qhnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn4mLknR+nKCjkXhlVWCQoZ+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZmqCmnI1siLGnpHiKhmNhl5ybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaloIh4W2unlpZbdIF8dpSSjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCSqI9rVFBynIqLTl10eICIh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/k6h6Oy88eI96eUc6U291gYCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+f56ZT09UP3uEbmZOOzVQcHp+hY6Ni4aNlJGLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgYCkdVOBeFB8lYl5Umh8Ulx1hIqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2AfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGLf4iNjIuLh5GNn2GN1sBfpq+kpnBxin9WaIaLiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ6hnZOXm6GanZuio5Flv9Ctldu3psCxVF53aVWEkIuYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqrKBc7OvndHFopisrXFqxYdQe5+ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqapp6isjX6ThIrIzrCzqpJ0Rq6xW3CdqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOipaGMg2+YsaOenIeBdGN6jHVtlKSioKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15lZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqamnKidgWtRjJKAfoJ2dG9wc3R+gJCjoaGfnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqtsbKurKupg3BfSG91bnF2a2llaGZncXZ+ipahpKWfoKKZlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxVXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnoZ6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7e1s7a6vbuvlGpjV0hca2ZqcWdjY2VaWmFia3V6foiUnaOmnJ2gmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt77FzdDHwLWmk3deXVNHXHRranFlYGNpWlheWV5lbnBxdHiFmKaup6WYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZrcWhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vNDc4NnKu6+gkXljXF5TQV9sanF3Z2JeZ15VXFxbW15lZGJjbomyycK5oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDxMDO19jOuqOPfG9dVlhYTD1eYmh0cm1iYWZbV1dYWFZYWF1xkrDFy7q4t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca6xMDHz9LHpoVdT0tPU0w9VldoYmBxaGFfWFpXWFZUXoexxL2ztLaqtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBtp3Hs4xcU1ZQQ1ZTXGFmcGVYW1peWFlnkK+/uramqampqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3lqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TEubS/ubvKrnldUE5XfHSQl5ZVVFhXWWGBsLepq7K0rK6lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPDsn1WTHB3l6WdTlFTW3Sgtbeyray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THw8fIsIBgWJGmkkhMbZezwry+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcLFxc3Qx5OLqItFbbnFyc3GxcHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMHFxsnOsYxeacTQx8vPxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNrZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcG/wMmTP5TSzMXI0cGvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMnOwbu/wLy7xL26wMS/vby4u8DFq0iVzMTAwMm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2plal5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HUjbq/u8O1use3trm7vLi5tbrDyalMj8m/v7vBvrnGvcK/vMW4tre0uLa2u7u4trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWxoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxHiqy73Ht7m4rba0t7mztbK6xcmcTYTKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1651grzIz8LAuK61tbu9t7mxvsPHkVR/zcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNoYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKZcnSu0dHMysS1ur/EyL6+tL7Av39hdsvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY19hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhnN0pszMy83KxsLDy87BvLi8urB4cWm7yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW19gX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6vaw762vsC+vrqmnKqytsPApXl3epzExsvIwcPAwMnKwb+7ubKiin91rsjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXVpSRkVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xLdtrc69trnAvKp9bmhubXKBlph0eH2Zvb/GwLnAvL7FxL29uLGuoJ+Mjp3KwsO8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d211e3FvalxgYFpTUEFGSUdLQEVDSTw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydYGzvba1waSGaVpeYE1SW1tvdHiDori4wrqzu7e7vb+6u7uuoqKml5+AvsTDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw5Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4iqCvtZxqZmdWWWBJSU1QVG14iKewt765srWyvLm8trm+tZWltaWtdq3JxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmIfHaMoZhfU0NYVUdhalZPRUphjqKtr7a6tbSyrLy5uLW4wb2LnrmrrnWmy8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIJ5iJBuTks/ZFlCTneAlGlNQV2DsLWztbK0r6y7uri2ub/GdoewpJxmqb+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV5cUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dZSkpYd42BYkBTo7mztLKwsa2wubi2u7e7vJGjs62kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlodXRuZVVhZFddUk9NSUBJUkROQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/UnhxUElJS2icgFpFUq67sayzr66srba2srS1rqmnn5qbnZ+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnKOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3htbl1RaVVQT0dQTU1DUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvWhEUp2CUVdJSmBKVY1hZGOBrrWqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWloyXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bWt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yqBQQXOddk9tSktjZnRzYFxgcpCxr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6uin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6arqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5emBiU1VhSElKS1NUSlNRTTk/QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoxXU0plpFplfW9yW1FrY1tlYV5rj7SwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5ual5mblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNpgmxmW1NaWk1RS09PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXZ1cGN2dlhXY2BjaFpZV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqeHVdbVtSYUlSVUhGVVdKQ01HPUtJOEU8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo4BvgnBgY1hMW1JaTEtQWFJITU1HmKyqqaSfn5mSkpSYmJaWloyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLWysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmpsqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaW1cWFxDV05KR01IQ0ZOPT5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnp2KYldeZWBXTVFHPT4/Q0M/PkJReKmtqaqln56foqOdnp2anZuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMm/sLm5vbnCvri0u8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKaho7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2x1cnFoV1xRRlVIREpQST9FQjRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD85Nk5+qrOno6OioJ6lq6ael5yUkZqemZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsXFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrry4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hqZVpbRkxNRURUTUVDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXNqYVdORT5JWXxvYUI9XI6urKCZm5uenpmXl5eSjY+Xl5SPjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMjI0MzMzMfKxcbM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwcbGxsrIz8DJ0c3HxsjGwrzEwb6/v7a+s62/wMPDx8THxK+/ubK4vcTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkRPTURFUElEQ0E1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWpmXVRJREA/SoWepJmDoLKto56cn5qYl5SSlJaRkI+Mh4SEiIaDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0NDR0c3Oz9DFzdTV2NHXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcfFzMzJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1JETkZASVFDPkI9OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiVExKREM/Q1Kv0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJwcnuFioB1cG5xc3CFs8O+xdHQ19bV0tbN1NbW1NPR0tPU0s/Sw9DT1tjV1dLLys7Ry8bN0crS1dbZ1tjT1tjN0srP0czP0czT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJS0dBRUlKPjtBOD41NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWklAQURBRlF2sa+mmpSXn5yaoKCem5yalYl3aWNhX19fX15fX11hbHVzcHBvbHFxdZLEyMfU1tfX1tPW0NXU2dTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NbMz8/JzdLLztHAxsPIxs/O0dHSyMzNwMvNxtTPzM/IxMvHx8jMy9TU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlFgSkpDRUNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2ZDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgXmFgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO09HY19fXy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS087U0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVhcWkpGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF7SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYWBeX19eXGJtcm9vc3R1dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTLztLNy9fW0MzR1MvL0NLTys7R1dLV1crAysHGzcLIysPMxMbIy8vPys7N0M7UzMbJz83Jx8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21oYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OzU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjK1dbZ2tvYzMzPyNbVxMK1r7SooK2XeGxvcHePmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgYGBhYV9fXVtdZ3JycHJzcG1yeaXH08/L0NDT1MnEyMnFxr/Dxc/Ox8XHzcrRyMvOzcbR0tDOzNTKx8rOz8fHz9LL0M/FusS/xsq9w8jJzsXDx8DHzcjEzMrMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MXFx7vHw8nJws/Bvby/sMHJx7m8qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdWRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raS2fmeChaKqk42Nlo+Fg4ODgX2EhH5zX1teXV5gXmBjZGNfXV1eX2BgX1taXGBscnFub2tsb299udHIycrPy83Eur/Duru6ub3IxsLDwMPIysjIysjBxczGyMrNycTBysnBwcvQxcvIv7nBvMbHvsDGz8vEwMO7ycfJvMnHxcrBvsLLxsXEvsa9vcHDxczFxrzAycPFx9LEwcm/ysrGyMbRw8PGw67Ey8fEyre/vLq0qaykpZifmKyjoaabo6CblXx3c3Vmalthbm1aXFhSRExHQkdFTERGU0A1NDMzNUA9Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKwtmxeeXyfkYqSloZ6gIWFf3V4dXJwX1pbXWBgYmNkZGVkYFxcXl1eXmBbWVpcYm9ybmtpa3Bvc4/HvcnFy8DGwbC2ubGxs7Kxwry8vLq4wMHBxL69ub2/ucTKxcbCvcbAt7vDyb/Bybu2u7rGw7+8ws7Dxr6+tcG9w7u9x7zDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGw8bJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dnhrZWhgaG9kVl5ZSkZKRkhLQUZCRklAOTo2NTg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NXXzcrOxcnFx8G6xb2srqZgY3WBkouIi4R4f4aGf32De3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3LwcO6wLitsLCmqa2rpri0trSzs7O7tr2xt7C0rrK7wrzBxLy/urSyur7AuMi4tLy2wcK9uL3HwcS7ta+ytbq/tMW4u7Wsub2+wL2xu7awt7qzxry3r7u/tbe1xby/w8bAxMXGx8vFwMbGu8fLwM7Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPz06NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQy83IycjKycrE0M3Sz83Fx8HFwb+6uMm3q7CZW2dviY6GiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX15cW15bXV5aW1tdX2xwbmlmam1ucnykxr+4uLSvqqunnqGppp6qrLKtqqyptK22sbOprqess7u6tsO5urmwq7S5u7TCua/Asb68u7a8x7nDt62qqLCywLa4vbCxqLGztbu8rK62pq62rruysaq5sK67rry4vMDAvrrDv8bDxcC8xsLIy7jFx8W/x8TDusTGwrvGyczLs7nCvbuziXR2d2tpYGJsaVlXV1tBTEtNSkVBQ0BGQTo6Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHEz8fNwcLGv8TEw8PKwsnKv8C8wbqztbXDrqqwkltpfpKIjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmNkYmBfXlpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWtpaOmppmfpJ+Zm6SqrqSooquqrKqwo6afqq21trG8uK+3r6iuuLS0vLizvK+4ubWyvMGywa+lqaOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcHBx8i3vsDFt8XDwLu/xMK+xMjMyr+/xMDAqYdzdHNqaVxhb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvCy767yba9w766yrfBw8G0try2sa+1vK2pq5JjbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRmZWhrb3KFqaWrpJ2boKOTnKOal5Cgoqmjop+lpqemraCdm6SmrLKvt7ensKyoqrSrtLqxtrautrmysLq6sbekoKSgprGorKm6qqWnp6ins62gqKefnKSmrJ+fp6SgobGtrayytbO0sbW9trvBwLK7vsPBsbm5wrPBvcC1uLy9vrzCx8TDxL/AxKCEeHFsYmZga29gVFlfSE5oT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usC6vbWgnpSdoaa6tquzs7uzxM/Jy8LGuLfHwMy/uMq3u8W4s8W4s7/ArLW8sqymr7StoaOSaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW11fZGNjZmdnZ2ttboedqJ6UlJmflJmhl5WLnaChppyfn6Sloqeem6Kbn6uwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fpKKypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6wqayoqqytrbCzua+4ubqwtry7uquzs7mzvbS3sbG2tb+1vcC9w8K7u72XhHtzbF9lXmRkWFRXXklXXUtQR0pKR0E8Pz9BOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7jBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe/t7LCtLG7u6y5urGin6mrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl1iZGRmZmZoaWtyjKebkZKSmZWZn5SVj5uhoaiem52lpqKlm6Chmpmvrq2vsqGlo66rqKK1sLKyrKmvs6e6s6a2oaOfnKOhraOiqraro6Omnqamo5aZnZeZm52gmpednJ2craGsqKOkpq2rs7SqtbCyq7O5tK+rr7Kys7izrqmtrrK3sLq2ur3AuLOxlIZ5dWZfZl9bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrbAw72zubmyv7axubutsrSvn5qjqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagmpGRjpKUlZ2Vl5OWn52gnJahoaikn5+pnZubq6avsKuco6S4qaCgr6i3q6enrbCkt7Ckt6CjnJmZqqahm625sKOhpJyioJ+TlKGUlpabmZiWl5yVn6meqqSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrG0sLy0uriuo5WCenZlX2FXWVhTUlRLTV5MUExHSExLRT1APj1CPDo3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLrCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyaoamVkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JiY2ZpgJOPkoqPkZKYlpuTlJqfm56Vn5+npqSnqKCdn6agq6+moKKjt6ihoaKps6KlqKWwprGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6ihopqkpaWrpKWwp6Wjq6ytpqmur6+rqKqqs6amq6+0sa68trGwr6CSe3hzZWJcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G2vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsbEs8G/xau3t722vbq7tbKsraiZmZ+ji4p0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGBiZGl/j4+HjouRj5GakpOVo5mglpygpaGtpqWlpKSjnaqrpZqfpbGqoaGepaqeqKKfrqyqqa2toqKilZeimpyQq6mwnJ+in5+XmJOJnpGNkpOWkJiYk5yho5ykoaKVoKKkpZujq6Wio6ukq62lrrKqpqWmprSmqqits7W0ubqwq6yejHNxcGBbV1ZWUkZQT0haXE9SSlRLU0xFR0pEODs7Pjw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcnMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl5fX2JkbYqMgY6DjY2Ml5GSkZyaoZyboKipq6isp6mmpJmlr6SVmaWvqaCcmZugnq6anKu0oKamn6OkoZSTm5aWkqmqrZudoKGhm5SQjJmOjJGMko2WlZCdoaCjnZyjlZuho6GYoqijoqiroKuwpK64pqOko6ytqairr7S3sr21s6uvmIV1dGlbWFlSVVJFWExRW1hNVU9RTFFSSU5KQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8ezxLq3u8LIsa24v7e8vruztqapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF1fYGR8iX+IfImNh5CLlY+WmKGfmqCrqqavrKiwpaman62hlZakqKedmJCPmp6vl5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpaepqKCwsKaxvaigo6y0qq6nsLSwubXAsa6xq5B+cnRjVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnamnqbKwpLbGtLm6s8rFubrBy9DKsra4vL3Aw7GwsbeutLS7s7Sjo52dmJeVhIB2a2dsbnFucmpva2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVhcXF1han13fHKFi4SOh5WIk5KXmpieqJufq6amrJ6omaCmnJOPn6Oal5eGhZKbpJCVo52WlpaIopubk4yOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqGaoKKWlJiYlaKmmo2ZpKepp6GgtLKos7ihnKO3rKmtpLOyprW7taussaOKenNuXk5RUU1PRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvrqmwnqauu6+toJqbnpWViHyEbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhaXWFub3NtgYV/hX6Pgo2Jk5CSnaGOmpyjoqSYpZainJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiYCKmKCjnpCTmJaFjoOUfn50io56kIiTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5imuKalsKGxrpyxvKqpr6qZg3h0ZFZNUlBQTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6WlpqamsqemtMG4r7SwycS3ucHOxr6zrLrBrK3EraiippKdpreto6CQlpeSkH54f2ZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVXWVtdaWlvanyCenJNV3GOgZaFjJyXi5ORn5idlZSWlI+WioCUiV87Vm98jJSKgIySjJCGhnOLhZeBeYF7hpSdlYOVjpGQg4Z9k3hxcIaNfYmBkI6Ql5qZk4uQipyIn5iIiJaemqGgl6euqa2oqJ6WrbOipq6ZrKyYqLSjqa2jk390bmBbTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqaCmqaejqrCop7TBubC1sMfCt7O9z7+5r661wqeqxKqinZiDlJyxo5qYh5SQi4d+c3ZdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBrbGZ4f3JPQT9/lZGQfIiUjISKjZuOlpWJkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiJWLjpGTl4yEioiUhJuNg4SSm5aenZSkoqippaSem7CqoaSkkqaqlqKqnKGmqIl2bmdeXEhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa6hp6ilp6ivrKq2vLa4t7PBu7aouci4tqiotbaqsrynnpWNf4mUqZaVi3+Og4J+eHFvWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0REQ0lOT2hZTlFTVFZaboJxdHxoZ1tTj4mUiHN+hoF8hYyTgpKZi497ho+AdoB4c291cXSOjoF6foqrhXp6aHZ7jnBybXiBi42SeHuAe4B3c3OSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iUnJaRn52pnp+hnaCppZ6dmI2npJOgn5aen6SBc2liXV1KV1BSR0tYUk9KTUxSSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX92hnd8dm9vallLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt3ZXWLlZiNjnxneIB2eH+JkH2EmJKAcYePfHd7b2t+rX10kIt/eoaSgHx/dGZ2fIZsb2hzfIqNh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2LpZuOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmPi4t2cXxtdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcWuHpqrAfnR4Ynt3bnt5iJB5fIuGb22Mknl0eWpqgIJxlpGMgX2Vf0mSmW5od36CbWpkbHmFkJKGa3JsfG5yfIZpbXB/c42JhYZ7fn97d3B0dIaCeYF5cHyOi4qTg5aXmJqQk5aWmZedloyDiZ+Si5KNhpCXgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNS01PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmJufpK2voq2qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SVlpRWVxfp4dhmWhyeWR+b2x/eouJdoKIhnRsmpJ0dHxqap2OTXmFk4mEjmYxdodzbH5+g3RmZXV/hISFgGZpbHVrcIB8aHFxfG6TjY97dH59cXFudW2Cf3d5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIeKhoCQiHhsa3BoZVhSWlhZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpCZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RxZ19URklDPjw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVVMQUlRSWKvsp9xendrfGxxgoGFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8c4utjYmBaGdiam5ybXCDdWlvWHVwjpuRdm1/e31tcm5wgHtzdm5idYN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXlxaWWFfUk5bWlhXS0hKRklHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlZGdpKeer5WltKmusK7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bXdud2RqXklQRz0/NzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUVNES4Z1f3x7dX5sdoiIfH2Eg3+MfnWimnp+hoGEmYSanGGGqp+dioOQjnp3iX6JiI5zipePhHtdZHF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHp4a25pXXaGfYd8h4aOf4qSl4ONhYyGfXGEf4R9dnd7fIl4cXR1ZmdgW1teU1xnXldQVFhbVUdKSkVLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKf5OMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqDjox4g4BzoISKfHyBf3CBfXpodmxSWExARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUUxLVF1ZUktog4h7iXl7cXyPjHp8iYd+l4d2oZqIh4+SlKWNralIhq6vrouBgJOKgouChJKph4CYmIqcdG18gYaHfo5oZ2h5f26Fh4KFcYSGSGyAd3J5dmhta192fYKIf4eEi3mUnJuJi4iRf3p1inZ8eG1vd36AdXVzbVxeXltjY1hnZlxUUFBXWVBETEtGT0lDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpagnqygprivs72zl42Si5iLfXRwfomSfn2Mg5KUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPz84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaYyThpSAhIGFkZJ+hYiRgJqVgqGhmJWbmqatk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnX93hYWLkIeQaWhwhIF0jIeEinKGgneHf3t2hHxudnVmf5SOh4iIh4iHoKqilomOl396gYh6eXBna3h/e391bGVeW1teal5iZ2BaT0xOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3p/jH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koaSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElMTEtOVmBjf2ZnbXSbmo6ZkpKKjY6ZiJKPnYugoJKjqqWkrJOptqKowcKux694upSafI2hnpmEk4WCjqGflJmRhYqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY2PlqS0qZuMlKKDh5KDfX9ramp8gYKDdWNeZGBbZ2xdbGxeV0tITlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTk9SVFBQUVNRTlBJRUQ+Ozw6REY/Pjw3NTI8P1I1SEhITExNTlJebop8c4F9n5ybp6WhmaGXopScnqieqKufqKypqraXq7+rtsjIt8jQz76boHBpq6mfhJOShZygmpuZppKRiJWim5t4en6UmJOik5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Gmta+ckJioh5aPjYCIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG18YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6MfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMC8vLy4uMDAxNT5BQU1RUlRRUlNUUk5TTEVFQDw+PUZHQEFAODY2Mjw5O0ZIR0lKTk9RWW2Fj3eUiqKmqbS8uKStrKymqLSrsLaysa27sbO+nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqI+csYuVo6a3upugorCSop2inZCjoauvrLK1opSkqoiZiJKJlXl6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoYldpb1h6hXaBk4WIgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYeIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFFPUFeBkp+EraOyqbHAxsKqs8W2q7O/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6prra7srqssLWisauxtbu3ta60oKeoo6eaqa+ssrm3uKabtqmMpI6Rk5+GeIGFd1pjZVdnY2JkYGFnYFtUSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1lRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFioeRenhuXVZARU48Njo1NkFCNzY0Ly82Q0hCUVxQUVVXVVxWUF9VSUtLQT8+R0tGRkQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0wrW3wcvItbvEvbOzwLa4wbW/r7d0sbOlusSksMa5sbOxtKiktbaqsaCil5uikqWwrqatq6ekmKCstLuiqLK6tby/zL/Fxb29s8G3ube+t7q3uayssKWwqa29sLy6wsGrmLmnlK2Ol5eqiH6DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFFWU1lVWnZqb36OhICNhG56c3iHYrmhmaOJlJSWkpSTjY+WkoeGe4aBjZWKgISBinp8i4eGfYqCgYuElX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUlJZWFpnWVRgYExTUEVBP0lKSEVFQUBEPEU2Qj5IR0pMU1pUXZOuuLS6uMi/ub3JzLu7wLu3tbu6tr20urHGYHWypLGanqu9qaWoq6qkorK1oKuonpWWn5mfrqWnpqWfpJOip7G0p7KyvbbBvtPJydPGw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qaGrjqSotYiBgXNgY2NfWGNgamdSWGBWUlVJRUVOS0A+R0Q9S0E9QkA9Rj47SEE3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj4yEj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhISEJJOkQ/SEtUVFZcWluSucC4vbbFv7q4ycq6trm1t7myt7Wzrra2mGR1qJytcF6irJyYoKKbpJ6qpZSfoJCTjpaZl6eepqCempmDpJ6spaqwrbiwvbnU0c/W0MrM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9iWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aRkJRubG90dYezq6Chn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIZnW29oXVpaVEhLTk9KS1BLU1FITEFKRkpPX15iZ2lhl7fHsLiyur21scTGta+4sLC7q7Kxp6u3q4y2p52ap5pOmp2Mjp+WkaaYpZWKk5OIkImPkZGdm6GXmpWWh56ap5usr6iwqLS01NXV1tPM0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eX1lhWFpmWlFdWE9QQkJIRUJIO0FDPkFHPz9BNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVJlVnOQkJiCaHFveXmDoKmeppeMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/h4GGe4dyg5KLjn1xeHVscXh+cXpueHNsaYFwbWNqbXB4aXd8fsu/wd+nbWN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0prC1qqy8v7CrtKakuKarrqCrtKOOsa6al5iMkZORhI6bgY2mkZyJg4uEiomEi4SUlZeXk5uQnJiZmp+eq6ylqKKsrc/S1dLOzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFFPSD5ARkFCRTxAQT5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3b31+f6GenqGMjJiTk4uMko+WhHmFj5CNiomHkYZ+gXtyfn+Bh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3Jpb3F6eXF6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1lkalRYXF1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2io62hp7GfiKaak5KRiZGOiIGTiWqUooyZhIGGfpGDg5OXrYuVjZSajoaTkZ6Xp7ChoaGlpKnIzc/IwszR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCclJ2UhYuViY+KiI2Hjn94g5OYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3Z4fXSFfHlsh3Z0bn12hHR4e521jDtBi8Wlfox8aWVXSUNmY2VjZ2pjbndbXmZoa25pboCDiJCLnJ2gnZCXmJ6jo6Wxo6Oyn6GlnaCooKOxnIWekpKSkIqOi4aDj4R+nJuMjYKEhXqUf4KplaOMkYqXkot+mIuakquzmJucqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkZEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHFzhY18l5Cdi3+HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4OGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dHd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHjJOboJqeqZ6grJuhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35smXqEmYaIk4yNlIyGfJyJlI+uqpSWmJ+Zp6+2vamtvsfLycnMy8/JxNLK1NfZ19jX1dvX09nb1dDb2tHWyNTLlnt9ampcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JqXm1kYmZrdoCIcZGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uGgXR6kp6NoHaOdYJ0dYF9c4CEb4GQgm+ShHV8gYV6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6KdmauVkJCJjJGCjIWIiIGGkJGem5mIhYyBhZd6iImfl5CIjYqLgn2hipGLvKCYk5eZnammpq6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7bxoh9e2lrZ2JVWFZWTkxETUI7PT08ODo8Pjg9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1hlYV1baHR6eWyJjJJ3dnqKe36Afn98hHp9gpGJhIV6hId6dX10bXx9hn50f5KekZ6DkXyGfniPfniKim6CmoB0mYZ+gYmFfH2Qeo+pjo/Dob2LnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlI6cmZKUkJaNjJWfnJSglJGNjY+LfpCOjouEiZKWmp6fiYyUkZ2Rgot/pZmIhI2ChYSApYeKi7iYnZGVlqKooZ6enaSvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27l7e3pta2dZYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAnJFuh6iFeqCLfJGNg4iEm32akIqMo6KgkKSun4qQi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOLlJSTjouPioeWm5yPlJaQipKThoCLiJKNioqclpmiooaTnZagiomIjZyQg4iOf4OHhaSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wcfNyMbPzdDMz9fR0dWu1tXY2tja2tfV2dmgcn93aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYX6Rg29td4t4eX96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfn+SpqSfpaKWip2QlJeLiqiXc4qxjYSnkoSZk4WZjKKVn5iTiJqeo5Kpr5+RlJCNjoiWjG6Nt4WaxMixm6Glm5yYlpCykWSkzciWj4aHiI+SjY2Sk4mFiomFlpmaj4+Uk4aUl4N/j4uZiI2QqpaXo6OImZ+WmoiOhpaXioSOjYF/iI+kiY2TqJqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOhHWCa2ZgYF9QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEpRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmSDR3WCjn18bX2IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWvooOQuJWSs5mNoaCMpJuvoqSdmJCnl6mZra+kl5SVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiIiOlYyLk4+HgYaHiJKYlIyKk5OGlJiGg5GQnHSRmbKVlqShiJyak4+KkIqXmomKlo2GfYyYnoqQj5yamZOZmJ+UoJ2Vn5uhsa6jpLe+s8XHxL3Dw7/GzsrJ0qfPzdPR0NbY0s/YvHV8eF9iV2JYUklLT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTVtcWUloYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIWLiYaDkqi8ramyva+lrrOzqaOisKyKmrWdorilla2kl6mtt6ako5+ZqZiqpK+wqZqZm5SVkZigl5m7u63JoWm2t6qwlZieoquSl72jXqmygomKjJSHkXyOjn2Dho2PlJSIh5KWi4+VjYuMl5mSnZq0lpWrnouclJKNkJKLmJqKkp2Pi4mVn6GNlY2XmZ2TnJielaKglJydpa+ooaWzuKvCyMS2u728xcjIwtChxsnNzcTX1tDK06NzfWtfXFVhU1FHRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBmSGFgYnBJQIuJf4Byhod8gYl1goqCfm19fXx+cHeHd42Bh3uNj4yGjJqrw8Cwvca7s7TBvLSsq7O3jKiyra29q5u6pKitubeqpqahoqOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29r4KLi4qQg46DkY56gYeQjY6ciIiPl42KlJeUkJqXnaeasJqRq52Omo+SjpWQj5WXjpGgkIiUm6OslZaPlJyelKCem5igoZSanqenpKKksLOmwcbDsLC7tsXEw7/Np8fDx8O81tDMxMqKdnVkX1xiXU9LQ0xARUY+QT9BPDo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcaEZfaWdaXVyTjIyIe4eLhoOMdYaQioFufnuBfnF+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLy8qq6roqKep6yvtbCqm6CqnKKclp+wtKeLorq6tcG7q6icsqSkqJSEjqnEw6SCi46HiISGlZSMeYOMkY+SoYyMlJGPiJegl5KZlZemoK6cjKqcjpaPkpGVlY6QlZGPoZOGl5+gsp+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLEvsO7s9HJx8G1d3tvX1pebFROSURNS0tJQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2XiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu7+nur++vMS4rMGprLO7vaqwqqSlo6yutK22taCgrp+lopijtLypm6i8waO1tq+rkq+sqquWhpqpp6WRgoyTpJWKgHWJknmFjZGQnqCSjpSLj4yUo5mWm5SUo56pn5GlmoyPj5CVloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOoqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsK/mXB7Y1tYXlxNTU5KR0RESEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmxJX1hhWmRkV56QnY2Xjp6SiYp/iJ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtLNzs3LvMK3sLq9tLzLu8PBtre8rbPAubyur6ihqai2ra6psreanqyip6Gdq7e3qaWvvsSxvbmzp6mzs62ulpWlraigkY6SscWnlY19kZV9h5GYj6qZmJOTjpOVk6Wek52Zk6GioZyYn5iLjI+PnohakJaXkpalmWWYo56zpZailqutq6ecn6eXmJaYlaGkqKeftqypurzDtaa0tcvBuKq2rLO7uK6ouLq8t4RucFxaVldQR0tTTUs/QUhEREhGRjg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFY8PkBCRkJzRmlJUmVjTEallJyVoZeoloyQg4elkoiBh4KbhIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y/z7XEvbe5t7KytrO3s6ymnauruKupqK+wl6OupKekpbTBsKuss77CucC5s6e4tLezr5WkrbCupIuTlaGNc8GZfZaZhI6WmYuxlZqalZKSmZmmo5Wgm5aaqZyboaCZioyPlZxgSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimrKutsrGjobKytKVzcWdeXFBSTUVRUVBRO0hLSUZHQUM9OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhYPDpCQ0A9UkVXU3NiVkZIq5eZn6GorpiQl4eKp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjLycjMzse+urOuubnAwc21yLvBubW6sa+vsrSno5uqtLSrqaatrJmkrqWlqKy6wKirtra/wcC/uLKyw7C3vaujrrStuaWIm5emm3a+n4SYnI6SmJqLrpahnJuXlJqfoameqKCam6qZoaeel5CNkJ2DbXWTopqVnKKfkK6yo6uVqaqYq6+lpaClqpOSmZyJlZyinpaxpqmrure9s7Kuvrm2oKOnqaWmnJysqamNZmhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzw6PS4uU2FNVkh+ZV5IRqyVnKGfu66YlJ6Lk6qbkZGTiaqNhqGejKOslKSktse9tMG7wsPIycXCzsjCvbmyr7m0wMLKtsaxwby1u6upraywo6OZqrS6pqqnrKqdqK+npKurvryorby0uL7GvLa1uMCwvb+zqbW2q76kj6KXkaGfu56JmqCZl52dj7aeqZylo5ucoZqnpbOim56lnKiqnZiVj5Sbi5aJjKShlJyinqG1r6Wmk7Grmqutn5+lpKqRlpWghJCen5yWqaShobS0urWtqLWysp6co6aal5WZqqGeeGNfYV9MSUdITVFJTURGRkFRS0lBREdBVlJESDxBR1ExO0I3OkJGNzldWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ekl5mom5Wamo+qlpWoppWtrJmiqrbFwby/uMHDwcjEv83Gu765srC4tL/DyLW/sLy3urenpKurrKGhm6uqxKKlqaymnquvrKKqqL+4pqy9sLe3xra0ubi+sL7BtrSytK+9o5ajlZKbk62fkKGhpKKjnpC+pKmdqaydnaCbpp+9opijnqKpq6Cdlo2VnpOeh46EjZOepKGdtaymnJayppmwqaCbq5+hjZqVn4SOoZqbkqWkmpirsbWxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJFOD5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1dNopukm57Fq6Gfq52crZ+Sop6WpaCmqayXtrGjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wsa3vrG4tbq2oKetqqudnp+lpMGloKmuoKSpra+ipqi9taWxu7e2tcOys7e6vrHDwLi4rrS0tKOcpJSRk6Csn5ihnaioqqKawq2pnaytm5uemKagvaGdpJirq6umoJmNmZ+SnoiOWH+WnqahoLiqppSYtqOesqKhnLCYoI+alJ6Cj6CXlo6io5WQpa6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxWXDhGST1ETUk4SGNcS0NMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dhUzZTWmtXc0hFNj11ZVxMT56goZiew6elorOgnLKnk6qjn6OfrKmsnbuxqay1scjDwcOzwsS+x8S9xMq9sLC2rrG1r8DFtbqxsLq2rZqpsKmpm56moajCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq6qoqaVlZSiq6Gfn5mnq6+vr7uypp+pqZmZl5OipLihoaOSrq+rpKWekqGelJ2OkI2UnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKCTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhdaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl09SFBCTUxJOE5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx3XV4/W1VfZnJAODxIlndlQTSfpJ+bn8Koo6mxoKO0qZWyq6aipLKsram7sq2wtLTGv8TEtb/EvsrFtsDJwrWrtamxuKzAxbS4rq22uqWZq7Krqpihp5etu7WbqLCbrZ+utLKnqrqzp7mzuLK4wKq4ssK9tMWnvq6tt7Wpp6yhlpaRpaShoZeXpK63rbK1tp+eqKSZlJWTo6C3o6Slla6xsqWppKGempmalZion56Yop+vsqKnjZevmKWrmJufppKdj5WYmoaWoJWMkJ2elIupqaqip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FOXV9SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnFqVkNXRox5ZkM7pKScoaW/pqiurqCotaqduK+rpKq0t7GwuLewt7i3xb3Dx728xMLHwbnBxsG6qralrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoaewnaufr7Szqqq3tay7q7OyubesuLDBur2/psOqsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmZm6mfmZaSl6agt6mloqKvsbOrsaeroJygn5uepZ2gl52ktLCbn5CUppqgqZuWpKCXmYuWmZSWl52UiZKbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhRUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk5MUk9fTEo+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYUYoQDhtfWhcVjqJe2NDPaifnKGpvKGqr6qisbeopbSyq6Gttb2vs7i8u723tsHDv8nEucXDwMC5xb7BuK+2qKu3sry/v7Spr7K4n5esraiumKipjqe7n6Wts5+rorGws6yqtrO1vK2vsbWssLWxv7rFtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5qUjaCmpLSup6GsrK2xp7Krsamjm56opJ6UoJmbqbapl5qSkp+ZnqGfkq2gmpmHlpmMnZqdlIuPlpeal6amo6CelpaXlIGQlYV7j5ODjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVFoXE5aXUdbXl1PTVJYZEpLQ11jYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl84KUMzWVVcZ0s1jHpmTECkmp+krLajrKikrq21qa6zuKamsLjGtrC3v8LCtbS6xb7MxbnDwbrAusS4wbmytayqure7ur61q66xt5mYqKurq5ytq4+rvp6rr7Gjqp+xrbKurrWxuLaqra6xp7WvtLq8ybKqtbSxtK+upqCzn5qorKCklZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLSuo5mdraebl52Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpaRipSTnpqlo6OhmZeTkpZ7jJGFe42Lg4uTbG95b3V8YUZgalpJSFpbPXtKR0U2QWJVaVtNXGFKW1xaUlNTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLitBL0pHUFtHM2NYVEtFmpafr6ixqaylo66utam3s7ejrLS3yrq0u7vAv7Wzt8TAzMe8xL23v8DAuMC9sr2uqLq5t7fCt6yusrmVl6eurKeksqqUr7ukrLKypqeisbOwsrG0sLeyqa6rsqa4r7WzxMW2qbW1q7Ctqaeitp+fprGgpJSbmJSwnqebn6mNqaKdm5WXpaWktqeisLOrp7Gnra+1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgmIWTl5GenJiXl4iWj5ebqJykoZKWkpCWd4SRhnyGgoSMjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2ZbTF5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0xERJGZpK2krK2rpqOwsrKqt7C1n6u1usm4rsG8w7ezsbXCw8/EwMK+tL3BwLu/vLTEqKu6sba3v72vrLS0naGnsa2lprGlnrK1rKqysauoqLS5rLSytayzrKqrqKypua2xsMe/uKS5r6mtraanrLClpKOuo6mcnZuar5mioqKjkKyfo6Cfoammpbikq7O0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+ilpWGkJSUnpuZlpWHl5KVmaecoKCNk5KOkXh+joR9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiWk1hYk5WVlZXVFloXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s/SEmQmqmqoamvpKejs7SwtLWxsKCrrb3Muq7BvMextK60wsPRxMW/wbK+w8K8v7i9xaitt620ubzAsKyyrqGjp66qp6Wxo6uxqq6qsK6urKuyuqe3sbKpsqmqpaWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpZ2XnpirnaGnqKGspqKsrLewsaCpop+qrbCrnZ6mp6mao5eYkKComIaDjoqLn6CQjI6XnpKRh4iRlaGdlpiWhpaTk5elnJ2djJKQjYp/f4iEfXeAh4WHdXRyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xNVVZVV1FcYl9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRdQE1GlZasp6GpsZyoqK+1rLi1rqmkq6u9ybuwvrjDr7CtssTEzs7Dv7+0wcTEusG0ycSsr7ius7nAv7Surqymp6mxqaaosqa0raqwra2xr7Kss7qkuLOsrK2nq5+jnrC3q6qtubaktbWjqaisrKqsoKimp7Gxo6aloaGrlqqhlJugpZ6joqqjrKKeprG3rKyipaKaqaqtqZ2hpaSkmZ+ZlY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmkm5KRm4uTkZGUo5qbmouPi4t8h4GCgnt1gYSBfnV4i6OHeGteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1iVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQklIRJaQr6Siqa+Yqaittaq2sKqkq6mpvMHAuLm0vLWmsq/EysvRv8G7uMDAwrrBusLErrG2srS7wb6zsq+trKyot6qmrbCruK6nsLCusau1qrW2p7W3q6ykqaqco56zs6iopLO0n7Wtoamoq6irpp+rq6i5tqmqqamhqZ+tm5GpoZ2go6Kmoqqdm6a0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeMh4WenoiFi4uPkJKNhYeWo5qOjZqRkpCOkp+XmZaNi4R/dIeBf354dYOAenh+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJiT0xWVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRjuVja+gpamsmaqkra6ytK+qpa+pqbu+u8GxsLmtoravycfI0MC/vbq8w727w8HAv6+ys7K2vbzBsbKzq7OppbWopKyzsrivoq20sa+xuaq4rqqvt6uqnqmroKOhta2poZ6vsqG1qp6op6qjqqGhrK2ova+rrqyhp6efq5mPr6KYoqCopp6nm5ipsKiin6yhoZKhoqKmmJmopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGWiZGdkJOQjZGclJePioaGeHSBf310eHqBe3R0e2qCiKN2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub+/vcm8wrmxsLWyury5wLO0vK25rKO1pqessba4sqanurWttLyvu6WtrbWqrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rs7CtnamjoK6cmrKilqSbpKSfpJqZp6qlnpqpoZuRm6CknZiWqKmRmZmSkIuCj4V9j4J/iJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRmpKVh4l+gHJ6eH58aHd8e3Vxcn5phnqEiGRgaGNyhXttZ3ldXlZDWHttVGFQUllLS01wdF1JWltnWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfnqmko6GqpLaysaSpsaetucG9trCkuayoqLDDycjMwbe9v7W4wbrItsS2tLO1sr25ur22rrm2v62is6aqq661t7SpnLq7qLG/srqgrrS1qKyerrGjnKWnqaOdnKSvpq+hn6upp6GpnKOooK27p66xrqGqoqOtnp6sppifm6Gim5+amaKqopqao6OVlpOeoZablaWsi56Rj5GMgop/f4+AepqUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJmQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJpcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdFWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5emo6Gfp6O3r62ir7Cpq7nCurOtoLmvq6ezusfKyL+3wb6vtL63xLbDsrC6sbLAtru+t6q5uL2qpLSmqKqvrbiwqJi4vKOtvrSzoa63tKamp7CzoJ6kpaehpJmerKionqCqr6egppeiqJ+wuJ+jsa+hq6GtpJumpqmampueopWcm5mdqaaWm56okJeSmJ2TmZahqZCaiY2Ph32HfoKNfHuhjI2IeYSNhYqNjYWJk5qOiZWfiJCVgoyWjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhlZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVlaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrJ+eoaSht6uwo7O0qam6xbayrqC4ra6ssLXFx8C2v8K5sLS9t7+7vrCsvrCzv7K9wrmqu7q4p6i1qKerr6uzr6WYu7akq7q1rp6wuK6ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6Sht7ChprCrn6ujr5ebqqWon5ianaOTmpuZnKWpmZubpJSUl5WcjpOXoqihkImKj4Z6g32DinmOl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmheZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5XV5sUUVZVVllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qcpKGioLeqrqC7uKWsvcWzsK6jtbCsrK60w8O8s7+6t7Gzubi6uLuvrsCztLmwv8C4rb26taWisqmnqbKqrbGfmb+1pKe1taidsryop6Wpr6yZo6ecpKWUmKGxpZmfo6ipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5yfkZqblp+hqZuamKCUkJOWmY2Tk6OnpJCJiY6GeYR6hIV8nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlpYGpjamhcZntjYFN0VFxbU0xKR0lPU0AhKmheak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqSQjaSmmp2enaO0rKequrenrMTBtrCso7aup66ut7+/vLLBt7Cusra2uLa2rqq9s66ysb2/t668u7Gkn7aqpaWzqKqtnZzAqqelr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae1pq+qrqGhnZ2hlKCmn6GgmpuZm5KYnJOlnKuhl5aclJKMlZeLj5iaqJ+RiImKiHiFdoGCgZ2HioKJfYCFiIeGkISWlJCOkJGQkYySe4OVjoZzfX1meG9ramtmdXNrY2dkZHaBY2VmZmZqamNrc1pfWl1tZGFOaVhaYFZKR0hLTVNYPjlfbGlIQ1VUXVtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOgj4usoZiXoJaks7Gisr22obHGvLqxsaS2rKquqbm8u7qtwLKurq62rrK4s6msubGvrrO2urawuL2spp61qqCfr6Oprpyiv6Cxo66wrrettZ6trq2topqdpqmln5Wap6WfmaWiqJ2an5uUnJ6sr6W6p66ioZqanZmepJqknZeel5uTmJ+SqJWpp5qTmpqRi5WZjZSUmqimjo2KiY57gXSBgYqYhYd8iYmFhYqMipKElJuTko+QkZaOkH+AjI6CcIB+ZnltaGtpZnFya1xoY2N0gWJmZ2pubGdqamhuXWxsdHBhVGNpZGVaSUZMTU9ZUVBWYWWBVUFWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhm42OsJ6ak6GZqbGvn7m/taC0wru9urGmtq+oraW3uLe3rbuurKqrtqqzuK2ms7Wyrqmwtraxs7W6pqmftaidnaihqKyap72YrKOur7W1rKyfsa2vqaKbnKKrqJyUnKaknZqqoqSWmp+ckJukqqqpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINtaX52g3FshouGfYWMh3BeY2FnhJiFa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VoX2Vmbm1qXWBhio+EhGZOS0Q5R1RnXkpHUFBVVUxIUmFvdGZGW1FVUEZIRUM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD1HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mFlbCbm5Kgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7Wiqbi2tqinrLayrrSts6Gpn7OqnqGjm6WmmKu5lKWlr7O3ra6lqa2qrKWhnpygp6abl6ClpZubp6edk5+fmJCep6mjta+joqKdlpeXl6OIoI6SmYagh5OcoH+lf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oG+Ih4R+jn1/oaCgmYB8h550h451m4psh4GDbGhlY3pscWFThW1ibGmYcVhqcXCIWV5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldVZ15NV0lSUlBGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoiqaWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C+qqW3sKmspbK0rq+zt6qppbCtpbSznK21trWmp6izsK2yp66dqqCyqJ+iopmhoZqts5OjpKW1vKasp6uqrKiloaCYn6ajmZmlo6SYnKSplpSjnJOTo6SmobejpKCjmJWSl5OciK+Ql5SJqYuWoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2R/wJy/eYSEeZGEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuZ3pvco/YflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKNXFdcUEFdRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIYymkoCnqp+XnJ2lrLKoscK9srW/tbe+waqns6ysqaeus6mvtrSnp6W0pae4r5yzsrarpaSnsa6usKaqnaeksKOhn52Wmp6crauTnqKfs7qiqqmhra6loZ2amqGnn5ebp6CfmJ6np5Gcp5qUnaGmoaGwop+fo5aWkpeSmYWva2qKjap+ZoOVhq1kcJydlJmllHGuoaR+eLt9a6GPdrFfarRbpYBlnJFgZoJ7Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCVeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolQV1cvSVRTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKilnaOkqrG3rLW9v7C2xLK3usGmqbCrrqipsK6jsLqvo6StsqOouKies7Owo6Wgqq2vrK+mp5+jorCbopqWlZaamqullZuhnrOzoaucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKZl6Gfqp6mpp+an6GVlZGWkJqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t6jYaUdIlyj4aAf4iQl3iCgouYi4Ogj4SwdnefcWtrbHyLTqRYSGJimX5jaKZgeXN2U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj+yeVhYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+ViLOmpqCvqaeyrKq7tsKwu8KtuLa/qqytra2mrbGpoa68qqCntKyjq7WlprKzp6Sinaeqsqiwp6Wen5+ulp+YlJWVl52soJmZpKi0rqGpj6moqpudlZigpKeanpyin5ugo6SjlZuel5mdoqibpZmcnKKglpORk5Odg9WTmblwsMF+xYZ81pSbu3yalaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5W7p3h4R9poKTfJh6qXiNnY97sW6OhHSRvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm5OXFJPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjtESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuilJmyqKiltKqltKmkvLfCsLnAsbW0urO1p7GworCypp+ttqiap7mto6+xoLO0sKGknp+nqbCotKikm52dqpaYl5WXlZagqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6afm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeji4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mOe7Bykp2OeLNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUhJOT1WUlpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlsK2jqrytprSmp7a7vLK6v7e2s7m5sqW0s6GxsaKfq7Ckl6a5raSxsJy0uKqgpp2hqaSxqKyppJmbmaielZOXmJKSoaaflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjYiGqW+tioKng5iYoImSmoqif5OZia6Ff4KzXHKzUq59goKkf3LYfniGfo+dhpmZdq+GiZGch3e0YZplmoKClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlZOLmVkaVNYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n56UoLmwlrTCraizqKmyurezuL65t7G0u7WkuLKetKyfnqisn5SntauosbGrrbSkm6mgn6ihtaamqaKZnZSkoZOSm5iRlKKkmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZOemp2gmJmblpehoJOXkKaehql9faV4oY6NgqpwrYuBp4aWn6CJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02YB3iHSogY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTgJF/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19LVjZKm5RYR0U9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKKempq/q5i0wq6rramltLC3sbW+ubmysLa6qLu0n7CknqSnp56TqrCpr6m1rKqvoZihoKakpLmio6uglpuQoZ+Uk56Zk5een4+Mi6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2UoZifn5Kel5yVnaGVlo6rnI+ubXK0c6mLdYqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoYVll5dpoKKnbpRytHSTmH+yaoWSiK1rdbNhnWaib4eTapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzimm5udu6GbssCurausp7epuK+1wLS7r663tqvAtaipoJulpKGckaqpp7WjsqeuqqCXnKegpKu5naOtm5aZjqSilYydoJuYnJ6RkpSqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOQmaKWoJuWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyXioyniHqjtnV9d3bCgpqyYIO6ecB8dbhjtYGMh6l9lYGsqXF7f3S8iKegaZ1hpo6von6MdIeqfb5vc7x0soN1eIGLbpqIcW6NpHS9Xnd9WmF5vGtaVlxqeV5qYWVnYm14b1lbWURBQHNAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeoryhl7LDsKyqq6uxp7ivtsSwubCtua6twLGro6Keo6Gbm5Cpo6qypLWmraWelpqqmaasuZ2jrZiUoJCln5KMnKKdmJ2akZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5ufqKOzn6OljqehlKKanJeVo5ePr6CSlKmehJCYtn+PkYy3lXiCk5q1d21rbnNveZCFj4p0nsG7vZp7gbGocIBzkbmDfIaGjIeNfIqHjZd8pLu5vZx1erSjdHaXdnSwdZmeZoZqjbV0cnF3toxef3p9iWiDeW55YouscHWFf1hbp2pFZVpUZmBjXmNRaGdxbXVCTlBNRDtaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKK/pZa0w7Ssq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqWk5yQoZqRj6GnoZOcl5OXlLG1t62YnaSkooqSkqWbpaqblqilpZyaoailp6SpoZKtnpajnpeXl52ej6+olJumoY1qfWmbpniHcn2ZjnR5ZId7vb7Aum+Tg3KVh2Fzalpem4lhY4iOlWtggJVjbZ13YpVrgJqVlGVeYGNwmopocot9hZVnan5ydHh9fmJbd3SBaFBcboN9fItrWGx6gnJKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUlBERU47SEk9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz5bTyc/Mj6poKiiwaKbtbq1o6ylrqentbGsyKuvsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6illJOblZ+ZkpekqKiQnZGQmJyvsr+sm6eep6KIk5GpmqijmpqsoKOam6OnrKOgq6OasZuUp6CWlJ2fnZewpZehp5mbkJycoqOYpaGZm5mZmY+VgWdtfXF3kpeUkoWLtaqNhpiVjoqMmJaHlJWKhJOUkYmOkpSYk5iWmqChmpyUoJ2NgnqlhmxqfJB8gHWKioFxgnh5dnaKgHyKanOBdYN1ZXd9d2tvem1gY11waE1YWmZqYFdacHpubWZUT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6GzosChpLKyt6CqprKnpbC0qsiqrLCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6ro5WRm5edl5KToZ6doaeTkpmop7LEr5qrnaqfkJeWp52qm5yfrZmhm52ipK+noqWon66Yl6ecmZqgnp2cr6CcoaaVl5KXk5+glaKdl6COlpOKio2Ol66QfJabg5KCi6qphYCZl4mDj56IeoSQh4aakoiGipWPm5eNkZido5aak5GdjX+OZqGzr4WKhHZ7kop9dnl6b2Z5kIGAiWt1gXmIcmlzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUEReVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFtHNTwsQLSguq+/rauusrKgq6axraKss6/Er6qrorKtvKOzm5+moqGcmZeopammpKWytJ6VlJ2ZmbClrr6grKKQkZ2ZmZSRlKGcl6ichJ+qq6KzyLOfqqSqlpaXmqadqJqeo6uUnp+eoKmvqqakrKKum5+goJiknpyfnK+jmJ6nkpeWnJGjmJennJqXZYKSfGV+jZqQY3mObWlre5Kkqmpkmpd9Z4aKZWVpaHuOoY9saIyXkaN3a2qLmaOemXNsbnqDjYd6WGVehoJebYuJgXZcaHN3d5KAh4Jud4J4f3NteYR0doiIjoN8aodZXmx1ZF5ziWlrfHFrY15STlhJZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzJZQzs/Lj2ln7q8uq+stLGqpaitrbCmra2wvLCppqOtrrCerJago52imZmmqpyto6WoqbKtnpWjj6Kvpba5pa2jjo6aoZmTkpqfmZmklXulraKotMS4paKnr56dlJ6inqOboqmpkp6hnqCqsKuspKugqpunn6egq5Whm6WwpJebqpWgnJqRo5adqZedfb2DiHK0coSdhq1oeLnEuHGToqN6pZmYc6uCfMvAwLtxjKKIg599lpiJncC9gpednY2dwsF8gnuSjZrDwH1rpbJujIFvynp/m3eRg46BdnmBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRjWExXSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC4jRlszUFkvVkFCOy84lqO5w7WwsMCpqJSjr6mwrq2ms7SvqaWlprCrn6uYmqKfnJqqp6KdrKKlqKSktKSdopKmrau3s6euopGRmZylkpCfoJibn5yHpqykq63AwLGgqa+pl5GenaGZoaOqpJOgoZ6era+qraekpKehpqWdraiRpJqoramanKmbq6CVlaSVoKKWnH7OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Org4CvXmONqnunh4WgdZeTiLNjgquGoY2Ns2qErnR9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4d2dmt8iG59hZCRf22DkGFybHBoYGB5ZFxxaGpkZ2BSVFNXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52Ro6qorbOrprKsrKqiqqevqaCnm5mkl5yir5+gnqino6Whn7Csmp2Vp66ssKqorJ+UkpufpJKPnqSXnaejnq6lq7Cov8ezqKmxrpaSnZuil5+pqp+VoJ+dna2wqKyqnKiopKKrkqyylqWiqqqdo6akoa+fkZimmJ+Zk5ORl6BxhYyXdYWohnGxfZ5yrH6hnoGlj553qoJ9rX+cc61+qoaGn3aYknt8l36qiKKMkYydfqt6iJSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4RukpFmcHV1cWFnbWVfb2lpbmdkWFNdYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw08bGsrSgnaOOo6OirK+2rqiwpqiqpq2rq6ahpJ2ZoZWgpaufoqWgqKiinp2wrJealqmnrqyop6iel5Sao6GRk6Csm52moq+spKy1qrnNsq2mrayXlZydopieraydl6CZnp6psqqrqpysq6SjrJuvsaKoq66lmKWqqKmwoZGVoqSZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3atgaeGhp96mZeGe2aAo4mkmYaCo32pfoKVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6CbZuVcW56eHlwbWdlZXJwZnxpY11XYGpYWVVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nV1b+hmaunoK+inrC0sK6prKKnpqiqq6mkpp+bpJ6dpqeno5ysmqKsoaOfr6Kcm5OrpLWvrqComp2WlKaikJqiqJ+gpZywpqSosay2yLK1qquplpGdnKGYn6SznZqhlJ2ep6yspa+braqjoqqhs62hqrOwoZqop66utKKSlaKmmJqRe6psnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOkiIegepiWmniqyXSZo5WoqZGTmoyAnImaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGYlYFxfHV+fG5cZmpzcWaBa15hWWRtXF9ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4raiyraylopyyuKyqoKWaqKWqq6mmn6ammKqjn66rnaagrJqeqaWdp7WfopeTqaq2sq2bpZyglI+lrJGZnKeioKmmrqGkp6mwtcOysqmsqJOJl5ylmqGjrqWXoZWZnKWmrJuwnq6pp56so7esobG4r52arqaysrKjk5amopmejoKdTniagX+feoSjfYOkhIemnpyek4S4e3t5uYJ/zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWchZ+ErH2alGKlbKRwj4SQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5OMdnxzhoBxXG5ueHJqgW9bZF9pbmJkXkxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6rp5ymppqjp6Gzr6Kpp7KgmKmklKK1oqKVl6GptLikm6Kdo5KPobGYnpumpKGir66cpaiitrLEsa2pramRh5Ccp5yipJyll56ZmZqmpKqbsKKvpaaYr6S7rKG2tq2dnLSxt7CxpZecrp+inYWP0bXDt3mHjoWRk5CApniUoXeMoJGEpYGKcaqGhbRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJdpXOTeptrmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jY6VjXl+eZCDbmp5aXlyb4B1XmVlb21mZ2BKW1hYPEhIQFU0QEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKauq6yZpqKfpqCgtqejqaexo5Sso46kraOdkJqaqrOzpJyknKmRlJetn5+dpqOcp5y1maKqpLarw7CpqqmhjISOm6KgpqOVmpqcmZuZp6Wnma2or6Olm62mvayUvbCsnqGvsrmqsqWaqLCippd5qJB9fLB3ioCkpYicbbJvoIetfKGPg6eVmICsiYWuhZ+UqqChl4afgJmVgHuSfquAnZqWi6t4nZ+RiZSSgHmvXqOBfaanY52AfJdzaq9dpWtwhZldYFuMoG2VkaaZg5WOmY18fISYgGtuf2N/dG6AemBnZXFuaGdoQ1phWz5LVTNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrbilo46bpKOfsLCqn6Sfna2Zn7mgo6ugr6marqGQq6iklomakK6wrKaeppusl5ePrKGgnaWhmaScrpihqKa2qcCvpamjnouAjZuan6aekpWam5SbmqalpZuqrK2kpZ+qqL6klsKrqaKgq7K4qa2ln7Ktp6iXdq9+kIuchYd9uq2KmWWxjWWVrX2gj4OmlZqBrIqEsIWmmqShoZCFoFtsaoGzYH+te3uDgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WbJ9Uq6AeqxYgKFtmI+nm4yXkZiYfHqQnn9ldX9jhXh0gHxhamdxbWdlZk9WZFxBVV8+SSg+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt726s8Gzo5yspqS2qKCKmqCfnLO0qZ+joJ61maC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iZoZ2kn5mjo6aZoKKpsqm9r6Wonp2PfYyblqCgmZCSmpySmpipoKKaqa6opqaipam7nqDGpqSooKq0tKutpZ66rKurlICpkqOvjpt/h6SXmZCCgLjDuoOOnJKEp5ecgqyKgq+Ip5ybpqqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRrooFvq4RsnH96srDHg2mrsL2seHeivrxzgJaOppyRm5GZnnuCkpx7ZH58ZY5neYJ7YWxla2pjUGFbU2pcP1ViQ04pPTo0Lx8fJB8lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPz1BPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWzs7G/ubK9sqGcrqalsqadjJilv6q4sqiiv6enspyesZy6qJ+tr6anlJSwrJeMg5uRrqWirKCjnKqgl4qikqadp5yaoaiimZ+hrK2pua2oo5qXk3yHmZGmmpKPkZiYj5iUqZuhmaqpoaqnoKOqu52oxaKgrqOps7OprqifuaatrZlzdaqkt4ZkiaBwaK6RipBubnekkJmfgXWumJRwj4txlaijm5eupHJtbGxmi3hvboKZcYF6anFpZ4mWlphxaWmEh2ZwhmRdiGJqb1lcZn12pl9hcY6RbmVlf42Tj6GYmZmSmKF+iJCWd2eIeGmOa3p/eWVsY2ZsYktkWEpsWjpQZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1lcXl5dXFxcXV5dXl1bW1VXXqmUrLOpubiys6qpoa6eo7Kpl5K+ssTJvreqn8CsraShp6yguqOkrqyup46XrqmPi4WWl62dpqqgnaOjoJGLpJKmmaiZlqOqoJadpqansLqrrJqbk5J7hJaNpZiNkZGZlI6YlqiVoJipo5uxpp2iq7mfr8Gno7Klq6+wqayqprairLaViqCopbadiZajmYeqm5GVnZKpspmao6qgspaioZ2fopyhpaGVq6eNkpKMh5OcnJSQmZOZkY6VhYGkmpeWjouTk4uPhoR9Z4l+dIJ1c4aKcKdsepSRk5KBgY2PkI+clKGWmpijg4mWj3NqkXdxjHh3fHpqbWRjb2RVYVlAalxIY2FPWStGPSsnITc1MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltcXF5fX2BeXl5fX2BgYF9ZWWCmlqiqpbS2rq6hr6Otn6C1sZCOrMe+xru5q6Olnpymn7GppLennam1p6iRmK2ii4eJj5ynlaykn5innp6SlKOWp5qomZSmoaSQm6eZoba7qKuZmpCMfIGUi6GUipWRlpCQlJimkJ+bqp+ctqOep6u3p67BraO2pa6vr6uoqLK3oK27mJGlpKa2opKep6COqqCOkp+jrK+aoKOvqK+Yo6Cco6qdnp2clqudk5mhm5SQlqqZjZiZl5CWnpGIoJ2VlYWSjJCNlIqAfWaLhXWGdXiHgnOcaoWPlJOQiXyLlZKSl5Sik56Yo4WKmol8c5dzeouAc3x/am9kXnBqYFtgWW5kUGBlUFo6R0dFPjI9PjkvKiYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wjp6Ovsqyuo6mmrZ+ntaqQkJ2ltbywra2io5p7nqOypKWxqZebuaajk5mqnI6Giomcoo+unqKVqJ+gkpaYmq2LqZaPqJmpjZmpj566tqSlmZuNiHmBlIyak4qVkpSRjZKXo42en6men7ijgISvtaKvr3SjvaOxn3d5n6mwuZR1rKOeiYCqf2RcYnagj6WfhJd9bZKznKOnraqiZZ6fknN5mZdwgJiol21/oqiKZZylnJGXmJaMkpyRhp2aj5WDkoeOjpKJhHdqjoZ2hnB7hX9/YGiHipSSi1p1lJBnaJCPc3unm5tmepqJhHmZaoSLhG95gGtyZV92cGxraFtnZmJicFNcPk5OTlNHPkBVRDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01TVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeX19gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgrrCsq6mlqK6ipq2kkpartrGyp5urp6yXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilKehnY6WkZ6Eda2PiKabqZGXpImcu7SnoJmYi4l0d5ONlpOKk5GRlI2QlKCPm6GnmZyyloCMm7Wcs4ySjrumoH6nonqhrbWAjo2lnoOLhpCxqq+Mipekm3qAi6yGnJ2hp6inh5WFmHelm3qHm4GYp4KCe5yyeoqGoJeZlJiWgpGXl4SamWJ5h5CEjY+RioNtcI6GeYBwf4CEfoVzhYSVkXiWZ5J0oJp1fZmEop+ImH+UjIWFmmuOjYZseHtxcWdkeG9qbGtbZWxqZXRcXklUTFJARTUuWlVVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWhmWVFIOUVMPD5iVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpqytq6isn6iwpqappZmUr8i/saKXqKm1npCEnaycp6KgjZC+npqNn5qgkHyGj5mYiKycopWfoZGMkomGgJGnjYeinaSUmJ6Hn7qyp52bko6FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeprYi3hY2wga+sgqiMppiNnX2oj3J7d5yPp5dolaR5tIyfnqankpjCgX+riJihcp6AmqV9l4WVsoGhfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKPhX55cYaAg3uDdISAloCPxWZ/qYePo2uehKOchJqBjo+Hi5pxj5OFaHd0fHhoaHZxaGhsXmRwbWdtWGdHXVJNMkQ0Nk5iZDcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5pbFxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJaioLCnqKilq5+jt7CpqqaalKCjpKukl6aruKOwgKGonaWenYmUvJqUjaGSno95hJaWkYirmZubmaKFjot3mpyPn5CInqWclpqYh6O5raSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoIyqrYWjjamZjJp/o3WAmZRrgq12Tat4h42ckZqop4Cpq32DoXt6p2mef5JrZ5eFl7eJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3iCX1hkgXyDf5dwp6prg6NucqVwn4WgamagbVtvjH1nWmCEgGJXUG93Zm10c2tqb15rcW1raVhpT15YRjlBNEhEX2s0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eYnVgTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeVnaC4oKmjpqyRoLa7q62imZihoqWtrqGer7WjqJOhoKCnnJqOmbSakIufjJWLdYGUko2Kp5aVmJ6ff5KFhaukh5qQipmpmZqbkoimsaehlZqIiYBpboiIi46OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJWPp4Ohpn+GqKuDpXiJfISafqJwc5SIlnyfjXlth5uMmY+bqJqPh517gqJzdqZmnn53pF+Yen2TdKJumLe0unSTh4J/tahkgca4e3CVtoxxf5qkYnOsq2B8aZ2zfm18hoGNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+zdXNbnrKDamNvdHZxaG9Ya21zcmZcaV5jTEQ9RDZRQlpyMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVdjYFplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiTlpSjt5mrm5OgjaS3tK2toJqinaSjpq6dnLKurJOYoZmhpJmalJ+rm4uIkniLhXGAlo6KkKGPkpSdmH2QiY2noIeXjomSo5Scm42Lqailno+Xh4R+anuHf32QjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6mIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lp+Gm46Ym6WGomShfIiWkJuNbJ5omo1umpl6gIunfXJodKuDnoN0qmiVml2bhXaEnWeqaoC4ZlyocIGcYJWMXqd2dYeIfp5omnSFk5KXjoCfb5qRbqeaXah+eLtrfqpcjoRdtGdcbnJ6eGtpXHFreXljX2ZYYkJRRk83V0NSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW15ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtlY2loZ2tplZuJqbWbp4hjlJqrubGvrJ6mnJypoJ+vnJ6xqa2dl6SboaCZlpahpJmGiY1qiIBye5eIi5aWhJGVmJB6ioOVo5yKlI+GjJ6SnZ2JkKmjoJqMkYqAgGmAh3l/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaWepnuwraOiuJd3o7OipICIlHmde6qaf6KOnJqWiJdxoXyFja+1fWuakaF4fpi0oqOrqISZfJt9nZp/dKpaXW97lot4nmJMfnt6hWN5l0JMn1iianF7jmyAiISZdZt4homxs3+Am5Ond4OdbnN9lXCadGukXZV2SGVkYHRxfn5uZmBsaXZ7ZGRhUV9XXVVXQFlGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bV1lZ2ZrZGZsaWhraZOcgLCtmYRTXqCms7mysqmaooycrJycqpSirKSiqI+gnp2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcoCIkqCbc5GQgYmalaGbhY+pnJuVi4uKfINshIZxgaGMeIaNiIiTmZZ8k6OgnqKIrYZ9tYSOnpx7pZZ6qYGVm4+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp2ZgKRvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdWuQs4xggpiJc6qyp7x/d4Ntfr6mqbRdm258cJZtf3Kicl2kZ3OmYGimbZvUmn2Gm3B6e5hsnHx4l3NuqaRnYGV6cYCEa2dmZG91d2dgY1NcZlFRYklXSlRhV1NbZWpbZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFlZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXmoCwq1RcS36pr7G0r7Ojm5mFmamgoaSOpamgmaqKmpiYk5mTkqGYj4iGe3B9hGh9j4OUmoF3kI2PiW9/hY+SkmyXk3yJkpOlloOPqpuUkouFiXmDdoiAboKfhneAk4aImaKXepSjpJqfibOhoraLeqynpK6lcKmAmo6FgJqQe6SAoZmGmHKehKOur4qXjICNpI2Vg62glHa0tbXJoXOUi4GfYJ2XqW15lYegm3Sih3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXOWaHlps7W0xqZzmH16nWucm6t2hZttdniYapp7dZhyUEV9tF9qdmt5h2ZqZ2N1dXBuVl5UWWlQUmhJVk1ZVFZdaGtuVmdXTktBSk1LSEpPQVFLUGVjam1ldHNzfnl8bnWJe3tUUE9sXmlca2lSamhpbGdsZmNlYFxdXV5pYmRpa3tfXWRoY2pmbm1laWxloZuIrqaEZT+TobKqrq+1oqKQgJeqoqOljKWnnp2mg5uXlo6XkI+ck46Ig3pqeYdlg41/mKB5dY+IjIFphIWRg4yFnY16jYuWppODmKmYjZGLgYh6f32LeXCQoYZ6gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipWXj7lukYqiYn2ZoJWIbXJpqmt1oG1vpl+aaYuQaZaHm5V0ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1xolpfW2KhbV2Ii256fXNyZKVteKJkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlseXNrb1JZV1dnWlNtSVlPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7gHN2jYCEdl5RcmJnY3BnUGpoaGtsbmhkZ19dXl1gamNqaXZ1XVxjaWNqanNtZmttY5ykmKV6ZHRti6euo6mwsaafjICYq52fpoyjopujooGWmJOOmpCLmJCOinuGcYCIaIuLfJicc3SJfZB8ZIKHlImJlZmCfIiHl6iRgaKskYaQioKKfoCAj3NpkKaEfYaUjYmZoI+Ik6mmnYimeJWbfqWIloyymJ6Qgq+Xn6V2lIZ4qXOlj4SabqSijJKEjYO7bn2lr4OGhYaTlZyffKV6cqiVoJZmnn5vrGOVipaTd6lsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+foulnnaffIOklZ2gapuIeKxonq2MtnR3vo2kk1mDpo2rYXVydHF8dXFja39vaGxTV1tWYWJda01dUl1KXm1ud19bcVlcYFtmdGVub3JicXRgd3p+eXJ5g3ODf4F7e4yBgoB2YnhkY25yZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp4bWdsbmKVpaqcgH+do5apqp2opq6kmYqCmKyan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5GHhpOOfXuChpmmjn+mpo6BjomFlHaCh5NvbIupgYOMlI6JnZ+KjJSro6CPgHWUl4h+gXmUrqN/gZtxj4Z3jomCfXtyp4xxfX16mJabhI95e39+h5OVk4p2kJieoIN7fYlrjIVbeXlyenFpbn6SiXGAdYGPlJNxhoSCZYx/XoB/i3d0cpR1bnlubYZshIVedWd3jmWAgIWNqJp9dHuVaomIcIF2fYd3bm1njHN5fJh4hVxrWHmPaW54cnJveHhwXWuHbmpnVltgV1xma2RWYlVfUV9weHlsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1f4B/gHiKhYN9e21/bGR5bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaJoKKapqSYpZyroqGEhJitkp6hiZunmqmYg4Gbi3+WlIeOiomNcoN8j31+j4V7mI90coNwlYV7fJKLhoaPhXl+gIeapY58p6GLhpCQhZWDho6Yd3KEqoaNkp2QiZ+eiIybqJ+gqoOIjpWafn6Jlq2oj5Gmj3dvm4+BeJBufqiFcH2VcWtwfYGgjYCTjoxobV2Di4ubmp6Oc5WLiHF0a4F2dIFZcm6GkYF+foxqXWpke4WEiYBgaXd6mnuCioF1gYWCZ3eJhWphcHGBdV5xioCIjqWUhWWLjYNud4uEcYaQenFnaGV8hHqWW1xqZ252W3t5eHVuc3OCZ1xti2trYlpaX1pZbHFcX2FaX11mdH57dXB0Y2tra3x9c3x4dWRtdWhtfH52enx7eXqAgH5vhoqEe31zfnlzf2hUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3pvaGptYIuLqrCgj6Khmp6dl56YqKOifoOZro6glYicopGllX97mIV9kpmJiYaHinN9gYx2hYuChZeKcW+AcpiGg32Sg4SGioF6gYWMnKGRg6aiiHiOl4mVioucmISDeq2CkZealYqenYiIoaufoaKji4eTm5yjmZaqoaemn5KahpSMenaNjYOnfn+SkJOUnLKmm5WfkI2yk5eDpYyMlZqfiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnYmEk359in9/dW9yhIF9d4aGio+lkIKFjIaCjJCMfYeMipGEeW2DhX16mWtyaGF0inF+end3cHd0gV1eb4dobl9eWl1dVGhyVmRcXGJsaHV7fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH99f4R7bYKNhnx5eHt9eoN4TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh5y5npaioJiUmJiUmKSgnnx/mqyPn46GoJ2LnpZ9eJSDe46ZiYaDhIdueYGAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4ern4Ryi5CGkpGLnZJ9jnuqhI6TmJaPnJaHhpuln6KanYWCkpqZmZCapp+lnZ2PlX+PiHV7ho2DpHp8jpCRhpiroZ6UnZCOqo2Qf52MiJOZnoKOl36GjoNvd4ZxdWB+g4+GdYyYgIOPgoaEfoWElG54dXSRoYqLhZqDhIxzf4h7fHJxeoeCeneKjYORpo6Fg46Ag4qJineGiYqMfnBsf4J8bmhsbWhfen9pfXx2dXZ1e3dcX3B+bnVgY1tdXlJnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZGpjYGlcY3Vob2J1bWxVY3F5ZXB6e3Nlam1tiomet5qho5+RkZWXi5qen557eJ+nkZyLh6WUi5iZeXqNhXyJkYONgoKDbnx/eXOBhX6LkX1qaH2CmImBiI58fYaEhn2PgpCcnZKJqJ2AcIyLjJKHoKGKhYx9qJGJkJKXk5aTeIyjoKCdlpl/gJCamJKMm6OhpJmXkZp9jIN3f4KOhp9/foyMj3yYpaGik5qRkKaMj4GakYmSl5t+k5J+h46BdHSCcHdhfYCNhnGLlXyIjHGMf4KFho5od3F4i5eRj3+WfYeKcYGGenxwd3qKg3l5j4uClKWSi4SPeoaGh4V2goSJiXxnc32AeXtxbGtnX35zaHx1dnR9c4BqXmB0dnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZoCBa259aG9xbH54h3psjIFzgYF+gXR2go2Gf3x6f4F9f49pcoNuc2lhh2hsYl9xVnRvbW1geGhtV2p0dmN1entyYmpveoiMnrKSpaWcjo+Xj4acoJudfHaloY6YgI2ji4ialnl7hod+g4p/iYKBf3J/e3R2g4V+ipF4Z2N9hpeKgYqMeH2AjYN5l4KWmZeNl6CcfnCMgpGUhqabiIyJg6aVhZOLlpeTkneRnaChl5OWeX+OmJeOlpqcpJ2YkpSaeI6EgneDlY2cfYGJjYxzl6OfopOZj4+ijIuDlpiDkpaZfpiMfIiNgHZxfW57ZIB8ioVwh5N/kYJsh4KBgImEZXVue4WRl4t8kneLiHt/hXt6cX13iIR4g4+IipehlIGCinaIhIKCd3yDioZ4YXp5fnR/eGdtZWF/amp3c3R1fXF8YmNgdG51cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodGhucGmAfYJ5bZCGcYCEg390fIOMgYB9eoKDfnyPbXaJdHRtZYpsamJidlaEaXBuYHhnbGJqdnBmeXx6cWBybIaFj5yul6aono2Ml4eGn5OXmX54qp2LmXqXnYuLmJB5fIGLfXyEfIGDgXh0eXpzfYCEgImLgGRffYuVh36EhnR9fop/fZmFl5WYjaSimX9zh3uTkoqmj4yOipOhkoORkJWXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl4yUlXKLjYlrhJePmHqHiI+Jb5edmqSUlYuMnoyGgpKcf5KSlYeZiHyKiYF6cXlrdWx7fot+bYWSgpR4cIGDfX6Kf2RxaXt/lpeEfoxzj4eCeIV8dXd/fIR/e4KLg4uSo494g4F0iYd9gHR2gomFcGF8dnpxfW9ib2NkfGNub3ZzeHdzdGF2YG9sdW1vXFxfXl5qXlBdWWNhaG50e4hrYGlmamNpd4huZmxpam1ogX17d2+QiHOAhIR9dIGGiXuDfXqBhH18jnJ6i3h4bmyHamhfaXJjh2dxb2V3Z25sYXlpa317eHBheG2LgJiZqqCjqJ2KipGGip2LlZh+eK+ZjZd9n5SRlpOId357inx7gHd4gIBwdXR8b4Z9gYGKf3xhXH6PkoZ/g4NzeoCHeo+SiZOSnZOmnZWCfYF9jYqSpImOio2Ym42GkZiUlo+KiIySnJKPi4xtg4+PkYmemaKhl5WIlpBth5iDZoWYjpN6iISQinCWmpSjk5KJi5mMgn+QnX2Sj5KMmY57ioWHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx5fJmTfYOIc5CJgHOHeG5/fH+Fe4SLh4OLlKeMeod7fYuFd35xcIGGhGVoeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtclhaX19ha1pQV1hlY2dxcX+HZl1qaWdiZ3GNb2RpZ2VpaIF6d3VvjoV0gYKDe3WCiYV4hXx4hIV6f4l3f4t7e3J4g2prYHBodIBrcm9tcmdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCch5OddoKrlZOOh6GNlpOPf3R8doV4eX9zc3uGa3Nwem2KdoCBiG9xW1l+kY2HgH9/dnWAgICghpGLk52YoZWYeIp/gIyJnJ2Kj4aSmJaFiZWZkJeLi4yNjJyJjY+CbYmLkJGKnZahnJeUhZeHaYOigmWEnImQfouDi4F3k5iSn5ORiYmVjX9+j5d8kY2PjZqRfIqAg251cGxtb3B7hWlzg46Yi3F3gHWCiIJ4ZnJudYCZjnuHg3mTkHl1h3NviHqEi3mKhYKHjZqih3uDdYGLf3d5bmyChIJec3VzcXB5Wl9xYXBrXnBqfXtxbW1qbHZgb29qcW1ZWGFgYW5YUVRaZmdjdXCEgmJda25kYmZrkm5gZ2ZgZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t3in9qcWN8Y4Z8bnFtdGpob2x2eF9xf3l8dXV0gIN+pJWarZ6mloWNg3+XlIOQoHaMoJSThoubjZaOi3pyeHSCcHKFdHF2iGxwbXZtiHaDfoBubVVRgauUh4J4gHdyg3qCoYKTgpWUmZyTm3iSe4OMkqSak46JlZmShIeXmYyUi4mPj4edhI+KfHKLhYmOiJyan5uVlH+TfWiEm4ZnhZ+HkYORgolxg5GYkJyPkIyMj413e5KReo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWZza3OGlYt+h4V6k45weYNvdYt5iIt5h3yAi4+dnYR8enaBi3x3cGpsgoR7YHlxbm1zdFZecGJyYWBsbnpxaHBmZnN0aHFrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpFqX2hlW2dwfXBscXSKfXZ8hYB1dX6LenuFgHiIg3OGhX6MjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V9eKCPmbCcpY6Cin+DmoiAjJ6Ai5qUj4WImI+Pj4R3dHd0gHBwhXRwcoRva2l3boNufX1udXNSTYLfyJLWk3twdYN1hKCDlHeWkpmckZl7lHOFkJ+hk5ORiZOclIZ+lpaJjY2Iko2InH+OgHd6jH6JjIqcm5yblZJ5jHZmh5CGa4eihJGIl4OGY4yRmY+Vi5eMjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3p5W4B5j4+Ben1+f4aOenpncmpyio6JgYWEfJSKa31+bX+KfYqFfIN5gI6UmZmKfHV3g5B4cm1ncYCFbmt1cGhqdW5UX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPZGFnYlhpc3Nua3J3jH10eoaCdXZ+i3OAhn96iX9yiYeBkYuIfH6YdmVzbn1liH5vcGyAWWxueXlzYXZ7e412cneKd3mfi5uum5+QgoV3iJV+fYqdiIagkY+FjJiEk46HgXR3cHlxb4RvbW9/c2VleXF9bXp9amhrY6Sawdyu8KFybHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqRnZaDgJWQhYmQgJGKiZZ+h3p1f4l4h4SOnJqYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eLj4mPi4uFiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2Gj4GOg32BeH6PlJKYj3Ryd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXByblpjcmBiVm5ZXHhOTUxkZ2Fed3OJblxcZHleX2RlhWBjY19ZanJrbmtzd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NndXF5bYt7bnRxgVdxenZ5cmR3eYeMaXaAiXJ/nIeYp5yjkoV9cYyUeHmMnoSFoY2OfJaNgJmHhHtyd3B0anCBbGptfHVfYXh3e3F1fGhgZHzr2rXJw9yHcmx0gXaLm4mOapmQkJ2WlIGJcYWJoI6Fi5WKjJiUfI2SiIOJkHuQi4WPgX92eIOEcoiCk5yWlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5WPh4qGiY2IgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySgoV9f4OAhIqCdWFyaoeAj4qBfn6RkHxtgWt3hI2FkYJ7gHx+j5GPlYhucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdeYnJzhWpbXGV5Xl5kZ3thZF9dWWtuZW9qdHiKfnNzgX57dnqHc4WDfH+HdnaKho6ZgYyCe5N1bHd1eXiTdG54en1YeoZxgG9neXeSgmR2hoVwipaFmaGaooqHdG+Ti3J3j5x+i5qJiXygf4SZf4F4cnRub2Ryf2lmbXh4XF95e3txcYBqYWZhf9W2jpGmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjICBio18j4x9iYR6dHqDe3GGgJaajpOTgYh1g4V1gn+JkZydhZSOn36IYoCTiIWIhIqOgICDZ32RgH5/goyPkH5tgnyCdGttd3V0d3ZrY42BjoCFfnyFf4SIfm9fcW+Ee46LgXt+kId5cINleYGJhYqBeoN8fpKNj5KEbm55i351bW5rbHt+ZGlsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGNtanN3h39xcIB7fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB4eXuEk29ufIF3XoN/dIFtaXpzlHNnc4h8cpKRg5qfm6CGiHZ2lX9td5WYfoiQhIqNmn2MmnZ+dnFwbGphdXxnYmp1elpgeHx6bXF/ZWNnZ1edj19xc5a8xIR3cZSKkH9zmIyHnZSNiHRriI+VgHuUjIGEm4x8ioZ9fImMf5OIdYmFdnZ9gXF1hoGelYaUj4KCcX+Hc4N6iJabloaTjZyAiGZ9k4KAhoSKiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqOhYqBin94goCEg39qXXB3en2LiIV7gI5/fXGAaHiBhomEgneCen+Wi4+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRnYVpsbm17b1lbXmxjWmNwdmRnXF1gbGpjbGlzd4GCcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhzeXl+jZBvb3uBcWmBeXp+bm18dpZraniEdGuUjYWemKCZhYhvfox2anmZj3+CioKVl4p6j5ZvenNwbGpkYHR7aWBlcntbYXN9emdwemFlZI6xsndLYlql2tGXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfIZ/eHiJioSVgG+Kh3F0fXtqeYaDpZGFk4yDfm5+gnWCd4WZmJOKko+UhYdwe5KDfYOEioRvgXhogIV4cn9/g4qHfGV8foR2Y3BzgGh5cW91mYyGg4p7dniAhHmBaltvfHJ/h4OIfYWIeohxgG1wgoWNgoNxg3d/mIuMhHdtbX2Ef3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19acGtneXFbW1lrZVljcXlfaF1eZWxoZmxpcXh/h29tf32BdXCBe4CBf4J/doGFiZeKcYKNcXuGfHp5hJSMdWt6f2tvfnSAfW9yfHuUcG+Af3lmkoqCoZidkoOFZ4eDcGd6l4p+f4WCmYqBfI2NaXhya2tmX2FveW1fYm95XWRsg3pgcXZfZGXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyCeG52h4WDlnduh4RrdXt1ZXmDhKeMg4+Mg31tf3N1gniEmo+Lj5GSjIuGfnuSh3iAhY2DbIByaYB+eG18e4GKg3hieYSBcWRxaH5tdXF1gZuLgX+FfnN1fYBygG5aa3xzeIiBinuGf3yHd3lwa4aCjoKJcYB3fpWKin50bWp2gIB1dVxpaXhxWld+U1pyZUxbc3JmW0pxeHBeW1tZXHV/dWlZYltnZW5iaUxXZlE9XmZdXXZmX3VxW1lVb2RaZXF5W2heYGdtZ2praXB4fY5taoGEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9pe31rdHxyhntzd31/jHp4hH58a4yMhJudloyCgGyNfmtof4+Oe35/g5SCf32KiGt1cWdpY1tjZ3NvYGFsdGFocIl6YXN0XmJjm6CQblw1Wq+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h5fnJndoh+fZdvcIZ9aHZ5bmV6iYWlh4CHjYl9bX11fn97ipeGgZOQl4iLhIl8j4lxfH6FfGl+bWuBe3pqenaCh4ByYHeCfnFkcmd1gm11e4aUkYF9gX9vd3l7dH1sV219dXOKgIZ3hnWBiXp3cm2If45/g3F9e3yRh4h6bm1pbYKBdG5daGZ0clJcfE5ccVxPXHNvZFZLc3lrWFlZWmBxgHVhXV1hZ2RoaGZOWmhOQWFkXGB2YVx1bVhYU3RhW2Vvc1dqX2Joa2dtbGlwd3yTbGiEiX18cH5+fIF/gnp3gICJi4Rye4dvcXeEf3uJjY+Dan57bnh5d4p3fXiAgod/hH5+em2EjIiYo42FhHt2i3lrbYWJknl9e4KSgIB9ioNwcnBiZl5ZZ19wcGBhaHBmam+JdGF0b1tgZGp2e3++nKekyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlwY3eGeYCSaXKEdWZ3dmNqfISInoKAf46PfXF+c4N4fpCOgneVjZSPiIKIe4mJbHl5f3Zoemlsf3lzaXp2gIN9aGB4iH1qanNoe4BqdoGMkZR+en1+cXt2e3N9YVV1e3FziIKBe4Jwhol3d29vgoGLfXx3fHt0jYSBdWhxaGyIgnJwXWhjdG9LZnZMXm9VVFlzbmJRT3R5YlNYWFxhcIJzW2FcaGVkY2pkUVtxSURkYlxjcV5ceGhVV1Z3XlxmbmlWbF5hamdlbm5ocHd6k25piIx5fXJ7fnmCgIJ8dn2DiIaDcHaDc213goJ+iYuUf3GAfHh5eoGLdIN4f4GBgoR6gHVvfYmLm56IfoZ7d4d8aHWGjZF6f4B8iYaEdo+AZ3BuX2RcWGZZbXNhYWFxbGxoiW5gc2lYXmNtgHep2anHhoezcop5cI52fYiQgXqUioB1dHV+d4BvcH9uhXSUhnh0bGB6gXmIjmVxgm9ndW5bbX2BkJOAgXmRkn13emyFdH6PioNylYqQjoeFhXt/hm11dn9uaHdlbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3WGjo2VfHR/dXGAenxsfllWcnxvdIKGfn93a4iGc3hqdH+Cgnx5e3d6cYp/fHJndGRti4RtdFtrYHZmSW9vTFtjWFdWeG1iUFN1dllRVlhdYHKEb1xgY21kY11uYlRdckdCZl9eZmldWntjUlZcdVtbZ2thVmtgYG5mZmxxaHB2eI90a46MdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNi3t3f3iEfH2Fh3iHfH2BfoSAe35zdniLjp+NiXuKd3WDel5+h5qNeYeEdIaHhHeJemJubFtiW1thVWp0ZGBbaG9wZodyYXFmV1xja398ys6GuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7amx2Y4R2koJ2b2dffIF5i4hlcYBqanFjWGx7hpyJg4Jyl5R2fXtth3CAiYqGcJaOkIiFi4R7eX9ycnB+Z2hyY254cWpscXd9fHpdZXqAd2l1eWaCdmd0h4uNlH1yhmpvfoB4bXtcWHB9bHN+iXuBbW6Jf3B2ZnZ+gH6AdXpweXOFe3hxZXJgbYuBa3NYa195XUlwbE5XVl9UVXxrYk9UdnNRUlRWXWJ0hmlcYGtqZmJZbmFYY3BHQWhdYGZfXFZ8Xk9WZXBZW2poXVhnYV9yZmtocWdxc3eHeW6VinR/e3d+eYOHgHVzf4aFjoNwcHt4d3V5h4aHjIZ6fH91i359hoSEh39+fn2Hf3x4dnl2kZOffo19i251gHlkhIiXhnOSim+FhYJ6g3VkbmpZX1tdXVVoc2VgWWRycmeBcmFrZFdaX2l/eL6uep+3bmJ0h2l0fHJ6hId7fo2Ad3dzd297dmVqb2CHdY6Bc2piXn54eIqCZXB9aGtrWlZveIukgYV/cZmScX93dIFsf4GPhnKTh4yHhImFfXl1c29peWFqbWFtdmpna2t5d3p3W2d+fHhlc35uhHRmdoaNhpV/b4tma3qCdGx0Ylttempzeop6gWV0hn1tcGd0fnd8fnB6anl6gHh3b2VsYWyJfWxuVmtheFZMa2xPUk9pTll9Z2JPVXZsTVFUVV5mdoRnXmFwaGdhV2ldXGtpSkRrWmJkVlhVeVpOV25qWV1sZV1aZWNedWZtZHJmc3B0gXhwmYV2f394f3yFh311dIKHgJWCbnN5e3tzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3dpqdl3qKg4dqdn58bISGlIByj4JxhYJ+goBwZmxnV11bXFtUZXBlX1hjcnVpdXBkZWJXW1tof3Bvcn9ziWRleX9qdHZ0dISFeIGEendzdW5renBhaGtnhnSNg21mXl98b3qJfWhtd2ZqZFZXcnCOp32EfHaWkHN7cnt5bHp6j4N2lnuHhoOHhH11cXNtaHVdbWlfbXVkZ2Zpem97cllngXZ1aHCAeIJ2YneFi3yUgW6Lam17gHBlcmVfa3hmcXWJen1hdYN2aWtxdHpveHdxe2V9fn53dW5jZWFshnxta1ZqY3JUTGprUExOcEhee2ZiTlZ1ZUtPU1dga3d+Zl1nc2llX1ZiV2JwXUtLa1hkYVVUVXNWTVl2ZVpfbGBcW2NlX3dnbWJwaXRvcX51dJmBd3+AeIB/hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6BdnujpYp5iYaFbHV9e3WEg416b4VzeoV9goR1bmppZVZdW1taU2NuZVtYYnR7amhtaGBhV19aaX9pbG9/Z2xhaXp6a3R1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRnZVhid2l+hnluaW9mZl1VWG9oj6h3gXp8kI54dW99bnJ0eI5+d5R0hYKAhoh2anN2aGlvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2F2hYR4j4VziHFveX9xYnBoW212Y3Byh3p3YXKAb2dpeHNxa3d2c3Vignp9dnVvY2NibXx8a2tVaWJnVExtaFBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vub1dKU2hYZ15YTVVsVEtcel9cX2tdXVtiZWB6aGxhb292bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR+enZ0hYiQfYF8kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiIhGxygnp2gYGCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZbXGuBZXJ0fGlqXWx4d2h1d3Juh3x+fnp2c2x6aGl4Z11kc2h6d5KBY2NUZG9ngYR2dmZoaWFXVlloZJCob394gIuOenBve2Z4bnmKenaOcYN9f3+GbmR3c2RpaV1sYl5wb1tnX211ZXpoXXSAb3JrcXt+dXZidYWLe4eHgH93cnV+c2BwbFhwcmFwcIN7c2NxgGtgbHpvaWh5d3NwZIN0eXl0cWRhZG1yfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJYnhbXV9tW15dYmNegGlqYG50eG1vbnaDl3lygYB9f4mMhn52doZ4hox9dHV1gXl6eoKMjn1/hIlqdJaBe4qdfX6FeYB7fnyGiXNxj66Me3uHkH5mcYh6dH59dnJvhmx7fm2QemNwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15XWlxse2Nxd3VsYltudHVodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc3xhY2lcVFheYmSQpWl5dIKFkHhsbnhmd2x7g3l0iHKAeHx4gGlmd21gaGFfa2BedWtZZl1vb2J6ZVt3fGtubnB4eXR0ZXODkn+Hgoh6dm9xfHFhd2NZbm9gb3CAe3JlcYBkXm11aWNmd3lya22AdHJ7cnFhXmVtbn1laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9hbVtbX2JjXYVpaGFud3lsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jI+Bf5N+cHiWg32ZknmAgHh5fn9ziIRzcJmie3t/iZZ4ZHWJeXN5dmt0cH9seXxwkXJecG9gZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFdga3ZjanVqaV9bbXRybXR0dGuGfX+AfHdvbmxkaXFjW2tyZHR2jnNcV1NkYHF/fnGBXGJjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J6entkZnZoXmNbYWhcXndpV2JecGhhd2Fbe3ZqanJveHRzdGhxgpWDhn6EdXJqcHtsZXZXW2lsYXBxf3lzZW9+WmBvcWJeaW98a2pyfXFvdmlvYFtka2x7YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVhgZG1jWGBhYl2MamRkbXl4a29pdXmFe2uEfYCEmX2ChHl9iG2PhnFvdnp9dIGCfYuPg4KXdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7hoyHe2Z3i29ufHBneHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVldVZmlzaGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZWtvYV1ubWRzeIhrWlRWYmN3fHxwhFxjX2NUWmBaY5eVY25wg4SJcmpneW5lcnVxemt5c3Vven52X2dzZFxfV2JkWWF1ZlZfYG1kYXFdXX5vaGlzcXRxdXZrbYWTgYl7hXFxZm57b3BuUlplaWRwcn91c2JsdVVicWtbXm5ke2RrdHxxcXFpbF9YZGlqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbX2ZtalpiYF9ej25iZ2t5dm5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAe3V/g36Jjn+Lk3N9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Md3hueo1gZX1xZ3p0eWxtcXeDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU25mc2tmeGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt6b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtb3uAc1hrb19ZXldjZFhlcWNUX2JpYWJsWmB+a2Zrc3VvbXh2a2iFjH+JeodtcGVve2xxbGJYX2dnbnJ/c3JeaWxTZXBkVWJtYXhhb3R6dGpua2pfWGBmaHVdZFZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYY2FbXo5xY2hqeHJzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgnR/f4iFh5GElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Njo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgo4BkZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSnfF1fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6fHx7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiOioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIi4eGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4uNiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXl7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5OTk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk4qHlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKMi5KRkZKRd4aTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkYlyipKQkoBziZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj3NwjJCMdHeIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pd2t6kIZ0d4ePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI57ZWuGfnF1ho2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2heaGVnY26ChYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvXnJsXGltZ2Voa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaF5odWxdbXVuZmJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWdvbV9rc3VsWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01WYmhtc3Bwc25SUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRhZWVubW1paFRNTk9QUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tEQ0ZMWmhsaG1sbWlnY1tVUk9OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVBUVVpka21nbGxramppaGlnW0xKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz5CSlljaGxrb2xtbGppamtpX1RJRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs6Rk5NYW1wcHRwamtpWEtCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTs7S2Bte3NqW0c9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo5OEJqbUg5Nzw8PUBBQD07Oz48PTxAQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD08O0dcOTw8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxcbkA+REU/PkE8RV49Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxLYz08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdXdNNzg4Ojs+PldqQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+DgHp8d1Y8PT89PT5GaXRMOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B8XT5AQ0BAPUpye1k6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEBDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVIGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozg7P0FCQEFDQ0JAQUFEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTU3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozw9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGhISBfoGDg4OCg4SGiYqMjIuLiYqLjIlUOjg2NTY3NjY2NTY3NzM1Njg6ODc2NTY1Njc2NzY4OjY3ODg5Ozc1Nzg5Nzk3NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZYWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5Nzc2NzY1Ojk6Ojo7Nzk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV2ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISFhomKioiHiIiIioqMiomJjHo+OTg4Ozw+Pjk6Ojs4OTs5Ojs6Ojk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo6Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFAQj5AQkFAPj0+PkA/Pz9APz89PT9CP0FBP0A/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJTEpKRkdHREZHR0VCQUBDRUNDQUJDQj9AREhEQ0VDRUVBRkVGREVGREBCPjxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxOTE5KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VKSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjY2Mi4qMf1BOUE5MT0xKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHRkhJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2NjIyLi4qNck5SUE5NTUxMSkhHRUlJRUpIR0pKSUpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1NTUU5PTUtKR0VCR0pHTEpGS05LS0pKS01MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0ZGSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLioyMjIyLi418WFdTU1VTTkxLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJFQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toWFdrYUVSUVFQSTs7UlNSYHVcVVZUVllZUlhYUlpmUFVXWl1SVFdRT01SUVBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dtXGRVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBZWltbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHhIp+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERUlFQz5UZFV/UlFRTktRVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV1dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dTEQ/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBPUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5/g4CDg4KAgoCCgYJrTUc/QDs7PkBAPz8+a1BLYUVGSElFQj9HTE1HTVJVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpOR1VudHR1c3R2eHp8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0JCREJcXU97Tk9OTktMTU9PUExLTVdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RVlBNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2JhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NTUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk6R25xdHd4eXt7fH59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHBubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFNVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKUFBPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dXl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NQU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBST1NOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRD9CQz48Qkc/Qj9BZHBzd3p6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURKRUNHR0lHSUVCQj8+PUNCQUdJRU5PYmVRTU9OV0tLTUtMTU1NTEtPTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dNTUpNUE1QT0hKRD9BPTk4Ojo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDTE5SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojk6O0FCPz1CQkNDR0ZJS0pESUlGR0dDQztBQEI+QEBDRURJTVBISEtHSEtESElMTUhKTEhJSkxLTV1SSEhETkZBREpKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd6eXx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A+PD05Ojo7QENAPkJDRUVJRUlKTEZJSUdGRkRCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJR0VOSENHTUtNTE9NTU5NS0hISU9SUVJOUmZmZnFvc3h1e3p8bGhqb2VrcWxzcGZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9REVCPkFDQ0NER0hJR01QSkZGR0tOT0tGSElGRURFSUpISklGSFBLRElNS09NT05PUE5KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkVJRklIRkZHRUNCQUFGRkNCQkJERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS09VV1ZVU1hfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQUREPEFAQEM8ODo9Pjk/PD9CQEBAREZIRUlGRkhHRkZEQ0VDRElFQ0dFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lJSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFdVWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlueU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZER0RFSEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNS0xLSEpMRklJS0hFS0tMTU5PUlRQSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2loaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTE1MTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlBWW1tdXltcXl9fYWBhZF1jYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpKTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYWBhY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREhJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUFdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dFS0pHSEpJSUtISkpOTE5LSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTkxMTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnF5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dHRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhMRklERUVDQUI9QkFDR0RIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEVPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrY1tpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTE1NTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlbXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKTE9MSVBcV15QXFtgXk1YWVNcXGJeTVhaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1SSUdFQUhGSklLTEpMSkhGRElGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2NbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hGSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtMS0tLSUdESURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVVVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HR05LS0tNS0tLSUZHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkRGS0pGRkZIR0ZJRkZGSUxKTkZES0tMTkpMSUtKSElGQkhIUU1LS09MSktJR0dFRD9FQ0hIQUJHR0VUXVleWF9ZX1tdVVhYT11dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUhGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExISUdESEtRTk1NUExMSktISUNEQUVESEdCQUdFRFdVRVxUXVNWX1hPVFVOWlpNSUpUYGFbX1heXmFdT1lhXGBgX2JjYl1hYldfX1RQTk9PV1FcW1tcXF5fYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlKS05MTExNS0pKR0VKTlFRTk9PTU5MTUhLQURBQ0RGRENCRUZCTUhCS0tPT05MRk1GR0lKSEdMS01PUElMT1BPU09MUFNSVVpZV1lYWGRXT1NUUFBOTU9UUlpYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUhGR0RLTV1MR0dYTEdISkhHTUxRUUhMS0tLTk1VTk9LS0tHR0tQU1NOUE9OT05OR0tGYEVEX0xFZmRFTVtJXltybU9NVW1ZTERQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpSVlVUW1xbYGBhYmJiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUZHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0lLTUdITVFbWU9QUE5PT09JSlF/UUl8WVlxdFlRbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtbZltfYGFhYV1gYmdtcGxgcHd0eIGBgoODgn99f4B2eHpsdn50eH2AfH6AgYKEfICDen+Bf353d05KRUhNTkJETExGSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taU1FST1BQUEpIWnhdVHhlaFpTVFJ2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eG6Acl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm5zfH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05ZWk1TU1JOS09IUVJUWVdWUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJmfWlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3F5e3Nydnl+gXN1em58fXl3cm5OS1N1TkNCRlBQSEpLSUtQT09PTU9aYFpXS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUFdcWFVNVVlVZVhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfWlyfF5UTGxgdnVraXV7e21+eGt8cFxeX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hLS0lJSEhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNUUVVWTk5MTU9QSkhRTlBVTEtMU1RTU1RQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJeWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTU1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PS01WVFFOVVNOT01MUVBLSlJRS1FNS0tQUlVTUVJTU0lITE5PUVJRUVFUVlJYV1xXU1NQUlRVVlNaUU5TUlhWVFlWVFpWVFJVVFRVV1hWXVleYF1cWlpcXF9jW11iY2RmZGRkYVlgYWNhYmhoaW1iYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0tPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBKTldTUE5VUE5RTkxTUExPVVNOUU5NTlFVUVVRUlRVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUUFRVWFVVWlVXWlZTUldWVVdbWFpfXFVYXlxeXVtdYGFeW2JiY2dmZWRiWF9hYl1gZ2RmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1hbWVhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTFFRUFJYVFFRT01PU1ZPV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZWUVFWWFZbW1dRVFdWVlZZVFhYVlNSWVdWWl1ZXV9eVV5dXmBcW19fX19aYmJkaGdkZGJYYWBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWFpbZHFtaGRfW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTVBYV1JXU1NTWE1PT1FUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWllYV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF5WXF5qcXd5gGNcW1VVWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JPU1hXVFNVUlJaT1BTUlZbVlZXU1ZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVRSUVdSVFBbXl5dW2BcYFVcXWhqcn1zbGdcVFdXUU5SWlNSUVRSVFVUS1JWVltaWlNPU1FWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl1dZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBbVFVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9a1pVWVVRUVNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9bWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX19hYWBjXV9UXV9iZWV1gXpoWFlZU1VTVlxYV1dWVlddWE9VXVpeXVxUUldTV1ZVU1RYUlNWVFhXWF1eWF1bVl1fWF9fWFxWUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gX2NiYWRkXGJcYGZhZGZkXl9kYmJbZmNoZWNmYGZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWVZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1RXW1pZXFlYWWBXUFZeXGBgXFRUWFBVV1ZUVldSU1VXWlpbX15aX1xWX19ZXV5ZXlVTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFlhZmNmZmVeYWJgY15iY2lkY2dfZ15hYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TT1ZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXltdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlNVVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXFxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYGBlY11laWRlaV9mXWNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFVXW1xgXl1fWlpeXV5eYV1cW1pcYGJfYmRjZWZlZmJaZGZmaWdjX2NeYWZkWmlpY2ZqY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFVVW11dXWBgYmJ4S1hXW1lXXVtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVFhdXl9gX2BcW15eYGJjXVxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1cWVxZWFdYWVhXXFpaV1dYT1haXWFjZmZya39KWVdcWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmNiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXl5eWlhWW19eXWFhYF5bYGFiZWNfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcW1tWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fH18e3p6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqIozb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eXt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYGCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x5e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8ent8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHp5enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoGBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzc3JxcXFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnFwcHBvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJycnJzc3Jxb3p/b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF5e3BycXBxl4NucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBycX2eenBxb4agfG9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcp2fdnB0nJ99b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwl6yQbn+jn35wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCOsah6iKagfXBxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nzc5yzpqSnsaJ2c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4d3eBq52htqaip4R6eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58fHx8e5KmmaOxoZuklHp7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19lZ6KlKyenp+agH9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCUo5yUnJuXjpuDf4GAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAfpqyqaObn5+lp5F9fH1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AgYSVr6aepZ+fnqSorZ+Rh4F/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChomWprGpnpuln56foJ+jqKijl4eBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4OFipmjn5mYmJ2dnqGfm5ydmZOMhYODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYeMkZWYmY2VnZuYlI2HhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgYGDi5ach46bmoyHhoiIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKBhIuKko6FhIODhYWFg4SEhYWDgYKAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgYGBgIiRgoKDgYKAgIB/gYCAgH+Af36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMlYKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGBgoKFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeLfoSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5GSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4mRg4SLhYKBgX59gYeGg4B+fn9/f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYWFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYaGh4eGhoWGhYWGh4eHiIaHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYWEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiYeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKiYiIiomIiYuKiYmIiIiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4mFhYaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeHhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBgoOEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgICBf3+Ag4ODg4OCgoB9fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBgoKAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYCBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn+AgH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+f4CAgICAgIB/gIJ/gIKBgYOBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fH9/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B+fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f359foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gH+CgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fYB/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCBgX9/f3+AgIB/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKlJCKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eHh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KBgoKAgIGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeHhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgIKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4ODg4KDg4KCgoKDg4KCkZCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CAgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl5eXyBgX6IloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WEg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHl6ent8f4GDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhYWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6eXp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GAfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fH18eXp7e3h4eXt7enyCgIF+f4B8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf318fn+AgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBh359fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42MioaEhYSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp+fnx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX19e3x8fHt7en1/gICDg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH19fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fHx9fHx9fH1+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Dg4SHiYqIiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH59fXx8fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH19fYCDgImOi4yIhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8e3x7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoGAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7e36Kh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhYOBgoGBgoGAgIKCg4GCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SDg4SEg4GAf4B/gIF+fX1+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhISCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH9/fH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Bg4KDgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYKEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICBgYCAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICBf3+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn58fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fn19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfH9/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eoGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuPf3d3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d6eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnRvd3F3eXN3e4WCgoODg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBg4KAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHF5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SAgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKBgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4GCgIKAfYCAgYKDgoKCgoSCgIKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ/g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYKDhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4OCg4ODgYSDgYODhISDhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OEg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoOCg4GDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX5/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGBgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbHd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYKAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH18f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEg4WEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeFg4SEg4KBfn9+e3x7fnt8fH1/f318f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX5+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WGhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaHhYSEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gX98fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIOEh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeEhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHyJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoSEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fH16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhYaGhYWGgoODhYCAgYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaEhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISFhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaFhoaDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4GChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emsb69vb29vb29vLy8vLu/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpWsqqqqqqqqqqmpqamosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WXraurq6urq6urqqqqqbLS0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2LnLGvr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDT0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/P0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0q2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbtcqavLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqrDEooyAjcWdl5WcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzwJ6IrNa6l6GdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZtbunq5ulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbTBoJ2Wp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmy1qO0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWas9bJ2MGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbTJjaGfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qzwqSqo6HDoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9ipj5Cs18KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cG/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4t7e3uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ojs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7i3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe2t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpGXmpyalpeXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaenpqainpyfoaCZkZKalpeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWnp6alo6CgoaCfmpOmr5uamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpqakpKOioqGenZqjioebnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKmrqSkpKSioaGem5ufoFuGnJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgqrSwoqOioJ6cm5qaqXBQi5ubnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKuTnK6goJ6dmpmaoplTWo+cnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCjoWiXrJ+dm5qbnKpzVl+Pnp6enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enah0aKSjm5ubnJ+ha2JikZ6dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qngmyBp5ubnJyikmxkY42fnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmapoR2cJOam5ydnYJqZWWMoJycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmaaNdXx8jpqdn5Z4Zl9ljaGdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmclZSde3+coqCGjH9gZpGgnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZn6mcimttrqqhZ3+LemeXn6Cgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6aliHBfaqSUmFZne318nZybnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampepmWdFSHSZg4VPRWB1gJSRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrYQ9Ojx4jHZuUTk1XnaCh4KNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+mKNaXmxQeaGWg1NjakZneIGCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fp2MWZijb7a8sbyCeZp9TnV+hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2geIzczLPWsZ64vGVicmFgiIuOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjIuLiJKKmmizybTI1K+uuqd0i6lqWIiLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6Ganpyjo5NvqZuRwr62sZiNd13KmlWCj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqbOgh5B5lKyUjI99eXJnnZxjeJ2ipJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epqo54V4ONe3qAcG5rc3Z8fXagqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhqZ58aEtpdG5weGpoZGprbnqElqSjoKGfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqGjp6Gmrqanp6+EbGJLXXNub3dnYmNlX15qdH6Om6Khn52go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmtsLO1vLKWb2VcR1Z2cnN8Z2FkalpaYGNteH+KmaKioaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qorra4vMHDva+Ze2VkW0BdbG54e2thX2dbWGBeYWZwc3mBk6KonZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuzusbQ2tXGuKiWfWdiY1U9XmpsdnFyZGJjWVdcX11dYWhqa257kqWup6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vdLg4dC6pZKDcmFZW1tPP1dyaV5bbmxeXVdZWFpaWFlZW2Ryhp26yL63oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7zDyM7U0MCjfmFVU1VYUUZJgm56g39eVlhXXFtdWldgfJyyvMDGx7e3t6mvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFyMjFv8WtimVWWFVRSWt1o6yjT1VcX2FcXWyQscS8va6psrertbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8TDxsbAsZTEyNK7i2ZVVlFWZqKunU5WV1hbZ4ezt66wrbKmqqqqq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTAtrO+xsiwgFpUU1CZsZFHT1ZZcY6mvLClrbS1rK+lpaOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcDCwsOhblVKjbaFRUtafqGip7Syray4tbOsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTIy8asc192X0tXlre5wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPGxcjM1MyGSUxXoMnByM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbKzHtHhc7Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcC/wMelSp/SzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4vMDFr0+ZzcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjru/u8O1use3trm7vLi5tbrEyKpQkcm/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmszL3Ht7m4rba0t7mztbK6xcqeUojKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1652hL3Iz8LAuK61tbu9t7mxvsPHk1iDzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnVveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3aw0dHMysS1ur/EyL6+tL7Av4JmeMvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V2p8zMy83KxsLDy87BvLi8urB9d2u8yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7u6zbw762vsC+vrqmnKqzt8PApnt5e57ExsvIwcPAwMnKwb+7ubGjkYV6r8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbdtrs69trnAvKp9bmhubXSCl5l0en6avr/GwLnAvL7FxL29uLKupKeSkp3Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d212e3FvalxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2ydoKzvba1waSGaVpeYE5TW1xwdXmEo7i3wrqzu7e7vb+6u7uvoqitnqSBvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcmFfZl1bVUo9Pz9HRz1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJp4R4i6GwtZxqZmdWWV9JSU1QVG55iamwt765srWyvLm8trm+tZaqvKuxd6zKxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxgY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqmHe3aMoZhfU0NZVUhialVPRUpjkKSur7a6tbSyrLy5uLW4wb2Nor6vsHany8K/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEpKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQl6EsbWztbK0r6y7uri2ub/Fd4q0p55mqr+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR8WEZBT4dYSkpZeI6DY0FUo7mztLKwsa2wubi2u7e7vZKjs66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PTg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxUElJS2icgFpFVK+7sayzr66srba2srS1rqmnn5qbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OTw5OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t/UVhJS2FKVo5iZWSCr7WqsrSuqquvsLKzraWdkZeTjpegn6KgnKOkn56olJuWl4yXkY2Ql5OYnaOqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgqsa/yp9PQXOYc1BuSkxjZnV0YFxic5Gyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFpmfW9yW1FrY1xmYmBskbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXY2BkaVpaV2etrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJITk5ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz9GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w72+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq64o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Rpb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5iSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy77BzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+MiISDiIeDgIGBgHlxcm9seaS2urm+y8HT0dPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLGzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblpCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bV0tbN1NbX1NPR09TU08/SxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MbKycDEw8jOzdDRz83LyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmNdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX1tPW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWJjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHLz83T1tLR1c3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNyszS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Ix8vFx8LGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBfX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9w8jJzsXDx8DHzcjEzMvMz8jExNDJxsLGycW/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vcHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8ws7Dxr6+tcG9xLu9x7vDurS9xsTCw7fAtra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MbV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xu7awt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8x7nDtq2qqLCywLa4vbCxp7Gztbu8rK62pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlXV1tBTEtNSkVBQ0BGQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpaWlxlbm9oZmhpa25yga26sLWupaSmppqgpKCZnKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0vK+4ubayvMGywa6lqKOrsbKzqL2qq6irra61tKaoraGkr6mypqiorqaot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhrb3KFqqWrpZ6coKSUnaSal5Ghoqmjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGorKm6qqSnp6insq2gqKefnKSmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVFlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+VlZqglZqimJWMnaGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCgnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXklXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRmZmZoaWtyjaeckpOTmpaaoJWVkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5KTj5OVlp6WmJOXn52hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmZiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlRLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgJSRk4uQkpOZl5yVlZufnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGFfYGFfYGFjZGmAkZGHj42SkJKck5WWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnJ+in5+XmJOJnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxcGBbV1ZWUkZQT0haXE9SSlRMU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXFxdXl5fX2JkbYyNgo+Ejo+NmJKTkpyaopyboampq6msp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK64pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9RTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTk9RWVpaWl1cXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZakqKedmJCPmp6ul5mnqpmgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZUUk5OTlJXWFpZWVlcXF1han54fXOHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJmZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+OTU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHRugoaBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkpqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5UU1NUVVVWWVtdampwa32De3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+XioCUiV87Vm98jJSJgIySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJSj03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1OUU1LSUZITlFRTU9SVFZYWmBsbWd5gHNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFgH9tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9HSkQ9NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkVEQ0lOT2hZT1FTVFVaboJydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHp6aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRklCPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgHx/dGZ2fIZsb2hzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9uZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmW5od36CbWpkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdodzbH5+g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjnp3iX6JiI5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOKgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTVBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOh4iIh4iHoKuilomOl396goh5eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElMTEtOVmBjf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYigloaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnZuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2inZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOEgYuFhoiShoKEiYaIh4dxbmFARTY0PDMvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEQ8Pj5GSENFQTg7PDVDOz1GS0lHSFFPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKeoo6eaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVwgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhIGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWUF9VSUtLQUA/R0tGRUQ7PkA3RDc/QkpKRUZWU1Bej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ube/t7q3uayssKWwqa29sLy6wsKsmbqok62Pl5eqiH2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqb36OhICNhG56c3iHYrmhmaKIlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDlX13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJYWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLy3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHw8XMwsrDwL69vru8t7SvuLe2w7nFvcLHr565qqGrjqSotoiBgXNgY2NfWGJgamdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj48SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin6Df4N4e4uDh3yLeYGKgpd+c316a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLSkhGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7Wz8nM0szPzsrGv77Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuYf3ttXmFdWl9hWmRjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/Mzc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSCioaVf3N7eWxtdXtocmVpbGlnamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLL0NPVzdPPzcXCydC+ycnKydHHzM3C0NG3r8O8xLmltbrCooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhI2KiouQh3yEgnB/iIGGe4dyg5KLjn1xeHVscXh+cXtueHNsaYFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLU1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63zp57cGdfZF5YYVNeWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4uMko+WhHmFkJCNiomHkYZ+gXtyfoCBh3qEdYWTkIh/b3Zya3N9e3Z7c4F4cmqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NLU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDwsuMdHBlYmFZVVpUXFBLR0lKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI2Hj4B4hJSYioyIiIuIfoJ4c3t9g4d3f3qGkZV/g253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGztLQ0tDL0svJ1M7Q1drX19jU2djN2NvOydna0da+y8u1enhwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2ceYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zp6+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlnt9amlcW1FUVF9IQ0ZJSD5BPT03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36De3yEmI2Hi36FhoB2gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIGWmo93cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpORl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8rOzsXNydHW1dXZ1dfb1NbZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHp9gpGJhIV6hId6dX51bXx9hn5zfpKekZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+pjo/Dob2LnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDGytDIx8zP09PS2NPV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d6fHuLhoJ9dIOFeXJ6c22AfoR+d4WcoZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPioeWm52PlZaQipKThYCLiJKNioqclpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMz9fQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyFe3t2hYR/c3CEgXp1dnZ0hIOFfX6SpqSfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiJqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+x8XFycjJwsvTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xuin55fHd4fISHi36Lo7OopKuyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnl6mZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+s8XHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYB9cHh8fXxvc4x6fYJ7eIaLiYWEkqe8ramyva+lrrOzqKOisKyKmrWeorilla2kl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho6PlJSIh5KWi4+VjYuNl5mSnZm0lpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u728xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgU1FHRD89Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLSsq7O2jKiyrq69q5u6pKituberpqaioaOjqq+ysaqdnKOYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKebsZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81tDNxMqJdnVkX1xiXU9LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnuCf3F+gXqVepKUlJiRk5WotMfJwMLMwcO6x7y6r6u5u5eytrqzwK6lwKSrsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6npKanpK+tpb/Ewq6pt7XJw762zrLFvsO7s9HJyMG1d3tvX1pebFROSURNS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcn97jX53h4GCkHqNoZaompqYu77JyMrC0snKws28wbOtu76nur++vMO4rMGprLO7vaqwqaSlo6yutK22taCgrp+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZecpaOpqKKyrai7wMSvpbO3zMC5rsOzu77Bua3CwsHAmXB7Y1tZXlxNTU5KR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMO+ycTIxtPNzs3LvMK3sLq8tLzKvMPBtre8rbTAubytr6igqae2ra6psreanqyip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmWaZo5+zpZajlqytq6ecn6eXmJaYlaGkqKaetqypurzDtaa0tsvBuKq2rLO7uK6ouLq9uINucFxaVldQR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvsbFyMfOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycWdeXFBSTUVRUVBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrzDxMjKycjMzse+urOvubjAwc21yLrAuLW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC/uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpaClqpOSmZyJlZyinpaxp6qrure9s7Kuvrm2n6OnqKWmnJysqamNZWhiYFNMTUdITkpVTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG7w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1u6uprayvo6KYqrS6pqqnrKqdqK+npKurvryorLyzuL7GvLe1uMCwvb+zqbW2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn5+lpKqSlpWghJCen5yVqaWiobS1urWtqLWysp6coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/uMHDwcjEv83Gu765srC4s7/DyLXAsLy3ubenpKurrKGgmqqqxKKlqaymnqyvrKKqqL+4pqy9sLe3xra1ubi+sL7BtrSytK++o5ajlpOblK2fkKGhpaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqaCbq5+hjZqVn4SOoZqbkqWkmpissbaxqqWqraycmKChko6QlaiflGllW2JeUEpIS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57Fq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKmuoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rrS0tKKcpJWRk6Ctn5ihnaioq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OZt6Ofs6KhnLCYoI+alJ6Cj6CXlo2ipJWQpq6zq6mioqWllZWcmYuPkZOkn4ljZ1xlYU1KS0tPRkVBRks+PUlBOTlKSk5dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLC2rrG1r7/FtbqxsLq2rZqpsamqmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fDrbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5mnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUmJSagJKilo+OoKGTi6assKWnop2gnpKSmpSFi5KNnJ+AZGhcaGZLSkxLU0JDQElHOztGPjg5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDFvsrFtsDJwrWrtamxuKzAxLS3rq23uqWZq7Krqpifppetu7WbqLCbrZ+utLKnqrqzp7qzuLK4wKq3ssK8tMWnva6tt7Wpp6yhl5aRpaShoZeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6xsqWppaKempqalZion56Yop6usqKmjZivmaWsmJufppKdj5WYmoaWn5SMkJyelIupqauip6GZnZaMj5mQgYaWiZWfemVqXWxrT1FOTlQ9QkFOQzs6ST83N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqevr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qralrbutwcO3uKqtsryjla2wrbKXpaiRqrmqoKewnaqfsLSzqqm2tqy7rLOyubesubDBub2+psKrsLauqaqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWpKCXmYuWmZSWl52TiJCbmZSOqamnoKOcmJuTh4+Zi36Ml4aPmmxqbWJublhSUVpUQUNFVUA7O0hANzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvKGqsKqjsbippbWyq6Gstb2vs7i8ur23tsHCv8nEucXDwcC5xb7BuK+2p6u3sry/v7WqrrK4n5esraitl6ipjqe7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G3rKyporGlnqSon6OWj5ifsqqzqaqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6Gfkq2gmpmHlpmMnZqdk4qNlpeal6emo6CelpaXlIGQlYV7j5OEjJdnbXNocHNfR1lmVkRDTlhEWjlIQjU+XVJoXE5ZXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLajrKmlrq62qq60uaamsLjGt7G3vsHCtbS7xb7MxbnDwbrAusS4wbmztayqure7ur61q66xtpiYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6yp7WvtLq8ybKqtbSxtK+upqCzn5morKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5ieraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpSZjp6dmpeRi5SSnpqlo6OhmZaTkpZ7jJGFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejq7S3yrq0u7q/vrW0t8PBzce8xL23v8DAuMC9sr2up7q6t7fCt6yusriVl6auq6ejs6qUr7qkrbKxpqeisrOxsrG1sbeyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmJSxnaebn6mNqaKdm5WXpaWktqeisLOrp7GnrbC1rKSZoayonJydm5SquZyVjo6LmJyimJGYqKOgl4STl5GenJiXloiWj5eaqJ2koZOWkpCWd4WRh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2krK2rpqOwsrOqtrC2n6u1usi5rsG7w7ezsrXCw8/EwMK+tL3BwLq/vbPEqKq5sba3wL2wrLOznaCnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraanrLClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoammpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGkJSUnpuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamvpKejs7SxtLWxsaGrrb3Muq7Bu8axtK20wsPRxMa/wbO+w8K8wLi8xaitt6yzuLzBsayyraGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaipqK2pp7ClqaSirqqoop6coqyVpJ2XnpirnaGnqKGspqKsq7exsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI6XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GpsZyoqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcTEusG0ycSsr7eusrrAv7SurqulqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWjqaisrKqsoKimprGyo6aloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCJhZ2gjYuPjZuQkoyFjpmknJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6Siqa+Yqaittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrrBusLErrG1srS7wb6zsq+tq6yotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irpp+rq6i5tqmpqamhqZ+tm5GooZ2go6Kmoqqdm6a0rqelqaKjl6Wmp6qcoqOjoJmYn5GOj5iNfoeNh4WenoiFi4uPj5GNhYeWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdRRTuVja+gpaqsmaqkra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0MC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWopK2zsrivoq21sa+xuaq4rqqutquqnqmroKOhta2poZ6vsqG1qp6oqKqjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeUiHyNhoSFpJaGg4KMh5CPkYWGlKGXiZGdkJOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTk1XWWVZR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSFA7WUM0j46xn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessba4sqanurWttLyvu6WtrbWrrZypr6Sfpayqp5ydqrKktKmaqqeqpKmdoqioqb2rtK+tnamjoK6bmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZmSkIuCj4V9j4KAiJ6Ph4B+jIiSkJCFgZSblIaTooyTkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1JWltoWkVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6SsJmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycjMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6aqq661t7Sqnbq7qLG/srqgr7S2qayerrGjnKWnqaOdnKSvpq+hn6qpp6GpnKOooK27p66xrqCroqOtnp6sppifm6GinJ+amaKqopqZo6OVlpOeoZablqasi56Rj5GMgop/f4+Be5qUjIl9f4yHkI+MioaTmJGHlKOJkZGHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lNU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1JdPSORl6yYn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKyL+3wr6vtL62xLbDsrC6sbLAtru+uKm5uL2qpLSmqKqvrbiwqZm5vKOtvrSzoa63taemp7CzoJ6kpaehpJmerKionqCqrqegppeiqJ+wuJ+jsa+hq6GtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Ph32HfoKNfHyhjIyIeYSNhYqNjYWJk5qOiZWfiJCVgoyXjZF9hHtzcHxxc3RgeXhqb3BxcGp/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1cX29URVhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBdWzUolZulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLXFx8C2v8K5sLW8tr67v6+svrCzv7K9w7mpu7q4p6i1qKerr6uzr6WZvLakq7q1rp+xuK+ppaevspyhpKCkpKGWm6+moZ+jqK+hoKKTo6SitrChprCrn6ujr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6g32DinmPl4qNh3qCiISJjY+Fj5OYjI6WmYqOln6Fl4yPeoB6cHF2bm90X3h3ZW1sbGpqhG9mcmlrZmleZHSBYFtrdmlaSn9eXFhPT0tISFJVRzM5Xl5tUUVYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyZFcsMpShoZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra60w8O8s7+6t7Gzube5t7qvrsCztLmvv8G4rL26taaisqmnqbKqrbGgmsC1pKe1taiesrypp6Wpr6yZo6ecpKWUmKGxpZmfpKipnKKfkqSfo7iopKetpp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY6GeYR6g4V9nY2Jiod6gYSHiYmShZaTkouQlZOMjZR7gpeOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmleak1EV1VeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdQJzKdoqORjaSnm56enaO1rKequrenrMTBtrCso7Wup66vt7+/vLLBt7Cusra1uLa2raq9s66ysb2/uK68u7Gln7aqpaWzqKqtnp3Aq6ilr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImKiHmFdoGCgp2Ii4KJfX+FiIeGkISWlZCOkJGQkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamNrc1pfWV1tZGFOaVhaYFZKR0lLTVJYPjlfbGlIQ1VTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7qtwLKurq62rrK4s6irubGvrrO2urawuL2spp61qqCgr6OprpyiwKCxo66vrbeutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6p66ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnSBgYqYhYd8iYmFhYqMipKElJyTko+QkZaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuurKqrtqqzuK2ls7Wyrqmwt7axs7W6pqmftaidnqihqKyap76YraOurrS1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXWBhio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vbytp7awpaujt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6GpnrOqnqGjm6WmmKu6laWlr7K2ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+joqKdlpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2xsW4hxbnpyhWeGhFpeR04/R19NRVJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtpbK0rq+zt6qppbCtpbSznK21trSmp6izsa2yqK6dqqCyqKCjopmhoZqts5SjpKW1vKasp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CjmJWTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYPUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNrY7ayf4FylXSaoaqQV09XYlBWTkZVW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6W0pae3rpyzsraqpaSnsq6usaaqnaeksaOin52Wmp6drquUnqKfs7mjqqmira6loZ2bmqKnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aWkpeSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOWF9cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKnqbCrrqmpsK6jsLqvo6StsqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuWlZaamqyllpuhnrOyoqucoq2toJ2al6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qqytra6mrbGpoa67qqCntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqpudlZigpaeanpyin5ugo6SjlZuel5mdoqmbpZmcnKKglpORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurO1p7Gwo7Cypp+ttaeap7mto6+xoLO0sKCknp+nqbCptKikm52eq5eYl5WXlZWgqZyZlqetsKiin4+soqiWnZaboaWhmKGhoaGaoaKmm56hnpSZm6agm6eVm5ufoJiQkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0nZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m6s6W0tKGxsaKfq6+kl6a5raSxsJy0uKqgpp2hqaSyqKyppJmbmqielZSXmJKSoqeflpKlqrCmoZWTrZ+lkpOgm6Smn5WapaahmqKfrZmgnp2QlZuhnZyllJ2VmaKelZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7G0u7SkuLOes6yfnqirnpSntauosbGrrbSkm6mgoKihtqemqaKZnZSkoZOSm5iRlKKlmpKPpq2vpqCVmamfoo6RoZqopKCVmaWonZyknqycoZ2gjZSemp2gmJmblpehoJOXkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXhvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0nq+knqSnp52TqrCpr6m1rKqvoZihoKalpLqio6uglpuRoqCUk56Zk5een4+Ni6iwr6adlpuopp+MkqOXqKqmlJapp56eoKOto6Geoo2VoZifn5Kel5yVnaGVlo6rnI+ubXK0cqmMdoqnc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jqa7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jU2tlYm1aY11hcHtjVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW7sK64tqrBtaiooJulpKGckaqpp7WjsqivqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmJScrKmXjJOlmaWsopGWqrKjn56mq7CZoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVlxqeV5qYWVnYm14b1lbWUNBQHJAQ0YrNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0I5p5ueobyil7HDsK2qq6yxp7ivtsSxubCtua6twLGro6Keo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enlJCWpJykrJ6QoKirn5qeqKOznqOljqeilKKanJeVo5iQr6CSlKmehZCZtX+PkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZqjbV0cnF3toxegHp9imiDeW15Y4uscHWFf1lbp2pFZVpUZmBjXmNRaGdxbXVCTVBMRDpaTT9KMzswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrbamtLisqaGhpZ6gnZmTq6Stqqa1p6efm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqWbpaqblailpZuZoKimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmbpXiHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYGNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE50TEVXXWdhTFpYZ2NfT1tudWlyUk9ERU47SEg9TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqq0or2xsaagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOZmaKnrKKfq6KasZuUp6CWlJ2fnZexpJehqJmckZ2coqOYpaGanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiWmqChmpyUoZ6NgnqkhmxqfJB8gHWKioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2tvem1gY11waE1YWmZqYFdacHpubWZTT0ZTOU9ZTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrbCktKXAp7OgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJeWp52qm5ygrJihmpuhpK+moaWon66Yl6ecmZqgnp6cr6CcoaaVl5KYk5+glaKdmKCOlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZido5aak5GejX+OZqGzr4WKhHZ7kop9dnl6b2Z6kYGAiWt1gXmIc2lzf3t2g4aCa3VkeWZgamVjZGZrWWx7cGlqXFNMUERfVEZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqrorKtvKOzm5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqadqJqfo6qTnp+doKmvqaWjq6Kum5+goJiknpyfna+jmJ6ok5eWm5CjmJennJqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebYuJgXZcaHN3d5KAh4JueIJ4gHNteYR0doiIjoN8aodZXmx1ZF1ziWlrfHFrY15STldKZFhBSjQ+Rzc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2wvLGppqOtrrCerJago52imZmmq5yto6WoqbKtnpWjj6Kvpba5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokZ6hnaCqsKqrpKqgqpunn6egq5Whm6WwpJebqpWgnZqRpJadqZeefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJujIFvynp/m3eRg46BdnqBgHlxen+HcHeFjJN5bniUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprCrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOpo5KgoZ2dra6prKejo6ehpqWdraiRpJqorambnKmbrKCVlaSVoKKWnH/OlHh6pIF5lZabX66PXo6ngaKgfaeWm3Srg4CvXmONqnunh4WgdZeTiLNjgquGoY6Ns2qFr3R9l4i3YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG59hZCRfm2DkGFybHBoYF95ZFxxaGpkZmBSVFJXXUtPQzVBSEREOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrprKsrKqjqqavqqCnm5mklpyir5+gnqino6Whn7Csmp2Vp66ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+UoJ+cna2vp6upnKeopKKrkqyylqWiqqqdo6akobCgkpmmmJ+Zk5SRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdkWFNcYVlRU0M5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2rqiwpqiqpqyrq6eio52ZoZSgpaufoqWgqKiinp2wrJealqmnrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqKmxopKWo6SZk5GEpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCo32pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxqY11XYGlYWFVMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK6prKKnpqmqq6mkpqCbpJ2cpqeno5ysmqKsoaOfr6Kcm5OrpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqhs62hqrOxoZqop66utqKSlqKmmJqRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqZGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG9bZmpycGWBa15hWWNtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuKyqoKWaqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7WfopeTqaq1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtcOys6qtqJOIlpykmqGjrqaYoZWYnKWmq5uwna6opp+so7esobG5r52arqaysrKkk5enopmejoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKh/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KLdXtzhX9xXW5ueHJqgW9bZF9obmJkXUxMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLKzpZ6glaWura6qp52mppqjp6GzrqKpp7KgmKmklKK1oqKVl6GptLmjm6KdopOPobGYnpunpaGir66dpKiitrLEsa2pramRh4+bp5yipJyll56YmZqmpKmar6KupaaYr6S7rKG2t62dnbSxt7Cyppedrp+inYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KNpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2UjXh9eY+Cbmp5aXlyboB1XmVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqrS0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISNm6GgpqKVmpqcmJuZpqSmmKyorqOlm62mvayUvbCsn6Kvsrmqs6aaqLGippd5qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmYCsiYWuhZ+UqqGhl4afgJmVgHuSfquAnZqWi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI17e4SYf2xuf2N+dG6AemBnZXFuaGdoQlphWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRUVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbSfmqygrbilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKaeppqsl5ePrKGhnaWhmqScrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6mn7Ktp6iXdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZeYfHqPnn5ldX5ihHh0gHxhamZxbWZlZk9WZFxCVV8+Sig+Oj00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqS2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+poo6Im46vrKinoaaZrpKYj6iaoZ6kn5mjo6WZn6Opsqm9r6SonpyOfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp66rKurlICpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpx7ZH57ZI5neYJ7YGtla2piUGFbU2pcQFVhQ04pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubK9sqKdrqWlsqadjJilv6q4sqihv6anspyesZy6qJ+tr6WmlJSwrJeMgpuRrqWirKCjnKqgl4qjkqaep5yaoaiimZ6hrK2pua2oo5qXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7Sqr6mfuaatrZlzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCWd2eIeGmOa3l/eWRsY2ZsYktkWEprWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytp42XrqmPi4WVlq2epqqgnaOjoJGLpJKnmaiZlqOqoJacpqansLqrrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2qprairLaViqCopbadiZajmYepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjnNqkXdxi3h3fHpqbGRjb2RVYVlAaltIY2FPWStGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam1p6mRmK2ii4eJj5uolaykn5innp6SlKOXqJqomZSmoaOQmqeZoba7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKyoqLK3n627mJGlpKa2opKep5+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmoh7c5dzeot/cnx/am9kXnBqYVtgWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKKvsqyuo6mmrZ+ntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuaejlJmqnI6Giomco4+unqKVp5+gkpaYm66LqZaPqJmojJipj5+6tqSlmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyn3d5n6mwuZR1q6OeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoCAYWmHipSSi1p1lJBoaI+Pc3ummppmepqIhHmZaoSLg295gGtxZV92cGxraFtnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzA2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqK6jpq2kkpartrCyp5urpqyXdIydsJ+oq6eUl7mgoI+cpJ2Rf4mIm56NrJqilaehnY6WkZ6Eda2OiKaaqZGXpImcurSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7unoH6nonqirbWAjo2lnoOLhpCxqq+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXl4SamWN5h5CEjo+Ri4NtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+Ui4WFmmuOjoVseHtxcWdkeG9qbGpbZWtqZXRcXklUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWhmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isn6iwpqappZmUrsi+saKXp6m2npCEnaycp6KgjZC+npmNn5qgkHyGjpmYiKycoZWfoJGNk4mGgJGnjIainaSUmJ6Gn7qyp52bko6FcHWQiZWQipSQj5uLj5GfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgrCsgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6Ocg5qBjo+Hi5pxjpOFaHd0fHdoaHZxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq5+jt7CpqqaalKCjpKukl6WruKOwgKGonaWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPno+HnqSclpqYh6O5rqSanIyMfmJtj4uTkI2QjY2YjI+Rn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbVtvjH1nWmCDf2JXUG93Zm10c2tqb15rcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRoLa7q62imZigoqWtrqGdrrajqJOhoKCnnJqOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5qPipipmZqbkoimsaeilZqIiYBpboiIi4+OiouNkoyQkaKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZmzlnF9mJ+0dHNbnrKDamJvdHZxaW9Ya2xycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3tK2toJqinaOjpq6dnLKurJOYoJihpJmalJ+rm4uIkniLhXGAlo6Kj6GQkpSdl32QiY6ooIeYjoqRo5Scm42Lqailno+Xh4R+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkJRRk83VkNSbzVLW1pfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJqrubGvrJ6mnJypn5+vnJ6xqa2dl6OaoaCZlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkYqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbnN9lXCadGukXZV2SGVkYXRxfn5uZmBsaXZ7ZGViUl9XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCumYRUXqCms7mysqmaooycq5ycqpSirKSiqI+enZ2bmZaYoZ2WiIeJd4aBb3mVhZGbi3yRk5aIcn+IkqGbc5GQgYiZlaGbhY6pnJqVi4uKfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm3B6e5hsnHx4l3NuqaRnYWV6cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0r7Ojm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI2PiW9/ho+SkmyWk3yJkpOlloOPq5uUkouFiXqDdoeAboGfhneAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJqQe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t2hZttdniYapl7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVk1ZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+TobKqrq+1oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg41/mKB5dY+IjIFphIWSgoyFnY16jYuWppODmKmYjZGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCVinqkep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmXCib1WJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6euo6mwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJicc3SJfZB7ZIKHlYqJlpmCfIiHl6iRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lIZ4qXOlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnnq2MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3JicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2opq6kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhX6YlHR0hXKSg21/i5KHhpOOfXuChpmmjn+mpo6BjoqFlHaCh5JvbIupgIOLlI6JnJ+JjJSqop+PgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d0cpR1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bm1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnVzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZW1xdG5bW2JsZGxseW5obG9hjZS4qKaLoaKapqSYpZyroqGEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7mI90coNwloV7fZKLhoaQhXl+gIeapY58p6GLhpCQhZSDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+fqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFufqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6mnuCioF1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenFnaGV7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3x4dWRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6dl56YqKOifoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gIx2hYuChZeKcW+AcpiGhH6ThIOGioF6gYWMnKGRgqaiiHiOmIiUi4ucl4WDeqyCkZeZlIqenYeIoaueoaGji4iTm5yjmZaqoaemoJKbh5WNe3eNjYOnfn+SkZKTnLKmm5WekI2ykpeEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmgiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGEeW2DhH16mWpyaGF0inB9end3cHd0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55gHJqcHBsZ4F7coKAeH9+f4V7bYKMhnx5eHt9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiUmJiUmKSgnnuAmquOn42GoJyLnpZ9eZSDe46ZiYaEhIZueIGAc4GIfomUhG1rfnqXh4SDkH+AhoSGfYeFjpyek4esn4Ryi5CGkpGLnZF9jXuqhI2SmJaPnJaHhpumn6GanYaCkZqZmJCapp+lnZ2Qln+PiXV7ho2DpHp8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF+g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqDhIxzf4l8fHJye4eDeniKjoOSpo6Fg46Ag4qJineGiYqMfnFtf4F8bmhsbWhfen9ofXx2dXZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbG1ka2pogYBsc4FsbXVueXCFeW6HgHaCgH6FdnGCjYh+e3p8f3uCimBpfGp1aGmCZWpjYGlcZHVob2J1bWxVY3F5ZXB6e3Nlam1si4met5qho5+RkZWXi5qfn557eJ6nkZyKh6SUi5iZeXqNhXyJkYOMgoKCbnx/eXOBhX2LkH1raH2CmImAh418foaEhn2PgpCcnZKJqZ2AcIyLjJOHoaKKhYx9qJGIkJKXk5aTeIyjn6Cdlpl/gJCamJKMmqOho5qXkZp9jIN3f4KOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfYCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36WfYeKcoGGe3xxeHqKhHp5kIuClaWTi4SPeoaGh4V2goSJiHxnc31/eXtxbGtnX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lVZVlfYWhqdnmBcWdrZG1oZYCBa21+aHBxa315h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjo+Xj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2g4V+ipF4Z2N9hpeKgYmMeX2AjYN5l4KWmZeNl6GcfnCMgpGUhqabh4yJg6aVhZOLlpeTkneRnaChl5OWeX6OmJeOlpqdpJ2YkpSaeI2EgneDlo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8kneLiHt/hXx7cX53iIV5hI+JipeilYGCinaIhIKCd3yCioZ4YXp5fXR/eGdtZWF/amp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNZYGFoa3Z5hnFiamNtZWh9g2xodWlub2d/fYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Ml4eGn5OXmX14qpyKmXqXnYuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZmFl5WYjaSjmX9zh3uUkoqnj4yOipOhkoORkJSXkYuBj5efmpKPkHN/jZKUiZ2dnqaXl42VlXOMjYlrhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx7fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfoxzj4eDeIZ9dnd/fIWAfIKMg4uTpI94g4F0iYd9gHR2gYmFcGJ8dnpxfW9ib2NkfGNub3ZzeHdzdGF1YG9sdW1vXFxfXl9qXlBdWWNhaG10e4hrX2lmamNod4huZmxpamxngH17d26QiHOAhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGip6LlZh+d66ZjZd9n5ORlpSId357in17gHZ4f4BwdHR8b4Z9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiZOSnZOmnJWCfYJ8jouSpImOio2Ym42GkZiTlo+KiIySnJKPi4xug4+PkYiemaKhl5aJlpFuh5iDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXyKdG6GkI6ScXWAe4GBh3tkcGx4fZmTfYOIc5CJgHOHeW5/fYCFe4WLiIOLlaiMeod7fYuFd35xcIGGhGRpeXV1cHxiX3Bha3RecWp7eXlsc3BleF1ubHNtcllaX19ha1pQV1hlY2dxcX6HZl1qaWdiZ3GNbmRpZ2RpaYF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgY+dh5OddYGqlZOOh6GMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgYCghpGLk52YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi4yNjJyJjY+DbYmLkJCKnZahnJeUhZiHaoOigmWFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIg3mTkHl2h3NviHuFi3qKhYKHjZujh3uDdYGLf3d5bmyBhIJec3VzcXB4Wl5xYXBrXnBqfXtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda25kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNg3+XlIOQoHWLoJSShoubjJWOi3pyeHSCcHKFc3F1iGtvbXZtiHaDfoBtblVRgauVh4J3f3dzgnqCoYKTgpWUmZyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4edhI+KfHOLhYmOiJyan5uVlH+TfmiEm4ZnhaCHkYORgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse39hen6OloJ2eoB4g4x8eWdzbHOHlYp+h4V6k45xeYNvdox6iYt5iH2Bi4+enYR8enaBi313cGpsgoN6YXlxbm1ydFZecGJyYWBsbnpxaHBmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGlyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgHiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXRwcoRwa2p3boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDlHeVkpmckZl7lHOFkJ+hk5ORiZKblIZ+lpaIjY2Iko2InH+OgHd6jH6JjIqcm52blZN5jHVmh5CGa4eihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuNiIqTkYl5hXx+bHtlcm9ra3p5W4B5kI6Aen1+f4aOenpocmpzio6JgYWEfJSKa31+bn+LfouGfIN5gI6UmpqKfHV3g5B4cm1ncYCFbmt1cGhqdW5TX3BlcFpgbHJ4Z2trYmZ4cnBwY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaBdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW9/c2VleXF9bXl9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlYqQnZaDgZWQhYmQgJGKiZZ+h3p1f4l4h4SOnJuYmY6Pdol1bYWIinyJooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1am55c1eIepKHhXl+gICFjH54ZXJpf4mOiYGCfouWhGuBdW2HkIGPhH2BeH6QlZOYkHRyd4eMdXNxZ3Z6hGN1bnFiandoUmFxZ2tWX290emFyZF9ofXBybVpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R8foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3BzanCBbGptfHVfYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaLm4mOapmQkJ6WlIGJcYWJoI6Fi5WKjJiUfI6TiIOJkHuQi4WPgX92eIOEcoiCk5yXlJeGjHWGfW6DgYiGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cml0d2tajHySg4V9f4OAhIqCdWFza4iAj4qBfn6RkHxtgWt4hY6FkYJ7gHx+kZKQlohucHmMhnVrcWxzeYJgdWpvXWt3YFJlcmhmU2BwdnRhcGBdaINxc2pXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfH+HdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGaooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2Ryf2lmbXh4XF95e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2uaj4mdk4yGe2mHi5mGgZKRhoeYjnyNjYGBio18j4x9iYR6dHqDe3GGgJaajpOUgYh0g4V1gn+JkZydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0d3ZrY42Bj3+FfnyEf4SIfm9ecXCEe46LgXt+kId5cINmeYKKhouCeoN9f5OOj5KEbm55i351bW5sbHt+Y2lsallud1pSanNpYlFjc3hsYmVeWmqDbnNhW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgnyAh3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxnYmp1elpgeHx6bXF/ZWRoZ1edj15xc5a8xIR2cZSKkH9zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5OIdYmFdnZ9gXF1hoGelYaVj4KCcX+Hc4N6iJabloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3dzbGqNhYqBin95goCEg39qXXB3enyLiIV7gI5/fXKAaHiChoqFgneCe4CXjI+MfW1reol8dnRvaWh9d2VdcWNYcHRTVG9zaGJOaHR4ZmFeXVhvgG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8goV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR7aWBmcntbYXN9emdwemFlZY6xsndKYlqk2dCXcnuSjJF5f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSVgG+Kh3F0fXtqeYaDpZGEk42Dfm5+gnWCd4WZmJOKko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foR1Y3BzgGh5cW91mI2Fgop7dniAhHmBalpvfHJ/h4OIfYWIeohygG1wg4aNg4Nxg3iAmIyNhHdtbX2Df3Z6ZWhqfnJhWnhbWXJuTlhyc2ZgS213dWJeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFbW1lrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2xvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+gIWCmYqBfI2NaXhya2xmX2FveW1fYm95XWRsg3phcXZfZWXV676LMjo+i46AcnmGiY+Nd4WYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt1ZnmCg6iMg4+Mg31tf3R2gXiEm4+Lj5GSjIuGfnuSh3iAhI2DbIBzaX9+eG18e4GKg3hheYSBcWRxaX5tdHF0gZuLgH+EfnN1fYBzgG5aa310eImCinuGf3yIeHlwa4eCjoKJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pyZUxbc3JlW0pxeHBeW1tZXHV/dWhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaHB4fo5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiYBpe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvYGFsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAin6ThneHmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZhvcIZ9aHd5bmV6iISlh4GHjYp+bn52fn97ipiGgZOQl4iLhIl8j4hxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l7dH1sV219dXOKgYZ3h3WBiXp3cm2If45/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3lrWFlZWmBxgXVgXV1hZ2RoaGZOWmhOQWFkXGB2Ylx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcnBjZl5ZZ19wcGBhaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYRzk315iJSEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N3fpCPgneVjZSPh4KIeomJa3h5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3N9YVV1e3FziYOCfIJwhop3d29vgoGLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFlzbWJRT3R5YlNYWFxhcIJ0W2BcaGVkY2pkUFtxSURkYlxjcV9cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd6k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3GAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdpCAZ3BuX2RcWGVZbXNhYWFxbGxoiW5gc2lZXmRtgHep2qrHhoezcop5cI52fYiQgXqUioB1dHV+d4BwcX5thXSUhXh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdH+Qi4NylYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGBieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsfllWcnxvdIOGf394a4iGc3hqdH+Cgnx5fHd7coqAfHNndGRti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN1d1lRVlhdYHKEb1xgY21kY11uYlRdckdDZl9eZmldWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVWp0ZGBbaG9wZ4dyYXFmV11ja398ys6HuaJrbm6LbXKFcn6Fi397koV6eXR5dXV7am11Y4R2koF2b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB4bXtcWHB9bHN/inyBbm6Jf3B2ZnZ+gH6AdXtxenOGe3lxZXJgbYyCbHNYa194XUlvbE1XVl9UVXxrYU9UdnNRUlRWXWJ0hWhcYGtqZmJZbmFYY3BHQWhdYGZfXFZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3eHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3VjbmpZX1tdXVVoc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bWJ0h2l0fHJ6hId7fo2AeHhzd297d2VqbmCHdY6AcmliX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQh3KTh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qCdGx0Ylttemp0e4t6gWZ0hn1tcGd0fnd8fnF7a3l7gXl3cGVsYWyJfm1uVmtgeFZLa2xPUk9pTll9Z2JOVXZsTVFUVV5mdoNmXWFwaGdhV2ldXGxpSkVrWmJkVlhVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZXBlX1hjc3VpdXBkZWJXXFxogHBvcoBziWVleX9qdHZ0dISFeIKEend0dW5renBhZ2tnhnSNg21mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2lnuHhoKGg311cHJtZ3VdbWlfbHVkZ2Zpem97cllngXZ1Z3CAeIJ2YneFi3yUgG6Lam16gHBlcmVga3hmcnaJen1hdYN2aWtxdHpveHhyfGV9fn54dm5jZWFshnxta1ZqYnJUTGlrUExOcEhee2ZhTlV1ZUtPU1dga3d+ZV1nc2llX1ZjV2JwXUtLa1hkYVVUVXNXTVl2ZVpfa2BcWmNlX3dnbWJwaXRvcX51dJmBeICAeIB+hoR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amhtaGBiV19baYBpa2+AZ2xhaXp5anR1dG+GgnuBfXZ1bnpoanlqX2VuaYF3kIRoZlhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kI54dW59bXF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2J3hIR4j4VziHFweX9xYnBoW253ZHBzh3t4YXKAcGdpeHNxa3d2c3Vignp+d3VwY2NjbXx9a2tVaWJnVExtaVBHUmxFYXhmYk1Uc15KTVVZZWx4e2ZfbXFqY1xWX1Vvb1dKU2hYZ15YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXmAgIeGenl6g32Bk4RxdHR/enZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paWlViamdcWl91gmlebWxcYVZcXGuBZXJ0fWlqXWx3dmh1d3Juh3x+fnp2c2x6Z2l3Z11kc2h6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBve2Z4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXZjdYWKe4eHgH93cnV+c2BwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIN0eXl1cWRhZG1zfmpsVGleX1VMdGNRR1diR2N3ZmFMVHFZS0xYWGdsdnplZW1xZmNaWF1YdmZUSlxjWGlYWEhXZVFJY3lbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9gImMhn52doZ4hox9dHV1gnl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66Me3uGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWHBtW15YWlxse2Nxd3ZtY1tudHRodXZxbYV5f4F5d25vdGVodGVbZ3VmdnaSemBdU2VmaoKBc31hY2lcVVheYmSQpWh5dIKFkHhsbnhmd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR1ZXKDkn+Hg4h6dm9xfHFhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpza22AdHN8cnFiXmVtb31laVRoWVpVTnlgUktaWUhidWRhSlVuVEpMWlZpbHJ7Y2xsc2NhWVpbYXdcVEtjXVlqU1ZHWWFOSGp2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doJ4fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2lkbWZcXHKJZlJybVtZWFhgbHZkanVqal9bbXRybXR0dGuGfX+AfHdvbmxkaXBjW2tyZHR2jnNcV1NkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5Bza2p4bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHtsZXZXW2ptYnBygHpzZW9+W2BvcWJeaW99bGpyfXFwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYUdWbFFJUFpWa2xrfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmFe2uEfYCFmX2ChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3N7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb21cVlhVZ2l0aGN0ZWVdWm92b3F1dXpsiH2AfYh3kHNjZGtvYV1ubWRzeIhrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SJcmpneW5lcnVxemt5c3Vuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3BuUlplamVxc4B2c2JsdlVicWtbXm5kfGVrdHxxcnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm5pZHxpa3hrYVdcVVt0ZFNSVmhRWWdUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2fn5thIB+hpd7f4eBiX5rk4hyZ3SAenWAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWlsYFVWU29mc2xleGRlXVpxdW5ze3hzbol7gXece3psYmVsbV5gb2plcXl/Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3R6dGpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpfS1htZV94aG5+ZGBVXlRddFtUU2BmTl1iVVNKXFpRWXV2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmZnqCgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycm5uipKSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6Ojo+Pj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpORi5CLipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2NjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6GjIWKioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoiHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiI2NiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIeFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OSkpKSkpSSkZSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKTlIOFlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKOg5KRkZONdYmTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkY5vf5KRkXx0iZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkHhqhJGKc3aIkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Pe2dxjoRydYePjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI55XGh1cGRviI6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qKhmRpa1xnamuDhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dnduY3VsW2p1bmVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Bnb29mbHJ0amJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGJnanJvcXNtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SX2NlbW5uamhSUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9NTVVja2dsbW1nZVlRT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tFRUtSXmhtZ2xtbGpqZmJcVVBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhGRlNbXWFmam5qb21ramtrampmWktKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz9AQ1NeY21sbG53cmppa2hfVE1GRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tCTmJtcHpza2pgS0ZCRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBzdHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PTw6Pk1gdHBjTkM/QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTs6NjhXZkE4ODs8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PDw8OkRZOTw8PT0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8Rl09Pj07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213STg7Oj09QTxLYj08PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndONzg4Ojs+PldpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUlye1o6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WHuAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUNERURDV3WGh4d+WEdISk1MTk9PTEhHSEhISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7enx9fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbUFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NjY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNTE9JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTkxKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyLi4qNck5SUE5NTUxMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXp4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0VCR0pHTEtGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1FTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKi4x9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpVRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot5bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpLVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdOSEdAQTw5Nzc2OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qz5lc3N2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25xdHd4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz5APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6e3t8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVES01SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxR0tER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJTEpESUlGR0dDQztBQEI+QEBCRURJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHx6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDRUVJRUlKTEZJSUdGRkNCO0FDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTE9NTk5NS0hISU9SUVNOUmZmZnFvc3h1e3l8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJDQ0NER0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSklMUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1DQj5APTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0lGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUU5PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEJBQUM8ODo9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSEhFQ0lKSUtNS09TTkRRUlBRUU5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8QENCRDw3Oj49Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2poaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPDg6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSERJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHRNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtKRkpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm53S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lFQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFSkVFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5uXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBBQkA+Q0ZHQkZDRkVFRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk5MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRHRkxIRUNDSEtISEZKTExGTkxMU1JMR0xNSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHREhJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0tKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSktLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGS0lKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkRDQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNlaGVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDREVCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUdJRkdISEZGSkdIR0hLSUxEREtKTU1MTEhKSkhKRj9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQkJHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVJiUENWXklHR0hERk1LUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tZWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENRYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTR0pPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExHSUxFUVZMS05JS1JYV1FNT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG9+eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKS0dKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNCRlBQSEpLSkxRT09PTVBaYFpXS1RXUGFeUlZRWVJMT0lTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cm1uXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbXmJkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Fha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhRUExOT01NU1JST1NSV1JWVFBXW1ZWVFRUYV9QTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUE5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeV1RQWVJWV1dXWF9bZ3JeW1tZXV1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZV09PTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVJTUklITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFpVVFJVU1RVV1hXXVpeYV1bWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZ21zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUFBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUVVRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUldWVVdbWVpfXVVYXlxeXVtdYWFeW2JiY2dmZGRiWF9gYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNTT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZPWFJUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFdWVlZZVFhYVVJSWVdWWl1ZXV9eVl5dXmBcW19fX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRT1VcW1pXW1tcWVpbZHFtaGReW1lWVVdRTE1WUk1OUk9RUk9MUFNSVVpVU1BQTFBYV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaWFdcXlpeX2BVYVxhYV1gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF5WXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1FOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZhW2NiXWFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVlXUE5SWlNSUVNSVFVUS1JWVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVRXXlldXWBdYmJeWV9bZWFfZGReXmNjYV5lZmlkZl5eZGFgYGFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFlbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF9eYlxgVV1eYmt5dGx9a1pVWVVRUFNcVFVUVVRWWVdMUltXXVtdUk9VU1hXV1RQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUVdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWV1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFliZmNmZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUFdWV1dXVlNVVFhcXF5gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWGNlZGhnZF5jYF9lY11laWRlaV9mXmNiY2FhYF9fW1hZWllaWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1gWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NeYWZlWmlpY2ZpY2VeYmJjYWBgX11dWlhcWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1hXXFlXXFtcXVpXXF1fYGJkYWJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxjZ2BcaWliaGplZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fH19fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz9AMCorKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzQhGhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXRzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z3enh7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9en16e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fXx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7eXx9fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzdHJxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3NzcnBxc3Bvbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3F0c3Jxb4aEbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF4g3FycnB3nX9ucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXFxcXahiHBycI+hfW9wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb5Wqf3B3oKF9b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwj7GecIGloX1wcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCMtqqRm7KmenFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdaCno7OopqV4dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCqJ+jsaObpI96eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fI+jkZOlnKChlnt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX19jqCYlpmclpCZgn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCPsaqln6GfoaGDfoGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIGAg6SuoaehoKCorJ6Ffn1+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+AhY+nsaScp6GgoKKjq6mcjIKAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoubqaqjnZqinZ+hoJ6foqWhlYaBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4KEh5CYmJaXmZyMlJ+dm5yalIyIhIODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KBgYSGjpaXlYePmpyWjomHhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBiJKXjpSak4aHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCgoeSloqEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkZGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBgoKGlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiDhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjJCBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf3+Af35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4CAf39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4foGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgIB/gH+BgH5/f4B+f39+f4B/fX59fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIOBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH18fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fX18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX19gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SQjIyOjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY2Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn99i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fH2Bg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt8fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEg4GCgYWGhYWGhoeFgYSRj42LiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx9fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIi4mFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH+Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3t8e3t8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp5eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf4CAgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH5+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoKBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImOi4yIhYWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F/f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYSEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhoiFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCgH5+foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgYF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIiDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOBg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX98fX1+gX9/gH+AgH+AgIOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf3+Dgn9/gH+Bf4B/fHp7enx7fIKAf4J/f4CAgoKBgX9/f4KAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Bg4ODgH9/gYGAgoGBgYCAgICAgICAgYCAgoOBgX+AhIB9gYOEgICBf4GBgoB9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoCAf36AgX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHyAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYCAgICAfH9/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWJfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH5/gIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoGAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIJ/gH+AgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKCgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoCAgIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf3+EfX19fH99e31/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgIGDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKBgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KBg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoKAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfnx5fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4ODhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIOBgoKDg4KDgoKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEgoGCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/foGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn99foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWChoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WEhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWGhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX11b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4ODhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWGfXeFhISEg4KBfX9+e3x7fnt8fH1/fn19f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaHhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGhoaEhIWGg4WEgoSDg4WDg4F9gH98e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWChIWGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhIaHhYWEhYWDhIeGg4KDhIOEgn6BgHx7fX57fHt+fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoeFhIOEhIOEh4OEgYKEhYOBgICAe3t+fnx8fH59fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX5+fHx8fn18fX18fXt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGiISDhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx+e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeFh4eFg4WFg4GCgoGDhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhoKBgn96hIx7gISFh4aGhoWEh4iHh4eFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYiDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaIhYWEgoWFhoWGhoeEhYaGhoWGgoODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag397gH19f4J+f4F+foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2MmqqpqampqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7R1M/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53Pz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9TAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq7WoqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qxz5iHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZs8iZkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbS+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZm1v56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWatcaWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbPRmpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qw2aWrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9XMk5Cn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEODg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubi4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm4uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbS2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrqKagnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpaXlJqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJeTkpSZmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoaCYkKGsl5ebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmp6Wlo6CgoaGfmZmalpibmp6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSmpaWkpKOioqGdnJyiaombnJqbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKltqmjpKSioaGempmlgVaOm5qamJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgp6qwqKChoJ6cm5qdolldlJqbnJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKaigKuln56dmpmZp39VZpWcnZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKCgoKCfqnd2raKenJqanKRrYWmVnJ+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaiMaYyrnJubnKCXbmlrlp2dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qjkXl1n5yanJ2giGtpa5KfnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZqao5R4fIWYmpyemX1qZ2ySn5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmqCci56AfpignIWNgWZtlKCdnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZqcp6GRcWWmrKFogY15a5efnp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYoa2Sd2VmppeaWGd9f3idnqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6eleE5KcJuEhFJEYXiCnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampermU43PHSSfXBTPzZheo6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCWrXNUcFd8sKmZWmduSGt9iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN+lqRchZt8ysWxxZ1+nXpQeIKCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+fpKRcs/XzdWmnLm8a11yXWeAhY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gnyZd5rRvcfTx8G0nHelqGNiioqOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLiJKMm2+ippW5rKKhiYV2YciLWoiKiZCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoJ2Ek3yPpY2Fi3d1cGyml2GBj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nln5YcoZ5eYBta2l1eH94eqChpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpqKerqYVwUmB0cXJ6aWZiaWtwfIWiqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKjsJhwaU9WeHZ0fGhhZGZfX259iqCkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCjp6Kmraewsql8aWNJUnN1eIFoYGNqWltia3WDkZ2hoJ2go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqpoqChqKmttbq8vayKbWdhQlpucH1+bmFfZltZYWFocHh/jZqgoaKZlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjq6qnrrnBxszFt6WOcmhpWj9TcG9xbHRoYWFaWF9jYWJqcXZ7jJ+nnZ6hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKq0v87Z2866q5yIb2BhYlNDSnlrYGJtbFtbV1pZXVtaXmNmZmh3j6Wvp6WZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1vM7a3dTApIp2ZV1ZWlxTSkNtapSelFZUWFddXF1dWFVXW2l+larBx7q2oaeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9wMbO0c23knVkW1laV1NJVW+qs6ZOVV5hYl9fX2Z3kKe6vsHFxbS2tqmvsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsG+vMzEsJFvXFVYU1BTobWbTllbXV1gbY6qusG1uamnsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZK/v87OvJVpWFdaTJm5k0xUWVdgf6a8sKarrLKmqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH91a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAt7O8wca+qXlYVVGKt4ZMU1VdhKCmt6+lrbS0ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh2WmdyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e9lmxSWmlaUVJklKufprSyray4tbKsqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF5qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGyc7KnFZIT1Brrbu3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmlqanRueWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnL0dOkUkxgsMfAyc3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWZ1b3RjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsbIzopJk87Mx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJrbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcDAwMWqTqTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NkamNnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24vMDEr1OczMTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEyapUk8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWZlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zPxXmty73Ht7m4rba0t7mztbK7xcqfVYvKv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncWt0ZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1692hL7Iz8LAuK61tbu9t7mxvsPHlFyGzsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRveGNnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tL6/v4VqesvGwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLi8ua+CfG28yMTAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFkW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uqzbw762vsC+vrqmnKqzt8PApnx6fJ/ExsvIwcPAwMnKwb+7ubGjmIp+sMjFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXlxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtrs69trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGvp6yXl53Kw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x2e3FuaVxgYFlTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoKzvba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uvoqyyoqiCvsXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dndvcWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6GvtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZavwLC1eKzKw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF1d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2Np8KysnanysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92c25jXmdZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+0kIF5iJBuTks/ZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FeI64qZ9mq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWpsXVxrVV1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSkpZeI6DY0FVo7mztLKwsa2wubi2u7e7vJKks66kdKywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRvZVVhZFddUU9NSEBJUkRNQz04ODc1Ojc8Pjk7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE0/U3hxUElJS2idgFpFVbC6sayzr66srba2srS1rqmnnpmbnp+mqJ6gqKmfoaeWm5aXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVVQT0dQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wqqlvGdEU5t9UVhJS2FKVo1iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmROSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXSYcVBuSkxjZnV0YF1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1ZhSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxoxXU0pmpFlmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB9eHZqd3VebVtSYUlSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1hMW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYV+dnJtaXdtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT5AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBfHRya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBRRkQ7Qz5GPD45Nk5+qrOno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKysPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTUVDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb+/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxsnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASVFDPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Kw0b2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDJyMrEzMzMz8/Fx8i2wMvA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1dfX19PX0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLz9HAxsPIxs/O0dHSyMzNwMvNxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUytDU1dbO09HY19fYy8jOxMnPzMrNwMrAycrOzs/L0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eNoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJ0M3Jx8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmPmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDJxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrk42Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJvMnHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aXFhSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxeen2hkYqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9x7vDurS9xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRkhLQUZCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytru/tMW3u7Wrub2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2dwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7Gztbu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaVlYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaSnp5qgpKCanKWrrqSooquqrKuwpKafqq20trG9ua+3sKiuuLSzvLi0vK+4ubWyvMGywa6lqKOrsbKzqL2qq6irrK61s6WorqGkr6mypqiorqaot6yxsre6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2RXV1hQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Nw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrbKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGorKm6qqSnp6insq2gp6afm6SmrJ+fp6SgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCEeHFsYmZga29gVVlfSE5nT1RIRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8W4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OcoKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6Kypaaqua2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqytrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vcC+w8K7ur2XhHtza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oaOfm6OhraOiqraro6OmnqWmo5aZnZeZm52gmpeenZ2craGrqKOkpq2rsrOqtbCyq7K5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIZ6dWZfZl5bWVZTWlVLW1FMSkVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmyv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZybq6evsKuco6S4qqGgrqi2qqeorbGkuLCkt6CjnJmZqqehm625sKOhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKiyrrK1sLy0uriuo5WCendlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSnqKCdoKagqq+mn6Kjt6ihoaKos6KlqKWwprGtrLWeoZ2WlamiopStsrGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6amq6+0sa+8trGvr6CSe3hzZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl5ygpaKtpqWlpKSjnaqrpZqfpbGqoKGepaueqKKfrq2pqa6toqKilZiim5yQq6mxnKCin5+XmJOKnpGNkpOWkJiYlJyho52koaKVoKKlppujq6WipKqjq66lrrKppqWmprSmqqits7W0ubqwqqyejHNxb2BbV1ZVUkZQTkhaXE9SSlRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlpqcnImBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbYyNgpCFjpCNmJKUkpyaopyboampq6msp6mmpJmlr6WVmaWvqaCcmZuhnq+anKu0oKamn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCeoqCjnZyjlZugo6GXoqijo6iroKuvpK63pqOko6ytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVU9QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaYmZeIenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGV9ioCJfYqPiJCMlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mgnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaigo6y0q66nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFhOSkxPUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+0rKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dmJeVhIB2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han54fnSHjIWOiJeJlJOYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopublIyOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoKKWlJiZlaKmmY2ZpKappqGgtLKos7ihnKO3rKqupLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqakt7Glp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWViHyDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucHVvg4eBh3+Qg46Kk5GTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCtn5mmuKamsaGwrpywvKqpr6qZg3h0ZFdNUk9QTUNTTkxQTUJQUUhJTlNNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH54fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdampwa36Ee3NOWHKPgpeGjZyXi5SRoJmdlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOLhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaNfYqBkY2Pl5qZk4uQip2In5iHiJaemqGgl6euqa2oqJ6XrrOipq6ZrKuYqLSjqa2jk390b2BcT1NSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d+c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39tf3+Ud3V2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGTl4yEioiVhJuNgoSSmpaenZSko6ippaSenLGqoaSkkaaplqKqnKKmqIl2bmdfXUhRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsrynnpaNf4qUqJaVin6Og4J9eHFvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHuAe4B2c3KSeGd1hYSEhXyVioiKjYuAf4SLjYCUhHyAj5iVnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hiXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKvopqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BteXF9cW12j3FocYF+jnBEi4WCg4V/d3h6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZ2NbWFhVUUpTVVRPUE5RVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoZiZj4WSeYmOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGbHJsfG5yfIZpbnB/c42JhYZ7fn97d3B0dIaCeYF5cHyOjIqUg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb29vWVZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmJmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0dHxqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGdpbHVrcYB8aHFxfG6TjY98dH59cXFudm2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra3BoZlhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxgoKFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmBaGdiam5ybXCCdWlvWHVwjpuSd21/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFxdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimnp+hoGEmYSbnGGGqp+di4OQjXp3iH6JiY5zi5ePhHtdZXF0enx3im1oamJ5b4WQgnpvgXh1hXpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZqIh4+SlKWNrapIhq6vr4uBgJOLgouChJKph4CYmIqcdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1wd36AdHRybFteXlxjY1hnZVxUT1BWWVBETEtGTklDRkNDQEBDQT06ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh6eW9na3h/e390bGVeW1teal5iZ2BaT0tOV1JRSVBKRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramt9gYKDdWNeZGBbZ2xdbGxeV0tHTlJRTUxMRklQQ0RNRkJDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImGkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiY2Xn3yUnpuNkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYF9c2lgXmJgYmhkYGdmXFJFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3u5uho7CSop2hnZCjoauvrLK1opSkqoiZiZKJlXp6foaAaWJpXWZjXmRkXmdnX1tPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoiShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHSEU8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3ta60oKenoqeaqa+tsrm3uKebtqiMpI6Rk5+GeIKEd1pjZVdnYmJkYGFmYFtVSkRETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJj4eAhoiFiYeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtLQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3ubi/t7q3uayssKWwqq29sLy6wsKsmbqok62Pl5eqiX2DfmxYZGJZa2ZqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNhG56c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8i4eGfYqCgYqDln13enVlUFxkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYExTUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLHr565qqGrjqSntoiBgXNgY2NfWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4N4e4uDh3yLeYGKgpd+dH16a2ZwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttXmFdWl9hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5aSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIyJfIGEc3uKg4V7iXSBioeVf3N7eWxtdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NG3r8O8xLmltrrDooNwZV5eXllhWFpmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KiouQh3yEgnB/iIGGe4dyg5KLj31xeHVscXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfZF5YYVNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlp1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkYh/b3Zya3N9e3Z7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBZVVpUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3V4fXSFfHlsh3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1dSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho19l5Gdi36HkoOJhoWJgYd8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGfJyJlI+uqpSVmJ+Zpq+1vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDa2tHWyNTLlXt9amlcW1FUVF9IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4/Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JqXm1kYmZrdoCIcpGPmoB6gI1+goKBg36DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eRhImPlpmXlqWcl5+WnpOSl6OdmauVkJCJjJGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hipGMvKGYk5eZnammpq6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FVWFZWTkxETUI7PT08ODo8Pjk9QDY9P0A9Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjJJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX11bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJi5CSlY+dmpOUkJaNjJWfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2ChYSBpYeLi7iYnZGVlqKooZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYlxUUE9JQ0xBPDw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5WMh4iMkpOMlJSUj4uPiYeWm52PlZaQipKThYCLiJKNioqdlpmio4eTnZagiomIjZyQg4iOf4OHhqSGjJCzmJ2SlZehoZ+ZkpydqLK5rKa9wsfNyMbPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXllUWFlDQUhDPz4+OjQ5Ojs3Ojs7Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Rg29teIt4en96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzciWj4aHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iI+liY2TqZqXk5eZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19QS1ZcQkJGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinZiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyZn4qQkJyamZOZmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUUlKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIp6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqmygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnouclJKNkJKMmJuKkp6Pi4mVn6KOlY6Ymp2TnJielaKglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlFHRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7s7TBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqq+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslZaPlJyelKGem5mgoZSanqinpKGksLOmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdnVkXlxhXE9LQ0xARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO6x7u6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6yvtbCqm6CqnKKclp+wtKeLo7q6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs5+Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dntuXlpdbFROSUNMS0pJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IycrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6yutK22tqCgr5+lopijtL2pm6i8waO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnqCSjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkJ+XpaSjpZ+eppielZebpaOpqKKyrai7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9ycTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2ip6Gdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaZo5+zpZajlqytq6ecn6eYmZaZlaGkqKaetqypurzDtaa0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeoloyQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcbFyMfOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKupqLCwl6OupKekpbTAsKqss77CusC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqalZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62mm6GmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6GorpiQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKycjMzse+urOvubjAwc21yLrAubW6sa+vsrSmo5uqtLSrqaaurJmkrqWlqKy6v6irtra/wcC+uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLrpahnJuXlZugoameqKCamqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq6+lpaClqpOSmZuIlJyinpaxp6qrure9s7Kuvrm2n6OnqKWnnJysqamNZWhiYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu66YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6w8PIycXCzsjCvbmyr7m0wMLKtsaxwby1uquorayvo6KZqrS6pqmmrKqdqK+npKuqvryorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmqCZl56djrefqZylo5ucoZqnpbOim52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wmk7Grmqutn56lpKqRlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGeeGJfYV9MSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensKsm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEv83Gu765srC4s7/DyLW/sLy3ubenpKurrKGhm6urxKKlqKymnqyvrKKqqL+4pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaymnJayp5mwqKCbq5+hjZmVn4WOoZqbkqWkmpissbaxqqWpraycmKChko6QlamflGplW2JeUEpJS09NSEZDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm53Eq6GfrJ2drZ+Sop6WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr/KyLa4tbWxtLS3wca3vrG4tbq2oKetqqydnp+lpMGloKquoKSpra+ipqe9tqWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJmhnamoq6Kaw62pnqyum5uemKagvaGdpJirq6umoZmNmp+SnomOWH+WnqahoLiqp5OYt6Ofs6KhnK+YoI+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZlxlYU1KS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiew6elorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xcq9sLG3rrG1r7/FtbqxsLq2rZqpsamqm56moajCrZussZyqoq6wqaSnvbemtrq8r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5qnq6+vr7uypqCpqZmZl5KipLihoaSSrq+spKafkqGelZ6PkY2VnZqjn6e0p6eNmLSco6+bn5yvkaCUl5SagJKhlo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2dcaGZLSkxLU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrFtsDJwrartamxuKzAxLS3rq22uqWZq7Krqpigp5etu7WbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeXpK+4rbK1tqCfqKSZlJWTo6C3o6Slla6ysqWppaKempqalZion5+Yop6usqKmjZevmaWsmJufppKdjpWZm4aXn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfemVqXWxrT1FOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKScoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBx8G6qrelrbutwcO3uKqtsryjla2wrbKXpqiRqrmqoKewnaqfsLSzqqm2tqy7rLKyubesubDBub2+psOrsLeuqKqrpp2YmKqhoqCRl6CwrrOrsLmam6mfmZaSl6agt6mloqKvsbOrsaern5ugoJuepZ2hl52js7Cbn5CUppqhqZuWo6CXmYqWmZSXmJ2TiJCbmZSOqamnoKSbmJuTh4+Zi36MloaOm2tqbmJublhSUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC5xb7BuK+2qKu3sry/v7WqrrK4n5esraitl6ipj6e7n6Wts56rorGws6yqtrO1va2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSonqSXkJifsqqzqqqzmZ2nm5mUjaCmpLSup6KsrK6xp7Kssqmjm5+opJ6VoJmbqLWpl5mSkp+Zn6GfkayfmZmGlpiMnpqdk4qNlpeal6emo6CelpWWlIGQlYV7j5KEjJdmbXNocHNfR1lmVkRDTlhEWjlIQjY+XVJoXE5aXUdbXl1PTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS3wbmztayqure7ur61q66xt5mYqKuqq5utq4+rvZ6rrrGjqp+xrbOurrayubeqra6xp7WvtLq8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5mdraebl56Zmay4opeTkI+YnKGZmJStoJ6VgpOZjZ6cmpeRi5SSnpqlo6KhmZaTkpZ7jJCFe42Lg4uUbG55b3V8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW1xaUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6yusrmVl6euq6ejs6qUr7qkrbKxpqeisrOxsrG1sbiyqa6rsqe4r7WzxMS2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquZyVj46LmZ2imJGYqKOgl4SSlpCdnJiXloiWj5eaqJ2koZKWkpCWd4SQh3yGgoSNjW5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTV5iTVhZV1VYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMK+tb3Av7q/vbPEqKq5sba3wL2wrLS0naGnsK2lprGlnrK1rKuysKypqLS6rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq6inaOoqpygmZqSpLSZj4mNh5GjoJaOlZ+hlpSGjpSTnZuZlpWHmJKVmaedoKCNk5GOkXh+joV9fX2HiopydHN/fn5cUmRuXk5aZ11GRJZbRzpObVhiW01hYk5WVlZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoamwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa/wbO+wsK8v7i8xaitt6yzuLzBsayyrqGkp62pqKSxo6uxqq+rsa6urauzu6e3sbKpsqmrpqWjrbqsqrDCubSsuaioqK2pp7GlqaSirqqoop6boqyVpZ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mao5iZj6ComIaDjoqLn6CQjI2XnpGQh4iRlaGdlpiWhpaTk5elnZ2djJKQjoqAf4iFfXeAh4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPY1xOVVZVV1BcYV9UT09oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqbC2rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wcPEusC0ycSsr7eusrrAv7SurqymqKqwqaaosqa0raqwrq2xr7Oss7qkuLOsrK2nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqqhk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSkmaCalY+YnZOBgpCIhZ2gjYuPjZuQkoyEjZmlnJORm4yTkZGUo5ubmouOi4t8h4GCgnt1gYSCfnV3i6SHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVktOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCYqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS7wb6zsq+trKyotqqlrbCrua6osLCusau1qra1prS2q6ykqaqco52zs6iopLO0oLauoamoq6irp6Cqq6i5tqmqqqmhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6WmpqmcoqOjn5mYn5GOj5iNfoeNh4WenoiFi4uPj5GNhIaWo5qOjZqRkpGOk5+YmZaNi4R/dIeBgH94dYSAe3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xWVFVRT1haYlZIUGpUVlNHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+gpaqsmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbu8w726w8HAv6+xs7K2vbzBsrKzq7SppbWppK2zs7ivoq21sa+xuaq4rqqutquqnqqroKOhtq2ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efrJmPr6KYoqCop56nm5ipsKiin6yioZKhoqKmmJqopZiYmJ2PioeViH2NhoSFpJaGg4KMh5CPkYWGlaGXiZKdkZOQjZGdlZePioWGeHOBf310eHqBe3R0e2qCiKR2aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NUlpnTkxWWWVYR1NqUlE+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46xoKSlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqmoqb2rtK+tnqmjoK6cmrKilqSbpKWfpJqZp6qlnpqpoZuRm6CknZiWqamRmZqTkIqCj4V9j4KAiJ6Ph4B+jIeSj5CFgZSblIaToo2UkYuRm5OVh4l+gHJ6eX58aHd8e3Vxcn5phnqEiGRgaGNyhXttaHldXlZDWHttVGFQUllLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsZmfn6mlo6GqpLaysaSpsaetucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqqOdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6sppefm6GinJ+amaKqopqZo6OVlpOeoZablqasi56RkJGMgouAf4+Be5qUjIl9f4yHkJCMioaSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcXN4aoJ1aoNnY2hhbnOObWJqcGBvQl15a1ZeTlFRS0lMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6yZn5eno6Gfp6O3r62ir6+pq7nCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6sbLAtru+uKm5uL2qpLWnqKqwrbmwqZm5vKOtv7S0oa63taamp7CzoJ+lpqihpJmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGtpJumpqmampufo5Wcm5mdqaaWmp6okZiSmJ2TmZahqpCaiY2Qh32If4KOfHyhjIyIeYSNhYqNjYWJk5qOiZWfiZGVg4yXjZF9hHtzcHxxc3RgeXhqb3FxcGt/c2R6bGhmZGJmh4BgW3JqcU1OgGlYWk1RTEtIUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrKCeoaSht6qwo7S0qam6xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7K9w7mpu7q4p6i2qKersKyzsKaYvLajqrq1rp+xuK+ppaevspuhpKCko6GWm6+moZ+jqK+hoKKTo6SitrChprGrn6yjr5ebqqWon5ianaSTmpuZnKWpmZubpJSUl5WcjpOXoqmhkImKj4Z6hH6EinqPl4qNh3qCiISJjY+FjpOYjI6WmYqPl36Gl4yPeoB6cHF2bm90X3h3ZW1sbGtqhG9mcmlrZmleZHSBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Gzubi6uLqvrsCztLmvv8G4rL26taais6qnqbKrrbGgmsC1pKa0taiesrypqKWpr6yZo6ecpKWUmKGypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6iioaGZm5ygkpqblp+hqpuamKCUkJOWmY2Tk6OopJCJiY+GeYR7hIZ9nY2Jiod6gYSHiYmShZaTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F3dWlpamdnb4ZoaGljZmlqYGtjamhcZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqSnm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBt7Cusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Aq6ikr7KprLW7nqipq7GlmJ6pnaakkZmmraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GhmpuZnJGYnJOlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfYCFiIeGkYSXlZCOkJGRkYySe4OVjoZzfX1meG9ramtndXNrY2dkZHaBY2VmZmZqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIytoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwbKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqrpyiwKCxpK6wrreutZ6trq2topqdp6mln5Wap6WfmaWiqJ2an5uUnJ2sr6W6qK6ioZqanZmepJqknpeemJuUmaCSqJWpp5qTmpqRi5WZjpSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTko+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2N0gWJmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2OsJ6ak6GZqLKvn7i/tqC0wru9urGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7W1rayfsa2vqaKcnaOrqJyUnKaknZqqoqSWmp+ckJujq6qpu5+npKCYmZmdoY9ropaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuaX52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNnc4VnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlbCbnJOgm6qtqqO9xa+puMK4vb2tp7ewpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKanmKu6laalr7O3ra6kqa6rrKWhn5ygp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoI6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcG+IWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU1BGR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnJmYnZ+qqqepvsOvsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqhopqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5KciK+QmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpvcpDYflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFORUdKPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKnsMK9srXAtbe+wquns62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2bmqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWva2qKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+aHykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSkRGRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3q7O9vrC2xLK3usGnqbCrrqipsK6jsLqvpKSusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrOzoqucoq2toJ2Zl6ChqJyYnaOfnJmhpqSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+bIKme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXN1U5OHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEZDRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqCuqaeyrKm7tsKwu8KtuLa/qautra6mrbGpoa+8qqGntKyjq7WlprOzp6OinaeqsqiwqKWen5+vlp+YlJWVl52soZmZpKi0rqGpj6moqZqdlZigpaebn52in5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Odg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpYnNziG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbWzurK0prGwo7Cypp+utqiap7mto6+xoLO0sKCknp+nqbCptKmknJ2eq5eYl5WXlZWgqZyZlqetsKijno+toqaVnpecoaWhmaKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnYiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2dIdil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1s7m5sqS0tKGxsaKfrLCkl6a5raSxsJy0uKqgpp2hqaSyqKyppJqcmqielZSXmJKSoqeflpKlqrCmopaTrZ+kkZSgm6Smn5WbpqahmqKfrZqgnp2QlZuhnpymlZ2WmaKflZiVkZuFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+dhpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52VoLmwl7TBraizqKmyurezuL+5t7G0u7Skt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWkoZOSm5iRlKKlmpKPpq2vpqCVmamfoY2RopmopaCUmaWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+OgqpwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogY6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZ01bYV5xc15KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmpq/q5e0wq6srammtLC3sbW/ubmxsLW6qbq0n7CknqWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56Zk5een4+Ni6iwr6adlpuopp6LkqSXqKunlJapp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo+rnI+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo2x5f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY1xfb3piVFpRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpyeu6GcssCurqurp7epuK+1wLW7r664tqrBtqmpoJumpKKdkaqpp7WjsqevqqCXnKegpKu4naOtm5aZj6WjlYydoJqYnJ+Rk5SqtrCnmZScrKmVi5OlmaWtopCWqrKjn56mq7CYoaOPmaKWn5uWnJehkpypnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYWx3bllbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueoryhl7HDsK2qq6yxp7ivtsSxubGtuq+uwLGrpKKeo6Gcm5Cpo6qypLWmraWelpmqmaasuZ2jrpiUoJCln5KMnKOdl52bkZWSrrmyrJWXo6enk5CWpJykrJ6QoKirn5ufqKOznqOljqeilKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZFlTZmBjXmNRZ2ZwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsq6isq6m6rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52spL6moaqXlJyQoZqRj6GooZOdmJOXlLG1t62YnaSkooqSkqabpaqblqmlpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fmJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXmZgS1pXZ2NfT1ttdWlyUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm1o6ylrqentbGryKuwsqu0o76xsqagoqicopuZmaymr6Sktamlm5eVoZumrai+p6imlZOblZ+ZkpekqaiQnZGPmJyvsr+sm6eep6KIk5GpmqijmpusoKOamqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdufXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHWJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11wZ0xYWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CqprKnpbC0qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlp+XraqlwZ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnaqfkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVl5KYk6ChlaOel6COlpOKio2Ol66QfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZieo5aak5GejX+OZqGzr4WKhHZ7kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3VkeWZgaWVjZGZrWWx7b2lqXFJMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgq6axraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbClrr6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp+doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5eWnJGkmJeonZqXZYKSfGV+jZqQZHmNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoR8aoZZXmt0ZF1ziWlrfHFrY15RTVdKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrbCmra2xvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjj6Kvpra5pa6jjo6aoZmTkpqgmZmllXulraKotMS4pKKnr56dlJ6inqOco6mokp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWgnZqSpZeeqpiefr2DiHK0coSdhq1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eRg46BdnqBgHlxen+HcXiFjZN5bniUY2ZfeWRgZYJjXnRnbGRiV0tVSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopKmrau4s6evopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKCWlqWVoaKXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeWm3Srg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i3YYOtWaLNbpB1e9p7f5lwfoiSdn5le4h2dmt8iG99hZGRfm2DkGBybHBoYF95ZFxxaGpjZl9RVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrprKsrKukq6awqqCnm5mll5yir5+gnqino6ahn7Csmp2Vpq2ssaqorKCUkpufpJKPnqWYnaejnq6kq7Cov8ezqKmxrpaSnZuhl5+pqp+VoJ+dna6wp6upnKeopKKrk6yzl6Wiqqqdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSQn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviYqSj4NtkpBmcHV1cWFnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaufoqWgqKiin52wrJeal6imrqyopqmel5Sao6GRk6Ctm52mo6+so6y1qrnNsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65ffalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aIyMmI6BbZqUcG55eHlwbWZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqeno5ysmqKsoaSfr6Kcm5Oqo7Wwr6Cpm52WlKaikJqiqKCgpZywpqSosay2yLK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlaKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAnIqaxsd4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SOkJ6SfHGXk4Bxe3V+fG5bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqKm1sqycpZyglI+lrJGZm6ejoKmmrqGkp6mwtMKxs6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7Okk5enopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV0jpKjlnt+k5KMdntzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpp7KgmamklKK1oqKVl6GotLmjm6KdopOPobGYnpunpaGir66dpKiitrDDsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJttcLJcpXOTepxsmX97mXxtqWGjcXF/n2Jzsrhod4+Upph9jI2Ujnl9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaejqaexo5Sso46kraOdkJqaqLO0pJ2knKmRlJetn5+dp6Sdp5y1mqGqpLaqwrCpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6KwsrmrtKaaqLGjp5d6qJB9fLB3ioCkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RipSSgXqvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkaaZgpWOmI58e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2TmoOpxsK2wbSfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomaj66xrKaeppqrlpeOrKGhnaWhmqScrZigqKa2qL+vpamkn4uAjZuan6aekpSampSamqalpZuqrKykpZ+qqL6klsOsqqKhq7K5qq6mn7OuqKmYdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsVt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHqPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726s8Gzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoaaYrZGYjqiaoZ6kn5mjo6WZn6Oqsqi7r6SonpyOfYublqGgmY+RmpuSmpipoKKaqa6opqajpam7nqDGpqSooau0tayupp67rKyslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrxzgZaOp5yQm5GYnnuCkpt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKCjm6iel4qjkqaep5yaoaiimZ6hrK2ouK2oo5uXknuHmZKmm5OOkZiYj5iTqZuhmaqpoaqnoaOqu56oxKKgrqOqs7Sqr6ifuqeurppzdaqkt4ZkiaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlphyaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmVlf42Tj6KYmZmRmKB+iJCVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubiys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epqqgnaOinpCKpJKnmaiZlqOqoJacpqanr7qrrJqbkpJ7hJaNpZiNkZGYlI2XlaiVn5iqpJuxpp6iq7mfr8CnpLKlrLCxqq2rpreirbeWiqCopbadiZajmYepmpCUnZKpspmao6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmZeWjouTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY2QkI+dlaGWmpijg4mWjXJpkHdxi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpLS2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5uolaykn5imnZ2RlKOXqJqomZSmoaOQmqeZobW7qKuYmY+Ne4GUjKGUipWRlZCQk5elkJ+bqqCctqOep6u3p67BrqO2pq+vsKypqbK4oK68mZGlpKa2opKep5+NqZ+Nkp+jrK+aoKOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiXyLlpKSl5Sik56Yo4WJmYh7cpZzeot/cnx/am9kXnBqYVtfWG1jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQxNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOvsqyuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco5CunqKVp56gkZaYm66LqZaPqJmojJipj5+5tqSlmJqMiHmClIybk4qVkpSQjZKXoo2en6men7ijgISvtaKvr3WkvaOyn3d5oKqxupR1rKSeiYCqf2RcYnagjqSehJd9bpOznKOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lJBoaI+Pc3ummppme5qHg3iYaoSLg295gGtxZV92cGxraFtmZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOgr7Csq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mJm56Mq5milKagnI2WkZ6Eda2OiKaaqZGXpIiburOnoJmXiol1d5ONlpOKlJGQlIyQk6CPm6GnmZyyloCMm7Wds4ySj7unoH6nonqirraAjo6mnoOLhpCxqq+MipajmnmAi6yGnJ2hp6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWJ5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWZ5J0oJp0fZmEop6ImH+TioSEmWuOjoVseHtxcWdkeG9qbGpaZWtqZXRcX0lUTFFARTUuWlRVNykhMDk9Pjc0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpiXh6qboJSen5GNk4mGf5CnjIainaSUmJ6Gnrmwp52bk46FcHWQiZWQipSQj5uMkJKfkpehpZaeq4eftIm0mq2KyoeqrYi3hYyvgq+sgqmNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWSho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6OchJqAjY6GiplxjpOFaHd0fHdoaHVxaGhrXWNwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqammq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkIaqmJmamaCEj4x3mpuOno+HnqSclpqYhqK4rKSanIyMfmJtj4uTkI2QjY2YjJGSoI+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2qrYWjjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgamagbFtui3xmWmCDf2JXUG93Zm10cmtqb11qcG1saVhpT15YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWjqJKhoJ+mm5qOmbSZkIufjJWLdYGUkoyKppWTl52dfpKFhaujh5qPipipmZqbkYelsKahlZqIiYBpboiIi4+OiouNkoyQkqOMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqKuDpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ+FgaRgnZiylXF8l5+zdHNbnrKDamJvdHZxaW9YamxycmZdaV5jTEQ9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1pYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7KurZOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GPkZOdmH2QiY2ooIeYjoqRo5Scm4yLqKilno+Xh4R+a3uHfn2PjYOLkJGJkJSgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlaapfa2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjoCfb5qQbaeZXKh+eLtqfalbjoRds2dcbnJ6eGtpXHBqeHljYGZYYkJRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56xqaydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJCTmI96ioSVo5yKlI+Gi56SnZ2JjqijoJqMkYqAgGmAhnh/l4x7iY6OiI+Wm3+Uop+goZOYcmifip+PjHCSjIGph5ieoaaepnuwraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs3+Am5Ond4KdbXJ9lG+ZcmqjXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl9XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRTXqCms7mzs6maooycq5ycqZShrKWiqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yQkZaIcn+IkqCbc5GQgYiZlaGbhY2onJqVi4uKfINshIVxgaGMeIaNiIeTmZZ8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+Jn5t8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmn2Fm294epdrm3t3l3NuqaRnYWV5cYCEa2dmZG51d2dgY1NcZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoaSOpaigmKmKmpiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3j4yOiG9+hY+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneAk4eImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGeYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Oke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp7dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2lKVkxZVFZdaGtuVmhXTktBSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqOljKannZ2mgpuXlo6XkI+ck46Ig3lqeYdlg4x/l6B5dY2Hi4Bng4WRg4yFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZaIiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pm3VvY2aIgm1yolpfW2KhbV2JjG57fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2aoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpo2joZuiooCWmZOOmo+LmJCOinuGcYCIaIuLfJibc3SIfI96Y4GGlImJlZmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjomYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHF8dHFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlcYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuan6WKm6WdqZ2FjJqPh5yRhZKNjI10hnqIhHCNhH6Yk3R0hXKSg2x/i5GHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVxrWHmPaW54cnJveHhwXWyGbmlmVltgV1xma2RWYlVfUV9weHhsa3Zmamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNqZmxxdW5aW2JsZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZunmqmYg4Gbi3+Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5eHVuc3OCZlxtimtrYVlaX1pZbHFcX2FaX11mdH56dHB0Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2glYicopGllX97mIV9kpmJiIaHinN9gYx2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOLm6CQgqehh3iOmImVi4ucl4SDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIJ+d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3cHd0gV1eb4Zobl5eWl1dVGhyVmNcXGJsaHV8fHNvcGRra2mAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR3anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2Gn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYaCkpqZmJCapqClnZ2Qln+PiXV8h46EpXt8jpCRhpiqop6TnY+Nqo2RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSooqLhZqEhIxzf4h8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWhfen9ofXt2dXZ1e3dcX3B9bnRfY1tdXlFnblRlW15ia2l2en5xbG1ka2pngYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J0bWxVY3F5ZXB6e3Nlam1si4met5qho5+SkZaYi5qfn557eJ6nkZuKhqSTi5iZeXqNhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImAh418foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx9qJGIkJKYlJaTeIyjn6Cdlpl/gJCamJKMmqOhpJqXkZp9jIR4gIOOhqB/foyMj3yYpKKik5mQj6aMjoCakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIuClaWTi4WQe4aGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnR9c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoJtc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6Xf4yiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgYmMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh4yJg6aVhZOLl5iTkneRnaCgl5OWeX6OmJeOlpqdpJ2YkpSaeI6EgneElo2dfoGJjYxyl6OfopOZjo+hi4qClpiDkpaZfpiMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3aIhIKCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R2fXF8YmNhc251cm1hWmFeW2xlUmNYYWFpbHZ5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaIc3RuZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx6cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqWnIuMmJB5fIGMfnyDfICCgXh0eXp0fYCEf4mLgGRefYuVh36EhnV9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipOhkoORkJWYkYuBj5ifmpKPkHN/jZKUiZ2dnqaYmI2VlXKMjYlrhZePmXqHiJCJb5eem6STlYqNnouGgZKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW1vXFxfXl5rXlBdWGNiaW10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6inh4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9npOQlpSId357in17gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoZ/g4NzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Ym42GkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBth5iDZoWYjpN6iISQinCVmpSjkpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4CAh3tkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFd35xcIGGhGRpeXR1cHxiX3Bha3RecGp7eXlsc3BleF1ubHNtcllaX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6CMlZOQgHR8doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2If39/d3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiVhZiHaYOigmaFnYqQfouDi4F3k5iSn5GQiYmVjX9+j5h8kY2PjZqRfIqAgm51cGxtb3B7hWlzg46YinF3gHSBh4J4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYKLf3d5bmyBhIJec3RycHB5Wl5wYHBqXm9qfHtxbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThouajJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J3f3dzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZmShYeXmYyUi4mPj4iehI+KfHKLhYmOiJyan5uWlH+TfWeEm4ZnhaCHkYORgolxg5GYkJuOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB3gox8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi312cGpsgoN6YXhwbmxydFZeb2JyYF9sbnlxaHBmZ3N0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYR8eZV4ZnJqg2CIfW9va3pgam50f3VfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoeAjJ5/i5qUj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eVkpmckZl7lHOFkJ+hk5OSipKblIZ+lpaJjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN5jHVmiJGGbIiihJGIl4KFY4yRmY+VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+foWNenpocmpzio+JgoWEfJSKa31+bn+LfouGfIR5gY6UmpqKfHZ4g5B4cmxncYCFbmt1b2hqdG1SXm9kcFlfa3F3Z2trYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWPY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ7e412cneKd3mfi5uvm6CQgoV3iJV+fYqdh4agkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvl5GWoZacgZJyhYujl4mOlouQnZaDgZWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6PdYl1bYWIin2KooOQiZyEhV6Lk5iMj4mOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gH+Ei354ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH+CeX+PlZOYkHVzd4iNdXNwZ3Z6hGN1bnBiaXZnUWBxZ2xVX250eWFyZF9ofXByblpjcmFiVm5ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV4eYeMaXaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapmQkJ6WlIGJcYWJoI6Fi5aLjJiUfI6TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWGfm+EgYmGmKGCk4ueg4lhg5SPh4qGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzdmtajHySg4V8f4OAg4mCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kJKQlohucXmMhnVscGtzeYJgdWpuXWt2X1FkcWlmU2BwdnRgcGBdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3thZF9dWWtuZm9pc3iKfnNzgX56dnqHc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neXeSgmR2hoVxipaFmaGZooqHc2+Ti3J3jpx+i5qJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBpYGZhf9W2jpCmeG5xd3xxk5GNh2uaj4mck4yGe2mHi5mGgZKRhoeYjnyNjYGBio17j419iIR6dHqDe3GHgZaajpOUgYh0goV1gn+KkpydhZSOn36IYX+TiIWJhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3V0dnVqYo2Bj3+EfXyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KEbm95jH51bW9rbHt+ZGlsalludlpSaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXR4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qemp+GiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWNnZ1edj15xc5a8xIR2cZSJkH5zmIyHnJSNiHRriI+VgHuUjIGEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1h4KelYaVj4KCcX6HdIN7iZecloaTjZyAiGV9koOAhoOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3l4c3Zya2qNhYqBiX54goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqEg3iDe4CXjI+MfW5seol9d3RvaWh9d2VecmNYcHNTVG5zaWJOZ3R4ZmBeXVhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNwdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpZraniEdGuUjYWfl5+ZhYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFkZI6xsndKYlqk2dCXcnuRi5F4f5aMhZqSjYZvbIaSkXp5k4eBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYaEppGEk42Dfm19gnaCeIWamJOLko+UhYdvepKEfoODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BzgGh4cG50mI2Fgol6dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aNg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfnJhWnhaWXJtTlhyc2ZgSm12dGFeW1tZdX1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcXlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3lgcHZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViXyDeG52h4WDl3duiIRsdXt0ZnmDg6iMg4+Mg31tf3R1g3mFmo+Lj5GSjIuGfnuSh3mAhI2DbIBzaX9+eG18e4GKg3hieYSBcWRxaX5tdHF0gZuLgH+EfXN1foBzgG9ba310eImCinuGf3yIeHpxbIiCjoKJcYF4f5WKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZXF5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foF7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl5YHN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6f3Nndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn52foB8i5eGgZOQl4iLhIl8j4lyfH2FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gX5vd3l8dH5tV21+dnOKgYZ3h3WBiXp3c26JgI5/g3J+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3yTbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeEf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdGBzb1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5COgneVjZSPh4KIeomJbXl5fnVoemlsf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en19cXt2e3R9YVV1fHJziYOCfIJwhop3eHBwg4KLfXx4fXx1jYWCdmhxaGyIgnJwXWhjdG9LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnN7fnmCgYJ8dn2DiIaDcHaDc213g4N+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW1fc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh1bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdX+PioNzlYqQjoeFhXt/hW11dn9uaHdmbXx2bWp3dn9/fGFieIZ6aHV1Y357Z3SGjoyVe3SAdXGAenxsf1lWcn1vdIOGf394a4iGc3hrdX+Dgnx5fHd7coqAfHNndGVti4RtdFtrYHZmSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgYmxkY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI90a46NdX92eH13gYOBe3R9g4iIg29xgHVxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dxYHFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3b2dffIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyY254cmpscXd9fHpdZXmAd2l1eWaCdmd0h4yNlHxyh2pufoB5bXxdWHB9bXN/inyBbm6Jf3B2Z3d+gH5/dXtxenOGe3lxZXJhboyCbHNYa194XUlvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGppZWJZbmFYY3BHQWhdYGZeXVZ7Xk9WZXBaW2poXVdnYF9yZmpocmhxc3aHeG6VinR/e3d+eYOHgHVzf4aFjoJwcHt4d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBcmFrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piX354eYqDZnB9aGprW1dveIqjgYV/cZmTcYB4dIFsf4GPhnKUh4yHg4iFfXl0cm9oeWFqbWFtdmtna2x6d3p3W2d9fHhlc35uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGh1fnd8fXF7a3l7gXl3cGVsYW2Jfm1uVmtgeFZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFvZ2ZhV2ldXGxpSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJnc3B0gXhwmYV2gH94f3yFh311c4KHgJWCbnN5e3tzcoWHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxmV11bXFtUZHBlX1hjcnVpdm9kZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfWhtd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bHp6j4R2l3uHhoKGg311cHJtZ3VdbWlfbXVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgW6Lam16gXFlcmVgbHlncnaJen1hdYN2aWtxdXpweXdyfGZ9fn54dm5jZWFthnxta1ZqYnFUTGprUExOcEhee2VhTVV0ZEtOU1dhand+ZV1ncmhlX1ZjV2JwXUtLa1hjYVRTVHNWTFl2ZVpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeICAeIB+hYR6fXaCg36YhW5ydHx6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmppZVZdW1taU2NuZVtYYXR7amltaGBiV19aaYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnppa3pqX2VuaIF3kIRnZVhid2l+h3pvaW9nZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm5zX2dianhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbHt8a2tVaWJnVEttaVBHUmxFYXhlYU1Ucl1LTVVZZGt3emVfbXBpZFxWX1VvblZJU2hYZl5XTFRrVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXaAgXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAam9uZGRYX1paW1ViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6aGp4Zl1kcmd6d5KBY2NUZG9ngoR3dmZoamFXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl5wb1tnXm11ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXl1cWRhZGxyfWpsVGleXlVMdGNRR1diR2N2ZWBLVHBYSk1YWGdrdnpkZW1wZmNaWF1YdmZTSVxjWGhYWEhWZFBIYnlbXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4mLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2JlXWVWWllXY2ZrYF1dc4ZpWXFuW15YWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVpdWVbZ3RmdnaRel9dU2VmaoKBc31hY2lcVVheYmSQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBedWtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8cnFiXmVtbn1laVRoWVpVTnlgUktaWUhjdGNgSVRtVEpNWlZpbHJ7Y2xsc2NhWVpbYXdcU0pjXVhpU1ZHWGBOR2p2WF9ibVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIKSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9hZ2JsVFtaV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcVlNkYHF/fnGCXGFjXlNaYVxkk59lcnGEg5B0a2p5bG5veXl6cYB2f3J5enpkZnVnXmJbYWhcXndpV2JecGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW97a2tzfXJwd2twYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWbFJJUFpVa2trfGVtb3FhW1pYWWxwV1JPZldWaFNURllcT0lydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uEfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdma1NeXFZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUWmBaY5aVY25wg4SKc2pneW5lcnVxemt5dHVuen51X2ZzY1teV2JkWWF1ZlZfYW1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5ke2RrdXxycnJqbWBZY2lqeF5mVGVVVlBVb1hRV1RQSGVyX2FGWGtPSVhUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWGVTU0hZWlBOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35thIB+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bWNmZ2hTYF9VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWF9seHt7b4NfYl5oVllgWGSciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWRUX2JpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXhib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWdTT11PT0hlb11jR1pqTkpgS1htZF94aG59ZGBVXlRddFtUUl9mTlxhVFNKW1lRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4KDe4iOfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpORi5KPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjoeIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIyHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjYeFjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yPjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSkpSPjpSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKRkZKSk3yGlJKTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKPfo+SkZOIc4yTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJB0dpCRkHh0ipGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkXxofZGJdXaJkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6QgGJqin5sdIiPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53XmpmaWNsio6NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLhmRvbVtpcmuBhoOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndvY3FvYWpzcWVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGNla25zcHJ1bGNjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5ZXGBiY21vcHBtWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01PX2hmbG5tZ2VRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFZkbWZqbW1qZ1xTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHR09VYGhuaGxsa2pqaGRfVk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRVNeYmZoam1sc3BqaWpsa2pmWEpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4/P01ZXmptbG55c2pqbGZcUkxFRUVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o+R1lqb3dwa2lZR0RBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0RYbWxfSEE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzdTYz03ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDxdbkA+REU/P0E8RVw9PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj09QTxKYTw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTEZGdndNNzg4Ojs+P1dpQTs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5GanVNOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIODg4B9XT5AQ0BAPUpzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZGR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIRkhGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODY4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqLiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3VzdXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0BBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fX17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNCQEJDQj9AREhFQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dJWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj5APj9AQ0ZJSVBfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRTT0xLSkRFRktPTk9XVVFQT1JTU01TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkJHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1XXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUW1p1g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JTVWNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHt7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWlhNTFRUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PDo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fX1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xdUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pJQEZBQUBGSEVKT0hRUmFcUVBSTlNOT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKTExKRkZGRT9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9BQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRU1PYmVRTU5OV0tLTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJBQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVETE1SVExKSU1UR0lJSkxKS0xJSkxNT1BRUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEZJS0pESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUhDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZGRENJSUhLSkdLUk1CTk9NUU9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWWFhWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRFSEZERURERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF9oZWNgZGZoZ2ppaGlmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqZ2dscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSUZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViZGhiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBdX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dXZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRUZJSk5LTkxITE5HSEU+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHR0VUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxVXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MTExNS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENCRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmRFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl3cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cmxuXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlyfF5UTGxgdnVraXV8e21+eGt8cF1eX2JbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVdeVlRQWVJWV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW1jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUExPVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpgXVVYXlxeXVxdYWFeW2JiY2dmZWRiWF9hYl5gaGVmZWFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVlRXXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWJiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVVpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9gXmNiYmVkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfYGFhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19ZXl5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVlfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cW11YW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYVJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX2BcW15eYGJjXFxYXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhYF5bYGFiZWJfXVRdYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z3end5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh8eXx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3NzcnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzdHNzcXB1d29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3Jzc3Jxb5CDbnBvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF2jHVycm99oHtucHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXKdlXFxcZWie29wcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFyb4+viW95oqJ6b3BwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwiLKmdoqspHtwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNs6ikprGodnFxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdqGho7Smm6R8c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiCp5+cp5+jo5J6eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIuhjo+YmpmblXt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1/iKeno52gmpOYgX9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYCNsqepoqChq6aEfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gIB/iqmun6mjoKGlqaSMfnx+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+BiJWqr6ScpKGgoaGhqaugjYGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoODhoybpqOdnJqfk5ihoJ6dnqGglIWBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChIyUlpeXmZiHkJ2bm5yYkYuHg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgoOEjJaZlYmSmZySi4eFhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgoGBhI+XlJaZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4SRloiEhYODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYeRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiJKAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKCf4CMloKCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJKahoKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KFlJOMgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgI+Ti5CBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjYqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaDgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhoaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX58fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomJg4OEg4WEhIWFh4iIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+BgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpOSjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKCgYCCgIKBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk4+JiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fnx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjY6Pjo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY6Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjYyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqIiomFiJKPjImKh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46Li4eFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KCg4OEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15d3R0gICCgoKCgoOFg4SDgoOEhISEhISBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn5+fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDg4GBf4CDgH6Cg4SAgIKBgoKEgn57fHx8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYCAgICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKCgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYGBgH+AgH+Ah35+fHp9fHt9f3h3dnl5enx8fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/e3p2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+Bg4KAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgoCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4WDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSEgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXqEf39/f4SEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+hoSDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhYOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoOEgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx+e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIeIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH56ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WFhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWFgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPT09PT09PU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX2NnY2NjY2NjY2NnZ2dnY19fX19fX2NfX19fX19bU09PT09PT1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4t6mnp6enp6enp6enp6emrrm4uLi4uLi4uLi4uLe909PT09PT09PT09PT09Pb4uLi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6Ojo6CGhISEhISEhISEhISEgpKlo6Ojo6Ojo6Ojo6Oiq9PS0tLS0tLS0tLS0tPR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWiiYeHh4eHh4eHh4eHh4WVpqSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tPT0d/q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqampp5COjo6Ojo2NjY2NjY2Mmqqpqampqampqampqaiw0tLS0tLS0tLS0tLT0tLg6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLQ0NDQ0M/Pz8/Pz8/PztDR0tLS0tLS0tLS0tLS0tTU1NXV1dXW1tbW1tbX2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7R1M/Pz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7Tu53P0NChlsvSx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7StZWbs9anoKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/P0Z+gqq/KnJaQobSVhp2czc/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9HFh5qzv5ugqJm1v8mXmcXQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P1qeZssyjoIufxNORmaHP0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9WlmbHZmMfJlNito7+e1dHQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDWpZmzyJyVlaS7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDQ1aWat7Gar7OdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT0NWlmbexnpuinJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhx9LWo5qyyZ2ooaOeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPR1bWCw9evjZGl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD01NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHRwtTS1cC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Njc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjY5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSUQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjxIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLQDs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT5IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUE/Sk8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QUNDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QkdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2trb29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODY3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a3tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3trW1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDQ3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrKytrKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKinqKilpqioqKeop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6OTo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qopaanp6eoqKenqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamrq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKSjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenp6jpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGem5uanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uanKKgmpaVlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqampqempqCbmZuhoJeSnaCXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanp6ainp2foaCXmKiilJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaWmpqalo6CgoaGfmqB0j5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaWspqSlpKOioaGdm6aCYZSZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKktrWlo6SioaGem5yjXWaamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56hoqOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgpqWTsaKhoJ6cm5qnhVVunJmanJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCteoytn56dmpqcpmddcZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCfqY1pnKednJqan5dqZ3Kdm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnp+enaSWdH2pnJqbnKKLa2lwm52dnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5qglnt3kZ2anJ6cfWppcpuenJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmaoKB6ioWQmZ2ekoBrZnOan5ycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJybmZmZmpugl6B9cpmlm3iOhmlym5+dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZmcq5+KcWCnqZ1heol5dJ6enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmYn62NcGBpopCTVF95e4WgnqCgn56dn6Ggnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6endEVGbpeAe1A+W3aEnZubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbG0ra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5apmkxERnCVgnFSRzhgeI6SjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqqKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZCVrHVdeF+Dtq+lYnZ+S2p+iIKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5iel5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoN/kqhgjrOMzsOswKWAlXpSeoKBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foqXctDWydetn7qzY2RwWm6Bho2Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKymm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioR/gn2Rf5DNtcLOyL+slHyqrF9oiYyOi42QmZyUlJSgmpqfoq2xrqmkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLiJKLmHWYoo20qp2eh4JwaM2AYIuLipCPjY+UlJiQlZyanZ6orrKwsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanpyjoZ2KkHqGo4yEiXd0bXaji2aGj4yYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqayqqq+nmX5bZoZ4eH9tamh1dn13hKOhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWqqKeqrIdxVlt0cXJ5aWViaWlwfIujqaegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlFPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmZ6lpaKisJ5xa1JSdnd0e2hhZWZeX298i6CkoKCfoaGooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmrqiwsqyAaGZLTnB1d4BpYGJpWl1ia3WDkZ2hoJ2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mttry+vayNbmhjRlVub3x8bmBeZlpaYWJncHh/jpqgoaKYlp6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Cjqqqnr7zGy83Gt6aPc2hqXEJOcG50bnNnYmFZWF9jYWJqcXV6jqGonJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfX1xiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKu0wNTd28u5q5uHcGBgYlVGRXVuYF9tbVxbV1pZXVtbXmJkZWh4kqevpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaXZrcGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS0t8XS2dbJrpF4Zl1aW1xUTEFraoyYj1lUWFdcXF1dWFVYYHKJobLFw7SyoKeqrKerqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHHzdDEoH5pXVlYV1NJVGyns6hOVV5hYl9fX2Z6lq+/vr7AwrK1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1d25tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxsC8uczJuZdzXFVYVFFSnLOfTllcXl1gbY6qu8GytqemsbWrtbKts62prq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9qZmhha2xnbnVycnVxZ15gXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhCQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZO/vMvQv5hqWFdZTJK3lk1VWVhgf6a8sKarrrOnqqmpq62sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4b3pqaWFdZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAuLO8wcW/qXdXVVGKvY9NU1Zbg6Cmt6+lrbS0ra+lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb64vcHDv8e7jWNRYX9lUFNgjaqfprSyray4tbOrqaOhramsp62frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8THxMTGys7CjVJJUFFmp7q3wL2+uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxcPFxMnM09OWTU1cqsfAyM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcLDwcLGxsfKzX9Jj83Nx8zQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr69wcHAwMemTaTRzMXJ0cGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLS1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vb24u8DEsFOezcTAwcm/sMG/ure7vrm1uLS4vLS9uLW0sLO8sbe3uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3tri7vbm5tbrDyKtUl8i/v7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urWzuLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7q0t7O7xcqgVY7Jv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h31rbnFncGtzZmJuYFxUSEtLREpDQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K92hL7Iz8LAuK61tbu+t7qyvsLIlluIzcLCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxqbnRud2NnYlxjUUtVSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGbdHex0dHMysS1ur/EyL6+tb/AwIdofc3Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOCdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCiHZ3qMzMy83KxsLDy87BvLm9u7GBem3Ax8TAwL/EwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHttbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bw762vsC+vrqmnKqzt8TApnx6fJ/ExsvIwcPAwMnKwcC8urKlloh5s8jFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZur869trnAvKp9bmhubXSCl5l1e3+cvr/GwLnAvL7FxL29uLGupquWlKLKw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oz0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdoK0vba1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7uupa2yoaWHwcXDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR4i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+tZmxvq6zeLDJxMC9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2PrMS0tHenysK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iJBuTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/GfpO6q6Joq7+4tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIV8WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vZSntK+nd62wqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmVaE1AU3lxT0lJTGmdgFpFVbC6sayzr66srba2srS1rqmmn5qbnZ+mqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGdEU5x+UFhJS2FKV45iZWWDr7WqsrSuqquvsLKzraWdkZeTj5egn6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJuZm6SZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTg7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp9PQXWZcFBtSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmaGenJyWm6Gbnpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotXU0pmpFlmfW9yW1JrZFxnYmBtkbWwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoaCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVqcnd1cGN3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojs5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgpH9vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2u7vAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6Gknqaam6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkQ7Qz5GPD45Nk5+qrKno6OioJ6lq6aemJyUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PKycPBx7+6tLq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiFfnpya2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjY+Xl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjGwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgXl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/S4aepJiDoLKto56cn5qYl5SSlJaRkI+Mh4SDiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysLHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHtydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhxa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/RxNDT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIyMrEzMzMzs/Fx8i2v8rA0s3M0MfKycDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhH14c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+mmpSXn5yaoKCem5yalYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM/IxcvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXFlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnd3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz83T1tLR1s3P1dXRxdHUy9DU1dbO09HY19fYy8jOxMnPzMrMwMrAycrOztDL0M7OzM/PyMzQ0MvOy8PKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYl6dm9xb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF6SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJy8vPy87N0M7TzMbJz83Ix8vFx8HGyszN0NLH0M/OzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8zPwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fmiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxrzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9Xa2NnPy9LNzc7IwbXDvrGvtmxfenyhkYuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw722usi7v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NXXzcrOxcnFx8G5xb2rrqZgZHaDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrE0M3Sz83Fx8HGwL+6t8m2qrCZW2hwio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlma25ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhYV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkltqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrrqSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubayvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxs7e6uruyvL6+vsS/tcLBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmzsLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNjUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBhXlxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDU1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJahoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clq66zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoKCnpqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6ytpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVlbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmJOKnpGNkpOWkJiYk5yho52koaKVoKKlppujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw5NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8mtsbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmqWvqaCcmZuhnq+anKu0oKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZyjlZugo6GXoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5KQz0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6inr66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsa24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWV9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpamaoK2hlZalqKedmJCPmp6ul5moq5mfnZSloZ+SkZKRk5Woq6WamZmenpaOjIuThomNg4+LkpWRoJ6hpJmWn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GwsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqGmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiZlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPRE5OTlBLRk5OSkpOTlFJTUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNiJmajHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoOUfn50io16kIeTkJCdm5qakpaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraiippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdampxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WioCUiV87Vm98jJSKgYySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWKkoiGlYd5iX9gSlFueIuShH6EjYuFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhXl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhCPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSAjZyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSU5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5adpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcYB8aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0NAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLK7xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnq2hprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQaWhwhIF0jYeEinGGgneHf3t2hX1udnVmf5SOhomIh4iHoKuilomOl396goh5eW9na3h+e350bGVeW1teal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3OTs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSUlLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJOPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYqMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZGBbZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqieqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnpuOkpWYo6KmtrCdkZmoh5aPjYGIbHNzfYB9cmlgXWJgYmhkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6iliIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKJlXp6fYV/aGFoXGVjXmRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQTc7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayytJmWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKebtqiMpI6Rkp+GeIKDdlpiZVdmYmJkYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wsKsmbqok62Pl5eqiX2CfWtXZGJZa2VqZldcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lLSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIsJ65qaGrjqSntoiBgXNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9SkE9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnNzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36DgIN4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trm1uLmyt7W0rra2mWR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHttX2FdWV5hWmNjUFtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NEQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaWxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3q421p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNwZV5eXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKOOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556cGZfY11XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3qEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jeHp+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMdHBkYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4fJ21jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdwZl5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiPg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqMh46TkZuVn5WHjJOboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGfJuIlI+uqpSVmJ+Zp661vamtvsfLycnMy9DJw9LK1NfY19jX1dvX09nb1dDb2tHWyNTLlXt9amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlve3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7iLfFpMHJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWIiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod9e2lrZ2FUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0RBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Afn98hHt+gpGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/Dob2MnKOdfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+dmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvt7q1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h6e3pta2dYYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44Njg5Pz1EUlNSWF9WWGZtbW1pgY+KcXN5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KgkKSuoIuRi4WMgZOGV3Kti5+rm4+DmJuPj45cgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPgIOIhaSGjJCzmJ2SlJehoZ6ZkpydqLK5rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX92aWhfXlhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29teIt4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqeo5Kpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpCykWSkzceVjoaHiZCSjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjYF/iJCliY2TqZqXk5aZoZmfmZOdm6OztKajvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWVgX19PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjn18bX6IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqmZra+kl5WVlJCLmJqWoMCOo8m4q5qipa2ZkZucsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyZn4qQkJyamZOYmJ+UoJ2Vn5uhsq6jpbe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15iV2JYUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/Pzc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6e22Fhnl8hHiAhYF9cHh9fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrWeorillaykl6mtt6ako5+ZqZiqpK+wqZqZnJSVkZigl5m7u63JoGm2uKuwlZifoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYuNl5mSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjIwtGhxsnNzcTW1tDL06JxfGpeXFVgUlBGRD49Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioaOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC7tsXEw77Np8fDx8O81dDNxMqJdXRkXlxhXE9LQkxARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZigl5KZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXlpdbFROSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmXB7Y1pYXVxNTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbmzp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINucFxaVldPR0tTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC5s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZqmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLimq6utsbGjobKytKRycGdeXFBSTUVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOywq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZugoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Kuvrm2n6OnqKWnnJysqamNZWhjYFNMTUdITkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsPIycXCzsjBvbmyr7m0wMLKtsaxwLy1uquorayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLa1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucopqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUdITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkRDnHBiR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwby/uMHDwcjEvs3Gu765srC4s7/DyLW/r7y3ubenpKqrrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqaydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpJS09NSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hmY1hNopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xcK9wLbAwrzJwr7KyLa4tbSws7S3wca2vrC4tLq2oKetqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6zq6mioqWllZWdmYuPkZOkn4ljZVtkYExJS0tPRkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxMT56foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcOzwsS+x8S9xMq9sLC2rrC1r7/FtbmwsLq2rZqpsKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6assKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSU1LU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTUxJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtcDFvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZion5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBOTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzOTA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMLHwbnBxsG6qralrbutwcO3t6qtsryjla2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnoKSbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFdXRFleXk1MUk9fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTc0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwcC4xb3BuK+2p6u3sry/vrWprrK4n5esraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2VoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6emo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MT1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaSusLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrbC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9kXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyfo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZ11GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5LMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipaKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2go6KmoqmdnKa0rqelqaKjl6Wmp6qcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhdIhpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhNTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWppK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop5+nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiZKdkZOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5LeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1pOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnHyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1p6essra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqZqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIaTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZDWHttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpLaysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6eqq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQl15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O3r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WdnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiZGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLbFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i2qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpuanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdmlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gln7arpaW0qaqunp3Bq6ilr7KprLW7nqmpq7GlmJ6pnaekkZimraKYnqSpoZuhnJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGZnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlZCOkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBCKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7uuwLKurq62rrK4s6irubGvrrO2urawuL2tpp61q6CgsKSqrpyiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqJ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGbIuPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+puMK4vbytp7awpaukt7Oys7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGknKammKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmtprO0rq+zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqgoZqts5SjpaW1vKesp6uqrKiloaCYoKajmZmlo6SYm6OplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums62sqaeus6mvtrSnp6a0pae4rpyzsraqpaSnsq6usaaqnqeksaOin56Xmp6crquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ2mp5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2dlJmllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqipsK6jsLqvo6SusqOpuKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZaamqyllpuhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmgpaSPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5aWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yalaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZaQ0Q/RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKikm52eq5eYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKnm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mpeki4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tgbGhQVUdJOD1WUVpXWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJmbmqielZSYmZKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezuL+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5iSlKKlmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aWn6GJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9yc19KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknqWnp56TqrCpr6q1rKqvoZihoKalpLqio6uglpuRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSjkpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmpoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIiQmIyYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm14b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxurGuuq+uwLGrpKKeo6Kcm5CppKqypLWmraWflpmqmaasuJyirpiUoJCln5KMnKOel52bkZWSr7myrJWXo6enk5CWpJykrJ6RoKirn5ufqKOznqOljqehlKKanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNveY+Ejol0nsG7vZp7gbKocIB0kbmDfIaGjIaNe4qHjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHVCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlc4Kk9eXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqqa1qKefm5ago52rpL2moKqXlJyQoZqRj6KooZOdmJOXlLK1t62YnaOjooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Fzalpem4phY4iOlWtggJVkbZ13YpVrgJqVlGVeYWNxmoppcox9hZVnan5ydHh9fWJbd3SBaFBcboR9fItrWGx6gnNKSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQX0woMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuws6u0o76xsqagoqido5uZmaymr6Sktamlm5eVoZqmrai9p6imlZOblZ+ZkpekqaiQnZGPmJywsr+sm6edpqGIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZXZ9d2twe21gY11waE1YWmZqYFdab3ltbWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqp6yjo7arn5mWlZ+WramlwJ6rpJWSnJedl5KTop+eoqeTkZmop7LEr5qrnKqekJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGZl4qEj5+Ie4SQh4aakoiGipWPm5eNkZiepJaak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2lzf3p1g4eCa3RkeWZgaWVjZGZrWWx7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWytJ6VlJ2ZmbCmrb6gq6KQkZ2amZSRlKKcl6ichJ6qq6KzyLOfqqSqlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaN3a2qLmaOemXNsbnuEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlrfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZego52imZmmq5yto6WoqbKtnpWjkKKvpra5pa6jjo6aoZmTkpqgmZmllXulraKos8S4pKKnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpunn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxjKKIgp99lpiJncC9gpednY2dwsF8gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUS8jRlszUFkvVUFCOy84lqO5w7SwsMCpqJSjr6mwrq2ms7SvqaWmprGrn6uYmqKfnJqqp6KdrKOlqKSktKSdopOmrau3s6euopGRmZ2lkpCfoZibn52Hp6ykq63AwLGgqa+pl5GenaGZoqOqo5OgoZ2era6prKejo6ehpqWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF5lJabX66PXo6ngaKgfaeWnHSrg4CvXmONqnunh4WgdJeTiLNjgquGoY2Ns2qFr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoiSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUswJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbSrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6Whn7Csmp2Vp66tsauorKCUkpufpJKPnqWYnaejnq6kq7CpwMezqKmxrpaSnZuhl5+pqp+UoJ+dna6wp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+cc61+q4eGn3aYknt8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnKOOo6OirK+2r6ixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52wrJealqinr6yopqmel5Sao6GRk6Ctm52mo6+so6y1qrrOsq2mrayWlZydopierqydlqCZnp+qsqmqqpusq6SjrJuvsaKoq66lmKaqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBhUquEf66Dm3atgaaGhp96mZeGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kcm5OqpLWwr6Cpm52WlKaikJqiqKCgpZywpqSosq23ybK1qquplZGdnKKYn6WznZqglJ2fp6yspK6araujo6qis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX2CUqYOjiIegepiWmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZuflI+lrJGZm6ejoKmmrqGkp6qwtcKys6qtqJOJl52kmqGjrqaYoZWZnKamrJuwna6pp56spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZCLn36alpeKdp6YiqWYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKK1oqKVl6Kptbmjm6KcoZKPobGYnpunpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6GvpaaYr6W8raG2t62dnbWyuLCzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5yVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7y6tJ6Wp6WttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46kraOdkJqaqrS0pJ2km6eRlJetn5+dp6Sdp5y1mqGqpLarw7Cpq6mhjISOnKGgpqOVmpqcmJuZp6WmmKyorqOlm62mvqyUvbCsn6Kwsrmrs6aaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6iVmICsiYSuhZ+UqqGhl4afgJmVgHuSfquAnZqXi6t4nZ+RiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYGFhXl1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6iklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFtZ2+ZmIyIsFt9tFykg2vIomSfgHu8WHa1WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRYWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsnq+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy6qJ+tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbWxmi3hvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1ldZ353pl9hcY6RbmZlgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2gopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTk4uPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVFZZXmBhY11eVVFKRUQ+OT1AQVNYW1xaV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuYmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6qenp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIuAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZecuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmZuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqiKZZylnJGXmJaMkpyRhp2akJWDkoePj5KJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jpq2kkpartrCyp5urpqyXdIydr5+oq6eUl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6XkZ6Eda6PiKaaqZGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6GnmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yyeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0pFSktHU1hbWVthYWlmWlFIOUVLPD5hVl5iZGZkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqappZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaSUmJ6Gn7qyp56bko6FcHWQiZSQipSQj5uMkJKfkpehpZaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2VkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkQ0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLCpqqaalKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSclpqYh6O5rqWanIyMfmJtj4uTkI2QjY2YjJGSn4+UoaGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxdfJZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8q66imZigoqWsrqGdrrWiqJKhoJ+mm5qOmbSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmZqbkoimsaeilpqIiYBpboiIi46OiouNkoyQkqKMlJ+gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARF9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJqinaOjpq6cm7GtrJOYoZmhpJmalJ+rm4uIkniLhXGAlo2Kj6GQkpSdl32QiY2ooYeYjoqRo5Scm42LqailnpCXh4V+a3uHfn2PjYOLkJGJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRk83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKxrJ6mnJypn56um56wqKydl6SaoZ+YlpahpJmGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iY6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpFUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1JbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZaYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGcc5GQgYiZlaGbhY6pnJqVi4uLfINshIVxgaGMeIaNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaNjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRhV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhTWU9TUWFmZWpSY3d5d0lGRWNdZVpoalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJmFmamgoaSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhneBkoaImaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAopmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2lJVk1ZVFZdaGtuVmdXTUpCSk1LSEpPQVFLUGVjam1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlYFxdXF5pYmRpa3tfXWRoY2pmb2xlaW1loZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpqmt1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6dpmXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSllPXUlYaWlzallrVlFSRVZcTFhTYVVpa193dHt9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSlj4SabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6cqiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1KXm1udmBbcVlbYFtmdGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhYF5cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUl4h+gXmUrqN/gZtxj4V4j4qDfntyp4xxfX16l5abhI54e35+h5SVk4p2kJifoIN7fYlrjIVbeXlyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xma2RWYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eoN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjpWafn6Jlq2oj5Kmj3dvnJCCeZFvfqiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4J2dIFZcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaX11mdH56dG90Y2tra3x9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOjfoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaenoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jnd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dVGhyVmNcXGJsaHV8fHNvcGRrammAfG55f3FqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npaioZiVmJmVmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXqqhI2SmJaPnJaHhpumn6KanYaCkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIZydWF/g4+GdYuYgYOPgoaFfoWElG55dXSSoYqLhZqEhIxzf4h8fXJye4eDe3iKjoOSpo+Fg46BhIqJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnVgY1tdXlFnblRlW15ia2l2en5xbGxka2pogYBsc4FsbHVveXCFeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enJlam1si4met5qho5+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4GakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5od3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4aHh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xbH54h3prjIFzgYF+gXR2go2Gf3x6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKSpaWcjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeX2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaChmJOWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpaZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHt/hXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc251cm1hWmFeW2xlUmNYYGFoa3Z5hnFjamNtZWh9g2xodWhscGmAfYJ5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5igmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXprdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogX17d26QiHOBhIR9dIGGiXuDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ2KipGGi56LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnZOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIF6d3VvjoV0gYKDe3WCiIV4hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgpCdh5OddYGqlZOOh6GMlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAd3WBgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjZ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqSfIqAgm51cGxtb3B7hWlzg46YinF3gHSCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h5b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVRaZmdjdm+EgmJda21kYmZrkm5gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeYV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6nloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzg3qCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHOLhYmOiJyan5qWlH+TfmiFnIdnhaCHkYSRgolxg5GXj5uOj4yMj414e5KQeo6LjJKWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6MjYR7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTj4WImI6Oj4R3dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2hKCDk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHh6jX6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgoWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fYqdh4WgkY+FjJiEk46HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoWjhpJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3t1f4l4hoSNnJuYmY6Pdop2boWIin2KooOQiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH9+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNgJqIhHtzd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXeLm4mOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEc4eCk5uXlJeGjHWHf3CEgYmGmKGCk4ueg4lhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4Saf4F4cnNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxk5GNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBio17j419iIR6dHuDe3GGgJaajpOUgYh1g4V1g3+KkpydhZSOn36IYX+Th4SIhImNf4CDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpSanJpYlFicndsYmVeWmqDbXNiW2dfZGxgblVbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH97fXV4hniFgn2Ah3V5iYGSlnyJhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmn2MmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8i4Z9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecloaTjZyAiGV9koJ/hYOJiXKCfmd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5zaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6hIJ8gYV2fomBlpF4g4p0gYhzeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp6j5ZvenNxbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmSjYZvbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXtqeYWDpZGEk42Df29+gnaCeIWamJOLko+UhYdvepKDfYODiYNvgnhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4SJfYWIeohygG1wg4aOg4Nyg3iAmYyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBe4CBf4J/doGFiZeKcYKNcXuGfXp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2NaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSYjX+Tjo1/bmyFjYx1fY9/hYKViHyDeG52h4WDl3duiIRsdXt0ZnmCg6iMg4+Mg31uf3R1g3mFm5CLj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hieYSBcWRxaH5tdHF0gZuLgH+FfnN1foBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcYF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbc3JlW0pwd29dW1pZXXR+dGhZYltnZW5iaUxXZlE9XmZdXXZmX3RwW1hUb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHxyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2FsdGFocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGmId1j4yKd3BshYOHdHmJeIl9k4h6fnJndoh+fZdvcIZ9aHd5bmV6iISlh4GHjYp+bn51foB8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOKgYZ3h3WBiXl4cm2IgI+AhHJ+fH2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhXUnRhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5d4p3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgaHBmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SEdJGNiHJzcIR7g3N1hnSId5SJeXlxY3eGeYCTaXKEdWZ3dmNqfIOInoKAf46OfXJ+c4N5f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJziYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFpzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVVlR3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4eQgXqUioB1dHV+d4BwcX5thXSUhnh0bGB6gXmIjmZxg29ndW5bbX2BkJOAgXmSkn14e22GdYCQi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp3dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGf394a4iGc3hqdH+Dg316fHd7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtjWFdWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fi397koV6eXR5dXV7am11Y4R2koJ3cGdefIF5i4llcYFqanFjWG17hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inyBbm6Jf3B2Z3Z+gH6BdXtxenOGe3lxZXJhboyCbHNYa194XElvbE1XVl9UVXxrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4d7fo2AeHhzd297dmVqbmGHdY6Bc2piXn54eYqEZnF9aGprW1dveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2x5d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnJ7a3l7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9pTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fYSJjoOBg3t+i4N7d3x3d5qdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFpTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5renBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFZXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1aHCAeIJ1YXeFi3yUgW6Lam16gXFlc2VgbHlncnaJen1hdYN2aWtxdHpweXhyfGV+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEhee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTVh1ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBeH+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6Adnujpop5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19baYBpa2+AZ2xhaHp5a3R0dG+GgnuAfXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnF0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzdGpvgH55d2B2hIR4j4VziHFweX9xY3BoW252ZHBzh3t4YXKAcGdpeHNxa3d2dHVig3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXhmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1Vvb1dKU2hYZl5YTVVsVEtbeV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ+AeoiHhGxygnl2gYCCdG6Hb32AdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juh3x+fnp2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmKenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKe4eHgH93cnV+dGFwbFlwcmJxcYR7dWRygGxgbHpvamh6d3RwZIR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnhaXmBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9dHV1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB7fnyGiHNxj66MfHuGkH5mcYh6dH19dnJvhm17fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4F5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7g3l0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB3eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBe3NlcYBkXm12aWNmeHpzbG2BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXdcU0tjXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJdIuGdHF2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJqie3uAiZV5ZHWIeXN5dmtzcH9seXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfX+AfHdvb2xlaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5veXl6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqanJvd3RzdGlwgZSDhn6EdnJqcHxtZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0lydFhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG2PhnFvd3p8dIKCfYuPg4KWdHiCk4aBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF7bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpriH2AfYh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVxemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYl7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RQSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHZaXmVsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rk4hyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3lzeW1tcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl8gXece3psYmVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3VwanlpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFjH+JeodtcWZve2xxbGJYX2hob3OAc3NeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnV1XF5lbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKiI55bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQkuSmpmZmZmcW0FERERERTkvMDAwMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzP5OenJycnJ9SMTU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGjY6Ojo6OjoiGhoaFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpORi5GNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2MjIyNjY2Njo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6FjYeHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkIiMhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCQiIuHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjJCIjIaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNj4yOioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6eXp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlZWVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KSk5OTkpKRkpSIjJSTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkZCSkZKTkHeMk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKQd4mSkZOAdY6SkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJJ5bo2SjnR2jJGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkX9neJKHdXeLkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6PgmFphnpodIqPjo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI53YGtiZ2Rui42NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLh2RvbltqcmyBhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9xe3h5e3x7eHd7f3h1d3R0dnV1dndwY3BwZGtycWRoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGRlaW1zcHJ1a2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWBhY2xub29rWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QXmlmbG5rZ2NRUFNQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTFVkbWZqbWtpZlxTT09QUU9OTk9OT1BOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tHSU9VYGhuaGtsa2lqaGRfV09OT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFRFJdYmZoam5sc29qaWpsa2llVUpKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PktWXGltbG55c2pqbGZbUUpEREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozs7R0o9Rllrbndwa2lZR0RCRUVER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pj06O0Zbbm1gSUE+QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs6NzhWZD84ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT0+PT09O0VZOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E8RFs9PT07Oz0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTxJYDw8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVI8PT1JTUZGdndNNzg4Ojs+PlVnQDs8PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5FaXRLOj0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2KChIODg4B9XT5AQ0BBPUlzfFk6PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg399hHVMQUNFQD8+WXyAXT9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxJR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVmyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUpISEhHSUlKSklIRkpKSkpJSklKSkpGSUxMS0pLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD47OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGiIiIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqMjIuKiYqLjIlUOjg2NTY3NjY2NDU3NzM1Njg6ODc2NTY1Njc2Nzc4OjY3ODg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKi4FHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4Njg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRGSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj5APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUU5PTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTE1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VGSUZFRUJBQkJcb3J3eHl6enl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1JTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UlRSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtMS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlBRTktSVFFNT1lSTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGT0ZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gIB/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUVFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn5/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk1MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8/PTo4ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJEREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QEBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFSEtGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDSEdKTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QUNAPkJDREVJR0tKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpHSkhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PT05KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHByaHR0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJEPTk6Pj49PDxBQjw/PkFCRkNFQ0NIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQ0VFRElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExNTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hDRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0hIR0pHREdJR0hKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0lGQ0lKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDRENFRURGQkZGR0RFS0VFSk1NS0xMR0dNSUdKS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRUVGRURDSEhHREVLSEdMTU5MTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0tKR01NTkxNTkdMTklMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERURDQUI9QkFCRkRIR0xIRUNDSEtISEZKTExGTkxMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b250c3ZzSEtISUJFRUVBQD5EREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYltpXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQkZFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMTEpLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLTElMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VDRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJR0ZGSUxKTkZES0pMTkpMSUtKSElGQkhJUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVtSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVhVXkRNUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJUWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXmJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNDRlBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHNvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhkfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSEhSUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhZUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdYWFJdWVddVlRQWVJXV1dXWF9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUlhWVFlWVFlVVFJVVFRVV1hXXVpeYV1cWlpcXGBjW11iY2RmZGRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZWWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBhXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVtVU1BQTFBXV1JXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1dcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRZW1dVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFVTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXl9eW2BcYFVcXWlqcn1zbGdcVVhXUE9SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVVNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVtdUk9VU1hXVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZVU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVldYW1pbWVlaW1hWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNfX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFpYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1pbWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1gXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl9cW11YW2BhXmBkY2RlZWZiWWNlZWlnZF5jYWBlY11laWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5TV1lWV1pYW1xYV1leYGJhZGFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZnamdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFhXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cW15eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmhqZ2NhYlxkZ2BcaWliaGlmZGBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX15bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGlnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7fHx8fHx8fHx8fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vb295fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJioJFPj8/Pz89dY2JiYmJiYuMjIyMjI2If39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vbnmAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyNgzoyMzMzMzBzkIyMjIyMj5CQkJCQkIx/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV0dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8dnV1dXV1dXp9fX18fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z3enh6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3h9eX19enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x6fX15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHt8e3p8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7en18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eHl4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJxcHBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNzc3Nzcm9+e29vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3VycnJwc5h7b3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXF0lXxwcm+IoHZwcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCUoXVwc52gdnBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxb4mxkW5+pKB2cHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJwg7OpfJCvo3dwcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnCNsaerqK+kdHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdZ+iorOlm6N6c3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh3eHiApZ6apZ+ko496eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHt8fYqikJCXmpeZknt7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+hqappJ6gm5WVf39/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYCKsaipoqGhq6OCfoCAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/gICAiqeun6ijoKGlqaSMf3x+gH9+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CBiJaqrqSbpKGgoaGhqaqfjoGAgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOChoyapqOdnJqglJmhoJ6dnqGfkoSBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyPkY+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4qSlZiXmZiIkJ2bm5yYkImFg4ODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYKDjJaZlYmRmZySi4eFhoaHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOCgoGBhJCXk5aZkIWHh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKDg4WRl4mEhIODhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKCgYiRgoODgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgICAiZOAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2JhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf3+Nl4KCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgJObhYKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSSkpOPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fHyLnI2AgoGBgoKFlJSLgYKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXi4CDgYGBgI+TjI+BgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSFg4SCg4OCjomFjIKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhoaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeGh4aGh4eHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aHhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiYmJiYiHhoeHiImIh4eHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeIiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoeHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4ODg4WJiomHhYeFhIWFgoCBhISCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHhomJg4OEg4WEhIWFhoiIhoWDg4KDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4SRkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4OFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn5/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fH17enl5eXl5gIKCgoSDgIKDgYCCgYKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42EhISEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgYSRkY6LjIuOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18gIGAfYaPgX59gn5/foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoCCgICAgYB/i5SPjIyOjo2IiIeFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf319foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2Pjo2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjY2Mj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fX19fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHp7en1/gICEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+AgH9/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJi4mFiJKPjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkZCOioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX5/fnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7e3t7eXp6eHl7fn+Dg4SHiYqHiY6QjoyJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enp5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yIhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGCgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F/f4B/fn+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIaGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX5+f35+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4CAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gH+AgH+BgoGAf35/gX5/gIKBgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fn5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgYCAgH1+fn+AfXx+fICAgYCAgICAfIB/gH5/gYB/f36Bf35/f399fXx/gICAgH5/fn5/fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICBgICBgYCCg4KCgIKBgYKBgH+AgH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgYGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGDgYKCgYKBfoCAgIKBgoKBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4KChIGEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBgoKCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKEgoKDgH+AgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe32Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/f4WEgoODgoGDhIOEhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYaGhYWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4aFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWFhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4WGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhISHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOCfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH59f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgn1+f39+gICCgoKEhIODgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSEhoSGhoeGhoWChISDhIaFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYSDg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2NzY9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz1APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqbO09LS0tLS0tLS0tLS2ZE7REREREREQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/OzxCQDg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKSnzdPS0tLS0tLS0dHR0tmUQEhJSUlJSUlISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8PDw8Pjo6Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM7T0tLS0tLS0tLR0tLZmU1UVFRUVFRUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PDs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLV1dXV1dXV1dXU1NTV1dDLy8rKysrKy8vKy8vLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD1CPkJCQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6znqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWroZqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OTY/Qj9COjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ai5uhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5nIedlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8PT05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqKPnIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A9PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6SlrJuoiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUE4Oz88PTs8PDc1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izLa1r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GP0hIR0VAPDw+Pjw9PTw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nAo5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEM7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqKOrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKjJkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PD9HRUdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NTg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FEP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqaqnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKinqKinpaSkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6alp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKjoqGfn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6kpKGfnp+goJ2cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlo6KhoaGhoqOlp6amp6yrp6agnZyboaGempubnZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqanp6enn5uam6KgmpWXlpqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYmJmanKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhoJaeopKYmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUI/REE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpKWop6ainp2foZ+eqZ+QlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OmpqWlpqempaSlpqalo6CgoaGep3mOj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnZ+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKkpaSrsKOkpKOioaGcopZhkZWZm5mbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpyfoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjqrCroqOioaGemqZzX5eamZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgop+dm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnZ2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoa2SqKWhoJ6cm52fXWSam5manJmcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaKioqGhoKCol4Gsn56dmpikiFhmmZyanZ6bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpuampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdn56foKGgoKCgo6Rvm6SdnJqapXliZpicm56enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enp6neYekm5qcnaB4a2aTnZydnpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Ojw+OT9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cm5ucon6AnJmbm52VdWpnj5+dnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmZmamqp/fYmTnJybiHFoaI6fnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam5ydmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmZiZmZiif4aCgpmenIFwYmiOn56dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmYmZmXoJubfHqbo5uAh2tlkJ+enp+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5yamJmZm6mciGduraqMaIOBbJSfnqCgnp6dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iZl6CmiHRfZZ6Wgldye3qbnJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuam5WinnRSTW+VhHhJWXB3kZSRjpKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkZGPp5VTOUB0iXFnRTpVb4GHhoKNi4aJin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoOAiqh5TmhUdIt3ZU9VQ193foCCkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoJ+foKgX3WMYn+nnohdhntRa399hY6Ni4aNlJKLkJePlJeSmKGWnpaVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIioWAgn2MlmO51I+9uqm3h3R8aVl/hoqOi42QmZyUlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYyLh5KJlYKBz8Sc1a2asJ5fgnFUepGJiZCPjY+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU4NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZujoZxuj7qkuNGxqK6TbLOnVXSUj4uYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVSlRPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqaupqbCjdI2VfrG8s6uVh12WxGxvnKKhpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09ZS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6iqr5KLdnunl46Pf3pqbZF6b5ajqKegoqGurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9WWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZmcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpaOhoauUfFtpkX57gHJva3Nxe3uUnaKioKGfoaGooJyeoaWhoKajop6koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqCjp6GmraenoqynfWxTW3dvcXZrZ2RqZm54gY+eoKGgnp2go5qWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY19zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaioZ+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mutLe2ubauj2pjT1Zua2tzaGJkYltgZm92gI2bo6WhoaKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+foaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqptMLGxsjHv7OmknViYEpPb3FtdGdgZ2dYXVtgZ2xvdX6Jk5ykn6GhmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuywNjh3tXGt6qdkXxnYl9GUmpucXhoYGJpWVteW1xdYWJhYGZ8ob29qKSYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1tr/J1dbHrZiOgnVlYGNcQVFsaHV2bWJjZFpZWltYWVtZV2eNtcC/tq6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9vsHI0M2tgGZdWVdcVUJKcWhtZ3JnYV9YW1dZV1RTYo68wri3u7C1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFxcHBwL2OZlZVV1JIRHRrYmBvZ1lbWV1bXlhjjLrFvqWlsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbBsZTHyraFXlZUT0diaICLjFZVXWBhXWKDscG5rrKnq6ioqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubXAtrXJz6NrVVVRU1+YqaVRVlteXmaVwLemq7O1ra6lpKOnpKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7dm5raWh1WmZyeHN5ZmZeZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxb63vcPKun1VVFRMj62eTVRXV2iWu7Sxray4tbKsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYWBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHv8XHw8fCi1hRS4awk0lPVWigwb2/uby6vLq8rK2mqbu6ube/srW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzcXFxMPFx8mndE16sopHTnitzM3GxMHEx8G8vrSxsLDCvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRjXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcHBwMDGy8OTZH1kS4PJycvQxba/v8DAuru9tbOzwL+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBwr28wcDAxJNQSXPJzsTI0MGvvb24ubu7vre0sbm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWl1ZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMS/vby4u7/FeUmgzcS/v8m/sMG/ure7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HVjry+u8O1use3trm7vLi5tbrEypdNpcjAv7vBvrnGvcK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZnBqZWtoWFlPS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXmty73Ht7m4rba0t7mztbK7xcqfUKTJv7++vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJuYFxUSEtLREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE2K52hL7Iz8LAuK61tbu9t7mxvsPHmFGizsPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRud2NnYlxjUUtVSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGZc3ex0dHMysS1ur/EyL6+tL/Aw41Vls/Gwr7BvL/DzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRsbG5fY15hYk5ITj9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrCh3V3qMzMy83KxsLDy87BvLi9uruBXYvMxsTAwL/EwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApnt5fJ/ExsvIwcPAwMnKwb+7urKuemx6x8bFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4dGhwXVxfXFpRRUVETUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbZtr869trnAvKp9bmhubXSCl5l1en+cvr/GwLnAvL7FxL29uLGxoIZ7cbzIw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVxfX1lTUEFGSUdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2xdYK0vbW1waSGaVpeYE5TW1xwdnqFpLi3wrqzu7e7vb+6u7utrqKfioOvxcPDvry/u7u4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXuCenN2dnducWFfZl1bVUo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpoR3i6KwtZxqZmdWWV9JSU1QVG97i6mwt765srWyvLm8trm+sq2wqZeUlcfHw8C9v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FcXk9JQj89SURGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqiHe3aMoZhfU0NZVUhialVPRUplkaWvr7a6tbSyrLy5uLW4wb2hsbCko3q/yMK/ubq1rqWss7GmsK2onaCfpa22tcK3trSlqKqosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLa2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWZZXV1TT05BPkpCQEtKQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTktAZVlCT3iBk2hNQ16FsbWztbK0r6y7uri2ub/FjLW/rq1urL64tbKxra2fpKannaSlnJaZmZmfqa65rKurn6WopKuur6ewq6+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1bUE5IREdNQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO3tpWMiIR7WEZBT4dYSUpZeI6DY0FVo7mztLKwsa2wubi2u7e6vp6wta6vfqywqautq6OooZ2dnpeXoJWSlpePmJ+orqSjpKCipqKjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodXRuZVVhY1ddUU9NSEBJUkRNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrypmJmUaE0/U3lxT0lJTGidf1pFVbC6sayzr66srba2srS1rqmlnZmanJ6nqJ6gqKmfoaeWm5eXjp2Uj5CWjZebpKigoKKioqWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqirq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqGIeIN8dn96Y3dsbl1RaVRQTkdQTUxDUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvGZEU5x+UFhJS2FJV41iZWWDr7WqsrSuqquvsLKzraWdkZeTj5ign6KgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso56enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfnx/dXZ9bmt7ZGhWUmRNSkhHT1NOS05IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/yp5OQXaZbk9tSkxkZnZ0YV1idJKyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKaipaKamZ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyWm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd5fGV5eWBiU1VgSElKS1NUSVNRTTk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWU0pmo1lmfW9yW1JrY1xnYmBtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGYm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ6gnqCloZ6epaCmmYF7gXx2dnNogmxlW1NbWU1RSk9PVk1TTUI3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2N3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKirqLO2uLO4rbK0pKCdpaCsoaGioaCamJaVn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgoB8eHZqd3VebVtSYEhSVUhGVVdKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dLW1JaTExRWVJIT05ImayqqaSfn5mSkpSYmJaWlYyIi46VnZydnZ6Xnpmmn6CopbGqp66jq662sLSysa62uL2/uq21tLC3sK60qaakpaypubO1u8O8w8G2urarrrG5uLyvs7C1wry3vrOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fqKilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXdtaG1cWFtDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkJSeKmtqaqln56foqOdnp2anJuUk5WUnp2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Svs66qr6OdrKi2sa2jsKago7CxrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnFoVlxRRlVIREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrKno6OioJ6lq6Wel5yUkZmdmZWMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzTx76/wMK+x8bCt8PKycPBxr66tbq7tbu3sLayqrqyrru4v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Npb3hrZVlbRktMRURUTERDRTc6Pzo1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWXxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCMgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czMzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN1NDT08zKwsXGxsrIz8DJ0czHxsjFwrzDwb6/v7a+s62/wMPDx8XHxK+/ubK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWkNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz45O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoWepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NHXzcbHyczDxcrPytPX0tfS1dbT1MjMx8zNytPNztPNxcnKysHHzMfJyca/w7OzyMXLy8vPx8q/vr+9wcbFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpCLgHpydXZnY2d2amRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Ow0r2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHJvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0crS1dbZ1tfT19jO0srP0czP0MzT0MDIx8rEzMzMzs/Fx8i2v8rA0s3Mz8bKyL/Ew8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11hbHVzcHBvbHJxdZLEyMfU1tfX19PW0NXU2tTUzs/V1NTR0czQztTX1tPV0M/S09HJ09HI0NjX2NHX0dfZ1NXMz8/KzdLLztHAxsPIxs/O0dHSyMzNwMvMxtPPzM7IxMvHx8nMytTU0dXP0szTwrnFsaWota6nm6irpZ2yqLCzrayTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTUA8PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/QD1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BlbXBwbmtvcnZ3nMzB09XT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUy9DU1dbO0tDY2NfYy8jOxMnPzMrMwMrAyMrOztDL0M7OzM/PyMzQ0MvOysPKx8nNy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZW5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NztTMztLNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIysPMxMbJysvPy87N0M7TzMbJz83Ix8vFx8HGyszNz9HH0M/NzszQxcfBuLm9w8O9w7iysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHw7jK1dbZ2tvYzMzPyNbVxMK1r7Son62XeGxwcXmQm42Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JycHJzcW1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsXDx8DHzcjEzMvMz8jExNDIxsLGyMS/wcfMy8vOwsvMycfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry5zMzG0NXV2Nrb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXV1eX2BgX1taXGBscnFvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMrNycTCy8nBwcvQxcvIv7nCu8bHvsDGz8vEwMO7ycfJu8nHxcrAvsLLxsXEvsa9vMHDxczFxbzAycPFx9LFwcm/ysnGyMbRw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdFTERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxeenyhkYuSloZ6gIWFf3V4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc7Dxr6+tcG9w7u9xrvDurS8xsTCwre/tra+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszAxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhLQUVCRkpAOTo2NTg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrJxs3NztHI0MXV1NbXzcrOxcnFx8G5xb2rrqVfZHWDk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmJkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wbitsLGnqq2sp7i0trSzs7S7tr2xt7C1r7K7wrzBxLy/u7Wyur7AuMi5tLu3wcK9uL3HwcS8ta+ytrq/tMW3u7WruL2+wL2xurawt7qzxry3r7u/tbe1xby+w8XAxMXGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXVZeYEZLSEhKRkJEQUVFPzw6NTY2NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IycjKyMrEz83Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmlmam1ucnykx8C4uLWwq6ynnqKpp56qrLOtqqyqtK22sbOprqess7u6tsO5urqxq7W5u7TCurDAsb68u7a8yLnDtq2qqLCywLa4vbCxp7GztLu8q661pq62rruysaq5sK67rru4u8DAvrrDv8bDxcC8xsHHy7jFx8W/x8PDusTGwrvGyczLs7nCvbuziXN3dmtpYGJsaFhXV1tBTEtNSkVBQz9GQTo5Ojk5Njg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHE0MfNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIF3bl5dXFxdX2BfX2RjYmNkYmBfXVpbWlpdWlpZWlxlbm9oZmhpa25yga26sLWupaWnp5qgpKCanKWrraSooquqrKuwo6afqq20trG9ua+3sKiuuLSzvLi0va+4ubWyvMGywK6lqKOrsbKzqL2qq6irrK21s6WorqGkr6mypqiorqWot6yxsre6uruyvL6+vsS/tcHBx8i3vsDEt8TDv7u/xMK+xMjMyr+/w8DAqYdzdHNqaVxhb2NXVlhQSFlSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8e5ucvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSal5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrSrtLqxtrautrmysLq6sbeloKSfprGoq6i5qqSnp6insq2gp6afm6SmrJ+fp6OgobGtrayytLO0sLW8trvBwLK7vsPBsbm5wrPBvsC1uLy9vrzCx8XDxL/AxKCDeHBsYmZga29gVVlfSE5nT1RHRktGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz45Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tr24usC6vbagnpSdoaa6tquzs7uzxM/Jy8PGuLfHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaORaXKGhYaAfHh1c29tamlpcGlfYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4idqZ+WlZqhlpuimJWMnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqK2rmaCfnpmdn6WamqOcnJ6vqauoqqutrbCyuK+4ubqwtry7uquzsrmzvbS2sbG2tb+2vsC+w8K7ur2XhHpza19lXmRkWFRXXUlXXEtPR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8XPyMjAxru7w8PPvrnHuLe+t7LCtLG7u6y5urGinqmrp5iej21+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaeck5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKfnKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craGrp6Ojpq2rsrOqtbCyq7O5tK+qr7Kys7ezrqmtrrK4sbq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vry/s52lo5ilscK1tr2ttLjBzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanagm5OTj5OWlp6WmJOXoJ2hnJagoamkn5+pnZubq6evsKuco6S4qqGgrqi2qqenrbGkuLCkt6CjnJmZqqehmqy5r6KhpJyioKCTlKGUlpabmJiWl5yVn6meqaSinaOqqrGtqLSsqqets7Clqq6zsbCwr6+nqKeyrrG0r7y0uriuo5SBenZlX2FWWVhTUlNLTV5MUExHSExLRT1APj1CPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrry7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYVxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JiY2ZpgZWSlIuRk5OamJyVlpyfnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2WlamhopStsbGfo6Oenpibk4uhlJGTmJiTl5iYl56nm6eiopqkpaWrpKWwp6Wjq6utpqiur6+rqKqqs6Wmq6+0sa68trGvr6CSendyZWFcW11YTkxRSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLe7vMHFurG5tcTJycDDxsXHtsXEs8G/xau3t722vbq7tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZpbGBdXFtaWlpaXF1cW1xeX1xaWltZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZGmAkpKIj42TkZKclJWWpJmgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaueqKKfrqypqa6toqKilZeim5yQq6mwnJ+in5+XmZOKnpGNkpOWkJiYk5yho52koaKVoKKlpZujq6WipKukq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZQTkhaXFBSSVRLU0xFR0pEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSstLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9w8issbjBtbzAvLS1qqymlZmbm4iBcoiDe3RpaWpsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Pg5CFjpCNmZOUkpyaopyboampq6isp6mmpJmlr6WVmaWvqaCcmZuhnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGhm5SQjJmOjJGMko2WlZCdoqCknZujlZugo6GYoqijo6iroKuvpK23pqOkoqytqqirr7O3sr21s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3r6ior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfYqPiZKNlpGXmaKgm6CrqqavrKixpaman62hlZalqKedmJCPmp6ul5moqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQUlJMTFdNSk1PUkdNS0FDRkREPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qlorGrnaqnqbKwpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucmtwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95fnSHjIaQiZeJlJSYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbpJCVo52WlpaIopubk4uOipCapaeclZWXm5GSh5SOi4GMjYCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrihnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBSExISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCppqSzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+tn5manZWUh3uDbl9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBh3+Qg46KlJGTnaGPmpyjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjoKUfn50io16kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrLCsn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTUNTTkxQTUJQUUhJTlJNSEpKREtNRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdprato6CPlZaSkH13fmZXVl9nZmlnaG5jaWlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSKgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIaMfYmBkY2Ql5qYk4uQip2In5iHiJaemqGgl6euqa2oqJ6WrbOipq6ZrKuYqLSjqa2jk39zbl9bTlNSV0xEVEpQTUxGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCmqaejqa+op7TCubC1sMfCt7O9z7+5r661wqeqxaqinZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTU9SVFZYWmBsbmd6gXNQQj9/lZKRfYiVjISKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnx+eJR2aHeGiH6KiZaLjpGSloyEioiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaplqKqnKKmqIl2bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivrKq1vLa4trPBu7aouci4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX1paFxUkImUiHR+hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSeGd1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmI2npJKgoJaen6SBc2hhXVxKV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPTc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+qpa2rsLGqvbSyvLi2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX52hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaMlpiNjnxneYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIZsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V+d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnJqdnqGclo2LpZqOnZeOlpiQeG9tZmNaWFhVUUpTVVRPUE5QVktOS09PSlJPSE5QTEZEPDw3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsKyuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJiZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3t5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c42JhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Si5KNhpCWgG9qb25vWFZYVFJRWU9SVFRSWFVNTkhNSk1PS0NJTkdGQDo5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpaywo62qqLWvrqy0v6u8w7+lopqVpJiejYSLlKGhmZmRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4dhmmlzeWV+b21/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH59g3RmZXV/hISFgGZpbHVrcX98aHFxfG6TjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhSWldZWVtNUFVWWVhOSUhFSkpIR0JAR0VDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorZ6xnqe6r6uysMKxu8PHmpaPlJmLjoV6hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvsqBxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnCHfId8dIyujYmAaGdiam5ybXCCdWlvWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GLi46DdXiKjoB+g4B9jntzcXFtYFtdXltZWGBfUk5bWlhXTEhKRkpHP0NBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKefr5WltKmusa7BsrvBxZaQjJSPgIh8boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz4/NjQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH6Fg3+MfnWimXl+hoGEmYSanGGGqp+di4OQjXp3iH6JiY5zi5ePhHpdZHF0enx3im1oamJ5b4WQgnpugXd0hHpwdHl4a25pXXaGfId8h4eOf4qSl4ONhYyGfXGEf4R9dXd7fIl3cHN0ZmdgW1teU1tnXldQVFhbVUdKSkRLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZydn6aRoKqgsaivwLG6xbqWjpGUh3uGdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NjY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOLgouChJKph4CYmIqbdG18gYaHfY5oZ2h5f26Fh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd36AdHRybFteXltjY1hnZVtUT1BWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYeRjpaXkpegnqyhprivs72zl42Si5iLfXRwfomSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjQ2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UioGRfHGDnp+RnH92hoWLkIeQamhvg4F0jYeEinGFgneHf3t2hX1udnVmf5SOhomIh4iHoKuilYmOl396goh6eW9na3h+e350bGVdWltdal1hZmBaT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ3g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+KgG1wal1CQDQtLS8vLi4wMjIzNDc3ODs9P0JESElOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcKux694upSafI2hnpmEk4WCjqKfk5iShIqFj5mRlmxwdYmMgpaMjY53j4RxbYWBipaRg4WIcYiglYaSiY6PlqS1qZuNlKKDh5ODfX9ramp8gYGCdGJeZF9bZ2tdbGteV0tHTlJRTUxMRklQQ0RNRkFDRUZCPTk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZb4JvdYZxdpKGfpeWmpSenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpCCgICLjImFkIeFiYV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiJWim5t4en6UmJKhk5eXgZSee3eVkquyiI2Xn3yUnZuOkpWYo6Kmtq+dkZmoh5aPjYGIbHNzfYB9cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB0YG19YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKStrKynqLSrsLaysq27sbO9nLPDq7rJy7fDv7ilorCzrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgq6GkqY+bsIuVo6a3upugo7CSop2inpCjoauvrLK0opSkqoiZiZKJlXp6fYV/aGFoXGViXWRkXmZnX1pPQ0lIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExoY1dpb1h6hXaBk4WHgpuDkpCMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgIuFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTQ/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENFQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm1qKO0rbCxm5mSmp+Ip6+rpZR2n6SXoayys5iWqq6orra7srqsr7Wisauxtbu3tK60oKeoo6eaqa+tsrm3uKabtqiMpI6Rkp+GeIKDdlpiZVdmYWFjYGBmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaTdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhoiFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA/R0tGRkM7PkA3RDc/QkpKRUZXVFBej6Sto7G0w7a4wczJtrvEvbOzwLa4wbW+r7d0sbOlusSksMa5sbOxtKiktbaqsaCilpuikqWwrqatrKekmKCstLuiqLK6tby/zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy7wcGrmbqok62Pl5eqiX2CfWtXZGJZa2VqZVdcY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhICNg256c3iHYrmhmaOJlJSWkpSTjZCWkoeGe4aBjZWKgISBinp8ioeGfYqDgYqDlX13enVlT1xkR0VMO1FjYVteU0Y/O0hQRVpjUVJZWFpnWVRgYE1TUEVBP0lKSEVFQUBDPEU2Qj5IR0pMU1pUXZOuuLW6uMi/ur3JzLu8wLu3tbu6tr20urHGYHWypLGanqu9qqWoq6ukorK1oKunn5WWn5ifrqWnpqWfo5Sjp7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcLIr565qaGrjqSotoiBgHNgY2JeWGJgaWdSWGBWUVVJRUVOS0A+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi36Df4J4e4uDh3yLeYGKgpd+dH16a2VwdVldXFBlZGJgZWRdW1hXXE1kbVVSbW1fbl9YZ2RVWVVKREJLS0hGSEhIR0FJOUQ/SEtUVFZcWluTuMC4vbfGwLu5ysq6trm1uLmyt7W0rra2mGR1qJytcF6irJyYoKKbpJ6rpZSfn5CUjpaYl6efpZ+empmDpJ2spaqwrbiwvbnU0c7W0MnM0szPzsrGv7/Cyr3BvMHAxMTFyr7IzrOku7C0r5qruLuZgHtsXmFdWV5hWmNjUVtgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYeVf3N7eWttdXtocmVpbGlmamloYGZpaGxabXOWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKR0pPX15iZmlhl7fHsLiyu721scTGtbC4sK+7q7Kxp6u3rIy1p52ap5pOmp2Mjp+WkaaYpZWKk5OJkImQkZGdm6GXmpWWh56ap5usr6iwp7S01NTU1tLLz9TVzdPPzcXCydC/ysnKydHHzM3C0NK4r8O8xLmltrrDooNvZF1dXllgV1lmWlFdV09QQkJIRUJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMmpuXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaIFwbWNqbXB4aXd8fsu/wd+nbmN4bmNbYWBKUFJVTlleUF1cTlBOVFFVVFxubXaCcZatuKy0pq+2qqy8wLCrtKakuKarrqCrtKKOsa2al5iMkZORhI6bgY2mkZyJg4uEiomEi4OUlZeXk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNy9LT1NDU0c7Iw9TRx83S09PXzNHRxdLWxcDOx8fCqL63z556b2ZeYl1XYFNdWlBRVFBPSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJiTk4yLk4+WhHmFkJCNi4qHkYd/gntyfoCBh3mEdYWTkIh/b3Zya3N8fHd7c4F3cWqAc3JpcHF6eXJ6vsuafoyyhHZyhHZoYWtdQ1paW1ZlY1hkalNYXV1gZF5jd3p+i4GYqaOkoZ+gqKWqsLiqpbOjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqUooyZhICFfpGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzDw8yMc29kYWBYVFlUXFBLR0pKSkA7OjtEQUQ8QkM+R0I+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuViY+KiI6Hj394g5SYio2IiIuJfoJ4c3t9g4d3f3qHkZaAg253cG11f3Z4fXSFfHlsh3Z0bn12hHV4e521jDtBisWlfox8aWVXSUNmY2VjZ2pkbnhbXmZoa25pboCDiJGLnJ2gnZCXmJ6jo6axo6Ozn6GlnaCpoKOxnIaekpKSkIqOi4aDj4R+nJuMjYKEhXqUfoKplaOMkYqXkot9l4qakquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydna0da+y8y0eXdvZV5bU1ZSW1ZGR0pJRUU9Ojc6QEBCOkdEP0RDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWWloiOg4eFhnqEeXF6e4SGdXqFjo2deYtwfG9ven9xe4Fxg4eAbo56dXd9fIJ1fnuGh69zWKnCto2RgnBuYj1eaHJwcXBueHaBZWhvcnV4cXqLho6TkZuVn5WHi5OboJueqp+grJyhmpifpp6fq5mLmoyQkY2EfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLycnMy9DJw9LK1NfZ19jX1dvX09nb1dDb2tHWyNTLlXp8amlcW1BTVF5IQ0ZJSD5BPj03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+DfHyEmI6Hi36GhoB3gnlue3uHgnR6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShXR8gIR6doZ7ibfFpMHJuIKVm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdm2TlpSVj5eQg4mOlpmXlqWcl5+WnpKSl6OdmauVkJCJjZGCjIWJiIGGkJGem5mJhYyBhpd6iIifl4+IjYqLgn2hiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNydHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8e2hqZmBUWFVVTUxETkM7PT08ODo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hHt+gZGJhIV6hId6dX10bXx9hn5zfpKdkZ6DkXyGfniOfXiKim6CmoB0mYZ9gYiEe32Qeo+ojo/DoLyMnKOcfYmEfYlyi4p+c6aanJiThXuOkIiEaEdxoKSdjIuQkoWJipCSlY+cmpOUkJaMi5WfnJSglJGNjY+KfpCOjouEiZKWmp6fiYyUkp2Rgot/pZmIhI2DhoSApYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXlta2ZXYFxTUE9JQ0xCPTw+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF9WWGZtbW1pgY6KcXJ5int6f3x/e4d7fHuLh4F+dYOFeXJ6c22AfoR+d4WboZqelJKAjIh/mIeAm5Juh6iFeqCLfJGNgoiEm32akIqMo6KfkKOuoIuRi4WLgZOGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5SMhoiMkpOMlJSUj4uPiYeWm52PlZaQi5KThYCLiJKNioqdlpmio4aTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aWdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX6SpqOfpaKWip2QlJeLiqiXcoqxjYSnkoSZk4SZjKKVn5iTiZqdopKpr5+QlZCNjoiWjG6Nt4WaxMiym6Glm5yYlpGykWSkzceVjoaHiY+SjY2TlImFiomFlpmbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ+WmoiOh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3OBaWRfXl5PSlVbQkFGQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCCe2xui395fHh4fISHi36Lo7Ooo6uyoZanoKWklpWuooOQt5WSs5mNoaCLpJuvoqSdmJCnlqiZra+kl5WVlJCLmJmWoMCOo8m4q5qipa2ZkZqcsp2GhaiinJiFiImOlY2Lk4+HgYaHiJOYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUEhKT0VCQ0Q1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYTtIhIt6em2Fhnl8hHiAhYF9cHh8fXxvc416fYF7eIaLiYWEkqi7raiyva+lrrOzqKOisKyKmrSeorillaykl6mtt6ako5+ZqZiqo6+wqZqZnJSVkZegl5m7u63JoGm2uKuwlJieoquSl72jXqqygomKjZWHkXyPjn2Dho2PlJSIh5KWi4+VjYqMlpmSnZqzlpWrnoublJKNkJKMmJuKkp6QjImVn6KNlY6Ymp2Tm5ielKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL06JxfGpeW1VfUlBGRD49Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlSGJgY3BKQIuKfoByhod8gYl1goqCfm19fXx/cHeHd42Bh3uNj4yGjJqrwsCwvsa7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiGnK29sIOLi4uQg4+DkY96gYeQjY6ciIiPl42LlZeUkJqWnKeasZqRq52OmY+SjpWQkJaXj5GgkYiVm6SslJaPlJyelKCem5igoZSanqinpKGjsLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqJdXRjXVthW05LQ0xARUY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZ0dgaWdaXVuTjIyIe4eLhoOMdYaQioFufnyCf3F+gXqVepKUlJiRk5WntMbJwMLMwcO5yLy6r6u5u5eytrqzwK6lwKSqsLu7qq6roqKep6uutbCqm6CqnKKclZ6wtKeLorq6tcG7q6icsqSkqJSEjqnDxKSCi46HiISGlZSNeoOMkY+RoYyMlJGPiZifl5OZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56Um5SgoZmkn5qgnKCUmJ6mpKanpK+tpb/Ewq6pt7XJw762zrLFvsO8s9HKyMG1dnpuXVlda1NNSUNMSkpJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZ1xNZVxmVGNqmY2WiYuIko+GiXmGk5CBcoB8jX53h4GCkHqNoZaompqYur7IyMrC0snKws28wbOtu76nur++vMO3rMGprLO7vaqwqaSlo6uutK62taCfrp+mopijtL2pm6i8wKO2tq+rkq+sqquWhpqppqWRgoyTpZWJgHWKknmFjZGQnp+TjpSLj42Uo5mXm5SUo56pn5GlmoyPj4+Vloh9j5WSkqOalaCinLWmkZ+XpaSjpZ6eppielZebpaOpqKKyrKi7wMSvpbO3zMC5rsOzu77BuK3CwsHAmW96Y1lXXFxMTE1JR0RDSEJCQUNLOjRESDo7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRlVp6PnY6Xjp6SiYp/iZ+ShHiFf5V+f5CIipCAlaCZrqejmMK9yMTIxtPNzs3LvMK3sLq8tLzKvMPBtra7rbO/ubytr6igqae2ra6psreanq2iqKGdq7e4qaWvvsSxvbizp6mzs62ulpWlrKegkY6SscWnlY18kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJeXkpalmmaYo5+zpZajlqytq6ebn6eYmZaZlaGkqKaetqupurzDtaW0tsvBuKq2rLO6uK6ouLq9uINub1tYVVZPRktTTUs/QUhFREdGRzg1Rk07Pjc+QUouMzIwMjVCNTVQV047TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeployQg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8fOzs7Syr67trG6u7y+zrbEvbe4t7KytbO4squmnKuruKqpp6+wl6OupKekpbTAsKqss77CucC4s6e4s7ezrpWlra6upIuTlaGNc8GZfZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi4yPlp1gSpacmpSapZdUlrCfr5yfpZSvr62lmqGmlJOZmY6doKeimbSpqrO9vLursLLHwLmmq6utsbGjobKytKRycGZdW09RTEVQUFBRO0hLSUZIQUM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UkVXUnNiV0ZIq5eZn6Gpr5iQl4eLp5aOiJKFn4iEnJePnqCbo6W1ybSpxrvDxMjKyMfMzse+urOvubjAwc21yLrAubW6sa+vsrSno5uqtLSqqaaurJmkrqWlqa26v6irtra+wb++uLOxwq+3vaujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqqZoaeel5CNkZ2DbnaTopqVnaKfkK6yo6uVqaqYq66lpJ+lqZKSmZuIlJyinpawp6mrure+s7Ktvbm2n6OnqKWnnJysqamNZWdhX1JMTUdHTkpWTD1NRE1JSkFDRDxRVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVkh/ZV5IRqyUnKGfu6+YlJ6Lk6qbkZKTiauNh6KejKSslKOjtse9tMG6wsLIycXCzsjBvbmyr7m0wMLKtsaxwLy0uquprayvo6KYqrS6pqmmrKqdqK+npKurvruorLyzt73GvLe1uMCwvb+zqbS2q76kj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sai5eJjaSilJyin6C1r6Wlk7Grmqysn56ko6mSlZWgg5Cen5yVqaWiobS1urWtqLWys56coqaal5WZqqGed2JeYF5LSUZITVFJTUVGRkJSSkhBREdBVlNESDxBR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmhdRkREnG9iR0Wol6SensOtm5ell5mpnJaamo+qlpWoppWtrJmhqrbEwry/t8HDwMfEv83Gu765srC4s7/DyLW/r7y2ubemo6urrKCgmqqqxKKlqKymnqyvrKKqqL64pqy9sLe2x7a0ubi+sL7BtrSytK++o5ajlpOblK2fkKGipaOjn5C+pamdqKydnaGbpp+9opiknqKpq6Gdlo2VnpOfh4+FjZOepKCdtaylnJayp5mwqJ+aqp6gjZmVn4WOoZqbkqWkmpissbaxqqWpraycmaChko6QlamflGlkWmFdUEpHS09MSEVDSUA9T0hAO0dJSFtST0s9SE5VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2drZ+So56WpKCnqqyXtrCjqrO2xMO9wLa/wrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6atqqudnp+lpMGloKquoKSpra+ipqe9taWxu7e2tcOys7e6vrHDwLi4rbO0taKcpJWRk6CtoJihnamoq6Kaw62pnqyum5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqahoLiqp5OYtqOfs6Kgm6+Xn4+ZlJ2Cj6CXlo2ipJWQpq6yq6mioqWllZWdmYuPkZOkn4ljZVtkYExJSktORkVBRks+PUpBOTlKSk5dUVFKPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiexKelorOhnLKnk6qkn6OframsnbuwqKy1ssjDwcKzwsS9xsS9xMq9sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussZyqoq6wqaSnvbemtrq9r7fErbOzwr+xxrO6t6u0tq2qoqWVlZSjq6Gfn5moq7CurruypqCpqZmZl5OipLihoaSSrq+spKafkqGelZ6PkY2UnZqjn6e0p6eMmLSco7CanpuukZ+Ul5SagJKilo+OoKGTi6atsKWnopygnpKSm5SFi5KNnJ6AY2ZbaGZLSUxKU0JDQElHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+bn8Koo6qxoaO0qZayq6aipLKsrqm7sq2wtLTGv8TEtsDEvsrEtcDIwrWrtaiwuKzAxLS3rqy2uqWZq7GrqZifppetu7WbqLCbrZ+utLKnqrqzp7qyt7K4wKq3ssK8tMWnvq6tt7Wpp6yhl5aRpaSiopeYpK+4rbK1tqCfqKSZlJWTo5+3o6Slla6xsqWppaKempqalZeon5+Yop6usqKmjZeumaWsl5qepZGbjpSYmoWWn5SMkJyelIupqauip6GZnpaMj5mQgYaWiZSfeWRpXWxqTlBNTlQ9QkFOQzs6SUA3N1FPXV5SVlFBV2BcQkpTSFdLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVxjWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOcoaW/pqivr6Gptaqdua+rpKq0t7Gwubawt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3t6qtsryila2wrbGWpaiRqrmqoKewnaqfr7Szqqm2tqy7q7KyubesubDBub2+psOrsLeuqKqrpp2YmKqhoaCRl6CwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepJyhl52js7Cbn5CUppqhqZuVop+WmIqVmJOWl52TiZCbmZSOqamnn6SbmJuTh46Zi36NloaOm2tpbWFtblhRUVpUQUNFVUA7OklBNzpYUGReUFZXRFleXk1MUk5fS0o+WmReTklRTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoQDhsfWhcVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHDv8nEucXDwMC4xb3BuK+2p6u3sry/vrWprrG3n5erraitl6epjqe7n6Wts56rorGws6yqtrO1vK2vsbWssLWxwLnEtqu8r7G4rKyporGlnqSon6SXkJifsqqzqaqzmZ2nm5mUjaClpLSup6KsrK6xp7Kssqmjm5+npJ2UoZibqLWpl5mRkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6amo6CdlpWWlIGPlYV7j5KEjJZmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVJoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBMTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVjE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qq60uaansLjFt7G3vsHCtbS7xb7MxbnDwbq/usS4wbmztayqure7ur61qq2xtpiYqKuqq5usq4+rvZ6rrrGjqp+xrbOurrayubapra6xp7Wws7q8ybKqtbSxtK+upqGzn5qorKCllZWambGiraClr5ahpJmZko2ipaayqaGmsauqtaStsLWvo5idraeal56Zmay4opiTkI+YnKGZl5Ssn52UgZOZjZ6cmpaQipSSnpqlo6KgmZaSkpZ7i5CFe4yKg4uSa255bnV8YUZgalpJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJTYmFMS0VgYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipBL0pHUFtHM2NZVEtEmZefr6ixqaylo66utam2tLejrLS3ybq0u7q/vrW0t8PBzce8xL23vr/At7+9sr2up7q6t7fCt6ytsbmVl6auq6ejsqqUr7qkrbKxp6eisbOxsrG1sbiyqK6rsqe4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnaebn6mNqaKdm5WXpaWkt6eisLOrp7GnrLC1rKSZoayom5ydm5SquJyVjo6LmZ2imJCXp6KfloOSlpCdnJiXloiXj5eap52koJKWkZCWdoSQh3uFgoSMjG5xeHZ8f11LZWxcSk9jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RUxRPDNya0tEQ5GYpK2kra2rpqOwsrOqtrC2n6u1ucm5rsG7w7ezsrXCw8/EwMG9tL3Av7q/vbPEqKq5sba3v72vq7OznaCnsK2lprClnrK1rKuysKypqLS5rLSztay0rKmrqKypua2xsMe+uKS5r6mtraaorbClo6Ouo6mcnZuar5mio6KjkKyeo6Cfoamlpbikq7S0pKqrqKyutq+inaOoqpugmZqSpLSaj4mNh5GjoJaOlJ6glZOFjpSTnZuZlpSHmJKVmaecoJ+NkpGOkXd+joV8fH2HiolxdHN+fX5cUmRuXk5aZl1GRJZbRzpObVhhW01gYk5WV1ZXVFlnXlFSTGRaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZTs2KkhkSEorOkk/M0NJUyw+j2s+SEmPmqmqoaiwpKijs7SxtLWxsaGsrb3Luq7Bu8axtK20wsPRxMa+wLK+wsK8v7i8xaitt6yzuLzBsKuyraGkp62pqKSwo6uxqq+rsa6urauzu6e3sbKpsqmqpqWjrbqsqbHCubSsuaioqK2pp7GlqaSirqqoop6boqyVpJ2XnpirnaGnqKGspaOtrLexsaCpop+qrbCsnZ6mp6mZo5iYj6CnmIaDjoqLn6GQjI2XnZCQhoiRlaCdlZiVhpaTk5elnJ2ci5GQjYp/f4eFfHd/h4WHdXNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlPZFxOVVZVV1BcYV9TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRcQE1GlZasp6GqspypqLC1rLi0rqqkq6u9ybuxvrfDr7Cts8TEzs7Dv7+0wMPEusC0ycSsr7eusrrAv7OurqulqKqwqaaosqW0raqwrq2xr7Oss7qkuLSsrK6nq6CinrC3q6qturaktbWkqaesrKqsoaimprGypKaloaGrlqmgk5qgpp6joqqkrKKeprG3rKyipKKaqaqtqZyhpaSjmKCalY+YnZSBgpCIhZ2gjYqOjZqPkYuEjZiknJKRm4yTkZGUo5qbmouOi4t8h4GCgnt1gISBfnV3i6OHeWteYG5nV2aHZE5AZ5JMRGJ6V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQUlIRJaRr6SiqrCXqqittau2sKukq6qpvMHAuLmzvLWmsq/EycvRv8G7ucDAwrnBusLErrG1srS8wb6zsq6tq6yotqqlrbCqua+osLCusau1qra1prS2q6ykqaqco52zs6iopLS0oLauoamoq6irp6Cqq6i5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqOjn5mYn5GOj5mOfoeNh4WenoiEiouPjpGNhIaVopqOjZqRkpGOk5+XmJaNioN/dIeBf394dYN/e3h+gIidj3ByZ2dxeFxhc4hpT12YVkhteVVkVlJjT0xVVFVRT1haYlZIUGpUV1NHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsP0xUXy9JazdSRTuVja+fpaqtmaukra6ztK6qpa+pqbu+u8Gxr7itorWvycfI0cC/vbq8w726w8HAv6+ys7K2vbzBsrKzq7OppbWopK2zs7mvoq21sa+xuaq4rqqutquqnqqroKOhtq6ooZ6vsqG0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mpsKiin6yhoJKhoqOmmJqopZiYmJ2PioeViH2NhoSFpJeGgoKMh4+OkYWFlaCXiJGdkJOQjZGdlZePioWGeHOBf311eHqAe3R0e2qCh6N1aV5lbIF1Z4iLfFJXcF5KeHNUZFNRX01NU1pnTkxWWWVYR1NqUlI+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE87WEI0j46wn6SlqqOlo6ymtLOwqaSwp6q4vsG8sKi5qqeusMnGyNDCvcC+ub6+vMm8wrmxsLWyury5wLO0u625rKO1pqessra5sqanurWttLyvvKWtrbWrrZypr6Sfpayqp5ydqrKks6iaqqeqpKmeoqioqb2rtK+tnqmjoK6bmrKilaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmZmTkIqCj4V9j4KAiJ6Ph4B+jIeRj5CFgJSblIWTooyUkYuRm5KVh4l+gHJ6eX58aHd8enVwcX5phnmEiGRgaGRyhXttZ3ldXlZCV3ttVGFQUlhLS01wdF1IWltnWUVWZ09DPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RlxAKo6TsJmfn6mlo6GqpbeysaSpsaatucG9tbCjua2oqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1t7Sqnbq7qLG/srmgr7S2qayerbGjnKWoqaKdnKSwpq+gn6upp6GpnKOooK27p66xrqGqoqOtnp6spZefm6CinJ+bmaKqopqZo6OVlpOfoZablqasi56RkJGMgouAf4+Be5qUjYl9foyHkI+MioWSmJGHlKSJkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoJnY2hhbnOObWJqcGBvQV15a1ZeTlBRSklMU1lWTVxebVdEWGFPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTik9M1FdPSOSl6uYn5eno6Gfp6O4r62ir6+pq7jCurOtn7mvq6i0usfKx7+3wr6vtL63xLbDsrC6srPAtbu+uKm5uL2rpLWnqKqwrbmwqZm5vKOuv7S0oa63taemp7CzoJ+lpqegpZmerKipnqCqrqegppeiqJ+wuJ+ksa6grKGspJumpqiampueo5WcnJqdqaaWmp6okZeSmJ2TmZWhqpCaiY2Qh32If4KOfHyhjI2JeYONhYqNjYWIk5qOiZWfiJGVgoyXjZB9hHtzcHxxc3RgeXhqb3BxcGp/c2N6bGhmZGFlh4BgW3JqcU1OgGlYWk1QTEpHUFJRSE1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWzUolpulmJyVrJ+foaSht6qwo7S0qam5xbayrqC3rK2tsLXFx8C3v8K5sLW8t7+7v6+svrCzv7G9w7mpu7q4p6i1qKersKyzsKaZvLakq7q1rp+xuK+ppaevspuhpKCjpKGWm6+moZ+jqK+hoKKTo6SitrChprGrn6yirpebqqSonpeanaSTmpyanaWpmZubpJSUl5ScjpOXoqmhkImKj4V6hH6EinqPl4qNh3qCiISJjI6FjpOYjI6WmYqPln+Gl4uPeoB6cHF2bnB0X3h3ZW1sbGtphG5mcmlrZmldY3SBYFtrdWlaSn9eW1hPT0tISFJVRjI5XV5tUERYVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y203NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6mcpKGiobeprqC6uKWsvcWzsK6jta+tra+0w8O8s7+6t7Czubi6uLqvrsCztLmwv8G4rL26taWis6qnqbKrrbGhmsC1pKe1taiesrypqKWpr6yZo6ecpKWUl6GypZmfpKipnKKgk6Sfo7iopKeupp2loaiSn6ihoaCYmpygkpqblp+hqpuamKCUkJOWmY2UkqOopJCJiY+GeYR7hIZ9nY6Jiod6gYSHiYmRhZWTk4yQlZSNjpR7gpeOi3d+e2x0cWxsc2F3dGhoamdnb4VnaGhjZmlqYGpjaWdbZXtjYFN0VFxbU0xKR0lPU0AhKmheakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QTNDRGdbS1dHVWBoQjM3OWdPJzKeoqORjqOmm56enaO1rKequrenrMTBtrCso7Wup66vt8C/vLLBtrCusra2uLa2raq9s66ysb2/uK68u7Gkn7arpaW0qaqunp3Bq6ilr7KprLW7nqmqq7GlmJ6pnaekkZimraKYnqSpoZuinJafnae2pa+qrqGhnZ2hlKCmn6GgmZuZnJGYnZSlnauhl5aclJKMlZeLj5iaqaCRiImLiHmFd4KCgp2Ii4KJfX+FiIaGkYSWlY+OkJGRkYySe4OVjYZzfX1meG9ramtndXNrY2dkZHaAYmVmZmVqamRrclpfWV1tZGFOaVhbYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1mqOfkIusoZiYn5aks7Gisb22obHGvLqxsaS3rKquqbm8u7quwLKurq62rrK4s6irubGvrrO2urawuL2tpp61qqCgsKSqr5yiwKCxpK6wrreutZ6tr62topqdp6mlnpWap6WfmaSiqZ2an5uUnJ2sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJWpp5qTmpqRi5SZjZSUmamnjo2KiY98gnOBgYqYhYd8iYmFhYqMipKElJyTkY+QkJaOkH+AjI2CcIB+ZnltaGtpZ3Fya1xoY2NzgWFmaGpubGdqamhuXWxsdHBhVWNpZGVaSUZMTU9YUVFWYWWBVUBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJGhmo2PsJ2ak6GZqLKvn7i/tqC0wru9ubGmtrCorqW3uLe3rbuvrKqrtqqzuK2ls7Wyrqmwt7axs7W6p6mftaidnqiiqa2ap76YraOur7S1rayfsa2wqaKcnKOrqJuUnKajnZqpoqSWmp+ckJujq6qpu5+npKCYmZmdoY9roZaZnHCClZqjf3WRqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSMh3BeY2FnhJiGa4uPlJJ0d4uEfoOPf2eGgGd1aGVXXGhzbk5QamNncoRnX2Rmbm1qXl9hio+DhGVOS0Q5RlRnXkpHUFBUVUtIUmBvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NViBbDE2T2tbTlxLW2ZiPkcxUWQ9Ki6Lo5mGlLCbnJOgm6qtqqO9xa+pt8K4vbytp7awpaukt7Oxs7G5rammrLSmr7WiqLi2tqinrLezrrSts6Kpn7OqnqGkm6anmKu6laalr7K2ra6kqa6rrKWhn52gp6ebl6ClpZubp6edk5+fmJCep6qjta+jo6OclpeXl6OIoY6Smoehh5OcoH+kf6WqnpKRmpGIhHJ4jY6FiKF2iIxpl4hmfXJ4oW+Ih4R+jn1/oaCgmYB8h550h452m4psh4GDbGhlY3prcWFThW1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhWeGhFpeR04/R19NRlJWVlFRUldUZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aWg5yrnZmYnZ+qqqeqv8Ovsbq9t8C/qqW3sKmsprO0rq6zt6uppbGtpbSznK21trSmp6izsa2yqK6eq6CyqKCjopqho5qts5SjpaW1vKesp6uqrailoaCYoKajmZmlo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXoZuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxl7ycxXpytaa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylXSaoaqQV09XYlBWTkZUW1hRUFKMXFdcUEBcRFFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoCnqp+XnJ2lrbKoscK9srXAtbe+wqums6ysqaevs6mvtrSnp6a0pae4rpyzsraqpaSnsa6usaaqnqeksaOin56Xm5+drquUnaKfs7qjqqmira6loZ2amqGnn5ebp6CfmJ6np5Gcp5qTnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4OVhq1kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdbFqfLF4dJKTY21tp25bhKBFaGaHlkV1nGB+Z3ykp4JZX4uraYCWeHlqpzdKr1xYU2xkW0tOV19cV1Y7TolPWFcvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMBuQopWCrKelnqOkqrK3rLS9vrC2xLK3usKmqbCrrqmpsK6jsLqvo6SusqOouKies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpqhnrOzoqucoq2toJ2Zl6ChqJyZnaOfnJmhpqSPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZdoazm7d+k5WWqJR+a4Gme4KGiJKUknerZ2uxW6t7j4eUdIlxj4aAf4iQl3iCgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaFvW1NraGBMS1tkWFxaQj6xeVhYQSNNaEVCRUFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+Vh7OmpqGuqaeyrKm7tsKwu8KtuLfAqqytra6mrbGpoa+8qqGntK2jq7WkprOzp6Oinaeqsqiwp6Wen5+vlp+YlJWVl52soZmZpKi0r6Kpj6moqpudlZigpaean5yin5ugo6SjlZufl5mdoqmbpZmcnKKgl5ORk5Kcg9WTmblwsMJ+xYZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl2h4R9poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITm1NW1JPWWZZQ0Q+RT8wPTw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcxJZuik5ixqKils6qltKmkvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqiap7muo6+xoLO0sKCknp+nqbCptKiknJ2eqpeYl5aXlZWgqpyZlqetsKmjno+soqiWnZecoaWhmKKhoaGaoaKmm56hnpSZm6agnKeVm5ufoZmPkZSRnIiybmi1cauHbo6mcrRzcrZ7mZeji4+djaN/kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eFfa19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOD1WUVpXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnZKlr62kqrytprWlp7a7vLK6v7e1tLq6s6W0tKGxsaKfrLCkl6a6rqSxsJy0uKqfpp2hqaSyqKyppJqcmqielZSYmJKSoqeflpKlqrCmopaTrZ+lkpSgm6Smn5SapaahmqKfrZqgnp2QlZuhnpyllZ2WmaKflZiVkZqFrHt3qHajjoiGqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfo+ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa12vd5Wej3hsNXnIrrJfQlNvXmdgRVBtX3BtVlVNLmVjaFJYUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOjk5n52Un7iwl7TBraizqKmyurezt7+5t7K1vLWkt7OftKyfn6isn5SntauosbGrrbSkm6mgoKihtqemqaKZnZWloZOSm5mSlKKkmpKQpqyvpqCVmamfoo6RopmopaCVmqWonZyknqydoZ2gjZSemp2hmJmclpehoJOYkKaehql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92iHSogo6bjZKjfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9R0ZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzI/OKGdmZm/q5e0wq6srammtLC3sbW/ubmysLe7qbq0n7CknaWnp56TqrCpr6m1rKqvoZihoKalpLqio6ugl5uRoqCUk56alJeen4+Ni6ivr6adlpuopp+MkqSXqKunlJepp56eoKOtpKGeoY2VoZifoJKdl5yVnaGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrV9NoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11hcHtjU1pRPj5tbzNDQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpudu6GcssCurqurp7epuK+1wLW8sK+5uKvBtqmqoJumo6KdkaqqqLajsqevqqCXnKegpKu4naOtm5aZj6WilYydoZuYnJ+Rk5SrtbCnmZScrKqXjJOlmaWtopGWqrGkn56mq7CYoaOQmaKWn5uWnJehkpypnJSQqpmH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9lYGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWVnYm13b1lbWUNBQHJAQ0crNUciJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5ueobyil7HDsK2qqqyxp7ivtsSxubGuuq+uwLGrpKKeo6Kcm5Cpo6qypLSmraWflpmqmaasuZ2jrpiUoJCloJKMnKOel52bkJWSr7mxrJWXo6enk5CWpJykrZ6RoKirn5ufqKOznqOljqeilKGanJiVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueo+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qHjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9imiDeW15Y4uscHWFf1pbp2pFZVpUZmBjXWNRZ2dwbHRCTVBMRDpaTT9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKG/pZa0wrSsqqisq6m7rrDFrrSyrrentLitqaKhpZ6gnZmTq6Stqaa1qKefm5ago52spL6moaqXlJyQopuRj6KooZOdmJOXlLK1t62YnaSkooqSkqabpaqblqmkpZyaoaimpqOpoZGtnpajnpeXl52ej7ColJunoY5qfmmcpniHcn2ajnR6ZId7vb7Aum+SgnGVh2Byalpem4phY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxmopocox9hZVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE11TUVXXWdhTFpXZ2NfT1ttdWpxUk9ERU47SEg9TD8yLTJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwqOatLm2o6ylrqeotbKryKuwsqu0o76xsqagoqido5uZmaymr6Sltamlm5eVoZqmram+p6imlZOblaCakpekqaiQnZGPmJywsr+sm6edp6KIk5Gpmqijmpusn6OZmqOnrKKfq6KasZuVp6CXlZ2fnZexpJehqJmckZ2coqSYpqKanJqamY+VgWdtfXF3kpeUkYWLtaqNhpiVjoqMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ6NgnqkhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11waE1YWmZqYFdab3lubWZTT0ZTOU9ZTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Gzob+hpLGyt6CppbKnpbC1qsirrLCltabAp7SgnaSknKOVlaCqpq2jo7arn5mWlZ+WramlwZ6ro5WSnJeemJOUop+eoqeTkZmop7LEr5qrnKufkJaWqJ2qm5ygrJihm5yipK+moaWon66Yl6edmZqgnp6cr6CcoaaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GejX+OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIc2hzf3p1g4eCa3RkeWZgaWVjZGZrWWt7cGlqXFNMUERfVEVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua+/rKuusrGgqqaxraKss7DEsKqro7OuvKO0m5+moqGcmZenpammpKWztZ6VlJ2ZmbCmrr6gq6KQkZ2amZORlaGcl6ichJ6qq6KzyLOfqqSrlpaXmqedqJqfpKuTnp6doKmvqaWjq6Kum5+goZiknpyfna+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhre5Kkqmplmph+Z4aKZWVpaHuOoY9raI2XkaJ3a2qLmKOemXNsbnqEjYd6WGVehoJebIuJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfXFrY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnra2wvLGpp6Str7CfrZefo52imZmmq5yto6WnqbKtnpWjkKKvpra5pa6jjo6aoZmSkpugmZmllXulraKos8S4pKGnr56dlJ6inqOco6mpkp6hnaCqsKqrpKqgqpumn6igrJahm6WwpJebqpWhnpuSpZeeqpiefr2Dh3K0coSdha1oeLnEuHGToqN6ppmZc6qCfMvAwLtxi6KIgp99lZiIncC9gpadnY2dwsF7gnySjZrDwH1rpbJvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeWRgZYJjXnRobGRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO5w7Swr8CpqJSjr6mwrq2msrSvqaWmprGrn6uYmqKfnJqqp6KdrKKlqKWktKSdopOmrau4s6evopGRmZ2lkpGgoZibn52Hp6ykq63AwLGhqa+pl5GenaGZoqOqo5OgoZ2dra6prKejo6ehpaWdramSpJqorambnKmcrKGWlqWVoaKXnH/OlHh6pIF4lJabX66PXo6ngaKgfKeWm3SrgoCvXmONqnqnh4WgdJeTiLNjgquGoY2Ns2qEr3R9l4i4YYOtWaPNbZB1e9p7f5lwfoeSdn5le4h2dmt8iG9+hZGSfm2Cj2BybHBnYF95ZFxxaGpjZmBSVFJXXUtPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4l52RpKqorbOrpbKsrKukq6awqqCnm5mll5yir5+gn6ino6WhnrCsm52Vp66tsaqorKCUkpufpZOPn6WYnaejnq6kq7CowMazqKmxrpaSnZuhl5+pqp+VoJ+cna2vp6upnKeopKKrk6yzl6Wiqqmdo6alobCgkpmmmaCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVvjG1ldmWGb2F3bnJviouSkINtkpBmcHV1cGBnbWVfb2lpbmdjV1NcYVlSU0M4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSgnaOOo6OirK+2rqixpqiqp62rq6eio52ZopWgpaqfoaWgqKiin52vrJialqinr6yopqmel5Sao6KRlKGtm52mo6+so6y0qrnNsq2mrayWlZydopierqydlqCZnZ+psqmqqpusq6SjrJuvsaKoq66lmKWqqamxopKWo6SalJKFpGqkdYl6qXR6snCCpoqZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYaCpH2pf4KVh65efalVnaKSgXqin4B7w6/Fi3Kvs7O5cWKpr8J0aI2MmI+BbZqUcG55eHhvbGZlZXFwZnxpYl1XYGlYWFVMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpJ6dpqemo5yrmqKsoaSfr6Kdm5OqpLWwr6Cpm52WlKajkJqiqKCgpZywpqSosa23yLK1qquplZGdnKKYn6WznZqglJyfp6yspK6araqjoqqis66iqrOxoZqpqK6vtqKSlqKnmJuRfKpsnoSHdat5fLBvgqSLiZ+Wlp+UgdK4tLjJgIGyX1+UqYOjiIegepiVmniqyXSZpJWoqpGTmoyAm4qZxsZ4ZqGCpXOBn46Cfa9dcLRisHVLo4Ztp0eCk2SPkJ6SfHGXk4Bxe3V+e25bZmpycGWBal9hWGRtXF5ZSU5MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC89LTVPVFEdHDs8RjIsJKekwMa4ramzraylopyyuayqoaaaqKWqq6qnoKalmKqjn6+rnaagrJqeqaWdp7WfopeTqaq2sqycpZyglZClrJGZnKejoKmmrqGkp6mwtcKys6qtqJOJl52kmqGjrqaYoZWYnKWmq5uwna6opp+spLesoLG5r52brqeys7OklJenopmfjoKdTniagX+feoOjfYOkhIamnpyek4S4e3x5uYJ+zMbCtniboZGLn36alpaKdp6YiqSYpKl/sIWdhZ+ErH2alGKlbKRwj4WQgX2WgnKsYKNzcYCaYLx9UlV1j5Kkl3t+k5KLdXtzhX9xXG1ueHJqgW9bZF9obmJkXUtMUVRBSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruaqvoJuhrLOzpZ+glaWura6qp52mppqjp6GzrqKpprKgmamklKO2oqKVl6Kptbmjm6KdopOQobGZnpynpaGir66dpKiitrLEsa2pramRh5Ccp5yipJyll56YmZqmpKmar6KupaaYr6W8raG2t62dnbWyuLGzppedr6CjnYWP0bXDt3mHjoWRk5CBpniUoXeMoJGEpYGKcaqGhLRucmqZo5uVip58mJmGh49zr4Klm6KOpouTnYqVkJptcLJcpXOTepxsmX97mXxtqWGjcXF/n2JzsrhoeJCUpph9jI2UjXh9eY+CbWl4aXlyboB1XWVkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tJ6Wp6SttaGimZWjqKeuq6yZpqKfpqCgtaeiqaewo5Sso46krqOdkJqaqrS0pJ2knKiRlJeuoKCdp6Sdp5y1mqGqpLasw7Cpq6mhjISOnKGgpqKVmpqcmJuZpqSmmKyorqOlm62mvqyUvbCsn6Kws7mrtKaaqLGjp5d6qJB9fLB3ioGkpYicbbJvoIetfKGOg6eVmICsiIWuhZ+UqaChl4afgJmVgHuSfquAnZqWi6p4nZ+QiZOSgHmvXaOBfaanZJ2AfJdzaq9dpWtwhZldYFuMoG2VkqaZgpWOmI17e4SYf2ttf2N+dG6AemBnZXFuaGdnQ1phWz5LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZXV1hWVVVRSEZJSiMoKL2SmoOpxsK2wbOfmqygrrilo46bpKOfsK+qn6Sfna2Znrmgo6ugr6marqGQq6mklomakK6xrKafppqsl5iPrKGhnaWhmqWdrZigqKa2qcCvpamkn4uAjZuan6aekpSampSamqWkpJqprKykpZ+qqL6klsOsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWmmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+ZmIyIsFt9tFukg2vIomSfgHu8WHa0WrJ9Uq6AeqxYgKFumJCom4uXkZiYfHmPnX5kdH5ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBRUlRXWl5gYGBhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaXFxYV1dHQjvSn7Oyt726tMKzo5uspqW2qKCLmqCfnLOzqZ+joJ61mKC0qKqsna+tnqybla+ooo6Im46vrKinoqaZrpKZj6iaoZ2kn5mko6WZn6Oqsqm9r6Wonp2OfYualaCgmY+RmpuSmpeon6GaqK6opqajpam7nqDGpqSooau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voNro4Fvq4RsnH96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI5neYJ7YGxla2piUGFaU2pcQFVhQk4qPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oj5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4sqihv6anspyesZy5qJ6tr6amlJSwrJeMg5uRrqWirKGjnKqfmIujkqaep5yaoaiimZ6hrK2qua6oo5uXknuHmZGmm5OOkZiYj5iTqJqgmKmpoaqnoaOqu56oxKKgrqOqs7SqsKmguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumJRwj4txlaijm5eupHJtbW1linhvboKZcYF6anFpZ4mWlZhxaWmEh2dwhmRdiGJqb1lcZ353pl9hcY6RbmVkgI2Tj6KYmZmRmJ99h5CVdmaHeGmOa3l/eWRsY2ZsYktkWEpsWjpRZUVSJ0s6KyMcIBsiLCkYGxgtMi41OjQ1Nzk8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssTJvraqnsCsrKOhqKyguqOkrqytpo2XrqmQjIWVlq2epquhnqOjn5GLpJKnmaiZlqOqoJacpqanr7qsrJqbk5J7hJeNpZiNkZGYlI2XlaiVn5ipo5uxpp6iq7mfr8CnpLKlrLCxqq2rp7ejrbeWiqCopbadiZaimIepmpCUnZKps5mbo6ugsZaioJ2fopygpaGVq6eNk5KMh5OcnJWQmpOYkY6VhYGkmpeVjYuTkoqPhoR9Z4l+dIJ2dIeLcadsepSRk5KBgY6QkI+dlaGWmpiig4iVjXJpkHdxi3h3fHpqbGRjb2RVYFhAaltIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERUpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKOtn6C1sZCOrMe9xbu5q6Kmnpumn7Goo7annam0p6iRmKyii4eJj5unlqyloJmnnp6SlaOXqJqomZSmoaOQmqeZobW7qKuZmpCNe4GUi6CUipWRlZCQk5elkJ+aqqCctqOep6u3p67BrqO2pq+vsKypqbO4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhXWGdXmIg3OcaoWQlJOQiX2MlpKSl5Sik56YooSJmYd7cpZzeot/cnx/am9kXnBqYVtfWW5jUGBkUFo6R0dFPjI9PTgvKyYrKSYdJjQwNjY2ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9fYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mmraCntaqQkJ2ltLyvra2io5p6naKxpKWxqZebuKajlJmqnI6Giomco4+un6KVp5+hkpeYm66LqpaPqJmojJipj5+5tqWmmJuNiHmCk4uak4qVkpSQjZKXoo2dnqien7ijgISvtaKvr3WkvaOyoHd5oKqyupR1rKSeiYCqf2RcYnagjqSehJd9bpOznaOnraqjZZ2fknN5mZZwgJiol2x/oqeKZZylnJGXmJaMkpyRhp2akJWDkoePjpKJhHdqjoZ2hnB7hoGAYWmHipSSi1p1lZFoaI+Pc3ummplleZmHg3iYaoSLg295gGtxZV92cGxraFxnZWJicFNcPk5OTlNHPkBURDkxLx4fJjQ6MzE2Njc4PDs+QEFBRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc8OFVSW2BhYmBeYF9gYWFfXF1fX2BhYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62kkpartrCyp5urpqyXdIydr5+oqqeTl7mfoI+cpJ2Rf4mIm56Nq5qilaehnY6WkZ6Eda6PiKaaqJGXpImcurSooJmYi4l1d5ONlZOKlJGQlIyQk6COm6CmmZyyloCMm7Wds4ySj7ynoH6nonqirraBjo6mnoOLhpCxqa+MipajmnmAi6yGnJ2ip6mnh5WFmHelm3qHm4GXp4KCe5yxeoqGoJeZlJiWgpGXloSamWN5h5CEjo+RioNtcI6HeYBwgIGFf4Z0hoSVkXiWaJJ0oJp0fZmEop6HmH+Ti4OEmWuOjoVseHtxcWdkeG9qbGpcZmtqZXRcX0lUTFFARTUuWlRVNykhMDk9PjY0MzU2ODs6PT4+QERJP0lFSktHU1hbWVthYWlmWVFIOUVLPD5hVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq2uq6isoKixpqeppZmUrsi+saKXp6m1no+Enaycp6KgjZC+npqNn5qgkHyGjpmYiKycoZafoJGNk4mGgJGojYeinaOTl56Gn7qyp56bko6FcHWQiZSQipSPj5uLkJKfkpegpJaeq4eftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnX2oj3J7d5yPp5ZolaR5tIyfnqaokpjCgX+riJihcp6AmqV9l4WVsYChfaGToJCYl4GOk5uKmJGLfIWTho2UkomDbXKQhX95cYaBhHyEdYSBloCPxWZ/qYePo2ueg6ObhJqBjo6GiplxjpOFaHd0fHdoaHVxaGhrXmRwbWdtWGdHXVJNMkU0Nk5hYzcmMzxFR0Q6NjQ2NTg7OD49PT9CTT9OSUpMQ1BaXVxXYV5qbVxRRT1MTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Cnqaimq6CkuLGqq6ealKCjpKukl6Wqt6OvgKGnnKWenYmUvZmTjaGSno95hJaWkYirmZubmaGFj4x3m5yPn5CInqSblZmYh6O5rqWanIyMfmJtj4uTkI2QjI2YjJGSn4+UoKGZoad+oaeHrZ2glq2PnpydkYWAoI2rroajjamZjJp/o3WAmZRrgqx1Tat4h42ckZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn5uYGRZg5d/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4WgaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15rcG1saVhpT11YRjlBNEdEXms0LElDUk1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15eY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWNpa2RiZGRnZGJnZWFjaJeWnaC4oKqkpqyRobW8rK6imZigoqWsrqGdrrWiqJKhoJ+mm5mNmLSZkIufjJWLdYGUko2KppaVmJ6ef5KFhqykh5uQipipmJmakoimsaeilpqIiYBpboiIi46OiouNkouQkqKMlJ6gnKGkf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafqJwc5SIlnuejHlth5uMmZCbqJqPh517gqJzdqZmnn53pF+Yen2Sc6JumLe0unSTh4J/tahkgca4e3CVt4txgJqkYnOsq2B9aZ2zfm58hoKNgouYcX+jbHKjdJ6EgKNgnZmzlnF8l5+zdHNbnrKDamJvdHZxaW9Ya2xycmZdaV5iS0U9RDZRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QEpQP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZjYVplZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinaOjpq6cm7GtrJOYoZmhpJmalJ6rm4uIkniLhXGAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42LqailnpCXh4V+a3uHfn2PjYOLkJCJj5Sgg5eeoJ2gnouJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lZ+Gm46Zm6aGomShfIiWkJuNbJ5omo1umpl7gIunfXJodKuDnoN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYJWMXqd2dYeJfp5omnWGk5KXjn+fbpqQbaeaXah+eLtrfqpbjoRds2dcbnJ6eGtpXHFqeHljYGZYYkFRRU83VkNSbzVLWlpfT1pEQDE1MTs7Nkg/OkNIVT5ZUlldPkRiXlZgUWFjfWpFQjlOW11ZZWZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4hjlJururKwrJ2mnJypn56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZ2JkKmjoJqMkoqAgGmAhnh/l4x7iI6OiI+Wmn+Uop+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6qaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp/dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianJ8jm2AiISZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVkYXNxfn5uZmBsaXZ7ZGViUl5XXVVXQFpGUWhEU1dcYlheSUQ9Qjg/QjpJRjhMRVhBV1FbVkRGYlxaYEtgbX5yRUM8VV9iWmZqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOcgbCtmYRUXqCms7mzs6maooycq5ycqZSiq6ShqI+fnp2amZWYoZ2WiIeJd4aBb3mVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfINshIVxgaGMeIWNiIiTmJV8k6OgnqOIrYZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6ZgKNvXqhndaJjb6VhnNOQfHuZeHJzY6KGkH6jc6SPdmuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZduf3Kicl2kZ3OmYWimbZvUmX2Fm3B6epdrm3x4l3NuqaRnYWV5cICEa2dmZG51d2dgY1RbZlFRYklXSlRgV1NbZWpcZVFGQ0tNSktCS0U4T0BRTlhSWU9TUWFmZWpSY3d5d0lGRWNdZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjm5mFmamgoKSOpaigmKmKmZiYk5mTkqCYjoeGe3B9hGh9j4OUmoF3kI6PiW9/ho+SkmyXk3yJkZKkloOOqpqTkouFiXqDdoeAboGfhniAkoaHmaKXe5SjpJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Vg62hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXi4FvTGajknCbh3Kke3p0YYOBa36ga3FkX5xxfXSXaXpps7W0xqZzmH56nWucm6t1hJttdXiYaZp6dZhyUEV9tF5qdmt5h2ZqaGJ0dXBuVl5UWWlQU2hJVk1ZU1ZdaGtuVmdXTUtBSU1LSEpPQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJiqoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY6IjIFphIWSgoyFnY16jIuVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaeclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMho11b4hiaKBlnn5pmnVvY2aIgm1yolpfW2KhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dnWlRtSVlPXUhYaWlzallrVlFSRVZcTFhTYVVpa193dHp9cH18coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2JqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CYq52fpoyioZuiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlpmCfIiHlqiRgaKskYaQioKKfoCAjnNpj6WEfYaUjYiYoI6Ik6qmnYmmeJWbfqWIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4OGhoaTlZyffKV6caiVoJZmnn5vq2OWipWSeKhsqaKBiXaIg3eqkaaHapGwa3azjKlrioZtbZ+ekpVgfquLqnZ+f4ylnnaffYSklZ2gapuId6xnn62MtnR3vo2kk1mDpo2rYXVydHB8dXFjan5uaGxTV1tWYWJda01dUl1JXm5udmBbcVlbYFpndGVub3FicXRgd3p+eXJ5g3OEf4F7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJm6WdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfXuChZimjn+lpo6BjomFlXaCh5JvbIupgIOLlI6JnJ+JjJSqo6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dYGPlJNxhoSCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgIWNqZt9dHyWaomIcIF2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFweHhwXWyGbmlnVltgV1xla2NVYlVfUV9weHhsa3Zlamtrdn1xcnRzYW91YnR7gXh1eYN1gIF/gXmLhYN9e21/bGR4bl5XbmdodWt4amlqZVxgWmNpZmxxdW5aW2JrZGxseW5obG9hjZS4qKaLoaKapqSZpZyro6GEhJiskp6hiZqmmqmYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoNwlYV7fZKLhoaQhXh9gIaZpI58p6GLhpCQhZaDho6Yd3KFqYWOkZ2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnJCCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIBYcm6GkYF9foxqXWpke4WEiYBgaXh6m3uCi4J1gYWCZ3eKhmthcHGBdl5yioGIj6aVhWWMj4Nud4uEcYaPenBmZ2V7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtrYlpaX1pZbHFcX2FaXl1mdH56dG90Y2trant9c3t4dGRtdWhtfH52enx7enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbmxnc3lvaGptYIuLqrChkKOhmp6emJ6ZqKOifoOZrY2flYicopGllX97mIR8kpmJiIaHinN9gYt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqehh3iOmImVi4ucl4WDeqyCkZeZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn6SkZKTnLKmm5WekI2yk5eEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIt8iZ2Eh4uQiIiAhISQd3x5dJmhiIaJnoqElH59ioCAdW9zhIN/d4aGio+mkIOFjYeDjZCMfYiMipGDd2yChH16mWpyaGF0inB9end3b3Z0gV1eb4Zobl9eWl1dU2hyVWNcXGFsaHV8fHNvcGRraml/fG55gHFqcHBsZ4F7coKAeH99f4R7bYKMhnx6eHx9eoN5TmR2anJtcHpla2VjYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2SMh525npeioZiVmJmUmaShnnyAmquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYeEjpudkoern4Ryi5CGk5GLnZF9jXuqhI2SmJaPnJaHhpumn6KanYWDkZqZmJCapp+lnZ2QloCQiXZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ2MiZOanoKOl36GjoNveIVydGB/g4+GdYuYgYOPgoaFfoWDlG15dXSSoYqLhZqEhIxzf4l8fHJye4eDeniKjoOSpo+Fg46Bg4qJineGiYqMfW9sfoF8bmhsbWdfen9ofXt2dHZ1e3dcX3B9bnRgY1tdXlFnblRkWl5ia2l2en5xbGxka2pngIBsc4FsbHRveW+FeW6HgHaCgH6FdnGCjYh+e3t8f3uCimBpfGp1aGmCZWpjYGlcY3Vob2J0bWxVY3F5ZXB6enNlam1si4met5qhpJ+SkZaYi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnt/eHOBhX2LkX1raH2CmImBiI58fYaEh32PgZCbm5GJqJyAcIyLjJOHoaKKhYx8qJGIkJKXk5aTeIyjoKCdlpl/gJCamJKMmqOho5mXkZt+jYV4gIOOhqB/foyMj3yYpKChk5mQj6aNj4KakYmTl5t+k5J+h46BdHSCcHZgfoCNhnGKlXyIjHGMf4KFho5nd3F4i5iRj36XfYeKcoGGe3xxeHqKhHp5kIyClaWTi4WQe4WGh4V2goSJiHtmcnx/eXtxbGpmX35zaHx1dnN8c4BqXmBzdnB3ZGNZX15Sa2lUZFlfYWhqdnmBcWZrZGxoZYCBa21+aG9xa314hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1entyYmpveYmNnrKRpKWdjpCYj4adoJudfHaloY6YgIyiioialnh7hod+g4l/iIKBf3F/e3R2goV+ipF4Z2N9hpeKgoqMeH2AjYN5loGVmJaNlqCbfnCMgpGUhqabh42Jg6aVhZOLlpeTkneRnaGhl5OWeX6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxyl6OeoZOZjo+ijIuDlpiDkpWZf5iMfIiNgHZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVve4aSl4x8k3eKiHuAhXx7cX53iIV5hI+JipeilYGDi3eIhIOCd3yCioZ3YHl4fXR/eGdsZWF/aWp3c3R1fXF8YmNhc250cm1hWmFeW2xlUmNYYGFpa3Z5hnFjamNtZWh9g2xodWhsb2mAfIF5bZCGcYCEg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXx5cV9xbIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDfICCgXh0eXp0fYCEf4mLgGRefYuVh3+Fh3R9fop/fZiEl5SXjKSimH9zh3uUkoqnj4yOipKgkYORkJSXkYuBj5ifmpKQkHN/jZKUiZ2dnqaYmI2VlnONjoprhZePmXqHiJCJb5edmqOTlYqNnoyGgpKcf5KSlYeZiHyKiYF5cXlrdWx8fot+bYWSgpR4cIKDfX6Kf2RyaXuAlpeEfo1zj4iDeIZ9dnd/fIWAfIKMhIyUpI94hIJ0iYd9gHR2gYmEb2F7dXpxfW9ib2Nke2Jub3ZzeHdzdGF1YG9sdW5vXFxfXl5rXlBdWGNhaG10e4hrX2pmamNod4huZmxoamxogXx6d26QiHOBhIR9dIGGiXqDfXqBhH19jnJ6i3h4bmyHamhfaXJih2hxb2V2Z25sYXlpa317eHBhd22LgJmZqqCjqJ6KipGGip6LlZh+d66ZjZd9n5ORlpSId317inx7gHZ4f4BwdHR7b4V9gYCKf3xhW36PkoaAhIRzeoCHeo+SiJKRnJOlnJWCfYJ9jouSpImOio2Xmo2FkZiTlo+KiIySnJOPi4xug4+PkYiemaKhl5aJlpBuiJmDZoWYjpN6iISQinCVmpSikpKJi5mMgn+Qnn2Sj5KMmY57ioSHc3J1a3BudXuLdG6GkI6ScXWAe4GBiHxkcGx4fZmTfYSIdJCKgHOHeW5/fYCFe4WLiISMlaiMeod8fouFeH5xcIGGhGNoeXR1cHxiX3Bha3RecGp7eXhsc3BleF1ubHNtc1haX19ia1pQV1hlY2dxcX6HZl1paGdiZ3GNbmRpZ2RpaIB6d3VvjoV0gYKDe3WCiIV3hXx4g4V6gIl3f4t7enJ4g2prX3BodIBqcm9tcWdvbGV8Y26AendxbHd3in6il6GooKabh4yKgZCdh5OddYGqlZOOh6GNlZOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpGLkp2YoZWYeIqAgY2JnJ6Kj4aSl5aFiZWZj5aLi42NjJ2KjY+DbYmLkJCKnZahnJiUhZiHaoSjgmaFnYqQfouDi4F3k5iRnpGQiYmVjX9+j5h8kY2PjpqRfIqAgm51cGxtb3B7hWlzg46YinF3gHWCiIJ4ZnJudYGZjnuIhHqTkXl2h3NviHuFi3qKhYKIjpujh3uDdYGLf3h4b2yBhIJecnRycHB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcW1aWGFhYm5YUVNaZmdjdW+EgmJda21kYmZrkm5gZmZfZ2uBdXFzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIeMf3t2in9qcWN8Y4Z8bnFsdGpob2x2eF9xf3l8dHV0gIJ+pJWarZ6mloWNhH+XlIOQoHWLoJSThoubjJWOi3pyeHSCcHKFc3F1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdygnqCoIKSgpOTmJyTmniSe4ONk6Sak46JlZiShIaXmYyUi4mPj4iehI+KfHKLhYmOiJyan5qWlH+TfmiFnIdnhaCHkoSRgolxg5GXj5uOj4yMj414e5KQeo6LjJGWjHyIfIBrdmpua2xse35hen6OloJ3eoB4g4x8eWdzbHOHlYp+iIZ7k49xeYNvdox6iYt6iH2Bi5CenYR8e3eCi313cWpsgoN6YHhwbmxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXnlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXSKfXZ8hYB0dX6MeXuGgXiIg3OGhX6NjYN7eZV4ZnJqg2CIfW9va3pgam50f3VfdH14hnh0c4V8eKCPmbGcpY6Cin+DmoeAjJ5/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNvaml2boNufX1tdXNSTYLfyJLWk3xwdYN2g5+Dk3eUkZmckJl7lHOFkJ+hk5OQipKbk4Z+lpaIjY2IkYyInH6OgHd6jH6IjIqcnJ2blZN6jXVniJGGbIiihJGIl4KFY4yRmY6VipeLjYqLcXqUiHuOiIqTkYl5hXx+bHtlcm9ra3l5XIB5kI6Ae31+f4aOenpocmpzio+JgYWEfJSKa31+bn+LfouHfIR5gY+VmpmKfHZ4g5B4c21ncYCEbWp0b2hqdG5TXm9kcFlfa3F3ZmtqYmZ4cm9wY193YGBWa19edlBOS2FnY116cIl0XFxldmBhZWWOY2FmYlhpc3NtanF2jH10eYaCdXZ+i3OAhn96iX5yiYeBkYuIfH6YdmVzbn1liH5vcGuAWmxueXlzYXZ6e412cneKd3mei5uvm6CQgoV3iJV+fYqdh4WgkY+FjJiEko6HgXR3cHlxboRvbW5+cmRleHB9bXp9amhrY6Sawdyu76FzbHaEdoSihZJvlpGVoJWcgZJyhYujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boWIin2Ko4SRiZyEhV6Lk5eKjomOioqEiW17loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKHhXl+gICFjH54ZXJpf4mOiYKCf4uWhWuBdW2HkIGPhH6Cen+QlZOYj3Vzd4iNdXNxZ3V6g2J0bXBiaXZnUmFxZ2xVX250eWFyZF9ofXByblpjcmFiV25ZXHhOTUxkZ2Jed3OJbVxcZHleYGRlhWBjY15ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJh5aGjH5+l3NodXF5bYt6bnRwgFdxenZ5cWV3eYaMaHaAiXJ/nIeZp5yjkoV9cIyUeHmLnYSFoY2OfJaNf5qIhHtyd3Bzam+Ba2ltfHVeYXh3e3F1e2dgZHzr2rXJw9yIc2x0gXaKmomOapiQj52Wk4GJcYWJoI2Ei5WKjJiTfI2TiIOJj3uQi4WPgX92eIOEcoeCk5uXlJeGjHWHf3CEgYmGmKGCk4yegolhg5SPhomGiY2HgYdqfZSAfYOEiY6NgnGGfn9xd2h2cmlzd2xajHySg4V9f4OAhIqCdWFza4iBj4qBfn6RkH1tgWt4hY6FkYN8gXx/kZKQlohucXqMhnVscWxyeYFgdGluXWt2YFJlcWlmU2BwdnRgb2BdaIJxc2lXZ2hiaVhtVlt1TEtMZmdfYnJzhWlbXGV5Xl5kZ3tgZF9dWWtuZm9pc3iKfnNzgX56dnqIc4WDfICHdneKho6ZgYyCe5N1bHd1eXiTdG54e3xYeoZxgG9neHeSgmN2hoVxipaFmaGaooqHc2+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd4W195e3txcYBqYWdhf9W2jpCmeG5xd3xxkpGNh2qZjomckoyGe2mHi5mGgZKRhoeYjXyNjYGBiY17j419iIR6dHqCenCGgJaajpOUgYh1g4V1g3+KkpyehpWPn36IYX+Th4SIhImNgICDZ32RgH5/goyOkH5tgnyCdGttd3RzdnVrY42Bj3+FfnyEf4SIfm9fcnCEe46MgXx+kIh5cINmeYKKhouCe4R9f5OOj5KDbm95jH51bW9rbHt+Y2hralludlpTaXJpYlFicndsYmVeWmqDbXNiW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVprbGJtanR3hn9xcH98fXR4hniFgn1/h3V5iYGSlnyIhnaJgXB3eXuEk29tfIF3XoN/dIFtaXp0lHNnc4d8cpKRg5qfm6CGiHZ2lX5tdpSXfoiRhIqOmnyMmnZ9dnFvbGphdXxmYml1elpfd3x6bXF/ZWRoZ1edj15xc5a8xIR2cZSJkH5zmIyGnZOMiHRriI+VgHuUi4GEm4x8ioZ9fImMf5SIdYmFdXZ9gXF1hoGelYaVj4KCcn+HdIN7iZecl4aTjZyAiGV9koJ/hYOJiXKBfWd9i3t5f3+Hi499aYB9g3Zmb3h4c3ZzbGqNhYqBin95goCEg39qXnF3en2MiYV7gI9/fnKAaHiChoqFg3iDfICXjI+MfW5seol9d3RvaWh9d2VdcWNYcHNTVG5yaWJOZ3R4ZmBdXFhugG9zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXmxjWmNvdmRnXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl/jpBvb3yBcWmBeXp+bW18dpVraniEdGuUjYWfmKCahYhufYx2aniYj3+CioKVmIp5j5ZvenNwbGpkYHR6aF9lcntaYXJ8eWZwemFlZY6xsndKYlqk2dCXcnuRi5F4fpWLhZmRjYZwbIaSkXp5koaBhJmKfId/eHiJioSWgG+Kh3F0fXppeYWDpZGEk42Df29+gnaCeIWamJOKk4+UhYdvepKDfYODiYNvgXhogIV4cn9/g4qHfGV9foN1Y3BygGh4cW91mI2Fgop7dniAhHmBaltwfHKAh4WIfYWIeohygG1wg4aOg4Nyg3iAmIyNhHdtbn6Ef3d6ZWhqfXJgWXdaWXJtTlhyc2ZgSm12dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZ19bcGpneXFcWllrZVljcHlfaF1eZWxoZmxpcXd/h29tf32AdXCBen+Bf4J/doGFiZeKcYKNcXuGfHp6hJSMdWp6f2tvfnR/fW9yfHuUcG+Af3hmkoqCoZickoKFZ4eEcGh6l4l+f4WCmYqBfI2MaXhya2xmX2FveW1fYm95XGRsg3phcXZfZWXV676LMjo+i46AcnmFiI6NdoSXjX+Tjo1/bmyFjYx1fY9/hYGViHyDeG52h4SClnduiIRsdXt0ZnmCg6eMg4+Mg31uf3R2gnmFm4+Lj5GSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3hheYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgG9ba310eImCinuGf3yIeHlwa4iCj4OJcoF4f5aKin50bWp2gIB1dVxpaXhxWVd9U1pxZUxbcnJlW0pwd29dW1pZXXR+dGhZYltnZW5iaU1XZlE9XmZdXXZmX3RwW1lVb2RaZHB5WmheYGdtZ2lsaXB4fY5saoKEf3lugHt9gH+CenWCgYyThXCAi253foB7e4iTiX9oe35rdHtyhntzd31/jHp4hH58a4yMg5udloyBgGyNfmtpf4+Ne35/g5SCf32KiGt1cWdoY1tiZ3NvX2Fsc2FocIl6YXN0XmNkm6CQblw1Wa+1dWqAiX2ShnaGl4Z0j4yKd3BshYOHdHmJeIl8k4h6fnJndoh+fZdvcIZ9aHZ5bWV5iISlh4GHjYp+bX12f4B8i5iGgZOQl4iLhIl8j4hxe32FfGl+bWqAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WVkYF8gn9vd3l8dH5tV21+dnOLgYZ3h3WBiXl4cm2IgI+AhHJ+fX2SiIh6bm1pbYKBdW5daGZ0clJbe05ccVxPXHJvZFZLc3hqV1lZWmFxgHRgXV1gZmRoaGZOWmhOQWFkW2B2YVx1bVhYU3RhWmRucldqXmJoa2dtbGlwd3ySbGmEin19cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnh5dop3fXiAgod/g39+em2FjIiYo42Eg3t2jHlrbYSJknl9e4KRgIB9ioNwcXBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGl2e3++nKajyLhyhYNzlH14h5SDdJCMiHJycIR7g3N1hnSId5SIeXlxY3eGeYCSaHKEdWZ3dmNqfIOInoKAf46OfXF+c4R4f5GPgneVjZSPh4KIeomJa3h5fnVoemlrf3lzaXp2gIN9aGB3h35qanNoe4BpdoGMkJR+en5+cXt2e3R9YVV1fHJyiYOCfIJwhol3eHBvgoKLfn14fXx1jYWDdmhxaGyIgnJwXWhjdG5LZXZMXm9VVFlzbWJRT3R4YVJXWFxhcIJzW2BcaGVkY2pkUFtxSURkYVxkcV5cd2hVV1Z3XlxlbmhWbF5hamdlb29ocHd7k25piIt5fnJ7fnmCgYJ8dn2DiIaDcHaDcm13goN+iYuUf3CAfHh5eoGLdIN4f4GBgoR5gHZvfomLm56IfYZ6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXNhYGFxbGxoiW5gc2lZXmRtgHep2qrHhoeycop4cI11e4ePgHqTioB1dHV+d4BvcX5thXSUhnh0bGB6gXmIjmVxg29ndW5bbX2BkJOAgXmSkn13em2GdX+Qi4NzlYqQjoeFhXt/hW11dn9uaHdlbXx2bWp2dn9/fGFieIZ6aHV1Y356Z3SGjoyVe3SAdXGAenxsf1lVcn1vdIOGfn94a4iGc3hqdH+Dg316fHh7coqAfHNnc2Vti4RtdFtqX3ZlSG5vTFtiV1dWeG1iUFN0dlhQVVheYHGEb1xgY21kY15uYlRdckdDZl9dZmheWntiUlZcdVtbZ2thVmtfYW5mZmxxaHB2eI50a46NdX92eH13gYOBe3R9g4iIg29xf3RxdX6GgomNint3f3iEfH2Fh3iHfH2BfoSAe35zdnmMjp+MiXqJd3WDeV5+hpqNeYeDdIaGhHeJe2JubFtiW1thVmp0Y2BbaG9wZ4dyYXFmV11ja398ys6HuaJrbW6LbXKFcn2Fin97koV6eXR5dXR6am11Y4R2koJ3cGdefIF5i4llcYFqanFjWGx7hpyJg4Jzl5R3fntth3CAiYqGcJaOkIiFi4N6eX5xcW99Z2hyYm14cmpscXd9fHpdZXmAd2l1eGaCdmd0h4yNlHxyh2lufoB5bXxdV3B9bXN/inuBbm6Jf3B2Z3Z+gH6BdXtxenSGe3lxZXJhboyCbHNYa194XElvbE1XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVZ7Xk9WZHBaW2poXVdnYF9yZmpocmdwc3eGeG6VinR/end+eYOHgHVzf4aFjoJwcHt3d3V5h4WHjIZ6fH91i359hoSEh39+fn2Hf3x4dXl3kZOffox9i251gHlkg4iXhnSSim+FhYJ6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZFdbYGl/eL6ue5+3bmJzh2h0fHJ6g4Z7fY2AeHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dIFtf4GQhnKUh4yHg4iFfXl0cm9oeWFqbWBtdmtna2t6d3p3W2d9fHhlc31uhHRldYaNhpV+cItma3qDdGx0Yltue2t0fIt6gWZ0hn1tcGd0fnd9fnF7a3p7gXl3cGVsYW2Jfm1uVmtgd1ZLa2xPUk9oTll8Z2JOVXVrTVBUVV5ndoNmXWFwaGdgV2ldXGtoSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZsZHJncnB0gHhwmYV2f354f3yFh311c4KHgJWCbnN4enpzc4WHiIiEeYF9do9/fISJjoOBg3t+i4N7d3x3d5mdl3qKg4dpdn58bISFlIByj4JxhoJ+gn9vZmxnV11bXFtTZHBlX1hjcnVpdnBlZWJXXFxogHBvcoBziWVleX9qdHZzc4OFeIGEend0dW5qenBiZ2tnhnSNhG5mXl98b3uJfmhsd2ZpZFVXcnCNp3yEfHaWkHN8cnt5bXp6kIR2l3uHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXZ1Z3CAeIJ1YXeFi3yUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfGZ+fn54dm5jZWFthnxta1ZqYnFUTGlrUExOcEdee2ZhTVV0ZEpOU1dhand+ZV1nc2llX1ZjV2JwXUtLa1hjYlVUVXNXTFl2ZFpfa2BcWmNlX3dnbWJwaXNvcX51dJmBd3+AeH9+hYR6fXaCg36YhW5ydHt6dHGFhY+CgHqLdXWRgH2BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6b4VzeoV9goN1bmpoZVZdW1taU2NuZVtYYXR7amltaF9iV19aaYBpa2+AZ2xhaHp5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3kIRnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kY54dW9+bnJ0eI5+d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2B2hIR4j4RziHFweX9xY3FoW252ZHBziHt4YXKAcGdpeHNxa3d2dHZjg3t+d3VwY2NjbXx9a2tVaWJnVEtsaFBHUmxFYXdmYk1Ucl1KTFRZZGt3emVfbXBpZFxWX1VubldKU2hYZl5YTVVsVEtcel9bX2tdXVtiZWB6aGxhb291bm93dXqXfXd/gXmAf4eGenl6g32Bk4RxdHR+eXZ0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ5/eoiHhGxygnl2gYCCdG6Gb3yAdIqAanBtZGRYX1paWlViamdbWl91gmlebmxcYVZcXGuBZXJ0fWlqXWx3dmd0d3Juhnt+fXl2c2x6Z2l4Zl1kcmd6d5KBY2NUZW9ngoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnXmx0ZXppXXSAb3JrcXt+dXVhdIWKeoeHgH93cnV+dGFvbFlwcmJxcYR7dWRygGxgbHpvamh6d3RxZYR0eXp1cWRhZG1zfmpsVGleXlVMc2NRR1diR2N2ZmFLVHBYSktXWGdrdnpkZW1wZmNaWF1YdmZUSlxjWGhYWUlXZVFIYnlaXWBsW15cYmRegGlqX290eG5vbnaDl3lygYB9f4iLhn51doZ4hox9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj62Me3uGkH5mcYh6dH19dnJvhmx7fm2PemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWXFuW15XWlxse2Nxd3ZtY1ttc3RodXZxbYV5f4B5d25vdGVodGVbZ3RmdnaRel9dUmVmaoKBdH1hY2lcVFheYmOQpWh5dIOGkHhsbnlnd2x7hHp0iHKAeHt4f2hldm1gZmFfamBddGtZZV1vbmJ6Zlt4fGtubnB4eXR0ZHKDkn+Hgoh6dm9xfHJhd2Nabm9hcHGBfHNlcYBkXm12aWNmeHpzbW6BdHN8c3FhXmVtb31laVRoWVpVTnlgUktaWUhidGRhSVRtU0lLWldpbHJ7Y2xsc2NhWVpbYXZcU0tjXVhpU1dIWWBOR2p2WF9hbVtbX2JjXYVpaGFueHlsb2p2gZB4bYJ+gIGSiISBdnWJc4uGc3F2doF3fH1+jJCAfpN+cHiWg32ZknmAgHh5fn9ziINzcJmhe3uAiZV5ZHWIeXN5dmtzcH9reXxwkXJecG9gZ2JsVFpZV2hjbWZcXHKJZlNybltZWFhgbHZkanVqal9bbXRxbXR0dGuGfH+AfHdvbmxkaXFjW2tyZHR2j3NcV1RkYHF/fnGCXGFjXVNaYFxjk59lcnGEg5B0a2p5bG5venp6cYB3f3J5enpkZnVnXmJbYWhcXndoV2JdcGhheGFbe3ZqaXJvd3RzdGlwgZSDhn6EdnJqcHttZXZXW2ptYnBygHpzZW9+W2BvcWJeaW98bGtzfXJweGtwYFtla217YWdUZ1VYUlF3XFNQWVJIY3NiYEdWa1FIT1pVa2trfGVtb3FhW1pYWWxwV1JPZldXaVNURlpcT0hydVlgZG1jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9h22PhnFvd3p8dIKCfYuPg4KWdHiClIWBn4l1gX+BdH+CcIeCdW+il3R7houHe2Z3i29ufHBmeHF6bHN2c41rXnRuYWdla1JdW1ZoYmxsW1xxjGROb25dVlhVZ2l0aGN0ZWVdWm51bnB1dXpsh32AfIh3kHNjZWtuYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZYpaVY25wg4SKc2pneW5lcnVyemt5dHRuen51X2ZzY1teV2JkWWF1ZlVfYG1jYXFdXX5vaGlzcXNwdXVrbISTgYh7hXFyZm57b3FuU1plamVxc4B2c2JsdlVicWtbXm5kfGVrdXxycnJqbV9ZY2lqeF5mVGVVVlBVblhSV1RPSGVyX2FGWGpOSFdUVm1oZHxpa3dqYVdcVVt0ZFNSVmhRWWZUU0haW1BOeHdbYGZsaVpiYF5ej25iZmt5dW5uaXZ2f35tg4B+hpd7f4eBiX5rkohyZ3SAe3WAg36Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupIxzgY2Ld3hue41gZHxxZ3pzeWxtcXaDZ2R8bGNmZ2hTX19VZ2Bsb1xebo5oTWltYFVWU29mc2xleGRlXVlxdW1ye3hzbYl7gHece3psYWVsbV5gbmplcHl+Z1pWWGBrd3t6b4NeYl5nVllgV2OciGJrcYGGfHdranZsW3Zwa3lpdXJtbnuAclhqbl5ZXVZiZFhlcWNUXmJpYmJtWmB+a2Zrc3VubXd2a2iFi36IeodtcWZve2xxbGJYX2hob3OAdHNeaW1TZXBkVWJuYXlib3V7dWpvbGpfWGBmaHVdZVZiVlNPWWZTT11PT0hlb11jR1ppTUlfS1htZF94aG59ZGBVXlRddFtUUl9mTl1iVFNKXFpRWnZ2XV9mbWhYYmFbXo5xY2dqd3FzbWd2c3mDc4GDe4iNfnyKh455bpCKdGxzgXN/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQiZCOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fH19fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OTlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OTkpKRk5KGk5STlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkY6RkZKThXyUk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKSfISSkZJ4f5OTkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkJKCbY2SiXF/kZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPkIRnfZKAdH6Qj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Phmhwj3x0e46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI6BXWl2bWV7jYyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4qLiGdmbV5pZ3SGhYOEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dndxYHRuYXB0amVoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doZ2Nmbm1dbHVwZWJjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXWZqb3Fxc3RlWVlfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05RX2Nlbm9vbmJPUVRQUE5OT01KTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTk9MTVBfaGdtbmxnYVJNTk9PUE9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tIRklOWGZtaGxtbGpoY1xXVVFPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQlBaW11kaW9pa2xqaWppa2tjUkhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PUxeZ2xrbmtvbWlpamxlVElDREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw7R0tHXW1tbnhxaWpoVkhBRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7Pjs6T2lwenNsY0k9QEBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5OTo6QVd0cVg/Nzw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PD47O1dfOjo8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/P0E7Rlg7PT07Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O213SDg7Oj09QTtJWzo8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXdNNzg4Ojs+PlBgOzs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89PT5CXWpBOz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPkZudk06PUFFQUJCRkhDPTxARERBQD8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVMQUNFQD8/V3yBXD9DRUlKSUlNTUtFQ0ZHR0VHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WGh4d+WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISEhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlHSEhHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4OEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Njg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4OjY3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYuKiYmKioqKi4mKioFHNjc2NDY4ODc0NTc4NTY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ojw5Ojs5Ojs6OTk7Ojk9PT0+Ozs8PTo9Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3Vzdnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPj09PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozw9PUFBQ0FCQ0FYcHF0dHR2ent7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhEQ0VDRUVBRkVGREVGREBCPzxAPj0/QD4/Pj8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRleEgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFZITUxNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3l4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BPkJCR0dKWYSCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BOUE5MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODc8Ozw9Oj9APj9AQ0ZJSlFfgYOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5ST05MTExMSkhHRUlJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0VCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSUZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1VrYUVSUVFQSTs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRT05SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXh5eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSEdGRkU/P0FBRUFDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlbY2BWWWJyXV1WXVpWRVFZWltZX1RZZ1JWVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p6fH17fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7fouJiot6bnBYWlxbUlNSVlZUWlp0g1lVfZBgXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlUVVRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5W11UWVVWXVpMVFpVU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHBydnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UZFV/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxscXV2dXNzd3p6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXVtZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPUNJR1ZASE5MR11pUEhGTkZERUZJR0hDREhHSEtHREJBREBOUU1SZHJ0dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJrTUc/QDo7PkBAPz8+alFLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQ0A/PD1CPkpNR1VudHR1c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT88Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGR0hCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjU3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVRRTk5OTElISktJSUZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4eXt7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFZVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxPUlJPTU1OTk5MSkZRUFVZU1RPSk5PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHB0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BPUE5OT1RMTUlQT1NUVTI9WE1JQFE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEpPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I1NTY2OmRvcnV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISklHRUhMSEtJRkxNUE1HL0VfUj4zPz5qb2FSUlFAR1VRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD07PT9BQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFhXVU1MS0k8OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0hKS0xKRkZGRD9CQz48Qkc/Qj9BZHB0d3t6ent8e3p6d3t3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hERD05Nzc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdJRE1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTkpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hKRD9BPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05SVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT05JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR4eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGRxSEtER0hIR0pLSUpLREdCPT49Ojo6O0FCPz1CQkNDR0ZJTEpESUlGR0dDQztBQEI+QEBCRUNJTVBISEtHSEtESElLTUhKTEhJSktKTVxSSEhETkZBREtKTU1QTUtNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RnZG9GS0NGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRUlKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktJSEVOSUJGTUxOTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcWxzcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUNDQ0VAREI+QD86Ozs9Oj0+Q0E+QUNFRkpGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLQ0lNTFBNT05PUE5KSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoZGlsZnFsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEdFRUdDQkFCRD1CQT5BPTk6PT86PT5AQj5AQkRHSkZKRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUdGRENJSUhLSkdLUk1CTk9NUE9PT01OT0tLS1BVV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0hGSEJCQEREPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRkZEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5QTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlveU1IR0hIQkJCRkQ8P0JCRDw3Oj4+Oj46QEI+Pz9CRUZERkRESEZERUNERUZHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSFNVU1BTT1FNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ4TklIR0lDQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRUNFRUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OT1JVVk9LVVdTUVNRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2b3RNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JBPEA+QUFGQkVERElFRkVHRUhIRkhISUtJRUpISEtIRkZMSUhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1FRTE9TUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZudkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUExPUFJUWFZNTlRWVFJSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MS01HRENBRDw/RUVFQz1BQUNCQkNEQUNEQUFFR0NIR0dHRkpHREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlJXUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJDRUdDQ0hFQ0hJSUhJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1NQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsa1Rfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSkpKRkM/QEI/PURFRkRDREJFRURGQkZGR0RESkVFSkxMSkxMR0dNSUdJS0hLS0lLS05MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bGt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSEdFREBCQkA+Q0ZHQkZDRkVGRURDSEhHREVLSEdMTU5LTU1GSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1udVxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwampvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRUVFQkJCPkBARkdCR0RJRUVFQkZJSEhFR0xKR01NTkxNTkdMTUlMS0lKTUlKSUpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGRzU2VjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lERUVDQUI8QkFCRkRIR0xIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXRdblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD1DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnZ0d3JHR0ZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkVISEtNSUhKSkpLSUhJR0tLS0xHSEtLTExMS0lLTU5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZHFpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQ0BDSERGR0NJS0xIRkRHS0xIREdJUEtMT0tMV0xJRUVISUpISUtITEpIRkdHSUdISUVGTElKS05MSVBcV15QXFtgXk1YWVNcXGJeTVlaTVhhUkpZYVpSX2RcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRUxNQkREQkVJRUdHRktKS0hFRUpKS0ZFSEhQSk1NSk1TSEdFQUhGSklLS0lMSkhGRUlGREZHRUVKSENKTUtMVV9ZYFhgYVtgVFhZVF5eWl9SWVxQXlxZTl5cXlNaXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaGVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDR0hFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5HSEY+R0dMSUtLSkxLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NkYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MS0hKSkhKRj9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFPXF9hY2NjY2JcZGNiZGNmWFFVVFJbV1pgX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0pGRkZIR0ZJRkZGSUxKTkZES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVVlgUlFfX2JiYGBiYmBjYmFkZGJYT1FRUVpSW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUZJSktOTExJTExJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFRFdVRVxUXlNWX1hOVFVOWlpNSktUYGFbX1heXmFdTlliXGBgX2JjYl1hYldfX1RQTk9PV1FdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMS01PUElMT1BPU09MUVNSVVpZV1lYWGRXT1NUUFBOTU9UU1tYWFpdXGBhZGVjZ2NrbHBzcnp5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTEdISkhHTUxRUUlMS0xLTk1VTk9LS0xHR0tQU1NOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVrV2dKXVdVXkRMUVVMTFNWUVJUWFdUWFVUXFVQZlpoaGRYUmpTV1ZUW1xbYGBhYWFiYGZoZm5raHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSEVHRkhFRUtPU0lKRmBTSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlxc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVlh/anR1dV9fdl9YYVtcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSUtFUVZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFpSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhKSkdKUE9NTUpOVl5ZVUxRU05YWk1TU1JOS09JUVJTWVdXUVRQUFBRS0hneGxjeHJtW0tNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f29ob1l2dmp1dXCBYHJnfGlseHxvXl9fYmFbXWJkZ2lpZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSktQT09PTVBaYFpYS1RXUGFeUlZRWVJMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaXl9eGB5e3NuYV1tb2NSaHF1bm15cHdsdnR0cWxtXXR+emtteXxrdGx8a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1KS1BRUFBQUVdcWFVNVVlVZlhSUlleU0xOSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd+dlVMV2tofWxtbHhfW3B6e15genNjcm94cWhlfGlye11VTGxgdnVraXV7e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dsaWhkZ2Bha2Fnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLUlJST1NSV1JWVFBXW1ZWVFRUYWBQTk1LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUk5QVVRYWFhbWlVSU1dbV1hXWk9TVVdXWFJdWVddVlRQWVJXV1dXWF5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmVtbm11ZWVnY2FmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFBOVVNOT01MUVBLSlJRS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjW11iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhTUVBLT1dTUE5VUE5RTktTUE1PVVNOUk5NTlFUUFRRU1RVTktNT1FUVFJSUVZXVFlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVYXlxeXVxdYWFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlNUT0pOVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFdWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhYVVJSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGJZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGReW1lWVVdRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlFXU1NTWE1PUFJUWFZVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV5gYl9dYF1jYGNnaGRmYFpjYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF5iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGJcW1ZWWFFNT1ZTTlFRUFJUUktRVFRYWldVT1JOU1hXVFNVUlJaT1BTU1ZbVlZXVFZaWF1eW1teVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX1xiYWJfY2ZpZGZeW2RgYWBhY2RfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUE5SWlNSUVNSVFVUS1FXVltaWlNPU1JWVlZUT1dSU1pSVFRUWF1XWFhTWFxYXl1ZWl1UVU5WV1deW1hSVVVZWVlVV1lcVFNWXlldXWBdYmJeWV9bZWJfZGReXmNjYV5lZmlkZl5eZGFgYWFiZGBiXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWVVRUFNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWlxWVFpeXF5gYV9kY1xeXV1lYWFmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX19hYWBjXWBUXV9iZWV1gXpoWFlZU1ZTVlxYV1dWVlddWE9VXVpeXV1UUldTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV9fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lWVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVWFRXW1pZXFlYWWBXUFZeXGBhXFRUWFBVV1ZUVldSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVpfX2BgZGJjZGViZFpiZmNnZmVeYWJgY15iY2lkY2dfZ15iYmNhYWBeX1hUW1paW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUFdWV1dXVlRWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW2BhXmBkY2RlZWZiWWNlZWhnZF5jYWBlY11laWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGBeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQV1dYWVlXVldWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcX2JeYmRjZWZlZmJaZGZmaWdjX2NfYWZlWmlpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYWNhYl1bXFtYV1tcX11gX11bYGRcXFhaYmVjYFJcWk9YWFpbW1pXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRmZGVmZFxlZmdpZmNhYlxkZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgYmJiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUllYXF1dW1pbW2NgYmJjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZWdlZmZlXmVmaGhnZGRgW2VnXmFoaGJoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkI67zsvLzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fYCCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h5eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt8e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODhIKCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHp9fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoKCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e3x8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3V1dHRzc3JycnJxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHRzdHJwcHFwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcnNyc3RzcXODcW9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnJyc3dzc3Jvg5Fvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBxcXJxkYRwcnCXj25wcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnCIpHVve6SQb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcIGvjG2Hp5JwcXBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXJxfa6icI+mlXFxcXFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnGCsqmQobGScHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3Nyc5uqorOnq5VydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHd9p6CjsJ+coYF7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fIiml5usoKOiiHp6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fn1+iKCRkJ6blZiPfn9/fX19gIOCgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGBgYGGqKmhmp6ZmJR8gIGAfn9/f35/gH9+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GAgpWwpaahn6KqpYl+fX1+f39+fn9/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Af4CCh4+hsqqepqGfoKKoq6CUi4SBgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhouaqa6po5ykoZ+ioaCipKOej4KBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGCg4yZnZmamqGbnaKgnJ2ak4iDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgYSLlJaZmoySnZualoyGhoeHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIOBgoGEkJiViI6amo6Hh4iIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEhIKCi5aNk5eMg4KDhYWFg4SEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOBgoKCgoKBgpCThIKDgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOAf4CAgIB/iI9/gYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mWiISChIKCf4CKkoCCgYKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpiKg4WEhISCgI6Yg4KCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2LnI2AgoGBg4KBlZqGgoKBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgIuVko6AgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2KhoOEg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfYSEg4SCg4OCjYmFjYKCg4KCgoKDg4OCg4ODgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9+f35/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYeGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/foCAhIWEhYaGhoWFhYWGh4eGhoWGhYWGh4eHiIeHh4aGhoeHh4aGh4eGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeHh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoeIioqJiYmIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoSGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIhoaHhIOChIiIiIiHhYKCgYODgoODhIKBgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn19fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaHhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaGhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKBgYKCg4OFhISEhYSEhoSDhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSEhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Ag4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgIGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYOBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn59f4KDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf39/f35+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH9/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9/gIB+fn9/f35/fn9/fn5+fX19fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl4fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBf359fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgYCCgIKBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CJiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFh4KDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoODgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiIiHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4ODgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fX18f4GBfYaPgX59gn5/foCCfHyAf4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5SQjIuOjoyIiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyCgIF+f4F8fn5/fn2AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUko2NjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+CgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+f35/foSSjY2Mj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+foB/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fnx+fX58e3x8fHt7en1+f4CEg4J/fn98fHx9fHyBg36Mfnx7e31+fX5+fXt7e318e3t7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CMjIyNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ9fn19fXt7fX18enx8foCCgYCAgH18fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj4yKiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn9+fH19fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX19fX18fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn59fn19fXx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foORhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIj46LioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+f399fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImOi4yHhIWFhIODgYKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fX6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18iouJiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgICAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2Jh4aEhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn5/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISEhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCgoKDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCAgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYSChISFhISEgYOCgYOBf4CBfn+AfoB9fX1+gH5/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6Cg4SAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gICAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt8e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAgH+BgoGAf35/gX5/gIKBgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX18foCAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoJ/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX6Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fH+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXx/gICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaFhYOFgoGDg4GCgYGCgIGAgIGAfn9+f399fH59gIGCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoGBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH9/gIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoKBgoOAgIKBhIODhIGBg4GCg4KBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgH9/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHt9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4ODgYKEgISDgoKAgIKChIGBgoGDgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgH+Ag4J/fn+CgYCAf36BgIF/gICBgIGBgICAgoGBgoGBf4GBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoKCg4SCg4SDgICDg4aDg4OCgoSBhIOBg4CAgoGEgYKCgYKBfoCAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgX9/gIOCgIF/gIKDgoCBgoGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGCgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgoGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp8fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx8eHZ/dnd/hIeDgoOGg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4ODhYOEg4V/foKKi4WFhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4GBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYGBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Bf4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXpzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiISGhIWFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhYaFhYSEhYeGhISFhoWFfXeGg4SEg4KBfX9+e3x7fnt8fH1/fn18f36BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFh4WFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4F9gH97e3x+e3x8fX9+fHx+fYB+fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaFh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhIaGhYSEhYWDhIeFg4KDhIOEgn6BgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX99fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/f358fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYOGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GCgoGEhYKDfoGCgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEh4aGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgISDg4J9gYF/foOBfn9/gHx/fH19fn17fX18fXl6enl7fX16ent7fXx9fHx6en18fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGgoODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgYOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fIB+fXx8fH9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEhIWEhYOFhICAgoN/fn9/f3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhIOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6fHx8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhYODg4OEhYWEgYOBg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3l6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dTU1dXV1dXV1dTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXY29zd3Nzc3N3c29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTYrnyBgoKCgoKCgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS2ZE7REREREREQ0NDREM/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tmUQEhJSUlJSUlISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tLS0tPZmU1UVFRUVFRUVFRUVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU1NTU1dDLy8rKysrKy8vKy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDOztLUz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTV19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT84OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dO5n9DRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM2zl5q6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz48Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWvoKKnstGSfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XoceGmrXV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKTapJm11NPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp232KKZtdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg0taimbXU1KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpBQ0ZEQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iydTVopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7fQ1qOZttfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT06Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRptqimrTZsaSn1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKbasYPG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR09HD1NLSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0+QUVMTEE9Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo9Pjc4Njk2Nzg5OTs7PT9APDw4OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/QEA9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTEJBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIQEU9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDxEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT02Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysqKagnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWlo6KlpqalpqempqCbmZuhn5aTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainpyfoJ6bk5GQlJebnZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoZ6ptZOQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGhoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqSkpKOioaCdraOWk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+en6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6qpo6SioaGdo42Km5mZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoqKsr6GhoJ6cmqdzgp6cmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGhoKGhp6Kkn56cmZqgYXyfm5uanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCgn6eWpZ+dm5qek1l5oJubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqbm5qYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZ2kjpuenJqapIZYdKGbnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqZpI+QmpubnKR5X2+inZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbnJuampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZmqOOjZWZm52geGlpnJ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZiljYqPlpudnHhqZZSfnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubnJmZmZiWpY+EiZKdnZR3amSPoJ6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYlp+MgIKKnp6JdGhii5+enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeeinl6eZychGxiXo2gnJubnp2dnZ2hoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaLmZOEd3eYnodtYV2Kl5KRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2RkI+LkY+LjI+QkJGOjZmbiXKQnJyEe3Rkg42Fh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2LjIaKi4uJh4SBhoKAgZKdiHhah5OWbG57c4GHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3KYlHRkT3WLjGBccXODe318ho6Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLh4iFhIiIiYR/gn59oIdfS0l0g3xaSmFreoSEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipGMf4iNjYuLh5KJj554SUJFdHhtVT5MZHOLi42JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkZ6hnZOXm6GanZyin6CUYVNbSnRyY1dGRVNsf5CRjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqqmnoqWoqauqqa+khFaCjVR0fGxcWW1VX3eWn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqurrKShoqWpp6epo3RqwL1Qf5OHb197a1Zum6GhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mppKimmp2kpqKhoZtlh8a9Zamhk5decYNdYJecmaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSgoqGip6GmrqamnJ+ZX421vpvKpJOpdWivcleNm5ufnqCfnp6go52XmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9CPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChp6mtsbKvq6OjpG2ClZWoxp2SoYRGrI1YhqGfnZ6lpKWgpLOllZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6CjqqqnuMG+uba3s66sra+EfXtsrbugnJqAV4OBZ4OooZeepaKZlrC+oJ2hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKuyt8/e3tjNyby3ubqviXhkaqejmpaKe2hrcnZ6h4uFhYR2b424qaOrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsrS1trvD1+DYzsa9uraumnhqUGOUhIOEenJtaGhua2xsa2ZfWneytKq1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc290aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9v8TUz7muqaSelIBkX0pcfG5wd29paGJdX15hYF5aVG63sqq0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xcHFyczGoZGOiHxoV1hJU2tlZm5oYmVgWVtYWlpZVWyzuaKmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnZxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PDxsbAwq+UdG1kWlZXRU5nYmFqZGBnZllaWVhYVGazvLKmqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTEubTHuoBZU1NXVUBPZmRhaWRgZmlbWFdYU2KpuLO1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWh1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8TCxMKyeVFLTk89UWNiZW1mX2RoXllXV2Squ6q4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb255eGNiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XJx8jHwr2CT01NQE1nXmdramBiYV5cWWSlwbu6vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteWxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx8zJzsXIv3xTTkVHb2BhYWxiXF1eW12bx8LEx8G8vrSxsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BrandsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIycnFxcOuf1RNSGpjXF9uXVRaWVuSyLe/v8DAuru9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2NqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8HBwMTBw7uGVElZXm15gVBQU1aGyMOvvb24ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xL26wMTBuotXR05/lZJFS1p+uMu+sMG/ure7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpnZ2pmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8HWjru+u8O2uce3tbe6vLq5lm5KeJ2RQFqQtrzBvrnGvMK/vMW4tre0uLa2u7u5trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxXisy73HuLm4rbaztrmztrS0hnybiVagv8C+vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpDQ0c+Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE1611gr3Iz8LAuK61tLq9t7ixv7+blYGXzcPCv769vMfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydGYcXWw0dHMysS1ur/DyL6+tL/Dr3xptczFwr7BvL/DzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhXN0qMzMy83KxsLDy87BvLi8url1WLbIxsTAwL/EwMrKw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXh8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7uq3bwr62vsC+vrqmnKqzt8TApXl3ep7ExsvIwcPAwMnKwb+7urC2dla1xsXFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCl5hzeX6avr/HwLnAvL7FxL29uLKvrm5UqcXGw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVpeYE5TW1xwdHiEo7i3wrqzu7e7vb+6u7utr6xsV5zFw8PDvry/u7u4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVG55iaiwt765srWyvLm8trm+sbSob1+KwcPHw8C9v7mzr7K9uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNopdgU0NZVUhialVPRUplkKOur7a6tbSyrLy5uLW4wbq6nH9serzCx8K/ubq1rqWss7GmsK2onqCgpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dwfG92cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9uTkpAZVlCUHiAk2hMQ16DsbWztbK0r6y7uri2ub/Es5+WgnqovLu4tbKxra2fpKannaSlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIR7WEZCUYhYSUpZeI6CYkFVpLmztLKwsa2wubi2u7e6v62xsqqfoLmuqautq6OooZ2dnpeYoZWSlpeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CUkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnlpdXRuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUaE1AVHlxT0lJS2idf1pFVrG7sayzr66srba2srS1rqminpubnZ6np56gqKmfoaeWm5eXj52Uj5CWjpebpKigoKKioaWlnaOjoJ6loKSspaaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+QkJOQl5WWmJ+enpuZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZEU6GEUFhJS2BJWI1hZWWEr7WqsrSuqquvsLKzraWdkZeTj5ignqKgnKOkn52olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKicp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZGZkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhWUmRNSkhHT1JOSk5IPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8a/y55OQXWcb1BuSkxjZnZ1YV1ic5Kyr66ztaqmrKuim5mUjZGVlpiYnJ+iopydpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTHxotWUktmo1hnfW9yW1JrY1xnYmFtkbSwsLispqGcnZqUl5qZkI6RlZGMjo2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqSep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa6ysbSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxmW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOMeVVpcXd1b2R3dlhXYmBkaVtaV2itrqyvp5+eoqCWkJOboJuZl5KTn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyppKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe/sKyxrq2pqrSxsKirqLK2uLO4rbK0pKCdpZ+soaGioaCamJaWn5ubmKWhoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VebVtSYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo39vgnBgY1dMW1NaTExRWVJIT05ImayqqaSfn5mSkZOYmJaWlYyIi46VnZydnZ6XnpmnoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wry3vrOztaKsoqmosqmqqKeompmemqqnoJmnoJ+fp6ilpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpyJYldeZWBXTVFHPT9AQ0Q/PkNSeKmtqaqln56eoqOdnp2anJuUk5WUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6OdrKi2sa2jsKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OioJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLayqrqyrru3v7u6q7itq6q4u7W8rq65o6ajnqaloqOpppmbn5manaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURUTURDRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6WlpOOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERGUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWlmXFRJREA/SoaepJiDoLKto56cn5qYl5SSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19HXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczJycDDwK6vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETkZASlFCPkI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXhwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT1tjO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKhWUlAQURBRlF2sq+nmpSXn5yaoKCem5yZlYl3aWNhX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9jU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FhX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1c3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMnAyMrNztDL0M3Oy87PyMvQ0MvOysLJx8nMy8zS083T0tHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwbGprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGBgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzcLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFx8HGyszN0NHH0M/OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBxaFlYaFZNR0xJUFFCO0M+OzY4OTg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PTg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGx7/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsq9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMW/wcfMzMzPwsvMycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgnhvdGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCt7u7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb299udHIycrPy83EusDDu7u7ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nCu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAysPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXx3c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzNT88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7rGw7+8wc3Dxr6+tcG9w7u9xrzDurS8xsTCw7fAtra+v7vMw7y2usi6v77Lw8HGwsXJx8nG0MbCzMiyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9kVl5ZSkZKRUdLQUVCRkpAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2srqVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYmFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMi5tLu3wcK9t7zGwcO8ta6ytbq/tMW3u7WruL2+wL2xu7awtrqzxby3r7u/tbe0xby+wsXAw8XGx8vFwMbGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6uMm2qrCYW2hvio+FiIl6eH6GhnZ3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a8x7nCt62qqLCywLa4vbCxqLGztbu8rK61pq62rruysaq5sK27rru4u8DAvrnDv8bDxcG8xsLIy7jFx8W/x8PDusTGwrvGyczLs7nDvbuziXN3dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk9OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztbXDrqqwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0va+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK21tKaorqGkr6mypqiorqaot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/xMDAqYdzdHNqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbeloKSfprGoq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZga29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5Ozo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLa8sqylr7OtoaORaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBhXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpujmJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO2r7O1r7Cqn56fo6KypaapuK2ipqagqKyrmaCfnpmdn6WamaObnJ6wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6y6urGinqmrp5iekG1+hYZ/eHJtb21rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKmvs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV5dWZfZl5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDHzrfAxL2zubmzv7axubutsrSvn5qkqqCUmo94f4OEf3hvcXRxaGVkaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqehmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSsqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZlX2FWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMyywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbGurLWeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendzZWFcW11YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEs8K/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVSVFJVYGBfYGFfYWFiZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaqeqKKfrqypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwcGBbV1ZWUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+Njk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAybq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbm4iBcoiDe3RpaWlsZ2psbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVVZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboaipq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqdoKGgm5SQjJmOjJGMko2WlZCeoqGknZujlZugo6GXoqijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFFSSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTU4Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O3rqmor66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJaHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYWR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZalqaedmJCPmp6ul5ioqpmfnZSloZ+SkZKRk5Woq6WamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpqioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xq5F+cnNiVlRWTlJKR1ZQU1FMTFdNSk1PUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qmo7GrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio52dl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXV1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoaKWlJiYlaKmmY2ZpKappqGgtLKnsrehnKK2rKmtpLKyprW8taussaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpOTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20uMCvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucnVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmKCjnpCTmJaFjYKUfn5ziY56kIeTkJCdm5qakZaQnY6jo46JmqChpKSborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTlJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7Sppqaoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraeippKdpraso6CPlZaSkH13fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWtxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdlIOVjpGQg4Z9k3hxcIWMfYmBkY2Ql5qYk4uQiZ2In5iHiJaemqKgl6euqa2oqJ6XrbOipq6ZrKuYqLSiqa2jk39zbl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxaqjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39uf3+UeHV2eISNmnBRjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyEiYiVhJuNgoSSmpafnZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl2bWZeW0hRUVNNSVVNUklMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5ODk6OTk6Ojo6Pzl3tpyjp52foa+ip6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2nnpWNf4mTqJaVin6Og4J9d3BvWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNydX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXyVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAc2hhXV1KV1BSR0tYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUyNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnZ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4WCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS09PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqGmsK2uq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fn97dm90dIaCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVNTkhOSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woq2qqLWvrqy0v6u8w7+lopqVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98dH59cXBudW2Cf3d5dWp5iYKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLyoqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqSorp+ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKFdnGHfId8dIyujomAaGdiam5ybXCDdWlwWHVwjpuSd2x/e31tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhKRklHP0JBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepaefr5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1haWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjnp3iX6JiI5zi5eQhHpdZHJ0enx3im1oamJ5b4aQgnpvgXd0hHpwdHl4a25pXXaHfYd8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfXyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIl7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYOIf4iEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpNTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GGgneHf3t2hX1udnVmgJSOhomIh4iHoKuilomOmH96gol6eW9na3h+en9zbGVeWltdal1hZmBZT0tOV1JRSVBKRE5HQ0pEQkFEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsZeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Kfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoiglYaSiY6PlqS1qZuNlaKDh5ODfoBramt8gIGCdGJeZF9bZ2tdbGteV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKqWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYo6KmtrCdkZmoiJaPjYGJbHNyfH99cmlgXWFfYWdkYGdmW1JFSktQT0lJTEZGTUNITEZHREJHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQk1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2inpCjoauvrLK1opSkqoiZiZKKlnp6fYV/aGFoXGViXWRjXmZnX1pPRElIU05GSExGSkdGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6eaqa+tsrm3uKebtqmMpY6Rk6CGeIKDdlpiZVdmYWFjX2BmYFtUSURETFVRSElKRElHRUFAQEtEQk1HPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gYx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoZ/homFioeRenhuXVZARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe4wbW+r7d0sbOlusWksMa5sbOxtKiktbaqsaCilpqikqWwraatrKekmKCstLqiqbK6tbu+zL/Fxb29s8K3uri+t7q3uayssKaxqq29sLy6wsKsmbqolK6Pl5iriX6CfWtXZGJZa2VqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3iHYrmhmaOJlZSWk5STjZCWkoeGe4aBjZWKgYSBinp8i4eGfYqDgYqDlX13eXVlT1xkR0VMO1FjYVteU0Y/O0hQRVtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0tMU1pUXpOvuLW6uMm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqu9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfpJSip7G0p7KzvbbBvtPJydPHwsXMwsrDwL69v7u8t7SvuLe2w7nFvcPIsJ65qqGrjqSntomBgHNgYmJeWGJgaWZSWGBWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWZmZGOl5KWlo6Gh32Gg4yWi3+Df4J4e4uDh3yLeYGKgpd/c316a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLSkhGSEhIR0JJOUQ/SEtUVFZcWluTucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJ2tcF6irJyYoKObpJ6qpZSgn5CUjpaYl6ifpZ+empmDpJ2spaqwrbewvbnU0c7X0MnM0szPzsrHwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZgHpsXmFdWV5hWmNjUVxgU1BLQ0FFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGgn4uZnJmMjZWRm5KFiop+iIeLkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmpimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+WkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwqLS01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3D0NK4sMO8xLmltrrDooNwZF1dXllgWFlmWlFdV09QQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZaMm5uXi42VkZqOfYmLhY2KioqQh3yEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtueHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5yRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdHRxdLWxcDOx8fDqL63z556b2ZeY15XYFNdWlBRVVBOSD5ARkFCRTxAQj9FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqGLjJmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ6Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NXX1cnU2s3J19fRyqzDw8yMc3BjYWBYVFpUXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5SYio2IiIuJfoJ4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDtBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuPi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qbkquzmJqcqJynvcPGubbGzdLQ0tDM0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eXdvZV5aU1ZSW1dGR0pJRUU9Ojc6QEFCOkdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoOJhoWJgod8eIWXl4mPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1dvX09nb1s/b2tHWydTLlXp8amlcW1BTVF5IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH+EfHyEmI6Hi36GhoB3gnlve3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJGKjZGCjIWJiIGGkJGenJmJhoyBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NbZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PT08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36AfoB8hXt+gZGJhYV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKScfYmEfYlyjIp+c6aanJiThXuPkIiEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZaNi5WfnZSglJGOjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZqdlJKAjIh/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSvoIuRi4WLgZKGV3Kti5+rm4+DmJuPj45bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaTnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnltYn6Sg29td4t4eX96gX2Ge3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWip2QlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZueopKpr6CRlZCNjoiVi26Nt4WaxMiym6Glm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ+Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMG+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rOg3SBaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg+NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBgn52doCDfGxvi395fHh4fISHi32Ko7Ooo6uzoZanoKWklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5WWlJCLmJmWoMCOo8m4q5uipq2ZkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyalI+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe+tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUpnYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvc416fYF7eIaLiYWDkqe7raiyva+lrrOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZiqo6+wqpqZnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi5CVjYqMl5iSnZmzlpWqnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzuKvCyMS1u727xcjHwtGhxsnNzcTW1tDL1KJxfGpeW1RfUlBHRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1M0IzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgY3BKQIuKf4Fyhod9gYl1goqDf219fXx/cHeHd46ChnuNj4yGjJqrwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaudnKSYm5iXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjY6ciIiPl42LlZeUkZqWnaeasZqRq52Omo+SjpWQkJaXj5GgkYmVm6OslJaPlJyelKCem5igoZWanqenpKGksLKmwcbDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVthW05LQkxARUY+QT9COzo0PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5antMbJv8LMwcO5yLy6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm6CqnKKclZ6wtKeLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY+RoYyMlJGPiZefmJOZlJemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6pt7XJw762zrLFvsS8s9HJyMG1dXltXVlda1NNSUNMS0tJQEE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHqNoZaomZqYur7HyMrC0snKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6uutK22taCfrp+mopijtL2pm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllYXVxMTE1KR0RDSEJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY6Xjp6SiYp/iJ+ThHiFf5V+f5CIipGAlaGarqakmMO+yMPIxdPNzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdq7e4qaWvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmZaZlaGkqKaetqupurzEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEamlJyWoZeplo2Qg4elkoiBh4KchIOVkJGUjpqin6++rqHHvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKupp6+wl6OvpKikpbTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFFRO0hLSUZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eZoKKor5mQl4eLp5aOiJKFn4iEnZePnqCao6S1yLSpxrvDw8jKycfMzse+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSrqaaurJmkrqWlqay6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrure+s7Ktvbm2oKOnqKWnnJysqamMZWZhX1JMTUdHTkpWTD1NRE1JSkFDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRayVnKGfu66ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLIyMXCzsjCvbmyr7i0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKuqvbyorbyzt73GvLa1t8Cvvb+zqLS2q76kj6OXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjaShlJyjnqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLWys5+coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HDwMfEvs3Hu765srC4s7/DyLW/r7y2urempKqrrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ejlpOblK6fkKGipaOjn5C+pamdqKydnaGbpp+9opmjnqKpq6Gdl42VnpOfh4+FjZKepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWpraycmaChko6QlqmflGlkWmFdT0pIS09NSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqqyXtrCjqrO2xMK9v7bAwrzIwr7KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqyum5uemaagvqGdpJirq6umoZmNmp+SnomOWH+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpq6yq6mioqWllpWdmYuPkZOkn4ljZVtkYExJSktPRkVBRko/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6qkn6Oframsnbuwqay1ssfDwcKzwsS9xsS8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2qoqWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLmgoaSSrq+spaafkqGelZ6PkY6VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+OoKGTi6assKWnopygnpOSm5SFi5KNnJ6AY2ZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZayq6aipbKsrqm7sq2wtbTGv8TEtcDFvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6yhl5aRpaSiopeYpK64rbG1tqCfqKSZlJWTpKC3oqSllq2xsqWqpqGempqblpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6GZnpaMj5mQgYaWiZSfeWVpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaudua+rpKq0t7Gwubewt7i4xb3Dx728xMHHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwrrOrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSOqainn6OcmJuTh46Zi36NloWPm2tpbWFtblhRUVpVQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaifnKGpvaGqsKqjsbippbWyq6Gttb2vs7i8ur23tsHCv8nEucXDwMC4xL7BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8rrG4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+opJ6UoZibqLWpl5mSkp+ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWWlIGPlYV7j5KDjJdmbHNocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xjYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa6zuaansbjGt7G3vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvZ6rrrGjqp+wrbOurraxubapra6wp7aws7u8ybKqtbSxtK+upqGzn5qoraCllZWambGjraClr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmay4o5iUkY+YnKGYl5Ssn52UgZOZjZ6dmpaQipSTnpqlo6KgmZaSkpZ7i5CFe4yLg4yTa254bnV8YUZgallJSFpbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZegsKixqaylo66utam3tLijrLS3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6ytsbmVl6auq6ejsqmUr7qkrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qbS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoayom5ydm5SquZyVjo6LmZ2imJCXpqGfloSSl5CdnJiWloiXkJebqJ2koJKWkZCWdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5GZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3wL2vrLOznKCnsK2lprClnrK1rKuysKypqLS5rLSytayzrKmsqKypua6xsMe+uKW5r6mtraaorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmpqSpLSaj4mNiJKjoJWNlJ2glJOFjpSTnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoqmvpKiks7SxtLWxsaGsrb3Muq7BvMextK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzBsKyyraCkp62pqKSwo6qxqq+rsa6vrauzu6e3sbKpsqmrpaWjrbqsqrHCubSsuqioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6mZo5iZj6CnmIaDjoqLn6CPi4yWnI+PhoiRlaCdlpiVhpaTk5elnJ2cjJGQjYp/f4iFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzyEfEY/V3VYYFlOY1xOVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6u9ybyxvrfDr7Gts8TEzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Ourqulp6qwqaeosaW0raqwrq2xr7Oss7ukuLSsrK6nq5+jnrC3q6qturaktrWkqaesrKqtoaimprGypKaloaGrlqmglJqgpp6koqqkrKKeprG3rK2ipKKaqKqtqZyhpaSkmaCZlY+YnZSBgpCIhZ2gjYuOjJmPkIuEjZiknJKRm4yTkpKUo5qbmouOi4t8h4GCg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVlRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqmttau2saukq6qpvMHAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsq6tq6yntqqlra+rua+osLCusau1qra1p7W2q6ykqaqco52zs6iopLS0oLauoamoq6isp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6SmpqmcoqSjn5mZn5GOj5mOfoeNh4WenoiFiouPjpCNhIaVo5qOjZuRkpGPkp+XmZaNioN/dIeBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUV1RHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJi8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Gxr7iuoravycfI0cC/vbq8w766w8HAv6+ys7K1vbzBsrKzq7OppbWopK2zs7mvo621sa+xuaq4rqqutquqnqqrn6Ogtq2poZ+vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKiin6yhoZKhoqOmmJqoppeXmJ2PioeViH2NhoWEpJeFgoKMh4+OkYSFlKGXiJGdkJORjZGdlZePioWGeHSBf311eXqAe3R0e2qCh6N1aV5lbIJ1Z4iLfFJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE86V0I0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNDCvcC+ub6/vMm8wrmwsLWyury5wLO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlqSbpKWfpJqaqKqlnpqpoZuRmqClnZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd8enVwcX5phnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj08RltAKo+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur22rbm2v62is6arq6+1uLSqnbq7qLK/srqgr7S2qayerbCinKWoqaOenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppefm6GjnJ+bmqOpopqZo6OVlpOfoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enJwcHN4aoJ0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTVxebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk9M1FcPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfKx7+3wr6wtL63xLbDsq+6srPAtbu+uKm5uL6rpLWnqKqwrbmwqZm5vKOuv7S0oa64taemp7CzoJ+kpqehpZmfraipnqCqr6egppejqaCwuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhqb3BxcGp/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU1bX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBcWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXFx8C3v8K6sbW9t7+7v6+svrC0v7K9w7mpu7u4p6i1qKersKyzsKaZvLakq7u1rp+xuLCppaevspuhpKCjpKGWnLCmoZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImLj4Z6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZW1sbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5XV5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5ZG04NEdBZltIVERVXWhELjwyY1YsMpWioZeUm6qdpKGioLiqrqC6uKasvcWzsK+jtbCtra+0w8O8s7+6uLGzubi6uLqvrsCztLmwv8G4rL27taais6qnqbKrrbGhmsC1pKe1taiesrypqKapr6yZo6eco6aUmKGypZmfo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2UkqOopJCJio+GeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhoamdncIZnaGlkZmlqYGpiamdbZXtjYFNzVFxbU0xKR0lPU0AhKmhdakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWdPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8C/vLHBtrGusra2uLe2raq9tK+ysb2/uK68vLGln7arpaW0qaqun53Bq6ilsLKprLW7nqmqq7GlmJ6qnaakkZmnraKYnqSpoZuinZegnae2pa+qr6GhnZ2hlKCmn6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqLiHmFd4KCgpyIi4KJfH+EiIaFkYSWlY+OkJGRkYyTe4OVjYVzfX1meG9ramxndXNrY2dkZHaAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0hLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0JoSCU1m6OfkIusoZiYoJaltLGhsb23obHGvLqxsaS3rKuuqbm8u7qtv7Gvrq62r7O4s6isurGvrrS2uravub6tpp61q6CgsKSrr52iwKCxo66wrreutZ6tr6ytopqdp6mlnpWbqKWfmaSiqZ2aoJuUnJ6sr6W6qK6ioZqanZmeo5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY98gnOBgYuYhYd8iYmEhYqMipOEk5ySkpCQkZaOkH+AjI2DcIB+ZnltaGtqZ3Fya1xoZGNzgWFmaGpubGdramhtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZkMnNJKhmo2OsJ2ak6GaqbKvn7i/tqC0wru9ubGmtrCorqW3uLe3rLquraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqa2ap76YraOur7W1rayfsa2vqaKcnKOrqJuVnKejnZqpoqSWmqCckZykq6qpu5+npKCYmZmdoY9roZaZnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQf2eGgGh1aWZXXGhzbk5QamRncoRnX2Rmbm1qXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGWlFVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NlmBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky6MpJmGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukt7Oxs7C4raqnrLSmsLWjqLi2tainrLezrrSts6Kqn7SrnqGknKanmKu6laalr7K3ra6kqa6rrKWhn5ygp6ebl6GlpZubp6edk5+fmJCeqKqjta+jo6OclpeXl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIhHJ4jY6FiKF2iY1pl4hmfXJ4oXCIh4R+jXx/oaCgmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVlqcW+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NV0lSU09FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNzAoi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprO0rq6ztquppbGtpbW0nK62trSlp6mzsa2yqK+fq6GyqaCjo5qho5qts5SjpKW2vKesp6uqrKiloaCYoKajmZmmo6SYnKSplpSjnJSTpKWmobejo6CkmJSTl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqICHlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B4aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mkoGmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm6CdrquUnaGftLqjqqmira6lop2amqGnn5ebqKCfmJ6np5Gcp5uUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaGeHlkV1nGB+Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZWDrKelnqOlqrK4rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZebm6yllpuhnrSzoqucoq2toJ6al6CiqJ2ZnqSfnJqhp6SPnaOal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4Gme4KGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouYjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKq7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2sopqZpKi0r6Kpj6moqpuelZigpaean5yin5ugo6WjlZuemJqdoqqbpZmcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6OCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CpY3RyiG2XiGBTtbTIhoCJfGOkM0Kddl1QamlkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuhk5ixqKils6qltaikvLfBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqitsKmjno+soqiWnpecoaWhmKKhoaGaoqKnm56hnpWZm6agnKeVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnuFf6Rvm6qma4eEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpkZlhBT2tfbGhPVUdJOT1WUltYWElDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrytprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2iqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq7CmopaTrZ+lkpShm6Smn5SapaahmqOfrZqgnp2QlpuhnZyllZ2WmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXiFfY6ehpmad6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1fd3eHaJiIa16vd5Wej3hsNXnIrrJfQlRvXmdgRVBtX3BtVlVNLmVjaVNZUTtCREFMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyurezuL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyvpqCVmamfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52hmJmclpaioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFtMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rrammtLC3sLW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09jUmtlYm1aY11gcHtjVFpRPj5tbzNCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doZuYnJ+Qk5SrtbCnmZScrKqXjJOlmaWtopGWqrGjoJ6nq7CYoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIeqfb5uc7x0soN1eIGLbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbKspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKMnKOel52akJWSr7mxrJWXo6enlJGWpJ2krZ2QoKirn5ufqaOznqOljqeilaKanJeVo5iPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4uGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbZ0cnB3toxegHp9imiDeW55Y4uscHWFf1lbp2pFZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz47PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6noaqXlJ2QopuRj6KooZOdl5OXlLK1t62YnaOkoouSkaacpqublqikpZyaoaimp6OpoZGtnpeknpeXl52ej7ColJynoo5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrgJqVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx7gnNJSm+GcE51TUVXXWZgTFtYZ2NfT1ttdWlxUlBERU48SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+qKmmlZSclaCakpekqaiQnZGPl5ywsr+sm6edp6KJk5Gpm6mkm5uroKOZmqOnrKOfq6KasJuVp6CWlZ2fnZexpJihqJmckZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkpSYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHuKa3OBdIN1ZHd9d2twe21gY11wZ01ZWWZqYFdacHpubGZTT0ZTOU9aTVJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC5As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAqLShnaSlnKOVlqCqpqyjo7ern5mWlp+XraqmwZ+spJWSnJeemJOUop+eoqaTkZmop7LEr5qrnKqfj5aWqZ6rnJygrJihm5yipK+noqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWPm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6kIp8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgamVjZGZrWWt7cGlqXFNMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6grKKQkZ6amZORlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKmvqqajq6Ktm5+goZmknpyena+jmJ6ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaN4a2qLmKOemHNsbnqEjYd6WGVehYJebIuKgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY15STldKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmSkpugmZmllXulrKKotMS4pKGnrp+elZ6jnqOco6qokp6hnaCqsKqro6qgqZumn6ihrJahm6WwpJecq5WhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KIgp99lZiJnsC9gpadnY2dwsF7gnuSjZrDwH1qpbFvjIFvynp/m3eSg46BdnqBgHlxen+HcXiFjZN5bXeUY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCroKuYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq63AwLCgqa+pl5KfnaKZoaOqo5OgoZ2dra6prKajo6ehpaaeramSpJuprambnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeTiLNjgquGoI6Ns2qErnR9l4e4YYOtWaPNbpB1e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Cj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOT42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+cna2vp6upnKeopKKrkq20l6aiqqmdo6alobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZSPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVgb2lpbmZjV1NdYVlSU0M5SklARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJialqinr6yop6mel5Sao6KRlKGtm52mo6+so6u0qrrNsq2mrqyWlJydopmfrqydlqCZnZ+psqmqqpusq6SjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGVh65ffKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVMTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKekkJqiqKCgpZyxpqOnsay2yLK1qqyqlZGdnKKZoKWznZqglJyfp6yrpK6araqjoquis66iqrOxoZqpqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4qaxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZmpzcWaBal9hWWRtXF5ZSU5NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKys6qtqJOJl52kmqGjr6aXoZSYnKWmq5uwnq6opp+so7etobK5r52brqeys7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ+ErH2alGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hAODgyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppujp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa2pramRh5Ccp5yipJyllp2YmZqmpKmar6KupaaYr6W8raG3t62enbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmVkJptcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4anlzboB0XWRkbm1mZ2BKW1lYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKiRlJeuoKCepqOcp5y0mqGqo7arw7Cpq6mhjISOnKGgpqKVmpqbmJuZpqSmmKyorqOlm62nvqyUvbCsn6Kwsrmrs6eaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZSSgHmvXaOBfKanZJ2AfJd0a69dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2N+dW2AemBnZXFuaGdoQ1phWz1LVDNVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTgwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKefp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamkn4uAjpuan6aekpWampSamqakpJqprKykpaCqqL+ll8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsVt9tFukg2vIomWfgHu7WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmPnX5kc35ihHh0gHxhamdxbWZlZU9VZFxCVV8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkZDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+poo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Oqsqm9r6Wonp2OfYublaCgmZCSmpuRmpipoKGZqK6npqajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5WztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwrJeMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5uXknuHmZGmm5OPkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYF6anFpZ4mWlZhxaWmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2Tj6KYmJmSl599h4+VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBojLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqmVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epquhn6OjoJGLpJKnmaiZlqOpoJacpqaor7qsrJqbk5J7hJaNpZiNkZKYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkY6VhYGkmZeVjYuTkoqPhoR9Z4p/dIJ2dIeMcadte5SRlJKBgY6QkI+dlKGWmZeig4iVjXJpkHdwi3h3fHpqbGRjb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqyloJmnnp6TlaOWqJqomZSmoaOQm6iZobW7qKuZmpCNfIGUi6GUipWSlZCQlJelkJ+aqqCctqOeqKy3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSJmYd6cpZzeop/cnx/am9kXnBqYVtfWW5jUGBlUFo6R0dFPjI9PjcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVVQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj5+5tqWmmZyNiXmCk4uak4qVkpSQjZKXoo2enqmen7ikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJaMkpyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmIipSSi1p2lZFoaI+OcnqmmplleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk5OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qilKehno6XkZ6Fda6PiKaaqJGXpImcurSooJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgpGXloSamWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH+TioODmWuOjYVseHtxcWdkeG9qbGpbZWtqZnRcX0lUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1haWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1npCEnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gn7qyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKmJGLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6KbhJqBjY6FiplxjpOFaHd0fHdoaHVxZ2hrXmRwbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6OvgKGnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYh6O5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onWAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaItymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWagbVtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWjqJKhoKCmm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipipmJmakoimsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwc5SIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRo5Ocm42MqailnpCWh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmiVml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeaXal+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU83VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9iYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Gi56SnZyJkKmjoJqMkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoKdbnN9lG+Zc2ukXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVXQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6SiqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgYmZlaCbhY6pnJqVi4uKfIRshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4xggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Fm3B5epdrm3t4l3NuqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYklXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6PiW9/ho+TkmyXk3yIkZKkloOOqpqUkouFiXmDd4iAboKfh3eAk4aImaKXe5SipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjICMpI2Wg66hlHa1tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpKXioBvTGajknCbh3Kke3l0YYOCa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhyUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUtBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobOrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVppODl6mYjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCMhox0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WoVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqiQgaKskYaQioKKfoCAjnNoj6WEfYaUjYmYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpyffKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlcYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx7b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZimjn+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hVtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpZyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aZpI58p6GLhpCQhZaDho6Yd3KFqYaOkp2QiJ6eiIybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J1gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm6CQgqeiiHiOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4eTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLKmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoB7coKAeH99f4V7bYKMhnx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npeioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXh4SDkH+AhoSGfYaDjpudkoern4NyipCGk5GMnZF9jXqqhI2SmJaPnJeHhpumn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ2TnY+Nqo6RgJ6MiZOanoKOl36GjoNvd4VxdWF+go+GdYuYgIOPgoaFfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiIqMfG9rfoF8bmhsbWdeen9ofXt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pogIBsc4FsbHRveW+FeW2HgHaCgH6FdnGCjYh+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlam1ti4met5qhpJ+SkZaXi5qfn557eJ6nkZyKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2CmImBiI58foaEh32PgZCbm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gZCamJKMmqOho5qXkZt+jYV4gIOOh6B/fYyNkHyYpKChk5mQj6aNkIGbkYmTl5t9kpJ+h46BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfHxxeXuLhHp6kYyDlqWTi4aQfIaGh4V2goSJiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrZGxoZoCBa25+aG9xa354hnprjIFzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lih2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmtveYmNnrKRpKWdjpCYj4adoZudfHaloY6YgIyiioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loGVmJaNlqCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6OeoZOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCioZ2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWl9g2xodWhsb2mAfYF5bZCGcYCDg390fIOMgYB+eoKDfnyQbXaJdHRtZYpsamJjdVaEaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qp2KmXqXnYuMmJB5e4GLfXyDe4CDgXh0eXpzfYCEf4mLgGRefYuVh3+Fh3V9fop/fZiEl5SXjKShmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5OSlYaZiHyKiYF6cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dniAfYaAfIONhIyUpI95hIJ0iYd9gHR2gYmEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2pmamNpd4huZmxoamxogX17d2+QiHOBg4R9dIGGiXqDfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2Z2Z25sYXlpa317eHBheG2LgJmZqqCjqJ6Ki5KGip6LlZh9d66ZjZd9n5SRlpSId357inx7gHZ3f4BwdHR7b4V9gYCKfnxhXH6QkoaAhIRzeoCGeo+SiJKRnJOlnJWCfoF9jouSpImOio2Ymo2GkZiTlo+KiIySnJOQjI1ug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CVmpSikpKJi5qMgn+Rnn2Sj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiYSMlaiMe4h8fouFeH5xcIGGhGNoeXR1cHxiXnBga3RecGp7eXhsc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GObmRpZ2RpaIF6d3VvjoV0gYKDe3WDiYV3hXx4hIV6gIp3f4t7e3J4g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlZOOh6GNlpOQgHR7doV4eX9yc3uFa3Jwem2KdoCBh25xW1l+ko2IgICAdnWAgICghpCLkp2YoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYmLkJGJnJahnJiVhZeIaYSjgmaFnYqRfouDi4F3k5iRnpGQiYmVjn9+kJh8kY2PjZqSfIqAgm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2yBhIJecnNycXB4Wl5wYHBqXm9qfXpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk25gZmZfZ2uBdXJzcIuAdX+DgHh1gIuAeIV/d4eGd4OFfIaMf3t2in9qcWN8Y4Z8b3FtdGpob2x2eF9xf3l7dHV0gIJ+pJWarZ6mloWMhH+XlIOQn3WLoJSThoubjJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauVh4J4gHdzgnqCoIKSgpOTmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHOLhYmOiJyan5qWlICTf2iFnIdnhaCHkoORg4lxg5GXj5uOj4yMkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx6iX2CjJCenYV8fHeCjH13cWpsgoN6YHhvbWxydFZeb2JyYF9sbnlwaG9mZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHSKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4ZnJqg2CIfm9va3tgam50f3VfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHdzgHBvhXRwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN2g5+Ck3eUkZmckJl7lHOFkJ+hk5OQipOblIZ+lpaIjY2IkYyInH+OgHd6jH6Ii4qcnJ2blZN6jXZniZKHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqTkYp6hXx+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenpoc2pzio6JgYWFfZWLa35/boCLfouHfIR6go+VmpqKfHZ4g5B5c21ncYCEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY193YGBWa19ed1BOS2FnY116cYl0XFxldmBhZWWPZGBlYlhpc3Nua3F2jH10eYaBdXZ+i3OAhn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WmxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76FzbHWEdoSihZJvlpCVoJWcgZJxhoujl4mOlYqQnZaDgJWQhYmPgJGKiZZ+h3p1f4l4hoSNnJuYmY6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkY+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZnNqf4mOiYKCgIyWhWuBdm6IkIKPhH6Ben+QlZOZkHRzeIiNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmBiV25aXHhOTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtyd4x+dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRxgVdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXeKmoiNaZiQj52Wk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uQi4WPgn92eIOEcoeCk5uWlJiGjHWHf3CEgomHmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6OgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qBfn+SkH1tgmx4ho+GkoN8gH2AkZOQlohvcXqMhnVscWxyeYFgdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hiaVhtVlx1TUtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm9pc3iKfnNzgX56dnqIc4WDfYCHdneKho6YgYyBe5N2bHd1eXiTdG54e31ZeoZxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCneG9xd3xxkpCMh2qZjomckoyGe2mIi5qHgZKRhoeYjXyNjYGBiY17j41+iYV6dHuCenCGgJaZjpOUgol1g4Z2g3+Kk5yfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEfoOHfm9fcnCFe46MgXx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm96jH51bm9rbHt+Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanR3hn9xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xc5e8xYR2cZSJkH5yl4yGnZOMiHRriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4ODcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+HjI99aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCDgn9qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHmDfIGYjI+MfW5se4l9d3RvaWh9d2VdcWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aWBlcntaYHJ8eWdwemFlZY6xsndKYlqk2tCXcnuRi5B4fpWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4uHfGV9foN2Y3BzgGh4cG90mIyFgop7dnh/g3mBalxwfXKAh4WIfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXJgWXdaWXFuTlhyc2dgSmx2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaXhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3duiIRrdXt0ZnmCg6eMg4+MhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBygG9bbH50eImCinuGf3yIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhxWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZlX3RwW1lVb2RZZXB5WmheX2dtZ2psaXB4fY5saYKEf3lugHt9gX+CenWCgYyThXCAi253foB7e4iTiX9oe35qdHtyhntzd31/jHl4hH58a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvX2Fsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmKeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iIWlh4GHjYp+bn51f4B8i5mHgpOQmIiLhIl8j4lxe32FfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnOLgYZ3h3WBiXp4cm6JgI+AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQWFkW2B2YVx0bVhYU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx9cH5+e4F/gnp3gICJi4Rye4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g39+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ/c4R4f5GQgniWjZSPh4KIe4mJbHh5fnVoemlrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJyiYOCfIJwhol3eHBwg4KMfn15fnx1joWCdWlxaWyIgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxkcV5dd2hVV1Z3XlxlbmhWa15hamdlb29pcHd7k25piIx5fnN7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR5gHZvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thXSUhnh1bGB6gnmIjmZxg29ndW5bbX2BkJOAgXmSk314e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdIOGfn94a4iGc3lrdH+Dg316fXh7couAfHJndGVti4NtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG5mZmtxaHB2eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R2koJ3cGdefYJ5i4llcYFranFjWGx7hpyJg4Jzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW99Z2hyYm54cWpscXh9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXN/inuBbm6Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwc3eGeG6VinR/enh+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dXl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmGHdY6Bc2piXn54eYqDZnF9aGprWlZveIqjgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl1cm9oeWFqbWBtdmpna2x6d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0fIt6gWZ0hn1tcWh1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVqWmJkV1lVeVpOV25qWV1sZVxZZWNedGZtZHFmcnB0gHdwmoR2f354f3yFh311c4KIf5WCbnN4enpzc4WHiYiEeIB9do9/fYSJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdXBkZWNXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3BiaGtnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNp3yEfHaWkHN8c3t5bXt6kIR2l3yHhoKGg311cHJtZ3VdbWhfbHVkZ2Zpem97cllngXd0Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcnaJe31hdYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExOcEdee2ZhTVV0Y0pOU1dgand9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVXNXTVh1ZFpfa2BcWmNlX3dmbWJwaXNvcn50dJmBd3+AeH9+hoR6fXaChH6YhW5ydHt6dHGFhY+CgHqLdXSRf32BlI6AhYR8foyGen6AdnujpYp5iIaFbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1taU2JuZVtYYXR7amhtaF9iV19baYBqa2+AZ2xhaHl5a3R0dG+FgXp/fXZ1bnpoanlqX2VuaIF3j4RnZVhid2l+hnpvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhanhoe21bbYNzc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW252ZHBziHt4YXKAcGdqeHNxa3d2dHdjg3t+d3ZwZGNjbnx9a2tVamNnU0tsaFBHUmxFYXhlYU1Tcl1KTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUtceV9bX2tdXVtiZWB6aGxhb291bm93dXqXfXeAgXqAf4eGenl6g36Bk4RxdHR+end0hYiQfYB9kGxzlYF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1paWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Juhnt+fXl2cm16aGl3Zl1kcmd6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLenaOcYN9fn+GbmR2c2RoaF1sYl1vb1tnX211ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwcmJxcYR7dWRygGxhbHpvamh5d3RyZoV1enp1cWRhZG5zfmpsVGlfXlRMc2NRR1diR2J2ZWBLVHBYSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYmRegGlqX290eW1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXl6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrYF1dc4ZpWHBtW19XW1xse2Nwd3ZsYlttc3RndXZxbYV5f4B5d25vdGVpdGVbZ3RmdnaRel9dUmZmaoKBdH1hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp0iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3fGtubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2Rabm9hcHGBfHNlcYBkXm52aWNmeXp0bW6BdXN9c3FiXmZub31laVRpWVlUTnhfUkpaWUhidGNgSVRtVElMWlZpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JjXYVpaGFueHlsb2t2gZB4bYN+gIGSiISBdnWJdIyGc3F2doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpaV2hjbWVcXHKJZlJybVtaWFhgbHZkaXVqal5abXNxbHR0dGuGfH6AfHdvbmxkaXFjW2tyZHR2j3NbV1RkYHJ/fnKCXGFjXVNaYFxkk59lcnGFhJF0bGp5bG9vent7cYB2f3J6enpkZXVnXmJbYWhcXndoV2Jdb2hhd2FbfHZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXXGptYnBygHpzZW9+W2BwcWJeaXB8bGx0fnJxeGtwYFxlbG17YWdUZ1VXUlB2W1NQWlJIY3NiYEdWa1FJUFpVa2trfGVtb3FgW1pYWWxwV1JQZldXaFNURlpcT0hydVhfY21jWGFgYV6MamNkbXl4a29pdXmGe2uDfYCFmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gYCBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1NdW1VnYmxsW1xxjGROb21cVlhVZ2l0aGJ0ZWVdWm51bnB1dXpsh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWY2N3fHxwhVxjX2NUW2BaY5aVY25wg4WKc2poem5lcnZze2t5dHVven51X2ZyY1teV2JkWWF1ZlVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxc4B2c2JsdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF5mVGVVVlBVblhRV1RQSGVyX2FGV2pPSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2lRWWZUU0haW1BOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaXZ2f35tg4B+h5d7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Md3hue41gZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX19UZ2Bsb1xebo5oTWlsYFVWU29mc2tleGRlXVlwdG1ye3hzbYh7gHece3psYWVsbV5gbmplcHl+Z1pWWGBreHt7b4NeYl5nVllgWGSciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiZFhlcWNUXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3OAdHNeaW1TZXBlVWJuYXlicHV7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWnV1XV9mbWhYYmFbXo5xY2dqd3Fzbmh2c3mDc4KDe4iNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjYyNjY2Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMDAuXHBubW5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiGgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwdHRtTamdnZ2drPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4iIiIiGjZCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIiKioqKiYmGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOQipCNjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIiIiJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IjYmQiYuQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MiY+GjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn9+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4yJjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHt9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjoyNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t6e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6ent7fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9fHx9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3x9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e35+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOkI+NioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJSTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5SSk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpKSkZKSg5CTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKSi4qSko16kZKSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZKId5GShHePkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4tuipF6dYyQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+PimiAj3Z1iY+Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2JaXeMdXWGjY2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4BobYFxc4GFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1aGBnYGRpbmdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGZfa2xgamhpZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXGN0bWVxcGVdWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01SaHBsYXB1a1RQUVRQUE5OT01LTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNTlRmbG5jb3NyV05OTk9QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQkVJTWFoa3Fxb25ZTE5SVlBPT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQUtPR0hOYWhmcG9raGNeY2hXSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+QFReWV1obWlubWxqamxsVkZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8RVlmaWtvam1tamprbFdCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PE5pbm9rbWxpaWxVQD9DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo4N0lpb21wbmtrVzw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT09PEpncndzbFw/PT0+P0BBQD8/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV0dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbkA+REU/PkdbeXJUQDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg7Oj0+QD1nXDk8PTw4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdnZNNzg4Ojw/P1NVOTs9PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l8d1Y8PT89Pj9CVVs6Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BAPz5aYz47PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hXVMQUNFQD8/UHJ2TD9DRUlKSUlNTUtFREZHSEZHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcUJERURDV3WHiIh/WEdISk1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SKbEFBVXSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEhHSEZGRkhKSUlJSUhdb29xcnR2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyFh4aGhoeIiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA9PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhYaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk6P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTExTbHBxdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM1Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njo5NzY2NzY1Ojk6Ozo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozs4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PDxBQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4B/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNCQUJDQj9AREhEQ0VERUVCRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcXR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoeJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05JSUtJSUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQEFDQkRDQ0REQ0A9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT05MTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozs9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT05MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LSkpKTU1MT1BOSElLTE9RUVBRT09KSEpKTUpMRkdIR0ZHSEZFRUJBQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NUkxQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0hHR0hGPkBCPT89PUI/Q0NGVk5GTk9QVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toV1ZrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUVBQUUtMS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JWVlhVVFZUT09NSkxLSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5W11UWVVWXVpMVFpUU1ReWlhXV1d6a1hbW1xeVFFRUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnt4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5UY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hDREhHSEtHREJBREFPUU1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYJsTUc+Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNR1VudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVUV1FRV1VQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGVDQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX19fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXl9lYF1ecXZrXmBna3dvb2xqb25ubGZiWUhGRkhCQUdJRUVGRE1ST2FXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3R2eHd5ent9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XWFhoc2tdVmFza2FhX15kYV9eWVVRTU9OTElISktJSEZDUVBTW1dUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R21xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09UVlhYWVNWVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01MSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fX19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI9WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzdEbXB0dnl7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XV1ZZWVZRUVFPQD47PT9BQkFDQEJFREFAR0hHSEZGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRWVFdXVUxMS0k9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmJcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHB0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0hJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0xHQ0JKSkxNT01JSklHQ0NDREhKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFua2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETkZBQ0tLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A9PD05Ojo6QENAPkJDREVJRkpKTEZISUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmZrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD86Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSElGRURFSUpIS0lHSFBLRElNTFBNT05PT05LSkhNUlVVUk9XZGBhbWdwcm9yeXpnZWhoZGlsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTEhERUdDQkBCRD1CQT5APTo6PT87Pj5AQj5BQkRHS0ZJRklIRkZHRUNDQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkhHRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS1BTTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj49Oj46QEI+Pz9DRUZERkRESEZERUNERUVHSkVFSkdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSVNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2lpaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklJR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNIRUNFRUZHR0dJRkhLSENJSEdJSEZESEtJR0tITUxKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWlxaWVxeXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkZCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREM7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISkxLWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkI/QEI/PURFRkRDQ0JFRURGQkVGSENESkVFSkxNS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWt2bW5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBBQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTUlMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXXFtcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0RJS0xIRkRHS0xIREdIUEtMT0tMV0xJRkVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtMSktLSUdFSURDRERCR0pEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0lIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlLS05MS0tNTEpKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0xLTk5VTk9LS0xHR0tQVFNOUE9OT05PSEtGYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlF/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUlZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0hneGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f3Bob1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlJSS1FNS0tPUlVSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVWVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVlROUU5NTlFUUFVRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9hYl5gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFdYVVNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1JUV1ZXWFZUWFtUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWVFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltaWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hSVVVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVpcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlRVVlpZWldYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV9iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UU1hTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWVlaWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZZUVdWV1ZXVlRWVFhdXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWJjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgXl1fWlpeXV5eYVxbW1pcYGJeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWlpXWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxXXF5gYmJjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVlkZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x7enp6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2LsMG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkI67zsvLzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHl4eHh4d3d3d3d3d3h5eXl5eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX18fICDgoKCgoKAfH19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoOBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnV1eXZ2dnp7eHt4d3Z4e3h5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6enp5eXl5enp8e3x8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3t7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8ent4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3l7eXx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgoGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4OEhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRfdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB3fHt7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnV9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycnFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeG9wcHJycnJxcXBwcXFxcnJzc3NzcXFycG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5ubm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNycnJxhXNvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXJyentxcXiWcW9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcnB+lnFvg5xyb3BwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcHake26Qn3ZvcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFwdqqIb5mhem9xcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnB2q5VxnaJ9cHJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3Nzc3NzdHqronueon1ydHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHh4eHh4lLKlpKunfnt7eXp5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX59fHx8fX+mpqKypKiLent7enh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fX1+hqico6uanpt+f39/fHx9gIOCgIB/fX19fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgIGAgYGNo5OgrZ+hn4R/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIqejJSunJabh31+fX5/f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn+Dg4B+iKWimZ+blpyUg4WJjYV/gH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBhIuQlpikrqaim52gp6mhoaCSgX+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGChJSpsLCknaKdnp+hoqOfkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4KAgpSfn52ZoZ2doJ+dnZOHh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKBgo2UlZefnZ6hnpuViIeJiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhISEhIiTlp2Xmp6ckoSDhYWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgouVl4uRnJaEgYKAgIB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4CAf4eSio+ShYGDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qWiISChIKBfoKJjIKCgoKEg4GBgYKCg4OCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhISCgIqOgIKCgoSDg4KDgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhISDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCPjIOBf359fH2MnI2AgoGCgoOAj5OBgoKCgoODgYGBgoOFg4ODg4ODhISCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GXjICDgYGBgYKZmYSBgoGCgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODhY2NhYKCg4OCg4ODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJOSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYWFgoB+fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGhIB+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhoaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoWFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYJ/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGh4WEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQjIeGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYmIiYmJiYqLioiIiImJi4uKioiHh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkI6KhoSGhYOBgYKBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19fn18e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomKiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIKCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKChISBgoODhYaFhIKCgYKCg4OFg4SEhYSEhoSEhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICBgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn5+f4KDg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4CBfn19f4CBgH9+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gIB/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGChISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gYGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf4B/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9/gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgYGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBf4KCf4GAgX+Af3+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYKBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYGBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KEg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHiIiGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eX2BgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpaAfX5/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH18fn+DhHx8gYKEgoB/h4N9g4F/goKBg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXx+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHyAf4KAgoB+fXuKgn2Af36BgICBgoGCgICBgYB/i5SQjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WFhoeEhYCGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUko2MjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg4CBgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjY2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fH5/f31+gH5/foSSjYyMj42LioaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1/gICEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIyNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYaGhoeFgYSRj42KiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHp7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59gICAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fn59fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeHi4uLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoJ/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eHl7fn+Dg4SHiYqHiY6QjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99fYB+fH9/iYN/foOQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo6KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCCgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/fn+Af31/f39/f4B+f3+Afnx9fHx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGChIODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+fn9/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhYOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXl4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEg4GAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCDgoB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgICAf39/f39/gH+AgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHp8enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYGBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnd2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foCAgYGAgICAgYKBgIB+gIJ/foGCg4GBg4KDg4WDf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/f39/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn9/gICAf3+BgoCAf32AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICAgHuAfoCAf4GAgH99gX9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fXt7fHx6d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAfoB/fX18fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgYSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoOFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKBgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoKBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICDg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBf4GAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp8foB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WChoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3prc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeGg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KDhIOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoGEhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGh4SDhIWCgYKBgISDg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3t7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhIGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fXyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9fn+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxDOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+O0E8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1dXV1dXV1dXV1dXW19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxOQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHU1NTU1NTU1NTU1NTVybu9vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTTw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw3QEE8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDP0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF08iUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slMmarJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkA5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaanl4icnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOTY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2XosDJmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RUA/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mKbWlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp27s5/Dm9qto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg082Kkp7Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNXN26WZs9Dbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jIj6eaoK2Qp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWUjKelqKCvp6KpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKihko261ZqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPS1LnH1dPTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlLQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESTtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNudXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLi3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6iop6iop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampaOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpqamp6emn5uam6KgmpaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhn5eSk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyfoZ+XkZGQlJeanZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGgmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWkpKOioaGenJuVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo3ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6OkpKSioaGem5qZmJmZmJmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5uam5ucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoZ+fn56cmZminZubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgn6Cfn6CgoKCem5mcsZ6am5ybm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJycnZ6enZydpKKfnJqZo6yenJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5ubm52cmpqbm6mjm5qanKOLnp2dnZydnJ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiZm5qmopqZm56XdJ6cnZ6cnZycnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubnJycmJiZmZqZo56ZmZuhjmSbnZ2fnp6dnp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mZmZiYmKGal5qco4JcmKCdnp6en5+enZ2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJiilZSbnKN4WpCinZ2enp+gn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmJeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXopGOnZuhcVuFpZ6enJubnp2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yam5ucm5iZmpiYmZuampaMkp2OiJmVnG9idp6WlZKRjZKRj5STkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2QkI+LkY+LjI+QkJGOioiWjX6Lio50aGmLiIyFh4GNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJh4SBhoKAgomVkIl6in+FdmpkgoCHfYCBkpCGhISFjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N8jYyEeouEhXNqYIaKeX18ho2Ni4aNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiGhIiIioR/gn96e4aHfneHgIJvZ1uCi4KEhYqPi42RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjYuLh5KKh4aWiHZsgYV+aGNYf46Oio2JiZCPjo+UlJiQlZyanZ6orrKvsLW0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTU9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqGanZyioZWPoYtzbH6YiGVgWYGRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pEUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqamnoqWoqayqqa+gnaaRfHuLnZpyYl+Hl5SXn5+hpJ6bmqSnpKmrrqylpKirr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurquqrKShoqWpp6eoqKmcjXh7lo6WeHBtk52XnqGhqKegoqKuq6uqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPU2VcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpqipp6mopKemmZ2kpqKhoKSminpmYY2DhWNwc4udlp+amaKioKCfoKGooJyeoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9YT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraemnJ2mnHpmVk5+e3lOX2p4mpucmZufnqCfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9bVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq6+pqKqooqChqKqusbOuq6KhrJJrUUpJd3RvRVFha5CjnZ2fnZ6koqKhoKKYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NtamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo6Ciqqqnr7e2tbW2s66rr6uCXEhDR3JpZkNGWGZ+n5qcm5aip6WnqZ+jm56hmpaepJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKdoKqyuL29vLu6v7SusbyecVBXTURvYV9IRE9gb5WWk5qWo6uotq2io6SrpqWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHZscGhpaWJaU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1trzByMC7vca6ubi8jWFZjnJDbGBfTlJXWmaRn5aipKinoLqmqqu1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmdG90aXRkaWRiW0xLPjo5ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7BxMfDw7m9w9TWx8DCvLu6uohWe8KqTm5uZ1FbZF1ciKyop6yii5S1pqu0vLC1tqivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYl9ea2Nibnh1dm5tW2JSVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMLV4NrKtby8wMCSUIvAv2F9gnldSmlwU3qzuKicgm+WsKOmsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx+hH9pZmhha2xnbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXEv8PCy9vZyrPBvMDGpVWCoqJwnI+FfEV3jlVrq7CUemNxq7Smqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH50a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTNz8O9uLi+xa9jdHtri7eSiJlXe49da5CFcmFajbe1rK6lpKOopKCfpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXl7d25raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbExcvCq6mtsreecHFtXKS4kIidaGdyaGhqZV5XaKS6tbOsqaKhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc7PzMPHxsjJyMjJx8XLy6+XmZydjnZwY2CqqoyLlHBgZGdhXVxYVYu7vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfCy8vIx87Dm4aIg3lnX01goZmHjItzZWBeWFdYVWe0ycC8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvJvLzIx8nNyMPIyrR+cWpdUVBCXIyCf4J9b2ZbWFRVVVSJwsDAurq9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXlldVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMjDxcTAw8LBkl5STUhLQVV2aW5zb2hnXVhUVlNgqcC4ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2NjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrPwbu/wLy7xq9uSUZESEBNZFlgZ2ZiaGRZU1JbjL+/ure7vrm1uLS4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFkYWJjaGpmZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbvBuL65v7y8t7S3r663tbm/u8LXjbq+usO1uce3nGBBQEU7SlxTWGFhYGdoXFJTfrTFvMG/vMS3tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXlxbWVlZm9pZWxoWFhOS0tLUkpMSEQ5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHWqy73HuLm3rbePUEBBOExYU1NdX15laF1TYaHByMPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncWtzZmJtYFxUSUtKREpDQ0c+OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLvAt6qtpK6wuLuyvb67xLa1uLW3v77EvMLE16xygL3Iz8LAt621rX1PPzhNVVJTXmBbYWJeVYy4vcfLx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoBxZmxpbnRueGNnYlxjUUtUSEVFQ0dCPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vMbJysLHydKWbnKu0tHMysS1ur+ugkw8TFdPVF9gWVpbVm+3vcDDzMrHxcbAub68xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvF0MK6vrzEvre8wL/Jz8fIysrBhHBypszMy83KxsLCyb51R0deUFJaYlZRUlyiwr/FwMrJwsPDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd8YHFjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLe7ua3bwr62vsC+vrqmnKqzt8TApXZ0d53ExsvIwcPAv8nLpmxLXVJQVmZOSlmPxMDAwb/Kx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2hwXVteXVlSRkRDTUlBRD1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xbRtr869trnAvKp9bmhubXSCmJdwd3yYvr/GwLi/vL3Ew7yodGZYVmNwTVuQwMS8vb+/w8K+vse8vL+0tK61tby+v87Ny8K3sri3t725u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1e3BuaVtfX1lTUEFGSEdLQEVDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM2wdYK0vbW1waSGaVleYE5TW1xvcnaCoLi3wrqzure6vL66vbGNbmZ0hG+Zv8TCvbu+urq4tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur66urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1bVEo9Pz9HRj1HQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLJpYR4jKKwtZxqZmdVWV9JSU1RVGx1h6awt765srWxu7i7tbnAr592eZqtvcPFw8C8v7mzrrK8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JcXk9JQj89SURGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeHe3aNoZdfU0NZVUhialVORElkjqGsr7a6tbOxq7u4uLS4wbu7gnWbt7zBxsK+ubm1raWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq2u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve292cm5jXWdYXV1TT01BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI9tTUpAZVlCUHiBk2dMQl2CsLWztbK0r6y7ubi2ub/Ct411hK61uru4tbKxrayfpKannaOlnZaZmZqfqa65rKurn6WopKuur6ewrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlsXVtqVF1cUE5IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWMiIV7V0VCUYhYSUpYeI2BYUBWpLmztLOwsa2wubi2u7e6vrGsqqSurbiuqaqsq6OooZ2dnZeXoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmUZ0w/VHlxTklJS2idflhFWLO7sayzr66srba2srS1rqiinZubm5ynp56fqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsbl1RaFRQTkdQTUxCUFFAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqlvWZFU6GEUFdJS19JWItgZWaEr7WqsrSuqquvsLKzraWckJaSjpefnqGgnKOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enpqXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJyZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUmRNSkhHT1JOSk5IPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMa/y55OQXWcbk9tSk1jZnZ0YF1ic5Gyr66ztaqmrKuim5mUjZCVlpiXm5+hoZudpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpaKbmJ6vqK6yq6WqqqCbmJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiU1VgSElKS1NUSVJRTTk/QjY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXHxotWUktmo1hmfW9yW1FrY1xnYmBskbSwsLispqGcnZqUl5qZj42QlZGLjY2TmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6jmZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTUI3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOLeFRqcXd2b2R3dlhXYmBkaVtbVmetrqyvp5+eoqCWkJOboJuYl5GSn5yho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbVpRYEhSVUhGVVZKQ01HPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35ugnBgY1dMW1JaTExRWVJIT01HmqyqqaSfn5mSkZOYmJaVlYyIio6VnZydnZ6WnpqmoKCopbGqp66jq662sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjnpuIYVdeZWBXTVFGPT9AQ0Q/PkJRd6mtqaqln56eoqOdnp2anJuUk5SUnZ2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Oqs62qs7Wvs66qr6Odq6e2sq2isKago6+xrrCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRJREpQST9FQTRGSDk1PD43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6CaoJ+VfF9eZWBQRkU7Qj5GPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tbq7tbu3sLWyqrqyrru3v7u6q7itq6q4urW8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZuafXJpYVdORT5JWnxvYUE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM3NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwrzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMTCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpydlWlmXFRJREA/SoeepJiDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHHzMfJyMa/w7OzyMTLy8vPx8q/vr+9wcfFzczIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZthU0xKREM/Q1Sx0b2yr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbO1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD01NTg2Ozg1OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURBRlF3sq+nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsLIxs7O0dHSyMvNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjQzOj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaWut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjqmVDOD0+RFiCqqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NHKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzMrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru5tau2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF5SEZCO1eOoZuVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Ty87Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysvPys3N0M7TzMbJz83Ix8vFxsHGyszN0NHG0M7OzczQxcfBuLm9w8K9w7mysr6xu8PDtaqYpaGYlpKVlZKLlI2akZSUj4+VgomGeXFya21nYGBwaFlYaFZNR0xJUFFCO0M+OzY4Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62XeGxwcnuRmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JxcXJzcG1yeaXH08/L0NDT1MrFycnGxr/Dxc/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8fHz9LL0M/GusS/xsm9wsfJzsTCx8DHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLycfL0MTFx7vHw8nJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr25zczG0NXV2drb2NDJz8/R08jCtru7raO2fWiDhaSrlI6Nlo+Fg4ODgX2EhH5zX1teXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299udHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCysnBwcvQxcvIv7nBu8bHvr/Gz8vDv8O7ycfJu8jHxcrAvsLLxsXEvsa9vMDDxczFxbzAycPFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaabo6CblXt3cnRmaVphbm1aXFhSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtmxeeX2ikYuSloZ6gIWFf3Z4dXJwX1pbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcrFy8DGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvDyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7u9xrvDurO8xcTCw7e/tba+v7vMw7y1usi6v77Lw8HGwsXJx8nG0MbCzMeyx8nDzszBxcO/vbK3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRUdLQUVCRkpAOTo2NDc4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrOxcnFx8G5xb2rraVfZHWEk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLitsLGnqq2sp7i0trSzs7S7tb6xtrC1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK9t7zGwcO8ta6ytbq/tMS3u7WruL2+wL2xurawtrqzxby2rru/tbe0xby+wsXAw8XGx8vFwMXGu8fLwM/Jx8PGwcO3w729trm+x7+stbu1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HGwL+6t8m2qrCYW2hvio+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx8C4uLWwq62nnqKpp56qrLOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7PCurDAsb68vLa8x7nCt62qqLCywLa4vbCxqLGztbu8q661pq62r7uysKq5sK27rru4u8DAvrnDv8bDxcG8xsLIyrjFx8W/x8PDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlXV1tBTEtNSkVBQz9GQTo5Ojk5NTc1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYmRjYmBfXVpbWlpdWlpZWlxlbm9oZmdpa25yga26sLWupaSnp5qgpKCanKWrraSooquqrKuwo6afqq21trG9ua+3sKiuuLS0vLi0vK+4ubWyvMCywK+lqKOrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqWot62xsre6uruyvL6+vsS/tcLBx8i3vr/Ft8TDv7u/xMK+xMjMyr+/w8DAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0try2sa+1u62oq5JkbYiDh4uAen1/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqqWspZ6coaSUnaSbl5Gho6mjo5+lpqemraCdnKSmrLKwtrensa2oqrWrtLmxtrautrmysLq6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW9trvBwLK6vsPBsbm5wrPBvsC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RHRktGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpSdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXKGhYaAfHh1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ttb4edqZ+VlZqhlpuimJWNnqGip5ygn6Sloqeem6OboKuwrbG1pKmqqqyspLS4rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmaCfnpmdn6WamaOcm56wqaunq6usrbCyuK+4ubqwtry7uquzsrmzvrS2srG2tb+2vsC9w8K7ur2XhHpza19lXmRkWFRXXUlXXEtQR0pKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5iekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKick5SUmpeaoZaWkJuioaienJ2lp6KlnKChm5mvrq6vsqGlo66rp6K1sLKyrKivs6e6s6a2oKKenKOhraOiqraro6OmnqWmo5aZnZeZm52gmpednJ2craKrp6Sjpq2rsrOqtbCyq7K5tK+qr7Kys7izrqmsrrK4sLq2ur3AuLOxlIV6dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqqCUmo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OTj5SWlp+XmZSXoJ6hnJagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy5r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCtqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBenZkXmFWWVhTUlNLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6eiqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoamUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZWSlIuRk5SamJyVlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kjt6ihoaKos6KlqKWwpbCurLSeoZ2VlamhopStsbGfo6Odnpibk4uhlJGTmJiTl5eZl56nnKehopqkpaWrpKWwp6Wjq6utpqmur6+rqKqqs6amrK+0sa68tbGvr6CSendyZWFcWl1YTkxRR1FhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWmrLi7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYWFjZWmAkpKIkI6TkpOclJWWo5mgl52gpaKtpqWlo6SjnaqrpZqfpbGqoKGepaqeqKKeraypqa6toqKilZeim5yQq6mwnJ+in56XmZOKnpGNkpOWkJiYk5yho52koaKVoKGkpZujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqwqqyejHJwb2BbV1ZVUkZRTkhZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbzAu7S0qqymlZqbnIiBcoiDe3RpaWpsZ2prbWtqbGVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlJOUVldXF1dXl9fX2JkbY2Og5CGj5COmZOUkpyao5yboampq6isp6mmpJmlr6WVmaWvqaCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMko2WlZCeoqCjnZujlZugo6GXoaijo6iroKuwpK23pqOkoqytqqirr7O3s761s6uvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5Nzc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZmRdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR9i4CKfoqPiZKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaedmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThoiNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaioqKCxsKaxvaifo6y0qq6nsLWwubXAsa6xqpF+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba3vL3Bw7GvsbettLS7s7Sio5ydl5eUg4B2a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1han95f3SIjIaQiZeJlJOYm5ieqZugq6amrJ6omqCmnJOPn6Oal5eFhJKbo5CVo52WlpaIopubk4uOipCapKeclZWXm5GSh5SOi4GLjoCQi5KSkqCaoKKWlJiYlaKmmY2ZpKaopqGgtLKnsrehnKK2rKmtpLKyprW8taursaOJeXNuXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrClp6SqpaCopqWzqqKyw7W1srPGxra6w8rMxrOsub20t8Cvramwnqauuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFucXVvg4eBiICRhI6KlJGTnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+KmJ+jnpCTmJaFjYKUfn5ziY56kIeTkJCcm5qakZaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywvKqpr6qZg3dzY1ZNUk9QTkNTTkxQTEJQUUhJTVJNSEpKREpMRkpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTAyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBrK3DraehppKdpraso6CPlZaSj354fmZXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWpxa36Ee3NOWHKPgpeGjZyXi5SRn5idlZSWlY+WiYCUiV87Vm98jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWMfYmBkY2Pl5qYk4uQiZ2In5iHiJaemqGgl6euqa2oqJ6XrbOipq2ZrKuYqLSiqa2jk350bl9bTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOuoaamqqCnqaejqbCop7TCubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJyxopqYhpSPi4d9c3VdUExRVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBsbmh6gXRPQj9/lZKRfYiUjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH6KiZaLjpGSloyDiYiVhJuNgoSSmpaenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpyjp52foa+hp6ilp6ivraq1vLa3t7PBu7aousi4tqiotbaqsr2mnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboNzdX5paFxUj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cHSOjoF6foqrhHl7aHZ7jnBybXiBi42SeHqAe4B2c3KSd2h1hISEhXuVioiKjYqAf4SLjYCUhHyAj5iUnJaRn52pnp+gnaCppZ6dmIynpJKgoJaen6SAcmhhXV1KV1BSSEtYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3Ojg3NzU6PDs3dq6Zo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKwoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZnaNlpiNjn1neYF2eICJkH2EmJKBcYePfHd7b2t+rX10kIt/e4aSgXx/dWZ2fIVsb2dzfImMh4BseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6jIZ9jHt1fY6Sj5iLkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZmJaWFhVUUpTVVRPUE5QVktOS05PSlFPSE5QTEZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+uLOsp5uwp6ybj5acpamkoJeZj4WSeYiOi4p1cXttdXBqbWpYS0ZHRUFAQ0RITExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnR5Ynt4b3x5iZB6fYuGb22Mknl0eWpqgIJxlpGLgX6WgEmSmG5oeH6CbWlkbHmFkJKGa3NsfG5yfIZpbnB/c4yJhIZ7fX57dm90dIWCeYF5cHyOjIqTg5aXmJqQkpaXmZedloyDiZ6Ri5KNhpCWgG5pb29vWFZYVFJRWU9SVFRSWFVMTkhNSk1OS0NITUdFQDo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo62qqLWvrqy0v6u8w7+lopmVpJeejYSLlKGhmZiRk4tzjnqAhoyGdG90a3BsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxfp4himmlzeWV+cG1/eouJdoKIhnRsmpJ0c3xqap2PTXmFk4mEjmcxdoZzbH5+g3RmZXV/hISFgGZpbHVrcX98aHFxfG6SjY98c318cXBudW2Cfnd5dWp5iIKIiYOWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSEhFSkpIR0JAR0RDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNDc3NTQ3OGlPODs1bpKImpGZlqOorp6ynqe6r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnlwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6Bxe3hsfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnGGfId8dIytjomAZ2diam5ybXCDdWlwWHVwjpuSd2x/en1tcm5wgHtzdm5idoN/hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtdXlxZWGBfUk5bWlhXTEhJRkpHPkJBQkg/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKmusa7BsrvBxpaQjJSPgIh9boGQkomDioePhnWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVFVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnWimXl+hoGFmYSanGGGqp+di4OQjXp3iH6JiI5zipePg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl4a25pXXaHfId8h4eOf4qSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZmdgW1teVFxmXldQVFhbVUdKS0RLRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKqgsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEj4x4g4BzoISKfHyBf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1FRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpohIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKpIhq6vr4uBgJOKgouChJKph4CYmIqbdG19gYaHfY5oZ2h5f26Gh4KFcYSGR2yAd3J5dmhta192fYKIf4eEi3mUnZyJi4iRf3p1i3Z8eG1vd31/dHRybFteXVtjY1hnZVxVUFBWWVBETEtGTklDRkNDQEBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6JhYiRjpaXkpegnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFhwWVxeaY2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbm6atk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWLkIiQaWhvg4B1jYeEi3GFgneHf3t2hX1udnVmgJSOhomIh4iHoauilomOmH96gol6eW9na3h+en5zbGVeWltdal1hZl9ZT0tOV1JRSVBKRE5HQ0pEQkFEREE7Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjH+BkI6KmpuknaGspquvsJeRkYShlIR4d3+MlHx+koWSlX+KgJKbjoOAgYyKgomNg3+Jf21wal1CQDQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNTVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVl9jf2dnbXWdm4+akpOLjY6aiJKPnYugoJKjqqWjrJOptqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5qRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoigloaSiY6PlqS1qZuNlaKDh5ODfX9ramt8gIGCc2JeZF9bZ2tcbGxeV0tHT1JRTkxMRklQQ0RNRkFDRUZCPTo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDQ1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYZxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5f5KIkZJ9ioSYkpGCgICLjImGkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0Njc7P0NFTlBSVFBQUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cp6WimaGXopScnqeeqKufqKypqraXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZaimpp3en6UmJKhkpaYgZSee3eVkquyiI2Xn32UnZuOkpWYpKKmtbCdkZmoiJaPjYGIbHNyfH99cWhfXWFfYWdkYGdmW1FFSktQT0lJTEZGTENITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG58YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYuKhJKFg4aJgYCGdl5iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNRUlNUUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2FkHeViqOnqrS9uKSurKynqLSrsLaysq27sbO9nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iq6ikiIWUpKGgqqCkqY+csYuVo6e3upugo7CSop2jnpCjoauvrLK1opSkqoiZiZKKlXl6fYV/aGFoXGViXWRjXmdmX1pPRElIU05GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqb1h6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeQjoOFgYyFhoeShoKEiYaIh4dwbmFARTY0PDIvMTEwLSwrLTEuLTM/Q0FNVVFSU1VVVlVOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBkqCErqOzqrLAx8Oqs8W2rLO/s7i+tr+0wba7uqO4xai2yce1vrm0qKO0rbGxm5qSmp+Jp6+rpZR2n6SXoayys5iWqq2orra7srqsr7Wisayxtbu3ta61oKeno6iaqa+tsrm3uKebtqmMpY6Rk5+GeIKDdVpiZFZmYWFjX2BmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRYmNXeXVxgZR9hIaSdYV/gIx7v7ujvIK0lJONm4+EiI+SiYh5hoCMkoyHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Sto7G0wra4wczJtrvEvbOzwLe3wbW+r7d0sbOlusWjsMa5sbOxtKiktbaqsaCilpqikqWwraatq6ekmKCstLuiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKawqq29sL27wsKsmbqolK6Pl5iriX2CfWtXY2JZamVqZVdbY1lWU0lHRkxRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXU1lVWnZqcH6OhIGNg256c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZWKgYSBinp8ioeGfIqDgYqDlX13eXVlT1xkR0VMOlFjYVteU0Y/O0hQRFtjUVJZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wLy3tbu7tr20urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5mfrqWnpqWfo5Sip7G0p7KzvbbBvtPJydPGwsXMwsrDwL69v7u8t7SvuLe2w7rGvcPIsJ65qaGrjqSntomAf3JgYmJeWGFfaWdSWGBWUVVJRUVOS0E+R0Q9S0E9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJLUV1nbGtwj42Fj3NscnJzh9XAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1lbVVSbW1fbl9YZ2VVWVVKREJLS0hGSEhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6trq2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqDpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrGwL/Cyr3BvMHAxMTFyr/IzrOku7C0r5uruLyZf3psXmFcWV1hWmNjUVxgU1BLQ0JFRkU8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFFcWWhfb5eSkJRubG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuIfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSWraS8iIdnW29oXVpaVEhLTk9KS1BLU1FITEFKRktQX15iZmlimLfHsLizu721scTGtbC5sLC7q7Kxp6q3rI21p52bp5pPmp2Mjp+VkaaYpZWKk5OJkImPkZGem6GXmpWWhp6ap5usr6iwp7O01NTU1tLL0NTVzdPPzcXCydC+ysnKydHHzM3C0NK4sMO8xLmltrrDooJvZF1dXllgWFllWlFdV09PQkJHREJIO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlVnOQkJiCaHFveXmDoKqepZeMm5uXi42VkZqOfYmLhI6KiouQh3uEgnB/iIGGe4dyg5GLj31xeHVrcXh+cXtteHNsaYFwbWNpbXB4aXd8fsu/wt+nbmN3b2NbYWBKUFJVTlleUF1cTlBOVFFVVFtubXaCcZatuKyzp7C2qqy8wLCrtaakuKarrqCrtKOOsa2amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZeWk5uRnJiZmZ+eq6ykp6Ksrc/S1dHNzNLT09DU0c7Iw9TRx83S09PXzdLRxdLWxcDOx8fCqL63z556b2ZeYl5XX1NdWk9QVFBOSD5ARkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNTlt1hoWKd2x3cH1+f6GenqCLjJmTk4yLk4+WhHmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8fHd7c4F3cWuAc3JpcHF6eXJ6vsuafoyyhHZyhHdoYWpdQ1paW1ZlY1hkalNYXVxgZF5jd3p+i4GZqaSkoZ+gqKWqsLiqpbSjoa2ho62hp7Gfiaaak5KRiZGPiIGUiWqVooyZhICFfZGDg5OWrYuVjZWajoaSkZ2Xp7ChoKGlpKjIzs/IwsvR1NHU087TzcbW08zU2NbW2NTX1cnU2s3J19fRyqzDw8uMc29jYF9YVFlTXFBLR0pKSkA7OjtEQUQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj393g5OZio2IiIuJfoN4c3t9g4h3f3qHkZaAg254cG11f3Z4fXSFfHlth3Z0bn12hHV4fJ21jDxBi8Wlfox8aWVWSUNmY2VjZ2pkbnhbX2Zoa25pboCDiJGLnZ6gnZCXmJ+jpKayo6SzoKGlnaCpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGubbGzdLQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0tW+y8y0eHdvZV1aUlZRWldGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGtubnBicHF0ho18l5Gdi36HkoKJhoWJgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3uGh7B0WKnCto2RgnBuYj1eaHJwcXBueHaBZWlvcnV4cXqLh46TkZuVoJWHjJOboJufqp+grZyhmpmfpZ6fq5mLmoyQkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yNlIyGe5uIlI+uqpSVl5+Zp661vamtvcbLyMnMy8/Jw9HK1NfZ19jX1NvX09nb1s/b2tHWydTLlXp7aWhcWlBTVF1IQ0VJSD5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo6RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEmI6Hi36GhoB3gnlue3uGgXV6kp6NoHaOdYJ0dYF9dICEb4GPgW+ShHR8gIV6doZ7ibfGpcLJuIKWm493cGVOZmOBeoF3hqKQinh5dnuDf3uEdW2TlpSVj5eQg4mPl5qXlqWcl6CXn5KSl6OdmauVkJCKjZGCjIWJiIGGkJGenJmJhYuBhph6iIifl4+IjYqMgnyhiZCLvKGYk5eanKmmpa6fqLa/wMC5x8nNzsXNytHW1dXZ1dfb1NfZ2tvX29ra2M7cxod8emhpZWBUWFZVTUxETkM7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKe36Afn98hXt+gZGJhIV6hId7dX10bXx9hn5zfpKdkZ6DkXyGfniOfXmKim6CmoB0mIV9gYiFe32Qeo+pjo/DoLyMnKOcfYmEfYlyjIp+c6aanJiThXuOkIiEaEdwoKSdjIuQkoWJipGSlY+cmpKUkZaNi5WfnZSglJGNjZCLfpCOjouEiZKWmp+fiYyUkp2Rgot/pZmIhI2DhYSBpYeLi7iYnZGUlqKnoZ2enaOvtrq1rMDFytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27h5eXltamZXYFxUUE9IQ0xCPT0+OTk6Ojk5Ozw2Pz4+PD05Ojs7MzdEPzgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h6fHuLh4J+dYOFeXN6c22AfoR9d4WboZudlJKAi4h/mIeAm5Juh6iFeqCLfJGOgoiDnH2akYqMo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuPj41bgqKRgoyfk5WMh4iMkpKMlJSUj4yPioeWm52PlZaRi5KThYCLiJKNioqdlpmiooaSnZagiomIjZyQg4iPf4OHhaSGjJCzmJ2SlJehoZ6Zkpydp7K4rKa9wsfOx8bPzNDMztfQ0dSu1tXY2tja2tfW2dmfcX51aGdeXVhUV1hDQEhDPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE6SD46Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGe3t3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZjKKWoJiTiZudopKpr5+RlJCNjoiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4aHiY+Sjo2TlImFiomFlpqbj5CUk4aUl4N/j4uZiI2QqpeXo6OImZ6Xm4iPh5eXioSOjIF/h4+liY2TqZqXk5aZoZmfmZOdm6KztKWjvMC+yMXFycjJwsrTzc3UqdLR1tbW2NrU09rPg3OAaWRfXl5OS1RaQkFHQztBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOkk6PTY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnWCjnx8bH2IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQt5WSs5mNoaCMpJuvoqSdmJCnlqiZra+kl5SWlJCLmJmWoMCOo8m4q5qipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJKYlIyLk5OGlJiGg5GQnHSRmbKWl6ShiJyak4+KkIuXmomKlo6GfYyYn4qQkJyamZOYmJ+UoJ2Vn5uhsa6jpLe9tMXHxL3Dw7/GzsrJ0qfOzdPS0NbY0s/Yu3N7d15hVmFXUUlJT0VBQkU1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY3PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYB9cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+krbOzqKOisKyKmrSdo7iklayklqmtt6ako5+ZqZepo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uSl72jXqqygomKjZSHkXyOjn2Dho2PlJWIh5KWi4+VjYqMl5iSnZqzlpWrnoublJKNkJKMmZuKkp6Qi4mVn6KNlY2Ymp2TnJmelKGglJycpa+ooqWzt6vCyMS1ur27xcjHwtGhxsnNzcTW1tDL1KJxfGleW1RfUlBGRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKf4Fzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7srTBvLStq7O2jKiyrq69qpu7pKituberpqaioqOjqa+ysaqdnKSYmpeXnqKlpZKjua6ov7usrbK5paOmfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIiPl42LlZeUkZqWnaeasZqRq52OmY+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dDNxMqIdHNjXVpgW05LQktAREY+QT9COzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLh4OMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSqr7u7qq2roqKep6uvtbCqm5+qm6GblZ6vs6eLorq5tcG7q6icsqSjqJOFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefmJOZlJemoK6djKqcjpWPkpGVlY6QlZGPoZSGl5+gs56UmpSgoZmkn5qgm6CUmJ6mpKanpK+tpcDEwq6ot7XJw762zrLFvsS8s9HJyMG1dXltXVlcalNNSUNMS0pKQEE9QkQ8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZltNZVxmVGNqmY2XiouIk5CGiXmGk5CBcoB8jX94h4KCkHmNoZaompqYur7HyMrC0sjKws29wbOsu76nur+9u8O4rMGprLO7vaqwqqOlo6yttK22taCfrp6mopijs7ypm6i8waO2tq+rkq+sqquWhpmppqWRgoyTpZWJgXWKknmFjZGQnZ+Tj5SLkI2Uo5mXm5SUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ+WpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsOzu77CuKzCwsHAmW56YllXXVtMS01KR0RDSUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmtJX1hhWmRkVp6QnY2Xjp6SiYp/iJ+ThHeFf5V+f5CIipB/laGarqajmMK9yMPIxdPMzs3Lu8K3r7q9tLzKvMPBtra8rbO/ubyur6igqae2ra6psreanq2iqKGdqre3qaSvvsOxvbmzp6mzs6ytlpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjY+PnohakJeXkpalmmaYo5+zpZailqytq6ebn6aXmJaZlaGkqKaetqupurvEtaW0tsvBuKm2rLO7uK6ouLq9uINub1tYVVZPRktTTks/QUhFREhGRzg1Rk07Pjc+QUouMzIwMjVCNTVPVk47TEZLUkxPR0dJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJyRmlJUmViTEallJyWoZeplo2Qg4elkoiBh4KchIOVkJCUjpqin6++rqHGvcXEx8bOzs7Syr67trG6u7y+zrbEvbe4t7KytbO3s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e3s7eyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wgm5aaqJyboaCZi42Plp1gSpacmpSapZdUlrCfr5yfpZSvr6ylmqGllJOZmY6doKeimbSpqrO8vLursLLHwLmlq6utsbGjobKytKRxb2ZcW09RTEVQUFBRO0dLSEZIQkM+OUtUP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIq5eYoKKor5mQl4eLp5aOiJKFn4iEnZeOnqCao6S1yLSpxrrDw8jKyMfMzsa+urKuubjAwc21yLrAubW5sa+vsrSno5uqtLSqqaaurJmkrqWlqKy6v6irtra+wb++uLKywrC4vKujrrSsuKWIm5emm3a+oISYnI6TmZqLr5ahnJuXlZufoameqKCZmqmZoaeel5CNkZ2DbnaSopqVnaKfkK2yo6uVqaqYq66lpKCkqJKSmZyIlJyinpexp6mrura+s7Ktvbm2oKOnqKWnnJysqamMZGZhX1JLTEdHTkpWTD1NRE1JS0FDRDxQVTxBQUJETzE4PTc3P0I3NVVYTj9ITlFYUlBRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uU2FNVUh/ZV5IRauVnKGfu66ZlJ6Mk6qbkZKTiaqNh6KejKStlKOjtsa9tMG6wcLHyMXCzsjBvbmyr7m0wMLKtsaxwby0uquorayvo6KZqrS7pqmmq6qdqK+npKqqvbynrLyzt73GvLa1t8Cvvb+zqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKipnpmVj5Sbi5eJjKShlJyinqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yVqaWiobS0urWtqLSysp6coqaal5WZqqGed2FeYF5KSUZITVFJTkVGRkJSS0lBREdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnG9iR0Wnl6Sfn8OsnJekl5mpnJabmo+qlpanppWtrJmiq7bEwru+t8HCwMfEvs3Hu725srC4s7/DyLW/r7y2urempKurrKCgmqqrxKKlqKumnquvq6KpqL64pq29sLe2x7a1ubi+sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdl42VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbkqWkmpissbayqqWpraycmKChko6QlqmflGlkWmFdT0pHS09MSEVESUE9T0hBO0dJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjm57FrKGfrJ2crp+So56WpKCnqauXtrCjqrK1xMK9v7bAwrvIwr7KyLa4tbSxs7S3wca2vrC4tLm1n6asqqudnp+lpMGloKmtoKSpra+ipqe9taWxvLe1tcOys7e5vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6umoZmNmp+SnomOV3+VnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqWllpWcmYuPkZOkn4liZVtkYExJSkpPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZiew6elorOgnLKnk6ukoKOframsnbuwqKy1scjDwcKzwsS9xsO8xcq8sLC2rrC1r7/FtbmwsLq1rJqosKmpmp6moafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZl5OipLigoaSSrq+spaafkqGelZ6PkI2VnZmjn6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlY+On6GTi6assKWmopygnpOSmpSFi5KNnJ6AYmZbaGVLSUxKU0JDQEhHOztGPzk5Tk1VXlJTSj5PXl49SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMKoo6qyoaO1qZWyq6eipbKsrqm7sqywtbTGv8TEtcDEvsrEtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Krqpefppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlJWTo6C3oqSllq2xsqWqpqGempqalpion5+Yop6vsqKmjZeumaWsl5mepZGbjpSYmoWWn5SMkJyelIupqaqip6CZnpaMj5mQgYaWiZSfeWRpXWxpTlBNTlQ9Q0FNQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKOdoaa/pqevr6Cptaqdua+ro6q0t7Gwubevtri3xL3Dx728w8HHwLnBxsG6qralrbutwcO3uKqtsruila2wrbKWpaeRq7mqoKewnaqfsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mfmZaSl6agtqmloqKvsbOrsaern5ugoJuepZyhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFtblhRUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXk1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjqJe2NDPaefnKGpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCwMC4xL3BuK+2qKu3sry/v7SprrG3n5erraitl6epj6e7n6Wts56rorGws6yptrO1vK2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5mUjaCmpLSup6GsrK2xp7Kssqmkm5+oo52UoZibqLWpl5mSkp6ZnqGekKyfmJiGlZiLnZqck4qNlpeal6alo6CdlpWXlICPlIV7j5KDjJZmbHJocHJfR1lmVkRDTlhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV0w9RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX15hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLekrKmlrq62qa+zuaamsLfFt7G2vsHCtbS6xb7MxbnDwLq/usS4wbmytayqure6ur61qq2xtpmYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubapra6wp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWusLWvo5mdraeal56Zmau4o5eTkY+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqlo6KgmZaSk5Z7i5CFe4yLg4uSa254bnV8YUZgallJSFlaPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVmEuNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3yru0u7q/vrS0t8PBzce7w723vr/AuL+9sb2up7q5t7fCt6utsbmVl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbeyqK6rsaa4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GnrLC1rKSZoKyom5ydm5SquJuUjo6LmJyimJCXpqGfloSSlpCdnJiWloiXkJebqJ2koJKWkZGXdoSQh3yFgoSNjG5xeHZ8f11LZWxcS09jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldUE9IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTklnMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpK2kra2rp6SwsrOqt7C2n6u1ucm5rsG7wrezsrXCw8/EwMG+tb3Av7q/vbPEqKq5sLa3v72vq7OznKCnsK2lprClnrK1rauysKypqLS5rLSytayzrKmsqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqmprilq7S0pKmrqKuvtq6inaOoqpugmZqSpLSZj4mNh5GioJWNlJ2glJOFj5SSnZuYlpWHmJKVmaecoJ+NkpGOkXd+joV9fH2HiopxdHJ+fX5cUmRvXk5aZl1GRJZbRzpObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5KQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNDZDs2KkhkSEorOkk/M0JJUyw+j2s9R0iPm6mqoamvpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsPRxca+wLK+wcK8v7i8xaitt6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpaWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnZirnaGnqaGspaKsq7exsaCoop+qrrCsnZ6mp6iZo5iYj6CnmIaDjoqLnqGPi4yWnI+PhoeQlZ+dlpiVhpaTk5eknJ2ci5GPjop/f4eFfXd/h4WHdHNyiXZsX1lgbmNRc3JcSzuEfEY/V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF5KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZesp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Gts8TDzs7Dv7+0wMPEusC0ycSsr7eusrnAv7Otraulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq5+jnrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp2koqqkrKKeprG3rKyipKKaqKqtqZyhpaSjmKCZlY+YnZOBgpCIhZygjYuOjJmPkIuEjZijm5KRm4yTkpKUopmbmouNi4t8hoGBg3t0gISCfnR4jKSHeWteYG5nV2aHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZYWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SiqrCXqqmttau2saukq6qpvMDAuLmzvLWms6/EycvRvsG7ucC/wrnBusLErrG1srO7wb6zsa6tq6yntqqlra+rua+osbGusau1qra1p7S2q6ykqaqco52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjl6Smp6mcoqSjn5mYn5GOj5mNfoeMh4SenoiFiouPjpCNhIaVopqOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h+gImej29xZ2dxeFxhdIhpT12YVkhteFVkVlFiT0xVVFVRT1hbYlZIUGpUVlRHUFlVST5JSE9RUHhMTlY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUmMwMj9mPU5YP0MsPkxUXy9JazZRRTuVja+gpaqtmaukra+ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC/vbu8w766w8HAv6+ys7K1vbzCsrKzq7OppbWppa2zs7mvo662sa+xuaq4rqqutqyqnqqrn6Ogtq2ooZ6vs6G0qp6op6qjqqGhrK2ova+srqyhp6efq5iPr6KYoaCop56nm5mqsKiin6yhoZKhoqOmmJqopZeXmJ2PioeViHyNhoWEpJeFgoKMh4+OkYSFlKCXiJGdkJORjZGclZePioWGeHSBf311eHqAenR0emmCh6N1aV5lbIJ1Z4iLfVJXcF5KeHNTZFNRXk1NUlpnTkxWWWVYR1NpUlE+Qk5RYVE6SUhMU0lxUExTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsME1oOjM4Xz1hZD9GMUNQW1srSE86VkI0kI6xn6Smq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHDvcC+ub6/vMm8wrmwsLWyury5wbO0u625raO1pqessba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKqlnpqpoZuRmqCknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn9+jIeRj5CEgJOblIWTooyUkYuRm5OVh4l+gHJ6eX58aXd9enVxcX1ohnmEiGRgaGNzhXptZ3ldXlVCV3psVGFQUllLS01wdF1IWltnWUVWZlBDPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0kxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsJmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwbe9wLW3v7rItsO1tLO1sr25ur63rbm2v62is6aqq6+1uLSqnru7qLK/srqgr7S2qauerbCinKWoqaKenKSxprCgn6qpp6Kqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOpopqZo6OVlpOeoZablqasi56RkJGMgouAf46Be5qUjYl8f4uGkI+MiYWSmJGHlKOKkpKHkJqQk4GIfHlsfXZ5eGJ7enFwcHN4aYF0aoNnZGhhb3OObWJqcGBvQVx4a1VeTlBRSklMU1pXTV1ebVdEV2BPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpMPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhaMTNTPWVfREw2S1ZkTyk8MlBbPSOSmKuYn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wr6wtL63xLbDsq+6srPAtru+uKm5uL6rpLWnqKqwrbmwqZq6vKSuv7S0oa63taemp7CyoJ+kpqegpZmfraionqCqr6egppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWmp6nkZeSmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjI2JeYOMhYqMjYWIk5qOiZWfiJGVgouXjZB9hXtzcHxxc3RgeXhpb3Bxb2p/c2N6bGlmZGFmhoBgW3JqcUxNf2lYWk1QTEpIUFJRSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPzBaWjUolpylmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8K6sbW9t7+7v6+svbC0v7K9w7qpu7u4p6i2qKersKyzsKaavLekq7u1rp+wuK+ppaavsZuhpKCjo6GWm7CmoZ6ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaWpmZybpJSUl5ScjpOXoqmhkImKj4V6hH2EinmOl4qNh3qCiISIjI6FjZSZjI6WmYqPl36Gl4uPeoB6cHF2b290X3h3ZWxsbGpphG5mcmlsZmldZHOBYFtrdWlaSX1dW1hPT0tIR1JVRjI5Xl5tUERXVlllTUhJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwiOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhELjwyYlYsMpWioZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6uLGzubi6uLqvrsCztLiwv8G4rL26taais6qnqbKrrbGhm8C2pKe1taiesrypqKaor6yZo6eco6aUmKKypZmeo6ipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmKGUkZSWmY2TkqOopJCIio6FeYR7hIZ9nY2Kiod6gYSIiIiRhZWTk4yQlZSNjpR7g5eOi3d+e2x0cWxsc2F4dGhpamdmb4ZnaGlkZmlqYGliamdbZXtjYFNzVFxbU0tKR0lPU0AhKmleakxDVlVeYEtJR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD8wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWZPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBt7Gusre2uLe2raq9s6+ysb2/uK68vLGln7arpaWzqaqun57Bq6ilsLKprLW7nqmqq7Gll56qnaakkZmnraKYnqSpoZyinZegnae2pq+qr6GhnZ2hlKCln6GgmZuZnJKZnZSlnauhl5adlJONlZeLj5iaqKCSiIqKiHmFd4KCgZyIi4KJfH+EiIaFkYSWlY+Oj5GRkYySe4OVjYVzfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkA6M0FmSCU1m6OfkIusoZiYoJals7Ghsb23obHGvLqxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrrS2urawub6tpp61q6CgsKSrrp2jwaCxo66wrreutZ6tr6ytopmcp6mknpWbqKWfmaSiqJ2aoJuUnJ2ssKa5qK6ioZqanZido5qknZeemJuUmaCSqJaqp5qTmpqRi5SZjZSUmamnjo6KiY97gnOBgYqYhYd8iYmEhYqMipOEk5ySko+QkZaOkICAjI2DcIB+ZnhtaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxrdHFhVGJoZGVaSUZMTU9YUVFWYWSBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKhmo2OsJ2ak6GZqbKvn7i/tqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ms7Wyrqmxt7axs7W6p6mftqmdnqmiqaybqL+YraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+npKCYmZmdoI9roZaYnHGClZqjgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan52g3FshouGfYSLhm9eY2FnhJeGa4uPlJN1d4uEfoOQgGeGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBhipCEhWVOS0Q4RlRnXkpHUFBUVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mGlbCbnJOhm6qtqqO9xK+pt8K4vbytp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKanmay7laalr7K3ra6lqa2rrKWhn5ygp6abl6GlpZubp6edk56fmJCep6qjta+jo6OclpeYl6OIoY6Smoehh5OdoH+lf6aqnpKRmpGIg3J4jI6FiKF2iY1pl4hmfXJ4oW+Ih4R+jXx/oaCgmYB7h550iI52m4psh4GCbWhlY3pscWFUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmeGhFpeRk0/R19NRlJWVlFRUldVZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8oi6aXg5yrnZmZnZ+qqqepvsOusrq8t8C/qqS3sKmsprK1rq+ztquppbGtpbWznK21trSlp6mzsa2yqK+fq6GyqaCjopqhopuutJWjpKW2vKatp6uqrKiloaCYoKajmZmmoqSYnKSplpSjnJSTpKWmobejo6CkmJSTmJOciK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqa7kHuAbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayfoFylHSaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2lk4CmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6mvtrOoqKa1pqe4r5yzsraqpaSosa6usaaqnqeksaShoJ6Xm5+drqyUnaGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5qUnaGmoqCwop+fo5aVkpiSmYWvamqKjap+Z4SVhq1kcJ2ck5mllHGuoaR+eLt9a6GQdrFfarRbpYBmnJFgZoJ6Zn9qeGupZL5yZ6aMdrFqfLF4dJKUY21tp21bhKBFaGeHlkV1nGB9Z3ykp4JZX4uraYCVeHlqpzdKr1xXU21jW0tOV19cV1Y7TolPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRoZSCrKelnqOlqrK3rLS9vq+2xLK3usKmqLCrrqmpsK6jsbqvpKWus6Opuaies7Kwo6Wgqq2vrK+mp5+jorCbopuXlZeam62llpuhnrSzoauboq2toJ6ZlqChqJyYnqSfnJmhp6SPnaKal6Cfqp6mpqCbn6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknirZ2uxW6t7j4eUdIhxj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYpwuUaJvW1NraGBMS1tkWFxaQj6xeFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOGFVNTAblZ+UiLOmpqGuqaezrKm6tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WkprKzp6OhnaiqsqiwqKWen5+vlp+ZlJWWmJ2soZqZo6i0rqKpj6moqpuelZegpKeanpyin5ugo6WjlpuemJmdoqqbpZqcm6KglpORk5Kcg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVaveoh+n2q5Wrl3hoN8poKTfJh6qnmNnZB7sW6OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1QaWhkUEBYZ1pkYUpITWxLW1JPWWZZQ0Q+RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltaiku7fBsLnAsbW0u7O1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZagqZ2alqetsKijn4+soqiWnpeboaWhmKKhoaGaoqKnm56hnpWZm6agm6eVm5ufoZiPkpSRnIiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnuFf6Rvm6qma4aEfK19l5mPe7Fzkp2PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRTUWpjZlhBT2tfbGhPVUdJOT1WUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprWlp7a7vLK6v7e2tLq6s6W0s6GxsaKfrK+kmKa6rqSxsZy0uKqfpp2hqqSyqKyqpJqcmqielZSYmJKSoqeflpKlq6+mopaTrJ+lkpSgm6Smn5SapaahmqOfrZqhn56QlpuhnZyllZ2VmaKflZiWkpqFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZiK6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6ehpmZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraizqKmyuri0uL+5t7K1vLWlt7OftKyfn6irn5WntquosbGrrbSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpKQpqyupqGVmqmfoo+RopmopaCVmqWonZyknq2doZ2gjZSem52gmJmclpeioJOYkKadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3OngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rb2VPSkOhXFpMdF1iZk1bYV9ydF9KVjZKm5NYSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC3sbW/ubmysLe8qbq0n7CknqWnp56TqrCpsKm1rKuvoZihoKalpLqio6ugl5uRoqCVlJ6alJieoI+Ni6ivr6adl5unpp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo6rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWSiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZVRvbi5cp09iUmtlYmxaY11gcHtjVFpRPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sK+5uKvBtqmqoJumpKGdkaqqqLajsqivqqCXnKegpKu4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZSbrKmXjJOlmKSsopGWqrGjoJ6nq7GZoaOQmaKXn5uWnJehk5yqnJSQq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9Xnd9W2F5vGtaVltqel5qYWZnYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkE5p5qeobyil7HDsK2qqqyxp7ivtsWxurGuu7CuwbGrpKKeo6Gcm5GppKqypLWmraSflpqqmaasuJ2jrpiVoZCloJKNnKOel52akJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5yfqaOznqOljqeilaKanJeVo5iPsKCSlKmehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGjIaNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxegHp9iWiDeW15Y4uscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbXVCTVBNRDtaTT5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL2moaqXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoamnp6OpoZGtnpeknpeXl52ej7ColJunoY5qfmmcpniHc32aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZ13YpVrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboR9e4trWGx6gnNJSm+GcE50TUVXXWZgTFtYZmNfT1ttdWlxUk9ERU08SEk9TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o6ylrqeotbGsyKyvs6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunram+p6mmlZSclaCak5elqaiQnZGPl5ywsr+sm6edp6KJk5Gpmqijm5uroKOam6OnraOfq6KasJuVp6CWlZ2fnZexpJihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKUkYmOkZOYlJiXmqCimpyUoZ2NgnqlhmxqfJB8gHSJioFxgnh5dnaLgHyKa3OBdIN1ZHd9d2twem1gY11wZ01ZWWZpYFdacHpubGZTT0ZTOU9aTVJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ho7Gyt6CppbKnpbC1qsmrrLGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwZ6rpJWSnJeemJOUop+eoqeTkZmop7LDr5qrnKqfj5aWqZ2qnJygrJihm52ipbCnoqWonq6Yl6edmZqhnp6csKCcoqaVmJOYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkoiGipWOm5eNkJeeo5aak5GdjX6OZqGzr4WKhHZ6j4p8dnl6b2Z6kYGAiWt1gXmIcmhzf3p2g4eCa3RkeWZgamVjZGZrWWt7cGlqXFJMUERfVUVAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrb6grKKQkZ6amZSRlaGcl6ichJ6pq6KzyLOfqqOql5aXmqedqJuepKuTnp+doKqvqqajq6Ktm5+goZmknpyena+jmJ+ok5iXnJGkmZionZqXZYKSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY9raI2XkaJ3a2qLmKOemHNsbnqEjYd6WGVehYJebIqJgHZcaHN3d5KAh4JueIJ4gHNteYR0d4mIjoN7aYZZXmt0ZF1ziWlqfHFsY11STlhKZFhBSjQ9Rjc/RkQ3MTw9P0FEOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7CqpaitrbCnrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpre5pa6jjo6aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOco6qokp6hnqCqsaqro6qgqZumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr2Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp99lZiJnsC9gpadnY2dwsF7gnuSjJrDwH1qpbFvjIBvynp/m3eSg46BdnqBf3lxen+HcXiFjZN5bXaTY2ZfeGRgZYJjXnRnbWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqaWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopKmrqu4s6evopGRmp2lkpGgoZebn52Hpqukq62/wLGgqa+pl5KfnaKZoaOqo5OgoZ6era+prKajo6ehpaaeramSpJupramcnaqcrKGWl6WWoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoI6Ns2qErnR9loe4YYOtWaPNbo91e9p7f5lwfoiSdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpjZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3l52RpKqorbOrpbKsrKukq6evqqCnm5mkl5yir5+gnqino6WhnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnaejnq2kqrCowMazqKmxrpaSnZyil5+pqp+UoZ+dna6wqKupnKenpKKrkq20l6aiqqmdo6elobCgkpqnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553qoJ9rX+ccq1+q4eGn3aYknp8l36qiKKMkYydfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZFlcHR1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqmxp6iqp62rq6eio52ZopWgpqufoaWgqKiin52wrJealqinr6yop6mel5Wao6KRlKGtm52mo6+so6u0qrrNsa2mrquWlJydopifrqydlqCZnp+qs6mqqpurqqSjrJuwsaKorK6lmKaqqamxopKWo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUquEf66Dm3augaaGhp96mZaGe2aAo4mkmYWCo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTcG55eHdvbGZlZXJwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1b+hmaunoa+inrC0sK+praKnpqqrq6mkpqCbpZ+cpqemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKajkJqiqKCgpZyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqglJ2fp6yspK6arKqjoquis66iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSKiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCTmox/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk4Bxe3V9e25bZWpzcWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca4ramyraylopyyuayqoaabqKWqq6qnoKalmKqjn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrJGZnKejn6mmrqGjp6mwtMKxs6qtqJOJl5ykmqGjr6aYoZWZnKWmq5uwnq2op56so7etobK5r52br6ezs7OklJeno5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWdhZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x9k5KLdXpzhX9xXG1veHJqgm9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJuhrLOzpp+glaaura6qp52mppqjp6CyrqKpprKgmaqklKO2oqKVl6KptLiknKKdopOQobGZnpynpaGir66dpKihtrLDsa6pramRh5Ccp5yipJyll56ZmpqmpKmar6KupaaYr6W8raG3t62dnbWyuLCzppidr6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJGEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGjcXF/n2JzsrhoeI+Uppl+jI2TjHh9eY6CbWl4aXlzboB0XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6Wp6SttaGjmZWjqaeuqquZpqKfpqGgtaejqaewo5Sso46kraOdkJqaqrS0pJ2knKmRlJetoKCepqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpqKVmpqcmZuZp6WmmKyorqOlm66nvqyUvbCsn6Kws7mrtKeaqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWi6p4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtwhZldYFuMoG2VkqeZg5SNl4x7e4OXf2tsf2J+dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrbilo46bpKKfsK+qn6Sfna2Znrigo6ugr6marqGQq6mklomaj66wrKafp5qsl5iPrKKhnaWhmqScrZifqKa2qcCvpamjn4uAjpuan6aekpWampSamqalpJqprKyjpKCqqL+kl8OsqqKhq7K5qq6noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZGFoFtsaoGzYH+te3uCgbFsZ2+Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFumJCom4uXkZeXfHmOnX5kc35ihHh0gHxhamdxbWZlZU9VZFxBVF8+Sig+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5uspqW2qKCLmqCfnLOzqZ+jn521mKCzqKqrnq+tnqybla+ooo6Im46vrKinoqeZrpKZj6iZop2ln5mjoqWZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuRmpipoKGZqK6npaajpam7n6DGp6Wpoau0tayupp67rayslYCpkqOvjpuAh6SXmJCBgLjDuoOOnJOEp5acgqyKgq+IppubpaqRftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrx0gZaOp5yQm5GYnXqCkZt6Y317ZI1neYJ7YGtla2piUGFbU2pcQFVhQ04qPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubG9sqKdrqalsqadjJilv6q4saihv6amspyesZy5qJ6tr6WnlJSwq5eMg5uRrqajrKGknKmfmIujkqaep5yaoKiimJ6grK2qua6oo5qXknuHmZGmm5KOkZiYj5iUqZqgmKmpoaqnoaKru56pxaOgr6Oqs7Sqr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ikj5mfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2VkgI2Tj6KYmJmSl599h46VdmaHeGiOa3l/eWRsY2ZsYktkV0psWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOpubmys6qpoa6eo7KpmJK+ssPIvraqnsCrrKOgp6yfuqOkraytpo2XrqmQjIWVlq2epqqhn6OjoJGLpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI6YlaiVn5ipo5uxp56jrLqfsMGnpLOmrLCxqq2rp7ijrbeWiqCopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2fopygpKGVq6eNk5KMh5KcnJSQmpOYkI6VhYGkmpeVjYuSkoqPhoR9Z4p/dIJ2dIeLcKdte5SRk5KBgY6QkI+dlKGWmZeig4iUjXJpkHdwi3h3fHpqbGRkb2RVYFhAaVtIY2FPWitGPSsnITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFYVVZZXmBhY1xeVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW2rq6isKStn6C1sZCOrMa9xLu4qqKlnpumnrCoo7annam1pqiRmKyii4iJj5ynlqykoJmnnp6TlaOWqJqomZSmoaOQm6iZobW6p6uYmpCNfIGUi6CUipSRlZCQlJelkJ+aqqCctqOdp6y3p67BrqO3p6+vsKypqbK4oK68mZGlpKa2opKdpp+NqZ+Nkp+jrK+boaOwqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWnpGJoJ2VlIWSjJCNlIqAfWaLhnWGdnmIg3OcaoaQlJSQiX2MlpKSl5Ohk52XooSImId6cpZzeop/cnx/am9kXnBqYFtfWW5jUGBlUFs6R0dFPjI9PTcvKyYrKSYdJjQwNjY1ODo9PT9BQUNJSkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCntaqQkJ2ls7uvrKyio5p6naKxpKWwqZabuKajk5mqnI6Giomco5Cun6OVp5+gkpaYm66KqpaPqJmnjJmoj565tqSlmJuNiXmCk4uak4mVkpSQjZKXoo2enqmenrikgISvtaKwr3WkvqOyoHd5oKqxu5R1rKSeiYCqf2RcYnagjqSehJd+bpOznaOnraqjZZ2fknN5mZdwgJiol2x/oqiKZZylnJGXmJWLkZyQhp2akJWDkoaPjpKJhHdqjod2hnF8hoCAYWmHipSSi1p1lZBoaI+OcnqmmZlleZmHgniYaoOKg295gGtxZV92cGxraFxmZWJicFNcPk1OTlNHPkBUQzoxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS01UVFVZXWBoZmdXUEo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhr7Gsq6mlqa6jp62lkpartrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56NrJqilKehno6XkZ6Eda6PiKaaqJGXpIiburSnoJmYi4l1d5ONlpOKlJGQlIyQk6COm6CnmZyyloCMnLWds4ySj7ynoH6nonqirreBjo6mnoOLhpCxqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKCe5yxeoqFoJeZlJiVgZGXloSZmWN5h5CEjo+RioNtcI+HeYBxgIGFf4Z0hoSVkniWaJJ0oJp0fZmEoZ6HmH6Si4ODmWuOjYVseHtxcWdkeG5qbGpbZWtqZnRcX0hUTFFARTUuWVVVNykhMDk9PjY0MzU2ODs6PT4+QERJQEpFSktHU1hbWVthYGhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKixpqeqpZmUrsi+sKGWpqm1no+Dnaycp6KgjZC+npqNn5qgkH2Gj5mXiKycoZafoJGNk4iGgJGojYeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5KfkpegpJaerIiftIm0mq2Kyoeqroi3hYyvgrCug6mNpZiNnXyoj3J7d5yPp5ZolaR5tIufnqaokpjCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWSho2UkomDbXOQhX96coaBhHyEdYSBl4CPxWZ/qYePo2ueg6Kbg5qAjI6FiplwjpOFaHd0fHdoaHVxZ2hrXmRvbWdtWGhHXVJNMkU0Nk5hYzcmMzxER0Q5NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYV1qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZWlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubGqq6aalKCjpKqjlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYirmZubmaGFj4x2m5yPn5CInqSblZmYhqK5rqSZnIyMfmJtj4uTkI2QjI2Yi5CSn4+UoKGZoah+oaeHrZ2glq2PnpydkYWAoI2qroajjamZjJp+onaAmZRrgqx1Tat4h42dkZuop4Cpq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5ZtX1Nwg1xfa3mDYFllgn2DgJdwp6prg6NucqVwn4SfaWWfbFtuinxmWmCDf2JXUG93Zm10cmtqb15qcG1salhpT11YRjlBNEdEX2s0LElDUU1OPTg0ODU5OzZAOzs9QU8+UVJMTUJKXF1fV15eYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWNpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqyRoba8rK6jmZegoqWsraGdrrWiqJKhoJ+mm5mNmLSZkIufjJWMdYGUkoyKppaVmJ6ef5KFhaykh5uQipiomJmakYelsaeilZqIiYBpboiIi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXiKfISafaJwcpOIlnuejHlth5yMmZCbqJqPh517gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJqkY3Osq2B9ap2zfm58hoKOgouYcX+jbHKjc56EgKRgnJizlnF8l5+0dHNbnrKDamJvdHZyaG9Ya2xzc2ZdaV5iS0U9RDVRQVpyMj1TR19KUj08Mzk1Ojo2RDs7QElRP1VNTlFARV9eW1lYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS3ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Jj6GQkpSdl32QiY6ooIeYjoqRopObmoyKqKilno+Wh4R+a3uHf32QjYOLkJCJj5Sgg5eeoJ2gn4uJd5yYooyfcqGLh6iIm6WPlqeqfq2MfnqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2doiJf55omnWGk5KXjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnJ5eGtpXHFqeXljYGZYYkFRRU43VkNSbjRLWlpfTlpEQDE1MTs7N0g/OkNIVT9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJururKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJyIj6ijoJmLkYqAgGmAhnl/l4x7iI6OiI+Wmn+Top+goZOYcmifip+PjHCSjIGph5ieoqefp3yvraOiuJd3o7OipICIlHmde6uaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZl+dKpaXW97lot4nmJMfnp6hWN5l0JMnlmianF8jm2BiYSZdZt4homxs39/m5OndoGdbXJ9lG+Zc2qkXZV2SGVjYHNxfn9uZmBsaXZ7ZGViUl5XXVVWQFlGUWdEU1dbYlheSUQ9Qjg/QTpJRThMRVdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmdeYWFcXV5haGJfZWN2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUXqCms7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcn+IkqGbc5GQgIiYlJ+ahI6pnJqUiouKfINshIVxgqGMeIWNiIiSmJV8k6OhnqKIroZ9tYSOnpx7pZZ6qYGVnI+KoJx8p2h3bX6ZdKFzcXyehplwk4OufaSDpp6agKNvXqhndaNjb6VhnNOQfHuZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdugHOicl2kZ3OmYWimbZvUmX2Emm94epdrm3t3l3NtqaRnYGV5cICEa2dmZG52d2dgY1NbZlFRYUhXSVRgV1NbZWpcZVFGQ0tNSktCSkU4UEBRTldSWU9TUWBmZWlTY3d5d0lGRWNeZVpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjm5mFmaigoKSOpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY6OiW9/hpCTkmyXk3yIkZGjlYOOqpqUkouFiXmDdoiAboKfh3eAk4aImaKWepOipJqfibOhoraLeqynpK6lcKiAmpCFgJuRe6SAoZmGmHKehKOur4qXjH+MpI2Wg66hlHa0tbXJoXOUioGfYJ2XqW15lYagm3Whh3egfpGWioBvTGajknCbh3Kke3l0YYOBa36ga3FkYJxyfnSXaXpps7W0xqZzmH56nWucm6t1hJttdXeYaZp6dZhxUEV9tF5qdmt5iGZqaGJ0dXBuVl5UWWlQU2hJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFLUGVjaW1ldXNzf3l8bnWJe3tUUE5sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRpa3tfXWRoY2pmb21laWxloZyIr6aEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+JjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZaglX+UpaiclpaEZm54nGyiZHxxpXebmHBnpoCWi3ukep+Wg5dynnaBipSWj7lukIqiYn2ZoZWIbXJpq2p1oG1upl+aaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm1yolpfW2OhbV2JjG97fnNyZKVtd6JkZ6domXOMmW+ib1OJkG+gX2WnVIteVJhubXNrcoJtcGlreXNrb1JZV1dmWlNtSVhPXUlYaWhzallrVlFSRVZcTFhSYVVoal93dHp9cHx8coN7f3N2jYCEdl5RcmJnYnBnUGpoaGtsbmhkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ykmKZ6ZXRti6eupKmwsaafi4CXq52fpYyioZqiooCWmJONmo+LmJCOinuGcYCIaIuLfJibc3SJfZB7ZIKHlYqJlZmCfIiGlqeQgKGskIWQioKKfYCAjnNoj6WEfYaUjYiYoI6Ik6qnnYmmeJabf6SIloyymJ6Qgq+Xn6V3lId5qXSkjoSabqSijJKEjIO7bn2lr4KGhoaTlpygfKV6caiVoJZmnn5vq2OWipWSd6hsqaKBiXWHgnerkaaHapGwa3azjKlrioZtbZ+ekpVhf6uLqnZ/f4ylnnaffYSklZ2gapuId6xnn62NtnR3vo2kk1mDpo2rYXVydHB8dHFjan5uaGxTVltWYWJda01dUl1JXW1tdmBbcVlbYFpndGVub3FjcXRgeHp+eXJ5g3OEfoB7e4yBgoB2YnhkY21zZFJrZ2hvbHJqZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpaqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpOPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSro6CPgHWUloh+gXmUrqN/gZtxj4V4j4qDfntypoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlrjIVbeXhyenBobn6SiXF/dIKPlJNxhYOCZYx/XoF/i3d1c5R1b3lubodthIVedmh4jmWAgYWOqZt9dHyWaomIb4B2fYZ2bW1njHN5e5h4hFtrWHmPaW53cnFveHhwXWyGbmpnVlpgV11la2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnR7gXh1eoN2gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxxdW5aW2JrZGxseW1obG9hjpS4qKaLoaKapqSZpJyroqGEhJiskp6hiZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l45zcoRwlYV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqYaOkpyQiJ6eh4ybqJ+gqoOJjZSafn6Jlq2oj5Kmj3dvnZGCeZFvfaiFcH2VcWtwfYGfjH+TjoxobV2Di4ycm56Oc5WLiHF0a4F2dIFZcm6HkYF9foxqXWpkeoWDiIBfaXh6m3uCi4J2gYaCZ3eKhmthcHKCdl9yi4GJj6aVhWaMj4Nud4uEcYaPenBmZ2R7g3qWW1xqZ252W3t5d3Vuc3OCZlxtimtsY1lZXltZbHFcX2FaXl1mdH57dW90Y2trant9cnt4dGRtdGhtfH52enx8enqAgH5vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGxrcXJtV1tlbWxnc3lvaGptYIuLqbChkKOhmp6emJ6ZqKOifoOYrY2flYibopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGg36ThIOGioF6gIOLm5+Pgqehh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaufoqKji4iTm5yjmZaqoaemoJKbh5WNe3eNjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgoiRimt8jXd4ZYKGkIp8iZ2Eh4uQiIiAhYSQd3x5dJqhiIaJnoqElH59i4GBdXBzhYN/d4eHipCmkYSFjYeDjZCMfYiLiZCCd2yChH16mWpyaGF0inB9end2b3Z0gV1eb4dob2BeWlxdU2hyVWNcXGFsaHV8fHNvcGRraml/fG55f3FpcHBsZoF7coKAeH99f4V7bYKMhXx6eHx9eoN5TmR2anJtcHpka2ViYmBbdGZwZnJxbVVdbHRtaXl6cWdpa2WMh525npaioZiVmZiUmaShnnx/mquOno2GoJyLnpZ9eZSDe46ZiYaEhIZueICAcoGHfomUhG1rfnqXhoODkH+AhoSGfIaDjZudkoeqn4NyipCGk5GLnZF9jXqqhI2SmJaPnJeHh5umn6KanYaDkZqZmZCapqClnZ2QloCQinZ7h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiJOanoKOl36GjYJvd4VxdWF+go+GdYuYgYOPgoaEfoWDlG14dXSSooqMhZmFhI10gIl8fXJye4eEe3iLjoSSpo+Gg4+BhIqKineGiImMfG9rfoF8bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1tdXlFnblRlW15ha2l2en5xbGxka2pngIBsc4BrbHRveW+EeW2GgHaCgH2EdnGCjYd+e3t8f3uCimBpe2p1aGmCZWpjYGlcZHVob2J0bWxVY3F5ZXB6enJlaW1ti4met5qho5+SkZaXi5qfn557eJ6mkZuKh6WUi5iZeXqMhXyJkYOMgoKCbnx/eHOBhX2LkX1raH2Bl4iBiI58fYWEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoKGdlpp/gJCamJKMmqOho5qXkZt+jYR4gIOOh6B/fYyNj3yYpKChk5mQkKeNkIGbkYmSl5t9kpJ+ho2BdHOCcHZgfX+NhnKKlXyIjHGMf4KFho5od3F4jJiRj3+WfoeKcoGGfH1weHuLhHp6kYyDlqWTi4aQfIaGh4V2goSIiHplcnx/eHpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Sa2hUZVlfYWhqdniBcWZrY2xoZX+Ba219aG9xa314hnpri4FzgYF+gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3pyYmpueYmNnrKSpaWcjpCYj4adoZudfHakoI6Xf42iioialnh7hod+g4l/iYKBf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlaCbfm+MgpGUhqabh42JhKaVhZOLlpeTkneRnaGhl5SXen6OmJeOlpqdpJ2YkpSbeY+FgneElo2dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpJ/kIJsh4KBgImEZXVve4eSl4x8k3iLiXt/hnx7cX53iYV5hJCKi5eilYKEjHeIhIOCd3yCiYV2YHh4fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2xlUmNYYGFpa3Z5hnFiamNtZWh9g2xodGhsb2mAfIF5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamJjdVaDaXFuYHhnbGJqdnBmeXt5cV9ybIaFj5yul6aono2Nl4eGn5OXmX14qpyKmXqXnYuMmJB5e4CLfXyDe4CDgXh0eHpzfYCEf4mLgGRefYuVh36Fh3R9fol/fZeEl5OWjKOhmH9yh3uUkoqnj4yOipOgkoOSkJSXkYuBj5igmpKQkXN/jZKUiZ2dnqaXl42VlnONjoprhZePmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF5cXlrdWx7fYt+bYWSgpR3cIKDfX6Kf2RyaXuAlpeEfo1zkIiDeId+dXiAfYaAfIOMhIyUpI95hIJ0iYd9gHR2gYiEbmF7dXpxfW9hb2Nke2Jub3ZzeHdzdGF1X29sdW5vXFtfXl5rXlBdWGNhaG10e4hrX2plamNod4huZmxoamxogXx7d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXJih2hyb2V2Z25sYXloa317eHBhd22LgJmZqqCjqJ2Ki5KGip6LlZh9d66YjJd9npSRlpSId357inx7gHZ3f4BwdHN7b4V9gYCKf3xhXH6PkYZ/hIRzeoCGeo+Rh5KRm5KlnJWCfoF9jouSpImOio2Ymo2GkZiTlo6KiIySnJOQjIxug4+PkYmemaKhl5aJlpFuiJmEZoWYjpR6iYWQi3CWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHc3J1a3FudHuLdG6FkI2ScXSAe4GBiHxkcGx4fZmTfYSIdJCKgHOIeW+AfYCGfIWMiISMlaiMe4h8fouFeH5xcICFg2NoeXR1cHxiXnBga3RecGp7eXhrc3BleF1tbHNtc1haXl9ia1pQV1hlY2dxcX+HZl1paGdiZ3GNb2RpZ2RpaIB6d3RujoV0gYKDe3WCiYV3hXx4hIV6gIl3f4t7e3J5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in6il6GooKabh4yLgZCch5OcdYGqlJKOh6CNlpOQgHR7doV3eH9yc3uFa3Jwem2KdoCBh25xW1h+kY2IgICAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnJ6Kj4aSmJaFiZWZj5aLi42NjZ2KjpCDbYiKkJGJnJahnJiVhZeIaoSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJh7kY2PjZqSfIp/gm51cGxtb3B7hWlzg46YinB3f3SCiIJ4ZnJvdYGZjnyIhHqUkXl2iHRwiXuFjHqLhoOJjpujiHyEdoKLf3h4b2uBg4FecnNycXB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVRaZmdjdXCEgmJda21kYmZrk21gZmZfZ2uBdXFycIuAdX+DgHh1gIuAeIV/d4eGd4OFe4aMf3t2ioBqcWN8Y4Z8b3FtdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOQn3WLn5SThouajJWNi3pyeHSCcHKFdHF1iGtvbXVtiHaDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmShIeXmYyUi4mPj4iehJCKfHKKhYmOiJyan5qWlICTfmiFnIdnhaCHkoORg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9hen6OloJ2eoB4g4x8eWdzbHSHlYt+iIZ7k5BxeoRwdox6iYx7iX2CjJCenYV8fHeCjH13cWpsgYJ5YHhvbWxydFZeb2JyYF9sbnlwZ3BmZnN0aHBrYXdlXVZmYGByU1FOXGZlXXlwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIR7eZV4Z3Jqg2CIfm9va3pgam50f3RfdH14hnh0c4V8eKCPmbCcpY+Cin+DmoiAjJ9/i5qTjoWIl46Oj4R2dHZzgHBvhXNwcYNwaml2boNufXxtdXNSTYLfyJLWk3xwdYN1g6CCk3eVkZmbkJl7lHOFkJ+hk5SQipOblIZ+lpaIjY2IkY2InH+OgHd6jH6Ii4qcnJ2alZN6jXZniZGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9qa3l5XIB5kI6Ben1+f4aOenloc2pzi4+JgYWFfZWLa35+boCLfouHfYR6gY+VmpqKfHZ4g5B5c21mcICDbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cm9wY194YGBWa19edlBOS2BnY116cYl0XFxldmBhZWWPZGBlYVhpc3NtanF2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbnxlh35vcGt/WWxueXlzYXZ6e412c3eKd3mfi5uvm6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXl9amhsY6Sawdyu76Fza3WDdYSihZJvlpCVoJWcgZFxhoujl4mOlouQnZaDgJWQhYmPgJKKiZZ+h3p1f4l4hoSNnJuYmI6Pdop2boaJi32Ko4SRiZ2FhV6Lk5eKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1aW54c1iIepKGhnl+gICFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlZOZkHRzeIeNdXNxZ3V6g2J0bXBianZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHhNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtzd4t9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bIt6bnRwgFdxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR9cIyUeHmLnYSFoY2Ne5aNf5mIhHtyd3Bzam+Ba2ltfHReYHh3e3F1e2dhZXzr2rXJw9yIc2x0gXaKmoiNaZiPj52Vk4GJcYWJoI2Ei5aKjJiUfI2TiIOJj3uRi4WPgn92eIODcoeCk5uWlJiGjHWHf3CEgomGmKGDlIyfg4lhg5SPh4qGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoZ9f4OAhImCdWFza4iBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQlohvcXqMhnVscWxyeIFfdGluXWt2YFJlcmlmU19wdnRgb2BdaIJwcmpXZ2hjaVhtVlx1TEtMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZm5pdHeKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHd1eXiTdG54en1YeYVxgG9neHeSgmR2hoVxipWFmaGaooqHdG+Ti3J3jpx9ipqJiXyff4OZf4F4cXNtb2RyfmlmbHd4W155e3txcYBqYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY57kI1+iYV6dHuCenCGgJaZjpOUgYh1g4Z2g3+KkpyfhpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyOkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SIfm9fcnCFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkJKEbm95jH51bm9rbHp9Y2hralludlpSaXJqYlFicnhsYmVdWmqDbXNhW2dfZGxfblRbcE5IT2dlXGducYBsW1tjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgXB3eXuDk29tfIF3XoN/dIFtaXp0lHNnc4d8cpGRg5qfm6CGiHZ2lX5tdpSXfoiQg4qNmnyLmnZ9dnFvbGphdXxnYml1elpfeHx6bXF/ZWRoZ1edj15xcpa8xIR2cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnZ9gXF1hoGelIaVj4OCcX+IdIN7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi498aYB9g3Zmb3h4c3ZzbGqNhYqBin94goCEg39qXnF4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGYjI+MfW5te4l9d3RvaGh9dmRccWNYb3NTU25zaWFOZnR4ZmBdXFhugG5zWWViXWptYHBPWWxSRFRoYVprbm17b1pbXm1jWmJvd2NmXF1ga2pjbGlzdoGDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeXl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjYWfmKCZhYhufYx2aniYj3+CioKVl4p5j5ZvenNwbGpkYHN6aF9lcntaYHJ8eWdwemFlZY6xsndKYlqk2dCXcXuRi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgG+Kh3F0fnppeYWDpZGEk42Df29+g3aDeIWbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qHfGV9foN2Y3BzgGh4cG90mIyFgop7dniAhHmBalxwfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmYyNhHhubn6Ef3d7ZWhqfXFgWXdaWXFuTlhyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcF9vTldpUj9ZZl9acGtneXFbW1hrZVljcHlfaFxeZWxoZmxpcHd/h25sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHp5hJOMdGp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmckoKGZ4eEcGh6lol+f4WCmYqBfI2MaHhya2xmX2FveG1fYm95XGRsg3phcXZfZWXU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3duiIRsdXt0ZnmCg6eMg4+LhH1uf3R2g3mFm5CLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4KKhHhheYSBcWRxaH5tdHF1gZuLgH+FfnN2fYBzgG9bbH50eIqCi3uGgHyIeHpxbIiDj4OKcoF5f5aLin50bWt2gIB1dl1paXhwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dGhZYltnZW5jaU1XZlE9XmZcXXZmX3RwW1lUb2RZZXB5WmheX2dtZ2psaW93fY5saYKEfnlugHt8gH+CenWCgYyThXCAi253foB7e4iTiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtpf46Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsc2FocIl6YXN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcIZ9aHZ5bWV5iISlh4GHjYl+bn51f4B8i5mHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaCh4ByYHeBfnFkcmd1gm11e4WUkYF8gX9vd3l8dH5sV29+dnSLgYZ3h3WCiXp4cm6JgI6AhXJ+fX6SiIl6bm5pbYKCdW5daGZ0clJbe05ccVxPXHJwY1ZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWmhOQGFkW2B2YVx0bVhXU3RhWmRucldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uKjY+Dan57bnd5dop3fXiAgod/g35+em2EjIiYo42Eg3t2jHprbYSJkXl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdWF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdWZ3dmNqfIOInoKAf4+PfXJ+c4R4f5GQgniWjZSPh4KIeomJbHh5f3Voe2lrf3lzaXp2gIN9aGB3h31qa3Roe39pdoGLkJR+en5+cHt2e3N+YlV2fHJzioSCfYNwhop3eHBwg4KMfn15fnx1joWCdWlxaWyHgnJwXmhjc25LZXVMXm9VVFlzbmJQT3N4YVJXWFxhcIJzW2FcaGVkY2pkUFtxSURkYVxjcV5dd2hVV1V3XVtlbmhWa15hamdlb29pcHZ7k25piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goN+iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4d8aHSGjZF6f398iYaEdo+AZ29tX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIjmZxg29ndW5bbX2AkJOAgXmSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2dn9/fGFieIZ6aHR1Y316Z3WGjoyVe3SAdXGAenxsf1lWc31vdISHf4B5a4iGc3lrdH+Dg316fXh7couAfHJndGVtioNtdFtrX3VlSG5uTFtiV1dWeG1iT1N0dlhQVVheYXGEb1xgY21kY11uYlRdckdDZl9dZmhdWnpjUlVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6GgomNint3f3iEfHyFh3iHfH2BfoWAe35zdnmMjp+NiXqKdnWDeV5+hpqMeYeDdIWGhXeJemJubFtiW1thVmpzY2BbZ25vZ4dyYXFmV11ja398ys6HuaJqbW2KbHGEcXyEin57koV6eXR5dXV7am11Y4R1kYJ3cGdefYJ5i4llcYFranFjWGx7hpyIgoJzl5R3fntuh3GBiYuHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWpscXd9fHpdZXmAd2l1eGaCdmd0h4uNlHxyh2lvfoB4bXxdWHF+bXOAi3yBbm+Jf3F2Z3d/gX+BdnxxenSGfHlyZnNhbouCbHNYa193XElva05XVl5UVXtrYU9UdXJRUVRWXmJ0hWhcYGtqZmJZbmFYYnBHQWhdYGZeXVV7Xk9WZHBZW2poXVdnYF9yZmtncmdwcneGeG6VinR/end+eYKHgHVzgIaFjoJwcHt3d3V6h4aHjIZ6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x9i211gHlkg4iXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmeBc2JrZVdaYGl/d76ue5+3bmJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYqDZnF9aGprWlZveIqkgYV/cZmTcYB4dYFtgIGQh3KUiIyHg4iFfXl0cm9oemFqbWBtdmpna2t5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0YlxvfGt0e4t7gmZ1h31tcWd1fnh9f3J8bHp6gXp3cGVsYm2Jfm1uVmtgd1ZLamtPUk9oTll8aGJOVXVqTFBUVV5mdoNmXWFwaGdgV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxZZWNedGZtZHFmcm90gHdwmoV2f353f3yFh311c4KIf5SCbnN4enpzc4WHiYiEeIB9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4dpd358bISFlIByj4JxhoJ+gn9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoBziWRleH5pdHZzc4OFeIGEeXd0dW5re3FhZ2tnhnSNhG5mXV99b3uJfWhsd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt6kIR2mHyHhoKGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAeIJ1YneFinyUgG6Lam16gHBlcmVgbHlmcneKe35idYN2aWtxdHpweXhyfWZ+f394dm5jZWFthnxta1ZrY3FTTGlrUExPcEdee2ZhTVV0Y0pOU1dganZ9ZV1nc2llX1ZjV2FwXUxLa1hjYVVUVHNXTFh1ZFpfa2BcWmNlX3dmbWJwaXNucX50dJmBd3+Ad39+hoR6fXWChH6XhW5ydHt6dHGFhY+CgHqLdXSQgH2BlI6AhYR8foyGen6AdnujpYp5iIWEbHV8e3WEgox6boVzeoV9gYN1bmpoZVZdW1paU2JuZVtYYXR7amhtaV9iV19aaYBqa2+AZ2xhaHl5a3R0dG6FgXp/fXZ1bnpoanlqX2VuaYF3j4RnZVhid2l+h3pvaW9mZl1VWG9oj6d2gXp8kI55dW9+b3J1eY5/d5R0hYJ/hYh1anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoW253ZHBziHx5YnOAcGdqeHNya3d2dHdjg3t+d3ZwZGNjbnx9a2xWamNnU0tsaFBHUmxFYXhmYU1TcV1JTVRZZWt3emVebXBpZF1WX1VubldLU2hYZl5YTVVsVUpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlIF7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gYCBdW6Hb3yAc4mAam9tZGRYX1pZWlViamdbWl91gmlebWxcYVZcXGuBZnJ0fWlqXWt2dmh0d3Fthnt+fXl2cmx6aGl3Zl1kc2h6d5KBY2NUZW9mgoR3dmZoaWBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt+dXVidIWKeoeGgH93cnV+dGFwbFlwc2JxcoV8dGRygGxhbHpvamh5d3RxZoV1enp1cGRhZG5zfmpsVWpeXlRMc2NRR1diR2J2ZmFLVG9XSkxYWGdrdnpkZW5wZmNaWF1YdmVUSlxjWGhYWUhXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDl3lygYB9f4iLhn12doZ4h4x9c3V1gXh6eoKMjn1+hIlqdJaBe4qdfX6FeYB6fnyGiHNxj66Me3uGkH5mcoh6dH19dnJvhmx7fmyPemJwb2FlXmVWWVlXY2ZrX11dc4VoWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYV5f4B5d25vdGVpdGVbZ3VmdnaRel9dUmZmaoKBc31hY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB4eHR0ZHKDkn6Hgoh6dm9xfXJhd2RabnBhcHGCfHNmcoBkXm52aWNmeXp0bW6BdXN8c3FiXmZub31lalRpWVlUTnhfUkpaWUhidGNhSVRtU0lMWlZpbHJ7Ymxsc2JhWVpbYXZcU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fn9ziINzcJmie3p/iZV5ZHWIeXN4dmx0b35seXxwkXJecG5gZ2JsVFpZV2hjbWVcXHGJZVNybltaWFhgbHZkaXVqal5abXNxbHRzdGqGfH6AfHdvbmxkaXFjW2pyZHR2j3NbVlNkYHF/fnGBXGFjXVNaYFxjkp9lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZXVnXmJaYWdcXndoV2Jdb2hhd2Fbe3ZqaXJvd3RzdGhwgZSChn6EdnJqcHtsZnZXW2ptYnBzgXpzZm9+W2BwcWJeaXB8bGtzfnJxeGtwYFxlbG17YWhUZ1VXUlB2W1NQWlJIY3NiYEdValBIT1pVa2trfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LaWNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBdH+CcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2c41rXnRuYWdla1JdW1VnYmxsW1xxjGRPb25dVlhVZ2l0aGJ0ZWVdWm51bnB1dXprh3x/fIh3kHNjZWtvYVxubWNzeIdrWlRWYmN3fHxwhVxjX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1plamVxdIF2c2JtdlVicWtbXm5lfGVsdXxycnJqbWBZZGpqeF9nVGVVVlBVblhRV1RQSGVyX2FGV2lOSFhUVm1pZHxpa3drYVdcVVt0Y1NSV2hRWWZUU0haWlBOeHdbX2ZsaVpiYF5ej25iZmt5dW5vaHZ2f35tg4B+hpd7f4eBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9gnVupYxzgY2Ld3hueoxgZHxxZnpzeWxtcXaDZ2R8bGNmZ2hTX15UZ2Bsb1xebo5oTmltYFRWU29mc2tleGRlXVlwdG1yenhzbYh7gHece3prYWVsbV5gb2plcHl+Z1pWWGBrd3t7b4NeYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbV9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWVve2xxbGJYX2hob3SBc3JeaW1TZXBlVWJuYXlicHZ7dWtvbGpfWGFnaHVdZVZiVlNOWWZTT11PT0hlb11jR1lpTUlfS1htZF94aG59ZGBVXlRddFtUUmBmTl1hVFNKXFpRWXV1XV9mbWhYYmFbXo5xY2dqd3FzbWh2dHmDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRyf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x9fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLzAwMC8sgKSgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx4cHBwcHBh+qaSkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp6enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQio+Mjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4qGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2IioWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh42MhoyIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEiYeGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiouNio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUk5KTk5OSkpKSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkZKTkpKTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpOTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCQkZGQkZGSjZCSkZGQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkI+Pj4+Ij5B9jJCQj4+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo+OjnuNjHaKj46Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjIyOc4eKc4WOjI2NjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4NugoJwf4iFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV1dnd1cWZtanFzb2doa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdsZ2lmcm5oZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxlZl5ybF1eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST05QU2FiWWtkVFFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BZaGhiaWJRT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0tGQ0ZKTWNya2dwalVOTUxNT09PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkA/QEJQbHNtaXNxX09LS1JMSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz49QklCPE9pcG1kcnRmRUpeVEZCREVFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7OztBWVE+RWZtaWBwcWlSYWZFRUZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTpHW1NTY2pqbnFtamhtVD5DRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODpNY2NpbGpyb21rbGNAPUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0M7PT5dbW9wbXFubGtsTzs+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT8+Q0tmcnFvcG5qa108Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0JGRD48PD1APTg6O212SDg8OUtrcm9wbmtnRzs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWVE8PT1JTEVGdXZNNzg5OEpscnJwbVM7PDo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUk7XX+Df3l7d1Y8Pj89PUpmd21SPT0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSHJ5a2KChIOCg4B9XT5AQ0BBPkV0Vjs8PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3t9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R9goKBg359hHVNQUNFQEBBTnZqSEBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFcEJERURDWHWGiIl+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydXZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH93f4SFg4SJbEFBVnSHiYeHh4iDV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN2d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVWyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVYGDhISCgoWGhoOChoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkllhYSEhH+BgoOCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ozo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1xhICBg4SEhISEhomKioiHiIiIioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0+Ozs8PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3x8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj09PkA/Pz9AP0A9PT9CP0FBP0FAPUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSgoKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+Q0dJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhEQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERliFgoOEhYWGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dJWYWCg4WFhoeIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktHRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAOTg8Ozw9Oj9APj9AQ0ZJSVBfgoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNck5RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS05LS0pKTU1MT1BOSElLTE9RUVBRT09KSEpKTEpLRkdIR0VHSEZFRUJBQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418WFZSUlRST0xLSkRFRktPTk9XVVFQT1FTUk1TVE9NU0xQU1VWUlNRUExKTU1NS05HR0pGRklKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4toVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklJSUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdGRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXV1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0VEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBgXFhdX1dJVl1dW1tfWUlZWFlbXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7enx9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlIRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19nUGBmW1tYXGdhR09aaGdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ1eHh4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXRzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlRic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBREFPUE1TZHN0dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+alFLYUVGSElFQj9HTE1HTVFVSUJFPz88PTw9PT89P0FDQ0A/PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5KSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2tnYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9OTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHN0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUhQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUldRUFNTUlVbT09RV1BNSURGPjo5NjU4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1FRVU9MUlNUV1hUVFhSTFdZWlZYWFZYWV1XV1hoc2tdVmFza2FhX15kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVVNUXFZSVVNST01LSUhIRj8+PTo3ODc2NTk5Njc2NzVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUlBSUlNUUVJPTExLTExIQ0JBPTo6ODc2O0I0NTY2OmRvcXV3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzdEbXB0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25hZVBTVFJTVE9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpNS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVNwcnR4e3p7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdDRkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHBzd3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNHR0lGSUVCQj8+PUNCQUdKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtub3Z5eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1URklJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWXJtd3l4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDR0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSktKTV1SSEhETUdBREtLTU1QTktNSktGR0dKTU5RTkxibWl2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QENAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0lISU9SUVJOUmZmZnFvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUpIS0lGSFBLRElNTFBNT05PT05LSkhNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHdsanV1bXJ2cWxubGVyTUhERUdDQkBCRD1CQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSUhLSkdLUk1CTk9NUE9PT05PT0tLS09VV1ZVVFhfXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vqc3VudXRzcXJqa3NNR0dGSEJCQERFPEFAQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lKSUtNS09TTkRRUlBRUk5PTU5QTUxNU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG1vdW9yc3VxcWlvek1IR0hIQkJCRkU8P0JCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTE9PUlRPSFNVU1FTUFFNTlFOTVBXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnJ5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVdUUVRRUkxPUVBPVFlaWVxaWVteXl5gY15cYWNrYmBkZ2hyhWhnamZqbW5wb25zcmp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cHVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0NCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlBWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAQ0E/Qj9BQ0hCRkVGSEZJRkZESUhHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0tPUFJVWFZNTlRWVFNSUVBMTlRTUldbXl5fXV1gX2BhYV9hY2ViY2hiZGlqZ3aLbGppZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93S01MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUJEQUFFR0NHSEdHRkpHQ0hJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTVNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWNpbmdiaWhobnh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTkxMTEdFQUBEPj5ERUZDQENBRURERkJCRUdDQ0lGQ0hKSklJS0dES0pHSEpJSUtISkpOTE5MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYXZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUxOSktKRkM/QEI/PURFRkRDREJFRUVGQkVGSENESkVFSkxNS0xMR0dNSkdJS0hLS0lLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW14bWx2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj8+QkZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlKSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xNSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW150Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXh0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1MSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FhUWBsaF1qXG9qaWRbcGZkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSVBJTFtRSkZISEtNSUhKSUtLSUhJR0tLTExGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU5PUUpJTlBRZXJpVFlXW1tcVVlaXVhdXFxjZmFhZWJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkdHSUdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iXmRgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkVJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUlHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhXWV5dY2JjYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDR0dFSEdIS0lJSURGS0tLRkZJSk5LTkxITE5ISEY+R0dMSUtLSktLSUdFSURDRERCRkpEQEpMSk9bY1lfXmFfUlRSV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFpdY2BfX2NlYmhvbW5sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0ZDR0VCRUhJRkdISEZGSkdIRkhLSUxEREtKTk1MS0hKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlOXlFPXF9hY2RjY2JcZGNiZGNmWFFVVFJbWFphX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0pGRkZIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElGQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVllgUlFfX2FiYWBiYmBjYmFkZGJYT1FRUVtTW11dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tDQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdISktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXlNWX1hOVFVOWltNSktUYGFbX1heXmFdT1liXGBgX2JjYl1hYldfX1RQTk9QWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUENWXklHR0hERk1KUFBFSUlKS05MS0tNTEpKR0RKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhCS0xQT05MRk1GR0lKSEdMTE1PUElMT1BPU1BMUVNSVVpZV1lYWGRXT1NUUFBOTU9VVFtZWVtdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0dYTUdISkhHTUxRUUlMS0tLTk5VTk9LS0xHRktQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJXltybU9NVW1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVJUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYWFiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS01MTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXF0cFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9fdl9YYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTkJETExGSkxGUVZMS05JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9vgF1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3J7fG99eW9/cl9gYGJhWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05ZWk1TU1JOTE9JUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktNVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUml7bGlqenp9bHh6f29nb1h2dmp1dXCAYHJnfWlseHxvXl9fYmFbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNMT0lTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2NSZ3F1bm15cHdsdnR0cWxtXHR+emtteXxrdG18a3B2dXheX19iXl1fZGRpZ2hlZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBJTE1LTFFRUVBQUVdcWVVNVVlVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlyfF1US2xgdnVraXZ8e21+eGt8cF1eXmJbX2JkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ21tcnxrbWhre3RtbWttT0hKS0hJSUhRUExOT0xLU1NTT1NSV1JWVFBXW1ZWVFRUYWBQTk5LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV5bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVVRQVFVYVVlVUVpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NQUVVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RmZGVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZlZm1zZGloa2tlZGNmaFBKS0xPT0xNU1BOU1FRTVhXVVRVV1dXWlVTXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2dmZGRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVlxqZFZYWVpXVlRUUEtPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZXUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGdkZGFZYmBiXl5mY2NgYl1cXFxcWVpbWFthW15dXF9iX19iZGViZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhRTE1WU01OUk9RUk9MUFNSVVpVU1BQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpeX2BVYVxhYV1gYmBdYF1jYWNnaGRmYFljYGFfX2VkX2BjW1pcW1xZWlhZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xdXFheXF9XXF5qcXd5gGNcW1ZWWFFOT1ZTTlFRUFJUUktRVFRZWldVT1JOU1hXVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRTU11YWl1eXGBgYFZiW2NiXmFjX11iYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUVdSVFBbXV5eW2BcYFVcXWlqcn1zbGdcVVhXUU9SWlNSUVRSVFVUS1FXVltZWlNPU1JWVlZUT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WV1dfW1hRVFVZWVlVV1lbVFNWXlldXWBdYmJeWWBbZWJfZGRfXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYFxbW1xbWFpbXlZeWV1QT09SWlBaVFVWVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWVVRUVNcVFVUVVRWWVdMUlpXXVtcUk9VU1hWVlRQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVFpeXF5gYV9kY1xeXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXV9UXV5iZWV2gntoWFlZU1ZTVlxXV1dWVlddWFBVXVpeXV1UUlhTV1ZUU1RYUlNWVFhYWF1eWF1bVl1fWF9fWF1WUVlUWVpaYVlcVVZYW1pbWFlZWlhWXV5fXmNiYWRkXGJcYGZhZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWNeX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFZeXGBhXFRVWFBVV1VTV1ZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGBeWVlhZGJga2ZoXlxdW1ZXWFlcXFxfW1lbYlZUWF5dYWNcUlZYUVdWV1ZXVlNWVFhcXF5gYF1hXFdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYGBlY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pYW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFeXFxcV1dbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFgX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWlpeXV5eYVxbW1pcYGFeYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXFtcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl1bXFtYV1tcX11gX11bYGRcXFhaY2VjYFJcWU9YWFpbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW15gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXFteXFhdW15fYWNiYWFdYltiZGJgY2NiXFtbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlYXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcYGBjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fXx8fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKCg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjY2NjY2QRigqKioqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+QkJCQkJQ7FhoaGhsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fHt9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8e355fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d3fHl5fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3t8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJwcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcXFycnFxcXBwcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwdXJwcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXF6cW+Ldm9wcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcY1zc5h4cHFxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycnFwl3t2oH9wcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Sfgnukh3F0dHNzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp+fH5+fHZ2d3d2dXh6eHh4eHd3d3d4f6eMiKaQd3x7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t7fH1+qZKGpZV6e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX19fHx/fIKrnIqilX19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgICAgIKAmq+op6eVf39/gIGAfn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39/f4GBgIWspqWvpp+Cf35/fn5+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f3+Afn5/gX9+j6mZoqqbo49/gH5/gH+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBg4OCgYGfoZOfpJifmICAhI6Cf4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGDi4uFgZidip2qm52ahIibkoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GFlZuMkp2Tna6Zk56fn5qIh4eHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgYOFhIKNpaqsqaOdpZmdpKKdkIeIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOTpqihnJ+am56fnpaEhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoSRl5aYnZmcnpyajICAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOBf4ONkpaal5ugnZOEg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4mXiISChYaQlpmXnJ+biIGEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY+NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYWEhIODg4KEjpmLg4WEhIqTmZWanJCCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI2AgoGCg4eSjZGOg4GBgoODgYGBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZWXiYB9fX19e4GYjICDgIGCgISJiIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Kfn6AfYeKfoSEg4SCg4ODgoSDgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYp/jIV9homAfoWFhYSFgn9+fn1/g4SDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYKBgX59gYeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYaFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/fn1+hYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuJiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICEhH9+fn+Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyJgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYKCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19fn58e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX59fX+Afn5+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoKBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Ag4ODg4OCgn99fn+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4OEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9+gICBf4CAgX9/f4CBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f39+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4KCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeCg4OFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYOCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyJk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWCiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDgoKCkpCLiImHiYeGhoSGhYWEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSj4yJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GAfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjoyIh4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCgIF+f4F8fn5/f32AgoGAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkoyMjY6PioWGhoWEhIWDgoOCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDg3+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/jJGOjI2OjY2HhIaGhYSEhIOCg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5/foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHt7en1+gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4F/gH5/goKCf3+Cgn+Ai5CNjIuNi4mHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXt8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+goSEgoGCgYWGhYWGhoeFgYSRj42KiYuHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f3+BgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fX9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJKOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4N9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkY+NioiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent7eXp5eXl7fn+Eg4SHiYqHiY6PjYuJiYWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t9fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgYCAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx8fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2Jh4eFhYeFhYWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeDhISFhISDhIOBgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn6AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn59fX9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChYCDgoKCg4KDgYGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOCf3+Dgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19f39+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgYOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgYKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gICAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc294d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXR1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYGBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/e3l2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoOEhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gH18eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX5/fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoKCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f3x+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFh4aGgIKFg4OFh4aDhYWFhoeHhIOGhoiJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX6BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJpb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xudoKBgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhYSEhYeGhISFhoWFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSGhYSFhYOGhoWGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIaFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOCgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFhoaGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFhoWEg4SDg4SHgYOAgoODgoKCf4B7fX59fHx8fn18fX18fnt8fHt8fH19e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4WHh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GEgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWIg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4WFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhoOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6Ae3t7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhICAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3x9fX19gH19fHx9gH99fIaDhoaGhoWDhIOGgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CAgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXW19fX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVybu9vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L+oqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tTBqaurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwq2vr6+vr6+vr6+vr6620tLS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tPT0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tXW1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slcObvLiZtLOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaafqI6AjcWdmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2ajKOJrNa6mKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5m4urrZulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqClpJyWp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sg1aS0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iyNfK2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7nDj6Gfn5molpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTk6irop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqrjY+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1sC/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLV1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Nzc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njg5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpaampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyBc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWmpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo57amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJibm5ycoZ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJSZmZiVm6aWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4SMlouMipGci46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomQjpaCjH6OkoyIhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9ho2Zm5CEjHuNio+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHqJlZGQgoVphoWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNm5aLkYh/X4aFiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqZkJ2gnZOXmqCZnZuioZWQm6yRk5uYe1mGj4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hmqCsio6hn3ZZg5mNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKKmpIWGp6N0W3OgmZ2Yn6GiqaegoqKurKuqp62vqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhpZyCgqGicmNmmZ+elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6WSgH6dnXFoX42ioZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGuinx+pZ5valyEpKWinp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66ruYN3fbKmbGlYfqWio5qcnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLh6cnGwr2dmVIGlnp+WlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSud25lrLdrYFKNraWlnZekpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb62qX51aaK2dWBWnLWurqqqp6ynp6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+t6aJfn2Vo4Rtaqq8rK+vtKmqpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DybCWiHuGjJGJeYChuLCfmrCurKStsLSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTEubTAt7S7xcudgnhmdoSGfGx8hqa2qpmit7CmsLu1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysfEw8TCxL64vcq9iW5hU2J9fmlVZ3CNs6qdprSzrLLAtbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMfKzsrJx8jHv8bLpHleTkhUd3VeRFlieae3wL6+uay5wbq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfBzNXXzcvKzsXJvIprUEU/TnBoWD1OXGyVxMzGxrCZusS7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIxsnV29XNycnFyad2WkxXRUpoXVY9SVZje7zQxrCQibnCu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDy9nTyMPCwcaiaUxilWpIYVZYQU1VXmmv1r2TdoW8uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamNnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrRwb3P07y0vL29rmxGgL6PSmBXWkRUX1tfosaje2iTw7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2lmaV1WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8LWi7q/wtm5oaWvtLh3SYOrjkxoZWNCVXNgV5GfgmxlqMa/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQxHOpy77czZqPlqKwgU1xfnBXf3hxTlaBZVV4dmtjbsHGxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2Ktwf7zI1N6yhIWPmX1VY2ZWcpmCfm5VdGNaY2JhXIXSx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi5vcfKysPHydKUbHGt0dDb1JJ2fH90XmJdTpWlg4SJVF1dXFlZWGGq0snHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvG08O6vrzEvre8wL/J0MfIysrAgm5vo8vLz+C4c2prZ2BgV1WooYCDkl5YWVZRVVJ5xsvJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uarbw762vsC+vreimKavs8LAo3RydJnEx8rW14ZXVVFPUEVbn5F5g4lnWlRPTk9WnMnLxsLAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xrVsq828tbnAvKd6bGduanJ/lZZtdHeVvb/GwdWoVUJAPkI5Wol9cX9/aVtTTExOdrfAwcK+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfX1pTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wM6xdoCyvLW2waGFaVpfX0xSW1ttbnJ9nbi3wri9u3NENTU5NFJyampzcGRfV0xLXKDAurm3tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLKpoR3iqGvtJhoY2ZVWWBKSk1QVGpzhKOvt765s7aeaDcwNTNGXVVeZGJgYl1PTHa0v7iyrrK8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2JbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xqeIe3aNoZReU0JZVEhibFdQRklji5+qr7a6tbSyrZRQMzExQVBGUVdYWGBgUFyYubq0raWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWdYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uL+zkIF5iI5rTkpAaFhCT3eDlmxMQld+sLSztbK0r66td0wwMD9FO0VWV1FYXVF8sLKxrKyepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4tZWNiYR5VkZBUohXSkpWdoyAYT9Vp7iztLKwsa2wuaR7QC0+WnuXp6KSc1Valausq6OnoJ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFVhY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrupmJmVaE1AVnpuT0lJTGaaf1dFVa+7sayzr66srbW3oGZnk6mnn5qbnqB/d52ep6mfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9waqmvWRFVaKDUFlJS2FKWIljZmaBrLWqsrSuqqqusK2rsKecj5aRjZaeoKCfmqOkn56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDJAODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgrMbAyppOQnedbk9vS05iZnVyYF9mdI2wr66ztaqmq6qinJiSjI+UlZaXmp6ioZucpJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKXGxohXUktmol5pfnJ2WVJrY11pZmVqi7SwsLispqCbnZmUl5mYjo2QlJCKjY2TmKKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqONeVVscnV1bWJ1clhZYF9kaV1gWGKsrqyvp5+doZ+WkJObn5qYlpGSnpuho5uem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgo35vgW5gZFdNW1JYS0tRV1FJUk9Dl6yqqaSfnpiSkpOYl5WUlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5yIYVdfZmBWTU9FPD4/Q0M+PUJRd6itqaqln52doqOdn52Zm5uTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PTw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BeZV9QRUU6REBGPD45Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCjoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6q7itq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpYFVORD5KXH1wYkE9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIREA/TIqhqZqDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0tfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPx8q/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtiU0tJREI/RFaz0r2ysKacnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1tfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3M0MbJyMDEw8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKgWUlAQURAR1F5sq6nmpSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxcrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2VDOD0+RViCqqifmJWXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw9ODc4NTU7PkA9OTw8ODs+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLF6SkhDPViMoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXGJtcm9vc3R2dnmkv8zV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1NLV1crAysLFzMLIycPMw8XIysrPys3M0M7TzMbIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PDtaqYpaGZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFBCO0M+OzY3Ojg6OjU3PT1BPDo8PDk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son66VeG9zdYKSmY2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaXH08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrMz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrGyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fWiDhKWrk42Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGBrcnJvb2tsb3B9udHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWxfen6kkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/HvcnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvDurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzszBxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraVfZXWGk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7WruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCZW2lxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhma25ucnykx7+5uLWwq62nnqKpp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCxqLKztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wrqztLXDrqmwkVtqf5KHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupaSnp5qgpKGanKWsrqSooquqrauwo6afqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr+/xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbYiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpZ6boaWUnqWbmJGho6qjo6ClpqemraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbaloKSfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvcC1uLy9vrzCx8TDxL/AxKCDeHBsYmZfa29gVVleSE5nT1RIRUtGPD0/PTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqJ+VlZqhlpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fo6KypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8K7ur2XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaeck5SUm5ibopeWkZyioqienJ2lp6KlnKChm5mvrq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKenKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sLu2ur3AuLOxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrSvn5qkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5SXl6CXmZWXoJ6hnZagoamkn5+pnZubq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cim5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCwrq+nqKiyrbG0sLy0uriuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqpyZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoJ+npqSmp5+doKagqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqqs6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrraiZmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFiZWqAk5OJkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6SjnKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqqyejHJxb2BbV1ZWUkdRT0haW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGHj5COmpOVkpybo5yboaipq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZSTm5aWkqmqrZqcoKGgm5SQjJmOjJCMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761s6uvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uPiZKNl5GXmaKgm6CsqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefoqy1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOX+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Sio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WIjIaQipeJlJOYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqupLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpNTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+un5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI6KlJGUnqGPm5yjoqSYpZeinJWNh5majHSNg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTVJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso6CPlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKPgpeGjZ2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuxopqYhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKRfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU1OS01RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNSkRERElOT2hZTlFTVFVaboNzdn5qaVxVj4mUiXR/hoF8hYyTgpKai497ho+AdoB4c292cXSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuViYiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ6dmIynpJOhoJaen6SAcmhhXF1KV1BSR0pYUk9KTE1SSkpKTFBJTFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl50gnt4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcmyIp6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyGdG90a3FsZGxqWU5ERkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV+cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhtfWxxg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXkpQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4iIfH6Fg3+MfnaimXl+hoGFmYWbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMyME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1JRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPRElIU09GSExGSkdFRkhBS0VDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSURETFVRSElKRElHRUFAQEpEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKawqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWU0lHRkxRR0NHSUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaKIlZOWk5STjZCWkoeHe4aBjZaKgISBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6uMm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauon5WWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7SvuLe2w7rFvcPIsJ65qqKrjqWotomBf3JfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC4vbfGwLu5ysq6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3psXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QUhBQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIaMkIuJfIGEc3uKg4Z7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLizu721scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydHHzM3C0NK4sMO8xLmltrrEooJvY1xcXlhhWFllWlFdV09PQkJIRUJJO0FDPkFHPz9BODtEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhI6KiouQh3yEgnB/h4GGe4dyg5GLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKyzp7C2qqy8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56b2ZdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWSkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoZ+gqKWqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29jYF9YVFpTXFBKR0lKSkA7OjtFQkQ8QkM+SEI+QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJOZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZvZV1ZUlZRWlZGR0pJRUU9Ojc5QEFCOUdEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeHF6e4SGdXqFjo2ceoxwfG9ven9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnqLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjp+Zk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbY19jX1dvX09nb1tDb2tHWydTLlXl7aWlbWlBSVF5IQkVJST5BPT03Oj0/Oz1HPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uGgXV6kp6NoHaPdYJ0dYF9dICEb4GPgW+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdW6TlpSVj5iQg4qPlpqXl6Wcl6CXn5OSl6OdmauVkJCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYifl4+IjoqMgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNydHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6emhpZGBUV1ZVTUpETkQ7PTw8OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bXx9hn5zfpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+cmpKUkZeNjJWfnZShlJGNjZCLfpCOjouEiJKVmp+fiYyUkp6Rgot/pZmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHhsamRXYFtUUE5HQ0xCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22AfoR9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5bgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmiooaSnZahi4qIjZyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzNDMztfP0dSu1tXY2tja2tfW2dqfb3x1aGdcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pzw+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqxjISnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpCykGSkzceWj4WHiZCSjo2TlImFioqGlpqbj5CUk4aUl4R/j4uZiI2QqpeXo6OImZ6Wm4mPh5eXioSOjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZqcsp2GhaiinJiFiImOlY2Lk46IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbKWl6ShiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U2Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em2Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYWDkqe7raiyva+lrbOzqKOisKyKmrWdo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoGm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KWi4+VjYuMl5iSnZm0lpWrnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeGd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZGjua6ov7ysrbK5paOnfYiGnK29sIOLjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpWQkJaXjpGgkYmVm6OslJaPlJyelKCem5igoZWanqenpKKksLKmwcfDsLC6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFpgW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq5tcG7q6mcsqWkqJSFjanDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZemoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcalNNSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy9wbOsu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkq+sq6yXhpmppqWRgoyTpZWJgXWKknmFjZGQnp+Tj5SLkI2Uo5mXnJWUo56pn5GlmoyPj5CVloh9j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8K3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpakq6egkY6SscWnlY58kZV9h5GZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJeXkpalmWWYo56ypZailqytq6ebn6aXmJaZlaGkqaaftqupurzEtaW0tsvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67trG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqss77CucC5s6e4tLiyrpWkrK6upIuTlaGNdMGafZaZhI6WmouxlZqZlZKTmZmmo5Wfm5aaqJycoaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZeOnqCao6S1yLSpxrrDw8fKyMjMzca+urKuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtra+wb++uLKyw7G5vayjrrSsuKWIm5emm3a+oISYnI6TmZqLrpehnJuXlZufoameqKCZmqmZoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvbm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXBzcjBvbmyr7m0wMLKtcaxwby1uquoraywo6KZqrS6pqmmq6qdqK+no6qqvbynrLyzt73GvLe1uMCwvcCzqLS2q76lj6KXkaKfvJ+JmaCZlp6dj7efqZylo5ucoZqopbOhm52lnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FdYF1KSUZITVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJabmo+qlpanppWtrZmhq7bEwru+t8HCwMfDvc3Hu725sq+4s7/DyLW/r7y2uremo6qsraCgmqqqxKKlqKumnquvrKKpqL64pq29sLe2x7a1ubi/sL7BtrSytK+9o5ajlpOblK6fkKGipaOjn5C9pamdqaydnaGbpp+9opmjnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaymnJWyp5mwp5+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWmJdTklIS09MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dNopqjnJ7FrKGfrJ2crp+So56WpaCnqauXtrCiqrK1xMK9v7bAwrvIwr3KyLa4tbSws7S3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9taWxvLe2tcOys7e6vrHDwLe3rbO0taKcpJWRk6CtoJihnaipq6Kaw62pnqytm5uemaagvaGdpJirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cj5+Xlo6ipJWQpa6yq6mioqallZWcmIuPkZOkn4liZVtkYExJSktPRkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6ukoKSframsnbuwqKy1scfDwcKzwsS9xsO8xMq8r7G2rbC1r7/FtbmxsLq1rJqosKmpmp2loafCrZussJyqoq6wqaSnvbemtrq8rrbDrbOzwr+xxrO6tqu0ta2poaWVlZSjq6Gen5qoq7Cur7uypqCpqZmZmJOipLigoaSSrq+spaefkqGelZ6PkI2UnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbaGZKSUxKU0JDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZWyq6eipLKsrqm7sqywtbTGv8TEtcDEvcjDtsDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7WbqLCbrZ+utLGnqrqyp7mzt7K4wKq3ssK8s8Wnvq6tt7Spp6uhlpaRpaSiopeYpK64rbG1tqCfqKSZlZWTpKC3oqSllq6ysqaqpqGem5qalpionp6YoZ6vsqKmjZeumaWsl5mepZGbjpOYmoWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBOTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+ro6q0t7Gwubevtri4xb3Dx728w8HGwLnBxsG6qrakrbutwcO4uKqtsruila2wrbKWpaeQqrmqoKewnaqgsLSyqqm2tay7rLKyubesubDCur2+psKqsLevqaqrpp2YmKqhoaCRmKCwr7OrsLmam6mgmZaSl6aht6mloqKvsbSrsqirn5ugoJuepZuhl52js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUlpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSzq6Gttb2vs7i8ur22tsDCv8nEuMTCv8C4xL7Bt6+1qKu3sry/v7WprrG3n5erraitlqeojqe7n6Wts56rorGws6yptrO1va2vsbWssLWxwLrEtqu8r7G4q6yporGlnqSpn6OXkJmfsqqzqaqzmZ2nm5qVjaCmpLSup6GsrK2xp7OtsqmjnJ+oo52ToJibqLWpl5mSkp+Zn6GekKyfmJiGlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfR1lmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsHCtbS6xb7MxbjCv7q/usS4wbmytayqure6ur60qq6wtZiYp6uqq5usq4+rvJ2srrGjqp+wrbOurraxubepra6xp7Wvs7u8ybKqtbSxtK+upqCzn5qoraCllZWambGjrZ+lr5ahpJmZko2ipaeyqaGmsauptaWvsbWvo5mdraeal56Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipOSnpqloaGgmZaSk5Z7i5CGe4yKg4uSa254bnZ8YUZhallJSFlbPXtKR0U2QWJUaVpNXGFKW11aUlJSYmBMS0VfYWBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKixqaylo66utam3tLijq7S3ybu0u7u/vrS0t8PBzce7w7y2vr/AuL+8sb2up7q5t7fBtqutsbiUl6auq6ejsqmUr7ukrbKxp6eisrOwsrC0sbizqa6rsqe4r7Wzw8W2qLS1q7Ctqaeitp+eprGgpJSbmZSxnqebn6mNqaKdm5WXpaWlt6eisbOrp7GorrC1rKSZoKyom5ucm5SpuJyUjo6LmZyimJCXpqGfloSSlpCdnJiWloiWj5ebp5yjoJKWkZGXdoSQh3uFgYSNjG5xd3Z8f11MZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV5fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6kra2rp6SwsrOqt7C2n6u1ucm5rsG8wrezsrXCw8/Ev8G9tL3Av7q/vLPEqKm5sLa2v7yvrLOynKCnsK2lprClnrK1rauysKypqLS5rLSyta20rKmrqKypua2xsMe+t6S5r6mtraWorbClo6Ouo6mcnZyar5mio6KjkKyeo5+foaqlprmlq7S0pKmrqayvtq6inaOoqpufmZqSpLSaj4mNh5GioJaNlJ6glJOFjpSSnZuYlpWHl5KVmaabn5+NkpGOkXd+joV8fH2HiopydHJ+fX5cU2RvXk5aZl1GRJZbSDtObVhhW01gYU5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqmvpKijsrSxtLWxsaGrrbzLuq7Au8extK20wsPRxcW+wLK+wcK8v7e8xKett6yzuLzAsKuyraCkp62pqKSwo6qxqq+ssK6vrauzuqa2sLKpsqmrpqWjrbqsqrHCubSruaioqK2pqLGlqaSirqqoop6boqyVpJ2XnpirnaGnqaGspaOtrLexsaCooqCrrrCsnZ+nqKmZpJiZj6CnmIaDjomLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjop/f4iGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFlOY1xNVVZVV1BcYl5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZitp6KqspypqK+2rLi1rqqlq6q9ybuwvrjDr7Gts8TDzs7Dvr+0wMPEusC0ycSsr7eusrnAv7Surqulp6qwqaeosaW0rauwrq2xr7Oss7qkuLOsrK6nq6CinrC3q6qturaktbWkqaesrKqtoaimprGypKaloaGrlqmgk5qgpp6koqqkrKKfp7G3rKyipKKbqaqtqZyipaSkmKCZlo+YnZOBgo+IhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmYqOi4t8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtOaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCXqqistau2saukq6qpvMDAuLmzvLWms6/EycvRv8G7ucC/w7nBusHErrG1srO7wb6zsa6sq6uotqqlra+rua+osbGusau1qra1p7S2q6ykqaqdo52zs6iopLS0oLWtoamoq6msp6CrrKi5tqmqqamhqZ+tm5GooZ2gpKKmoqmdnKa0rqelqaKjmKSmpqmcoqSjn5mYn5GOj5mOfoeLhoSenoiFi4uOjpCNhIaVo5qOjZuRkpGPkp+XmJaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlFiT0xVVFVQT1hbYlVIUGpUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpaqtmaukrK6ztK6qpa+pqbq+u8Cxr7iuorawycfI0MC+vbu8wr26w8HAv66ysrK1vbzCsrKzqrOopLWopKyzs7mvo662sa+xuaq4rqqutqyrnqqsn6Ogtq2ooZ6vs6G0qp6op6qkqqGhrK2ova+srqyhp6efq5iPr6KYoqCop56nm5mqsKmjn6yioZOioqOmmJmppZeXmJ2PioeViH2NhoSEpJaFgoKLho6OkYSFlKCXiJGdkJOQjZGclJaPioWFeHSBf311eHmAe3RzemmCh6N1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOwqaOwp6q4vsC8sKi5qqeusMnGyNHCvb++ub6/vMm8wrmwsLSxuru5wbO0u6y4rKO1pqarsba5sqenurWttbyvvKWtrbWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6moqb2stK+unamjoK6bmrKjlaSbpKWfpJqaqKulnpuqoZuSm6CknZiWqamRmJmTkIqCj4V9j4KAiJ6Phn99i4aQj5CEgJOblIWTooyUkouRmpGUh4l+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFQUllLS05xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6ilpKGrpLeysqSosKesuMG9tbCjuayoqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6apqq+1uLSqnru7qLK/srqgr7S2qayfrrCinKWoqaKenKSxpq+gn6qpqKKqm6OooK28qK6wrqGroqOunp6sppeemqGjnJ+bmqOqopqapKSVlpSfoZablqasi56RkJGMgouAf46Be5qUjYl8fouFjo+MiYWSmJGHlKOJkpKHkJmPk4GIfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3OObWJqcGBwQVx4a1ZeTlBRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+pq7jCurKtn7ivq6i0usfLx7+3wb6vtL63xLbDsa65srLAtbu+uKm5t72rpLWnp6mwrbmwqZq6vKSuv7S0oa63taenp7CzoJ+kpqegpZmeraeonqCprqegppejqZ+wuJ+ksa+hq6GspJumpqmampueo5WcnJqdqaaWm5+okpiTmJ2TmZWhqpCaiY2Qh32HfoKNfHyhjIyIeYOMhImMjYSHk5qOiZWfiZGVgouWjJB9hHtzb31xc3RgeXhpb3Bxb2p/cmR6bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJQSU5cX29URFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwo7S0qai5xbayrqC3rK2ssLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i2qKaqsKyzsKaavLekq7u1rp+wuK+ppqevsZuhpKCjo6GWnK+moZ+ip6+ioKKTo6Wit7ChprGrn6yirpicqqSonpeanaSTmpyanaaqmZycpJWVl5WcjpOXoqmhkImKj4V6hH2EinmOl4qNhnmCh4SIjI6EjJOZjI6WmYqPln6Gl4uPeoB6cHJ3b290X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0tIR1JVRjI5Xl5tUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUm6qdpKGioLeqrqC6uKasvcWzsK+jtbCtra+1xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26taais6qmqLKrrbGhm8C1pKe1taiesryqqKapr6yZo6eco6aUmKKypJmfpKipnKKgk6SgpLiopKeupp6loKiSn6iioaCYm52gkpqblqChqpubmaGUkZSWmY2UkqOopJCJio6FeYR7hIZ9nY2KioZ5gISIiIiRhJSTk4yQlZSNjpR7g5eOi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0tKR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqOnm52enaO1raaqubenrMPBtrCso7Wup66vt8DAvLLBtrGusra2uLe2rKm9s6+ysb2/uK67vLGln7arpaS0qauun57Cq6ilsLKprLS7nqmqq7GlmJ6qnaakkZmmraKYnqSpoZyinZegnae2pq+qr6GgnZ2hlKCln6GgmZuZnJKZnZSlnayimJadlJONlZeLj5iaqKCRiImLiHmFd4KCgZyIi4KJfH+EiIaFkYOVlY+OkJGRkY2Se4OVjYVzfX1meG9ramxndXNrY2dkZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlfbGlIQlRTXFtJSEZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FnSCU1mqOekIusoZiYoJals7Gisb23obHGu7mxsaS2q6uuqbm9u7uuwLKvrq22r7O4s6irubGvrbS2urawub6tpp61q6CgsKWrrp6kwqCyo66wrrettZ6tr6ytopmcp6mknpWbqKWfmaWjqJ2aoJuUnJ2tsKa5qK6ioJqanpmeo5qknZeemJuUmqCSqJaqp5qTmpqRi5WZjZSUmamnjo2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2CcIB/ZnluaGtqZ3Fya1xoY2NzgWFmaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lURkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GZqbKwn7jAtqC0wru9ubGmtrCorqS3uLe3rbuvraqrt6q0ua6ls7Wxrqmxt7axs7W6p6mftqmdnqmjqq2cqcCZraOur7W1ra2fsa2vqaKbnKOrqJuVnKejnZqpoqSWmqCckJujq6qpu5+opJ+XmpmeoY9ropaYnHGClpukgHWSqaeelJSekIiXmYCWiqGQeIaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2eGgGh1aWZXXGhzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RlRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOhm6qtq6O9xa+pt8K4vb2tp7awpaukuLOys7G5raqnrLSmsLWjqLi2tainrLezrrSts6Oqn7SrnqGknKenmay7laalr7K3ra6lqK6rrKWhn5ygp6abl6GlpZubp6edk56fmJCeqKqjta+jo6OblpeYl6OIoY6Smoehh5SdoX+lf6aqnpKRmpGIg3J4jY6FiKF2iY1pl4hmfXN4oW+Ih4R+jXx/oaCfmYB7h550iI52m4psh4GDbGhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk0/R19NRlJWVlFRUldUZ15NWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yqK+fq6GyqaCjo5qio5yutZWkpKW2vKasp6qqrKiloaCYoKajmZmmo6SYnKSplpSinJSTpKWmoLajo6CjmJSSl5ObiK6PmJSJqYuXopuFsYCjrJ2TmZ2UeYLUqH+HlcGbx3l4saW3l2SAwJy/eYSEeZCEfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5uZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKosMK9srXAtbe/wqums6ysqaevs6qvtrOoqKa1pqe4r52zsraqpaSnsa6usaaqnqeksaShoJ6XnKCer62VnqGftLqiqqihra6lop2amaGnn5ebp6CfmJ6np5Gcp5uUnaGmoqCvop+fo5aWkpeRmIWvamqKjap+Z4SVh61kcJ2ck5mllHGuoaR+eLt9a6GPdrFfarRbpYBmnJFgZoJ6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaGeHlkV1nGB9aHykp4JZX4uraYCVeHpqpzdKr1tXU21jW0tPWF9cV1Y7TohPV1cvSVRTSURFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK3rLS9vrC2xLK4u8KnqbCrrqmpsK6ksLqvpKWus6Opuames7Kwo6Wgqq2vrLCmp5+jorCbopuXlZeanK2ml5uhnrSzoauboq2toJ6alqChqJyYnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZCWkJmFtZu1eIWpmbWZd4ezm7d+k5WWqJR+a4GmeoKGiJKUknerZ2uxW6x7j4eUdIhxj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaJuW1NraGBMS1xkWFxaQj6weFdYQSNNaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAblZ+UiLOmpqGuqaezrKm7tsKwu8KtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6OinqiqsqiwqKWen5+vlp+ZlZWWmJ6topqao6i0rqGpj6moqpuelZegpKeanp2jn5ugo6WjlZufmJqdoqqbppmbm6KglpKRk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoN8poKTfJh6qnmNnJB7sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyiG2XiGBTtbTIhoCJfGOkM0Kddl1RamhkUEBYZ1pkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXU9fZlQ3RzphUTcyJZuik5ixqKiltKqltKikvLfBsLnAsba1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLO0sKCknp+oqrGptKmknJ2eqpeYl5aXlZahq52blqetsKijno+soqiWnpeboaWhmKGhoqGaoqKnm56hnpWZm6agnKeUm5qfoZiPkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaGlfrB2g5HS0XZcrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52PebNllnSEnm+eZpRSyItawlyfeWJfrWB2c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2tfbGhPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk9UX2VQNUc9YU02MjChnJGlsK2kqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20uKqfpp2iqqWyqK2qpJqcmqielZSYmJKSo6igl5Klq6+mopaTrZ+lkpShm6Smn5SapqahmqOfrZqgnp2QlpuhnZyllJyVmaKflZmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeEfY6dh5mZd6+GipGciHizYZplmoGClGySWrBYS5p1mHlmYK1ed3eHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3BtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA+Vl9jTjZHQ2BJOTg4n52UoLiwl7TBraiyqKqyuri0uL+5t7K2vLWkt7OftKyfn6irn5WntquosbGrrrSkm6mgoKihtqemqqOZnpWloZSTm5mSlKKlmpOQpqyupqCVmamfoo+RopmopaCVmaWonZyknq2doZ2gjZSem52gmJmclZeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqZHJ7gWuYh3NdrFqJoI5rbmVPSkOhXFpMdF5iZk1aYV9ydF9KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MlVfYkw3RklfQzE/OKGdmZm/q5e0wq6rramltLC4sbW/ubqzsbe8qbq0n7CknqWnp56UqrGpsKm1rKuvoZihoKakpLqio6ugl5uRoqCVlJ6alJieoI+NjKivr6adlpuopp+MkqSXp6qnlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo216f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYW1ZYlxhcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQzilmpuduqGcssCuraurp7epuK+1wLW8sa+5uKrAtamqoJumo6GdkqqqqLajsqiuqqCXnKegpau4naOtm5aZj6WjlY2doJuYnJ+Qk5Srta+nmZScrKqXjJOlmaSsopGXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsSxurKuu7CuwLGspKKeo6Gcm5GppKqypLWmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2bkJWSr7mxrJWXo6enlJGWpJyjrJ6RoKirn5ufqKKznqKljqeilKGanJeWpJiPsKCSlKqehZCZtYCQkYy3lXiCk5q1d21rbnNueY+Ejol0nsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3p9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNQZ2ZxbXVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZazw7Ssq6esq6m7rrDGr7WzrrentLitqaKhpZ6gnZmUq6Stqqa1qKefm5ago56spL6moauXlJ2QopuSj6KoopOdl5OXlLK1tq2YnaOkoouSkaabpaqblqikpZyaoailpqOpoZKtn5ejnpeWl52ej7CplJunoY5qfmmcpniHc36aj3R6ZYd6vb7Aum+SgnGVh19yalpemolhY4iOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6u1o76xsqegoqmdopuamaymrqSltamlm5iVoZunrai+p6mmlZSclaCak5ilqaeRnZGPl5ywsr+sm6edp6KJk5Gpmqikm5uroKOZm6OmrKKfqqKasJuVpqCWlZ2fnZexpZihp5ickZ2co6OZpqKanJqamY+WgWdtfXF3kpeUkYWKtaqNhpiVj4qMmJeHlJWKhJKTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dacHpubWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAp7ShnaSlnKOVlqCqpqyjo7ern5mWlp+XramlwJ6rpJWSnJeemJOUop+doqeTkZmop7LDr5qrnKqfj5aWqZ2qm5ugrZihm5yipK+moaSonq2Yl6admZqhnp6dsKCcoqaVmJKYk6ChlaOel6COlpOKio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQh4WZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqso7OuvKS0nJ+loqGdmZeopammpKWztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGclqichJ6pq6KzyLOfqqOql5aXmqedqJqdo6uTnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmJ+ok5iXnJGkmZionZqXZoOSfGV+jZmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHuOoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpp6Str7CfrZefo52hmpmnq5yto6WoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZiklXulrKKos8O3pKGnrp+elZ6jnqOboqmpkp6hnqCqr6qro6qfqJumn6ihrJahm6WwpJecqpWhnpuSpZeeqpiefr6Dh3K0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwrq2msrWvqqWmprCrn6uYmqKfnJuqp6KcrKOlqKWktKSdopOmray3s6evopKRmp2lkpGgoZebn5yHpqukq62/wLGgqa+pl5KfnaKZoaKpo5OgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WVoaOXnH/OlHh6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4h2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFxxaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC3l56RpKqorbOrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq2kqrCowMazqKmxrpaSnZyil56oqp+VoJ+cna6vp6qpm6enpKGrkqy0lqaiqqmdo6elobChk5qnmqCalJSRl6BxhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkZBkb3R1cGBnbWVfb2lpbmZjV1NdYVlSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoaWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6u0qrrNsa2mrquWlJydopmerKydlqCZnZ6psampqZurqaOirJuvsaKorK6lmKaqqamxopKXo6WalJKEpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mZaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqTb215eHdvbGZlZXFwZnxpYl1XYGlYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC0sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZn6SznZqglJyfp6uro66arKmioaqjs62iqrOxoZqqqK6vtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXk39we3V9e25bZWpycWaBal9hWWRtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramyraylopyyuayqoaabqKaqrKmmoKalmKujn66rnaagrJqeqaWdp7afopeTqKq2sqybppyglZClrZGZnKaioKqmrqGjp6mwtMKxs6qtqJOJl5ykmqCirqaYoZWYnKWmq5qvna2opp6so7esobK5r52br6ezs7OllJino5mfjoKdTniagX+feoOjfYOkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpaKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3t9k5KLdXpzhX9xXG1ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mpq6SruKuvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKpprKgmamklKO2oqKVl6KptLiknKKdo5OQobGZnpympKGir66dpKihtrLDsa6pramRh5Ccp5yiopyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyuLCzp5ier6GjnoWP0bXDt3mHjoWRk5CBpniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jI2Ti3h9eY6CbWl4aXhzbn90XWRkbm1mZ2BKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqaewo5Sso4+lraOdkJqaqrS0pJ2knamSlJeuoKCdpqOcp5y0mqGqo7arw6+pq6mhjISOnKGgpaGVmpqcmJqZpqSmmKunraKkm62nvqyVvbCsn6Kws7mrtKebqbGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkqeZgpSNl4x7e4OXf2tsf2J9dG2AemBnZXFuaGdoQ1phWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK2wbSfmqygrrilpI6bpKOgr6+qn6Sfna2Znrigo6ugr6qarqGQqqmklombkK6wrKefp5utmJiPrKKhnaWhmaScrZifqKa2qcCvpamjnouAjZuan6adkpWampSamqWjpJqorKyjpJ+qqL6kl8OsqqKhrLK6q66noLOuqKmYdq9+kIuchYd8uq6KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+om4uYkZaWe3mOnX5kc35ig3d0gHxhamZxbWZlZU9VZFxCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBOSkdDNTUzLy9AVVpYV1dXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5uspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrnq+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop2ln5mjoqWZn6Opsqi8r6WonZyOfYublaCgmY+SmpuSmZeonqGZqK6npqajpam7n6DGp6Wpoau0tq2upp67rayslYCpkqOvj5uAh6SXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2seHeivrt0gJaOpp2QnJGXnHmCkZt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9sqKdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajraGknKqgmIujkqeep5yaoKiimJ6grK2qua6oo5qWknuHmZGmm5KOkZiYj5iTqJmgmKmpoaqnoaOru56pxaOgr6Ors7Wrr6mguqeurppzdaqkt4ZliaBwZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Rb2ZkgI2SjqKYmJmRlp58h46VdmaHeGiNanl+eWRsY2ZsYktlWEpsWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6qpoa6epLKpmJK9ssTIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmaiZlqOpoJacpaanr7qrrJqbkpJ7hJeNpZiNkZGYlI2YlaeUn5ipo5uxp56jrLqfsMGnpLOmrLGyq62rp7ijrbeWiqGopbadiZaimIepmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmpeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadte5SRlJOBgY+Pj4+dlKGWmZeigoiUjXJpkHdwi3d2fHpqbGRkb2NVYFlAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCmlqmqpbW3rq6isKStoKC1sZCOq8a9xLq4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5yolqykoZmnnp6TlaOXqJqomZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2pqbK4oK68mZGmo6a2opKdpp+NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clquckpmhm5SQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaQlJSRin2MlpKSmJOhk56XooSImId6cpZzeop/cXt/am5kX3BpYFtgWm1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2mtLuvrKyio5p6naKxpKWwqZabuaejlJmqnI6Giomco5Cun6OWqKChkpeYm6+LqpaPqJmnjJmoj565tqSlmZuNiXmCk4uak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqxu5R1rKSeiYCqfmRcYnagjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmHipSSi1t2lZFnaJCOcnummZlleZmHgniYaoSKgm55f2twZWB2b2traFxmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuVpqOhsLGsq6mlqK2jp62kkpWrtrCyppqqp6uXc4ydsJ+oq6eTl7mgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlZKJk5GQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqirreBjo2mnoOLhY+xqa+MipajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSVkniWaJN0oJp0fZmEoZ2HmH6Si4ODmWuOjYVreHtxcGdkd25pbGpbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicl6Ofpq6uq6isoKiwpqeppZmUrse+sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2Gj5mXiKudopafoJGNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiJOPiZOPj5uLj5GekZehpJaerIiftIm0mq2Lyoeqroi3hY2wgrCug6mNppmNnXyoj3J7d5yPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6Kag5qAjI6FiplwjZOFaHd0e3ZnaHVwZ2dsXmNvbGdtWGhHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplJein7Coqailq6CkubCqq6aalKCkpaujlqWqt6Ovf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZmYhqK5rqSZnIyMf2Jtj4qSj4yPjI2Yi5CRno6UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2qroakjaqajJp+onaAmZRrgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4SfamWfbFtuinxmWl+Df2JXUG92ZW10cWpqb15qb21salhpT11YRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJeWnaC5oaqjpqySoba8q66imZegoqatraGdrrWiqJKhoKCmnJmOmLSZkIuejJWMdYGUko2KppaVmJ6ef5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHio2NiYuNkouQkqGLlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+GqayEpXmKfYSafaJwcpOIlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56EgKRgnZmzlnF8l5+0dHNbnrKDamJvdHVxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpq2cm7GtrJOXoZmhpJmalJ6rm4uJkniLhnCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHfn2PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqeqfq6MfXqgmXqjk3iBdJaIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+eLtrfqpbjoRdtGdcbnF6eGtpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrWbp4ljlJusurKwrJ2mnJyon56um56wqKydl6SaoZ+Ylpago5mGiY1qiIBye5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBh3h/lot7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6efp3ywraOiuJd3o7OipICIlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ9lG+Zc2qkXZV2SGVjYHNxfn5uZWBsaHZ8ZGViUl5XXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgbGtmYRUX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCbi3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaCLeIWNiIeSmZV8k6Ohn6OIroZ9tYSOnp17pZZ6qYGWnZCKoJx8p2h2bX6ZdKFzcXyehplwk4OufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294epdrm3t3l3JtqaRnYGV5cICEa2dmZG11eGdgY1RbZlFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJmFmaigoKONpKigmKmKmZiYk5mTkqCYjoiGe3B9hGh9j4OUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoeAboKfhniAk4aImaKXepOipJqgibOhoraLeqynpK6lcKmAmo+GgZySfKSAopmGmHKehKOtroqXjICMpI2Wg66ilXa1tbXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt5h2ZqZ2J0dHFuVl5UWWhPUWhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+2oqKQgJepoqKljKWnnZ2mgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeHCQoYd5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXebmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcoJscGhreHNrb1JYV1ZmWVJtSVhPXUlYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAj3Noj6aEfYaUjYmYoI6IkqqnnYmmeJacfqWJloyymJ6Qgq+Xn6V4lYh6qXSlj4SabqSijJKEjIO7bn2lr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVydHB8dHFian5uaG1TVltVYWFca01dUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYmDmKuanqSJmqWdqZ2FjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOMlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4V5kIuEf3typoxxfX16l5abhI54e35+h5SVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYZ2bWxnjHN5e5h4hFtrWHmPaG53cnFveHhvXWyGbmlnVlpgV1xla2NWYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpS5qaeLoaKapqSZpJyroqGEhJiskp2giZqmm6mYg4Gbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6XdnKFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5Omj3dvnZGDepJvfqiFcH2VcWtwfIGfjH+TjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYaPem9lZ2R6g3qWW1xqZ252W3t4d3Vuc3OCZlxtimtsYllZXlpYbHJcX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3lvaGptYIuMqrGikKOhmp6el56ZqKOifoOYrY2flIebopGllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOLm5+Pgqahh3iOmImVi4ucl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbh5aOe3iOjoSnfn+SkZKTnLGmm5WekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfYiLiZCBdmyChHx5mWpyaGF0inB9end2b3Z0gV1eb4Zobl9eWlxdU2hyVmNcXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaXl6cWdpa2WMiJ26n5aioZiVmZiUmaSgnnt/mquOno2Fn52LnpZ9eZSDe46ZiYaEhIZueICAcoGIfomUhG1rfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJaPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloCQinZ8h46EpXt8jpCRhpiqoZ6TnZCOq46RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG54dXSSoYuMhZqFhI10gIl8fHJye4iEe3mLjoSTp4+GhI+ChIqKineGiImLfG9rfoB7bmhsbWdeen9ofHt2dHZ1e3dcYHB9bnVgY1pdXlFnbVNlW15ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bWxUY3F5ZXB6enJlaW1ti4qft5qho5+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2LkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIkJKXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+jYR4f4OPh6CAfYyMj3yYpKChk5mQkKeNj4GbkYmSl5t9kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLcoGGfH1weHuLhHp6kY2DlqaTi4aRfIaGh4V2goSJiHplcnt/eXpxbGpmXn5zaHx1dnR8c4BqXmB0dnB4ZGNZX15Ta2hUZFlfYWhqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l/iYKAf3F/e3R2g4V+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZOLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2YkpSbeY+FgneEl42dfoGJjYxzl6KeopOZjo+ijIyDl5iDkpaZfpiNfIiNgXZxfW56ZIB8ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXt/hnx7cX53iYV5hJCKi5iilYGEjXeIhIOCd3yCiYZ2X3h3fXR+eGdsZGF/aWp3c3R1fXF8YmNhc251c21hWmFeW2tkUmJYYGFpa3Z5hnFjamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg390fIOMgX9+eoKDfnyQbXaJdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH14qpyKmXqXnIuMmJB5e4GLfXyDe4CCgHh0eHpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoSSkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnONjoprhZiPmXqHiJCJb5edmqOTlYqNn4yHgpKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeId+dXiAfYaAfIOMhY2UpJB5hYJ0iYd9gHR2gYiEbmB7dXpxfW9hb2Nke2Jub3ZzeHdzdGF2X29sdW5vXFxfXl5qXk9dWGNhaG10e4hrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6i3h4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJd+npORlpSId357in17gHZ4f4BwdHN7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FuiJmEZoaZjpN6iYWQinCWmpSikpKJi5qMgn+RnnySj5KLmY57ioSHdHN1a3FudHuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgHOIeW+AfYCGfIWMiIWNlaiNe4h9fouFeH5xcICFg2NoeHR1cHxiXnBga3RecWp6eHhrc3BleF1tbHNtc1laXmBialpQV1hlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiYV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdYGqlJKOh6CMlpOQgHR8doV3eH9yc3uFa3Jvem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5aMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaYSjgmaFnYqRfouDi4F3k5iSn5KRiYmVjn9+kJd8kY2PjZqSfYp/gm52cGxtb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXl2iHRwiXuFjHqLhoOJj5yjiHyEd4KLf3h4b2uBg4FdcnNxcHB4Wl5wYHBqXm9pfHpwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWNg3+XlIOQn3WLn5SThoubjJWNi3pyeHSCcHKFdHF1iGxvbHVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlICUf2iFnIdnhqCIkoSRg4lxg5GXj5uOkI2MkI14e5KQeo6LjJGWjHyIfIBrdmpua2tsen9heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwdox6iYx7iX2CjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYF9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXlwiHxfXWhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgHiIg3OGhX6MjIR7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY6Cin+DmoiAjJ5/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNwa2l2boNufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQipOblIZ+lpWIjY2IkY2JnICOgXh6jH6IjIqcnJ2blZN5jXZniJGHbIijhJKHl4OGY4yRmY6VipeMjYqLcXuUiHuOiIqSkYl5hXt+bHtlcm9ra3l5XIB5j46Aen1+f4aOenloc2tzi4+JgoWFfZWMa35+boCLfouHfYR6gY+WmpqKfXd4g5B5c21ncICEbWp0b2hqdG5TXm9kcFlfa3J4ZmtqYmZ4cnBwY194YGBWa19edk9OTGBnY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkYqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fYqdh4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHF9bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pdop2boaIi32Ko4SRiZ2FhV6LlJeKj4mOi4uEim18loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepKHhXp+f4CFi354ZXNqf4mOiYKCgIyWhWuBdm6IkIKPhH+Cen+QlpOZkHV0eIiNdXNxZ3V6g2J0bW9iaXZnUmBxZ2xVX250eWFyY19ofXBybltjcmFiV25aXHdNTUxkZ2FednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJaHjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeZp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh3e3F1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI2Ei5WKjJiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHaHf3CEgYmHmaGDlIyeg4lhg5WPh4mGio2HgYdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajHySgoV8f4OAhIqCdWF0bIiBj4qCfn+SkH1tgmx4ho+GkYN9gX2AkpOQl4lvcnqNhnVscWxyeIFfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtVlt1TEpMZWdeYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho6YgYyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipWFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3txcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g3+Kk52ehpWPn36IYYCTh4WIhIqOgH+DZ32RgH5/goyPkH5tgnyCdGttdnRzdnVrYo2Bj3+FfnyEf4SHfnBfc3GFe4+Mgnx+kYh6cINmeYOKhouDfIR+gJSPkZOEbnB6jH91bm9rbHp9YmhqaVhtdlpSaXJqYlFicnhsYmVdWWqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsW1xjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlnyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpGRg5qfm6CGh3Z2lH5tdpSXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUi4GEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR7iZicl4aTjp2AiGV9k4KAhoSJiXKBfWd9i3t5f3+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en2MiYV7gY+AfnKBaXiCh4uFhHiDfIGXjZCMfW5te4l9d3VvaGh9dmRccGJXcHNTU25zaWFOZnR4ZmBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2NmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpF4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyTjIafmKCZhYhufYx2aniYj3+CioOVl4l5jpZvenNwbGpkYHR6aGBlcXpaYXJ9eWdwemFlZY+xsndKYlqk2dCWcXuQi5B4fZWLhZmRjYZvbIaSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZGEk42Df29+g3aDd4WbmJOKkpCUhYdwe5KDfYODiYNvgXhogIV4cn9/g4qGe2V9foR1ZHBzgGh4cG91mIyFgop7dniAhHmBa1xxfXKAh4WJfYaJeohygW5xg4aOhIRzhHiAmY2NhHhub3+Ef3d7ZWhqfXFgWXdaWHFuTldyc2dgS2x2dGFdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZl9acGtneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBeoCBf4J/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2h6lop+gIWCmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjX6Tjo1/bmyFjYx2fY9/hYKViXyDeG52h4SDl3dviYVsdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCLkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dheYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygG9bbX50eIqCi3uGf3yIeHpxbIiDj4OKcoF5f5aLi390bmt3gIB1dVxpaXdwWVd8U1pxZUxbcnJlW0pwd29cW1pZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwW1lVb2RZZHF5WmheX2dtZ2praXB3fY5saYKEfnlugHt8gH+CenWCgYyThXCAi254foB6e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Ne35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaGl4Z0j4uKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn51f4B9jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3pqenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5sWG9/dnSLgYZ3h3WBiXp4c26JgI6AhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccVxPXHJwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bVhYU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4F/gnp3gICJi4Rxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISJknl9e4KRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpSCdJCNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIeomJbHh5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3N+YlZ3fXJzioSCfIJwhol3eHBwg4KMfn15fnx1joaDdmlxaW2IgnJwXWhjc25KZXVMXm9WVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1Z3XlxlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniCgYJ8dn2DiIaDcHaDcm53goJ+iYuTf3CAfHh5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f398iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4NzloqRjoeFhXuAhW11dn9uaHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxsf1lWdH1vdISHf4B4a4iGc3hrdX+Dg316fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1dWeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpjUlZcdVtbZ2thVmpfYG9mZmtxaHB1eI10a46MdX92eH53gYOBe3R+g4iIg29xf3RxdX6FgomNint3f3iEfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYeDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyEin57koV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuh3GBiouHcZaOkIiFi4N7eX5xcW9+Z2hyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB4bXxdWHF+bHOAi3yBbm6Jf3F2aHd/gX+BdnxxenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBaW2poXVdnX15yZmtncmdwcnaFeG6VinR/enh+eYKHgHVzgIaFjoJwcHt4dnR5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z6fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYFtgIKRh3KUiIyHg4iFfXl0cm9oemFqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdGx0Ylxve2p0e4t7gWV0hn1tcWd1fnh9f3J8bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk9oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOV25qWV1sZVxaZGJedGZtZHFncm90gHdwmYV2f353f3yFh311c4KIf5SCbnN4enlycoWHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhoJ+gX9vZmxnV11bXFtUZHBlX1hjc3VpdnBlZWJXXFxogHBvcoB0iWVleH5pdHZzc4OEeIGEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN8c3t5bXt7kYR2mHyHhoOGg311cHJsZ3VdbWhfbHVkZ2Zpem97cllngXd1Z3CAd4J1YneFinyUgG6Lam16gHBlcmVgbXlmcneKe35idYJ2aWtxdHpweXhyfWZ+f395d25jZWJuhnxta1ZqYnBTS2lrT0xPcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNXTFl1ZFpfa2FcW2NkX3dmbWJwaXNucX50dJmBd3+Ad39+hoV6fXWChH6XhW5ydHt6dHCEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paU2JuZVtYYnN7amhtaV9iV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3J1eI5/d5R0hYJ/hYh2anJ2Z2hvXG1lXm1zX2dhaXhoe21bbYJyc2lvgH55d2F3hIR4j4RziHFveX9xYnBoXG93ZHFziHx4YnOAcGdqeHNya3d2dHdjg3t/d3ZvZGNjbnx9a2xVaWJmU0ttaE9HUmxFYXhmYU1Tcl1JTVRZZWt3emVebXBpZFxWX1VubldLVGhYZl5YTVVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebWxcYVZcXGuBZnJ0fWpqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ4bnmLe3aOcYR9fn+GbmR2c2RoaF1rYl1vb1tnX2x1ZXpoXXSAb3JrcXt9dXVidIWKeoeGgH93cnV+dGFwbFlxdGJxcoV8dGRyf2xhbHpvamh5d3RxZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1diR2J2ZmFLVG9XSkxYWGdsdnpkZW5wZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB9f4iLhn11doZ4h4x9c3V1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2FlXWVWWVlWY2ZrYF1cc4VpWXBuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlnd217hHp1iHKAeHx4f2hldm1gZmFfamBddGtZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJhd2Rbb3BicHGCfHNmcYBkXm52aWNmeXp0bW6BdXR9c3FiXmZub31kalNoWFlUTXdfUUpaWUhidGNhSVRtU0lMWldpbHJ7Ymxsc2JhWVpbYXZbU0tkXVhpU1dIWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGc3F3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG5gZ2JsVFtaV2hjbWZcXHGIZVNybltaWFhgbXdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9vent6cYB2fnJ6enpkZnZnXmJaYWdcXndoV2Jeb2hhd2Fbe3ZqaXJud3NzdGhwgZSChn6EdnNqcHxsZnZXXGttYnBzgXpzZm9+W2BvcWJfaXB8bGtzfnJxeGtwYFtlbG16YWdTZ1VXUlB2W1JQWlJIY3NiYEdValBIT1pWa2xrfGVtb3FgW1pYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p1aGJ0ZWVdWm51bnF1dXprh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lcnZze2x6dHVven51X2ZyY1teV2JkWWF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hXFyZm58b3FuU1tmamZxdIF2c2JsdlVicWpbX25lfGVsdXxycnNqbWBZZGpqd15mVGRVVlBUbVdRV1RQSGVyX2FGV2lOSFhUVm5pZHxpa3drYVdcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39tg4B+hpd7f4iBin9rk4hyZ3SAe3WAg32Jj3+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmltYFRWU29ndGxleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdrandsW3Zxa3lpdXJtb3uAclhqbl9ZXVZiY1hlcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfGxxbGNZYGhpb3SBc3JeaWxSZXFkVGJuYXlicHZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlb11jR1lpTUlfS1htZGB4aG59ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4KDeoiNfnyKh456bpCKdGxzgnR/f4iFh5KElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyMjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLy8sgKSgoKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0dHBh+qaSkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4iHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEg4yQj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQio+LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+PjYyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoWJiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhoeFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4yNiYSGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiKiYqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKSkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OKioeHiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cnBxa2xycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZWpmaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXlxdXmJpYF1eWllfW1hXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUFxXXmxXVVJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQYFddclVPT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0xjVFt0VktQTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDR2ZUVXVTSlBMSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9KY1tVcEtERkhHRkdCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PlVkYl5nT0FFRUZERkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs7PjxIYm1oZmxgRkM/TENDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3PT04OVVscmtqcGtONUpYPkBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdXN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0NAT0I8WG5xbmxzcVtDY1U9P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdbT9SWUpSa29rZ3JyZl9qSDs+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6O252R0FiXVxpbmhjcW5rbGY+OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAWlE8PD1LTkhIdnZNOFdqaGtuam9xbm1sVjo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQENzeUg8X4CDgHp7d1Y7Q2BzdHJvdXFub2BBPz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VASHJ5a2WDhIODg4B9XT4/R2h4dXJzcG1sTD5FQkJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXR3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBGb3R+goKBhH59hHVMQkNDT2x3eHt6cV9FRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVoc32BfH+EfnmFckNERUVDZIKHh4iFXkZJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gIB4gISFg4SJbUFBV3WFiIeHh4mCV0hMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goKDg4WGhoiDVW2GiIaHhoeIiYh8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoGEhISCgoaGhoSChoWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Bg4OCg4SEhYWGh4iIiIiJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLjIuKiouKi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dnd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSEZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BESEpMVXGDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBWeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0NGVk5GTlBQVFh7hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1NTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x9fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTUtSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/f39/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEtHREFBREBPUE1TZHN0dXVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8e318fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1JRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTElISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25ydHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZRUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHF0d3l6e3x9fn19fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVFOVFJQUk1JTEtPUVBSUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcnZ3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxcnR5e3t7fXx8e3l8enp+fnx7dXR2cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRT9CQz48QkY/Qj9BZHF1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNCQUhKRU1PYmVRTU5OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGQ0lJR0dIQ0M/Qj8/QEE+REVDS05RVExKSU1UR0lJSkxKS0xJSkxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkJDSEZKTEpESUlGR0dDQztBQEI+QEBDRENJTVBHSUtHSEtESElLTUhKTEhJSkxLTV1SSUhETUdBREtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdFRkZHRUdCQ0A+PD05Ojo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5ARERDRUdMTkhLTkhESEVJTE5NSElMR0ZHSUlMTktKSEVOSUJGTUxPTU9NTk5NS0hISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKQ0VGRUJDQkVAREI+QD46Ozs9Oj0+Q0E+QUNFR0pGSUhLSEdHR0ZFQ0A9RUVCPkJDQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkBCRDxCQT5BPTo6PT87Pj5AQj5AQkRHS0ZJRklIRkZHRUNCQUFGRkNCQ0JERUVHR0hGTFFMSU9KSkxMSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS09VV1ZVVFhgXlxpYW1pbmhyc2JlZmVkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CQEBAREZIRUhGRkdGRUVEQ0VDRElFQ0ZFQkVHRUZHR0VKTUtIUU1KS0hISUVGSElGQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj4+Oj46QEI+Pz9DRUZERkRER0VERUNERUZHSkVFSUdDR0hGSEdFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU9PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGZoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQj0/PkFCRkNFQkNJRUNFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0pOTE9OUFJVVk9LVVZUUVRRUkxPUVBPVFlaWlxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOjw+QD8+P0JCPEA+QUFGQ0VERElFRkVHRUhIRkhHSUtJRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGSEZJRkZESUlHSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NHSEhHRkpHQ0dJR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJobWdiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0dFS0pHSEpJSUtISkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VoamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDQ0JFRUVGQkZGSENESkVFSk1NS0xMR0dNSUdJS0hLS0lLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWZlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj8+Q0ZHQkZDRURFRURDSEhHREVLR0dMTU5LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPUBARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnZ2FkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERURDQUI8QkFCR0RHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSEhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ubm9vcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3ZzSEtISUJFRUVBQD5DREJHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9pY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZJREVERkFAQUVFREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DSERGR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtITEpIRkhHSkdISUVGTElKS05MSU9cV15QXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUhGSklLTElMSkhGRUpHREZHRUZKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2JiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJS0pJSURGS0tLRkZJSk5KTkxITE5ISEY+R0dMSUtLSkxLSUdFSURDQ0VBRkpEQEpMSk9bY1lfXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFldY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUI/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdJR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmFkZGJYT1FRUltTW11dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1hYldfX1RQTlBRWFJdW1tcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tNTEpKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRXT1NUUFBPTlBVVFtYWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFVQZlpoaGRYU2tTVlZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLRmBUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUVZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFRT1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUVRQUFBRS0hmeGxjeHJtWktNVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvX19fY2JaXmNkZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dPVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT0xLU1NTT1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUU9KSVFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldWVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUExOVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lSVVJUV1dXWVtUT1RVWFVVWlVXWVVSUlhWVVdbWVpfXVVZXlxeXVxdYGFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRT1FYVFJRT01PU1ZOV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFhXVFNSWFZVWl1ZXV9eVl5dXmBcXGBfX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNRVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VWVltbV1FUV1ZXWFZUWFpUU1JaV1ZcXlpfX2BVYVxhYV1gYl9cYF1jYWNnaWRlYFljYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUU9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUl1YWl1eXGBhYFdiW2NiXmFjX1xiYWJfZGdqZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVSUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVZWVlVV1lbVFNWXlldXWBdYmNfWWBbZWJfZGReXmNjYV1lZ2pkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVFVWVlNUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVVVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpeXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdlaGVkYl9kYWBhYGJiX2BeV1heWlxcWllZV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFhYWF1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXGJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVtZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpVV1VXW1pZXFlYWWBXUFVeW2BhXFRVWFBVV1VTVlZSU1VWWlpcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1laWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1ZXWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWV1ZWVlNWVFhcXF5gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQV1ZYWVlXVldWXF1eYGFgX2JeWWFdXV5ZXV1ZWFZXW1xgX11fWlpeXV5eYVxbW1pbX2FeYmRjZWZlZmJaZGZnaWdjX2NeYWZlWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXllZVVhdXl9gX19cWl5eYGJjXFxYW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVhXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19eXWFhX11bYGFiZWJfXVRcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2QRigrKysqJWOSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjI+QkJCQkJQ7FhsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl5eXt4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXZzc3Nzc3N5fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3l7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fX56e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHl5e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp/e3x8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7e3p5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgoGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJzcoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3Vzc3R2c3Rzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd3dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fYN6hoh5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh4eHl5eXh6enp6enp7e3t8fX58e3t6e3x7kn+Mknl7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fXyahZCaf359f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgIGAgH9+gIKBgaKHk5+FgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foCAgICDpomWood+f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5/gH9/f4SojJSjiX6AgH5+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQioqLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgYGCgoF/hamRkKKJfoGBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoWFg4OWq6OhoIeBgoKCg4KDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAg4SBjaypq7ClkoeHhomIh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhISBgoKbqJ2lqqCgi4aJk4uIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEi4qEhaSdlKCil6GVg5GYhoWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKHl5KDmZeOnJ+XnpmRnZKAgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjYOTqZiUlpCgppeYnqGci3+Af3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiIeeq6mfmqGrlpmfnZmHgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmLhI+goqCcn6OZnJ2ck4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2MnI+Bh5GSk5acmZucmpODgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX19fIKXi4GDg42Qk5eXnJ+ZiYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlZ+Lfn+AfYeLfoSEg4SCiY6SjomOnJSDg4KCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGRoYqAi4V9homBf4aFhYWGh4N+fn2Dh4SEg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qRg4SLhYOCgX9+goeGhIF/f4CAgICAhISDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiYF/f35+hYKAgICAgICAf4GBhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeGh4aGhoaGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/fn+Af4CAgICAgICAgYB/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAgY2IgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJiouKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgIGEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4SEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOCg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICCg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e4CAf39/f35+fn5+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4KDg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgYKCgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYKBg4KAfn1+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgIGBgYB/i5SPjIuOjo2Ih4eFhYWEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGUkYyMjY6OioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSDgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LiYaEhoSEhIODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/fn9/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX58e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIqHhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f3+BgoB+foGAgH9/f35/f359g3x8fX18f319fX17fH5+f35+fn9+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqIiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/f4B/fnx6fH19fn19fn6Mhn19fnx7g4J9fX18fXx9fX18fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foKQhISDgX9+fXyNh319fn19fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCBf4F+f4B/f3+Af31/f39/gIB+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCgoKEgoGBgICCgYCAgoKDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4OBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCg4GBg4KDg4WDf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgH9/fn9/fH9/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8e3l2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4WHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CAgHuAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/f4CAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af35/gH9/f3+Af4CAgICAf4GAgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX99foB/f4CCgICAgIB/f4CAf359foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnh3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgICAgYGAgYKBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHZ4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4GCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgoCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoGEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgIGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgoSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISBhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhYSFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhYSEhYSFhISEhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f358gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1+gYB+foGCgICBhIeGg4OGhIWEhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR+gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFhISEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4OFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH98e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5+fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhoaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGiIWHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn17fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhYaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4aHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3x9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fX18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWFhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J+gIF9foF+fn59fX97f3x7enl6enl6e3x5enp6e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+Bgnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhoSFh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIWFhYOEg4OEgoSEgH+Cgn59fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+fHt6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl6enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaueYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM3BlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaWwpqCLkcOTfX6vsNHOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2Ym5yHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mpidkJ+g0tPAoKDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmqChrK+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sju56arZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2iy8WWpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7jLm5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWRqqmrpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKfPkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPQ1cu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW09LT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp6gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinZubpKGlqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJ6ZmZ+gpqajop6elp+bmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn6Cqnpmcm6qkoaSfoZucmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGqsqGkoqOroqWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rt7WksrGwm6KnnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1s7iynra0uX+dqqSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSwrJOxu7lrj7iyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb6zqaWHrsG3YXq+wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+sK+egK28sl5ptsO6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/DwrW7lH2qtaVeYaC8u7Ggm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wYd7s8WiYWGGubu2rJujt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwbp9fL/VpmRicrGztKqfp7Syrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1rb254d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMeydHa916RlY2autLe3wL6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPIqmxwstefY2NetcTByMzGxMHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLzIx8nNyMPIycnFxcPCwqNlaZ/SmmBhXr7Px8vOxLe/v8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGJqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5yMnDxcTAw8HCwcPCw8GcZGOHx55bXmPEzcXI0MGuvb64ubu7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RkamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMrSwLvAwby7xb27wcTEo2lkeL2jW1xrxsXAwMm/sMG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZ2llaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8HZirLCu8O1use3trm7wKZ2cnemnWhpgMbAv7vBvrnGvMLAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWxoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zRxnagzL3Ht7m4rre1vrGdhYSCk5V7f5nFwL++vby/ycLHyL7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmJtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wuLuyvb67xLa1uLW3wL7EvMLE2K1ye7bJz8LAuK+1vr+gjoR9h4SPgYSZsMLCv769vMfGy8rEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYlxjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub28sry+vMW4sbi6vcfKycLIydKWb3Cp0tHMysS1u8mviHhwZX15hW9zgIi1xL7BvMC/t8rJxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15gYU5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLvH0sK5vrzEvre8wb/Iz8bIysrAhHByos3Ly83KxsXBlXBiWU9sc3tXWGhymb/BwL/EqKTIxMPEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW15fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa7uK7cwr62vsC+vbSelKKrr7++o3Z0d6LQycvIwcPDpnhcTUZBX29wSUVYYX2qxb/BsoiZyMPAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7yK1ssc29tbnAvKR2amdsaG98kZRudHmi0cbIwbi/vYdiTEJBOlRoZEU6TlhoksPAtJBynsi+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wNCpcoO0vba1v56EaFlfXktRWlprb3J9o82+urm0vbR4UEBRZUBLXFlHOUdTXHu8uZxyaay8tcHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucLLoIJ2i6Kws5FmYGVVWV9LSk1PU2xzhKXHu6KjrbiwhEVAcJZRRVJRSzpKUlVsqqF/ZHK2r7K8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7e/xaKGeXWNoo5bUkFYVEdhbVlTR0ljjaOqw8aZhJCjsKVCR3uaX0JQUU45U1pSYYt/aV+Jt6Wss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4uMKwjn94h45oTklBa1dCT3WFmXBNQ1Z9sLvRrnp2gqGmRkhod1hCWFhbPFZjUlpvaGBfobOepKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO4s5KMiIN3VUVAVIlWSkpTdYt/YkBZqbmyx8+SZ2yDhEtGU1VJZJGfqZ6Xe1FWXlxXcq+noZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrqnmJmWaEw/YIBqTklJTWeaf1ZHWa26sa/SunJbYWRRRVBwlamlnpqcnp+BVFBTU5Svn6eWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKi9wammvWFCXKN9T1pJS2FLW4lmbXOOr7WpvNKXVU9PUG6isKecj5WRjpeeoo5TSVylpJ2olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamgq8XAyZZOQnada1FxTFBhZ3dwX2BrgZmwsK7Gul0+YJSlnpiSjI+UlZeXm5+mi1ByoJ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnKTGxoZXUk1kn15ufXV5V1FrY15qZ2x4jrSvtMJ/hKGfnZmUl5mYj42QlJCLjZCBiqGdl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk9PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqfqqOPeVdzdXJ0aV9yblhZXV5kZ1liX2isrquwqKOfoqCWkJOboJqYlpGSnpuhpZuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgon5ve2lgY1dNW1JVSEpPVVBHUlNKmayqqaSfn5mSkZOYmJaVlIuHio2UnZydnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQ0ZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjn5yIX1ZfZl9VTExEOj4+QkM+PkNTeKmtqaqln56foqOdnp2anJuTkpSTnZ2YlIWdmqCaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bEvcO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz42Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Te2BgZl5OREU8SkVIPD86Nk5+qrOno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TKycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZe3JpX1RMRD5LYIJzZUI9XI6urKCZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxsfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelWhkW1NIQ0BATZCnsJyDoLKto56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjKysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtgUktIRENARli20ryyr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8O+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KhWUk/QUNBSVN8sq2mmZSXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHV0cHBvbHJxdZLEyMbU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDBxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjq2dDOT0+R1qDq6efl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMrAyMrNztDL0M7OzM7PyMvQ0MvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppLB6S0pFP1qNoZuVk5ebnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeX19eXGJtcm9vc3R2dnmkvszV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz8zIx8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK6TeHJ2e4uVmo2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBfX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO2fGaDg6esk46Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXF1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvtWtfeX+mkIqSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFtcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rraRfZXSHk4uIi4R4f4aGf36Ee3R0Y1xcXV5gYGJjYWFkZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL+6t8m2qrCYW2hxjI+FiIl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFeY2VjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKv8C8wbqztLXDrqmwkVxqfpKHjo97eH2JhXp7hIB3bl5dXFxdX2BfX2RjYWRjYmBfXVpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqWop5qgpaGanKWsrqSooquqrauwpKafqq21trG9ua+3r6iuuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aoraGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0try2sa+1u62oq5NlbIiDh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXV1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCcoqWUnqWbmJGho6qjo6ClpqemraCdnKSmrbKwtrensKyoqrSrtLqxtrautrqyr7q6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NjY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s7/ArLW8sqylr7OtoaOSaXGGhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlpuilpyjmZaNn6Gjp5ygoKSloqeem6OboKuwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7vKu5urGinqmrp5eekG1+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjaedlJWVm5ibopeWkZyioqienJ2lp6KlnKChm5murq6usqCmoq6rp6K1sbKyrKivs6e6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axubussrStnpqkqZ+Umo94f4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZagoamkn5+pnZyaq6evsKubo6S4qqGgrqi2qqenrbGkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbm5sK+wqZuZoaiUkYqLgIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoJ+npqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYmJ+ji4l0iYh+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkI6Uk5SdlZaXpJmgl52gpaKtpqWlo6OinKqrpZqfpbGqoKGepaueqKKeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7S0qqymlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6mmpJmlr6WVmaWvqqCcmZugnq+ZnKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbuztaapoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4uQipKNl5GXmaKgm6CrqqavrKiwpaman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO7s7Oio5ydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjYeQipeJlJSYm5meqZugq6amrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+tn5manZWUh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZwhIiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Ol5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraehppKdpraso5+PlZaSj354fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybH+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298jJSJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmXhpSPi4d9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIuShH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpWNf4mTqJaVin6Og4J9eHBuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaen6SAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSBjpyOkX92hnh8dm9vaVhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJkH2EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiQd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoWSeYiOi4p1cXxtdXBqbWpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF5cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWgG9qbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhoyFdG90a3FsZGxqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoKIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudm2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHdra29oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhnpwcnBvb2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybXCDdWlvWHVwjpuSd2x/en1tcm5wgHpzdm5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3tycHBsYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViIh7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0enx3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl3cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSGR2yAd3J5dmhta193fYOJf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/dHRybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnpyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFXamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5STjZCWkoeGe4aBjZaKgYSBinp8ioeGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TUEVBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4N4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVVLREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyt7W0rra2mWR1qJytcF6hrZyYoKKbpJ6qpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL7Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXWBcWV5hWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpaVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXlhhWFllWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeMm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaakuKarrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYl1XYFNdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2ho62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU087TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFpTXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoJ4c3t9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnaCpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlZRWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgYd8eIWWloiPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyhmpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnMy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSVF5IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKBhH6DfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ7ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm6UlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eanKmmpa6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkQ7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Afn98hXt+gZGJhIV6hIh7dX10bnx9hn50fpKdkZ6DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdxoaSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZGVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRExCPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXJ5int6f3x/e4h7fHuLh4J+dYOGeXN6c22BfoV9d4WboZudlJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ6Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg29td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlJCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPh5eXioSPjYF/h4+liY2TqZqXk5aZoZmfmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWCj318bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qyoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5SWlJCLmJmWoMCOpMm4q5uipq2YkZucsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmKCUoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6em6Fhnp8hHiAhYF+cHh8fXxvco16fYF7eIaLiYaDkqe7raiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqYnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2TnJmelKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FCOD84NzQ+Rjw8NjwzNTM0NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkZqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZWanqenpKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJGPiZefl5OZlZimoK6djKqcjpaPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmZ6mpKanpK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknmFjZKQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOpqKKyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q9tLzKvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q0s62ulpalrKigkY6SscWnlY58kZV9h5GYjqmZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqytq6ebn6aXmJeZlaGkqaaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QkhFREhHRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+zrbEvbe5t7KytbO4s6ymnKuruKqop6+wl6OupKekpLTAsKqstL7CucC5s6e4tLiyrpWlra+upYuTlaGNdMGafpeZhY6WmYqxlZqZlZKTmZmmo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvr6ymmqGmlJOZmY6doKeimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkM+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjAwc22yLrBuba6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuaaInJimm3a/oIWZnY6TmZmKrpehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqYq66lpJ+lqZOSmZyIlZyinpexpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ6Mk6qbkZKTiauNh6KejKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q76lj6OXkaKfvJ+JmqCZlp6djrefqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6ko6mRlZWgg5Cen5yWqaSiobS1u7WtqLWys56coqWal5WZqqGed2FcX11KSEZHTVFJTUVGR0JSTElBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpanppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpOblK2gkaGipaOjn5C+pamdqaydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mwqJ+aqp6gjZmVn4SOoZqbk6WkmpissbayqqWqraycmKCgko6QlqmflGhjWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYltLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2crqCTo5+XpaCnqauXtrCiqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtoKSpra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWRk6CtoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfs6Ggm6+Xno6ZlJ2Cjp+Xlo6ipJWQpq6zq6mioqallZWcmIuPkZOkn4liZVpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGNcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOgnLKnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZyqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZSjrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukZ6Ul5SagJKhlo+On6GTi6assKWnopyhnpKSmpOFi5KNnJ6AYmZbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU5kXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaO1qZayq6aipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5aRpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWsl5qepZGbjpOXmYWWn5SMkJyelIupqaqip6CZnpaMjpmQgoaWiZSfeWRpXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpVZV1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6Cptaqdua+qo6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurpp6YmKuioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqhqZqVop+WmImUmJOWl52TiJCbmZSPqainn6Obl5uTh46Zi36NloWPm2tpbWFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKqjsbippbSyq6Gttb2vs7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7WprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEtqu8r7G4q62qo7GmnqSqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqGekayfmJiFlZiLnZqdk4qNlpeal6alo6CdlpWXlIGPlIV7j5KDjJZmbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiYFBLTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmlrq62qa+zuaamsLfFt7G3vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub61qq2xtpmYp6uqq5usq4+rvZ6srrGjqp+wrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZWambKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Ssn52UgZOZjZ2dmpaQipSTnpqloqKgmZWRk5V6i5CGe4yKg4uSa254bnZ7YEVhallJSFlbPXtKR0U2QWJUaVtNXGFKW11aUlJSYmBMS0VfYGBQTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lo66utam3tLijq7S3ybu0u7u/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bDt6utsrmVl6auq6ejsaqUr7ukrbKyp6eisrOwsbG1sbizqa6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJSbmZSynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrbC1rKWZoKyom5ydm5SpuJyUjo6LmZyimJCXpqGfloOSlpCdnJiWloiXkJebqJ2koJKVkJCWdoSQh3uFgYSNjG5xd3Z8flxLZWxcS05jXD9ie0dJOEdnV2VbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2wL2vq7OznKCnsK2lprClnrK2rauysKypqLS5rLSyta20rKmsqKypua6xsce/uKS5r6mtraaorbCmpKSuo6mcnZuasJmio6KjkKyepKCfoqqmprmlrLW1pKmrqayvtq+jnqOoqpugmpqSpLSaj4mNh5GioJaNlJ6glJOFjpOSnZuYlpWImJOVmaecoJ+MkpCNkHd+joV8fH2HiopydHJ+fX1bUmRvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrbzLuq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLzAsKuyraCkp62pqKSwo6uxqq+ssK6vrquzuqe2sLKpsqmrpaWkr7qsqrHCubWruaioqKyqqLGlqqSirqqoop6boqyVpJ2YnpmsnaKnqaKtpqOtrLexsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6GPi4yWnI+PhoeQlaCdlpiVh5aTk5eknJ2ci5GPjYl/foiGfHd/h4WHdHNyiXZsX1lgbmNRc3FcSzuEfEY+V3VYYFpPY1xOVVZVV1BcYl5TT05oWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbP01GlZetp6KqspypqbC2rLi1rqqlq6q9ybuwvrfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOss7qkuLOsrK6nq5+in7G4q6qtureltbWjqaesrKqtoamnprGyo6aloaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmPkIuEjZikm5KRm4yTkpGUopmbmoqOiop8hoGCg3p0gISCfnR3jKSHeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVVTVZVVVRPXF1hVUtNaVdWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJeSr6SjqrCYq6mttau2saukq6qpvMDAuLmzu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlrbCrubCpsbGvsq22qra1p7S2rKykqaqco5+1s6iopLS0oLWtoamoq6mrp6Crq6i5tqmqqamiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoiFi4uPjpCNhIaVo5qOjZuRkpGPkp+XmZaMioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJjUE1VVFVQT1hbYlVIUGlUVlRHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9KazZQRTuVjrCgpautmqulra6ztK+qpa+pqbq+u8CxrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vbzCsbKzqrOopLWppa2zs7mwo622sq+yuaq4rqqutaurnqqsn6Ogtq2ooZ+vs6G0qp6op6qkq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhYSEpJaFgoKLh4+OkYSElKCXiJGdkJORjZGdlJePioWFeHSBf311eHmAe3RzemmCh6R1aV5lbIJ1Z4iMfVJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlI/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsC8r6a4qqeusMnGyNHDvb++ub6/vMm8wbiwsLSxuru5wbO0u6y4rKK0pqessra5s6emu7WttbyvvKatrLWrrZypr6Sgpayqp5yeqrOks6iaqqeppKmeo6moqb2stK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4J/iJ6Phn99jIeRj5CEf5OblIWTooyUkYuRm5KVh4h+f3F6eX58aXd8enVxcX1ohnmFiGRgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPktORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+TsZmfn6mlpKGrpLeysqWpsKesuMG9ta+iua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur63rbm1v62hs6aqq7C1uLSqnbu8qLK/srmgr7O1qqyfrrCjnKWoqaKenKWxpq+gn6qpqKKqnKSpoK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI6AepqUjYl8fouGj4+MioSSmJGHlKOKkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYF0a4NnZGhhb3OObWJqcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyk8M1BbPSOSmKyZn5enpKKfqKS4r66ir6+oqrjCubKtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+uKm5t72rpLSnqKqwrrmxqpm6vaSvv7S0oK63taanp7CzoJ6kpqehpZmeraeonqCprqehp5ejqaCwuJ+ksa+hrKCspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfHuhjIyIeYOMhYqMjYWHkpqOiZWfiJGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/c2R7bGlmZGFmhoBgW3Nqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPzBaWTUolp2lmJyWraCfoaSht6uwpLSzqKi5xLWxrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7qpu7q3p6i1qKersK2zsaeZvLekq7u2r5+xt7CppaevspuhpKCjpKGXm6+moZ+ip6+ioKKTpKWit7ChprGrn6yirpecqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXoqmhkImKkIZ6hH6EinmOl4qNhnmCh4SIjI6FjZOYjI6WmYqPl36Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG5mc2lrZmldZHOBYFtrdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjwyYlUsMpajoZeUnKqdpaGioLeqrqC6uKWrvcWyr66jta+sra+1xMS8s7+6t7Czubi6uLuurcCztLivv8G4rL26taais6qnqrOrrbKimsC2pae0tamesrupp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLiopKeup56loKeSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6UkqOopJCIio+GeYR8hYZ9nY2KioZ5gISIiIiRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnaGljZmlqYGliamdbZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKeo6ORjqSnm56enaO1raaquremq8PBtq+so7Wup6+vt8DAvLLBtrGusra2uLe1rKm9s6+ysb2/uK67u7GlnrarpaW0qauuoJ7Cq6ilr7OqrLW7naiqq7GlmJ6qnqakkZmmraKYnqSpoZyinZegnae1pq+qrqGhnpyhlaCmn6GgmZuZnJKZnZSlnayimJaelJONlZeMj5iaqaCRiIqLiXmFd4KCgZyIi4KJfH+EiIaFkYSWlY+OkJGRkYySe4OVjoZyfX1meG9ramxndXNrY2dlZHWAYmVmZmVqamRrcVpeWV1tZGFOaFdaYFZKR0lLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE6M0FmSCU1mqOekIusoZiYoJaltLGisb22oLDGu7mxsaS3rKquqbm9u7utwLKvrq22r7O3sqaqubGvrbS2urawuL2tpp21qp+gsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJuUnJ2sr6W5p62ioZqbnpmeo5qknZeemJuUmqCSqJaqp5qTm5ySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2NzgWFlaGpubGdramdtXGxsdXFhVGJoZGVaSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFKZUMnNJKgmo6OsJ2ak6GaqbKwn7jAtZ+zwru9ubGmtq+orqW3uLe3rLuvraqrt6q0uK2ksbWxrqmxt7axs7W6p6iftqmcnqmjqq2cqcCZraSusLa1ra2fsa2wqqKbnKSsqJuVnKejnZqpoqSWmqCckJujqqmpu56mpKCYmpmeoY9ropaYnHGClpukgHWSqaeelJWfkYmXmYCWiqCPeYaUjINuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNncoRnX2RmbmxqXmBgipCEhmdPS0Q4RVRnXkpHUVBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUWQ9Ky+Mo5mHlLCbnJOgm6qtq6O9xa+otsK4vb2tp7awpaukuLOys7C5raqnrLSmsLSip7e1tainrLezrrSts6Kpn7SrnaGknKenmay7laalr7O4ra6lqK6rrKWhn5yhp6abmKGmpZubp6edk56fmJCeqKmita+joqOdlpeYl6OIoY6Smoehh5SdoX+lf6aqnZKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqcG+HWF5pW2trW4hxbnpyhmiHhFpeRk4+Rl9NRlJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5yrnZmZnZ+qqqepv8Ousbq8t8C/qqW3sKmsprK1rq+ztquppbGtpbWym6y0trSmp6mzsa2yp6+fqqCyqaCko5qio5yutZWkpaa2vaetp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJSTpKWmoLajpKCjmJWTmJOciK6PmJSJqYuXopuFsYCjrJyTmp6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHpuco/YflNqYrayf4FylHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBcRFBORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ6lrbKpsMK9srXAtbe/wqumtK2tqaevs6qvtrSoqKa1pqe4rZyysLWqpaSnsa6usaaqnqeksaSioZ6XnKCer62VnqKftLqjq6mhra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGmoqCvop+fo5aWk5iSmYWvamqKjap+Z4SVh61kcJ2clJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYCVeHpqpzdKr1tXVGxjW0tPWF9cV1Y7TohPV1YvSFNTSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOlqrK4rLS9vrC2xLK3usKnqbCrr6mpsK6ksLqwpKWus6OpuKiesrGwo6Wgqq2vrLCmp5+jorCco5yYlZebnK2ml5uinrSzoaycoq2toJ6al6CiqZyZnqSgnJmhp6SQnaOal6Cfq5+mpp+an6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5aWqZR+a4GmeoKFiJOUknerZ2uxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNMaEVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclZ+UiLOmpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKyp6OinqiqsqiwqKWen5+ulp+ZlZWWmJ6topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdoqqbppqdm6Kgl5ORk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaSPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3h4R9poKTfJh6qnmNnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh22XiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKikvLfBsLrAsbW1vLO1p7Gwo7Cypp+utqibqLmuo6+xoLOzr6Cknp+nqbCotKmknJ2eqpeYl5aXlZahqp2bl6itsKmjn4+soqeWnpecoaWhmKGhoqGaoqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZeji46cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUdJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsaKfrLCkmKa6rqSxsZ20t6ifpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5Omq7CmopaTrZ+lkpShm6SmoJSapqahmqOfrZqgnp2QlpuhnZyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iYoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHaJiIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraiyqKmyuri0uL+5t7K2vbWluLOftKyfn6irn5WntquosbKrrbSjm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknq2doZ2gjZSem52gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVn6GIl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3JdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVjZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adlpuopp+MkqSXqKunlJepp56foKOtpKGeoY2VoZmfoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikZyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIdxXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjVFpRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKkoJ6nq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIeQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqqyxp7mvtsWxurKuu7CuwbKspKKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mxrJWXo6inlJGWpJykrZ6RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy3lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOhpZ6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeWl52ej7CplJynoo5qfmmcpniHc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIiOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXWZgTFtYZ2NeT1ttdWlxUU9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqagoqmdopuamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCWlZ2fnZexpZiiqJmckZ2co6OZpqKanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMmJeHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY11wZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1As6Czor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLShnqSlnKOVlqCrpqyjo7asoJmWlp+XramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6dsKCdoqaVmJOYlKChlaOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEj5+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RkeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nJ+no6GdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyenbCkmZ+ok5iYnZGlmZionZqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoZZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FEPDxER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefpJ6hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6qokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZeeqpiefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46BdnqBf3lxen+HcXiFjJN5bXeTYmZfeGRfZYJjXnRobWRiWExWSVFaSE9FMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYm6OgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajo6ehpaWeramRpJupraqcnaqcrKGWl6WWoaOXnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn5le4d2dmt9iG5+hZGSfm2Bj2Bxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9N0A+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6ahnrCsm56Vp66tsaqorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil5+pqp6UoZ+cna6vp6qpm6enpKKrkqy0lqaiq6qeo6emobCgk5qnmqCalJSRl6BwhYyXdISoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviouSkINtkJBlb3R1cGBnbWRfb2lpbmZjV1NcYVpRUUI5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqqSjrJuvsaKorK6mmaarqqqxopKXo6SalJKEpGqkdYl6qXR6snGCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2NmI+BbZqScG55d3dvbGZkZXFwZntoY11XYGpYWFRLTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKsoaSfr6KdmpKqpLWwrqCpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyplZGdnKKZoKWznZqhlJyfp6uro66arKqjoqujs62iqrOxoZuqqK+wtqOTlqOnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6SfHCXkoBwenR8e21bZmpycWaBal5iWWNtXF5YSE1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqaWdprWfopeTqKq2sqybppyglZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl52lm6GjrqaXoZWZnaWmq5qvna2op56so7esobK5r52br6eztLOklJiopJqfjoKdTniagX+feoOjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32ZlpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpKkl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmNkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6KptLiknKKdo5OQobGZnpynpqGir66dpKiitbLDsa2qraqRh5Ccp52jpJyll56ZmZqmpKiarqGupaaYsKW8raG3t62enbWyubGzp5iesKKknoWP0bXDt3mHjoWRk49/pniUoneMoJKEpYGKcaqGhLRucmqZo5uVip97lpiGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Upph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKW1hYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2knamSlJeuoKCepqScp5y1mqCqo7Wrw7Cpq6mijISOnKKhpqKVmpucmZyZpqSmmKunraOlm62nvqyVvrCtn6Ows7qstKebqbGlp5h6qJB9fLB3ioGkpYibbLFvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJiVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2VkaeZg5SMlot6eoKWfmtsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62grrilpI6bpKOgr6+qn6Sfna2Znrmgoqqgr6qaraGQqqiklombkK6wrKefp5utmJiPrKKhnaWimqWcrZifqKa2qcCvpaqkn4uAjpyan6aekpWampSbm6akpJqorKyjpKCqqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2hj4OmlZqBrIqEsIWlmaShoY+EoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkZaWe3iNnH5kc35ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMKzo5yspqW2qKGLmqCfnbOzqZ6joJ21mKCzqKqrna+un6ubla+ooo6Im46vrKmnoqeZrpOZj6iaop6ln5qjo6WZn6Opsqi8r6Wonp2OfYublaCgmY+SmpuSm5ipn6GZqK6npaajpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOEp5acgqyKgq+IppubpamPftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPm5KXnXqBkJt6Y317ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6aei5ilvqm3saihv6amspyesZy5qJ6tr6anlZSwrJeMg5uRrqajrKGknKqhmIujkqeep5yaoaiimJ6grK2qua6oo5uXk3uHmZGmm5KOkZiYj5mUqpqgmKmpoaqnoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaijm5eto3JtbW1linhvbYKZcYB5aXBpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5mRlp99h46VdmaHeGiNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVl1XWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6epLKpmJK9scPIvraqnsCrrKOhp6yfuqOkraytpo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaanr7qrrJqbk5N7hJeNpZiNkZGYlI6YlqiUn5ipo5uxp56jrLqfsMGnpLOmrLGyq66sqLmkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugsZahoZ2gopygpKGVqqaMkpKMh5KcnJSQmpOYkI6VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCWmJahg4eTjXFpkHdwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01PUFFYVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZumnrGpo7annam1p6iRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOQm6iZobW6qKuZmpCNfIGUi6CUipSRlZCQk5elj5+aqqCctqOdp6y3p6/BrqO3pq+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+Xo6Cco6menp2clqudkpmhm5SQlqqZjZmZlpCWn5GJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4d6cpZzeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjo5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKejlJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJmnjJmoj565tqSlmZuNiXmClIuak4mVkpSQjZGWooyenqmen7ikgISvtaKwr3SkvqOyoHh6oKqyu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrqqjZZ2fk3N5mZdwgJiol2x/oqiKZZylnJGXmJWLkpyRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgniYaYOKgm55f2twZWB2b2traFtmZWJib1NcPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS01UVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+yppqqpquXc4ydsJ+oqqaUlrmgoI+cpJ2Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaaqJGXpIicurSooJmYi4l1d5OMlpOKlJGQlIyPk6COm6CnmZyzloCMnLWds4ySj7ynoX6nonqjr7eBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6mnh5WFmHelm3qHm4GXpoKBe5yxeoqFoJeZlJiWgpGXloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6SiYKDmWqNjIVreHtxcGdkd25pbGtbZWtqZXNcXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHU1haWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqm1no+Dnaycp6KgjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTl56Gnrqyp56bko6FcHWQiZWQipSPj5uLj5GfkpegpJaerIiftIm0mq2Lyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uPp5ZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZg5qAjIyDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdtWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqklqWptqOvf6GnnKWenYmUvZqTjaGRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZmYhqK5rqWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+UoKGZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgqx1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z/jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21salhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraGdrbWiqJKhoKCmnJmOmLSZkIuejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipipmJmakoelsaeilZqIiYBpboiHi46OiouNkouQkqKMlJ6gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlnuejHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unSSh4J/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RgnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZdaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpq6cm7GtrJOXoZmhpJmalJ6rm4uJkniLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKilno+Wh4R+a3uHf32PjYOLkJCJj5SggpaeoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aIjZx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJodKuDnYN0qmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbaeZXah+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHljYGZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um56wqKudl6SaoZ+Ylpago5mGiY1qiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJyJj6ijoJmLkYqAgGmBhnl/l4x7iI6OiI+Wmn+Uo5+gopOYcmifip+PjHGSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHmde6uaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJt9nZp+dKpaXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYGdbnJ8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8ZGRhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZShq6ShqI+fnp2amZWYoJ2WiIeJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6pnJqUiouKfINshIVxgaGMeIWNiIeSmZV8k6Shn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZlwk4OufaSDpp6agaNvXqhndaNjb6VhnNKQfHqZeHJzY6KFkH6jc6OPdWuQs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyEm294eZdrm3p3l3JtqaRnYGV5cH+Da2dmZG11d2dgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm4Cxq1RcS36pr7G0sLOjnJiFmaigoKONpKigmKmJmZiYk5mTkqCYjoiGe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkZGjlYOOqpqUkouFiXmDdoiAboKfhneAk4aImaKXepSjpZqfibOhoraLeqynpK6lcKmAmpCFgZySfKSAopmGmHKehKKtromXjICMpI2Wg62hlHa1tbXJoXOUioGfYJ2WqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtqtLW0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZU1VdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOQgJepoqKljKWnnZylgpqXlo2XkI+ck46Ig3lqeYZlg4x/l6B5dY+IjIFphIWSg4yFnY16jIqVpZKDl6mXjJGLgYl6gH2LeXCQoYZ5gZWHiZagln+VpqmclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2YoZWIbXJpq2p1oG1upmCbaIqQaJaHmpV1ooB9mmCLhYx0b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq52epYyioZqiooCWmJONmo+LmJCOinuHcYCIaIuLfJibc3SKfZB8ZIKHlYqKlZmCfIiGlqeQgaKskIWQioKKfYCAjnNoj6aEfYaUjYmYoI6Ik6unnYmmeJacf6WJloyymJ6Qg6+Xn6V4lYh6qXSlj4SabqSijJKEjIO8bnylr4KGhYaSlpyffKV6caiVoJZnnn1uq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01dUl1JXm1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66kmYqDmKuanqSJmqWdqZyEjJqOhpyRhZKNjI10hnqIhG+NhH6Yk3R0hnKSg21/i5KHhpSPfHuBhZeljX+lpo6BjomFlXaCh5JvbIupgYOLlI6JnJ+JjZSrpKCQgHWUl4l/gXmUrqN/gZtxj4Z5kIuEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXFobn6SiXF/dIKPlJNxhYOCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIb4B2fYV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUl9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyro6GEhJiskp2giZqmmqiYgoGbin6Wk4eOiomNcoN8j31+j4V7l450coNwloV7fZKLhoaQhXh+f4aYo417p6GLhpCQhZaDho6Yd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSbgH6Jlq2oj5OmkHhvnZGDepJvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkYF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcYWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2FaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIuMqrGhkKOhmp6emJ6ZqKOifoOYrY2flIebopCllX97mIR8kpmJiIaHinN9gIt2hYuBhJaKcW+AcpiGhH6ThIOGioF6gIOLm5+Pgqahh3iOmImVi4udl4WDeq2CkZiZlIqenYeIoaugoqKji4iTnJ2jmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKGkIp7iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkYSFjYiDjZCMfYiLiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNcXGFsaXV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5eioZiVmZiUmaSgnnt/mquOno2Fn5yLnpZ9eZSDe46ZiYaEhIZueICAcoGIfoiUhG1sfnqXhoSDkH+AhoSGfIeDjZudkoeqn4NyipCGk5KMnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqamZCapqCmnZ2QloGRind8iI6EpXt8jpCRhpipoZ2TnY+Nq42RgJ6MiZOanoKOl36GjYJveIVxdGB/go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqFhI10gIp8fHJye4iEe3mMj4STp4+GhI+ChIqKineGiImLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl5ha2l2en5xbGxka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5uipJ+SkZaXi5qfn557eJ6mkJuKhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHOBhX2KkX1raH2Bl4iBiI58foaEh3yPgI+bm5GIp51/cIuLjJOHoaGKhY18qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt/joV5gIOPh6CAfYyMj3yXpKCgk5mQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiLc4KHfHxweXuMhHp7ko2DlqaTi4aRfIaGh4V2goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Ta2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpqWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/e3R2goV+ipF4Z2N9hpeKgoqNeH2AjIN5loCVl5aNlqCbfm+MgpGUhqabiI2JhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iFl42dfoGJjYxzl6KeoZOZjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBgImEZXVvfIeSl419k3iLiXyAh3x7cX54ioV5hZGKi5iilYGEjXeIhIOCd3yBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmFeW2tkUmJXYGFoa3Z5hnFiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJyul6aono2Nl4eGn5OXmH14qpyKmHmXnIuMmJB5e4GLfXyDe4CCgHh0eXpzfYCEf4mLgGRefYuVh3+Fh3R9fop/fZeEl5OWjKOhmH9yh3uTkoqnj4yOipOhkoORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYmI2VlnSOjotshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeAfISOhYyUpJB5hYJ0iYd9gHR2gYeDbmB7dXpxfG9hbmNle2Jub3Zyd3dzdGF2X29sdW5vXFxfXl5qXk9dV2NhaG10e4lrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCjqJ2KipGGip6KlZd9d66YjJZ9npORlpSId357in18gHZ3f4BwdXR7b4Z9gYCKf3xhXH6PkYZ/g4RzeoCGeo+Rh5KRm5Klm5WCfoF8jouSpImOio2Ym42GkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aKl5FviJmEZ4aZjpR6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GCiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWNioWNlaiNe4h9fouFeH5xcICFg2NoeHR2cHtiXnBha3VecWp6eHhscnBleF1tbHNtc1laXmBialpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooKabh4yKgZCchpOcdYGqlJKNhqCMlpOQgHR8doV3eH9yc3uFa3Nwem6KdoCBh25xW1l+kY2If4CAdnWAgH+ghpCKkpyXoZSYeIp/gY2JnZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhpiIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXqLh4SJj5yjiHyEd4KLf3h4b2uBgoFdcnNxcXF4Wl5wYHFrXm9pfHlwbW1qbHZgcG9qcm1aWGFhYm5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ6mloWMg3+XlIOPn3WLn5SThYqbjJWNi3pyeHSCcHKEc3F1iGxwbXVtiHeDfoBtblVRgauUh4J4gHZygnmBoIKRgZOSmJySmniSe4ONk6Sak46JlZmThYeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlIGUf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox6iX6DjJGfnYV9fHiCjH13cWpsgYJ5X3dvbWxyc1Zeb2JyYV9sbnlwZ3BmZnN0aHFrYXdlXVdmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/i5qTj4SImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdXNSToLfyJLWk3xvdIR2g6CCk3eVkZmbkJp7lHOFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcnJ2blZN6jnZoiZKHbIijhZKHl4OGY4yRmY+ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9ra3l5XIB5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMa35+boCMf4yHfYR7g5CVmpqKfHd4g5F5c21mcH+DbGp0b2hqdG1TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19edk9OS2BmY115cYl0XFxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5vcGyAWmxueXlzYXZ6e412c3eKd3mfi5uum6CQgoV3iJV+fImch4WfkY6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WEdoWihZJvlpCVoJScgZJxhoujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNnJuYmY+Pd4x2boaJi32Ko4SRiZ2FhV6LlJeKj4iOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHh1am54c1iIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuBdm6IkYKQhX+Ce4CRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaXZnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25aXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5ZanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXeAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dhZXzr2rXJw9yIc2xzgXeKmoiNaZiPj52Vk4GJcYWJoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCk5uWlJiGjHeIf3CFgomHmaKDlIyeg4lhg5WPh4mGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h2cmlzd2xajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1tgmx4hpCGk4R9gX6BkpOQl4lvcnqNhnVscWtyeIBfc2luXGt2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfICHdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqJiXyff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcYBpYWdhf9W2jpCmeG5xd3twkpCMh2qZjoickoyFe2mIi5qHgZKRhoeYjXyNjYGBiY58kI1+ioV6dXuCenCGgJaZjpOUgYh1g4Z2g4CLk52fhpWPn36IYYCTh4WIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrYo2Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cINmeYOKh4yDfIR+gJSQkZOEbnB6jH91bm9qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRbb05IT2dlXGducYBsWltjc2BcY2x3ZGVdXVpsbGJtanN2h39xb398fHR4hniFgn2Ah3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNnc4d8cpKRg5qfm6CGh3Z2lH5tdpOXfoiRg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF/ZWRoaFedj15xcpa8w4N1cZSJkH5yl4yGnJOMiHNriY+WgXuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGV9k4KAhYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXiDh4uGhHiDfIGXjZCMfW5te4l9d3VvaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17b1pbXm1jWmJvd2RmXF1gbGpjbWpzdoKDcW5+e390dYN6g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraniEdGyUjYWemKCZhYhufYx2aniYjn+CioKVl4l5jpZvenNwbGpkYHR7aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQi5B4fpWLhZmRjYZvbIaSknp5koaAhJiKfId/eHiJioSWgG+LiHF0fXppeYWDpZGEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KDfYODiYNugXhogIR4cn9/goqGe2V9foR1ZHBzgGh4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygG5xhIeOhIVzhHiAmY2NhHhub3+Ef3d7ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9vTldoUT9ZZ19bcGpneXFbW1hrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdXCBen+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Af3hnkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveW1fYm95XGRrgnphcXZfZWbU6r6KMjo+i46AcnmFiI6NdoOXjH6Sjo1/bmyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuSh3iAhI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd29cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RvWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHt9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JvYGFsdGFocIl5YnN0XmNkm6CPblw1Wa+1dWqAiX2ShnaFloVzjouKd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hxe32EfGl+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5cZ2ZzcVFbe05ccFxPW3JwZFZLc3hqV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YVx0bFdXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19wcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYRzlH14hpOCc5GNiHJycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4mJbHl5f3Voe2lrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YVJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2dUVlZ3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdYN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJhYGFxbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4cI11e4ePgHqTioB1dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx1dn9taHdlbXt2bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7couBfXNndGVui4RtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dlhQVVheYXGEb1xgY21lY15uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BcZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcnyFin97kYV6eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhyYm54cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJRUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVV7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/d76ue6C3bWJzhmh0fHJ6g4Z7fYx/eHhzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyHhIiFfXh0cm5oeWBqbWBtdmtnamt5d3p3W2d9fHhlcn1uhHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIx8gWZ1h31tcWd1fnh+f3J9bHp6gXp4cGZsYm6Kfm1uVmtgd1VKamtPUk5oTll8aGJOVXZqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHFlX1hjc3VpdXBlZWNXXFxogHBvcoB0iWVleH5pdHZzc4OFeICEeXd0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd0Z3CAd4J1YneFinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpweXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeoR9gYN1bmpoZVZdW1paVGJuZFtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4a3R0dG6FgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2F3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcV1JTVRZZWt3e2VebXFpZF1WX1VubldLVGhYZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bm93dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGxzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYlZcXGuBZnJ0fWlqXWt2dmd0d3FthXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVidIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxYWGdsdnpkZW5xZmNaV11YdmVUSlxjWGhYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbnaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIlqdJeBe4udfX6FeoF6fnyGiHNxj66Me3uGkH5mcoh6dHx8dnJvhmx7fmyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYlttc3RndXVwbYR4foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BicXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHJ7Ymxsc2NhWlpbYXZbU0tkXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsbmp2gZB5boN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3p/iZV5ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbXRzdGqFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB3f3J6enpkZnZnXWJaYWdbXndoV2Jeb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIT1pWa2xrfGZtb3FhXFpYWWxwV1JQZldXaVNURlpcT0hydVhfY21jWGFgYV2LamNkbXl4a25pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KWdHiClIWBn4l1gICBc3+BcIeCdW+il3R7houHe2Z4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWm51bnF1dXlrh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVrbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFhUVm5pZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Lk3J9ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2Ld3hueoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29ndGtleGRlXVlwdG1yenhzbYh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdnNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYmJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYGhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZGB4aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3FzbWh2dHqDc4GDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY96fYyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Pj4+Ojo2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8wMDAvPkREREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHR0cHBwuNzU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4iHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODhISEhIWFhoWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQiZCPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIh4eIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2GhYaPiYyQj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEi4eGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFPTk1PT09OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0pOSU5OTE1PTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDRVNCVVBIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9GWUNbVj5FRUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUNdRF5hPkFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj06Q2A+XGtDQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5OTpGZ0BcbT85ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT09P0Q7Pj0+O0ZpS1xtPjo8Pj0/P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QEE/QDtdcEI+REY/TWRYXWU+PT07PD4+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48PD1APTg6Om53Sjc8OUVaY2BgZEk7PD1EOjs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAW1E8PD1MUElIdndPNzg5VGhtZ2hsYEE7TlE5Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQEV1eUg8YYGEgHp7d1xGPUFlcnRsbXJtT0ZmTzo9PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VBSXN5a2aEhIOCg4B9YFhRRmJxcnFvdXFgYGlKQEJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBHcHR9goKBg359hHRKU2ZYYXFydHZ8dGttY0lKSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVpc32BfH+EfnmGcUJIZG1sdoGGh4eEdGtWSU1MTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B7gH94gISFg4SKbUBPc4GFh4eHh4iGZ0pMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTlt8goOEg4WHhYeCVmyEh4eHhoeIiYh8UUtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKVoKEhISCgoaGhYOChYWFhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklmhYSEhH+Ag4OCg4SEhYWGh4iIiIiJi45mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWqGhISBfoGDg4OCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCZoWDgYCBg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTg3Nzc5Ojk4ODY4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt6e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1yhICBg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dXh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+SH6EgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJSg4KChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRliFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JCR0dKWYWCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTEpJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9FR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSEpMV3KDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/Q0JGVk5GT1BQVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSTs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceYWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlRSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVVRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUdJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Nzk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25xdHd4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzd3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSUdPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXR3eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnl7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRURJTVBHSUtHSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtLTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqbmVrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSUlMSEdHR0ZFQ0A9RUVCPkJEQ0NFR0hJR01QSkZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRDxCQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1CTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQERFPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSElFQ0lJSktNS09TTkRRUlBRUk5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkNIRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl5cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREhERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9TUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRkVGR0VJRUZESUlHSUhKTUhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OT0tPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTE1HRERBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NISEhHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhqbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxMTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQ0lGQ0hKSklJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxNS0xNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMSExMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpNTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEtLTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlaXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTElJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSk1NSk1TSUhGQUdGSklLS0lMSklGRUpHREZHRUVKSENKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkZJSk5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpMSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpIT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUhESEtRT01NUExNS0tISUNEQUVESEdCQUdFQ1dVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk5PTU5MTkhLQURBQ0RGRENBRUZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjZ2NrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNFTVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS05JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1menV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLS0hKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWktMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVhzUml7bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JaXWJkZ2lqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaWJXbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hmZV5hYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VlhsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0hKS0hJSUhSUUxOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVVFJVVFRUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWVkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhYVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVVSUlhWVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RW1pYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFNSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FUV1VXWFZUWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFRZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1FXVltZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWVlVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxhVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NXVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNiYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1bWVxZWFdYWVhXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVxaW1lYWFhWWlZcWlpWVlVNWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x8fHt7e3x8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmNjY2NjY2Ni4mJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjJCQkJCQkJCNjIyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHd4d3d3d3d3d3h5eXl5eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3h5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l9fn15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+e319enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn59f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBgH9/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAhH+DgX5/f35+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f3+Mfo2Ffn9/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/gZeClIx+f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKGnoaXlICCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoqhiJmah4eGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGBi6OKmpyJhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODgoCNo4mXnIiEhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgoKCgY2jj5aZhIKDgYGBgYB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIGEjoSBgICFn6apqJeCgoGDhoN/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKChISCg4qXiYSDhJitp6usoI6BgoSQhIGBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChYaEhIODg4KEjpmPhYWJpaGZpaObnomClJWEg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYGPjIOBf359fH2NnZmThIiflJCfnJSdlZKejoKDgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gZaXiYB9fX1+fIKXk6GdjJOSjZialJmhoZuHgYGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAlp+Lfn+AfYeLf4SGlailn5KRlY+JlaCdmYSCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGSoIqAjIV9hoiBgIaJnKGikIN/fn6Clp2RgoODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4qQgoSKhYOCgX9/g4iPj4aAf3+AgH+CjoaDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISBgoKBiIF/gIB/hoJ/f4CAgICAgICAg4WEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgICFhX9/f3+AgICAgICAgICAgX9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIODgYCAgYyIgYCBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgICEhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFgoCBg4SCg4KCgoOBfn1+fn5+fn5+fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4ORkpCOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoSEg4ODg4KCgX18fX+Afn5+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Cf3+Bg4ODg4OCgn99fX+AgIF/fX5+fXx9fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GPj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgH98fX1+fX1+gIB/fX9+fX6Bg4OCgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSSko6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1/gICDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn9/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f3+Af31/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+AgoCAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIGAfX9/f4CAgYCAgH9+fH19fX1+fn2CfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WFhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoKDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICBg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4OCg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCg4GBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/f39/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGDgoSEhoSAfn18fHx8e3l2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+gH99fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV4eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAgICBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4ODg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcm94d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4GCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIKEg4GDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4CDhISFg4KCg4OCgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaGh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHJqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhoeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoaCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt+fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH59fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx8iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHh4iIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aHh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz46PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw6PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dTU1dXU1NTU1NXV1dXV1dXV1NTV1dXV1dTU1NTU1NPS09PT1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX1dXV1NTU1NXV1dXV1dXV2NjX19fX2NfX19fX19bT0tLT09TU09PT09TU1dXV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi4utHT09PT09PT09PU1NTVx7e5ubi4uLi4uLi4uLe909LS09PS0tLS0tLT09Pb4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT5ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjoqfP09LS0tLS0tLS0tLS1L2go6Ojo6Ojo6Ojo6Ohq9LS0tPS0tLS0tLS0tLQ3+vr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKOoz9PS0tLS0tLS0tLS0tW+oqWlpKSkpKSkpKSko63S0tLS0tLS0tLS0tPS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozw8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamprM/T0tLS0tLS0tPT09PVwKaoqKmpqampqampqaiw0tLS0tLS0tLS0tLT09Hf6unp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tLU1dXV1dXV1dXU09PT1NPS0tLS0tLS0tLS0tLS09TV1tbW1tbW1tbW1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7T1NDPz9PTz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1NTU1NTU1tbW1tbW1tbW1tbX19bW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7QppLF0tChlsvTx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQD06ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Sqp2slM6ooKufz5msmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/QyZeZhaakn5aQobSVhp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9GksL2aip2gp5m0v8mXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0NW5mZ2lnoygxNKSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/Pz9DRmp29m8XJlNmto7+e1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NDVp6Sixp2TlqO7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDSwJ2izbKbrrOdpdDbo5m11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bT1KSgj7usn5qhnJyRp5ieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyMamvZWTmKGpn6KeqKKpndDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEE+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNTKjpOXkKqzjZCl1JqSjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS1MKvsLPR1sC91tTTucjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHU1tbW0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJmampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85PDw+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJKLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgoaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46JiZCPjo+UlJiQlZyanZ6orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ydm6CdpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrr6ylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62vqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWm5ikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z4Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6urrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6bn5+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/vLu+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsnFv8PAy83PysbEw8PBxL64vsHDwMS/wc/Pzserr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZmlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzs/PzMPHxsjJyMjJx8XJx8jHv8XHxMTJzMrSz9POvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndmhqaXRteGxdZFtWYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M7HzMnCwsfCy8vIxszKzsXGxcPFysfK0M3QzMfEwMPCyc3HxcHEx8G8vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPEv7++xMvIysvJvLvIxsjNyMPIycnFxcPCwMW1wsnKyL7Fx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7q4uby+wcfBxru5x9DKxMTAw8HCwcPCw76/obfBwcGgusfMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7t8C3vMvUt7vAwby7xb27wcS/v5KnvcK7eqnAycTAwMrAscG/u7e7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJjaGpnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbm/u8Hel37JvMO1use3trm7vb2Km73GtmCVwMXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgXhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubq7v7zQy32AuMTHt7m4rre1uL21gJG9yKxWfMDGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uyvb67xLa1uLW3wL7EvMLE1qp0d5DGz8LAuK+1tbvDqnmJv8mdVWa1y8PCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoByZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOxuby9sry+vMW4sbe5vsrKyMPGy86Kc3SOzNHMysS1usDEzpdxhcHHkFhal87Gwr/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD46Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzPzLy6vrzEvre9vLCvv73By8mxenV6jcbMy83KxsLEy9OEbYK/voZeWHrKxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLbAuMvYvb62v8C/r4V2b3t2hJe0mXF5e4+/x8vIwcPBwMnLc2l7ubR8YVdoxsbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bnN4c2dwXVteXVlSRURDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7tru7xXJ8wcy8trnDrYdnW2NeUFtfcH9vdnySur/GwLnAvL7GwmVhcq2zdWFWYcHHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5xcp0Z4a1vba2nm5qZ1VfW0lMUVNeb3OBnri4wrqzu7e7vr1hWmSgtHddVGfCw8TDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsbC1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS1t8fGfHRphaW2mGJTRV9RTWllU0xIUHF4iKGwt765srWyvLq7Z1VXmLx+U1BywcTGxMC9v7mzr7G8uq67tLOmq6itur64y8K/vqyrsK+zu7e5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDuYV6bm6OoG9PSUJrUkNce4eHW0ZXiKansLa6tbSyrLy6unRVUIW3gUxUgr/Bx8O/ubq1raWttrGmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ur2RgXdyhX5XRkJXiFFLTmF9h35RQ0+GurKztbK0r6y7urqEZlt4n4FccZe5u724trKxraugra6onaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK/oYeDhH1mTEBVenBMSkxOh6tvVj9zvrmztLKwsa2wurerjoN0haWpqamtrrivqqutrKOorLSnnZeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtaqTjZCbY0VWnXlSV0hRYUl8f2Njd665sqyzr66srbeplY2dpKmkn5ycnZ2nqJ6gqKihqbexn5aXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKq5sp6itVFBep13WGtKVWNpdnVkanqdsrSqsrSuqqupkpSrr6edkJeTj5ignqGgnKSlraepoJqWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZm6SZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigsMG5vXxPS2yqXGp+cXZTXm9hYG1ogJaxr66ztaqnoaGjnZmUjZCVl5iYnJ+iopufraqQl5eXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGfnJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QTY3PDY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnaHDwYBVVmZwfXZtZnpyVF9iZGpsYmxwlLSwsLispqGdnpqVmJqZkI6RlZGMjo6UnKOMdpeampeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmdpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkM3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqesaWQe22GcGJlV1FcVVdLTlVaVE9fWWy0s6uvp5+eoqCXkZSboJuYl5KTn5yhpJiGbHWdm5+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVqd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhooRkWl9pYVZOUEY/P0FERUJHUkxPqLaqqaSfn5mSkpSYmJaVlYyIi46VnZ2eeWGGn5mmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPjQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjn5mBX15mYFJFRTxLPEY8Qj8+QEFNeqmtqaqln56eoqOen52anJuUk5WUnZ6Yln10k6Kaq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGSDk1Oz43Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can6CJdmphV05EP0xffmxfQzwzNUt7qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhvgp2koqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qritq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyZcWpgVUlFQEFSjZ6kilBHXo2urKGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3JxbXGOpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyelGVYUExFREFGXr7Ww6OTo7Ouo56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlxcm9seaS2urm9y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyMa/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZtcTENERkRLVXi6uKuvr6acnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB1cG5xdHCFs8K9xNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0M3T0L/Ix8rEzMzMzs/Fxse2v8q/0s3Mz8bJyL/Ew8jOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6KjXkU7QUJJWmyarqyom5SXn5yaoKCem5yZlYl3aWNgX19fX15fX11ibHV0cHBvbHJxdZLEx8XU1tfX19PW0NXU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdLLztDAxsPIxs7N0dHSyczNwMrMxtPPzM7IxMrHx8jMytTU0dXP0szTwrnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjsHNEQEE/U22dsKifl5WXmZqcn52YnJySfXBlY2JfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMvA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M7OzM7PyMvQ0cvOysLJx8nMy8zS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+glJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppap/YmdiaYedn5uVk5abnp6enJOWl5SIa15eXmFkYmBgYGFgYGFeYF9eXGJtcm9vc3R2dnmkvcvV0dbU09jWzs7Uy87Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7mysr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFlYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Son62Jc4SHocOqloyMl5WQk5GRlZaVkIt8ZWFiYmBdXmFjYmBgX2BhYWBfXVtdZ3JycXJzcG1yeaTG08/L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Bvby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raS1c2N/gLaskI6Nlo+Fg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb3B9uNHIycrPy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa9vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fEyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaXFhSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGwsWVleou2kIuSloZ6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwre/tba+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jV15ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr55caXKXlIuIioR4f4aGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2ducHJ5nb3MwMO6wLiusLGnqq2sp7i0t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xu7awtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLwM/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFv765t8m2qrGSXG11kY6GiYl6eH6Ghnd3gXxzaF1dXV1fYF9gZGFfZGVjX19cW15cXV5aXFtdX2xwbmhma21ucnykx7+5uLWwq62nnqOqp56rrbOtqqyptK63sbOprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsLIyrjFx8a/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwsnKvsC8wbqytLTDrqmwjl9vgJCIjpB7eH2JhXp7hIB3bl5dXFxdX2BfX2RiYmNjYmBfXlpbWlpdWlpaWlxlbm9oZmdpa25xga25sLWupqSnp5qgpaGanKWrrqSooqyqrauwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyvMGywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2NXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QjuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766yrfBw8G0tbu1sK60u62nqpFpaYeEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmRnZWhqb3KFqaWrpaCboaWUnqWbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmysLq6sbaloKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgobGtrayytLO0sLW8trvBwLK6vsPBsrm5w7PBvb+1uLy9v7zCx8TDw77AxKCDeHBsYmZfa29gVVleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbagnpWdoaa6tquzs7uzxM/Jy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrOtn6GQZ2yGhoaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4edqaCXlZqhlpyjmZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrO1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vsC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLi/t7LCtLG7u6u4ubChnqirp5adkGt9hoZ/eHJtb21rYl5hZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtxjaidk5SUm5ibopeWkZyioqienJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a2oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbu2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmzv7axuLqssbSunpmjqZ+TmY10gISEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahnJOVkJWXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6Cjm5mZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mqKiyrbG0sLy0ubeuo5SBeXVkXmFWWVhTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb63va6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tbu8tbi5r66vqZuYoKiUkImIf4F9d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZpgZaTloySlJSbmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLSeoZ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl56nnKehopqkpaWrpKWwp6Wjq6utpqmur66rqKqps6amrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xau3t722vbq6tbKrrKeYl56ji4hziYh/d25jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVVJVYGBfYGFfYWFjZWqAlJOKkY6Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqKilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYlJyho52koaKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZWUkdRT0haW09SSlRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaumlZqbnIiAcoiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6impJmlr6WVmaWvqqCcmZugnq+anKuzoKWmn6OkoZWTm5aWkqmqrZqcn6Ggm5SQjJmOjJGMkY2WlZCdoqCjnZyjlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWVlTVVJFWExRW1hNVE5QTFBRSU5JQj0/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc2NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWpoJaXmJeHenSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqaidmJCPmp6ul5ioqpmfnZSloZ6SkZKRk5WnqqWamZmenpaNjIuThomNg4+LkpWRoJ6hpJiVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkE3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopydl5eUg393a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ6omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GSh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopqWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatuq+snpiZnJSTh3uDbl9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5majHONg36Nl5aGkZqQlI6Oe5mPnYyCiX+JmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdm5qakpaQnY6jo46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRkpKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alp6ans6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdpratop6OlJWRjn54fmVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTil87V298i5SJgIySjJCGhnOKhZeBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uQiZ2In5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklMUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZiDlJuwopmWhZOOioZ9c3VdUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+UeHV2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6iwraq2vLa3t7PBu7anusi4tqiotbaqsrymnpaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlZWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c292cXSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KV1BSSEpYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLKqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjZuNkH52hXd7dW5uaVlLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeoiNiol1cHttdHBpbGpYS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFZYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnqAhYuFdG50a3BsZGtqWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6Tjo98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCdIeMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4KFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2diam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGFfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWChGyViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHJ0ent3im1oamJ5b4aQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1teVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqbdG18gYaHfY5oZ2h4f26Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FOR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5q7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbYWBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3eVkquziI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHRUE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCjl4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkdBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0U8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6S4xqi2yce1vrm0qKO0rbGxm5mSmp+JqK+rpZR2n6SXoauxs5mWqq2orra7srqsr7Wisayxtby3ta61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hYeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wuo7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWksMa5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri/t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSBinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFpnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wby3tbu7t720urHGYXWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYWJdV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+DgIN4e4uDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7q2uLmyuLW0rra2mWR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0JFR0U8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYezrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHtbC5sLC7q7Oxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/iIGGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVVxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2nkpyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfoCBh3mEdYWTkYl/b3Zya3N8e3d8c4F3cWuAc3Job3F6eXJ7vsubfoyyg3ZyhHZoYWpdQ1paW1dmZFhla1NYXV1gZF5jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWuVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzs/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQkQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4dHt9g4d3f3qHkZaAg254cG11f3Z4fnSFfHlth3Z0bn12hHV5e522jTxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zpa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKKxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGubbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQURCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xfIFxg4eBbo56dXd9fIJ1f3yHiLB0WanCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46UkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yOlIyGe5uIk4+uqpSVl56Yp661vamtvcbLyMnLy8/Iw9HK1NbY19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQD4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXV6kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhph6iYmfl4+IjoqLgnyhiZCLvKGYk5eZnKmmpq6fqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6RgouAppmIhI6DhoSApYaKi7iYnZKVlqKnoZ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dYOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJGOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rnI+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUkIyPioiWm52PlZaRi5KUhoCLiJKNiYqclpmjo4aSnZahi4qIjpyQg4iPgIOHhaSGjJCzmJ2SlJehoZ+Zkpyep7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX96gXyGfHt3hoR/c3CFgnp1dnZ0hIOFfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjYSnkYSZk4WZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4mPiJeXioSPjYF/h4+liY2TqZqXk5aZoZifmZOdm6OztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OToyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHi32Ko7Ono6qzoZann6WklpWuooOQuJWSs5mNoaCMpZuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJOYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIuXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vn5uhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU8NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmrSeo7ikla2klqmtt6ako5+ZqZipo6+wqpqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnoublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOjpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O3jKiyrq68qpu7pKitubirpqaioaOjqK+ysaudnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePmI2LlZeUkJqWnaeasZqRrJ2Omo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5WntMbJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKPiZefl5OZlZimoK+djKqcjpaPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEw66ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur7IyMrB0snKwsy8wbOtu76nur+9vMS3rMGprLK7vaqwqaOlo6yts622taCfr56lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLkI2Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77CuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK9yMPHxdPNzs3Lu8G3r7q8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY58kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjZCPnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzEtaW0tcvBuKm2rLK6uK6ouLq9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvcXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Qlp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLursLLHwLilq6utsbGjobKytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwc22yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCZmqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Ktvrm2oKOnqKWnnJysqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjCvbmyr7m0wcLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrynrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6Sfn8Osm5ekl5mpnJaamo+qlpaoppWtrZmhq7bEwru+t8HCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+4pq29sLe2x7a1ubi/sb/BtrSztK++o5ekl5SclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opmjn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlY1dMopqjnJ7FrKGfrJ2drqCTo5+XpaCnqauXtrGjqrK1xMO9wLa/wrvIwr7KyLa4tbSws7O3wca2vrC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9tqaxvLe2tcOys7e5vrLDwLe4rrO1taOdpZaSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmp+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXc0hFNj11ZVxLTp6foZmew6elorOhnLOnk6qkoKSframsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/FtbmxsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbemt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXUxFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfpJ+boMOopKqyoaS1qZWyrKeipLKsrqm7sqywtbTGv8TEtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLKnqrqzp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnZSMjpmQgoaWiZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZF1ORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBpVkNXRox5ZkM7pKSdoaa/pqivr6GptaqdubCro6q0t7Gwubevtri4xb3Dx728w8HGwLjBxsG6qrakrbutwcO4uKqtsbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5qSho6Zi36NloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmReTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqr6ujsbippbWzrKGttb2us7i8ur22tsDCv8nEucTBwMC4xL3Bt6+1qKu3sry/v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4q62qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqmknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWWk4CPlIV7j5KDjJZlbHJncHJfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmaCkrLekrKmmrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub20qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtK+up6GzoJqoraCllZaamrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bnV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVUtEmZagsKiyqa2lpK6utam3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1q7Ctqqejtp+fp7KgpJWbmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V8flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNya0pEQ5CZpa6lra6rp6SwsrOqt7C2n6u1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5r6mtraaorbCmpKSuo6mcnpybsJqio6OjkayepKCfoqqmprmlrLW1paqrqKyvtq+jnqOoqpugmpqSpLSaj4mNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZbSDtObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s9SEiPm6qqoqqwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6urayzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqKyqqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKtpqOtrLixsqGpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiXZsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRbPk1GlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xr7Kts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGypKamoaGslqqhlJugpp6koqukraOfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOBgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6SIeWteYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGQEhIRJaSr6SjqrCYq6mttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqlra+rubCosbGvsau1qra1p7S2rKykqaqco56zs6iopLS0oLWtoamoq6irp6Crq6i5tqmqqqqiqaCtm5KpoZ2gpKKmo6qenaa1rqimqqKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gIidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWMwMj9mPU5YP0MsPkxUXy9JazdQRTuVjrCgpaqtmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova6srq2hp6ifq5mQr6GYoqGop5+om5mqsKmjn6yioZOio6OnmJqopZeXmZ2PioeViH2NhoWEpJaFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3R0emmBhqN1aV5lbIJ1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDUyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE86VkI0kI+xoKSmq6OmpKymtLOxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb2qs6+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVxcX1ohniEh2RgaGNyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gxJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RVo/Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK27p62wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVlpSfopablqasi56RkJGMgouBgI+Be5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXN4aYFzaoNnZGhhb3ONbWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8MlBbPSOSmayZn5enpKKfp6O4r66ir6+pq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+isa+hrKGspJymp6mampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32If4KOfXyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bxb2p/cmN6bGlmZGFmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9aWTUol52lmJyWraCfoaSht6uxpLS0qai5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaaqmZycpJWVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsbGpphG1lcmlrZmldZHOAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYlUsMpajoZeUnKqdpaGioLeqrqC6uKasvcWzr66ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKinMG2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGUkZSWmo6Uk6OopJCIio+GeYR8hYZ9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdmb4VnZ2hjZmlqYGliaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OWVPJzKepKORjqSnm56enaO1rKequbenrMPBtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelJONlZeMj5iaqaCRiImLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Te4OVjoZyfX1meG9ramxndXNrY2dkZHV/YWRmZmVqamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdFQS48PzlBODlSR0A3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kwqCypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanpmeo5qknZeemJuUmqCSqJWqp5uTm5ySjJWZjZSUmainjY2KiY98gnSCgYuYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnluaGtqZ3Fya1xoY2Jyf2FlaGpubGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCZraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCckZujq6qpu5+opKCYmpmeoY9ropaYnHGClpukgHaRqaeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRnX2RmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy7laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmZCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6aqnpKSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GWF5pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVdhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrJyTmZ2VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFORUdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFcXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cer62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWk5iSmYWvamqKjap+Z4SVh61lcZ2clJmllXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSkRFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK4usKnqbCrr6mpsK+ksLqwpKWus6Opuames7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uhnrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d+k5WVqJR+a4GmeoKFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1tkWFxaQj6weFdYQSNNaUVDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinqiqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaian5yjn5ugo6WjlZufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yZlaWPjZyNpHuOh6SCpYJ6rHmPnVave4l+n2q5Wrl3hoR9poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURDLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp+nqbCotKmknJ2eqpeYl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mZikjI+cjaJ+kaClfrB2g5HS0XZcrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZBPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2iqqSxp6yppJqcmqielZSYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrZqgnp2QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioKng5iZoYmSmoqif5OZia6Ff4KzXHKzUq59g4Kkf3HXfXeFf4+dhpmZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSTnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopZ+UmaWonZylnqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYuBp4aVoKGJl5eIo4KRiJSqfICLnXlvsVqogoKIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljs+MDAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifoI+NjKmwr6adl5uopp+MkqSXqKqmk5epp56foaOtpKGeoY2UoZifoJKdl5yVnqGVlo+rm4+ubXK0cqmMdoqmc7R4c7OAkaSikpyNiaSHkHe4b4x7i6Jra7ZaoIVll5dpoaKnbZNytHSTmH+yaoWTiK1qdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7PDAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpau5naOtm5aZj6WjlY2doZuZnJ+Rk5Srtq+nmZScrKqXjJOlmaWsoZGXqrKkoJ6oq7CYoaOQmaKXoJuWm5ehk5yqnJSRq5mH1JKau3Oww4DDhn7Vlpu4eIiQl4yYioyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2qqquxp7mvtsSxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSnraSflpqqmaasuJyirpiVoZCloJKNnKOemJ2akJaTr7mwq5WXo6inlJCWpJykrJ2RoKirn5ufqaOznqKljqeilKGanJeVpJiPsKCSlaqehZCZtoCQkYy4lXiCk5u1d25rbnNueY+EjolznsG7vZp7gbKocH90kbiDfIaGi4eNe4qGjZd8pLu5vZx1erSjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWiDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssq6esq6m7rrDGr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moauXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpiXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vr7Aum6Sg3GUhl9yalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxm4ppcox9hpVnan5ydHh9fWJbd3SBaFBcboN8e4trWGx6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6on6ihwaObtLq2o62lrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrai+p6mmlZSclaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlZ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWdtfXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpyUoZ2OgnqlhWxqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzor+ipLGyt6CqpbKnpbC1qsmrrbGltabAqLSgnqSlnKSWlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZiop7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYlKCilqOel6COlpSLio2Olq2PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJiepJaak5GdjX+NZqGzr4WJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopqmmpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKKzyLOfqqSrlpaXmqedqJufpKuUnp+doKquqaWjq6Gtm5+goZmlnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpmPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmXNsbnqEjId6WGVehYFebIqJgHZcaHN3d5GAh4JueIJ4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziGhqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+ss7GqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6hnqCqr6qro6qfqJumn6ihrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwsF7gXuSjZrDwH1rpbFvjIBvynp/m3eRg46Bd3qBf3lxen+HcXiFjJN5bXaSYmZfeGRfZIBiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kdq6KlqKWktKOdopOmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2era6orKajoqegpaWeramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaKgfKeVm3Srg4CvXmONqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR9loe4YYKtWaPNbo91e9p7f5lwfoiTdn9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF94ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3CwL+1tLC4mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gnqino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kq7CowMazqKmxrpaSnZyil6Cpqp6UoZ+cna6vp6qpm6enpKGrkq20lqaiq6qeo6emobCgkpqnmqGblJSRl6BwhYyXdYSoh3GxfJ1xrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuw1MbGsrSfnaOOo6Ohra+2rqiwp6mqqK6rq6eipJ2ZopWfpqufoqWgqKiin52wrJealqinr6yop6mel5Sao6KSlKGtm52mo6+so6y1qrrNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHGIoJqHpGBgUqyEf66Dm3augaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XYGpYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnw8nW1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOnsay2yLK1qqyqlZGcnKGZn6WznZqhlJyfp6uro66arKmioaqjs62iqrOxopuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+UgdK4tLjJgIGyX1+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9ecLVjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWWNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwca5ramzrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWfopeTqKq2sqybpZ2glZClrZGZnKejoKqnrqKjp6qwtMKys6qtqJOJl5ykmqGjrqaXoZWYnKWmq5qvna2opp6so7esobK5r56br6eztLOllJeno5mfjoKdTniagX+feoSjfIKkhIenn5yek4S4e3x5uYJ+zMbCtniboZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKiitbLDsa2qraqRh5CcppyjpJyll56ZmZmlpKiarqGupaaXsKW8raG3t62enrWyubGzp5idr6GjnoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1maGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklk3ONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamSlJeuoKCep6Scp5y1mqCqo7arw7Cpq6mijISOnKGgpqKVmpucmZqZpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqLGkp5h6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iVmICsiIWuhZ+UqaChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvaGdoQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKL2SmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqiklombkK6wrKafp5utmJiPrKKhnaaimqWdrZifqKa2qcCvpaqkn4uAjZuaoKaekpWampSamqWjo5moq6ujpJ+pqL6kl8OsqqKhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGWwjGWVrX2hj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbmZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5fYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20mKCzqKqrna+tnaubla+poo6Im46vrKmnoqeZrpOZj6iaop6ln5mjo6WZnqOpsqi8r6Wonp2OfIualaGgmZCSmpuSmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8ra2slYGpkqOvj5uAhqSXmJCBgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fX6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amspuesZy5qJ6trqWmlZSwrJeMg5uRrqajrKGknKqhmIujkqeeqJyaoamimZ6gq62pua6oo5uXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1linhvbYKZcYB5aXFpZ4mWlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCrrKOgp6yfuqOkrayspo6WrqmQjIWVl62epqqin6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYlI2YlaeUnpeoopqwpp6irLqfsMGnpLOmrLGyq62rp7mkrriWiqGopbadiZail4epmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmpOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJj5ynlqykoZmnnp6TlaOXqJqpmZSmoaOPmqeZobW6qKuZmpCNfIGUi6GUipWRlZCQk5elj56ZqJ+ctqOdp6y3p6/BrqO3pq+vsK2pqbO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZmZlpCVnpGJoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFjYWFhYGJiYmRiXFtjl5WkqKOws6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJmqnI6Giomco5Cun6OWqKChkpeYm66Lq5aPqJqojJioj565tqSlmZuNiXmBk4yak4qVkZSQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6n6myu5V2raSfioCqfmRcYnafjqSehJd+bpOznKOnrquiZZ6fk3N5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhp2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCRkZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ycr5+oqqaUlrigoI+co52Rf4iIm56Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSooJmYi4l1d5ONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqirreBjo6mnoSLhY+xqa+MiZajmnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fZmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6uq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopagoZKNk4mGgJGojoeinKOTlp2Gn7myp56bko6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePo2ueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmqKFj4x3m5yPoJGInqSblZiXhqK4raWanIyMf2Jtj4uTkI2QjI2Yi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ff5KFhqykh5yRipiol5makYelsKailZqIiYBpboiHi46OiouNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh518gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3uHf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWpJ2KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6PiI+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd3o7Oio3+IlHidequaf6KOnZuXiZdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaWhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Gcc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIiSmZV8kqShn6OIroZ9tYSOnp17pZZ6qYKWnZCKoZ19p2h2bX6ZdKFzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6OFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYklXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpoaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+xq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAk4aImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa1trXJoXOUioGfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dZhyUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVdaGtuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9sXmhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJsKeEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oG1upmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2WnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5RcmJnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6aEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiVoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1td2BbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY21zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgYOLlI6JnJ+JjZOro6CQgHWUl4h+gXmUrqN/gZtxj4Z5kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlsjIVbeXhxeXBobn6SiXF/dIKPlJNxhYSCZY1/X4F/i3d1c5R1b3lubodthIZed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxnjHN5e5h4hFtrWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9weHlsa3ZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR4bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9foxqXWpke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZ2R6g3qWW1xqZ252W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH57dW90Y2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iTm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgomRimt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmyChHx5mWpyaGF0inB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV8fHNvcGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx9eoN5TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1sfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqhI2SmJWPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG55dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG9rfoB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2eX5xa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt+eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnprjIFzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCFg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW56ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ5bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOj4pshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2plamNod4dtZmxoaWxogHx6d2+Qh3OBg4R9c4GGiXqCfXqBhH19jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5CPkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKkJGJnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52cGxtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9qcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OFe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3pyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyan5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zeb2JxYV9sbnlwZ3BmZnN0aHFrYXdlXVZmYWByU1BOXGZlXXhwiHxfXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIg3OGhX6MjIN7eZV3ZnJqgmCIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6Oj4R2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZOblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6ViZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR5gY+WmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlga3F3ZmtqYmZ4cnBwY194YGBWa19ddlBOS2BmY115cYl0XVxldmBhZWWPZGBmYVhpc3Nua3F2jHx0eYaCdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXtlh35vcGyAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5uYmY+Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4uEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeX+QlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2xVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOJbVxcZHleYGRmhWBjYl5YanJrbmtydox9dHeEgXh3e4lxg4R9foh7dIuJiJWGjH5+mHNodXB4bIt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5hpCGk4R9gXx/kpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcmlmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWlbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNzgX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eHiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY58kIx+ioV6dXuCenCGgJWZjpOUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GFfI+Ngnx/kol6cYNmeoSKh4yDfIV9f5SQkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJqYlFicnhsYWVdWmqDbXNiXGdfZGxfblRab05IT2dlXGducX9rWltjc2BcY2x3ZGVdXFpsbGJtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3BtfIF3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8i4Z9fImMf5SIdYmFdnd9gXF1hoGelIaVj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfICXjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaWFOZnR4ZWBdXFhugG9zWWViXWptYHBPWWtRRFNnYVprbm17bllbXm1jWmNvd2RmXF1gbGpjbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeYWDpZCEk42Df29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHiAmY2NhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneHBaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiZeKcYKNcXuGfHl5g5OMdWp6f2xvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYKViXyDeG52hoSDl3dviIVrdXt0ZnmCg6eMg4+LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF1gZuLgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDkISLcoF5f5eLi390bmt2f4B1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZm5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgY2ThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjoqJd3BthYOHdXmJeIl9k4h6f3Nndoh+fphvcYZ+aHZ5bWV5iISlh4CHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmd1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qbYGCdW5dZ2ZzcVFbe05ccFxPW3JwZFZLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gICKi4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMh3JycIR7g3R1h3SId5SIeXlxY3eGeoCTaXKEdmZ3dmNqfIOInoJ/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Roe39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaWyHgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1bGB6gnmIj2Zxg29ndm5bbX2AkJOAgHiSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Y356Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVtioRtdFtqX3VkSG5uTFtiV1ZVeG1iUFN0dldQVVheYXGEb1xgY21lZF5uYlRcckdCZl5dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46NdX92eH53gYOBe3R+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmMjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYR5eXR5dXV7amx1Y4R1kYJ3cGdefYJ6i4llcoJranFjWGx7hpyIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaCdmd0h4uNlHxyhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHNYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhcX2VfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVzgIaFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kpOff4x8i212gHljg4eXhnOSi2+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx+d3hzdm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveIqkgYV/cZmTcYB4dYJtgIKRh3OViIyIhIiFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1uhHRkdYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXp4cGZsYm6Jfm1uVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWWFjV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KIf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxogHBvcoB0iWRkeH5pdHVzc4KEeICEeXZ0dW5re3BhZ2tnhnSNhG5mXV99cHuJfmltd2ZpZFVXcnCNpnyEfHaWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4J1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f395d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucX50dJqBd3+Ad39+hoV6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSRgH2BlI6AhYR9foyGe36AdnujpYp5iYWDa3V8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paVGNuZVtYYnN7aWhtaWBiV19aaYBqa2+AaGxhaHl4anN0dG2EgXt/fXZ1bXpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6d2gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYh2anJ2Z2huW2xkXWxzX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4RyiHFveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bW92dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYF8g5+Ff4d9gH6GgoCKe3aErJ9/eoiHg2tygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdbWl51gWlebmxcYVZcXGuBZnJ0fWlqXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVlloZJCnbn54gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1vbXaDmHlygYB8f4iLhn11doZ4h4x9dHV1gnh6eoKMjn1+hIhqc5eBe4udfX6FeoF6fnyGiHNxj66Me3uHj31lcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlXZGZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFheYmOQpWh5dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dm9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB5bYN+gIGSiISBdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg32ZknmAgHh5fX90iINzcJmie3t/iJR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdkaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2j3NbV1NkYXKAf3KCXWJjXVNaYFtjk59lcnGFhJF0bGp5bG9wenx7cYB2f3J6enpkZnZnXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6EdnJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0aGJ0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUW2BZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVven51X2ZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBin9rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tleGRlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHl+Z1pWWGBreHx7cIRfYl5nVllgV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcWZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh456bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHhxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Pj46Oj4+OjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx8fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENERERERUIxLy8vLzAvPkRERERERTguLy8wMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTU1Mx8dHBwcHBwuNzU1NTU2JxscHB0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4iHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYaFg4ODg4ODg4WFhoWFhYWEg4KCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQiY+OjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo6Ojo6Pj4+Pjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkIyIhoaHjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQkY2HhoWOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjIqOkJCPh4uHh4yIiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIyEioaGiIWJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYiLioqMio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFAQENEPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk3OTs8Pj07PDs4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo2OTo5Ojs8Pzc9Ozo6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PT9APT09P1E+PT09PEFMO0xCOTs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RAPTw+QEE/QTtaeU89Q0U+RFg8WU47PDw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD48Oz1APTk6Om93WTc7OjxHXj1gXDk7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFDX0k8O0ZjZ19Xd3dYNzg4OE1iQmVoPDs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQE98dEZGdYaGhoJ8d1k8PT88U2pHZ2s+Oz0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXZ6cHaEg4OBgoB9WT5AQz5Tb0xkaD07PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBQdHN/g4CBhHx8hW1GQkNEQlJpZHNySUBDRUhJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUdsc32AeX+FgH2Gc0ZDRERNZ32HiIh+WEdIUVBMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR2B6f4B8goSGhYWLbEBAVneGiIeHh4iCWFJeTkxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLTlx8g4WEhISFhoiAVmyFh4aHhoeIiId+aVZLS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKWoOEhIWAgYWHhoOChYWEhYaGhoeIhol7S0lGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklohYSFhH+Ag4OCg4SEhYWGh4iIiImJjI1mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmGhYSBgIKEg4OCg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaIWDgYGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo7ODk4OTg3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj52hIGCg4OEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89SoGDgoKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJVhIKChIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VCQUBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENDRVqFgoOEhYaGhoiJiYiHhoaGh4mJiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX1+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDR0dKW4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNT01LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktHR0dHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9BPkBAQ0ZJSlFggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1JSUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI+Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUllYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RaZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUlZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVlVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09PTFFTUVVZU1VRUVRTT1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHp8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnh6fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1lc3N2d3d5ent9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYV9eWVVQTU9OTEhISktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODU3NTc4NTk5R25xdHh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFZYVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZGQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLSEZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QEBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT1BMTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9BQEA+QURJRUNISElHSUVCQj8+PUNBQUdJRE1PYmVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJBQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0hDQztBQEI+QEBDRUNJTVBHSUtGSEtESElLTUhKTEhISkxLTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVHRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pGSklMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0lJR01QSUZGR0tOT0tGSEpGRURFSUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHS0ZJR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRURERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vcnN5TklIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lNTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTEpMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGSEVJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk5MTk5OUExPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiZGVhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRkpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSUhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSERESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTExbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFREBCQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxLSkpLTU1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTUlMS0hKTUlLSkpLT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTktMU1JMR0xMSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLTEtGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hERUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdISUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVllcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQkNEQkRJREdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhGQUdGSklLS0pMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFeXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRS0dDR0VCRUdIRkdISUZHSkdIRkhLSUxEREtLTk1MTEhKSkhKRz9HRk5LS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVNYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2RjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGRkdIR0dKRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQ0hIQUFHRkVUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYWBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01NUExNS0tISUNEQUVESEdCQUZFRFdVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZCTUhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtJX1xzbU9NVm1ZTENQYFVsV2dKXVdVXkRNUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYVGtUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05YWkxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVhzUWh6bWlqenp+bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5OS1N0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUxMW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1taXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtLTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU9TUldVVFlWVFlVU1JVU1RUWFlXXVpfYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWltfXVZZX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFJRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVlZZVFdXVFJSWFZVWl9aXV9fV19dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VWWFZUWFpUU1FaV1ZcXltfX2BWYlxgYV1gYl9cYF1jYWNnaWRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZU1RZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1VVU5WV1deW1hRVFVYWFhVV1lbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl5dZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVlRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZYWVxWVVpdXF5gYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlNWVFhcXF9gYF1hXVdhXlteXFteWFZYWFtbX2BcX1hZXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk5SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWVlXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYVxbWllcX2FfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4TFdXXFlXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9fX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdW15fYWNiYWFdYltiZGJgY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19eXWFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFg4GDg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3x8fHt7e3t6e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiYmMjIyMjI2Ni4mJiYmJiYuMjIyMjI2Ifn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMjY+Pj4+PkJCNjIyMjIyMj5CQkJCQkYt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9fX19fX19fXx8fHx8fHx8fX19fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7enp6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8fH19enx7d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3l8fX15fHp3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3fHp8fHp8e3d4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp+fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXx7enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn18f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4B/f39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39+f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhoaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIOBgYGChYeGh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KGjYOMh4WFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoOCgYKCgYiTgJKIgYKDgYGBgYB/gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgIKDkYeAf4B/i5qAlY5/goKDg4CAf3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKCg4OCg4mZjIOChIGPnIOYkoKCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIODhYWEg4OBgH+Dj5qPg4WEgpKchJeUhIKCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gISQiYOAfnx8e3uMnY6AgoKBkZuElZWEgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/hZuUiH99fXyBgIGViICDgn+PnJKYlIGBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEm56JfoOBfYmJfoKDg4SCiJ+goZOJgYKCgYSHgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKVoIiCjYV+g4V/f4aGhYWcn4Z+fX1/goOHloyDg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4uSgoSGhImBf39+goiGhYh/fH5/f39/iJ2ahISEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhISCgYCBhIF/f36AioJ+f39/f39/fn+Fno2DhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GUk5GRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEhIGAgIGMh4B+fn+Bf3+Af3+AgH9/gH6Dh4WGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCAg4mFgoCBgoKBgYGBgH+Af39+e3mAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4J/gIKFhIKCgoKCgoKAf359fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4eHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4GChISDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiIhoWDgoKDhYeGh4aGhIOCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaBgoSEg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoeHhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Bg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgoGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDgoOCfX1+f4CAgYB+fX19fX19fHp6eoCCgoF/f39/fn9/gH59gH9/gICBf4CAgYB/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f4CBgoOEgYKCg4ODhIWAgH98fX1+fX1+f4B/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/f35+fX5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX5+fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgYKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g4yEg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGBg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf31/g4SGhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N8goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuOjo2Ih4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyCf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYyMjY6OioWGh4WEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai5CNjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYF/f32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRj42LiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx9fH5+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt8fXp9fn5/gICDh4mJiYqJiomFiJGOjIiJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX18fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWEhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/fn+Af3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4GAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDg4OEhISEhYSBgYCAfoCCgH5/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4KDgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIaDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKCgIGDgoSFhoSAfn18fHx8enl2eXl6eXd5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl9d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt9eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn59fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4GBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx4eHV4eHl7fHx9fHt8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCgoKBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99e31/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4ODhIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhYWEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WAfYF1gXqEf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGc4SDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt6eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4eGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fH19e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhIeKh4OHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4WGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhYaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT5DRT88PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPT9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/PztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9KooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNaynqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3InpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoq2alq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJ2tmIGglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PD8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCjnJ2oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonJG5r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqClppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeczaCrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttfFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkdLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkM8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBBQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqGgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnp2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqampqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmpeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJuamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJeanZiWl5aYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozw7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6SioaCem5mZmJmZmZmZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaGhn56cm5qampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+em5qam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5qZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmZmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmJudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUVFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+iZCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZuioZWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKuqqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqWnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkV09YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuur6qqq6ShoqSpp6apqKOinJubpKClqKOgmJ2Yn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqinpaepp6moo6emmZykpqKhoaGhoJyYmZ+goaSkop6elqCbmqKioKGfoaKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXVxQVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpikoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3Yl9cVVlRVVdbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7Pj1AP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbWmBfWlxWXGhkbmNuamliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm52hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeoZmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnlqYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpqWZoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcWhpaWFZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1tby8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta+zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVRhaWBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5ea2Nibnd1dm5sW2JRVlxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQTs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha21mbnVxcnVxZ15fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaalnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2xuZG9taXF4bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrLS1rK6lpKOopKCgpZmqtLG+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyeHN5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOsqaOhramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvY2FndWhqaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXM0M3HzMnCwsfBy8vIxszKzsXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8C7vrSwsLDBvr7Bxr++uLbDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnRiXWJUV1VTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcLDv7++xMvIysvJvLzIyMnNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAv8DAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZmNqZGFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxru4zt3Ow8TAw8HCwcPCw769wsDAwcLLw8bMy8XI0cKwvr64uru7vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhY2RjamJnY1taWlxZUU9FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vb+5vrq6tMC4tbeyrrq7tsC3wN6ekMK/wby7xb27wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV5WVlRZT1NMRjg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTk5iVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tLe/utDDfYbKvsO1use3trm7vbm6trvFxcq9ucXAv7zBvrjGvMK/vMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCZlMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3trW5ubm5v7/XnXeBqcTHt7m4rre1uLq0t7O7xcbLwbzGwMC/vby/yMPFxb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZmFtYFxUSUtKREpCQ0c/Ojs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjY+OmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLa1uLe6w7/FvMHOxIB3eZTGz8LAuK+1tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbu7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0hDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwub6+sry+vMS3srqwo6e5s73HzKJ0eXqXz9HMysS1usDEyL+/tb/Bv8bGv8vGw7/CvMDDzMrHxcbAub28xL+/v8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYk5JTT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Dc28W5vrzEvrigd2tvcWuAlbiHc35/mcrMy83KxsLEy83Fv7m9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fX1RJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLbBiq3YxL62wL6dfWRaZ1JOWFx2fHR+gp/DxsvIwcPBwMnKyMG7u7Czvb3AxcbFxL/Awb/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXVlSRkRDTUlBRT1IOzs1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGXxb66tsO8xsK+v8jFt7W4t7a5u7Svt7eytbO3uby7trrAt2VupsnAtreGYmBmVGRdTk5RVGh0e4ikvr/GwLnAvL7FxMC1urKwrb+5v8PHw8O9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1e3BuaVtfYFlTUEFGSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri4y7VtZ2+YtbiEWU5GZkxPdGpgT01YdHqOrLi3wrqzu7e7vcG1nr2usLC2s7nBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN1dnducWBfZl1bVEo9Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uM22eXVlc5yiXk5HVXpMSGZ+lINbQ3WJmauxt765srWyvLm/qoi8s7O3n6i4vcPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R3cmxfY2FbXk9IQj89SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7bHs4B5cWyLdlFFR3R/TU5PX4qBcEZSfqa0sLa6tbSyrLy5vp93uby5t3aUvbzBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk5BPkpCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO3vbmNgnp6eWRLR3t8YU1JUWWnpWFOSnCuu7CztbK0r6y7uMGMb63FuK1cdrm2vLy4trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlsXVtqVF1cUE1IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO/nYeHi4haRHaXcltaSV5gUpFxbm2gwbiztLKwsa2wubi/cmegwrKwp6WxrrmuqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvtqmWj5OoT0p9s2xqcV1rXnVxY2Nuh7G5sa2zr66srba3tF2Dpauknp2dnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaKmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn96Y3dsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKmzs6KtlUxUcqZzdH2Mc05ubWVwcG6TqLaqsrSuqquvsLChsaadkZiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXZ9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaigrcG/qFdaeHVucVpfZGJcWVtpbGJmc4Oyr66ztaqmrKujnpmUjZGWl5mZnKCiopydpZ6bpJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXd4fGR5eWBiUlVgSElKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnZ6/t3hjcnxmZ2VXWlpRSkdLT1BMVWJfm7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSqsq6imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWk1RSk5PVUxTTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopqeqaedh2FYZmhcTkpGRD5AQkVCQ0xWT32xrayvp5+eoqCWkJOboJuZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEY8Nzc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGgnn9jZWZYSkJJT2ZSS0FDPkBGSUhfo6qqqaSfn5mSkZOYmJaWlYyIi46VnZ2dnZ6Xnpmmn6CopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6elpJ+dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnJtaXZtaG1cWFxDV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjoIt3a19SS0NEVn+Lf2hGPTo6OThRhaqtqaqln56foqOdnp2anJuUk5WUnp6YlIadmqGaq6SssrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Wvs66qr6Odq6e2sa2ir6aho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t0cnFoVlxRRlRIREpQST9FQTRGRzk1Oz43Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can591aV5USkZERmezxMGNXVBJQk97qrKno6OhoJ6lq6Wel5yUkZmdmJSMioaIhnhtiKCkoqurs7y2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8TJycPBxr66tLq6tbu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hrZVpbRktMRURTTURCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZyXaldOS0lISFN90cu0k5yOgpavraGZm5uenpmXl5eSjI6Wl5OOjZCLgoOCd3NxbnGOpaywub3Fu83Hy7/CzM7NzMfJ0czNzMfJxcXM0dLVztPJvcC/w7vGxcjF0dPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb+/v7a+s66/wMPDx8THxK6/uLK4vMPCwrq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTERFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jnpyek1xNQ0ZJSVlmkrqsjYO0ubGso56cn5qXlpSSlJaRkI+Mh4ODiIeDgIGBgHlycnBseKbBysrFysHT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT1MjMxszNydLNztPNxcjJysHGy8fJyca/w7OzyMTLy8vPxsq/vr+9wcfEzMzIycDDv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQTxFPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoZ5eSD5ERVdmhqyfnqGtq6OcnJygpKGdmpSTlZSJfXdwa2ViaHFvcXuFioB2cG5xc2+Iw8/NyNHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1dbZ1dfT19jO0srP0czP0MzT0L/Ix8rEzMzMzs/Fxse2v8q/0s3Lz8bJyL/Ew8fOzdDRz83KyM24t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUlKPjtBOD00NTg2Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGpcEdFRUhihLzEqquqm5SXn5yaoKCem5yZlYl3aWNgX19gX15fX11ibHVzcXBvbHJxdY+9ycXU1tfX19PWz9XU2tTUzs/V1NTR0czRzdPX1tPV0M/S09HJ09HI0NfX2NHX0tjZ1NbMz8/KzdHLztDAxsPIxs7N0dHRyMzNwMrMxtPOzM7IxMrHx8jMytTU0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGjr4Jia2p6nMK/rqifl5WXmZqcn52YnJySfXBlY2JfX2FfXmFgX2BgX2BmbXBwbmtvcnd3mcq/0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NfXy8jOxMnPzcrMwMnAyMrNztDL0M3OzM7PyMvQ0MvOysLJx8nMysvS083T0dHQ0Mq9yLmwrru4taq2sK2ouK2zvruxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNWEU7QD0zMzw8ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp5Z7iIypzc6xm5qVlJabnp6enJOWl5SIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvcvV0NXT09jWzs7Uy83Oxc7K0tLPx87NzdTLztPNy9fW0MzR1MvM0NLTys7R1dLV1crAysLFzMLIycPMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHGyszN0NHG0M7NzczPxcfBuLm9w8O9w7iysr6xu8PDtaqYpaKZlpGVlZKLlI2akZSUj4+UgomGeXFya21nYGBwaFhYaFZMRkxJUFFCO0M+OzY3Ojg6OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooK54ZYODus6qlI2Ml5WQk5GRlZaVkIt8ZWFiYmBdXmFjYWBgX2BhYWBfXVtdZ3JxcXJzcW5yeaPF0s7L0M/T1MrFycnGxr/Dxs/Ox8XHzcrSyMvOzsbR0tDNzNTKx8vOz8jHz9LL0c/GusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS/wcfMzMzPwsrLyMfL0MTFx7vHw8jJws/Avby/sMHJxrm9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PT00OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raSwZmZ8jNGrkI6Nlo+Gg4ODgX2EhH5zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299t9DHycrOy83EusDDu7u6ur7JxsLDwMPIy8nIysjBxczGyMvNycTCysnBwszQxcvIv7nBu8bIvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbzAysLFx9LFwMm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt3cnRmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND89Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKypF1qc6a4joqSl4Z6gIWFf3Z4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpa3Bvco/FvMnEy7/GwbC2urKys7Kxwry8vLq4wcHBxb69ub2/ucTKxcbCvcbAuLvEyb/Bybu3u7vGw7+8wc3Dxr6+tcG9w7q9xrvCurO8xcTCwra/tbW+v7vMw7y1usi6v77LxMHGwsXJxsnG0MbCzMeyx8nDzs3AxcPAvbO3sLKnqKi5sKWtsKqtrJR6dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTQ7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7SysrKx83NztHI0MbV1NbXzcrPxcnFx8C5xb2rr5JdbnaokouIi4V4gIaGf36Ee3R0Y1xcXV5gYGJjYmJlZWJdXFtcXlxeXVpbXF5oc3FtZ2dub3J4nLzLv8K6wLeusLGnqq2sp7i1t7Szs7S7tb6yt7C1r7K8wrzBxLzAu7Wyur7AuMe5tLu2wcK8uL3GwcO7ta+ytrq/tMS3u7SruL29wL2xurawtrqzxby2rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Jx8PGwsO3w729trm+x7+stbq1t7aOeXR4Z2dlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL65t8m2qrCIXnGBl42FiIl7eH6GhnZ3gXxzaF1dXV1fYF9gZGFfY2VjX19cW15cXV5aXFtdX2twbmlmam1ucnukxr64t7Svq6ynnqKqp56rrbOtqqyptK63sbKprqass7y6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pq62r7uysKq5sK27rru4u8DAvrnCv8fDxcC8xsHHyrjFx8W/x8TDusTGwrvGyczLs7nCvbuziXN2dmtpYGJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHF0MfNwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmwjGhshJKHjo97eH6KhXp7hIB3bl5dXFxdX2BfX2RjYmNjYmBfXVpbWlpdWlpaWlxkbm9oZ2hpa25xgay4r7StpaSnp5qgpaGanKWrrqSooqyqraqwpKafqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaOrsbKzqL2qq6irra20s6aorqGkr6mypqeorqaot6yxsre6uryxvL2+vsS/tcLBx8i3v8DFt8TDv7u/xMK+xMjMyr++xMDAqYdzdHJqaVxhb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvByr67yba9w766ybfBw8G0tbu1sK60u62nqY1pYIaEh4uAe31/fnh0fnxzd2VfXVxcXl9gXl9jY2FiYGFfXl1cWlhZW1tZWFpcX2ZrZmVnZWhqb3KFqaSqpZ6boaWUnqSbmJGho6qjo6CmpailraCdnKSmrLKwtrensKyoqrSrtLqxtrautrmyr7q6sbakoKSgprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PBvb+1uLy9vrzCx8TCw77AxKCDeHFsYWZfa29gVFleSE5nT1RHRUtGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLbHwMy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKGNZG+HhYaAfHl1c29tamppcGleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4ecqJ+VlZqhlpyimZaNn6Gjp5ygoKSmoqeem6Kbn6uwrbG2o6mqqqyspLS5rbewrLO1rrK1rrCqn56fpKKypKapuK2ipqagqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7mzvrS2srG2tb+2vcC9w8G7u72XhHpzbF9lXmRkWFRXXUlXXEtQR0lKR0E8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7w8PPvrrHuLe+t7LBtLG7u6u4ubChnqiqppeekGZ+hYZ/eHJtb21rYl5hZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtxjKeck5SUm5ibopeWkZyioqmenJ2lpqKlnKCgm5murq6usqCmoq6rp6K1sbKyrKivsqe6s6a1oKKfnKOhraOiqrWqoqOmnqWmo5aZnpeZm52gmpednZ2craKrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7izrqmsrrK4sbq2ur2/t7OxlIV5dWZeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGv8W2wcDGzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smoduf4OEf3hvcXRxaGVjaGRjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanahm5OUj5WXl6CXmZWXoJ6hnZahoamkn56onZyaq6evsKubo6S4qqGgrqi2qqanrbCkuLCkt6CinJmZqqahmqy4r6KhpJyin6CTlKGUlpabmJeWl5yVn6qeqaSinaOqqrCuqLSrqqets7Clq66zsbCvrq+mp6eyrbG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRT1BPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ijqrvAvcC5rrS4wczHxcLDvcW4yMuywcLBrby7tLu8tLi5r66vqJuYoKeTkIqAfIB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZpgZaTlYuSlJScmZ2WlpygnJ+WoaCmpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbGurLWeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvr6CSendyZWFcWl1YTkxSR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzc2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsXHtsXEssK/xaq3t722vbq6tbKrrKaYl56hi4hzhYd+dm5jYWZpaGZnaWZqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVTVFJVYGBfYGFfYWFiZGqAk5OJkI+Uk5SdlZaXpJmgl52hpaGtpqSko6OinKqrpZqfpbGqoKGdpaueqKGeraypqa6toqGilZijm5yQq6mwnKCin56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqjq66lrrKppqWmprSmqaits7W0ubqvqayejHJxb2BbV1ZVUkdRT0hZW09SSVRLU0xFRklEODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG+w8issbjBtbvAu7SzqaqklJmam4d/cYiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHj5GPmpOVk5ybo5yboampq6isp6impJmkr6WVmaWvqp+cmZugnq+anKuzoKWmn6KjoZSTm5aWkqmprJqcn6GgmpSQjJmOjJCMkY2WlZCdoaCjnZujlZugo6GXoqijoqiroKuwpK23paOkoq2tqqirr7O3s761squvmIV0c2hbWFlTVVJFWExRW1hNVE5QTFBRSU5JQjw/P0E/PTc1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtp7O2rqior66bqaist7arvMq7tr+sy8bFuMHOz8izxLq3u8LIsK24v7e8vbqytKWon5WWl5WGeXSAdndubWhtbW1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jIGLf4yRipKNl5GXmaKgm6CrqqaurKiwpKman62glZakqKedl5CPmp6ul5ioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThomNg4+LkpWRoJ6ho5iVn5WaoaKelJulpaeoqKCxsaaxvKefo6y1q66nsLWwuLXAsa2xq5F+cnNiVlRVTlJKR1ZQUlFMTFdNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKWxt6qlorGrnaqnqbKxpLbGtLm6s8rFubrBy9DKsba4u73Bw7GvsbettLO6srKhopuclpaTgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjoeQipeJlJSYm5meqZugqqalrJ2omqCmnJOPn6Obl5eFhJKbo5CVo52WlpaIopublIuOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCaoKKWlJiZlaKmmY2ZpKaopqGgtLKnsrehnKK3rKqtpLKyprW8tayrsaOJeXNtXU5RUUxPQ01OTlBLRk5OSkpOTVFITUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqaktrCkp6SqpaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6snpiZnJSShnqCbV9fZnJwdXFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWFhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoqSZpZeinJWNh5iajHONg36Nl5aGkZqQlI6Oe5mPnIyCiX+JmJ+jnpCTmJaFjYOUfn50io56kIeTkJCdmpqakZWQnY6io46JmqCho6SborSvrK+tn5iluKamsaGwrpywu6qpr6qZg3dzY1ZNUk9QTkNTTkxRTEJQUUhJTlJNSEpKREpMRktKPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SopqWoo6alpqams6eltMG4sLSwycS3ucHOxr2zrLrBq63DraeippKdprWrop6OlJWRjn12fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVWWVtdaWxybX+FfHROWHKQg5eHjp2Xi5SRn5idlZSWlY+WiYCTiV87Vm98i5SJgIySjJCGhnOKhZaBeYF7hpOdk4OVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qZk4uPiZyIn5iIh5aemqGgl6euqa2pqJ6WrbOipq2ZrKuYqLOiqa2jk35ybmBbTlNSV0xEVEpQTExGTk9JRUxRTUtPSklNUEZJST03NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqKijqrCop7TBubC1sMfCt7O9z7+5r661wqeqxaminZiDlJuvoZiWhZOOioZ8cnVdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRRQkB/lZKSfYmVjYSKjZuOlpWJkoiGlYZ5iX9gSlFueIqRhH2EjYqFf39ufn+Ud3V2eISNmW9RjYiKhnt+eJR2Z3eGiH2KiZWLjZGSl4yEioiVhJqMgoSSmpaenZSko6ippaSemrCroaSkkaaqlqKqnKKmqIl1bWZeW0hRUVNNSVVNU0lMS09JSEZKTkxNVEtRUU9GSUM9NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foa+hp6ilp6ivraq1vLa3t7PBu7anuci4tqiotbaqsrymnZaOf4mTqJWUiX2Ng4F8d3BuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaVxVj4mUiXR/h4F8hYyTgpKai497ho+AdoB4c251cHSNjYF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2h1hISEhXuVioiKjYuAf4SLjICUg3yAj5iUnJaRnp2pnp+gnaCppZ+dmIynpJOhoJaenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW5uaFhLSElIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfYmMiIBseXF9cW12j3FocYF+jnBDi4SCg4V/d3d6i4V9jHt1fY6Sj5iKkpqbo5aZnZqdnqGclo2KpJuOnpeOlpiPd29tZWJaWFhVUUpTVVRPUE5QVktOS05PSlFOSE9PTEZEPDs3OTs6Oj89OTw6OTk/Pzs4Oz03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ7fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZedloyDiZ6Ri5KNhpCWf25pbm9uWFVYVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2wo6yqqLWvrqy0v6u8wr+mopmVpJeejYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98aHFxfG6TjY98c318cXBudW2Cf3d5dWp5iYKIiYSWkpKQi42RlJSOl42AeYiXiIaKhoCQiHZqam9oZVhRWVdZWVtNUFVWWVhOSUhFSkpIR0JARkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjoZ5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEQ0VHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAZ2Ziam5ybHCDdWlvWHVwjpuSd2x/e31tcW1wgHpzdW5idoN+hoCFkJCKiomRi5GMi46DdXiKjoB+g4B9j3pxcG9rYFtcXlxZWGBfUk5bWlhXTEhKRkpHPkJBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGdpKeer5Wltaqusa7BsrvBxpaQjJSPgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7Oz0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoCEmYSbnGGGqp+di4OQjXp3iH6JiI1zipeQg3pdZHF0ent3im1oamJ5b4WQgnpugXd0hHpwdHl3a25pXXeHfId8h4ePf4uSl4ONhYyGfXGEf4N9dXd7fIl2cHN0ZWdfW1tdVFxnXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkpydn6aRoKugsaivwLG6xbqWjpGTh3qFdmt/jJGCfYqEjox4g4BzoYSLfXyBfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJKoh4CYmIqcdG18gYaHfY5oZ2h4fm6Fh4KFcYSFR2yAd3J5dmhta193fYOIf4iFi3qVnZuJi4iRf3p1i3Z8eG1vd31/c3NybFtdXVtjY1hnZlxVT1BWWVBETEtGTklDRkNDQUBDQT05Nzc6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH2JhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT4/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiRgZqVgqGhmJWbmqWtk5m7sae7x8Ooi4yhpY+UiYGRfHGDnp+RnH92hYWKkIiQaWhvg4B0jIeEi3GFgneHf3t2hX1udnVmgJSPhomJh4iHoaqilomOmH96gol6eW9na3h+en5yamReWlpdal1hZmBZT0tOV1JRSFBKRE5HQ0pEQkBEREE8OTg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY6KmpuknaGspquvsJeRkYOhlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3ODs9P0JESEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdmo+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6Gfk5iShIuFj5mRlmxwdYmLgpaMjY93j4RxbISBipaRg4WIcoihloeTiY6PlqW1qZuNlaKDh5ODfX9ramt8gIGBc2FdY15aZmtcbGteV0tHT1NRTk1MRklQQ0RNRkFDRUZCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpWenpynoKmWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioSYkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2cqKWimaGXopWdn6ieqKugqKypqrWXq76rtsjIt8nRz76boHBpq6mfhJOShZyhmpuZp5GRiZWimpp4en6UmJKhkpaYgZSee3aVkquyiI2Xn32UnZyOk5aZpKKmtrCdkZmoiJaPjYGIbHNyfH98cWhgXGBeYmdjYGhnW1JFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXuUjo6Kn5KXnpabqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAvLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrS9uKSurKynqLSrsLaysq27sbO+nLPDrLvJy7fDv7ilo7CyrK2qo4uWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY+csYuVo6e3u5ugo7CTop2jnpGkoquvrbO1opSkqoiZiZKKlXl6foV+Z2BoXGViXWRjX2ZmX1pPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg2PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBk4WIgpuDkpGMktrInZZzVpeIj4icj3yGjI6KinqHgoeRj4OFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEuLTM/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrHBx8Oqs8W2rLO/s7i+tr+0wba7u6O3xai2yce1vrm0qKO0rbGxm5mSmp+Jp6+rpZR2n6SXoauxs5iWqq2orra7srqsr7Wisauxtbu3tK61oKeno6iaqbCtsrq4uKebtqmMpY6Rk5+GeIKDdVlhZFZlYWFjYGFmX1tUSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUZXUUpMW1pRY2RXeXVxgZR9hIeTdoV/gIx7v7ujvIK0lJONm4+EiI+SiYl5hoCMk42HhIGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxWT15VSUtKQUA+R0tGRUQ7PkA3RDc/QkpKRUZXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe3wbW/sLd0sbOmusWkr8a5sbOxtKiktbaqsaChlpuikqWwrqatq6ekmKCss7qiqbK6tLu+zL/Fxb29s8K3uri+t7q3uayssKaxqq2+sL27wsKsmbqolK6Pl5eriX2CfGpXYmFYamVqZVdbZFlWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlVWnZqcH+PhIGOhG56c3mHYrihmaOJlZOWk5OTjZCWkoeGe4aBjZaKgYSAinp8i4eGfIqDgYqDlX14enVlT1xkR0VMOlFjYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPEU2Qj5IR0pMU1pUXZOvuLW6ucm/ur3JzLu8wLy3tbu7t720urHGYHWypbGanqq9qqWoq6qjorK1oauonpWWn5ifrqWnpqWfo5SiprG0p7KyvbbBvdPJytPGwsXLwcrDwL69v7u8t7Swube2w7rFvcPIsJ65qqKrjqWotomAf3FfYmJdV2FfaGZSWGFWUlZJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NDI2PzhAPkdLUlRTUVBPUVFQSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbGxxkI2FkHNscnJziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWin+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLS0hGSUhIR0JJOUQ/SEtUVFZcWluSucC5vbfGwLq4ysu6t7m2uLmyt7W0rra2mGR1qJytcF6hrZyYoKKbpJ6rpZSgn5CUjpaYl6ifpZ+empqEpJ2spaqwrLewvbnU0c/Xz8nM0czPzsrGwL/Cyr3BvMHAxMTFyr/IzrSku7C0r5urubyaf3lsXV9cWF1gWWNjUVxgU1BLQ0FFRkQ8QEU+QkhCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9JOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkJRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGDc3uKg4V7iXSBiYaVf3N7eGttdXtocmVpbGlmamloYGZpaGxabnSXraS8iIdnW29oXVpZVEhLTk9KS1FLVFFITEFKR0tQX15iZmlhl7fHsLmzu761scTHta+5sLC7q7Kxp6q3rI22p52bp5pPmp2MjqCWkaaYpZWKk5OJkImPkZGem6GXmpWWh56appusr6ivp7O01NTU1tLLz9TVztPPzcXCydC/ysnKydLHzM3C0NK4sMO8xLmltrrEooJuY1xcXVhgV1hmWlFdV09PQkJIRUJJO0FEPkFHPz9CNztDPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLTEzNDk9OTcsLiwxO0ZLPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiCaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQh3yEgnB/h4GGe4dyg5KLj35xeHVrcXh+cXtteHNsaYFwbWNpbnB4aXd8fsu/wt+nbWN4bmNbYWBKUFJVTlleUF5dTVBOVFFVVFxubnaCcpetuKy0p7C2q6y8wLGrtaaluKesrqGrtKOOsa6amJiMkZORhI6bgY2mkZyJg4uEiomEi4OTlZiXk5uRnJiZmZ6eq6ykp6Gsrc/S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxcDOx8fDqL630J56bmVdYlxWYFJdW09QVFBOSD5BRkFCRTxAQj5FRD5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PjU5MDEwMjItMkROMykvMy4zMj1OMjM4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd2x3cH1+f6GenqGLjZmTk4yMk4+WhXmFj5CNi4qIkYd/gntyfn+Bh3mEdYWTkYl/b3Zya3N8fHZ8c4F3cWuAc3Job3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1dlZFhla1NYXVxgY11jeHt+i4GZqqSkoaChqKaqsLiqpbSjoa2io62ip7GfiaaalJKRiZGOiIGUiWqVoo2ZhICFfZGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjIzc/IwsvR1NHU0s7TzcbW0szU2NbW2NTX1cnU2s3J19fRyqzEw8uLc29iYF9YVFlSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkM7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0tO1IwMTcvNTMyRkQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeHKCiYCdlZ2UhYuWiY+KiI6Hj394hJSZio2IiIuJfoN4c3t9g4d3f3qHkZaAg254cG11f3Z4fXOFfHlth3Z0bn12hHV5e521jDxBi8alfo18aWVWSUNmY2VjaGpkb3hbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jpKaypKSzoKGlnqGpoKOxnIaekpKSkIuOi4aDkIR+nJuMjYOEhXqUfoKplaOMkoqXkot9l4qakaqzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0tW/y8y0eHZuZF1ZUlVQWlZGR0pKRUU9Ojc5QEFCOkhEQEVDQUNCOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CUzM5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eFh3qEeXF6e4SGdXqFjo2deoxwfG9ven9xe4Fxg4eBbo56dHd8fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeBZWlvcnV4cnuLh46TkpuVoJWHjJOboJufqp+grZyimpmfpZ6frJmLmoyRkY2EfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlIuGe5uIk4+uqpSVl56Ypq61vamtvcbLyMnLy8/Iw9HK1NbZ19jX1NvX09nb1s/b2tHWydTLlXl7aGhbWVBSU15IQ0VJST5BPj03Oj0/Oz5IPT9BQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDM0QkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQmoB6gI1+goKChH6EfHyEl46Hi36GhoB3gnlue3uHgXR5kp6NoHaPdYJ0dYF9dICEb4GPgm+ShHR8gYV6doZ8ibfGpcLJt4GWm493cGVOZmOBeoF3hqKQi3h5d3uDf3yEdm2TlpSVj5iQg4qPlpqXl6acl6CXn5OSl6OdmauWkZCKjZGCjIWJiIGFkJGenJmJhYuBhpd6iIifl4+IjYqLgnyhiZCLvKGXk5eZnKelpa6eqLW+wMC5x8nNzsXNytHW1tXZ1dfb1NfZ2tvX29rZ2M7cxoZ6eWdoZWBUV1ZVTUtETkM7PD08OTo8Pjk9QDY9P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqLfH6Af4B9hXt+gZGJhIV6hIh7dX10bnx9hn50fpKekZ+DknyGfniOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DCoLyMnKOcfYmEfYlzjIp+c6aanJiUhXuPkImEaEdwoKSdjIuQkoWJi5CSlY+dmpOVkZeNjJWfnZShlJKOjZCLfpCOjouEiJKWmp+fiYyUkp6Rgot/pZmIhI6ChoSApYaKi7iYnZGVlqGmoJ2enaOutrq1q7/GytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdraWRXYFtUUE9IRE1CPT0+OTk6Ojk5Oz02Pz4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ5int6f31/fIh6fHuLh4J+dIOGeXN6c22BfoV9d4WboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKSuoIuRi4WLgZKGV3Kti5+rm4+DmJuQkI5cgqKRgoyfk5WMh4iMkpOMlJSUj4yPioiWm52PlZaRi5KUhYCLiJKNiYqdlpmjo4aSnZahioqIjpyQg4iPgIOHhaSGjJCzmJySlJehoJ6Zkpydp7G4rKW8wsfNx8bPzM/MztfP0dSu1tXY2tja2tfW2dqfb3x0Z2dcXVhTV1hDQElEPj4+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE5Rz06Mzc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gXyGfHt3hoR/c3CFgnp1dnZ0hIKEfX+SpqOfpaKWiZ2PlJeLiqiXcoqyjISnkYSZk4SZi6KWoJiTiZudoZKpr5+RlZCNjYiVi26Nt4WaxMiynKGlm5yYlpGykWSkzceWj4WHiZCSjY2TlIqFioqGlpqbj5CUk4aVl4R/j4uZiI2QqpeXpKOImZ6Wm4iPh5eXioSPjIF/h4+liY2TqJmWk5aZoZifmZOcm6KztKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGNfXV5OSlRaQkFHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo+OkVNRkhSV1NSQmOBRnWBjn18bX6IeHp+eoGBg352doCDfGxui395fHh4fISHin2Ko7Ono6qzoZann6WklpWuooOQuJWSs5mMoaCMpJuvo6SdmJCnlqeZra+kl5WWlJCLmJmWoMCOpMm4q5uipq2YkZudsp2GhaiinJiFiImOlY2Lk4+IgYaHiJKYlIyLk5OGlJiGhJGQnHSRmbOWl6WhiJyZk4+KkIqXmomKlo6GfYyYnomQkJyamZOYmJ+UoJ2Vnpuhsa6ipLe+tMXHxL3Dw7/GzcrJ0qfOzdPS0NbY09DYu3J5dlxgVV9XUEhJTkVCQ0U1Pjo3Njo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg5NTY2PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiAhYF+cHh8fX1vc416fYF7eIaLiYaDkqe7rKiyva+lrbOzqKOisKyKmbWdo7ikla2klqmtt6akop+ZqZipo6+wqZqZnJSVkZefl5m7u63JoWm2uKuwlJieo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5KXjJCVjYuMl5iSnZm0l5arnYublJKNkJKMmZuKkp6Qi4mVoKGNlI2Ymp2Tm5ielKGglJydpa+ooaWzuKvCyMS1ur27xcfIwtGhxsnNzcTX1tHL06FwemhdWVNeUk9GRD48Q0FBOD84NzQ+Rjw8NjwzNTM1NTQ1NEIzOTpCTTpBO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBlR2JgYnBJQIuKfoFzhod9gYh1goqDf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyrq68qpu7pKitubirpqaioaOjqK+ysaqcnKSYm5iXnqKlpZKjua6owLusrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYeQjI6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpSQkJaXjpGgkYmVm6OslJaPlJyelKCdm5igoZSanqempKKksLKmwcfDr7C6tsXEwr7Np8fDx8O81dHNxMqIdHNiXFlfW01KQkxARUc/QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZkZgaWdaXVuTjIyIe4eLhoOMdYaQioFvfnyCf3F+gXqVepGUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLorq6tcG7q6mcsqWkqJSFjqrDxKSCi4+HiISGlZSNeoOMkY6RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY2QlZGPoZSGl5+gsp6UmpSgoZmkn5qgnKCUmJ6mpKampK+tpcDEwq2ot7XJw762zrLEvsS8s9HKyMK1dHltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpNZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3IyMrB0snKwsy8wbOtu76nub+9vMS3rMGprLK7vaqwqaOlo6yts622taCfrp6lopijtLypm6i8waO2tq+rkrCtq6yXhpqqpqWRgoyTpZWJgHWKknqFjZGQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOblaCinLWmkJ6XpaSjpZ6eppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmG15YVhXXFtLS01KRkRESUJCQUNLOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FGN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY2Xjp6SiYp/iZ+ThHeFf5V/f5CIipB/laGarqajmMK+yMPHxdPNzs3Lu8G3r7m8tLzLvMPBtba8rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWvvsOxvbmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZj6qZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysq6ebnqaXmJeYlaGkqKaftqupurzDtKaztcvBuKm2rLK6uK6ot7q9uINsblpXVFVORkpTTks/QUdEREhGRzk1Rk07Pjc+QUouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8aFc7PUBCRkJxRmlJUmViTEallJyWoZeplo2Qg4emk4iBh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67tbG6u7y+z7bEvbe5t7KxtbO4s6ymnKuruKqop6+wl6OvpKekpLTAsKqstL7CucC5s6e5tbiyrpWlra+upYuTlaGNdMGafpeZhY+WmoyxlZqZlZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqymmqCllJOZmY6cn6eimbSpqrO8vLuqsLLHwLilq6utsbGjobGytKRxbmZcWk5QS0RQUFBRO0dKSUdIQkQ+OUtVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpPSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQ0FGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWlYOzpCQ0A9UUVXUnNiV0ZIqpeZoKKor5mRl4eLp5aOiJKFn4eEnZePnqCao6S1yLSpxrrDw8fKyMjMzca+urOuubjBwcy2yLrBuLW6sa+usrSno5uqs7SqqKatrJmkrqWkqKy6v6irtre/wb++uLKyw7G5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJuXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK2yo6uVqKqXqq6lpJ+lqZOSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMY2VhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVEpRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMC6wsLHyMXCzcjCvbmyr7m0wMLKtcaxwby0uquoraywo6KZqrS6pqmmq6qdqK+no6qqvrunrLyzt73GvLe1uMCxvcCzqbW3q7+lj6OXkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmausnp6jo6mRlZWgg5CenpyVqaSiobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGRkJSTEpBRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Snl6SfnsOsm5ekl5mpnJaamo+qlZWoppWtrZmhq7bEwru+tsHCwMfEvs3Hu725sq+4s7/DyLW/r7y2ubemo6qsraCgmqqqxKGkqKumnquvrKKpqL+3pq29sLe2x7a1ubi/sb/BtrSztK++o5ejlpSclK6gkaGipaOjn5C+pamdqKydnaGbpp+9opijn6Kpq6Gdlo2VnpOeh4+FjZOepKCdtaymnJWyp5mvqJ+aqZ6gjZmVn4SOoZqbk6WkmpissbaxqqWqraycmKCgko6QlqielGhiWWFdTklHSk5LSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sME12XDRLWjUsTW5XPC09KR4jemJRNUNLUTlvUkY8S3hlYlZMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMO9v7W/wrvIwr7KyLa4tbSws7O3wca2vbC4tLm1n6asqqudnZ6lo8GloKmtn6Spra+ipqe9taaxvLe2tcOys7e5vrLDwLe4rrO1taOdpJWSlKGuoJminamoq6Oaw62pnqytm5uemaagvaKdpZirq6ymoZmNmZ+SnomOV3+WnqWhoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq2yq6mhoqWllZWcmIuPkZOknolhZFpjYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTZ6foZiew6elorOhnLKnk6qkoKSfrKmsnbuwqKy1scfEwcKzwsO8xsO8xMq9r7G2rbC0r7/EtbmwsLm1rJqosKmpmp2loafCrJussZuqoq6wqaSnvbamt7q8rrbDrbOzwr+yxrO6t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7yypqCpqZmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqin6e0pqeNmLSco6+anpuukJ6Tl5SagJKhlY+On6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YWVbZ2VKSUxKUkFDQElHOztHPzk5Tk1VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1VeZnJAODxIlndlQTSfo5+boMOopKqyoaO0qZWyrKeipLKrrqm7sqywtbTGv8TDtcDEvcnEtcDIwrWrtaiwuKzAxLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrqyp7qzt7K4wKq3ssK8tMWnvq6tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3oqWmlq6ysqaqpqGem5qalpion6CYoZ6vsqKmjZeumaWrl5qdpJGbjpOXmYWWn5SMkJyelIupqaqip6CYnpaMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1FPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE5QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SnBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaqdubCro6q0trGwubevtri4xL3Dx728w8HGwLjBxsG6qrakrbutwMK3t6qssbuila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tay8rLKyubesubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KvsbSrsqirn5ugoJuepZyilp2js7Can5CTpZqgqJqVoZ6VmImUmJOWl5yTiJCbmZSOqainn6Obl5uTh46Zi32LloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLU1daST9EWFBERj5OPz1JR0dRUEI9Q0ZCTT86MkQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE+KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGqsKujsbippbWzrKCstL2us7i8ur22tsDCv8jEucTBwMC4xL3Bt6+1qKu3sry+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrEt6u8r7G4rK2qo7GmnqWqoKSXkJmfs6qzqquzmp2nm5qVjaCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZibqLWpl5mSkp+ZnqCekKuel5eFlZiLnZmck4qNlpeal6aloqCdlZWXk4CPlIV6jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV009RVVKRURBTT9BRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwrJTIrKjVLMS4nX19hVTE1MD1gVl44KUMzWVVcZ0s1jHpmTECkmqCkrLejrKmlrq62qa+0uqemsLfFt7G2vsDBtbS6xb7MxbnCv7q/ucS4wbmytayqura7ub60qq2wtZiYp6uqq5usq46rvZ6rrrGjq6CxrbOurraxubepra6xqLWvs7u8ybKqtbSxtbCvp6GzoJqoraCllZabmrKjraCmr5ahpJqako2ipaeyqaKnsqyqtqWvsbWvpJmdraeamJ+Zmay4opeTkI+YnKGYl5SrnpyTgJOYjZ2cmpaRipSTnpqloaGgmJWRk5V6i5CFe4yKg4uSa254bXV7YEVhallJSFlbPXtKR0U2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDXlFcLipCL0pHUFtIM2NZVEpEmZagsKixqa2lpK6utai3tLikq7S3ybu0urq/vrS0t8PAzMi7w7y2vr7AuL+8sb2up7q5t7bBtqutsbiUl6auq6eisaqUr7ukrLKyp6ijsrOwsbG1sbizqK6rsae4r7W0w8W2qbS1rLGuqqejtp+fp7KgpJScmpWynqecoKqNqaOem5aYpaWlt6eisrSsp7GnrrC1rKWZoKyom5ydm5SpuJyUjo6LmZyil5CYpaCelYORlZCdnJiWlYiXkJebp5yjoJKVkJCWdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD9ie0dJOEdnV2VbTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnRmFMViUtQi49RU1RPDNyakpDQ5CZpa6lra6rp6SwsrOqt7C2oKu1ucm5rsG8wrezsbXCw87Fv8G9tL2/v7q/vLPEqKm5sLa2v7yvq7OynKCnsK2lpbClnrK1rKuysKypqLS5rLSytay0ramsqKupua2xsce/uKS5sKmtraaorbCmpKSuo6mcnpybr5qio6OjkKyepKCfoqqlprmlrLW1paqrqKyvtq6jnqOoqpugmpqSpLSajomNh5GioJWNlJ2fk5KEjpKSnZuYlZSHmJOVmaabn5+MkpCNkHd+joV8fH2HiolxdHJ+fX1cU2RvXk5aZl1GRJZaRztObVhhW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhkSEorOkk/M0JJUyw+j2s8R0iPm6qqoqmwpKiks7SxtLWxsaGrrb3Luq7Au8extK20wsLRxcW+wLK+wcK8v7e8xKest6yzuLvAsKuyraCkp62pqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWruaioqK2qqLGlqqSirqqoop6co6yVpJ2YnpmsnaKnqaKspaOtrLixsqCpoqCrrrCsnp+nqKmZpJiZj6CnmIaDj4qLn6CPi4yWm46OhYeQlaCdlpeVhpaTk5eknJ2cipGPjYl/foiGfHd/h4WGdHNxiHVsX1lgbmNRc3FcSzuEfEY+V3VYYVlOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5JZ0RGODxCMDVFS1gxQJRaPkxFlJetp6Kqspypqa+2rLi1rqqlq6q9yLuwvbfCr7Css8TDzs7Dvr+0wMLEusG0ycSsr7etsri/vrOtrqulp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq5+inrC3q6qturaltbWjqaesrKqtoamnprGyo6aloaGslqqhlJqgpp6koqukrKKfp7G3ra2jpaKbqaquqZ2ipaSkmKCZlo+YnZOCgpCJhZygjIqOjJmNkIuDjJejm5KQm4yTkpGUopmbmYqOiop8hoGCg3p0gISCfnR3i6OHeGpeYG5nV2WHZE5AZ5JMRGJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGP0hGRJaSr6SjqrCYq6mttau2saulq6qpvMDAuLizu7Wlsq/EycvRv8G7ucC/wrnBusHErrK1sbO7wL6zsa6sq6uotqqmra+rubCosbGvsqy2qra1p7S2rKykqaqco56zs6iopLS0oLWtoKmoq6irp6Crq6i5tqmqqqmiqaCsm5KpoZ2gpKKmo6mdnKa1rqimqaKjl6Wnp6qcoqSjn5mYn5GOj5mOfoeMh4SenoeEioqOjZCMhIaVopqOjJqRkpGPkp+XmJaLioN/dIaBf394dYN/e3h+gYidj29xZ2dxeFxgc4hqT12YVkhteFVkVlJiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSooLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuVjrCgpautmaulrK6ztK+qpa+pqLq+vMCwrriuobWvycfI0cC+vbu8wr26w8G/v66ysrG1vLzCsbKzqrOopLWppa2zs7mwo662sa+yuqu5rqqutauqnqmrn6Kgtq2ooZ+vs6G0qp6op6qjqqGirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsKmjn6yioZOio6OnmJqopZeXmJ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iLfFJYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD5INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjM4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6Smq6OmpKymtLKxqqSwp6q4vsG7r6e5qqeusMnGyNHCvL++ub6/vMm8wbiwsLSxuru4wLKzu6y4rKK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayqp5yeqrOks6iaqqeppKmdo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqamRmJqTkIqCj4V+j4KAiJ6Phn99i4eQjo+Ef5Obk4WTooyUkouRm5KVh4h+f3F6eX58aXd8enVwcH1ohXiEh2RgZ2NyhXptZ3ldXlZCV3ptVGFPUlhLTE5xdF1IWltnWUVVZlBEPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmJBSjdHU2BVKj07RFg+Ko+UsZmfn6mlpKGrpLeysqWosaesuMG9tbCjua2oqLDDycnMwba9v7W3v7rItsO1tLO1sb24ur62rbm1v62hs6aqq7C1uLSrnry8qLLAs7qgr7O1qqyerrCjnKWoqaKenKWxpq+gn6qpqKKpm6SooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqOqopqapKSVl5Sfopablqasi56RkJGMgoqBgI+Ae5qVjYl8fouGjo2LioSSmJGHlKOJkpKHkJqPk4GHfHlrfXZ5eGJ7enFwcXJ4aIBzaoNnZGhhbnOObWJpcGBwQVx4a1ZeTlFRSkpNU1lWTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoSks5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8Mk9aPSKSmayZn5enpKKfp6O4r66ir7Cpq7jCurOtn7mvq6i0usfKyL+3wb6vtL63xLbDsa+6srLAtbu+t6m5t72rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegppejqKCwuJ+jsa+hrKGspJympqiampufo5WdnJqdqaaWm5+okpiTmJ2SmZahqpCaiY6Qh32Hf4KOfHyhjY2IeYOMhYmMjIWHkpqOiZWfiZGVgouXjJF9hHtzb31xc3RgeXhpb3Bwb2l+cWN6bGllY2Fmhn9gW3Jqck1Nf2lYWk1QTEpIUFJRSU5cX25TRFhaUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJyWrKCfoaSht6uxpLS0qqi5xLWyrqC3rK6tsLXGyMC3v8G5sLS9t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaevsZugpKCjpKGXm6+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpn5eanaWTm5yanaaqmZycpZaVl5WcjpOXo6mhkImKkIZ6hH6EinqPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeoB6cHJ3bm90X3h3ZGxsa2log21mcmlrZWhcY3OAX1prdWlaSX1eW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKjsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYVQsMpajoZeUnKqdpaGioLeqrqC6uaasvcSzsK6ita+sra+0w8S8s7+6t7Czubi6uLuurcCztLivv8G4rLy6taais6qnqbOrrbKim8G2pai1tamesruqp6apr6yZoqeco6aUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpuclqChq5ubmaGVkpWWmo6Uk6OopJCIio+GeYR8hYV9nY2Ki4Z5gISHiIeRhZWTkoyQlZSNjpR7g5iPi3d+e2x0cmxsc2F4dGhoamdlb4RnZ2hjZmhqX2hiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGROJzKepKORjqSmm56enaO1rKequbeorMPAtrCsorWup6+vt8DAvLLBtrGusra2uLe2rKq9s6+ysb2/t667u7GlnrarpaW0qauuoJ/Cq6ilsLOqrLW7naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6GgmZuZnJKZnZSlnayimJeelZSOlZeMj5iaqaCRiIqLiXmFd4KCgp2Hi4KJfH+EiIaEkISWlY+OkJGRkY2Se4OVjoZyfX1meG9ramxndXNrY2dkY3R/YWRlZmVpamNqcVleWF5tZGFOaFdaYFZJR0hLTVJYPjlgbGlHQlRTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FmSCU1m6SfkIytoZmYoJaktLGisb23obHGu7mwsaO3rKquqbm9u7utwLKvrq22r7O4s6irubGvrrS2u7avuL2tpp21q6ChsKWrrp6kw6CypK6xr7ettZ6tr62uopmdqKqlnpWbqKWfmaWjqJ2aoJyUnJ2tsKa5qK6joZqanZmeo5qknZeemJuUmqCSqJarqJuTnJySjJWZjZSUmainjY2KiY98gnSCgYqYhYd8iYmEhIqMiJKEk5ySko+QkZaOkH+AjI2Db4B/ZnhuaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqaWZsXGxtdXFhVGJoZGVZSUZMTU9YUVFWYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOimo6OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+orqW3uLe3rLuvraqrt6q0ua6ls7WxrqmxtrawsrW6p6iftqmenqmiqq2cqcCYraSusLa1ra2fsa2wqqKbnKOsqJuVnKejnZqpoqSWmqCdkZujq6qpu5+opKCYmZmeoI9ropaYnHGClpukgHWSqqeelZWfkYmXmYCWiqCPeYaUjYNuan53g3FshouGfYSLhm9eY2BnhJeGa4uQlJN1d4uEfoOPf2aGgGh1aWZXXGlzbk5QamNmcYRmXmRmbmxpXl9fiZCEhmdPS0Q4RVRnXkpHUFBVVUtIU2FvdGVGW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi81NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6quq6O9xa+pt8K4vbytprawpaukuLOys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra6lqK6rrKWhnpygp6abmKGmpZubp6edk56gmJCeqKqjtbCjo6OdlpeYl6OIoY6Smoehh5SdoX+lf6ernpOSm5KIhHJ4jY6EiKF2iI1pl4hmfXN4oW+Ih4R+jXt/oaCfmYB7h550iI52m4psh4GDbWhlY3pscWJUhm1jbGmYcVhqb26GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWVlFRUldUZ15MWEpSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXg5ysnZmZnZ+qqqepv8Ousbq8t8C+qqS3sKmsprK1rq+ztquppbGtpbWznK21trSmp6mzsa2yp6+fqqCyqJ+ko5qho5yutZWkpaa2vaasp6qqrKimoqCYoKejmZmmo6SYnKSplpSinJWTo6WmoLekpKCjmJWTmJOciK6PmJSJqYuXopuFsYCkrZ6Ump6VeYLUqH+HlMGbx3l3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHqBbJaxq7B5aGtYsa5vZWm8krxuaHltco/YflJrY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFKMXFdcUEBdRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY2mk4GmqZ+XnJ2lrLKosMK9srXAtbe+wqumtK2tqaevs6qvtrSoqKa1pqe4r52zsraqpaSnsa6tsaaqnqeksaSioZ6Xm6Cfr62VnqKftLqiqqihra6lop2bmqKon5ibqKCfmJ6np5Gcp5uUnaGnoqCwo5+fo5aWkpiSmYWvamqKjap+Z4SVh61lcJ6dlJqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrJqfLF4dJKTY21tp21bhKBFaWaHlkV1nGB9Z3ukp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRUSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo1LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuRopWCrKelnqOkqbG3rLO9vrC3xLK3usKnqbCrr6mpsK+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZebnK2ml5uinrSzoauboq2toJ6Zl6CiqZyZnqSgnJmhp6SQnaOal6GfrJ+mp6Cbn6GWlZGXkZqFtZu1eIWpmbWZd4ezm7d/lJaXqZR+a4GmeoGFiJKUknerZ2uxW6x7j4eUdIhwj4aAgIiQl3iDgouXjIOgj4SwdnefcWtrbHyLTqRYSGNjmX5jaKZgeXJ1U5KHXlCpbWNxfoeAYp0uUaFuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tORzo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclZ+UiLOlpqGuqaezrKm7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGntK2kq7WlprKzp6Oinaeqsqiwp6Wen5+vlp+ZlZWWmJ+topqapKi1r6Gpj6moqpuelZigpaiZn5yjn5ygo6SjlpufmJqdo6ubppqdm6Kgl5OSk5Ocg9WTmblwsMJ+xoZ81pSbu3yalqWQjZyNpHuOhqOCpYJ6rHmPnVWve4l+n2q5Wrl3hoN8poKTfJh6qnmOnI97sW2OhHSQvIVvlFCvp8WKUaB6Y2CqYnNyh2yXiGBTtbTIhoCJfGOkM0Kddl1RamhjUEBYZlpkYUpITWxLW1NPWWZaQ0Q/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTcyJZuik5ixp6ils6qltKiku7fBsLrAsbW1vLO1p7Gwo7Czpp+utqibqLmuo6+xoLO0sKCknp6nqbCotKmknJ2eq5eZl5aXlZahq56al6itsKmjn4+soqeWnpecoaWhl6GhoqGboqKnm56hnpWZm6agnKeVnJufoZmQkpWRnYiybmi1cauHb46mcrRzcrZ7mpikjI+cjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aEfK19l5mPe7Fzk52OeLNllnSEnm+eZpRSyItawlyfeWJfrV92c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlPVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPkhJOTE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+hnJGlr6ykqrutprSlp7a7vLK6v7e2tbq6s6W0tKGxsqOfrLCkmKa6rqSxsZ20uKqfpp2hqqSxp6yppJqcmqmelpWYmJKSo6igl5OmqrGmopaTrZ+lkpShm6Smn5Sapqahm6OfrJqhn56QlpyinpyllZ2VmqKflpmWkpuFrHt3qHajjomHqW+tioOog5mZoYmSmoqif5KYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfY6dh5mZd6+GipGch3e0YZplmoGClGySWrBYS5p1mHlmYK1edneHZ5iIa16vd5Wej3hsNXnIrrJfQVRvXmdgRVBsX3FtVlVNLmVjaVNZUTpBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwl7TBraizqKmyurizuL+5t7K2vbWluLOftKyfoKirn5WntquosbKrrrSkm6mgoKihtaamqqOZnpWloZSUnJmSlaKlmpOQp6yvpqCVmamfoo+RopmopqCVmaWonZyknqydoZ2gjZSfm56gmJmclpeioJOYkaadhql9faV4oY+Og6pwrYyCp4aWoKGKl5eIo4KRh5SqfICLnXlvsVqng4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB+g5VsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5iZU1aYV9yc19KVTZKmpNZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVBSDZLSU5ASUtARU46OkA0Ljo+MTAyMTQ0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGdmZm+q5e0wq6rramltLC4sbW/ubqzsbe8qru0n7CknqWnp56UqrGpsKq1rKuvoZihoKako7mio6ugl5uRoqCVlJ+alJifn4+NjKmwr6adl5uopp+MkqSXqKunlJepp56foaOspKGeoY2UoZifoJKdl5yVnqCVlo+rm4+ubXK0cqmMdoqmc7R5dLOAkqSikpyNiaSHj3a4b4x7i6Jra7ZZoYZll5dpoaKnbZNytHSTmH+yaoWTiK1rdbNhnWaib4eSapdcrWBNoXyHkVJzo2x5f35vmIZwXK9WPJx3ZlRvbi5cp09iUmtlYWxZYlxgcHtjU1lRPj5tcDNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQkk2SUpQP0hOQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpuduqGbssCuraurp7epuK+0wLW8sa+5uKvBtqmqoJumpKGdkqqqp7ajsqiuqqCXnKegpKu5naOtm5aZj6Wjlo2doZuZnJ+Qk5Srtq+nmZScrKqXjJOlmaWso5GXqrKjoJ6nq7CYoaOQmaKXoJuWm5ehk5ypnJSRq5mH1JKau3Oww4DDhn7Vlpy4eIiQmIyXiYyniHqjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcW6NpHS9XXd9W2F5vGtaVltqel5qYGRmYm13b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5p5qeobyil7HDsK2pqquxp7mvtsWxurKuu7CuwbKspaKeo6Gcm5GqpKqypLSmraSflpqqmaasuJyirZiVoZCloJONnKOemJ2akJaTr7mxq5WXo6inlJCWpJykrZ6RoKirn5ufqaOynqOljqeilKGanJeVpJiPsKCSlaqehZCZtYCQkYy4lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbiDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZmeZoZpjbV0cnB3toxef3l9iWeDeW15YouscHWFf1lbp2pEZFlTZmBjXWNRZ2ZxbHVCTlBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rOlZWJz07PKeeoKC/pZa0w7Ssqqesq6m7rrDFr7WzrrentbitqaOipp6gnZmUrKStqqa1qKifm5ago56rpL6moaqXlJ2QopuSj6KoopOdl5KYlLK1tq2YnaSkoouSkaabpaublqikpZyaoammp6OpoZKtn5ejnpeXl52ej7CplJynoo5qfmmcp3iJc36aj3R6ZYd6vb7Aum6Sg3GUhmByalpemolhZIeOlWtgf5VjbZx2YpRrf5qVlGVeYGNxmolocox9hpVnan5xdHh9fWJbd3SBaFBcboN8e4tqWGt6gnJJSm+FcE10TUVXXGZgTFtYZ2NeT1ttdWlxUk9ERU07SEk8TD8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbXFxdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0pSX0knU2BWNClQXkwoMz1bTyc/Mj6ooKihwaOatLq2oqylrqeotbGsyKyws6y1o76xsqago6mdo5uamaynrqSktamlm5eVoZunrKi+p6mmlZSblaCZk5ilqaeRnpCPmJ2wsr+sm6aep6KJk5Gpmqikmpurn6OZm6OnraKfqqKasJuVpqCXlJ2fnZewpZiiqJmckZ2co6SZp6OanJqampCWgWhufXF3kZeUkYWKtaqNhpiVjoqMl5eHlJWKg5KTkYmNkZOYlJiXmqCimpuUoJ2OgnqlhmtpfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1Y3d9dmtwe21gY1xwZ01ZWWVqX1dab3ptbWZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWVpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJlJeUzEwVF46Kz04XEssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGltabAqLSgnqSlnKSVlqCrpqyjo7asoJmWlqCXramlwJ6rpJWSnJeemJOUop+eoqeTkZipp7LDr5qrnauej5aWqZ6qnJygrJihmpyipa+moaSonq2Yl6admZqhnp6csKCdoqaVmJOYk6CilqOel6COlpSLio2Ol62PfJWbgpKCi6qohoGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZk5GdjX+NZqGzroSJhHZ6j4p8dnl6b2d5kIGAiWt1gXmIcmhzf3p2g4iCa3RjeWZgaWRiZGZqWWt7cGlqXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01NRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rKuusrKgqqaxraKss7DFsKqto7OuvKS0nKCmoqGdmZeopammpKaztZ6VlJ2ZmbCmrr6gq6OQkZ6amZSRlaGcl6mchJ6prKK0yLOfqqSrlpaXmqedqJufpKuUnp6cn6quqaWjq6Gtm5+goZilnpyfna+jmZ+ok5iYnZGlmZipnpqXZoOSfGV+jpqPY3mNbGhrepGkq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFebIqJgHZcaHN3d5GAh4Jud4J4gHNteYN0d4iIjoN7aoVZXmt0ZF1ziWlqfHFsY11RTVdKZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FKW0ovN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CqpaitrrCmrq2wvbGpqKStr7GfrZefo56hmpmmq5yso6aoqbKunpWjkKKvpra5pa6jj46aoZmTkpugmZmllnulrKKos8O3pKKnr56elZ6jnqOco6mokZ6gnZ+qr6qro6qfqJumn6egrJahm6WwpJicqpWhnpqTpZieq5mefr6DiHK0coSdhq1oeLnEuHGToqN7ppiZc6qCfMvAwLtxi6KHgp98lZiJnsC9gpadno2dwcF7gXuRjJrCv31rpbFvjIBvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGRfZYJjXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SVtMKiNCUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqJSjr6mwr62msrWvqqamprGrn6uYmqKgnJuqp6Kcq6KlqKWktKOdopKmray3s6evopKRmp2lkpGgoZecn52Hp6ukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ2dra6orKajoqegpaWdramRpJupraqcnaqcrKGWl6WWoaOYnH/OlHl6pIF5lZabX66PXo6ngaGgfKeVm3Srg4CvXmONqnqnh4WgdJeSiLNjgquGoY6Ns2mErnR9loe4YYKtWaPNbo91e9p7f5lwfoiSdX9le4h2dmt9iG5+hZGSfm2BjmBxa3BnYF95ZFtwaGpkZmBSVFJXXktPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcO0wtIVBARjQuMa3Cv7+1tLC3mJ6RpKqorbSrprKsraykq6ewqqCnm5mll5yir5+gn6ino6Whn7Csm56Vp66tsauorKCUkpufpZOPn6WXnqijnq6kqrCov8azqKmxrpaSnZyil6Cpqp6UoJ+cna6vp6qpm6enpKGrkq20lqWjqqqeo6emobCgkpqnmqGblJSRl6BwhYyXdYWoh3GwfJ1yrH6hnoGlj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iZOPn4B7rVacxHqPb5LBfYGVbXVwjG1ldmWGb2F3bnJviYqRkINtkI9kb3R1cGBnbWRfb2lpbmZjV1NcYVpSU0M5SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc9V0otPCc+MSkzVkBGIRxHOkMxLiuv1MbGsrSfnaOOo6OhrK+2rqiwp6mqqK6rq6eipJ2ZopWfpqqfoqWfqKiin52wrJealqinrqyop6mel5Sao6KSlKGtm52mo6+so6y0qbnNsa2nrqyWlJydopifrqyclqCZnZ6psampqZurqaOirJuvsaKorK6mmaarqqqxopKXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpGBgUqyEf66CmnaugaaGhp96mJaGe2aAo4mkmYaBo32pfoGUh65efKlVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb215d3dvbGZkZXFwZntoY11XX2lYWFVNTVFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1cChmauooa+inrC1sK+prKOopqqqq6mkpqCbpJ6dpaemo5ysmqKroaSfr6KdmpKqpLWwr6Cpm52WlKejkJqiqJ+gppyxpqOosay2yLK1qqyplZGcnaKZn6WznJqglJyfp6uro66arKmioaqjs62iqrOxoZuqqK+wtqOTlqSnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ6UgdK4tLjJgIGyXl+UqYOkiIegeZiVmniqyXSZo5WnqZCSm4x/m4maxsZ4ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn9wenR8e21bZmpycWaBal5iWGNtXF5ZSU1MS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTY4NS8pKCUmJSQmKSw0RU5QUE1GS0pWRipMMC8+LTVPVFEdHDs8RjIsJKekwMa5raiyrqylopyyuayqoaabqKaqrKmmoKalmKujn66rnaWgrJqeqKWdprWeopeTqKq2sqybpZyglZClrZGZnKejoKqnrqKjp6mwtMKxsqqtqJOJmJ2kmqGjrqWXoZWYnKWmq5qvna2opp6so7esobG5r52br6eztLOklJiopJqfjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoZGLn32alpeKdp6YiqSYo6h+sIWchZ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGKdHpzhH5wW21ud3JqgW9aZF9obmJkXUtNUVRCSUhGSTo5Sz5CMTA4ODY2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTM6UFtUHBs2P0gsLSCLh5mprKSruauvoJyhrLOzpp+glaWura6qp52mppqjp6GyrqKoprKgmamklKK1oqOVl6GptLmkm6Odo5OQobKZnpynpqGir66dpKihtbHDsa2qramRh5GcppyjpJyll56YmZmlpKiarqGupaaXsKW8raG3t62dnbWyubGzp5iesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYGKcaqGhLRucmqZo5uVip98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIyTind8eY2BbWl4aXhzbn90XWRkbm1laGBKWlhYPEhHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1bWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknONiq2/v7u6tZ6XqKSttaGjmZWjqaeuqquZpaKfpaCgtaaiqKewo5Sro46kraOdkJqaqrS0pJ2lnamRlJeuoKCep6Scp5y1mqCqo7WrwrCpq6mhjISPm6GgpqKVmZqcmJqZpqSmmKunraKlm62nvqyVvbCsn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGOg6eVmICsiIWuhZ+UqKChloafgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWf2tsf2J9dG1/emBnZXFvZ2doQ1lgWz1LVDJVOEJCQzckJDMrJyczLCAvNjY3NDM1OUBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTVFZWV1hWVVVRSEZJSiMoKLySmoSpxsK3wbSfm62frrilpI6bpKOgr6+qn6Sfna2Ynrmgoqqgr6mZraGQqqmklomakK6wrKafp5utmJiPrKKhnaaimqWdrZifqKW2qL+vpamknouAjpuaoKaekpSampOamqWjo5moq6ujpJ+pqL6kl8OsqqOhrLK6q66noLOvqaqYdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShoZCFoFtsaoGzYH+te3uCgLFsZ26Zl4yIsFt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJaWe3iNnH1kc31ig3d0gHxhamZxbWZlZU9VY1tCVF4+SSg+OT00ISIsJR8yLiAqMS8wNDU3OTk8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVpYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmqCfnbOzqZ6joJ20l6CzqKqrna+tnaubla6ooo6Im46vq6imoqeZrpOZj6iaoZ6ln5mjo6WZnqOpsqi8r6Sonp2OfIualaGgmY+SmpuRmZeonqCYqK2npaWjpam7n6DGp6Wpoau0tq2up5+8rq2slYGpkqOvjpuAhqSXmI+AgLjDuoOOnZOFp5ecgqyKgq+IppuapaqQftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RtnX96srDHg2qrsL2teHeivrt0gJaOppyPmpGWnHmBkJp5Y316ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc3Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lYWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJWztLG/ubK9s6Kdrqals6adi5ilvqm3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRrqajrKGknKqhmIujkqaeqJyaoamimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqgu6ivr5pzdaqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwj4txlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mVlZhxaGmEhmdwhmRdiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWaGd2iNanl+eWRsY2ZsYktkWEprWTpRZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhaWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbOqurmys6upoq6eo7KpmJK9scPIvraqnsCsrKOgp6yfuqOkrayspo6WramQjIWVlqyepaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJaNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMGopLOmrLGyq66sqLmjrriWiqGopbadiZail4apmpCUnZOqs5mbo6ugspaioZ2gopygpKGVq6aMkpKMh5KcnJSQmZOYkI2VhoGkmZeVjYuTkoqPhoR+Z4p/dIJ2dIeMcadse5WRlJOBgY+Pj4+dlKCVmJaggoeTjHBoj3Zwind2fHpqbGRkb2NVYFhAaVtIY2FPWitGPSsmITc0MC4fHCElMigqNjk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW3rq6isKStn6C1sZCOq8W8xLu4qqKlnZulnbCpo7annam0pqeRmKyii4iJjpynlqukoZmnnp6TlaOXqJupmZSmoaOPmqeZobW6qKqYmpCNfIGUi6GUipSRlZCQk5elj56ZqJ+ctqOdp6y3qK7BrqO3p6+vsK2qqrO5oa+9mZKmo6a2opKdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCco6menp2cl6uckpmhm5OQlqqZjZiYlpCVnpGIoJ2VlIWSjJCMlIqAfmaMhnWGdnmIg3OcaoaRlJSRin2MlpKSmJOhk52WoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1jUGBkUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX19dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQkJ2ks7uvrKyio5p6naKxpKWwqJabuKailJipnI6GiombopCunqOVp5+hkpeYm66Lq5aPqJqojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKvr3WkvqOyoHh6oKuyu5V3raSfioCqfmRcYnafjqSdg5d+bpOznKOnrquiZZ6fknN5mZdwgJiol2x/oqeJZZylnJGXmJaLkZuRhZ2akJWCkoeOjpKJhXdrj4d2hnF8hoCAYWmIi5WTi1t2lZFnaJCOcnulmJhkeZiGgXeXaYOKgm55f2twZWB2b2traFtmZWJib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpuWpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqaUlrigoI+co52RfoiIm52Nq5qjlaeino6XkZ6Fda6QiKaap5GWo4iburSnoJmYi4l0dpONlpOKlJGQlIyPk6COmp+mmZyyloCMnLWds4ySj7ynoX6nonqjr7eBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHalm3qHm4GXpoKBe5yxeoqFoJeZlJiWgZCWloSZmWN5h5CEjY+SioNtcI+HeYBxgIGFf4Z0hoSWkniWaJN0oJp0fJmDoJyGmH6RiYGDmGqNjIVreHtxcGdkd25pbGtbZWtqZXNbXklUTFFARTUuWVRVNikhMDk9PjY0MzU2ODs6PT4+QERIP0lFSktHUlhaWVthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWicmKOfpq6tq6isoKiwpqeppZmUrsa9sKGWpqi1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopafoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWQiZWQipSPj5uLj5GfkpafpJaerIiftIm0mq2Kyoeqroi3hY2wg7Gug6mNppiNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmaR9l4WVsYChfKGUoJCYloCOk5uKl5GLfIWTho2Vk4mDbXORhX96coaBhHyEdIWCl4GPxWaAqYePomueg6GZgpmAi4yDiZhwjpKFaHd0e3ZnaHVwZ2dsXmNvbGdsWGdHXVFMMkU0Nk1gYzcmMzxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubCqq6aalKCjpKqjlqSptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZubmaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4uTkI2QjIyXi5CRn4+Tn6GZoah+oaeHrZ2glq6Pnp2dkYaBoI2rr4akjaqajJp+onaAmZNqgat1Tat4h42dkZuop4Cqq32DoXt6p2mef5JrZ5eGl7aJnn1uYGRZg5Z+jHtkaIpymX15lWxde5dtX1NwhFxfbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaWWfbFttiXtlWV+Df2JXUG92ZW10cmpqb15qb21saVhpT11XRTlBNEdDXms0LElDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fY3ZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWtraCcrbWiqJKgn5+mm5mOmLSZkIqejJWLdYGUkY2KppaVmJ6ef5KFhqykh5yRipiol5makYelsKailZqIiYBoboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaPp4Ohp3+Gqa2FpXmKfYSafaJwcpOHlXqdjHlth5yMmZCbqJqPh5x7gqJzdqZmnn52pF+Yen2Sc6JumLe0unOSh4F/tahkgca4e3CVt4txgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RfnZmzlXB8l560dHNbnrKDamJvc3VxaG9Ya2xyc2ZcaV5iS0Q9RDVRQVlxMz1TR19KUj08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pXYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuJmrnJOgjaS4ta6toJuinKOjpa6cm7GtrJOXoJigpJmak56rm4uIkXiLhXCAlo2Kj6CQk5Sdl32QiY6ooIeYj4qRopObmoyLqKikno+Wh4R+a3qGf32PjYOLkJGJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKaQlqirf66MfXqgmXqjk3iAc5aHjJx9lqCHm46Zm6aGomShfIiWkJuNbJ5om41umpl7gIqnfXJoc6mCnIJzqmeUml2bhXaEnWiqaoC4ZlyocIGcYZWMXqd2dYmKf55omnWHk5KYjn+fbpqQbKeZXKh+d7trfqpbjoRdtGdcbnF5d2tpW3FqeHliX2ZYYkFQRU43VkJSbjRLWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFjfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJyon56um52wqKudl6KZoZ+Ylpago5mGiYxqiIBxe5eIi5aWhJGUmI96ioSWo52KlI+Fi52RnJuJj6ijoJmLkYqAgGmBhnl/l4x7iI6Oh4+Wmn+Top+gopOYcmifip+PjHCSjIGpiJmfo6igqH2wraOiuJd2o7Oio3+IlHidequaf6KOnZuXiJdxoXyFja+1fWuakaF4fpi0o6OrqISZfJp8nJl+c6paXW97lot4nmJMfnp6hWN5l0JNn1mianF8jm2BiYSZdZt5h4mxs39/m5OndYCdbXF8lG+ZcmqkXZV2SGVjYHNwfX1uZWBsaHZ8Y2RhUV5WXVRWQFlFUWdEU1dbYlheSUQ9Qjg/QjpJRThMRFdBVlFbVkRGYlxaYEtgbX5xRUM8VV9iWmVqVmdobW9iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGZsaGhraZOdgLGumYRTX6Cns7mzs6maooycq5ycqZOhq6ShqI+enZyamZWYoZ2Wh4aJd4WBbnmVhZCai3yRk5aIcoCJk6Ccc5GQgYiYlJ+ahI6onJqUiouKfINshYVxgaGMeIWNiIeSmZV8kqShn6OIroZ9tYSOnp17pZZ5qYKWnZCKoZ19p2h2bX6Zc6BzcXydhZhvk4KufaSDpp6agaNvXqhndaNjb6VhnNOQfHqZeHJzY6KFkH6icqKOdWuPs4tggpiJc6qyqLx/d4Ntfr6mqbRenG59cZdvgXOicl2jZ3SmYWimbZvUmXyDm293eZdrm3p3l3NtqaRnYGV5cH+Da2dmZG11eGdgYlNbZVFRYUlXSVRfV1NbZWpcZFBFQ0tNSktCSkU4UD9QTVdTWE9SUmBmZWlSY3d5d0lGRWNdZFpnaVRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiXm3+wq1RcS36pr7G0sLOjnJiFmKigoKONpKigmKmJmZeYk5mSkqCYjoeFe3B9hGh9j4KUmoF3kY2OiW9/hpCTkmyXlH2IkJGjlYOOqpmUkoqFiXmDdoeAboKfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmBmpCFgZySfKSAopmGmHKehKKtromXi3+MpI2Wg66ilHa0tbXJoXOUioCfYJ2XqW15lYafmnWhh3egfpGWioBvTGajknCah3Kke3l0YYOCbH6ga3FkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1g5psdHeXaZp6dJhxUER9s15qdmt4h2ZqZ2J0dHFuVl5UWWhPUmhJVUxZUlVcZ2tuVmdXTUpBSk1LSEpOQVFKUGRjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xdXF5pYmRoa3tfXWRoY2pmb21laWxloZyJr6eEZj+UobKrr6+1oqOPgJepoqKljKWnnZylgpmXlo2XkI+bko6IgnlqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6iXjJCKgYl6gH2LeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecl3Bnp4GXjHulep+Wg5dynnaBiZSWj7lukIqiYn2ZopWIbXJpq2p1oGxupmCbaYuQaJaHmpV1ooB9mmCLhYx1b4hiaKBlnn5pmnVvY2aIgm5yolpfW2Ohbl2JjG97f3NyZKVtd6JkZ6domHOLmG6hb1OIj2+gX2SnVItdVJhtbXNrcYFtcGhreHNrb1JYV1ZmWVNtSVhPXUhYaWhzallrVlFSRVZcTFhSYVRoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2NqaXZ1XVxjaWNqanNsZmttY5ylmaZ6ZXRti6eupKmwsaafi4CXq5yepYyioZqiooCVmJONmo+Kl5COi3uHcYCIaIuLe5eac3SKfZB7ZIKHlYqKlZmCfIiFlqaPgaGrkIWPiYKKfYCAj3Noj6WEfYaUjYiYoI6IkqqnnYmmeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqSijJKEjIO8bnylr4KGhoeTlpyffKV6caiUoJZnnn5vq2OWipWSd6hsqaKBiXWHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf4ymn3effYWllZ2gaZqHdqxnnq2Mt3N3vo2kk1mDpo2rYXVyc297dHFian5uaG1TVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibWx6b1xcYmlibGp3bWdsbmKVpqqdgYCepJapqp2op66jmYmCl6uanqSJmqWdqZyEjJqOhpyRhZKNi4x0hnqIhG+MhH2Xk3R0hnKSgm1/i5KHhpSPfHuBhZekjX+lpY6BjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOro6CQgHWUloh+gXmUrqN/gZtxj4Z4kIyEf3typoxxfX16l5abhI54e35+iJSVk4p2kJifoIN6fYlrjIVbeXhxeXBobn6SiXF/dIGPk5NxhYSCZYx/X4F/i3d1c5R1b3lubodthIVed2l4jWaBgoaOqZt+dHyXaomIcIB2fIV2bWxmjHN5e5h4hFtqWHmPaG53cnFvd3hvXWyGbmlnVlpgV1xla2NVYVVfUV9wd3lsanZlamtqdnxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW5obG9hjpS5qaeLoaKapqSZpJyroqCEhJeskp2giZqmmqiYgoGbin6Wk4eOiYiNcoJ8j31+joR6l490coNwlYV7fZOLhoaQhXh+f4aYoox7pqCLhY+QhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjZSafn6Jlq2oj5OmkHhwnZGDe5JvfqiFcH2VcWtwfIGfi3+SjoxobV2Di4ybm56Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWlke4WDiIBfaXh7m3uCi4J2gYaCaHmLh2thcXKDd19zjIKJkKeVhmaMj4Nud4uEcIWNeW9lZmN5g3qWW1xpZm52W3t4d3Rtc3KCZlxtimtsYllZXlpYbHFbX2BaXl1mdH17dG9zY2trant8cnt4dGRtdGdse352enx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrGikKOhmp6emJ6ZqKKhfYKYrY2flIebopCllX97l4R8kpiIiIaGinJ8gIt2hYuBhJWKcW+AcpiGhH6ShIOGioF6gIOLmp6PgqaghniOl4iVi4udl4SDeq2CkZiZlIqenYeIoaugoqKji4iSm5yjmZaqoaemoJKbiJeOfHiOjoSnfn+SkZKTnLGmm5SekI2yk5iEpYyMlZufiZCbgoiRiWt8jXZ3ZYKFkIp8iZ2Eh4uPiIiAhYSQd3x5dZqhiIaKn4uFlH9+jIGAdnB0hoR/eIiHi5CmkISFjYiDjZCMfIeKiI+BdmuBg3x5mWpyaGBzinB9end2b3d0gV1eb4Zobl9eWlxdU2hxVWNbXGFsaHV7fHJucGRraml/e214f3Fpb3BsZoB7coKAeH99gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJybVVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmaSgnnt/mauOno2Fn5yKnpZ8eJSCe46ZiYaEhIZteICAcoGHfoiThG1rfnqXhoSDkH+AhoSGfIeDjZqckoapnoNyio+FkpGLnZF9jXuqg42Sl5WPnJeGhpunoKKanYaDkZqZmZCapqCmnZ2QloGRind8h46EpXt8jpCRhpipoZ2TnI+Nqo6RgJ6MiZOanoKOl36GjYJveIVxdGB+go+GdYuXgIOPgoaEfoWDlG15dXSSoouMhZqEhI10gIp8fHJye4iEe3mMjoSTp4+GhI+BhIuKineFh4mLfG5rfYB7bWhsbWdeeX9ofHt2dHV1e3dcYHB9bnVgY1pdXlFmbVNlWl1haml2en5wa2xka2pngH9sc4BsbHRveG6EeW6HgHaCgH2EdnKDjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlcZHVob2J1bmxUY3F5ZXB6enNlaW1ti4qft5qho5+SkZaXi5qfn557eJ2mkJuKhqSUi5iZeHqNhXuJkYOMgoGCbXx+eHOAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIppx/cIuKi5KHoKGKhYx8qJGIj5KXk5aTeIyjoaGelpp/gJCamJOMm6OhpJqXkZt+joV5gIOPh6CAfYyMj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfX+NhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxweXuMhXp7kY2DlqaTi4aRfIaHh4V1goOIh3plcnt/eHpwbGpmXn1zaHx1dXN8coBqXmB0dnB4ZGNZX15Sa2hUZFlfYWdqdniBcWZrY2xoZX+Aam1+aG5xa313hnpri4FzgYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVnRvbW5geGhtV2p0dmN1e3tyYmpueYmNn7KSpaWcjpCYj4acoJucfHakoI2Xf4yiioialnh7hod+g4l+iIKAf3F/enR1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlp+afW+LgZGThqabh4yJhKaVhZKLlpeTknaRnqGhmJSXen6OmJeOlpudpJ2Zk5ScepCGg3iEl42dfoGJjYxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZH98ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x7cX54ioZ5hZGKi5iilYGEjXeJhYOCdnuBiYZ2X3h3fXN9d2ZsZGF+aWp3c3R0fXF8YmNhc251c21hWmBeW2tkUmJXYGFoa3V4hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCDg39zfIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaEaXFuYHlnbGJqdnBmeXx6cWBybIaFkJytl6aono2Nl4eGn5OXmH13qpyKmHmXnIuLmI95e4CLfXyDe4CCgHh0eHpzfYCDf4iLgGRefYuVh3+Fh3R9fYl/fZeElpOWjKOgl35yh3qTkYqnj4yOipOgkYORkJSXkYuBj5igmpKQkXR/jZKUiZ2dnqeYl42VlnSOjopshpiPmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlrdWx7fYt+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dXiAfYeBfYONhY2UpJB4hYJ0iYd9gHN1gIeDbmB7dXpxfG9hbmNke2Jub3Zyd3dzdGF2X29sdW5vXFtfXV5qXk9dV2NhaG1zeolrX2llamNod4dtZmxoaWxogHx6d26Qh3OBg4R9c4GGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXFjh2hxb2V3aG5sYXloa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9d66YjJZ9npORlpOId317inx8gHZ3f4BwdHN6b4V8gYCKfnxgXH6PkYZ/g4Rzen+Geo+Rh5GRm5Kkm5SBfYB7jYqSpImNio2YmoyGkZiTlo6JiYyTnZOQjI1ug5COkYmemaKhl5aJlpFviJqEZ4aZjpN6iYWQinCVmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXuLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW+AfoGHfIWMiYWNlaiNe4h9fouFd35wb4CFg2NoeHR1b3tiXnBganRecWp6eHhscnBleF1tbHNtc1haXl9halpQV1dlY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoV0gYGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodIBrcm9tcWdvbGV8Y26AeXZxbHd3in+imKKooaabh4yKgZCchpOcdIGqlJKNhqCMlpOQf3R7doV3eH9yc3uFa3JveW2KdoCAhm5xW1l+kY2If4CBdnWAf3+gho+KkZyXoJOXd4l+gIyInZ6Kj4aSmJaFiZWZj5eMi42OjZ2KjpCDbYiKj5GKnJahm5iVhZeIaoWjg2eGnYqRfouDi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2xtbnB7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiXuGjXuLhoSJj5yjiHyEd4KLgHh4bmqAgoFdcnNxcG94Wl5wYHBqXm9pfHlwbW1qbHZgcG9rcm1ZWGFhYW5YUVNaZmdjdXCEgmJdam1kYmZrkm1gZmZfaGqBdXFycIuAdX+CgHh1gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3FsdGpob2x2d19xf3l7dHV0gIJ+pJWarZ+nloWMg3+XlIOPn3WKn5SShoqbjJWNi3lyeHSBcHKEc3F1iGxvbHVtiHaDfX9tblVRgauUh4J4gHZygnmBoIGRgZKSl5uRmniReoKMkqSak46JlZmShIeXmYyUjImPj4iehZCKfHKKhYmOiJyZn5uWlH+Uf2mGnYhnhqGIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpua2tsen5heX6OlYF2eoB3g418eGd0bHSHlYt/iIZ7lJBxeoRwd4x6io17iX6DjJGfnYV9fHiCjH12cGlrgYJ5X3dvbWtxc1Zdb2JxYF9sbnlwZ3BmZnN0aHFsYXdlXVZmYWByU1BOXGZlXXhwiHxeXGhyYmJlZpJpX2hkW2dwfnBrcHOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIN7eZV3ZnJqg2CIfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+Dmoh/i55/ipmTjoSImI6OjoR2dHZzgHBvhXNwcYNva2l2bYJufXxtdHNSToLfyJLWk3xwdIJ1g5+Ck3eUkJiaj5h7k3KFkJ+hk5OQiZKblIZ+lpWIjY2IkY2InICOgXh6jH6IjImcm52blZN5jXZoiZKHbIijhZKHl4OGY4yRmI6UiZaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenloc2tzi4+KgoWFfZWMbH5/b4CMf4yHfYR6go+VmpqKfHd4g5B5c21mcH+DbGp0b2hpc21TXm9kcFlfa3F3ZmtqYmZ4cnBwY193YGBWa19ddk9OS2BmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2jHx0eYaBdXZ+i3N/hn97iX5yiYeBkIqIfH6YdmVzbXxliH5ucGuAWmxueXlzYXZ6e412cneKd3mfi5uum6CQgoV3iJV+fImch4WfkI6FjJeEk46HgXR3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYSihZFulY+Un5ObgZFwhYujl4mNlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l3hoSNm5qYmY6Pdop2boaJi32Ko4SRiZ2FhV6LlJeKjoiOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFi354ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpOZkHV0eIiNdXNxZ3V5gmJ0bW9iaHVnUmBxZ2tVX250eWByY19ofXBybltjcmFiV25ZXHdNTUxkZmFednOKbVtcZHheYGRlhV9jYl5YanJrbmtydox9c3eEgXh3e4lxg4R9foh7dIuIiJWGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWV3eYaMaXaAiXJ/nIeYp5yjkoR8cIyUeHmLnYSFoY2Oe5WNf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6FipWKjZiUfI2TiIOJj3uRi4aQgn92eIODcoeCkpuWlJiGjHaHf3CFgomHmaKDlIyeg4lhg5WPhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdWF0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpOQl4lvcnqNhnVscGtyeIBfc2luXGp2YFJkcWhmU19wdnRgb2BdaIJxc2pXZ2hjaVhtV1t1TEpMZWdfYnJzhWhbXGV5Xl5kZ3tgZF9cWWtuZW9qc3eKfnNygX56dnqIc4WCfH+GdneKho+YgoyBe5N2bHZ1eXiTdG54en1YeYVxgG9neXeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuFe2iHi5mGgZKRhoeYjXyNjYGBiY18kIx+ioV6dXuCe3CGgJWZjpKUgYh1g4Z2g4CLk52fhpWPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SHfnBfc3GEfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJSPkZOEbnB6jH91bW5qbHp9YmhqaVhsdVpSaXJpYlFicnhsYWVdWmqDbXNiW2dfZWxfblRab05IT2dlXGducYBsWltjcl9cY2t3ZGVdXFpsbGNtanN2h39xb398fHR4hniFgn1/h3V5iYGSlXyIhnaJgW93eXuEk3Bte4F3XoN/dIFtaXtzlHNncoh9cpKRg5qfm6CGh3Z2lH5tdpOXfYeQg4qNmnyLmnZ9dnFvbGphdHxnYml1elpfd3x6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGnJOMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYmFdnd9gXF1hoGelIWUj4OCcn+IdYR8iZidmIeTjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4cnZzbGqNhYqBin94gYCEg39rXnJ4en2NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccGJXb3JTU25zaGFOZnR4ZWBdXFhugG9zWWVhXmpuYHBPWWtRRFNnYVprbm18blpbXmxiWmNvdmNmXF1gbGljbGpzdoKDcW5+e390dYN7g4J8gYV2fomBlpB4g4p0gYhyeHl+jZBvb3yBcWmBeXp+bW18dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4p5jpZvenNwbGpkYHR7aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRi4Vua4WSknp5koaAhJiKfId/eHiJioSWgG+MiHF0fXppeIWDpZCEk4yDf29+g3aEeYWbmJOLkpCUhYdwe5KCfYKDiYNugXhogIV4cn9/goqGe2V9foR1Y3Byf2h4cG91mI2Fgop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2OhHhub3+Ef3Z6ZWhqfXBfWXdaWHFtTldyc2dgS2x2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZ19bcGpneXFaWllrZVljcHlfaFxeZW1oZmxpcXd/h29sf32AdW+Ce3+BfoJ/doGFiJeKcYKNcXuGfHl5g5OMdWp6f2tvfnR/fW9yfHuUb26Bf3hmkoqCoZmdkYKGZ4eDb2d6lYl+f4WBmYqBfI2MaXhya2xmX2FveG1fYm94XGRrgnphcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjYx2fY9/hYGViXyDeG52h4SDl3dviIVrdXt0ZXmCg6eLg46LhH1uf3R2g3mGnJCMkJGSjIuGfnuShnd/hI2DbIByaX9+eG18e4GKg3dieYSBcWRxaH5tdHF0gZqKgH+FfnJ1fYBygXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoF5f5eLi390bmt3gIB1dVxpaHdwWVd8U1pwZUxacnJlW0pwd25cWlpZXXR+dWhZYltnZW5jaUxXZlE9XmZcXXVlX3RwWllUb2RZZHF5WmheX2dtZ2psaXB3fY5saYKEfnlugHx9gX+CenWCgYyThXCAi254foB6e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yMg5udloyBgGyOfmtofo6Me35/g5SCf32KiGt1cWdoY1tiZ3JuYGFrc2FocIl5YXN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzjouJdnBshYOHdXmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52f4B8jJmHgpOQmIiLhIl8j4hwe32Ee2h+bWuAe3ppenaBh4FyYHeBfnFkcmZ1gm10e4WUkYF8gX9ud3l8dH5tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXJ+fX6TiYl6bm5qboKCdW5dZ2ZzcVFbe05ccFxPW3JwZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWWhNQGFkW2B2YV11bVhXU3RhWmRvcldqXmFoa2dtbGlwd3ySa2iEiXx8cH5+e4GAgnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkXh9e4GRgIB+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+KdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5GMiHJyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnYF/f46OfXJ+c4R5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhrf3lzaXp2gIJ9aGB3h31qa3Rne39pdoGMkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZXVMXm5VVFlzbmJRT3N4YFJYWF1icIJzW2FdaGVkY2pkUVpwSURkYVtjcF5dd2hVV1V3XVtlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fniBgYF8dn2EiIaDcHaDcm53goJ+iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfomLmp6IfYV6d4Z7Z3SFjJB6f397iYaEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHR+d4BwcX9thHSUhnh0a2B6gnmIj2Zxg29ndm1bbX2AkJN/gHmSkn14e22HdYCQi4R0loqRjoeFhXt/hWx0dn9tZ3dlbXt1bWp2d39/fGBieIZ6aHR1Yn16Z3SFjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXh7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFtiV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kY15uYlRcckdCZl9dZmheW3tiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX52eH53gYOBe3N+hIiHg29xf3RxdX6FgomNint3f3iDfHyFh3iHfH2BfoSAe35zdnmLjp+NiXqJdnSDeV59hZmMeYaDdIWGhXeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV11ja398ys6IuaJqbW2KbHGEcXyEiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hZuIgoFzl5R3fntuiHGBiouHcZeOkIiFi4N7eX5xcW99ZmhxYm14cWprcXd8fHlcZXmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bd31xenSHfHpyZnNhboyCbHJYa193W0lua01WVV5UVXtrYU9UdXJQUVRWXmJ0hWhcYGxqZmNZbmFYYnBHQWhdYGZfXVZ7Xk9WZHBZW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eYKIgHVyf4eFjYJwcHt4d3V5hoaGi4Z6fH91i359hYSEh39+fn2Hf3x4dnl3kZOff4x8i212gHljg4eXhnOSi2+FhYF5gnRjbmpZX1tdXVRnc2VgWWRxcWaBc2JrZVdbYGl/d76ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZveImjgYR/cZmTcYB4dYJtgIKRh3OViIyIhIiEfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhpV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9a3p6gXt4cGZsYm6Jfm1tVmtgd1VKamtPUk5oTll8aGJOVXVqTFBUVV9ndoNmXWBxaGdhV2ldW2toSkVrWmJkV1lVeVpOVm1qWV1sZVxaZWNedGZtZHFncm91gXdwmYV2f353f3yFh311c4KJf5WCbnN4enpzc4WHiIiEeYF9do9/fISJjoSChHt+i4N7d3x3d5qdl3qKg4Zpd318bIOEk4Byj4JxhYJ+gX9vZmxmV11bXFtUZHBkX1djcnVpdXBlZWNXXFxof3BvcoB0iWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHN7c3x6bnt7kIV2mHyHhoOGg3x0cHJsZ3VcbWhfbHRkZ2Zpem97cllngXd1Z3CAd4F1YneEinyUgG6LaW16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpxeXlzfWZ+f394d25jZmJuhnxta1ZqYnBTS2lrT0xOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2lmYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcW2NlX3dmbWJwaXNucn90dJqBd3+Ad39+hoR6fXWChH6XhW5ydHt6dXGEhY+BgHqLdXSQf3yBlI6AhYR9foyGe36AdnujpYp5iIWEbHV8e3WDgox6boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYnN7aWhtaWBiV19aaYBqa2+AZ2thaHl4anN0dG2EgXt/fXZ1bXtoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9oj6h3gXp8kI55dW9+b3N1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXWxyX2dhaXhoe21abYJyc2lvgH55d2B3hIR4j4Ryh3FveX9yY3FoXG93ZHFziHx4YnOAcGdqeHNybHh3dXdkg3t/d3ZvZGRjbnx9a2xVaWJmU0ttaE9HUmtFYXhnYU1TcVxJTVRZZWt3e2VebXFpZF1WX1VubldLVGhXZl5YTlVsVEpceV9bX2tdXVpiZWB6aGxhb291bnB3dXqYfXeAgXqAf4eGenh6g36Bk4RxdHR+enZ0hYiQfYB9kGtzlYB7gp+Ff4d9gH6GgoCKe3aErJ9/eoiHhGxygnp2gICBdW6Hb3x/c4mAam9tZGRYX1pZWlViamdcWl51gWlebmxcYVZcXGuBZnF0fWlpXWt2dWd0d3FshXt9fXl2cmx6aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ5b3qMe3aOcYR9fn+GbmR1c2RoaFxrYl1vb1tnX2x1ZHpoXXSAb3JrcXt9dXVhdIWKeoeGf393cnV/dWFwbFlxdGJxcoV8dWRyf2xhbHpvaml6eHVyZoV1enp1cGRhZG5zfmlsVGleXVRLc2NRR1ZhR2J2ZmFLVG9XSkxXWGdrdnpkZW5xZmNaV11YdmVUSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG1wbnaDmHlygYB8f4iLhn51dYZ5h4t9dHV1gnh6eoKMjn1+hIhqc5eBeoqdfX6FeoF6fnyGiHNxj66Me3uGj35mcoh6dHx8dnJvhmx7fWyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHFuWl5XWlxse2Nwd3ZsYltscnNndHVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmVmaoKCdH1iY2lcVFhdYmOQpWh4dIKFkHhtbnlneG18hXt1iHKAeHx4f2hldmxgZmBeal9dc2tZZV1vb2J6ZVt3e2tubnB3eHN0ZHKDkn6Hgoh6dW9yfXJieGRbb3BhcXGCfHNmcYBkXm52aWRneXp0bm+BdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWUhidGRhSVRtU0lMWldpbHF7Ymxsc2NhWlpbYXZbU0tkXlhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2t2gZB5bYN+gIGSiISAdnSJdIyGdHJ3doF3fH1+jI+AfpN+cHiWg3yZknmAgHh5fX90iINzcJmie3t/iJV4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGIZVJybltaWFhgbHdjaXVqal5abXNxbHNzc2qFfH5/fHdubmxkaXFjW2pyZHR2jnNbV1NkYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGp5bG9wenx7cYB2f3J6eXlkZXVoXWJaYWdbXndoV2Jdb2hhd2Bbe3ZqaXJud3NzdGhwgZSChn6DdXJqcHxtZndXXGttYnFzgXpzZm9+W2BvcWJfanF9bGx0fnNxeGtwYVxlbGx6YWdTZ1VXUlB2W1JQWVJJY3NiYEdValBIUFpVa2trfGVtb3FhXFpYWWxwV1JQZlZXaVNURlpcT0hydFhfY21jWGFgYV2LamNkbXl4a29pdXmGe2uDfYCEmXyChHl9iG6PhnFvd3p8dIKCfIuPg4KXdHeClIWBn4l1gICBc3+BcIeCdW+il3R7houGe2V4i25ue29meHB6bHN2coxrXnRuYWdla1JdW1ZnYmxsWlxxjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bXB1dXlqh3x/fIh3kHNkZGtuYVxubWNzeIdrWlRWYmN4fX1xhV1jX2NUWmBZY5aVY25wg4WKc2poem5lc3ZzfGx6dHVveX51XmZyY1teVmJkWGF1ZVVfYG1kYXFdXX5waGlzcXNwdXVqbYSTgYh7hHFyZm59cHJvU1tmamZxdIF3c2JsdlVicWpbX25lfGVtdnxzcnNqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGVyX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVpiYF5ej25iZmt5dW5vaHZ2f39sg4B9hpd7f4iBiX5rk4hyZ3SAe3WAg32Ijn+Mk3N8ipGFh5+Ge3+GjHOAhnN9g3ZupYxzgY2LdndteoxgZHxwZnpzeWxtcXaCZ2R7bGNmZ2hTXl5UZ2Bsb1tebo1oTmptYFRWU29nc2tld2RlXVhvdGxyendybIh7gHace3prYWVsbV5gb2plcHh+Z1pWWGBreHx7cIRfYl5nVlhfV2SciGJrcYGHfXdra3hsW3ZxbHppdXNub3uAclhqbl9ZXVVhY1dkcWNTXmFpYWJsWmB+bGZrc3VubXd2a2iFjH+IeodtcGZwfG1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXZ7dWtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBVXlRddFtUUmBmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGDeoiNfnyKh455bpCKdGxzgnR/f4iFhpGElY95foyPiJGbhIB8jIRzf4FzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipGOjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aIhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYaFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3t8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKSkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHp9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZmZnZ2doaGdtZ2pnaGVoZ2NiYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19hY19cX11gXV5aXl1ZWV5iYV5eWllfW1hXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1RQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0c3V4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT1BQUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEhKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERERkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZDRkZERklIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDk4Ojw8Pj07Ozo4OkBAQUI/QUBDRkRDQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXJxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc5Ojo3ODo5Ojs7ODc4OTs6ODw8PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT9APT07S2VAPT0+PTw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz0+QD89Pz1reFQ9Q0U/PkA9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRD88PD1ATUxGSHd1WTc8Oj09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn5+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkBJblA7PWSBgn51enZTNzg4Ojw+Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1d7eVJlhIODg4R8eFI8PT89QkZBRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAWXR3e4KBgYN8gIN7TD9AQz9KUj1NRzw8PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHt9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQT9SdXN+gHuAhHt+hmJAQ0NFPk9bTG1oSUBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS0xJR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZrdX5/eYKEhYWGfUpERkRCY36FiIl+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR114f4KDhISGhoeNakFCVnSFh4eHh4eCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTFh/hIWFgIOGh4l9U22Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lKSUlISElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKXoSEhYR/gYOGhoSChoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0JAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSklqhoWFgoCDgYKCg4SEhYWGh4iIiImJjI5mREM9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3NTg4Ozs7PUA7OTk5PTw+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWeGhYJ/gIOEg4KCg4SGiYqLjIuKiYqLjIlePzc2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzg5Nzk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCaoSBgIGCg4ODg4OFiYqKiYmKioqKi4mJioJINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo7ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUF7hICCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5OTw4Ojo7Ojk5OTw/PD1BQkRJSk1LSUtMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89UIOCgYKEhYSFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPj0+PkA/Pz9AP0A9PT9CP0FBP0E/PUBAQD4/QT0+PDs6Ozk5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJZhYKChIWEhYSGiYmIiIaGhoeIiYqLi4qKiouJi14+REdJS0pJRkdHREZIR0VCQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREVGREBCPzxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERV6GgoOEhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKXYaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlFjgoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhIRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5wdXd3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLX1FRUE1OTUtKR0ZCR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUVFRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VRUlRST0xLSkRFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExKTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNHVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlVrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE1SUFBQUUtLS0hISkhFRklISUhJaXJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5TSEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQPkBWVVlbY2BWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p6fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp0g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlbXVhYWVdSUU5QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVWKWgFFlclhaV19oUGBmW1tYXGdhR09aaGdcW1xdXVdST1NQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFVYVFJUUlFRTE9MS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haW1xeVFFRUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVUUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS01OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBPTUxIQ0lIUlRVWlxtcnV2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/gH9/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlBMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M/Q0NDQ0I/RFBCQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHQ0JBREBPUE1TZHN0dXVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYltYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc/Pzs7PkA/Pz8+a1FKYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQz8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUlpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en17eHp8fHh3eGRCQEBCPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87Qkg/XHR0dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1dnp7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWEdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RV1BNSkNGPjo6NjQ4Njk3OTozNjY3OTU8Qj1ldHR2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTEhISktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNST01LSUhIRj8/PTo3ODc2NTk5Njc2NjVXcHBzeHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnZ1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2FRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo6ODc2O0I0NTY2O2VwcXV4eHt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtIRkxNUE1HL0VfUj4zQD5qb2FSUlFARlVRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF0dnp7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEVGSEpOS0VHQ09SQzhFTlNdZlNRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUhMTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l9e3p+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9PTVFTTFRVVFdXVUxMS0g9OTg3Oz9APjw9QUBCPT5FSEdERkZJR0pKQEZBQUBGSEVKT0hQUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPR0lIQ0lKTExKRkZGRD9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz9CQEA+QURJRUNIR0lHSUVCQj8+PUNCQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5KR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QEJCQURFR0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS01RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXR1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtER0hIR0pLSUpLREdCPT49Ojo6O0BCPz1CQkNDR0ZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxKTV1SSUhETUZBREtKTk1QTktNSktGR0dKTU5RTkxjbml2dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0RGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDREVJRkpKTEZJSUdGRkRCO0JDQz4/Q0NDRUdMTkdLTkhESERJTE5NSElMR0VGSUlMTktKSEVOSENHTUxPTU9NTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdKREZGRUJCQkVAREI+Pz46Ozs9Oj0+Q0E/QUNFR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGRktOT0tGSEpGRURESUlIS0lGSFBLRElNTFBNT05PT05KSklNUlVUUk9XZGBhbWdwcm9yeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkRHSkZKR0lIRkZHRUNCQUFGRkNCQ0JERURHR0hGTFFLSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DTk9NUU9PT05PT0tLS1BVV1ZVVFhgXlxpYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJqa3NNR0dGSEJCQUREPEFBQEM8ODk9Pjk/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS09TTkRRUlBRUU5PTU5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlvek1IR0hIQkJCRkU8QEJCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklJS0hFS0tMTU5PUlRPSVNVVFFTUFFNTlFOTVFXWlZaWVZaXVpYYWBgYF5oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdG5wcnN5TkhIR0lEQUNIRTxARUJFPTg6Pj49PDxBQjw/PkFCRkNFQkJHRENFRUZHR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEtNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVteX15gYl1cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF2cXVNSUtISkVCRUdFPEBHQ0RAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS05NTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXl9fYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcnZvdkpLTElMR0JFREU8QEZEREI7Pz9BQEBAREE/Qj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OUEtPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gX2FhYWBiY2VhY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl2cnV1dHNtbXNzbXFyb3R1dHJwc3d0dXV3dnV1dGVxc2twcWpydm93Sk1MTExHRENBRDw/RUVFQz1BQUNCQkNFQkJEQUFFR0NIR0hHRUpGQ0dJR0dKRklMSEpKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQT1RPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYGJeYGVhYWJnbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycXF1dnVzd3l3dXR1Y210a29wanF0b3dMTUxLTEdFQUBEPj5ERUZDQENBRURERkNDRUdDQklGQ0hKSkhJS0ZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFNIT05fblVrc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZltsdGBsalRgd3VpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXJxeUtOSktKRkM/QEI/PURFRkRDREJFRUVGQkZGSENESkVFSkxMSkxNR0dNSUhJS0hLSklLSk5MTU1MTElMTUxbc2JkcF5sbVVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXG91Z3BNSnJ5dmtiYGtlZW15bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89Q0ZHQkZDRURFRURDSEhHREVLR0dMTU1LTU1HSk5ISktKSUxKSkpLTE1OTk1NSk1NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcX3JrcWpVdXl4cGNea2ZiZ3FwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1ubm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTkxNTkhMTUlMS0hKTUlLSkpKT1BPTk1LTk1MXGhkdV1scVdsTlBRbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1ecmtoV2Jjd3xvY2BnaGFkanV5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkFCRkRHRkxIRUNDSEtISEZKTExGTUtMU1JMR01MSE5KSUhOSEpKSUhOT01OTEpNTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtKS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRMUE9OT09WUU9PUU9PUUpJTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0NFR0NJS0xIRkRHS0xIREdIUEtMT0tMV0xJRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUkpZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF1iX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJREdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpHREZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl5cXlNbXmNeWl1gY2BZX2JbYF5bVFhYWV5dY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRkVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSURDQ0VBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUFpfYWFdXmNhYGJiYmNjZVpRWVZVXFleZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUxEREtKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdHQ0RAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBPXF9hY2NjY2JcZGNiZGNmWFFVVFNbWFphXl5eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGRkdIR0dJRkZGSUxKTkVES0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTW15dXV1eX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNEQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXWBgX2JjYl1iYldfX1RQTlBRWFJdXFtcXF5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRFRkdESVJiUERXX0lHR0hERk1KUFBFSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREZBTEhDTExQT09MRk1GR0lKSEdMTE1PUElMT1BQU1BMUFRTVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpdXGBhZGVjaGNrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV1MR0hZTUdISkhHTkxRUUlLSktLTk5VTk9LS0xHR0tQU1NOUE9OTk5PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVdVXkRMUVVMTVRWUVNUWFdUWFVUXFRQZlpoaGRYU2tUV1ZVW1xbYGBhYmJiYGZoZm5saHJ6fH1+gYSEhISDg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPU0lLR2BUSEpPSklPTVJRS0xLTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1dQbUhxbnBhVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZW2BWVVd/anR1dV9gd2BYYVxcZltfYWFhYV5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExGSkxGUlZMS09JS1JYV1FOTk5MUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhlaFlSVFF2Z3RscGJuZmpRck9Nd21qcnBzcnFycG9wgV1lenV4cXF6cX5zfWt1fWJSZ3xlc3Nvc3N8fW99eW9/cl9gYGJiWmBgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIB1fH98fHNzTktGYF1HQUVNTUhLSkhKUE5NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHJtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdzUWh6bWlqenp9bHh6f29nb1h2dmp1dXCAYHNofGlseHxvXl9fY2JbXWJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN1em58fXl4cm5NSlN0TkNCRVBQSEpLSkxQT09QTVBaYFpYS1RXUGFeUlZRWVNNUElTVFZYV1dQVVBPTlJKS3JvdXVxdXFkaGBWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnR0cWxtXHR+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUVFQUVdcWVVOVllVZlhSUlleVE1OSVRUV1dZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhlfGlye11US2xgdnVraXV7e21+eGt8cF1eXmJbXmJkZGdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0hKS0hJSUhSUExOT01MVFNTT1RSV1JWVFBXWlZWVFRUYWBRT05LVFRTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VSU1dbV1hXWk9TVVdXWFJdWVddVlRPWVJXV1dYWV9bZ3JeW1tZXF1fY1pfY2NkZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hvemhnZ2t1amhnaWxRSUtMTE1LSlNRTVFQT0xWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE1WVFFOVVNOT01MUVBLSlFSS1FNS0tPUlRSUVFTU0lITE5PUVJRUVFUVlJYV1xXU1NRUVVVVlNaUU9TUldVVFlWVFlVU1JVU1RUV1hXXVpeYV1cWlpcXGBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0xPT0xNVFBOU1FRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1dTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdbWVpfXVVYX11eXVxdYWFeW2JiY2hmZWRiWF9gYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UT09TUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFBOTVFRUFJYVFFRT01PU1VPV1JUVVVPTk1RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZYVFdXVFJSWFZVWl1ZXV9eVl5dXmBcXGBgX19aYmJkaGhlZGFZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlJPU1RRUFVcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlJXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltcV1FUV1VXWFVTWFpUU1FaV1ZcXlpfX2BVYVxgYV1gYl9cYF1jYWNnaGRmYFljYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9iXFlgWlFOT05WUVBUUk9VVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUktRVFNYWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFVWXFxWUlRWVlhZUlNZXFRSUlxXWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGZpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZWl1UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWBdYmNeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWFjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVWVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hXVlNQWFJTV1NWVlVbXVhbWVVaXlhfXllcWVJXUllYWV9aWlNUVlpZWlZXWVxWVVpdXF5hYV9kZF1eXV1lYWJmZF5eZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eWllbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UUlhSV1ZUUlRYUlNWVFlYWV1eWF1bVV5fWF9fWF1WUVlUWVpaYVlcVVZYW1paWFlZWlhWXV5fXmNiYWVlXWJcYGZiZGZkX19kYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWl5WV1tcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWJgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWVhXXFtcYF1WXV1TUFZaVlZaVVhWWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcUlZYUVdWVlZWVlRWVFhcXF9gYF1gXVdhXlteXFteWFZYWFtaX2BcX1hZXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pYW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFpYXWBjZF9SWFlQWFdYWFhXVlhWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1tgX11fWVleXV5eYVxbWllcX2JfYmRjZWZlZmJaZGZnaWdjX2NeYWZkWmlpYmZpY2VeYmJjYWBgX11dWldbWVlYWFpYV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXFxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYFJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVteXlpZVVhdXV9gX19bWl5eYGJjXFxXW11gYmFjZWRnZWVmZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVhXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXFxeW1hdW15fYWNiYWFdYltiZGFfY2NiXVxbWldYaXFgXGBfXVxhY19eWVljZWRhU19aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXV5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZGdmZWZlXmVmaGhnZGRgW2ZnXmFoaGNoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KBgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+vcrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzL2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6enp4b29wcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3d6enl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x9e318eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX19fn14eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx9e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwb25ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t7eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHt+fH1+fn5+fn19f39/fHx9gIOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgH9+f4GAgIB/gIGBf35/gIF/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+foB/f4CAf39/fn9/fn5+fn1+f39+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+f35+f39/f35/f35+fn+AgH+AgX9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f4CBgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4ODgoCCgYGCgoKDgoODgoODg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoWFhYWGhoeGhYaGh4iHh4aGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpGSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoeCgYKCgoGBgYKBgoKDgYGAgIB+gYCAgICAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYGGmoiAf4CAgH+AgoGAgYKDg4B/f3+AgICAgICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoGDhIKCgoGBhY6djIOChIKBf4CCgYKCgYKEg4GBgIGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChoWEg4F+fXyAk52Ng4WEg4eFgYCBgoOCgoSDg4KBgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgYKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIWUi4V+fH19fnuNn4uBgoGBi4t/hoSCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+NjIiEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hp6Xh31/gH6LhYCRhIGDgX+PkoGTi4CBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpOSjY2Kh4ODg4SBgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICEnKCIgYyCfYaFfYKEg4SCgZSYgomIgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4WDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGUn4WEiISHgYB+foWFhYSFjoV9fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTk5KSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4iQgYKBgoV/f359goeGg4B+fn9/f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgICAiYR/fn1/hYF/f4CAf39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpGRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4GAgIONhoOAfn6Af39/gICAgH9/gH9/hYWGiIiIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgICBhYSCg4KBgYKBgYGBf3+Af39+e3qBi4yJioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkI6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KAgYSFhIKCgoKCgoKAf359fX19f358enyPjImLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4OFhIOEg4KCgoOBfn1+fn5+fn59fX59fX6Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomJg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4ORkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgYSDg4ODg4KCgX18fX+Af35+fn18fX18eXyDhoaHhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+Bf3+Cg4ODg4OCgn99fX+AgIF/fX5+fX19fXt6en6EhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIODg4KDgoOCfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9+gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4OBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX1+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af35/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+f399foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f35+fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5+fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgICBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4OBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgYSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICAgoGCgICBgYB/i5SPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX9/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH9/gH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fXx/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhoSEg4ODg4KCgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4B/gYGAf32Af39+f35+fn9/fIJ+fn19fXp8fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f4B/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f39+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYqJiomFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZKMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iYJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e319fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBhIF+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH2JhoaFhYeFhYWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYF/gYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgX2AgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf36AgX5/gIKCgIGDgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SEg4KEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foKEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHt6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+f4F/gH+Agn+AgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fH17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoN/f4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhH+Ag4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBg4GAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx9fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OEhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISFhYKHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SAfYF1gXmDf39/foSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhIJoenJzc3yAcoGDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmGcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHem19cnN2c3ZtbndscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH97f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISEhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImLiIaEhoWFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXp5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aHhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhIGEhIWGhYWEhISDhIWEhoaGhYaEhoWGhoWFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhYWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fnt8fHt8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4iIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoiGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9e3t7ent8fHx7e3t+e3t9e3p7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYWCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH1+g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fn+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dTV1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vc3Nzb3Nvb29vc29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyNiIGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWV05DQ0NDQ0REQ0NDRERAXNLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWltTSEhISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGVlXVNUVFRUVFVUVFRUVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMzMzLy8vLy8vLy8vKy8zLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/Pz9HTz8/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K4n9HRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdWyl5i4upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3MnaOosdGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwsWIm7bV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8vXpZu11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjU1aKatdTUr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCewteimbXU06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/aopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp602aOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecy9eim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbVsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz4+QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PTk7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODo4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Njg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfn5+fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ozw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzs6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+goaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0E+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmZeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT06Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZyanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqamqqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqraioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT48Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxop+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKShn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopqYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7G+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLWzv8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBy8vIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8OT5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJvLrV1snMyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4uby9wcfBxrnKypzBxsPAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq7tsC52pt+vMK+wLy7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbi9ycqDhKXHusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhxbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube3ube6u7q7v9Gpe3+Jur/Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyYnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wtrmyvb67xLa3t6aYp6antsTIjHl+hbnJz8LAuK61tby+uLqyvsTEysXBysPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZmxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0A9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yqqqOwutHTtLu+vMW6tI5uaHBja3mfrHt7goW70dHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Syxtm8vbvHrY54Y2JqTlJaYH55f4WJvMrMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLi9aXe9zr+4r29ZYmRTbGdTUVFbc32Ej7vDx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKSen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bnN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7trvBwHRpfau+tnBWSlZqSVqBd3NUUGZ8hZq8vb/GwLnAvL7FxL29ubKwrri3v8PHw8O8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX99dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJDQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5yb96d2l/qZdWT0p3dE1RbHmDe1BUgomht7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKOoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMjAg35zcZNsT0hciWhPT0+Brn1dS3ikqLGyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fEu4yDe3h+YUlgjGpeUU9ega6OXlBOe7a2sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4usGbjIWJflNNiJ54alpWbF51h25veqW8trG0tbK0r6y7uri2usDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO8qpCNlppMVYq9ZHuCiWdie2pibXagvriytLOwsa2wubi2vri7v7Kysq6xrrmvqqutrKOooZ2enpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrCkmqSdTGB+j3lseX1jYWprdHltgqS3sq2zr66srra2s7y1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKekrKm0v7Ozb2GFb2lpV2NdXlNUWWNhXHF7oraqsrSuqquvsLK1raWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpsPDkFV1bmZvZldbUUhFR0lMS05hZXuzr6+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp27soN9YV9tYVRIRlFLSURJR0VKVVlcpbKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKbopueo6ehf2doX1RHSVZ9fmhTR0NCRkxQU4qxrqyvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmJ6boaGhj3dqW1FKRkxxoKegbE5FQkA/QlSDoKuqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHlnXFJNS0pSjdnZwI91ZFZJRFORrKitqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJ5uVk5MTk1WZ6HQu6CXuKaQiZiuuK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Nob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVYE5GSkxWa36nuKqGjNTWxr+3qJ+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelFxKQkhMaHmpuKGQf7HLu6+pop6cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKJsSkpMVXWizdK7oaSzqqOcnJygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Sw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BkcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGsgWVydpCz0dvRva+pmZWYoJyaoKCem5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1eVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGloYKKkrTS0tXCraagl5aYmpucn52YnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NjU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp4FsiIfA1cywm5uWlJebnp6fnJSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vcnR2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKxqaH6T1tCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0c/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWlX213qtSqkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxczIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKylV5wd7i0j4uTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4Zgc4OwkoyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL66uMm1qbGGaHOTnoyGiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFfZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqqyptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fOwcPGv8TEw8PKwcnKvr+8wLqytLTDrqmviWtjiZOIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RiYWNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+4ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62oqIpjZ4uEiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmyr7q6sbakoKSfprGnq6i5qqSmp6insq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsoKKNYXuHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtru7uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnqiqppeeiWWDhYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgm5murq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lpJilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnpmjqJ+Smn1ogIOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkuLCkt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqetsrClq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r66vqJuYoKeTkIp0e4B8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrrKaYl56ii4hyfYh+dm5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Geraypqa2soaKilZijm5yQq6mwm5+in56XmZOJnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdQT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLTE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJmam4h+cIeDe3RpaWlsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6QhJGHkJGPmZOVk5ybo5yboampq6isp6impJmlrqSUmaWvqZ+bmZugnq6ZnKuzoKWmn6KjoZWTm5aWkqmqrZqcoKGgmpSQjJmOjJGMkY2WlZCdoaCjnJujlZugo6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhTVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqairt7asu8q7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSWl5WGeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKman6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThomNg4+LkpWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqbl5aSgn52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVhcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omqGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjYCQipKSkqCan6KVlJiZlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaWzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZnJSShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50io56kIeTkJCdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxcIWNfYmBkY2Pl5qYk4qPiZyIn5iIh5aemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaijqrCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH2KiZWLjZGSlouEioiVhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivrKq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjICUg3yBj5iVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhhXF1KVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppayrsLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaWFdUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM1MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsa+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWf25pbm9uWFVXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZVhRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6e7r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXltZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKyoqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHN0ZWdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3NybFtdXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3GDnp+RnH92hYWKj4iQaWhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH96gol6em9na3h+en5yamReWlpdalxhZl9ZT0tOV1JRSFBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCjqGflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gIGBc2FdY15aZmtca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp4en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJaPjoGIbHNyfH98cWhgXGBeYmdjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFg4aJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVUk5TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKynqLSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikiIWUpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiZiZKKlnp6foV+Z2BoXGViXWRjX2ZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLO/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq6orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebtqmMpI6Rk6CHeIKDdVlhZFZlYWFjYGFlX1pVSkRFTFVRSElKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxWT15VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWwrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6CfGpXYmFYamVqZVdbY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNz9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAinp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWVRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu8wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oauonpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBf3FfYWFcV2FfaGZSWGFWUlVJRUZOS0E+R0Q9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5KWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1fbl9YZ2VVWVRKREFLSkhGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6t7m2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSgn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXV9bWF1hWWNjUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjZWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHta+5sLC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1hmWlFdV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaYFwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW09QVFBOSD5BRkFCRTxAQj5FRT4/Pzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yMk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWuAc3Jpb3F6eXJ7vsuafoyyg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbiqpbSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2ZhICFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSXFBKR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlth3Z0b312hHV5e521jDxBi8alfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYOEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZGR0pKRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoOJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eBbo56dHd9fIJ1f3yHiLB0WKnCtoySgnBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+grZyimpmfpZ6frJmLmoyRko2FfYiHg4SLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy9DJw9HK1NbY19jX1dvX09nb1s/b2tHWyNXLlXl7aGhbWVBTU11IQ0VJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg2REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgm+ShHR8gYV6doZ7ibfGpMLJuIGWm493cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYyBhpd7iIifl5CJjYqLgnyhiZCLvKGXk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NbZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A9Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz09QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKScfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eHdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvoIuRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNiYqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqfb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjISnkYSZk4SZjKKWoJmTiZqdopKpr5+RlZCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmWk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSs5mMoaGMpJuvo6SdmJCnlqeZrK+kl5WWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmbOWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdo7ikla2kl6mtt6ako5+ZqZepo6+wqZqZnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnZm0l5arnYuclJKNkJKMmZuKkZ6Qi4mVn6GNlI2Ymp2Tm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FQz48Q0FCOD84NzU+Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2i6eyra68qpu7pKitubirpqaioaOjqK+ysaqcnKSYmpeXnqKlpZKkuq6pwLytrbK5paSnfYiHnKy9sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqWnaeasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydkp+dm5igoZSanqempKKksLKmwcbDr7C6tsXEwr7NpsfDx8O81dHNxMqIdHNiXFlfW01KQkxARUc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2roqKdp6qutLCqm5+qm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrDxKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK+djKqcjZWPkpGUlY6QlZGPoZSGl5+gsp6UmpSgoJikn5qgm6CUmJ6mpKampK+tpcDEwq6ot7XJw762zrLEvsS8s9HKyMK1dXltXFhcaVNMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KCkHmNoZaompqYur3HyMnB0snKws28wbOtu76nur+9vMS3rMGprLO7vqqwqaOlo6yts622taCfrp6lopijtLypm6i9waO3t7CrkrCtq6yXhpqqpqWRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWUo5+qn5GlmoyPj5CVloh8j5WSkqOalaCinLWmkJ6XpaOipZ6dppielZebpaOop6KyrKi8wMSvpbO3zMC5rsSzu77BuKzCw8LAmW15YVhXXFtLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipB/lqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psbeanq2ip6Gdq7e3qaWwv8Sxvrmzp6q1s62ulpalrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52Zk6GjopyYn5mLjI+PnohakJaXkpalmWWYo56ypZailqysqqebnqaXmJeYlaGkqKaftqupurzDtaaztcvBuKm2rLK6uK6ot7q9uIJsblpXVFVORkpTTks/QUdEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCUjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbe4t7KxtbO4s6umnKuruKqop6+wl6OvpKekpLXAsKqstL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCai42Plp1gSpacmpWapZZUlrCfr5yfpZSvrqylmqCllJOZmY6cn6eimbSpqrO8vLyqsLLHwLilq6utsbGjobGytKRwbmZcWk5QS0RQUFBRO0dKSUdIQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZePnqCao6S1yLSpxrrCw8fJyMjMzca+u7OuubjAwc22yLrBuLW6sK+vs7Smo5uqs7SqqKatrJmkrqWkp6y6v6irtbe/wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqaoqeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq6lpJ+lqJKSmZyIlJyinpaxpqmrura+s7Kuvrm2oKOnqKWnnJusqamMYmVhX1JLTUdITklVTD1MRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauUnKGfu6+ZlJ+Lk6qbkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqKZqrS7pqmmq6qdqK+no6qqvrunrby0t73HvLe1uMGxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm52mnKiqnpmWj5Sbi5eJjKWilJ2inqC0r6Wlk7Crmaurnp2ko6iRlZWgg4+enpyVqaSiobS0urWtqLWys56coqWal5WYqqGed2BcX11KSEZHTVFJTUVGRkJSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5ekl5mpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqsraCgmqqqxKKlqKumnquvrKKpqL+3pq29sLe2x7a1uLi/sb/BtrSztK++o5ejlpSclK6gkaKipaOjn5C+pamdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylnJWyp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ2drqCTo5+WpaCmqauXtrGjqrK1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lo8GloKqtn6Spra+ipqe9taWxvLi2tsOys7e5vrLDwLe4rrO1taOdpZWSlKGuoJminamoq6Oaw62pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtqOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZiew6ilorOhnLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrLOzwr+yxrO6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7yypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSco66anpuukJ6Tl5SagJGhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+boMOopKqyoaO0qpWzrKeipLKsrqm7sqywtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpifppetu7SbqLCbrZ+utLGnqrmyp7qzt7K5wKq3ssK8tMWnvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqaSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWVnpSMj5yelIupqaqhp6CYnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOcoaa/pqivsKGptaudubCro6q0trGwubevtri4xb7Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeQqrmpoKewnaqgsLSyqqm2tq27rLOzuresubDCur2+psOrsLevqaurp56YmauioqCRmKGxr7OrsbqbnKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWlpyTiJCbmZSOqaimn6Kbl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKGpvaGqr6ujsbippbWzrKCttb2us7i8ur22tsDDv8jEucTBwMC4xL3At6+1p6u3sbu+v7SprrG2nperraitlqeojqe7n6Sts56rorGws6yptrS1va2vsbWssLWxwLrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqquzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5iFlZeLnZmbk4qNlpeal6akoqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakramlr662qq+1uqemsLfFt7G3v8DBtbS6xb7MxbnCv7q/ucO3wLixtKupura6ub60qq2xtZiYp6yqq5usq46rvZ6rrrGjq6CxrbOurrayubeqra6xqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako2ipaeyqaKnsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5yTgZOYjZ2cmpWPiZSTnpqkoaGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkq7S3ybq0uru/vrS0t8PAzMi7w7y2vb+/t767sLytp7q4t7bCtqutsbeUl6auq6ejsaqUr7ukrLKyp6ijsrOwsbG1sbizqa6rsae4r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpaWlt6eisrSsp7KnrbC1rKWZoKyom5ydm5SquJyUjo6LmZyil5CYpaGelYORlZCdnJiWlIeXkJeappujoJKWkJCVdoSQh3uFgYSNi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1uci4rsG8w7ezsbXCws7Fv8G9tL2/v7q+u7HDp6m4sLa2v7yvq7OynJ+nsa2mpbClnrK1rKuysKypqLS5rLSytay0raqsqKupuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6KjkayepKCfoqqlprmlrLW1paqrqKyvtq6jnaOpqpugmpqSpLSaj4mOh5GioJWNlJ2glJKFjpKSnZuYlZOGl5OVmaaanp+MkpGOkHd+jYV8fH2HiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFlnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrb3Luq7Au8extK20wsLRxcW+wLK9wMK8v7e8xKest6yzuLzAsKuxraCjp62qqKSwo6qxqq+ssK6vrqyzu6e2sLKpsqmrpaWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaGnqaKspaOtrLixsqCpoqCrr7Csnp+nqKmZpJiZj6CnmIaEj4qLnqCPi4yVm46NhYeQlaCdlpiVhpaTk5ekm5yci5KQjYl+foeFfHd/h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1BcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9yLuxvbfCr7Css8TDzs7Dvr+0wMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaW0rquwrq2xsLOts7ukuLOsrK6nq6CinrC3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqukrKKfp7G3ra2jpaKbqquuqZ2ipaSkmKCZlo+YnZOCg5CJhZ2gjIqOi5iNj4qDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gISCfnR3jKSIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7Wlsq/EycvRv8G7ub+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+rubCosbGvsqy2qra1p7S2rKykqauco560sqiopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6mdnKa1rqimqaKjmKWmp6qcoqSjn5mYn5GOj5mOf4eNh4WenoeEioqNjI+MhIaUopqOjJqRkpGPkp+WmJaLioN/dIaBf394dYN/e3h/gYidj29xZ2dxeFxgc4hqT16ZVkhteFVkVlFiUE1VVFVRT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuVjrCgpauumqylra6ztK+rpa+pqLq+vMCwrritobavycfI0cC+vbq8wr26w8G/v66ysrG1vLzCsbGzq7OopLWppa2zs7mwo662sa+yuqu5rqqutqyqnqmsn6Kgtq2ooZ+vs6G0qp6op6qjq6GirK2ova+srq2hp6ifq5mQr6GYoqGop5+ompmqsamjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoWEpJeFgoKLho6NkISEk6CWiJGdkJOQjZGclJePiYWFeHSBf311eHmAe3RzemmBhqN1aV5la4F1Z4iMfVNYcF5KeHNTZFNRXk1NUllmTkxWWWVZRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExoOjQ4Xz1hZD9GMUNQW1srSE45VUE0kI+xn6SmrKSnpKymtLKxqqSwp6q4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0pqessra5s6enu7Wttr2wvKatrLWrrZypr6Ofpayrp5yeqrOks6iaqqeppKmeo6mnqb6rtK+unamkoK6cm7KjlaScpKWfpJqaqKulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4KAiJ6Phn99i4eQjpCEf5Obk4WTooyUkouRmpGVh4h+f3F6eX58aXh8enVwcH1ohXiEiGRhaGNyhXptZ3ldXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9HakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLO1sb24ur62rbm2v62hs6aqq7C1uLWrnry8qLLAs7qgr7O1qqyfrrCjnKWoqaOenKWxpq+gn6qpqKKqnKSooK28qK6wrqGro6Sunp6tppefm6GjnJ+bmqKqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5qVjYl8fouGj46MioSSmJGHlKOJkpKHkJmPk4CIfHlrfXZ5eGN7enFwcXJ4aIB0aoNnZGhhbnOObWJpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebVdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQmhZMTNTPWVfREw2S1dlTyo8M09ZPSOSmayZn5inpKKfp6O4r66jr7Cpq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSnqKqwrrmxqpu7vaSwwLW0oa63taanp7GzoJ6kpqehpZmeraeonqCprqegp5ikqKCwuJ+jsa+hrKGspJymp6mampufo5WdnJqdqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfHyhjY2IeYOMhImMjIWIkpqOiZWfiZGVgouWjJF8hHtzb31xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9gW3Jqck1NfmhYWk1QTEpIUFJQSU5cX25URFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52lmJ2WraCgoaSht6uxpLO0qqi5xLWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKersK2zsaeavbekrby2r5+xt7CopaewspugpKCkpKGXnK+moZ+ip6+ioKKTpKSjt7ChprGrn6yjr5icqqWpnpeanaWTm5yanaarmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6Ei3qPl4qNhnmCh4SIi46FjZOYjI6WmYqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3OAX1prdWlaSX1dW1hPT0pISFJVRjI5X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcSzsK6ita+srq+0xMS9s7+6t7Czubi6uLuursCztLivv8G4rL26taais6qnqbOrrrKim8G2pai1tamesruqp6apsKyZoqecpKaUmKKypJmfpKipnKKgk6WgpLmopKeup56loaiSn6mioaCZm52gkpqclqCiq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV9nY2Ki4Z5gISHiIiRhZWTkoyQlZSNjpR7g5eOind+e2x0cmxsdGJ4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXtjYFNzVFtbU0xJR0lPU0AhKmleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPAtrCsorWtp6+vuMDAvbHBt7Gusre2uLe2rKq9s6+ysb2/t667u7Gln7arpaW0qauuoJ/Cq6ilsLOqrLS6naiqq7GlmJ2qnqakkZmmraKYnqSpoZyinZegnae2pq+qrqGhnp2hlaCmn6KgmZuZnJKZnZSlnq2jmJeelZSOlZiMj5iaqKCRiImKiHmFd4KCgp2Hi4KJfH+EiIaFkISWlY+OkJGRkY2Se4OVjYZzfn1meG9ra2xodXNrY2dkY3R/YmRlZmVpamNpcVleWF1tZGFOaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSUdFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxZSlZiZkE7M0FmSCU1m6SgkYytoZmYoJaltLGisb63obHGu7mwsaO2q6uuqbm9vLutwLKvrq22r7O4s6iruLGurrS2u7avuL2tpp21q6ChsaWrr5+kw6CypK6xr7ettZ2tr62uo5mcp6qlnpWbqKWfmaWip5yaoJyUnJ2tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUm5ySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYmEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnluaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaWZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsJ2ak6GaqbKwn7jAtqC0wru9ubGltq+prqW3ube4rLuvraqrt6q0ua6lsrWxrqmxtrawsrW6p6iftqmenqqiqq2cqcCYraSusLa1rKyesa2wqqKbnKOsqJuVnKejnZqpoqOVmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielZWfkYmXmYCXi6CPeYaTjINtaX53g3FshouGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYRmXmRmbmxpXl9fiZCEhmhPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNjAxLiouKi82NjgsIzEnMjE0OjE3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbCbnJOgm6qtq6O9xa+pt8K4vbytp7awpqukuLSys7C5raqnrLSmsLWjqLi2tainrLayrrSts6Kpn7SrnqKknKeomqy8laalr7O4ra2kqK6rrKWhnpygqKebmKGmpZubp6edkp+gmZGeqKqjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOSm5KIhHJ4jI6EiKF2iIxpl4hmfXN4oW+Ih4R+jXt/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyhmiHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJysnZmZnZ+rqqiqv8Ousbq8t8C+qqS3saqsprO1rq+ztquppbGtpbWznK21trSlp6izsa2yp6+fqqCyqJ+ko5qipJyutZWkpaa2vaasp6mqrKimoqCZn6ajmZmmo6SYnKSplpOinJWTo6WmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4FxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ+XnJ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrSop6a1pqe4r52zsbWqpaSnsa6tsaaqnqeksaSioZ+XnKCfr62VnqKftLqiqaigra6lop2bmqGon5ibqKCfmJ6np5Gcp5uUnaGno6Cwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBmnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYGVeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSUNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKelnqOkqrG3rbS9vrC3xLK4usKnqbCsr6mpsa+ksLqwpKWus6OpuKmes7Kwo6Wgqq2vq6+mp5+jorCco5yYlZibna2ml5uinrSzoaqboa2toJ6al6CiqZyZnqSgnJmhp6SQnaObmKGfrJ+mpqCboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZR+a4GmeoGFiJKUknerZ2qxW6x7j4eUdIhwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1U5KGXlCpbWNxfoeAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqGuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WlprKzp6Oinaeqsqiwp6WeoJ+vlp+ZlZaXmJ+topqapKi1r6Gpj6moqZuelZigpaian52jn5ygoqWjlZuemJqdo6ubppmbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+utqibqLquoq+xoLO0sKCknp6nqbCotKmlnJ2eq5eZl5eXlpehqp2al6itsKmjn46soqeWnpecoaWhmKKhoqGaoqKnm56gnpWZm6agnKeUm5qfoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4dil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOfrLCkmKa6rqSxsJy0uKqgpp2hqqSxp6yqpZqdmqmelpWYmZOToqegl5OmqrGmoZaSrJ+lkpShm6Smn5WbpqehmqOfrZqgnp6QlpyinpyllJyVmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQVRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgtKyfoKirn5WntqyosLGrrbSkm6mgoKihtaamqqOZnpWloZSUnJmTlqOlm5OQp6yvpqCVmKmfoo+RopmopqCVmqapnp2knqydoJ2gjZSfm56gmJmclpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQiJSqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpMdF5jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljo+MTAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGknqWnp56TqrGpr6q1rKuvoZihoKako7mio6uhl5yRoqCVlJ+alJmgoJCNjKmwr6adl5qnpp+NkqSXqKunlJeqqJ+foKOto6CdoY2VoZifoJKdl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5cp09iUmtlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qqoJumpKGdkquqp7WjsqiuqqCXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOlmaWso5GXq7KkoJ6oq7CZoaKPmaKXoJuWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGtaVltqel5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0E5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaKeo6Gcm5GqpKqypLWnraSflpqqmaasuJyirpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZykrZ6RoKirn5ygqaSznqKkjqeilKGanJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3p9iWeDeW15YouscHWFf1lbp2pFZFpUZmBjXWJRZ2dxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/pZa0w7Ssqqesq6m7rrDGr7W0r7intbitqaOipp6gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnaSkoouSkqabpaublqikpZyboqmmpqOooJGtnpainpeXl52ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboN8e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdWlxUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSktaqlm5iVopumrai+p6mmlpSblaCak5ilqaeRnpCPmJywsr+sm6aep6KJk5Gqmqikmpurn6OZm6OnraKfqqGZsJuUpqCXlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuKanOBdIN1ZHd9dmtwe21gY1xwaE1ZWWVqX1dZb3ptbWZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqSlnKSVlqCrpqyjo7esoJmWlqCXraqlwJ6rpJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6qnJygrJihm52ipa+moqSnnq2YlqadmZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeWZgaWRjZGZqWGt7cGlqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4vKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCmoqGdmZeopaimpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqedqJufpKuUnp+eoKquqaWiqqGtm56foZilnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iIj4N7aoVYXmt0ZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLyorJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZefo56hmpmmqpuso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4pKKnr56elZ6jnqOco6mokZ6hnqCqr6qroqmfqJulnqegrJahm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3eRg46AdnmBf3lxen+HcXiFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYmqKgnJuqp6Kcq6KlqKSktKSdo5Omrqy3s6evopKRmp2lkpGgoZecn52Hpqukq62/wLChqa+pl5KfnaKZoqOqo5KgoZ6dra6prKWjoqagpKWdramRpJupraqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ5lZabX66PXo6ngKGhfaeWm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2mErnR8loe4YYKtWaPNbo91e9t7f5lwfoiSdX9le4d2dmt9iG5+hZGSfm2BjmBxa3BmYF94ZFtwaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqorbSrprKsrKykrKawqqCnm5qmmJyisJ+hn6ino6ahnrCsm56Wpq6tsauorKCUkpufpZOPn6WXnqijnq6kq7Cov8azqKmxrpaSnZyil6Cpqp+UoJ6cna2vp6qpm6emo6Grkq20lqaiq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYWoh3GxfJ1xrH6hn4Klj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkI9lb3R2b2BmbWRfb2lpbmZjV1NcYVpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXVxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnICc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6OhrK62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin52wrJeblqinr62op6mel5Sao6KSlKGtm52mo66so6y1qbnNsq2mrqyWlJydopifrqydlp+ZnZ+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WblJKFpGqkdYl6qXR6snCCpYmZjHCIoJqHpF9gUquEf66Cm3augaeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb255eHdubGZlZHFwZntoY11XX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+inrC1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kdm5OqpLawrqCpm52WlKejkJqiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqgk5yfp6uro66arKiioaqis62iqrOxoZuqqK+vtqOTl6SnmJuRfKpsnoSHdat5fLBvgqSLiZ+WlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXSZo5WnqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6TfHCXkn5we3V9em1cZmpycWaBal5iWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylopyyuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdprWeopeTp6q1sqybppyglZClrZGZnKejoKqnrqGjp6mwtMKys6qtqJOJmJ2kmqGjrqSWoZWYnKWmq5qvna2opp6so7esobK5r52br6eztLOllZiopJqfjoKdTniagX+feoSjfIKkhIenn5yek4S4fHx5uYJ+zMXCtniboZCLn36alpeKdp6YiqSYo6h+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjl3x+kpGJdXpzhH5wXG1ud3JqgW9aZF9obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJyhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6GptLmkm6Oeo5OQobKZnpynpqGir62dpKiitbHDsa2qramRh5GcppyjpJyklp6YmZmlpKiarqGtpaaYr6W8raK3t62enrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmqZo5yViZ98mJmGh49zr4Klm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph+jIySi3h9eY2BbWl3aXhzbn90XWRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqbO0pJ2mnamSlJeuoKCep6Scp5y1mqCqo7arwrCpq6qhjISOm6GgpqKVmJmcmJqYpqSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqaCiloWfgJmVgHuSfquAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaaZg5SNlot6eoKWfmttfmJ9dG5/emBnZXFvZ2doQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXV1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qZraGQqqmklomakK6wrKafp5usmJiPrKKhnaaimqWcrZifqKa2qL+vpamknoyAjpuaoKaekpSZmpOamqWko5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqaqZdq9+kIuchYd9uq6KmGWwjGWVrX2hj4OnlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgLFsZ26Zl4yIsVt9tFukg2vIomWfgHu8WXa1WrJ9Uq+AeqxYgKFtmI+omoqXkJWWe3iNnH1kc31ig3d0gHxhamZwbWZlZU9VY1tBVF4+SSg+OT00ISItJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCunaubla6poo6Im46vrKimoqeZrpOZj6iaoZ6ln5qjo6WZnqKpsqi8r6Sonp2PfIublaGgmY+SmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmJCBgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srDHg2qrsL2teHeivrt0gJaOppyPmpCVnHmBkJp5Ynx6ZIxmeYJ7YGtla2piUGJbU2pcQFRhQk4pPTo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6trqWmlZSvrJeMg5qRr6ajrKGknKqhmIujkqaep5yaoaiimZ6gq62pua2oo5uXk3uHmZGmm5OPkZiYjpiTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ62Pio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqb1ldZ353pmBicY6Sb2ZkgI2SjqKYl5iQlZ58h46UdWWGd2iNanl+eWRsY2ZsYktkWEprWTpQZUVSJ0s6KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvraqnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqhn6OjoJGMpJKnmamZlqOqoJacpaWnr7qrrJqbkpJ7hJeNpZeNkZGYk42YlaeUnpeoopqwpp6irLqfsMKopLOmrLGyq66sqLmkr7iWiqGopbadiZaimIepmpCUnZOqs5mbo6ygspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4t/dIJ2dIiMcadtfJWRlJOBgY+Pj4+dlKCVl5aggoeTjHBoj3Zwind2fHpqbGRkb2NVYFlAaVpHYmBPWitGPSsmITc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01PUFFXVFZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLu4qqKlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqukoZmnnp6TlaOXqJupmZSmoaSQmqeZobW6qKqYmpCNfIGUjKGUipSRlZCQk5elj56ZqJ+ctqOdp6y3p67CrqO3pq+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaOxqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMhnWGdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyWoIOHl4Z5cZVyeYl/cXt/am5kX3BpYFtgWW1iUGBjUFs6R0dEPTI9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7uvrKyhopl6naKwpKWxqZabuKailJmpnI6GiombopCunqOWp5+hkpeYm66Lq5aPqJmojJioj565tqSlmJuNiXmBk4yak4qUkZOQjZGWooydnqien7ikf4SvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSehJd+bpOznKOorquiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2hnF8hoGAYWmIi5WTi1t2lZFnaJCOcnqkmJhkeZiGgXeXaYOKgm55f2twZV92b2traFtmY2Jib1NbPk5OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xTVFVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqK2jp62kkparta+xppqqpquXc4ucr5+oqqeTlrigoI+cpJ2RfoiImp6Nq5qjlKeino6XkZ6Fda6QiKaaqJGWo4iburSnoJmYi4l0dpONlZOKlJCQlIyPk6COmp+mmZyyloCMnLWdtIySj72noX6nonqjr7iBjo6nn4SLhY+xqa+MiZajmnmBi6yGnJ2ip6qoh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeYFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5yGmH6RiYGCmGqNjIRreHtxcGdkd25pbGtbZWppZXJbXklUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWVthYWhmWlFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKCVpai1no+DnKucpqGfjZC+npmNn5qgkH2FjpmXiKudopWfoJGNk4mGgJGojoeinKOTlp2Gn7myp52ako6FcHWPiJOQipSPj5uLj5GfkpafpJaerIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqeg6CYgZl/iouDiJhvjJKEZ3d0e3ZnaHVwZ2dsXmNubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJkY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilaOptqOvf6CnnKWenYmTvJmTjaCRnZB5hJaWkYermZuamaGFj4x3m5yPoJGInqSblZiXhqK4raWZm4yMf2Jtj4qSj42QjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OeaGSfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZegoaWsrJ+crbWjqJKgn5+mm5mOmLSZkIuejJWLdYGUkY2KppaVl56ef5KFhqykh5yRipiol5makYelsKailZqIiX9oboiHio6OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56Df6RenZmzlm97l56zdHJbnrKCaWJvdHVxaG9Ya2xycmVcaV5iS0Q9RDVRQVlxMjxSRl9KUj08Mzk1Ojo2RDs7QElQP1RNTlFARF9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjaS4ta6toJuinKOjpKybmrGtrJOXoJigpJmak56rm4uIkniLhXCAlo2Kj6CQk5Sdl32QiY6ooYeYj4qRopObmoyLqKikno+WhoN9anqGf32PjIKLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2tpW3FpeHljX2VXYkFQRU43VkJSbTRKWlpfTlpDQDE1MTs7N0g/OkNHVD9ZUlldPkRiXlZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplZyJqrabqIljlJusurKwrJ2mnJynn52tmp2wqKudl6KZoZ+Ylpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlI+Fi52RnJuJj6ijoJmLkIl/f2mBhnl/lot6iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX5uZWBsaHZ8ZGNgUV5WXVRWQFlFUWdEUldbYlheSUQ9QjhAQjpJRThMRFdBVlFbVkRGYlxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZrZGZsaGhraZOdgbGumYRTX6Cns7mzs6maooubqZybqJKhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgIiYlJ+ahI6onJqUioqJe4NrhIVxgaCLd4WNiIeSmZV8kqShn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ5+p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRenG9+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+Ea2dmZG12eGhfYVJbZVFRYklXSVRfV1NbZWpcZFBGQ0tMSktCSkU4UD9QTVdTWE9SUmBmZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36pr7K1sLOjnJiFmKegoKONpKigmKmJmZeYk5mTkqCXjYiFe3B9hGh9j4KTmoF3kY2OiXB/hpCTkmyXk3yIkJGjlYOOqpqUkoqFiXmDdYiAboKfhnd/koaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHFuVl5UWWhQUmhJVUxYUlZcZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnl7bnWJe3tUUE9tXWhba2lSamhpbGdsZ2NlX1xdXF5pYmRoa3tfXWRnY2pmb21laW1lopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko2Ig3lqeYZlg4x+l6B5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl5f3yLeXCQoYZ5gJWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VvY2aIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXJqcYFtcGhreHNrcFJYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coN7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfX9/jnNpj6WEfIWTjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaUl5ygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlrioZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVxc297dHFian5uaGxTVltVYWFca01cUl1JXW1tdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3OEf4B7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY2AjYmElHWCh5JvbIupgIOLlI6JnJ+JjZOrpKCQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJieoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3lvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cXBvd3hvXWyGbmlnVlpgV1xla2NVYVVeUV9wd3lsanZlampqdXxxcnRzYW91YnN7gXh1eYJ1gIB/gHiLhYN9e21/bGR5bl5XbmdodWt4amlqZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KFqoaOkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ybmp6Oc5WLiHF0a4J2c4BZcm6HkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaCaHmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZbHFbX2BZXl1mdH17dG9zY2traXt8cXt4dGRtdGhsfH51eXx7enp/f35vhoqEe31zfnlzf2lUXHFpbHVvdWdraGRdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeq2CkZiZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlJqfiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLnouFlH9+jIGBdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiI+BdmuBg3t5mWlyaGBzinB9enZ1b3d0gV1eb4dobl9fWlxdU2hxVWNbW2FsaHV7fHJucGRramh/e214f3Fpb3BsZoF7coGAeIB9gIR6bYOMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXuAmaqNno2Fn5yKnpZ8eZSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXuqhI2Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GRind9iI6FpXt8j5CRhpiqoZ2TnI+Nq42RgJ6MiJKZnoKOl36GjYJveIVxdGB/g4+GdYuXgIOPgoaEfoWDlG55dXSToouNhZqEhI10gIp9fHJze4iEe3mMjoSTp4+GhI+Cg4qJiXaFh4mLe25rfX97bWhrbGdeeX5nfHt2c3V1e3dcYHB9bnVgY1tcXlFmbVNlWl1ha2l2en5xa2xka2pngIBsc4BsbHRveG6EeW6GgHaCgH2EdnGCjYh+e3t8f3uCimBpe2p1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enNlam1ti4qfuJqho5+SkpaXi5qfnp17eJ6lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXx/eHKAhX2KkHxraH2Bl4iBiI58foaEh3yPgI+am5GIp5x/cIuKi5KGoKGKhYx8qJKIj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joR5gISPh6GAfoyNj3yXpKCgkpmQj6aNj4GbkYmSl5t+kpJ+ho2BdXSCcHZgfYCNhnKKlXyIi3KMf4KFho5od3F4jJiSj3+XfoiKc4KHfHxxeXqMhXp7ko2DlqaTi4aRfIWGh4R1goOIh3lkcnt+eHlwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZYCAam1+aG5xa313hnlri4FygYF9gXR2go2Gfnx7f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmN1e3tyYmpveomNn7KSpaWcjpCYj4adoJqcfHakoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqWbh4yJg6aWhZKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5Sceo+Fg3iFl42efoGKjoxzl6KeoZKYjo+ijIuDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeSl419k3iLiXyAh3x8cn94iod5hZGKi5iilYKEjHeIhIKBdnuBiYV0Xnh3fHN9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBiamNtZWh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXaIdHRtZYpsamFjdVaDaXFuYHlnbGJqdnBmeXx6cWBybIaGkJ2ul6aono2Nl4eGoJOXmH13qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefYuVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SNjopshpiQmXqHiJCJb5edmqOTlYqNn4yGgZKcf5KSlYaZiHyJiYF6cXlqdWx7fot+boWSgpR3b4KDfX6Kf2RyanuAlpeEf410kImDeYd+dniAfYaBfYSOhYyUpJB5hYN0iYd9f3N1gIeDbWB6dXlwe29hbmJke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2llamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH18jnJ6inh4bmyHa2hfaXJjh2hxb2V3aG5sYXpoa317eHBhd22LgZmaqqCkqJ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JviZmEZ4aaj5R6iYWQinCWmpShkpKIi5mMgn+QnnySj5KLmY57ioSHdHN1a3FudXyLdG6FkI6ScXSAe4GBiHxkcWx5fZmUfYSIdJCLgXSIeW5/fYCHfYWNioWNlaiNe4h9fouFd31wb4CFg2Nod3N0bnpiXm9ganRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGdiZ3GOb2RpZ2VqaIB6d3RujoVzgIGCe3WCiIV3hXx4hIV6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdvbGV7Ym6AeXZxbHd3in+jmKKooaabh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4Wjg2eGnYqRf4uEi4F3k5iRnpGQiImVjX9+j5d8kY2PjZqSfIp/gm52b2ttb3B7hWlzg46XinB3f3SCiYJ4ZnNvdoGZjnyJhHqUkXp3iHRwiHuGjHuLh4SJj5yjiHyEd4KLgHh4bmqAgoFdcnJwb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJdam1kYmZrkm1gZmZfaGuBdXJycIuAdH+CgHh2gIuAeIV/d4eGd4OEe4aMf3t2in9qcWN8YoZ8b3BsdGpob2x2d19xf3l7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoKMkqSak46IlZiShIaWmYyTi4mPj4iehZCKfHOLhYmPiJyZn5uWlICUf2mGnIhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoB3g418eWd0bHSHlYt/iIZ7lJBxeoRwd4x6iox7iX6DjJGfnYV8fXiCi312cGlrgYJ5X3dubGtxclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZmYGByU1BOXGZlXXhwiHxfXWhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuGgXiIgnOGhH6MjIR7eZV3ZnJqg2CHfm9va3pgam50f3RfdH15hnh0c4V8eKCPmbCcpY+Cin+DmoiAi55/ipmTjoSIl42Oj4R2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIJ1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoiZKHbImkhZOIl4OGY4yRmI6UipaMjYqLcXuUiXqNiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen1+f4aOenpoc2tzi4+KgoWFfZWMbH5/b4CMf4yIfYR6gpCWmpuLfHd4g5B5c21mcH+DbGl0bmdoc21TXm5kcFlfa3F3ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn96iH5yiYeBkYqIfH6YdmVzbnxlh35ucGuAWmxueXlzYHZ6e412cneKd3mfi5uum6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eJi32LpIWSiZ2FhV6LlJeKjomOi4qEiWx8loF9iIWJkI+GdoV9fWt9ZHd1am14c1eIepGGhXp+f4CFjH55ZXNqf4qOioOCf4yWhWuCdW6IkYKRhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmJ0bW9haHVmUmBwZ2tVX250eWByY19ofXFybVpicmFiV25ZXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3e4lxg4R9foh7dIuJiJaGjH5+mHNodXF5bYt6bnRwgVhxenZ5cWR3eYaMaXaAiXJ/nIeYp5yjkoR9cIyUeHmLnYSFoY2OfJWMf5qIhHtyd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GFgomHmaKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2h1cmlzd2tajH2SgYV8f4OAhIqCdmJ0bIiBj4uCfn+SkX1ugmx5ho+Gk4R9gX2AkpORl4lucnqMhnVscWtyeIBfdGluXGp1YFJkcWhmU19wdnRgb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW9qdHeKfnNzgX56dnqIc4WDfH+HdneKho+YgY2Ce5N2bHd1eXmTdG54en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F4cXNub2RyfmhmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3twkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+DZ32Qf35/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNmeoOKh4yDfIV+gJWPkZOEbnB5jH91bW5qa3p9YmhqaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsbGJtaXN2hn9xbn98fHR4hniFgnyAh3V5iYGSlnyJhnaJgW94eXuEk3Bte4F3XoN/dIFtaXpzlHNncoh9cpKRg5qfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ9dnFvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8w4N1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8iZidmIeUjp2AiGZ9k4J/hYOJiXKBfWd+i3t4fn+Hi458aYB8g3Zlb3h4c3ZzbGqNhYqBin94gYCEg39rXnJ4en6NioV7go+AfnKAaXmDh4uGhHmEfIGYjZCMfW5te4l9d3RuaGd8dmNccWJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGpja2lzdoGDcG1+fH90dYN7g4J8goV2fomBlpF4g4p0gYhyeXh+jZBvb3yBcWmBeXp+bWx8dpVraneEdGyUjYWemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHR7aF9lcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcXuQipB3fZSLhJmRjIVua4WSknp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYWbmZSLk5CUhYdwe5KCfYKDiYNugXhogIR4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop7dniAhHmBa1xxfXKBiIWJfYaJeohygW5xhIeOhIVzhHmBmY2NhHhub36EgHd6ZWhqfHBfWXdaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcV9uTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtocXd/h25rf36AdW+Ce4CBfoN/doGFiZeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4qDoZmckoKGZ4eDb2h6lYh9f4SBmImBfI2MaXhya2xmX2FveG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXmFh46NdoOWjH6SjYx/bWyFjIt1fY9/hYKViXyDeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHV3g3mGnJCMkJGSjIuGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dheYSBcWRxaH5tdHF0gZuLgH+FfnJ1fYBzgXBbbX50eIqDi3uHgHyIeHpxbIiDj4SLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1lvZExacnJlW0lwd25cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi254foB7e4iSiX9oe35rdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnaFloVzj4uJdnBthYKGdHmJeIl8koh6f3Nndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn52gIF8jJmHgpOQmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4FyYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG9/dnSMgoZ3iHaCiXp4c26JgY+BhXN/fX+TiYl6bm5qboKCdW5dZ2ZzcVFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWWhNQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeDf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNzk3x4hpOCc5CMiHJycIR7gnN1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dmNqfIOHnoF/f46PfXJ/dIV5gJGQgniWjZSPiIKIe4iJa3h5fnVnemhsf3lzaXp2gIJ9aGB3h31qa3Rne4BpdoCLkJR+en5+cHt2e3R+YlZ3fXJzioSCfINxhop3eHBwg4KNf315fn12joaDdmlxaW2IgnJwXWhjc25KZHVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2pkUVpwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx5fXJ7fnmCgYF8dn2DiIaDcHeDcm52goN9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl4b4x1e4aOgHqTiYB1dHV+d39vcX9thHSUhnh0a2B6gnmIj2Zxg29ndm5bbX2BkJR/gHmRkn15e22HdoCQi4R0loqRjoeFhXt/hWx0dn9tZ3ZlbXt1bWp2d39/fGBieIV5aHR1Yn17Z3SGjoyVe3R/dXGAenxtf1lWdH5vdYSHf4B5bIiGdHhrdX+DhH17fXl7c4uBfXNndGVui4Rtc1tqX3VkSG5uTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5uYlRcckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5mZmtxaHB1eI50a46MdX92eH13gYOBe3N9g4iHg29xf3RxdX6FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubFtiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX57kYV6eXN5dXV7amx1Y4R1kYJ3b2ZefYJ6i4llcoJranFjWGx7hpuIgoFzl5R3f3xtiHGBiouHcZeOkIiFi4N7eX5xcXB9ZmhxYm14cWprcXd8fHlcZHmAd2l1eGaBdmd0h4uNlHxxhmlvfoB5bnxdWHJ/bXSAi3yCb2+Jf3F2aHd/gX+Bdn1ye3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZmtocmdwcneGeG6VinR/enh+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn54eYuEZnF+aGprWlZvd4qjgYR/cZmTcYF5dIJtgIKRh3OViIyIhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tma3qDdW10YlxvfGt1fIt8gWZ1h31tcWd1fnh+f3J9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkVrWmFkV1lVeVlOVm1qWV1sZVxaZWNedGZtZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN4enpzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk39yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzc4KEeICEeXZzdW5renBhZ2tnhnSNg25mXV99cHuJfmltd2ZpZFVWcm+NpnyEe3aWkHR8c3x6bXt7kIV2mHyHhoKGg3x0cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ1Z3CAd4F1YneEinyUgG6Lam16gXFmc2VgbXpnc3eKfH5idYN2aWtxdHpwenlzfmZ+f395d25kZmJuhnxta1ZqYnBTS2hqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39+hYV6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgot5boVzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2thaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaW9nZl1VWG9njqh3gXp8kI55dW9+b3J1eY+Ad5V0hYJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2lvgH55d2B3hIR3j4RyiHFveYByY3FpXG93ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0trZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFVubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAf4eGenl6g36Bk4RxdHR/eXZ0hYiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gICBc26Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXWt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBwfGZ4b3qNfHaOcYR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3JrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVlxdGJxcoV8dWRyf2xhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x8dXFuhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2JwdnZsYltsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtbnlnd218hXt1iHKAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3BhcXGCfHNmcYBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSiISBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN4dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqal5abXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGp6bW9we3x8cYB3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZqaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGttYnFzgXpzZm9+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1FPWVJJY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIuPg4KXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5ue29md3B6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5waGlzcXNwdHVqbYSTgYh7hXFyZm59cHJvVFtmamZxdIF3c2JsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRVlNQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmt5dW5vaHZ2f39sg399hpd7f4iBin5rk4hyZ3SAe3WAg32Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHxwZnhyeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmd2RlXVhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3ltXHdxbHppdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB+bGZrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWhpb3SBdHJeaWxSZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYiNfnyKiI56bpCKdGxzgnR/f4iFhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI2NjY2NjY6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6wf2tubm5ucUosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLd8ZWhnZ2drPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJh4eIiIiHjpCQkJCQkIyHh4eHhoeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYuKioqKiYqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGOjo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiMiY+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH5/f35+fX1/f39/fn5/gICAf39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSUlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSVlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn9+fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/fn5/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fXx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISUdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdnl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NS0tLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVFWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tKSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZDRkZER0lIQz9AP0BBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAgH+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTs3ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTc6OkA/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT8/Pj09amk+PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlJSUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9CREQ/Pj0+PkBAPEp4c0w9Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRUo/PDtSb21nZXhzSDg8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lHSEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNemM9V4GFhoaCeXJGODg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1Z3e2d9g4KDfoJ+dkc9PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BvcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0VAV3V0f4F9goN5gYVyREBAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBOdHJ+fXiChYGDhl89Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4CBgYSFh4aIhEtDRURDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1hzgYSFhYOFiIiNZT9BVnSHiYeHhoeCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSliChYaEgYKGiIp8VGyFh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKY4aGhoOBg4KEhIODhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aEgYOGgIGCg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWiGg4F/gIOEhISDg4SGiYqLi4uKiYqLjIlUOjg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFcoWAgIGCg4OEg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUldrcXJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUaAhICDhIWEhISEhomKioiHh4iJioqMiomJjHo+OTg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz89VIWDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJdh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWGHg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKX4WCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODg8Ozw9Oj9APkBAQ0ZKSlBng4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlFRUE1OTUtKR0ZDR0pHTEpGS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTUtSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6ent7fXt9fX1+fX19fn1+f39/gICAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1BLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsampmYFtRUlpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJbXE97Tk9PTktMTU9PUUxLTFdNSEdAQTw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRExRT2FXUlhRUFNTUlVbT09RVlBNSkNGPjo5NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmFza2FhX11kYF9eWVVQTU9OTElISktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg5R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWV9bVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fX1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkhPUE9PTVJKT1BQUE5OT1RMTUlQT1NUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUk1JTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTEVHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9OTUlNTElLTExLR0ZGRUQ8QUE+O0BFOzw4OVRxcnV5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1dLTVFPSEpIQ0lLTUxKRkZGRT9CQz48QkY/Qj9BZHF1eHt6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQUdJRE1PYWVRTU9OV0tMTUtMTU1MTEtOTlNkTUpMUklJSUVBSEtNTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p7end0eHV4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0hLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0tJSUxNT1BSUEtHQ0tHQ0JKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpLREdCPT49Ojo6O0FCPz1CQ0NDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETUZCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdCQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVOSENHTUxOTVBNTk5NTElISk9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lHSFBLREpNTFBOUE5PT05KSklNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj9AQj9AQkVHSkZKR0lIRkZHRUNCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBQT05PT0xLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PD9CP0BAREZIRUhGRkdGRUVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk9QTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1IR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZHSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PU1RPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF5oZWNgZGVoZ2poaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ4cGx1cG1zdW5vc3N5TklIR0lEQUNIRTxARUNFPTg6Pj4+PT1BQj0/PkFCRkNFQkNHRENFRUZHR0dJRkhKSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY11cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaHVxa3J0bHF3cXVNSUtISkVCRUdFPEBHRERAOTw+QEA/P0JCPEA+QUFGQ0VEQ0hERkRHRUhIRkhHSUtKRkpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdkpLTEpMR0JFREU8QEZEREI7Pz9BQUFAREFAQj9BQ0hCRURGR0VJRUZESUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBMTlRTUldbXl5fXV1gYGFhYWBiZGViY2liZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dWVxc2twcWpydm93Sk1MTE1HRENBRDw/RUVFQz1BQUNCQUNFQUNEQUFFR0NIR0hHRUpGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxLTEdEQUBEPj5ERUZDQENBRURERkNCRUdDQklGQ0hKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRUVGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFREBBQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTU1GSk5ISUtKSUxKSkpLTU1OTk1NS05NTVtyb29ucHBsa05QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT9ARkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkhMTklMS0lKTUlLSUpLT1BPTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERURDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT01OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZOSktXUktHS0pKTklISkxJS0pJSEpMTU1NSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSktLSUhJR0tLS0tGSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXh4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtJTEpIRkhHSkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1TSUhFQUhGSklLS0lMSklGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tLTk1MTEhKSkhKRz9HRk5KS0tMS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJXXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15eYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkZIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09MS0tJSEdFRD9EQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXV1fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUUpGSEhIRUZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExNS0tISUNFQERDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFtcXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERWXklHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURAQkNGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVpeXmFhZWZjaGRrbHBzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0dYTUhISkhHTkxRUUlMS0tLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYERDX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZoZm5saHJ6fH1+gYSEhIODg4OBfXx6cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2FUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09MUVROT1FQS0xPR01QUlpaVFFRT1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJiWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSWZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmNkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkRCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRMaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l+bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVVWTk5MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU9QVVRYWFhbW1VTU1dbV1hXWk9TVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NRUlVVVlNaUU5TUlhVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFBKS0xPT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtUT1RVWFVUWVVXWVRSUldVVVdcWVtgXlZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1dRVFZWVVZZVFdXVFJSWFZVWl9aXmBfVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGRgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1bW1ZST1VXVltcV1FUV1VXWFZUWFpUU1FZV1ZcXltfX2BVYVxgYV1gYl9cYF1jYWNnaWRmYFpjYGFfX2VlX2BjW1pcW1xZWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUlRWVlhZU1RZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dW2BcYFVcXWlqcn1zbGdcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15VVU5WV1deW1hRVVVYWFhVV1lbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl5eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFlbXlZeWV1QT09SWlBaVVVXVlNUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFVUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWV9aWVNUVlpZWlZYWVxWVVpdXF5gYV9lZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaWFZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxXV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWU1lYWF1eWF1bVV5fWF9fWFxWUllUWVpaYFhbVFZYW1paWFlaWlhWXV5fXmNiYWVlXWJcYGZiZGZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZTXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2hZXFpWWFVXW1pZXFlYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXW1pcX15aX1xWX19aXV5ZXlZTWVdZWl1iWV1VVltcW1xbW1lbWVleX2BgZGJjZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVlVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlRWVFhcXF9gYF1gXVdgXlteXFteWFZYWFtbX19bXldYXVxdXl5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaV9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYWZlWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhYl5cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllYWllgXWBiYmBhY19cYl1fXVtfXlpZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYT1haXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2NiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl5fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t7e3t6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6enp7enp6ent6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLOzu76+vr6+waGKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv7/JzMzMzMzPqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgIGCg4ODg4N/fHx8fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eXZ2dnp7eHt4d3Z4e3d6eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6eXl5eXp6ent8e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8enx7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIODgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JycXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW1tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYGDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOBhoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn+Afn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH59e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f4CAgIGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4CAf4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoOCgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn59f39+f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgYOBgoSFhYWGhoeGhYaGh4eHhoaGh4eGhYSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEg4ODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBho2CgoKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhISEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKCgYKPm4WAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICBgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIKBgH9/hZabiISChIKBf4CCgYKCgYKEgoGBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFhIODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhIOBgIKDioiGgH19fXt/l5yJg4WEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYSEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCAhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaZkIZ9fn5+h36NnIWBgoCBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4ODg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9+hp6dhoCJgH+HgYCMgoGDgYCAgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoKDgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICDmqGIhYmDg4GAfYGEg4SDg4ODgoCAgIKCg4OCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSCgoSHfn59fYSFhYSFhH99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aMgoB/gIWAfX17goeGg4B/fn5+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCgH+EjYR/fX2AhoF/f4CAf39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4CAgYWEg4OBf4CAf39/gICAgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CDhYOBgoKCgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEg4OFg4OEg4KCgoOBfn19fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OFgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICBg4ODg4OCgn99fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn5+gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gIGBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKAfn59fX1+foB9fX19fX19fX17enl5eXl5gIKCgoSDgIKDgX+BgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoOBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foGTkYyMjY6OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGOjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyAg32Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNjIuIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXt9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+enx7fHx8fH18fXx+fH18e3t7fHl7fHt7fXp9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8fHx8fH+Af39/f3+AgH9+f359f4CAf39/f4B/gIOCgH+AgYCAgH9/gIF/fnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX57fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgIF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn98fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f35+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGBgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fXx8fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGCgoGBgoKCgoGBgYODg4KFhoSDgICAgIOBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKCgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gH1/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYGDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBfn58fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf36AgX5/gIKBgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fX+Bfn6AgoF/goOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH5+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4N+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH99fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3x5d3h3d3h7e3t7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fn58fX+AgICAf39/fn59fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXt8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fX+Af39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgYF/gIGAf4GAgYGDgoCAgICAgH1+gH2Ag4J7fn57e317enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgYCAgIB/gYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhIODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOCf3+BhISBg3+CgoGDgYKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eXZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAg4WDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB8gIF/fHx9enp7fYB+f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIODhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4WAfoKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgoF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEhISEhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4F/fX5+fn6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GEfoODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCgoSFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fXx/fX9/fn2AgYODgIKDgYGEgYF/gYGAfX9/gX5/fn1/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhYSGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319en17fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn9+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWEhoaGhYaEhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fX18fHx9fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhISGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWGhoeEhoaHhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SEhYOFhYGAg4N/fn+Af3+Ag398gH19f4J+gIF+foF+fn59fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4B/fn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYWGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn5+fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+fHt6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYOBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgoOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt7fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzg8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/P0NTSz8/P09LPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR0ciUp9LRx5Kr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrdGZrJyw0ZmsmrLSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3ElIicnsSShp2czs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZwr/JmJjFvMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUn8zSlJafztGSmaDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjZr5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCew86Lk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qoma/P26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCrkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqefsaSkqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0pCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwc7DysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvJus7TyMjNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu+wcfBxcPTianPxMTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbezrrq7tr7MtoSe0ry/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK63tbi/z5uBirXBusO1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube4tK24sra9xcWHgYCfxL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+xtrqxvb67xLa3nH53gnSEk8Gse4GCnMnGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owu9Tau7q+vMaynXdjbGRQW2F9j3qFhpnLztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs8Sistu/vL26fWRvYGBzW1RVWGx8hoibyMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLfBb2+wzcG0elpKZGNLcH5uYFFZeIKLoMXCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru/x31vdqS/m1VST4NnT1x8gYNsRmuCkKzDvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5x8iCf25/pXNRTGKVX1FRVY6Wdk5li5yuuLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2uMfIioN4dI1hTGKKcVxPVmSwundWUH6vsLKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fDw5GIf395VlGOlGttVmVwZ5R+cW1eh7yzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucOikImQfkpemMN0gYqQXXZ8aWp0irS7tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbK7r5SQnZZMYo2UdnCAemNqbHN+enOeurmytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrSmnaqOV4FvbmpcaF9dVlleZ2NpgJe4sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmxwLevaHh4a3NoWV5QSkhKTFFPWmtuoraqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JNSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoaihpcTDjmBlY3JjVExGXUlQRk1LS1NeXXy2r6+ztaqnrKuinJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp25sYV6Z2pjVkhQXo57bFNLR0dOVFRkq7KwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueo6eafWxdVExJVYOqsZ9oUEZDQ0dNXpSwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGhhm5gVVBOT1yr4Nq6j3ViU0hCTYuZmquqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoHRZUk9SUl11uNK6oKm5noR5ia7Eo6itqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQST9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoJxmUElOUF11jbK9qYei3NbO1NnItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXHzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyUXUtFTFN1hbO2pJKJxePc0cS1pp+ZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcXM0NLVztPJvcC/w7vGxcjF0dTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmNKSU1cfqrR0Lags9PMuq+oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKV3XWdog7DS2trWyrqyqqOenZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKGqiYGSr87U2drPvK+om5aYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czQzdPX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGmlXuTksXW0tXCraahmJWXmZqdoJ6ZnJ2SfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxdHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2ppnZpf5TT1s2wnJuWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFysvMz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7Sooahkb3yo2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfLy8vOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raacXm93utCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxMvFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwLTDvrKyjWBygb+wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7rLw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8C4xb2rr35kdZC1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrE0M3Sz83Fx8HFwL64t8m1qbCCbXGXmo2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCywLa4vbCwp7Kztbu8q661pa61r7uysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvr+8wLqys7TDrqmuhmhkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqwo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DFt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766ybfBw8G0tbu1sK60u62op4dfcY6DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+mpailraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6OgobGtrayytLO0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci0tb24usC6vbWgnpWdoaa6tquzs7uzxM/Iy8LGuLfHwcy/uMm3u8W4s8S4s77Aq7W7saukrrKsn6KKYYKHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNn6Gjp5ufoKSmoqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqysrbGyuK+4ubuwtry8uquzs7qzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadgmWChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyioqidm52lpqKmnKCgm5iurq2usqCloq6rp6K1sbKyrKivsqe6s6a1oKKem6OhraOiqrWqoqOmnaamo5aZnpeZm52gmpednZ2craGrp6Skpq2rs7SqtbCzq7K5tK+qr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGv8W2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6SmndpgYOEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWXoJ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlpabmJeWl5yVn6qeqqSinaOqqrCuqLSrqqets7Clq66zsbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tLu8tLi5r6+vp5uYn6eSj4pweoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCnpqSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlamhopStsbGfoqOdnpibk4uhlJGTmJiSl5eYl56nnKehopmjpaWrpKWwp6Wjq6utpqmur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xaq3t722vbq6tbKrq6WYl52hiodxfIh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1VUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkI6Uk5SdlZaXpJmgl52hpqKtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yho52koKKVoKKkppujq6WipKqkq66lrrKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHj5GPmpOVk5ybo5yboampq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOjJGMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tayrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhZOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAc2hgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzg1Njc1MjUxNDcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjZSAjZuNkH52hXd7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g3x4ZneNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2LpZuPnpeOlpiPd29tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MTEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZjoSSeYiNiol1cHttdHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNUVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQkpWXmZeel4yDiZ+Ri5KNhpCWfm5pbm5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0MzIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnp/hYuFdG50a3BsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pRWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQiHZqam9oZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjM0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCc4eMhXpvcnBub2RwZl9URklDPzw7OTo/QEFEREVHSUxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3tycG9sYFtcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMjUzNDc0NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWCg2yViId7dHh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R9dXd7fIl2cHJzZmdfW1tdU1tmXldRVVhbVUdKSkRMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg1NjUzMjQ0MDA0NjQ1NTU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2BfnCAfnpndmtSV0xARTIxMTM2NzY4ODo8PkFFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuJi4iRf3p1i3Z8eG1vd35/c3Nxa1teXVtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NXS0I2MC4vMjMxMjM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYiRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gol6em9na3h+eX5yamReW1tdaVxhZl9ZT0tOV1JRSVBKRE5HQ0pEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+LmpuknaGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYyLgomNg3+Jf21wal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JFSEpOUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+Bc2FdY19aZmpca2teV0tHT1NRTk1MRklQQ0RNRkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpWfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWZkpGCgICLjYmFkIaEiIV4eH5nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NFTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWdn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cWhgXGFfYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6NfIqGj5COgYKAiYyKhJKFgoaJgYCGd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lKTU9RWW2GkHeVi6OnqrS9uKWurKyoqbSrsLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9ZmBoXGViXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpyDkpCNktrInZZzVpeIj4icj3yGjI6KinqIgoeRjoOFgIuFhoeShoKEiYaIh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rbS/s7i+tr+0wba7u6S4xqm2yce1vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhhZFZlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhomFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVxPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbS0wLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BempXYmFYamRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqDgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpjUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5igrqWnp6WepJSip7G0p7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFfYWFcV2FfaGZSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHRtc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpp+fmpmEpJ2spaqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/IzrSku7C1sJusub2af3lsXWBbWF1hWmNiUVtgU1FLQ0FFRkQ8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRvbG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkZGem6GYm5WXh56appusr6ivp7O01NTV1tLLz9PVztPPzcXCydC/ysnLydLIzc3C0NK4sMS8xLqmtrvEo4JuY1xcXVhgV1pmWlBcV05QQ0JIRUJJO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJiZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J55bmVdYlxWX1JdW05PU1BOSD5BRkFCRTxAQj5FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrYuVjZWZjoWSkJ2Xp7ChoKGkpKjHzc/IwsvQ09HU0s7TzcbW0szU2NbW2NXX1cnU2s3J19bRyq3Ew8yKcm9iYF9YU1lSW09KR0lJSkA7OjtFQUQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ6gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M7Q1drX19jU2djN2NvOydra0ta/zMy0d3ZuZF1ZUlVQWVZFRkpJRUU9Ojc5QEFCOkhEQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iEh35tmXmEmIaIk4yNlYyGe5uIk4+uqpSVl56Ypq62vaitvcbLyMnLy8/Jw9HK1NbY19jX1NvX09nb1s/b2tHWyNXLlXl6aGhbWVBTU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2thVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDk5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJuIGWm494cGVOZmOBeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiZCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoZ6eWZoZF9UV1ZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47Ojo3SVBdWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KekZ+DknyGfniOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLyMnKOcfYmEfYlzjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiZKWmp+fiYyUkp6Rgot/ppmIhY6ChoSApYaKjLiYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld4eXdqaWRWYFtTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboZuelJKAi4h/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KgkKSvn4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZahi4qIjpyQg4iPgIOHhaSGjJCzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dqeb3x0Z2ZcXVhTVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepqKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdopKpr5+RlJCOjYiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+liY2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgnJ/aGJeXV1OSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+PDg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYu3J5dl1gVV9WT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpJRU5FRDo2QUBCUz45RE8zMjM1NjU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUlmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqpmYnJSVkZegmJq7u67KoWq2uKuwlJifo6uTl76jXqqygomKjZSHkXyOjn2Dho6PlJWIh5OXjJCVjYuMl5iSnJm0l5WrnYuclJKOkJKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFwemhcWlNeUU9FRD48Q0FBOD84NzU/Rjw8NTwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7TBvLStq7O2jKeyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5paSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY6ciIePl42LlZeUkJqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr7NpsfEx8O81dHNxMqIdHJhW1lfW01KQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUpITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqrExKSCi4+HiISGlZSNeoONkY+RoYyMlJKOiJefl5OZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762zrLEv8S8s9HJyMK1dHhsXFhbaVJMSERMS0tKQUE9Q0Q8NUFEOzozPThCMzMyMjYzQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nusC+vMS3rMGprLO7vqqwqaSlo6yts622taCfrp6lopijs72pm6i9waO3t7CrkrCtq6yXh5qqp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWmkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMSvpbO3zMC5rsSzu77CuK3Cw8LAmW15YVhXW1tLS01KRkRESUJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3LvMK3sLm8tLzLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypZailqysqqebnqaXmJaYlaCjqKWftqupubzDtaaztcvAuKq2rLK6uK6ouLq9uIJrblpXVFRORkpTTks/QkhEREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7y/z7bEvbi4t7KxtbO4s6umnKuruKqop6+wl6OupKekpLXAsKustL/DusC6s6e5tbiyrpWlra+vpYuTlaGNdMGafpeZhY+WmoyxlZqalZOTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfr5yfpZSvrqulmqCllJOYmI6cn6aimbSpqrO8vLyqsLLHwLilq6utsbGjobKytKRwbWZcWk5QS0VQUFBRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK+vs7Smo5uqtLSqqKaurJqkraWkp6y6v6irtre+wb++ubOyxLG5vayjrrWsuqaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoameqKCamqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoquVqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura+s7Ktvrm3oKOnqKWnnJytqamMYmVgX1FLTUdITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqora2woqOYqrS7pqmmq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvcCzqbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wlk7CrmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56coqWal5WZqqGed2BcX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKKpqL+3pq2+sbi2x7a1ubi/sr/Bt7WztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaymnJayp5mvp5+aqZ6gjZmVn4SNoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGhiWWFdT0lHSk5MSEVESUE9UElBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQzxDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXt7GjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqydnZ6lpMGloKqtn6Spra+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqp5OYtaOfsqGgm66Wno6ZlJ2Cjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolhZFljYExISkpORkVBRks+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbyxqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZuqoq6wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq2qoqaWlpWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaNmLSbo66anputkJ6Tl5SagJKhlo6Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YWVbZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+utLKnqrmyp7qzt7K5wKq3scO9tManvq+tt7WqqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq6ysqerpqGem5qblpion6CYop6vsqKmjZeumaWrl5mepJGbjZOXmoWWn5SMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXWtqTVBNTlQ9Q0FOQzo6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLevqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJuepZ2il52js7Can5CTpZqgqJqUop6VmImUmJOWl52UiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGFsbldQUVpUQUNFVEA7O0lBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbippbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SprrG2nperraitl6eojqe7n6Sts56rorGws6yptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7Gmn6WqoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ksra6xp7OtsqqknJ+opJ6VoZmbqLWpl5mSkp+ZnqCekKuel5eFlZeLnZmclIqNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJncHFfRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlr662qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytayqura6ub60qq2xtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurrayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmay4o5eTkI+YnKGYl5Srn5uSgJOYjJ2cmZaRipSTnpqloqGgmJaRk5V6i4+Fe4yKg4uSa254bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2up7q4t7bCtqutsbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbG1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaejtp+gp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SquJyUjo6LmZyil5CYpaGdlIKSlo+cnJiWlYiXkJeap5yjoJKWkJCVdoSQh3uFgYSMi21xd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZbTF5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktJV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6WxsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q/vLLEqKm4sLa2v7yuq7OynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLSytay0raqsqKypuK2xsMe/uKW5sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOpqpugmpqSpLSaj4mNh5GioJWNlJ2gk5GEjpOSnZqYlZSHl5OVmaebn56MkpGOkHd+jYV9fHyHiolxdHJ+fX1cU2RvXk5ZZlxGRJZbRztObVhiW01gYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVdTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SxtLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e8xKest6yzuLvAsKuxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sbKpsqmrpqWjrbqsqrHCubWsuqipqK2qqLGlqqSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+nqKmZo5iZj6CnmIaEj4qLnqCPi4yWnI+OhoeQlJ+dlpiVhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHNxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1tOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC2rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMSsrretsrjAvrOtrqukp6qwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalo+YnZOCg5CJhZygjIqOjJmOkIuDjJejm5KQm4yTkpGUopmbmYqOi4p8hoCBg3p0gIOBfnR3jKOIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttau2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBusHErrG1sbO6wL6zsa6tq6uotqqmrq+qubCosbGvsq22qre2p7S3rKykqauco56zs6iopLS0oLatoKmoq6mrp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKKmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mZoJGOj5mOf4eMh4WenoeEioqOjZCNg4aUopqOjJqRkpGPkp+WmJaLioN/dIaBf395dIN/enh/gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFiUE1VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra6ztK+rpbCqqbq+u8CwrritobavycfI0cC+vLq8wr26w8G/v66ysrG1vLvCsbGzq7OopLWppa2zsrmwo663sq+yuau5r6mttqyqnqmsn6Kgta2ooZ+vsqK0qp6op6qjq6GirK2ova+srq2iqKigrJmQr6GYoqCop56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2PioeViH2NhoSDo5eFgoKLho6NkYSEk6CWh5CckJOQjZGclJePioaFeHSBf3x1eHmAe3RzemmBhqN1aV5la4F1ZoiLfVJYcF1KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsL0tnOjQ4Xz1hZD9GMUNQW1srSE45VUE0kY+yoKSmrKSnpKymtLKxqqSxqKq4vsG7r6e5qqausMnHyNHDvL++uL6/vMm8wbiwsLWxuru4wLKzu624raK0p6essra5s6iovLWttbywvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeppKmeo6mnqb2rtK+unamkoK6cm7KjlaScpaWfpJuaqaulnpuqoZuSm6GlnZiXqaiSmJqTkIqCj4V+j4J/h52Phn9+jIeQjpCEf5Obk4WToYyUkouRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXlsZnhdXVVBVnptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLS9GakkxNFg9ZmNCSjdHU2BVKj07RFg/Ko+UsZmfoKmlpKGrpLeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1tLK1sb24ur62rbm2v62hs6eqq7C1uLWrn728qbK/s7ugr7O1qayfrrCjnKSoqqKenKSwprCgn6upqKKqnKSooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSVl5Sfopabl6ari56RkJGMgoqBgI+Ae5mUjYl8f4uGj46MioSSmJGGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnONbGFpb19vP1t4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQwQWhZMTNTPWVfREw2S1dlTyo8M09ZPSOTmayZn5inpKKfp6O4r66jr7Cqq7jCurOtn7ivq6i0u8jLyL+3wr6vtL23xLfDsa+6srPAtbu+t6m5uL2rpLSoqaqwrrmxqpu7vaSwv7W1oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6ehp5ikqKCwuJ+ksa+gq6GspJymp6mampyfo5WdnZqeqaaXm5+okpiTmJ6TmZahqZCaiY6Qh32Hf4KOfXygjIyIeIOLhYmMjIWIkpqOiZWeiJCUgouWjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2BmhX5fWnNqcUtMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MjxmZDI0TT9lXUZPPVJaaEgqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbWyrqC3rK6tsLXGyMG3v8G5sLS8t7+7v6+rvbC0v7G9w7mpu7q3p6i1qKirsK2zsKeavrelrby1r56wt7CopaewspugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGrnqyjr5icqqWpnpibnqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImKkIZ6hX6EinqOl4qNhniBh4SIi46FjZOYjY6WmIqOlX6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI5Xl5sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsyYFQsMpajoZeVnKmdpaGioLeqr6C6uaasvcWzsK6ita+srq+0xMS9s7+6t7Czubi6uLqursCztLivv8G4rL26taais6uoqbOrrrKjnMK2pqm2tKmesruppqapsKyZoqecpKaUmKGypZmepKmpnKKgk6WgpLmopKeup52loaiTn6mioaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio+GeYR8hYV8nI2JioZ4gIOHiIiRhZWTkoyQlZSNjZN7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqYGhiaWZaZXpjYVJzVFtbU0xJR0lPU0AhKWleakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enaO1raequreorMPBt7CsorStp6+vt8DAvbHBt7Gusre2uLe2rKq9s6+ysb3At668vLGln7aspqW0qauuoJ/DrKmmsLOrrLS6naiqq7GlmJ2qnqelkZmmraKZnqSpoZuinZegnae2pa+qrqGhnp2hlaCmn6KgmZyanJKanpWmnq2jmJeelZSOlJiMj5iaqKCRiImKiHmFd4KCgpyHi4KJe36EiIaFkISWlY+Pj5GRkYySe4OVjYZzfn1meG9ramxndXNrY2dkY3R/YmRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPjlfbGlHQlVTXFtJSUdGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE7M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6irubKvrbS2u7avuL2tpp61q6ChsaWrr5+lw6Cyo66xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaWjqZ2aoJyUm52tsKa5qK6jopqanpmeo5qknZeemJuUmqGSqJWsqZuUnJySjJWZjpSUmamnjY2KiY97gnSCgYqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJygGBkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lVRkhGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZUMnNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGltq+prqW3ube4rLuvraqrt6q0ua6ls7ayr6mxtraxsrW6qKmftqmen6qiqq2cqsGZrqSusLa1rKyesa2vqqObnKOsqJyVnKejnZqpo6WWmqCdkZujq6qpu5+npKCYmpqeoY9ropaYnHGClpykgHaRq6ielpagkYmXmYCXi6CPeYaTjINtaX53g3BshoqGfYSLhm9eY2BnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGlzbk5QamRmcYNmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZIRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCswOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGQ9Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrbSmsLWjqLi3tqmnrLazrrSts6Kpn7SrnqKknKeomq28laelr7O3ra2kqK6qq6ahnpygqKecl6GmpZubp6edk5+gmZCep6qjtbCjo6OdlpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6EiKF2iIxpl4hmfXN4oG+Ih4R+jXx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MikuMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZhNy8ojKaXhJyrnJmZnZ+rqqiqv8Ovsrq9t8C+qqS3r6qsprO1rq+ztquppbGtpbWznK21t7Wmp6izsa2yqK+fqqGzqaCkpJqipJ2vtpWkpqa2vKasp6mqrKemoqCZn6ajmZmmo6SYnKSplpSinJSToqWmobekpKCkmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMGbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGtYsa5vZWm8krxuaHptco/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREdJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXTQxIY6mk4GmqZ6XnZ2lrbKpscK9srXAtbe+wqums6ysqaivtKqvtrOop6a1pqe4rp2zsrarpqSnsq6tsaaqnqeksqSiop+XnKCfsK2VnqOftLmiqaihra6kop6bmqGon5ibqKGfmJ6np5Gcp5uUnaGmoqCwo5+go5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7t8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp25bhKBFaWeHlkV1nGB+Z3ujp4JZX4uraYCUeHpqpzdKr1tXVGxjW0tOV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCrKaln6OkqrG3rbS9vrC3xbK4usKnqa+rrqmpsa6ksLqwpKSus6Opuames7OxpKWgqq2wrK+mqJ+jorGdpJ2YlZibna6nl5uhn7Syoaqboa2toJ6al6CiqZ2ZnqShnJmhp6SQnaOal6Cfq56mp6CboKGWlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFiJKUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nWDdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq6mrrKpoa+8qqGnta2jq7WkpbOzp6OinaeqsqiwqKWeoJ+vlp+ZlZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6Kgl5ORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5eZl5eXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoZmQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrLCkmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmelpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyWmqKflZiWkpuFrHt3qHajj4qHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmhgRVBsX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWloZSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblpeioJSYkaedhql9faV5oY+Pg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5yRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnqGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYm1ZYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmkmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWto5GXq7KjoJ6oq7CZoKKPmKKXn5uWm5ehk52pnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpbVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuOTctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5p5qeoryil7HDsK2pqqyxp7ivtsSxu7Kuu7CuwbKspaOepKGcm5GqpKqypLWnraSflpqqmaasuZ2jrpmVoZCloJONnKOemJ6akJaSr7mwq5WXo6inlJGWpZ2krZ6RoKiroJygqaSynqOljqailaGZnJeVpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJp7gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1erOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZVpUZmBjXWJRZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlY4Kk9dXT0rO1ZWJz07PKeeoaG/pZazw7Ssqqesq6m7rrDGr7W0r7intbitqaOipp+gnZmUrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOdl5KYlLK1tq2YnqSkoouSkqacpauclqmlpp2boqmmpqOpoZKtn5ejnpeXmJ6ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpemolhZIeOlWtggJVjbZx2YpRrf5qVlGVeYGNxm4pocox9hpVnan5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXWZhTFtYZ2NeT1ttdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUtPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6ooKihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaeRnpCPmJywsr+sm6eep6KJk5Gqm6ikm5usoKOam6OnrKKfqqKasJuVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhpiVjoqMl5eHlJWKg5KTkYmNkZSZk5iXmqCim5uUoJ2OgnqkhWtqfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1xwaE1ZWWVqX1dZcHpubmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbKnpbC1qsmrrbGmtabAqLSgnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eoqeSkZmop7LDr5qrnauej5aWqZ6rnJ2grZihm52ipa+moaSon62Yl6admpqgnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Ol62Pe5WbgpKBiamohYGYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aak5GdjX6NZqKzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3l1g4iCa3RjeWZgaWRjZGZqWGt7cGpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLOgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSgqqSrlpaYmqeeqZygpKuUnp+eoKquqaajq6Ktm5+goZqlnpyfna+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tlmph+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKOfmHNsbnqEjYZ5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYRzdoiJj4N7aoVYXmt0ZF1ziGlrfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCmrq6wvbGpqKStsLGfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmllnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6qro6qgqJumn6ihrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg598lZiInsC9gpadno2dwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+Hb3eFjJN5bXaSYmZfeGNfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZecn52Hpqukq62/wLGhqq+ql5KfnqKZoqSqo5OgoZ6dra6prKajo6agpaWdrqmRpJupraqcnaqcrKKWmKWWoaOYnH/OlHl6pYJ5lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WgdJeSiLNjgquGoY6Ns2qErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4d2dmt9iG59hZCSfm2BjmBxa3BmYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSqpbKsrKykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpugpZOPnqWXnqijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qpm6emo6Grkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKKMkYudfqt7iJOPoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJviYqRkINtkY9lb3N1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPSc+MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62rqixp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrJiblqinr62op6mel5WapKKSlKGtm52mo66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqZurqaOiq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmZjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmYaBo32pfoCUh65efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J0aI2MmI+BbZqSb254d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5Njc0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK6prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Kem5OqpLawrqCpm52WlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquro66arKiioaqis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiaCWlZ+VgdK4tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5WoqZCSm4x+m4maxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SPkJ6Se3CXkn5wenR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaWbqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglpGmrZGZnKejoKqnrqGipqmwtMKys6qtqJSJmJ2lm6Kjr6WXoZWZnKWlq5qvna2opp6so7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4fHx5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSZpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1jpGjlnt9kpGJdXlyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEdGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Oeo5OQorGZnpynpqGir66co6eitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iarqGtpaaYr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJttcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+Tpph9i4ySi3h8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFUzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VWVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGimZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnamSlZeuoKCep6Scp5y1mZ+po7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKunraKlm62nvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoYetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiZOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG6VkaeZgpSNlot6eYGWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KUzJVOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlVUVVVVVVRUVVRTVFdXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr6+qn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWimqWcrZifqKa2qL+vpamkn4yAjpuaoKaekpSZmpSamqWjo5moq6ujpJ+pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIuchYd9uq2KmGSwjGWVrX2gj4OmlZqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4yIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omoqXkJWWeniNnH1kc31hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qKGLmaCfnbOzqZ6in520mKCzqKqrnrCtnqubla6poo6Im46vrKimo6iZrpOZj6maoZ6ln5qjo6WZn6Kpsqi8r6Wonp2PfIublaGgmZCRmpuRmZeonqGYqK2npaWjpam7n6DGp6Wpoqu0tq2up6C9rq2tloGpkqOvjpuAhqSXmI+BgLjDuoOOnJOFp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZSTg569voRqo4Fvq4RunX96srHHg2qrsL2teHeivrt0gJWNppyPmpCVnHmBkJp5Yn16Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPzxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqals6adjJilv6q3saihv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqhmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqZmfmKmooKqmoaOru56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4ZliZ9wZ6yPio9tb3ekkJmfgXWumZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXFpZ4mWlZhxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXl5iQlZ58h46UdWWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6epLKpmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6OjoJGMpZOnmaiZlqOqoJacpaWnr7qrrJqbk5J7hJeNpZeNkZCYlI2YlaeUnpeoopqwpp6irbqgscKopLSmrLGyq66sqLmkr7iWiqGopbadiZaimIapmpCUnZOqs5mboqugspaioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhoGkmpeVjYuTkoqPhoR+Z4uAdIN2dIiMcadtfJWRlJOBgY+Pj46dlKCVl5WggoeTjHBoj3Zvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUQ+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStn6C1sZGOq8W8xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp6TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+ctqOdp624qLDCrqO4p6+vsK2qqrS6oq+9mZKmo6a2o5Kdpp6NqZ+Nkp+jrK+aoaKwqK+XpKCcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2VlIWSjJCMlIuBfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJOhkpyVoIOGl4Z5cZVyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqQj5yls7quq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJioj565tqSlmJuNiXmBk4yak4qVkZSQjZKWooydnqien7ikf4SwtqOxsHSkv6SyoHh6oKuzvJV2rqSfioCqfmRcYnafjqSdg5d+bpOznKOnrauiZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuRhZ2akJWCkoeOjpKJhXhrkId2h3F8hoGAYWmIi5WTi1t2lZFnaI+OcnqkmJhleJiGgXeXaYOJgm55f2twZV91b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLx4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc7OFVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyVpqOhsLGsq6mlqa2jp62kkparta+xpZqqpquXc4ucr5+oq6eTlrigoI+co52RfoiImp6Nq5qjlaeino6Xkp6Fda2PiKaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPk6COmp+mmZyyloCMnLWetY2Sj72ooX6nonqjr7iBjo6nn4SLhY+xqa+MiZaimnmBi6yGnJ2ip6moh5WGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmN5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDn5uGmH6RiYGCmGqNjIRqeHtxcGdkd25pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+QERJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrsa9sKGWp6i1no+DnKucp6KgjZC+npmNn5qgkH2FjpmXiKudopWgoZKNlImGgJGnjYainKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GfkZafpJaerIiftIm0mq6Lyoerrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaokpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhoB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2drXmJubGZsWGhHXFFMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFldY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalKCjpKqilqWptqOvf6CnnKWenYmUvZmTjaCRnZB5g5aWkYermZuamqGFj4x3m5yPn5CInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRn4+Tn6GZoah+oaeHrZ6glq6Pn52dkYaBoI2rr4ekjaqajJp+o3aAmJNrgat1Tat4h42dkZuop4Gqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhFxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW50cmpqb15qb2xraFdpT11XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcXGZmaWliYmRiZGRiYWJgY2RjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZegoaWsrKCdrrWjqJGgn6CmnJmOmLSZkIuejJWLdYGUkY2KppaVl56efpOFhqykh5uQipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkqKMk56gnKKlf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqJqPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Osq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvdHVxaG5Za2xzcmVcaV5iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZEhDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJuinKOjpa2bmrGtrJOXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Scln2RiY6ooYeYj4qRopObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5SggpadoJ2gn4uJd5yYooygcqKLiKmInKeRl6irf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbnF5d2poW3BqeXliX2ZYYkFQRU43VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNHVD9ZUlldPkRiXVZgUWFkfWlFQjlOW11YZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mnJynn56ump2wqKudl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVl455ioSWo52JlI+Fi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh4+Wmn+Top+gopOYcmifiqCPjHCSjIKpiJmfo6mgqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6l0JNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfX1tZF9raXd8ZGRhUl5WXVRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRFdBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5haGJfZWR2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZycqZOhq6ShqI+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5WHcoCJkqCccpGQgIiYlJ+ahI6onJqViouKfINshYVxgaGMeIWNiIeSmZV8kqSgn6OIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHuDm253eZdrm3p2l3JsqaVnX2V5cH+EamZmY252eGhgY1NbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UD9QTVdTWE9SUWBlZWlSZHh5d0lGRWNdZFloalRpaGpvY2pnYGNgXF1dX2hiYWhlfGReZGdka2RqbWdobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKONpKigmKmJmZeYk5mTkqCXjoeFe3B9hGh9j4OTmoF3kY2OiXB/ho+TkmyXk3yIkJGjlYOOqpqUkoqFiXmDdoeAboGfhneAkoaImaKXeZOipJqfibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXOUioCfYZ6XqW15lYefmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbm6t1gpptdHeXaZp5dJhxUEV8s15qdmt4h2ZqZ2J0dXFuVl5UWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmb2xlaWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqKkjKWnnZylgpmXlo2XkJCbko6Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKDl6mXjJGLgIl6gH2KeHCQoYZ5gZWHiZagln+UpaiclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpq2p1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHOLmG6hb1OIj2+gXmSnVItdU5htbXNrcYFtcGhreHNrb1JYV1dmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXl1ga2JqaXZ1XVxjaGNqanNsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepYyioZqiooCVmJONmo+Ll5COinuHcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKskIWQioGKfYCAj3Npj6WEfYaUjYiYoI6IkqqnnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfKV6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhf6uLqnaAf42nn3effYWklZ2gaZqHdqxnnq2MtnN3voykk1mDpo2rYXVyc297dHFian5uaGxTVltVYWFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYmtibGx6b1xcYmlibGp3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnqSJmqWdqZ2Ei5qPhZyRhZKNjI10hnqIg2+NhH2Wk3R0hnKSgm1/jJKHhpSPfXuBhJekjX+lpY6BjYmElHWCh5JvbIqogIKLlI6JnJ+JjZOro6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoIN6fYlsjIVbeXlyeXFobn6SiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2l4jmaBgoaOqpx+dH2XaomIb4B2fIV2bWxnjHN4e5d3hFtqWHiPaG13cnFvd3hvXWyGbmlnVlpgV1xka2RVYVVeUV9wd3lranZlampqdXxxcnRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNqZWxwdW5aW2JrZGxseW1obG9hjpW5qKaLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eiIybqKCgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm56Oc5WLiHF0a4J2c4BZcm6GkIF9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDcIWNeW9lZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtsYllZXlpZa3FbXmBZXl1mc317c29zY2traXt8cXt3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHVvdWdrZ2RdYVhraGtqcXJtV1tlbmxnc3pvaGptYIyMqrChkKOhmp+emJ6ZqaOhfYOXq4yflIebopCllX97l4R8kpmIiIaGinJ9gIt2hYuBhJaKcW+AcpiGhH6ShIOGioF6gIOKmp6Pgqagh3iOl4iVi4udl4SDeqyBkJeZlIqenYeIoaugoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI2yk5iEpoyMlZufiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIeKiY+BdmuBg3t5mWlyaGBzinB9end2b3d0gV1eb4dobl9fWlxdU2dxVWNbW2FsaHR7fHJucGRramh/e214f3Fpb3BsZoF7coGAd4B9f4R6bYKMhnx6eHx+eoN4TmR2a3NtcHpka2ViYmBbdGZwZnJxbFVdbHRtaHl6cWdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNno2Fn5yKnpZ8eZSCe46ZiYaEhIZteIGAcoCHfoiThG1rfnmXhoSDkH6AhoSGfYeDjZqckoeqnoNyio+FkpKLnZF9jXqpg42Sl5WOnJaGhpunoKKanYaDkpqZmZCapqCmnZ2Ql4GSi3d9iI6FpXt8j5CRhpiqoZ2TnI+Nqo6SgJ6MiZOanoKOl36HjoJveIVxdGB/g4+GdIuXgIOPgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qKinaFh4iLfG5rfX97bWhrbGdeeX5nfHt2dHV1e3dcYHB9bnVgY1pcXlFmbVNlWl1ha2l2eX5wa2xka2lngIBsc4BsbHRveG6EeW6GgHaCgH2FdnGCjYh+e3p8f3uCimBpe2t1aGmCZGpjYGlbY3Vob2J1bWxUYnF5ZXB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXqNhXyJkYOMgoGCbXt/eHKAhX2KkHxraHyAl4iBiI58foaEh3yPgY+am5GIp5x/cIuKi5KHoKGKhYx8p5GHj5KXk5aSd42joaGelpp/gZCamZOMm6OhpJqXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIKbkYmSl5t+kpJ+h46BdXSCcHZgfYCNhXGKlXyIjHKNfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4V1goOIiHplcXp/eXpwbGpmXn1yaHx1dXN8coBqXmB0dnB4ZGNZXl5Sa2hUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9xa313hnpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhh2hsYl9xVXRvbW5geGhtV2p0dmJ1entxYmpveomNn7KSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N8hZeKgoqNeH2AjIN5loCVl5WMlqCafW+LgZCThqabh4yJg6WVhJKKlZeSkXaRnqGhmJSYen+OmJeOlpudpJ6Zk5ScepCGg3iFl42efoGKjoxzl6KeoZKYjo+ijIyDlpiDkpaZfpiNfIiNgXZxfW16ZIB8ioVwhpN/kIJsh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIOCdnuBiYV1YHd3fXR9d2ZrZGB+aWp2c3R0fXF8Y2Nhc251c21hWWBeW2xkUmJXX2Boa3V5hnBjamNtZmh8g2xodGhsb2h/fIJ4bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGoJOXmHx3qZyKmHmXnIuLmJB5fICLfXyDe4CCgHhzeHpzfYCEf4iLgGRefIqVh36Eh3R9fop/fZiElpOWjKOhl35yh3uTkYqnj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZKUiZ2dnqeYmI2Vl3SOj4pshpiQmXqHiJCJb5edmqOTlYqNn4yGgpKcf5KSlYaZiHuKiYF6cXlqdWx7fot+bYWRgpR3cIKDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9gHN0gIeDbWF6dHpxfG9hbmNke2Fub3Zyd3dzdGJ2YG9sdW5vXVteXV5qXk9dV2JhaG1zeolrX2plamNod4htZmxoam1ogHx6d26Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId357inx7gHZ3f4BwdHN6b4V9gYCKfnxgXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpImNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCPkYmemaKhl5aJl5JvipqFZ4aaj5R6iYWQinCWmpShkpKIi5mMgoCRnnySj5KLmY57ioSHdHN1a3FudXyLdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wb4CFg2Nod3N1cHpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXl9halpQV1hkY2dxcX+HZl1paGZiZ3GObmRpZ2VqaIB6d3RujoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+dhpOcdICplJGMhqCMlZOQf3R7doV4eH9yc3uFa3JveW2JdoCAhm5xW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ6Kj4aSl5WEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJahm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnpGQiImVjn9+j5d8kY2PjZqSfIp/gm92b2ttb3B7hWlzg46XinF3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwiXyHjXuLh4SJj5yjiHyEd4KLgHh4bmqAgoBdcnJxcHB4Wl5xYW9qXm9pfHlwbW1qbXZgcG9rcm1ZWGFhYm5YUVNZZWZjdXCEgmJda21kYmZrkm1gZ2ZfaGuBdXJycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0gIJ/pZWarZ+nloWNg3+XlYOPn3WKn5OShYqajJWNi3pyeHSCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSl5uRmniReoOMkqSak46JlZiShIaWmYyTi4mPj4iehZCKfHOLhYiPiJyZn5uWlICUf2mGnYhoh6GIkoSRg4lxg5GXj5qNj4yLj413e5KQeo6LjJGWjHyIfIBrdmpta2tsen5heX6OlYF2eoF3g4x8eWd0bHSHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGlrgYJ4X3dvbWtxclVecGJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOXGVkXXhwiHxfXGhyYmJlZpJqX2hkW2dwfnBrcXOKfXZ8hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV3ZnJqg2CHfm9va3pgam10f3RfdH14hnh0c4V8eaGQmrGcpo6Din+DmoiAi55/ipmTjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkneUkJibj5h7k3KGkJ+hk5OQipKblIZ+lpWIjY2IkY2InICOgXh6jH6IjIqcm52blZN5jXdoipKIbImkhZKIl4OGY4yRmI6UipaMjYqLcXuUiXuOiIqSkYl5hXt+bHtlcm9qa3l5W4B5j46Aen5+f4aOenpoc2tzio+JgYWFfZaMbH5/b4GNf42IfoR7g5CWmpuLfHd4g5B5c21mcH+DbGh0b2doc2xTXm9lcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYl0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eoaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdWVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmch4WfkY6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFxhoujl4mOlYqQnZaDgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qYmY6Qdot3b4eKjH6LpIWSiZ2FhV6LlJeKjomOi4qEiWx7l4J9iIWJkI+GdoV9fWt9Y3h1aW14c1eIepGGhXp+f4CFjH55ZXNqf4mOiYKDgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIiNdXRxZ3V5gmFzbG9haHVmUmBxZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXd3fIhxg4R9foh7dIuIiJaGjH5+l3JndXF5bYx7b3RwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSFoY2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcYaJoI6Ei5WKjZiUfI2TiIOJj3uRi4aQgn92eIOEcoeCkpuWlJiGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomGiY2HgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYV8gIOAhIqCdmJ0bIiBj4qCfoCTkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscWtyeIBfcmhuXGp1YFFlcmlmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKho+Ygo2Ce5J0a3d1eXmTdW94en1YeYVxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9ipqIiXuff4OZf4F5cnNub2RyfmlmbHd3W195e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGemiIi5mGgZKRhoeYjXyNjYGBio18kIx+ioV6dXuCenGGgJWZjpOUgol1hId3hICLk52fhpaPn36IYX+Th4SIhImNf3+CZn2RgH5/gouPkH5tgnyCdGttdnRzdnVrY42Bjn+FfnyEf4SIf3Bfc3GFfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH91bW5qa3p9YmdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBsWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlnyJhnaJgW94eXuEk29ufIF3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx6bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiY+WgHuUjIGEm4x8ioZ9fImMf5SIdYqGdnZ9gXF1hoGelIWUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXKBfWZ+i3t5fn+Hi458aYB8g3Zmb3h4c3ZzbGqNhYqBin94goCFg39rXnJ4en2NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuaGd8dmNbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpF4g4p0gYhyeXh+jZBvbnyBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSLhJmRjIVubIaTkXp5koaBhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpZCEk42Df29/g3eEeYacmZSLk5CVhYdwe5KCfYKDiYNugXdogIV4cn9/g4qGe2V9foR1Y3Byf2h4cG91mI2Ggop8dniAhHmBa1xxfnKBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36EgHd6ZWhqfHBfWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2tneXFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoN/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGh6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYKViHyCeG52h4SDl3dviIVrdXt0ZnmCg6eLgo+LhH1ugHR2hHqHnZGMkJKTjIqGfnuShnd/hI2DbH9yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH+FfnN1fYBzgXBbbX91eYuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bmt3gIB1dVxpaHdwWFZ7U1pwZExbcnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlX3RwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgI2ThXCAi253foB7e4iSiX9oe35qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyOfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFsc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkh4CHjYl+bn51f4F9jJmIgpSSmYiKhIl8j4hwe32Ee2h+bGqAe3ppenaCh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWG+Ad3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm5qboKCdW5dZ2VzcVFaek5cb1xPXHNwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YVx0bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bnd5d4p3fXiAgod/g35+em2FjIiYo42Eg3t2jHlrbISIkHh9e4GRf39+ioNwcnBjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmZ3dWNqfIOHnoF/f46PfXJ/c4R5gJKRg3iWjpWOh4KIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qa3Rne4BpdoCLkJR+en1+cHt2e3R+YlZ3fnNzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWhicm5KZHVMXm5VVFpzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAfHh5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4d7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHR+d4BwcX9thHSUhXh0a2B6gnmIj2Zxg29ndm5bbX2AkJR/gXmSk355e2yHdoGRjIR0loqRjYaFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjo2Ve3SAdXF/enxtf1lWdH5wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqX3VkSG5uTFphV1ZWeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdWnpiUVVcdVtbZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDfHyGh3iHfH2BfoSAe35zdnmMjqCNiXqJdnWDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV7amx1Y4R1koF2b2ZefYJ6i4llcoJranFjWG16hpuIgoJ0mJV4f3xtiHGCioyIcpiOkIeEi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGaBdmd0h4uOlXxxh2pufYF5bnxdWHJ/bXSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYa193W0lua01VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZfXVV7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH91i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i212gHljg4aWhXORim+FhYF6g3RjbmtaX1tdXVRnc2VgWWRycmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6AcmliXn94eYuEZnF+aGprWlZvd4qjgYR/cpuUcoF5dIJugYKSiHSViIyHg4iFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWNhpZ/b4tmanqDdW10YlxvfGt1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cGZsYm6Jfm1tVmtgd1VKamtPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxaZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9do9/fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpd318bIOEk4Byj4JwhYJ+gX9vZmxnWF1bXFtUZHBkX1dicnVpdW9lZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW5renFiZ2tnhnSNg21mXl99cHuJfmltd2ZpZFVXcm+Np3yEfHaXkXR8c3x6bnx7kYV3mX2HhYKGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2VgbXpnc3iKfH5idoN2amtxdHtxenl0fWZ+f395d25kZmJuhnxta1ZqYnBTS2lqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYlVVVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn90dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSRf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8e3WDgox6b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXJ6aWhsaF9iV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4NmZVhid2l+h3tvaW9nZl1VWG9oj6l3gXp8kI55dXB/cHJ1eY5/eJV1hoJ/hYd1anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9yY3FpXHB4ZHF0iHx4YnOAcGdqeHNybHh3dXhkg3t/eHZwZGNjbnx9a2xVaWJmU0tsaE9HUmtFYXhnYU1TcVxKTVRZZWt3e2VebXFpZF1WYFZubldLU2hXZl5YTlVsVEpceV9bX2tdXVtjZWB6aGxhb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygnp2gX+BdW6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl50gWlebWtcYVZcXGyBZXF0fWlpXGt2dmd0d3JthXt9fXl1cmx5aGl4Zl1kc2h6d5KAYmJUZXBngoV3d2ZoamBXVllnY4+ob353gIuOenBxfmh4b3mMe3ePcoR9fn+GbmR2c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHpvaml7eXZyZoV2e3p1cWVhZW1zfmlsVGleXVRLc2NQR1ZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2hYWUlXZVFIYnhaXV9sW15cYWRef2lqYG90eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcoh6dH18dnJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1ccoRoWG9tWl5XWlxse2Jwd3ZtYlpsc3NndXVwbIR5foB5d25udGVpdGVbZ3VmdnaReV5dUmZma4OCdH1iY2lcVFhdYmOQpWh4dIKFkHhtb3poeG17hHt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNieGRbb3FicXGCfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kalNoWFlUTXdfUUpZWEhidWRhSVRtU0pMWldpbHF7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoaGFueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeXN4dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNxbVpaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkp9lcnGFhJF0bGt6bW9we3x8cYF3f3J6eXlkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BvcWJfanF+bGx1fnNxeGtwYVxlbGx6YWdTZ1VXUlB1W1JQWVJIY3RiYEdValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaVNURlpcT0hydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V4i29ue29meHB6bHN2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPbm1cVlhVZ2p0Z2J0ZWVdWW50bnB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVveX51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvVFtma2ZxdIF3c2NsdlVicWpbX29mfWZtd31zc3NqbWBaZGpqd15mVGRVVlBUbVdRV1NQSGRzX2FGWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWZUU0haWlBNeHdbX2VsaVliYF5ej25iZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZXxwZnpzeWxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmlsX1RWU29nc2xmeGRkXFhwdGxyendybYh7f3acenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cINfYl5nVlhfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVGJuYnpjcXd7dmtwbWtfWGFnaHRcZVZhVlNOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV2XV9mbWhYY2FbXo5wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiZmZmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkY+Pj5CPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGMjo+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioqGjYaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aLi4aOhouPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PDo2ODs8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5Ok4/ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTtGeV87PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DREQ/Pj09QElIQ1h5b0M+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGRU5AOkBlfn54cndvPjk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBNe2ZAa4eEhIOCenA/OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP1V1eXGBgYKCfISAckI9PT89PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VAVXV0gX98g4N8hYVoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBMc3N/f32DhYaGh18+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVmd4GDhIWGh4eJhEtERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1h0goSGhIKFiIiNY0BCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMSluEhoeDgYOGiIl9V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZYeHhoGDhYCBgoOEhYWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aDgIOEgIGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdoV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUiCg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88V4aDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWOIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QD9BP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTUtIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojw4PT47PUE+P0BFSUtNVnODhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVlFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE5HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUU1LTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUg/XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSkNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUk5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25zdXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVVNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdHV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQkZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fXx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTUtMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QUEhLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTVBHSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTUxOTVBNTk5NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oj0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lHSFBLREpNTFBOT05PT05KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT86Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkhLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVEQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2VlZ2NnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVoZ2ppaGpmaG5sbG5tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIRENERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3F1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNGQkNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSkhJS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURHQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRkxIRUNDSEtISEZKTExGTUtMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNnYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBsaF1qXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMSEZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKT1BRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTk1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SUpHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FRUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExNS0tISUNFQUVDSEdCQUZFQlZVRVxUXlNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9QTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQYFVsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUE9JSlB/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEpIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cmBgYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx1Z3J5e3NzdXl+gXN2em58fXl4cm5OSlN0TkNCRVBQSUtLSkxQT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKS3JvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MVFNST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2RlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1PVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYWFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1iaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRUFJYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFNUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeW2RgYWBhY2VfYl9ZWl5bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTT1ZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bXFxbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQWFJTV1NXVlZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVlcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1pYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWl5WV1pbW1taW1lbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVhVWFdYXV9iYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNWVFhcXF9gYF1hXVdgXlteXFteWFZYWFtbX2BcX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFdYWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmJhXWBYY2RiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXZ2dnp7eHt4d3Z4e3h6eXl9enl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8ent9enx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7en15fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3ent5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKFhIODg4GDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCAjYyBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYKBgIOWloOAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIKDgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKEhIJ/fX18h5qYhoSChIKBf4CCgYKCgYKEgoGBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYODi4iFfnx8fX5/mZqGhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSDg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gIaakYZ8gn+Cin6QmoOBgoGBgoKBgIKCgoKBgoODgoGBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWEhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9+hZ2ehYOLgICFgIGJgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICCmaGHhIWIh39/foGEg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKQnIOAgIGBfn59fYSFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aLgYB/g4uBfX18g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OCf3+Fh4SBf36BhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/goWCgoSCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhIOBf4CEhIOBgYGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4KBg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgYKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgH+AgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhYWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyMj42LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4ODg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWHhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18e3t7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mNkY6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY6QjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjo2KioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSDgICAgIKBf4CBg4F+foB/fn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18ioqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gH99f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhoaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIKAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f35/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx/gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fYCAgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+AgICAgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf3+AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIOCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhYSEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4GEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYeGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhYWGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WGhoWFhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSEhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn59f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fn17fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9fHt7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4KCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gHx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWEgoF/gIKDg4SFhYeGhYSGh4WHhoaCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vY1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyJor+8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnyuqqqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWlaAr6urq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhhrKvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy8/T09LS0tLS0tLS0tPT0tTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/O0dXU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXR062Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrcuauriZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp68ooyAjcWemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbrKCIrNa6maGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUorGorZumspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJrBop2Vp5CahJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCexKe0q59/oKmFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qombDO2sGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj0+PDs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqCnkaGfoJmolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqeet6Sro57DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmnj4+s2MKPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1b+/1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVISUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HSE5PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaSkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWkpKKgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ6enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaepp6moo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaesqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15zX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKqooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZWRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4b3lqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N5ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMjJx8XJx8jHv8XHxMTHyMrTz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwsnBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3RiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvHvdTTx8jNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxM2/kMvGxcTBxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vcS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJnY1taWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbizrrq7tr/Rn4jAzru/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb7Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBQEM9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOTkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3sK23trjEy4yFm8i9u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vryyra+ssbC3vLe7vcHEube5uLC6tLm8ybqDhYa1xL7Ht7m4rbe1uLq0uLO7xcbLwbzGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7mxvb67xLa4pYeAi3uOnMWjfIOFscvGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6OwuMnTtrq+vMa0onhlcmVVYGaHjX2Hh6rOztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxs7/LyNu+vb28gWp2YGd2XldWXHOAiYuozMjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLXGkHHB08C0fVtMb2FQfH91YlZgfoaRqcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru70pdyg7XCm1hUVo1iUmSAhIVtSXKGl7TCvb/GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ttLevq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz5DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wteYf3KLrnZST2yZWlJVWpqUd0xujqK0uLi4wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZl1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucPVnYl9eJVgTmqNdV1RXWy6tXVUV4+4tbKxt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxfY2FbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAyp+JgX2AWFiSj2dxYHdyepd3bmtfi72zsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXWZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ucWrlYmMeExmoMN9hpuQXX95bHV5ibG6tbG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO7t5aToIpNaJKTdm95cmhpa3aBd3ilvLiytLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKqvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsremnaiTWIBwc21ka19ZV1hbYl9sgZu5sq2zr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqairq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdQTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKmwwLGzfHh2cnRlV1ZPSUlLTk9PXGtwprWqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHT1JOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamhpsfEpmFmaXJgUk9KcFVWSk9KTFReXYG3r6+ztaqnrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnpy7vH1vaWphVEpXcJyLellMRkdOVFRorrKwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSqsq+imZydnqGZm5uamJmblJablpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk9PVUxTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopueqauWfWtdVE1NXJ3Ey6lvWUxFQ0dNYZiwrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rbK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGjim9fVVJRVWnA49K0nYdvWUpFVJGYnauqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnoJmnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQ0ZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempyjondZUlFUVmiDwMyzmLHIsJSKmLnFoqmtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urvAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qr6Odq6e2sa2isKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIREpQSD9FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian5+aoZ1oUEtQUWmBnLW6p4ez4NvW29rItK6no6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7u6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGinZyVXUxHTlh+k8C4pJCY1eTb0cS0pp+anJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0dLVztPJvcC/w7vGxcjF0tTN09DT08zKwsbGx8rIzr/I0czHxcfFwbzDwb6/vrW+s66/v8LDx8THxK6/uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5yelmFKSk5mirrX07+vwNTLua6oop+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTW2NLXzcbHyczDxcrPytPX0dfS1dbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvPxsq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QT8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKR1XWdtjbzY3NrWy7qyqqOdnZ2hpaCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ1tbW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0srS1tbZ1dfT1tjO0srP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8bJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPjs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6Osin+Ts9LV2trPvK6om5WYoJyboaKfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dfX19PWz9XU2tTUzs/V1NTR0czRzdTX1tPV0M/S09HJ09HI0NjX2NHY0tfZ1dbMz8/KzdLLztDAxsLHxc7N0dHRyMzNwMrMxdPOy87IxMrHxsjMytPT0dXP0szTwbnFsaWota6nm6ispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKGlnICUlsfY09bCraahmJWXmZudoJ6ZnZ2TfXFlY2NfX2FfX2FgX2BgX2BmbnBwbmtvcnd3nMzB0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3OzM7PyMvQ0MrOysLJx8nMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2pp39sgZTT1s2wm5uWlZebnp6fnZSWmJSIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPx87NzdTMztPNy9fW0MzR1MvM0NLTys7R1dLV1crAycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz83Ix8vFxsHFyszNz9HG0M7NzczPxcfBuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBxa21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKpob32n2dCqlY6NmJaRk5KRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0tDOzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfL0MTFyLvHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raWiX294udCrkI6Ol5CHhISEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwszQxcvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsa8vMDDxczFxbvAysLFx9LFwcm/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrKykV9ygL6wkIuTl4d7gYWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8vLq4wcHCxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/trW9v7vMw7y1usi6v77LxMHGwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rr4NjdY+1koyJi4V5gYeHgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S8tr2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29wL2xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL66uMm2qrCBa3KZnI2GiYp7eX6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqayptK+3sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4vbCwp7Kztbu8q661pa61rruysKm5sK27rru4u8DAvbnCv8fDxcG8xsLIy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwsnKvr+8wLqytLTDrqmuhmtkipKIjpB8eH6KhXp7hIF3bl5dXF1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWlxkbm9oZ2dpa25yga25sLWupqWnp5qgpaGanKWrrqSooqyqrKqvo6afqq21trG9ua+3r6muuLS0vLi0vK+3ubWyu8GywK6lqaKrsbK0qL2qq6irrK20s6aorqGkr6mypqeorqaot6yxsre6uruyvL2+vsS/tcLBx8i3v8DEt8TCv7u/xMK+xMjMyr++xMDAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w766yrfBw8G0tbu1sK60u62op4hgbY2DiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqWbmJGho6qkop+lpaelraCdnKWmrLKvtrensKuoqrSrtLqxtrWutrmxr7q6sbakoKSfprGoq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S4tL7Aq7W7saukrrKsn6GLYYCHhoaBfHl1dG9ta2pqcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuilpyjmZaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqqyspLS5rbewrLO1rrK1rrCqn52fpKKypaapuK2ipqafqKyrmZ+gnpmdn6WamqOcm52vqaunqqusrbGyuK+4ubuwtry8uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6u4ubChnaiqppadhWaChYZ/eHJucG5rYl5iZmZdXV5dXV1cXV9hYWJjY2JhX1xbW1paWVhYV1dYWFhYWl5iZGRlZmZoaWtyjaedlJWVm5ibopeWkZyjoqidm52lpqKmnKCgm5iurq2usqCloq6sp6K1sbKyrKivsqe6s6a1oKKem6OiraOiqrWqoqOmnaamo5aZnpeZmp2gmpeenJybrKGrp6Okpq2rs7SqtbCzq7K5tK+pr7Kys7ezrqmsrrK4sLq2ur2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqssbStnZijqJ6RmnppgYOEf3hvcXRxaWZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoZ6hnJahoqmkn5+pnZyaq6evsKqbo6S4qqGgrqi2qqanrbCkt7Ckt6Cim5mZqqahmqy4sKKhpJyin5+TlKGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqets7Clq66ysbCwrq+mp6eyrrG0sLy0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ijqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrry7tbu8tbi5r6+vp5uYn6eSj4pyeoB8d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2NiY2JjZGZqgZaTlYySlJSbmZ2Xl5ygnKCWoaCmpaSmp5+dn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhopStsbGfoqOdnpibk4uhlJGTmJiTl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa+8tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Nzg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu6tbKrq6WYl52hiodxe4d+dm5jYWZpaGZnamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtaWVpbV1VYV1RUVlVTVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlZaXpJmgl5ygpaKtpqSko6OinKqrpZmfpbGqoKGdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKKkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSlRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvbG+xMmssbjBtbvAu7SzqKmklJiZmod+cIeDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl9fX2JkbY6QhJGHkJGPmpOVk5ybo5yboKipq6isp6ilpJmlrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJujlZuho6GXoqijoqiroKuvo623paOjoqytqqirr7O3s761s6uvmIR0c2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLu3u8PIsa24v7e8vbqys6OnnpSVlpSFeHOAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1dXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CsqqaurKivpKian6yglZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5Wnq6WamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cnNiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba4vL7Bw7GwsrettLO6srGhoZqblpWSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52omaGlm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXm5GRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmY2ZpKaopqGftLKosrehnKK3rKqtpLKyprW8tqyrsaOJeHNtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsur20t8Cvramwnqatua6rnZiZm5SShXqBbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZeinJWNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+jnpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqChpKSborSvrK+sn5iluKamsaGxrpywvKqpr6qZgndzY1ZNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4sLSwycS3ucHOxb6zrLrBq63DraiippKdprWroZyOlJWRjnx2fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjp2Xi5SQn5idlZSWlY+WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOVjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYqLSiqa2jk31ybmBbTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT03Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubG1sMfCt7O9z7+5r661wqeqxamjnZiDlJuuoJiVhJOOioZ7cnRcUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiGlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSm5aenZSko6ippaSem7CqoaSkkaaqlqKqnKKmqIl0bWdeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY4Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpujp52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpWOf4mTp5WUiX2Ng4F8dm9tWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4F2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3yBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOhn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBJTFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc2MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Zo6KYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpuNkH52hXh7dW9uaFhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcYePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V+jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CelqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4SSeoiNiop2cX1udHBpbGlXS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5aXmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOS01OS0NITkdFPzs5OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqfpa2woqyqqLWvrqy0v6u8wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAhYuGdW91bHBsZGtqWE5FRkNAPD4+QUZGR0tLS01QUlJSVFVUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpJ0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cf3h5dWp5iYKIioSWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwsNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaPlJmLjYV5hJCYlI2QjI+GcYeCdIeMhXlwc3Fub2RwZl9URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqGVdHiBc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm5jdoR+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBfUk5bWlhXTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZOIlpGepKeer5Wltaqusa7BsrvBxpaQjJSQgIh9boGQkomDioePhXWChGyViId7dXh4bHdud2NpXklQRz5ANzQ0OTs7PD0+QEJFSExMTExOUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHp3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKS0VLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXI9MjMzMzFFflc0PTlcjHiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4FzoYSLfX2Bf3CAfnpndmtSV0xARTIxMTM2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3J5dmhta193fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVxVUFBWWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMzM2Njg6PT9AQkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYeEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhloqOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0BEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4tbLjMxME+DXzQ/O251cGZ4g3uAjICBkY+Lm5uknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Jf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSEpMS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgpaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpiWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIaEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI1NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShZyhmpqZp5GRiJWimpp3en6UmJKhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYKAiYyKhJKFgoaIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTpKGgqqGkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4iaiZKKlnp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8a2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+rpJV2n6SXoauxs5iWqq2orra7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoaAhoiFioeRenhuXVZARU08Njo0NkFCNzY1MC82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrzFvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxrqatrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiriX6BemlWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBNQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y/O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLy3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWn5mfrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7y8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWFcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaObpJ6rpZSfn5CUjpaYl6ifpZ+fmpmDpJ2spKqwrbewvbnU0c/Xz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Iz7Sku7C1sJusub2afnhrXF9cWV1hWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pPm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5WWh56Zppusr6ivp7O01NTV1tLLz9PVztPPzcXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltcXVhgV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuRnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM3S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxWX1JdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8e3Z8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjHzc/IwsvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XU1lSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqYkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDM0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVZFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9yfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlYyGe5uIk4+uq5SVl56Ypq62vaitvcbLyMnLy8/JxNLK1NbY19jX1NvX09nb1tDb2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTQyMzIzNjQ2NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmquWkZGLjZKDjIWJiIGFkJGenJmJhYuBhpd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19TVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NTU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXiKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GSlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYuUkZ2Rgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk7Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY+KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuQkI5cg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjo4aTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ5Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhtYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Vm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBjn18bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuooOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6WhiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrSdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmeo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKNkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE9FQz48Q0FCOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OTY+PTQ3VEtDVVFKNzw6SUFFQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLStq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSnfoiGnK29sIOMjIuQg4+DkY96gYiQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWRkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQkxARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0I1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKics6WkqZSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJKPiJegmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSERMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB8jX94h4KBkHqNoZaompqYur3HyMnB0snKws28wbOtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gtq6yXh5qpp6WRgoyTpZWJgXaKknqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu7/CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8K3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1tK6ul5alrKigkY6SscWnlY59kZV9iJGZkKqZmJOTj5OVk6Wek52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK7uK6ouLq9uIJrbVlWVFRNRUpTTks/QkhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4KchIOVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5Wlra6upYuTlaGNdMGafpeZhY+WmoyxlZualZOTmpmlo5Wgm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKytsbGjobKytKRvbGVbWU5PS0VPUFBRO0hKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLTlVOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZOFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqKatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaInJimm3a/oIWZnY6TmZqLr5ehnJyXlZufoamfqKCZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJytqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsLHyMXCzcjBvbmyr7m0wMLKtcWxwby0uqqoraywoqOYqrS7pammrKqdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6OYkaKgvJ+JmqCZl56ej7efqZylo5ucoZqopbOhm56mnKiqnpmVj5Sbi5eJjKWilJ2inqC0r6Wkk6+rmaurnZ2ko6iRlZWgg4+enpuVqaShobS0urWtqLWys56co6Wal5WZqqGedl5bX11KSEZHTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8HCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKlqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijn6Kpq6Gdl42VnpOeh4+FjZOepKGdtaylm5Wxp5mvp5+aqZ6gjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYldMopqjnJ7FrKGfrJ6drqCTo5+WpaCmqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGloKqtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaKdpZirq6ymoZmNmZ+Sn4mPV3+Wn6ahoLiqppOYtaOfsqGgm66Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORkVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IQDVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKSframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrZussZypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaefkqGelZ6PkI2VnZqjn6ezpqaMmLObo66anputkJ6TlpOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS04+O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtcDEvcnEtcDIwbSrtaivuKy/xLS3rqy2uaWZq7Grqpefppetu7SbqLCbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKyhl5eSpqWio5iYpa+4rrK1tqCfqKSZlZWTpKC3o6Smlq+ysqerpqGem5qblpion6CYop6vsqKmjJeumKSrl5mepJGbjZOWmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKewnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurpp6YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6OwsbSrsqirn5ugoJuepZ2il52js7Can4+TpZqgqZqUop6VmImTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjFlW2RAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKqjsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBwMC4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sts56rorCws6uptrS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqWpoKSXkJmgs6qzqqqzmp2nm5qVjqCmpLSup6Ktra6xp7OtsqqknJ+oo56VoZmbqLWpl5mRkp6ZnqCekKuel5eFlJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G3vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6yqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZabmrKjraCmr5ehpJqako6jpaezqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpuSf5KXjJ2cmpaQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YEVhallJSFlaPXtKRkQ2QWJUaVtNXGBKXF1aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbizqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJScmpWxnqecoKqOqaOem5aYpqaluKeisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpaCdlIKRlY+cnJiWlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3V7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5GZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsG7wreysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynJ+nsa2mpa+lnbK1rKuxsa2pqLS6rLOytay0raqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqZlZOHl5KVmaebn56MkpGOkHd+jYV9fHyHiYhwc3F+fX1cU2RvXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrbzMuq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6e2sLKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSjrqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvrfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0rqqwrq2xsLSttLukt7KrrK6nq6Cinq+3qqqturaltrWjqqesrKqtoamnprKypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OIeGpeYG5nV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6qotqqmrq+qua+osbGvsq22qre3prO1q6ykqauco56zs6iopLS0oLatoKqoq6msp6CrrKm5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dxeFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCxrritobavycfI0cC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zsrmwo622sbCzuqu5r6mttauqnqmsn6Kgta2ooZ+vsqK0qp6op6qkqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOio6OnmJqppZiXmZ2OioeUiH2NhoSEpJaEgYKKho2MkIODk6CWh5CckJKQjZGclJePioaFeHSBf3x1eHmAe3RzemiAhqN1aV5la4F1Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6i5qqausMnHydHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqeqpKmdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSnKGlnZiXqaiSmJqTkIqCj4V+j4J/iJ6PhX59i4aQjY+Ef5Kak4WToYyTkYuRmpGVhol+f3J7eX18aHd8enVwcH1ohXiEiGRhaGNyhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj06RFg/Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjuayoqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKWwprCgn6upqKKqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWl5Sfopabl6ari56RkJGMgoqAgI+Ae5qVjYh7fouFjo2LioORl5CGlKOJkZGHkJmPk4CIfHlsfXZ4eGN7enFwcXJ4aIB0aoNnZGhhbnOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1dlTyk7Mk9ZPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOun7ivq6i0u8jLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmfrKipnqCqr6ehppijqKCwuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpmTmZ6TmZahqZCaiY6Qhn2Hf4KOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJCVgouXjJF8hXtzcH1xc3RgeXhpb3Fwb2l+cWN6bGllY2Bmhn9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFhbUmdPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9ZWDUol52mmZ2WraCgoaSht6uxpLO0qqi5xbazrqC3rK6tsLXGyMG3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGXnK+moZ6ip6+ioKKTpKSjt7ChprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5WdjpSXo6ihkImLj4R6hX6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB7cHJ3b290X3l3ZGxsa2log21lcmprZWhcY3N/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTUlJRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVERVXWhFLjsxYFQsMpajoZeVnKmdpaGjobeqr6C6uaasvcWzsK+jta+srq+0xMS9s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpWWmo2Uk6OnpI+Iio6FeYR8hYV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhoamdlb4RnaGhkZmlqX2hiaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtJSEVDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGNOJzKepKOSjqSmnJ6enqS1rKequreorMPBt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At668vLGln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqelkZmmraKZnqSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSOlJiMj5iap5+RiImKiHiFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrY2dkY3R/YWRlZmVpamNpcFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZGQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVdeU4yPkhpWkxaSlZiZkE6M0FlSCU1m6SgkYyuoJmYoJaltLGisb63obHGvLmwsaO2q6uuqbm9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2tpp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWgmaWjqZ2aoJyUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY97gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoY2Fyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKwn7jAtqG0wry9ubGmtq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6qKmftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WWmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl5fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxUGI8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8O4vbytp7awpqukuLSys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppycp6eek5+gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOJhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrq9t8C+qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+fqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSql5SinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayf4BxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srXAtbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6op5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSopWCraeln6OkqrG3rbS9vrC3xbK4usKnqbCsr6mpsa6ksLqwpKSus6Opuames7Owo6Wgqq2wrK+mp5+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9nVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+8qqGnta2jq7WkprOzp6Oinaeqsqiwp6WeoJ+wl6CalZaXmJ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygo6WjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNh6OCpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW6OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyh2yXh19TtbTIhoCJfGOkM0Kddl1RamhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUTgyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCknp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+kKClfrB2g5HS0XVbrnyGf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB3c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi+inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W1tKKysqOgrK+kmKa6rqSxsJy0uKmgpp2hqqWyqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKWnoJWbpqehmqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKYia6Ff4KzXHKzUq5+g4Kkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXmdgRU9rX3BtVlVNL2VjaVNZUTtBREBMOjU/OTE9PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjg4n52UoLiwmLTBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mgoKiitaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqZHN7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1iZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE+OKGcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qru1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLqio6uhl5uRoqCVlJ+alJmfoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjna4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iU2tlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjgxQjmlmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZyZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7KkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mjtnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbpqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstN0A5ppmeoryil7HDsK2pqqyxp7ivtsSxu7Ouu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoKiroJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxegHp9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83TFRfRydTYlY4Kk9dXT0rO1ZWJz07PKadoKG/ppazw7Ssqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKStqqa1qKifm5ago56spL6moaqYlZyRopuSj6GoopOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6Sg3GUhl9yalpdmolhZIeOlWtggJVjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xdHl9fGJbd3SBaFBcboR9e4tqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU2BWNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKywtKy1o76xsqego6mdo5uamaynrqSltaqlm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6mknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqbmpCWgmhufHF2kZeUkYSJtKmNhZiVjoqMmJeHlJWKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs6SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeUzEwVF46Kz04XUssPC1AsqCzob+ipLGyt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop+eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Plq2Pe5WbgpKBiamohYCYloqEjp+Ie4SQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroWJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXVEwNU1bMTdFNFxHNTwsQLSgua++rauusrKgqqayraKss7DFsKqso7OvvaS0nKCnoqGdmZeopqmmpKaztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzyLSfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iNbGhrepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjQ+Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kvN1pPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLGgrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWehq1oeLnEuHGSoaN7ppiZc6qCfMvAwLtxi6KHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Wwr8CpqZSjr6mwr62msrWvq6amprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZicoJ2Hpqukq62/wLGhqq6qlpKfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYJ6lZabX62PXo6ngKGgfKeVm3Srg4CvXmSNqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFxxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3NzE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCstLkowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKsraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnJyil6Cpqp+VoZ6dna6vp6qom6amo6Cqkq2zlqajq6qeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1RcYVpSUkM4SUlARDw+PEBFRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc+V0otPCg9MSkzVkBGIRxHOkMxLiuv1MbHsrSfnaOOo6Oira62r6mwp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZucopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKorK6mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCIoJqHpF9gUquEf66Cm3WugqeGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqin4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY1xXX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+prKOopqqrq6mkpqCbpZ+dpaemo5ysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuiqJ+gppywpqOosay2yLK1qqyqlZGcnaKZn6WznZqhlJyfpquroq2Zq6ihoamis62iqrOyopuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ+VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5PUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKaqrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGYm6aioKqnrqGjp6mwtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esobG5sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWchJ6DrH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV1j5Gjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWurq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnZumpKGir62dpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6iZraGspKWXr6W8raK3t66dnrWyubKzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnYmUkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2JzsrhoeI+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbm1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT9AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7u7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoJ+dpaOcp5y1mqCqo7arwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ynvqyVvrCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioCkpYicbbJvoIetfKGPg6iWmYCsiYSuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4naCPiJOSgHmvXaOBfKanZJ2AfJd0a69dpWtxhZldYFuMoG6VkaaZgpOLlYp5eYKWf2psfmJ9dG5/eWBmZXFvaGdoQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6wrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5moq6uio56pqL6kl8OsqqOirLO6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzgHxhaWZwbWZlZU9VY1tBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnqybla6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIublqGgmpCRmpuRmZennqGYqK2mpKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2pcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6tr6WnlZSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZKmm5OPkZiYj5iTqJmfmKmon6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eWRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOqurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspo6WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppiOkZCYlI2XlaeUnpeoopqvpp2irLmfsMGopLOmrLGyq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHppbGRkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpbW4r66isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRmKyji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCNfIGUjKGUipSRlZCPk5elj56ZqJ+btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+am5kX3BpYFtgWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WXF5eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiXmBlIybk4qVkZSQjZGWoYydnqienrejf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm55f2twZV92b2traFxmY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrigoI+cpJ2RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGWo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmZuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjo+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRqeHtxcGdkd21pbGpbZWppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNlImGgJGojoeinKOTlp2Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjQ2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZiXhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rsIekjaqajJp+o3aAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmxdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySora8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipiol5makYelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwc5OHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVt4xxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKikno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpeeoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXqjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlZCGi52RnJuJj6ijoJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6Uo5+gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJNf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV9iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTX6GntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32RkpaIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8k6SgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOQfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyqLx/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYklXSVRfV1NbZWpcZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36psLK1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF3kY2OiXB/ho+SkmyXk3yIkJGjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHKehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUE9tXWhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UorOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqUpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5dyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCEdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3SKfZB7ZYOHlYqKlZmCfIiFlqaPgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3t+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R0hnKSgm1/i5KHhpOPfXuBhJekjX+lpY2AjYmElHWDh5JvbIqogIKLk42InJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYN9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450coNwlYV7fZKLhoaQhXh+gIaYoox7p6GLhY+PhJWCho6Xd3KEqYWNkpyPiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Pc5WLiHF0a4J2c39Zcm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe31zfnlzf2lUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcW+AcpiGhH6Sg4SGioF6gIOKmp6Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHmPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgomRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoF7coGAd4B9f4R7bYKMhnx6eHx+eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnpZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1sfnqXhoSDkH6AhoSGfYeDjJqckoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8j5CRhpipoZyTnI+Nqo6SgJ6NiZOan4OPl3+HjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l2eX5wa2xja2pngIBrcoBsa3RveG6EeW6GgHaCgH2FdnKCjYh+e3p8f3uCimBpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUi5iZeXmNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+ampGIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyNj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXt7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHx1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam1+aG9wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCUlpWNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjoxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB5iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2c3N0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF5bZCGcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmJB4e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpOWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2Fub3Zyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZmxoamxngHx6d2+Qh3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2Z2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpOId317inx7gHZ3f4BwdHN6b4V9gYCJfXthXH6PkYZ/g4RzeoCGeo+Rh5GRnJKkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2SkJOMmY97iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+BfoGHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGp6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZl1paGZiZ3GNbmRpZ2VpaIB6d3VvjoVzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+jmKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3R7doR3eH9yc3uFa3JveW2JdoCAhm1wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOXd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoGaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHpwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8Y4Z8b3BsdGpob2x2d19xfnl7dHV0f4J/pZWarZ+nloWNg3+XlYOPnnWKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9sbVVRgauUh4J4gHZygnmCoIGRgZOSmJuRmniReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQe46MjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbnlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZlXXhwiHxfXGhyYmJlZpFpX2hkW2dwfm9rcXOKfXZ9hYB0dX+MeXuFgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW50f3RfdH14hnh0coV8eaGQmrGcpo6Din+DmoiAi55+ipmSjoSIl42OjoR2dHZzgHBvhXNwcYNvaml2bYJufXxtdXNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZOIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYp6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3F4ZmtqYmZ4c29wY193YGBWa19edlBOTGBmY115cYp0XFtldmBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn96iX9yiYeBkYqIfH6YdmVzbnxliH9vcGyAWmxueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV/fYmchoSfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp9amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH6LpIWSiZ2FhV6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmyCdm6JkYORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHleYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhxenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmLnYSEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B1e2dgZXzr2rXJw9yIc2xzgHaJmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3GGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6OgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4R9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WDfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J3jpx9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn36IYX+Th4SHg4mNf3+CZn2RgH5/goyPkH9tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05IT2ZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcoCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi459aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18blpbXmxjWmJvd2RnXF1gbGljbGlzdoGDcW5+fH90dYN6g4J8goV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeXp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aniYjn6BioKVl4l5jpZvenNwbGpkYHN6aGBlcXpaYXJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fpSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYdwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxfnOBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBf4N/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnV/fW9ye3uUb26Bf3hmk4uDoZmckoKGZ4eDcGd6lYh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3dviIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGfnuShnd/hIyDa39yaIB+eG18fIKKhHdieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaUxXZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2lsaXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyBgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoY1tiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphwcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH9tWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5dZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWZOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZ19vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJwXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tkUVtwSURjYVpjcF5deGhVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWEdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCDhH57fXl7c4uBfHNndGVui4Rtc1tqXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmpzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCbHJYal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpocmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x9i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGtrWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p3W2d9fHhlcn1thHRldYWMhZV/b4tmanqDdW10YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6Jfm1uVmpfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pdHVzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYV3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbntnc3iKfH5idoN2amtxdXtxenp0fWZ+f395d25kZmJuhXxtalZpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3dmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anN0dG6EgXp/fXV1bnpoanlqX2VuaIF2j4RnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21abYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx4Y3OAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx8a2tVaGFlU0prZ09HUmtFYXhnYU1TcVxKTVRZZWt3e2VfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB6aGthb291bm94dXqYfXeAgXqAgIeFenl6g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JthXt9fXl1cmx5aGl4Zl1lc2h6d5KBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dWVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUlXZVFIYnhaXV9sW15cYWRef2lqX250eG5vbnaDl3lygYB8f4iLhX11dYZ5h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJvhWx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbaHVmdnaRel9dUmZma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVt3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3FicXGCfHNncoBlXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWldpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dIWWFOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWx0b35seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2qFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXlNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZ29+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWVJIY3RiYEZValBJUFpVa2trfGVtb3FhW1pYWWxwV1NPZldXaFNURlpcT0hydFhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl9iG6PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXlrh3x/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIF3c2NsdlVicmtaX29mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNQSGRzX2FFWGlOSFdUVm1oZHxpa3hrYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ej25hZmx5dW5vaHZ2f39sg399hpd7f4eBin5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybYh7f3acenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hlcF1jRllpTUlfS1htZF94aG5+ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo5xYmdqd3Fzbmd2dHqDcoGCeYeNfnyJh456bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn5+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2NjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjY2NjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra2upJ+goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLWoo6SkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX59fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkZCPkJCPj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZCSkYmHjoqQkpOQipCLi5CJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiIWJi4aIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhoeHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYiOiISGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eFiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7PDw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTo3Ojw8Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5O0s7OTo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgYCBgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+Pjw9PT4+PTpNelI6PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExLSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0RBPz49QEhHQF56aT0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpLS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFREg/O0BjfHt1c3hsOTk8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBOTD5BPDw9Pz5CQz8/QUFBQkBFc2I/a4WEhISBeWw7OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhKSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDP010em2AgIOBe4N+cEA9PT8+PT5DRD88PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhtb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0VATnN1gH57g4N8hIRoQUFAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBJcnN/fn2EhYWFhl0+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFR0ZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARURmdoCEhYWFh4eJgkpERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKR1l5goWHhIGGiYmMYUBCVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGCEh4iDgYOHiIl7V2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExJZIeHhYGDhYCBgYOEhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpsh4aCf4ODgYGDg4OEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWmFgYB+gIKEhISDg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNFdYV/gIGDg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUldrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOUeBg4CDhIWEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSkxMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz88VoaDgoOFhoWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QEJgh4ODhYaFhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQERERWSIg4OFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdITE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JDSEhKYIaCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk9NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZKSlBog4OFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0BFSUtNVnODg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUhMTVFXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GT1FRVVl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f3+AgICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVlZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhVVFZUT09NSkxKSUlMTUtPTVRwdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1haWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVlYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/gICAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUWFhZWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlJVU1ZUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFpaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlRVWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4CAf319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1SZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkBAPz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdOSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhSTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5MSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk9PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9MSk1MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48QkY/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVRTU9OV0tMTktMTUxMTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zb3V0bHBwcm9vb3J2dnJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVExKSU1URklJSkxKSktJSUxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFudnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTU5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZJR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFFMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VDRElGQ0ZFQkVHRUVGR0VKTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSEpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01OTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWW1tdXltcXmBfYWBiZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvdklKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk9OT0xPUFJVWFZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93Sk1MS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJIT05fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkRFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5uYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkZHQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUxKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFFcbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RkdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0lKTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTm1ZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0d0lNR0lERUVDQUI8QkBCRkRHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KSUhOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0JHQ0hJTUlGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3NISEZJREVERkFAQUVEREdCSEpMR0ZER0tMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eHhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2NjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRURUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2JiYGBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4iHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUhISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NPUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGZpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTkdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUFRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlN0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLW1ZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RTUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JZY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVlRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFRS1FNS0tPUlRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iY2RnZWRkYVlgYWNhYmloaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVXWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhYVl1qZFZYWVpXVlRUUEtPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbW1ZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXUlNTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VXVltbV1BTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcXd5gGNcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1hWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWXFxWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGRgYWBhY2VfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWlqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVlVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deW1hRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmllZ15dZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVlNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWlNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVlYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlaWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taW1lbWVleX2BgZGNkZWViZFphZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaV1ZaVVlVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZZUFZWVlZWVlNWVFhdXF9gYF1hXVdgXlteXFteWFZYWFtbX2BbXlhYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9mXmNiY2FhYF9fW1hZW1laWlhZWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZGFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBkZF9SWFlQWFZYWFhXVldWXV5eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgX11fWVleXV5eYV1bWllcX2JfYmRkZWZnZ2JaZWdnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YV1lbWllXWllgXmFiYmBhY19cYl1fXVtfXllZVVhdXV9gX19bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxmaGhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFhdXF5fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2RhY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJfXVNcX2BjZGRmZWdmZWZlX2ZnaWhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLS4USYrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv8DAv8RJFBsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f39/eXd3d3d3d3h5eXl6ent4bm9vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYGAgXdyc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3R2d3p7eHt4d3Z4e3h7enl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e316e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fHx9fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx6e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx8fH57eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGBgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhoWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOEhIKBgYGChIWIh4eHhoaIh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoOEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgoGBj4iBgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf3+AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGCgYOCgISZkYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKDhIJ/fn19iJuVhYSChIKBf4CCgYKCgYKEg4GBgYGCg4KCgoODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4OEhYOBgYOCiYiFfnx8fX6BmpiEhIWEhISCgYCBgoOCgoSEg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gIOXkYZ9gX6CiX6SmIKCgoGBgoKBgIKCgoKCgoODgoKBgoOFg4ODg4ODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJOUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/g5uehYSKf4CEf4KJgoGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBmKKHhYSJhn5+foGDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIGQnYSAgIGBfX19fYWFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4aOgoB/hYyBfX19g4eGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OBf4CGhoOAf3+BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISEg4B/g4aDgoOCgYCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4mIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISCgIGFhIOBgoGBgoKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OCg4SDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWEgoKEg4ODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHhomIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoWAgoSDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+BgICCg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDg4OCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+f4B/fX9+fX6AgoODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/f35+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKCgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fXyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGh4eHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4WEg4OEg4SEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgICAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgIGBgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx+e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqIi4mFiJGOi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx+fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB/gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIOBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/fn9/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoCAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHh7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhyeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f36Bf35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3x5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB/gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH6BgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4KChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fH19fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn5/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn59f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhIWEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX6Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhYWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFhIWFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn1/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIaEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYqHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhIaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGgoSEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWChIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB9fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KDh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhoaIhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeHh4iGhoSGhYOEg4ODg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeHh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGh4aGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhYWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoODf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag397gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6e3x5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGSz04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztDU0s/PztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz9K5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNXAlLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImpzOo6CLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBCOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmZu5qHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoL6ZkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJu+qa+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZChrKCarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qom6CapsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTc5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmp+vnpybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqecz6arpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttbLkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXR1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozk4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRUNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amNtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tra2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkBCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJubnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPW1xkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVViUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqSpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqKusrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2FtaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try8vry8vsa6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bCw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9taHF4bnlqaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PysbEw8PBxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjJyMjJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcfBysrIxszKzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1b3NiXWJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcLDv7++xMvIysvIu7rIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWFqbW5vXllcVlZOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwrm7w7m4ubu9wcfBxMjGx8nDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1paWlxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2uLS0tb+7vcC5vrq6tMC4tbeyrrq8tsfUucu+wbu/wby7xL67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmIfXFjYGJiZ2pnZmllaV1WVlRZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL65v7y8t7S3r663tbfTwJjUu7+8u8O1use4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5PTg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLe7vcHEube3trW5ubm60rSMuMPCwr7Ht7m4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/h3xrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK+wuLuyvb67xLa1uLa4wMDFu82ohJXCy8nGz8LAuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRueGNnYltjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/Pj8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Oxub2+srq+vMW4sbi4tsO5v8PEn4SLucrMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzCvc3EvbvEv7mxlYqOeoiVrZeFjK7GycjMy83KxsLEy87CvLm9ubnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6iHptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT8/QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vMbI28K1v7ywjGpxcVhiZniJio2owcbCx8vIwcPBwMnKwsC7urC0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYF6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru8vbrSssHJtrSSdHloYn5pW1pccIqPqbvBvb7GwLnAvL7FxL29ubKwrri3v8PHw8S8vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC30LamxraOZ1Jubk9zi393Xll+krG5t7i3wrqzu7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVEo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/tsm0lrGhZ1hVi3BTXXqCh4BNaJi1trKyt765srWyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbvGspOehVhTZ5xmUldXkql+WFqnw7mzsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPklCQUpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq+tvLO4ure7z7mYk3JSZY58ZlRibaW9hmNTdp67trG0tbK0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZORjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq2ubu1tbO1uce+oJJkUouZcnp5i3KCknVwdW2iwbiztLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Sjoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJmepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrLAvqycVl6UxJWBmJJmdXV2gH59r7+4sayzr66srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq5+mopujnJWQjI+PkJOQl5WWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqnvcm1pFZkhZN+aXRsZ2Nma3VxcJCus7OqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqulqbGjpaieoJyVk5CPkZCYkJaVmJefmJuZmqOZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSkhHTlJOSk5HPEVAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamin7TPwKxdeHV4dGRpWVBPU1JXV2B3hqm1rq+ztaqmrKuinJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZqWm5eXmKGenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR5eWBiUlVgSUlKS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel56lnp6pzc2Zb3p2dGNTTVRIUElQTUxVZGeItbCwsLispqGcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpmcpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVExTTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopuepMqwaGprc2JSU1WFdWpTT0pKUVZZY6evrayvp5+eoqCXkZOboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLK0pKCdpZ+soaGioKCamJaWoJubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhSVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ2empmSmZ6boaGsmHhua2BUTFh6qrCgbFJIRUdMUVaNq6qqqaSfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby2vbOztaKsoqmosqmrqKeompmemqqnn5mnoJ+fp6ilpJ+dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCV05KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmempykoJ+IbWBVUFFbot3gw41wW0tEQERhlrCtqaqln56eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sqyisKaho6+xrbCkpa+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRGSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJian6Can5+Uc2JXU1RZbbPcxrCrrIxtVVuBrLCmo6OhoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK+x8bCt8PJycLBxr66tLq6tLu3sLWyqrqyrru3v7q6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXlxa2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GysrinoaGrqqGcnqGhnZudiV9TUVVZboe1xbOUntjKrKOwrKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGxsrIzr/I0czHxcfFwbzDwb6/vrW+s62/v8LDx8THxK6+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHh0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKSorK2qoJ2jn5ydm3xTSk9SZ4OitrKlia3Mu7Gso56cn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx8zNydLNztPNxcjJysHGy8fIyca/w7OzyMTLysvOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydHZoY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoaVxTkVNVXeTxcqunKOxqaKcnZygpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0snP0czO0MzSz7/Ix8rDzMzMzs/Fxse2v8q/0c3Lz8XJyL/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZvY2BlcmJdUlxJSkdBRUhJPjtBOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSln6GseE1JTl6Et9vVuK2qmpSXn5uboKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdLLztDAxsLHxc7N0dHRyMvNwMrMxdPOzM7IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNSTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7Qv7zMyba+rqaqqKKjs4tbZW2Jt9fGr6afl5WXmZqdoJyZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jOxMnPzMrMwMm/x8nNzs/L0M3Oy87Ox8vQ0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dW9wbmthZG5wYVdcWklGRkRNV0U7QD0zMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLCprK2po7ObeIqnztSzm5uVk5ebnp6enJSWmJWIa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ycHFzMLIycLMw8XIysrPys3M0M3Ty8bIz8zIx8vExsHFyszNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeXBya21nYGBwaFhYaFZMRkxJUFBCO0M+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxMLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1r7SooKujiI2SuNSslI2NmJWQlJKRlpaWkIt8ZWFiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS/xsm9wsfJzsXCyMDHzcjEzMrLz8jExNDIxsLGyMS+wMfMzMvOwsvLyMfM0MTFx7vHw8nIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndvdGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCtru7raO1kmiAiMSukI2Ol4+Gg4SEgn6FhX9zYFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8bHvr/Gz8vDv8O7ycfIu8jGxcrAvcLLxsXEvsW8vMDDxczFxbvAysLFx9LEwMi/ysnGyMbQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWbo6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXDvrGvuYJifo+2j4qSl4d6gIWGgHZ4dXJwX1tbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxL69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw7+8wc3Dxr29tcG9w7q9xrvCurO8xcTBwra/tbW9v7vMw7y1usi6v77Lw8HFwsbJxsjG0MbCzMeyx8nDzs3BxcPAvbO3sLKnqKi5sKWtsKqtrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xcLEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G5xb2rrK5vZXaPk4uIioV5gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tL2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wcK8uL3GwcO7ta6ytrq/tMS3u7WruL29v72xuravtrqzxby3rru/tbe0xby+w8XAw8XGyMvFwMbGu8fLv8/Kx8PGwsO3w729trm+x7+stbq1t7aOeXR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvNyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwL65uMm2qq+jZWl1jI+GiIl7eH6Ghnd4gn10aV5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK62sLKprqassry6tsO5urqxq7W5u7TCurDAsb68u7a7x7nCtq2qqLCxwLa4va+wp7KztLu8q621pq61r7uysKm5sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDusTGwrvGyczLs7nCvLuziHN2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8TEw8PKwcnKvsC8wbqytLXEr6qvm2Fsf5GIjo97eH6Khnp7hIF3bl5dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6mut7S0vLi0vK+3ubWyu8GywK6lqaKrsbKzqL2qq6irrK20s6aoraGkr6mypqeorqWot6yxsre6uruyvL2/vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYdzdHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yba9w765yrfBw8G0try2sa+1vK6oqZdlb4iDiIuAe36Afnh0f3xzd2VfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspaCcoqWUnqSbmJKho6qkop+lpaelraCdm6SmrLKvtrensKuoqrSqtLqxtrWutrmxr7q6sbakoKSfprGnq6i5qqSnqKinsq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5w7PAvb+1uLu9vrzCx8TCw77AxKCDeHBrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMm3u8W4s8S3s7/ArLa8sqylr7StoKKUbHiFhoaBfHl1c29ta2ppcWleYF1cXFxeX19hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlpuhlpuimJaNnqGjp5ufn6Oloqiem6Kbn6uwrLG2o6mqqayspLS5rbewrLO1rrK1rrCqn52fpKKypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G7u72Xg3tza19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnHuLe+t7LBtLG7u6y6urGinqmrp5edkHF/hYZ/eHJucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaedlJWVm5ibopaWkZyioqidm52lpqKmnKCgmpiurq2usqCloq2rp6G1sbKyrKivsqe6s6a1oKKem6OiraOiqbWqoqOmnaamo5aYnpeZmp2gmpednJybrKGrp6Okpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7OxlIV5dWVeZV5bWVZTWlVLW1FLSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzMjGwMW2wb/HzrfAxL2zubmyv7axuLqtsrWvn5qjqqGSmY15f4OEf3hvcXRxaGZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUkJWXl6CXmZWYoJ6hnJahoqmkn56pnJqaq6evsKqbo6S4qaCfrqi2qqanrbCkt7Ckt6Cim5mZqqagmqy4sKKhpJyin5+TlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MT0tHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4wczHxcLDvcW3yMyywcLBrby7tbu8tbm5sLCxqpyZoamVkImMgYB8d3FpbHJ0cGhoZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltiY2JiY2JjZGZqgZaTlYySlJSbmZ2WlpygnKCWoaCmpaSmp5+cn6agqq+mn6Kkt6ihoaKotKKlqKWwpbCtq7SeoJ2VlaqhoZStsbGfoqOdnpibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvrqCSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqWnrbe7vMHFurG5tcTJycDDxsbHtsbEs8K/xau3t722vbu7trOtraiZmJ+ji4hziYh+dm5jYWZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVFJVYGBfYGFfYGFjZGmBlJOJkY+Uk5SdlJWXpJmgl5ygpaGtpqSko6OinKqrpZmfpbGqoKCdpaudp6Keraypqa2soaKilZijm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqayei3Jwb2BbV1ZVUkdRT0haW09SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKuyrZ2op6+5ubPAyLq1wK/FyMy6wcrMyLXJvLG9xMmssbjCtbzBvLS1q6ymlZmbm4d/coiDe3RpaWpsZ2prbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6QhJGHkJGPmZOVk5ybo5yboKipq6isp6ilo5ikrqSUmaWvqZ+bmZugnq6Zm6uzoKWmn6KjoZWTm5aWkqmprZqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJujlZuho6GXoaijoqiroKuvo623paOjoqytqqirr7K3sr21s6uvmIRzc2hbWFhSVVFFWExRW1hNVE5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmnr66bqaist7asvMq7tr+sy8bFuMHOz8izxLq3u8PIsay4v7e8vru0t6eqoJaWmJWFeXSAdndubWhtbm1wZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVNTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm6CrqqaurKivo6ian6yhlZakqKedl5CPmp6ulpioqpmfnZSloJ6SkJKRk5WnqqWamZmenpWNjIuThoiNg5CLkZWRoJ6ho5eVn5WaoaKelJulpaeoqKCxsKaxvKefo6y0q66nsLWwubXAsa2xq5B9cXJiVlNWTlJJRlZQUlFMTFdNSkxOUkdNSkFDRkRDPkA2NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpbbGtLm6s8rFubrBy9DLsba3vL7Bw7GwsrittLS7tLalpJ2cl5aSgX52a2dsbnFucWpwa2RlZ2VeWllaWVpaWlpaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSYm5meqZugqqalq52nmaClm5OPn6Obl5eFhJKbo4+Uo52WlpaIopubk4uOipCapKeclZWXnJGRh5SOi4GLjX+QipKSkqCan6KVk5iYlaKmmYyZpKaopqGftLKosrehnKK3rKqtpLKypbW8taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI4NzY6OTk5OTg0OTg4QTd3tqektrGlp6OppaCopaSzqqKyw7W1srPGxre6w8rMxrOsub20t8CvramxnqauurCwoZubnZWThnqCbV9fZnJwdnFpbmllZ2hqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI+LlJGUnqGPm5yjoaOYpZaim5WNh5iajHONg36Nl5aGkZmQlI6Oe5mPnIyCiX+KmJ+inpCTmJaFjYKUfn50iY55kIeTj5CdmpmakZWQnY6io46JmqCho6OborSvrK+sn5iluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlJNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeho7SppqWoo6alpqams6emtMG4r7SwycS3ucHOxb6zrLrBq63Draiip5KdpreupaKQlpeTj313fWVXVl9nZmlnaG5jamhnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKQg5eGjZyXi5SQn5idlZSWlI6WiYCTiV87V298i5SJgIyRjJCGhnOKhZaBeYF6hZSdlIOWjpGQg4Z9k3hxb4WNfYmBkY2Pl5qYk4qPiZyHn5iHiJaemqGgl6evqa2oqJ+WrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNT0ZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaejqbCop7TBubC1sMfCt7O9z7+5r661wqeqxamjnZmDlJyxpJ2aiJSQjId8c3VdUUxSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkB/lZGRfYmUjYSKjZuNlpWJkoiFlYZ5iH9gSlFueIqRhH2EjYqFf39ufn+Ud3V1d4SNmXBRjYiKhnt+eJR2aHeGiH6KiJWKjZGSlouEioiUhJqMgoSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEZKTkxNVEtRUE9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foq+hp6ilp6ivraq1vLa4t7PBu7anuci4tqiotbaqsrymnpaOf4qUqZeYjX+OhIR9d3FuWE1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYyTgZKZi497ho+Adn94c251cHSNjoF6foqrhXl6aHZ7jnBybXiBi42SeHqAe4B2cnKSd2d1hISEhHuViYiKjIuAf4SLjH+Ug3uBkJiVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmhgXFxKVk9SR0pYUk9KTE1SSkpKTFBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2urSxn7e6sqqdnaypqLKvoZqRjpSBjpyPlIF4iHp9d3BwaVhLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iNj31oeYF2eICJj32EmJKBcoePfHd7b2t+rX1zkIt/e4aSgX1/dGZ2fIZsb2hzfImMiIBseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9jHt1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5tZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOsp5uwp6ybj5acpamkoJeZj4WSeomPjI14cn9vdnFsbmtYS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVlZXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5PUVRYXmVwcm2Ip6rAfnV5Y3x4b3x5iJB6fYuGb22Mknl0eGpqgIJxlpGLgX6WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF4cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OSkNITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6q7wr+mopmVpJedjYSLlKGhmJiRk4tzjnqAho2IdnB2bXFtZmxrWU5FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV/cG1/eouJdoGIhnRsmpF0c3xqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dWp5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIRkJBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6r6uysMKxu8PHmpaOlJmLjYV5hJCYlI2QjI+GcYeCdIeNiHtxc3FvcGZxZ19URklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6ByfHhsfW1yg4GFgXqEhoZ5cqCVc3iAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAZ2Ziam5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdW5jdoN+hoCFkJGKi4mRi5GMi4+DdXiLj4B+g4B+j3pxcG9rX1pcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltaqusa7BsrvBxpaPjJSQgIh9boGQkomDioePhXWChGyViIl8dXh4bXdud2RpXklQRz5ANzQ0ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH6Fg3+MfnaimXl+hoGFmYSbnGGGqp+di4OQjnp3iH6JiI1zipePhHpdZHF0ent3imxnamJ5b4WPgnpugXd0hHpwc3p3a25pXneHfYd8iIePgIuSl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1tdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYSLfX2Bf3CBfnpodmtSV0xARTIxMTI2NzY4ODo8PkJFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp9iYd+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc218gYaHfY5oZ2h4fm6Fh4KFcYSFR2uAd3F5dmhta192fYOJf4iFjHqVnpuKi4iRf3p1i3Z8d21vd35/c3JxalpdXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs7yzl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4l+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqChl5WbmqWtk5q7sae7x8OoioyhpY+UiYGRe3KEnp+RnH92hYWKj4iQamhvg4B1jYaEi3GGgneHgHt2hX1udnVngJSPhomIiIiHoauhlomOmH97gYl6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBKRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGZ4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1CQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZaMjY92j4RxbIWBipaSg4WIcomhloeTiY+PlqW1qZuNlaKDh5OEfX9ramt8gH+AcmFcYl5ZZmpca2teV0tHT1NRTk1MRklQQ0RORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcIJwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpeXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56cGdgW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHB1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssLeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6GgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqoiaiZKKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGSkdFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hHaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSU1VVV1VOW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7m+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqq2orrW7srqsr7Wisayxtby3ta61oKeoo6ibqbCtsrq4uKebt6mNpY6Rk6CHeYGCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSEpKRElHRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoV+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hoiFioeRenhuXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXUF9VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbOzwLe4wrW/sLh0srSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCss7qiqbK6tbu+zL/Fxb29s8K3uri/t7q3uaytsKaxqq2+sL27wsKsmbqolK6PmJiqiX6Be2pWYWBXaWRoZFZaY1lWVElHR0xRR0NISUFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlVWndqcH+PhIGOhW56cnmIYrihmaOJlZOWk5OTjZCXkoeHe4aBjZWKgISAiXp8i4eGfIqCgYqDlX13eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFlnWlRgYE1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tMU1pUXZOvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWzpbGanqu9qqWoq6qjorK1oaunnpWWnpifrqWnp6WepJSip7Czp7KyvLbBvdPJytPGwsXMwsrDwL69v7u8t7Swube3w7rGvcPJsJ65qqKsj6Wot4mBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0E+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRTUVBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1obGxxkI2FkHNsc3JziNXAtZmgjZWYmZGOl5GWlo6Gh32Gg4yWi3+Df4J4eouDh3uLeYGKgpd/dH16a2VwdVldXFBlZWJgZWRdW1hXXE1kbVVSbW1eb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZcWluSucC5vbfGwLu5ysu6trq2uLmzuLW0rra2mWR1qJ6tcF6irJyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvbnU0M/Xz8nM0szPzsrHv7/Cyr3BvcLAxcTFyr/Iz7Sku7C1sJusub2afnhrXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxLzAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlfcJeSkZRubG91dYizrKGhn4uZnJmMjJWRm5KFiop+iIeMkIuJfIGEc3uJg4Z8iXSCioaVf3N7eGxtdXtocmVpbGlmamloYGZpaG1abXSXraS8iIdnW29oXVpZVEhKTlBKS1FMVFFJTEFKR0tQX19iZmlhmLfHsLmzu762ssTHtrC5sbC7rLOxp6q3rI22p56bp5pOm52MjqCWkaaYpZWKk5OJkImPkJKem6GYm5SWh56Zppusr6ivp7O01NTU1tHLz9PVztPPzMXCytC/ysnLydLIzc3C0NK4sMS8xLqmtrvEooFtYltbXVdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNlV3OQkJiDaHFveXmDoKqeppeNm5uXi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscXh+cXtteHNsaIBwbWNpbXB5aXd9fsu/wt+nbWN4bmNbYWBKUFJVTlleUF1dTlFOVFFVVFxubneCcpauuKy0p7C2q629wLGrtaaluKesrqGstKOOsa6amJiMkZSRhI6bgY2mkZyJg4uEiomEi4OUlZiXlJuQnJeZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PXzdLRxdLWxsDOx8jDqb+40J14bWRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PjU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1hoWKd213cH1+gKGenqGLjZmTk4yLk4+WhHmFkJCNi4qIkYd/gntyfoCCh3qFdYWTkYl/b3ZzbHN8fHZ8c4F3cWqAcnJpb3F6eXJ7vsuafoyxg3ZyhHZoYWpdQ1paW1ZmZFhla1RYXVxgY11jeHt/i4GZqqSkoaChqaaqsbmqprSjoq2io62ip7GfiaaalJKRipKOiIKTiWuVoo2YhIGFfpGDg5OWrIuVjZWZjoWSkJ2Xp7ChoKCkpKjIzc/HwcvQ09HU087TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8uJcW5iX19XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE1Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fWhzeXKCiYGdlZ2UhYuWiY+KiI6Hj393hJSZi42IiIuJfoN4c3t9g4d3gHuHkZeBg253cG11f3Z4fXOFfHlsh3Z0b312hHV5e521jDxBisalfo18aWVWSUNlY2ZjaGpkb3lbX2Zoa25pboCDiZGLnZ+gnZCXmJ+jo6aypKSzoKKlnqGpoKKxnIaekpKSkIuOi4aDj4R+nJuMjYKEhXqUfoKplaOMkoqXkot9l4qakauzmJqbp5ynvcPGuLbGzdLQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zMy0dnVtY1xZUlVQWVVFRkpJRUU9Ojc5QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRWT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BhcXFzho18l5Gdi36HkoKJhoWKgod8eIWWl4iPg4eGh3qEeXF6e4SGdXqFjo2deoxwfG9wen9xfIFxg4eAbo56dXd9fIJ1f3yHiLB0WKnCtoySgXBuYj1eaHJwcXBueHeCZWlvcnV4cnuLh46UkpuWoJaHjJOboJufqp+hrZyimpmfpZ6frJmLmoyRko2FfYiHg4WLjqCZk4iDh35tmXmEmIaIk4yOlIyFe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/IxNLK1NbY19jX1NvX09nb1s/b2tHWyNXMlXh6aGdaWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBBQUFEQT4+Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfHyEl46Hi36Gh4B3gnlue3uGgXR6kp6NoXaPdYJ0dYF9dICEb4GQgW+ShHR8gYV6doZ7ibfGpMLJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5eQg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWIiIGFkJGenJmJhYuBhZd7iIifl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoV5eGVoY19SVlZVTUtETUM7PT08OTo8Pjk+QTY+P0A8Pz48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXp+gpGJhIV6hYh7dX10bnx9hn50f5KdkZ+DknyGfXiOfXmKim6CmoB0mIV+gYmFfH6Qeo+pj5DDoLuMnKOcfYmEfYlyjIp+c6aanJmUhXuPkImEaEdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgot/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX3Ld3d3ZpaWRWX1pTT05IRExCPT0+OTk6Ojk5PD02QD4+PD05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgI6KcXJ4int7f31/fIh6fHuLh4J+dYOGeXN6c22BfoR9d4aboJqelJKAi4d/mIeAnJJuh6iFeqCLfJCOg4iEnH6akYqNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+DmJuPkI5bg6KRgoyfk5WMhoiMkpOMlJWUkIyPioiWm52PlZaRi5KUhoCLiZKNioqdlpmjooaTnZWgi4qIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVldDQElEPj8+OjQ4Ojs3Ojs6Mzs7Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg25td4t4eX56gX2GfHt2hoSAc3CFgnt2dnV0hIOFfX6SpqOepaKWiZ2QlJaLiqiXcoqyjYOmkYSZk4SZjKKWoJmTiZqdoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm5yYlpGykGOkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI2QqpeXpKOImZ6Wm4mPh5eXi4WPjIF/ho+kiI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF+Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6ODI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+eoKCg352doCCfGxui396fHh4fISHin6Ko7Ono6qzoZann6WjlpWuoYOQuJWSspmMoaGMpJuvo6SdmJCnlqeZrK+kl5SWlZCLmJmWoMCOo8m5q5ujpq2YkZudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlJiGhJGQnHSRmLKWl6ShiJyak5CKkYqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0NbY09DYunF4dVxfVF9VT0hKTkRCQ0U1Pjo3Nzo/Ozw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6e26Fhnp8hHiBhYF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbKzqKOisKyKmrWdorikla2kl6mtt6ako5+ZqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJieo6uTl72jXqqygomKjZSHkXyOjn2Dho6QlJSIh5OWjJCVjYuMl5iSnJm0l5arnYuclJKOkZKMmZuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL1KFveWdbWVNeUE5FQz48Q0FBOD84NzU/Rjw8NTwzNTM1NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf219fXx/cHeHd42Bh3uNj4yGjJmqwsCvvca7s7PAvLOsq7O2i6eyra29qpu7pKitubirpqahoqOjqK+ysaqdnKSYm5eXnqKmpZKkuq6pwLytrbK5pqSofoiGnK29sIKMjIuQg4+DkY96gYeQjY2ciIePl42LlZeUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxMqHcnJgWlleWkxKQktARkc+QT9COzo0PkE8PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0U/Q0ZcZUdgaWdaXVyTjIyIe4eLhoOMdYaRioFvfnuBf3F+gXqVepKUlJiQk5Wns8bJv8LMwcO5x7y6r6u5upeytrqywK6lwKSrr7u8qq2ro6Oep6qutLCqm6Cqm6GblZ+wtKeLo7q6tsG8rKicsqWkqJSFjqnExKSCi4+HiISGlZSNeoONkY+RoYyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY6QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ewq6ot7XJw762z7LEv8S8s9HJyMK1c3drW1dbaVFMSENMSktKQUE9Q0Q8NUFEOzozPThCMzMyMjYyQTA1SUVNPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZlpOZVxmVGNqmY2XioyIkpCGiXmGlJCBcoB7jX94h4KBkHqNoZaompqYur3HyMnB0snKwsy8wbKtu76nur++vMS3rMGprLO7vqqwqaSlo6uts622taCfrp6lopijs72pm6i9waO3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mXnJWVo56pn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielZebpKOop6KyrKi8wMOvpbK3zMC5r8Szu77CuK3Cw8LAmGx4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqajmMK+x8PHxdPNzs3Lu8G3sLm8s7zLvMPBtba7rbO/ubyur6igqKe2ra2psreanqyip6Gdq7e4qaSwv8Sxvrmzp6q1s62ul5alrKigkY6SscWnlY59kZR9iJGZkKqZmJOTj5KVk6Wdk52ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56ypJahlqysqqebnqaXmJaYlaCjqKWftqupubvDtKWztcvAuKq2rLK6uK6ot7q9uIJrbVlWVFRNRUpTTks/QUhFREhHRzk1Rk07Pjc9QEouMzIwMjVCNTVQVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJxRmlJUmViTEallJyWoZeplo2Rg4emk4iCh4Kcg4OVkJCTjpqin6++rqHGvMXExsbOzs7Syr67trG6u7u+z7bEvbi4t7KxtbO4s6umnKuruaqop6+vl6OupKekpLXAsKustL/DusC6s6e5tbizr5alra6upYuTlaGNdMGafZaZhY+WmoyxlZualZKTmZmlo5Wfm5aaqZ2coaCZioyPlp1gSpacmpWapZZUlrCfrpyfpJSvrqulmqCllJOYmI6cn6aimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGVbWU5PS0VPUFBRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiZKFn4eEnZeOnaGao6S1yLSpxrrCw8fKyMfMzca+u7OuubjAwcy1x7rBuLW6sK+vs7Smo5uqtLSpqaatrJqkraWkqKy6v6irtre+wb++ubOyxLK5vayjrrWsuaaIm5imm3a/n4SZnY6TmZqLr5ehnJuWlZufoamfp6CZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinpexp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYmRfXlFKTEZITklVTD1NRE5KS0JDRDxRVT1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4uUmBNVUh/ZV5IRauVnKGfuq+ZlJ+Lk6ubkZKTiauNh6KfjKOtlKOjtsa9tMG6wsHGyMXCzcjBvbmyr7i0wMLKtcWxwby0uqqoraywoqOYqrS7paimq6qdqK+no6qqvrynrby0uL3HvLe1t8GxvsC0qbW3q7+lj6KYkaKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52lnKiqnpmVj5SbipaJjKSilJ2inqC0r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl5bX11KSEVGTVFJTUVGR0JSTEpCRUdAVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Qz81PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOmdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJaamo+qlpWnppWtrZmhq7bEwru+t8DCwMfEvs3Gu725sq+4s7/CyLW/r7u2uLampKqrraCgmquqxKKkqKumnquvrKGoqL+3pq2+sbi2x7a1ubi/sr/Bt7SztK++o5ejlpSclK6gkaKipaOjn5C9pKmdqKudnaCbpp+9opijnqKpq6Gdlo2VnpOeh4+EjZOepKCdtaylm5Wxp5mupp6ZqZ2fjZiUnoONoJqbk6WkmpirsbWxqqWqraycmKCgko6QlqielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVIQDhRUVBNOkdANENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCTo5+WpZ+mqauXtrGjqrO1xMS9v7a/wrvIwr7KyLa4tbWws7O3wca2vrC4tLi1n6asqqudnZ6lpMGkn6mtn6SprK+ipqe9taWxvLm3tsOys7e5v7LEwLi4rrO1taOdpZWSlKGuoJminamoq6Oawq2pnqytm5uemaahvaGdpJirq6ymoZmNmp+SnomOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6YlJ2Bjp+XlY6ipJWQpq6yq6mhoqWllZWdmIuPkZOknolgZFljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckhFNj11ZVxLTp6foZmew6ilorSinLKok6ukoKOframsnbuwqKy1scjFwcKzwsO8xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmpmp2loafCrJussJypo62wqaSnvbamt7u9r7fDrbOywsCyx7O6t6y0tq6qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJmZmJOipLigoaSTr6+spaeekqGelJ6PkI2VnZqinqezpqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5KNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOopKqyoaO0qpWzrKeipLKsrqm7sqywtLTGwMTDtb/EvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Grqpefppetu7Sbp7CbrZ+ttLKnqrmyqLqzt7K5wKq3scO9tManvq+tt7WpqKuhl5eSpqWiopiYpa+4rrK1tqCfqKSZlZWTpKC3oqSllq+xsqeqpqGem5qalpeon5+YoZ6vsqKmjJeumKSql5mepJCajZOXmYSVnpSMj5yelIupqaqhp6CZnpWMjpmQgYWViZSfeGNoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoaa/pqivr6GptKudubCro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC6qbakrLuswMK3t6mssbqila2wrbKWpaeRqrmpoKawnaqgr7Szqqm2tq27rLOzuresuLDDur6/psOrsLeuqaurp56YmauioqCRmKGxr7OrsLmanKmgmZaSl6aht6mlo6KwsbSrsqirn5ugoJudpZyhl52js7Can4+TpZqfqJqUop2Ul4mTl5KVlpyTiJCbmZSOqKimn6Obl5uTh46Zi32MloWPm2pobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRFleXU1MUk5eS0o+WmNeTkhQTltVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWhbVjuJe2NDPaefnKKpvaGrsKujsbiqpbWzrKCttbyus7i8ur22tsDCv8jEucTBv7+4xL3At6+2p6u3sbu+v7SorrG2nperraitl6eojqe7n6Sss56rorCws6uptbS1va2vsbWssLSxwbrFt6u8r7G4rK2qo7GmnqSpn6SXkJmfs6qzqqqzmp2nm5qVjqCmpLSup6Gsra6xp7OtsaqknJ+oo56VoZmbqLWpl5mRkp6ZnZ+dkKqdlpeElJeKnJibk4qNlpeal6aloqCdlpWXk4CPlIV7jpKDjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19hVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqCkrLakramlrq62qq+1uqemsLfFt7G2vsHCtLS6xb7MxbnCwLm+ucO3wLmytKupura6ub20qa2wtZiYp6uqq5urq46rvZ2rrrGjq6CwrbOurbayubeqrq6yqLWvs7u9yrKqtrWxtK+up6GzoJuoraCllZWamrKjraCmr5ehpJqako6ipaeyqaGmsqyqtqWusbWvpJmdraeamJ+Zmau3opeTkI6XnKGXlpOrnpqSf5KXjJ2cmZWQiZSSnpmloqGgmJaRk5V6i4+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGBKW11aUlNSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVEtEmZegsaixqq2mpK+utam3tLmkrLO3yrq0urq/vrSzt8PAzMi8w7y2vb+/t7+8sb2tp7q4t7bBtqqssbeUl6auq6ejsKqUr7ukrLGyp6ijsbSwsbC1sbiyqa6rsqe3r7W0w8W2qbW2rLCtqaijtqCgp7GgpJSbmZWxnqecoKqOqaOem5aYpqWlt6eisbSsp7KnrbC2rKSZoKyom5ydm5SpuJyUjo6KmJyil4+XpZ+dlIKRlY+cm5eVlIeWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTV5iTVhZV1RYVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi49RUxRPDNya0pDQ5CZpa6lra6rp6SwsrOqt7G3oKu1ucm4rsC7w7eysbXCws7FwMG9tLy/v7q+vLLEp6m4sLa2v7yuqrOynKCnsK2mpa+lnbK1rKuxsa2pqLS6rLSytay0rKqsqKypuK2xsMe/uKW6sKmtraWorbCmpKSvo6mcnpybr5mjo6Kjkayeo6CgoqqlprmlrLW1pKqrqKyvtq6jnaOoqpugmpqSpLOZjomNh5CioJSNk5yfk5GEjZKSnZqYlJOHl5KVmaebn56MkpGOkHZ+jYV9fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xfYk5WV1ZXVFhnXlFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorOkk/M0JJUyw+j2s8R0iPnKqroqmxpKmls7SytLWysqGrrb3Muq7Au8extKy0wsLRxca+wLK9wMK8v7e7xKest6yzuLu/r6qxraCjp62qqKSwo6qxqq+ssK+wr6uzu6a2sbKpsqmrpqWjrbqsqrHCubWsuqioqK2qqLGlqaSirqqoop+co6yVpZ6YnpmsnaKnqaKspqOtrLixsqCpoqCrr7GsnZ+np6mZo5iZj6CnmIaEjoqLnp+Oi4yVm46NhYaPlJ+clZeUhpaTk5ekm5yci5KQjYl+foeFfHd+h4WGdHJxiHVrX1lgbmNRc3FcSzuEfEY+V3RYYFpOY1xOVVZVV1FcYl5TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjM1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJRaPkxFlZitqKGqs5yqqrC1rbi1rqulqqq9ybyxvbfCr7Gss8TDzs7Dvr+zwMLDusCzyMOrrretsri/vrKtraukp6mwqaeosaa0rqqwrq2xsLSttLukuLOsrK6nq6Cinq+3qqqturaltrWjqqesq6qtoaimprGypKamoaGslqqhlZqgpp6koqqlraKfp7G3ra6jpaKbqqutqZyhpaSkmKCalY+YnJOBgo+IhZyfi4qNi5iNj4qCi5ejmpGQmouTkpGTopmbmYqOi4p8hoCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVVRPXF1hVUtNaVdVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6Oio0OT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qys6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqu2saulrKqpvMDAuLizu7WlsrDEycvRv8G7uL+/wbnBucDErbG1sbO6v72ysK6tq6uotqqmra+qua+osbGvsq22qre3prS3q6ykqaqco56zs6iopLS0oLatoKqoq6irp6Crq6i5tqmqqqqiqaCsnJKpoZ2gpKOmo6qenKe1rqimqqKjmKWmp6qcoqSjn5mYn5COj5iNfoeMhoSenYaDiomNjY+MgoWUopmNjJmQkZGPkp+WmJaLioN/dIaBf395dIN/end+gIedj29xZ2dweFxgc4hrT16ZVkhteFVkVlJiT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YP0MsPkxUXy9KajZPRDuWjrChpquumqylra+zta+rpbCqqbq+vMCwrritobavycfI0MC+vLq8wr26w8C+v66xsrG1vLrBsbGyq7OopLWppa2zs7mwo622sbCzuqu5r6mttqyqnqmsn6Kgta2noZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsKmjn62ioZOioqOnmJqppZiXmZ2OioeUh32NhoSEpJaEgYKKho2MkIODk6CWh5CckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqN1aV5la4F0Z4iLfVNYcF5KeHNTZFNRXk1NUllmTkxWWWRYRlNpUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTYpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjM4Xz1hZD9GMUNQW1sqSE05VUE0kY+yoKSmrKSnpKyntLKxqqSxqKq4vsG8r6e5qqausMnHyNHDvL++uL6/vMm7wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr2wvaasrLWrrZypr6OfpKuqp5yeqrKks6iaqqepo6mdo6mnqb2rtK+unamkoK6cm7OjlaScpaWfpJuaqaulnpuqoZuSm6GknZiXqaiSmJqTkIqCj4V+joJ/iJ6PhX59i4aQjY+Ef5Kak4WToYyUkouRmpGVhol+gHJ7eX18aHd8enRwcHxnhHiEiGRhZ2NxhXptZnhdXlZCV3ptVGFQUlhLS05xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj06RFc+Ko+UsZmfoKmlpaGrpbeysqapsaesuMG9tbCjua2oqLHDycnNwba9v7W3v7nItsO1s7G1sb23ub21rbm1vq2hs6eqq7C1uLSrn728qbPAs7ugr7O1qauerbCjnKSoqqOenKSwprCgn6upp6Kqm6SooK27p66wrqCro6Sunp6tppefm6GjnJ+cmqOqo5qapKSWlpSfoZabl6ari56RkJGLgoqAf46Ae5qVjYh7fouFjo2LioORl5CGlKOJkpKHkJmPk4CIfHlsfXZ4eGN7e3FwcHJ3Z39zaoNnZGdgbXOObWFpcGBwQVx4bFVeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw1Li49LSpLPiodNDkmJy4zNC4wKy8zJiw6JDQxQmhZMTNTPWVfREw2S1ZkTyk7Mk9YPSOTmayZn5inpKOfqKS4r66jr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6vtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwLW1oa62taamp7GzoJ6kpqehpZmerKipnqCqrqegppijqJ+wuJ+jsa6gq6GspJymp6mampufo5WdnZqeqaaXm6CokpiTmJ6TmZahqZCZiY6Phn2HfoKOfXyhjYyIeIKLhImLi4WHkpmOiZWeiJGVgouXjJF8hXtzcH1xc3RgeXhpbnBwbmh9cWN6bGllY19lhX9fWnNrckxMfmhYWk1QTEpIUFJQSU5cX25TRFdaUmdPSExFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNioqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPi9YVzUol52mmZ2WraCgoaSht6uxpLO0qqi5xLWzrp+3rK6tsLXGyMC3v8G5sLS8t7+7vq+rva+0v7C8wripu7q3p6i1qKirsKyzsKeavrelrby2sJ6wt7CopaevsZugpKCkpKGWm6+moZ6ip6+hoKKTpKSit6+hprGqnqyjr5icqqWpnpianqWTm52anaaqmpycpZaVl5ScjpOXo6ihkIiLj4V6hH6EinqOl4qNhniBhoOIi42FjZOXjI6WmIqPln6Gl4uPeYB6cHJ3b290X3l3ZGxsa2logm1lcmprZGhbYnN/X1psdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdBZltIVENUXWhFLjsxX1MsMpajoZeVnKmdpaGjobeqr6C6uaasvcSzsK+itK+srq+0xMS8s7+6t7Czubi6uLqurb+ztLivv8G4rL26tKais6uoqbOrrrGjnMG2pqm2taqesruppqaosKyZoqecpKaUmKGypZmepKmpnKKgk6WfpLmopKetpp6loaiTn6mhoaCZm52gkpucl6Ciq5ubmaGVkpSWmo2Tk6OnpI+Iio6FeYR8hIV8nI2JioZ4gIOHh4eRhZWSkoyQlZSNjpR7g5eOind+e2x0cmxsc2F4dWhnaWdlboRnaGhkZmhqX2diaWZaZXpjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEs9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNywxMTk1LCYuNS04MDU3NmB0QjNDRGdbS1dHVWBoQjM3OGJOJzKepKOSjqSmnJ6enqS1rKequreorMPAt7CsorStp6+vt8DAvbHBt7Gusba2uLe1rKq8s6+ysb3At667u7Gln7aspqW0qauuoKDDq6mmsLOrrLS6naiqqrGmmJ2qnqekkZmmraKZnaSqoZuinZegnKe2pa+qrqChnZ2hlaCmn6GgmZuanJKanpWmnq2jmJeelZSNlJeMj5iap5+RiIqKh3iFd4KCgpyHi4KJe36Eh4aEkISVlY+Pj5GRkY2Se4OVjYZzfn1meG9ramxndXNrYmdkY3R/YmRlZmVpamNocFleWF1sZGFNaFdaYFZJR0hLTVJYPzlgbGlHQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPS01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BkRyU1m6SgkYyuoJmYoJaltLGisb63obHGu7mwsaK2q6uuqbi9vLutwLKvrq22r7O4s6erubCurrS2u7avuL2spp61q6ChsKWrr5+lw6Gzpa+xr7ettZ2tr6yuo5mcp6qln5WbqKWfmaSjqZyan5yUm52ssKW5p62ioZqanpmeo5qlnZaemJuUmqGSqJWsqZuUnJySjJWZjpSUmKimjY2KiY57gnSCgYqYhYd8iYiEhImMiJKElJySko+QkZaOkH+AjY2Cb4F/ZnltaGtqZ3Fya1xoZGJyf2BkZ2ptbGdqaGZsXGxtdXFhVGJoY2VZSUZMTU9YUVBVYWWBVEBWU1lURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NiMzKik2LjU1NDY1WnxdMTlLaltNW0tYZGRAQTFJZEInNJOim4+OsZ2bk6GaqbKvn7jAtqC0wbu9ubGltq+prqW3ube4rLuvraqrt6q0uK2ls7WxrqmxtraxsrW6p6mftqmen6qiqq2cqsGZrqWvsLa1rKyesa2vqqObnKOsqJyVnKeknZqpo6WVmqCdkZujq6qpup+mpKCYmpqeoY9ropWYnHGClpykgHaRq6ielpagkYmXmYCXi5+PeIWTjINtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEfoOPf2aHgGh1aWZXXGl0bk5QamRmcYJmXmRmbmxpXl1fiZCFh2hPS0Q4RVRnXkpHUFBVVUtHU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE2T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnJOgm6qtq6O9xa+pt8K4vb2tp7awpqukt7Sys7G5raqnrLSmsLWjp7e2tainrLazrrSts6Kpn7SrnqKlnKeomq69laemr7O3ra2kqK6qq6ahnpygqKecl6Gmppybp6edkp6gmZCep6qjtK+joqOclpiYl6OIoY+Smoehh5SeoX+lf6ernpOTnJOIhHJ4jI6Dh6B2iIxpl4hmfXN4oG+Ih4N+jHx/oaCfmX97iJ50iI52m4psh4GDbWhlY3pscWJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRlJWV1FRUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3UyNVJrW05cTFxnXz1LMVZgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWznKy1trSlp6izsa2yqK+eqqGzqZ+ko5qio52vtpWkpqa2vKasp6mqrKemoqCZoKekmZmmo6SZnKSplpOinJSToqWmoLako6CjmJWTmJSciK6QmJSJqYuXo5yFsYCkrZ6Ump6VeYLUqH+HlMCbx3l4saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B4aGtYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09XYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MjFUa1xPW01eZ1w+TDFbXDQxIY6lk4Gnqp+XnZ2lrbKpscK9srW/tbe+wqumtK2tqaivtKqvtrOop6a1pae4rpyysbWqpaSnsq6tsaaqnqeksqShoZ+XnKCgsK2VnqOftLmiqaihra6kop6bmqKpoJibqKGfmJ6np5Gcp5uUnaGmoqCwo56fo5aWkpiSmYWwa2qKjap+Z4SWh61lcZ6dlZqmlXGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9qeGqpZb5yZ6aMdrFqfLF4dJKTY21tp21bhKBFaWeHlkV1nGB9Znujp4JZX4uraYCUeHpqpzdKr1tXVGxjWktPV19cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01X1kzMRuSoZWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa6ksLqvpKSus6Opuames7Owo6Wgqq2wrK+mqJ+jorGco5yYlZicna6nl5uhn7Syoaqboa2toJ6al6Ciqp2ZnqShnJqhp6SQnaOal6Cfq5+lpqCan6GVlZGWkZqFtZu1eIWpmbWZd4ezm7d/k5aXqZV+a4GmeoGFh5KUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLTqRYSGNjmX5jaKZgeXJ1UpOGXlCpbWNxfYaAYp0uUaJuW1RrZ2BMS1xkWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqKuqaezrKq7tsKwvMKtuLfBqqytrq+mrrKpoa+7qqGnta2jq7WkprOzp6OhnaeqsqiwqKWeoJ+wl6CalZWXmZ+uo5qapKi0rqGpj6moqZuelZigpaman52jn5ygoqWjlZuemJqdoqqcpZqbm6KglpORk5Odg9WTmblwsMJ+xoZ81pSbu3yalqWQjZuMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hoN9poKTfJh6qnmNnY97sW2OhHSQu4VvlE+vp8WKUaB6Y2CqYnNyhmyXh19TtbTIhoCJfGOkM0Kddl1RaWhkUEBYZlpkYUpITWxLWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyhk5ixqKils6qltKilvLfBsLrAsbW1vLO2p7Gxo7Gzpp+vtqibqLquoq+xoLO0sKCjnp6nqbCptKmlnJ2eq5iZmJeXlpeiq56al6itsKijn46soqeWnpecoaaimKKhoqGaoqKnm56gnpWZmqagnKeVm5ufoJiQkpWRnYiybmi1cauIcI6mcrRzcrZ7mpikjY+bjaJ+j5+kfrB2g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52OeLNllnSFnm6eZpRSyItawlyfeWJfrWB2c4Zil4heWcqdb7+BdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltXWEhDP0o8Mj87NT08NDY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk5UX2VQNUc9YU02Mi6inZGkr6ykqrutprSlqLa7vLK7v7e2tLu7s6W0tKKysqOgrK+kmKa6rqSxsJy0uKmgpZ2hqqWxqKyqpZqdmqmflpWYmZOTo6mgl5Omq7ClopaSrJ+lkpShnKSnoJWbpqeimqOfrZqgnp6QlpuinpyllJyVmaKelZiWkpuFrHt3qHajj4uHqW+tioOog5mZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGch3e0YZplmoKBlWySWrBYS5p1mHlmYK1ed3eHZ5iIal2vd5Wej3hsNXnIrrJfQlRvXWhgRU9rX3FtVlVNL2VjaVNZUTtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk2PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3n52UoLiwmLPBraiyp6qyuri0uL+6uLO2vbWluLSgta2foKmrn5WntqyosLGrrbSkm6mfn6ihtaemqqOZnpWlopSUnJmTlqOmm5OQp6yvpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56gmJiblZehoJSYkaedhql9faV5oY+Qg6pwrYyCp4aWoKGKl5eIo4GQh5SqfICLnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRsklyrW1qTf5F/aGeqY3J7gWuYh3FdrFqJoI5rbmVPSkOhXFpNdF1jZk1aYV9zdF9KVTVKmpJZSEU9SEZBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6GcmZm+rJi0wq6rrammtLC4sbW/urqzsbe8qbu1oLGlnqWnp56TqrGpr6q1rKquoZihoKakpLmio6uhl5uRoqCVlJ6blJmgoJCNjKmwr6adl5qnpp+NkqSYqKuolJeqqJ+foKOto6CdoY2UoZifoJKcl5yVnaGVl4+rm4+ubXK0dKmMd4qmc7R5dLOAkqSjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSapdcrWBNoXyHkVJzo2x5f35umIZvXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcXxjU1lQPj5tbzNCQkA/TDkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7PDAwMC83NSwrLDQyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wLW8sa+5uKvBt6qroZynpKKdkquqp7WjsqiuqqGXnKigpKu5naOtnJaZj6Wjlo2doZuZnZ+Rk5Wrtq+nmZSbrKmXjJOmmqWtpJKXq7OkoJ6oq7CZoaKPmKKXoJuWm5ehk5ypnJSRq5mH1JKau3SxxIDDhn3Vlpy4eIiRl4yXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eICKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivtsSxurKuu7CuwbKspaOepKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJGWpZ2krZ6RoairoJyfqaSynqKkjqahlKGZnJeWpJiPsKCSlaqehZCZtYCRkY24lXiCk5u1d25sbnNueY+EjolynsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iWeDeW15YouscHWFf1hbp2pEZFpUZl9jXWJQZ2ZxbXVCTVBMRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoKG/pZazwrSsqqesq6m7rrDGr7W0r7intbitqqOipp+gnZmTrKWtqqa1qKifm5ago56spL6moaqYlZyRopuSj6GooZOel5KYlLK1tq2YnaSkoouSkqacpauclqmlpp2boqmnpqOooJGsnpejnpeXmJ2ej7CplJynoo5qfmmcp3iJc36ajnV6ZYd7vb7Aum6RgnGUhV9yalpdmolhZIeOlWtgf5VjbZt2YpRrf5qVlGVeYGNxm4locox9hpRman5xc3l9fGJbd3SBaFBcboN8e4pqWGx5gnJJSm+FcE10TUVXXGZhTFtXZmNeT1ptdmpyUk9ERU47SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjA7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaOatLq2o6ylrqeotbKsyKyws6y1o76xsqago6mdo5uamaynrqSltaqkm5iVopumram/qKmmlpSblaCak5ilqaiRnpCPmJywsr+sm6edp6GJk5Gqm6iknJusoKOam6OnrKKfqqGZr5qVpp+WlJ2fnZewpZmiqJmckZ6co6SZp6OanJqampCWgmhufHF2kJeUkYSKtKmNhZiVjoqMmJeHk5WKg5KSkImNkZSZk5iXmqChmpuUoJ2OgnqkhWxpfJB8gHSJioFxgnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvaE1YWGVqX1dZcHpvbmZTT0ZTOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzM4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CppbOnpbC1qsmrrbGmtabAqLShnqWlnKSWlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJOUop6eo6eSkZmop7LDr5mrnauej5aWqZ6rnJ6grZihm52ipa+moaSnnqyYl6admZqhnp6csKCdoqeWmJOZlKCilqOfl6COlpSLio2Olq2Pe5SbgpGBiqmohYCYloqEjp+Ie4OQhoWZkIeGiZWOm5eNkJieo5aZkpCdjX6NZaGzroSJhHZ6j4p9dnl6b2d5kIGAiWt1gXmIcmh0f3p2g4iCa3RjeGZfaGRjZGZqWGt7cWpqXFJMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNVVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMjk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rautsbKgqqayraKss7DFsKqso7KvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6gq6ORkZ6amZSRlaGcl6mdhZ6prKKzx7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqaWiqqGsm5+goJilnpyenK+kmZ+ok5iXnZKlmpipnpqXZoOSfGV+jpqPY3iMbGhqepCjq2tkmZh+Z4WKZWVpaHqNoY5rZ4yXkaJ3a2qLmKKfmHNsbnqEjYV5WGVdhYFea4qKgXZbaHN3d5GAh4JueIJ4gHNteYR0d4iJj4N7aIRYXWpzZF1ziGlqfHFsY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOUFJSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQzs/Lj2ln7q8ua+rs7CrpaitrrCnrq6wvbGpqKStsLCfrZegpJ6hmpmmq5yso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpqgmZmmlnulrKKos8O4paKnr5+elZ6jn6ScpKqokp6hnqCqr6mqoqmfp5umn6egrJWhm6WwpJicq5ahnpuTpZieq5mefr6DiHK0coWdhq1od7nEuHGSoaN7ppiZc6qCfMvAwLtxiqKHg558lZiInsC9gpadnY2cwcF7gXqRjJrCv31rpbFvjIFvynp/m3iRg46AdnmBf3lxen+HcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkE/Pz02NDY4Mjc2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msravqqamprGroKuYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGfoZiboJ2Hpqukq62/wLGhqq6ql5KfnaKZoqSqo5OgoZ6drK6pq6WjoqWgpKWcramRpJuorqqcnaqcrKKWl6WWoaOYnH/OlHl6pYF5lZabX62PXY6ngKGgfKeVm3SrgoCvXmSMqXqnh4WfdJeSiLNjgquGoI2NsmqErnR8loe4YYKtWaPNbo91e9t7f5lxfoiSdX9le4h2dmt9iG5+hZCSfmyAjV9wam9mYF94ZFtxaGpjZmBSVFJXXUpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6RpKqprbSrprKtraykrKawqqCnm5qmmJyisJ+gn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaTnZ2il6Cpqp+VoZ6dna6vp6qom6amo6Cqkqyzlqaiqqqeo6emobChkpqnmqGblJSRl6BwhYyXdYSoh3GwfJ1yrH6hn4Glj553q4J9rX+ccq1+q4eGn3aYknp8l36qiKGLkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1mdmWGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfbmlpbmZjV1NcYFpSUkM4SUlARDw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCc9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Oira62r6mxp6mqqK6rq6eio52ZopWfpqufoqWfqKiin56wrZiblqinr62op6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyXlZydopmfrqydlqGZnp+psampqJqqqKOhq5uvsaKoq66mmaarqqqxo5OXo6WalJKFpGqkdYl6qXR6snGCpYmYjHCHoJqHpF9gUquEf66Cm3WugaaGhp96mJaFe2aAo4mkmIaBo32pfoCUhq5efKhVnaKSgXqjn4B7w6/FjHOvs7O5cWKpr8J1aIyLl4+BbJmRbm14d3dubGZlZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpqCbpZ+dpaempJysmqKroaSfr6Oem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qqyqlZKdnaKZn6WznZqhlJyfpquroq2Zq6ihoamisq2iqrKyoZuqqK+vtqOTlqSnmJuRfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkiIegepiVmXiqyXOZo5SnqZCSm4x+momaxsZ3ZaGCpXOCoI6Cfa9eb7VjsXVLo4Ztp0eCk2OOj52Se3CWkX1venR8em1cZmpycWaBaV5hWGNtXF5ZSU1NS0VEQUI+QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjIsJKikwca5raiyrqylop2yuayqoaabqKarrKmnoKalmKqjn66rnaagrJqfqaWdp7WfopeTqKu2sqybppyglZCmrZGZnKejoKqnrqGjp6mvtMKys6qtqJSJl52lm6Kjr6WXoZWZnKWlq5qunKynpZ6ro7esoLG4sJ2br6eztLOllZiopJugjoKdTniagX+feoSjfIKkhIamnpyek4S4e3x5uYJ+zMXCtniaoJCLn36alpeKdZ6XiqSYo6h+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2Xg3KsYKRzcYCaYLx9UlV0jpGjlnt9kZCIc3pyhH5wW2xud3JqgW5aY19obmJkXUtMUVRBSEhGSTo5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRWWFlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVUY8RTI6UFtUHBs2P0gsLSCMh5mprKSruauvoJuhrLO0pp+glaWvrq6ppp2mppqjp6GyrqGpprKgmaiklKK1oqOVl6Gptbmkm6Odo5OQorGZnpynpaGir62dpKiitbHDsa2qraqRhpGcp52jpJ2ll56YmZmlo6iZraGspKWXrqW7rKG3t66dnrazubGzp5mesKKknoaP0bXDt3mHjoWRk4+ApniUoneMoJKEpYKLcauGhLRucmmZo5yViZ98mJmGh49yroKlm6KNpouTnIiTkJptcLJcpXOTepxsmX97mX1uqWGicXF/n2Jzsrhod4+TpZh9i4uRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEdHQFQzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5fX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJCklknOMiq6/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGfpaCgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqSdp5y1mqCqo7WrwrCpq6mijYSPnKKhpqOWmZqcmJuYpaSmmKqmrKGkm6ymvayUvbCtn6Ows7qstKebqbKlqJh6qJB9fLB3ioGkpYicbbJvoIetfKGPg6iWmYCsiISuhZ+UqKCiloWfgJmVgHuSfauAnZqWiqp4nZ+OiJOSgHmvXaOBfKanZJ2AfJd0a65dpWtxhZldYFuMoG2UkKaZgpOLlYp5eYKWf2psfmJ9dG5/eV9mZXFuZ2doQ1lgWz1KVDJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO2wbSfm62grrilpI6bpKOgr66pn6Oena2Ynrmgoqugr6qaraGQqqmklomakK6xrKafqJutmJiPraKhnqWhmqWcrZifqKa2qL+vpamkn4yAjpuboKaekpSZmpSamqSjo5mnqquio56pqL6kl8OsqqOiq7O6rK+nobSwqauZdq9+kIqchYd8uq2JmGSwjGWVrX2gj4OnlpqBrIqEsIWlmaShopCEoFtsaoGzYH+te3uCgbFsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46omomWj5SVeXeNm31jcn1hg3hzf3xgaWZwbWZlZU9VY1xBVF49SSg+OT00ISIsJR8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBgYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oyt727tMGzo5ytpqW2qaGLmaCfnbOyqJ6in520mKCzqKqrnrCtnayblK6poo6Im46vraimo6iZrpOaj6maoZ6ln5mjo6WZnqKpsqi7r6Wonp2PfIualqGgmpCRmpuRmZennqCYp6ympKSipKm7nqDGp6Wpoqu0tq2up6C9rq2tloGpkqOujpuAhqSXmI+BgLjDuoOOnJOEp5ecgqyKgq+IppuapaqRftW9wqpio7+9fH6jgoPXuri1hZOSgp69voRqo4Fvq4RunH96srHHg2qrsL2teHeivrt0gJWNppuOmY+Vm3iAj5l5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRhQk0pPDo0Lx4fJB4lMiAdJCgwNDk2Njc4Oz5BQ0ZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdavJW0tLG/ubK9s6Kdrqams6aejJilv6q3sKegv6amsZuesZy5qJ6trqWnlJSvrJeMg5qRr6ajrKGlnKqgmIujkqaep5yaoaiimZ6gq62pua6opJuXk3uHmZGmm5OPkZiYj5iTqJmfl6ion6mmoaKqu56pxaOgr6Ors7WrsKqhvKiwsJp0daqkt4VliZ9vZ6yPio9tb3ekkJmfgXWvmZVwkIxxlaejm5iupHJtbW1lindubYKZcYB5aXBpZ4mVlZdxaGmFhmdwhmReiWNqcFldZ353pmBicY6Sb2ZkgI2SjqKXlpePlJ17ho2TdGWGd2iManh+eGRsY2ZsYktkWEprWTpQZUVRJ0s5KyMcIBsjLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiUrbOpurmys6qpoq6fpLOqmJK9scPIvbWpnsCrrKOgpqufuqOkrayspY2WraqPjIWVl62fpaqin6SkoJGMpZOnmaiZlqOqoJacpaanr7mrrJqbk5J7hJeNppeNkZCYlI2XlaeUnpenopqvpp2irLmfsMGopLOmrLGxq66sqLmkr7iWiqGopbaciZahl4apmpCUnZOqs5mbo6yhs5eioJ6gopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhYCkmpeVjYuTkoqPhoR9Z4uAdIN2dIeMcadtfJWRlJOBgY+Pj46dk6CVlpWfgYaTi3BnjnZvind2fHlpa2Rkb2NVYFlAaVpHYmBOWSpFPSsmIjc0MC4fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVVFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq6isKStoKG2sZCOq8S7xLq3qqGlnZumnbCoo7annam0pqeRl6yji4iJj5ynlqykoZqnnp+TlaOXqZqomZSnoaSQmqeZobW6qKuYmpCMe4GUjKGUipSRlZCPk5elj56ZqJ6btaOdpqu3qK7CrqO3pq+vsK2qqrS6oq+9mZKmo6a1opGdpp6NqZ+Nkp+jrK+aoaOxqbCYpKGcpKqenZ2cl6uckpmhm5OQlqqZjZiYlpCWnpGIoJ2UlIWSjJCMlIuAfmaMh3WHdnmIg3OcaoeRlJSRin2MlpKSmJKgkZuVn4KGl4V4cZRyeIl/cXt+aW5kX3BpYFtfWW1iUGBkUFo6R0ZFPTM9PTcuKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6Ows6yuo6mnraCotaqRkJyjsrquq6uhopl6naKwpKWxqZabuKajlJmpnI6GiombopCunqSWqKChkpeZnK6LqpaPqJmojJioj565tqSlmJuNiHmBk4ybk4qVkZSQjZGWoYydnaednrijf4OvtaKwr3SkvqOyoHh6oKuzvJV2rqSfioCqfmRbYXafjqSdg5d+bpOznKOorqujZZ6gk3N5mZZwgJiol2x/oqeJZZylm5CXmJaLkZuQhZ2akJSCkoeOjpKJhXdrj4d2h3F8hoGAYWmIi5WTi1t2lZFnaI+NcXqjl5ZkeJiGgHaXaIOJgm54fmpwZV91b2traFxlY2Jib1JbPk1OTlJHPUBUQjkxLh4fJjQ6MzE2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXF9oZmdXUUo8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppquWc4ucr5+oq6eTlrifoI+co52RfoiImp6Nq5qklaeino6Xkp6Fda6QiaaaqJGXo4iburSooJmYi4l1dpOOlpOKk5GQlIyPkp+Nmp+mmJuyloCMm7WdtIySj72noX6nonqjr7iBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWGmHelm3qHm4GXpoKBe5yxeoqFn5eZlJiWgZCWloSZmmJ5h5CEjY+Si4NucY+IeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmDnpuFmH6RiYGCl2mNjIRreHpwcGdkd21pbGpbZGppZXJbXkhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8sKGVpai0nY+DnKubp6KgjZC+npmNn5qgkH2FjpmXiKudo5agoZKNk4mGgJGojoeinKOTl56Gn7myp52ak4+FcHWQipWQipSPj5uLj5GekZafo5WdrIiftIm0mq6Lyoirrom3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqepkpnCgX+riJihcZ6AmqR9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Vk4mDbXORhYB7coaBhX2FdIWCl4GPxWaAqYePomqegp+YgZmAiouDiJhvjZKEZ3d0e3ZnaHVwZmdrXmJubGZsWGZGXFBMMkU0Nk1gYzYmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkuLGqq6aalJ+ipKqilaOptqKvf6CmnKWenYmUvZmTjaCRnZB5g5aWkYermZybmqGFj4x3m5yPoJGInqSblZmYhqK4raWZm42Nf2JtkIuTkI2PjIyXi5CRno6Tn6CYoah+oaeHrZ2glq6Pn52dkYaBoI2rr4ekjaqajJp+onWAmJNrgat0Tat4h42dkZupqIKqq32DoXt6p2mef5JrZ5eGl7aInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn2EgZhxp6prg6NucqVwn4OdZ2SfbFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdoTl1XRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKXF1fV15fYnZgTUQ6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oaqjpqySoba8q66imZefoaWsrJ+crbSip5Ggn5+mnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ef5OFhqykh5yRipipmJmakoelsKailZmIiYBpboiHi46OiYuNkouQkaGMk56fm6Klf5OBj6OhlKB3nJaQp4Ohp4CGqq6FpXmLfYSafaJwcpKHlnuejHlth5uMmZCbqZuPh518gqJzdqZmnn53pF+YenySc6JumLe0unSSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OOgouXcYCjbHOkc56DfqNenZmzlm97l56zdHJbnrKCaWJvc3VxaG9Za2xycmVcaF1iS0Q9RDVRQVlxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1pYYGB8ZElDOExXVVZiYVplZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmsnJOgjqW4ta6toJqinKOjpKybmrGsq5KXoJigpJqalJ6rm4uIkniLhXCAlo2Kj6CQk5Sdl32RiY6ooYeYj4qSo5ObmoyLqKekno+Wh4R+a3uGfn2PjYOLkJCJj5OfgpacoJ2gn4uJd5yYooygcqKLiKmInKeRl6isf66MfXqgmXmjk3iAc5eIjJx9lp+Gm42Zm6aGo2ShfImWkJuNbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2dYmKf55omnWHk5KYjn+ebpmQa6aZXKh+d7tqfalajoRds2dcbXF4d2tpW3BpeHhiXmVXYkFQRE83VkJSbTRKWlpfTlpEQDE1MTs7N0g/OkNIVT9YUlldPkRiXVZgUWFkfWlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52tmp2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aWhJKVmI96ioSWo52JlY+Gi52RnJuJj6iioJqLkYqAgGmBhnh/lox7iI2Oh46Vmn6ToZ6gopOYcmifiqCPjHCSjIKpiJmfo6mhqH2wraSiuJd2o7Oio3+IlHidequafqKOnZuXiJdyoXyFja+1fWuakaF4fpi0o6OrqISYe5p8nJl+c6paXW97l4t4nmJMf3t7hWN6mEJNn1mianJ8jm2BiYSZdZt5h4mxs39/mpKmdH+dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZWBraHZ7YmNgUV5WXFRWQFlFUWdEUldbYlhfSUQ9QjhAQjpJRThMRVhBVlFbVkRGYVxaYEtgbX5yRUM8VV5iWmVqVmdobG5iZmZeYWFcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZOdgbGumYRTXqGntLqzs6maooubqZybqJKhq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCccpGQgYiYlJ+ahI6onJqViouKfIRshIVxgaGMeIWNiIeSmJR8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnZCLoZ59p2h3bX6Zc6BzcXydhZhvk4KufaODpp6agaNwXqlndaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRem29+cZdvgXOicl2jZ3SmYWimbZvTmHqCm253eZdrm3p2l3JsqaVnX2R5cH6Ea2dmY212d2ZfYVJbZVFRYUlXSVRfV1NbZWpbZVFFQ0tMSktCSkQ4UEBRTldTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pnYGJfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiFmKagoKKNpKifl6iJmZeYk5mTkqCXjYiFe3B9hGh9j4OTmoF4kY2OiXB/ho+SkmyXk3yJkZKjlYOOqpqUkoqFiXmEdoeAboGfhneAkoaImaGWeZOio5qgibOhoraLeqynpK6lcKmAmpCFgZySfaSAopmGmHGehKKsromXi4CMpI2Wg66ilHa1trXJoXSUioCfYZ6XqW14loafmnWhh3egfZCWioFvTGaiknCaiHOke3l0YYOCbH6gbHJkYJxyf3SXaXtps7W0xqZzmH57nWqbmqt0gpptc3eXaZp5dJhxUEV8s15qdWp4h2ZqZ2J0dHBtVV1TWWhQUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGVjaW1ldHJzfnh7bnWJe3tUUU9sXmhba2lSamhpbGdsZmNlX1xcXF5pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobOrr6+1oqKQgJeooqGji6SmnZylgZqXlo2XkJCbko2Ig3lqeYZlg4x+lqB5dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCQoYZ5gJSHiZaflH+UpaeclpaEZ254nGyiZHxxpXecmHBnp4GXjHuleqCWg5Zyn3aAiZSWj7lukIqiYn2ZopWIbnJpqmt1oGxupmCbaYuQaJaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGaIgm5yolpfW2Shbl6JjG97f3NyZKVueKJkZ6domHKLmG6hb1KIj2+gXmSnVItdU5htbXJqcYFscGhreHNrb1FXVlZmWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3J2jYCDdl5Rc2FnYnBnUGpoaGtsbmdkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmKZ6ZXRti6eupaqwsaafi4CWqpyepIyhoZqhoYCVmJONmo+Ll5CNinuGcYCIaIuLfJeac3WJfZB7ZYOHlYqKlZmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjYiYn42HkqqmnommeJacfqWJloyymJ6Qg6+Xn6V4loh6qXSlj4SabqWijJKEjIO8bnylr4KGhYaTlpygfaZ6caiUoJZnnn5vq2KWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4ZubZ+ekpVhfquLqnaAf42nn3effYWklZ2gaZqHdatmnq2MtnN3voykk1mDpo2rYXVxc297dHBian5uaGxSVVpVYGFda01dUl1JXWxtdmBbcVlbYFpnc2Vub3JjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnhkY25zZFJsZ2hvbHJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsbmKVpqqcgYCepJapqp6op66jmYmCl6qZnaOJmqWcqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Wk3R1hnKRg21/i5KHhpOPfXuBhZeljX+lpY2AjYmElHWDh5JvbIqogIKLlI6JnJ6JjJOqo6CQgHWVl4h+gXmUrqN/gZtxj4Z4kIyFgHtyp4xxfX16l5abhI54e359iJSVk4p2kJmfoYR7fYlrjIVbeXlyeXBobn2RiXF/dIGPlJNxhYOBZY1/X4GAjHd1c5R1b3pvbodthIZfd2h4jmaBgoaOqpx+dH2XaomIb391fIR1bWxmjHN4e5d3hFtqWHiPaG13cXBvd3dvXWyGbWlnVllfV1xka2RVYVVeUV9wd3lrandlampqdXxxcXRzYW91YnN7gXh1eYJ1f4B/gHiLhYJ9e25/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKapqSZpJ2roqCDg5erkZ2giZqmmqiYgoGbi36WlIeOiYiNcoJ8j31+j4R6l450c4RwlYV7fZKLhoaQhXh+gIaZo4x7p6GLhY+PhJWCho6Xd3KEqYWNkpyQiJ6eh4uap6Cgq4OJjpWafn6Jlq2oj5KnkHhwnpGDe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2Di4ycm5+Oc5WLiHF0a4J2c39Ycm6Gj4F9fotpXWljeoWDiIBfaXh7m3yDjIN2gYaDaXmLh2thcXODd2BzjIKJkKeVhmaNj4NudouDb4SMeG5kZmN5gnqVWlxpZm52W3p5d3Rtc3KCZlxtimtrYllZXVpYa3FbXmBZXl1mc317c290Y2pqaXt8cXp3dGRtdGhsfH51eXx7enl/gH9vhoqEe310fnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxnc3luaGptYIyMq7GikKOhmp+emJ6ZqaOhfYOXq4yflIebopCklH97l4R8kpmIiYaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gIOKm5+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZlIqenYeIoaqfoqKjjIiTm5yjmZaqoaemoJKbiJePfHiPjoSofn+SkZKTnLClmpSdkI6yk5iEpoyMlZugiZCbgoiRimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhIOQd3x6dZqiiYeLn4uGlX9+jIGAdnF0hoWAeIiHipGmkYSGjoiDjZCMfIaKh46AdWuBg3t5mWlyaGBzinB9enZ1b3d0gVxeb4dobl9eWltcU2dxVWNbW2FsaHR7fHJucGNqaWh/e214fnFob3BsZoB7coGAd4B9f4R7bYKMhXx6eHx9eoN4TmR2anNucHtla2ViYmBbc2ZwZnJxbFVdbHRtaXl6cGdpa2WNiJ26n5aioZiVmZiUmKSgnXt/maqNnY2Fn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfYiThG1rfnqXhoSDkH6AhoSGfYeDjZudkoeqnoJxio+FkpGLnJF9jXqpg42Sl5WOm5aGhpumoKKanYaDkpmZmJCapp+mnZ2Ql4GSi3d9iI6FpXt8jpCRhpipoZyTnI+Nqo6SgJ6NiJOan4OPl36GjoJveIVxdGB+g4+FdIuXgIOOgoaEfoWElG55dXWToouNhpuFhY50gIp9fXJze4mEe3mMjoSTp4+GhI+Cg4qJiXWEh4iKe25qfX97bWhrbGdeeX5nfHt2c3V1enZcYHB9bXRgYlpcXlFmbVNlWl1ha2l1eX5wa2xja2pngH9rcoBsa3RueG6EeW6GgHaCgH2FdnGCjYd9e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWxUYnF5ZHB6enJlam1ti4qfuJqhpJ+TkpaXi5qfnp16d52lkJuJhqSUipiZeHqNhXyJkYOMgoGCbXx/eHKAhX2KkH1raH2Bl4iBiI58foaEh3yPgI+bm5GIp5x/cIuKi5KGoKGKhYx8p5GHj5KXk5aSd42joKGdlpp/gZCZmJOMmqKho5qXkZt/joV5gISPh6GAfoyMj3yXpKCgkpmQj6aNkIGbkYmTmJt+kpJ+h46BdXSCcHZgfYCNhXGKlXyHi3GMfoKFhY5oeHJ5jJmSkICYfoiLcoKHfH1xenyMhXp7ko2DlqWTi4aRfIWGh4R1gYKGh3lkcXp+eHlwbGpmXn1yaHt1dXN8c39qXmBzdnB3ZGNZXl5SamhUZFheYWdqdniBcWZrY2xoZX+Aam19Z25wan13hXpri4FygYF9gXR2go2Gfnx6f4F9f49qcoNuc2lhiGlsYl9xVXRvbW5geGhtV2p0dmJ1entxYmtveomNn7OSpaWdjpCYj4adoJqcfHWjoI2Wf4yiioialnh7hod+g4l+iIKAf3B/e3R1goV+iZB4Z2N9hpeKgoqNeH2AjIN5loCVl5WNlp+afW+LgZCThqWbh4yJg6WVhJKKlZeSkXaRnaGhmJSYen+OmJaOlpqcpJ6Zk5SbepCGg3iFl42efoGKjYxzl6KdoJKYjo+ijIyDl5iDk5aaf5iNfIiNgXZxfW16ZIB8ioVwhpJ/kIJrh4KBf4mEZXVvfIeTmI19lHiMiXyAh318coB4iod5hZGKi5iiloKEjHeIhIKBdnqAiIR0X3d3fHN9d2ZrZGB+aWp2cnN0fXB7Y2Ngc211cm1hWWBeW2xkUmJXX2Boa3V5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgX9+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXFuYHhmbGJqdnBmeXt5cWBybIaFkJ2umKaono6Nl4eGn5OXmHx3qZyKmHmXnIuLmI94e4CLfXyDe4CCgHhzeHpzfYCEf4iKgGRefYuVh36Eh3R9fop/fZiElpSWjKKgl35yh3uTkYqmj4yOipKgkYORj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI2Vl3SOj4pshpiQmXqHiJCJb5edmaKTlIqMn4yGgpKcf5OSlYeZiHuJiYF6cXlqdWx7fYt9bYWRgpN3b4GDfX6LgGRyanyBl5iFf450kYmDeYd+dniBfoeBfYSOhY2UpJB5hYN0iYd9f3J0f4aCbGB6dHlwe29hbmJke2FubnVyd3dzc2F2X25rdW5vXVteXV5qXU9dV2JhaG1zeolrX2plamNod4dtZWxoaWxngHx6d2+Ph3OAg4R9dIGGiXqCfXqBhH19jnJ5i3l4bmyHa2hfaXFjh2hxb2V2Z21sYXpoanx6eHBhd22LgZmaqqCkqZ2KipGGip6KlZd9dq2YjJZ9npORlpSIdn17inx7gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkYZ/g4RzeoCGeo+Rh5GRm5Kkm5SBfYB8jYqSpIiNio2Xmo2FkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJlpJvipqFZ4aaj5R6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmY57iYSHdHN1a3FudXuKdG6GkI2RcXSAe4GCiHxlcW15fpqUfYWJdJGLgXSJeW+Bf4GHfYWNioWNlqiNe4h9fouFd31wbn+EgmJnd3N0bnpiXm9ganRecGl6eHhscnBleF1tbHNtc1haXl9halpPV1hkY2dxcX+HZV1paGZiZ3GNbmRpZ2RpaIB6d3VvjoRzgIGCe3WCiIV4hHx3g4V6gIl3f4t8e3J5g2prX3BodH9rcW5tcWdvbGV7Ym1/eXZxbHd3in+imKKooaebh4yKgY+chpOcdICqlJGMhqCMlZOQf3N7doR3eH9yc3uFa3JveW2JdoCAhm5wW1l+kY2IgICAdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aEiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhZiIa4akg2eGnYqRf4uEi4F3k5iRnZGQiImVjn9+j5h8kY2PjZqSfYp/gm92b2ttb3B6hWlzg46XiXB3gHSCiIJ5ZnRvdoKaj3yJhXqVknp3iXRwinyHjXuLh4SJj5yjiHyEd4KLgHh4bml/gX9ccXJxb293Wl5wYG9qXm9pfHlwbW1qbXZgcG9qcW1ZWGFhYm1XUVNZZWZjdXCEgmJda21kYmZrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYV/d4eGdoOFfIeMgHt2in9qcWN8YoZ8b3BsdGpob2x2d19xfnl7dHV0f4J+pZWarZ+nloWNg3+XlYOPnnSKn5OShYqajJWOi3pyd3SCcHKFc3F1iGxvbXVtiHeDfX9tblVRgauUh4J4gHZygnmCoIGRgZOSmJuRmXiReoKMkqSak46IlZiSg4aWmYyTi4mPj4iehZCKfXOLhYiPiJyZnpuWlICUf2mGnYhoh6GIkoSRg4lxg5GXjpqOj4yLj413e5KQeo6LjZGWjXyIfIBrdmpta2tsen5heX2OlYF2eoF3g4x8eWd1bHWHlox/iIZ7lJFxeoVweI17i417iX6DjZGenoV8fXiCi312cGhrgIF3XnZvbWtwclVdbmJxYF9tbXlwZ3BmZ3N1aHBrYXdlXVZlYGByU1BOW2ZkXXhwiHxeXGhyYmJlZpFpX2dkWmhwfm9rcXOKfXZ9hYB0dX+MeXuGgHiIg3OGhX6MjIN7eZV4ZnJqg2CHfm9va3pgaW10f3RfdHx4hnhzcoV8eaGQmrGcpo6Din+DmoiAi51+ipmSjoSIl42OjoR2c3ZzgHBvhXNwcYNvaml2bYJufXxtdHNSToLfyZLWk3xwdIN1g6CCkneUkJibj5h7k3KFkJ+hk5OQipKbk4V+lpWIjY2IkY2InICOgXh6jH6IjImbm5yalZN5jXdoipKIbImkhZKIl4OGY4yRmI6UiZaLjYqLcXuUiXuNiIqTkYl6hXt+bHtlcm9qa3l5W4B5j42Aen1+f4aOenpodGt0i5CKgoaFfZaMbH5/b4GNf42IfoR6g5CWmpuLfHd4g494cmxlcH+Ca2h0b2doc2xTXm5kcFlfa3B4ZmtqYmZ4c29wY193YGBWa19ddk9NS2BmY115cYp0XFtldWBhZWWOY2FmYVhpc3Nua3F2i3x0eYaBdXZ+i3N/hn97iX9yiYeBkYqIfH6YdmVzbnxliH9vcGuAWWtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV3iJV+fImch4SfkI6FjJeEk46HgXV3cHlxboRvbW5+cmRkeHB8bXp8amhsY6Sawdyu76Fza3WDdYShhZFulY+Un5SbgZFwhYujl4mOlYqQnZWCgJWQhYmPgJKKipd/h3t1f4l4hoSNm5qXmY6Qdot3b4iKjH2LpIWSiZ2Fhl6LlJeKjoiOi4qEiWx7l4J9iIWJkY+GdoV9fWt9Y3h1aW14c1eIepGGhHl+f4CFjH55ZnRqgIqPioODgIyXhmuBdm6JkoORhX+CeoCRlpSZkHR0eIeNdXNwZnR5gWFzbG9haHVmUmBwZ2tVXm1zeWByY19ofXFybVpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15YanJrbmtyd4t9c3eEgXh3fIhxg4R9foh7dIuIiJWGjH5+l3NodXF5bIx7bnRwgVhwenZ5cWR3eYaMaXaAiXKAnYiZqJyjkoR9cIyUeHmKnYOEoI2OfJWMf5mHhHtzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6Ei5WKjJiTfI2SiIOJj3uRi4aQgn92eIOEcoeCkpuWk5iGjHaHf3CGg4qHmqKDlIyeg4lhg5WOhomFiYyHgIdpfZR/fYOEiY6NgnGGfn9xd2d2cmlzd2tajH2SgYR8f4OAhIqCdmJ0bImCkIuCf3+TkX1ugmx5h5CHk4V9gX6BkpSRl4lucnqMhnVscGpxd39ec2huXGp1YFJkcWhmU19vdnRfb2BdaIJxcmlXZ2hjaVhtV1t1TEpLZWZeYnJzhWhbXGV5Xl5kZ3phZF9cWWtuZW5qdHeKfnNzgX56dnqHc4WCfH+Hd3aKhY+YgY2Ce5N2bHd1eXmTdW54en1YeYZxgG9neHeSgmR2hoVxipaFmaGbooqGc2+Si3J2jpt9iZmIiXuff4OZf4F5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpCmeG5xd3txkpCMh2qYjYibkYuGe2iHi5mGgZKRhoeXjXyNjICAiY18kIx+ioV6dXuCenGFgJSYjpKTgYl1hId3hICLlJ2fhpaPn3+IYX+Th4SHg4mNf3+CZn2Rf35/goyPkH5tgnyCdGttdnRzdnVrY42Bjn+EfnyEf4SIf3Bgc3GGfI+Ngnx/kol6cYNme4SLh42EfIV+gZWPkZOEbnB5jH51bW5panl8YWdpaVhrdVpSaXJpYlBicnhsYWVdWmqDbXNiW2dfZGxfblRab05ITmZkXGducYBrWltjcl9cY2x3ZGVdXFpsa2JtanN2hn9xb398fHR4hXiFgnyAiHV5iYGSlXyIhnaIgXB4eXuEk29te4F3XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGh3Z2lH9tdpOXfYeQg4qNmXyLmnZ+d3FvbGphdHxnYml1elpfeHx5bXF+ZWNoaFedj15xcpa8xIR1cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEm4x8ioZ8e4mMf5SIdYqGdnZ9gXF1hYGdk4WUj4ODcYCIdYV8ipmdmIeUjp2AiGZ9k4J/hYOJiXGBfWZ+i3t5fn+Hi499aYB8g3Zmb3h4c3ZzbGqNhYqBiX94gYCFg39rX3J5e36NioZ8go+BfnKBaXmEiIyGhXmEfYGYjZCMfW5te4l9d3RuZ2Z7dWJbcGJXbnJTU25zaGFNZnR4ZWBdXFhugG9zWWVhXmptYHBPWWtRRFNnYFprbm18bllbXmxjWmJvd2RmW11gbGljbGlzdoGDcW5+fH90dYN6g4J8gYV2foiBlpB4g4p0gYhyeXh+jZBvb3uBcWmBeHp+bWx7dZVraneEdGyUjoaemKCZhYhufYx2aXiYjn6AioKVl4l5jpZvenNwbGpkYHN6aF9lcXpaYHJ9eWdxemFlZY+xsndKYlqk2dCWcnuQipB3fZSKhJmRjIVua4WSkXp5koaAhJiKfId/eHiJioSWgHCMiHF0fXppeYWDpJCEk4yDfm9/g3eEeYacmZWLk5CUhYhwe5KCfYKDiINugXdogIV4cn9/g4qHfGV9foR1Y3Byf2h4cG91mIyFgop8dniAhHmBa1xxf3OBiIWJfoaJe4lygW5xhYePhYVzhHqCmY2NhHhub36Ef3Z6ZGdpe29eWHZaWHBsTldxc2dgSmx2dGBdW1tZdH1yb1dnXWZqcGBvTldoUT9ZZl5ab2pnenFaWllrZVljcXlfaFxeZW1oZWtpcXd/h29sf36AdW+Ce4CBfoJ/doGFiJeKcYKNcXuGfHl5hJOMdWp6f2xvfnR/fW9ye3uUb26Bf3hmk4uDoZmckoKFZ4eDcGd6loh9foSBmImBfI2MaXhya2xmX2FueG1fYm94XGRsg3phcXZfZWXU6r6KMjo+i46AcXiFiI6NdoOWjH6SjYx/bWyFjYx2fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6aLgo+Lg31ugHV3hHqHnZGMkZKTjIuGf3uShnd/hI2Da39yaIB+eG18e4GKg3dieYSBcWRxaH5tdHF0gZuLgH6FfnN1fYBzgW9bbX91eIuDi3uHgHyIeHpxbImEkISLcoJ6gJeLi390bWt3gIB1dVxoZ3ZvWFZ7UllvZExacnJlW0lweG9cWlpZXXV+dGhZYltnZW5jaU1XZlE9XmVcXXVlYHVwWllUb2RZZHF5WmheYGdtZ2praXB3fY5saYKEfnlugHx8gX+CenWCgY2ThXCAi253foB7e4iSiX9oe31qdHtyhntzd31/jHl4hH18a4yNhJudloyAgGyNfmtofo2Men5/g5SBfn2KiGt1cWdoYltiZ3JuYGFrc2FocIl6YnN0XmNkm6CPblw1Wa+1dGmAiHyShnWFloVzj4qJdnBshYOHdXmJeIl8k4d6fnNndol+fphvcYZ+aHZ5bWV5iISkhoCHjYl+bn52gIF9jJqIgpSRmImLhIl8j4hwe32Ee2h+bGqAe3ppenaBh4ByYHeBfnFkcmZ1gm11e4SUkYF8gX9ud3l8dH5sWHCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiYh6bm1qboKCdW5cZ2RycFFaek1ab1xOW3JwZFVLc3hpV1lZWmFxgHRgXV1gZmRoaWVOWmhOQGFkW2B1YV11bVhXU3RhWmRvcldqXWFoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ji4Nxe4dvcXeEf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2FjIiYo42Eg3t1i3lrbISIkHh9e4GRf39+ioNwcnFjZl5ZZl9vcGBgZ3Bmam+JdGF0b1thZGp2e3++nKajyLhxhYNyknx4hpOCc5GMh3Jyb4N7g3R1h3SId5OIeXlxY3eHeoCTaXKEdmd3dWNqfIKHnYF/f46PfXJ/dIV6gJKRg3mWjpWPiIKIe4iIa3h5fnVnemhsf3lzaXp2gIN9aGB3h31qanNne4BpdoCLkJR+en1+cHt2e3R+YlZ3fXJzioSCfYNxh4p3eHFwhIKNf355fn12joaDdmlxaW2IgnJvXWdhcW1KZXVLXW5VU1lzbmJRT3N4YFJYWFxhb4JzW2FcaGVlY2tjUFtwSURjYVpjcF5dd2hVVlV3XltlbmhWa15hamdlb29ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIWDcHeDcm53g4J9iYuTf3CAe3h5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4Z7Z3SFi5B6fn97iIWDdo+AZ29uX2RcWGVZbXJgYGBwbGtoiW5gc2lZXmRtgHep2qnHhoeycYl3b4x1e4aOgHqTiX91dHV+d4BwcX9thHSUhnh1a2B6gnmIj2ZyhHBndm5bbXyAkJN/gHmRkn15e22Id4GSjIR0loqRjoeFhXt/hGx1dn9tZ3ZlbXt1bWp3dn9/fGBieIV5aHR1Yn17Z3SGjoyVe3SAdXF/enxtf1lWdH9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfHNndGVui4Rtc1ppXnRkR21tTFphV1ZVeG1iUFJ0dldQVVheYXGEb1xgY21kZF5vYlRdckdCZl9dZmhdW3tiUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29xf3RxdX+FgYmNint3f3iDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeV59hZiMeYaDdIWGhHeJe2JubVxiW1thVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyEiX57kYV5eXN5dXV8amx1Y4R1koJ3b2ZefYJ6i4lmcoJranFjWG16hZuIgYFzl5R3f3xuiXKCi4yIcpiOkYmFi4N7eH1xcXB9ZmhxYm14cWprcXh9fHpcZHmAd2l1eGWCdmd0h4uNlHxxh2pufYF5bnxdWHJ/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfHpyZnNhboyCa3JXal12W0htak1VVF5UVXtrYU9UdXJQUVRWXmJ0hWlcYGtqZmNZbmFYYnBHQWhcYGZeXVZ7XU9VZHBaW2poXVdoYF9yZWpncmdwcneGeG6VinR/end+eIOHf3Vyf4aFjYJwcHt4d3V6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOgf4x8i211gHljg4aWhXORim+FhYF6g3RjbmpZX1tdXVRnc2VgWWRxcmaBc2JrZVdbYGl/eL6ue6C3bWJzhmhze3F5goV7fYx/d3hydm97dmVqbmCHdY6Bc2piXn94eYuEZ3F+aGprWlZvd4mjgYR/cZmTcYB5dYNugYOSiHOViI2IhImFfXh0cm5oeWBqbWBtdmpnamt5d3p2Wmd9fHhlcn1thHRldYWMhZV/b4tmanqDdW11YlxwfWx1fYx8gWZ1h31ucWh1f3h+f3N9bHt7gXp4cWZsYm6JfmxtVmlfdlVKaWpPUU5oTVl8aGJOVXVqTFBUVV5mdYNmXWBwaGdhV2ldW2toSkRqWmFkV1lVeVlOVm1qWV1sZVxZZWNedGVsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWCbnN5e3pzc4WGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn18bIOEkn9yj4JwhYJ+gX9vZmxnV11bXFtUZHBkX1dicnVpdXBlZWJXXFxof3BvcoBziWRkeH5pc3VzcoKEeICEeXd0dW1renFiZ2tnhnSNg25mXV99cHuJfmlteGZpZFVXcm+NpnyDe3aWkHR8c317bnx8kYZ3mXyIhoOGg310cHJsZ3RcbGhebHRkZ2Zpem97cllngHZ0Z3CAd4F1YneFinyUgG6Lam16gXFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenl0fWZ+f395d25kZmJuhXxtalVpYW9SSmhqT0tOcEdee2ZhTVV0Y0pOU1dhanZ+ZVxnc2llYFZjV2JwXUxLa1hjYVVUVXNWTFh1ZFpfa2FcWmNlX3ZmbWJwaXNucn91dJqBd3+Ad39/hoR6fHWChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt5b4VzeYR9gYN1bmpoZVZdW1paU2JuZFtYYXN7aWhtaWBiV19baoBpa2+AZ2tgaHl4anNzdG6EgXp/fXV1bnpoanlqX2VuaIF2kIVnZVhid2l+h3tvaXBnZl1VWG9njqh3gXp8kI55dXB/cHN2eo+AeJV1hoOAhYh2anJ2Z2huW2xkXW1zX2dhanhoe21bbYJyc2pvgH55d2F3hIR3j4RyiHFveX9xY3BoXHB4ZHF0iHx5YnOAcGdqeXRybHh3dnhkg3t/eHZwZGNjbnx9a2tVaGFlU0prZ09HUWtFYHhnYU1TcVxKTVRZZWt3emVfbXFpZF1WYFZubldLU2hXZV5YTVVrVEpceV9bX2tdXVtjZWB5aGthb291bm94dXqYfXeAgXqAgIeFenh5g36Bk4RxdHR/eXZ0hIiQfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aErJ9/eoiIg2tygXl1gH+BdG6Gbnx/c4mAam9tZGRYX1pZWlViamdbWl51gmlebWxcYVZcXGyBZXF0fWlpXGt2dWd0d3JshXt9fXl1cmx5aGl4Zl1lcmh6d5OBY2NUZXBngoV3d2ZoamBXVllnY4+nbn53gIuOenBxfWh6b3qNfHePcoR9f3+GbmR1c2RoaFxrYl1vb1tnX211ZHpoXXSAb3FrcXt9dXVhdIWKeoeHgH93cnV/dWFwbVpydGJxcoV8dGVygGxhbHtvaml7eXZyZoV2e3p1cWRhZW1zfmlsVGheXFRLcmJQRlZhR2J2Z2FLVG9XSkxXWGdrdnpkZW5xZmNaV11ZdmVVSlxjV2dYWUhXZVBIYnhaXV9sW15cYWNef2lqX250eG5vbnaDl3lygYB8f4iLhX51dYV4h4x9c3V1gnl6eoKLjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj66Me3uHj31lcYd5c3x7dXJuhmx7fmyPemJwb2JlXWVWWVlWY2ZrYF1cc4VoWHBuWl5XWlxse2Jwd3ZtYlpsc3NndHVwbIR5foB5d25udGVpdGVbZ3RmdnaSel9dUmVma4OCdH1iY2lcVFhdYmOPpWh4dIKFkHhtb3poeG58hXt1iXOAeHx4f2hldm1gZmBeal9dc2tZZV1vb2J6ZVx3e2tubm93eHN0ZHKDkn6Hgoh6dm9yfXNid2Rbb3BicXGBfHNncoBkXm52aWRneXt1bm+CdXR9c3FiX2Zub31kaVNnWFhUTXdfUUpZWEhidWRhSVRtU0pMWlZpbHJ7Ymxsc2NhWVlbYXZbU0xjXVhpU1dHWWBOR2l1WF5hbVtbX2JiXYVoZ2FueHlsb2p2gZB4bYJ+gIGSh4OBdnSJdIyGc3F3dYJ3fH1+jI+AfpN+cHeVg3yZknmAgHh5fn90iINzcJmie3p/iZR4ZHWIeHN3dWtzbn5seXxwkXJecG9gZ2JsVFtaV2hjbWZcXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNxbHNzc2mFfH5/fHZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFtjkZ5lcnGFhJF0bGt6bW9we3x8cYF3f3N6enpkZXVoXWJaYGdbXnZoV2JdcGhhd2Bbe3ZpaXJud3NydGhwgZSChn6EdnJqcH1tZndXXGtuYnFzgXpzZm9+W2BwcWFfanF+bGx1fnNxeGtwYVxlbGx6YWdTZlRXUU91W1FPWFFIY3RiYEZValBJUFpVamtrfGVtbnFhW1pYWWxwV1NPZldXaFNURlpcTkhydFhfY21jWGBgYl2LamNkbXl4a29pdXmGe2uDfX+EmXyChHl8h22PhnFvd3p9dIKCfIqOgoKXdHeCk4WBn4l1gICBc3+CcYeCdW+il3R7houGe2V3im5uem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxsWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW50bXB1dXhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhVxjX2NUWmBZY5WVY25wg4WKc2poe29mc3dzfGx6dHVven51XmZyY1teVmFkWWF0ZVVfYG1kYXFdXX5vaGlzcXNwdHVqbYSSgYh7hXFyZm59cHJvU1tma2ZxdIB2c2NsdlVicmtaXm9mfWZtd31zc3NqbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlOSFdUVm1oZHxpa3drYldcVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmx5dW5vaHZ2f39sg399hpd7f4eBiX5rk4hyZ3SAe3WAgnyIjn+Lk3J8ipGFh5+Ge3+GjHOBhnN9g3ZupYxzgY2LdndteoxgZHtwZnlyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sb1tebo1oTmltYFRWU29nc2xmeGRkXFhwdGxxenhybIh7f3acenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cINfYl5nV1hfV2SbiGJrcYGHfXdra3htXHdxbHtqdnNub3uAclhqbl9ZXVViY1hkcWJTXmFoYmJsWmB9a2Zrc3VubXd2a2iFi36IeohtcWVwfW1ybWNZYWlpb3SBdHNeaWxTZXFkVWJuYnpjcXd7dmtwbWpfWGFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBUXlRddVxUU2BmTl1hVFNKXFlQWXV1XV9lbWhYY2FbXo1wY2dqd3Fzbmd2dHqDcoGCeYeNfnyJh455bpCKdGxzgnR/f4eEhpGElY95foyPh5GbhIB8jIRygIFzdHdxbpOTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBEREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjpCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhoaGhoWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpGSkYmHjoqQkpOQipGPjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HioiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiIeGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmOjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR1dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46Oz4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7OTk6ODg7PTk3OTs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDo3OTo6OTg5OTk4ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PT9APjxNTDk8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DRERBPj0+QEE/PmpvQj0/Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NGREA8PD1ARERFbXlJNjo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAQVhAPlt4fHt5eVM3Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQT9GeFhjhISEg4J7Xzs+PT8+PT5DRD87PD0+Pz09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fHx8fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0p0eICBgoF7g4FoP0FAQ0BAP0BAPj08PUFFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7e3x9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFATHN8gHuCg36FhVk+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS01KR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUVKcH1/fYOFhoaHaEFFRURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSE1yf4OEhIKFh4iKVUFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSUtLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xMTGeAhIaDgISIiYxwTm2Eh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNydHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTExKU4CFhoKAgoSGh4OAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJEREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhKSkpdhYWEgIKFgIKCg4SEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+PDw9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJSWCGhIF+gIKEg4KCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc1Nzk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7e3t8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNCXoSAgICCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojk6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOjxqhoGCg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo6Oz8+RXqEgYKEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD8/QT0+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PT0/QENQgYODhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGRUZGREBCPjxAPj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BQENERlaDgoOFhYaGhoiJiYiHhoaGh4mKiouMjYyMi4qKiFdHTE1NS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCR0dKWYSCg4WFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0ZJSVBggoOFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSkhHRUpJREpIR0xKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A5Ojw4PT47PUE+P0FER0pMVnKDhISEhIWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlFRUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJcb3J3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUdLTFBXeYWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1VSUlRST0xLSkVFRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNRUExLTU1NS05HR0pGRkhKRERFRUJEQ2NwdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI/QkNGVk5GTU9QVFl8hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklISUhJanJ2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FBRUJDR0VERUxYUk1UVVZYW3yGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQPkBWVVlcZGBWWWJyXl1WXVpWRVFZWltZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvc3Z4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B/f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1daWlxceIWEhYWFhYaHh4eIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWltugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFhTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpucnR3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVU1VUV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHFzdnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgH9/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFJNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWlxtcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f4B/f319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBCREBDPkJIR1ZASE5NR11pUEhGT0ZERUZIR0hCQ0hHSEpHQ0JBREBPUE1TZHN1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xydnt7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz8+a1FLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8+PD1CPkpNRlVudXV1c3R2eHt8en18fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBREJcXU97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSVFZYU1JZVE5ZWltXWV1eXmBlYF1ecXZrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGRE1SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjY3OTY8Qj1mdHV2d3d5eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNTFRUU1FRVU9MUlNUV1hUVFhRTFhZWlZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE1RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTg4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QWFZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldVVFdUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVV1VSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRUFFQUU5RT1BPTEpMTE9QTk5QUVFOUU9KTE1NS0dFRURCOz08PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZlJRU0FHVVBPUVFQTU1OTUtMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V4e3p7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9APzw9QUBCPT5FSEdERkZJR0tKQEZBQUBGSEVKT0hQUWFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRD9CQz48Qkc/Qj9BZHF0d3p6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I+Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTE5OV0tMTktMTU1NTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkFCQD9FRkVIREtvcHd6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSE1URklJSkxKS0xJSUxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtHSEtESElLTUhKTEhISkxLTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnd7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZG9GS0NGRUdERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkRCO0JDQz5AQ0NDRUZLTUhLTkhESEVJTE5NR0lMR0VGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9SUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSUlMSEdHR0ZFQ0A9REVCPkFEQ0NFR0hJR01QSUZGR0tOT0tGSEpGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVUUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNscHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQkFCRD1CQT5BPTo6PT87Pj5AQj9AQkVHSkZKR0lHRkZGRURCQUFGRkNCQkJERURHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFhgXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXJra3NNRkZFSEJCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkdGRkVDQ0VCRElGQ0ZFQkVHRUVGR0VJTUtIUU1KS0hISUVGSUhFQ0lJSktNS1BTTkRRU1FRUk5PTU5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdDR0hGSEZFQ0ZKSkdNSkxLSUpMRklIS0hFS0tMTU5PUlRPSVNVVFFUUFFNTlFOTVFXWlZaWVZaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vcnN5TUhIR0lEQUNIRTxARUNFPTg6Pj48PDxBQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENISEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE9OT1JVVk9LVVZUUVRRUkxPUVBPVFlaWVxaWVtfX15gY15cYWNrYmBkZ2hyhWhnaWZqbW5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VFQ0hERkRHRkhIRkhISUtKRUpISEtIRkZMSEhISkhMTExMTElNS01NTU9MUFBRVVZXT0pWVlVTU1JRTE9SUlFWWltdXltcXmBgYWBhZF1kYGVmYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKTElMR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRUVGR0VJRUZFSUhGSUhKTEhISkpJTEpGSktISUpKR0tLTU1KSk1MTk5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV1gYGFhYWBiZGViY2hiZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3Z0dXV3dnV1dGVxc2twcWpydm93SkxMS01HRENBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGQ0dKR0dKRklMSElKTUtNTEdLSUhMS05RS1JRTFNNS05OT1BQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGVhYWNpbmhiaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj5ERUZDQENBRURERkNDRUdDQklFQkhKSUhIS0ZES0pHSElJSUtHSkpPS05MSUxISk1LWmZKZFxLbFJITk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsalRfd3ZpamdpZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDREJFRURGQkZGR0NESkVFSkxMSkxNR0dNSkhKSkhLSklLSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3BNSnJ5dmtiYGtlZW14bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9CQj89QkVGQkZDRURFRURDSEhHREVLR0dMTU1KTUxGSk5ISUtKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa01QUWxXTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4cGNea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkJCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklMS0hJTUlLSkpLT1BOTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnZ2FkaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lERUVDQUI8QkBCRkNHRktHRUNDSEtISEZKTExGTktMUlJMR01NSE5KR0hOSEpKSUhOT05OTEpOTUpac3Bwb3FxbWxPUVJuWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvbnVzdHRqW110Y3d4cmpuemhhYWNmYmJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISUJFRUVBQD5DQ0FFQ0hJTUlGQ0ZKTElHRkpNS0ZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9Zam9fZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhKR0tLS0tHSEpKTExMS0lLTE5UW1xUUFRNUE9OT09WUU9PUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZV9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRUVISUpISUtITEpIRkhISkdHSUVGTEhJS05MSU9cV15PXFtgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1TSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0NKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFhYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSU9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFeXmNhYGJiYmNjZVpSWVZVXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE/SElHT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlBQXV9hY2RjY2JcZGNiZGNmWFFVVFNcWFthX15fYWFfZGxrbWpqbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdIR0dKRkZGSUxKTkVDS0pMTkpMSUtKSElHQkhIUU1LS09NS0tJSEdFRD9FQkhIQUFGRkRUXVleWF9ZX1tdVVhYUF1dUUtKV15YXltdVlpgUlFfX2FiYWBiYmBjYmJkZGJYT1FSUltTXF5dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhDUktGSEhIRUZLSk1QRUdJSUtOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWX1hOVFVOWltNSktVYGFbX1hfXmFdT1liXGBgX2JjYl1iYldfX1RQT1BRWFJdXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUERXX0lHR0hERk1KUFBGSklKS05MS0tMS0pKR0VKTVFRTk9PTU5MTkhLQURBQ0RGRENBREVBTEhDTExQT09MRk1GR0lKSEdMTE1PUUlMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlBVVFxZWVteXmFhZWZjaGNrbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5MR0hZTUdISkhHTkxRUUlMSktLTk5VTk9LS0xHR0tQU1NOUE9OT05PSEtFYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVhWXkRMUVVMTVRWUVJUWFdUWFVUXFRQZlpoaGRZVGtUV1ZVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVElLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1B/UUl8WVlyc1hQbUhxbm9hVlBxcXNQQ2tzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWmBZWl9WVVd/anR1dV9hdl9YYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHpsdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSUxGUlZMS09JS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSVFF2Z3RscGJuZmtRck9Nd21qcnBzcnFycG9wgF1lenV4cXF6cX5zfWt1fWJSaHxlc3Nvc3N8fW9+eW9/cl9gYGJhWmFgZ2tua2JsZmdtd36BgIN+e3h3gHR2emlyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUE9NTUpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFBRS0dmeGxjeHFtWkpMVXlwdW11Ym52UGRlSmZ2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JbXmJkZ2lqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSUtLSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUElTVFVYV1dQVVBPTlJKTHJvdXVxdXFkaGFWbkxxcF5GaHlXdlRLaHh9eGB5e3NuYV5tb2RSZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBKTE1LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSVRUVldZV09TTk5OUUhSbUhpd0tgZHZ2VVdsT25se3Nhamd/dlVLV2tofWxtbHhgW3B6e15genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraGxtcnxrbWhre3RtbWttT0dKS0hKSEhSUUxOUE1MU1NST1NTV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT05MTU9QSkhRTlBVTEtLU1RSUlRQVlVRUU5RUVhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJXV1dYWmBbZ3JeW1xbXV5fY1pfY2NlZmRjY2JaY2NmZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxRSUtLTE1LSlRSTVFRUExWVVRQVFVYVVlVUlpdVlVUV1VZWFBPTE5XVFFOVVNOUE1MUVBLSlFSS1FNS0tPUVRSUVFTU0lITU5PUVJRUVFUVlJYV1xXU1NQUVVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFlXXlpfYV1cW1pcXGBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFBKS0tOT0xNVFFPVFFRTVhXVVRVV1dXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE1STktTUE1OVVROUU5NTlFTUFRRU1RVTktNT1FUVFJSUVZXVVlaW1lTVVJUV1dXWVtTT1NVV1VUWVVWWVRSUldVVVdcWVpgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXV1jaGthZ2ZoZmRgYmNhUEtNTFBRTE9UUFBTUU9RWllYV1haWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYVFJRT01PU1VOV1JUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZYVFdXVFJSWFZVWl9aXmBeVl5dXmBdXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9MUFNSVVpVVFBQTFBXVlFXU1NTWE1PUFJUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ZcXltfX2BVYVxgYV5gYl9cYF1jYWNnaWRlYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9iXFlgWlFOT05WUVBVU1BVVFNQV1xcXFheXF9XXF5qcHd5f2NcW1ZWWFJOT1dTTlFRUFJUUkxRVFNZWldVT1JOU1dWVFJUUlJaT1FTU1ZbVlZXVFZaWF1eXFxeVlNOVFZWW1tWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGZeXGRgYWBhY2RfYl9ZWl5bXFtZWFlXV1pbWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dW2BcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRSVFVUS1JWVVtZWlNPU1JWVVVTTlZSU1pSVFVUWFxXWFhTWFxYXl1ZW15UVU5WV1deWldRVFVYWFhUVlhbVFNWXVldXWFeY2NeWWBbZWJfZGReXmNjYV1lZmlkZl1eZGFgYWJjZF9iXlhaX1tcW1hYWFhXW1pcYF1bW1xbWFpbXlZeWV1QT09SWlBaVVVXVlRUVF5eYF5eYlxgVV1eYmt5dGx9bFpVWlVRUVNcVFRUVVRWWVdMUlpWXVtcUk9VU1hWVVNQV1JTV1NXVVZbXVhbWVVaXldfXllcWlJXUllYWV9aWVNUVlpZWlZXWVxWVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGVkYl9kYV9hYGJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV1gXpoWFlaVFZTVlxYV1dWVlddWFBVXFleXV1UU1hSWFZTUlRYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUllVWVpaYVhcVVdXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmNoZWNmYWZfX2FhYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWlZUXFRWV1lXVlxgYWJjYWRfX1ZbYGRhX3p1b2haXFpWWFVXW1pZW1lYWWBXUFVeW2BhXFRVWFBVVlVTVlZSU1VXWlpcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1taWllbWVleX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2lkZGdfZ15iYmNhYWBeX1hUWlpaW1tYW1hYXFtaW1dXWlhXXFtcYF1WXV1TUFZaVlZaVVhVWFdYXmBiYWRhZGFeWVlhZGJgbGZoXlxdW1dYWFlcXFxfW1lbYlZUV15dYWNcU1ZYUFZWVlZWVlNVVFhdXF9gYF1gXVdgXlteXFteWFZYWFtbX19bX1hYXVxdXV5cWlxYW19hXmBkY2RmZmZiWWNlZWhnZF5jYWBlY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhZWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQWFZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFZXW1xgXlxfWVpeXV5eYV1bWllcX2JfYmRkZWZnZ2JaZGZnaWdjX2NeYWZkWmhpY2ZpY2VeYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFhXXVxcXVpXXF1fYGJkYmJhXWBYYmNiYGNhY15cXFxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YV1lbWllXWlpgXWBiYmBhY19cYl1fXVtfXllZVVhdXV9fXl9bWl5eYGJjXFtXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddWlpfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlXmVmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gIGBgYCAgX58fHx8fXyBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4e3d5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x6eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x8fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp9fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+Pi4mDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFhIKBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYGChIGCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SBgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKCgYiRgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgoKChIKCg4KCi5iHhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYGCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOChIWEg4F/fnyIm4uDhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCDjYV+fH5/f3+Zj4GCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIOWin2Af4KKf42NgYGDgYGBgYKEg4GBgoGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICAgpqNgouCgoOAf4SDg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhIWDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKCmIyEhYeHfX9+gIaFhYSFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFhIOSiIGBgIR/f359hYeGg4B+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKBgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEhIaDgYCEjIJ+fX2BhoF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDhISDg4KAgYWEg4KAfn6Af39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHhoWDg4WEhISDgYCDhYOCg4KBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4OAgYWEhIKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFg4KEhIOEg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoaCgoODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKAgH+CgICBg4ODg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDhIB/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaLk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59gIKDg4KDgoOCfX1+foCAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/gICBfn19f4CBf39+gICAf4CAgIB/gIJ/gIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Bg4ODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAfn5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/f35/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn99foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB+fYB/f35+fn9/fn5/fXx8fYWTko6Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKCgYGCgIGDg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISDg4OEgoKCgoKBfn59fX1+foB9fX19fX19fX17enp5eXl5gIKCgoSDgIKDgX+BgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaFhoaGhYaFgYGDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhISFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGhoeHh4aHhX59fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjoyJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEg4WEfn18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8gIKDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGAgoB+fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn59fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4KAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoeEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4B/foB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGDgYWGhYWGhoeGgYSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Af39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH17fX19fHx7fHx7e3t8e3x8fH18iYqIiIWFhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH2JhYaFhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fn15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dXV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l1dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx8f31/gHx/f319gYCAfn19gH9+goGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWBhISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fHx9fX59en59fXh+f398fHx+fn6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYODg39/fn1+fn5/gICAgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYSDg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cHh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX18e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf39/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4GBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKDgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuOfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgoKBf4GBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx7e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgIGCgX+AgYKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhIODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAg4GGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGAf4KBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en1/enl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+gIGBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKFhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIGEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH9/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4SEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISDhYSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgnx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCHeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gH6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChoaGhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhoWGhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEh4aHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGhoaGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX+Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYWFg4aGhYaFhYaGhYSDhYWDhIeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fH18f3x+fnx9gYB8fHx9fHx8fnp7e3x+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEhIODh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYOEg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFgoGCgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4iGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYaGh4aGhYaGhoWGhoSDhIWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoWFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSChYWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGAg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fn59fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIOGgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhYeGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgH+Cgn99fn9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn19fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFg4KDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGBgIWDgX9+gH9+fH1+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX29vb29vb29vb29vb29vZ19fX19fX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tI+MjIyMjIyMjIyMjIyKoLq4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpJxaVVZWVlZWVlZWVlZWUnmno6Ojo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKWeX1laWlpaWlpaWlpaWld8qKSkpKSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamqo2hkZWVlZWVlZWVkZGRhg6ypqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Pz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHNzMzMzMzMzMzMzMzMy87S0tLS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztDU0s/Oz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW19fW19fX19fW1tbW1tbV1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs/KlqXRz8+il8rSxpKr0c7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/PnKqdrNeooKugzpmtmrPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Qy5SImp3CnJWQobOVhp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz9G9yJmbq52fp5m0wMmXmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/P0peUoMOioIygxdORmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P07ObxJjal8XJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NHOjZCgtqCUlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRy9qonYufr7OdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyY6lmqOQopqinJyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo4Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhyruhpqedvp6poKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Nzo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPTnpCNttmujpGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dK6xNXS1cG91tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc2Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS1dTS0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2dna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Nzk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29rb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2trZ2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29vb3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2tra2trb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PTw9PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZiYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/Pz9AOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmZqamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJCRkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKRkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbmpubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ycnJycnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2cnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnJ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lSWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEVNSVNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxUYE1IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mpqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmrqamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqaop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israahop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6qqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoKWorKempaWjo6eklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d3B9eWZbW2BfWlxWXGhkb2NuaWliXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLavs7CrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yjp6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WhoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHh4Y1tSWVRfX2JsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrS6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqWnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gwp7y8vsXExsnHxca7xMHFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclYyHkouYmJWanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkE9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKx8a/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmSiZWRl5WUmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eHp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL63vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9ycGZlZ2RqZWJqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbeyr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLWxsLW3tbvBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL7DwLrEwr7HuLm4rbe1uLq0uLO7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLSysbHysnGz8LBuK61tby+uLqyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysLN2cjLycjMztHMysS1usDDyL++tb/Bv8bGv8vGw7/BvMDDzMrHxcbAub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbG18er1MXEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PEw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL66wMrCxtPAlMLDv8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e8trnBurq4uLXEwcTJuYydvLnBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4wLa1wLO1srKqrqa3ua+Lj6+2uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q2ttHAssC3sJ2QjH53io6fjIyltbOyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLnSzLC/rKGAbH1tYGdpeoqOpbezsLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v7y+1cWyqYF4fl9sh2pjXmF6kam9trG0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7y/ws29oIBkWoRdVoWKjHxhW5Cvxrm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDo6QD08PDtAPkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6uMjFs4djWWuWXFdkeImLeUqCt8a5sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelraqota/Lx6ZzV12Ej1dWYWaypXZQaLe+trOqsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYl5eWoaisrra3urm6t7e7rqigoamioK2owsaZYlp/inZlZHp1r6N2Zl93m6+0rq+ztaqnrayjnJmUjpGWl5iZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTkpyepKiurayrq6+qr6mel5+lnp6lpL3DlVZom5d0i5mJb4x+dX15eqKqs7GwsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpGcmKGdqqKnoJ6noaWfnJKcopufoaHCyJFRc6W0gISGeGlwcXuDeH+oqbCurqywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tn5mona6fp56coZ6empqSmZ6coqKfx82PVHaKinNvamBbXVxeZWFujaCqqKqsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmqqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmaqgsaK3pLCmn56dnZeYlZmem5yjoMbRk2F8enloYFdMSUtOUE9RXGuDqq+uqaqmoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO7t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKCcnJibn6Cbn6DEyIdxeHZnVlJSbldXTk1ER2GNrK6mo6OioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxr66tLq6tLu3sLayqrqyrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqGcnqGinpuas51rbHBoVVBcfKaVeVJNZ5SurKCZnJuenpmXl5eSjI6Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPN09DT08zKwsXGx8rIzr/I0czHxcfFwbzDwL6+vrW+s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoJ2jn5ydmayVcm1jV05SaLTT06SNpLOupJ+dn5qYlpSSlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLNztPMxcfJysHGy8bIyMW/w7OzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yts7esrqOeo6KdoKSsmHpmWFNSWHfT17+yr6ednJ2gpKCdmpSUlZSJfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2v8q/0czLz8XJx7/Dw8jOzM/Qz83Kx824t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcHFsbWooaSloKKrtY9nWlRVVmiTua6kmpWYoJyaoKGfm5yZlYl3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/KzdLLzs+/xcLHxc7N0dDRyMvNwMrMxdPOy87IxMnGxsjMytPT0dXP0szTwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaaut6irt9fU1dnZ0c7QwLzMyba+rqaqqKGksbR/VVBTUmWTraafmJaYmpudoJ2ZnJ2TfXFlY2NfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNxMnPzMrLv8m/x8nNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHPz8q9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKSsrr60sMDY0tfa3NbOzcrD0s/BwLGqrK2qpbGpbU1KTliSoJuVlJecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAuLm9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBwaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcLBv7u1srHHwrjL1dXZ2tvYzMzPyNbVxMK1sLWooauqrWFIRFGLm42MmJWQlJKRlpaWkIt8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTCyMDHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcGFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvry6zc3G0NXV2drb2NDJz8/R08jCt7y8rqWzp7NkSUuCmI6Nlo+Gg4SEgn6FhX9zYFxeXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPIysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbmxaW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDxs3OzszVz9XZ2NnPy9LNzc7IwbXEv7Oxt6u5dVd5loyTl4Z6gIWGgHZ4dXJwX1pbXWBgYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wcHBxb+9ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr29tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7RysrKx83NztHI0MbV1NbXzcrPxcnFx8G6x76trrKusIZ4kY2Ki4V4gIaGgH6EfHR0Y1tcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Szs7S6tb6yt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8fLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMXIzczQzM3IysjKycrEz83Sz83Fx8HFwcC7ucu4rbCxr5d/j5CGiYp7eH6Ghnd4gn10aV5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sbKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHHy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psXO0svDxcHFz8fNwcPGv8XFw8PKwsnKv8C9wru0trbFsauwrqp8dpOIj5B8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxlbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq20trG9ua+3r6iut7S0vLizvK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkr6mypaeoraWot6ywsre6uruxu72+vsS/tcLAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0M/Mw8i6usvBy767yre+xL+7yrjBxMK2uL63srC2vrCqqqqdboODiIuAe36Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWlrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaimrqCdm6Slq7KvtrensKynqrSqtLqxtrWutrmxr7q5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SgoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpWdoaa6tquzs7uzxM/Jy8LGuLfHwcy/uMq4vMa5tMW4tMDCrri+tK6nsbexo6Omj3SGhoaBfHl1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloqiem6KbnqqwrbG1oqmqqaurpLS5rbewrLO1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bPyMjAxru7xMPPvrnIubm/uLPCtbK9va68vLSkoauuq5mgn4p/hoZ/eHJucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGVlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqKmnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2gmpednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzMjGwMW3wsDHzrfAxL60urqzwLezuryvtbexoZ2nraOXnZiLf4SEf3hvcXRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYV1ZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaq6evsKubo6O3qqCfrqi2qaanrbCkt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCvrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4wczHxcLDvca4yMyywcPCrr28try9trq7s7O0rJ6cpKyXlI2RhYB9d3FpbHJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2NiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6agqq+mn6KjtqigoaKotKGlqKWwpbCtrLWeoJ2VlKmhopStsbGfoqOdnZibk4uhlJGTmJiSl5eYl52mm6ehopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6WmrK+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqWnrbe7vMHFurG5tcTJycDDxsbItsbEs8LAxqy4uL63vry9uLawsKucm6Omj412i4d/dW5jYmZpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUVlVSVVJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpqSkoqOinKqrpZmepbGpoKCdpauep6Gera2pqa6toaGilJejm5yQq6mwm5+in56XmZOKnpGNkpOWkJiYk5yhop2koKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdQT0haXE9SSVRLU0xFRklDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2op6+5ubPAyLq1wK/Gyc27wcrMyLXKvbG+xMqusrnDt73Cvre3rrCpmZ6gn4qFdYiDe3RpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq6Zm6qzn6Wmn6KjoZSTm5aWkqmprZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirr7K3sr21s6uvmIRzc2hbWFhTVVFFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asu8q7tr+szMfGucHOz8i0xby3u8TJsq65wbi+wL22uaqupJqcnpqJf3d/dndubWhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJOSk5WnqqWamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLWwubXAsa2xq5F9cXJiVlNWTlJJRlZQUlJMTFhNSkxOUkdNSkFDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DLsbi4vL7BxLKxs7mutra9trmnqKGinp6YhYZ5amdsbnFucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyWlpaIopqak4uOi5CapKeclZWXm5CSh5SOjIGLjX+QipKSkqGan6KVlJiYlaKlmYyZpKaopqGftLKosrehnaK3rKqtpLKypbW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPGxre6w8rMxrOtu761uMGwrqqyn6iwvbKypJ+gpZ2bi3+KcF5fZnJwdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQlI6Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY55kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsaGxrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwycS3ucHOxb6zrbvCrK7ErqmjqJOfqLmwqKWVnJ6bloJ9hGdXVl9nZmlnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjJCGhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfYmBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq6ZrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMfCt7O9z7+5r6+2w6irxqqknpqElZ20pp+ejJqXlI2BeHteUExSVVlaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSmpaenJSko6ippaSem7CqoaSkkaaqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCu7aousi4tqiotbaqs76on5aPgIuVq5makIOUioqDfXZ0Wk1LTU5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2cnKSd2h1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmI2npJOgn5aenqSAcmdgXFxKVk9RR0pYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe6sqqdnaypqLOwopuSj5WBj56RloR7jX+CfHZ1blpLSEhIR0VISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5QVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuwp6ybj5acpamloZiakIaTeoqRjo96dYJyenZwcW9aS0ZHRUFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVFRTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpJedjYSLlKGhmZmRlIt0jnqBh46KeHN5b3Vwam5uW05FRkNAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcYB8Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVhOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYV5hJCYlI2QjI+GcYeCdIiOiXxzdXJxcWhyamFURklDPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rXlpcXVtZWGBeUk5bWlhXTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgIh9boGQkomDioePhXWChGyWiYp9d3l5bnhweGZqXklQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhbVUdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUh3qFdmt/jJGCfYqEjox4g4BzoYWMfn6Cf3CAfnppd2tSV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1pcXFtjY1hmZVtVT1BWWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mSfn2MgpKUfYZ+hqSHiH+CiIV4h4h+c4R4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGRe3KEnp+RnH92hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9ZT0tOV1JRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlHx/koaSlX+KgJKbjoOAgYuLgomNg3+Kf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafI2hnpmEk4WCj6KflJmShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8gH+AcmBcYl5ZZmpca2teV0tHT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpF5gJKIkJJ9ioWYkpGCgICLjYmFkIeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJSShpyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW19eYWZjYGdnXFFFSktQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNio6Me4qGj5COgYOAiYuKhJKFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrS9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2rpIuWmIWmpqCil4GmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmXltPQ0lIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI6KiXqIgoeRjoOFgIuFhoeShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Ors8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxnJqSmp+Jp6+qpJV2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYKCdFhgY1VlYWBiX2BlX1pVSkRFTFVRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+SiYl5hoCMk4yHhYGOf4GJjoZ/hYiFioeRenluXVZARU08Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUQ7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczJtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikqWxraWtrKekmKCssrqiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6CemlXYWBXaWRoZFZaY1lWVElHR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4aBjZWKgISBinp8i4eGfYqCgYuElX14eXVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73JzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qjorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfnFeYWBcVmFeZ2VSWGFWUlVJRUVOS0A+R0Q9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNtc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Gg4yWi3+Df4N4e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEU+QkhCQEM9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop+iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eGxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762ssTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaaYpZWKk5OIkYmPkJKem6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PVztPPzMbDytC/ysnLydLIzc3D0dK4sMS9xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JIRUJIO0FEPkFIPz9CNztEPkBIPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj31xeHVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wLGrtaaluKesrqCstKSPsa6bmJiMkZSRhI+bgY2mkZyJg4uEiomEioOUlZiXlJuRm5eZmZ6eq6ykp6GsrM7S1dHNzNLT1NDU0c7Iw9TRyM7S09PWzdLRxdLWxsDOyMjDqb+40J14bGRcYVxVXlFdWk5PU1BOSD5BRkJCRTxAQj9FRT4/Pzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmGkJCNi4qIkYd/gntyfoCCh3qFdoWTkYl/b3ZzbHN8fHd8c4J4cWuAcnJpb3F6eXJ7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqaaqsbmrprSjoq2io62hp7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OWrIuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3J19bRyq3Ew8yKcW1iX15XUlhSW09KR0lJSkA7OjtFQkQ8QkQ+SEI/QkI7Ozk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBg253cG11f3Z4fXSGfHlsh3Z1b312hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+jo6aypKWzoKKlnqGon6KxnIefkpKTkYuOi4aDj4R+nJuMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzl5qbp5ynvcPFubbFzdLQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUVVQWVVFRkpJRUU9Ojc6QEFDOkdFQEVDQURBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKgoh9eYWXl4iPg4eGh3qEeXF6e4SGdnqGjo2deoxwfG9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WanCtoySgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpmfpZ6frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yNlYyGe5uIk4+uq5SVl56Ypq61vKitvcbLyMnLy8/Jw9HK1NbY19jX1dvX09rb1tDb2tHWydXMlHd5Z2daWU9SU11IQkVJST5BPj03Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChH6EfH2EmI6HjH6Gh4B3gnlue3uHgnR6kp6NoXaPdYJ0dYF9dICEb4KQgm+ShHR8gYV6dod8ibjGpcPJt4GVm494cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPlpqXl6acmKCXn5OSl6OdmauWkZGLjZKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKimpa6ep7W+wMC5x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VoY19TVlZVTUtETkQ7PT08OTo8Pjk+QTY+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1llYV1baHR6eWyJjZJ3dnqKfH6Af398hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9gYmFfH6Re5CpjpDDoLyMnKOcfYmEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dmpOVkZeNjJWfnZShlJKOjpCLfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6ChoSApIaKi7iYnZGUlqGnoJ2enaOutrq1q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWRWXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f31/e4h7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAi4d/mIeAnJJuiKmFeqCLfJCOg4iEnH6akYmNo6KfkKOun4uRi4WLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWUkIyPioiWm52PlZaRi5OUhoCLiZKNioqdlpmjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKW8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZmVbXFdSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzs8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKWiZ2QlJeKiqeXcoqyjYSnkoSZk4SajKOWoJiTiZudoZKor5+RlJCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjY2TlIqFioqGlpqbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmomPhpeXi4WPjIF/ho+liI2TqJmXk5aYoZifmZOdm6KytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9Z2JdXVxOSVRZQUJHRDtBPTgzNzs8Ojg9NjQ5Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOBRnaBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzoZann6WklpWuooORuJWRs5qMoaGMpJuwo6SdmJGnlqeZrK+kl5SWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mKlo6GfYyYnomQkJyamZOYl5+UoJ2Vnpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQyNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16fYF8eIaLiYaEkqe7rKiyva+krbOzqKOhsKyKmrWdorilla2kl6mtuKeko5+aqZepo6+wqZmYnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkXyOjn2Dho6PlJWIiJOWjJCWjYuMl5iTnZm0l5arnYuclJKOkZKMmJuKkZ6Qi4mVn6GNlI2YmZySm5ielKGglJycpa+ooaSzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVNdUE9FQz48Q0FCOD84NzU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKQIuKf4Fzhod9goh1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKiyra29q5u7pKitubirpqaioqSiqa+ysaqdnKSYm5iXnqKmpZKkuq+pwLytrbK5pqSofoiGnK28sIOMjIuQg4+DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6OslJaPlJydk6Cdm5igoZSanqempKKjsLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo0PkE9PTU8Nj4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5eyt7qywK6lwKSrr7u8qq2ro6Oep6uutLCpm6Cqm6Gblp+wtaeLo7q7tsG8rKicsqWkqJSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoZikn5qgm6CUmJ6lo6ampK+upb/Ew66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmGlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtu76nur+9u8O3rMGprLO7vqqwqqSlpKyus622taCfrp+lopijs72pm6i9waS3t7Crk7Gsq6yXh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalaCinLWlkJ6XpKOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESEJCQURMOjRESDk7NDw3RS4xMjM1MkIyNlNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iaCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tLzLvMPBtra7rbO/ubyur6igqai2ra6psreanqyip6Geq7e4qqWwv8Wxvbmzp6q1s62ul5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpakmWWYo56zpZahlqysqqebnqaXmJaYlaCkqKWftqupubvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhHRzk1Rk07Pjg9QEouMzIwMjVCNTVQV048TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Rg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7y/z7XDvbi4t7KxtbO4s6umnKusuaqpp6+vl6OupKekpbXAsKustL/DusC6s6e5tbizr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZUlrCfr5yepJSvrqulmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0dKSEdJQ0M+OktVP0E6PUVNMDc1NDQ6QjM0TldPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLp5aOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKyMjMzca+u7OuubjBwc21x7rBuLW6sK6vs7SmpJuqtLWqqaatrJqkraWkqKy6v6irtre+wr++ubOyxLK5vayjrrWsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRE5KS0JDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Lk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvbmyr7i0wMLKtcWywby0uqqora2wo6OYqrS7pqmmq6qdqa6no6qrvryorby0uL7HvLe2uMGxvsG0qbW3q76lj6KYkqKgvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqC1r6Wkkq+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFITUVGR0JSTElCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJmpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfEvs3Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+3pq2+sbi2x7a1ubjAs7/Ct7WztK++o5ejlpSclK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUE+UEhAPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6drqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7KyLa4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvLm2tsSytLi6v7PEwbi4rrO1taOdpZWSlKGuoJminqioq6Oawq2pnqytm5uemaahvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinLKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMq8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbamt7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZWkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo5+coMOppKqyoaO0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtcDIwbSrtaivuKy/w7O3rqy2uaWZq7Krqpifppetu7Sbp7CbraCutLKnq7myp7qzuLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eSpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7o6Odoaa/p6ivr6GptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxsC5qbakrLuswMK3t6qssbqila2xrbKWpaeRqrmpn6awnaugsLSzqqq2tq27rLOzubesuLDDu76/psOrsLeuqaurpp6YmauioqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG2nperrqiul6aojqe7n6Sss56sorGws6yqtrS1va6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWpn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKDi5ZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLakraqmr663qq+1uqensbfFt7G3vcHCtbS6xb7MxbnCwLq+ucS3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvZ2rrrKjq5+wrbSurbayubiqrq+yqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKjraClr5ehpJqako6jpaezqaGms6yptaWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V6io+Fe4yKg4uSam14bXV7YUVgallJSFlaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tLmkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7qjrLGzp6ijsrSxsbC1sbi0qq6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqKOenJaYpqaluKeisrWsp7GnrrC2rKSZoKyom5yenJSpuJyUjo6KmJuil4+YpZ+dlIKRlY+cm5eWlYiWj5eap5yjoJKWkJCVdoSQh3uFgYSMi21wd3R7flxLZWxcS05jXD5ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra6rp6Wxs7Sqt7G3oKu1ucm5rsC7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1q6qxsq2qqbS7rbSytay0raqsqK2pua2yscjAuKW6sKmtraWorrCmpaOvpKmcnpybr5mjo6Kjkayeo6CgoqqmprmlrLW2paqrqK2vtq6jnaOpqpugmpqSpLOZjomNh5ChoJSMlJyfk5GEjZKSnZqYlZOHl5KVmaebn56MkpGOkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqmxpKmls7SxtLWysqGsrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe2sbKpsqmrpqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpKyVpZ6YnpmsnaKoqqKspqOtrLixsqGpoqCsr7GsnZ+nqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhYaPlJ+clZeUhpaTk5ekm5ycipKQjYl+fYeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05oWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKGqs5yqqrC2rbi1rqulq6q9ybuwvbfCr7Gss8TDzs/Dv76zv8LDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLukuLOsrK6nq6CjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKslqqhlJugpp6koqulraKfp7G3ra6jpqKbqqutqZyipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmoqOi4p8hYCBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaVdWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjqrGYq6qttqy2saulrKqpvMDAuLizu7Wmsq/EycvRv8G6uL+/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3prS3q6ykqaqco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqaCsnJKqoZ2gpKOmo6qenKe1rqimqqOjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+Mg4WUopmNjJmQkZGPkp+WmJaLioN/dIaAfn94dIN/end+gYidj29xZ2dxeFxgc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlVVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OTcqNDo9Ky0zMzEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrChpquumqulrLC0ta+rprCqqbq+u8CwrrmuobevycfI0MG+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zsrmwo622sbCyu6u6r6mttqyqnqqsn6Ogtq2ooZ+vsqK0qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnp56nm5mqsamjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSDo5aEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaFeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5LeHNTZVNRXk1NUllmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEuLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1srSE05VUE0kY+yoKSnrKSno6yntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwr7Sxuru3wLKzu6y4rKK0p6essra5s6eovLWutr6wvaasrLWrrZypr6Sgpa2rp5yeqrKks6ibq6epo6mdpKmoqb2stK+unamkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joJ/h52PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVZBV3ptVGFQUlhLTE5xdV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJi8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UsZmfoKmmpaCqpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7G1sb23ub21rbm2v62hs6erq7C1uLWrn728qbPBtLygr7O1qqufrbCjnKWoqqOem6SwprCgn6upqKGpnKSooa27qK6wrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaWWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mUjIh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvQFt4a1VeT1FRSkpNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC03ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTmayZoJinpKOfp6S4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65sbPAtLq9t6m5uL2rpLSoqaqwrrmxqpu7vaSwwbW2oa62taanp7GzoJ6kpqehpZmfrKipnqCqr6egppijqaCxuZ+jsa6gq6GspJymp6mampufo5WdnZueqaaXnKCokpmUmJ6TmZahqpGaiI6Phn2Hf4KOfXygjIyIeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrckxMfmhYWk5QTEpIUFJQSU5cX25TRFdaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMvOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol52mmZ2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rva+0v7C8wripu7q3p6i1qairsK2zsKeavrelrby3sp+wt7CopaevsZuhpKCkpKGXm6+moZ6jqK+hoKGTpKSit7ChprGqnqyjr5icqqWpnpianqWTm52bnqermp2dpZaWmJSdjpOXoqiikIiLj4V6hH6Ei3qOl4qNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmlaSH1dW1hPT0pISFJVRjI6X15sUENXVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajoZeVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjnMG2pam3t6uesruppqWor6uZoqecpaaUmKGypZmepKqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52gkpudl6Ciq5ybmaGVk5WWm46Tk6OnpI+Iio6GeYR8hYV8nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZXpjYFJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKOSjqWmnJ6enqS1raiqureorMPAt6+sobWup6+vt8HAvbLBt7Gusra1uLe1rKq8s6+ysb3At668vLGln7aspqa0qauuoaDDrKmnsbSsrLS6naiqq7GlmJ6qnqilkZmmraKZnaSqoZuinZegnae2prCqrqChnZ2hlaCmn6KgmZuanJKanpWmnq2imJeelZSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkY3R/YWRlZmVpamNob1leWF1sZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI3ODVceU4yPkhpWkxaSlZiZkE6M0BlRyU1m6SgkYyuoJqYoJeltLKjsr63obHFu7mwsaK2q6uvqbm+vbytwLKvrq62r7O4sqerubGurrS2u7awuL2tpp61q6ChsaWrr5+lxKGzpa+yr7ettZ2tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa6qK2ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gnSCgYqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Jyf2BkZ2ptbGdqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGRAQTFJZEMnNJOim4+PsZ2blKGaqbKwn7nAtqC0wbu9ubGltq+prqW3ubi5rbuvraqrt6q0ua2lsrWxrqmxt7axs7W6qKmftqmen6qiqq2cqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknZmpo6WVmqCdkZyjq6qpu5+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53g3BshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamRmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJmHlbGbnZOgnKqtq6O9xa+pt8K4vb2tp7awpqukuLSztLG5raqnrLSmsLWip7i2tainrLazrrSts6Kpn7SrnqKknKeomq69lainsLS4ra2kqK6qq6ain5yhqKecl6Gmppybp6edkp6gmZCeqKqjtbCjoqOclpiYmKSJoY+SmoehiJSeoX+lf6esnpSTnZOIg3J4jY6Dh6B1iI1pl4hmfXN4oG+Ih4N+jHx/oaCfmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhqcG6GV15pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFxnXz1LMVVgNy8ojKaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSlp6izsa2yqK+fqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amoLako6CjmJWTmJOciK6QmJSJqYuYpJyGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcY/YflNqY7ayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrOop6a2pae4r5yysrWqpaSnsq+usaaqnqeksqSiop+XnKCfsa6Vn6OgtLqiqaihra6lop2bmqKqoJibqKGfmJ2oqJGcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9Znujp4JZX4uraYCSeHpqqDhKr1tXVG1jW0xPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usKnqLCsr6mpsa+ksbqwpKSvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGdpJ2YlZibna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJmhp6SQnaObmKGfrJ+lpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/k5aXq5V+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKZgeXF1UpOGXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg5Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAyO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfBqqytr66nrrOqoq+8qqGnta2jq7WkpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZqdlpigpambn52jn5ygoqWjlZuemJmdoqqbpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtLXFBfZlQ3RzphUDcyJZyik5mxqKils6qltKekvLfBsbrAsra0vLO2p7Kxo7GzpqCvtaibqLquoq+xoLK0saGknp6oqbCptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GaoqKnm56gnpWZmqWgnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5ikjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQk5UX2VQNUc9YU02Mi6inZGlr6ykqrusprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrK+kmKa6rqSxsJy0uKqgpZ2hqqWyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrZqgnp6QlZuhnZyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLiwmLPBrKiyp6qyuri0ub65uLO2vbamuLSgta2goKmrn5WntqyosLGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnp2knqydoJ2gjZSem56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5eIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVVfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi9qru1oLGln6anp56TqrGpr6q1raqvoZihoKakpLqio6yhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5qopp+NkqSYqKuolZipqJ+foKOto6CdoY2UoJifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6WjkpyMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VX2FMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9sa+6uazBtqqroZ2npKKdkquqp7WjsqiuqqGXnKigpau5naOtnJaZkKWjlo6eoZyZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5KXq7KkoJ6oq7CZoaKPmKGXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmSmYyXiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5ppmeoryil7HCsK2pqqyxp7ivt8Wxu7KuvLCuwbKspaOfpKGcm5CqpKqypLWnraSflpqqmaasuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ6RoKiroJufqaSynqKkjaahlKGam5eWpJiPsKCSlamfhZCZtYCRkY24lXiCk5u1d25sb3NueY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZ2dxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYVc4Kk9dXT0rO1ZWJz06PKadoKG/ppazwrSrqqisq6m7rrHGr7W0rrintbmtqaOjp5+gnZiTrKStqqa1qKifm5ago56spb6noaqYlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpauclqmlppyZoKinpqOooJGsnpejnpeWmJ2ej7Cpk5ynoo5qfmmcp3iJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKyws6y2pL6ys6agpKqdo5uZmaynrqSltaqkm5iVopumram/qKmmlpSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6ikm5usoKSamqKnrKKfqaGZr5qVpp+WlJ2fnZexpZmiqJmckZ6co6SZp6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzob+ipLGxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWVlaCrp6yjo7esoJmWlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ2grZihm5yipa+moaSnnqyYl6admZqhnp6csKGdoqeVmJOZlKCilqOfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlJ6Zma+mrr6grKORkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpKuUnp+eoKquqKajq6Gsm5+goJiknpyfnLCkmZ+ok5iXnZKlmpipn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpWjkKKvpra5pa6jj46aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jn6ScpKqokp6hnqCqr6qqo6qfp5umn6egrJahnKWxpJecq5ahnpuTpZeeq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrWvqqanpbGrn6uYm6KgnJuqp6Kdq6KlqaWktKSdo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZoqSqo5OgoZ6drK6orKajoqWgpKWcraiRpJupraqcnqqdraKWl6WWoaOYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnR8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyBjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqCnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOPnqWXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2up6qom6alo6GqkqyzlqWiqqqepKimobGik5qnmqCalJSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGMkYucfqt7iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4NtkI5kbnN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5WapKKSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKipqJqqqKOiq5uvsaKorK+mmqesqqqyo5OXo6WalJGEpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmYaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J1aIyMl46BbJmRbm14d3dua2ZkZHFwZntpY11WX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+qraOop6qrq6mkpqCbpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaekkZuhqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqroq2Zq6ehoaqis62iqrOyopyrqa+vt6SUlqOnmJuSfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe3CWkX1venR8em1bZWpycWaBaV5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKalmKqjn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpGmrZGZnKejoKqmrqGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqpqunKympZ6so7esoLK5sJ6cr6eztLSmlZiopJugjoKdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWchJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8ko+Ic3pyhH1wXGxud3JqgW5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2mppqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQorGZnpympaGir62dpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6iZraGspKWYr6W7rKG3t66enrWyubK0qJmesKKknoaP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouRind8eI2BbGh3aXhzbn90XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aWlpYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGfpaGgtaeiqaewo5Sro46kraSfkJqaqrS0pJ2mnKmSlJeuoKCepqScp5y1mqCqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOmmKqmrKGkm62mvayVvrCtn6Ows7qstaicqbKlqZh6p5F9fLB3ioCkpYicbbJvoIete6GPg6iVmoCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6t4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOMlYp5eYGWfmpsfWJ9dG1/eV9mZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmaScrZifqKW2qL+upKmjn4yAjpubn6aekpSZmpSZmaSjo5mnqquio56pqL6kl8Osq6OirLO6rK+oorSwqquZdq9+kIqchYd8uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaShopCEoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmomWj5SVeniNm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEtJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6lnpmjoqWZn6Opsqi8r6Wonp2OfIualqGgmZCRmpuRmJaonqCYp6ympKSipKm7nqDGp6Wpoqu0tq2vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+JppuapaqRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuOmY+Vm3iAkJl5Ynx6Y4xneIF7YGtla2piUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5uaoKiimZ6grKypuK2no5qXk3uHmZKmm5OPkZiYj5eTqJmfl6ion6mmoaKru56pxaOgr6Ors7WrsauivamwsJt0dqqktoVliZ9vZ6yPio9tb3ekkJqggXWwmpZwkI1ylqejm5iupHJtbWxlinhubYKZcYB6aXBpZomWlZhxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpePlJx8ho6UdGWGd2eManh+eGRsY2ZsYktkWEprWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPIvrSpnr+rrKOgpqufuqOkraytpY2WraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJeOppeOkZCYlI2XlKaTnpenopqwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbaciZahl4apmpCUnZOqs5mbo6yhs5ejoZ6hopygpKGVq6aMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck6CUlpSfgYaTi3BnjnZuiXd1fHlpa2Rkb2NVYFlAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xbq3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqykopqonp+TlaOXqJqpmZSmoaSQmqeZobS5p6qYmpCMe4GUjKGUipSRlZCPkpekjp6ZqJ6btaOdpqy3qK/CrqO3pq+vsK2qq7W7orG+mpKmpKa1opGdpp6NqZ+Nkp+jrLCboaSyqbCZpaGdpKuenp2cl6uckpmim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5KgkZqUnoOGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsruuqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCun6SXqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiHmBk4ybk4qVkZSQjZGWoYudnaednrijf4OvtaKwr3SkvqOyoHh6oayzvZZ3rqWgioCqfmRbYXafjqSdg5d+bpOznKOor6ujZZ+glHR6mpZwgJiol2x+oqiKZZ2lm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+Ncnmilpdld5eGgHaXaIKJgm55fmpwZV92b2traFtlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2jp62lkpaqtK6xpZmppqqXc4ucr5+oq6eTlrifoI+cpJ6QfoiIm56NrJqklaiino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+Nmp6lmJuyloCMm7WdtIySj72noX6nonqksLmBjo6nn4SLhY+wqa+MiZaimXmBi6yGnJ2iqKqoiJWHmXelm3qHm4GXpoKBe5yyeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0fJmCnZqFmH2RiYGCmGmMjIRqeHpwcGdkeG5pbGpbZGlpZXJbXUhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrca8r6CVpai0nY+DnKubp6KgjZC+npmNn5qhkHyFjpmXiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPj5uLjpGekZWeo5WdrIiftIm0mq6Lyoirr4m3hY2wg7GvhKmNp5iNnXyoj3J7d5uOppZolaR5tIufnqaok5nCgn+riJihcZ6AmqV9l4WVsYGhfKCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZrWGdHXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PD5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ+ipKqilaSptqKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2JtkIuTkI2PjIyXi4+Rn46SnqCZoah+oaeHrZ2glq6QoJ6dkYaCoI2sr4ekjaqajJp+onWAmJNrgat0Tat4h42dkpuoqIKqq36EoXt6p2mef5JsZ5eGl7WInn1tYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdoTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJpa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZefoaWsq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkYyKppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaGMk52fm6Klf5OBj6OhlKB3nJaQp4OiqICGqq2FpXmLfYSafaJwcpKHlnuejHlth5uLmZGcqZuPh518gqJzdqZmnn53pF6Ye32Sc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2xycmRcaF1hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqinKOjpKubmrGsq5KXoJigpJmalJ6rm4uIkXiLhXCAlo2Jj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uGfn2PjYOLj4+JjpOfgpacoJ2gn4uJd5yYoo2gcqKLiKmInKeRmKmrf66MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl6f4qnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3BqeXhhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5unn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIi5aXhJKVmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46Vmn+ToZ6gopOYcmifiqCPjHCSjIKpiJmgpKqhqH2wraSiuJd2o7Oio3+IlHideqqafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdZt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHZ7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maooubqZycp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5R8kqOgnqOIroZ9tYSPnp17ppZ6qYKWnpGLop19p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl2jZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Da2dmY252d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkQ4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhle2ReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjYiFe3B9hGh9j4KTmoF3kY6OiXB/ho+TkmyYlHyJkZKjlYOOqpqTkouFiXmDdoeAboGehneAkoWHmKGWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZySfKSAopmGmHGehKKtromXi4CMpI2Wg66ilHa1trXJoXSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXantps7W0xqZzmH56nWqbmqt0gpptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWGdPUmhJVUxYUlZdZ2tuVmdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU5sXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bko2Ig3lqeYZlg4x+lp95dY+IjIFphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl5f3yLeXCPoIZ5gZSGiJaflH+UpaeclpaEZ254nGyiZHxxpXicmHBop4KYjHyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnJpqmt1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjG97f3NyZKVueKJkZqdomHKLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlVlWVNtSVhPXEhYaWhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnBnUGpoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5CNinuGcYCIaIuKfJeac3SJfZB7ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfX9/jnNpj6WEfYWTjIeYn42HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4h5qXSlj4SabqWijJKEjIO8bn2lr4KGhoeUl52gfaZ6caiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf42nn3effYWklZ2gaZqHdatmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpVYGBcakxcUl1JXmxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnhkY25zZFJsZ2hvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNi410hXqIg2+NhH2Xk3N1hnKRg21/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42InJ6JjJOqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyEgHtyp4xxfX16l5abhI14e35+iJSVk4p3kZmgoYR7fYlrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCgoaOqpx+dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cXBvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9wd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxwdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOioiNcoJ8j31+j4R6l450coRwlYV7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Xd3GEqoWNkZyPh56eh4uaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5NvfqmFcH2VcWpvfIGfi3+SjoxobV2DjIycnJ+Oc5WLiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKJkKeVhmaNj4Nud4uDb4SMeG5kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mc317c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnlyf2hUXHFpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiGhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4WDeqyBkJeZk4menYeIoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPjoSofn+SkZKTnLGlmpSdkI6yk5iEpoyMlpygiZGbgomSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImHipGmkYSGjoiDjJCLe4aJh46AdWuBg3t5mWlyaGB0inB9enZ1b3d0gV1db4dobl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob29sZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIZteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg4yRl5WOm5aGhpumoKKanYaDkpqZmJCapqCmnp6QloGSi3d9iI6EpXt8j5CQhZiqoJyTnI+Nqo6SgJ6NiZSan4OOl36GjoJveIZxdWF+hI+GdIuXgIKOgoaEfoWElG55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mMj4STp4+GhI+Cg4qJiXWFhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1haml1eX5wbGxjampngH9rcn9ranNueG6EeW6GgHaCgH2FdnGCjYh+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKi5KGoKGKhYx8p4+GjpKXk5aSd42joKGdlpp/gZCZmJOMmqKho5qYkZt+joV6gYSOh6B/foyMjnyXpKCgkpmQj6aNkIGbkYmTl5x+kpF9ho2AdXSBcHZgfYCOhnGKlXyHinGMfoKFhY5oeHJ5jZmSkICXfoiLc4KIfX1yenyMhXt6kY2DlqWTi4WRfIWGh4V1gYKFhnlkcXp+eHlwbGlmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZFheYGdqdniBcWZrY2xnZX+Aam19Z21wan13hnpri4FygYF9gXR2go2Gf3x6gIF9f49pcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialnh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6WTg5GKlpeSkXaRnaGhmJSYen+Ol5aOlpqcpJ2Zk5SbepCGhHmFlo2dfYGKjYtyl6KeoJKYjo+ijIyDl5iDk5aaf5eMe4iMgHZxfW16Y4B8i4VwhpN/j4Frh4KBf4mEZnZvfYiTmY5+lHiMiX2AiH18coB5ioZ6hJGKi5iiloGDjHeIhIKBdnuAh4N0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3V5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkIqmj4yOipKfkIKQj5SXkYqBj5igmpKQknSAjZGTiZydnqaYmI6VlnSOj4tthpiPmXqHiJCJb5edmqKTlIqMn4yGgpKcf5OSloeZiHuJiYF5cXlqdWx7f4t+bYWRgpN3b4KDfX6LgGVzan2Bl5iFf450kYmEeoh+dniBfoeBfYONhY2UpJB5hYJ0iYd9f3J0f4WBbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9rdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfYB8jYmRo4iNio2XmYyFkZiTlY6JiYyTnZOQjI1uhJCOkYiemaGgl5aJl5FvipqFZ4aZjpR6iYWQinCWmpOhkpKIi5mMgoCRnn2Sj5OMmo97ioSGc3N1a3FudXyLdG6GkI2RcXSAfIGCiHxlcW16fpuUfoWJdJGLgXSJem+Bf4KIfYWMioWNlqiNe4h9fouFd35wbn6DgWJnd3N0bnpiXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2RpaIB6d3VvjoRzgYGDe3WCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doR3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyHnJ2Jj4aSl5WDiJSZj5aLi42OjZ2KjpCEbomLj5GKnJagm5iVhpiIa4WkhGeHnYqRfouEi4F3k5iRnZGQiImVjn9+j5h8kY2QjpqSfYuAgm52b2ttb3B7hmlzg46XinF3gHSCiIJ5Z3RvdoKbj32KhXqVknp3inVxinyHjXuLhoSJj5yjiHyEdoGLgHh4bmp/gH5ccXJxb294Wl1vYG9qXm9pfHpwbW1qbXdgcG9qcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdXFycIuAdH+CgHh2gIuAeYZ/d4eGdoOFfIaMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCb3KFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKLkaOak46IlZiRg4aWmYuTi4iPj4iehZCKfHOLhYiPiJyZnpuWlICUf2mGnYloh6CIkoSRg4lxg5GXj5qNj4yLj413e5KQe46MjZKXjXyIfIBrdmlta2xsen9ieX2OlYF2eoF3g4x8eWh1bXWIlox/iYZ7lJFyeoVxeI57i417iX6DjZGfnoV9fXiBi313cGhrgIB3XndvbWtxclZdbmFxYV9tbnlwZ3BmZnR1aHFrYXdlXVZlYGByU1BOW2VkXXhwiHxeXGhxYmJlZpFpX2dkW2hwfm9rcXOKfXZ9hYF0dX+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqbm5yalZN5jXdpiZKIbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYqSkYl6hXx+bXxlcm9ra3l5W4B5j46Ben5+f4aOenpodGx1jJCKg4aFfZaMbH5/b4GMf42IfoR7g5GWm5uLfHd4g494c2xlcH+Ca2l0b2doc21TXm5kcFpfa3F4ZmtrYmd4c29xY193YGBWa19edk9NS2BmY115cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdXZ+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Fza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY6PdYp3cIeJjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWJkY+GdoV+fmt9Y3h0aW14c1eIepGHhXl+f4CFjH55ZnRrgYuPi4SDgIyXhmyCdm6JkYORhX+Ce4GRl5OZkHR0eIeMdXNxZnR5gWFzbW9haHVmUmBwZ2tVXm1zeWByY2BpfXFyblpicmFiV25aXHdNTUxjZmFednOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh3fIhxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yIc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjHWHf3GGgoqImqOElY2fhIlhg5WPhYiGiYyHgIdofZR/fYOEiY6NgnGGfn9yd2d2cmhzd2tajH2SgoV8gIOAhIqCdmJ0bYqCkYyDf3+TkX1ugmx5h5CHk4R9gn6Bk5SRl4lucnqMhXRscGpxd39ec2huXGl1X1JkcWhmU19vdnRfb2BdaIJxcmpXZ2hjaVhtV1t1TEpMZWZeYnJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX56dnqHc4WDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpCmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKTgYl1hId3hICLk56gh5aQn36IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH5tg3yCdGttd3VzdnVrY42Bjn+FfnyEf4SIf3Bgc3KGfJCOg31/kol6cYNme4SLh42EfIV/gZSPkZOEbnB5jH50bG5panl8YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiW2dfZG1fblRab05ITmZkXGducYBrWltjc19cY2x3ZGVdXVpsbGJtanN2hn9xb398fHR4hXiFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj15xcpa8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCJdYV8ipmemYeVjpyAiGZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3ZzbGuOhYqBin94goCFg39rX3J5e36Oi4Z8go+BfnKBaXmEiIyGhXmEfYKYjJCMfW5te4l9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR4ZWBeXVlvgG9zWWVhXmpuYHBPWWtRRFNnYFprbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8goV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniYjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndKYlqk2dCWcXuQio93fZOKhJiRjIVua4WSknp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEkoyDf29/g3aEeYabmZWMlJGUhIhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGh4cG91mY2Gg4p8dniAhHmBa1xxf3OCiYaKfoaJe4lygW5xhYePhYVzhXqCmY2NhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dGBdXFpZdH1zb1dnXWZqcWBvTldoUj9ZZl5ab2pnenFaWllrZVpjcXlfaFxeZWxoZWtpcXd/h25sf36AdW+Ce4CCfoJ/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjIt1fY9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH1ugHV3hXqHnZGNkZKTjIuGf3uShnd/g4yCa39yaIB+eG18fIGKg3dheYSBcWRxaH5tdXF1gZuLgH+FgHN1foFzgW9cbn91eYuDi3uHgHyIeHpxbImEkISLcoN6gJaLin90bWt3gIB0dFxoZ3ZvWFZ7UllwZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW5jaU1XZlE9XmVcXXVmYHVwWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5saYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iSiX9oe31qc3tyhntzd35/jHp4hH18a4yNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnaFlYVzjoqJdnBshYKGdHmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIgpSRmImLhIl8j4hwe32Ee2h+bGuAe3ppenaBh4ByYHeBfnFkcmZ0gm11e4aVkYF8goFvd3p9dX5sWXCAd3WMgoZ4iHaCiXp4c26KgZCBhnN/fX+TiIl6bm1qboKBdG1cZ2RycFFaek1bb1xPXHJvZFVLc3hpV1laWmFxgHRgXV1gZmRoaWZOWmhNQGBjW2B2YV11bVhXU3RhWmRvcldqXmJoa2dtbGlwd3ySbGmEiXx8cH5+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjY+Dan57bXd4dop3fXiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N6gnN1h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3mWjpWPiIKIe4iIa3h5fnRnemhsf3lzaXp2gIN9aGB3h31qa3RneoBpdoGMkZR+en5+cHx3fHR+YlZ4fnNzioSCfYNxh4p3eHFwhIKNf355fn12joWDdmlxaW2IgXBvXWdhcW1KZXVLXW1VVFpzbmJRT3N4YFJYWF1hb4JzW2FcaGVlY2tkUVtwSUNjYFtjcF5deGhVVlV3XltlbmhWa15haWdlbm5ocHZ6km5piIx4fXJ7fnmCgYF8dn2DiIaDcHeEcm13g4J9iYuTf3CAe3d5eoGMdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RbWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d39vcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRkn14e26Id4GSjYV0loqRjoeFhXt/hGx0dn5tZ3ZlbXt1bWp3dn9/fGFieIV5aHV1Yn17Z3WGjo2Ve3SAdnGAe31tf1lXdX9wdYWHf4F5bImGdHlsdYCEhH57fXl7c4uBfXNndGVui4Nrc1ppXnRkR21tTFphV1ZWd21iUFJ0dldQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB1eI50a46NdX52eH13gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJe2JubVthWlthVmlzY2BbZ25vZodxYXFmV1xja398ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV8amx1Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzlpN2fnxvinGCi42IcpiOkYmFi4N7eH1xcW98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlHtxh2pvfoB5bnxdWXN/bnSBi3yCb2+Kf3F2aHd/gYCBd31xe3WHfXpyZnNhbouBanJXal52W0htak1WVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGtqZmNZbmFZZHBHQGdcYGZfXFV6XU9VZHBaW2poXVdoYF5yZmtncWdwcneGeG6VinR/end+eIOHf3Vyf4aFjoNwcHt4dnV6hoWGjIV6fH90i359hoSEh39+fn2Hf3x4dnl4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1pdXVRncmRgWGRxcmaBc2JrZVdbYGp/eL6ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqbmCHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmScYB5doRugYOTiXOViI2IhImFfXh0cm5oeGBqbWBtdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ+b4xna3qDdW10Yl1xfWx1fYx7gWZ1h31ucWh1f3h+f3N9bHt7gnt4b2VsYm6JfWttVmlfdlVKaWpPUU5oTVh7aGFOVXVqTFBUVV9mdYNmXmBwaGdhV2ldXGxoSkRqWWFkV1lUeFlOVm1qWV1rZFxZZWNedGZsZHFncm91gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWGiIiDeIF9dY9+fISKjoSChHt+i4N7d3x3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnV11aXFtTZHBkXldicnVpdXBlZWJXXFxpf3BvcoBziWRkeH5pdHV0coGDd4CDeXZzdW1renFiZ2tnhnSNg25mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkHR8c318bnx8koZ3mXyIhoOGg310cHFsZ3RcbGhebHRkZ2Zpem97cllngHZ1aHCAeIJ2YneFi3yUgG6Mam17gnFmc2Vhbnpnc3iKfH5idoN2amtxdXtxenp0fWZ+f4B5d25jZmJuhnxsalVpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2llYFZjV2NwXUxLalhjYVVUVHNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNucn91dJqBd3+Ad39/hoR6fHSChH6XhW5ydHx6dHGEhY+BgHmLdXSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBpa3CAZ2tgaHl4anN0dG6EgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvaXBnZl1VWG9njqh3gXp8kY55dXB/cHN2eo+AeJV1hoOAhYh2anF1Z2huW2xkXW1yX2dhanhoe21bboJydGpvgH55eGF3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5YnOAcGdqeXRxbHh4dXhkg3t/eXdxZGRjbnx9a2tVaGFlUkprZ09HUWtFYXhnYU1Tcl1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bm94dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVZcXGyBZXF0fWlpXGt2dWdzdnJthXt9fHh1cmx5Z2l4Zl1lcmh6d5OBY2NUZXBngoV3d2doamBXVllnY4+nbn53gIuPe3Bxfmh6b3qNfHePcoR9f3+GbmR1cmRoaFxrYVxvb1xnX211ZHpoXXSAb3JrcXt9dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V9dWVygGxhbHtvaml7enVyZoV2e3t2cWViZW1zfmlsVGddXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmZVSlxjV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG5vbnaDl3lygYB8f4mMhn51dYZ5h4x9c3V1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlWY2ZrX11ccoVoWHBuW15XWlxse2Jwd3ZtYlpsc3NndHVwbIR4fn94d25udGRpdGVbZ3RmdnaSeV9dUmZmaoOCdH5iY2lcVFheYmOPpGh4dIOGkXhtb3tpeG58hXt1iXOAeHx4f2hkdmxgZmBeal9cc2tZZV1vb2J6ZVt3fGtubm93eHN0ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm52aWRmeXx1bm+CdXR9dHJiX2Zub31kaVNnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xjXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGc3F3dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFtaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bm9we3x8cYF3f3N6enpjZXVoXWJaYGdbXnZoV2Jdb2hhd2Bbe3ZpanJud3NydWhxgpWDhn2DdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcWFfanF9bGx1fnNxeGtwYVxlbGx6YWdTZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFgW1pYWWxxV1NPZldXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a29pdXmGe2uDfX+EmnyChHl8h26PhnFvd3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1ZnYWxrWlxwjGRPb25dVlhVZ2p0Z2J0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYV1ubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZYpWVY25wg4WKdGtofHBmc3dzfGx6dHVven51XmVyY1teVmFkWGF0ZVVfYG1kYXFdXX5waGlzcXNwdHZrbYSTgYh6hHFzZ29+cXNvVFxna2ZxdIF3c2NsdlVicmtaXm9mfWVtd31zc3NrbWBaZGpqd15mVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3dqYVddVVt0ZFNSV2hRWWVUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaHZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU29nc2xmeGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nV1hfV2SbiGJrcIGHfXhsa3luXHdxbHtqdnNub3uAclhpbV5ZXVViY1dkcGNTXmFoYWJsWmB+a2Zrc3VubXd2bGmFjH+JeYdtcWZxfW5zbmNaYWlpb3SCdHNfaWxTZXFkVWJuYnpjcXd7dmtwbWtgWWFnaHRcZVVhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59Y19UX1RddVxUU2BmTl1hVFNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmd2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2NjY2NjY2Njo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyNjIyNjI6Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQk6lr62tra6xYUBERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUzQam2tLS0tLhZMDU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmako+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGj5CQkJCQkYmFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOQipGNjY+Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Mi4uMjIyMjo6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkI6HiYeHjIeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQj4aKh4aOhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPiYeIh4yIiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNioqMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/f39/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39+f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFFQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojs7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo5OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dHVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0FAPzw7Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPzw7S0c4ODo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+OTdkbDs4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x9fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQUA/QEA9PUZJSmt5TTw+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fX5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RCQEBDW0FRdH2BfXtcP0BAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA/QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBvcXBydXR3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUFCQEFvY3+EhYKDfmk/QkNFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5ARUZDSnaAgoGEe4CFdERERURDV3WGiYp+WEdJSkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSUlRdoF8gISBg4hwRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDQ0RGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSlV4gX6ChIaGh4NVTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLTEtKWH2DhISBg4eHiH1/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSUtRdoSGhH6BhYODhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dJTEhxhoWBfoGDgoOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NzM0Njg6ODc2NTY1Njc2Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUNES3uGhIGCg4ODg4OFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NztCOj1NfoSCg4SEhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ojs4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ozk5OTw/PDxBQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ozg5OTg5Ojo5Oz8/QUp9g4KEhYWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFAQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PTw+QERDVYKDhIWEhYSGiYmIiIaGhoeIiYqLi4uKiouKi14+REdJS0lJRkdIREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6eXp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/Pz1BP0JDR0VohIOFhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZHR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk4PD47PDs+QEBBP0JCRkZLSnWEg4WFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSUhKRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAOTg8Ozw9Oj9APkBAQ0RISFBbf4SFhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklHRUpIREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A5Ojw4PT47PUE+P0FDRkhKVHGDhISEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDlAPj5AQkdHQUZJSU5UeIWDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VWUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PUI/QkNGVk5FTE5NUVZ7hoSFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklISUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDR0VERUxYUk1TVFNWWHyGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTU1dZWFpZeIWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RUV1hYWVpugYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p/ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTV191eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVVSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiYeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBLYUVGSElFQj9HTE1HTVFVSUJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE97Tk9PTktMTU9PUUxLTFdNSEdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX19fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo6NjQ4Njk3OTozNjU3OTU8Qj1mdHR2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1lUVFhRTFhZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE1RU1lTXGVVT1NUUk5MSUhDP0E6OTg4OTc4ODQ3NTc4NTg5R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLVFVVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH19fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBvZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdQUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUlNTElMS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrbnFtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz9BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTUpMUkhJSkZBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xIRENKSkxNT01JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A+PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFREJDQkVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQ0A9RUVCPkFEQ0NFR0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSklNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUFCRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZJR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUdIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1hfXl1pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0JCQUREPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCQ0lGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF1aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRkU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpMRklISkhFS0tMTE5PU1RPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXVpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQj0/PkFCRkNFQkJIQ0NERUZGR0dJRkdKSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRRUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnaWZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXRydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGVnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViY2ljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3Sk1MTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIR0hHRkpGREdKR0dKRklMSElKTUpNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGViYWNpbmljaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhKSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkNDQ0JFRURGQkZGR0RESkVFSkxMSkxNR0dNSkhKS0dLSklKSk5MTU1MTElMTUxbc2JkcF5sbFVNTmZzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3BNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURDSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hJTUlLSkpLTk9OTk1MTk1MXGhkdV1scVdsTlBRblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSEhOSEpKSUhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXFrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b250c3Z0SEtISkNFRUVAQD5DQ0FGQ0hKTUlGQ0ZKTElHRktNTEZPSktXUktHS0pKTklISkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aam9gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVERkFAQUVEQ0dCSEpMR0ZDRktMSUVGSk9MSU9JTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9fZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1enl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpIRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSkhGRUpIRUZHRUVKR0JKTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY2BZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBubneGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEQEpLSk9bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eHl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdIRERAREFISUE/SUpHUF1hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSUlHQkhIUU1LS09MS0tJSEdFRD9FQkhIQUFHRkRUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JRU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSk1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tISUNFQUVDSEdCQUZFQlZVRVxUXVNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1BRWVNeXFxdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VKTlFRTk9PTU5NTkhLQURBQ0RGRENBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVtdXGFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUhISkhHTUxRUUlMSktLTk1VTk9LS0xHR0tQU1NOUE9OT09PSExGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/anR1dV9hdl9ZY1xcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUEtIWnhdVHhkaFlSU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSaHxlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFSS0dneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp+bHh6f3Bnb1h2dmp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN1em58fXl4cm5OSlJ0TkNCRVBQSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHl9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW18a3B2dXheX19iXl1fZWRqaGhlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT05OUUlSbUhpd0tgZHZ1VVdsT25se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWhmZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9QSkhRTlBVTEtLUlNSUlRQVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZ2VjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVlRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVVFOVVNOUE5MUVBLSVFRS1FNS0tPUVRSUVFTU0lJTU5PUVJRUVFUVlJYV1xXU1NQUlVVVlRaUU5TUldVVFlWVFlVU1JVU1RVWFhXXlpfYV1cW1pdXWBjXF1iYmRnZWVlYllgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hUUU5VUE5RTktTUE1OVVNOUk5NTlFTUFRRU1RVTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NVV1VUWVVWWVRSUldVVlhcWVtgXVZZX11eXVxdYGFeW2JiY2hmZWViWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPV1VQT1RQUFFOTVFRT1JYU1JRT01PU1VOV1FUVVVPTk5RU1VVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1ZVVVZZVFdXVFJSWFZWW19aXmBfVl9dXmBcXGBgX19aYmJkaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU05OUlBSUk9MUFNSVVpVVFBQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVltbV1FTV1VWWFVTWFpUU1FZV1ddX1tfX2BWYlxgYV5gYl9cYF1jYWNnaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5f2NcW1ZWWVJOT1dTTlFSUVNUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1xWUVRWVlhZUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGheXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1ybGhcVVlXUU9SW1NSUVRTVVVUS1JWVVpaWlNPU1JVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZW15VVU5WV1deWldRVVVYWFhUVlhbVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ15dZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dGx9bFpVWlZRUVRcVFRUVVVWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVlZbXVhbWVVaXlhfXllcWlJXUllYWWBaWVNVVlpZWlZXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZlYl9kYV9hYWJiX2BeV1heWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFlYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlZWlhWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmJbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZXFpYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhaWV1iWV5WV1pbW1taWllbWVlfX2BgZGNkZWViZFpiZmNnZmVeYWNgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXVxdXV1bWlxYWl9hXmBkY2RmZmZiWWNmZWhnZF5jYV9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWJjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWVlQV1ZXWFhXVldWXV1eYGFhX2JeWWFdXV5ZXV5ZWFVXW1tgXl1fWVleXV5eYFtaWllbX2FfYmRkZWZnZ2JaZGZnaWdjX2NeYGZlWmhpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaY2VjYVJcWU9YVllbWllXWlpgXmFiYmBhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWliaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYWNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2JjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t6enp7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t6ent7fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiI2xtbS0tLO1lYeJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyLkbvAv7+/v8GaioyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx9gYGBgYGAgX58fHx8fHx9fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z4e3d6enp+eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t6enp6enl6ent7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3l8e3x8en16d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3d3x7fH15fXl3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d3enx8fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enp8fH18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5e3l4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKCgoKBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjImHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjoyJhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDgoODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+QkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgoKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GCgYKChIKCg4SCg4WFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIKIjoOFhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCBg4KBgIGBf4qZhYGCgoGBgoKBgIKCg4KCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gICAg4GAf357gZiMgIGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgIGJg35+f4J9j5WCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhYSDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGBgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBg4+DgYF/ioSDkoWFhISFgn99fX1/goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhIWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISEg4ODg4SFhIKFkoKKhoWCgX6ChoeGg4F+f35+f39/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4eSgoaEh35+f3+FhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDh42BgX+Hgn5+foCAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4SEhIGAgYuFgH+AgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDgYCDg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYKAgoODg4KCgoOBfn19fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiIhoWDgoKEhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4mLioaEhoSChoeDf4GEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjIqFhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH+Bg4SDg4OCgn99fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+f359foOEg4KDg4OCfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAf35/fn5+fX5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX9/gIGEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39+fn9/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCBgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhISCgoOEgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgoSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaHhYWFgYGDg4OCgoB9fX19fX1+fn19fX19fXx9fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgIGAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeHh4Z/fYGAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHh4iGh4eHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIWEf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5+foCCfHx/f4GAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjY2OioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx8fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhYSEhIODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SEg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+fn9/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx8e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt8fXp9fn5/gICDh4mJiYqIi4mFiJGNi4iJh4WFg4KCg4SEg4KCgoGBgoGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35+fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoKBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgH18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYB/gIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoKCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIGBgICAgoF+foB/gYB/gICAf359fX19fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIeChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChH+DgoKCgoKDgYGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt8enx7fIGAf4J/f4GAgoKBgX9+f4GAfoGCgoOBgYODgoOChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgYCAgX9/gH6AfH19foB+fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIGEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaEhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYCAgYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx4eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4KBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCgoKCgIKBgYGBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3p5dHF1bndwdXpydnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fn+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIKCgYSAfoGDgn9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enNweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhIGDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4WFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODhIODhICChIOEg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKFhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoaGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDg4SEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYGBgoKDg4aDhIOGhIGDiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4GCg4SFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/f4KKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIOEg4WEhYWEgYSDg4aCg4KDgYKChIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf39/f4SEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4F/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4OFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnNwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDfoODfYF9fn59foKDgXx/gH1/gH59fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2d3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFhIWFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoF/gYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGhoaGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fH19fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaIh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhIaGhYSEhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYaHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICBe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fHx9fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFhoWEhISEhIWGhoaGhoWHhYWHhYWFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYSDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WEhIOFhYeGh4aGhYaGhoWGhoSDhIWCgYKBgIODgoJ9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWFhoSFhIOHiIaGhoWEhomGgoaEhoaGhYWHhYeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYGAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYWCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhYSEhoaHiIeFhYiGiYeFhISEgoWDhIaCg4WEhYaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af3+Ag397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoaEhYOFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEg4OEg4WEgICCgn99fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhYWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fXx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3Oz9DPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj47PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7O0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8W0nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q4n5qTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GdqJqhnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnp+blq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigaCYm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuahZ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03a0sKacir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCVppeXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYwqKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh87GkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1MfD1dHVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paXhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAgnd0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqZ11qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV1bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrq1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pnZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtoWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4Pjw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Bv8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fY15hYU5ITT9FQD9EQzw7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE9Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7iztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7jAsK+1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1aVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcK+2MC0sbSyt765s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHD0NK0yLS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsq22uq6svLK4ube7v725vsC0v7u8uri+wrzCydXJl87EtLK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxu8W8wcvNwo6nybm0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDs6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3uLi7tK+0rLCvpJywtreNibW6sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxr73KsqaorZWLjXZwf4SfjIWht7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqW91KuinZyAbIF0YWNlcoOKm7e1r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqSfwM+pknx3gV5rkXVvZV9ukKC+tLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnsLHmXhjYYpcV4KLkIhsUompw7Otraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6fp56coZ2empqSmZ6coaKgn6fJuYhhWnaXWlhhbZCPfk50tMazp6qsqqWfn5mSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3pLCmn56dnZeYlZmem5yjn52u0apzWWSMiVhbb2m3rXZaWaC6s66uqaumoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+drM6eYF+Ih3d4hYd1no1ycnOUsK6npKSioJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6nn56fop2YmZSYlIiEfXpxa2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8+PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpybnq3JmFZvn5l5kpx/a3p6jaayqqCanZyfnpqXmJeSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bjJCZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPzxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6KsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqa3zJFUeaCkentuZm+RqbGspJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSqw86KWHqGhG5ocZCur6WdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtc/Pj2R7fW9ulK2tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIqPg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+tqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbTRx4xvdnGEqayhmJaYmpudoZ2anJ6TfXFlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8vP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1rKWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxxKFtbG6QoZyVk5ecnp+fnZSWmJSJa15eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1cq/ysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7m9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFlYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD87PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dXZ2tvYzM3PyNbVxcO3sLWpoq2suLyhb22Omo2Ml5WQlJKRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDxNDIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3G0NXV2drb2NDKz9DS1MnEuLy8rqW2qr66oXeJlo6Nlo+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7JxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMq/vcLLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83OzszVz9XZ2NnQzNPOztDKw7bEv7Syuq++toh9lYyTl4Z6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTCwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0MbV1NbXzszQxsvHycS8yL+usLa0t6+CjI2Ki4V4gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i1t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+wsXAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7IysnLycrEz83Sz8/GycTJxMK+u8y6rrK3tLKrjJCGiYl7eH6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrbOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7KztLu8q621pa62rrqxsKq4sK27rru4u8C/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTGwMXFw8PKwsnLwcK/xb63ubnHs6+0tq+tppGJj5F8eH6KhXp7hIF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre6uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzL+8yre+xL+7y7jCxMO3usC6tbO5wrWxsrOnqZODiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXV1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVFleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu4vMa5tca5tcDDsLrBt7KrtLu2qqyupZuEh4eBfXp1dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRXXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMjBx7y8xcTPv7rIubnAubTDtrK9vrC+v7iopLC0saGoqZ6IhoeAeHNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLXFFMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwMa3wcDIz7jCxb60u7u0wLi0u72xt7q1paGss6qgp6SUfISEgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvsa4ycyzwsPCr729t72+t7u8tbW3saKhqrOenpabhoB8eHJqbXJ0cGloZWRmYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8bFtMPAx6y4ub+4v72+ubiytK+goKqtlpZ/kYd/dW5kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojw8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvMyLbKvrK/xcqus7rEuL7Dv7m5sLSvnqOop5SOfYuEfHVpaWlsZ2psbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiprJqcn6GgmpSQjJmOjJCMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmIRzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLPz8e0xby4vMTKsq66wrm/wb+4u6yyqZ+ipqKUin2Bd3hvbmhtbm1waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5WnqqSamZmdnZaNjIyUhomNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0q66nsLSwubXAsa2xq5F9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9DKsri5vb/CxbOytLqvt7e/uLuqrKeqpqahkJJ/a2dtbnJucWpwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipeJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5Cao6ablZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGftLKosrehnaK3rKqtpLKyprW7taursaOJeHJtXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0xIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNxrStu762ucGxr6uzn6mxvrS1p6OlrKamlYqXdl9gZ3NxdnFpbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRhI6KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKamsKGwrpywu6qpr6qZgnZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr6zrbvCra/Fr6qkqZOgqbqyqqiZoKWkoYyHkmxXV19oZ2lnaG5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jk35ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C5r6+2w6isx6uln5qEl561qKGgkJ+dnJiMg4hjUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeGiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIl1bGVeW0hRUVJNSVVNU0lMS09JSEdLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrers76ooJiQgYyWrJuckoaZkJKMh4CAX01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqSAcmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRMRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrSwo5yTkJaDkJ+SmIZ+koSKg35+eGBLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVFTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FpcYB+jnBDi4SCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0VDPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml6CflqCmr6yuq6ipsK+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYaTe4uSj5F8d4Z2gHx4eXhgS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXWVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmTmG5od36CbGljbHmFkJKGa3NsfG5ye4ZpbXB/c42JhIZ6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY10j3uCiI6LeXV7cXp0cHR2YU9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcX98Z3Fxe26TjY97c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImpGZlqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIcoiDdomOin10dXN1dGx2bmVVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9PUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKFdnCGfId8c4ytjYmAaGZiaW5ybXCCdWlvWHVwjpqSd2x/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4B+j3pxcG9rYFtcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKHlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW2WiYt+eHl6cHpye2ltXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjnp3iH6JiI5zipePg3tcZHF0ent3imxnamJ5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2GfXGEf4R8dXd7fYl1b3JzZWdfW1pdU1tmXldRVVlcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKf5SMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4F0ooWMfn6CgHKCgHxreGtTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2h4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxa1tdXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aXkpehnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ+hqWIiYCDiIZ5iIt/dYZ4X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY+UiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h+eH1xamNdWlpdaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEQ0E8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d3+MlH1/koaTln+KgJKbjoSBgoyLgoqOhICKf2xwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8f3+AcmBcY15ZZmpcbGteWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6EkpJ6gJGJkZJ9ioWZkpGDgICLjYmGkYeFiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNzfH56b2dfW2BeYWZjYGdnXFJFS0tQT0lKTEZGTUNITEZGQ0JHREA6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlq4maipOKlXp7foR9Zl9nW2RhXWNjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbGxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGCdFhgY1VlYWFiX2BmX1tUSkRFTFZRSUpKREpIRUFAQEtEQU1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ+gI17v7ujvIK0lJONm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6Be2lWYWBXaWRpZFZbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBMQzk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby7t761urLGYHWypbGanqu+qqWoq6qkorK1oaunnpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomBfXFeYWBcVmFeZ2VSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj07SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwbu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWWJiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V8inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFdfV1llWVBcV05RQ0JJRUNJO0FEPkFIPz9BNztEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluKesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40J14bGRcYVxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMjQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXVxgY11jeHt/i4GZqqSkoqChqKeqsbmrprSjoq2io66ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yKcW1iX15XUlhSW1BKR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9hId3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM21dnVtY1xYUlVQWVVGRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdnqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09rb1tDa2tHWyNXMlHd5Z2ZaWU9SU11IQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uEf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bx4V5d2VnY15SVlZVTUtETkQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3d3ZpaWNVXlpTT05IRExCPT0+OTk7Ojk5PD02QD4+PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYSGeXN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+EmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tna2tfW2dmebntzZWVbW1ZSVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt2d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynaKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6WmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgXF9ZmFcXF1OSVRZQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5yjpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ak5CKkIqXm4mLlo6HfYyYnomQkJyamZOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunF4dFtfVF9VT0hKTkRCQ0U1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL1KFveWdbWVJdUE9FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKf4Fzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5igoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81dHNxcqHcnFgWlheWkxKQktARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIyIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJGOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7bJw762z7LEv8S8s9HJyMK1c3drW1ZaaFFMSENMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur7HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SLj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zMC5r8Szu77CuK3Cw8LAmGt4YFdWWlpKS01KRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5KVk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqqebnqaXmJaYlaCkqKWftququrvDtKWztcvAuKq2rLK6uK6ouLq9uIJqbVlWU1RNRUpSTks/QUhFREhISDk1Rk07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJyXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMXExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKustL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmZmlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqylmqCllJOZmI6coKeimbSpqrO8u7uqsLLHv7mmrKutsbGjobGytKRvbGRbWU5PS0VPUFFRO0hKSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrrCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6irtre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJuWlZufoamep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq6kpJ+lqJKSmZyIlJyinZaxp6mrura9s7Ktvrm3oKOnqKWnnJusqamMYWRgXlFKTEZITUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVnKGfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby0uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopbOhm52mnKiqnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2ko6iRlZWfg4+enpuVqaShobS0urWtqLWys56coqWal5WYqqGedl9bX11KSEVGTVFJTUVGR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpEQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWdcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy2uLampKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpp+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mupp6ZqZ2fjZiUnoSNoJqbk6WkmpirsbWxq6WqraycmKCgko6QlaielGdiWGBdTkhHSk5LSEVESUA+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTpuUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi1n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5uemaagvqGdpJirq6ymopmNmp+Sn4mOV3+Wn6ahoLiqppOYtaOfsaCfmq6Wno6Yk52Bjp+XlY6io5aQpq6yq6mhoqWllZWdmIuPkZKknolgY1ljYEtISkpORUVBRko+PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLq0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6y0tq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJqZmJOipLmgoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66anZutkJ6TlZOZf5Ghlo+Nn6GTi6assKWmoZygnpKSmpOFi5GNnJ5/YGVaZ2VKSUxKUkJDQElHOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy3uqWZq7Krqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+tt7Wpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJCajZOXmYWVnpSMj5ydk4upqaqhp6CZnpWMjpmPgYWViJSfeGJoXGpqTVBNTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKSdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6qssruila2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6aht6mlo6KwsbSrs6isn5ugoJudpZ2il52js7Can4+TpZqfqJqUop2Ul4mTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWOmmpobGBsbldQUVpUQUNEVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+v7SprrG3n5errqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VopmbqLWpl5mRkp6ZnZ+dkKqdlpeElJaKnZmck4qNlpeal6aloqCdlpWXk3+PlIV7jpKCjJZlbHJnb3FeRllmVkRDTVhEWjlIQjY+XVFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6insbfFt7G3vcHCtbS6xb7MxrnCwLq+ucO3wLmytKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq+yqLWvtLy9yrOqtrWxtLCvqKKzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaSk5V5io+Fe4yKg4qSam14bXV7YUVgallJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VeYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vb+/t7+8sb2tp7q5t7bCtqqssbeUl6auq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqqmktqCgp7GhpJScmZWxnqecoKqOqaOenJaYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5eap5yjoJKWkZCVdYSQh3uFgYSMi21wd3R7flxLZWxcS05jXD9ie0dJOEdnV2ZcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OynKCnsa2mpa+lnrK1rKuxsq2qqbS7rLWzta20rKqsqK2pua2yscjAuKW6sKmtraWprrCmpaOvpKmcnpybr5qjo6Kjkayeo6CgoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqYlZOHl5KVmaebn56MkpGNkHZ9joV8fHyHiYhwc3F9fH1cU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WV1ZXVFlnXVFSTGNaW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsLRxca+wLK9wMK8v7e7xKest6yzuLvAr6uxraCjp62qqKSwpKuyqq+ssK+wrquzvKe3sbKps6uspqWjrbqsqrHDuratu6moqK2qqbOlqaSjrqqoop+dpK2VpZ6YnpmsnaKoqqKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6CnmIaEjoqLnp+OioyVm46NhIaPlJ+clZeUhpaTk5ekm5yci5ORjYl+foeFfHd+h4WGc3JxiHVrX1lgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdXS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDusCzyMOrrretsri/vrKtraukp6qwqaeosaa0r6qwrq2ysbSstLykuLOtrK6orKCjnrC3q6qtu7elt7akqqesrKuuoamnprGypKemoqKsl6qhlZugpp6koqulraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJOCgo+IhZyfi4qOi5iNj4qCi5ejmpGQmoyTkpGTopmbmYqPi4t8hoGBg3p0gISBfXN2i6OHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtNaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvSv8G7ucC/wrnBucDErbG1sbO6v72ysK6tq6untqqmra+qubCosbKusq23qre3p7S3q6ykqquco56zs6iopLS1oLeuoKqoq6msqKCrrKm5tqmqqaqjqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNf4eMh4OdnYaEioqNjY+LgoWUopqNjJmQkZGPkp+WmJaMi4R/dIeBfn94dIN/end+gYidj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFVQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0ta+rprCqqbq+u8CwrrmuobevycfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLSopa2zs7mwo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+vs6K1qp6op6qjqqGirK2ova+srq2iqKigrJmQsKKYoqCnqJ6nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUiH2NhoSEpJaEgYGLho6MkIODk6CWiJCckJOQjZGclJeOioaGeHSBf3x1eHmAenRzeWh/hqR1aV5ka4F0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6WxqKq4vsC8r6e5qqavsMnHyNHDvL++ub6/vMm7wbiwsLSxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mdpKmoqb2stK+unaqkoK6cm7OjlaScpaWfpJubqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+j4OAiJ6PhX59i4aQjY+Ef5Oak4WSoYyUkYuRmpGVhol+f3J7en58aHh8enVwcHxnhHiEiGRhZ2JyhXptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspmgoKmmpaGrpbizs6apsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcO1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6xrqCro6Sunp+tppefm6GjnKCcmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Be5qUjYh7fouFjo2LioOSmJGGk6KJkpKHkJmPk4CIfHlsfnZ5eGN7e3FwcHJ3aIBzaoNnZWdgbXONbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQmhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+kr7Cqq7jCurOtn7ivq6i0usjLyL+3wr6wtL23xLbDsa65srO/tLq9t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsa+hrKGspJymp6mampufpJWdnZueqqeYnKCpk5mUmJ6TmZahqpGaiI6Phn2Hf4KOfXyhjI2IeIKLhImLi4WHkpqPiJWeiJGVgoyXjJF8hXtzcH1xdHRgeXhpbnBwbmh9cWN7bWllY19lhX5fWnNrcktLf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1Mz1mZDI0TT9lXUZPPVJaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5xLWzrZ+3ra6tsLXGyMG3v8K5sbS8tr+7vq+rvbCzvrG8wripu7q3p6i1qairsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKGXnK+noZ+jqK+hoKGTpKSit7ChprGrn6yjr5icqqWpnpeanqWTm52bnqesm52dppeWmJSdjpOXoqiikIiLj4V6hH6Ei3qOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGxsa2logm1lcmtrZWhaYnN/XlpsdmpaSH1dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepqGjobiqr6G7uaasvcSzr66ita+tra+0xMS9s7+6t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOrrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGzppmepaqpnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6CjrJybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nI2JioZ4gIOHh4eRhZWTkoyQlZONjpR7gpeOind+e2x1cm1sc2J5dWhnaWdlboRnZ2hkZmhqX2ZiaWZaZntjYVJzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqureorMPAt6+sobWup66vt8HAvbLBt7Gvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qauvoaDErKqnsbSrrLS6nqiqq7GlmJ2qnqilkZmmrqOYnqSqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq6jmJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHi4KJe36EiIaEkISWlY+PkJGQkY2Te4OVjYZyfn1neXBramxndXNrYmdkYnR/YmRlZmVpamNnb1leWF1tZGFNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vbytwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+yr7ettZ6tr6yuopmdp6qln5WbqKagmaSjqZyan5yVnJ2tsKa5p62ioZqanpmfpJqlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5yTko+QkZaOkH+AjY2Db4F/ZnluaGtqZ3Fya1xoY2Fyf2BkZ2pubGZqZ2RsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+PsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ubi5rbuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqJyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqeoo9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmxpXl1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSztLG5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK6qq6ain5yhqKecl6Gmppycp6edkp6gmZCeqKqjtK+joqOclpiYmKSJoY+SmoehiJSeoX+lf6esn5STnZOIg3J4jY6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCgmX97h550iI52m4psiIKDbWllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqW4hwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ15MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe2vaasp6mqrKemoqCZoKikmZmmo6WZnKWplpOinJSTo6amobako6CjmJWTmJOciK6QmJSJqYuYo5yGsYCkrp6Vm5+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJaxq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFOLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqihra6lop2bmqKqoJibqKGfmJ6op5Gcp5qUnqKno6Cwo56fo5aWkpiSmYWwa2qKjap+Z4WWh61lcZ+elZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6ZoBpeGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPV1YvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCrKeln6OkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Wgqq2wrK+mqJ+jorGco52YlZidna+ol5yin7Szoauboa2toJ6al6Cjqp2ZnqShnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eIWpmbWZd4ezm7d/lJeXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAgIiQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6weFdYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl6CUiLOmpqKuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6moqpudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3ybl6eQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW6OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZlpkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0oLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKikvLfBsbrAsra1vbS2qLKxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqiXnZicoaeimKKho6GboqKnm56gnpWZm6ahnKeVm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5mmjY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZlhBT2pfbGlQVUZJOD1XUltWWUlDP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlsK2lqrutp7Wlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhl5Onq7ClopaSrJ+mk5ShnKWnoJWbp6eimqOfrpqhnp6QlpyinpyllZ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOng5qao4qSmYuifpKXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsYHFtVlVNLmViaFNZUDtCREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDMzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBraiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbKrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOmm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56hmJmclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoaKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJi0wq6rraimtLC4sba/ubqzsbi8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZmgoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6KcssCuraurp7epuK+1wbW9srC6uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZuZnp+Rk5Wrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1lbWUNBQHI/Q0YrNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5qforyimLHCsK2pqqyxqLmvt8WyvLOvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqqmaasuZ2jrpmVoZCmoJONnKOfmZ+akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeWpJiPsKCSlamfhZCZtoCRko24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdXaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeW15YouscHSFf1hbp2pEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGsLa0r7intbmuq6Sip5+gnZmUrKStqqa1qKifnJago56spb6noaqXlZyRopuSj6GoopSel5KYlLK1tq2YnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4loc418hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTUVXXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4wLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyK2xtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iWopumram/qKmllZSblqCak5ilqaiSn5CPmJywsr+sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJeHk5WKg5OTkIiNkZSZk5mXmqChmpuUoJyOgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwem1gY1tvZ0xYWWVqX1dZcHpvbmZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgxMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+ipLGxt6CpprOnpbC1qsmsrrKmtabAqLShnqWmnKWWlqCrp6yjo7esoJmXlqCXraqmwZ+spJaSnJeemJSUop6eo6iSkJmop7LDsJqrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCdjX6NZaGzroSJhHd7kIp9d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eCa3RjeGZfaGRjZGZqWGt7cGprXFNMUERfVUZAPz4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX11dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLSgua++rKutsbKgqqayraKss7DGsaytpLOvvKS0nKCnoqGdmZeopqmmpKWztZ6VlZ2Zma+mrr6grKOSkp6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iYnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+rs7CrpaitrrCnrq2wvbKrqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKKvpra5pa6jkI+aoZmTkpugmJmmlnulrKKotMO4paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHaRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqO4w7Swr7+pqZSjr6mwr62msrawq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevo5KSmZ2lkpGgoZeboJ2Hpqukq62/wLGhqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfmyAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTQ3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMa3CwMC1tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK2upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfqt6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv1MbHsrSfnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqKiin56wrJibl6ior6yop6mel5Wao6KSlKGtm52no66so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6psKepqZqqqKOhq5uvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pf4GUhq5efKhVnaKSgXqjn4B7w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKroaSfr6Kem5OqpLawrqCpm52XlaajkJqiqJ+gppywpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfpqqqoq2Zqqihoamis62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SoqZCTmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwca5ramzrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7Wgo5iTqKu2sqybppyglpCmrZKanKejoKqmraGjp6mwtMKxsqqtqJSJmJ2lm6KkrqWXoZWZnKWlqZmunKynpZ6ro7esoLK5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKh+sIWbhJ6ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgW9aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmaiklKK1o6SWl6KqtbmknKOdo5OQobKZnpumpaGirqycpKiitbHDsa2qraqRh5Gcp52jpJyll56YmZmlo6eYraGspKWXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KNpouTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzboB1XWRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraSekZqaqrS0pJ2mnKmSlJeuoKCepqScp5y0maGqo7Wrwq+pq6mijISPnKKgpqOVmZqcmJuYpqOll6mmrKGkm6ymvayVvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZqWi6p4naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgZOLk4l4eYGWfmpsfWJ9dG2AemBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qaraCQqqmllomakK6wrKagqJutmJmPraKhnaWhmqWcrZigqKW2qL+upKmjn4uAjZubn6aekpSZmZOamqSjo5inqqqio56pqL6kl8Osq6OirLO7rLCoorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLJsZ26Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmoqWj5OUeXiNm3xjc3xhg3hzgHxhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqualK6ooo6Im46vrKmno6iZr5Oaj6maoZ6ln5qko6WZnqOpsqi8r6Wonp2OfIqalqGgmZCRmZqRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKC9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZuPmY6UmneAkJl5Ynx6Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlJOvrJeMg5qRrqajrKKlnKqgmIujk6aep5yaoaiimZ6grKypuK2no5qXk3uHmJKmm5OPkZiXjpiUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivKmwsJt0dqqktoVliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGXlpeOlJt7ho6UdGWGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSqu7qys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY2VraqQjIWVl62fpaqin6SkoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7g5WNppeOkZGXk4yXlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbadiZaimIapmpCUnZOqs5mbo6yhtJejoZ6hop2hpKGVq6eMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ck5+UlpSegIaTi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmppba4rq6isKWtn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeQl6yji4iJj5ynlqykopqonp+TlaOXqJqpmZSnoaSQmqeZobS5p6qYmpCNe4CTjKGUipSRlY+Okpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mpKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKqenp2cl6ydkpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZuVnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJWkp6OxtKyuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajk5epnI6GiombopCun6SXqKChkpeZm66LqpaQqJmojJiojp64tqOlmJuNiXmAkoybk4qVkZOPjJGWoYucnKednrejf4OvtaKwr3SkvqOyoHh7oayzvZZ3rqWgioCqfmRcYnafjqSdg5d+bpOznKOor6ukZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXqjl5Zkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62lkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI6bpJ6QfoiImp6NrJqklaiino6XkZ6FdK6QiaaaqJGWo4ibubOnoJiZi4l1dpKNlpOKk5GQk4uPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnpqEmH2RiYGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpai0nY+DnaucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKOlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5SdrIiftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGqq6ealJ6ipKqilaSptqKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKh+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q6+imZafoKWrq5+crbSip5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+ef5OFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbaF1iTEQ9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB8ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2uoJqhm6KjpKubmrGsq5KXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhX2ZXYkJQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfWpFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwrJ2mm5qnn52smZ2wp6udl6KZoZ+Zlpago5mGiY1piIBxe5eIjJaXhJKUmI96ioSWo5yJlZCGi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNgUV5XXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1yRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6maoouaqZucp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVioqKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm253eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVJbZlBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0pGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLOjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkoqFiXmEd4iAboGehneAkoWHmKCWeZOio5qgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilHa1trXJonSUi4KeYZ2XqW15lYefmnWhh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZptc3eXaZl5dJhxUER9s15qdWp4h2ZrZ2J0dHBtVl1TWWhPUmhJVUxYUlZcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyJr6eFZj+UobKsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelX+TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXyleqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5zolpfW2Shbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FYVlZmWVNtSVhPXEhYaGhzallrVlFSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqxsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiGlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn46HkqqmnommeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zubp+ekZVif6uLqneAf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voykk1mDpo2rYXVxc297dHFian5uaGxTVlpWYWBcakxcUl1JXWxtdmBbcVlbYFpnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqdgYCepJaqqp6op66jmYiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5Oqo6CQgHSUl4h+gXmUr6R/gpxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SiXF/dIGPlJNxhYOCZY1/X4GAjHh2dJR1b3tvboluhIZfd2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFtqWHmPaG53cnFvd3hvXWyGbWlnVlpfV1xka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eoF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGtreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5WMiHF0a4J2dIBZcm6GkIF9fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXODd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWlxpZm52W3p4d3Rtc3KCZlxtimtrYlpZXVlYa3FbXmBZXl1mcn16dG90Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbmxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqaOhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaufoqKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp8iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh42AdWuBg3t5mWlyaGB0inB9end2b3ZzgV1db4dnbl9fWltcUmdxVWNbW2FsaHR7fHJucGRqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXt/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfYeThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumoKKanYaEk5qZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSan4OPmH+HjoNweIZxdGF+hI+GdYyYgIKOgoaEfoWElW55dnWUo4yOhpuFhY51gIt9fXNzfImEe3mNj4WTqJCHhI+Cg4qJiXWEhoeJe25qfX97bWhrbGdeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wa21ja2lngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8gHuCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkZaXi5qfnp17d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhHyJkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5GIj5KWk5aSdoyjoKGdlpp/gpGamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqTl5x+k5N+h46BdnSCcHZgfYCOh3KKlnyHinGMfoKFho9oeHJ5jZmTkICYf4mMc4KIfX1yenyMhXt7ko6El6aUjIaRfIWGh4V0gYKGhnlkcXp+eHlwbGpmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xoZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmJ1entxYmtveYmNn7OSpaWdjpCYj4adoJqcfHWjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goR9iJB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYeoCPmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAj4Frh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5ioZ6hZKKjJmjl4OEjHeIhIKBdnqAh4R0X3d3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBjamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamFjdVaDaXBuYHhnbGFqdnBmeXt5cV9xbIWFkJ2umKeono6Nl4eFn5OWmH12qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegm5KQknSBjpKUiZ2dnqeZmI6VmHWPkItthpmQmXuHiJCJb5edmqKTlIqNnoyGgZOdf5OSloeaiXyKioF6cnprdWx7f4t+boWSg5N3b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iYd9f3J0f4aCbGB6dHlwfG9hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2plamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH19jnJ5i3l4bmyHa2hfanJjh2hxb2V2Z21sYXpoa3x7eHBhd22LgZmaqqGkqZ6KipGGip6KlZd9dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZSRjY1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R6iYWQinCWmpOhkpKIi5mMgn+Rnn2Sj5OMmo97ioWHdHN2a3FudXyLdG6GkY6ScXSAfIKCiHxlcW16fpuUfoWKdZGLgXSJem+Bf4KIfYWNioaOlqqOe4h9fouFd31wbn+EgmJnd3N0bnpiXnBhanRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2pqX3Fpc39rcW5tcWdva2V7Ym5/eXZwa3Z3iX+jmKKooaebiIyKgY+chpOcdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2Lj5GEbomLj5GKnJahnJiWhpiJbIalhWeHnoqRfoyEjIF3k5iRnZGQiImUjX5+kJh8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3inVxinyHjXuLh4WKj5ykiXyEdoGLgHd4bWl/gX9ccXJxb294Wl5wYW9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWN9Y4V8b3BsdGpobmx2d19xfnl7dHVzf4J+pZWarZ+nloWMg36WlIOPnnSJn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlZiSg4aWmIuTi4iOj4iehZGLfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIkoSRhIpxg5GXj5qOj4yLj413e5OQe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g418emh1bXWIlox/iYd7lJFyeoVxeI57i417iX6EjpGfn4Z9fXiBi313cGhrgIF3XndvbWtxclVeb2JxYV9tbnlwZ3BmZnR1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGlxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFrhGCHfm9va3pgaW10f3RfdHx4hndzc4V8eaGQmrGcpY6Cin+CmYiAi51+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmkhZOImIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH9/cIGNgI6JfoR7g5GWm5uLfXd4gpB5c2xlb36Ca2l0b2doc21TXm5kcFpfa3J5Z2trYmd4c29xZF93YGFWa19edk9NS2BlY1x5cYp0XFtldWBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn97iX9yiYeBkYqIfX6ZdmVzbn1liH9vcGuAWmtueXlzYHZ6e412cneKd3mfjJuvm6CQgoV4iJR+fImch4SekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhZFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWTip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIWKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5OZkXV0eIaNdnNxZnR4gWFzbW9haHVmUmBwZ2tVXm10emFyY2BpfXFybltjcmFjV25aXHdNTUxjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWHjH9/mHNodXF5bYx7bnRwgFdweXZ5cWR2eIaMaXaAinKAnYiZp5yjkoR8cIyUeHmKnYOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiNaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qIm6OElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6OgnGGfn9yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRl4lvcnqMhnVscGpxd39ec2huXGl1X1JkcWhmU19vd3Vgb2BdaIJxcmpXZ2ljaVhtV1t1TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+Ygo2Ce5N2bHd2eXiTdW54en1YeYVxgG9neHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jpt9iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGneG5xd3txkpCNh2qYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hICMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIfnBgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkZOFb3B5i390bW5panh8YWdpaVhrdVpSaXJpYlBicnltYmVeWmqDbnNiXGdfZW1fblRab05ITmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V5iYGSlXyJhnaJgXB4eXuEk29te4B2XoN/dIFtaXpzlHNncoh9cpKRhJqfm6CGhnV1lH5tdpOXfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIkH5ylouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoV8ipqemYeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFg39rX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjpGMfm5te4h9dnNuZ2Z7dWJbcGJXbnFTU25zaGFOZnR5ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGyTjYWfmKCZhIhufYx2aniXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2tCWcXuQipB4fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeEeYedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9f4R1Y3BzgGl5cG91mY2Gg4p8dniAhXqBalxyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo6OhHhub36Ef3Z5ZGdpe3BeWHZaWHBsTldxc2dgS2x2dWFeXFpZdH1zb1dnXWZqcmBvTldoUj9ZZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeKcYKNcXuGfHp5hJOMdWp6f2tvfnR/fW9ye3qTcG+Bf3hnkouDoZmckoKFZoaDb2d5lYh9foSBmImBfI2MaXhya2tmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoOWjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHV3hXqInpGNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIGKg3dheYSCcmRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2JeXtybYmEkYWMc4J6gJeMi390bWt3gIB0dFxoZ3ZvV1Z7UllwZExacnJlW0lxeG9cW1tZXXR+dGhZYltnZm5jaU1XZlE9XmVcXXVlX3RvWllUb2RZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4iTiX9oe31qc3tyhntzd35/jHp4hH18bIyNhJudloyAgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFloZzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn92gIJ+jZqIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHaBf3Jkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WMg4d4iHaDiXt5dG+KgZGChnN/fn+UiYl6b25qboKBdG5dZ2RycFBaek1bb1xPXHJvZFVLc3hpV1lZWmFxgHRgXV1gZ2RoaWZOWmhNQGBjW2B2YVx0bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uKjY+Dan57bXd4dop3fHiAgod/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnFjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpODc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdIV6gZKQg3qXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h35ranRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96fn12j4aDdmlxaW2IgXFvXWdhcW1JZHVLXW1VVFpzbmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUVtwSUNjYFtjcF5cdmdVVlV3XltlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+ioyTf3CAe3d5eoGLdIN4f4GBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aOgHqSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Id4KSjIV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIV6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnl8dIuCfnNodGVui4Nsc1ppXnRkR21tS1phV1ZWd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1VeckZCZV9dZmhdW3piUVVcdVtaZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgomOint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubVxiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX57kYR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi4yIc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAd2l2eGaCd2d0h4yOlH1yh2pvfoF5bn1dWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3JYal52W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNZbmFZZHBHQGdcYGZeXVZ7Xk9VZHBaW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVyf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x8i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR7fox+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoORiHSWiY2IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlcn5uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx8gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxuV2pfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmFxaGdiV2ldXGxoSkRqWWFkV1lVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311c4KIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSChHt+i4N7dnt3d5qdl3qKgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CEeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kYZ4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngHZ1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXxsa1ZpYm9SSmhqT0tOb0dee2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2NwXUxLalhjYVVUVXNWTFh1ZFpea2BcWmNlX3ZnbWJwaXNvcn91dJmCd3+Ad39/hoV6fXSChH6XhW5zdHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR9foyGe36AdnujpYp5iIaEa3V8enWDgYt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1VWG9njqh3gXp8kY55dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx9a2tVaGFlUkpsZ09HUWtFYXhnYU1TcV1KTVRaZWt2emVfbXFpZF1WYFZubldLU2hXZV5YTlVsVEpceV9bX2tdXVtjZWB5aGxgb291bnB4dXqYfXeAgXqAgIeGenh5gn6Bk4RydXR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiIg2tygXl1gH+BdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nb353gIuOe3Fyfmh6cHuOfXiQcoR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfmpsVGhdXFRLcmJQRlZhR2J3Z2FLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dYWUlXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x9dHZ1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31lcYd5c3x7dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4foB4d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFheYmOPpGh4dIOGkHlucHtpeW58hnx2inOBeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7dnByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2Zubn1laVRnWFdTTXdfUUpZWEhidWRhSVRtU0pNWldpbHF7Ymxsc2NiWlpbYXdcU0xkXVhpU1dIWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ3doJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJmie3p/iZR4ZHWHeHN4dWtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH+AfHZvbmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcnGFhJF0bGx7bnBxe319coF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx6YWdUZlRWUVB1W1FPWFFIY3RiYEZVa1BJUFpVa2tqfGVtbnFiW1pYWWxxV1JQZ1dXaFNURllcTkhydVhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26PhnFud3p9dIKCfIuPgoKXdHeCk4WBn4l1gYCBdH+CcYeCdW+il3N7houGe2V3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/fIh2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NUWmBZY5WVY25wg4WKdGtofHBmdHh1fW16dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ29+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqd19nVGRUVVBUbVdRVlNPR2RzX2FFWGlPSFdUVm1oZHxpa3drYlddVVt0ZFNSV2lSWWZUU0haWlBNeHZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3WAgn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupYxygY2LdndteoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7gHecenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfYl5nVlhfV2SbiGJrcYGHfXhsa3luXHdzbXtqdnRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcWZxfW5zbmNaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRdZVZhVVJOWGVST1xPT0hkcF1jRllpTUlfS1htZF94aG59ZGBVX1RddVxUU2BnT11hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdGxzgnR/f4eFhpKElY95foyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj46OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSHhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WFh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4aGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4qKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJydHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1c3J2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgICAgYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX18fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCBdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A/PT5BQD0+PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QEA8Q2NEQEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pj0+PDxHe1s+Q0NFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hERkhEQD48Oz5AREVEQEFGQlFlbnB5cUVERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHVWVhfoWFhYB6VEFBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLS0peeoCDg4F8g35jTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS2R/gX6DgX2EgnuAhoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQEFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEhJSEtLZn9+fYKEg4GChISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQ0dIS0dqgIKCgoOCgoOCg4SGiYqLjIuKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9RUJERWaCgoKBg4ODg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojk4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOj1DU4GDg4SEhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDs5Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj8+QT9ZhIOEhYWFhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw9Ojs7PDs9P0NCQGeFhIWEhYSGiYmIiIaGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj8/PzxAPkFARUJOfoOEhYaGhoiIiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDs+QD9BPkFARERIQ2qFgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozw9Oj9APj8/QkNGRUxXfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD07PUE9PkBCREZHUW+Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT1AQkdGQEVHRUpRd4aDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkJGVk1ES0xJTlJ6hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxSUlBTVXqGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZYVlhXd4WEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSUlJRkJEQEE6UFFRV1hQUE9RU1RTVldXV1ltgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaW1JTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BPUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+a1FLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0JcXU97Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fX1+fnx+fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ01SUGFXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV2d3d5eXt9fXx8e3x9fX5+e35+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUVBTWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh4ent7fX59fXx7fXx+fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVlhYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3p6e3x9fn1+fH19fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0tKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSUpMTU5LR0lGQkFCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJCQURER0tGRElJR0dIQ0M/Qj8/QEE+REVDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNteHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbml3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDRUdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NFR0hJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdwcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW1pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODk9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5bXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oz46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXltYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRTxARUJEPDg6Pj48PD1CQjw/PkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCRUdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKTElLR0JFREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTU1KSk1MTU5OT0xPUFJVV1ZOTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxMTE1HQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUpGREdKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0VFSkxMSkxNR0dOSkhKS0dLSklLS05MTU1MTElMTUxbc2JkcF5sbFVNTmVzXmdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ0dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTWlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHByc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRUVFQkFCPT9ARUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFkaXR5a29ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEpMTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRbcGZkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JJSEZKREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlXW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkdFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURGS0tLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUxEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRURUXVleWF9YX1tdVVhYUF1dUUtKV15YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQEZFQlZVRVxUXlNWYFhOVFVOWltNSktVYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSklKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBREVBTEhDTExQT09NRk1GRkhKSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlMSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNETVtIXlxzbU9NVm1ZTENQX1VsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoODgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hLUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5OSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUxLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JraG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXWlBTVVdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1xbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZZVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFVTWFpUU1FZV1dcX1tgX2BWYlxgYV5gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xZXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1pbWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlZSU1pSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1JTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllaV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVdXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1iWV5WV1pbW1tbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19bX1hYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXFxdWFdbW11dX19cWl1jWFlYXV9jZF9SWVlQV1ZXWFdXVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXF1YV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllaWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZFxlZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbW1hYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1pbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzM2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl6eXp4b29vb3BwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eX+DgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHh5eXl9eXh4eXh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8e317d3d3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH19fnx3eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn19fH1+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn9/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKCgoOEg4KCg4ODgoKEhIODg4KDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYGBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4eCgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCkoyCg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaGg4KBfn+RmYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhYiCfn1+fYWcjIaGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4OJioCAfoWKf5OPhIF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDgoqKg4iCg4WAhISAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODjomGhouDf4CAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5CPkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SQh4GCgoKCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhISBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhYiDgoKCg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGhIKCg4SCg4OEgoGBgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFh4iLioaEhoSChoeCgYKEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICCgH5/hISDg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgICAgYOCf35+fn59fYCEhIKDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX6Ag4ODgoKBgX99fX5+gICAf359fX18e3t7enp6eoCAgH5/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCgIGDhISBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOCg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4eAfYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgIB/gIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeHhn99fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGBgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf318fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPjIuNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYyMjY6PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42Ojo2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjYyLjo2LioaEhYSEg4ODg4KCgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Aio+MjIuNi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLiouHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGOi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI6NiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjYuIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyKioaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImNiouHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fX19fHx7fHx7e3t8e3x8fH18iYqIiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaFhoeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChH+DgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gIOBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4J/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYSBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf4CDgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/f39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKEgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6enp6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH9/gICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af36AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl8fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYKBgoGBgICAgYB+fn9/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXx8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGBgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9f3h3dnl5enx9fXx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5dHF1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7enp7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEg4SFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4aCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEhIOEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eGhoeEgoSDhIaFh4WEhIOEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4SHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aHh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeIh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOCfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gX19fHx9gH99fIaDhoaGhoaEhIKFgoWBgYB/f4CAfn+Agn1+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhISDgoaCg4CBgH5+f4B9f3+BfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWChIKChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXU1dTU1NTV1NTU1NTV1dTS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3c29zb29vb3Nvb29vb3NrT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NzeoKBgYGBgYGBgYGBgYCP0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojg3PkM/OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrKTVFQ0NDRENDQ0RDQ0M/XNPT0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMC87SUhISEhISEhISEhIQ2DS09LS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz9AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj49SFVUVFRUVVRUVFRVVVFq0tPS0tLS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJycrLy8vLy8vLy8vLy8zMzNPU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dG4oNDRnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Szlpi6upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EP0E5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q8n6OostGSfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv8eHmrTV082ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3ao5i11NPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvA16GYtNPTr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWq9ihmLTT06OhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5PToZm11M2en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY6Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ6k2aKZtdfDn6DS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYv9ehmrPZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8vWsYPF1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU0dDD1NHSwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLS1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUs+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6dd3BsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQkQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9eXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpqKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3rqmqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS1try9vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2nqru6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7q9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2RqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbizr7u8t8C3vcK/wbu/wby7xb67wcTAvr65vMHBy769ycTAwMrAscG/u7i7vrq1t7O4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysq+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6yvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw6Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u+v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz08PDs6QD08PDs/PkJAQT8+OTU4OzxGQkNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbq7v723sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4Oz9AQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW51ce1s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQUQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLesudmzu621r6+ztaqnrayjnJmUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk/QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK3prXUmcG3srGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI2OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCfoqCir6+ssLGqqKqyyZamyLCuraywp6CfoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ6empqSmZ6coaKgoJ2hpK6dn6mso56XhXuMkbGUiLWvqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+do6bOo5uloIl2g3NiaGt9h4Ohs66uqaunoJ6eoaKdn52anJyUk5WUnp6YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6aho6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PDs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWen6GdnJibn6CboJ+fl6Kw0auUjoiBYnGObGJdYHigsa+npKSjoJ6lq6ael5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKcus6ihm5jh19Xh4iPj5ywqqGanZyfn5mXmJiSjI+Xl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmcbClWtcapdbVHGbsLOtpJ+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NbT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+9wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLgHpydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsmp/PtIFaXH2Ra5CurqWdnZ2hpaGempWUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/DwsjOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkdBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaWl0qhqWnWVo62tnJWYoJyboaKfnJ2alop3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHx6cXN0bWFjaW1fVlBfSkpDRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWxr82hWmSfrauimZaYmpudoZ2anJ6TfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh6dm9wb2thZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp5+4trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxtr7Ml1qQopyWk5ecnp+fnZSWmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XHysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLfJzZeImo6NmJWQlJKRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr25zsmhlI6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hSRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/ttKzkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkZKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsPEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubS7k42Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb6xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLW0m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeZGVjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szDxsLF0MfOwsTHwMbGxMTLwsrLwcPAxr+4urrJtrO5urOxqZGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS4u8G7t7W7w7aztbaprZSDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6OfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm5wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tb24usC6vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLEsbvDubOttr24rK+xqZ6Eh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquzs7mzvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7O+v7G/wbmqprG2s6SsraOJhoeAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednZycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7Kys7ezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/s52lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy1wbm1vL6zuLy3pqOttq2jq6iWfYSFgHlwcnRxaWZkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysbCwrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6+uL6/uL29t7e5s6Sjrbehopqfh4B9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVltjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbesnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usC6wL6/u7m0trKio62xmZuDlIiAd29kYmdpaGZoamdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQqqiwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbKppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZWUkdRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4OTs5QDl7tbSttLuyr6uxrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLvFub/Fwbq7s7axoKarqZeSgYyEfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGHkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqmqrZqcn6GgmpSQjJmOi5CMko2WlZCeoaCjnJuilZugoqCYoqijoqiroKuvpK63paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmnr62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLs6+7w7rAwsC6vq+0q6GlqaaXj4CBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4yQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpWRoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKego6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrSytbuwuLnBur2tr6msqKqllZiCa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CapKeclZWXm5CSh5SOjIGLjYCQipKSkqGan6KVlJiYlaKlmYyYpKaopqGgtLKns7ehnaK3rKmtpLKyprW7taursaOIeHFsXU5RUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysay0oaqywLa3qaanr6mqmZCfeV9gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCJmJ+inpCTmJaEjoKTfn50iY56kIeTkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3eLeio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKulqpShq7y0rKubo6inpZGOmm9XV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZSdlIOWjpCPg4Z9knhyb4WNfomBkY2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2oqJ6XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRkxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKqtyKyloJuFmJ+3qqOjkqGgn5yRiZBmUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtcGl7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFh36KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaSem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEdKTkxNVEtRUU9GSEM8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestL+poJmRgY2Xrp2elYmbkpSPi4WGYk1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBi4ySeHqAe4B2c3KSd2d1hISEhHuViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cmdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEzNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qqrOwo5yTkJeEkqGUmoiAlIaLhYGCfWJLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIZsb2hzfImMh4BseXF9cG11j3FocYB+jnBDioSCg4V/d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnJqdnqKdlo2KpZuPnpeOlpiPdm5sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6epsa+xq7y4rLu+ubOtqJuxp62ckJadpqqlopmbkYeUfYyTkJJ9eYd4gn57e3xiS0ZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6CbGljbHmFkJKGa3NsfG5ye4ZobXB/c42JhIV6fX57dm90c4WCeYF3cHyOjIqUg5aXmJqQk5WWmZeel4yDiZ+Ri5KNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw0NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKimZmSlY11kH2DiY+MenZ8cnt2cnZ5ZE9FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH5+g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26TjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaKhoCQh3Zqam5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY6RjZGIc4iEd4qPi351dnR2dW13cWdVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYmAaGZiaW5ybXCDdWlvWHVwjpqSdmx/e31tcW1wgHpzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3pxcG9rXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGepKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iPh3aDhW6Xiox/eXp7cXtzfGpuXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFTVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGFmYSbnGGGqp+dioKQjXp2iH6JiI5zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXd0hHpwdHl3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1b3JzZWZfW1pdU1tmXldRVVhcVkdKSkRLRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjXiKgJSMkp2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEj415g4J0ooaNf3+CgXODgHxreWxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZmd4fm6FhoKFcYSFR2uAd3J5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnJxalpcXFtjY1hnZVxVUFBXWVBETEtGTklDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoV0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CNlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn5/cV9cYl5ZZmpcbGteWEtIT1NRTk1MRklQQ0RORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpKGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5J6gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdnXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YneOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUdHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0hFRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNktrInZZzVpeIj4icj3yGjI+LinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSkRFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRY2RXenVxgpR9hYaTdoZ/gI17v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AeWlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFpWWndqcH+PhIGOhW56c3iIYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu3tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfXBeYGBcVmBdZ2VSWGFWUlZJRUZOS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5MzczNTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afnhqXF9bWF1gWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamppYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOm56NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEooBtYltbXFhfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDk9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bWRbYFxVXlFdWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzU5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKOiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW083U2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcW5hXl1XUlhSW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRtY1tXUVRQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eFh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrZyimpqfpp+frJmMmoyRk46FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Iw9HK1NbY19jX1dvX09nb1s/b2tHWyNXMk3Z4Z2ZZWE9SU1xHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uHgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjoqLgnyhiJCLvKGYk5eZnKimpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4d2VnY15TVlZUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KekZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2MnKScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhoSApIaKi7iYnZGUlqKnoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVpaGRVX1pST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGPg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5cg6KRgo2fk5WMh4iMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZWVbW1ZSVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6PEA7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGykGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKOImZ6VmomPhpeYioWPjYJ/ho+liI2TqZqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qNoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWl6ShiJ2ako+KkIqXm4mLlo6HfYyYnomQkJyampOYmJ+UoJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo6+wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNl5iTnZm0l5WrnYuclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcTX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paWofoiGnK28sIOMjIuQg46DkY56gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q7tsG8rKmcsqWkqZSFjqnEw6SCi4+HiISGlZSNeoSNkY+RooyMlJKPiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HJyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXqFjZKQnp+Tj5SMj42Vo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqOalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77CuK3Cw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbPAuryur6igqai2ra6psrebnq2ip6Geq7e4qqWwv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9iJKZkKqZmJOTj5OWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpelmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpp6+vmKOvpKekpbXAsKystL/DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI+WmoyxlZualZKTmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmrKutsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlZugoaiep5+ZmqqZoaeemJCNkZ2DbnaSopqVnaKekK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJytqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNh6KfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wMLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KYkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKSilJ2inqG1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5WZqqGedV5aXVxJR0VGTVBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/CyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk5LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVtLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYlZMopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7O3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawq2pnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKok6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r7/EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaSTr6+spaefkqGelZ6PkI2Vnpqinqe0pqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUxKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKuzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwrSrtaivuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKfm5qblpeon6CYoZ6vsqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC6qbakrLuswMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesuLDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSrs6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpUQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sbu+vrSorrG2nparrqiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLWywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkp6ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLq+ucO3wLmxtKupura7ub60qa2wtZiYp6yqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtLCvp6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQipSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLipCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y3vr6/t768sbytp7q5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKRlY+dm5eWlYiWj5iap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cS05jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7Kxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmtraWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnZqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fH1cU2RvXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzs2KkhlSEorO0g/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLO+wcK7vre7xKest6yzuLzAr6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6moqK2pqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaQlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmNRc3FcSzuEfEY/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dv7+0wMLDur+zyMOrrretsri/vrKtraukp6qwqaeosaW0rqqwrq2ysbSstLyluLOtrK6nq5+jnrC3q6qtu7elt7akqqesq6qtoamnprGypKeloaGsl6qhlZugpp6koqqkraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8G7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoq6irp6CrrKm5tqmqqamiqqCtm5KqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaEioqNjY+LgoWUopqNjJmQkpGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dxeFxhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLvBsbGyq7OopLSopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6qjqqGirK2ova+srqyiqKigrJmQsKKYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYGLho2MkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5ka4B0Z4iMfVNYcF5KeHNTZVNRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzu6y4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKibq6epo6mepKmoqb2stK+tnaqkoa6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAV3ptVGFQUlhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amFKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm2v62hs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upqKGpnKSooa27qK6wraCro6Svn5+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh8fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1FRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLu+t6m5uL2rpLSoqaqxrrqxq5y8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqr6egppijqaCxuZ+jsK+hrKGtpJymp6mampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKf2hYWk5QTEpIUFJQSU5cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPjBYVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrG8wrmpu7q3p6i1qairsa2zsaibvrimrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hoKGUpKSit7ChprCrn6yjr5icqqWpnpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OIi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR31dW1hPT0pISFJVRjI6X15sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxX1QsMpajopiVnamepaGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G4rL26tKais6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZoqecpaaUmKGyppmepampnKGglKWfpLmopKetpp6loaiTn6mioaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIiRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0xJR0lPU0AhK2peakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3OGJNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysb3At668vLGln7aspqa1qquvoaDErKqnsbSrrLS6nqipq7GlmJ6qnqilkpqmrqOYnqWqoZuinZegnae2pq+qrqGhnZ2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1tZGBNaFdbYFZJR0hLTFJYPjlgbGlHQlVTXVtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OUROPUI8MCo8QDtBPC01QjM3PSsqLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0FkRyU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxKGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p62ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFhVGJoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ7NiMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFJZEInNJOinI+OsZ2blKGaqbKwn7nAtqC0wbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxt7axs7a7p6mftqmdn6qjqq2dqsKZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknpqpo6WVmqCdkZyjq6qpup+mpKCYmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0Q4RVRnXkpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2I8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom669lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppycp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2mHhFpeRk4+Rl5NRVJWVlFQUldUZ11MWUtSUlBFR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVgNy8ojaaXhJ2snZmZnZ+rqqiqv8Ovsrm8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CjmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQV09YYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+usaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJFgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXVG1jWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlkzMRuSopWCraelnqOkqrG3rbS9vrC3xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnq+ol5yin7Szoaqboaysn56al6Cjqp2ZnqWhnJqhp6SQnaObmKGgrJ+mpqCan6GVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaBf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1RrZ2BMS1xjWFxaQj6wd1dYQSNNaEZDREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMiw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOGFVNTAcl5+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGpj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hoN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVxKW1BfZlQ3RzphUDcyJZyik5mxqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijn46soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rvm6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VFPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVByaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpZqdm6mflpWYmZKTo6qhmJOnq7ClopaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKkf3HXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2UoLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqSZnpWlopSUnJqSlqOnm5SQp62vpaGVmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe3+LnXlvsVqog4KIoHl02H92h3SngY6bjZKkfJaQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8UGVlQSZVZls/MVRfYkw3RklfQzE9N6Kcmpq/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOjKmwr6adl5unpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4b4x7i6Jra7ZaoYZll5dpoKKnbZRytHSTmH+yaoaSiK1rdbNhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpudu6Kcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+RlJWrtq+nmZSbrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn3Vlpu4eYmRmI2XiYynh3mitnV9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0cqNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDw6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCsK2pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrpmVoZCmoJONnKOemJ6akJaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGanJeVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolznsG7vJl6gbKocIB0kbmDfIaGi4eNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTVBNRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJTWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrSrqqitq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnaSkoouSkqacpaudlqmlppyboqmnpqOooZKsnpeinpeXmJ2ej7Cpk5ynoo9rfmmcqHmJc36bjnV6ZYd7vr/Aum6SgnGVhV9yalpdmolhZIeOlWtgf5VjbZx2YpRrgJqVlGVeX2Nxm4locox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TT8yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLq2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKKfqqKarpuVpqCWlZ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeUkYOJtKmNhZiVjoqMmJaHk5WKg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp6yjpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5qrnaqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio2Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhoWakYeGiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6VlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJilnpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5raIyXkaJ3a2qLmKKfmHNsbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjQ9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnY2cwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGRfZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvq6anpbGroKuYm6KgnJuqp6Kdq6KlqaWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqukq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScramRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrg4CvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFxxaGpjZmBSVFNXXkpPRDVBSEVEOD42O0A/QTs9OEA+Pj9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtraykrKawqqGnm5qmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq6kq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6amo6CqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKOoIB6rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6mrqK6rq6aio52ao5afpqufoqagqaiin56wrJibl6ior6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqqqKOhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5efKhVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqOsoaSfr6Kdm5OqpLawrqCpm5yXlaajkJqip5+gppyxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqihoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXVxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKarrKmmoKakmKujn66snaahrJqfqaWdp7WfopeTqKu2sqybppyglpClrZKanKaioKqmraGjp6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKumpJ6ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaavrq6ppp2lpZqjp6GyrqKpp7KgmamklKK1oqOVl6KqtbmknKOdo5OQobKZnpumpKCir62cpKiitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGsoqSXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGimZWjqaeuqauZpaGepqGgtaeiqaewo5Sro46kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maGqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKCjm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eWBnZXBuZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46bpKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqho56pqL6ll8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrYqEsIWmmaOhopGFoFtsaoGzYH+te3uCgLFsZ22Zl4uIsVt9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xhaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylpKSipKm7nqDGp6Wpoqy1t66vqKG9r66ul4GpkqOujpuAhqSXmJCBgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpio7+9fH6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtla2phUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKru56pxaOgr6OrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9tb3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomWlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2ZsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYk42XlaaTnZanoZmwpp2irLmgsMKopLOmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZOqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqy3qK/CrqO3p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqZ+Nkp+jrLCboaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjJCNlYuBfmaNh3WHdnmIhHScaoeRlZWSin2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kX3BpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZSQjZGWoYucnKednrijf4OvtaKwr3SkvqOyoHh7oay0vZZ3rqWgioCpfmRcYnafjqSdg5d+bpS0nKOor6ykZZ+glHR6mpdxgJmpmGyAo6iKZZylm5CXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV92b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrigoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1dpONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtIySj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmBi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGn5eZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkd21pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOURLPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOppZolaR5tIufn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1hYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2doZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvZmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgat0Tat4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZnaWliYmRhZGRiYWJgY2RjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnuejHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOTh4GAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpxMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkniLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIjJx9lp+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbjRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFjfGlFQjlOW15ZZGZYZmdtbWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHidequafqKPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmhobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhZhvk4KufaODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFGQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqpqTkouFiXmEd4iAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi4CMpI2Vg6+ilXa1trbJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWp4h2ZrZ2J0dHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJe3tUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6mXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7lukIqiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FnYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlpmCfIiFlqaQgaKrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bn2lr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uaGxTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkZG5zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWDh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e35+iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gXmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYg4Gbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6GLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Sjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH9whoqEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpmHhH6Sg4SGioF6gISLmp+Pgqagh3iNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdkI2xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1sfnqXh4SDkH6AhoSGfYeDjZudkYapnoJxio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZiqoJyTnI+Nqo2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yOhpuFhY51gIx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXVgY1pbXlFmbVNlWl1ha2l1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/cIuKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmQkKaMj4GckoqUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4KIfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zaHx1dXN8c39qXmB0dnB3ZGNYXV5SamhUZFheYWhqdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KeoJKYjo+ijIuDmJmEk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY5+lHmMiX2AiH18coB5i4Z6hZKKjJmjl4OEjHeHg4KBdXl/hoNzXnd3fHN9d2ZrY2B+aWp2c3R1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2BpbHV5hnBiamNsZmh8g2todGhsb2h/fIF4bY+GcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6FiHR9fop/fpiElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmqKTlYqNnoyGgZOdgJOTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeoh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3Jzf4WBbF95dHhwe25hbmJke2Fub3Zzd3dzc2F2YG9sdW5vXVteXV1qXU9dV2JhaG1zeolrX2llamNod4htZmxoaWxngHx6d2+Ph3OAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYaAhIRzeoCGeo+Rh5GRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpShkpKIi5mMgn+Rn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgXSIeW6AfoGIfYWNioaOlqqOe4h9foqFd31vbn+DgWJnd3N0bnphXW9ganRecGp6eHhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+IZV1paGdiZ3GNbmRpZ2VpZ4B6d3VvjoRzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZGQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknp3iXRwinyHjXuLh4WKj5ykiXyEdoGKf3d3bWp/gH9ccXJxb293WV1vYG9qXm9pfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUVNZZWZidXCEgmJda21kY2Zrkm1gZmZfZ2uBdHFycIuAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J5gHZygnmCoIKRgZKRl5uRmXeQeoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfHOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qOj4yLj413e5ORe46LjZKXjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIlox/iYd7lJFye4Vwd417i417iX6EjpGfn4Z9fXiBinx2b2hrf4B3XndvbWtwclVdbmFxYV9tbnlwZ3BmZnN1aHFsYXdlXVZlYGByU1BOW2VkXHhwiHxeXGhxYmJlZpFpX2dkW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZaLjYmLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIKNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Ba2l0b2doc2xTXm9kcFpfbHJ3ZmtrYmd4c29xZF93YGFWa19edU9NS2BlY1x5cYp0XFtldmBhZWWOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5SagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiOi4qEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbG9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjV25aXHdMTExjZWFddnOKbVtcZHheYGRmhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuJiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWNgJmHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyUkoGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiGiYyHgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5ec2huXGl1X1JkcWhmU19wdnRgb2BdaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWhbXGV5Xl5kZ3phZF9dWWtuZW5qdHeKfnNygX57dnqHdIWDfH+Hd3aKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4SZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkYuGe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4mNf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdpaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2x3ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KMh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIOJiXKBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXm1jWmJvd2RnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5ZvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiRjIVua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKDiINugXdogIR4cn+Ag4qHfGV9foR2Y3BzgGl5cG91mY2Gg4p8dniAhXqDa1xyf3OCiYaKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBsTldxc2ZgS2x3dGFdXFpZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWllrZVpjcXlfaFxeZWxoZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFiI6NdoKVjH6SjYx/bWyFjYx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uIgX2JeHpybYmEkYWMc4J6gJeMi4B1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XmVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWCgY2ThHCAi253fYB7e4eSiX9oe31qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4h6fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXp4c2+LgZGCh3N/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFxgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan57bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRgIB+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx4hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKIe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4p3eHFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hb4JzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x1e4aNf3qSiX90c3R+d4BwcX9thHSUhnh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhnt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHlsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH53gYOBe3N9g4iHg29ygHRxdX6FgYmNint3gHiDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGEcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ3b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYOHgHVxf4aFjoNwcHt4dnV6hoWHjIZ6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F5gYR6fYt+d3dydm97dmVqb2CHdY6Bc2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt5cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF+dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeXZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2IhoOGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJuhXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdnSQf3yBlY6AhYR8foyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR9gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa3CAZ2tgaHl4anN0c22DgHp/fHV1bnpoanlqX2VuaIF2kIRnZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kY56dnF/cHR3epCBeZZ0hYOAhYh2anF1Z2duW2xjXW1yX2dhanhofG1bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1TcV1KTVRaZWt2e2VfbXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXeAgXqAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH+GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6GbnyAc4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcYR9f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1zfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJvhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3ZtYlpsc3NndHVvbIN4fn94d25udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2iXOAeHx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d3ByfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+gIGTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGt0b35reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZvbmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319cYF4gHN6enpjZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZVa1BJUFpVa2trfGVtb3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWVdWW10bW91dHhqhnx/e4d2j3NkZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fWx6dXZven51XmVyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGpqdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlPSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg4B9h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygY2LdndseoxgZHtwZnpzeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtpdXRvb3uAclhpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFnaHRcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKDeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2NjY6Njo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2Njci2lubm5ucUksMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+uLYmdnZ2dsPBgcHB0dGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e31+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHiIeJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlY2JioqKiYqGgoKCgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXt6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yMjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fX19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKjYiQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IiIyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fn5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYeCh42OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnl9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjYyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnR0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHh6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPj9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdXh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5NTU1OT05OTUtLTk5OTU5OTFRucHBydHVzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+P0BBQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1xcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcHBxc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4Ojs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcXJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4Ojg4Ojs9Pz88Ozs8Ozo7Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF7TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHSEVEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX1RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6PTxAQkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYCAgIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBREVDQD1IREFERERDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEZISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FBQ0ZKSElGSEhKSEZBQF9oREJBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMS0xIVF9ocXtXTmyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdXZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLTExgWGd/hIaEfnl/hoWEhIaGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT215g4SDf4CBhISEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4enx7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hQdYKBgIKCgoODg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERU12gX+BgoODgoOFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo6Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxETniCgoODhISEhomKioiHh4iJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49QEBPf4KDhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFBP2KDg4WEhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4/PzxAPkFAREFNf4OEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz9BPUBARENHQmqFgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT5APj8/QUJFREtWfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs4PD07PUE9Pj9BREVGTm6Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH9/f1VFQ0VFR0dFRDs/QTs9PDk/PT5AQkdGP0RGREhNdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QkNGVk1DSktITE95hoOFhYSEh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVERUxYUkxRUVBSU3qGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lLUFRTUlZXVldWdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot5bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1RTV1dXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaW1NTUU9SUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5cVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlFSW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFTUVVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDgoKAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f397eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFZUV1FRV1ZQWFtiXWFnbW1sb2toYG5yam1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0JBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fnx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfX2BlYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZJRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XV1hoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTk5MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0eHl6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BQUE5OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBRUE5OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFARlRRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTU1NS0dFRURCOz09PDk9RzY2NzdEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBPUlFQTU1OTEpMS0xOT09RTU9PTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT1BMTE9NS01MTU9OW1ZLTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktMTU1MTEtOTlNkTkpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTUlNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE+Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT01JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkhIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QEBDRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUdERUVGRUdDQ0A9PD06Ozo6QERAPkJDRUVJRkpKTEZJSUdGRkNCO0JDQz5AQ0NDREdMTkhLTkhESEVJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VGRUJCQUVAREI+Pz46Ozs9Oz0/Q0E/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQ0NER0lJR01QSUZGR0tOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVU1lgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2poaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJIQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tJTUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QkFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEtIRkZMSEhISkhNTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF3dXV1d3Z1d3NndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGSEVJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpaG1vc3FwcXBwcnl3cnV1dHNtbXNzbXFzb3R1dHNwc3d0dXV3dnV1dWVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmljaWhobXh2bWhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQkhFQkhJSUhIS0ZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0RES0RESkxMSkxNR0dOSUhKS0dLSklLS05MTUxMTElMTExbc2JkcF5sbFVNTmVyXWdmcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXG91Z3FNS3J5dmtiYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLSEdLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa05QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHBxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZKTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SEtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9aa29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGtucHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RhYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R4eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNmaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4dnJ5dnhycXh2dHZhU0pKTUlEQkJDRkdFR0dJSkpJSURHS0pLRkZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJiYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRURAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGNiZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSUNFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTkxRUUlLSktLTk1VTk9LS0xHR0tPU1NPUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9ITFJYV1FOT09MUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZmtSck5Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fXB+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOV15ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym52UGRlSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dlVLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUVFTUklJTU5PUVJRUVFUVlJYV1xXU1NRUVVVVlRaUU5TUVdVVFlWVFlVU1JVU1RVWFlYXlpfYV1cW1pdXWBjXF1iY2RnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGRmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRRU1RUTkxOT1FUVFJSUVZXVVlaW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVRSUldVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYVFdXVFJSWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNTWE1PUFFUWFVVVVNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVVZWVFZaWF1eXFxeVlNOVFZWW1tVUVNUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVVRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVNVVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNYUlNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhcVVZXWlpaWFlaWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmJoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlZSVFVXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV5WV1pbWltbW1laWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVlNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXlhYXFxdXV5bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbW1pbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2FfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYanFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt6ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnFvqcG+vr6+waKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb2yy0MzMzMzQqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4ODhIOBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6enp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5eX+DgoKCgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl4eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7enl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3t8eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eXt4fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnt5e3d8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7e3l8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6eXl5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2VmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCKkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiYOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjI+LioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4ODgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoOBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODhIGBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYOEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgoGDg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4OEg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4GCg4ODgoKEhIODg4KChIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRk5KQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYGBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCCg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhYWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgYGAgYGAf4CBgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISEg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgYGCgYCAgICAgH+AgYCAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhYaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoeNh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGBgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhIOBh5mMhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KFhoKAfn5+j4l/f39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODg4qGf4GAhYGAgIKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WEj4KFg4KCgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaDgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIWRg4SDg4KCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4WGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaBg5CEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEiJKRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf32AhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fICDg4KDg4OBfn1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB/fX9+fX5/g4ODgoKBgX99fX5/gICAf359fX18e3t7enp6eoCAgH9/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gX5+gIKEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGCf4GDhISBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p6eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBgoODgoKCgoKBf359fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgYGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWFgICDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHiIeGh4Z/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFh4aHh4aHiIiGhoeHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhISFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9g4F/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OEhYWFg4ODhIKBgoOCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WFhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGTkYyMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNi4yOjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGBgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MjIuMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyLioqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8e35+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iJh4WFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fn59fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Dg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foKQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+foCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfn6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHV0gICCgoKDgoOFg4SDgoOEhISEhISBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYODg4SEg4OEgoGAf4B/gIF+fX1+f35+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgX+Af35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9+gH9+fXt6e3p8e3qChICDgoKCg4KEgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYWEhIKEg4GDgoCAgX5/gH6AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3yAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/gIGAfIB/gH5/gYB/f32Af35/f399fXyAgICBgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f4B9fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICBgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+eoGTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx9fX5+fn18enx8e319e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgIGAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx7fH17fX17eXl7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYGCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8fId5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCAgYGBgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgIB/gIGBgICAgICBgYCCg4KCgYKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fXx9e3x9fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgYCAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISFhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYGBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+BgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OCg4OFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISEfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWEhYaFhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWFhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFg4SEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t9f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSEhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4iGhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4OCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIeGhoeFhYeDhIWEh4aGh4WFhIOFhYeGh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWFhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx/fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SGhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoKEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fIB+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fn9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag397gH19f4J9gIF+foF+fX59fX97f3x7enl6enl6enx5enp7e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+AgXx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGg4WDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fX3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5tHtzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZo0KSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKaePS4wMDAwMDAwMDAwMCposqurq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamro0s8Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs/Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKycrKysrKysnJycnJyc3T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn08iUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Pz9Gdj8Ccq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6u1lYecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gbv77ImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJmr3TlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvEsp/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWrdCLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TK26WZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCbkaeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiMydkY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk2Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6ubm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubnJubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3KxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcLDu7mztLrBvb/GwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfYFlTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7OysrSyuL65s7WyvLm8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT49SENGTUNANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6tbSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPklCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi4trK0trK0r627uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOwsa2wubi2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rqyvsrK6ure3tbW8s6+0q7a6uMDEwbu1vL23sq2zsK+srra2srS1r6qknpucnJ6oqJ6gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+NDk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2s7SrsrSuqquvsLKzrqWekpiUj5ign6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbGjpaieoJyVk5CPkZCYkJaVmJafmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0VAPTI/NzU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmkpa6lrKy0vLets7Gvsa61r6+ztaqnrayjm5mUjpGWl5mZnKCiopydpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yepKiurayrq6+qr6mel56lnZ6lpqShop+moKKvq6yttbK2pq+zq6mqtLGxsLitp6GcnZqUl5qakI6RlZGMjo6UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysLSpsa+imZydnqGZm5uamJmblJablpicpKGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PUI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pjc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOfnaCgo6Cir6+sr7GstqiusbCoprGuraywp5+eoqCXkZSboJyZl5KTn5yhpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0pKCdpZ+soaGioKCamJaWoJubmKShoJ6koZ+empyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQkxHPUtIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm42Tnpmona6ep56coZ2empqSmZ6coaKgoJ2ioJ+en6mrp6ypqrSsq6zKwKSrqKqsqqWgnpmSkpOYmJaWlYyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaKsoqmosqmrqKeompmemqqnn5mmoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7Cmn56dnZeYlZmem5yjn5+dpJ6bnZyloqSjoqqwrKao1LSlrK+uqaunn56eoaKdnp2anJyUk5WUnp2YlIWdmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvrizu8bDvMO8t7Ops62qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubn5uenJ+lpqWgo8i0sq6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMO+x8bCt8PJycLAxb65tLm6tLu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqaloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZFpbRktMRURTTERCRTc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZaalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKgn5KZn5mSmpifmY+JorGzqKCanZyfnpqXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGx8rHzr/I0czHxcbEwbvDwL6+vrW9s62/v8LCxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQ0A1NTU4OkI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6OsnZ+upqWxqsXGzM7Nv7DBqKWorK2qoZ2jn5ydmqmTmqCavqOSjpaMgouaqbCqo5+doJuYl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytLX0dfS1NXT08jMx83NydLMztPMxcfJysHFy8bIyMW+wrKzyMTLysrOxcq/vr+8wcfEzMzIyb/Dv62vs6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXZnY2d2aWRWV1FETUZASVFCPUI8OjIyQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5anr8usjI2Ri5mvr6adnZ2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tjV1tLLyc7Ry8bN0cnS1dbZ1dfT1tjO0srP0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0czLz8XJx7/Dw8jOzM/Qz83KyM64t7uon6Wrp56YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ozg2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKaqaaipquao7Cxqai10NTX2tLHxsu0tcLFsbaooqWmoaKrtaear8TGpYaGoK+snJWYoJyboaKfnJ2alYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czQztPX1tPV0M/S09HJ09HH0NjX2NHY0tfZ1dbMz8/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjU0Oj01Mjg1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqrnaauuKirt9fU1dnZ0c7QwLzMybe/r6erqaOksbWyo7fLu5uUqquhmJaYmpudoJ6ZnJ6TfnFlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L0s3V1NLKz8zT1tLR1s3P1dXRxtHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzs/L0M3Oy87Ox8rP0MrOysLJxsnMysvR0szT0dHP0Mq9yLmwrru4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRNV0U7QDwzMzw9ODc4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60sMDY0tfa3NbPzcvE09DCwbGqra6rpbKxuKq7zq+jnpyWk5ecnp+fnZSXmJSJa15eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAycHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rExsDFysvNz9HG0M7NzczPxcfAt7i9w8O9w7mzsr6xu8PEtaqYpaKZlpGVlZKLlI2akZSUj4+UgomFeHBxa21nYGBxaFhYaFZMRkxJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrjL1dbZ2tvYzM3PyNbVxcO3sbWqo62suLmvv8qhl46NmJWQk5KRlpaWkIx8ZmJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsfJzsTBx8DHzcfDy8rLz8fDw9DIxsHFx8S+wMfLy8vOwsrLyMfM0MTFx7vHw8jIws/Bvby/sMHJx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbKxrMnNysjEvr26zc3H0NXV2drb2NDKz9DS1MnEub2+r6e3qr24t8Osko6Ol4+Gg4SEgn6FhX90YFxeXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nBwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxLzAycLFx9LEwMi/ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaykpZifmKyjoaWao6CblHt2c3RmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz8zV0NbZ2NnQzNPOz9DKw7fGwLW1u7C/triwkYyTmId6gIWGgHZ4dXJxX1pbXWBgYmRkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrC2urKys7Kxwry8vLq4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Dxr6+tcG9w7q8xrvCubO8xcTBwra/tbW9v7rLw7y1usi6v73Lw8HFwsXIxsjG0MbCzMeyx8nDzs3BxcPAvbK3sLKnqKi5sKWtsKutrJR5dndqZGdgaG9jVl5ZSkVKRkhKQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1NbYzszQx8zIysS9ycGxtLm2ubSukY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYWJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7Sys7S6tb2xt7C1r7K7wrzBxLy/urWzur7AuMe5tLu2wMK8uL3GwcO7ta6ytrq+tMS3u7WruL29v72wuravtrqyxby2rru/tLa0xb2+w8XAw8XGyMvFwMbGu8jLv8/Kx8PGwsO2w729trm+x7+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJEQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzM7Iy8nLysvF0c7T0M/HycXJxMO/vM+8sre7uLa1m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqauptK22sLKprqassry6tsO5urqxq7W5u7TCurC/sb28u7a8x7nCtq2qqLCxv7W3vK+wp7GztLu8q621pa62rrqxsKq4sK27rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/xsPDucTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtMSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0svDxsLF0MfOwsTHwMbGxMTLwsrLwsPAxr+5u7rJtrO6u7SzqpGJj5B8eX6Khnp7hYF3b15dXF1dX2BeX2RjYmNjYmBfXVtbWlpdWlpaWlxkbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwpKafqq21trG9ua+3r6iut7S0vLi0vK+4ubSxvMGxwK6lqKKrsbKzp7yqq6irrK20s6WoraGkrqmypaeoraWot6ywsre5uruxu72+vsS/tcHAx8i3v8DEt8TCv7u/xMK+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFlSU0tGRkU+PkA6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/F0dDNxMi6uszCzMC8yri/xcC7y7nCxcS5u8K8uLa8xLe0t7mssJWDiY2BfH6Afnh0f3xzd2ZfXVxdXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnaSbmJKho6qjop+lpaelrJ+dm6SmrLKvtrensKynqrSqtLqxtrWttrmxr7q5sbekn6SfprGnq6i5qqSnqKinsq2gp6afm6SlrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVleSE5nT1RHRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tb24usG7vbWgnpSdoaa6tquzs7uzxNDJy8PHubjJws3Aucu5vMe7tce6tcLFsbzEurWut766r7G0raGEh4eCfXp2dG9ta2pqcWleYF1cXFxeYF9hY2JgYGBgXVxbXFxYWVhYWFZYW15fZGNiZWdnZ2ptb4idqaCXlZqhlpuimJaNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqaurpLS5rbewrLK1rrK1rrCqn52eo6KypKapuK2ipqafqKyqmZ+gnpmdn6WamqOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXUlXXEtQR0lJRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQyMnBx7y8xcTPv7vJurrBurTEt7PAwLLAwrurqLO4taavsKaKhoiAeXNucG5rYl5iZmZcXV5dXV1cXV9gYWJjY2JhX1xbW1paWVhYV1dXWFhYWl5iZGRlZmZoaWtyjaidlJSUm5iboZaWkZyhoqidm52lpqGlnKCgmpitrq2usqCloq2rpqG0sLGxrKivsqe6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmpednJycrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBBOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL23vb+2vry/sp2lo5ilscK1tr2ttLjCzcjHwca4wsHIz7jCxr+1vLy2wrm1vb+0ub25qKSvua+lr6yZfYSFgHlwcnRxaGVkaGVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFhYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnJqaqqavsKubo6O3qqCfrqi2qaanrbCjt7Ckt5+im5iYqqahmqy4sKKhpJyioKCTlaGUlZabmJeWl5yVn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ureuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xMRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64va6dp6ejqrvAvcC5rrS4ws3JxsPEvse5yc20w8TDsL6/uL/Aub6/uLi7taWlrrmkpp+iiIB9eXJqbXJ0cGhoZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbW1pYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp56cn6Wfqq+mn6KjtqigoaKotKGlp6SvpbCtrLWeoJ2VlKmhopSssbGeoqOdnZibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpqiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxSSFJhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sbisnqSnrbe7vMHFurG5tcXKy8HEx8fIt8fFtMTByK65usG7wb/AvLq2uLSkpa+zm5+Hl4iAd29kYmdpaWZnaWdqbWBdXFtaWlpaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1ZTVFJVYGBfYGFfYGFjZGmBk5OIkI6UkpOclJWWo5mglpygpaGtpaSjoqOhm6qrpZmepbGpoKCdpauep6GerK2pqK6toqGilJejm5yQq6iwm5+in56XmZOKnpGNkpOVkJiYk5uhopykoKGVoKGkppujq6WipKqkq66lrbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc27wsvNyLfLv7PAxsuvtLzGusDFwry9tbizo6iurJqWhI2DfHVqampsaGpsbWtqbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1dXl5fX2JkbY6PhJGGkJGOmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmZugnq+Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcn6GgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOkoqytqqirrrK3sr21s6uvmINzc2hbWFhSVVJFWExRW1lNVU5QTFBRSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mi1xr25vsXLtK+7w7vBw8K8v7G2raSorKmbk4OBd3hvbmlubm5waGdpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLfoyQipKNl5GXmaKgm5+qqaauqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnJSloZ6SkJOSk5Wnq6WamZmdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKefo6y0qq6nsLSwubXAsa2xq5B9cXJiVlRWTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurvCy9HMs7i6vsDExrWztryxubrCvL+vsauuq62omZ6Fa2dtbnJvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQipiJlJSXm5mdqJqfqaWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKiclZWXm5CSh5SOjIGLjYCQipKSkaGan6KVlJiYlaKlmYyYpKaopqGgtLKnsrehnaK3rKmtpLKyprW7taursaOIeHFsXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tIR0M9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHxri7xMrNx7Wvu7+3usOysa21oau0wbi5rKipsaysnJOje15gZ3NxdnFqbmllaGhqX1hYWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFNTUtMU1dXVlhYWVhbXWFvc3ZxhYiCiICRg46KlJGTnaCPmpuioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCin+KmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqCho6OborSvrK+sn5mluKalsKGwrpywu6qpr6qZgXZyYlVNUk9QTUNTTkxRTUJQUUhJTlNNSEpKQ0pMRktKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTExNzY0Nzg5Ojo2NTo4N0E3d7eio7Sopaaoo6alpqams6eltMG4r7SwysW4usHPxr+0rrzDrrDGsKymqpSirL22rq6dpaqqqJORnnBXV2BoZ2loaW5jamlnYlxYV1hYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJgIuSjI+FhnOKhJaBeYJ6hZOdlIOWjpCPg4Z9knhyb4WNfomAkI2Pl5mYk4qPiZyHnpeHiJaemqGgl6evqa2op56XrbOipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGTk9JRUxRTUtPSklNUEZJSTw3NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXm3oKOtoaamqqCnqaeiqbCop7TBubC1sMjDuLS+z8C6sLC3xKmtyKymoZyFmaC4q6WmlKOioZ+UjJNnUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkF/lZGRfYmUjISKjZqNlZWKkoiFlYZ4iH9gSlFueIqRhH2EjYmFf39ufn+Ud3V1d4SNmXBRjYiKh3x+eJN2aHeFiH6KiJWKjZCRlouEioiUhJqMgYSSm5aenJSko6ippaOem7CqoaSkkKWqlqGpnKKmqIh0bGVeW0hRUVJNSVVNU0lMS09JSEZLTkxNVEtRUU9GSEI8NzY5Ojg6Ozs4Ojs4Pj85OT49ODs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl3tpuip52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5tqiptrestb+qoZqRgo6Yr56gl4udlJaSj4iKY01MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/h4F8hYySgZKZi497ho+AdX94c251cHSNjYF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIqAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnaCppZ+dmIynpJOgn5aenqR/cWdgXFxKVk9SR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDs3dq6Yo6GYnJ+0qa+ppa2ssLGqvbSyu7i2u7WyoLe7s6udnq2qq7SypJ2VkZeEkqKVm4qBlYeNiISFgWRLSUlIR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eICJj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZqdnqKdlo2KpZuPnpeOlpiPdm1sZWJaV1dUUUpTVVRPUE5RVktOS05PSlFOSE5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+flqCmr6yuq6ipsa+xq7y4rLu+ubOtqJuxp62ckJadp6umo5qckoeUfY2UkZN/eoh4g4B9fn9kSkZHRkFAQ0RJTExNUVJQUVNVVFRVVldXV1hXWFlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4bnx5iJB5fIuFb22MkXhzeGpqgIJylpGLgX2WgEmSmG5oeH6BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42IhIV6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5WWmZeel4yDiZ+RipKNhpCWfm1obW5uV1VXVFJRWU9SVVVTWFVNTkhOSk1OS0NITkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepa2woqyqqLWvrqy0v6u8wr+mopqVpZiejoWMlqKjmZqTlo51kH2EipCOfHd9c3x3dHd7Zk5FR0RAPD4+QUZGR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqc0OZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouJdoGIhnRsmpF0c3tqa52PTXmFkomEjmcxdoZzbH59g3RmZXR+hIOFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJSPl46AeYiXiIaJhoCQh3VpaW5nZFdRWldZWVtNUFVWWVlOSUhFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorp6yn6a6rquysMKxu8PHm5aPlZmLjYZ6hZGZlY+RjZKJc4iEd4qPjH92d3V3dm94c2lURklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxyg4GFgXqEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqSdmx/e3xtcW1wf3pzdm1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+g4F+j3lwb25qXlpcXVtZWGBfU05bWllYTEhKRUpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7BsrvBxpeQjJSQgYl9boKRkomEi4iQh3aDhW6Xiox/eXp7cXt0fGtvXkpQRz5ANzQ0ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5td4iIfH2Fg3+MfnaimXl+hoGEmYSbnGGGqp+dioKQjXp2iH6JiI1zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXd0hHpwc3l3a25pXXeHfYd8iIePgIuTl4ONhY2HfXGEf4R8dXd7fYl1bnFyZWZfW1pdU1tmXldRVVhcVkdKS0RMRz9GQERDPkFBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHiKgJSMkZ2dn6aRoKugsaivwLG6xbqWjpGUiHqFdmuAjJKDfouEkI55g4J0ooaNf3+CgXODgX1semxTV0xARTIxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cXyPjHp8iYZ+l4d2oZmIh4+SlKWNrKlIhq6vr4uBgJOKgouBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoKFcYSFR2uAd3F5dmhta192fYOIf4iFjHqVnpyKi4iRf3t1i3Z8d21vd35/cnFwalpcXFtjY1hnZVxVUFBXWVBETExGT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYiRj5aYkpegnayhprivs72zl42Si5iLfXRwf4mTf32Mg5OVfYZ/h6WIiYGDiIZ5iIt/dYZ5X2NWS0I2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WBhIKFkZN+hYmRgZqVgqGhl5WbmqWtk5q7sae7x8Ooi4yhpY6TiYGQe3KDnZ+RnH52hYWKj4eQaWhvg4B0jIaEi3GGgneHgHt2hX1udnVngJSPhomIh4iHoauilomOmH97gol6em9na3h9eHxxaWNdWlldaVxgZl9aT0xOWFJRSVBLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ0NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O251cGd4g3uAjICBkI+LmpqknKGspquvsJeRkYShlIR4d4CMlH1/koaTln+KgJKbjoSBgoyLgoqOhICKgGxwal1DQTQtLS8vLi8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85RD48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoJKjqqWjrJOotqKowcOux694upSafIyhnpiEkoWCj6Gfk5iShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhloaTio+PlqW1qZuNlaKDh5OEfn9ramt8fn6AcV9cYl5ZZmpca2teWEtIT1NRTk1MRklQRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5ynoKqWk5ieZ2Wkmn6Fk5F5gJGJkZJ9ioWZkpGDgICLjYmGkYeEiIV4eH9nTVI+Ly4uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bqKaimaGXopWcn6ieqaufqKypqrWXq7+rtsjIt8nRz76boHBpq6mfhJOShZyhmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2UnpyOk5aZpKKmtrCdkZmoiJeQjoGIbHNze316b2ZeW19eYGZjYGdmXFJFS0tQT0lKTEZGTUNHTUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDUzNjk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmMkFAaWFeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJh5iNeIKNi46Ne4qGj5COgoOAiYyKhZOFg4aIgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZHQUFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKynqLSssbeysq27sbO+nLPErLvJy7jEv7ilo7CyrK2qo4uWmIWmpqCil4KmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5ugo7CTo52jnpGkoquvrbO1opWlqomaipOKlXp7foN8ZV9mW2RgXWJjXmZmX1tPREpIVE9GSExGS0dFRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpCNk9rInZZzVpeIj4icj3yGjI+KinqIgoeRjoOFgIuFhYiShoKEiYaHh4dxbmFARTY0PDIvMTEwLSwrLTEvLTQ/REFNVVFSVFVVV1VNW1BHR0Q8Pj5GSENEQDc7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLByMSrs8W2rLPAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Ip6+qpJR2n6SXoauxs5iWqa2orrW7srqsr7Wisayxtby3ta61oKeno6ibqbCtsrq4uKect6mNpY+Sk6CGeYGBc1dgYlRlYGBiX19lX1tUSURFTFZRSUpKREpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMW1pRYmRXenVxgZR9hIaTdoZ+gIx7v7ujvIK0lJOOm4+EiI+TiYl5h4CMk4yHhYGOf4GJj4Z/hYiFioeRenluXVZARU48Njo0NkFCNzY0Ly82Q0hDUVtPUVVXVVxXT19VSUtKQUA/R0tGRUM7PkA3RDc/QkpKRUdXVFBej6Wto7G0w7a4wczKtrvEvbO0wbe4wrW/sLd0sbSmusWksMa5sbOxtKiktbaqsaCilpuikaWxraWtq6ekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/t7q3ua2tsaaxqq2+sL27wsKsmbuola2PmJiqiX6AemlWYV9XaWNpZFVbY1lWVElIR0xRR0RJSkFIRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUUxBTFJXVFlWWndqcH+PhIGOhW56cniHYrihmqOJlZSWk5STjZCXkoeHe4eBjZWKgISBinp8i4eGfYqCgYuElX14enVlT1xkR0VMOlFkYVteU0Y+O0hQRFpkUVFZWFpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj5IR0tNU1pUXpSvuLW6ucnAu73KzLu9wLu4tby8t761urLGYHWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnpqWfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrDwL69v7u8t7Swube3w7rGvsPJsJ66qqKsj6WotomAfW9dYF9cVWBdaGVSWGFWUlZJRUZNS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQElNUFJMUV1nbWxxkI2FkHNsc3JziNXAtZmgjZWZmpGOl5GWlo6Gh32Hg42Wi3+Df4N4e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hXXE1kbVVSbW5fb19YZ2VVWVRKREFLS0hGSEhISEJJOUQ/SEtUVFZdWlyTucC5vbfGwLu5ysu7t7q2uLmzuLW1rra2mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUj5aYl6ifpZ+empmDpJ2spKqwrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGyr/Jz7Sku7G1sJusub2afXdpW15aWFtfWGFiUVtgU1FLQ0JFRkU8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy0mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENERktPRFJcWWlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGDc3uKg4V7inSCioaVf3N7eWxtdXxpc2VpbGlmamlpYGZpaG1abXSXraS8h4dnW29oXVpZVEhKTlBKS1FMVFFITEFKR0tQX19iZ2pil7fHsLmzu762scTHtrC5sbC7rLOxp6u3rI22p56cp5pOmp6NjqCWkaeYpZWKk5OIkYmPkZGdm6GYm5WWh56Zppqsr6ivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc3D0dK4r8S8xLqmt7vEon9sYVpbXFdfV1hkWU9cV05RQ0JJRUNJO0FEPkFIPz9CODtEPkBJPTQ2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkJmDaHFveXmDoKqeppeNm5uYi42VkZqOfYmMhY6KiouQiHyEgnB/h4GGe4dyg5GLj35xeXVscHh/cntueHNsaYBwbWNpbXB5aXd9fsu/wt+nbWN4b2RbYWBKUFJVTlleUF1dTlBOVFFVVFxubneDcpauuKy0qLC2q629wbGrtaaluaesrqGstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEioOTlZiXlJuRm5iZmZ6eq6ykp6GsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRjxBQj9GRT5APzo9PT08SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd213cH1+gKGenqGLjZmTk4yMk5CWhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAcHdzbHN8fHd8c4J4cWuAcnJpb3F6eXN7vsuafoyxg3ZyhXdoYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqKeqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrYuVjZWZjoWSkJ2Xp7CioKCkpKjHzc/HwcvQ09HU0s7TzcbW08zU2NbW2NXX1cnU2s3K2NbRyq3Ew8yJcG1gXl1WUldRW09KR0pJSkA7OjtFQ0Q8Q0Q+SEM/Q0I7Ozk8OUdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCiYGdlZ6UhYuWiY6KiI6Ij4B4g5SZi42IiIuJfoN4c3t9g4d3gHuHkZeBhG94cG11f3Z4fXSGfHlsh3Z1bn12hHV5e521jDxBisalfo18amVXSUNlY2ZjaGpkb3lbX2Zoa25pboCEiJGMnp+gnpGXmJ+kpKaypKWzoKKlnqGpoKKxnIefkpKTkYuOi4aDj4R+nJyMjYKEhXqUfoKqlaOMkoqYkot9l4qakauzmJqbp5ynvcPFubbFzdHQ0c/L0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXRsYltYUVNQWFVFRkpJRUU9Ojc6QEFCOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzEqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXFzho18l5Gdi36HkoKJhoWKg4h9eYWXl4mPg4eGh3qEeXF6e4SGdXqGjo2deoxwfW9wen9ye4BxhIeAbo56dXd9fIJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBueHeCZWlvcnV4cnuLh46TkpuWoJaIjJOboJufqp+hrJyimpqfpp+frJmMmoyRko6FfYiHg4WLjqCZk4iDh35tmXmEmYaIk4yOlYyGe5uIk4+uqpSVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NbY19jX1NvX09nb1s/b2tHWyNXMk3Z4ZmVZWE5RUlxHQkVJST5BPj04Oj0/Oz5IPUBCQUFEQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU3RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZrdoCIcZGQm4B5gI5+g4KChX+EfH2EmI6Hi36Gh4B3gnlue3uGgnR6kp6NoXaPdoN0dYF9dICEb4KQgm+ShHV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoF3hqKQi3l5d3uDf3yEdm2UlpSVj5iRg4mPl5qXl6acmKCXn5OSl6OdmauWkZGLjpKDjIWJiIGGkJGenJmJhYuBhZd7iImfl5CJjYqLgnyhiJCLvKGYk5eZnKilpa2ep7W+wL+4x8nNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7cxoV4dmRmYl1SVlVUTEtETUQ7PT08OTo8Pjk+QTc+P0A9QD48OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47Ojo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1baHR6eWyJjZJ3dnqKfH6Af4B9hXt+gpGKhYZ6hYh7dX11bX19hn50f5KdkZ+DknyGfXiPfnmLim+Dm4B0mYZ9goqFfH6Re5CpjpDDoL2Mm6ScfoqEfYlyjIt/c6aanJmUhXuPkYmEaUdxoaSdjIuQkoWIi5GTlY+dm5OUkZeNjJWfnZShlJKOjpCMfpCPjouEiJKWmp+fiYyUkZ2Qgox/ppmIhY6DhYSApIaKi7iYnZGUlqGmoJ2dnaOutrq0q7/FytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d3dnVoZ2NUXllST05IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF5VWGZtbW1pgY6KcXN4int7f32AfIh7fXuLh4N+dYOGenN6dG2BfoR9d4aboZuelJKAjId/mIeAnJJuiKmFeqCLfJGOg4mEnH6akYmNo6KfkKSvoIuRi4aLgZKGV3Kti5+snI+DmJyQkI5bg6KRgo2fk5WMhoiMkpOMlJWVkIyPioiWm52PlZaRi5OUhoCLiZKNioqdl5mjooaTnZWgioqIjpyQg4iPgIOHhaSFi5CzmJySlJehoZ6Zkpudp7G4rKS8wcfNx8bPzM/Mz9fP0dSu1tXY2tja2tfW2dmdbXpyZGRaWlZRVVZDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Sg29td4t4en97gX2GfHt2hoWAc3CFgnt1d3Z0hIOFfX+SpqKfpqKXip2QlJeKiqeXcoqyjYSnkoSZlIWajKOWoJiTiZueopOpsKCRlZCOjoiVi26Nt4SaxMiynKKlm52YlpGxkGSkzciVjoaHiZCSjo2TlIqFioqGlpqbj5CUk4eVmIR/j4uZiI6QqpeXpKKImZ6VmomPhpeYioWPjYF/ho+liI2TqJqXk5eZoZifmZOcmqKytKWjvMG+x8XFycjJwsrTzM3UqNLR1tbW2NrU09rOgHB8ZWBbXFxNSVNYQUJHRDtBPjgzNzs8Ojg9NjQ6Ojw6NzI/OTkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBj318bX6IeHp+e4KCg392doCDfG1ui396fHh4fISHin6Lo7Ono6qzopenn6WklpWuooORuJWRs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJmXocCOo8m5q5ujpq2Zkpudsp2FhaiinJiFiYmOlY2Lk4+IgYaHiZOYlYyLlJOGlZiGhJGQnHWRmLKWlqShh52ako+KkIqXm4mLlo6HfYyYnomQkJyamZOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw7/GzcrJ0qbOzdPS0dbY09DYunB3c1peU15UT0hJTUVCQ0Q1Pjo3Nzo/PDw3PTQzNjY5Nzc0PTU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTltcWUpmYDtIhIt6em6Fhnp8hHmBhoF+cHh8fn1vco16foJ8eIaLiYaEkqe7rKiyva+lrbOzqKOhsKyKmrWdorilla2kl6mtuKelo5+aqZepo66wqpqZnJSVkZefl5q7u67KoWq2uKuwlJmfo6yTl72jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJKWjJCVjYuNlpiTnZm0l5WrnYqclJKOkZKMmZuKkp6Qi4mVn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKvCyMS1ur27xcfHwtGgxsnNzcXX1tHL06BueGZaWFFcUE5FQz48Q0FCOD84ODU/Rz08NjwzNTM0NTQ1NEIzOTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkR2JgYnBKP4uKfoFzhod9gol1g4qCf218fX1/cHeHd46Ch3uNj4yGjJmqwsCvvca7s7TAvLStq7O2jKizra29q5u7pKitubirp6aioqSiqa+ysaudnKSYm5iXnqKmpZKkuq+pwLytrbK5paSofoiGnK28sIOMjIuQg46DkY96gYeQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXjpGgkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6tsXEwr/NpsfEx8O81tHNxMqGcnBfWVddWUxKQUtARkc+QT9COzo1PkE9PTU8Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUdgaWdaXVyTjIuIe4eMh4OMdYaRioFvfnuBf3F+gXuVepKUlJiQk5Wns8bJv8LMwsO5x7y7r6u5u5izt7qywK6lwaSrsLy9q66ro6Oep6uutLCqnKCqnKGblp+wtaeLo7q6tsG8rKmcsqWkqJSFjqnEw6SCi4+HiISGlZSNeoONkY+RooyMlJKOiZefmJOZlZimoK6djKqcjpaPkpGVlY2QlZGPoZSGl5+gsp6UmpSfoJikn5qgm6CUmJ6lo6ampK+upcDEw66ot7XJwr62z7LEv8S8s9HKyMK0cnZqWVZZaFBMSEJMS0tKQUE9Q0Q8NUFEOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVlOZVxmVGNqmY2XioyIk5CGiXmHlJCBcoB8jX94h4KCkHqOoZaompqYur3HyMnB0snKws29wrOtvL6our+9u8O3rMKprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2t7Csk7GtrK2Xh5qpp6WRgoyTpZWJgXaKkXmFjZKQnp+Tj5SMj42Uo5mWnJSUo56qn5GlmoyPj4+Vloh8j5WSkqKalZ+hnLWlkJ6XpaOipZ6dppielpebpKOpp6KyrKi8wMSvpbK3zL+5r8Szu77BuKzCw8LAl2p3YFZVWllJSkxJRkRESENCQURMOjRESDk7NDw3RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmpIX1hhWmRkVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipCAlqGZrqakmMK9x8PHxdPNzs3LvMK3sLm8tL3LvMPBtre8rbO/uryur6igqai2ra6psrebnq2ip6Geq7e4qqWvv8Wxvbm0qKq1tK6vl5alrKigkY6SssWnlY59kpV9h5GZkKqZmJOTj5KWk6Wekp2ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+zpZahlqysqaebnqaXmJaXlaCkqKWftququrvDtKWztcvAuKq2rLK7ua6ouLq9uIFpbFhVU1NNREpSTUs/QUhFREhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PUBCRkJwRWlJUmViTEallJuXopeplo2Qg4emk4iCh4Kcg4OVkJCUj5qin6++r6HGvMTExsbOzs7Syr67trG6u7u+z7XDvbi5t7KxtbO4s6umnKusuaqpqK+vmKOvpKekpbXAsKystL7DusC6tKi5tbmzr5alra6upIuTlaGNdMGafZeZhI6WmoyxlZualZKSmpqlo5Sgm5eaqZycoaCZio2QlpxgSpacmpWapZZVl7Cfr5yepJSvrqulmqCllJOYmI2coKeimbSpqrO7u7uqsLLHv7mmq6utsrKjobKytKRua2NaWE1PSkRPT1BRO0hLSUdJQ0M+OktUP0E6PUVNMDc1NDQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRmIeLqJaOiJOFn4eEnZeOnaGbo6S1yLWpxrnCw8fKycjMzca+urOuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy6v6istre+wr++ubSzxLK5vayjr7WsuaaIm5emm3a/n4SZnY6TmZqLrpehnJyXlJqgoaiep5+ZmqqZoaeemJCNkZ2DbnaSo5qVnaKdkK6yoqqUqKqXqq2jo5+kqJGRmZuHlJyinpaxp6mruba9s7Kuvrm3oKOnqKWmnJutqamLYGNeXlBJS0ZHTUlWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVRXTj9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh/ZV5IRauVm6Gfu6+ZlJ+Mk6ubkZKTiauNhqKfjKStlKOjtsa+tMC6wsLHyMXCzcjBvrmyr7i0wcLKtcWywby1uqqpra2wo6OYqrS7pqmmq6qdqa+no6qrvryorb20uL7HvLe2uMGyvsG0qbW3q76lj6KXkqKfvJ+JmqCZl56ej7efqZylopucoZqopLOhm52mnKipnpmVj5Sbi5eJjKShlJ2inaC1r6Wkk6+rmauqnZ2jo6iQlJSfgo+enpuVqaShobO0urWtqLWys56coqWal5SZqqGedV5aXVxJR0VGTFBITUVHR0NTTEpCRUdBVlJESD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnHBiR0Wnl6SfnsOtm5elmJqpnJabm4+qlpWnppWtrJmiq7bEwry+t8HCwMfDv83Gu725srC4s7/DyLW/sLy3ubelpKusraGhmqqqxaKkqaumnqyvq6KpqL+4p62+sbi2x7a1ubjAsr/Ct7WztK++o5ejlpSblK6gkKGjpaOjn5C9pKmeqKudnaCbpZ+9opmjn6Kpq6Gdlo2VnpOeh4+EjZOfpKCetaylm5Wxp5mvpp2ZqpyfjZiUnoSNoJqbkqWkmpirsbWxqqWqraycmKCgko6QlaielGZgWF9cTkhHSk1LSEVESUE+UUlBPEdJSFtST0s9SE9VNEJGOT5IRzVDYVpLQ05SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTptUkY8S3hlYVZLopqjnJ7FrKGfrJ6erqCSo5+WpZ+mqqyXtrGjqrO2xMS9v7W/wrvIwr7Kx7W4tbSws7S3wcW2vrG4tbi0n6asqqydnZ6lpMGkn6qtoKSpra+ipqi9taWxvbm2tsSytLi6v7PEwbi4rrO1taOdpZWRlKGuoJminqioq6Oawqypnqytm5udmaagvaGdpJirq6ymopmNmp+Sn4mOV3+Wn6WhoLiqppOYtaOfsaCemq6WnY2Yk52Bjp+XlY6io5aQpq6yq6mhoaWllZWdmIuPkZKknolfYlhiX0tISkpORUVBR0s+PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJbTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTp6foZmew6ilorSinbKnk6uloKOframsnbuwqKy2scjFwcKywsO9xsO8xMm8r7C2rbC0r77EtLmxsLm0rJmosKmqmp2loajBrJussJyqo66xqaSovbant7u+r7fErbSzw8Czx7S7t6uztq2qoqaWlZSkrKKfn5qoq7Cvr7uypqCpqJmZl5OipLigoaOTr6+spaefkqGelZ6PkI2VnpqinqezpqaMmLObo66ZnZuskJ6TlZOZf5GhlY+Nn6GTi6asr6WmoZygnpKSmpOFi5GNnJ1/X2RaZmRKSUtKUkJDQElIOztHPzk5T01VXlJTSj5PXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MzUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoaS0qpazrKeipLKsrqm7sa2wtbTGwMTDtcDEvcnEtb/IwbSrtaiwuKy/w7O3rqy2uaWYqrKrqpifppetu7Sbp7CbraCutLKnq7mzqLq0uLK5wKq3ssS+tcaov6+ttrWpp6yhl5eRpqWiopiYpa+4rrK1tqCfqKSalZWTpKC3oqSllq+xsqeqpqKempqblpeon6CYoZ6usqKmjJeumKSql5mepJGajJOXmYWVnpSMj5ydk4uoqaqhp6CYnpWMjpmPgYWViJSed2JnXGppTU9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAyLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SXBoVkNXRox5ZkM7pKOdoqa/p6ivsKGptaudurGro6q0trGwubewt7i4xL3Dx728xMHGwLjAxcC5qbakrLutwMK3t6mssbqhlK2xrbKWpaeRqrmpn6awnaugsLSzqqm2tq28rbOzubesubDDu76/psOrsLeuqaurp56YmauhoqGRl6Gxr7OssLmanKmgmZaSl6ahtqmlo6KwsbSss6isn5ugoJudpZyil52js7Can4+TpZqfqJqTop6Ul4iTlpKVlpyTiJCamZSOqKimn6Obl5uTho6Yi32MloWNmWlna2BsbVdQUVpVQUJFVEA7O0hBNzpYUGReUFZXRVlfXU1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLi0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKrsKujsbiqpba0rKCttb2us7i7ur22tsDCv8jEucTCwMC4xL3Bt6+1p6u3sby+vrSorrG2nparraiul6aojqe7n6Sss56sorGws6yqtrS1vq6wsbWssLSywbvFt6u9r7G4rK2qo7GmnqWqn6SYkJmfs6qzq6qzmp2nm5qVjqCmpbSup6Gtra6xp7StsqqknJ+oo56VoZmbqLWplpmRkZ2ZnZ+dj6uelpeElJaKnZick4mNlpeal6aloqCdlZWXk3+PlIV7jpKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE5ZXUdbXl1OTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVRcZ0s2jHpmTECkmqGkrLalraqmr663qq+1u6emsbfFt7G3vcHCtbS6xL7MxrnCwLm+ucO3wLmxtKypura6ub60qa2wtZiYp6uqrJurq4+rvp6srrKjq5+wrbOurrayubiqrq6xqLWvtLy9yrOqtrWxtK+up6GzoJuoraCmlpaamrKiraClr5ehpJqako6jpqizqaGms6yqtqWvsbWvpJmdraeamJ+amau3opeTkY6XnKGXlpSrnpqSf5KXjJ2cmZaQiZSSnpmloqGgmJaRk5V5io+Fe4yKgomRam13bXV7YEVga1lJSFpaPXtKRkQ2QWJUaVtNXGFKW11aUlJSYmFMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRgVWAvNShDX1FcLitCL0pHUFtIM2NZVUtEmZehsaixqq2mpK+utqm3tbqkrLS3ybu0urq/v7Szt8PAzMi8w7y2vb+/t768sbytprq5t7bCtqqssLeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbizqa6rsqe3r7a0xMa2qba2rLCtqaejtqCgp7GhpJScmZWxnqecoKqOqaKem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCclIKQlI+cm5eWlYiWkJiap5yjoJKWkZCVdYSQh3uEgYOLimxvdnR7flxLZW1cSk5jXD9ie0dJOEdnV2VcTF5iTVhZV1RXVGldT09IYV1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkhmMjcnR2JMViUtQi09RUxRPDNya0lDQ5CZpa6lra+rqKWxs7Srt7K3oKu1ucm5rsC7wrizsbXCw87FwMG9tL2/v7q+vLLEp6m5r7a2v7yuqrKxm6Cnsa2mpa+lnbK1rKuxsq2qqbS7rLWzta20rKqrqKypua2yscjAuKW6sKmsrKWorrCmpaOvpKmcnZybr5qjo6Kjkayeo6CfoqqmprmkrLW2pausqK2vtq6jnqOpqpugmpqSpLOZjomNh5ChoJSMlJyfkpGDjZKSnJqXlZOHl5KVmaebn56MkpGNkHZ9joV8e3uGiYhwcnF9fHxcU2RuXk5ZZlxGRJZbRztObVhiW0xgYk5WVlVXVFlnXVFSTGNaWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLywxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg/M0JIUyw+kGs7R0iPnKqroqqxpKmls7SxtbWysqKrrr3Muq7AusextK20wsPRxca+wLK+wcK7vre7xKest6uyt7u/r6uxrJ+jp62qqKSwpKqyqq+ssK+wrquzvKe3sbKps6mrpaWjrbqsqrLDuratu6mpp6ypqLKlqaSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGpoqCsr7GsnqCnqKmZpJmZj6Cml4aEjoqLnp+OioyVm46NhIaPlJ+clJeUhpaUk5ekm5ycipKQjYl+foeFfHd+hYSFcnFwiHVrX1pgbmJRc3FcSzuEfEU/V3RYYVpOY1tOVlZVV1FcYl9TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxPF1KMC5KZ0RGODxCMDVFS1gxQJVaPkxFlZitqKKrs5yqqrC2rbm2r6umq6q9ybuwvbfCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKsraukp6qwqaeosaW0rqqwrq2ysbSstLykt7OsrK6nq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6koqukraOfp7G4rq6jpqKbqquuqZ2ipaSkmaCalo+YnJKBgo+IhZyfi4qOi5iNj4qCi5ejm5GQmouTkpGTo5mbmoqOi4t8hoGBg3p0f4KAfHJ1i6SHeGpeYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVVRPXF1hVUtNaFZVV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZXWi4wSmdBQTw8Qis6Sk9eNESGPkhGRJeSsKWjq7GYq6qttqy2sqymrKqpvMDAuLizu7Wmsq/EycvRv8C7ub++wbjBucDErbG1sbO6v72ysK2sqquntqqmra+qubCosbKusq23qre3p7S3q6ykqaqco56zs6iopLS1oLeuoKqoqqirp6CrrKm5tqmqqamiqqCtnJKqoZ2gpKKmo6qenae0r6imqqKjmKWnp6qco6SjoJqYoJGOj5iNfoeMh4OdnYaDioqNjY+LgoWUopqNjJmQkZGPk5+WmJaMi4N/dIeBfn94dIJ+eXZ+gIedj29xZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01VVFRQT1hbYlVIUGlUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDuWjrGhpquumqylrbC0tbCsprCqqbq+u8CwrrmuobevyMfI0cC+vbu8wr26w8C+v66ysrG1vLrBsbGyq7OopLWopa2zs7mxo663srCyu6u6r6qutqyqnqqsn6Ogtq2ooZ+ws6K1qp6op6mjqqGirK2ova+srqyiqKifrJmQsKGYoqCnp56nm5mqsaqjoK2ioZSjo6OnmJqppZiYmJ6OioeUh32MhoSDo5aEgYCLho2LkIODk6CWiJCckJOQjZGclJePioWGeHSBf3x1eHl/enNzeWd/hqR1aV5kaoB0Z4iMfVNYcF5Kd3NTZFRRXk1NUlpmTkxWWWRYRlNpUlE/Q05RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUE0kI+yoaSmrKSnpK2ntbOxq6Wwp6q4vsC8r6e5qqavsMnHyNHCvL++ub6/vMm6wLiwr7Sxuru3wLKzuqy4rKK0p6essra5s6iovbautr6wvaetrLWsrZypr6Sgpa2rp5yeq7OltKiaqqepo6mepKmoqb2stK+tnaqkoK6cm7OjlaScpaWfpJuaqaumn5uqopuTnKGlnpiXqamSmJqUkIqCj4V+joKAh52PhX59i4eQjY+Ef5Oak4WSoYyUkYuRm5KVh4l+f3J7en58aHh8enRvcHtnhHiEiGRhZ2FxhHptZ3hdXVVAVnpsVGJQUVhLTE5ydV1IWltnWUVVZlBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNBSjdHU2BVKj05RFc+Ko+UspqgoKmmpaGrpbizs6aqsaetuMG9ta+iuK2oqLDCycnMwba9wLW3v7nItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqufrbCjnKWoqqOem6Wxp7Cgn6upp6GpnKSooa27qK6wraCro6Svnp+tppefm6GjnJ+cmqSqo5ubpaSWl5Wfopabl6asjJ6RkZGLgoqAgI6Ae5mTjYh7fouGj42LioOSmJGGk6KJkpKHkJqPk4CIfHlsfnZ5eGN7enFvb3F2Z4BzaoNnZGdfbHKNbGFpb2BvPlp4a1VeT1BRSklNVFlXTV1ebFdEWGBPXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPiodNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPWVfREw2S1ZkTyo7Mk5YPSOTma2aoJinpKOfqKS4sK+jr7Cqq7jBubOtn7ivq6i0usjLyL+2wr6wtL23xLbDsa65srO/tLq9t6i5t72qo7Soqaqxrrqxqpy8vaWwwbW2oq+3taanp7GzoJ6kpaehpZmfrKipnqCqrqagppijqaCxuZ+jsK+hrKGtpJympqmampufpJWcnZqeqaaXnKCpk5mUmJ6TmZahqpGaiI6Phn2HfoKNfXygjIyIeIKLhImLi4WHk5qPiJWeiJGVgoyXjJF9hXtzcH1xdHRgeXhobnBwbmh9cWN7bWllYl5khX5fWnJqcUtKfmhYWk5QTEpIUFJQSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQyosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9YVjUol56nmp2WrKCgoaSiuKuypbS0qqm5w7WzrZ+3ra6tsLXGyMG3vsG5sbS8tr+7vq+qvbCzvrC8wrmou7q3pqe1qKirsa2zsaibvremrby3sp+xuLCopaevsZuhpKCkpKCXm6+noZ+jqK+hn6KUpKSit7ChprCrn6yjr5icqqSonpeanqWTm52anaarmp2dppeWmJSdjpOXoqiikIiLj4V6hH6EinqOlomNhniBh4OHi42FjZOYjY6WmIqPl36Gl4uPeYF6cHJ3b290X3l3ZGtsa2hngm1lcmtrZWhZYXN/XlprdWlZR3xdW1hPTkpISFJVRjI6Xl5sUERYVlllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEdCZ1tIVENUXWhFLjsxXlMsMpajopiVnamepqGjobiqsKG7uaasvcSzsK6ita+tra+0xMS9s766t7Gzubi6uLqurb+ztLivv8G3rL26tKWis6uoqrOsrrKjncK2pqm3t6ufsruppqWor6uZo6ecpaaUmKGzppmepampm6GglKWfpLmopKetpp6loaiTn6mhoaGZm52hkpudl6Ciq5ybmqKWk5WWm46Tk6OnpI+Iio6GeYR8hYZ9nIyJioZ4gIOHiIeRhZWTkoyQlZONjpR7gpeOi3d+e2x1cm1sc2J5dWhnaWdlbYRnZ2hkZmhpXmZiaWZaZXpiYFFzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FNJzKepKSSjqWmnJ6enqS1raiqurenrMPAt6+sobWup66vt8HAvbHBt7Cvsra1uLe1rKq8tK+ysL3At668vLGkn7aspqa1qauvoaDErKqnsbSrrLS6nqipq7GlmJ2qnqilkpqmrqOYnaSqoZuinZegnae2pq+praGhnp2hlaCmn6KgmZuanJKanpWmnq2imJeflpSOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36EiIaEkISWlY+PkJGQkY2Se4OVjoZzf31neXBramxndXNrYmdkYnR/YWRlZmVpaWJnb1leWF1sY2BNZ1daYFZJR0hLTFJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLDBBKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BjRiU1nKSgkYyuoJqYoJeltLKjsr63obHFu7mwsaO2rKuuqbm+vLutwLKvr662r7O5sqerubGvrrO2u7awub6spZ61q6ChsaWrr5+lxaGzpa+ysLettZ6srqyuopmdp6qln5Wcp6agmaSjqZyaoJyVnJ6tsKa5p66ioZqanpieo5qlnZaemJuUmqGSqJatqZuUnZyTjJWZjpSUmKenjY2KiY57gXSCgoqYhYd8iYiEhIqMiJKFk5ySko+QkZaOkH+BjY2Db4F/ZnluaGtqZ3Fya1toY2Fyf2BkZ2pua2ZqZmRsXGxtdnFgU2JoY2VaSUZMTU9YUVBVYWWBVEBWU1lVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIY0InNJOinI+OsZ2blKGaqbKwn7nAtqCzwbu9ubGmtrCprqW3ube4rLuvraurt6q0ua2lsrWxr6mxtraxs7a7p6mftqmdn6qjqq2dq8OZr6Wvsba1rKyesa2vqqKbnaSsqZyVnKeknZmpo6WVmqCdkZyjq6qpup6npKCXmpqdoY9ropWYnHGDlpykgHaRq6ielpahkYmXmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1d4uEf4OQgGaIgGh2aWZYXWl0bk5QamNmcYJmXmRmbmtpXV1eiZCFiGhPS0M3RFRnXUpIUFBVVUtIU2BvdGVFW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxT2E8Ky+NpJqHlbGbnZOgnKqtq6O9xa+pt8K4vbytp7axpqukuLSys7C5rqqnrLSlsLWip7i2tainrLazrrSus6Kpn7SrnqKlnKeom6++lainsLS4ra6kqK2qq6ahn5yhqKicl6Gmppybp6idkp6gmJCfqKqjtK+joqOclpiYl6OIoY+SmoahiJSeoX+lf6esnpSTnZOIg3J4jI6Dh6B1iI1pl4lmfnN5oG+Ih4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ11MWUtSUk9FR0c+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOS8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVVfNzAojaaXhJ2snZmZnZ+rqqiqv8Ousrq8t8C/qqS3saqsprO1rq+ztquppbGtpbWzm6y1trSmp6izsa2yqK6eqqGzqaCkpJqipJ2wt5Wlpqe3vaasp6mqq6emoqCZoKikmpmno6SZnKWqlpOjnJSUpKamobako6CkmJWTmJOciK6QmJWJqYuYo5yGsYCkrZ6Ump+VeYLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7B5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5XYU9WTkZUW1hRUFKLXFdbUEBcRVFOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaXDQxIY6mk4Gnqp+XnZ2lrbKpscK9srW/tbi/wqumtK2tqaivtKqvtrSoqKa2pai5r5yysraqpaSnsq+tsaarnqeksqSioZ+XnKGgsa6Vn6OgtLqiqqigrK2kop2bmqKqoJibqaCfmJ2oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWwa2qLjap+Z4WWh61lcZ6dlZqnlnGuoaR+d7p8a6GPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZKUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraYCSeHpqqDhKr1tXU2xjWkxPWF9cV1Y7TohPVlYvSVRTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMuLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWCraelnqOkqrG3rbS9vrC2xbK4usOnqbCsr6mpsa+ksbqwpKWvs6Opuames7Kwo6Whqq2wrK+mqJ+jorGco52YlZidnrCol5yioLSzoaqboaysn56al6Cjqp2ZnqWhnZqhp6SQnaObmKGgrJ+lpqCaoKGVlZGWkZqGtZu1eYWpmbWZd4ezm7d/k5aXq5Z+a4GmeoGFhpGUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgouXjIOgj4WwdnefcWtqbHyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbWNxfYaAYZ0vUqJuW1NrZ19MS1xjWFxaQj6wd1dYQSNNaEZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkBBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFVNTAclp+UiLOmpqGuqaizrKq7tsKwvMKtuLfCq6ytr66nrrOqoq+8q6Knta2jq7alpbKzqKOhnaeqsqiwqKaeoKCwlqCalpaXmqCvo5uapKi1rqGoj6mnqZudlpigpqmbn52jn5ygo6WjlZufmJqeo6ubpZqcmqKglpORk5OdhNWTmblxsMJ/xoZ81pScu3yblqaQjZyMpHqNhqKBpYJ6rHmPnVWve4l+n2q5Wrl3hYN9poKTfJh6qnmOnZB7sW2OhHSQu4VulVCvp8WKUaB6Y2CqYnNyhmyXh19TtbTIhYCJfGOkM0KddV1QamhkUEBYZllkYUpITWtKWlNPWWZaQ0M/RT8wPDw1OTs3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3RzphUDcyJZyikpixqKmls6qltKekvLfBsbrAsra1vbS2p7Kxo7GzpqCvtqmbqLquo7CyobK0saGknp6nqbGptKmlnJ6erJeZmZeXlpiirJ6bl6mtsKijno6soqeWnZicoaaimKKho6GboqKnm56gnpWZm6ahnKaUm5ufoJiQkpWQnYiybmi1cauIcI6mcrR0c7Z7m5iljY+cjaJ+j5+kfrB1g5HS0XVbrnyFf6Rum6qma4aFfa19l5mPe7Fzk52PeLNllnSFnm6eZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb7+AdU1LtVNVxmRUUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6inZGlr6ylqbqsprWlp7a7vLK7v7i3tbu7tKa1tKKysqOgrLClmKe6rqSysZ20uKqgpZ2hqqSyqKyqpJqdm6mflpWYmZKTo6qhmJOnq7CloZaSrJ+lkpShnKSnoJWbp6eimqOfrpqhnp6QlpyinpyllJ2VmaKelZmWkpuFrHt3qHajj4uHqW+tioOnhJqZooqSmYuifpGXh66Ff4KzXHKzUq59goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrJfQlRvXWdgRVBsX3BtVlVNLmViaFNZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQ2BJOjc3oJ2ToLixmLPBrKiyp6qyuri0ub65uLO2vramuLSgta2goKmsoJWntqyosbGrrbSkm6mfoKiitaemqqOZnpWlopSUnJqSlqOmm5SQp62vpaCUmKmfoo+RopqppqGVmqapnZ2knq2doZygjZSfm56gmJiclpehoJSYkaadhql9faV5oY+Qg6pwrYyBpoaWoKKKl5aIo4GQh5Sqe4CLnXlvsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpRtk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpJYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RklfQzE9N6KcmZm/rJizwq6rraimtLC4sba/ubqzsri8qru1oLGln6anp5+UqrGpsKq2raqvoZihoKakpLqio6uhl5uRo6CVlZ+blZigoJCOi6mwr6adlpqnpp+NkqSYqKyolZipqJ6foKSto6GeoY6VoZifoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4qmc7R5dLSBk6Wjk5yMiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHSTmH+yaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj5tbzJCQkA/TTkhN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjkxQTilmpyduqKcsb+uraurp7epuK+1wbW9srC7uKvBtqqroZ2npKKdkqurp7ajs6iuqqGXnKigpau5naOtnJaZkKWjlo6eoZyYnp+Rk5Wrtq+mmZObrKmXjJSmmqWto5GXq7KkoJ6oq7CZoaKQmaKXoJuWm5ehk5ypnZSQqpmH05Oau3SxxIDDhn7Vlpu4eYmRmI2XiYynh3mitnR9d3bCgpqyYIO6ecB8dbhitYGMh6l9loGsqXF7f3W8iKegaZ1hpo6von6MdIerfb5uc7x0soN1eICKbZqIcW2NpHS9XXd9W2F5vGpaVltpel5pYWRmYm15b1lbWUNBQHI/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU7TFstNkA5p5mforyil7HCr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKGdnJGqpaqypLWnraSglpqrmaesuZ2jrZmVoZCmoJONnKOemJ6akJaSr7mwq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKkjqeilKGam5eVpJiPsKCSlamfhZCZtoCRkY24lXiCk5u1d25sbnNveY+EjolynsG7vJl6gbKocIB0kbmDe4aGioaNe4qGjZd8pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnB3toxef3l9iGeDeW15YouscHSFf1hbp2lEZFlUZl9jXWNRZmZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppazwrOrqqisq6q7r7HGr7W0r7intbmuq6Sip5+gnZmUrKSuqqa2qKifnJago52spL6noaqXlZyRopuSj6GooZOel5KYlLK1tqyYnqOkoouSkqacpaudlqmlppyaoamnpqOooZKsnpeinpeWmJ2ej7Cpk5ynoo9rfmmcqHmIc36bjnV6ZYd7vr/Aum6SgnGUhV9yalpdmolhZIeOlWtgf5RjbZt2YpRrgJqVlGVeX2Jxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZhTFtXZmNeT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1REZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5bTyc/Mj6on6ihwaSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopumram+qKillZSblqCak5ilqaeRnpCPmJywsr6sm6edp6KJk5Gqm6iknJysn6Oam6OnrKGfqqKarpuVpqCWlJ2fnZexpZmiqJmckZ6co6Wap6OanZqampCWgmhufXF2kZeTkIOJtKmNhZiVjoqMmJaHk5WJg5OTkIiNkZSZk5mXmqChmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnWKgHuJanOBdIN1ZHd9dmtwemxfYltvZ0xYWWVqX1dZcHpvbWZTT0ZSOU9aTlJPKCs7SkI2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCXraqmwZ+rpJaSnJeemJSUop6eo6iSkJmop7LDr5mrnKqej5eWqZ6rnJ6hrZihm52ipa+loaSonquYl6admZqhnp6csKGdoqeVmJSZlKGjlqSfmKGOlpSLio6Pl62Pe5WbgpGAiamohYCYloqEjp+Ie4OQhYWakYaFiZWOm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7j4p+d3l6b2d5kIGAiWt1gXmIcmlzf3l1g4eBanRjeGZfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15dXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++rKutsbKgqqayraKss7DGsKutpLOvvKS0nKCnoqGdmZeopqmmpKaztZ6UlZ2ZmbCmrr6gq6KRkZ6amZSSlqGcl6mdhZ2prKK0x7OfqaSqlpaYmqeeqZygpauUn5+doKquqKSjq6Gsm5+foJiknpyfnLCkmZ+ok5iZnZKlmpmpn5uXZoOSfGV+j5qPY3iMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoY5qZ4yXkaJ3a2qLmKKemHJrbnqEjIZ5WGVdhYJebIuKgnZbaHN3d5GAh4JueIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXl9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0kuNlpPNilFWS9ETzFZQjs/Lj2ln7q8ua+ssrCrpaitrrCnrq2wvbGqqKWtsLCfrZigpJ6impqnrJyso6aoqbOunpajkKOwpra5pa6jj4+aoZmTkpugmJmmlnulrKKos8O3paKnr5+elZ6jnqOdpKqokp+hnqCqr6mpo6qep5umnqegrJahnKWxpJicq5ahn5uTpZifq5mefr6DiHK0coWeha1od7nEuHGSoaN7ppiYc6qCfMvAwLtxiqOHgp58lpiInsC9gpadnYycwcB7gXqRjJrCv31rpbJvjIFvynp/m3eRg46AdnmBf3lxe4CGcHiFjJN5bHWRYmVeeGNeZYFiXnRobWRiWExWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19gX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SFtMKiNDUC8jRlszUFkvVUFCOy84lqK4w7Swr7+pqZSjr6mwr62msrWvqqanpbGroKuYm6KgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2lkpGgoZeboJ2Hpqqkq62/v7Ghqa6pl5KfnqKZo6Sqo5OgoZ6drK6nq6ajoaWfpKScraiRpJupraqcnaudraKXmKaXoqSYnX/OlHl6pYF6lpabX62PXY6ogKChfKeVmnSrgoCvXmSMqXqoh4WfdJeSiLNjgquGoI2Ns2qErnN8loe4YYKtWaPNbpB1e9t7f5lxfoiSdX9le4h2dmx9h259hZCRfWuAjV9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD42O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dWldPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMa3Bv7+0tLC3mJ6Ro6qprbSrprKtrKykrKawqqGnm5qmmJyir5+hn6ino6Whn7Csm56Wpq6tsKuorKCUkpufpZOQn6SXnaejnq2jq7Cov8azqKmxrpaSnpyil6Gqqp+VoZ6dnK6upqmom6Wlo6GqkqyzlqWiqqqepKenorGik5unm6GblZSRl6BwhYyYdYSoh3GwfJ1yrH2gn4Glj553q4J9rX+ccq1+q4eGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHqPb5LBfYGVbXVwjG1md2WGb2F3bnJuiIqRj4Nsj45kbXN1b2BmbWRfb2hqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08XGsrOgnaOOo6Kira62r6mxp6iqqK6rq6aio52ao5Wfpqufoqagqaijn56wrZiblqinr6yop6mel5Wao6KSlKGsmp2mo6+so6y1qbnNsq2mrqyWlZydopmfrqydlqGZnp6qsaepqZqpp6OhqpqvsaKorK+mmaarqquypJOYpKablZKFpGqkdYl6qXV6snGCpYmYjHCHn5qHpF9gUquEf66Cm3WugqeGhp96mZeFe2aAo4mkmIaBo32pfoGUhq5ee6hVnaKSgXqjn4B8w6/FjHOvtLO5cWKpr8J0aIyMl46BbJiRbmx4eHdua2ZkZHFwZntpY1xWX2lYWFRMTFFMQ0NBQjtDQUBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAoJyIrLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1cChmauooa+in7C1sK+praOop6qrq6mkpp+bpZ+dpqempJ2smqKsoaOfr6Oem5OqpLawrqCpm5yXlaajkJqip5+gppuxpqOosay2yLK1qayqlZGcnaKZoKW0nZqhlJyfp6upoq2Zqqehoamhs62iqrOyopyqqLCwt6WUl6SomZ2SfKpsnoSHdat5fLBugqSLiJ+WlZ6VgdK3tLjJgIGyXl+UqYOkh4egepiVmXiqyXOZo5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eCk2SOj5ySe2+VkH1ueXR8em1bZWpycWaBal5hWGNtXF5ZSUxMS0VEQkI9QTxCP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrqylop2yuayqoaabqKaqrKmmoKakmKujn66rnaahrJqeqaWdprWfopeTqKu2sqybppyglpClrZKanKaioKqmraGip6mwtMKxsqqtqJSJmJ2lm6Kkr6aXoZWZnKWlqZmunKympZ2ro7asoLG5sJ6cr6i0tLSmlpippJuhj4KdTniagX+feoSjfIKkhIamnpyelIS4e3x5uYJ/zMbDtneboZCLn36alpeJdp+XiqSYpKd+r4Sbg56ErH2ZlGGlbKNwj4WQgX2XhHKsYKRycYCaYLx9UlV1jpGjlnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSTk5Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuhrLO0pp+hlaWvrq6ppp2lpZqjp6CyrqKpp7KgmamklKO1o6OVl6KqtbmknKOdo5OQobKZnpumpKCir62co6iitbHDsa2qraqRh5Gcp52jpJ2ll56YmZmlo6eYraGso6WXrqW7rKG3t66enrWzubK0qJmfsaKln4eP0bXDt3mHjoWRk4+ApniUoneLoJKFpYKLcauGhbRucmmZo5yViZ98l5mGh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicXF/n2Jzsrhod4+TpJh9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1QzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq2/v7y7tZ6XqKSttqGjmZWjqaeuqauZpaGepqGgtaeiqaewo5Sro4+kraOdkJqaqrS0pJ2mnKmSlJeuoKCepqOcp5y1maCqo7Wrwq+pq6mijISPnKKgpqOWmpqcmJuYpqOll6mmrKGkm6ymvayUvrCtn6OwtLustaidqrOlqZl7qJF9fLB3ioGkpYicbbJvoIete6GPg6iWmYCsiYWuhaCUqKGil4WfgJmVgHuSfquAnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWtxhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBvZ2doQllfWz1KUzJUOEJCQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTcwNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySmoSpxsO2wbSfmq2grrilo46apKOgr66pn6Oena2Ynrmgoqugr6qarqGRqqmllomaj66wrKagqJutmJmPraKhnaWhmaScrZefqKW2qL+upKmjn4uAjpubn6aekpSZmpSamqSjo5inqqqhop6pqL2kl8Osq6OirLO7rK+oorWxqqyZdq9+kIqchYd9uq2JmGSwjGWVrX2hj4OnlpuBrIqEsIWmmaOhopGFoFtsaoGzYH+te3qCgLFsZ22Zl4uIsVp9tFukg2vIomWfgXu8WXa1WrJ9Uq+AeqxYgKFtl46nmYmVj5OUeXeMm3xjc3xhg3hzf3xgaWZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Sxt727tMGzo5ytpqW2qaCLmaCfnbOxqJ6in520mKCzqKqrnrCtnqybla6ooo6Im46vrKino6iZrpOaj6maoZ6lnpmjoqWYnqKpsqi8r6Wonp2OfIublqGgmZCSmpuRmZeonp+Xp6ylo6SipKm6nqDGp6Wpoay1t66vqKG9r66ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEp5idgqyKgq+Jp5yapauRftW9wqpipL+9fX6jgoPXure1hZOSgp69voRqo4Fvq4RunX96srHHg2ursL2seHeivrt0gJWNpZqNmY6Umnd/j5l4YXx5Y4xneIF7YGtlamliUGJbU2lcQFRgQkwpPDo1Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqals6adjJilv6m2sKehv6amsZuesZy5qJ+trqWnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2grKypuK2no5qXk3uImZKmm5OPkZiYj5iUqJmelqinnqmmoaKrup6pxaOhsKSrtLWrsauivaqwsJx0dqqkt4VliZ9wZ6yPio9ub3ekkJqggXWwmpZwkI1ylqijm5iupHJsbWxlinhubYKZcYB6aXBpZomVlZdxaGmFhmdwhmRdimNpb1ldZ354pmBico+Sb2ZkgI2TjqGWlZaOlJt6hY2TdGSGd2eManh+eGRsY2VsYktlV0prWTpQZERQJ0o6KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6epLOqmJK9scPHvbSpnr+rrKOgpqufuqOkraytpY6WraqQjIWVl62fpaqin6SjoJGLpZKnmamZlqOqoJacpaanr7mqq5qbk5J7hJaOppeOkZGYlI2XlaaTnZanopmvpp2irLmfsMKopLSmrLGyq6+tqbqlsLmXi6GppbWciZaimIapmpCUnZKqs5mbo6yhtJejoZ6hopyhpKGVrKeMkpOMh5KcnJSQmZOYkI6VhH+kmpeVjYuSkoqPhoR+Z4uAdIN2dIeMcadtfJWSlJOBgY+Pj46ckp+UlZSegIWSi3BnjnZuiXd1fHlpa2Rkb2NVYFhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKStn6C2sZCOqsS7xLm3qaGlnZulnbCoo7annam1pqeRmKyji4iJj5ynlqyjoZqonp6TlaOXqJqpmZSmoaOPmqeZobS5p6qYmpCNfIGUjKGUipWRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6qq7W7orG+mZKmpKa1opKdpp6NqJ+MkZ+jrLCaoaSyqrGZpaGdpKuenp2cl6yekpqim5SQlqqZjZiYlpCWnpGHoJ2VlIWSjI+NlYuBfmaNh3WHdnmIhHScaoeRlZWSiX2MlpKSl5GgkZqUnoKGloV4cZRyeIl+cXt+aW5kXnBpYFtfWW1iUGBkT1k5R0ZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjl5Wkp6Ows6yuo6mnraCotaqQj5yjsrqtqquhopl6nKKwpKWxqZabuKajlJipnI6GiombopCunqSWqKChkpeZm66LqpaPqJmojJiojp64tqOlmJuNiXmBlIybk4qVkZOQjZGWoYucnKednrejf4OvtaKwsHSkv6SyoHh7oay0vZZ3rqWgioCpfmRcYnafjqOdg5Z+bpS0nKOor6ykZZ+glHR6mpdwgJmpmGyAo6iKZZylnJCXmJaLkpuQhJ2akJSDkoeOjpKJhXdrkIh2h3F8hoGAYWmJi5WTjFt2lZFnaI+McXmilpZkd5eGgHaXaIKJgm55fmpwZV91b2trZ1xlY2Fhb1JaPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZ2dYUUk8REc8OVZSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6mlqa2kp62kkpaqtK6xpZmppqqXc4udr5+oq6eTlrifoI+cpJ6QfoiImp6Nq5qklaeino6XkZ6FdK6PiKWaqJGWo4ibubOnoJmZi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6nonuksLmCjo+nn4SLhY+xqa+MiZaimXmAi6yGnJ2iqKupiJWHmXelm3qHnIGXp4KBe52yeoqGoJeZlJiWgZCWloSZmmN5h5CEjY+Si4NucZCIeoFxgIGGf4Z0h4WWkniWaJN0oJp0e5mCnZqEmH2RiIGCmGmMjIRqeHpwcGdkeG1pbGpcZGlpZXJbXEhUTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWhmWVFIOUVMOz5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKOfpq6uq6isoKiwp6eqpZmUrcW8r6CVpae0nY+DnKucpqKgjZC+npmNn5qhkHyFjpmYiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4m3hY2wg7KwhamOp5iNnXyoj3J7d5uOpZZnlKR5tIyfn6epk5nCgn+riJihcZ6AmqV9l4WVsoChfaCTn4+Yl4COk5uJmJKLfIWTho2Uk4mDbXOShoB7coaBhH2FdYaCmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsWGZGXFFMMkU0Nk1gYzcmNDxER0Q6NjM2NTg7OD49PT5CTD9OSUpLQ1BaXVxXYl5qbFxRRT1LTUBKZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZein7Coqailq6CkubGpq6aalJ6ipKqilaSptaKvf6CmnKWenYmUvJmTjaCRnY95g5aWkYirmZybmqKFj4x3m5yOoJGInqSblZiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYaCoI2ssYikjquajJp+onWAmJNrgap0TKp4h42dkpupqYKqq36EoXt6p2mef5JsZ5eGmLaJnn5uYGNYg5d/jHtkZ4tzmX15lmtdfJduX1NxhVxgbHmDYFllgn6EgZhxp6prg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqbl5qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJMTUJKW11fV15fYnZgTUU6TU9NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiWnaC5oKqjpqyRoba8q66imZafoKWrq5+crbShp5Ggn5+mm5mNmLSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqyjh5yRipipmJmakYelsKailZmIiYBpboiHi46OiYuMkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OiqICGq6+GpXqLfYSafaJwcpKHlnudjHlth5uLmZGcqZyPh518gqJzdqZmnn53pF6Ye32Tc6JumLe0unOSiIGAtqhkgca4e3CVtoxxgJukY3Ssq2B9ap2zfm59h4OPgouXcYCjbHOkc56CfaNenJmzlm97l56zdHJbnrKCaWJvc3VxaG5Ya2tycmRbZ11hS0Q9RDVRQVpwMjxSRl9KUz08Mzk1Ojo2RDs7QElQP1RNTlFARV9eW1lYYGB7ZElDOExXVVZiYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKubmrGsqpKXoJigpJmalJ6rm4uIkXiLhXCAlo2Kj6GQk5Sdl32Rio6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLj4+JjpOegZWbn5ygn4uJd5yYoo2gcqKLiKmInKeRl6msgK6MfXqgmXmjk3iAc5eIi5x9lZ+Gm46ZnKeHo2ShfYmWkJuMbJ5omo1umpl7gIqnfXJnc6qDnYJzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMXqd2domKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmRWYUFQRU83VkJSbTRKWlleTlpEQDE1MTs7N0g/OkNHVT9YUlhdPkRiXVZgUWFkfGlFQjlOW15ZZGZYZmdubWJiZV9hYV9fYGBlY15iZG5xYGRlZWtkY2loZ2tplZyJqrabqIljlZysurKwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBxe5eIjJaWhJKUmI96ioSWo5yJlY+Gi52RnJuIj6iin5qMkYqAgGmBhnl/lox7iI2Oh46VmX6SoZ6gopOYcmifiqCPjHCSjIKpiJmgpKmiqX2wraSiuJd2o7Oio3+IlHiceqqZf6KPnpyYiZhyoX2FjbC1fWuakaF4fpi0o6OrqISYe5p8nJp+c6paXW97l4t4nmJMf3t7hWR6mEJNn1mianJ8jm6BioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9raHV7YmNfUF1WXFRWQFlFUWdFUlZcYVhfSUQ9QjhAQTpJRThMRVhBVlFaVkRGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumYRTX6GntLqzs6iaoouaqZucp5Kgq6Ogp46enZyamZWYoZ2Wh4eJd4WBbnmVhZCai32Rk5aIcoCJkqCbcpKQgYiZlJ+ahI6om5mVi4qKfIRshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKWnpGLop5+p2h3bX6Zc6BzcXydhplvkoKtfKODp5+bgaRwXqlodaNjb6VhnNOPfHqZeHJzY6KFj36icqKOdWuPs4tggpiKc6qyp7x/d4Ntf7+mqrRenG9+cpdvgXOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+Ea2dmY211d2ZfYVFaZVBRYUhXSVRfV1NbZGpbZVFFQ0tMSktCSkU4UEBQTVhTWE9SUWBlZWlSZHh5d0lGRWNdZVpoalNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+wrFRcS36pr7K1sLKjnJiEl6agoKOMpKefl6iJmZeYk5mTkaCXjoiFe3B9hGh9j4OTmoF3kY6PiXB/h4+TkmyYlHyJkZKjlYOOqZqTkouFiXmDdoiAboGehneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ2TfaSAopmGmHGehKKtromXi3+MpI2Vg6+ilXa1trXJonSUi4KeYZ6XqW15lYagm3Whh3egfZCWioFvTGajknCaiHOle3l0YoOCbH6gbHJkYJxyf3SXa3tqtLW0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15pdWp4h2ZrZ2JzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1KSEpOQVFKUGRjaW1ldHJzfnh7bnWJentUUU9tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlopyIr6eFZj+UobOsr6+1oqKPf5anoqGji6SmnJulgZqXlo2XkI+bk46Ig3lqeYZlg4x+lp95dY+IjIJphIWSg4yFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxxpXicmHBop4KYjXykeqCWg5Zyn3aAiZSVj7ltj4qiYn2ZopaJbnNqq2t1oG1vpmCbaYuQaZaHmpV1ooB9ml+LhYx1b4hiaKFlnn9pm3VwZGeIgm5yolpfW2Ohbl2JjHB7f3RyZKVueKJkZqdol3KLmG6hb1KIj26gXmSnVItdVJhtbXJqcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlBSRVZcTFhSYVVoal53dXp8cHx8coJ7f3N2jYCDdl5Rc2FmYnFnUGtoaGtsb2hkZ19dXV1gamJpaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZmhoYCVmJONmo+Ll5COi3uGcYCIaIuKfJeac3SJfZB8ZYKHlYqJlpmCfIiFlqaQgaGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6Rg6+Xn6V5l4l6qXSmj4SabqWijJKEjIO8bXylr4KHhoeUl52hfaZ7cqiUoJZnnn5vrGOWipWSd6hsqaKBiXaHgnerkaaIa5Gwa3azjKlsi4Zvb6CekZRhf6uLqneBf46nn3effYWklZ2gaZqHdaxmnq2MtnN2voyjk1mDpo2rYHVxc297dXBian5uZ2xTVVlVYGBcakxcUVxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e4yBgoB2YnlkY25zZFJsZ2dvbHJpZmlhX15cYWpibGx6b1xcYmlhbWl3bWdsbmKVpqqcgYCepJaqqp6op66jmIiBlqqZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhH2Xk3N1hnKRg25/i5KGhpSPfXuChZeljX+lpY2AjYmElHWCh5JvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gZxxj4Z5koyFgHtyp4xxfX16l5abhI14e319iJSVk4t3kZmgoYR7folrjIVbeXlzeXBpbn6SinJ/dIGPlJNxhYOCZY1/X4GAjHd2dJR1b3tvb4luhIZed2l4jmaCg4aPqpx/dH2XaomIb391fIR1bWxmjHN3e5d3hFpqV3mPaG13cnFvd3hvXWyGbWlnVlleV1xka2RVYVReUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYF1f4B/gHmLhYJ9e21/bGR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW5qaeLoaKbpqSZpJ2rop+Dg5aqkZ2giJmmmqiYgoGbi36WlIeOiomMcoJ8j31+j4R6l450coRwlYZ7fZKLhoaQhXh+gIaYo4x7p6CLhY+PhJWCho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOnkHhxnpODe5Nwf6mGcH2VcWpvfIGfi3+Rjotobl2EjIycnKCPc5aMiHF0a4J2dIBZcm6GkYJ+fotpXWljeoWDiIBfaXh7nHyDjYN2gYeDaXmMiGticXKDd19yjYKKkKiWh2eNj4Nud4uCb4OLd25kZmN5gnqVWltpZm12W3p4d3Rtc3KCZlxtimtrYllYXVlYa3FbXmBZXl1lcn16c290Y2pqaXt8cnp3dGRtdGhse351enx7eXl/gH5vhYmEe31zfnlyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMqrGhkKOhmp+emJ6ZqKKhfYKWq4yelIeaoZCklH97mIR8kpmIiIaGinJ9gIt2hYuBhJaKcm+AcpiHg36Sg4SGioF6gIOLmp+PgqaghniNl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaqoqinoZOciZiQfHmPj4Wofn6SkZKTnLGlmpSdj42xkpiEpoyMlpygipGcg4mSimt8jnZ3ZYKGkIp9iZ2Eh4uPh4iAhYSQd3x7dZujiYiLn4uGlX9+jYKBdnF0hoV/eImIi5GnkYSHjoiDjJCLe4WJh41/dWqBg3t5mWlxaGBzinB9end2b3ZzgVxeb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coGAd399f4R7bYOMhnx6eHx+eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5aioZiVmZiUmKSgnXp/mKmNnoyFn5yKnZZ8eJSCe46ZiYaDhIdteIGAcoCHfoiThG1rfnqXh4SDkH6AhoSGfYeDjZudkYapnoJyio+FkpGLnJF9jXqpg42Rl5WOnJaFhZumn6KanYaDkpqZmZCZpqCmnp6Ql4KTi3h9iI+Fpnx8j5CRhZipoJyTnI6NqY2RgJ6NiZSboIOPl3+HjoNweIZxdGF+hI+GdYyYgIOPgoaEfoWElW55dnWTo4yNhpuFhY51gYx+fXJzfImEe3mNj4WTqJCHhI+Cg4mJiHWEhoaJem1qfX96bWhrbGZeeX5nfHt2dHV1endcYHB9bXRgY1pbXlFmbVNlWl1hamh1en5wbGxjampngH9rcn9ranNueG6DeW6GgHaCgH2FdnKCjYd+e3p8f3uCi2Bpe2t1aGmDZWpjYGlbY3Vob2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+SkZaXi5qfnp16d5ylkJuJhqSUipiZeHmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh3yPgI+bm5CHppx/b4uKjJKGoKGKhYx8p5CHj5KWk5aSdoyjoKGdlpp/gZCamZONmqKipJuYkZx/j4Z6gYWPiKGAfoyNj3yXpKCgkpmPkKaMj4GbkomUmJx+k5N+h46BdnSCcHZgfYCOh3KKlnyIjHGMfoKFhY9peHJ5jZmTkICYf4mMc4OJfX1xenyMhXt7ko6El6aUjIaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8c39qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF9gXR2goyGf3x6gIF9f49qcoNudGliiGlsYl9xVXRvbW5geGhsV2p0dmN0enpxYmtveYmNn7OSpaWcjpCYj4acoJqbe3Wjn42Xf4yhioialXh7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeLgoqNeH2AjYN5loCVl5WNlZ+afW+LgZCThqWbh4yJg6aVhJKKlZeSkXaQnaGhmJSYen+OmJePl5qdpJ6Zk5Sce5GHhHiGl46efoKKjoxzl6KdoJKYjY+hjIuDl5iDk5aaf5iNfImNgXdyfm57ZIB8i4ZwhpOAkIJrh4OBgImFZnZvfYiTmY1+lHmMiX2BiX18coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCCgn90fIOMgYB+eoKDfnyQbXWJdHRtZYpsamJjdVaDaXBuYHhnbGFqdnBleHt5cF9xbIWFkJ2umKaono2Nl4eFn5KWl3x2qJuJmHmWnIuMmI94e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9fop/fpeElpOWjKOgl35xh3uTkYqmj4yOipKgkYORj5OXkIqAjpegmpKQknSAjZKUiZ2dnqeZmI6VmHWPkItthpmQmnuHiJCJb5edmaGTlYqMnoyGgZOcf5OTloeaiXyKioF6cnprdWx8f4t+boWSg5R4b4KEfn6LgGVzan2Bl5iFgI50kYmEeYh+dniBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbF95dHhwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXVteXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGinqDfXqBhH18jnJ5i3l4bmyHa2hfaXJjh2hxb2V2Z21sYXpoanx7d3Bhd22LgZmaqqCkqJ2KipGGip2KlJd8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+RhpGRm5KkmpOBfIF8jYqSo4iNio2Xmo2FkZiTlY6IiIuSnZOQjI1uhJCPkYmemaKhl5eJl5Jwi5uFZ4eaj5R7iYWQinCWmpOgkZGIipmMgn+Sn32Sj5OMmo97ioWHdHN2a3FudnyLdG6GkY6ScXSAfIGCiHxlcW16fpuUfoWKdZGLgnWJem+Bf4GIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXW9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmRpZ2VpZ4B6d3VujoVzgYGDfHWCiIV4hXx3g4V6gIp3f4t7e3J5g2prX3Boc39rcW5tcWdva2V7Ym5/eXdwa3Z3iX+jmKKooaabiIyKgY+chpKbdICplJGNhqCMlZOQf3N7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkZyXoJOWd4l+gIyInJ2Jj4aSl5aFiJSYj5aLi4yNjJ2KjpCEbomLj5GKnJahnJiWhpiJbIalhWeHnouSf4yEjIF3k5iRnZCQiImUjX5+kJl8kY2QjpqSfYuAg292cGxtb3B7hmlzg46YinB3gHWCiYN5Z3NvdoKbj32KhXuVknt3inVxi3yGjXuLh4WKj5yliXyEdoGKf3d3bGl+gH9ccXJxb293WV1vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmFda21kYmZrkm1gZmZfZ2uBdHFyb4uAdH+CgHl2gIuAeYZ/d4eGdoOFe4eMgHt2in9qcWJ8YoV8b3BsdGpobmx2d19xfnh7dHVzf4J+pZWarZ+nloWMg36WlIKOnnSKn5OShYqajJWNi3pyd3SCcHKFc3F1iGxubHVtiHeDfX9tblVRgauUh4J4gHZygnmCoIKRgZKRl5uRmHeReoKMkqSak46IlJiSg4aWmIuTi4iOj4iehJCKfXOLhYiPiJyZn5uWlYCUgGmHnoloh6GIk4WRhIpxg5GXj5qNj4yLj413e5ORe46LjZKWjXyIfIFrd2pua2xten9ieX6OloF2eoF3g419emh1bXWIl4yAiYd7lJFye4ZxeI57i417iX6EjpGfn4Z9fXiBinx2b2hqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZnN1aHFsYXdlXVZlYGBxU1BOW2VkXHhwiHteXGhxYmJlZZFpX2dkW2dvfm9rcXOKfXZ8hYB1dn+MeXuGgHiIg3OGhX6MjIR8eZV4ZnFqg1+Hfm9va3pgaW10f3Rfc3x4hndzc4V8eaGQmrGcpY6Cin+CmYh/ipx+ipiSjoSIl46OjoR2dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh6jH+IjIqcm5yblpR6jndpipOJbYmlhpOJmIOGY4yRmI2UiZWLjImLcHqViXyOiYuTkYp6hXx/bXxlc29rbHp5XIB5j46Ae31+f4aOe3ppdWt0jJCKg4aGfZaNbH+AcIGNgI6JfoR7g5GWm5uMfXd4go94cmtlbn2Baml0bmdoc2xTXm9kcFpfbHJ3ZmtrYmd4c29xY193YGFVa19edU9NS2BlY1x5cYp0XFtldWBhZWSOY2BmYlhpcnNta3F2i3x0eYaCdnd+i3N/hn56iX9yiYeBkYqIfX6ZdmVzbnxlh39ucGuAWmtueHlyYHZ6e412cnaKdnmfjJuvm6CQgoV4iJR+e4ichoSekI6FjJeEk46HgXR3cHlwboRvbW5+cmNkeHB8bnp8amhsY6Sawdyu76Jza3WDdYShhJFulY+Un5OagZFwhYujl4mOlYqQnZWDgJSPhIiPgJKKipd+h3t1f4l4hoWOm5qXmY+Qdot3cIiKjH6MpYWSip2Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkY+GdoV+fmt9Y3h0am94c1iIepGHhXp/f4CFjH56ZnRqgYuPi4SEgIyYhmyCd2+JkoORhX+Ce4GRl5SbkXV0eIaMdXJwZXN3gGBzbW9haHVmUmBwZ2tVX250eWFyY2BpfXFybltjcmFjVm5aXHdMTExjZWFddnOKbVtcZHheYGRlhF9jY15ZaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eIaMaHaAiXGAnYiZp5yjkoR8cIyUd3iJnIOEn42OfJWMf5mHhHtyd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2xzgHaKmoiMaZePjpyTkYGIcIWIoI6EipWKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaHf3GGg4qImqSElY2fhIlhg5WPhYiFiIyGgIdofZR/fYKFiY6PgnGGf39yd2d2cml0d2xajH2SgoV9gIOAhIqCdmJ1bYqCkYyDf4CTkn5ug216iJGIk4V9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl1X1JkcWhmU19wdnRgb2BcaIJxcmpXZ2ljaVhtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX57dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXiSdW53en1YeYVxf25meHaRgmR2hoVxipaGmaGbooqGc2+Si3J2jZp8iZmIiXuff4OZf4F4cXRub2RyfmhmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYibkIqFe2iHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDe3GGgJWZjpKUgol1hIh4hYGMlZ6gh5aQoH+IYX+Th4OHg4iMf3+CZn2RgH5/goyPkH9tg3yCdGttd3V0d3ZrY42Bjn+Ef3yEf4WIf3BgdHKGfZCOg32Akop6cYRne4WMiI2EfIV/gZWQkpSFb3B5i390bG1pand6YWdqaVhrdVpSaXJpYlBicnhsYmVeWmqDbnNiXGdfZW1fblRab05HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/c4FtaHpzlHNnc4d8cpKRhJqfm6CGhnV1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWNoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuUjIGEmox8ioV8e4mLf5SIdYmGdnd9gXJ1hoGelIWUj4ODcoCKdoZ9i5qemoeVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+Hi499aYB9g3Zmb3l4c3dzbGuOhYqBioB4goGFhIFrX3N5e36Oi4Z8gpCBfnOCaXqEiYyGhXmEfYKZjZGNfm5te4h9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXFlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmRnXF1ga2ljbGpzdoGDcG1/fH90dYN6g4J8gYV2foiBlpB4hIt0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYWfmKCZhIhufYx2aXeXjn6AiYKUl4l5j5VvenNwbGlkYHN6aF9lcXpaYHJ8eWdxemFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koaBhJiKfIZ/eHeJioSWgG+LiHF1fnpqeYWDpZCEk42Df29/hHeFeoedmpWMlJGVhYhwe5KCfIKCiINugHdogIR4cn+Ag4qHfGV9foR2Y3BzgGl4cG91mY2Gg4p8dniAhXqDa1xyf3OCiYeKfoeKe4lygm5yhYiPhoZzhHqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaV3BsTldxc2ZgS2x3dGFdW1pZdH1zb1dnXWZqcmBvTldoUj9YZl5acGtoenFbWlhrZVpjcHlfaFxeZWxoZWtpcXd/iG9sf36AdW+Cen+Cf4J/doGEiJeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fW9ye3qTcG+BfnhnkouDoZmckYKFZoaDb2d5lYh9foSBmImBfI2MaHhya2xmX2BveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKVjH6RjIt/bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt0ZnmCg6eLgo6LhH5ugHZ4hXuInpKNkZOTjouHf3uShnd+g4yCa39yaIB+eG18fIKKg3dheYSBcWRxaH5udXF1gpuLgH+FgHN1foFzgW9cbn91eYuEi3uHgX2IeXtybYmEkYWMc4J6gJeMjIB1bWt2gIB1dFtnZ3VuV1Z7UllwZEtacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE+XWVcXXVlYHVwWllUbmRZZHF5WmhdX2ZtZ2lraXB3fY5taYKEfnlugHx8gX+CenWBgY2ThHCAi253fYB7e4eSiX9oen1qc3tyhXpzd35+jHp4hH18a4yNhJudloyBgGyNfWtofo2Len5+g5OCfn2KiGt1cWdoYltiZ3NvX2Frc2BocIh6YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdnBshYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CGjIl+bn93gYJ+jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCh4ByYHeBfnFkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnN/fn+UiYp7b25qbYGBdG1cZmRycFBaek1bb1xPW3JvZFVLc3hpV1lZWmFwgHRgXV1gZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoa2dtbGhwd3yTbGiEinx8cH9+e4F/gnp3gH+Ki4Nxe4hvcXeDf3uJjI+Dan17bXd4dop3fHiAgYd/g35+em2EjIiYo42Eg3p1i3hrbIOHkHh9eoGRf39+ioNwcnBjZl5ZZl9vb19gZ3Bmam+JdGF0b1thZGp2e4C/nKakyLhxhYNyknx3hpKCc5CLh3Fyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYF/f46PfXOAdYZ6gZORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB3h31qanRoe4BpdoGMkZR+en5+cHx2fHR/YlZ4fnNzi4WCfYRxh4l4eXFxhIOOgH96fn12j4aEd2pxaWyHgXFvXGZhcW1JZHVLXW1VU1lybmJRT3R4YVJYWF1hcIJzW2FdaGVlZGtkUFtwSUNjYFtjcF5dd2hVVlV2XVtlbmhWa15haWdlbm5ocHd6k21piIx5fXJ7fnmCgYF8dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGLdIN4foGBgoR6gHVvfoqLm56IfYV6d4V7Z3SFjI95fn97iIWDdo9/Z29uX2RcWGVZbXJhYGBwbGtoiW5hdGlZXmRugHep2qrHhoeycYl3b4x0eoWNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbXyAkJN/gHmRk355fG6Jd4KSjYV1l4uSj4eFhXt/hGx0dn5tZ3ZkbXt1bWl3dn9/fGFieIZ6aHV1Yn17Z3WGjo2Ve3SAdnGAe31tgFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnl8dIuCfnRodGVuioNsc1loXnNkR21tS1phV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21kZF5vY1RdckZCZV9dZmddW3tiUVVcdVtbZ2thVmpfYG5lZmtxaHB2eI50a46NdX52eH52gYOBe3N9g4iHg29ygHRxdX6FgYmNint3f3eDe3yFh3iHfH2BfoSAe35zdnmMjqCNiXqJdnSDeF59hZiLeIaDdIWGhHeJemJubFtiW1thVmlzY2BbZ25vZodxYXFmV11jbH98ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31viXKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fHpdZXmAeGl2eGaCd2d0h4yOlH1yh2pvfoF5b31eWXN/bnWBi3yCb3CKgHF3aXiAgoCCd35ze3WHfXtzZ3NhbouBa3FXaV12W0dtakxWVF5TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYY3BHQGdcYGVeXFZ7Xk5WZXBZW2poXVdoYF5yZmtncWdwc3eGeG6VinR/enh+eYKHgHVxf4aFjoNwcHt4dnV6hoWHjIV6fH90i359hoSEh39+fn2Hf3x4dnh4kZOff4x9i211f3hkgoaVhXORim+FhYF6g3RjbmpZX1tcXVRncmRgWGRxcmaBc2JrZVdbYGp/d76ue6C2bmJzhmhze3F4gYR6fYt+d3dydm97dmVqb2CHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYR/cZmTcoF5doRvgoOTiXSWio6IhYmFfXh0cW5oeF9qbF9tdmpnamt5d3p2Wmd9fHhlc35uhHRldYWNhpZ/cIxna3qEdW51Yl1xfWx1fYx7gmZ2h31ucWl2f3l/gHN+bXt8gnt4cWZsYm2JfWxtVWlfdlVKaWpOUU5oTVh7aGFOVXZrTFFUVV9mdYNmXmBxaGdiV2ldXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGZsZHFncnB1gXhwmYV2f353f3yFh311coKIgJWDbnN5e3pzcoWHiYiDeYF9dY9+fISKjoSCg3p+i4N7dnt3d5qdl3qJgoZpdn17bIOEkn9xjoFwhYJ+gX9wZmxnWF1bXFtTZHBkXldicnVpdXBlZWJXXFxogHBvcoBziWRkeH5pdHVzcoGDd4CDeHZzdW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXR9c317b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ2YneFi3yUgW+Mam17gnFnc2Zhbnpnc3iLfH5id4N3amxydntxe3p0fmd/f4B5d29kZmJthXtsalVoYm9SSmhqT0tOb0dde2ZhTVV0Y0pOU1dhanZ+ZV1nc2lmYFZjV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXNvcn51dJmCd3+Ad39/hoV6fHSChH6XhW5ydHx6dHGEhY+BgHqLdXSQf3yBlY6AhYR8fYyGe36AdnujpYp5iIWEa3V8enWDgIt6boRzeYR8gYN1bmpoZVZdW1paU2JtZFtYYXN7aWhtaWBiV19baoBqa2+AZ2tgaHl4anN0c22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnF/cHR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe21bboJydGpvgX56d2F3hYR4j4VziHJveYByY3FpXHF4ZHJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWtFYHhmYU1Tcl1KTVRaZWt2emVebXFpZF1WYFZubldLU2hXZV5YTVVsVEpceV9bXmtdXVtjZWB5aGxgb291bnB3dXqYfXZ/gXmAgIeGenh5gn6Bk4RxdHR/eXZ0hIiRfYB8kGtzlYB7gp+Ffod9gH6GgoCKe3aEq59/eoiHg2tygXl1gH6AdG6Gbnx/c4qAam9tZGRYX1pZWlRhamdbWl50gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2d6d5OBY2NUZXBngoV3d2dpamBXVllnY4+nbn53gIuOe3Fyfmh6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX211ZHpoXXSAb3Jrcnx+dXZidIWLe4iHgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2ddXFRLcWJQRlZhR2J2ZmFLVG9XSkxYWGdrdXpkZW5xZmRaV11YdmVUSlxiV2dXWUhXZVBIYnhaXV9sW15cYWNefmlqX250eG1wbnaDl3lygYB8f4mMhn51dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfX6FeoF6f3yGiHNxj62Me3uHj31kcYd5c3x6dXJuhWx7fmyPemJwb2JlXWVWWVlXY2ZrX11ccoVoWHBuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZmaoOCdH5iZGlcVFddYmOPpGh4dIOGkXltcHtpeW58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVt3fGtubm94eXN1ZHODkn6Hg4l7d29yfnNieGRccHBicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFdTTHZfUEpZWEhidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNRml1WF5gbFtbX2JiXIRpZ2FueHlsb2p2gZB4bYN+f4GTiISBdnOIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeVg3yZknmAgHh6foB0iIN0cJigent/iZR4Y3WHeHN3dGtzbn5reHxwkXJecG9gZ2JsVFpaV2hjbWZcW3GJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJF0bGx7bnBxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2Jdb2hhd2Bbe3ZpanJueHNydWhxgpWDh36EdnNqcX1uZndYXWxuY3JzgXp0Z29+W2BwcmJga3J+bW11f3NxeGtwYVxlbGx5YGZSZVRWUU90WlFPWFFIY3NiYEZValBJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY21jWGBgYV2LamNkbXl4a3BpdXmGe2uDfX+EmnyChHl8h26Ph3Jvdnp9dIGCfIuPgoKXdHiBk4WBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5md3B6a3N2coxrXnRuYWdla1JdW1VnYWxrWlxwjGRPb25dVlhVZ2l0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1jX2NTWl9ZYpWVY25wg4WKdGtofHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGlzcXRwdXZrbYSTgYl7hXFzZ3B+cXNvVFxna2ZxdIF3c2NtdlZicmxbX3BnfmZtd35zc3NrbWBaZGppdl5mU2NUVVBTbFZQVlNPR2RyX2FFWGlOSFdUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGVUU0haWlBNd3ZaX2VsaVliYF5ejm5hZmt5dW5vaXZ2f39sg399h5d7gIeBiX5rk4hyZ3SAe3V/gn2Ijn+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygY2LdndseoxgZHtwZnhyeGxtcXaCZ2R7bGNmZ2hTX15VZ19sbltebY1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenhrYWVsbV5gb2plcHl+Z1pWWGBseHx7cIRfYl5nVlhfV2ObiGJrcIGHfXhsa3luXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmFoYWJsWmB+a2Zrc3ZvbXd3bGmFjH+Je4htcmdxfW5zbmRaYWlpb3SCdHNeaW1TZXFlVWNvY3tkcnd8d2twbWtgWWFmZ3RcZFVgVVJOV2RSTltPT0dkb11iRllpTUlfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9lbGhYY2FbXo1xY2dqeHFzbmh2dHqDcoKCeoiOfnyJh415bpCKdWxzgnR/f4eFhpKElY95fYyPh5GbhIB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGkpSUlJSUlJCPj4+Pj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46Mjo6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYuGjIaJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSKi4aOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD46Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dDREVDRENBVXSHiYeHhoeCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktMSktJSEZFR05HT2yEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8+P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS05MS01MSElPcHCAhoWEhIWGhoeHhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT1FUT1hsc3qBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkA7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hLVHBlfIOEg4KCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg5Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0dnl7fHt8fX5+fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkRdfH+CgoKCgoKFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Njk5NzY2NzY1Ojo7Ojo8ODk4OTc3Nzc5Ojo4ODc4NTg4O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3eXt7e3x9fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP2aDgoODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+Ozk7Ozw7PDw6Ozw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEd4ODhISGhoeJiIeGhoaIiYiJi4yLiYqKjGw8Oz5BQ0VFQUFBQj5AQkBAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBAQD4/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcXF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REZJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo+Ojw7Pj4+Pzs/PUA/Qz9LfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKiFdHTExNS05KSUtISUpKSUVDREZHRkRDRUZEQkhJS0hHR0ZIR0VLSUtJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR3d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo9Pz5APD8/Q0JFQGiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NTkxMTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExscHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ozs8OT0/PT4+QEFEQ0lUfoOFhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTEtMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5QTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW5xdXZ3eXt4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs4PD06PT88PT5AQkRFTW2Eg4SEhIWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDR0pHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0VHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDk/PT0/QUVFPkNFQ0dMdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVFRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PUI+QUFFVUxCSUpHS015hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISUhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUJDRkVEREtXUUtQUE9QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hNSU1QS0lKT1NSUVVWVlZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl1dW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU1LSklJRkJEQEE6UFFRV1hQUE9RU1NSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWltYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU09PTUtKRUM/QDtQUFpaWlJTUU9SUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpUU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCCgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVFFNT1lRTU5RU1VVTVFTUlBOTExIQ0lIUlNUWl1tcnZ2dXNzd3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0X2RdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8f4CBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+Q0NDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHV6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo7PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPkpNRlVvdXZ2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSlBRTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en16eHp8fHh3eGRCQEBBPTpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSUdAQjw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7enZ5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9QXlxaSUdQUlFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSUNGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx5eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1RUU1BRVU9MUlNUV1hUVFhRTFdZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk4R25ydXh5ent7fX59fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1ROSk5PVFNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc2NjVXcXF0d3l6e3x9fn1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZFQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj4zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhFTlNdZ1NRU0FHVVBQUlFQTU1OTEpMS0xOT1BRTE5OTUhMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRxc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGSEVKT0hRUmFcUVBSTlNPT09MTE9NS01MTU9OW1ZKTVFPR0lIRElKTExLRkZGRD9DQz49Qkc/Qj5BZHF0d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENCQUdJRE1PYWVQTU9OV0tMTktLTU1MTEtOTlNkTUpMUklJSUVBSEpMTU5LR0lGQkJCQD9FRkVIRExvcHd6enl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEE9Q0VDS05RVEtKSU1URklJSkxKS0tJSkxNT1BSUEtHQ0xHQ0NKSkxNT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdHR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEZKTEpFSUlGR0dDQztBQEI+QD9CRUNJTU9HSEtGSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUtLTk1QTktNSktGR0dKTU5RTkxjbmp3dnZ7eHt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZHBGS0NGRUZERUVGRUdDQ0A9PD06Ozo6QERBP0JDRUVJRkpKTEZJSUdGRkRCO0JDQz4/QkNDREdMTkhLTkhESERJTE5NR0lMR0ZGSUlMTktKSEVPSUNHTU1OTVBOT09NTElISU9TUVJOUmZnZnJvc3h1e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWVfcEdJQ0VFRUJCQUVAREI+Pz46Ozs9Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89RUVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURESUlIS0lGSFBLREpNTFBOT05PUE5KSkhNUlVVUk9XZGFhbWdxcm9zeXpnZWhoY2lsZ3FsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdERUdDQUBBRDxCQT5BPTo6PT87Pj9AQj9AQkVHSkZKR0lHRkZGRENCQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUVBPT05PT0tLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNRkdFR0FCQENEPEFBQEM8ODo9Pjo/PT9CP0BAREZIRUhGRkhGRUVDQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk5QTUxOU1dWV1hWWF5aXWRgaGJqaWdrX2RlZmNnZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj0+Oj46QEI+Pz9DRUZERkRER0VDRUNERUZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF9oZWNgZGVnZ2ppaGpmaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNIRTxARUJEPDg6Pj49PDxCQjxAPkFCRkNFQkJHQ0NERUZGR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX15gY15cYWNrYmBkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSEtISkVCREdFPEBHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBhZV1kYGZnYGVoamNzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndvd0lKS0lLR0JEREU8QEZEREI7Pz9BQEBAREFAQj9BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSk1MTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXF5gYGFhYWBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dHNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRDw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0dGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNS05NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFfYGJfYGZiYWNpbmhjaWhobXh2bGhpbW9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZycnF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj5ERUZDP0NBRUNERkNDRUdDQklFQkhJSUdISkZES0pHSEpISUtHSkpOS05LSUxISk1LWmZKZFxLbFJIT01fblVsc1txcGJ3Y1JQYnZ1aHVjYXZgWG5xYmR2aW56ZlxsdGBsa1Vfd3ZpamhoZmdsbWptb2ptbnNycHJycXJzcnNzcnRybmx0b25wcXF1dXFxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PURFRkRDQ0JFRURGQkZGR0NES0RESkxLSUtMR0dOSkhKS0dLSklKSk5MTUxMTElNTExbc2JkcF5sbFVNTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB1Z3FNS3J5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQj89QkVHQkZDRURFRURCSEhHREVLR0dLTU1KTUxGSk5ISktKSUtKSklKTE1OTU1NS05NTVtyb29ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBcYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlJS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhFR0tKR01NTktNTkdMTklNS0hKTUlLSUpKTk9OTk1MTk1MXGhkdV1scVdsTk9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dkhNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtMUlJMR01NSE5KSUhOSEpKSEhOT05OTEpNTUpac3Bwb3FxbWxPUVNvWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW110Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSktXUktHS0pKTklJSkxJS0pJSEtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19jW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk5LSU9JTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBPUU9PUUpKT1BRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdIUEtMT0tMV01JRkVISUpISUtITEpJRkhISkdHSUVGS0hJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRdYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRkpKSkZESEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmNfWl1gY19ZX2JbYF5bVFlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdnl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURHS0pKREVJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVDREVCRkpEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYWFdXmNhYGJhYmNjZVpSWFZWXFteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZDR0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9hY2NjY2JcZGJhZGNmWFFWVVNcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNGS0lGRkdJR0dKRkZGSUxKTkVESkpMTkpMSUtKSElHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9YX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmFkZGJYT1JSU1xTXF5dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtJSUdESEtRT01MUExMS0tJSURFQUVDSEZBQUZEQVZVRVxUXlNWYFhOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYl1iYldfX1RQT1FSWVNeXFxdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVJjUURXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhLQURBQ0RGREJBQ0RATEhCTExQT09NRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpZV1lYWGRWT1NUUFBPTlFVVFxZWVteXmFhZWZjaGRrbHFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NR0hZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tPU1NOUE9OT09PSEtGYEVEX0xEZmNDTFtIXltzbU9OVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFdUWFVUXFRQZlpoaGRZVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entLSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPT0pMTUdITVFbWU9QUE5PUFBJS1F/UUl8WVlyc1dQbUhxbm9hVlJycXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdmBZYlxcZltfYWFhYl5gYmdtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH6AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMTE9IS1JYV1FOT09NUVROT1FQS0tOR01QU1taVFFST1BQUUtJWnhdVHhkaFlSU1B2Z3RscGJuZ2tRck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWJSZ3xlc3Nvc3N8fW9+eW9/cl9gYGJiW2FgaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTE9JUVJUWVdXUVRQUFFTTEhneGxjeHFtWktMVHlwdW11Ym93UWRkSWV2cW13b4BqZnh4aVdyUml7bWlqenp9bHh6f3Bnb1h1dWp2dXCAYXNofGlseHxvX19fY2JcX2RlZmlqZGdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NydXl+gXN2em58fXl4cm5NSlJ0TkNCRVBQSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFkaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV5tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW18a3B2dXheX19iXl1fZWRpZ2hlZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlBLTE5LTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhgW3B6e19genNjcm94cWhkfGlye11US2xfdnVraXV7e21+eGt8cF1eXmJbXmJkZWdlZWViWmNjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSV1JWVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRYWFhbW1VTU1dbV1hXW09SVFdXWFFdWFZdVVNPWFJWV1dYWmBbZ3JeW1tbXV1fY1pfY2NlZmRjY2JaY2NnZmZtbm11ZmZnY2BmX11nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTVJRUExWVVRQVFVYVVpVUlpdVlVUV1VZWFBPTE5XVFBOVVNOUE5MUVBLSlFRS1FNSktPUVRSUFFTUklJTU5PUVJQUFFUVlJYV1xXU1NRUVVVVlRaUU5SUVdVVFlWVFlVU1FVU1RVWFlYXlpfYV1cWlpdXWBjXF1iYmRnZWRkYVlgYWNhYmhoaW5jYWReX2NdWmRcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1VZVVhUUVBLT1hTUE5VUU5STkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1FUVFFRUVZXVVlaW1lTVVJUWFdXWVtTT1JUV1VUWVVWWVVRUVdVVlhcWltgXVZZX11eXVxdYGFeW2JiY2hmZWRiWGBgYl1gaGVmZGFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1JYU1FRT01PU1VOV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBcXGBgX19aYmJkaGhlZGJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXF9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1WU01OUk9RUk9NUFNSVVpVU1BQTFBXVVFWUlNSWE1PUFFUWFVUVFNVWVhbXl1cW1ZST1VWVVtbVlFTVlVWWFRTWFpUU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYGNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOT1dTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1JUUlJaT1FTU1ZbVlZWVFZaWF1eXFxeVlNOVFZWW1tVUVRUVlhYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZGdeXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBaXV5dXGBcYFVcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFRYWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl1eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBbVVVXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXVhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVpZWVVXWVxVVFpdXF5gYWBlZF1eXV1lYWJmZF5fZGNgXGdkaGZkYl9kYV9hYGJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSV1VTUlNXUVNWVFhYWF1eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV5fXmNiYmVlXWJcYGZiZWZkX2BkYmFbZmNoZmNmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5TWldUXFVWV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX15aX1xWX19aXV5ZXlZTWVhZWl1hWV1VVlpbWltaWllaWFlfX2BgZGNkZWViZFpiZmNnZmVeYWJgY15jY2llZGdfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllVWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmZiWWNmZWhnZF5jYF9lY11maWRlaF9nXmNiY2FhYF9fW1hZW1laWlhaWFdbXFpbV1haVFldXFpgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlXXGBjZF9SWVlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVldXV5eYFxaWllbX2JfYmVkZWZnZ2JaZGZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWFZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFdaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmVnZF1lZmhpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGFfY2JiXVxbWldYaXFgXGBfXVxhY19dWFljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdmZWZlX2ZmaGhnZGRgW2ZnXmFoaGJoaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFdcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsQju/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl5eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3N9hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6eXp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8e3p8en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX57eX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx5fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6e3p5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn1+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKAgYGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKPjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKBgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhISEgoKCg4KChIKBgoaFg4WDg4SEhIWFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDg4ODg4SFg4KDhIWFhoWGhoWFh4eGg4B+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhoeHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFh4OAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoWFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoWEg4SCgYGBgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhIOFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHhoSEhYSDg4WDiIiDgYGBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOKjYKCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIg4OEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoSCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIeGg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYKBgICBf31+g4ODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgIGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoF/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+gICAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgH98fX1+fX5+gIB+fX59fH1+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAgH5/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e4CAf39/f359fn9+gIB/fn9/gICCgH98fn5/fn59fH9/gH9+f39/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYGAgIGBgX9/gH9/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgoKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFh4aHh4aHh4iGhoeHhoeIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foWLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFgH18fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImIiYeFhoWDg4KBgYKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKCg4OCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bfn99fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjY2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foGTkYyMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6AgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf358foCAgYB/f359fX19fnt8fX9/f4B9f35/i5CNjIyOjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH6Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSRjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhYKEg4J/gH5/goKCf3+Cgn+Ai4+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f35/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSRjoyKiIqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYuJi4mFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fX19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foKFiIeIiouLi4mMkI2MiYiGhYSCgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIKBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5eXl7e35+gIGDh4SIjYyJiYaFhISDgoGCgoKCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fX5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYuHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgYJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ9gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBg4F+foCAfX6Afn1+foCAf4F+f4B/f39/f3x/f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHiIWGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGCgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8enx7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fH5+fX2BhH+Af35/gYF/fX9/fX1+fX5+fX58e3x6fHt6gIaChISFhISDhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCCgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/fn9/gH9+fXt6e3p8e3qChICCgoKCg4KEgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5enxwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgn9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl5e3F0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH5/fH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgICAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHl6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXh+f398fHx+fX6BgIGBgICCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4F/fn9+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fX5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCAgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SDgoKDgoGBgoGAgoGAgX9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoB+f35+fn19fn9+f358f4B/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhoWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICBgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxcnB4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFhoSFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgn+CgX1+gX5+gIF/gH+AgoCAgH58fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1+gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGEgYKCgYKBfoGAgIKBgoGBgoKAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDgoSEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCg4aEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en19fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OBg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fYB9f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/g4eDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn9/f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIB/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFgoGEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gH1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4aDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhoWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouKhYSGh4eFg4WFhYSChYWEhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoGBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYOGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWEhoSFhoaHh4WHhomIhoaHh4iJiIWFiIWGh4aHhoeGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGg4aGhYaFhYaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX59fH18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaFhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WEhISEhIWGhoaGhoWHhYWHhYaFh4WEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGiIaGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGhoWGhoeGh4eFg4aFg4GDgoCDhYKDfoGBgX+DgX9+fn99f3x8fX99e319fH56eXp5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aGhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl5enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhIWFhYWFg4OBg4GAgoGFgn+Af399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoWGhoSFhoaFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N+fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t8ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn59fX9+fn+Efnt/fHyAgX2BgH19g31+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58foN+fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enl5enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSFhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d3a1tfX19fX19fW1tbW1tbT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3NwlMC8vb29vb29vb29vby/0tLS0tLS0tPT09LT09Pc4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysrJGSwqaqqqqqqqqqqqqqosNLS0tLS0tLS0tLS0tLR4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCposqurq6urq6urq6urqrHR0tLS0tLS0tLS0tLS0d/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45cbSvr6+vr6+vr6+vr6620tLS09LS0tLS0tLS0tLf6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyc3T09LS0tLS0tLS0tPS0tXU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HO0dTU087O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1dbV1tbW1tbW1dbW1tbV1dbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn1K2Dg5XP0qSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9GdkLmcvLiZtbOfoanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6yspo6AjcafmJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw9OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GeqKGJrNa6mKGdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJnaSqrJulspmWr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6tpJyVqJCahZ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuWraezq59/n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zAz5TI2cGcgLytppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haCXj6Cfn5iolpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZybrKWrop/DoKuknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh8+pjo6t2MKPjbvV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1L+/1dLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5Njk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ozw5Ozs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY0Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUklBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMvHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcLGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+7vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYlxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXVlRRURDTUlBRT1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSUdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZVxaVUo8Pz9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU9IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BP0pCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQkZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtq6mur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSEBIUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2s7S1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTExCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemsKSvrrXBurW3sre2srSrsrSuqquvsLKzrqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqrGjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SWmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpKWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqa6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJqakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa6ysbSpsa+imZydnqGZm5uamJmblJWblpmcpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir6+sr7Gstqetsa2mprCuraywqKCfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O4rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmZ6coqKgoJ2in5+en6msp6ypqrSrq62rpaWrqKqsqqWgnpmSkpSYmZeWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKeompmdmqqnn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZyloqSjoqqvrKepo6ChrK6uqqunoJ6eoqOen56anJyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8bEvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqxrru3vrq6qretq6q4urS8rq65o6ajnqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6/uLK4vMTBwbq8vLWup6euqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzyMTLysrOxcq/vr+8wcfEzMzIycDDv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOepKOfoKSsm5aployWjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2wMq/0s3Lz8XJyL/Dw8jOzM/Qz8zKyM64t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLFsrapoqWmoaKrtaeasaCYnYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdTOy87IxMnGxsjMytPT0dXP0szSwbnFsqWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqrMOnqamhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzs/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0tHP0Mq9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+jp564trW1raWtrr60scDZ0tfa3NfPzcvE09DCwrKrra6sprOyuauyvMaioZyWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOys3M0M3Ty8XIz8zIx8rEx8DFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaKZlpGVlpKLlI2akZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzc3QydbWxcS4sraqpK6submxssSslo2NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/GusS+xsm9wsfJzsTCx8DHzcfDy8rLz8fDw8/IxsHFyMO+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/scHKx7q9qrGyp6Wdop2YkJqQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3H0NXW2drb2NDK0NDS1MrFur6+sKi3q765uLOlkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8vDv8O7ycbIu8jGxMrAvcHLxsXEvsW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzLz9HMx8LDx83Pz83W0NbZ2NnQzdTOz9DLxLjGwba1vLHAtrqtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcG9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73LxMHFwsbIxsjG0MbCzMiyx8rDzs3BxcPAvbO3sLOoqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cfW1dbYzszQyM3IysW+ysGytbq3uravkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wzu77AuMe5tLu2wMK8uL3GwcO8ta6ytrq+tMW3u7WruLy9wL2wuravtrqyxby2r7u/tLa0xb2+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwsO3w769trm+x7+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/IysbKxsTAvc+9s7i9ube2m46HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+4uLWwq6ynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxq7W5u7TCurC/sb29u7a8yLnDt62qqLCywLa4vK+wp7GztLu8q621pq62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8TDusTGwrvGyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbO0szExsHF0MjPw8THwcbGxcXMw8rMwsTBx8C6vLvKt7S7vbW1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RiYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+3r6iuuLS0vLizvK+4ubWyvMGywa6lqaKrsbKzqLyqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yri/xcC8zLrDxsW6vMO9ube9xbi1uLuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSttrmysLq5sbekn6OfprGnq6i5qqSnp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWZfa29gVVlfSE5oT1RIRUpGPD1APTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8e7tsPGs73Fu7avuL+7sLK2sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLO1rrO1rrCqn52eo6KypKapuK2ipqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKurrCu7XFuLXAwbPBw7usqbS5t6ews6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKivs6e6s6a2oaKem6OhraOhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrG3sLq2ub2/t7KxlIV5dWVfZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LnDx8C2vL22w7q2v8C1ur66qaawurCnsa+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56pnZuaqqavsKubo6O3qqCfrqi2qaanrbCkt7Ckt6Cim5iYqqahmqy4sKKhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb+/ucDBub/Aubm8t6emsLulqKCkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbGtrLWeoJ2VlKmhopSssbGeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcW11YTkxRR1JhTVdQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK7wsDBvbu3ubWlprG1naGJmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCcpKqdp6GerK2pqK6toqGilJejm5yPq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Hu8HHw72+trm0pKqvrpyZh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqilo5ikrqSUmaWvqZ+bmJugnq6Zm6qzn6Wmn6OjoZSTm5aWkqiqrZqcoKGgmpSQjJmOi5CMkoyWlJCeoaCjnJuilZugoqCYoqijoqiroKuvpK23paOjoqytqqirr7O4sr21s6uvmIRzc2hbWVlSVVJGWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTU3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xLzCxMO9wLK4rqWqrqqdl4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1dXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevo6eZn6yglZakqKedl5CPmp6ulpenqpmfnZSloZ6SkJKSk5Wnq6WamZqdnZaNjIyUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q66nsLSwubXAsa2xq5B9cXJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72yurvDvcGws62wra+qm6KIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqp2nmKClm5KPnqKal5aFhJKao4+TopyVlpWHopqak4uOi5CZpKeclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVlJiYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ01OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy0w7m6ramrs66unpanfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCPmpyioaOYpJahm5WNh5iajHONgn2Nl5aFkJmQk46Oe5mOnIyCioCKmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWQnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyY1ZNUk9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRktLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMG4r7Swysa5usLPx7+1r73Dr7HHsq2nq5Wkrr+3sK+fpqysqpWUonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXi5OQn5edlZSWlI6WiX+TiV87V297i5SJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpGPg4Z9k3hyb4WNfomAkI2Pl5mYk4qPiZyInpeHiJaemqGgl6evqa2pqJ+XrbSipq2YrKuYp7Siqa2jkn1ybV9bTlNSVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBurG1sMnDubS/z8C6sbG4xKuuya6no52GmqK5rKanlaWko6CWjpZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ4iH9gSlFueIqShHyEjImEf39ufn+Ud3V2eISNmXBRjYiKh3x+eJR2aHeFiH6KiJWKjZCSlouEioiUhJqMgYSSm5aenJSko6ippaOem7CroaSkkKaqlqGqnKKmqIh0bGVeW0hRUVJNSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivraq2vLa4t7PCvLeousm5t6mqt7ittsCqopuSg4+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho+AdX94c251cHSNjoF5fYqqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SLjH+Ug3uAj5iVnJWRn52pnp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ2WkpiGk6OWnIuCl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgX1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5aZnZudnqKdlo2KpJuPnZeOlpiPdm1sZWJaWFhUUUpTVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6ipsa+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkZWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2VgEqSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfm1obW5uV1VXVFFRWk9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voqyqqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qTl492kX6Fi5GPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmpF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nZFdRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6yn6a6rquysMOyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3Z5d294c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCVdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3lwb25qXlpcXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5Wltamtsa7Bs7vBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cnx0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+dioKQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bnFyZWZeW1pdU1tmXldRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKugsamvwLK7xrqWj5GUiHqGdmuAjJKDfouFkI55hIJ1ooaNf3+CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUktphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIh62wr4qAgJOKgouChJGph4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd35+cnFwaltcXFtjYlhnZVxVUFFYWlFETExHT0lERkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrKy8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpehnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WIiYGDiIZ5iYuAdYZ5X2NXTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj85NC5dlnBzo1VGSUtNTlBXYFlwWlxfao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQfHKEnp+RnX52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZWPhomIiImIoqujlomOmIB7gol6em9na3h9eHxxaWNdWlldaVxhZl9aT0xOWFNRSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+Lm5qknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKcjoSBgoyLgoqOhICLgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbnWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKowcOuyK94upSafIyhnpiEk4WCj6Gfk5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramt9fn5/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgIGLjYmGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUlNRTlBJRUQ+Ozw6Q0Y/Pjw4NTI8P1I1SEhITExNTlJeb4p8c4J9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8nRz76boHBpq6mfhJOShZyhmpqap5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkpqoiJeQjoGIbHNzfH16bmZeW19eYWdkYGdnXFJFS0tRT0lKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGkJCPgoOAiYyJhZOFg4aJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jEv7elo7CyrK2qo4uWmIWmpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN8ZV5mWmNgXWJjXmZnX1tPREpIVE9GSUxGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1hqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGBc1hfYlVkYGBiX19mYFtVSkRFTFZRSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRYmRXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XUF9VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6SupLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AemhVYF9WaGNpZFZbY1lWVElIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eCjpaKgYSBint8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlRgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby9wby4try8t761urPGYXWypbGanqu+qqWoq6qkorK1oKuonpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+wLy8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG9dX19dVV9daGVTWWFWUlZJRUZOS0E+SEU9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Wi3+DgIN5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVVLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7t7q2ubm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDpJ2spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr7BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW15aWFteWGJiUVtgU1FLQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIyJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXlpZVEhLT1BKS1FMVFFITEFKR0tQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OJkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbXFdeVlhkWU9cV05RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4b2RbYWBLUFJVTllfUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaisr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtVXlFcWk9PVFBOSD5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXN7vsuaf42yhHZyhXdpYWpdQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoaSkZ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8yJcG1gXl1WUldSWk9KR0pJSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXZ5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWzoKKln6GpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4OqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M/R1drX19jU2djN2NvOydra0ta/zM20dXRsYltXUVNQWFVFRkpJRUU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5GejH6HkoOJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgnFuYz1eaHJwcXBueHeCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk4+uq5SVl5+Ypq61vKmtvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V4ZmVYV05RUlxHQkVJST5BPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4F3hqKQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCWn5OSl6OemquWkZGLjpODjIWJiYGGkJGenJmJhYuBhpd7iImfl5CJjoqLgnyhiZCLvKGYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hXt+gpGKhYZ6hYh8dn51bX19h350f5KekZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZKOjpGMf5CPjouEiZOWmp+fiYyUkp2Rg4x/ppmIhY6DhoSApYaKi7iYnZGVlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZeSjJOUhoCLiZOOioqdl5mjooaTnZagi4qJjp2Qg4iPgIOHhaWFi5CzmJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29td4t4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eWmISAj4uZiI6QqpeXpKKImZ6WmomPh5iYioWPjYF/h4+liI2TqJqXlJaYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fIWHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlZmGhJGQnHWRmLOWl6Whh52ak4+LkIqXm4mLlo6GfYyYnomQkJybmpOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7raiyvbClrbOzqKOhsKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq3uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCWjYuNlpiTnZm0l5arnYqclJKOkZKMmZuKkp6Qi4mWn6GNlI2Ymp2SnJielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbStq7O2jKizra29q5u7paiturirp6aioqSjqa+ysaudnKSZm5iXn6KmppKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPlJydk6Gdm5ifoZSanqempKKksLOnwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcXBfWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTzc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrsLy9qq6ro6Oep6uutLCqnKCqnKGclp+wtaiMo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+djKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOgoJikn5qgm6CUmJ6lpKampK+upsDEw66ot7bJw762z7LEv8S8s9HKyMK0cnZqWlVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaompqZur3HyMnB0snKws29wrOtvL6ou8C9u8O3rMGprLO8vqqwqqSlpKyus622taCfr5+lopijs72pm6i9waS2uLCslLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qn5GlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpaOipZ6dppielZebpKOpp6KyrKi8wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p3X1ZVWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNVNITjxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPNzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psrebnq2jqKGeq7e4qqWwv8Wyvrq0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlqurqaebn6aXmJaYlaGkqKWftququrvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1hVU1NNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qin6++r6HHvMTEx8bOzs7Syr67trG6u7y+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+vmKOvpaekpbXAsaystL/DusC6tKi6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boaCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSurqulmqCllJOYmI2coKeimrSpqrO7u7uqsbLHwLmmrKutsrKjobKytKRta2NaV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPPEpLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKosJmRl4eLqJaOiJOFoIiEnZePnaGbo6W1ybWpxrrCw8jKycjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubSzxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqq2jo5+kqJGRmZyHlJ2inpaxp6mruba9srKuvrm2oKOnqKWmnJutqamLYGNfXk9KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlZ+Mk6uckZKTiauNhqGejKOtlKOktsa+tMC6wsLHycXCzsjCvrmyr7m1wcLKtcWywby1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbyorb21uL7HvLe2uMGyvsG0qrW3q76lkKOYkqKgvZ+JmqCZl56ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5eJjKSilJ2inaC1r6Wkk6+rmaqqnZ2jo6iQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXlxJR0VGTVFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJabm4+qlpWnppWtrJiiq7bEwry+t8HCwMfEv83Gu725srC5s7/DyLW/sLy2ubampKusraGhmqqrxaKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjn5C9pKmeqKydnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylnJWxp5mupp2ZqZ2fjZiUnoOOoJqbkqWkmpirsbWxqqWqrqybmKCgko+QlaielGVfV2BcTkhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTQ2QDk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCTo5+WpKCmqayYtrGiqrO2xcS9v7W/wrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6quoKWpra+ipqi9taaxvbm3tsSztLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqioq6Oawqypnqyum5uemaagvaGdpJirrKymopqNmp+TnomOV3+Wn6WhoLiqppOYtaOesaCfmq6WnY2Yk5yBjp+XlY6ipJaQpq2yqqmioqWllZWdmIuPkZKknolfYlhiX0tISkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6foZmexKilorSinbOok6uloKOfrKmsnbuwqKy2scfFwcKywsO9xsS9xMm8r7C2rbC0r7/EtLmxsLm0rJmosamqmp2loafCrZussZyqo66xqaSovbant7u+r7fErbSzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6QkI2VnpqinqezpqaMmLOboq2anZuskJ2TlZKZf5Ghlo+Nn6GUi6arr6SmopygnpGRmpOFi5GNm51/X2RaZmRKSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSfo6CcoMOppKqzoqS1qpazraehpLKsrqm7sq2xtbTGwMTDtcDEvsnEtb/IwrSrtaiwuay/xLO3rqy2uaWYqrKrqpifppetu7SbqLCbraCutLKnq7mzqLq0ubO5wKq3ssS+tceov6+utrWpp6yhmJeSpqWiopiYpa+4rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblpion6CYoZ6usqKmjZeumKSrlpmeo5CajJKWmIWVnpSMj5ydlIuoqaqhp6GYnpWLjpmPgYWUiJOed2JnXGppTU9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7pKOdoqa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6mssbqilK2xrbKWpKeRqrmqn6axnaugsLSzqqm2tq29rbSzubitubHDu7+/psSrsbevqaurp5+YmauhoqGRmKKxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ugoJuepZyil52js7Can5CTpZqfqJmUop2Ul4iTlpKVlpyTiJCamZSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjYxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaifnaKqvaKqsKyksriqpra1rKCttb2vs7i7ur63tsDCv8jEucXCwL+4xL3Bt6+1p6u3sry+vrSorrG2nparrqiul6aojqe7n6Wss5+sorGws6yqtrS1vq6wsbWssLSzwbvGt6y9sLG4rK2qo7KmnqWqn6SXkZqgs6qzq6qzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKudlpeElJaKnZick4qNlpeal6alo5+dlpWXkn+PlIV7jZKCi5Vka3Fnb3FeRllmVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BLTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelraqmr663qq+1u6emsbfFt7G2vcHCtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZiYp6yqrJurq4+rvp6srrKjq6CxrbOurrayubiqrq+xqLWvtby9yrOqt7WxtK+up6G0oJuoraCmlpaamrKiraCmr5ehpJqak46jpaizqaGms6yrtqWvsrWvpJmdrKeamJ+amau3o5eTkY6XnKGXlpSqnZqRf5KXjJ2cmZaQipSTnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUVga1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqq2mpK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb+/t7+8sb2tp7q5t7bCtqussbeUlqeuq6ijsKqUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaijtqCgp7GhpJScmZWxnqecoKqOqaOem5aYpqaluKejsrWsqLKnrrG2rKWZoKyom5yenJSpuJyUjo6KmJuil4+YpaCck4KQlI+cm5eWlYiWkJiap5ykoJKWkZCVdoSPh3uEgYOLimxvdnR7flxLZW1cSk5kXD9ie0dJOEdnV2VcTF5jTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5Gapa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLEp6m5sLa2v7yuq7OxnKCnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnZybr5qjo6Ojka2fpKCgoqump7mkrLW2pausqa2wtq6inqOpqpugm5uSpLSZjomNh5ChoJSMlJyfkpCDjZKSnJqXlZOHl5OVmaebn56MkpGNkHZ9jYV8e3yGiYhwcnF9fH1cU2RuXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpamls7WytbaysqGrrr3Muq3AusextK20wsPSxca+wLK+wMK7vre7xKest6yyt7zAr6uxrKCjp62qqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypqLKmqqSjrqqoop6co62VpZ6YnpmsnaKnqaKtpqStq7iysqGqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeUhpaUk5eknJycipKQjYl/foeFfHZ+hYSFcnFwiHVrX1lgbmJRc3FcSzuEfEY/V3RYYVpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Gss8TDzs/Dvr+0wMLDur+zyMOrrretsri+vrKtraukp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6quoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6jpqObqquuqZ2ipaSkmJ+blo+YnJKBgo+IhZyfi4qOi5iNjomCi5eim5GQmouTkpGTo5mbmoqOi4t9hoGBg3pzf4KAfHJ1i6SHeGteYG5mV2WHY04/Z5NMRWJ5V2JZUmVUTVZVVlRPXF1hVUtOaFZWV0lKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsaajrLGYq6qttqy2sqymrKqpvMDAt7iyu7Wmsq/EycvRv8C7ub++wbnBucDErbG1sbO6wL6ysK6sqquotqqmrq+qubCosrKvs623qre3p7S3q6ylqaqcpJ60s6mopLS1oLeuoKqoqqirp6CrrKm5tamqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6imqqOjmKWnp6qcoqSjoJmYoJGOj5iNfoeMh4OdnYaDioqOjY6LgoWUopqNjJmQkpGPk5+XmZaMioN/dIaBf394dIJ+eXZ+gIedj29yZ2dwd1xhc4hrT16ZVkhteFVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJi8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrrmuobawyMfI0cC+vbu7wb26wsC+v66ysrG1vLvCsbGzq7OppLWopa2zs7mxo664srCyu6u6sKqutquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OomJqopZiXmJ6PioeViH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXNzeWd/hqR2aV9la4B0Z4iMfVNYb15KeHNTZFRRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnrKSnpK2ntbOyq6Wxp6q4vsC8r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essra5s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6meo6moqb2stLCunaqkoa6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WTooyUkYuRm5KVh4l+f3J7en58aHh8eXRvcHtnhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmNCSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sry3ub21rbm1v62gs6erq7C1uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Svn5+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjYh7fYuGj42LiYSSmJCGlKOJkpKHkJqQk4GJfXlrfnZ5eGN8enBvb3F2Z4BzaoRoZWdfbHONbGFpb2BvPVp5a1VeT1BRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTNTPmVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaOfqKS4sK+kr7Cpq7jBubOtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srO/tLq9t6i5uL2qo7Soqaqxrrqxqpy8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qPiZWeiJGVgoyXjZF9hXxzcH1xdHRgenhobW9wbmh9cWN7bWllYl1lhX5fWnNqcUpJf2lYWk5QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaSiuKqxpbS0qai5xLWzrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbCzvrC8w7mou7q3p6e1qKirsa2zsaicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GUpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqOlomNhniBh4OHi42FjZOYjY+WmYqPl36GmIyPeoF6cHJ3b290X3l3ZGtra2hngm1lcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZ1tIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiprqG7uKWsvcSzsK6ita+tra+0xMS9s766t7Czubi6uLqurb+ztLivv8G3q726tKWis6uoqrOsrrKjncO3pqm3t6ufs7uqp6aor6uZoqecpKeUmKGzppqepampnKGglKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycmqKWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSOjpR7gpePi3d/fGx1cm1sc2J5dGhmaWdlbYRnZ2hkZmhpXmViaWZZZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6WnnJ6enqS1raequrenrMPAt6+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLS6nqipq7GlmJ2qnqilkpqmrqOZnqSqoZuhnJignae2pq+qrqGhnp2hlaCmn6KgmZyanJOanpWmn66jmJeflpWOlZiMj5iaqKCQh4qKiHiFd4KCgpyHioKIe3+EiIaEkISWlY+PkJGQkYyTe4OVjoZzf31neXBra2xndXNrYWdkYnN/YWRlZmVpaWJmb1peWF1sY2FNZ1dbYFZJR0hLTVJYPzlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoJqZoJeltLKjsr63obHGu7qwsKO2rKuuqbm+vbutwLKvr662rrO5s6erubGvrrO2u7avub6spp61q6ChsaWrsKCmxaGzprCzsLettZ6srqyuopmdp6qmn5Wcp6agmaWjqZyan5yVnZ6tsKa5p66ioZqanpmfo5qlnZefmJyVmqGTqZetqJuUnp2UjZWajpWUmKenjY2KiY57gXSCgouYhYZ8iYiEhIqMiJKFk5ySkZCQkZePkH+BjY2DcIJ/Z3luaGtqZ3Fya1toY2Fyf2BkZ2tua2ZqZmRsXG1tdnFhU2JoY2VaSUdMTU9ZUVBWYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2blKGbqbOwn7nAtqG0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2lsrWxr6mxtraxs7a7p6mgtqmdn6qjqq6dq8SZr6awsbe1rKyesa2vqqKbnaSsqZyVnKeknpmqo6WVmqCdkpyjq6qpup6npKCXmpqeoY9ro5aZnXGDl5ylgXaSrKielZeikoqYmYCXip+PeIWTjYNtaX53hHJshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQgGeIgGh2aWZYXWl0bk5QamNmcYJmXmRmb2tpXVxeiZCFiGhPS0M4RVRnXUpIUFBVVkxIU2FwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTlxLW2ZiPkcxTmE8Ky+OpJqIlbGbnZOgnKuuq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKicl6Gmppycp6idk56gmZGfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1iI1pl4lmfnN5oG+Hh4N+jHx/oaCfmX97h550iI52m4psh4KDbmllZHttcmJUhm1jbWmYcVhpcG6GV11pW2tqWohwbXlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05cTFtnXz1LMVReNy8ojaeYhJ2snZmZnZ+rqqiqv8Ovsrq8uMG/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaikmpmno6WZnKWqlpOjnJWUpKamobako6CkmJWUmJSciK6QmJWKqoyYo52GsYGlrp6Vm6CXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcI/YflNrYrayfoBxlHWaoaqQVk5YYU9WTkZVXFhRUFKLXFdbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01eZ1w+TDFaWzQxIY+nlIGnqp+XnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5r5yysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6ShtbqiqqigrK2kop2bmqOqoJibqaGfmJ6oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elpuol3GuoaR+d7p8bKGPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoJZX4uraH+ReHpqqDhKr1tYVG1jWkxPWF9cV1Y7TohQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraeln6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6Oquames7Kwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoaqboaysn56al6Cjqp2ZnqWhnZqhqKSQnaObmKGgrJ+lpqCaoKGWlZGXkZqGtZu1eYaqmraZd4ezm7d/lJeYrJd/a4GmeoGFh5GUknerZ2qxW6x7joeUdIhwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKHXlCpbmNxfIaAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YtMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kota2jrLalpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6Cwo5uapKi1r6Goj6mnqpudlpigpqman52joJygo6WklpuemJqeo6ubpZqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ6rHmPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2yXh19StbTIhX+JfGOkM0KddVxQamhkUEBYZllkYUpITWtKW1NPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLquo7CyobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpmirJ6bl6musamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoJiQkpWQnYiybmi1cauIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1g5HS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4Zil4heWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZJOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe6rqSysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKqhmJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaKelZmWkpuFrHx4qHajj4uHqXCui4SohJqao4uTmouifZKXh66Ef4KzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5iIal2vd5Wfj3hsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2Un7exmbPBrKiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWntqyosbGrrbSkm6mgoKiitaemqqSZnpWlopSUnJmSlaSnm5SQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpWfnJ+gmJiclpehoJSYkaadh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFeq1qJoI9rbmVPSkOhXFpNdF1iZk1aYV9ydF9KVTZKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6KdmZi+rZizwq6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+UqrGpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ6alJihoZCOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yVnaGVlo+rm4+ubnK0dKmMd4umdLR6dbSClKaklJ2NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZwXK9WPJx3ZlRvbi5bp09iUmtlYmxaYlxgcHxjU1pRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpucuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurp7ajs6iuqqGXnaigpau4naOtnJaZkKWjlo6doJuYnqCRk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaKXoJuWm5ehk5ypnZSQqpmH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcW2NpHS9XXd9W2F5vGpaVltpeV5pYWRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qfobujmLHDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOemJ+akZaTr7mwq5WXo6enlJCWpZ2krZ+RoKirn5ufqaSynqOljqeilaKanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsG7vJl6gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeW15YouscHWFf1hbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/p5azwrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyZoKinp6OpoZKsnpeinpeWmJ2ekLCplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpdmolhZIeOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5xdHl+fWJbeHSBaFBcboN8e4pqWGx5gXJJSm+FcE5zTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwqSatLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OamqKnrKKfqqKarpuVpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVjoqMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5F9gHWJi4Jygnh5dnWKgHuJanOCdIN1ZHd9dmtwemxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Gxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkZmoqLLDr5mrnKqej5aWqZ6rnJ6hrZihm5yhpa+moaSonqyZl6admZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohoCXloqEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kIGAiWt1gXmIcml0f3l1g4eBanRjd2VfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua+/rautsbKgqqayraKss7DGsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhZ2qrKO0x7OfqaSqlpaYmqeeqZygpauUn5+cn6quqKWjq6Gsm5+foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2tkmZd+Z4WKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYJebIuKgndcZ3N3d5GAh4JveIJ4f3NteYRzd4iIjoN7aYVYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2ln7q9uq+ss7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnulrKKotMO3paKnr5+dlZ6jnqOdpKqokp+gnZ+qr6mqo6qep5umnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN7ppiYc6qCfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1rpbJvjYFvynp/m3eRg46Ad3mBgHlxe4CGcHiFi5N5bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84lqK5w7Swr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrqy4tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ2crK6oq6ajoqWfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfaeVm3Srg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKuWaPNbpB2e9t7f5lxfoiSdX9le4h2dmx+h259hZCRfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsKuorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6cm62upqmom6amo6CqkqyzlqWiqqqepKenorKik5unm6GblZSRl6BxhoyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKGLkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiIqQj4Nsj45kbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5afpqugoqagqKijn56wrZiblqinr6yop6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnZ2psaepqJuqqKOhqpuvsaKoq66mmqerq6uzpJOYpKablZKFpGqkdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIyLl46BbJiQbmx4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C1sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwrqCpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKW0nZqhlJuep6upoq2aq6ihoamis62iqrOyopyrqbCwuKWUl6SomZ2SfKpsnoSIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SnqJCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5yRe2+VkH1ueXR8em1bZWpycWaAal5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKqjn66snaahrZqfqaWdp7Wgo5iUqKu2sqybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXoZWXm6WlqZmunKumpJ6ro7asobG5sJ6csKi0tLWmlpmppJuhj4KdTniagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jpGilnt8kY6Hcnlyg31wXGxud3JqgG5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GyrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJ2ll56YmJilo6eYraGsoqSXr6W7rKK3tq6enrazurO1qZqfsaKln4eP0bXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2Vip99l5mHh5BzroKlm6KMpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod4+TpJd9iouQiHZ7eI2BbGh3aXhzbn50XGRkbW1laGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKjmZWjqaetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2mnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOWmpqcmJqXpaOll6mnrKCjm6ymvayVvrCtn6OxtLuttqmdq7SlqZl7qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWiqp3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2UkKWYgpOLk4l4eYGWfmpsfWJ9dG1/eV9nZXBuZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVlVRSEZJSiMoKLySm4SpxsO2wbSfmq2grrmmo46ao6Ogr66pn6Oena2Znrmgo6ugr6qarqGRqqmllomaj62wrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZmpOZmaWjopinqqqho56pqL2kl8Otq6OirLO7rbCpo7WxqqyZdq9+kIqchYd9uq2JmGSwjGWWrX2hj4Onl5yCrYuFsIanmqSiopGFoFxsa4KzYH+te3uCgLFsZm6Zl4uIsVp9tFykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl46nmYiVjpOUeXeMm31jc3xig3h0gHxhamZwbWZlZU9VY1xBVF49SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt727tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Im46vrKmno6iZrpOaj6maoZ6lnpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpuSmZeonp+Xp6ylpKSipKm6n6DGp6apoay1t66wqaG+sK6ul4GpkqOujpuAhqSXmJCAgLjDuoOOnZOEqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2teXiivrt0gJWNpZqNmY6Umnd/j5l5Ynx6ZIxneYF7YGtla2phUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLG/urK9s6Kdrqems6adjJelv6m2r6ehv6amspuesZ25qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6aep5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkZiYj5eTqJielqinnqimoaKrup6pxaOhsKSrtLWrsqyjvqqwsJx0dqqkt4VliZ9wZ6yQio9ubnelj5qggXaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvboOZcYB6aXBpZ4mWlZdxaGmFhmdwhmRdimNpb1pdZ354pmBico+ScGZkgI2SjqGWlZeOk5t6hY2TdGSGd2iManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmys6qpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrayspo6WraqQjIWVl62fpqqin6SjoJGLpZKnmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZGYlI2XlKaTnZanopmvpp2irLmgsMKopbSnrLGyq6+uqrymsLmXi6GppbWciZaimIapm5CUnZKqtJmbo6yitJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqPhoR+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo6ckp6UlZOegIWTi3Boj3Zvind2fHlpbGVkb2NVYVhAaVpHYmBOWCtFPSsmITY0MC8fHCElMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3rq6isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam0paeRmKyji4iJj5ynlq2koZqonp6TlaOXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56btaOdpqu3qK/Cr6S4p7Cvsa6rrLa8o7G+mZKmpKa1opKdpp6NqZ+Nkp+irbGaoaSyq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYuBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGRl5GfkJqTnYKGl4V4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBkT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKKxpKaxqZabuKWilJipnI6GiombopCvnqSWqKChkpeZm66LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednrejf4OvtaOwsHWkv6SyoHh6oq21vpd3rqWgioCpfmRcYnafjqSeg5Z+bZS0nKOor6ylZqChlHR6m5hwgZmqmWyAo6mKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKJhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnaI+NcXmhlpVkeJiFgHaXaIOJgm55f2pwZV92b2trZ1xlY2Fhb1JZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4udr5+oq6eUlrmfoI+cpJ6RfoiImp6NrJqklaeino6XkZ6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5GQlIyPk5+NmZ6lmJuyloCMm7WdtI2Sj72noX6no3ulsbqDjo+nn4SLhY+xqa+MiZaimnmAi6yGnJ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlZiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJp0e5mCnJqEmH6RiIGCmGmMjIRreHtxcGdkeG5pbGpcZGlpZXJbXEhTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eppZmUrcW8r6CUpae0nY+DnKucpqKgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ak4+FcHWQiZSQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOp5iNnXyoj3J7d5yOppZolaR5tIygoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+Yl4COlJyJmJKLfIWTho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmNubGZsWGVGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY2BfYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6ipKmhlKOptaKvf6CmnKWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x3m5yOoJGInqOblpiXhqK4rKWZm42Nf2Jtj4uTkI2PjIyXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjquajJp+onaAmZRrgat1Tat4h42dkpyqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jHtkZ4tzmX15l2xdfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW10cWpqb15qb2xraFdnTl1YRTlANEdEXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRhZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q66imZafoKWrq5+crbShp5Ggn5+mm5mOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhqykh5yRipiomJmZkYelr6ailZmIiYBpboiHi46OiYuNkYuPkaCLkp2fm6Glf5OBj6OhlKB3nJaQp4OjqYCGrK+HpXqLfYSafaJwc5OHlXuejHlth5yMmpKdqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOSiIGAtqhkgca4fHCVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJvc3VxaW9Ya2tycmRbZ11hTEQ9RDVRQVpwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJigpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIeYj4qSopObmoyKqKekno+Wh4R+a3uHfn2PjYOLkJCJjpOegZWbn5ygn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfXqgmXmjk3iAc5eIjJx9lZ+HnI6anaeIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnYJzqmeUml2bhXaFnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjn+ebZmQaqaZXKh+d7tqfalajoRds2dbbnF4d2tpW3Bpd3hhXmVWYUJQRU83VkJSbjRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xYGRlZWtkY2loZ2tplp2JqracqIljlZysu7Kwq52lm5qnn52smZ2wp6qdlqKZoZ+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJ2JlZCGi52RnJuIj6ihn5qMkYqAgGmBhnl/lox7iI2OiI6VmX6SoZ6gopOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPnp2YiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp+c6paXW97l4t4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfH1uZl9saHV7YmNfUF1WXFRWQFlFUWdFUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTXqGntLqzs6iaoouaqZubp5Kgq6Ogp4+enZyamZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVi4qKfINshIVxgaGMeIWNiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B+p2h3bX6Zc6BzcXydhZhvk4KtfKOEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqKPdWuPs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cH+DbGhmZG11d2ZfYVJaZVBRYUhXSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpvY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS36pr7K1sLKjnJiEl6agoKKMpKefl6mJmZeYk5mTkqCXjoeGe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYOOqZqTkoqFiXmEdoiAboGfhneAkoWHmKCVeZKio5mgibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUi4KfYJ6XqW15loegm3Whh3egfpCWi4FvTGajknGbiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdmt4h2ZrZmJzdHBtVVxSWGdPUmhJVUxYUlVcZ2tuVWdXTUpBSk1LSEtOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2JsKiFZUCUobOsr6+1oqKPf5anoqGji6SmnJumgpqXlo2XkJCbko6Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iXjJGLgIl6gH2LeXCPoIZ5gZSGiJWelH6TpaeclpaEZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG1vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6JjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhreHNrb1FWVVVlWVNtSVhPXEhYaGhzallrVlFSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupaqwsaafi3+WqpydpIuhoZqhoYCVmJONmo+Ll5COinyGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGrkIWQioGKfYCAjnNpj6WEfYWTjIeXn42GkammnYmmeJacfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiUoJZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian5uZ2xTVVlVYGBca0xcUlxJXWxtdmBbcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZ2lhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJapqp6op66jmYiBlqmZnaOJmqScqJ2Ei5qPhZyRhZKNjIx0hXqIg2+NhX6Xk3N1hnKRg25/i5KHhpSQfXuChZekjX+lpY2AjYmElHWCh5NvbIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1xfX16l5abhI14e319iJSVk4t3kZmhooV8f4lrjIVcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh3dJR1cHpvb4lvhYZfd2l4jmeCg4aPqpx/dH2XaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbWlnVlleVlxka2RVYVVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdpdWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbpqSZpJ2roqCDg5aqkZ2giZmmmqiYg4Gbi36WlIeOiomMcoJ8jnx+j4R7l450coRwlYZ8fZKLhoaPhnl+gIaYo4x7p6CKhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqJ+gqoOJjpWbf36Kl62okJOokXhxn5OEfJRwf6qHcH2VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiHF0a4N2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyDjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNj4Nud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Rtc3KDZlxtimtrYllYXVlYa3FbXmBZXl1lcn57c290Y2pqaXt8cnp3dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+emJ6ZqKOhfYKWq4yflIeaoZCklX97mIR8kpmJiIaGinJ9gIt2hYuChJaKcm+AcpiHhH6Tg4OGioJ6gISKmp+PgqaghniOl4iVi4ucl4SDeqyBkJeZk4mdnIaHoaqfoaKji4iTm52jmZaroqinoZOciZmQfXqQkIapf3+SkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdg4mSimx9jnd3ZoOGkYt8iZ6Fh4uPiIiBhYSRd3x7dZukioiLoIyHln+AjYOBd3F1hoV/eYmIi5GnkYSHjoiDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4dnbl9eWVpcUmdxVWNbW2FsaHR7fHJucGNqaWh/e214fnBob3BsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtla2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXt/mKmNnYyFn5yKnZZ8eJSCe46ZiYaDhIdteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkYapnoNyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iY+Fp3x9j5CRhZipoJyTnI6NqY2SgJ6NiZSboISPmH+Ij4RweYZydWF/hJCHdoyYgYOPgoaEfoaElW56dnWUpIyOhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+Cg4mJiHSDhoaJem1qfH97bWhrbGdeeX5nfHx2dHZ1endcYHB9bXRgY1pbXVBmbVNlWl1hamh1en5wbGxjampngH9rcn9ranRud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t2aGmDZWpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ylkJuJhqSTipiZeXmNhXyJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foaEh32PgI+bm5CIppx/cIuLjJKGoKGKhYx8p5CHjpGWkpWSd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWPiKKBfo2NkHyXpKCgkpmQkKWMj4GckYmUmJx/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9oeHJ5jZqTkYCYf4mMc4OJfX1yenyMhXt7ko6El6aUjYaRfISFhoR0gIGFhXhkcXp+eHlwa2pmXn1zZ3x1dnN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Bam19Z25wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGlsYl9xVnRvbG5geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbfHWjn42Xf4yhioialnd7hod+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSYen+OmJePl5qdpZ6alJWde5KIhXmHl46ff4KKjo1zl6KdoJKYjo+hjIyDl5iDk5aaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZvfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnd3fHN9d2ZrY2B+aWp2c3N1fXF8Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuViH6Fh3R9f4p/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqBj5igmpKQknSAjpKUip2dnqeZmI6VmHWQkYtth5mQm3uIiZCJb5edmaKTlYqMnYuGgZOdf5OTloiainyLioJ6cnprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI50koqFeol/d3mBfoeBfYSOho2VpZF5hYJ0iIZ8f3FzfoWBbGB6dHlwe25hbmJke2Ftb3Zyd3dzc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22LgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn17inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkYZ/hIRzeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY6JiIySnZOPjI1uhJCOkYmemaKhmJeKl5Nwi5uGZ4iaj5R6ioWRi3CWmpOhkZKHiZiMgn+Sn32Sj5OMmY98i4aIdHN2a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcW16f5uVfoWJdJKMgnWKe3CCf4KIfYWNioaOlqqOe4h9foqFd31vbX6DgWJnd3N0bnphXm9ganRecGp6eXhscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7e3N5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadICplJGNhqCMlZOQgHN7doV3eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaMi42OjJ2KjpGEboqLj5GKnJahnJmWhpmJbIelhWiInoqSf4yEjIF4k5iRnZGQh4iUjX9+kJl8kY2QjpqSfYuBhHB2cGxub3F8h2pzg4+ZinF4gHWCiYN6Z3NvdoKbkH2JhXqVk3t4inVxi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9ccXJxb293WV5vYG9qXm9qfHpwbW1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Zrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eMgHt3in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7dHVzf4J+pZabrZ+nloWMg36XlYOOnXSKn5OShYqajJWOjHpyd3SCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKRgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXOLhYiPiJyZn5uXlYGVgGqIn4loiKGIk4WShIpxg5GXj5qNj4uKjo13e5ORe46LjZKXjXyJfYFsd2pvbGxte39ien6PloF3eoF4g419emh1bXWIl4yAiYZ8lZFye4ZxeI57i457iX6EjpGfn4Z9fXiBinx2b2dqf4B3XndvbWtwclVdbmFxYV9sbnlwZ3BmZ3R1aHFsYXdlXVVlYGBxUlBOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10f3RfdHx4hnhzc4V8eaGQmrGdpo6Cin+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJl4OGY4yRmI2UiZaLjImLcHqViXyOiYuUkop6hn1/bXxlc3BrbXt6XIF5kI6Be35/gIaPe3ppdWt0jJCKg4eGfpeNbX+AcIKOgI6JfoR7g5GWm5uMfXd4go94cmxlbn2Baml0b2doc2xTXW9kcFpfbHJ3ZmtrY2d4c29wY193YGFVa19edU9OS2BmYlx4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkYqIfX6ZdmVzbnxlh39ub2uAWmtueXlyYHZ6e412cnaKdnqfjJyvm6CQgoV4iJR+e4ich4SekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkeHB8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi52Fhl6LlJeJjoiNioqEiWx8l4J9iIaKkpCGdoZ+fmx9ZHh1am96dFiIepGHhnp/f4CGjX96ZnRrgYuPi4SEgY2Yhm2Dd2+Jk4OShX+Ce4GRl5SbkXV0eIeMdHJwZXN3gGBzbW9haHRmUmBwZ2tVX250eWFzY2BpfXFybltjcmFjVm5aXHdNTUxjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R9fYh7dIuIiJWGjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyikoR8cIyUd3iJnIOEn42OfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHh2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTfI2SiIKIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6fhIlhg5WPhYiFiIyGgIdofZR/fYKFio6PgnKHf4Byd2h2cml0eG1ajH2SgoZ9gIOBhIuDdmJ1bYqCkYyDgICTkn5vg216iJGIlIV9gn6Bk5SRmIpvcnqMhXRrb2lwdn5dc2huXGl0X1FkcWhmU19wdnRgcGBdaIJxcmpXZ2ljaVdtV1t0TEpMZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIdIWDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp9iZmIiXuff4OZf4J5cXRub2RyfmhmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHi5mGgZKRhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoH+IYX+Th4OHg4iMf3+CZn2RgH5/g4yPkX9tg32DdWxtd3V0d3ZsY42Bjn+Ff3yEgIWJgHFgdHKGfZCOg32Akop6coVne4WMiI2FfIV/gZWQkpSFb3B5i390bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqDbnNiXGdfZW1fb1Rab05ITmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAiHZ4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFtaHpzlHNnc4d8cpKShJqfm5+Gh3V1lH5tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYml1elpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj52BiWZ9k4J+hIKIiXGBfWZ+jHx5f3+HjI99aYF+hHZncHl4c3d0bGuOhYqBioB5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmEfYKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgG9zWWViXWpuYHBPWWtRRFNnYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fIB0dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYx2aXeXjn6BioKUl4l5j5VvenRxbGlkYHN6aF9lcXpaYXJ8eWdxeWBlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSkXp5koeBhJiKfIZ/eHeJioSWgG+LiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZGVhYhwe5KCfIGCiINugHdogIR4cn+Ag4qIfGV+f4R2ZHFzgGl5cW91mY2Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXqCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX1yb1dnXWZqcWBvTldoUj9YZl5ab2tnenFbWlhrZVpjcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce4CCf4J/doGFiJeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fW9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnphcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYx+bWyFjIx1fI9/hYGViHyCeG52h4SDl3duiIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hnyIn5KNkZOUjouHf3uShnd+g4yCa39yaIB+eG18fIKLg3hieoWCcmRyaX5udXF1gpuLgH+FgHN2foFzgnBcbn91eYuEi3uIgX6JeXtybYmEkYWMc4N6gJeMjIB1bmt2gIB1c1tnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZW9kak1XZlE9XWVcXXVlYHVwWllVbmNZZHF5WmhdX2dtZ2lraXB3fY5taYKEfnlugHx9gX+CeXSBgY2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHp4hH18a4yNhJueloyBgGyNfWtofo2Len5+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyShnWFlYVzjoqJdm9shYOHdXmJeIl8k4d5fnJndYl+fphvcYZ+aHZ5bmZ5h4Skh4CHjYp+b4B3goN/jpuIg5WSmYqLhYl8j4hwen2Ee2h+bGqAe3pqeneCiIFyYHeBfnJkcmd2gm11e4aVkYF8goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgZGChnOAfn+UiYp7b25qbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRvcldqXmJoamdtbGhwd3yTbGiEinx8cH5+e4GAgXp2f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/god/g359em2FjIiZo42Eg3t1i3hrbISHkHh+e4KRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknx3hpKCc5CLh3Jyb4N7g3R0h3SId5SIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpORhHqXj5aQiIKJe4iIa3h5fnRnemhrf3lzaXp2gIN9aGB4iH1ra3RofIBpdoGMkZR+en9/cXx2fHR/YlZ4fnNzi4WCfYRxh4p4eXFxhIOOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbmhWa15haWdlbm5ocHZ6k21piI14fXJ7fnmCgYF7dXyDiIaDcHeEcm13goJ+iYuTf3CAe3d5eoGMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZXmRugHep2qnHhoeycYh3b4x0e4WNf3qSiX90c3R+d4BwcX9thHSUhXh1a2B6gnmJj2ZxhHBndm5bbX2AkJN/gHmRk355fG6Kd4KTjYV1l4uSj4eFhXt/hGx0dn5sZ3ZkbXt2bWl3d39/fGFieIZ6aXV1Y357Z3WGjo2Ve3SBd3GAe31ugFpXdX9wdoWIf4B6bYmGdHpsdoGEhX98fnp9dIuBfnRodGVui4Nsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVmpfYG5lZmtwZ3B2eI50a46NdX52eH53gYSBe3N9g4iHg29ygHRxdX6FgomNint3f3iDe3yGh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXyDiX56kIR5eHN5dXV7amx2Y4R1koJ2b2ZefYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinKEi42Jc5iPkYmGi4N7eX1wcG98ZmhxYm14cWprcXh9fXpdZXqAeGp2eGaDd2d0h4yOlH1yiGpvfoF5b31dWXN/bnWBi3yCb3CKgHF3aXiAgoCCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWtncGdxc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoNwcHt4d3Z5hoaHjIZ6fH90i359hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/d76ue6C2bmFzhWhze3F4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn94eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4RvgoOTiXSWio6IhYmFfXh0cW5oeV9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXRldYWNhpZ/cIxna3uEdW51Yl1xfWx1fYx7gmd2h35ucWl2f3l/gHN+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHBmcnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdn17bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWJXXFxof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFiZ2tnhnSNg25mXV99cHuJf2lteWdqZFVXcm+NpnyEe3aWkXV9dH58b318kod4mn2Ih4OGg311b3FsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneFi3yUgW+Ma217gnFndGZhbnpnc3iLfH5jd4R3amxydntxe3p0f2d/f4B5d29kZmJuhXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+ZV1nc2lmYFZkV2JwXUxLalhjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJvaXRvcn50dJqCd3+Ad4B/hoR6fXWChH6XhW5ydHx6dXGEhY+BgHqLdXSQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3V8enWDgYt6boRzeYR9goN2b2ppZVZdW1paU2JtZFtYYXN7amhtaWBiV19baoBqa2+AZ2tgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2kIRoZVhid2p+h3tvanBnZl1UWG9njqh3gXp8kI56dnGAcXR3epCBeZZ1hoOAhYh2anF1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56d2F3hYV5kIZ0iHJveYByY3FpXXF4ZXJ0iXx5Y3SAcWhqenVybXl4dnlkhHx/eXdxZGRjbnx8ampUaGFlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt2emVebXFpZF1WYVVubldLU2hXZl5YTVVsVEpceV9bXmtdXVpjZWB5aGxgb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtzlYF7gp+Gfod9gH6GgoCKe3aEq59/eoeHg2tygXl1gH6BdG6GbnyAc4qAanBuZGRYX1pZWlRhamdbWl91gmlebWxcYVdcXGyBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1lc2h6d5OBY2NUZXBogoV4eGdpamFXVllnY4+nbn53gIuOe3Fyf2l6cHuOfXiQcoR+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3Jrcnx+dXZidIWLfImIgYB4cnV/dWFwbVtydGNxc4V8dWVzgG1hbXtwa2p7eXZzZoZ2e3t2cWViZW1yfWlrU2deXFRLcWJQRlVgR2J2ZmFLVG9YSk1YWGdrdXpkZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYnhaXV9sWl5cYWNefmlqX250eG1wbnaDl3pygYB8f4mMhn11dYZ5h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Nwd3VsYllsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaSeV9dUmZma4OCdH5iZGpcVFddYmOPpGh4dIOGkXlucXxpem58hnx2inOBeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZHODkn+IhIl7d29yfnNieGRccXFicXKCfXRncoBlXm53aWVoenx1bm+CdXR9dHJiX2ZubnxkaFNnWFhUTXZfUEpZV0hidGNhSVRtU0pNWldpbHF7Ym1sc2NiWlpbYXdcU0xjXVhpU1dHWWBNR2l1WF5gbFtbX2JiXIRpZ2FueHltb2p2gZB5bYN/gIGTiISBdnSIdIyGdHJ2dYJ3fH1+jJCAfpN+cHeWg3yZk3mAgHh6foB0iIN0cJmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFhgbHZjaXVqaV5ZbXNwbHNzc2mEfH5+e3ZubmxkaXFjW2tyZHV2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3Bxe319c4F3gHN6enpkZXVoXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWhxgpWDh3+FdnNqcX1uZndYXWxuY3J0gXp0Z3B+W2BwcmJga3J+bW11f3NyeGtxYVxlbG16YGZSZVRXUVB1W1FPWFFIY3NhYEdWa1FJUFpVa2trfGZub3FiW1pYWWxxV1JQZldWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXl4bHBpdXmHe2uDfX+EmnyDhHl8h26Ph3Jvdnp9dIKCfIuPg4KXdHiClIWBn4l1gYCBdH+CcYeCdW+hlnN7houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2p0aGJ0ZWRcWG10bW91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBmdHh1fW16dXZwen92X2VyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXZrbYSTgYl8hnFzZ3B+cXNvVFxna2ZydYF3dGNtdlZicmxbX3BnfmZtd35zdHNrbmFaZGpqd15lU2NUVVBUbFZQVlJQR2RyX2FGWGlPSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5hZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+He3+GjHSBhnN9gnZupItygY2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU25ndGtleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXl+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXHdzbXtqdnRvcHyAc1hpbV5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmFjH+JfIltcmdxfW5zbmNbYWlpcHSCdHNeaW1TZXFlVWNvY3tkcnd8d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxUU2BmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyPh5GbhYB8jIVzgIFzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjY2NjY2Njo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjIyNjY2NjY2Nj4+Ojo6NjoyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjasJ2goKCgpV4qLy8vMCxIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+m2oKOkpKSqVhUcHBwcFzqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4aJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhoWFhYWGk5SUlJSUlJCPj4+Pj4+IgoODgoKChYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpKTj42LipCJj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yMjIyMjIyMjI2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIWJioaIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSJhoaHhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJgoeOiISFiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6IhoeGiISKkI+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6MioqOio6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgYCAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9/f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERUVDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0dCREZERENBVnSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktJSEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01NSUZKVmyBhoWEhYaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREFDRkhJSEhIS01MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI+ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS09VZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NTU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZFZnqDhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo6Ojo8ODk4OTk4Nzc6Ojk4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEQFF/g4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49P0BEdoODhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQUFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojw8Ojs7PDs9PkFAPmKFg4SDhYSGiYmIh4aGhoeIiYqLi4uKiouKi14+REdJS0pJRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERkVBRkVGREZGREBCPz1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw7Pj4+Pzs/PUA/Qz9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJTEdHR0ZIR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3PD47PDo+Pz5APT8/QkJFP2iEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj4/PT4+QEFEQ0lTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTU5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdnZ4ent4eHp6fHx+fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PT5AQkRETW2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0dDSEpHTEpGS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDtAQTs9PDg/PT0+QEVFPkNFQ0dLdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFFVUxCSUpHSkx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtMS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEtQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4ZsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NSkxKSUlMTUtPTVNvdHZ4eXh3enp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVVWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNOT1FPUVZSU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlBRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6e3t7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU05RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0I/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ6fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pz4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHt8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdPSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnd1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTk4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8/PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSkdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUVBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk5QUVFOUE9KTE1NS0dFRURCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PENBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lHQkFCQD9FRkVIRExvcHZ6eXl7e3p7end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj8/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0xHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFvamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEtDRkdIR0pLSUpMREdCPT49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0dDRDtBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSUhETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGS0NGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkNCO0JDQz4/Q0NDREZMTkhKTkhESERJTE5NSElMR0ZGSUlMTktKSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1d3ZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz46Ozs9Oz0/REI/QUNGR0tGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRURFSUlIS0lGSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWdxcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHS0ZKR0lHRkZGRURDQUFGRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFRENJSEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYW5qbmhyc2JlZmZkaWhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTk9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoaGdrZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSVRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQkJHQ0NERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xITEpNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVVlaWVxaWlxfX15gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNS01OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpJR0tLTUxKSk1LTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQkNEQUFFR0NHRkhGRUlGQ0dKR0dKRklMSElKTUpMS0dLSUhLS05RS1JRTFNNSk5NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdFQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpJSUtHSkpPS01LSUxISk1LWmZKZFxLbFJHTk5fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1VgeHZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkZGR0RESkRESkxLSUtMR0dOSUhKS0dLSklLSk5MTExMTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3FOS3J5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURCSEhHREVLSEdLTU1JTExGSk5ISktKSUtKSkpLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dIRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUVFMSE1NSE5KSUhOR0pKSEhOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtNTU1MSUtLS1NrYlppXl9qY3JyWl9Za29gZWVVa19kW2FiUWBtaFxqXG5paWRab2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JJSEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0xLS0tHSEpKTExMS0lLTE5UW11UUFVNUVBOT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUUtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhJS05MSU9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYlhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHREVKR0JJTUpLVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmRfWl1gY19ZX2JbYF5bVVlYWl9eZGJiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUZJSU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUVEREVBRUlEP0lLSE5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteY2BfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdIRERAREBHSEE+SElGT11hWltkXV9UUVJYXVxcXF9aS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhFRD9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYmBjYmJkZGJYUFJSU1xUXF1eXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUExMS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYl1iYldfX1RRUFFSWVNeXFxdXl9gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9PTU5NTkhMQkRBQ0NGREJBQ0RATEhCTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXWGRWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUE9OT09PSEtGYEVEXkxEZmNDTFtIXltzbU9NVm1ZTENQX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFVUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUR0pPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUhxbm9hVlBxcXRPQmtzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl9WVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtcGxgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUUtJWnhdVHhkaFhRU1B2Z3RscGJuZmtSck9Md21qcnBzcnFycG9wgF1menV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cl9gYGJiW2FhaGtua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTU1JOTFBJUVJUWVdXUVRQUFFTTEhneGxjeHFtWkpMVHlwdW11Ym52UGRkSWV2cW13b4BqZnh4aVhyUml7bWlqenp9bHh6f3Bnblh1dWp2dXCAYXNofWlseHxvX19fY2JcXmRlZmlqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSUtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dPVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9eGB5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN9emtteXxsdW58bHF2dXheX19iXl1fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tofWxtbHhfWnB6e19genNjcm94cWhkfGlye11US2xfdnVsanZ8e21+eWt8cF1eXmJbXmJkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsaG1tcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NTWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTlBVTEtLUlNSUlJPVlVRUU9SUlhYUU5QVVRYWFhbW1VRUldbV1hXW09SVFdXWFFdWFZdVVNPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSlJRS1FNSkpPUVRSUFFTUklJTU9QUVJRUVFUVVFYV1xXU1JRUVVVVlRaUU5SUldVU1lWVFlVU1FVU1VVWVlYXlpfYV1cW1pdXWBjXF1iY2RmZGVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZUXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFJSUVZWU1haW1lTVVJUWFdXWVtTT1NUV1VUWVVWWVVRUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2dmZWViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlRUT0tPVlRQT1RQUFFOTVFRT1FYVFFRT01PU1VOV1FUVFVPTk5RVFVVVFRSVFdVWl1cWlZWUVJXWFZbXFZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNkaGdlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1VcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlRTWE1PUFJVWFVVVVNVWFdbXl1cW1ZST1VWVltbVlFTVlVWWFRTV1pTU1FZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNnaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVVZWVFdaWF1eXFxeVlNOVFZWW1tVUVRUVldYUlNYW1NSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtZWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFZcXWhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1UVU5WVldeWlhRVFVYWFhTVlhbU1JWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWF9ZWVJUVVpZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxXV1dWVlddWE9VXFleXV1UU1hTV1VTUlNXUVNWVFhYWF5eWF1bVV5fWF9fWFxWUVlVWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tdX19aX1xWX19aXV5ZXlZTWVhZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNWVFhdXV9gYF1hXVdgXlteXFteWFZYWFtaX19aXldYXFxdXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1ZXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV5ZWFVXW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVtfXllZVFhdXV9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl9fWlhWW19dXGFhX11bYGFiZWJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWlZcWlpWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7fHx8fHx8e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7e3x9fX19fHx8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJ0PigrKysqJWKSjIyNjY6Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb3IyFxsbGxsUXZaPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5eXl5eXt4bm9vcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp6enVzc3Nzc3J5fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z2eHl7enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX19fXx7e3t7e3x8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fH18fXx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx4e318fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx8e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp4e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgIGBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKCg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn9/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH9/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhIODgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/f39/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgIGBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4OChIKBgoaFhIWEg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWGhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiYiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoOFhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4SEhYWDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4OCg4WJiomHhYeFhIWFhISGhoOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFh4iIhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGCgYGBg4OEg4SRkpGOj46Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICCgoKAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgYB/f4GCfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX5+fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foCAgH9/gH59f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhYOEgIGAgIGAgYCBgoKDgYGBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCgoOBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoOCgoKBgICAgYGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGEhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiImHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPjIqKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDg4OCg4KChYaEhIWFhIaEg4SDgoKBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY6LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYGAgH+Bf39+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8gIGBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgIGAgYB/i5OPjIuNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoSGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2BfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEhIODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5/f318fn1+fX18e3x8fHp8en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fXx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gIGAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3t8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfn6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF+foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWChISFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgYB/gH6AgX6AgYCAf35+fn5+fn9+foWFgYGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg4CCgoKCg4KDgoGBgICCgYCAgoGDgYGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYODgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt8enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX57e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIB9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+CgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7e3t+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOBfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgYF+f35+fn19fn9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f399fXyAgICAgH9/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGEgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fX1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYeFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hX50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fwd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYKBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgX+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+e4GTjXp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXl7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGEg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF2doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgoSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gICAf4B/f4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCgoGBgICBgoOCgIKChIN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCg4KCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5enx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCgoaDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBgoKAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgYKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWFhYODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF+enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnd/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4KCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f398fYCBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCg4OBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4OCgYSDgYODhIOEhISFhISEhYWFhYSDg4R/fYGEf319fHx8fH+Bfn5+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOChIWBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYWFhIF/goR/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4GEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfX9+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdYJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFhIWFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICChIeGg4OGhIWFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KBgX5+f319e317fH19f399fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYaGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhIOBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn2BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYaGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaEhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB+fX6Afn6Af319fIB9fn9+fn5/fHx9fnt8fH98e3t+gIiHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhYaGhYWDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn17fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhYaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaGhoWEgoOCg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX59fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeHh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYOCgoKCg4aBg36CgoOAg4J/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWEhYWGhoaGh4WGhoeHh4eFhIaFg4GBgYCDhYKDfoGBgX+DgX9+fn9+fnx8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYaHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGiIWFhIOFhYeFh4aHhYaGh4aGhoSDhIWCgIGAgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiIaFiIeJh4aGh4WEhoWFh4WEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYGAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6e3t8e3x7e3p7fX18fXx+fn57e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGEhYSEhoaHiIeFhYiGiYeFg4SEgoWDhIaChIWEhYaEh4aFhYWGg4SFhIWGhYaEg4SFhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICBgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSGh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+f4GBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSEhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLmwioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6OllVNSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSkppdXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaucYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Pzs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0M3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOztDT0M7S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0dK5j77UnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8PClLCcsZa4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6q+pKCLkcOTfX6vsNLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7GbuJuHnbrU0s2ensPQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7CbkJ+g0tPAoKDQz9DQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZ6qq6+RobnXr6Kp1NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuZlqKarZup2KOhutTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA0YWVpsWYotGen8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/hZ+gn5ybm63Hn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyYw6erpJ7FtKSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoh83NkpCn17mDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1Mu91dLRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTo8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj87ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njc3ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc3Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZWNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxoYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmddZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2NiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaXRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWV0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVteXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5uLOysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHExLu7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCysi+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6Njo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJWQjI+Pj5OQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWm5eXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJablpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZl5KTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaWn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmemqqmn5mnoJ+fp6ilpJ6dqqKinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIaemqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Svs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbu3sLWyqrqyrru2vrq6qretq6q4urS8rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rob3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwb6+vrW9s62/v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnY2d2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU08/Sw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czO0MzSz7/HxsrDzMzLzs/Fxse2v8m/0s3Lz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGVlIyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0szRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0dDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpoK+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7apqKihqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NLKz8zT1tLR1s3P1dXRxtHUytHU1dbO0tDY2NjXy8jNw8nOzMnLv8i/yMnNzc/L0M3Oy87Px8vP0MrOysLJxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmthZG5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm56jp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuyzrmrn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvM0NHTys7R1dLV1crAysHFzMLIycLMw8XIysrOyszMz83Ty8XIz8zIx8rExsDFycvN0NHG0M7NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2bkZSUj4+UgomFeHBxa25oYGBxaFlYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzMzPydbWxcS4sraqpK6submwttWhlY6NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrSyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm9wsbIzsTCx8DHzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8zOwsrLyMfL0MTFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q766t8GukY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysjBxczGyMvNycTCy8nCwsvQxMvIv7nBu8XHvb/Gz8rDv8O7ycbIusfGxMrAvcHLxsXDvcW8vL/DxMvFxbzAycLFx9LFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qwkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3u7rFw768wc3Cxr6+tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe5tLu2wMK8t73GwMO8ta6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2r7u/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwrKynnqKqp56rrLOtqaups662sLKprqassry6tsO5urqxqrW5u7TCurC/sb29u7W7x7nCt62qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PTlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpZWl1lbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquqrKqwo6afqq21trG9ua+4r6iuuLS0vLizvK+3ubWxu8Gxwa6lqKKssbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhaW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaelrKCdm6SmrLKvtrensKynqrSrtLmwtrSstrixsLq5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6afm6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw7+/xKCDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06Nzc3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6Oloaeem6Kbn6qwrbG1oqmqqauspLW4rbevrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+2vcC9w8G6u72Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm52lpqGlnKCgmpitrq2usqCloq2rp6G1sLGxrKeusqe6s6a2oaKemqOiraKhqbWqoqOmnaWmo5aYnpeZmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezrqmsrrK4sLq2ub2/t7KxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn56onJuaqqavsKubo6O3qqCfrqi2qaamrLCjt7Ckt6Cim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7y0ubeuo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSmp5+cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCtrLWeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqps6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaSkoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2toqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk1Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqiqpqiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6Wmn6OjoZSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcwMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqevoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZSloZ6SkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKek5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3Njc2MTMyMS0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqWkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlpWHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmYyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OSkpOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpyioaOYpJahm5WNh5iajHONgn2NlpaFkJmQk46Oe5mOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQn5edlZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnOKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHiJaemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygoKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZuNlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4Ozc3NzUzNDQ2OTYvMy8uMTI1MjIxLywnKSoqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiBioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTU1SSkpKTVBITFFMUlRNRUhBPDc3Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTQ3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNzIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVVUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QU1JSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNiwrNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bW1lYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSExMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVldVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNUVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iRlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIT1NRTk1MRklRRERORkJDRUdCPjk5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWimpp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqikh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPREpIVE9GSExGS0dGRkhBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSVFVVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVXVV1XT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpIR0xRR0RJSkFJRD4/QkJLQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5dX15cVV9daGVTWGFWU1ZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLSkhGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW11ZV1tfWGJiUVthVFJMQ0JGR0U8QEY/QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamlpYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9sYVpbW1ZeVlhkWU9cWE9RQ0JJRUNJPEFEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx3bGNbYFtUXlFcWk9PU1BPST5BR0JDRj1BQj9GRT5APzo9PT08SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIcG1gXl1WUldSWk9KR0pKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z1bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuOi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNsYltXUVNQWFVFRkpJRkY9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJxcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiIg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcbLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZmVYV05RUlxHQkVJST5CPj04Oj5APD5IPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6Hi36Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCe4J3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGkJGenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W+wL+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETUQ7PTw8OTo8Pzk9QTc+P0A9QD49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dn51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqEfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZOWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrq0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlST09IQ0xDPT0+OTk7Ojk5PD02QD4+PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4aLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZOOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7G4rKS9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlZRVVdDQElEPz8+OjQ5Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6QqpeXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbXFtNSVNZQkFHRDtCPjgzNzw8Ojg+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoqGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6ipLe+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU15UTkhJTUVCQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vco16foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSVkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJKOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaWzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BcUE5FQz48Q0FCOEA4ODU/Rz09NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyra29q5u7paitubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaYj5KhkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zNDMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8LMwsO5x727r6u5u5izt7qywK6lwaSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZimoK+cjKucjZaPkpGVlY6QlZKPoZSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1BMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLws29wrOtvL6our+9u8O3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWVo56qnpGlmoyPj4+Vloh8j5aTkqOalZ+hnLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjM1MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPBtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52ZlKGjopyYn5iLjI+PnohakJaXkpekmWWYo5+ypZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUhISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTEx8bPz87Syr+7trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2QlpxgSpacmpWapZZVl7Cgr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1MzQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIiEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLWqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+amqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc3P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzsjCvrmyr7m1wcLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG0qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC1r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpyVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/DyLW/sLy3ubampKusraGhmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pKmeqKudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaylm5WwppmvpZyZqJyejJiUnoOOoJqbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSFxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr/Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY6ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKSk5dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilorSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS9xMm8r7C2rbC0r7/EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uypqCpqZmZmJOio7igoaOSr7CspaefkqGelZ6PkI2VnpuinqezpqaMl7Kboq2ZnJqsj52SlZKZf5Ghlo+Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T01VXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwrSrtaiwuay/xLO3rq22uKWYqrKrqpifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqKSalZWUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6usqKmjJetmKSrlpidoo+ajJKWmIWVnpSMj5udk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzs6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaGptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxcC6qbakrLutwcK3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmanKmgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js7Can5CTpJmfqJmToZ2TloiTlpKVlpyTiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA8O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WmNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksriqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+4xL3Bt6+1p6u3sry+v7SprrG2nparrqiul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWplpmSkp2ZnZ+dkKqclZaElJaKnZick4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XFFoXE9ZXUdbXl1PTVJYZEpKQ1xiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLmytKupura6ub60qq2wtZeYp6yprJurq46rvp6srrKjq6CxrbOurrayubiqrq6xqLWvtby9yrOqt7WxtK+upqG0oJuoraCmlpabmrKiraCmr5ehpJqak46jpaizqqGms62qtqWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJSFpaPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t7+8sbytp7q5t7bCtqussbeUlqauq6ijsKmUr7ukrbGzp6ijsrSxsrG1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLKnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5kXD9ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/v7q+vLLDp6m5sLa2v7yuq7Kxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLWzta20raqsqKypua6yscjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2fo6Cgoqump7mlrLW3pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaabn56MkpGNkHZ9jYV8e3yGiIhwcnF9fH1cU2RvXk5ZZ1xGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKast6yyt7zAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvKe3sbKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStrLiysqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaTk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRc3FcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMLDur+zx8Oqrretsri+vrKtraqkp6qwqKeosaW0rquxr62ysbSstLykuLOtrK+oq5+jnrC3q6qtu7elt7akqaerq6qtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4uTkpGTopmbmYqOi4t9hoGBg3pzf4KAfHJ1i6SHeGtfYG5mV2WHY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbnBucDErLG1sbO6wL6ysa6sqquotqmmrq+qubCosrKvs623qre3p7S3q6ylqaqco56zs6mopLS1oLeuoKqoqqirp6CrrKm5taqqqamiqqCtnJOqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqQkZGPkp+XmJaMioN/dIaBf394dIJ+eXZ9gIedj29yZ2Zwd1xhc4hrT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqymrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wsC+v66ysrK1vLvCsbGzqrOppLSopa2zs7mwo664srCyu6u6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKigrJmQsKGYoqCnp56om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGLho2LkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXNyeGZ/hqR2aV9kaoB0Z4iMfVNYb15KeHNTZFNRXk1NUlpmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wbiwr7Sxuru4wLKyuqy4rKK0p6essre6s6iovbautr6wvaeurLWsrZypr6Ogpa2rqJyeq7OltKibqqepo6ido6moqb2stLCunaqkoK6cm7OjlqScpaWfpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyVkYuRm5KVh4l+f3J7en58aHh8eXRvb3tmhHiEiWRhZ2FyhHptZ3hdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGspbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK1s7K1sr24ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKSooa28qK6xrqGro6Sunp+tppefm6GjnJ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBvb3F2Z39zaYRoZWdfbHONbGFpb2BvPVp5a1VeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbDsq65srPAtLq9t6i5uL2qo7Soqaqxr7mxq5y8vaWwwbW2oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppijqKCxuZ+jsa+hrKGspJynpqmampufpJWdnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYl1lhX5fWnNqcUpJf2lYWk1QTEpIUFJRSU9cX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWiuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+rvbC0v7C8w7mou7q3p6e1qKirsa20saicv7imrby3sp+xt7CopaevsZuhpKClpaCXm7CnoZ+jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWTm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGtramdngmxlcmtrZGhYYXN/XlpsdWlZRX1dW1hPT0tISFJVRzI6Xl5sUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqurb+ztLmuv8G3q726tKWis6uoqrOsrrKkncO3pqm3t6ufsryqp6aor6uZo6ecpaaUmKGzppqepampnKGflKWfpLmppKetpp6loaiTn6mhoaGZm52hkpudl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGhmaWZjbYRmZ2hkZmhpXmViaWZaZXpiYFBzVFtbU0tJR0lPU0AhK2leakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup66vt8HAvbHBt7Cusra1ubi1rKq8tK+ysb3At668vLGkn7aspqa1qquvoaDFrKqnsbWsrLW6nqipq7GlmJ2qnqelkpmlrqOZnqSqoZuhnJignae2pq+prqGhnZ2hlaCmn6KgmZyanJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKJe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBra2xndXNrYWdjYnN/YWNlZmVpaWJlb1leWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlHQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsqLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGu7mwsKO2rKuuqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spp61q6ChsqWrsJ+mxaGzprCzsLeutZ6trqyuopmdp6qlnpWbp6agmaWjqZyan5yVnZ6tsKa4p66ioZqanpieo5qlnZefmJyVmqGTqZetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iYiEhYqMiJKFk5ySkZCQkZePkH+BjY6Cb4J/Z3luaGtqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXFhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7nAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqmdn6qjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKeknpmqo6WVmqCdkpyjq6qouZ6npKCXmpqdoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJeGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXWl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hPS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKquq6O9xa+pt8K4vrytp7axpqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2qq6ahn5yhqKebmKGlppycp6idk56gmZGfqKqjs6+joqOclpiYl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX97h550iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk0+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqv8Ovsrq8t8G/qqS3saqsprS1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqaCkpZuipZ6xuJWmp6e3vqasp6mqq6emoqCZoaijmZmno6WZnKWqlpOjnJWUpKamobako6CkmJWTmJOciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKpscK9srXAtbi/wqumtK2tqaiwtaqwtrSoqKa1pai5rpyysraqpaSnsq+usaarnqeksqSioaCXnKKgsq+Wn6Shtbqjqqihra2kop2bmqOpoJicqaCfmJ6oqJGcp5uUnqKno6Gwo56fo5aWkpiSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Okq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksbqwpaWvs6OquamdsrKwo6Whqq2wrK+mqJ+jorGco52ZlpmdnrCpmJyioLWzoauboa2sn56al6CjqZ2ZnqWgnZqhqKSQnaObl6GgrJ+lpqCaoKGWlZGWkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwj4aAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+nr7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKaeoKCwlqCalpaXm6CwpJybpKi1r6Goj6mnqpudlpigpqmbn52joJygo6WklpufmJqeo6ubpZqcmqKgl5OSk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hYR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyh2uWh15StbTIhX6IfGOkM0Kddl1RamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltKekvLfBsLrAsre1vbS2qLKxpLKzpqCvtqmbqLqupLCxobK0saGknp6oqbGptKmlnJ6erJeZmZiYlpijrp+cl6iusamjno6soqeWnZicoaeimKKhoqGboqOonJ+hnpWZm6ehnKaUm5ufoZiQkpWQnYiybmi1cqyIcI6nc7R1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4ZhlohdWcqdb8CAdE1LtVNVxmRWUmpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbqsprWlp7a7vLK7v7i3tby8tKa1taOysqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6mflpWZmZOUpKuimJOnq7GmoZaSrJ+lkpShnKWnoJWbpqeim6Ogrpqhnp6Qlpyjn5yllJ2VmaOflpmWk5uFrHx4qHejj4uHqXCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1edneHZ5eIal2vd5Wfj3dsNXnIrrNgRFVvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhta2goKmsoJWotqyosbKrrbSkm6mgoKiitaemqqSZnpWlopSUnZqSlqSonJSQp62wpaCUmKmfoo+RopqppqGVmqapnp2kn62doZ2gjpSfnJ+gmJiclpeioJSYkaeeh6l+f6Z5oY+QhKpwrY2Cp4aXoaKKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFtNdF1iZk1aYV9ydF9KVTVKmpFYSEU9SEZBTTM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rraimtLC4sbW/ubqzsrm8qru2obKln6anp5+Tq7KpsKq2raqvoZiioKakpLqjo6yhl5uRo6CVlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKyolZipqJ+foKSuo6GeoY6VoZmfoJKcl5yWnqGWl4+snI+ubnK0dKmMd4umdLR6dbSClKakk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA/TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcsb+uraurp7epuK+1wbW9srG7uKvCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOtnJaZkKWjlo6eoZyZnp+Rk5WrtrCmmZObrKmXjJSmmqWto5GXq7KkoJ6orLCZoaOQmaGXoJuWm5ehlJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNUgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62pqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGqpaqypLWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaSfmZ+akJaTr7mxq5WXo6enlJCWpZ2krZ+RoKirn5yfqaSynqKljqahlaGanJeVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4qGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iWeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD9KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUrKSuqqa2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnqOkoouTkqacpqudlqmlppyboamnp6OpoZGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zod7vr/Aum+Sg3GUhV9yalpem4lhY4eOlWtgf5RjbZx2YpRrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fIpqWGx5gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERU08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6xs6ehpKqdo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6sm6edp6KJk5Kpm6iknJysn6OanKOnraKfqqKarpuUpqCXlZ2fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJaHlJWJg5OTkImNkZSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOCdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZSOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CpprOnpbC1qsmrrbKmtabAqLShnqWmnKWWlqCrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVop+eo6iTkJioqLLDr5mrnKqej5aWqZ6rnJ6hrZihm52ipa+moaSonqyYlqWdmZqhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWOm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPz8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKCoo6GemZeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaSqlpaYmqeeqZygpauUn5+dn6quqKWjq6Grmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+aIWKZWVpaHqNoo5raIyXkaJ3a2qLmaKfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJveIJ4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTldJZFhASjM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCfrZigpJ6impqnrJyso6aoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGnr5+dlZ6jnqOdpKqokp+hnqCqr6mqo6qeppulnqegrJahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKqBfMvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+Ad3mBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtWSVFaSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX19hX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjr6mwr62msravqqanprGroKuYm6OgnJuqp6Kdq6KlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7Ghqa+plpKfnqKZo6Sqo5OgoZ6drK6oq6WjoaSfpKWcramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4CvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h2dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcXl9fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8WzqKmxrpaTnpyil6Gqqp+VoZ6dnK2upqmom6Wlo6GqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhYyYdoWoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F3bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsa2mrquWlZydopmfrqydlqGZnp6psaeoqJuqp6OiqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXqjn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOop6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G1qayplZGdnaKZoKWznZqhlJyep6qqoq2aq6egoamisqyhqrOyopyrqbCwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9eb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2lop2zuayroaabqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ybppyglpCmrZKanKejoKqnrqGjp6mws8GxsqmtqJSJmJ2lm6Kkr6aXopWYnKWlqZmunKympZ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaavrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHCsK2qraqRh5Gcp52jpJyll56YmJmlo6eYraGso6SXrqW7rKK3tq6enrazurO1qZqfsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqGgtaeiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+pq6mijISPnKKhpqOVmpqcmJqYpqOll6mnq6Ckm6ymvKyVvbCtn6OxtLuttqmdq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd0a65dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmpsfmJ9dG1/eV9nZXBvaGdoQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgoqugr6qarqGRqqmlloqbkK6xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinqqqhop6oqLykl8Otq6OirbS8rbCpo7Wxqq2ad69+kYuchYd9uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgLJsZm6Zl4uIsVp9tFukg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtl42mmYiVjpKTeHeMm3xjc3xig3d0gHxhamZwbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iZrpOaj6maoZ2knpmjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp6yko6SipKm6nqDGp6apoay2t66wqaG+sK+vl4KqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursL2seXiivrt0gJWMpJqNmY6TmXd/j5l5Ynx5ZIxmeIF7YGtla2piUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAurK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+tr6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqinnqimoKKqup6pxaOhsKSstLassqyjvquxsZx1dqqlt4VliZ9wZ6yQio9ubnelkJuggnaxm5dxkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCWlZeOk5p6hY2TdGSGd2eManh+eWRsY2ZsYktlV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkraytpo6WraqQjIWVl62fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrK+uqrynsbqYjKKppraciZaimIapm5CUnZKqtJqcpK2itJikop+io52ipaKWrKeMkpONh5OdnZWQmZOYkI6VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkp6UlZOdgIWSi3Boj3ZviXd2fHlpbGVkb2RVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp6TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2Yp56atKOcpqu3qK/Cr6S4p7Cwsq6rrLa8o7K/mpOnpKa1opKdpp6NqZ+Nkp+irbGboqSzq7KapqKepaufn56dl62ek5qinJSQl6uZjZiYlpCWnpGHoJ6UlIWTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpGfkJqTnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqJabuKajlJipnI6GiombopCvnqSWqKChkpeZnK6LqpaPqJinjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnKednbeif4OutaKwsHWkv6SzoXl7oq21vpd4r6ahioCqf2RcYnafjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJaLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McnmhlpVkeJeFgHaXaIKJgm55f2pwZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeYF9gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6kp62lkpaqtK6wpZmppaqXc4ucr6Coq6eTlrmgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKWaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPkp+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MiZaimnmAi6yGnZ6jqaupiZaHmXemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0h4WXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZXFaXEdTTFFARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmUrcW8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjZCdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhamOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAiouDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZsV2RGXVFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6ipKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi46Qno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoI2tsYikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVwn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xraFdmTV1YRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZafoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ+efpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuOkaCLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHOkc56CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtycmVbZlxhTEQ9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpJmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32RiY6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOegZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKqtgK6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX+ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3hhXmRWYUJQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96ioSWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX6SoZ6goZOYcmifiqCPjHCSjIKpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V7YmNfUF1WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhraZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoCJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIeRl5N7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKOEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211d2ZfYVFaZVBRYUhWSVRfV1NbZGpbZFBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKefl6mJmZiYlJmTkqCXjYeFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkoWHmKCVeZGhopmfibOhoraLeqynpK6lcKmAm5GGgZ6UfaSBopqGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH56nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdHBtVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentVUU9tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJumgpmXl46XkJCbko2Hg3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6So6ablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aAiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJkZqdol3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3Nqb1FWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCEd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaafin+WqZydo4uhoZqhoYCVmZSOmo+Ll5CNiXuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWTjIeXn42GkKilnImmeJabfqWJloyymZ6RhK+Xn6V5mIl7qXWnkISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ7cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ21TVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB3YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmYiBlqmZnaKJmqScqJ2EjJqQhpyRhZKNjIx0hXqIg2+NhX2WknN0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Imp2Ii5KqoqCPgHSUl4h+gXmUr6R/gpxxj4Z5ko2GgHtyqI1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaomIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmlnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gHmLhYJ+fG6AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roqCDg5aqkJ2fiJmmmqiYg4Gci36WlIeOiomMcoJ8jnx+j4R6lo50coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh52choqaqJ+gqoOJjZWbf36Kl62okJOokXhxn5OEfJRwf6qHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eMiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoNud4uCb4OLd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomEe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKKhfYKWq4yfk4aaoZCklX97mIV8kpmJiIaGinJ8gIt2hYuChJWJcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeZk4mcm4aHoaqfoaKji4iTm52jmZaroqinoZOciZmQfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x6dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeDjJCLeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHN7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhnx6eXx9eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ajoZiVmZiUmKSgnXp+l6mNnYyFn5yKnZZ8eJSDe46ZiYaDhIZteIB/coCHfoiSg21rfnqXh4SDkH6AhoSHfIeDjZudkYapnoJyio+GkpKLnJF8jXupg42Rl5WOmpWGhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpipoJyTnI6NqY2SgJ6NipSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW96dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhY+BgomJiHSDhoaJeW1qfH97bWhrbGZeeX9ofHx2dHZ0endcYHB9bnRgY1pbXlFmbFNkWl1hamh1eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+fHt8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWtUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeHmMhXuJkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpSRd4yjoKGdlpp/gZCamZONmqOipJuYkpyAkId7gYWQiaGBfo2Nj3yXpKCgkpmQkKWMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOh3OKln2IjHGMfoKFho9qeXJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQfISFhoR0gIGFhXhkcHp+eHlwa2pmXn1zaHx1dXN8cn9qXmB0dnB3ZGNYXV5SamhUZVheYGdpdniBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnd6hYd+g4l+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlZ+afW+LgZGThaWbh4yJg6aVhJGKlZaRkHWRnaGhmJSXeX+OmJePl5qdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KdoJKYjo+hjIyDmJiElJebf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZ3dwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4OEjHeHg4KBdXp/hoNzXnZ3fHN9dmZrY2B+amt2c3N1fXB7Y2Nhc251cm1hWV9dWmtkUmJXX2Boa3R5hnFiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnFleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4e4CLfXyDe4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkIqAj5igmpKQkXSAjpKUip2dnqeZmI6Vl3WQkYtth5qRm3yIiZCJb5edmaKTlYqMnYuGgZOdgJSTloeZiXyLioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWZ0an2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ8f3FzfoWBa2B5dHlwfG5hbmJke2Jub3ZzeHdyc2F2YG9sdW5vXFpeXV1qXU9cV2JhaG1zeolrX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2Z2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx7gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4ibkJV7ioWQinCWmpOhkZKIipiMgn+Sn36TkJOLmY98i4aIdHN1a3Fvdn2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEd31ubX6DgWFmd3N0bnphXm9ganReb2p6eXlscnBleV1tbHNtc1haXV9halpPV1dkY2ZxcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW9tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eH9yc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4uTgI2EjIF4k5iRnZGQiYmUjX9+kJl9ko6QjZqSfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEd4GKf3d3bGl+gH9bcXJxb292WV5vYG9qXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYW1XUFNZZWZidW+EgmJda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx3eF9xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShYqajJWOjHpyeHSCcHKFc3F1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKRl5uRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLj413e5ORe4+MjZKXjHyJfYFsd2pva2xte39ien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fXiBinx2b2dqf4B3XXZubWtwclVdbmFxYV9sbnlwaHBmZ3N1aHFsYXdlXVVlYGBxU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfW9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Fqg2CHfm9va3tgaW10gHRfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHZzgHBvhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqViXyPiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5uMfXd4go94cmtlbn2Bamdzbmdoc2xTXW9kcFpfbHJ3ZmxrYmd4c3BwZF93YGFVa19edE9NS19mY1x4cIp0XFtldmBhZGSOY2BmYlhpc3Nta3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh39ucGuAWmtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlwboRvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOm5uXmY+Qdot4cImLjX+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4J+ioeKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeMdHJwZXN3gGBybG9haHRmUmBwZ2tVX250eWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnOKbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXF5bIt7bnRwgFdweXZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJWMf5qIhHxzd3Bzam+Ba2lsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWlJiGjXaIgHKHhIuJnKSFlo6ghIphg5WPhYiFiIyGgIdofZR/fYSFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlvcnqMhXRrb2lwdn9dcWduXGl0X1FkcWhmU19wdnRgcGBdaINxc2pXZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXmTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXuff4OZf4J5cXRub2RyfmhmbHZ2W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKRhoaXjHuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpOUgol2hIh4hYKNlZ+hiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH6BhIyPkH5tg32DdWxtd3V0d3ZsY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFb3B5i350bG1paXd6YWdqaVhrdFlSaHJpYlBicnhsYmVeWmqEbnRiXGdfZW1fb1Rabk1HTmZkXGZucoBrWltjc19cY2t2ZGVdXVpsbGJtanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuDkm9te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmXyMmnZ+dnFvbGphdHxnYmlzeVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVjIGEmot7ioZ8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SEcoGKd4d+i5ufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5gICIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5te4l9dnRuZmV7dGJbcGJXbnFTU21yaGFOZnR4ZmBeXVlvgW9zWmViXWpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIhufYt1aXeXjn6BioKUl4l5j5VvenRxa2lkYHN6aGBlcHlaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koeBhJiJe4Z/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4idm5aNlZKWhohxe5ODfYKCiIJtgHdogIR4coCBg4qIfGV+f4R2ZHFzgGl5cW91mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlub36Ef3Z6ZGZoe29eWHZaWHBrTldxcmZgS2x3dGFeXFtadX5zcFhnXWZqcmBvTldnUj9YZl5ab2tnenFbWlhrZVljcHleZ1xeZWxnZWtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZoaDb2d5lYh9foSCmImBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6eLgo+LhH5ugXZ5hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eG58fYKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cbn91eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bmt2gIB1dFtnZ3VuV1Z7UllvZExacnJlW0lweG9cW1tZXXR+dGhZYltnZm9kak1XZlE9XWVcXXVlYHVwWllUbmNZZHB4WWhdX2dtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cmdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjYp+b4B3goN/j5uJhJaTmYqMhYl8j4hwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251e4aWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1cZmRycFBaek1bbltPW3JvZFVLc3hpV1lZWmFwgHRgXV1hZ2RpaWZOWWhNQGBjW2B1YV11bFhXU3RhWmRucVZqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+Dan17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4Nwc3FjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKInYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4iIa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoGMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f353j4aEd2pxaWyHgXFvXGZhcW1JZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSURjYFtjcF5dd2hVV1Z2XVtlbWdVa15haWdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnt/hGx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358Z3WHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoGEhX98fnp9dIyCfnRodGVuioNsc1loXnNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXGEb1xgY21lZF5vY1RcckdCZl9dZmddW3tiUVZcdFtbZ2thVWpfYG5lZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNint3f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdXSDeF59hZeLeIaDc4WGhHeJe2JubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWG16hZuIgoFzl5R4f31vinOFjI6JdJmQkomGi4N8eX1wcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2d1iIyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouBa3FXaV12W0dtakxWVV1TVXtrYU9UdXJQUVRXXmJ0hWldYGxqZmNab2FYYnBIQWdcYGVeXFZ7Xk5VZXBZW2poXVdoYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ6fH90i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4mjgYV/cZmTcoF6d4Rvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXRldYaNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2f3l/gHR+bXt8gnt5cWZsYm6JfWxtVmlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9mdYNmXmBxaGdiV2pdXGtoSkRqWWFkVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW5renFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+NpnyEe3aWkXR9dH58b359k4d4mn2Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ2YneGi3yVgW+Ma217gnFndGZhbnpnc3iLfH9id4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dhanZ+Zl1nc2lmYFZkV2JwXExLaldjYVVUVXNWTFh1ZFlea2BcWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2AdnujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njqd3gXp8kI55dnGAcXV4e5GBepd2h4OAhYh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kIV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhHx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVRaZWt3fGZebXFpZF1WYVVublZKU2dXZl5YTVVsVEpbeF5bXmtdXVpjZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4RxdHR/eXZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3aEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+f3+GbmR1cmRnZ1xqYVxvb1xnX210ZXpoXXSAb3JrcXx+dXZidYaMe4iIgYB5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZzZ4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGdrdXtlZW5xZmRaV15Yd2VUSlxiV2hYWUhXZVBIYXdaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8dHV1gnl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiHNxj62Me3uGj31lcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRpdGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOPpWh4dIOGkXlucXxqem99h312inSCeXx4f2hkdmxgZl9eaV5cc2tZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk3+Ig4l8d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldpbHF8Y21sc2NiWlpbYXdcU0tjXVhpU1dHWWBNR2l0WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHJ2doJ4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIN0cJmhenp/iZR3Y3SGeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+e3ZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gHN6enpkZXVnXWJZYGdaXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3J/bW52f3NyeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpVa2trfGVub3FiW1pYWWxxV1JQZlZWaFNURlpcTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Jvdnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYeCdW+hlnN6houGemR2iW5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY25wg4WKdGtpfHBndXh1fW17dXZwen92X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol8hnJzZ3B+cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH50dHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUVm1oZHxpa3hrYlddVVt0ZFNSV2hRWGZUU0haWlBNd3ZaX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZ3SAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN9gnZupItygI2LdndseYtgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyAc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjICKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1htZGB4aW5+ZGBVX1RddVxTUmBmTl1hVVNKXFlQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHqEcoKDeoiOfnyJh415bpCKdWxzgnR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1EREREQ1hoZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU0TWFfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlJSUlYqFhYWFhYWHiYiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpKTj46PjI6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2LiouLi4yLjY6Ojo6Ojo2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiYiIjYiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhYaPiYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4aHiIyIjo+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6Ih4iGjIiPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6NjIuNjI6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5e3t7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT8+PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJFQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD9ATmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdJSkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY7PENAQkZIS0hMS01UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkVKYniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP12Eg4ODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDs5Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9Ed4KDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFgoSDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf39/gICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSkhIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTU1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk5TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZU1lYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiHiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1XXVpWRVFZW1xZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdSTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeVFFRUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBPTUxIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDREBDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEtHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl1cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBKYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQ0A/PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sb2toYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE57Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXd1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lYF1ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd5eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhYWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1VRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p8e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlZZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdJRE1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BSUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4ent7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRURJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTkxNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURBP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESERJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOT09NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRURDQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1qbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0RCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQUNHRTxARUJEPDg6Pj4+PDxCQz1APkFCRkNFQ0NHRENERUZHR0dJRkdLSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11gY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkZCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERkRGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZV5kYGZoYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VJRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxKSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGViZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRUlMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZiYWNpbmhjaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lFQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Vfd3ZpamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RESkRESkxLSUtMR0dOSkhKS0dLSklLSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOS3F5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHREVLSEdLTU1KTExGSk5ISktKSUtKSklLTU1OTU1NS05NTVtycG9ucHBsa01QUWxYTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRkVFQkFCPT8/RUdCR0RJRUVEQkZJSEhER0tKR01MTkpMTUdMTklNS0hKTUlKSkpKTk9OTk1MTk1MXGhkdV1scVdsTk9RbVVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSE5KSUhOR0pKSEhOT01OTEpOTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNFRUVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRktNTEZPSktXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZJREVERkFAQUVEQ0dCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhKR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkFFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQUNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF5eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eZGNiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSURGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSU5bY1leXmFfUlRTV19gXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVteZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJWVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNGS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX2BkaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1hiXGBgX2JjYV1iYldfX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTkhMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVRSVVpYV1lXV2NWT1NUUFFPT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTV5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSEtGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRQZlpoaGVaVGtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtPVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5PUFBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9wgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGFWbkxxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ1VVdsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUE1MU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUlJPVlVRUU9SUlhYUE5QVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl5nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRSUFFTUklJTU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFRTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTkxOT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FUVFVPTk5RVFVVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBcXGBgX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgX2BWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hWU1JUUlJaT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWFhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGVgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFcXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVVTTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVNPV1FTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUF1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZXWlpaWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlVSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxhWV1VVlpbWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF5ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXllZVFhdXF9fXl9bWl5eYGJiXFxXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYaXFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5fWlhWW15cXGFhX11bYGFiZmJeXFNcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJhrPW0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyIv+nl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXl6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enp5ent9fHx8fHuBhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z2eHl5enp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH16eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fnx8fHp8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fHx9enx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6ent5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgYGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCSj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhoSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgYOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCg4SDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB+fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIaGhYaGhYWFhYSFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/foCAhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaHhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYODg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOGhYOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aCgoSEg4KFhoiLioaEhoSChoaCgIWEg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42QjYmGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fXx9fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4ODhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWTko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn9+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaFhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBg4WFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiJh4eHhYaFhIWEgoKCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgYKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fX18fH2Af4CAfoB+foGUkYuMjY2PioWGhoWEhIWDg4KCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOGf359foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjo2LioaEhYSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goGCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgYCAgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHiIWCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fn5+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXx9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiYiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoKCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCg4KCgYGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH1+fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1/fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB/gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX6AfX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fn58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBg4OAf4KBhYODhIGBg4CCg4GBgICBgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgICAgYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICBgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhIWEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhYSFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fn5+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB9fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaGhoWEg4SDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIaFg4GDgoCDhYKDfoGBgX+DgX9+fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeHiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhYWCgYKBgIODg4J9gYGAfoOBfn9/gXx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYCAgYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX19fHx7e3p6enp5e3p6enp6enp7fHl7fXt8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXV1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1NXV1dXV1dXV1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2NbX19fX19fX2NfX19fY3N3d3d3d3d3d3d3d3d7b19jX2NfX19jX1tfX19bT0tPT09PT1NTU1NTU1tbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKh6a6uLi4uLi4uLi4uLi5s3hzc3Nzc3Nzc3Nzc3Nwkru4uLi4uLi4uLi4uLe90tLS0tLS0tPT09LT09Pc4uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU0+Dp6Ojo6Ojo6Ojo6OjpZkyKSsrKysrKysrKysqJWGppKSjo6Ojo6Ojo6Ohq9LS0tLS0tLS0tLS0tLR3+rq6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dThaikpKSkpKSkpKSkpKabOC8wMDAwMDAwMDAwMCtlqqWlpaSkpKSkpKSko6zS0tLS0tLS0tLS0tLS0d7q6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiXoysqampqampqampqamroEU9Pj4+Pj4+Pj4+Pj45bq+pqampqampqampqaiw0tLS09LS0tLS0tLS0tHe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Ozs7Oz87Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvP0dHS0tLS0tLS0tLS0tHKysrKysrKysnJycnJyczS0dHS0tLS0tLS0tLS0tTU1NXV1dXV1dbV1tbW2NnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7Ozs7Oz9HOz9PTz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbW1tbW1tbW1tbW1tbW2NfX19fX19jX1tfX19fW1tbW1tbW1tbW1tbX19bV1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7Ozs7O0cGn0s+hlsvRxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs7Pz9Gdj8WqoKufzpmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Pz9O6r6uxn5WPobSVh52dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/Pz8/Tn7Gep52fp5m0v8mWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz8/RwJyJm7WkoIufw9KRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxCQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/P1KOigZvFmcXJlNiso7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ozo5P0A9PD09QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0cSfgXuXn6KVlaG7zYiVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDs7OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NWrr7zA03mbsLOdpdDbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87Ozk9Pj09Ozs9PEBDQj8+PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVyYd/haKCo5uinZyRqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhxtPT1ZyasqCpoKKeqaKpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BQ0JAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNLR0teoiM+wjZGl1JqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8OT0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dHSz8XU1cC91tTTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo8PT86Ozk6PD1CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHS0tPU0tLU1dPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo8Pjs6ODo7Pz8/QkJBPkE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY7PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5Ojw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT4/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw/Qj86ODc3Nj0/P0A9QEA/Pz09Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09LS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj08P0A/PDU2NzY8Pj8+PEBAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQT8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQ0BDQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo7PD47PT07Pjw6Ozg5Ojg5QUFCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCOzk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz07Pz06OTk6PDk7RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2O0RBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDxERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Njg1OEA+QDs8OTw7PD46Ojs5Ojs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg6ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3NzY2Njg3ODQ7Pzs+PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODc3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg2Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2NzU1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc2Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODYzNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzg2Mzc2Nzo2NjY1OT4/Ojw/Oz85Ozo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTw/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3ODc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc4OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PDs9Pjo7Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRURLUE48OTg4NjU1Mzk1NjY3Njg3OT46PT46PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NTQ3NzU2Nzk9Oj0+Oz08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTQ2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA0NzM3ODU3NjY6PT88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBODw7Njo1NjUzNDY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjY0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6eoKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eWlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ycnJycnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpeXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXkpSUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZyam5ubm5uZmJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb64trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpqbm5uam5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrOvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/Ojw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4Ojo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBRQD87Ojg6ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXRkaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOzMzHwcPHx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTL0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxcm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPEv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZWJhYmNjamJmY1pZWVxZUU5FPTs4Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwcq/scK/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njo6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G7u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozo2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs6Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm+urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1u7a5xLi0vLa6vcG8u762v8G/vL+6wMvCx8jAv7y8wMXCx8vIwcPAwMnLwsC7u7C0vL3AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBuaVtfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+ytLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dnducWBfZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7GmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLaqr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm5jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo9ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFvru/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu2vL24sq2zsK+srre2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqqiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGsq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxRaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZGYkJaVmJafmJuZm6OZl5SVmp2gnaeopaCjo6Gjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/NzQ5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKeonqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmp2Zn6SinqCfoqadm6WmpaSkqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx1dnNogmxlXFNaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKirqLK1t7O3rLG0o6CdpaCsoaGioKCamJaVn5ubmKShoJ6koaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmrqKeompmdmqqmn5mnoJ+fp6ilpJ6dqqKinpufqKClp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopicm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREFEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yvp7GtscK2uMLGwMjKwMq/sLm5vbnCvri0u8XDvMK7t7Opsq2qs7Wvs66qrqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijoqGknqaZm6Kknp+bm5uch4WBe3Rxa2t1cnBoV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw/PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUM/QUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ+lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jBwMXIzdDIy8Oyt7W+sr7Fu77MzcXMzMzSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qretq6q4urS8rq24oqWinqeloqOpppqbn5ianaeqp6ChoaSYlKOWlJmRnJ2fpJ6on56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk9Pjw8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8Oj1BP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM09DT08zKwsXGxsrHzr/J0MvGxMbEwbvDwL6+vrW9s62+v8LDxsTHxK6+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMztPNxMfJysHFy8bIyMW+wrOzx8TLysrOxcq/vr+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9PD0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfHdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHR19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Ry8bN0srS1dbZ1dfT1tjO0snO0czP0MzSz7/HxsrDzMzLzs/Fxse2v8m/0szLz8XJyL/DwsjOzM/Qz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzdHLzs+/xcLHxc7N0NDRyMvMwMrLxdPOy87IxMnGxsjMytPT0dXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazpLaqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jNw8jOzMnLv8i/yMnNzc/K0M3Oy87Ox8rP0MrOysLJxsnMyszR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzNDw9ODY4NTU7PkA8OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PT0/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuxtqmjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Uy83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vM0NHTys7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvN0NHGz87NzczPxcfAt7m9w8O9w7mys76xvMTEtaqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa25oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3Nj88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6tuLvBxcmhl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnFycnGxr/Dxs/Ox8XHzcrRyMvOzcbR0s/OzNTKx8vOz8fHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRsYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qsXd1sexkY6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGBrcnJvb2tsb299uNHIycrPy83EusDDu7u6ur7IxsLDwMPHysnIysfBxczGyMvNycTCy8nCwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysrGyMbQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2c3Rmalthbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vK/Yw3V9koyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwrG2urKys7Kxwry8u7m4wMHBxb69ub2/ucTKxcbCvcbAuLvEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsbIxsjG0MbCzMiyx8rDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq603BWjo6Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wbiusLCnqq2sp7i0t7SzsrO6tb2xt7C1r7K7wrzBxLy/u7Wyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8XAw8XGyMvGwMbGu8jLv8/Kx8PGwcO3w769trm+xr+stbq1t7aOeHR4Z2dlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9vblYf5KGiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam1ucnykx7+5uLWwrKynnqKqp56rrLOtqaups622sLKprqassry6tsO5urqxqrW5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8fDxcG8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlYV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzw+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vbetd5OJj5B8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrrqOnoquprKqwo6afqq21trG9ua+4r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuvspKEiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLK0sLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RIRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpWeoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKOFh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZm6SmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rs7OqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIV5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCuqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6ep6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaWrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGkppujq6WipKqjq66krrGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDc7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl9fX2JkbY6PhJGGj5GPmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE9QTFBSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKawvKego6y0q62nsLSwubXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3WJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8tayrsaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFJTUpBR0tISEM+ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZxhYiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpLPTc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ+XrbSipq2YrKuYp7Siqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09KRkxRTUtQSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l7gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7CroaSkkKaqlqGqnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJSEZLT0xNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyjp52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkIqMZE1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2c3KSd2d1hISEhHqViYiKjIuAf4SKjH+Ug3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgoJadnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYWFgmRLSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWFhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB+fn9iSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36BbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90dIWCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFQDo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dHd5ZE9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94cmhVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfId8c4ytjYiAaGZiaW5ybXCDdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvX0pQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6JiI5zipePg3tcZHF0ent3imxnaWF4b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1remxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIl7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm6FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05ODg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjc1Njc2ODtERkxNTUxDNysiJicrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIiImIoqujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4WCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Pl6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mfhJOShZygmpqZp5GRiJWhmZp3en6Ul5GhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4uWmIWlpqCimIKmmY2iqqekh4WTo6CgqqCkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrbO1opWmqomaipOKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4tK61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CHeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA/R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3ure/uLq4uq2tsaaxqq6+sL28w8Osmbuola6PmJmriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVmT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPUU2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6WfpJOip7CzqLKyvLbBvdPJydPGwsXMwsrEwL6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSwvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16bGVwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRLREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqxrbewvLjU0M7Wz8nM0szPzsrHwL/Cyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4wLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BLVFFITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5WWh56ZppqssKivp7Oz09TU1tHLz9PUztPPzMbDytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF5dTlFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQnJiZmZ6eq6ykp6KsrM7S1dHNzNLT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkI0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKGlpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdDNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGEiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJucp5ymvcPFubbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0M+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnuMh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYeIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxCPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGQi3l6d3uEgHyEdW2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl5CJjoqLgnyhiZCLvKCYk5eanKimpa2ep7W/v7+4xsnNzsXNytHW1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU2N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ7hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApYaKi7iXnZGUlqGmoJ2dnaOutrm0q8DGytDIx83P09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4N+dYSGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCMiZKOioqdl5ijooaTnZWgi4qJjp2Qg4iPgIOHhaWFi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPzNDMztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eYioWPjYF/h4+liI2TqJmXk5aYoZifmZOcmqKytKWjvMG+x8bFycjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doGDfG1vi397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJyampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnZSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmJuKkp6Qi4mWn6GNlI2YmZ2Sm5ielKGglJydpa+ooaSzuKzCyMS2ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq2+q5u7paetubirpqaioqSjqa+ysaqdnKWZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtBRkc/QUBDOzo0PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywa6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjqnEw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lpKampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0xKQUE+REQ8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC+u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXh5qppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3LvMPCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKCkqKWftqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTUs/QUhFRUlISDk1RU07Pjg9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr+7trG6u7u+z7bEvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra+upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2coKeimrSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0dLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKycjNzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjCvrmyr7m0wMLKtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW3q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFFJTUVHR0JTTEpCRUdBVlNDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKBZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaymnqyvq6Kpqb64p62/sri3x7a1ubjAs8DCuLWztK++o5ejl5SclK6fkKKjpaOjoJC9pamdqaudnaGbpZ69oZmjn6KprKGdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSk5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+erqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6qtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirrKymopqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05eUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafCrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7uKy0tq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqZqZmJOio7igoaOSr7CspaefkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExKU0JDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tceov6+utrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalZaUpKC3oqWllq+ysqeqpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9OTlQ+Q0FOQzo6ST83N1JPXV9SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptqueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psSrsbevqKurp56YmauhoqGRmKGxr7OssLmam6mgmpeTmKegtqmmo6KxsbSss6isn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Wss56rorGws6yptrS1vq6xsrWssLSzwbvGt6y9sLG4rKyqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE9ZXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6srrKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaizqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmloqKgmJaSk5V6i4+Fe4yKgoqRam13bXV7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7GhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJyUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWkJiap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1rauxsqypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2bsJqjo6Ojka2fpKCgoqump7mlrLa2pausqa2wtq6inqOpqpugm5uSpLSZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCssK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqSjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOFcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rquxr66ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnprGypKeloaGsl6qhlZugpp6loqukraOfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZWVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvs623qri4prS2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm5taqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhueVVkVlFjT01WVFVQT1hbYlVIT2lUVlNHUFlVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKqutqyqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGirK2ova+srq2iqKifrJmQsKGYoqGoqJ+onJmqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKho6MkIODk5+WiJGckJORjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRXk1NUlpmTk1WWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWsrZypr6Ogpa2rqJyeq7OltKiaq6epo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eRjY+Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3ttVGJQUVhLTE5ydV1IWltnWUVVZVBEPkpPRENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn769qrPBtLyhr7O1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKSooa28qK6xrqGro6Svnp+tppefm6GknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fYuGj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp5bFVeTlBRSklNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoZiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCrrqagppijqKCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouWjZF8hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJf2lYWk1QTEpIUFJRSU9dX25TRFhaUmhPSEtFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XraGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saicv7imrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpKSit7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYF6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTUhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnaqepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKkncO3pqq4t6yfsryqp6Wor6uZo6ecpaaUmKGzppmepampnKGflKWfpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZSTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFBzVFtbU0tJR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Cusra1ubi1rKq8s6+ysb3At668vLGkn7aspqa1qquvoaDFrKqosrWsrbW6nqiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJegnae2pa+qraGhnp2ilaCmn6KgmZybnJOanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkISWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1dbYFZJR0hLTVJYPjlgbGlIQlVTXFtJSEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShko2uoZqZoJeltLKjsr63obHGvLmwsKO2rKuvqbm+vbutwLKvr662rrO5sqerubGvrrO2u7avub6spZ61q6CisqWrsJ+mxaGzprCzsLeutZ6sr6yuopmdp6qlnpWbp6agmaWjqZyan5uVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuVmqGTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaGxqZ3Fya1toY2Fyf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy40PDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2clKGbqbOwn7jAtqC0wru9ubGmtrCprqW4uri4rLuwraurt6q1ua2ksrWxr6mxtraxs7a7p6mgtqqeoKqjqq6drMSZr6awsbe2rayesa2vqqKbnaSsqZuVnKaknZqqo6WWmqCckpyjq6qpup6mpKCXmpqeoY9ro5aZnXGDl5ylgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZYXGl0bk5QamNmcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5rqqnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsbS5ra6kqK2rq6Whn5yhqKebmKGlppycp6idk56gmZCfqKqjtK+joqOclpiZl6OIoY+SmoihiJWfon+lgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98iJ50iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpcG6GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ2snZqanZ+rqqiqvsOusrq8t8G/qqS4saqsprO1rq+ztquppbGtpbazm6y1trSmp6izsa2yqK6eq6GzqqClpZuipZ6xuJWmp6e3vqasp6mqrKeloZ+ZoaijmZmno6SYnKWqlpOjnJSTpKamobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5vZWm8krxuaHptcY/YfVJrYrayfX9wlHWaoaqQVk5YYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJCRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbi/wqumtK6uqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqels6WioqCXnKKgsq+Wn6Shtbqjqqihra2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qLjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVG1jWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4u8OnqbCssKmqsa+ksLqwpaWvs6OquamdsrKwo6Whqq2wrK+mqKCjorGcpJ6ZlpmdnrCpmJyioLWzoauboa2tn52Zl6GjqZ2ZnqWgnJmhp6SQnaOal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYapmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNwe4WAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0YsMC44NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7tsKwvMOtubfCq62tr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Goj6mnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKglpOSlJOdhNWTmblxscJ/xod91pScu32cl6iSjp2NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLi8wNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLfBsLrAsre1vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpSZm6ehnKeVm5ufoJiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlp7a7vLK7v7i3tby8tKa1taOzsqOgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaKelZmWk5uFrHx4qHejj4uHqnCui4SohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyuri0ub65uLO3vramubWhtq6goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpalopSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclpehoJSYkaeeh6l+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKimtLC4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5yVnaGVl4+snI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurp7epuK+1wbW9srG7uKzCt6qsoZ2npKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk5ypnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX6MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm15b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFstNkA5p5qforyjl7DDr62qqqyxqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZCmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKirn5yfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIB0kbmDfIaGioeNe4uGjZd9pLu5vZx1ebOjdHaXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLintbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlppyboamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVrgJqVlGVeYGNxmolocox8hpRman5wdHh+fWJbeHSBaFBcboR8fItqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSX0knU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysn6OanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgnqkhWxpe5B9gHWJi4Jygnh5dnaKgHyJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKmtabAqbShn6WmnKWWlqGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SgmaGOl5WLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhoWakYeGipWPm5eOkJieo5aZkpCcjX+NZaGzroSJhHd7kIp+d3l6b2d5kYGBiWt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraKss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ6VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpauUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoSTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaN4a2qLmaOfmHNsbnqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIJvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlrfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCmrq6wvbGqqKWusLCgrZehpJ6impqnrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqokp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKmwr62msravqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OgoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnX/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWsprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJPBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM5SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtmp2no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J1aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+gppywpaKosay2x7G0qKuplZGdnaKZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wpmp2Tfaptn4SIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mop2zuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmppZyhkIOeTneagoCfeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKh+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaGir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaOmoIiQ0rXDt3qHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+n2Jzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmeq7Smqpp8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnqWhmaScrZefqKW2qL6upKmjn4yAjpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchYd8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIanmqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm31jc3xig3d0gHxhamZvbWZlZU9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2PfYublqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqJybpquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXk3uImZKmm5OPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLassqyjv6uyspx1dqqlt4VliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6mkm5ivpHJsbW1mi3hvbYOZcYF6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCTcGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkplV0prWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeOppeOkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKppraciZejmIapm5CUnZKqtJqcpK2itJiko5+io56ipaKWrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd2fHlpbGVkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNfIGVjKGUi5WRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dl62ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am9kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiXmClIybk4qVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoXl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5hwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZV92b2trZ1xlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l1d5ONlpOKk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnemnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjo+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCnJmEmH6RiIGCmGmMjIRqeHtxcGdleG5pbGpcZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKycp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWQiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ6XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGqq6aalJ6hpKmhlKOptaKvf6CnnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMf2Jtj4uTkI2Pi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKtrg6NucqVvn4KcZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRTlBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15fY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yMmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfqNenJmzlm97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0Q9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lYYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGRjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4tq2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uHf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebZmQaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU83VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFjfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6OaoqCZlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/l4x7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYOpiZqhpaqjqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmdH6dbXF8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWR2bF5lZ2ZsZGVsaGhsaZSdgbGumoRTX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMeISMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhndOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJrTmHqCm252eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWlTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqEiXmDdoiAboGfhneAkYWHmKCVeZKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKOtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYJ6XqW15loegm3Whh3igfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamqt0gZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUmdJVUxYUlVcZ2tuVWdXTUpBSk1LR0pOQVFKUGRjam1ldXNzfnh7bnWJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZUCUorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIl6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmCbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3KLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhPXEhYaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3joCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGKfYCAjnNpj6WEfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhoeVl52ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gaJqHdatmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUlxJXWxtdl9bcVhbX1pnc2Vtb3FjcXRgd3p+eXJ5g3KDfoF7e42BgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpb36TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351fIN1bWxmjHN4e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFVeUV9vd3lrandlampqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWDho6Yd3GEqoWNkZyPh56dhoqaqKCgq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboOLd21kZWN6gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXl1lcn16dG90Y2pqaXt8cnp2dGRtdGhse391en17eXl/gH9whomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVi4ucl4SDeqyBkJeYk4mdnIaHoaqfoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo6Nlp2hipGdhImTi2x9jnd3ZoOGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoWJh41/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2FsaHR7e3JucGNqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjZudkoapnoJyio+GkpKLnJF8jXupg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjHh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZSboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChoaIeW1qfH97bWhrbGZeeX9ofHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3KDjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI+bm5CIppt/cIuLjJKGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqUmZ1/k5N/iI+CdnWCcXdhfoGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXhkcHp+eHlwa2pmXn5zaXx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheX2dpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2p0dmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WNlp+afW+LgZGThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KIhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+amt3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIONgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgXhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35yh3uTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSTloiain2LioJ7cXprdm18f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohqX2llamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXJih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GlqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BvdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5Kkm5OBfYF8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5Nwi5uGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn36TkJSNmpB8i4aIdHN1a3Fvdn2MdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp7eXlscnBleV5ubHNtc1haXV9haVpPVldkYmdwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2prX3BodH9rcW5tcWdva2V7Ym5/endwa3d3iX+jmaOooaebiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3uFa3JveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZyXoJOWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIelhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3F8h2pzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVidW+EgWFda21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWJ8YoV8b3BsdWpobmx2d19xfnl7c3Vzf4J+pZabrZ+nl4WMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxubHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZOSmJuRmXeReoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4loiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe4+MjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBwU1BOW2VkXXhviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4Z3Jqg2CHfm9va3tgaW10f3RfdHx4hndzc4V8eaGQmrGcpo+Din+CmYl/ipx+ipiSjoSIl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibkJl7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyOiYuTkop6hn1/bXxlc3BrbXt6XIF6kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGFVa19edE9NSl9mYlx4cIl0XFtldWBhZGSOY2BmYlhpc3RubHF2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbn1lh39ucGuAWWtueXpyYHZ6e412cnaKdnqfjJyvm6CRg4V4iJV+e4ichoSekI6FjJeEk46HgXV3cHlxb4RvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5SbgJFwhYujl4mOlYqQnZWDgJSPhYiPgJKKipd+h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdoZ+fmx9ZHh1am96dFiIe5KHhnp/f4CGjX96ZnRqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVXm5zeWFyY2BpfnFybltjcmFjVm5aXHdMTEtjZmFddnKJbVtcZHheYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt7bnRwgFdwenZ5cWR2eYaMaHaAiXGAnYiZqJyjk4V9cYyTeHiJnIOEn4yOfJaNgJqIhHxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpyVkoGIcIWIoI6Fi5WKjJeTfI2Sh4KIj3qRi4aPgoB3eIOEcoeCk5uWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajX2Tg4Z9gIOBhIuDdmJ1bYqCkYyEgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxc2pYZ2ljaVdtV1t0TEpLZWZeYXJzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qdHeKfnNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdW53en1YeYVxgG5neHaRgmR2hoVxipaGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnRub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkXGZucYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hoBxb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEk29te4B2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI+WgHuVi4GEmox8ioV8e4mLf5SIdYmGdnd+gXJ1hoGelIWUj4SDcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCioB5goGFhIFsX3N5e36Oi4d8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFpqbm18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcG1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeXl+jZBvb3uAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxbGpkYHN6aGBlcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgHCLiHF1fntqeYWDpZCEk42Ef3CAhHiGe4iem5aNlZKWhYhwe5OCfYKCiIJtgHdogIV5coCBg4qIfGV+f4R2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdrcmBvTldnUj9YZl5ab2tneXFbWlhrZVljcHleZ1xeZWxnZmtpcXd/iG9sf36AdW+Ce3+Cf4J/doGEiZeJcYKNcXuGfHp5hJOMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouDoZmckYKFZ4aDb2d5lYh9foSCmIqBfI6NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3dviIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KOkpOUjoyHf3uShnd+g4yCan9yaIB+eW58fIKLhHdieoWCcmRyaX5udnJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeMi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV+dGhZYltoZm9kak1XZVA9XWVcXXVlYHVvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5taYKEf3lugHx9gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNhJueloyBgGyNfWtofo2Len1+g5OCfn2KiGt2cWdoYltiZ3NvX2Frc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjYp+b4B3goN/j5uJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXGBd3WNg4d4iHaEiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgHRgXV1gZ2RpaWZOWWdNQGBjW2B1YF11bFhXU3RgWmRvcldqXmJoamdtbGhwd3yTbGiEin19cH5+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2FjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9vb19gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3R0h3SId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpSShXqYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFqdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WDfYRxh4p4eXFxhYSOgH96f352j4aEd2pxaWyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJzW2FcaWVlZGtkUFtwSUNjYFtjb11dd2hVV1Z2XVtlbmhWa15hamdlbm5ocHZ6k21piI15fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7aHSFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXJhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjoZ2mIyTkIiGhnx/hWx0dX5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F6bYmGdHpsdoKEhX98fnp9dIyCfnRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYXKEb1xgY21lZF5vY1RccUZCZV5dZWddW3tiUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50a46Ndn92eH53gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSDeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6i4plcoJranFjWGx6hZuIgoFzl5R4f31vinOEjI6JdJmQkomGi4N7eX1xcG98ZmhxYm14cWpscXh9fXpdZXqAeGp2eGaDd2h1iYyOlX1yiGpvfoF5b31dWXN/bnWBjHyCb3CKgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN0hWldYGxqZmNab2FYYm9HQWdcYGVdXFZ7Xk5VZXBZW2poXVdnYF5yZWpocmhwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoaHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11gHhkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRncmRgWWRxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYeNhpaAcIxna3uEdW51Yl1xfWx1fYx8gmd2h35ucWl2gHl/gHR+bXt8gnt5cWZsYm6JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoNmXmBxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZWNedGVtZHFncnB1gXhxmYZ2f353f3yFh311c4KIgJWCbnN5e3pzc4WHiYmDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4SHg311cHFsZ3RcbGdebHRkZ2Vpem97cllogXd1aHCBeIJ3YneGi3yVgW+Mam17gnFndGZhbnpoc3iLfH9jd4R3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d+Zl1nc2lmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNlX3ZnbWJwaXRvcn50dJmCd3+AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5GBepd2h4OAhoh2anJ1Z2duW2xkXW1yX2dhanhoe2xbboNzdGpwgX56eGF3hoV5kYV0iXJweoFzZHJpXXF4ZXJ0iXx5Y3SAcWdqeXVzbXl4dnllhXx/eXdxZGRjbXt8ampUZ2FlU0prZ09HUWpFYHdmYU1Tcl1KTVVaZWx4fGZfbnFpZF1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZWB5aGxhb292bnB3dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR+enZ0hYiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cmx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1xnX210ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3p2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZmRaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYWNefmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoKMjn1+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJvhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11dc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1udGRodGVbZ3VmdnaRel9dUmZma4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem99h312inSCeX15gGlkdmxgZl9eaV9ddGtZZV1vb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfXRncoBlX253amVoen11b3CDdnR9dHJiX2ZtbnxkaFNnV1hTTXZfUEpZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2JiXIRpaGFueHltb2p2gZB5bYN+gIGTiISBdnSJdIyGdHF2doF4fX1+jJCAfpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0bn5reHxwkXNecG5gZ2JsVFpaV2hjbWZbXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubmxkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH59c4J4gXR7entkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3J0gXp0Z3B+XGBwcmJga3N/bW52f3NxeGtxYVxlbGx6YGZSZVNWUU91W1FPWFFIY3NhYEdWalBJUFpWa2trfWZub3FiW1pYWWxxV1JQZlZWaFNURVlbTkhydVhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPg4KXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3NjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXh1fW17dXZwe392X2ZyY1tdVmFjWGF1ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydYF3dGNtdlZjcmxbX3BnfmZueH5zdHNrbmFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhrYlddVVt0ZFNSV2hRWGZUU0dZWU9NeHZbX2VraVlhYF5ejm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jj3+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbnxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RST1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZGBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmFbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2Ojo6Ojo2MjIyMjIyNjo6OjY6Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo6Ojo6Ojo6OjYyMjIyMjI2Ojo6Ojo2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZoXENEREREQVLM2tjY2NjdbT1ERERERTguLy8vLytIhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX2FSNDU1NTUyRtjq5+fn5+1nLjU1NTU3JxwdHR0dGDqDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYiFhYWFhYWGk5SUlZWUlYqFhYWFhYWEg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpKTj46NjY6Hj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjY2Ojo6Ojo2Li4uLi4yLjY6Ojo6Ojo6Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkJCHiIeHi4aJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCQjYSIhoaOhYyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJGJg4WGh4yJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjI6JhoaGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNkI6Ni4qMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+AgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/f39+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fn5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fX9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/f3+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fn9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHx7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent9fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e31+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk5Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs9PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn1+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8+P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09P0FDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlMTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERERDV3WGiYp+WEdISkxMTk9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn59fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTUxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pjw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1LR0lKTU1OTUpKS0tKTE1TbG9ydHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/gH5RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QUNFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QT1JUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkNDVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxHUmB8hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs8PTo+PDo8Ozw7PDw6Ojw4Ojo7Ozk5OTw/PD1BQkRJSk1LSktMV29ydHV0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pk93gYKDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA+Tn2Cg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQUBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6ent9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9MfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmeDgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpKRUpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXZ4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIuLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUFBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExLTU1NS05HR0pGRklKRERFRUJEQ2NxdXl5enp6e3p7ent8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUXmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVdVdoWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXWFhtgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWddW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl91eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtxeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTExIQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASU5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHREJBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KBgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITU1HTVFVSkJFPz48PTw9PT89P0FDQj8/PD1CPklNRlVvdXV2dHR2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dnZ1dnd5fHx8fXx8fH1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb25ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSkRGPjo5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x8fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QEBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX1+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8end0eHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A+Q0VETE1RVExKSU1URklJSkxJSktJSkxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTkhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZGR0tOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZJR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSU9KSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV1dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VKTUtIUU1KS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhES0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHRENEREZHR0dJRkhKSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUtISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkhIRkhHSUtKRUpISEpIRkZMSEhISkdMTExMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZoYGVoamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKTElLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tLTUxJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGljZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxLS0xHQ0NBRTw/RUVFQz1BQUNCQkNFQUNEQUFFR0NIRkhGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JRTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmljaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQ0lGQkhKSUdISkZES0pHSEpJSUtHSkpOS05MSUxISk1LWmZKZFxLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamhoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERFRkRDQ0NFRURGQkVGR0RES0VFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkZDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBsa01PUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVdsTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbWxPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19kW2FiUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZER0tMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09VUlBQUU9PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz9DR0RFR0NJS0xIRkRHS0xIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTEhISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExNQkNEQkRJRUdHRktKS0hFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTUlKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl5enl5eHh4d3J5dnhycXh2dHZhU0pKTUlFQ0JDRkdFR0dJSkpJSERGS0pKRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5bY1leXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11hWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNUXVleWF9ZX1tdVVhYUF1dUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZEQVZVRVxUXlNWX1hOVFVOWltNSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYldgX1RRUFFSWVNeXFtdXl9gYWZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNS0pKR0VJTlFRTk9QTU5NTklMQkRBQ0NGRENBQ0RATEhDTExQT05MRk1GRkhJSEdMTE1PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVteXmFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQVFNOUFBOT09PSExGYEVEXkxEZmNDTFtIXlxzbU9NVm1ZTENPX1RsV2dKXVdVXkRNUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xcYGBhYmJiYGdpZ25saHJ6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnF0cFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9ZYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09MUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fXB+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQUVNTUhLS0hKUU9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUFRQUFFSS0hneGxjeHFtWkpMVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWhiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlJKS3JvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZmVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1tbXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVlJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cW1pcXGBjXF1iY2RnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTUFRQUlRUTktNT1JUVFFRUVVXVVlaW1pTVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JiY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlROV1FTVFVPTk5RVFZVUlNSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aYmNlaGhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU5XU01NUk9RUk9NUFNRVVpVVFBQTFBXVVFWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtbVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxRVFNZW1dVT1JOU1hVU1FUUVJZT1FTU1ZbVVZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhTVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1JWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWlhRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYl1gVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hTV1VUUlNXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVlUWVpaYVhbVFZYW1laWFlZWldWXV9gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWldUXFVXV1lXVlxgYWFjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVlVRU1VXW1tcX19aX1xWX19ZXV5ZXlZTWVdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVWVVNVVFhdXV9gYF1hXVdhXlteXFteWFZYV1taX19bXldYXFxcXV1bWlxXWl9hXmBlZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYGZlWmlpY2ZpY2ZfYmJjYWBgX11dWlhbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWlpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYlxjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1dYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2ZnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3x7e3t7fHt8fHt7e3t7e3p6e3t7fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PWvYaJiYmJiodzcXJycnJxg4qJiYmJioyNjY2Ojo6Jf39/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OjKiYyMjIyMiXJvb29vb26FjYyMjIyMjpCPj5CQkIt/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXl6eXp4b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODhIF8fHx8fHx8enp6enl5eXt9fHx8fHx8fX19fn59fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z2eHl6enp+eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3d3d8fH18en17eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd3eX58fX15fXp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7enx5d3d7fn18fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3l6enh7fX18e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBf4CCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5d3h6enp6e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGCgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgoGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgIGBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGCgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgoCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR0d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYuHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBg4KCgYKBgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIGCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOCgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhYWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjYyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoKCgoKDg4OCg4OEgoKCg4ODgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFhIOEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4ODg4OEhISDgoSEhISDhISEg4SDg4WGhYWFhIWFhYWFhIaGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaGhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeHhoaFhIOEhYWGhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgYB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iIiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoeHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKioiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiJiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhISFhIOCgoKCgoOBfn1+fn5+fn59fH59fX2Dh4mKioeHhYaHh4eHiIeIiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGhIKCg4SCg4SFgoGCgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoWBhIWDg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBgoOEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWGh4iHhoCBgYWDg4SFhIeIhYOBgICBf4GMhoODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358f4eDg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKCgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+gYODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fX5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KCgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p6eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/f4B+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enl5eXl5gIKCgoWDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoOCgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6JloSDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYKAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goGAgoKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn5+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2IiIeFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f3+AfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p9gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e3x8fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIyLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CEg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e318ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgH+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ/gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foOFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoGAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fn59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChYWEgoGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5+fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fX5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgX+Af35+fn5+fn9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgX9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSFhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAf31+fn+AfXx+fX+AgYB/f4KAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYF9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYKBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgoCBgYKBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57e317enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgH+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4GCgoKBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgn9/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4SDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19e399en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGCg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/ent7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKCgoKDg4KDgYGBgYOCf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhISDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOBg4J/goODg4OCg4CChYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgoGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSFhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fn59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/f31+gYCBfYB/fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f35+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWGh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYeGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x+e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoSFhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeGhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx9fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYaGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeFhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFh4SGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeIh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhIB/gYCAg4CDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhoWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g397gH19f4J9gIF9foF+fX59fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhoWFh4WHhYWCg4KCg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x8e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9/fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag319gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ozw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8Nzk8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NTT1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg4Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5ODo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLysrKy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNDR0NDQ0NDR0dHR0dHRzcrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29va2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2WhIaGhoaGh4eHh4eHgrLi3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgYGDi4qKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOblBTU1NTU1RUVFRUU0yg8+vr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0NDRlNTU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4+Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMznFUWFdXV1hYWFhYWFdQofHp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIR0pXV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc54XmFgYGBgYWFhYWBgWqTu5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVRWYGJiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nx8XFxcXFxcXFxcXFxcTL0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Oz87Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzMy83Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Pz8/Pz8/Pz8/P08/PzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPPztLUz87O09PPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwgoOTzdKooNDP0aSh0M7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4m7C3nqOn1q+foanSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4nFnpqTncCemJWcyNDOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjTvpihnLSYnKKdsLLTz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pK2cobSZlq25hp6Wr7Oq1dDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6mQm4GglnibhJ2TpNXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmsK6fgJ+oiJx5n6mFmaTV0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEnIK4r6acir2tppiv1tHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ+Zp5eXnaWnlpibu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTQ3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgwaKrpJvQn6uknNHT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdjFkI2318KPjbzV0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXS1MfD1tLVxcTV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEE+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLU1dPT09TU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg4ODQ7Pzw/PDk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk8PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urm4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg3OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU4ODc5Nzs5Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaeppqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk5PTc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQT8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQURBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/Q0BCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojw7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojo5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk4Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw/Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QD89QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6Oz07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDk3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk5Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlZCLk5ORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg0Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThAQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjY+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYR/gn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6Ozo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW2BfWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkFFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzc6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVNhaGBmc29zaXNjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NCREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJialJGZl56hlZiakpeUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxr/Fx8vI1MvKyMa/u7u+xL7FyMbGxMTDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLe7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZnJiXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raGd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oz07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7IwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL64vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBeWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVYFlMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pj0/QT9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TFycXN0M7HzMnCwcbBy8vHxszJzcXGxsPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnGxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmY1pZWVxZUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vcK/wbu/wby7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1WVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8C/t8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tLUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7W6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLq6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJtX1xUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3v7/EvMLFxcfHysnGz8LBuK61tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6wMK/vLa3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVxjUUtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5gYU5ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rrO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkNFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD0/PkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cmxeYmBbXU5IQT89SENGTUQ/Nzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVkpianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dve291cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2sKqwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdWlrXVpqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7m0tLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srra2srS0r6qknpycnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJSQjI6PkJOQl5WWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTUxCT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC4tKelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLKzraWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJOSk5HO0RAPTI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnKCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmWmpeXmKCenJyXm6Ganpqjp6WfoaKio52boaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDg+QjY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnZqUmJuakY6RlZGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7mopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGYm5uamJmblJWalpicpaGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5OVUxSTEE3PkI3OD03Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaWfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52ipJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJaVn5ubmKShoJ6joaCempyloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empmSmZ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWrqKqsqqWfnpmSkpSYmZaWloyIi46VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosamqqKenmpmdmqqmn5mnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXdtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeYlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK6uqqumoJ6eoaOenp6bnZyUk5WUnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GlnqaZm6Kknp+bm5uch4WBe3Rya2t1cnBnV1xRRVRIRElPSD5FQTNFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenJ6lpqedoKCrsa6npKSjoJ6lq6Wel5yUkZmdmJSMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb65tLm6tbq3sLWyqrqxrru2vru6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzg+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGanZ2fn5qXmJeSjI+Wl5OOjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMfJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/T08zKwsXGxsrHzr/I0MvGxMbEwLvDwL6+vrW9s62+v8LDxsTHw62+uLK4vMTBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJuZl5STlJaRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrPytPX0dfS1NXT08jMx83NydLMzdPNxMfJycDGy8bIyMW+wrOzx8TLysrOxcm/vb+8wcfEzMzIyb/Dv62ws6ieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3pydXVnYmd2aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5OjmJafnp2krpufsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaGem5WUlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR0tTU0s/Rw9DT1tfV1tLLyc7Qy8bN0snS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnDy8vLzs/Fxse2v8m/0szLz8XJx7/DwsfOzNDQz8zKx824t7uon6Wrp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx3c3ZvY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipquao7Cxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnJ2blYp3aWNgX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUzs/V1NTR0czRztPX1tPV0M/S09HJ09HH0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHHxc3M0NDRyMvMwMrLxdPOy87IxMnGxsjLytPT0NXP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uqqqsnqauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJlY2JfX2FfX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dbO0tDY2NjXy8jNw8jOzMrLv8m/x8jNzc/K0M3Oy87Ox8rP0MrOysLIxsnMysvR0szT0dDPz8q9yLmwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wbmtiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48Pj46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr60scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnZSWl5WJbF5eXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R2dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08vLz9HTyc7R1dLV1crAycHFzMLIycLMwsXIycrOyszMz83Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtamYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBxa21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1BOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzczPydbWxcS4sraqpK6submxssChl46NmJaQk5KRlpaWkIx8ZWJiYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfHz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O+wMfLy8vOwsrLyMfLz8TFx7vHwsjIws/Avby/sMHKx7q9qrCyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PTw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3q765ubOlko6OlpCGg4SEgn6FhX90YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTCysnBwsvQxMvIv7nBusXHvb/Gz8rDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLy/ycLFx9HFwMi/ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETERGU0A1NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzKz9HMx8LDx83Pzs3V0NbZ2NnQzdTOz9DLxLjGwba1vLHAt7qtkYyTl4d7gIWGgHZ4dXJwX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/tbW+v7rLw7y1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUZCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Oz9LJ0cbW1dbYzszQyM3IysW+ysGytbq3u7awkY2Ki4V5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4tLu1wMK8t73GwMO7tK6ytrq+s8S3u7WruLy9wL2wurWvtrqyxby2rru/tLa0xby+w8W/w8TFx8vFwMbGu8fLv8/Jx8PGwcO3w769trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQUVFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLelq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/Iy8bKxsTAvc+9s7m9ubi3nI6HiYl7eX6Ghnd4gn10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCurC/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rru4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTo5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsHF0MjPwsTHwcbGxcXMxMvMwsTByMG6vLvKt7S8vba1q5GJkJB8eX6KhXp7hIF3bl5dXV1dX2BfX2RjYmNjYmBfXVtbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0vLizvK63ubSxu8Gxwa6lqaKssbKzp7yqq6irrK20tKaorqGkrqmypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCv7u/xMO+xMjMyr++w8DAqYZydHJqaV1hb2RXVlhQSFpSU0tGRkU+P0A5Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC8yrnAxsC8zLrDx8W6vcS+ure9xrm2ubuuspWDiY2Be36Afnh0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqSbl5Gho6qjop+lpaekrJ+dm6SmrLKvtrensKynqrSrtLmwtrSstrixr7q5sbekn6Ofp7Gnq6i5qqSmp6insq2gp6aem6SmrJ6fp6SfoLGtrayytLKzsLW8trvBwbK6vsPBsrm6wrPAvb+1uLu9vrzCx8TCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7t8i7t8TGs77FvLewucC7sbO3sKKEh4eCfXl2dG9ta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVtbW1xYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrbG1oqmqqauspLW4rbevrLK0rrK0rrCqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK+4ubuwtru7uquysrmyvbS2sbG1tL+1vcC9w8G6ur2Xgnpya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwLzKu7vBu7bFuLXBwbPCxLytqrW6t6ixs6mLhoiAeXNucG5rYl5iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhXV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5iboZaWkJyhoaidm5ylpqGkm5+gmpitrq2usqCloq2rp6G1sLGxrKeusqe5s6a1oaKemqOiraKhqbWqoqOmnaWmo5aYnpeYmp2fmZednJybrKGrpqOkpq2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq2ub2/trKxlIR5dWVeZV5bWVZTWlVLW1FMSUVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttLjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxu7Gosq+bfYWFgHlwcXRxaGZkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5SWl5+XmZSYn56hnJahoaijn52onJqaqqavsKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYqqahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnaOqqrCtqLSrqqatsrClqq6ysa+wrq6np6eyrrG0r7y0ubauo5SBeXVkXmFWWVdTUlRLTV5MUEtHR0xLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXFsb/AucDBusDAubq9t6iosbumqaKliYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuRlJObmZyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqKdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmjpaSrpKWwp6Wjq6utpaiur66rqKqqs6Wmq6+0sa68tbGvr6CSenZyZGFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3Ozg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSnrbe7vMHFurG5tcXKy8HEx8fJuMjGtcXCya+6vMK8w8DBvby3uramp7K2nqKKmYiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVpbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6UkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GerKypqK2soqGhlJejm5yQq6mwm5+inp6XmJOKnpKNkpOVj5iYkpuhopykoKGVoKGjpZujq6WipKqjq66krbGppqWmprSmqaits7W0ubqvqqyei3Jwb2BbV1ZVUUZRT0haXE9SSVRLU0xFR0lDODs7PTw4NjY3Ojk7Ojk3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODU5ODk4OTs5QDl7tbSttLuysKyyrZ2np6+5ubPAyLq1wK/Gyc67wsvNybfLv7TAx8ywtr3Iu8LHxL2/t7q1pauwrp2ah46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eXl5fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaiko5ikrqSUmaWvqZ+bmJqgnq6Zm6qzn6WmnqKjoJSTm5aVkqiprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCjnJuilZugoqCXoqijoqiroKuvpK23paOjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxQXFlNVE5QTFBSSU5JQjw/P0E/PDY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOtqLO2rqmor62bqaist7asvMq7tr+szMfGucLP0Mm1xr66vsbLtbG9xb3DxsS9wbO5r6arr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GXmaKgm5+qqaatqqavoqeZn6yglZakqKedl4+OmZ2ulpenqpmfnZOloJ2RkJKSkpWnqqSZmZqdnZaNjIuUhoiNg5CLkpSQoJ6go5eVn5WaoKKdk5ulpaeoqKCxsKaxvKefo6y0q62nsLSwuLXAsa2xq5B9cHJiVlRVTlJJR1ZRU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6OTg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zrKaxt6qmorCrnaqnqbKxpLbGtLm6s8vGurzDy9HMs7m6vsDEx7a0t72zu7zEvsKxtK6xrrGsnKKIa2hub3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFpZWVlcXF1haoB6f3aJjoeQiZiJlJSXm5mdqJufqqSkqpynmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipKSkaGan6GVk5iYlaKlmIyZpKaopqGgtLKnsrehnaK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBLRk5OS0pOTVFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6SppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oq21xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJGTnaCOmpuioKOYpJahm5WNh5iajHONgn2NlpaFkJmQk42OepiOnIyCin+JmJ+inpCTmJaEjoKTfn5ziY16kIaSkJCdmpmakJWPnY6io46JmqChpKOborSvrK+sn5iluaalsKGwrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUtLPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjQ4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eho7SopaWoo6alpqams6eltMC4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWkrr+4sbCfp62tq5aVonJXVl9oZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybX+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiX+TiV87V297i5OJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WMfYmAkI2Pl5mYk4qPiJyInpeHh5aemqGgl6evqK2pqJ6WrbSipq2YrKuYp7Ohqa2jkn1xbV9aTlNRVkxEVEpQTUxGT09JRUxRTUtPSklNUEZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKOuoaamqqCnqaeiqbCop7TBubG1sMnDubS/z8C6sbG4xKuuya6no56Gm6K6raeolqalpKGXj5ZpUU1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYZ5iH9gSlFueIqRhHyEjImEf39ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFh36JiJWKjZCSlouDiYeUhJqMgYSSm5aenJSko6eppaOem7GroaSkkKaqlqGpnKKmqIh0a2VdW0hRUVNMSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyip52foa6hp6ilp6ivrKq2vLa4trPCvLeousm5t6mqt7ittsCqopuTg4+Zsp+imo2glpmUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgZKZi497ho9/dX94c251cHSNjYF5fYmqhXl6aHZ7jnBybXiAioySeHqAe4B2cnKSd2d1hISEhHqViYiKjIuAf4OKjH+Tg3uAj5iUm5WRn52onp+gnqCppZ+dmIynpJOgn5WdnqR/cWdgXFxKVk9RR0tYUk9KTE1SSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayssLGqvbSyvLi2urWyoLe7s6udn62rrLWzpZ6WkpiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYF2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3FocYB9jnBDioSCg4V+d3d6i4V9i3p1fo6Sj5iKkpqbo5eZnZudnqKdlo2KpJuPnZeOlpiOdW1rZWFZV1hUUUpSVVRPUE5RVktOS05PSlFPSU5PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmr6yuq6epsK+xrLy4rLu+ubOtqJuxqK2ckJeep6ynpJudk4iWfo6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt4b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4ZobXB+c42Ig4V6fX57dm90c4WCeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+RipKMhpCWfWxobW5tV1VXVFFRWU9TVVRUWFVNTkhNSk1OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZiejoWMlqKkm5qUl492kX6Fi5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+cG1/eouIdYGIhnRsmZF0c3tqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH98Z3Bwe26SjY57c318cXBudW2Cfnd5dGl5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVtNUFVWWllOSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyksLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKJdIqEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfW1xg4GFgXmEhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGfIZ7c4ytjYiAaGZiaW1xbW+DdWlvWHVvjpqRdmx/enxtcW1wf3pzdW1idoR/hoCFkJGKi4mRi5GMi4+DdXiLj4B+goB9j3hwbm5qXlpbXVtZWGBfU05bWllYTEhKRkpHP0NBQkc/Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsa7Bs7rBxpeQjJSQgYl9boKRk4qEi4iQiHaEhW+Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvP5KDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sdoiIfH2Fg3+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iX6Jh45zipePg3tcZHF0ent3imxnaWF5b4WPgnpugXdzhHpwc3l3a25pXXeHfYd8iIePgIuTl4ONho2GfXGEf4R8dXd7fYh0bXFyZGVeWlpdU1tmXlhRVVlcVkdLS0VMRz9GQERDP0FBPTo5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xrqWj5GUiHqGdmuAjJKDfouFkI15hIJ1ooaNfn6CgHODgX1seWxTWExBRTMxMTI2NjY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl7cXyPjHt8iYZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgouChJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSGR2uAd3F5dmhta193fYOIf4iFjHqVnpyKi4mRf3t1i3Z8d21vd359cXFwalpbW1pjYldnZVxVUFFYWlFETExHT0lDRkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU4NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnayhprivs720l42Si5iLfXRwf4qTf36Ng5SVfYZ/h6WHiYCDiIZ5iYuAdYV5X2NWTEM2MC4vMjIxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgZqWgqChmJWbmqWtk5m7sae7x8OnioyhpY6TiYGQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgneHf3t2hX1udnVngZSPhomIh4mIoaujlomOmIB7gol6em9na3h9d3xxaWNcWVlcaFxhZl9aT0xOWFNRSVBLRE5HQ0pEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NjU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkI+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln6KgZKbjoSBgoyLgoqOhICKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSElLS0tOVmBjf2dnbXWdm4+ak5OLjY6aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpiEk4SCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipaSg4WIcomhl4eTiY+Ql6W2qZuNlaKDh5OEfn9ramx9fn1/cV9bYl5ZZmpcbGtfWEtIUFNRTk1MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmdZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6Fk5J6gZKJkpJ9i4WZkpGDgYGLjomGkYeEiIV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUQ+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq7+rtsjJt8jRz76boHBpq6mehJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCdkZmoiJeQjoGIbHNze3x5bmZeW19eYWdjX2dnXFJFS0tRT0lKTUZGTUNITEZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJeUHF1YG59YXeOfXyUjo6Kn5KXnpacqpieqkJEfYeJiJiNeYKNi46NfIqGj5COgYOAiYyJhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlNVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lJTU9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPErLvJy7jDv7elo7CyrK2qo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csYuVo6e3u5yho7CTo52jnpGkoquwrrO1opWmqomaipKKlXp7foN7ZV5mWmNgXWJiXmZnX1tPRElIVE9GSExGS0dGRkhBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NDQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaBlIWIgpuDkpGMktrInZZzVpeIj4icj3yGjI+LinuIg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+0wba7u6S4xqm2yce2vrm0qKO0rbCxm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKioo6ibqbCts7q4uKicuKmNpY+Sk6CGeYGAcldfYlVkYGBhXl9mYFtVSkRFTFZRSUpKRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZV9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42HhYGOgIGKj4aAhoiFioeRenluXVdARU48Njo0NkFCNzY0Ly82Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKtrvEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsaCilpuikqWxraWtrKekmKCss7qiqLK5tbu+zL/Fxb29s8K3uri/uLq4uq2tsaaxqq6+sL28wsOsmbuola6PmJiriX6AeWhVYV9WaGNoZFZbY1lWVEpHR0xSR0RJSkFJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojk2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhW97cniIYrmhmaOJlZSWk5SUjpCXkoeHe4eBjpaKgYSBinp8i4iGfIqCgYuElX14enVlT1xkR0VMOlFkYFteU0Y/O0hQRFpjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNU1pUXpSvuLW7ucnAu73Kzby8wby4try7t761urPGYXWypbGanqu+qqWoq6qkorK1oKunnpWWnpifrqWnp6Weo5Oip7CzqLGyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLSwube3w7rGvsTJsJ66q6Ksj6Wpt4mAfG5cXl5cVV9dZ2ZTWWFWUlZJRUZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBPUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxj42GkHNscnJ0iNXAtZqgjZWZmZGOl5KWlo6GiH2Hg42Win6Cf4N5e4uEh3uLeYGKgpd/dH16a2VwdlldXFBlZWJgZWRdW1hYXE1kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWlyTucC5vrjGwbu5ysu7trq2uLm0uLW1rra3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYl6iepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcLAxcTGysDJz7SkvLG1sJysub2afXZpW1xZV1tfWGFiUVxhVFJMQ0JGR0U8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgb5eSkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iIeMkIuJfIGEc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abXSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pil7fHsLq0u762scXHtrC5sbG7rbOxqKu4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmPkZKdm6GYm5SWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vEon9rYVpaW1ZeVlljWVBdWE9SQ0JJRUNJO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmDaHJveXmDoaqeppeMm5uYi46VkZqOfYmLhY6KiouQiHyEgnB/h4GGe4dyg5KLj35xeXVscHh/cntueHNsaYBwbWNpbnB5aXd9fsu/w9+nbmN4bmRbYWBKUFJVTlleUF1dTVFOVFFVVFxubneDcpauuKy1qLC2q629wbKrtaaluaesr6GstKSPsa6bmJiMkZSRhI+bgY2nkZyJg4uEiomEi4OUlZeXlJuQm5iZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PXzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tUXlFcWU9QVFBOST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJCOi4qIkYd/gntyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsuaf42yhHZyhXdpYWldQ1paW1dmZFhla1RYXV1gY15jeHt/i4GZqqSkoqChqaaqsbmrprSjoq6ipK6ip7GfiaablZORipKPiIKUiWuVoo2ZhIGGfpGDg5OXrIuVjpWajoWSkJ2Xp7CioKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crU2s3K2NbRy63Ew8uIb2xfXFxWUldSWk9KR0lKSkA7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcIB1fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42IiIuJfoN4c3x9hId3gHuHkZeBhG94cW11f3Z4fXSGfHlsh3Z0bn12hXV5e521jDxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZGMnp+gnpGXmaCjpKaypKWyoKKln6KpoaKxnIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dXNrYVpXUFNQWFVFR0pJRkU9Ojc6QEJDOkhFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei36HkoKJhoWKgoh9eIWXl4mPg4eGh3qEeXF7e4WGdXqGjo6deo1wfXBweoBye4FyhIeAbo56dXd9fYJ1f3yHibB0WarCt42SgXBuYz1eaHJwcXBud3eCZWlvcnZ4cnqLh4+TkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+frJmMmo2Rk46FfYiHg4WLjqCZk4iDh35smXmEmYaIk4yOlYyGe5uIk46tqpSVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09nb1s/b2tLWydXMk3V3ZWRYV05RUltHQ0ZJSD5CPj04Oj5APD5IPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD9DR1JrX21kYmZsdoCIcZGQm4B5gI5+goGChX+EfH2EmI6HjH+Gh4F3g3lue3uHgnR6kp6OoXaPdoN0dYF+dICEb4GQgm+ShXV8gYV6dod8ibjGpcPKuIKWnI94cGVOZWOCeoJ3haGQi3l6d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OSl6OemquWkZGLjZODjIWJiYGGj5GenJmIhYuBhZd6iImfl4+JjoqLgnyhiZCKu6GYk5eanKimpa2ep7W/v7+4xsnNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVRUTUtETUM7PTw8OTo8Pzk9QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTo3SFBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqLfH6Af4B+hXt+gpGKhYZ6hYh8dX51bXx9h350f5KdkZ+DknyHfniPfnmLim+Dm4F0mYZ9goqFfH6Re5Cpj5DDoL2Mm6ScfYmFfYlzjIt/c6aanJiUhXuPkYmEaUdxoaSejIyRkoWIi5CSlY+dm5OUkZeNjJWfnZShlZOOjpCMf5CPjouEiZKWmZ+fiIyUkZ2Qgox/ppmIhY6DhoSApIaKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27Z2dXRnZmJUXVlSTk5IQ0xDPT0+OTk7Ojk5PD02QD4/PT05Ojo7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OURXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5PzxEUlNSWF9WWGZtbW1pgY6KcXN5int7gHx/fIh7fXyLh4J+dYOGenN6c22BfoV+d4aboZuelJKAjIh/mIeAnJJuiKmFe6CMfJGOg4mEnH6bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rm5CDmZyQj45bg6KRgo2fk5SMhoiMkpKMlJWVkIyPioiWm52PlZaSjJOUhoCLiZKOioqdl5ijooaTnZWgi4qJjpyQg4iPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVZDQElDPz8+OjQ4Ojs3Ojs6Mzw8Pz0+Nzs5OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQTk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7OTg6O0A7QlFLS1NZUFRjYnhsYn6Rg29ueIt4en97gX2HfHx3hoWAc3CFgnt1d3Z0hYOFfX+SpqKfpqKXip2QlJeLiqiXcoqyjYSokoSZlIWajKOWoJiTiZueopOpsKCRlZGOjoiWjG+Nt4SaxMiynKKmnJyYlpGxkGSkzceVjoaHiZCSjY2TlYqFioqGlpmbj5CUk4eVmISAj4uZiI6Qq5eXpKOImZ6WmoiPh5eXioWPjYF/h4+liI2TqJqXk5aYoZifmZOcmqKytKWjvMG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tNSFNZQkFHRDtCPjgzNzs8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhSV1NSQmOCR3aBjn18bX6IeHp+e4KCg393doCDfG1ui397fXh4fISHin6LorOno6uzopenn6WklpWuooORuJWSs5qMoaGMpZuwo6SdmJGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq2Ykpudsp2FhqijnJiFiYmOlYyLk4+IgYaHiZOYlYyLlJOHlJiGhJGQnHWRmbKVlqShh5yZkpCLkIqXm4mLlo6GfYyYnomQkJuampOYl5+ToJ2Unpugsa6io7e+tMXHxL3Dw8DGzcrJ06bOzNPS0dbY09DYum92clleU11UTkdJTURBQ0Q1Pjo3Nzo/PDw3PTQyNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NTY3PTpKRkRHTVpcWUpmYDtIhIt6em6Fhnp8hHiBhoF+cHh8fn1vc416foJ8eIaLiYaEkqa7rKixvbClrbOzqKOisKyKmrWdo7illa2ll6mtuKeko5+aqZiqpK6wqpqZnJSWkZegmJq7u67KoWq2uKuwlJmfo6yTl76jXqqyg4qKjZSHkHyOjn2Dho6PlJWIiJOWjJCVjYuNlpiTnZm0lpWrnYqclJGOkZKMmZuKkp6Qi4mWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaSzuKzCyMS1ur28xcfHwtGgxsnNzcXX1tHL059td2VZV1BbT05FQz48QkFCOEA4ODU/Rz08NTwzNTM0NTQ1NEI0OTpCTTpCO0FIQjs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBKQIuKfoBzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwsCvvca7s7TAvbStq7O2jKiyrq69q5u7paetubirpqaioqSjqa+ysaqdnKSZm5iXn6KmpZKkuq+pwLytrrK5paSofoiGnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42LlZaUkZqXnaiasZqRrJyOmo+SjpWQkJaXj5GgkYmUm6SslJaPk5ydk6Cdm5ifoZSanqempKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tDNxMqFcG9eWVdcWExKQUtARUc+QUBDOzo1PkE9PTU9Nj4zMzMyNDJBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODs1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5BQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXVyTjIyJe4eMh4OMdYeRioFvfnuCf3F+gXuVepKUlJiQk5ans8bJv8HMwsO5x727r6u5u5izt7qywK6lwKSrr7y9qq6ro6Oep6uutbCqnKCrnKGclp+vtaeLo7q6tsG8rKmds6WkqJSFjarDw6SCi4+HiISGlZSNeYONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY2RlZKPoJSGl5+gsp6UmZOfoJiknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSEJMS0tKQUI9Q0Q8NUFFOzszPThCMzMyMjYyQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxmVGJrmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHqNoZaomZqZur3HyMnB0snLwsy9wrOtvL6ousC9u8S3rMGprLO8vqqwqqSlpKyus622taGfr5+lopijs72qm6i9waS2uK+slLKsrKyXhpqppqWRgoyTpZaKgXWKknmFjpKQnqCTj5OMj42Uo5mWnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalZ+inLWlkJ6WpKOhpZ2dppidlZeapKOpp6KyrKi7wMOvpbO3zL+5r8Szu77BuKzCw8LAl2p2XlVUWVhKSkxJRkRESENDQURMOjRESTo7NDw4RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hiWmNjVp6PnI6Xjp6SiYp/iqCThHiFf5Z/fpCIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK3sLq8tL3Lu8PCtre8rbO/ur2ur6igqai2ra6psreanq2jp6Gdq7e4qqWwv8Syvbm0qKu2tK6ul5alrKifkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Sdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+zpZWhlaurqaabnqaWmJaYlKGjqKWetqupubvDtKW0tcvAuKq2q7K7uK6ouLq9uIBoa1dUUlNNRUlSTEs/QUhFRUhHRzk1Rk07Pjc9QEouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPTRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOz87Syr67trG6u7u+z7XDvbi5t7OxtbO4s6unnKusuaqpp6+wmKOvpaejpbXAsKystL/DusC6tKe6trm0r5alra6upIuTlKGNdMKafZeZhI6XmYyxlZualZKSmZmlo5Wgm5eaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yfpJSuraqkmqClk5OYmI2cn6eimbSoqrO7u7uqsbLHwLmmrKutsrKjobKytKRtamJZV01PSkRPT1BSO0hLSUdJQ0M+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs0RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpaZoKKor5mRl4eLqJaOiJOFoIeEnZePnaGao6S1ybWpxbnCw8jKyMjMzca/u7OuubnBwcy1x7rBubW6sK+vs7WnpJuqtLSqqaatrJqkrqWkqKy7v6istre/wb++ubOyxLK5vq2jr7WsuaaIm5emm3a/n4SZnY6TmpqMrpehnJyXlJugoaieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6qUqKqXqa2jop6kp5GRmZyHlJ2inpaxpqmruba9srKuvrm2oKOnqKWmnJutqamLYGJeXU5KS0ZHTUpWTD1NRU5LTEJDRDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlJ+Mk6ubkZKTiauNhqGejKOtlKOjtsa+tMC5wsLHycXCzcjBvrmyr7m0wMLJtcaywry1uqqora2wo6OYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2uMKyvsG1qrW2q76lj6OYkqKgvJ+JmqCZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVj5Sbi5aJjKShlJ2inaC0r6Wkkq+rmaqqnJyjoqiQlJSfgo+enpuVqaShobO0urStqLWys56co6Wal5WYqqGedV1aXVtIR0VGTFBJTUVHR0JTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85Q0A1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJmpnJaamo+qlpWnppWtrJiiq7bDw7y+tsHCwMfEv83Gu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb64p62/sri3x7a1ubjAssDCt7WztK+9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69oZmjn6Kpq6Gdl42VnpOeh4+EjZOfpKCetaymnJWwppmvpZyZqJyejJiUnoOOoJmbkqWkmpersbWxqqWqrqybmKCgko+QlaielGVfV19bTUhHSU5MSEVESUE+UUlBPEdJSVxST0s9SE9VNEJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU2Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUkY8S3hlYVZLopqjnJ7FrKGerJ+drqCSo5+WpKCmqayYtrGiqrO2xcS9v7XAwrvIwr7Kx7W4tbSxs7S3wcW2vrG4tbm0n6esqqydnp6lpMGln6mtoKSpra+hpqi9taaxvbm3tsSytLi6v7TEwbi5rrO1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqp5OYtKKesZ+ema6VnY2Yk5yBjp+XlY2ho5WQpa2yqqmioqWllZWdmIuPkZKknolfYlhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxWXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FJSz9IPzVITVhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTWmtXckdFNj11ZVxLTZ6eoZmfxKilobSinbOnk6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsS8xMm8r7C2rbC0r77EtLmxsLq0rJmosamqmp2loafBrZussZuqo66wqaWpvLant7u+r7fErbOzw8C0x7S7t6yztq2qoqaWlZWkrKKfoJunqrCvr7uxpqCpqJqZmJOio7igoaOSsK+spaafkqGelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52SlZKZf5GglY6Nn6CTi6arr6SmopygnpGRmpOFi5GNm51/X2NZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj5PXl09SFBCTExJOU1jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1ReZXFAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/IwbSrtaivuKy/w7O3rq22uKWYqrKrq5ifppetu7SbqLCarKCttLKoq7myqLq0ubO4wKq3ssS9tcaov6+ttrWpp6yhmJeSpqWiopiYpa64rrK1tqCfqaSalJaUpKC3oqWllq+xsqerpqKempqblZeon6CYoZ6vsqKmjJetmKSrlpidoo+ajJKWmIWVnpOLkJudk4qoqaqhp6GYnpWLjpmPgYWUiJOed2JnW2ppTE9NTlQ9QkFOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA1SW9oVUNXRox5ZkM7o6Odoaa/p6evsaKptaueurGso6u0trGwubewt7i4xL3Dx729xMLGwLjAxsC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m2tq28rbSzubesuLHDu7+/psOrsLauqKurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KwsbSss6esn5ygoJuepZyil52js6+bn5CTpJmfqJmToZ2TloiTlpKVlpySiJCamJSOqaimn6Ocl5uShY6Zi32LlYSNmWlna2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk1MUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REZCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKpvaKqsKyksrmqpra0rKCttb2vs7i7ur63tsDCv8nEucTCwL+3w73At661p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptrS1vq6xsrWssLSzwbrFt6y9sLG3q6yqo7KmnqWqoKSXkZqfs6qzq6uzmp2nnJqVjqGmpLSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mSkp2ZnZ+dkKqclZaElJaKnZibk4qNlpaalqalo5+dlpWXkn+PlIV7jZKCi5Vka3Fmb3FeRllnVkRCTVhEWjlIQjY+XVFoXE5aXUdbXl1PTVJYZEpKQlxiX1BMTU5YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0ZERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KUMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+1u6emsbfFt7G2vcHDtbW6xL7MxrnDwLm+ucO4wLiytKupura6ub60qa2wtZeYp6yprJurq46rvp6rrbKjq6CxrrOurbWyubiqrq6xqLWvtbu8yrOqt7WxtK+upqG0oJuoraCmlpabmrKjraCmr5ehpJqak46jpaezqqGms62qtaWvsrWvpJmdrKeamJ+amau3o5eTkI6XnKCXlpOqnpqRf5KXjJ2bmJWQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHV6YUZha1lJR1paPXtKRkQ2QWJUaVtNXGFLXF1aUlJSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KSg5LiQ6SzUuIlRfVF8vNShDX1FcLitCL0pHUFtHM2NZVEtEmZehsamyqqympK+utqm3tbqkrLS3ybu0u7q/v7Szt8PAzMi8w7y2vb6/t768sbytp7q5t7XCtqqtsbeUlqauq6ijsKmUr7ukrbGzp6ijsrWxsbC1sbi0qa+ssqe3r7e0xMa3qba2rLCtqaejtqCgp7KhpJWcmpWxnqecoKqOqaOem5aYpqaluKijsrWsqLGnrrG1rKWZoKyom5yenJSpuJuUjo6Kl5uil4+XpKCck4KQlI+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cSk5jXD5ie0dJOEdnV2ZcTF5iTVhZV1VXVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdmMjcnR2JMViUtQi49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7Srt7K4oau1ucm5rcG7wrizsbXCws7FwMG9tL2/vrq+vLLDp6m5sLW1v7yurLKxm6Cnsa2mpq+lnbK1raqxsaypqLW7rLSyta20raqsqKypuK2ysMjAuaW6sKmsrKWorrGmpaOvpKmcnp2br5qjo6Ojka2eo6CgoqumprmlrLa2pausqa2wtq6inqOpqpugm5uSo7OZjoqNh5ChoJSMlJyfkpCDjZKSnJqXlZSHl5KVmaebn56MkpGNkHZ9jYV8e3yFiIhwcnF9fH1cU2RvXk5YZlxGRJZbRztObVhiW0xgYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkg+M0JIUyw+kGs7R0iPnKqroqqxpKmls7WytbaysqGrrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKastquyt7vAr6uxrJ+jp62pqKSwo6qyqrCrsK+wrquzvae2sLKps6qrpaWjrbqtqrLDuratu6mpp6ypp7GlqqWjrqqoop+co62VpZ6YnpmsnaKnqaKtpqStq7izsqKqoqCsr7GsnqCnp6mZo5mZj6Cml4aEjoqLnqCOioyVmo6NhIWPlJ+clJeVhpaUk5ekm5ycipKQjYl/foeFfHZ+hYOEcnFwiHVrX1pgbmJRcnBcSzuEfEY/WHVYYFpOZFtOVlZVV1FcYV5TT05nWFdWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODtCMDVFS1gxQJVZPUxFlZitqKKrs5yqqrC3rbi2r6umq6u9ybywvbbCr7Grs8PDzs/Dvr+0wMHDub+zx8Oqrratsri+vrKtraqkp6qwqKeosaW0rqqxrq6ysbSstLykt7OsrK+oq5+jnrC3q6qturelt7akqqerqqqtoamnp7KypKeloaGsl6qhlZugpp6loqukraKfp7G4rq6kpqObqquuqZ2ipaSkmJ+blo+YnJKBgpCJhJyfi4qOi5iNjomCi5eim5CQm4yTkpGTo5mbmYqOi4t9hoGBg3pzf4J/fHJ1i6SHeGtfYG5mV2SGY04/Z5NMRWJ5V2JYUmVUTVZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FNWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESGPUdGRJeTsKajq7GYq6qttqy2sqymrKqpvMDAt7iyu7Wlsq/DycvRv8C7ub++wbjBucDErLG0sbO6v72ysK6sqquotqmmrq+qubCosrKvsq23qri4prO2q6ylqaqco56zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqqqamiqqCtm5KqoZ2gpaKmo6qfnae0r6mnq6OjmKWnp6qcoqSjoJmYoJGOj5iNfoeNh4SdnYaDiYmOjY6LgoWUopqNjZqRkpGPk5+XmJaMioN/dIaBf4B4dIJ+eHZ9gIedj29yZ2Zwd1xgcodqT16ZVkhteVRkVlFjT01WVFVQT1hbYlVIT2lUVlNHT1hVST5JSE9RUHhMTVY9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8yUWIwMj9mPU5YPkMsPkxUXy9KaTVPRDyWjrGipquvmqylrbC0tbCsprCqqLq+u8CwrbmuobavyMfI0cC+vbu7wb26wr++v62xsbG1vLvCsbGzqrOppLSopa2zs7mwo664srCzu6y6sKmttquqn6qsn6Ogtq2poZ+ws6K1qp6op6mjqqGira2ova+srq2iqKifrJmQsKGYoqGoqJ+om5mqsaqjoK6ioZSjo6OnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGd3SBf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFNYb15KeHNTZFNRX01NUlpmTk1WWWRYR1JoUVE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMExnOjQ4Xz1hZD9GMUNQW1sqSE05VUA0kZCzoaWmraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLKyuqy4rKK0p6issra5s6iovbaut76wvqetrLWrrZypr6Ogpa2rqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZybqaumn5yropyTnKKlnpiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY6Df5Oak4WToYyUkYuRm5KVh4l+f3J7en58aHh8eXNub3tmhHiEiWRhZ2ByhHpsZnhdXlQ/V3tsVGFQUVlLTE5ydV1IWltnWUVVZVBEPkpORENBOUhHS1M/amJKUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05RFc9KpCVspqgoKqmpaGrpbizs6apsaasuMG9ta+iuK2oqLDCycnMwba9wLS3v7rItcK0srK0sby4ub21rbm1vq2gs6erq7C2uLWsn7+9qrPBtLyhr7K1qqyfrbCjnKapqqSem6Wwp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svnp+tppefmqGknZ+cmqSro5ybpaWWl5Wgo5ebl6WsjJ6RkZGLgoqAgI6Ae5mUjIh7fouFj42LiYSSmJCGlKOJk5KHkZqQk4GIfXlrfnZ5eGN8enBub3F2Z39zaYRoZWdebHONbGBpb2BvPVp4bFVdTlBSS0lNVFpXTV1ebFdEV19PXlBITURGOzdIRUtPPHJoS0s5QUU7Oz09Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUma2aoJiopaSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL+2wr6vtL23xLbCsa25sbPAtLq9t6i5uL2qo7Soqaqxrrmxq5y8vaWwwba3oq+2taemp7Czn56kpqiipZmfrKipnqCqrqagppikqaCxuZ+jsa+hrKGtpJynpqmampufpZadnZueqqeXnKGqk5mUmZ+TmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjZF9hXxzcH1xdHRgenhobW9vbWh9cWJ7bWllYlxkhH5eWXNqcUpJfmlYWU1QTEpIUFJRSU9dX25TRFhaUmhOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPi9XVTUol56nmp2XrqGhoaWhuKuypbS0qai5xLWyrZ+3ra6tsLTGyMC2vsG5sLS8tr67vq+qvbC0v7C8w7mou7q3p6e1qaissa20saibv7emrr23sp+xt7CppaevsZuhpKClpaCXm7CnoZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqSpn5eanqWUm52bnqermpyeppeWmJaejpOXoqiikImLj4Z6hH6EinqPlomNhniBh4OHi42FjZOYjY+WmYqPl36Gl4yPeYJ6cHJ3b290X3l3ZGpramdngmxlcmtrZGdXYXJ/XllrdWlZRX1eW1hPT0tISFJVRzI6X15tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjsxXlEsMpako5iWnauepqGjobiqsKG7uKWsvcSyr66ita+tra+0xMS9s766t7Czubi6uLqtrb+ztLiuv8G3q726tKWis6uoqrOsrrKjncO3pqq4t6yfsruqp6Wor6uZo6ecpaaUmKGzppmepKmpnKGflKagpLmopKetpp6loamTn6mhoaGZm56hk5udl6GjrJycm6OWk5WWm46Tk6OnpJCIio6GeYR8hYZ9nI2JioZ4gIOHiIeRhZWTkoyRlZSNjpR7g5ePind/fGx1cm1sc2J5dGdmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKR0lPU0AgKmpeakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU4/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2FMJzKfpKWTj6annJ+enqS2raiqurenq8PAtq+sorWup6+vt8HAvbHAtrGusra1ubi1rKq8s6+ysL3At668vLCkn7aspqa1qquvoaHFrKmosrWsrLS5naiqq7GlmJ2qnqelkpmlraOYnaSqoZuhnJihnqe3pq+qraGhnp2ilaCmn6KgmZybnJSanpWmn66jmJiflpWOlZiMj5iap6CQh4qKiHiFd4KCgpyHioKIe36FiIaEkIOWlY+PkJGQkY2Se4OVjoVzf31neXBsa2xndXNrYWdjYnN/YWNlZmVoaGFlblldWFxsY2FMZ1daYFZJR0hLTVJYPjlgbGlIQlVTXFtISEZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BiRiU1naShkoyuoZqZoJeltLKjsr63obHFu7mwsKO2rKuuqbm+vbutwLKur662rrO5sqerubCvrrS2u7avub6spp21q6ChsqWrsJ+mxaGzprCysbettJ2sr6yuopmdp6qlnpWbp6agmaWjqJyanpuVnZ2tsKa5p66ioZqanpmfo5qlnZefmJuWm6GTqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJySkZCQkZePkH+BjY6Cb4J/Z3luaWtqZ3Fya1toY2Fxf2BkZ2pua2VpZWNsXGxsdXBhU2JoY2VaSUZMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpLaltNW0tYZGNAQTFIYkInNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rLuvrKurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6qjqq6drMSZr6awsbe2rKuesK2vqqKbnaSsqZuVnKaknZqqo6SWmqCckpyjrKupup6mpKCXmpqeoY9ro5aZnXGDmJ2lgXaSrKmflpeikoqYmYCXip+OeIWSjYNtaX53hHFshoqGfYSKhm9dZGBnhJiGa4uQlJJ1eIuEf4OQf2aIgGh2aWZXXGl0bk5QamNlcYNmXWRmbmtoXVtdiZCFh2hOS0M4RVRnXkpIUFBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDNmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI3NliBbDE1T2tbTltLW2ZiPkcxTmE8Ky+OpJqIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSzs7C5ramnrLSlsbWip7i2tainrbazrrSutKKpn7SrnqOlnaeom7C/lainsLW5ra2jqKyrq6Whn5yhqKebmKGlppycp6idk56fmZCfqKuktK+joqOclpiZl6OIoY+Sm4ihiJWfooClgKitn5SUnpSJhHJ4jI6DiKB1h41pl4lmfnN4oG+Hh4R+jHx/oaCfmX98h590iI52m4psh4KDbWhkZHttcmJUhm1jbWmYcVhpb26GV11oWmtqWohwbHlyh2iHhFleRk4+Rl5NRVJWVlFQUldUZ15MWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW05bTFtnXz1LMVReNy8ojaeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprO1rq+ztquppbGtpbazm6y1trWlpqmzsa2yqK6eqqGzqaCkpZuipZ6xuJWmp6e3vaaspqmprKeloZ+ZoaijmZmno6SYnKWqlpSinJSTpKanobako5+jmJWUmJSciK6QmJWKqoyZo52GsYGlrp+Vm6GXeoLUqH+HlMCbxnh3saW3lmSAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aGxYsa5uZWm8krxuaHltcY/YfVJrYrayfX5wlHWaoaqQVk5XYU9WTkZVXFhQUFOLW1dbUEBcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFaWzQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqvtrSoqKa1pai5rpyysraqpaSnsq+usaarnqelsqWioqCXnKKgsq+Wn6ShtbqjqaigrK2kop2amqOpoJicqaCfl56oqJGcp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR+d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGqpZb5yZ6aMdrFqfLF4dZGUY21tp25chKBFaWeHlkV1nGB9ZnujpoFYX4uraH2PeHpqqDhKr1tYVGxjWktPWF9cVlY7TodQV1YvSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk01XlgzMRuSopWDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbqwpKWvs6OquamdsrKwo6Sgqq2wrK+mqJ+jorGcpJ6ZlpmdnrCpmJyioLWzoaqboa2tn52Zl6GjqZ2ZnqWgnJmhqKSPnKKal6GgrJ+mpqCan6GWlZGXkZqGtZu1eYepmraZd4ezm7d/lJeYrJd/a4GmeoGFhpGUknerZ2qxW6x7joeUdIlwjoaAf4iQl3iDgoqXjIOgj4WwdnefcWtrbXyLT6VYSGNjmX5jaKVfeXF1UpKGXVCpbmNweoWAYZ0vUqJuW1RrZ2BMS1xkWFxaQj6wd1dYQSNNaUZCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWFUNTAcl6CUibOmpqGuqaizrKq7t8KwvMOtubbCq6ytr6+or7Oqoq+8q6Kotq2krLWkpbKzqKOinaeqs6mwqKafoKCwl6CblpaXm6CwpJybpKi1r6Gojqmnqpudlpihpqman52joJygo6WjlpuemJqeo6ucppqcmqKgl5ORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqKBpYJ5q3mPnVave4l+n2q5Wrl3hoR9poKUfJl6qnmOnZB7sW2OhHSQu4ZvlVCvp8WKUaB6Y2CqYnNyhmuWh15StbTIhX6IfGOkM0KddV1QamhkUEBYZllkYUpHTGpKWlNPWWZaQ0M/RT8wPDw1OTw3NDw7OD06PEM6Rjo7PjY6QEM7NkBPTEg8OTtESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5mxqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLKzp6CvtqmbqLqupLCxobK0saGknp6oqbGptKmmnJ6frJiZmZiYlpijrp+cl6itsamjno+soqeVnZecoaahmKKhoqGboqKonJ+gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR1dLZ7nJmmjpCdjaN+j56jfrB1gpDS0nVcrnyFf6Rum6qmaoaFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb8CAdE1LtVNVxmRVUWpjZVhBT2pfbGlQVUZIOT1XUltWWUhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGlr62lqbutprWlqLa7vLO7v7i3tby8tKa1taOzsqSgrLClmKe7rqWysZ20uKqgpZ2hqqWyqKyqpZqdm6qflpaZmZOUpKuimJOmq7GmoZWSq5+lkpShnKWnoJWbpqeim6Ofrpqgnp6Qlpyjn52llJ2VmaOelZmWk5uFrHx4qHejj4uHqnCui4WohJqao4uTmouifZKXh66Ef4GzXHKyU699goKjfnHXfXeEfo+dhpmad6+GipGciHe0YZplmoKBlWySW7BXS5p1mHlmYK1ednaGZ5eIal2vd5Wfj3dsNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUDtBREBMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwMzc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UoLexmbPBraiyp6qyure1ub65uLO3vrWmubWhtq2goKmsn5WotqyosbKrrbSkm6mgoKiitaemqqSanpaloZSUnZqSlqSonJSQp62wpaCUmaifoo+RopqppqGVmqapnp2kn62doJ2gjZSfnJ+hmZiclZaioJSYkaadhql+f6Z5oY+QhKpwrY2Dp4aXoaOKmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3SngY6bjZKkfJWQn4R7sl6cZKB9gpVuk1yrXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbmRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MDAyMTU0KyowNS83LCYyMSgkJDY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq+rZizwa6rrKintbG4sbW/ubqzsrm8qru2obKln6anp56Tq7KpsKq2raqvoZiioKakpLqjo6yhl5ySo6CWlZ+blZmhoZGOjKmwsKadlpqnpp+NkqSYqKuolZipqJ+foKSto6CeoY6VoZmgoJKcl5uVnqGWl4+rnI+ubnK0dKmMd4umdLR6dbSClKekk52NiaSHjnW4bot7i6Jra7ZaoYZll5dooKKnbZRytHOTmX+zaoWSiK1qdbRhnWaiboaSa5dcrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxZYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqOcscCurqurqLequK+1wbW9srG7uKzCt6qsoZynpKKdkqurqLajs6iuqqGXnaigpau4naOunJaZkKajl46eoZyZnp+Rk5WrtrCmmJObrKmWjJOmmqWto5GXq7KkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH05Sau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bCgpqyYYO6ecB8dbhitYGMh6l9loKsqXF7f3W8iKegaZ1hpo6voX2MdIerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYGRmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNkA5p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwbKtpqOfpKKcnJGrpaqypbWnraSflpqrmaetuJ2jrpmVoZGmoJOOnaOfmZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoKiroJyfqaSynaKkjqahlaGZm5aVpJmQsKCSlaqfhZCZtoCSko24lniDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aMe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZieZoZpjbZ0cnF3toxef3l9iGeDeWx5YouscHSFflhbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMzwwIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRCS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqisq6q7r7HGr7W0sLiotbmuq6Sip5+gnZmUraWuqqe2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopOel5KYlLK1tqyYnaOkoouTkqacpqudlqmlpp2boamnp6KooJGsnpeinpeWmJ2ej7CplJynoo9rf2qcqXmJdH+bj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4lhY4ePlmxgf5RjbZx2YpVsgJmVlGVeYGNxmolocox7hpRman5wdHh+fWJbeHSBaFBcboR8fIpqV2x6gXJJSm+FcE5yTURWXGZgTFpXZmNfT1ptdmpyUk9ERE08SEk8TD4yLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6ihwaSZtLm2o6ymrqeotbKsyKywtK22pL6ys6ihpKqeo5yamqynrqSltaqkm5iVopynram+qKmllZSblqCak5mmqaiRn5CPmJywsr6smqadp6KJk5Kpm6iknJysoKOanKOnraKfqaGZrpuUpqCXlJ6fnZixpZmiqJmdkp+dpKabqKSbnZqcm5GXgmhufXJ3kZeUkISJtKqNhZiVj4qMmJeIlJWJg5OTkImNkpSZk5mXmp+hmpuUn5uNgXmkhWxpe5B9gHWJi4Jygnh5dnaKf3yJanOBdIN1ZHd9dmtveWxfYltvZ01YWWZqX1dZcHpvbWZTT0ZTOVBaTlJPKCs6S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tKJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnprC1qsmrrbKmtabAqbShn6WmnKWWlaGrp62jpLesoJmXlqCYraqmwZ+spJaSnJefmJSVo5+eo6iTkJioqLLDr5mqnKqej5aWqZ6rnJ6hrZihm52ipa+moaSnnqyYlqWdmZmhnp6dsKGdoqeWmZSalKGjl6SfmaGOmJWLi46QmK6PfJWbgpGBiamohYCYlouEjp+Ie4SRhYWakYeGipWPm5eOkJieo5aZkpCcjX6NZaGzroSJhHd7kIp+d3l6b2d5kYCBiGp1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWGt7cWprXFNMUERfVUZAPj8sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLOgua++raqtsbKgqqayraOss7DFsKutpLOvvKS0nKGoo6GempeopqmmpKaztZ+VlZ6amrCmrr6hrKKRkZ6ampSSlqKcl6mdhJ2pq6O0x7OfqaOqlpaYmqeeqZygpayUn5+dn6quqKSiq6Crmp6foZiknpyfnbCkmZ+plJmZnpOmm5mqn5yXZoWTfWV/j5uQY3mMbGhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNrbXqEjIZ5WGVdhYFebIuKgndcZ3N3d5KAiIFud4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziGlqfHFtY11RTlZJZFhASTM9Rjc/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0FJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq9ua+rs7CrpaitrrCnrq6wvbGqqKWusLCgrZehpJ6impqmrJytpKaoqbOunpakkKOwpra5pa6jj4+aopqTkpugmZmmlnukq6KotMO3paGmr56dlZ6jnqOdpKqpkp+hnqCqr6qpoqqeppulnqegq5ahnKWxpJedrJain5uUppmgrJmffr2EiXO0c4Wfhq1od7nEuHGSoaN6ppiZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF7gXqRjJrCwH1qpbJvjYFvynp/m3iShI+AdnmBgHlxe4CGcHeFi5J4bHWRYmVed2NfZYBiXnRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19dXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laK5w7Svr7+pqZSjsKqwr66msrWvqqanprGroKuYm6OgnJuqp6KdrKOlqKWltKSeo5Omrq24tKevopKRmZ2mk5GgoZiboJ6Ipqukq62/v7GgqK+plpGfnaKZo6Sqo5OhoZ6drK6oqqWjoaSfo6ScramRpJuprqqcnqudrqOXmKaXoqSYnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpB2e9t7f5lxfoiTdn9le4h1dmx+h219hY+QfWuAjF9wam9mYF94ZFtxaGpkZmBSVFNXXkpPQzVBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX19dW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNzpTTCssLUowJztbOkwtIVBARjQuMazBwL+0tLC3mJ6Ro6qprbWrprKtrKykrKawqqGnnJqmmJyir5+hn6ino6ahn7Csm56Wpq6tsauorKCUkpufpZOQn6WXnaijnq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiqqqepKenorKik5unnKGclpWRl6FyhoyYdoaoh3GxfJ1xrH2goIGlj554q4J+rX+dcq1/rIeGn3aYknt8l36qiKKMkYucfat6iJKPn396rVacxHuQcJLBfYGVbXVwjG1md2WGb2F4bnJuiImPjoNsj41jbXN1b2BmbWRfb2lqbmZjV1NcYFpSUkM4SUlAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTE0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLSuv08bHsrOfnaOPo6Kira+3r6mxp6iqqK6rq6eipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGtm52no6+soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJuqp6OhqpqvsaKoq66mmqerq6uzpJOYpKeclpOFpGukdYp6qXV7snGCpYqYjHCIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaBo32pf4GUhq5ee6hVnaKSgXujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlo2Aa5eQbWt4eHdua2ZkZHFxZntpY1xWX2lYWFRMTFFMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5gYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwsnV1sChmauooa+in7C0sLCpraOnp6qrq6ikpqCbpZ+dpqempJ2smqKsoaOfr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qKuplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyopyrqbGwuKWUl6Wqmp2Tfaptn4OIdqt5fLBugqSLiZ+WlZ6WgdK4tLjJgYKyX2GUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXOBn46Cfa9fb7VjsXVLo4Ztp0eDk2SOj5uRe2+Uj3xteXR8em1bZWpycWaAaV5hWGNtXF5ZSUxMSkVEQkE9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX19eXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTROVFEdHDs8RjIsJKikwMa5ramyrq2mopyyuayroaWbqKaqrKmmoKalmKujn6+snaahrZqfqaWdp7Wgo5iUqKu2s6ycppyglpCmrZKanKejoKqnrqGjp6mws8Gxsqmsp5SJmJ2lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi0tLWmlpmqppyhkIOeTneagoCeeoSjfIKkhIamn5yflIS4fHx6uYJ/zMbDtnebopGLn36Zl5eKdp+XiqSYpKd+r4Wbg56ErH2ZlGGlbKNwj4WQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlXp8kI6HcnlyhH5vW2xud3JqgW5aY19obmJkXUxMUVNBSEdGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSCMh5mprKSruauvoJuirLO1pp+hlaWvrq6op56lpZqkp6GzrqKpp7OgmqmklKO1o6OVl6GptbmknKOdo5OQorKZnpumpaCir62cpKiitbHDsK2prKmRhpGcp52jpJyll56YmJmlo6eYraGroqSXrqW7rKK3tq6enra0urO1qJqgsaSmoIiQ0rXDt3mHjoWRk4+ApniUoneMoZKFpYOLcquHhrRucmmZpJ2ViZ99l5mHh5BzroKlm6ONpoqTnIiUkJptcLJcpXOTepxsmX97mX5uqWGicnJ+oGJzsrhod46SpJd8iYqPiHV7eI2BbGh3aXhzbn90XGRkbW1maGBKWldYPEhGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gX11aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIIyklknKNiq6/v7y7tZ6XqKSutqKimZWjqqetqaqZpaKfpqCgtaaiqaexpJSro4+kraSdkJqaqrS0pJ2lnKmSlJevoKCepqOcp5y1maCqo7Wqwq+oqqihjISPnKKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oxtbuttqmdq7Smq5p8qJF9fLB4i4CkpYicbbJvoYetfKKPg6iXmoGsiYathaCUqKCjl4WfgZmWgXuSfquBnZmWi6t3naCPiJOSf3mvXaOBfKanZJ6AfJd1aq5dpWxyhZldYFuMoG2Uj6SXgZKKk4h3eYGWfmlsfmJ9dG1/eV9nZXBvZ2doQllfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlRUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiMoKLySm4SpxsO3wbSfmq2grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmlloqakK2xrKegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuboKaekpSZm5SZmaWjopinq6qhop6op7ykl8Otq6OirbS8rbCpo7axq62ad69+kYuchod8uq2JmGSwjGWWrn2hkISnl5yCrYuFsIaomqSiopGFoFxsa4KzYH+tfHuCgbJsZm6Zl4uIsVp9tFukg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtl42mmIiUjZKTeHeMm3xjc3xig3d0gHxhaWZvbWZlZk9VY1xBVF09SCg+OT00ISEsJB8yLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMGzo5ytpqW3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla6ooo6Jm46vrKmno6iarpOaj6maoZ2ln5mjoqWYnqKosai7rqSonp2OfIualqGgmZCRmpyRmZeonp+Xp62lo6SipKm6nqDGp6apoay2t66wqaG/sLCwmIKqkqOvjpuAhqSXmJCAgLjDuoSPnZOFqJmdg6yLg6+KqZ2apquRftW9wqpipL+9fX+jgoPXure1hJSSgp69voRqo4Fvq4RunX96srHHg2ursb2seXiivrt0gJWMpJmNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbU2lcQFRgQkwpPDo0Lx8fJB4lMiAcJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLHAubK9s6Kdrqems6adjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2gq6ypuKyno5qXknuHmZGmm5KPkJiZjpeTqJielqionqimoKKqup6pxaOhsKSstLWssqyjv6uyspx1dqqlt4ZliqBwZ6yQio9ubnelkJuggnaxm5dwkY5yl6qkm5mvpHJsbW1mi3hvbYOZcYB6aXBpZ4mWlZdxaGmFhmdxhmRdimNpb1pdZ354pmBicpCScGZkgI2SjaCVlZeNkpp6hY2TdGSGd2eManh+eWRsY2ZsYkpkV0lqWTpQZERQJ0o5KyMcIBoiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXWlxgX2FdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurmytKqpoq6fpLOqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpqqin6SjoJGLpZKmmamZlqOpoJacpaWmrrmqrJmak5J7hJeNppeNkZCXlI2XlKaTnZanopmvpZ2iq7mfsMGopbSnrbGzrLCuqrynsbuYjKKpprWciZejmIapm5CUnZKqtJqcpK2itJiko5+io56jpaKXrKeMkpONh5OdnZWQmZOYkI2VhH+kmpeVjouTkoqQh4R+Z4yBdIN3dIeMcadtfZaTlJSBgY+Pjo2bkZ2TlJOdgIWSi3Boj3ZviXd1fHlpa2Rkb2NVYVhAaVpHYl9NWCtFPSsmITY0MC8fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXl9hY11eVFFKRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW3r66isKWtoKC2sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyji4iJj5ynlq2koZqonp+TlaSXqJqpmZSmoKOPmqeYoLS5p6qYmpCMe4GUjKGUipWRlZCPkpekjp2YqJ6atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpKa1opKdp5+NqZ+Nkp+irbGboqSzq7OapqOepqygn56dmK2ek5qinJSQl6uZjZiZl5CWnpGHoJ6UlIaTjI+NlYyBf2aNiHWId3qJhHScaoiSlpWSiX2MlpGQlpCekJmSnYGGloV4cZRyeYl/cXt+am5kX3BpYFxfWW1iUGBiT1g5RkZFPTI8PTgvKiYrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYGlgZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOws6yuo6mnraCotaqQj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiombopCvnqSWqKChkpeZnK6Lq5aPqJmnjJiojp24taOlmJuNiHmCk4ybk4mVkZOQjZGWoYucnaecnbeif4OutaKwsHWkv6SzoHl7oq21v5d4sKahioCqf2RcYnegjqSeg5Z+bZS1naSpsKylZqChlHR6m5lwgZmqmWx/pKmKZZylnJGXmJeLkpuQhJ2bkJSDk4eOjpKKhXhrkIh2h3F8hoGBYWmJjJWTjFt2lZFnZ46McXmhlZVkeJeFgHaXaIKJgm55f2twZF92b2trZ1tlY2FhbVFZPU1NTlJGPUBUQjkxLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXWBoZmdYUUk8REc8OVVSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qlqa6jp62lkpWqtK6wpZmppaqXc4ucr6Coq6eUl7mgoI+cpJ6RfoiImp6NrJqklaeino6Xkp6Fda6PiKaaqJGWo4ibubOnoJiYi4l0dpKNlpOJk5CQlIyPk5+NmZ6lmJuxlYCMm7WdtIySj72oon6no3ulsbqDjo+on4SMho+xqa+MipaimnmAi6yGnZ6jqaupiZaHmnelnHuInIGYp4OBe52ze4qGoJiZlJiWgZCWloOZmmJ5iJGEjY+Si4RucZCIeoJxgYGGgId0iIWXk3iWaJN0oJpze5mCm5mEmH6RiIGCmGmMjIRqeHtxcGZleG5pbGpbZGlpZHFaXEdTS1FARTUtWVRUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHUlhaWFthYWlmWVFIOURMPD5iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSfpq6uq6itoKmxp6eqpZmTrMS8r6CUpae0nY+DnKucp6KgjZC+npmNn5qhkX2Gj5iXiKydo5ahoZKNlImGgJGojoeinKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGekJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOyhqmOqZmNnXyoj3J7d5yOppZolaR5tIyhoKiqk5nCgoCriZmhcp6Am6V9l4WVs4GhfaGTn4+YmICOlJyJmJKLfIWUho2Vk4qEbnSShoB7c4eBhH2FdYaDmIGPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaHVwZ2hrXmJubGZqV2RFXFBMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1BaXVxXYl5qbFxRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZejoLCpqaimrKClubGpq6aalJ6hpKmhlKOptaKvf6CmnaWenYmUvZqTjaCSnZB5g5aVkYirmZybmqKFj4x2m5uOoJGInqOblpiXhqK4rKWZm4yMfmJtj4uTkIyPi4yXi4+Rno2SnqCYoKd+oaeHrZ2glq6QoJ6dkYeCoY2tsoikjqybjJp+onaAmZRrgat1Tat4h42dk5yqqYKqq36EoXx7p2qegJNsZ5eGmLeJnn5uYGNYg5d/jXtkZ4tzmX15l2xcfJduYFNxhVxgbXqEYFllgn6FgZlxqKprg6NucqVvn4GbZ2SebFpsiHplWV+CfmFXUG92ZW50cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKW11fV15eY3VgTUU6TU5NVGJcW2ZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnqC5oaqkpqySora9q6+imZaeoKWrq5+crbShp5Ggn6CnnJmOmbSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhayjh5yRipiomJmZkYelr6ailZmHiYBpboiIi46OiYqNkYuPkaGLkp2fmqGlf5OBj6OhlKB3nJaQp4OjqYCGrLCHpXqMfoSafaJwc5OHlXuejHlth5yLmpKcqpyPh519g6J0d6Znnn53pV6Ye32Tc6JumLe0unOTiIGAtqhkgca4fHGVtoxxgJujY3Ssq2F+ap2zfm5+iIOPg4yYcYCjbHKjcp6CfaNenJmzlW97l56zdHJbnrKCaWJwdHVxaG9YamtxcGRbZlxhS0M9RDVRQVlwMjxSR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDOExXVVZjYVpmZmtrYmJlYWRjYGFiYGNjX2Bja25jY2RkaGRiZ2ZjaGiUlpWjuZmrnJOgjqW4ta2toJqhm6KjpKyamrGsq5KXoJmhpZmalJ6sm4uJkXiLhXGAlo2Kj6GQk5Sdl32Rio6ooIaYj4qSopObmoyKqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ugn4uJd5yYoo2gcqGMiamJnaiRmKquga6MfnqgmXmjk3iAc5eIjJx9lZ+Hm46anaiIo2ShfoqWkJuNbZ5om45vmpl7gIqnfXJodKqDnoNzqmeUml2bhXaEnWiqaoG4ZlypcIGcYZWMX6d2d4qKgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dcbnF4d2tpW3Bpd3dhXmNWYUFQRU43VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlFQjlOW11YZGZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtkY2loZ2tplZ2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6qdl6Oaop+Zlpago5mGiY1piIBye5eHjJaWhJKUmI96i4SWpJyJlZCGi52RnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6goZOYcmifiqCPjHCSjYKpiZqhpaqiqn6wraSiuJd2o7Oio3+IlHideqqZf6KPn52ZiZhyoX2HjbC1fWyakaF4fpm1o6OrqISZfJp8nJp/dKpaXW97l4x4nmJNf3t7hWR6mEJNn1mianN8jm+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjYHNwfX1uZV9rZ3V6YmJeT11WXFRWQFlFUGZEUlZcYVheSUQ9Qjg/QjpIRThMRVhBV1JaVkVGYVxaYEtgbX1xRUM8VV5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGhsaZSdgbGumoRUX6GntLqzs6maoouaqZubp5Kgq6Ogp4+enZ2amZWYoZ2Wh4eJd4WBbnmVhJCbi32Rk5aIcoGJkqGbcpKQgYiYlJ+ahI6om5mVioqKfINshIVxgqGMd4SMiIaRmJR7kaKfnqOIroZ9tYSPnp17ppZ6qYKXnpGMo6B/p2h4bn6Zc6BzcXydhZhvk4KtfKSEp5+bgqRwXqlodqNkcKZhnNOPfHuZeHJzY6KGkH6icqOQdmuQs4tggpiKdKqyqLx/d4Nuf7+mqrRenG9/cpdwgnOicl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2R5cX+EbGhmY211dmZeYFFaZVBRYUhWSVRfV1NbZGpbZVBFQ0tMSktBSkQ4UEBQTVhTWE9TUWBlZWpTZHh5d0lGRWNdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGZobGiYm3+xrFRdS3+qsLK1sLOinJiEl6agoKKMpKeflqiJmZiZlJmTkqCXjoiFe3B9hGh8j4OTmoJ3kY6PinCAho+TkmyYlHyIkZKjlYONqZmTkoqFiXmDdoiAboGfhneAkYWHmKGVeJKho5mfibOhoraLeqynpK6lcKmAm5GGgZ6UfqWBo5qGmHGehKKtr4mXi3+MpI2Vg6+jlXe1trbJonOUjIOfYZ2XqW15loegm3Whh3egfpCWi4FvTWajknGaiHOle3p1YoOCbX6gbHJkYJxzf3SXa3tqtLa0xqZzmH15nGqamatzgZpsc3eXaZl5dJdxUER9s15qdWt4hmZrZmJzdG9sVVtSWGdPUWdJVUxYUlVcZ2tuVWdXTUpBSU1KR0pOQVFKUGRjam1ldXNzfnh7bnSJentUUU5tXmhca2lSamhpbGdtZ2NlX1xcXF9pYmRoa3tfXWRnY2pmbm1laWxlop2JsKiFZT+UorKsr6+1oaKPf5anoaGji6SmnJulgpmXl46XkJCbk46Ig3lreYZlg4x/lp95dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCQoIV5gZSGiJWelH6TpKablpaDZ254nGyiZHxypXicmHBop4KZjn2le6GXg5Zyn3aBiZSVj7ltj4qiYn2Zo5eJbnNrq2t1oG5vpmGbaYuQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VwZGeIgm9yoltfW2Shbl6IjHF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWVNsSVhOW0hXaGhyallrVlBSRVZcTVhTYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRti6eupamwsaWfi3+WqZydo4uhoZqhooCVmZOOmo+Ll5COinuGcYCIaIuKfJeac3SJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6WDfYWSjIeXno2HkamlnYmmeJabfqWJloyymZ6RhK+Xn6V5mIp7qXWokISabqWijJKEjIO8bXylr4KHhYeVl56ifqZ8cqiVoZZon35vrGOWipaTeKhtqqOBiXWIgnerkaaIa5KxbHezjKlsi4Zvb6CekpVif6uMqneBgI6nn3effYWklZ2gZ5mHdaxmnq2MtnN2voyjk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xbUVtJXWxtdl9bcVlbX1pnc2Rtb3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx7b1xcYmlibWl3bWdsbmKWpqudgYCepJaqqp6op62jmIiBlqmZnaKJmqScqJyEjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3N0hnKRg25/i5KHhpSQfXuChZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCPgHSUl4h+gXiUr6R/gpxxj4Z5k46GgXtzqY1yfX16l5abhI14e319iJSVk4t3kZmhooV7f4psjIZcenlzenFpbn6TinGAdIKPlJNxhoSCZY1/X4GBjHh2c5R1cHpvb4lvhYZfd2l4jmaCg4aPqpx/dH2WaYmIb351e4J0bWxmjHN3e5d3hFpqV3mPaW53cnFvd3hvXWuFbmhnVlleVlxkamNVYFRdUV5vd3lrandkaWpqdXxwcXRzYW91YnN7gXh1eYJ1f4B/gXmLhYJ9e22AbWR5bl5XbmdodWt4amlpZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaKbp6SZpJ2roZ+Dg5aqkJ2fiJmmmqiYgoGci36WlIeOiomMcoJ8jnx+j4R7l450coNwlYZ8fZKLhoaPhnl+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dhoubp5+gq4OJjZWbf36Kl62okJOokXhxn5OFfZRwf6uHcX6VcWpvfIGfi3+Rjotobl2EjY2cnaCQc5eNiXJ1bIN2dIBZcm+HkYJ+f4xqXWlke4WEiIBgaXh7nHyEjYN2goeEaXqMiWxicXODd19zjYOKkaiWh2eNjoJsdoqCboKKd21kZWN5gnqVWltpZm12W3t5d3Ruc3KDZlxtiWtrYllYXFlYanFaXmBZXV1kcn16dG90YmpqaXt8cXp2dGRtdGhse391en17eXqAgH9vhomDe31zfnpyf2hUXHJpbHZwdWdrZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GhkKOhmp+fmJ6ZqKGgfYKWq4yfk4aaoZGklX97mIV8kpmJiIaGinJ8gIt2hYuChJaKcm+Ac5iGhH6Tg4OGioJ6gISKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKji4iTm52jmZaroqinoZOciZmRfnqQkIapf4CTkZKTnLGlmpSdj42xkpiEpo2Nlp2hipGdhImTi2x9jnd3ZoKGkYt9iZ6Fh4uPiIiBhYSRd3x7dZukioeLoIyHln+AjYOBd3F1hoR/eImIi5GnkYSHjoeCi4+KeoOIhox/dWqAg3x5mWlxaGBzinB9e3d2b3d0gV1eb4Znbl9eWVpcU2dwVWNbW2BsZ3R7e3Jub2NqaWh/e214fnBocHBsZoB7coKAd399f4R7bYOMhXx6eXx+eoN4TmR2anNucXtka2ViYmBbc2ZwZnJxbFVdbHRtaHh6cGdpa2WNiJ66n5eioZiVmZiUmKSgnHp+l6mNnYyFn5yKnZZ8eZWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeDjJqckoapnYJyio+FkpGLnJF8jXqpg42Rl5WOm5aFhZumn6KanYaDkpqZmZCZpqGmnp6Ql4KTjXh9iZCGp3x9j5CRhpiqoZyTnI6NqY2SgJ6NiZWboISPmICIj4RxeYZydWF/hJCHdoyZgYOPgoaFf4aElW56dnWUpIyNhpuGhpB1gYx+fnNzfImFe3mNj4WUqJCHhI+BgomIiHSChYaIeW1qfH97bWhrbGZeeX9nfHt2dHZ1e3dcYHB9bnRgY1pbXlFmbFNkWl1gamh0eX5wbGxjampngH9rcn9ra3Rud26EeW6GgHaCgH2Fd3GCjYd+e3t8gHuCi2Bpe2t1aGqDZGpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqhpJ+TkpaXi5qfnpx6d5ykkJuJhqSTipiZeXqNhXuKkYOMgoKCbHt/eHKAhX2KkHxraH2Cl4mBiI58foWEh3yPgI6bm5CHppt/cIqKi5KGoKGKhYx8p5CHjpGWkpaSd4yjoKGdlpp/gZCamJONmqOipJuYkpyAkId7gYaRiaGBfo2Nj3yXpKCgkpmQj6WMj4GckoqVmZ1/k5N/iI+DdXWCcXdhfYGOhnOKln2IjHGMfoKFho9oeHJ6jpqTkYCYf4mMc4OJfX1yenyNhnx7k46El6aUjYaQe4SFhoRzf4CEhXdkcHp+eHlwa2pmXn5zaHx1dXN8c4BqXmB0dnB3ZGNYXV5SaWhTZFheYGdpdXiBcWZrY2xnZX+Aam19Z21wan13hXpri4FygYF+gXV2go2Gf3x6gIF9f49qcoNudGliiGhsYl9xVnRvbG1geGhsV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4acoJqbe3Wjno2Xf4yhioialnh8hod+hIp+iIKBf3B+enR1goV+iZB3Z2N9hpeKgoqNeH2AjYN5loCVl5WMlZ6afW+LgZCThaWbh4yJg6aVhJGKlZeSkXaRnaGhmJSXeX+OmJeOlpqdpZ6alJWde5KJhXmHmI+ff4KKjoxzl6KeoJKYjo+hjIyDmJiElJeaf5mOfYqOgndyfm57ZIB8i4Zxh5OAkYJrh4OBgIqFZnZwfYiUmo5+lHmNi32CiX58coB5i4Z6hZKLjJmjl4KEi3aHg4GAdHh/hoJzXnZ3fHN9dmZrZGB+aWp3c3N1fXF8Y2Nhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamNsZmh8gmtodGhsb2h/fIF4bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBtYHlnbGFqdnBleHt5cF9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2qJqJmHmWnIuMmZB4fIGLfX2Ee4CCgHhzeHlzfYCDf4iKgGRefYuUh3+Fh3R9fop/fpiElpOWjKOgl35xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5igmpKQkXSAjpKUiZ2dnqeZmI6Vl3WQkYttiJqRm3yIiZCJb5edmqKSlYqMnYuGgZOdgJSUloiain2LioJ7cXprdm17f4x/boWTg5R4b4KEfn6LgWVzan2CmJiFgI51koqFeol/d3mBfoeBfYSPho2VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5gbWJle2Jub3ZzeHdzdGF2YG9sdW5vXFpeXV1pXU9cV2JgZ2xyeohrX2lkamNod4dtZmxoaWxngHx6d26QiHOAg4R9dIGGiXqDfXqBhH18jnJ5i3h4bWyHa2hfaXFih2hxb2V2Z21sYXpoanx7d3Bhd22KgZmaq6GkqZ6Ki5GGiZ6KlJZ8dqyXjJZ8npORlpSIdn57inx8gHZ3f4BwdHN6b4V9gYCJfnxhXH6PkoZ/hIRyeoCGeo+Rh5GRm5GkmpOBfYB8jYqSo4mNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJeKl5NwjJyGZ4mbkJV7ioWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdHN1a3FvdX2LdW+GkY6TcnSAfIKCiX1lcm56f5uVfoWKdZKMgnWKe3CCf4KHfYaNi4WOlqqOe4h9foqEdnxubH2CgGFmd3N0bnphXm9ga3RecGp6eXlscnBleV5ubHNtc1haXV9haVpPVldkYmVwcX+HZV1paGdiZ3GNbmNoaGVpZ4B6d3VvjoVzgYGDfHWCiYV4hXx4hIZ6gIl3f4t7enJ5g2trX29odH9rcW5tcWdva2V7YW1/endwa3d3iX+jmaOooaabiIyKgY+dhpKadH+ok5GNhqCMlZOQgHN8doV4eYByc3qGbHJveW2Jdn+Ahm5xW1l+ko2IgIGBdnWBf3+gho+KkZuXoJKWd4l+gIyInJ2Kj4aSl5aFiJSYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIemhWeIn4yTgI2EjIF4k5iSnZGQiImUjX9+kJl9ko6RjpuTfYuBhHB2cGxub3B8hmlzg4+YinF4gHWCiYN6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnuLh4WKj5yliXyEdoGJfnd3bGh9f35bcXJxb292WV5vYHBqXm9qfHpxbm1qbXdgcG9rcW1ZWGBhYWxXUFJZZWVhdG+EgWFca21kY2Vrkm1gZmZfZ2qBdXJyb4uAdH+CgHl2gIuAeYV+d4eGdoOFe4eLf3t2in9qcWN8YoV8b3BsdWpobmx3d19xfnl7c3Vzf4J+pZWbrZ+nloWMg36WlYOOnXSJnpOShoqajJWOjHpyeHSCcHKFdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZyg3mCoIKQgZKSmJuRmHeQeoKMkqSak46IlJiShIWWmIuTi4mOj4edhJGLfXKLhYiPiJyZn5uXlYGVgGqIn4poiKKJlIWShIpxg5GXj5qNj4yLjo13e5ORe5CMjpOYjXyJfYFsd2pva2xte4Bien6Pl4F3eoF4g419emh1bXaJl4yAiYd8lZFye4ZxeI57i457iX+EjpGfn4Z9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3N1aHBsYXdlXVVlYGBxU1BOW2VjXHdviHteXGhxYmJlZZFpX2hlW2dvfm9rcXOKfXZ9hYB1dn+MeXuGgHiHg3OGhX6MjIR8eZV4ZnJrg2CHfm9vantgaW10gHRec3x4hndzc4V8eKCQm7Gdpo6Cin+CmYl/ipx+ipiSjoSHl46OjoR3dHdzgHBwhXNwcYNvaml1bYJufXxtdXNSToLfyZLWk3xwdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2InH+OgXh7jH+IjIqcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF5kI+Be35/gIaPe3ppdWt0jJCKg4eGfpeMbX+AcIKOgI6JfoV7hJGWm5yMfXd4go53cmtkbnyAaWdzbmdoc2xTXW9kcFpfbHF3Z2trYmd4c3BwZGB4YGBVa19edE9NS19mYlt3cIl0XFtldWBhZGSOY2BmYlhpc3Rua3F2i3x0eYaCdnd+i3N/hn96iX9xiYeBkIqIfH6ZdmVzbnxlh35ub2t/WWtueXpyYHZ6e412cnaKdnmfjJyvm6CQgoV4iJV+e4ichoSekI6FjJeEk46HgXV3b3lxb4NvbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHWDdYShhJFulY+Un5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4l4hoWOnJqXmY+Qdot4cImLjn+NpoeUi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am95dFiIe5KHhnp/f4CGjX96Z3RqgYuQi4SEgY2Yhm2Dd2+Jk4OShn+Ee4KSl5SakXV0eIeLdHJwZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFybltjcmFiVm5aXHdMTEtjZmBddXKJbVtcZHleYGRmhF9jY15YaXJrbmtyd4t9c3eEgXh4fIlxg4R8fYh7dIuIh5WFjH9/mHNodXJ5bYt6bnNwgFdwenZ5cWR2eYaMaHaAiXGAnYeZqJyikoR9cYyTeHiJnIOEn4yOfJaNgJqIhHxzdnBzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gHaKmoiMaZePjpuTkYGIcIWIoI6Fi5WKjJeTe42Sh4KIkHqRi4aPgoB3eIOEcoeCkpuWk5iGjXaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml0eG1ajH2Tg4Z9gIOBhIuDd2J1bYqCkYyDgICTkn5vg216iJGIlIV9gn+Ck5SSmIlucXmLhHRqb2lvdn5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaINxcmpXZ2ljaFdtV1t0TEpLZWZeYXFzhWlbXGV5Xl5kZ3pgZF9dWWtuZW5qc3eKfXNygX97dnqIc4WDfH+HdnaKhY+YgY2Ce5N2bHd2eXiTdG53en1YeYVxgG5neHaRgmR2hoVxipeGmqGboYqGc2+Si3F2jZp8iZmIiXyff4SZf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3txkpCMhmqYjYiakIqFemiHipmHgZKQhoaXjXyMjICAiY17kI19iYV6dXuDfHGGgJWZjpKUgol2hIh4hoONlaChiJiRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0d3ZrY46Cj4CFf3yEgIWJf3BgdHKGfZCOg31/kop6coVne4WMiI2FfIWAgZWQkZOFbm94i350bG1oaXd6YGdpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRiXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWltjc19cY2t2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg3yAh3V4iYGSlXuJhnaJgW94eXuEkm9teoB2XoN/dIFsaHpzlHNnc4d8cpKShJqfm5+Gh3V1k35tdZKWfYeQg4qNmnyMmnZ+dnFvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR2cZSIj31xlouGm5KLh3JqiI6WgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hoGdk4WUj4SDcoGKd4Z+jJufm4iVj56BiWZ+k4J/hYKIiXGBfWZ+jHx5f4CIjI99aYF+hHZncHl4c3d0bGuOhouCi4B5goGFhIFsX3N5e36Oi4Z8gpCBf3OCanqFiY2HhXmFfoKZjpGNfm5teoh8dXNtZWV7c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW9zWmViXmpuYHBPWWpRRFNmYFlqbW18bllbXW1jWmJwdmNmXF1ga2ljbGpzdoGDcW1+fH90dYN6g4J8gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraniEdGuTjYafmaCZhIdufYt1aXeXjn6BioKUl4p5j5VvenRxa2pkYHN6aF9lcXpaYHJ8eWdxeWFlZY+xsndLYlql2dCWcXuQio93fZOKhJiQi4Vua4WSknp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCEk42Ef3CAhHiGe4iem5eNlZKWhYhwe5OCfYKCiIJtgHZogIV5coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4t9d3mBhXqDa1xyf3OCiYeKfoeKe4lzgm9yhYiQhoZzhXuCmo2OhXlubn2DfnV5Y2Voe25eWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXWdqcmBvTldnUj9YZl5ab2pneXFaWlhrZVljcHleZ1xeZWxnZmtpcXd/h25sf36AdXCCe3+Cf4J/doGEiZeJcYKNcXuGfHp5g5OMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZ4aDb2d5lYh9foSCmIqBfI2NaXhza2tmX2FveW1fYm94XGRrgnlhcXZfZWXU6r2LMjo+i45/cXiFh42NdYKWjH6SjYt+bWuEjIx1fI9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo+LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCan9xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCFgHR2foBzgm9cboB1eYuEi3yIgX6JeXtybYqFkYWMc4N6gJeLi4B1bWp2gH90c1tnZ3VuV1Z7UllvZExacnJlW0lxeG9cW1tZXXV/dWlZYltoZm9kak1XZVA9XWVcXXVlYHRvWllUbmNZY3F5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx8gX+BenWCgI2ThHCBi253foB7e4iSiX9oen1qc3tyhXpzdn1+jHl4hH18a4yNg5ueloyBgGyMfWtofo2Len1+g5SCfn2KiGt2cWdoYltiZ3JvYGFrc2BocIh5YnN0XmNkm6CPblw1Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKHdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4SkhoCHjIp+b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9goFvd3p8dX9tWXCAd3WNg4d4iHaDiXt5dG+LgpGChnOAfn+UiYp8b25pbYGBdG1bZWRxb1Baek1bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoamdtbGhwd3ySa2iEin18b35+e4GAgXp3f3+Ki4NxfIdvcXeDf3uJjI+DaX17bXd4dop2fHh/goZ/g359em2EjIiZo42Eg3t1i3hrbISHkHh9eoKRgIB+i4NwcnFjZl5ZZl9wcF9gZ3Bmam6IdGF0b1thZGp2e4C/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0hnSId5OIeXlwY3eHeoCTaXKEdmd3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkZV/e35/cXx2fHR/YlZ4fnN0i4WCfYRxh4p4eXFxhYSOgH96f352j4aDd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIN0XGFcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XVtlbmhWa15hamdlbm5ocHZ6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm13goJ+iYuTf3CAe3d4eoCMdIJ4foGBgoR5gHVvfoqLm56IfYV6d4V7Z3SFi5B5fn97iIaEdo+AZ3BuX2RcWGVZbXNhYGBwbGtoiG5hdGlZX2RugHep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39vcX9thXSThXh0a2B6gnmJj2ZyhHBndW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfHWBd3GAe31ugFpXdX9wdoWIf4F5bYmGdHpsdoKEhX98fnp9dIyCfXRodGVuioNsc1poXXNkR21tS1pgV1ZVd21iUFJ0dlhQVlheYHKEb11gY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtaZ2tgVmpfYG9mZmtxaHB2eI50ao6NdX52eH13gYSBe3R9g4iHg29ygHRxdX6FgomNinp2f3iDe3yFh3eHfH2BfoSAe35ydXmMjaCMiXmJdnSCeF59hZeLeIaDc4WGhHeJemJubVxiW1thVmlzY2BbZ25wZodxYXFmV11ja398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpR3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmhxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOlX1yiGpvfoF5b31dWXN/bnSBi3yCb2+KgHF3aXiBgoGCeH5zfHWHfXtzZ3NhbouAa3FXaVx2W0dtakxWVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVdXFZ7XU5VZXBZW2poXVdnYF5yZWpocmdwc3eGeG6Vi3R/enh+eYOIf3Vyf4aFjoJwcHt4d3Z5hoWHjIZ5e390i319hoSDh35+fn2Hf3x4dXh4kZOff4x8im11f3hkg4aVhXORim+FhYF6g3RkbmpZX1tcXVRnc2VgWGNxcmeAcmJrZVdbYGp/eL6ue5+3bmFzhWhzenF4gYR6fYt+d3dydm97dmVqb2GHdY6Ac2piXn54eYuEZnF/aGtrWlZvd4iigIR/cZmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamt5d3p2Wmd9fHlmc35thXVldYaNhpeAcIxna3uEdW51Yl1xfWx1fYx7gmd1h35ucWl2gHl/gHR+bXt8gnt4cWZsYW2JfWxsVWlfdlVKaWpOUU5nTFh7aGFOVXVrTFFUVV9ndoRnXmFxaGdiV2pdXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGVtZHFncnB1gHdwmYZ2f353f3yFh311c4KIgJWCbnN5e3pzcoSHiYiDeIF9dY9+fISKjYOBhHt+i4N7dnt3d5qdmHqJgoZpdnx7bIODkn9yjoFwhYJ/gn9wZ2xnWF1bXFtTZHBkXldicnVqdW9lZWNXXFtof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Vpem97cllngXd1aHCBeIJ3YneGi3yVgm+Mam17gnFndGZhbnpoc3iKe35idoR3amxydXxye3t0f2iAf4B5d29kZmJthXtsalVoYW9SSmhqT0tOb0ddemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFZkV2JwXEtLaldjYVVUVXNWTFh1ZFlea2BbWmNkX3ZnbWJwaXRvcn50dJmCd36AeIB/hoR6fXWChH+XhW5ydHx6dXGEhY+BgHqLdXOQf3yBlY2AhYR9fYyGen2Ad3ujpYp5iIWEa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF9aaX9pa2+AZ2xgaHl4anJzc22DgHp/fHV0bXpoanlqX2VuaIF2j4RnZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4e5KCepd2hoSAhoh2anJ1Z2duW2xjXW1yX2dhanhoe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFyY3JpXXF4ZXJ0iHx5Y3SAcWdqeXVzbXl5dnllhXx/eXdxZGRjbXt8ampUZ2FlU0lrZk9HUWpFYHdmYU1Tcl1KTVVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVEpbeV9bX2tdXVpiZV95aGxhb292bnB3dXqYfnZ/gXmAgIeGenl6g36Bk4NxdHR+enZ0hIiRfYB8kGtylYB7gp+Ffod9gH6GgoCKe3eEq55/eoeHg2tygXl1gH6AdG6GbnyAc4qAanBuZGRYX1pZWlRiamdbWl91gmlebWxcYVdcXGuBZXJ0fWlpXGt2dWdzdnFshHt9fHh1cWx5Z2l4Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cXyOfXiQc4V+gICGbmR1cmRnZ1xqYV1vb1tnXm10ZXpoXXSAb3JrcXx+dXZidIaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d2e3t2cWViZG1yfWlrU2ddXFRLcWJQRlVgR2J2ZmFLU29YSk1YWGhrdntlZW5xZ2RaV15Yd2VUSlxiV2dXWUhXZFBIYnhaXV9sWl5cYmNdfmlqYG90eG1wbnaDl3pygIB8f4mMhn11dYZ4h4x8c3V1gXl6eoGMjnx+hIlpc5aBeoqdfn6FeoF6f3yGiXNxj62Me3uGj31kcYd5c3x6dXJuhmx7fmyPemNwb2JlXWVWWVlXY2ZrX11cc4VoWHFuW15YWlxse2Jwd3VsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9+iH12inSCeX15gGlkdmxgZl9eaV9ddGtZZVxvb2J6ZVx3fGtubnB4eXR1ZXOEk4CIg4l7d3Bzf3RjeGVccXFicXKCfHRncoBlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNnV1hTTXZeUElZV0hidGNhSVRtU0pNWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWGBNR2l1WF5gbFtbX2FiXIRpaGFueHltb2p2gZB5bYJ+gIGTiISBdnSJdIyGdHF2doF4fX1+jJB/fpN+cHeVg3yYknmAgHh6foB0iIR0cZmhenp/iZR3Y3WHeHN3dGt0b35reHxwkXNecG5gZ2JsVFpaV2hjbWZcXHGJZVNybltaWFdgbHZjaXVqaV5ZbXNwa3Nzc2mEfH5+enZubWtkaXFjW2pyZHR2jnNbV1NlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfH19c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGhhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHpzZ3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVNWUU91WlFPWFFIY3NhYEdWalBJUFpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYV2LamNkbXp4bHBpdXmHe2uDfX+EmnyDhHl8h22Ph3Judnp8dIKCfIuPgoKXdHiBk4WBnol1gYCBdH+CcYiDdnChlnN6houGemV3im5tem5meHB6a3N2c41rXnVuYWdla1JdW1VnYWxrWlxxjGRPb25dVlhVZ2lzaGJ0ZWRcWG10bG91dHhqhnx/e4d2j3JjZGtuYVxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl1fW17dXZwe391X2ZyY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2c2NtdlZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlJQR2RyX2FGWGlOSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF5djm5iZmt5dW5vaXZ2gH9sg4B9h5h7gIeBiX5rk4hyZnSAe3WAg32Jjn+Lk3J8ipGFh5+Ge3+GjHOBhnN+gnZupItygI2LdndseoxgZHtwZnlzeGxtcXeDZ2R8bWNmZ2hTX15VZ19sbltebo1oTmltYFRWU29nc2tleGRkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcHh+Z1pWWGBseHx7cIRfY19nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbXxrdnRvcHyBc1hqbl5YXFVhYldkcGNTXmJpYWJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNeaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBbXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5GElY95fYyOh5GbhIB8jIVzf4FzdHhyb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn1+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKSk5OTkpOTkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkW1mZ2dnZ2d9hYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5ub2pmZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyRZ19gYGBfXnmDgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2doY19fX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GOjY2NjY2Nj5CQkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYmKioqKioqJiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZKSkpKSjZGSkYmHjoqQkpOOiI6OjZGIj5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2NjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjYeGiYWIkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSJhoWFhYePj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYWEh4SGiI+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFiIaGiIOKj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjIuOiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fn9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWEhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2Pj46NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH1+fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39+fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f39/f39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fX5+fn1+f39+f39/f3+AgH9/f4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2doaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eHZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlFRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p6fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PTk9OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUxPUk5ZcHByd3h3d3RzdHd6fH59fn5+fn5+fn5+f3+AgICAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz87ODk4Ozs6QDs7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODk6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxc3h4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozs/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gICAgICAgX+AgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs7Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fX5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnV3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhsb3BwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQ0NAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx7fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQURlb3BxcXR2dXh7fHt7fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPztBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4GBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZKSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnN3d3p7e3p7fX1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0xLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGSERFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX5/fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l6e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSUtMT05OUU5RXnKBhYOEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozs8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+f35/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3Nzg6Ozc2ODk5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo8REJERkZEVniEhIKCg4KFiYqKiYmKioqKi4mJioFINjc2NDY4ODc0NTc4NDY3Nzk5NzY2NzY1Ojo7Ojo8ODk4OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09PUVdrcnJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6OTk7Ojk9PT0/Ozs7PTo+PDo8Ozw7PDw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSk1LSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ojs8Ojg5OTg5OTk5Oj49Pz9DdoSDhISFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pj9AP0A9PT9CP0FBP0E/PUBBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg6Ozk6Ojs8Ojo6PDs9PkA/PWGFg4SDhYSGiYmIh4aGhoeIiYqLi4qKiouKi14+REdJS0pKRkdHREZIR0VDQEBDRUNCQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzo9Ojw6PT0+Pjs+PD8+Qj9KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRUZEQkhJS0dIR0ZHR0VLSkxJS0tKQ0ZDQ0RCQUFDQkRDQ0REQ0E9PD5AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgICAf4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFEPmiEgoWFh4eIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVIRkZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGhoeIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSklIRkpJREpIR0tKSEpHR0dLTE5MTEhISUpNUE5PTkxPS0lHSUpISURJSEhGRkdHSUZDQkFDVW9wdXd4ent4eHp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdIQj84P0A4Ojs3PD06PD88PD0/QkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTEpMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5enp7e35+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPUJEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLSkVGRktPTk9XVlFQT1FTUk1TVE9NU0xQU1VXUlNSUExKTU1NS05HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSjs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBQUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH2Afn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdHRkU/P0FARUFDRkRDREtWUEpPT05QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNQP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVNvdHZ4eXh3eXp6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NRUFRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYXNzdnd3dnh5eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3V3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQUElOT1dWWFtaZHF0dnZ0dHZ4eXl7e3x8fX1+f319fX59fX5/f3+AgIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtHQ0lHUlNUWl1tcnZ2dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f39/gH57dnN3fX5+ZHV9aXF0YGRdXltZVVFMSUxJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZERUZIR0hCQ0hHSEpHQ0JBQ0BOUE1SZHR1dnVzdHZ5fHp7e3t8fH18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaGVlYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9ITE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHp8en17fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFVVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSEdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fHx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSU1ZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RV1BNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9NTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXVFtmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNTT01MSUhIRj8+PTo3ODc2NTk5Njc1NjVXcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQVE9Y2BRU1FQTlBQT05OTVBOVFJQUkxJTEtPUlBRUlNUUVNPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj0zQD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTE9QTk1QUVFOUE9KTE1NS0dFRUNCOz09PDk9RzY2NzZEbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQjhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE5OTUlNTElLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPj09QUBCPT5FSEZERkZJR0pKQEZBQUBFR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPSEpIQ0lKTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNOS0hDRT05ODc5P0I/Oz5BQEA+QURJRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NV0tMTktLTU1MTEtOTlNkTUpMUklJSUVCSUpMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHR4fHx5em5xcm1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0dLRT9CPTk5OTo/Qj88QUJBQURER0tGRElJR0dIQ0M/Qj4/P0A9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tHQ0NLSkxOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFuamxsbnR0bXN1e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWlxaGVxSEpDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5RTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ5dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9panRoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDREdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1QTlBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bXB1dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs9Oz0/REI/QUNGR0pGSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUZFRktOT0tGSElGRUNESUlIS0lHSFBLREpNTVFOT05PUE5KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHZ1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5JSkxLSUZIRUZFQ0NISEhLSkdLUk1DT09OUU9PT05PT0tLS1BVV1ZWVFlgX11pYG1pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcHJra3NNR0dFR0FBQENEPEFBQEM8ODo9Pjo/PUBCQEBAREZIRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUUxKS0hISUVGSEhFQ0lJSktNS1BTTkRSU1FRUk5PTU9QTUxOU1dWV1lWWF5aXWRgaGNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQUFCRUU8QENCRDw3Oj0+Oz47QUI+Pz9DRUZERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFFNTlFOTVFXWlZaWVdaXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0hDQUNHRTxARUJEPDg6Pj4+PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkdLSENJSEdJR0ZESEtJRktITUtKS0tIS0pNS0lOTE5OT1JVVk9MVlZUUVRSUkxPUVBPVFlaWVxaWlxfX11fY15cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVLSUpISkVCREdFPUFHRERAOTw+QD8+P0NCPEA+QUFGQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBRVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVoamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3RndHJrcXJrcndwd0lKS0lLR0JFREU8QUZEREI7Pz9BQEBAREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUpKR0tKTExJSUxLTU5OT0xPUFJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBjZGVhZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dGVxc2twcWpydnB3SkxMS0xHQ0NBRTw/RUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUtNTEdLSUhLS05RS1JQTFNNSk1NTlBQUFRPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNeYGZjYWJnbmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cHdMTUxMTEdEQUBEPj1ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1LWmZKZFtLbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW56ZlxsdWBsa1Zgd3VoamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNxeUtOSktKRkI/QEI/PERERkRDQ0JFRURGQkVGR0RESkVFSkxLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTExbc2JkcF5sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtpamdvcXRldG5uXHB2Z3BOTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eHZ1dGJtdWtwcGxycnF6S0xJSUdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk5ISktKSUxKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rb214eHRzaXBdYHNscWpVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVFQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hKTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0cGtpbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHFzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNR0lFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUhOR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXJvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklJSkxJS0pJSUtMTU1MSUtLS1NrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5paWRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSktLSUhJR0tLS0tHSEtKTEtMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0dDRUdGRkBFQz5DR0RFR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISUpISUtITEpJRkhISkhISEVGTElISk5LSE9cV15PXFxgXk9YWVNcXGJeTVhaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0T0JDRExMQUNEQURJRUdHRktKS0dFRUpKSkZER0hQSkxNSk1SSUhFQUhGSklLS0lMSklHRUpIRUZHRUVKR0JJTElKVF9ZYFhgYVtgVVhZVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlYWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUhEQ0JDRkdFR0dJSkpJSERGS0tLRUVISU5KTkxITE5HSEY+R0dMSUtLSktLSUdFSUZDREVCRkpEP0lKSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJiYmNjZVpSWVZXXVpeZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFhRSkZER0VCRUdIRkdISUZHSkdIRkhLSUtEQ0tKTU1MTEhKSkhKRz9HRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGNiZGNlWFJXVVRdWVthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaFhoWGhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKRkZGSUxKTkVDS0pMTkpMSUtKSUlHQkhIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9ZX1tdVVhYT1xcUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmJkZGJYUFJSU1xUXF1dXl5fX19kaGdsam5ucHt7fH57gIKDhIWFhYWFhYSEhYOEhIeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdHREZNUkhEUktGSEhIREZLSU1QRUdJSktOTExJTEtKSUdESEtRT01MUE1MS0tJSkRFQUVDSEZBQUZDQVVVRVxUXlNWX1hOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1RRUFFSWVNeXFtdXV5gYmZmZWxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUhKS05MTEtNS0pKR0VKTlFRTk5QTU5NTklMQkRBQ0NGQ0JAQ0RATEhDTExQT05MRk1GRkhJR0ZMS01PUElMT1BQU1BMUVNSVVpYV1lXV2NWTlJUUFFQT1FVVFxZWVtdXGFhZWZjaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSExGYEVEXkxEZmJDTFpIXlxzbU9NVm1YS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJiYGdpZ25saHJ6fH1+gYSEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUtQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dV9hdl9YYlxcZltfYWFhYl5gY2dtb2xgcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d01JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQS0xPR01QU1taVFFST1BQUEtJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nvc3N8fW9+eG9/cmBgYGJiW2FhaGxua2JsZmdtd36BgIN+e3h3gHR2emhyfm50fH53eHt+gIN4fIF1fH98fHNzTUtGYF1HQUVNTUhLS0hKUE9NTkpOVl5ZVUxRU05ZWUxTUlJOTFBJUVJUWVdXUVRQUFBSS0hneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXCAYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ymx0Z3J5e3NzdXl+gXN2em58fXl4cm5NSVJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1RXUGFeUlZRWVNNUEpTVFVYV1dQVVBPTlNKS3JvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdsdnN0cWxtXHN+emtteXxsdW58bHF2dXheX19iX11fZWVpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUVldZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWhkfGlye11US2tfdnVsanZ8e21+eWt8cF1eXmJbX2JkZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RSkhRTU9VTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcZ3JfW1taXV1fY1pfY2NlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1JQUVVVVVNaUU5SUVdVU1lWVFhUU1FUU1VVWVlYXlpfYV1cWlpcXGBjXF5iYmRnZWVlYllgYWNhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RTkxTUE1OVVNOUU5NTlFTT1RQUlRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1VUWVVWWFRSUVdVVlhcWlxgXVdZX11eXVxdYGFeW2JjY2hnZmViWGBgYl1gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTE9UUFBUUU9RWllYV1laWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFOTVJRT1FYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVZYU1dXVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aYmNlaWhlZWJZYmBiXl5mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1VRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9RUk9NUFNSVVpVVFBQTFBXVVBWUlNSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VWVVtaVlFTVlRWWFRTWFpTUlFZV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVmYFpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFtgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVFNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFNZW1dVT1JOU1hVU1FUUVFZT1FTU1ZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRUVVdYUlNZXFRSUlxYWl1eXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWddXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9SW1NSUVRSVFVUS1FWVVpaWlNPU1FVVVRSTlVRUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFRXWFhTVllcVFJWXVldXWFeY2NfWWBbZWJfZGReXmNjYV5lZmllZl5eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SWlBaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVVRWWVdMUlpWXFpcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVxVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZkYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUVxVVllXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWVlddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWVpaYVhbVFZYW1laV1hZWldWXV5gX2RjYmVlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWVpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1RdW2BhXFVVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdZWVxiWV1VVlpcWltaWllaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGhfZ15iYmNhYWBeX1hUWlpaW1tYXFhYXFtaW1dXWlhXXFtcYF1WXV1TT1ZaVlZaVllWWFdYXV9iYWRhZGFeWVlhZGJga2ZoXlxdW1dXWVpcXFxfW1lbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGRmZmdjWWNmZWhnZF5jYF9lY11maWRlaV9nXmNiY2FhYF9fW1hZW1laWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1lWV1pZW1xZV1leYGJhZWFkYV1eWWFjYl9hYGFfXV1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXF1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfYmVkZWZnaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVW11dXWBgYmF4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tcX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJjZWRnZmZnZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFhdW15fYmNiYWFdYltiZGJgY2JiXVxbWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdnZmZmYGZnaGhnZGRgW2VnXmFoaGNpaGZjYGJgY2JfX19dXVtaW1lYWFhWWldcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dXV1dXV1dXZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6enp6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ1dHV1dXV0dXZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8eMXU0tLS0tSTe319fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+vsrT0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX141efk5OTk55l7f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3M2+bl5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ+f39/f3+AeXd3d3d3d3h5enp6enp4b29vcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCgoKCgoKEhISEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnR0dHR0d3V2d3p7eHt4d3Z5fHp6enl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5enp6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp8eX19e317eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en57fX19fnx4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX19e31+fHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx8e357eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt4enp5fHh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh4eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3l5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx8fHx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKi4uHh4eEg4KBgYGBgYGBgoGCgoGBgYGBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SEgoGBgYGBgYGCgYKCgYGAgIGCgYGBgoGCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGCgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKBgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgYGBgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e318fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqFhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyJhoeJjIuLioaGg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qIiYqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhYaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioiCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgYODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGAgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4GDhIWEhIWFhIODhIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiJh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKBgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHiIeFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKChIKCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4ODhYOBgIOCg4WFg4ODhIOEg4OEhIWEhISCgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBf4GBgICCgYKCgoGBgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgoKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgoGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4WDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISGhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIqIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICAgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoOChISEhYSDgoKDg4SDg4KDhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4eGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGCgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODgoOEiYqHh4SEhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChIiIh4iHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KCg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4OEgoGCgYGBg4ODg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaEhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOBhISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4SFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4CCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+f358fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn1+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/fn9+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhISCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAgH9+gIGEg4KBgYOEhIOEgIGAgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/f3+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIKDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f39/gICAgICAgYF/fn1+fn9/f36DhoeHiIKFhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4KCgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH+Af3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoeHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAg4N/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gICAf39+fX5+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4eHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgIB/f39/gICAgICBgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjImJiYeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIF6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhYWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fHuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4eFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt6enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fH18fH2Af4CAfoB+foKUkYuMjY2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYB/gH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt7fX9/f4B9f36AjJGNi4yNjY2HhIaGhYSEhIODg4KDg4ODgoGBgYGBgICBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goOGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX5/f31+gH5+foSSjIuLjoyLioaEhoSEg4ODg4KDgoOCg4KBgYGBgYGBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHp9fXx+f4CAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fHyBg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fX9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeFgoSRjoyKiYqHh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CBgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt6fHl7fHt7fXt9fn5/gICDh4mJiYqJiomFiJGNi4eIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIOCgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIiouLiomMkI2MiIiGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+fn+Af4CAgH9+f36AgX9/gH+AgYCChISBgICBgYCBf4CBgoF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SHiYqIiY2PjIqIiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX14fHp/coF9e3t8fHx+fn19gYF/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH5/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYaFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh/goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59fn+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDgImMiYqHhYWFhIODgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iYmHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h2d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foCBf3x+fn19fXt8fnx9fHx8e3x7fH6JhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoGBgoGBg4B+gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCf36AgX9+fX5+fn59fn19ent8hYR7e3N5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF+f39/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GAgoKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgH+AgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgX57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWDg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5/fn19gH+AgYGBf358fn9+fn+Bgn+BgYKDh4WBf39+foB/gIGAgICAgoKBgIB+gIJ/foGCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH6Af4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fnx7f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4ODg4KBgoOCgYOCf4GAf39+f4B9fX19f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6BgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hX1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx+gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgYF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgYCAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn5+fHt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn99fH5/f39/fX1/f35+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4F/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH50fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGBgYGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af3+AgH9/f3+Af4CAgICAf4CBgIGBgYKBgIB/f39+fX9+e4GSjHp8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYaDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAf359foB+fYCAgH9/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn58gYaJfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fX19fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDg4ODgoGBgoOAf4KBhYODhIGBg4CCg4GBgICAgoOCgIKChYN/gYB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoKEhICAgoGGgoSDgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX9/gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4GAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6AgH+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBf4KEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgYWFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/goSDg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEgH19fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGEhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn18fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhIOBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4B/fX1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFg4qIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goN1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3x/c4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2eXmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf36Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHh4iGh4SGhouKhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWFhoWHh4WGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHVwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaFhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIWGhYaEhoSDhISGhISBg4OEhIWEhYSFhIaDhoeFhoSEhYeGhISFhoSFfXeFg4SEgoKBfX9+e3x7fnt8fH1/fn18fn2AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoaIhoWIh4iFh4aGiIWFhoeFhoaFg4KFhYaFhYOFhISEhYSFhYSFhYSGh4aGhYSGh4aEhISFg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fX9/fX6Afn6Af319fIB9fn5+fn5/fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhISDhYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoeHiYiGhoiHiIqIhYeIhYeHhYeGh4aHhYiIh4eFhoaHhYaGhYGEhIWGhYWEhISDhIWFhoaGhYaEhoWGh4WFhoaFhIKEg4KEh4OEgYKEhIOBgICAe3t+fXx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoOFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoSDg4OHgYOAgoODgoKCf4B7fX59e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFg4WGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFhoeGhoeGhoSGhYODg4KCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYSEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GDgoCDhYKDfoGBgX+DgX9/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4mGhoiHh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgYKBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhoWGg4ODhYB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18h4aFhoaGhYWFhIWFhIOCgYCCgYCAgIOBfn5+gHl6fYCDg4SHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoaFhYaCgoOEf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHp7e3t8fX19fH9+fXx8fX9+fHuHhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHiIeFhYiGiYeFg4SEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WEhYOFhYGBg4N/fn+Af39/g398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3t9fn19gH19fHx9gH99fIaDhoaGhoaDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCDfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXt6eXp6e3l6enp7e3x6e3x7e35+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4WEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4OEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fX18fHx7e3p6enp5e3p6enp6enp7fHl7fXt8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIKDhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHt8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOjs8ODo8Pjs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ozg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ojo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dTV1NTU1NTU1dTU1NTU1NPS09TU1NTU1NTU1NXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLysrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb29vb3Nvb29vb29vb29vb29rT0tPT09PT1NTU1NTU1dbV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzMzP0M/Pz8/Pz8/Pz8/Pz9be3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqLhoGCgYGBgYGBgYGBgX+P09LS0tLS0tPT09LT09Ld4+Li4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zM0NLS0tLS0tLS0tLS0tHe7Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTVEtDQ0RDQ0RDQ0REQ0M/XdLT0tLS0tLS0tLS0tLQ4Ozr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz4/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fMzNHS0tLS0tLS0tLS0tLR3erp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1hQR0hISEhISEhISEhIRGDR09LS0tLS0tLS0tLS0N/r6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc3Q0tLS0tLS0tLR0dHR0Nzo5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJiXFNUVFRVVVVVVVVVVVFr0tPS0tLS0tLS0tLS0tLe6enp6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3Nzs7Ozs7Ozs7Nzc3Nzc3Oz8/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pzs3MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLzMzLy8vLy8vMzMvLzMzLzdTU1NXV1dXV1dbV1tbW2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc3Nzc3Nzc3Nzc3N0c3Nzc3NzM/T0tLOzc/Szs7Ozs7OztHU1NPPztHSzs/S1NXU0M/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbW19fX19fX19fX19fY2NfW1tbW1tfX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STztO4ns/RnIKEisbPzs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7u4na+3l5m5upW4ua+h0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPgInJnaOostGSfX6vsdLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqfQ08KGmrXV082ensTQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pKycntHWo5i01NPAoKDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCek6W32KKZtdTVsKKp1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1Ojo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bptmimbXU1aShudTR0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKDZopq21M6en8nS0dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT87PDk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ2o2qOatdfDn6HS0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGgv9iim7TZsqSm1tLS0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqdXWsoTG1rmDv9XS0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjs9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvdXS0tHE1dHRwtPS0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLT1dPT09XS0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5OTQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NjY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PDo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU2NjY3ODg6PTs8Pjo8Ojo9PTk8PD08PT08Oz1ESERDQTw8PDw+PkA7ODw4MTU6QUZFV661tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NTY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1OTc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1NTg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw7Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzo6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjo+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ2PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI+PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUxPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLh4iFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1N0JGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCMf4eNjIuLh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNTZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6SjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX01IUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXVlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmJaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yX2hfY1NRWVRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NuaWhiXlBQQD87Ojg5ODw7NjI0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtq6WppKWqp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJecnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbmFfZGBQT0FAOzs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ozs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpOWlJSYk5CanZiKi4eAgHyCeGFeWVRhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5tW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8Oz5CREU+Pj1AQ0NDREQ7OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7WzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpiUlZGUmpiTj5OdlpKLkX56fH90a2tuZG9saHF4b3lpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQkA9QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MvGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S9wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZmZdZFtSWElGPzs3ODg3NjE2OTc1NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBQ0JAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIqLjI6SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yc7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlqaF1qb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzU7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmFndWdpaHRteGxdZFtVX1lMSEQ2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxcfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8nKx8zIx8jNxsvPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw76+wsDAwcLLw8bMy8XI0cKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ozo6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vcC5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygp6GjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs6Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojw9QD8+QD09P0I+PEBBQ0NBP0M9OjY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoaKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVkZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDk3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/tryxwra0vLG0trizur2/vbyyra+ssbC3vLa8vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PT05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb+7xLe2uLa3wL/EvMLFxcfHysnGz8LBuK62tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oz48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAua+yvLywt7u2u7yrq6Owub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysS1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRDxBQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1ura5xLi1vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjs/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqaipaqsr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98dmx1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJiamJiVmZ2ZnZ+bnZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenN2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHF0d3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXJur2+trGnpJ6hqbGutbm2srGrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3dvfG91cm1jXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NjpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyyrrOppqmqrqmimpeXkZyamKOeoqKvp6Sspqmamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlydnNtdGlrXVtqVF1cT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw8PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub21sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUURNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg7PT47PDw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqSeoJ+noKiqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLjAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS1r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lo5ujnJWQjI+PkJOQlpWWmJ+enpqZppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeIN8dn95YndsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo9Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pzk0OTw3QUNCRD1AQ46qpKOioaKdq6WmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk5CPkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfXyAdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6yq6WqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Gbnpqjp6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4emBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJuakY6RlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2xsbSpsa+imZydnqGZm5uamJmblJWalpicpKGgmqOhmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlXFNaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5WZkpKcmKGdqqKnoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp6CfoqCXkZScoZyZmJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvbe+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpaCsoaGioJ+amJaVn5ubmKShoJ6joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbVpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj43NTg9PT9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56coZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWfnpmSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vbOztaGroqmosqmqqKenmpmemammoJmnoJ+fp6ilpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODU4PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ6foqOen56bnZyUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK7t7Opsq2qs7Svs66prqOdq6e2sayir6Wgo6+xrbCkpK+joaCaoaahpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4aBe3Rya2t1cnBoV1xRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKKcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6WdlZubn5qenZ+lpqedoKCssa+npKSjoZ+mrKafl5yUkZmdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8zSx76/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrru2vrq6qresqqq4urS7rq24o6WinqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfnpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5OOjZCMgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0tPM08/T08zKwsXGxsrHzr/I0MvGxcbEwLvCwL6+vrW9s62+v8LDxsTGw62+uLK4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBOzs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeRkI+Mh4SDiIeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV19LXzcbHyczDxcrPytPX0dfS1dXT08jMx83NydLMzdPNxMfJycDFy8fIyMW+wrOzx8TLysrOxcm/vb+8wcbEzMzIyb/Dv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTo5Pjg6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOfoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0srS1dbZ1dfT1tjO0snO0czO0MvSz7/HxsnCy8vLzs/Fxse2v8q/0szLz8XJx7/DwsjOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWZoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09HI0NjX2NHX0tfZ1dbMzs/JzNHLztC/xcHGxc7M0NDRyMvMwMrLxdPOy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzk8NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6anZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnZ3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxtHUytHU1dbO0tDY2NjXy8jOw8jOy8rMv8m/x8jNzc/K0M3Oy87Px8rP0MrOysHIxsnMysvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ09fa3NbPzcvD09DCwrKrra6sprOyuauzt6mjn5yWlJecnp+fnpWWmJWKbF9fXmFkYmBgYWFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR1MvMz9HTys3R1dLV1crAycHFzMLIycLMwsXHysrOyszM0M3Ty8XHz8zHx8rExsDFycvNz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU2PT1BPDo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozs7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHw7nL1dbZ2tvYzM3PydbWxcS4sraqpK6tubmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nLz8fDw8/IxsHGx8O/wMfLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7q9qrGyp6WdopyYkJuQpJmXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk7Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKm3q7+6ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrDv8O6ycfIusfGxMrAvcHLxsXDvcW8vL/DxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fEyre/vLq0qaylpZifmKyjoaWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NHMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcbCvcbAt7vEyb/Cybu3urrFwr68wc3Cxr69tcC9w7q8xrvCubO8xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3BxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ozw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3u7avkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrzBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7ta6ytrq+s8S3urWruLy9wL2wuravtrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nMysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Hhnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbWhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqassry6tsO5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHIy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo5Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6vLvKt7S7vbW1q5GJkJB8eX6Khnp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbW9oZ2dpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq21trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6lqKKrsbKzp7yqq6irrK20tKaorqGkr6mypaeorqWot6ywsre5uruxvL2+vsS/tcHBx8i3v8DFt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe6xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDx8W6vcS+ure9xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXV1cXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+lpaelrZ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sbekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLGtrayxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BrYWVfa29gVVlfSE5oT1RHRUpGPD1APTo7OzgyNTUzNjk6ODs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc3ODY2Njs6Ojs5Ozs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8TGs77FvLewub+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippufn6OloaeemqKbn6qwrLG1oqmqqauspLW4rbevrLK0rrO1rrGqn52eo6KypKWpuK2hpqafqKyrmZ+gnpmdn6WamaOcm52vqaunqqusrbCyuK64ubuwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzU6Ozk6ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCxLytqrW5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpqGkm5+gmpitra2vsqCloq2rp6G1sLGxrKeusqe5s6a2oaKemqOhraKhqbWqoqOmnaWmo5aYnpeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK5tK+pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+7qqaxurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn56hnJahoaijn52onJuaqqausKubo6O3qqCfrqi2qaamrLCjt7CjtqCim5iYq6ahm6y4r6KhpJyhn6CTlaGUlpabmJeWl5yUn6mdqaOhnKOqqrCtqLSrqqatsrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NjUzNDk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tLnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBusDAubq9t6iosbumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFpbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+mpaSlpp6cn6Sfqq+mn6KjtqigoaKos6Glp6SvpbCsq7SeoJ2VlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSro6Wwp6Wjq6utpaiurq6rqKmps6Wmq6+0sa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc2NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uramp7K1nqKKmIeAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFJVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWo5mglpygpaGtpaOjoqOhm6qqpZmepbGpoKCdpKqdp6GdrKypqK2toqGilJeimpyPq6mwm5+in56XmJOKnpKNkpKVj5iYk5uhopykoKGVoKGjpJqjq6WipKqjq66lrbGppqWmprWmqaits7W0ubqvqayei3Jwb2BbV1ZVUUZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PTY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY5ODY5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtr3Hu8HHw72/t7q1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OkoJSTm5aVkamprZqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaijoqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWVlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQxLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbMtbG9xLzCxcO9wbO5r6Wqr6uel4aBd3hvbmlubm5xZ2dpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTlBRWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqaatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloZ6RkJKSkpWnqqSZmZqdnZaOjIuUhoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y0q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZRUlJMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMs7m6vsDFx7a0t7yyurvEvsKxs62wrrCsnKKIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkqpynmaClm5KPnqKal5aEg5Gao4+TopyVlZaHopqak4uOio+Zo6eclZWXm5CSh5SOjIGLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKaopqGgtLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPQ05OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDErKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzs662oqy1xLq7r6qstK+voJeofV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaCOmpuioKOYpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmPnIyCiX+JmJ+inpCTmJaEjoKTfn50iY56kIaSkJCcmpmZkJWPnY2ioo2JmqChpKOborSvrK+sn5iluaalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhITVNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0Nzg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+1r73Dr7HHsq2nrJWjrb+4sbCgqK2sqpaVonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RRTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSWlI6WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeYJ6hZOdlIOVjpCPgoZ9knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqGgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg1NDc3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raeolqalo6CXj5ZpUE5SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk1LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoiGlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Ud3V2eISNmXBRjYiKhnt+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZKTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+Zsp+imo2glpiUkYuMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoF7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnKSeGd1hISEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTFBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC8vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzU6PDw3dq6Yo6GYnJ6zqa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGlKSWnYyDl4mPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoePfHZ7b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2hzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpqbo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkpWAfIp6hYB/f4FlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hYWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c42Ig4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo7OT84Njg3Mjc1NzU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2voq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH14dXd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZF0c3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorZ6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cqCUdHiAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjpqRdmx/e3xtcm5wf3pzdW1idoR/hoCFkJGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Yiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fR0xNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnaimXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5b4WPgnpugXdzhHpxc3l3a25pXXeHfYd8iIePgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MDA0NjQ1NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgXODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d2oZmIh4+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSgHt1i3Z8eG1vd359cXFwalpcW1pjY1dnZlxWUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iYqAdYV5X2NWTEM2MC4vMjMxMzM2Njg6PT8/QkVHSEpMTlFUVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlnBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYmRgJqWgqChmJWbmqWtk5m7sae7yMSnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GGgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3h9d3xxaWNcWVlcaV1hZ2BaT0xOWFNSSVFLRE5HQ0tEQ0FEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSBgoyMgoqOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01QSEpLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaWjrJOotqKnwcKuyK94upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlmxwdYmLgZWMjY92j4RxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWEtIT1NRTk5MRklRRERORkJDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn2Fk5J6gZKJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8P1I1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpaXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNze3x5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUZGTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJiNeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5O0ZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbWssbeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO2o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtPRElIVE9GSExGS0dGR0hBS0ZDRkZBOzg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj3yGjI+LinuJg4eRj4OFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQTg7PDVDOz1GS0lHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbTAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxs5iWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q4uaicuKqNpY+SlKCGeoGAcldfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUpIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY0OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpKRUdXVFBej6StpLK0w7a4wczKt7zEvbO0wbe4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7qiqbK5tbu+zL/Fxb29s8K4uri/uLu4uq2tsaaxqq6+sb28w8Otmbupla6PmJmriX6AeWhVYWBXaWNpZVZbZFpXVUpHR0xSSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU3Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5SUjpCXkoeHfIeBjpaKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0tNVFpUXpSvuLW7ucnAu73Kzby9wby4try7t761urLGYXWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y8uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9dXl5cVWBdaGZTWWJXU1dJRUZPS0A+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGOl5KWlo6GiH2Hg42Win+DgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7trq2uLm0uLW1rre3mWR1qZ6tcF6irZyYoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nM0szPzsrHwMDCyr3BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW11ZV1tfWGFiUVxhVFJMQ0JGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZWRm5KFiop/iYeMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOmp6Mj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVpaW1ZeVllkWlBdWE9SQ0JIRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6Li4uQiHyFgnB/h4KGe4dyg5KMj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSRhI+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN9fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsbmrprSjoq6ipK6jp7KgiaablZORipKPiIKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvR09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tgXVxWUldSW1BKSEpKS0A7OjtFQkQ9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW52f3Z4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2ZobG5pboGDiZKMnp+gnpGXmaCjpKaypKWyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNrYVpXUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NTQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4eGh3uFeXF7e4SGdnuGjo6eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnZ5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiHg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl5+Ypq61vKitvcfLyMnLy8/JxNLK1NfY19jX1NvX09rb1tDa2tLWydXMk3V3ZmVYV05RUlxHQ0ZJST9CPj04Oj5APD5JPUBCQUFFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNExHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZGLjZODjIWJiYGGj5GenJqIhYyBhpd7iImfl4+JjouLgnygiJCKvKCYk5eanKimpa2ep7W/v7+4x8nNzsXNydHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoN2dmRmYV1SVVVUTUtETkQ7PT09OTo8Pzk+QTc+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEs5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bn19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2Mm6ScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZOOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Rg4x/ppmIhY6DhoSApIWKi7eXnZGUlqGmoJ2dnaOutrm0q8DGytDIx8zP09LS2NLV18DX2Nnb2Nra2dnX27d1dXRnZmJUXVlST05IRExDPj0/OTk7Ojo6PD42QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTjxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoR+d4WboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOioqdl5ijo4aTnZWgi4qJjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNyMbPy8/MztfP0dSu1tXY2tja2tfW2dqdbHlxY2NaWlVRVVdDQElEPz8/OjQ5Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hYKEfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiI6Qq5eXpKOImZ6VmomPh5iXioWPjYF/h4+kiI2TqJqXk5aYoZifmZOcm6KytKWjvcG+x8bFyMjJwsrTzM3UqNLR1tbW2NrU09rOf297ZGBbW1tMSFRaQkJIRDxCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fIWHin6KorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqiZrK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWRmbKWl6Whh5yZko+LkYqXm4mLl46GfoyYnomQkJuampOYl5+UoJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ06bOzdTS0NbY09DYum92clleU11VTkdJTkVBQ0U1Pzs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxMPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eYaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5iTnZm0l5WrnYqclJGOkZKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKvCyMS1ur28xcfHwtGhxsrNzcXX1tHL1J9td2VZV1FcUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTTpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fH1/cHeHd46Ch3yNj4yGjJmpwcCvvca7s7TAvbWtq7O2i6iyrq6+q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKkuq+pwLytrrK5paSofoiHnK29sIKLjIuQg46DkY96gYiQjY2ciYiPl42MlZeUkZqXnaibsZqRrJyOmo+SjpSQkJaXj5GgkYmVm6OslJaPlJydkqCdm5ifoZSanqalpKKjsLKmwcbDr7C6t8XEw7/NpsfEx8S91tHNxcqFcG9eWVdcWUxKQktBRkg/QUBDOzo1PkE+PTU9Nz4zMzMyNDFBMTdAQk4+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6lwKSrsLu9qq6ro6Oep6uutbCqnKCrnKGclp+wtaeMo7u7tsG8rKmds6WkqJSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKPoJSHl5+hs56UmZOfoJeknpqfm6CUmJ6lo6ampK+tpcDEw66ot7bJw762z7LEv8S8s9HKyMK0cXVpWVVZZ1FMSENNS0xKQUI+REU8NUFFPDszPThCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WioyIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6ousC9u8S3rMGprLO8v6qwqqSlpKyus622taGgsJ+lopmjtL2qnKm9wqS2t6+slLKsrKyXh5qqpqWRgoyTpZaKgXWKknmFjpKQnqCTj5OLj42Uo5mXnJWUo56qnpGlmoyPj4+Vloh8j5WTkqOalaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMOvpbO3zMC5r8Szu77Cua3Cw8LAl2l2XlVUWVhKSkxJRkRESURDQkRMOjRESTo7ND04Ri4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZrqekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtre8rbO/ub2ur6igqai2rq2psrebn62ip6Geq7e4qqWvv8WyvbqzqKu2tK6ul5alrKefkY2SssWnlo58kpV8h5KZj6qZmJOTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39oa1dUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUsuMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+wmKSvpKekpbXAsaystL/DusC6tKi6trm0r5alra+upIuTlKGNdMKafZeahI6XmYyxlZualZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacmpSapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7uqsLLIwLmmrKutsrKjobKytKRta2NZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1KkI1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCao6S1ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istri/wsC+ubOzxbK5vq2kr7WsuaaIm5emm3a/n4SZno6TmpqMrpehnJuXlJqfoameqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm3oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Kfu6+ZlKCMk6ubkZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLKtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorb21uL7HvLe2ucKyv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZymopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLays56do6Wbl5SYqqGedVxaXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvJzsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6SfnsOtnJelmJqqnJaamo+qlpWnppWtrJmiq7bEw7y+tsHCwMfEv8zFu725srC5s7/Cx7W/sLy3ubampKurraChmaqqxKKkqaumnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6gkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqrqybmKCgko6QlaielGVfV19bTUhHSU5MSEZESUE+UUlBPEdJSVxST0s9SU9VNUJGOT5IRzVDYVtLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCSo5+WpKCmqayYtrGjqrO2xcS9v7XAwrvIwr7Jx7a4tbSxs7S3wcW2vrG4tbm0n6asqqydnp6lpMGln6mtoKSpra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGuoJminqmorKOawqypnqyum5uemaagvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma6VnY2Yk5yBjp+XlY2ho5aQpa2xq6mioqWllZWdmIuOkZKknoheYVhiX0tHSkpORkVBR0s/PUpCOTlKS05dUVFJPUxXXDlGST1ETUk4SGJcTENMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOok6uloKOfrKmsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC1r77EtLmysLq0rJmosamqmp2loafBrZussZuqo66wqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWkrKKfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqsj52TlZKZf5GglY6Nn6CUi6Wrr6WmopygnpGSmpOFipGNm51+X2RZZmRJSExJU0FDQElIOztGPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsnVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+coMOppKqzoqS1qpazrKehpLKsrqm7sq2xtbTGwMTCtMDEvsnEtb/HwbSrtaiwuay/w7O4r622uaWYqrKrq5ifppetu7SbqLCarKCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpedoo+ajJKWmIWVnpOLkJudk4qoqKqipqGYnpWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzo6ST83N1JPXV5SVlFBV2BcQkpTSFZLSDpVZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjMzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6Odoaa/p6ivsaKqtaueurGso6u0trGwubewt7i4xb3Dx729xMLGwLjAxcC5qbakrLutwMG3t6qtsrqilK2xrbKWpKeRqrmqn6awnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegt6mmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6Kcl5uShY6Zi32LlYSNmWhma2BsbVdQUVtVQUJFVEA7O0lBNzpYUGReUFdXRVlfXk5NUk5eS0o+WWNeTkhQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmRAMTY0N2dZYEYoPzhsfWdbVjuJe2NDPaefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7ur63t8DCv8nEucTDwL+3w7zAtq61p6u3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56rorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpbSuqKGtrq6xqLStsqqknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6qclZeElJaKnZibk4qNlpaalqalo6CdlpWXk3+PlIV7jZKCi5RkanFmb3FeRllnVkRDTVdEWjlIQjY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1BMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX19gVTE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbelrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLiytKypura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsbWvo5mdrKeal5+bmau3opeTkI6YnKGXlpOqnZqSf5GXjJ2bmJaQipSSnpmkoqKgmJaSk5V6i4+Fe4yKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYGBRTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqqympK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y1vb+/t768sbytp7q5t7XCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrG1q6SZoKuom5yenJSpuJyUjo6Kl5uil4+XpJ+blIKQlY+cm5eWlYiWj5eap5ykoJGWkZCVdoSPh3uEgYOLimxvdnR7flxMZm1cS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYF1fUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUtQS49RUxRPDNya0lDQ5GZpa+lra+rqKWxs7SruLK4oay1ucm5rcG7wrizsbXCws7Fv8G9s7y/vrq+vLLDqKm5sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2wta6jnqOoqpugm5uSo7OZj4mNhpChn5SMlJuekZGDjZKSnJqXlZSHl5KVmaecoJ6Mk5GOkHd9joV8e3yFiIhwcnF9fHxcU2RvXk5YZlxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZW1RLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEorOkc+M0JIUyw+kGs7R0iPnKqsoqqxpKmltLWytbaysqKsrr3Muq3AusextK20wcPRxca+wLK+wMK7vre7xKestqyyt7zAr6uxrJ+jp62pqaWwo6qyqrCrr66wrquzvKe2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7CsnZ+mp6mZpJmZj5+mmIeEjomLnaCOioyVmo2NhIWPlJ+clJeVhpaUk5eknJ2ci5KRjol+foeFfHZ+hYOEcnFwh3RsX1phbmJRcnBcSzyFfEY/WHVYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0RGODxCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Gss8PDzs/Dvr+zwMHDub+zx8Orr7etsri/vrGsraukp6qwqKipsaW0rqqxrq2xsbSstLykt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqZyhpKOkmKCblo+XnJOCg4+IhZugi4qOi5eNjomCi5ejm5CQm4yTkpGTo5qbmoqPi4t8hoGBg3pzf4J/fHJ1i6SHeGtfYG1lV2SGY04/Z5NMRWJ5V2JZUmVVTlZVVlRPXF1hVUtOaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWi4wSmdBQTw8Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRv8C6uL++wbnBucDErLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrGusq23qri4prS2q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm6tqqrqqqiqqCtm5KqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6mboqOjn5mZoJCNj5iNfoeMh4OdnYaDiYmNjI6LgoWVopqNjZqQkpGPk5+XmZaMi4N/dYeBf4B4dIJ+eHZ9gIedj29xZ2Zvd1xgcodqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVlNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGIwMj9mPU5YPkMsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u8CwrbmuobawycfI0cC+vLq7wb26wr++v62xsbG1vLvBsbGzqrOppLSppq6zs7mxo664srCzu6y7sKmttqyqnqqrn6Ogtq6poZ+ws6K2qp6op6qjqqGira2ova+srq2iqKigrJmQsKGYoqGnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY6LkIODk5+WiJGckJOQjZGclJePioaGeHSCf3x1eHl/eXJyeGZ/hqR2aV9kaYB0ZoiLfFJYcF9KeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wxp6q4vsC7r6e5qqavscnHyNHDvL++uL2+vMi6wLevr7Oxubu4wLOyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6Ogpa2sqJyeq7OltKiaqqepo6ido6moqb6rtLCunaqkoa+cm7OjlqScpaagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4eQjY+Df5Oak4WToYyUkYuRm5KVh4l/gHJ7en58aXh8eXNub3tmhHeFimRhZ19yhHpsZnhdXlQ/V3tsVGFQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHakkxNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaasuMG9ta+iua2oqLDCysnMwba9wLS3v7rItMK0srG0sby4ub21rbi1vqyhs6errLG2uLWsn7+9qrPCtL2hr7K1qqyfrbCjnKapqqSem6Wxp7Cgn6upp6GpnKWpoa28qK6xrqGro6Svn5+tppifm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouGj42LiYSSmJCGlKOJk5KHkZqRk4CJfXlsfnZ5eGN8enBub3F2Z39yaoRnZWddbHONbGBocGBvPVt4bFVdTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWhZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr7Cpq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbPAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq62taemp7CzoJ6lpqiipZmfraiqnqCqrqagppikqaCxuZ+jsa+hrKGtpZynp6mampufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWeiJGVgouXjpF9hXxzcH5ydHRgenhobW9vbWh9cWN7bWllYVxkhH5eWXNqcklIfmlYWU1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxmZDI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qqi5xLSyraC3ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7C9w7mpu7q3p6e1qaissq20saicv7imrr24s5+xt7CppaevsZuhpKGlpaCXm6+moZ6jqK+hn6GTpaWjt7ChprGrn6yjr5icqqWpn5eanqaUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBh4OHi42FjZOYjY+WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGpramdngmxlcmprZGdXYXJ/XllrdWlYRX1eW1hPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcSyr66itbCsra+1xMS9s766t7Czubi6uLqurb+ztLivv8G4q726tKWis6upq7StrrOknsS3p6q4t6yfsruqp6Wor6uZo6ecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaGZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gIOHiIiRhZSTkoyRlZSNjpR7g5eQi3d/fG11c21tdGJ5dGhmaWZjbYRmZ2hkZmdoXWRiaWVaZXpiYFByVFtbUktKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmB0QjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+sorWup6+vt8HAvbHBt7Gusra1ubi1rKq8s6+ysb3At668vLCln7aspqe1qquvoaHFrKqosrWtrLS5naiqq7GlmJ2qn6elkpmlraKYnaSqoZuhnJihnqe3pq+qraGhnp2ilaGmn6KgmZyanZSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIaFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNqYWZjYXN/YWRlZmRoaGFlblldWFxsY2FNZ1daYFZJSElLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSR0A3OkIwMzc9NzY5Mzo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhko2uoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm+vbutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2sr6yuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaa6qK6ioZqbnpmfpJqlnZefmJuWmqGUqpetqZyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJOFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2pua2VpZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpVRkdGRUAvPD03PzY8Rk5hODo/MjQ5QDM3ODI4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnI+PsZ2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4uri4rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6awsbe2rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqeoY9ro5aZnXGDmJ2lgHaSrKmflpeikoqYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eYuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINmXWRmbmtoXVtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEZHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrGbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSztLC5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/lainsLW5ra2jqKyrq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZmKOIoY+SmoehiJWfooClgKitn5SUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GV11oWmtqWohwa3lyh2iHhFleRk4+Rl5NRlJWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6snZqanZ+rqqiqvsOvsrm8t8G/qqS3saqsprS1rq+zt6uppbKtpbazm6y1trWlpqmzsa2yqK+eqqGyqaClpZyipZ6xuJWmp6e3vaaspqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWUmJSdiK6QmJWKqoyZpJ2GsYGlrp+Vm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuCbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY/YflJrYrayfX5wlXWaoaqQVk5XYU9WTkdWXFhQUFOLXFdbUEFcRFBOQ0ZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaiwtaqwtrSoqKa2pqi5rpyysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqaigrK2kop2amqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aXk5iSmYWva2qMjqp/aIWWh61mcZ+elZupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99Znujp4JZX4uraHyMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraemn6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6OquamdsrKwo6Sgqq2wrK+nqKCjo7GcpJ6Zl5men7CpmJyioLWzoaqboa2tn52al6GjqZ2ZnqWgnJmhp6SQnaKal6GgrJ+mpqCan6GWlZGXkZuGtZu1eYepmraZeIi0m7d/lJeYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXVCpbmNweoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdKOWBUNTAcl6CVibSmp6GtqaizrKq7t8KwvMOtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbKzqKOinairs6mwqKafoKCwl6Cbl5aXm6GxpZybpKi2r6Gojqmnqpudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKgl5ORlJOdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1QamhkUEBYZ1lkYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTw3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2qLKxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqrGptKmmnZ6frJiZmZiYl5mkrp+cl6itsamjno6roqeVnZiboaehmKKio6GboqKonJ6gnpWZm6ehnKeVm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm+fZpRSyYtawlyfeWJfrV92c4VhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGlQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQU5UX2VQNUc9YU02Mi6jnpGmsK2lqbutprWlp7a7vLO7v7i4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaampOVpauimJOmq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn52mlJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4KClWySW7BXS5p1mHlmYK1ednaGZ5eIal2vdpWej3drNXnIrrNfQ1RvXmdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA9Vl9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub+6uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqTl6WonJSQp62wpaCUmaifoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiclZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB+gpVuk12rXFuTf5F/aGeqY3J7gGqYhnFdq1qJoI9rbWRPSkOhXFpNdF1iZk1aYV9ydF9KVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MVRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW/uruzsri8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLqjo6yhl5ySo6CWlZ+blZqioZGOjKmwsKadlpqnpp+NkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4eSa5hdrWBOoXyHkVJzo2x5f35umIZvXK9WPJx3ZVRvbi5bp09iUmtlYmxaYlxgcHxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi9VXmFMNUZNXjgxQTilmpyeuqSbscCurqurqLequK+1wbW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn5+RlJWrtrCmmJObrKmWjJSmmqWto5KYq7OkoJ6orLCYoaKQmaGXoJuWm5ehk52pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo+von6NdYerfb5uc7x0soN1eIGKbZqIcG2NpHS9XXd9W2F5vGpaVltpeV5pYWNmYm14b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvVF5gSzU8TFwtNj85p5qforyjl7DDr62qqq2xqLmvt8Wxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaetuZ2jrpiVoZGmoJOOnaOemZ+akJaTr7mxq5WWo6emlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGanJeVpJmQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3toxegHl9iGeDeWx6YouscHSFfldbp2lEZFlUZl9jXWNRZ2ZxbXVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz43MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOrqqitq6q7r7HGr7W0sLmotbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spb6noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqacpqudlqmlppyboaqmpqKooZGsnpeinpeWmJ2ekLCplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phZIePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqV2x6gnJJSm+FcE5xTURWXGZgTFpXZmNfT1ttdWpxUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZVRUtPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6mknJysoKOam6OnrKKfqaGZrpuUpqCXlJ2fnZixpZmiqJmdkp+dpKabqKSbnpucm5GXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnh6dnaLf3yJanOBdIN1ZHd9dmtveGxfYltvZ01YWWZqX1dZb3lubWZTT0ZTOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDU0dLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsmrrbKntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXl6GYraqmwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZihm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSalaKkmKSgmaKPmJWLi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6cGd5kYGBiGt1gXmIcmhzf3l1g4aBanRieGVfaGRjZGZqWWt7cGpqXFNMUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr+hrKKRkZ6ampSSlqKdl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqZygpayUn5+dn6quqKSiqqGrmp6foZiln5yfnbCkmZ+plJmZnpKmnJqqn5yYZoWTfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbnqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4Fvd4J4f3NteYRzdoiHjYJ6aIRYXWpzZF1ziWlqfHJtY11RTlZKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9dWlVPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrOunpakkKOwpre5pa6jj4+aopqTkpugmZmmlnukq6KotMO3pKGmrp6dlJ6jn6SdpKqpkp+gnqCqr6mpoqmeppulnqegrJeinKWxpZidrJain5uTp5mhrJqgf72EiXO0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46AdnmBgHlxe4CGcHiEipJ4bHWRYmVed2NfZYFiXXRobWRiWEtVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkFAPz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvq6anprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrq24tKevopKRmZ2mk5GgopicoJ6Ipqukq62/v7CgqK6olpGfnaKZo6Sqo5OhoZ2drK6oqqWjoqSfo6ScramSpJuprqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdX9le4h2dmx+h219hI6QfWuAjF9wam9mYF94ZFtxaGpjZmBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylrKawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ6Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmom6WloqCqkqyzlqWiq6qepKino7KilJuonKGclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPCg9MSkzVkBGIRxHO0MxLiuv08bHsrOfnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrZiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaioqJuqpqOhqpqvsaKorK+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk5NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNTYqMVBLTCMgQTlENCwnwcnW1sChmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoq2aqqagoamisqyhqrOyoZyrqrGxuaaUmKWpmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hWGNtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMC8+LTRPVFEdHDs8RjItJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7ago5iUqKu2s6ycppyglpCmrZKanKejoKqmraCipqmws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmunKulpJ2ro7asobG5sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56ErH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhH5vW2xud3NqgW5aZF9obmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtUHBs2P0csLSGLh5mprKSruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ybo6eitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYraGroqSXrqW7rKK3tq6enra0urO2qZqgsqOmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI2BbGh3aHhzboB0XWRkbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlRRT1FbVSUhMkFIJColknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmJ+po7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mnq6Cjm6ymvKyVvbCtn6Oytbutt6merLWmq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGWfmlsfmJ9dG2AeWBnZXBvZ2doQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWlhTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVZRSEZJSiQpKbySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK6xraegqJutmJmPraKhnaWhmaWcrZefqKW2qL6upKmjn4t/jpuaoKaekpOZmpOamaWjopinq6qhop6oqLykl8Osq6OirbS7rbCpo7axrK6ad69/kIqchod8uq2JmGSwjGSWrn2hkISnl5yCrYyGsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXy7WXa1WrJ9U6+BeqxYgKFtlo2lmIiUjZKTeXeMm3xjc3xig3d0gHxhaWZvbmZlZk9UYltBU109SCg+OT00ISEtJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gYGBhYl9fXFtYVVBOSkdDNTUzLi9AVVlYV1hXWFhXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46vrKmno6iarpOaj6maoZ2ln5mkoqWYnqKosai7rqSonp2OfIublqGgmY+RmZuRmZeonp+Xp62lpKSipKi6n6DGp6apoay2t66wqaG/sLCwmIKqk6OujpuAhqSXmJCBgLjDuoSPnZSFqJmeg6yMhK+KqZ2apquSf9a9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4VvnX96srHHg2ursb2seXiivrt0gJSMo5mNmI2TmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUlDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdr6ems6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adp5uaoKiimJ2grKypuK2no5qXknuHmZGnm5OOj5eYj5iTqZielqionqimoKKqup6pxaOhsKSstLWssqyjv6uzsp11dqqktoVliqBwZ6yQio9ubnelkJuhgnaynJhxkY5yl6qkm5mwpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2Npb1pdZ354pmBicpCScGZkgIyRjp+VlZeNkpp6hY2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fpLSqmZK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVl62fpquin6SkoJKLpZKmmamalqOpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZanopmvpZ2hq7mfsMGopbSnrbGzrLCuqrynsruYjKOppbWciZejmIepm5CUnZKqtJqcpK6itZmlo6CjpJ6jpaKXrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdIN3dIeMcadtfZaTlJSBgY+Pjo6bkZ6TlJOdgIWTi3Boj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYV5NVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVVZZXmBhYl1eVVFLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWltbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKG3sZGOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqpmZSmoKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp6Yp56atKOcpqu3qK/Cr6S4p7Cwsq+rrLa9o7LAmpOnpaa0opKdp5+OqaCNkp+irbGboqWzq7OapqOfp6ygn56dmK2ek5qinJSQl6uZjZmal5CXn5GHoJ6VlIaUjZCOlo2Cf2aOiHWId3qJhHScaoiSlpWSiX2MlpGSlpCekJmSnYGGl4V4cZRyeYl/cXt+am5kXnBpYFxfWGxiT19iTlg5RkZEPTI8PTcuKiUrKSYdJjQwNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVZQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCotqqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6Giomco5Cvn6SWqaChk5eZnK6Lq5aPqJmnjJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaednbeif4OutaKwsHWkv6SzoHl7oq21v5d3r6ahioCqfmRcYnegj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlwgZmqmW2ApKmKZZylnJGYmZeMk5yRhJ2bkJWElIiPj5OLhnlskYh2h3F8hoGBYWmJjJWTjFt2lZBmaI6McXmhlZVkeJeFgHaXaIKJgm55f2twZWB2b2traFtkY2FgbFBZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0dJS0xUVVVZXV9nZ2dYUUo8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWdIucr6Coq6eUl7mgoI+cpJ6RfoiJm56OrJqklaiino6Xkp6Fda6PiKaaqJGWo4ibubOnn5iYi4l1d5KNl5OJk5CQk4yPkp+NmZ6lmJuxlYCMm7WdtIySj72non6no3ulsbqDjo+poISMhY+xqq+MipajmnmBi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgpGXloSammJ5iJKFjpCTi4RucpGIeoJxgYGGgId0iIaXk3iWaJN0oJp0e5mCm5mEmH6RiIGCmGmMjIRqeHtxcGdleG1pbGpbY2loZHBaW0hTS1BARTUtWVNUNikhMDk9PjY0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpae0nZCDnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2Gnrmxp52ako6FcHWPiZWQipSPjpuLjpGdkJWeo5Sdq4eftIm0mq6Lyoirr4q3hY2whLOxhqmPqpqNnXyoj3J7d5yOppZolaR5tIyhoKiqlJrCg4GriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfIWUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePomqdgZ2XgJmAioyDiJhvjZKEZ3d0e3ZnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBJZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOptqKwf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x2m5uOoJGHnaOblpiXhqK4rKWZm4yMfmJtj4uTkIyQjIyXi4+Rno2SnqCYoad+oaeHrZ2glq6QoJ6dkYeCoY2tsomkj6ycjJp+onaAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX15l2xdfZhvYVRyhl1gbXqEYFllgn6FgZlyqKprg6NucqVvn4GbZ2SebFpsiXtlWV+CfmFXUG92ZW90cWpqb11pb2xqZ1dmTVxXRThBNEdDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU5NVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8q6+imZaeoKWrq5+crbSiqJKgoKGnnJmOmLSZkIuejJWLdYGUko2KppaWmJ6ffpOFhayjh5yRipiol5makYelr6ailZmHiYBpboiIi46OiYuMkYuPkaGKkp2fmqGkf5OBj6OhlKB3nJaQp4OjqYCHrK+HpXqNf4SafaJwc5OHlXuejHlth5yLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgca4fHGVtoxygZukZHSsq2F+ap2zfm5+iYSPg4yYcYCjbHKjcp6CfaNenJmzlXB8l56zdHJbnrKCaWJxdHVxaG9YamtxcGRbZ1xhS0M9RDVRQVlxMjxTR19KUj08Mzk1Ojo2Qzw7QElQP1ROTlFARF9eW1pXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4tq2uoJqhm6KjpKyamrGsq5OXoZmhpZqalJ6sm4uJkXiLhXGAlo2JkKGQk5Sdl32Rio6ooIaYjomRopObmoyLqKekno+Wh4R+a3uGf32PjYOLkJCJjpOfgZWbn5ygn4uJd5yYoo2gcqGMiamJnaiSmaquga6NfnqgmXmjk3iAc5eHjJx9lZ+Hm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXaEnWiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX6ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE42VkJSbTRKWlpeTlpEQDE1MTs7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11YZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7KwrJ2lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIBye5eIi5aWhJKVmI96i4SWpJyJlY+Gip2SnJuIj6ihn5qLkIqAgGmBhnl/lox7iI2Oh46VmX2SoZ6foZOYcmifiqCPjHCSjYKpiZqhpauiqn+xrqSiuJd3o7Oio3+IlHideqqZf6KPn52ZiZhyoX6IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4t4nmJNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs39+mpKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUWdEUlZcYVheSUQ9Qjg/QTpIRThMRVhBV1JaVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbGumoRTX6GntLqzs6iaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniVhZCbi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6om5mVioqKfINshIVxgqGMeIWMiIeRmJR6kaOfnqOIroZ9tYSPnp17ppZ6qYKXn5GMo59/p2l4bn6ZdKBzcXydhZhvk4KtfKSEp5+bg6RwXqlodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iKdKqyqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGimbJvTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZeYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSktBSkQ4UEBRTlhTWE9TUWBlZWpTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2liYWhlfGReZGdka2RqbGZobWiYm3+wrFRdS36qr7G0sLOinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoiFe3B9g2h9j4KTmoF3kY6PinCAho+TkmyYk3yIkZKjlYOOqZmTkoqFiXmDdoiAboGfhneAkYWHmKGWeJKho5mfibOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtromXi3+MpI2Vg6+jlXe1trbJonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3KbiXSle3p1YoSDbn6hbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15qdmt4h2ZrZmJzdG9sVVtSWWhPUWhJVUxYUlVcZ2tuVWdXTUpBSk1LSEpOQVFKUGVjam1ldXNzfnh7bnSJentVUU5tXmhca2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbm1laW1lop2JsKiFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l595dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWi5GLgIh6gH2LeXCPoIV5gZSGiJWelH6TpKablZaDZ254nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aAiZSVj7lukIqiYn2Zo5eJbnNrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GLl22hb1KIj26gXmSnVItdVJhtbXJrcYFtcGhrd3NqblFWVVVlWFNsSVhOW0hXaGhzallrVlBSRVZcTVhSYVVoal53dXt8cH18coJ7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52lmaZ6ZXRtjKeupamwsaWfi3+WqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIuKfJeac3WJfZB8ZYOHlYqJlZqCfIiGlqaPgKGqj4WQioGJfYCAjnNpj6aDfYWSjIeXn42GkamlnYmmeJabfqWJloyymZ6RhK+Xn6V6mIl7qXWokISabqWijJKEjIO8bXylr4KHhYeVmJ6ifqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gaJmHdaxmnq2MtnN2voykk1mDpo2rYXVydG97dXBian1uZ2xSVFhUYGBca0xcUVtJXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3ODfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqudgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+NhX6Xk3R1hnKRg25/i5KHhpSPfHuBhZekjX+lpI2AjomElHWCh5NubIuogIKLk42Im56Ii5KqoqCQgHSUl4h+gXmUr6R/gp1xj4Z5k46HgXtzqY1xfX16mJabhI14e319h5OVk4t3kpqhooR7f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnFvd3hvXWuFbmlnVlleVlxlamNVYFRdUV5vd3lranZkaWpqdXxwcXRzYW90YnR7gXh1eYJ1f4B/gXmLhYJ+e26AbWR5bl5XbmdodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9hjpW6qaeLoaObpqSZpJ2roZ+Dg5aqkZ2fiJmmmqiZg4Gci36WlIeOiomMcoJ8jnx+j4R7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhY+PhJWCho6Yd3GEqoWNkZyPh56dh4uap5+gq4OJjZWbf36Kl62okJOokXlxn5SFfZVwgKuHcX6VcWpvfIGfi3+RjYpnbV2EjY6dnqCQc5eNinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBboKKd21jZWN5g3qVWlxpZ252W3t5d3Rtc3KDZlxtimtrYllYXFlYa3FbXmBZXV1lcn16dG90Ympqant8cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZwdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7KikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIaGinJ9gIp2hIuChJaKcm+Ac5iGhH6Tg4OGioJ6gIOKmp+PgaWghniOl4iVioucl4SDeayBkJeYk4mdnIaHoaqeoqKki4eTm52jmparoqioopOdiZmRfnqRkIaqgH+TkZKTnLGlmpSejoywkZiEpo6Olp2hipGdhIqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYmIi5GnkYSHjoeCi4+KeoOIhox/dGqBg3x5mWlyaGB0inF+e3d2b3Z0gV1eb4dnbl9eWVpcU2dxVWNbW2BsZ3R7e3Jub2Nqamh/e214fnBob29rZoB7coKAd399f4V7bYOMhXx6eXx9eoR4TmR2anNucXtlbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYeDhIZteIB/coCHfoiThG1sfnqXh4SDkH6AhoSHfIeDjJqdkoapnYJyio+FkpGLnZF8jXupg42Rl5WOm5aFhZumn6KanoaDkpqZmZCZpqGmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZySnI6NqY2RgJ6OipWcoISPmICIkIRweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyNh5yGho91gox+fnNzfIqFfHqOj4WUqJCHhI+BgomHh3OChYaIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcYHB9bnRgY1pbXVFmbFNkWl1gamh1eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2Fd3GCjYd+e3t9gHuCi2Bpe2t1aGqDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqOhXyKkYOMgoKCbHt/eHKAhX2KkH1raH2Cl4mBiI58foWEh3yPgY+bm5CIppt/b4qKi5KGoKGKhYx8qJCHjpGWkpaSd4yjoKGdlpuAgZCamJONmqOipJuYkpx/kIh7goaQiaGBfo2Nj3yXpKCgkZmQj6WMj4GckoqUmZ1/k5N/iJCDdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqTkYGZgImMc4OJfX5yenyNhnx7k46El6aUjIaQe4SFhYJzf4CEhXhkcHp/eHlwbGpmXn5zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWhUZFheYGdpdXmBcWZqY2xnZX+Aam19Z21wan13hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoNudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWjn42Xf4yhioiblnh8hod+hIp+iIKAf3B+e3R1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aVhJKKlZeSkXaRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImI+ff4KLjoxzl6KeoJGXjo6hjIyDmJiElJeaf5mOfYqOgnhyfm57ZIF9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5+lXmNi32CiX59coB5i4d7hpKLjJmkl4KEjHaHg4B/dHh/hoJzXnZ3fXN9dmZsZWF/aWp3c3R1fXF8Y2Rhc251cm1hWV9dWmtjUmJXX19nanR5hXBiamJrZmh8gmtodGhsbmh/fIJ5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamFjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x3qJuKmHmWnIuMmZB5fIGMfX2De4CDgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkYOQj5OXkYqBj5egmpKQknSAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqRm3uIiZCJb5edmqKRlIqLnYuGgZOdgJSUloiain2LioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiFgI91koqFeol/d3iBfoeCfoWPh42VpZF5hYJ0iIZ7fnFyfoSBa2B5dHlwfG5hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohrX2lkaWNod4dtZmxoaWxngHx6d26QiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3h4bmyIa2hfaXFih2hxb2V2Z21sYXpoanx7eHBhd22LgZmaq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8npORl5SJd357in18gHZ4f4BwdHN6b4V9gYCJfnxhXH6PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyFkJeSlY2IiIySnZOPjI1uhJCPkYmemaKhmJiKl5NwjJyGaImbkJV7iYWQinCWmpShkJCIipiMgn+Sn32TkZSNmpB8i4aJdXN1a3FudX2LdW+GkY6ScnSAfIKCin5lcm56f5uVfoWKdZKMgnWKe3CCf4KIfoaOi4aOlquOe4h9foqEdnxubH6CgGFmd3N0bnpiXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcX+HZV1paGZiZ3GNbmNoaGVpaIF6d3VvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t7e3N5hGtrX29odH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmaOooaebiIuKgY6chpKadH+olJKNhqCMlpSRgXR8doV4eH9yc3qGbHJveG2JdoCAh25xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ6Kj4aSl5aFiJOYjpaLio2OjJ2KjpGEbYmLj5GKnJahnJmWhpmJbIimhWiJn4yTgI2FjIF4k5iSnZCPiIiTjX9+kJl9ko6RjpuTfYuBhXB2cGxub3F8h2pzg4+Zi3J4gHWCiYR6Z3Rwd4KbkH2KhXuVk3t4inVyi3yHjnyMiIWKj5yliXyEdoGJfnd3bGh9f35bcXJxb293Wl5wYHBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFNZZWVhdG+EgmFda2xkYmZrkm5gZmZfZ2qBdXJyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4eLf3x3i39qcWN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShouajJaOjHpyeHSCcHKEdHF1iGxvbHRsh3aDfX9tblVRgauUh4J4gHZygnmBoIKQgZKSmJqRmHeQeoKMkqOak46IlJiShIWWmIuTi4mOj4idhJGLfXKLhYiPiJyan5uXloGVgGqJn4ppiaKJlIWShIpxg5GXj5qMjouLjo13e5ORe5CMjpOYjXyJfoJsd2pvbGxte4Bien6Ql4J3eoJ4g419emh1bXaIl4yAiYd8lZJyfIZyeI57jI58in+FjpGfoIZ9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BOW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfm9scXOKfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Jrg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+ipiSjoSImI6Pj4R3dHdzgHBwhXRwcYNvaml1bYJufXxtdXNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFkJ+hk5OQiZKbk4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR6jnhpi5SKboqlhpSJmISGY4yRmI2UiZaLjImLcHqVinyPiYuTkop6h31/bXxlc29rbXt6XIF6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cmtkbnyAaWdzbmdpc2xTXW5kcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19edE9NS19mYlt3cIl0XFtkdWBiZWWOY2BmYlhpc3Nta3F2i3x0eYeCdnd+i3OAh396iX9yiYeBkIqIfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSekI6FjJeEk4+IgXV3cHlxb4NwbW5+cmNkd3B8bnp8amhsYqSawdyu76JzbHaDdYShhJFulY+Vn5OagJFwhYujl4mOlYqQnZaDgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQdot4cImLjn+NpoaTi56Ghl6LlJeJjoiNioqEiWx8l4N+iYaKkZCGdod+fmx9ZHh1am96dFiJe5KIhnp/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJvZHJ2f19ybG9haHRmUmBwZ2tVX25zeWFyY2BpfnFzbltjc2JjVm5aXHdMTEtjZmBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3eEgXl4fIlxg4V9fYh7dIuJh5WGjX9+mHNndXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn4yOfJaNf5qIhXxzd3Bzam+BbGptfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaKmoiMaZePj5uUkoGIcIWIoI2Fi5WKjJeTe42Sh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjHaIgHKHhIyJnKSFlo6ghIphg5WPhYiFiIyGgIdofZSAfoOFio6PgnKHf4Byd2h2cml1eG1ajX2Tg4Z9gIOBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIlucXmLhHRqb2lvdX5dcmhtXGl0X1FkcWhmU19xdnRgcGBdaIRxc2pXZ2lkaVhtV1t0TEpLZWZeYXFzhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgn97dnqIc4WEfH+HdnaKho+YgY2Ce5N2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp8iZmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194e3pxcX9pYWdhf9W2jpGmeG5xd3twkpCMhmqYjYiakIuFemiHi5mGgZKQhoaXjXyMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hIh4hoONlaChiJeRoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag4yPkH5tg32DdWxtd3V0eHZrY46Cj4GFf3yEgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaHd5X2dpaVhrdFlSaHJpYlBicnhtYmVeWmqEbnRjXGhgZW1fb1Rabk1HTmZkW2ZtcYBrWlticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYGSlXyJhnaJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYeQg4qNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXF+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot8ioV8e4mLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEcoGKd4Z+jJufmoiVj56BiWZ+k4J/hYKIiHGBfWZ+jHx5f4CIjI99aYF+hHZncHl4dHh0bGqPhouCi4B5goGFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV6c2FbcGJXbnFTU21yaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBPWWpRRFNmYFlqbW18bllbXWxiWmJvdmRnXF1ga2lja2pzdoGDcW5/fIB0dYN6g4N9gYV2foiBlpB4hIp0gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVqaneEc2yTjYafmZ+ZhYdufYt1aXeWjX6BioKUl4p6kJZve3Rxa2pkYHN7aGBlcXpaYHJ8eWdxeWBlZY+xsndLYlql2dCWcXqQio93fZOKhJiQi4Vua4WRkXp5koaBhJiKfIZ/d3eJioSWgG+LiHF1fntqeYWDpJCDk42EgHCAhHiGe4iem5aNlZGWhYhwe5OCfYKCiIJtgXZogIV4coCBg4qIfGV+f4V2ZHFzgGl5cXB1mY6Gg4p9d3mBhXqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Vnem5dWHZaV3BrTldxcmZgS2x3dGFeXFtadX5zcFhnXmdqcmBvTldnUj9YZl5ab2pneXFbWlhqZVljcHhfZ1xeZWxnZmtpcXd/h29sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb26BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmIqBfI6NaHhza2tmX2FveG1fYm94XGRrgnlhcXVfZWXU6r2LMjo+i45/cXmFh42NdYKWjH6SjYt+bWuEjIx1fY9/hYGUiHyCd252h4SDl3duiIVsdXt1ZnmCg6aLgo6LhH5ugXZ4hXyJn5KPkpOUjoyHf3uShnd+g4yCa39xaIB+eW58fIKLhHdieoWCcmRyaX5udXJ1gpyMgYCGgHR2f4F0gnBcboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bWp2gH90c1tnZ3VuV1Z8U1lvZExacnJlW0lxeG9cW1tZXXV/dWlaYltoZm9kak1XZVA9XWVcXXVlYHRvWllVbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9gX+CenWCgY2ThHCBi254foB7e4iTiX9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZ3JuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9shIKGdHmJeIl8kod5fnJndol+fphvcYd/aXZ5bmZ5h4Skh4CHjIp/b4B3goOAj5yJhJaTmYqMhYl8kIhwen2Ee2h+bGqAe3pqe3eCiIFyYHeBfnJkcmd2g251fIaWkoJ9g4FweHp8dYBtWXCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bbltPW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXmJoa2dtbGlwd3ySa2iEin18b35+e4GAgXp3gH+Ki4NxfIdvcniDf3uJjI+DaX17bXd4dot2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZ19wb19gZ3Bmam6JdGF0b1thZGp1eoC/nKakyLhxhIJyknt3hZKCc5CLh3Jyb4N7g3N0h3SId5OIeXlwY3eHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOAdYd7gpWShXuYj5aQiIKJe4mJa3h5fnRnemhrf3l0aXp3gIN9aGB4iH1ra3RofIFpdoKMkpV/fH+AcXx3fHSAY1Z4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353kIaEd2pxaGyHgXFvXGZgcWxJZHVLXWxUU1lybmJRT3R4YVJYWF1hcIJ0XWJcaWVlZGtkUFtwSUNjYFtjb11deGdUV1Z2XltmbmhWa15hamdlbm5pcHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDcHeEcm53goJ+iIuTf3CAe3h5eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGVZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3R9d39wcX9thHSThXh0a2B6gnmJj2ZyhHBodW5bbX2AkJN/gHiRk355fG6KeIOTjYZ3mIyTkIiGhXx/hWx0dn5sZ3ZkbXt2bWp3d39/fGFieIZ6aXV1Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1pgV1ZVd21iUFJ0dlhQVlheYHKEcF5hY21lZF5vY1RccUZCZV5dZWddW3piUVZcdFtbZ2tgVmpfYG9mZmtwaHB2eI50a46NdX92eH13gYSBe3R9g4iHg29ygHRxdX6FgYmNinp2f3iDe3yGh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIaDdIWGhHiKe2JubFtiW1thVmlzYmBbZ25wZodyYXFlV1xia398ys6HuaFqbW2KbHGDcXuDiX56kIR5eHN4dXR7amx2Y4R1kYJ2b2ZffYJ6jIplcoJranFjWGx6hZuIgoFylpV3f31vinOFjY6KdJmQkomGi4N7eX1wcG98ZmdxYW14cWpscXh9fXpdZXqAeGp2eGaDd2h0iIyOln5ziWtvfoJ5b31eWXN/bnSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3NhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hmldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZXBZW2poXVdnYF9yZmtncWdwc3eGeG6Vi3R/enh+eYOIf3Vyf4eFjoNwcHx4d3Z6hYWHjIZ5e390i319hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1tcXVRnc2RgWGNxcmeAcmJrZFZaX2p/eL6ue5+3bmFzhWhzenF4gYV6fYt+d3dydm97dmVqb2GHdY6Ac2piXn55eYuEZnF/aGtrWlZvd4mjgYV/cJmTcoF6doRvg4SUinWXio6JhYmFfXh0cW5oeF9qbGBtdmpnamx5d3p2Wmd9fHlmc35thXVldYaOhpeAcY1oa3uEdW52Y11xfWx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh7aGFOVXVrTFBUVV9ndoRnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1qWV1rZFxZZGJedGZsZHFncnB1gXdxmYZ2f353f3yFh311c4KIgJWDbnN5e3p0c4SGiYmDeIF9dY9+fIWKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkoByjoFxhoJ/g4BwZmxnWF1bXFtTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeX1pc3VzcoGDd4CDeHZydW1qenFhZ2tnhnONg21mXV99cHuJf2lteGdqZFVXcm+MpnyEe3aWkXR9dH58b359k4h4m32Jh4OHg311cHFsZ3RcbGdebHRkZ2Zpem97cllngXd1aHCBeIJ3YneGi3yVgm+Na257g3JndGZhbnpoc3iLe35jd4R3a2xydXxye3t1f2h/gIB5d29kZmJthXtsalVoYW9SSmhqT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFpfa2BbWmNkX3ZnbWJwaXRvcn91dJmCd3+AeIB/hoR6fHWChH6XhW5ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Ad3ujpYp5h4WDa3R7enWCgIt6boRzeYR9goN2b2ppZVZdW1paU2JuZFtYYXN7amhtaWBiWF5aaX9pa3CAZ2xgaHl4anJzc22DgHp/fHV0bXpnaXlqX2VuaIF2j4RnZVhid2p+h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJOCepd2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanloe2xbboNydGpwgX56eGF3hoV5kIV0iXJweoFzY3JqXXF4ZXJ0iHx5Y3SBcWdqeXVzbXl4dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4fGZfbnFqZV1WYVVublZKU2dXZV1YTVVrVElbeV9bX2pdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenh5g36Bk4NxdHR+enZ0hIiRfYF8kWtylYB7g5+Ffod9gH6GgoCKe3eEq55/eoeHgmpygHl1gH6BdG6Gbn2Ac4qAanBuZGRZX1pZWlRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGt2dWdzdnFshHt9fHh1cmx5Zml3Zl1kc2h6d5KBY2NUZXBogoV4eGdpamFXVllnY46nb353gIuOe3Fyf2l7cX2PfniQc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXpoXXSAb3Jrcnx+dXZidYaMe4mIgYF5c3WAdmJxbltydGNxc4V8dWVzgG1hbXtwa2p8enZ0Z4d3e3p2cWViZG1yfWlqU2ddXFRLcWJQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RbV11Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sWl5cYmNefmlqYG90eG1wb3aDmHpygIB8f4mMhn11dYV5h4x8c3V1gXl6eoGMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXmVWWVlXY2ZrX11cc4VoWHFuW15YWltremJwd3ZsYVlsc3NndHVvbIN4fn94dm1uc2RodGVbZ3VmdnaRel9dUmZna4OCdH5iZGpcVFddYmOOpGl4c4OGkXlucXxqem9/iX52inSCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2J6ZVx3fGtub3B4eXR1ZXOEk4CIg4l7d3BzfnRjeGVccXFicXKCfHRnc4FlX253amVoen11b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVRtU0pOWldqbHJ8Y21tc2NiWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbX2FiXYRpaGFueHltcGt2gZB5bYJ+gIGTiISBdnSIdIyGdHF2doF4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cZmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNybltZWFdfa3ZkaXVqaV1ZbXNwa3Nzc2mEfH5+enZubWtkaXBjW2pyZHR2jnNbVlNlYXKAf3KCXWJjXVNaYFxjkZ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlhd2FbfHZpanJveHRzdWlxgpaEh3+Fd3RrcX5vZ3hYXWxuY3JzgHp0Z3B+XGBwcmJga3N/bW52f3NxeGtwYVxlbGx6YGZSZVRXUU91WlFPWFFIY3NhYEdWalFJUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp8dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnVvYWdla1JdW1VnYWxrWlxxjGRPb25cVldUZmlzaGJ0ZWRcWG50bG91dHhqhnx/e4d2j3NjZGtuYFxubWNzeIdrWlRWY2R4fX1xhl1kX2NUWl9ZYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzZ3B/cnRwVFxna2ZydIB2dGNtd1ZjcmxbX3BnfmZueH5zdHNqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2FGWGlPSVhUV25pZX1qbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3ZaX2VraVlhYF1ejm5iZmt5dm5vaXZ2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jjn+Mk3J8ipGEh5+Ge3+GjXSBhnN+g3ZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R8bWNmZ2hTX15VZ19rb1tebo1oTmltYFVWU25mc2tleGVkXFhvc2xxendybId7f3abenlrYWVsbV5gb2plcXh+Z1pWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXh0bnxrdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKe4lucmZyfm50bmRbYWlpcHSBdHNfaW1TZXFlVmNvZHxkc3h9d2xwbWtgWWFmZ3RcZFVgVVJOV2RRT1tOT0hkb1xiR1lpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2dHuEcoKDeoiOfnyJiI15bpCJdGtzgXR/f4iFh5GElo95fYyPh5GbhIB8jYVzgIFzdHlzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkpKSkpKSkpKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Ojo+Pj4+Ojo2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKTk5OTk5OTk5KSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY6Ojo6Oj4+Pjo6OjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMkD4uMTExMS9vh4SEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dnbW5ubm5vckosMDAvLyxJhYODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyPLRodHR0cGmiFgoKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX19lZ2dnZ2hrPRodHRwcGDuDgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5GJiIiIiIiHjZCQkJCQkIyHh4eHh4eJkpOSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiYqKioqKioqGg4ODgoKChIqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZOTk5OTjpKSkYmHjoqQkpOPiI2Ojo6FipGRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjY2NjY2NjY2Ojo2NjY2Mi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqGjomJjoiJkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSLjYmQiYuPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYiMiI+HjY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuGiYyIjYaPj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNjYuNi46Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhYSEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf3+Af4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/gH9+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoaGhYaFhISEhYWGhoWFhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+AgICBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/f35/gICAgH9/gIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9/fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2NjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5PT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn9/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gIB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJRUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU1NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAf4FsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTkxPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9QTlBPUGBwcHJ4eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4B/gICBc1BQTk5QTUpLUFJQTlFDREJBRlFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FCQUBCQT87Pjw+Pz88ODk5Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ3eHl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GBgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQkI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXVzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg5Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTkpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+AgX+BgYGAVkxOUFBOUlFQUFFRTjg9Pz08Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgIB/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUI/PT9DQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQUA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8/QUFBQkFAPTw9Oz4+Ojo6PDo4OTg4Ojs9QD88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZGSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQDtCQ0JDQD8/P0A9P0A+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH5+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUJEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAPz1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJFQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0VFRkZGSk5NS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHt8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz5BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5vcHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NHSkpLTExMS0xMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+BgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHiId8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlJSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVmyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4iIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLjIuKiYqLjIlUOjg2NTY3NjY2NDY3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhFQkA1Nzg4PTo9REJERkZEVniEhIKCg4KGiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQUA8OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiJioqMiomJjHo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs8PTo+PDo8Ozw8PTw6Ojw4Ojo7Ojk5OTw/PD1BQkRJSUxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ozs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVCQUdKTk9MSUdLOjg6Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYSGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQUBDRUNDQEJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4/Pz8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUZEREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4iIiYmIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLR0VHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIR0dHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f35+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpKRUpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUdDQkFDVW9xdXd4ent4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/gH9/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT5AQkNDTG2Eg4SEhYWGh4iIiIiIh4aIiIiIiYmMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEtHTEpGS09MS0pKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAf39/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkJEQ0ZKdIaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZFR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUt4hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs7UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5QUHmGhYeGhYaHiIiIiIiIiIiIiIiIiIiUnIyKiox9YYqLi4dsW2RVOlhYWFNRP0BWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh4enl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSV1ZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fX19f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWlhXV1d6a1haXFxeU1BQT0lOT1dWWFpaZHF0d3Z0dHZ4eXl7e3x9fX1+f319fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lRTU5RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXx9fX1+fX19fn1+f39/f4CAf319fn5+f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhHT0ZERUZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt7e3t9fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFJSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz48PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8e317fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87Qkc+XHR1dnZ1dnd5fHx8fXx8fX1+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Nzk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fn5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEZDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fXx9fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkZQUFVZU1RPSk5PVVNUXFZSVVNSTk1MSUhIRj8+PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05OTVBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RRT1BQUU5RT1BPTEpMTFBQTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDQEJFREFAR0hHSEZGSEpNTERHQ09SQzhETVNdZ1NRU0FHVVBPUVFQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPz09QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NOT09MTE9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CQz49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x4eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJAQEdKRU1PYmVQTU9NV0tMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl7e3p8endzeHV4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEA9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BRUEtHQ0tIQ0NLS0xOT05JSklHQ0NDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxMTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWZtbGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/REI/QUNGR0tHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUpIS0lHSFBLREpOTFFOT05PUE9KSklNUlVVUlBYZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFREZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISUhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZWVFlgX11pYG5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFRkFCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlWWF5aXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QUI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNS0xLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlFPTVFXWlZaWVdaXlpYYWBhYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TkhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhKSENJSEdJR0ZESEtJR0tITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWlxfX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFHQ0VEQ0hERURGRkdIRkhHSUtKRUpISEpIRkZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBgYWBiZl1kYGZnYGVpamRzc2ZqaGZscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIRUZFSUhGSUhKTEhISkpJS0pGSktISUtKR0tLTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFiYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlGQ0dKR0dKRklMSElKTUpNTEdLSUhMS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUxMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhKSUdISkZES0pHSEpISUtHSkpOS05MSUxISk1KWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSktKRkI/QEI/PERERkRDQ0NFRURGQkVGR0RESkVFSkxLSUtMR0dOSUhKS0dLSklKSk5MTU1MTElNTUxbc2JkcF1sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5wc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURDSEhHRERLSEdLTU1KTExGSk9ISktKSUtKSklKTU1OTU1NS05NTltycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBcYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3VocF1fc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEtISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGtPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqWl50Y3d4cmpuemhhYWNmYWJqbXR1cHN1dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW10b25zc3Z0SUtISkNEREVAQD5DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHTEtLTklJSkxJS0pJSUtMTU1MSUtLSlNrYllpXl9qY3JyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcF1aXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bnZxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISUxNSUhKSktLSUhJR0tLS0tHSEpJS0tMSklLTE5UW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlaXVhdXFxjZmFhZmJjZl9eZmttaG10eXJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVISkpISUtITEpJR0hISkhISEVGS0hISk5LSE9cV15PXFxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0hFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKU19ZYFhgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZDREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZER0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhKR0BHRk5LS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQ0BJRkNFS0lGR0dJR0dKR0ZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRT9FQkhIQUBGRUNTXVleWF9YX1tdVVhYT11cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNXYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgX2JjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkhESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5NTklMQkVBQ0NGQ0JAQ0Q/TEdDTExQT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVpYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9NVm5ZS0NQX1RrVmdKXVhVXkRMUVVMTVNWUVJUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHN6fH1+gYSEhIODg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdITVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlBxcXRPQmtzbXFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoOEgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPR01QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUVJUWVdXUFRQUFBTTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp+bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2NlZ2pqZWdiY2RsbXBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBaYFpYS1NXUGFeUlZRWVNNUEpTVFZYV1dPVVBPTlJLTHJvdXVxdXFjaGBVbktxcF5HaHlXdlRLaHh9d2B5e3NuYV1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zjb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFLTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUklSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLV2tnfGxtbHhfWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JsZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhbW1VRUldbV1hXW09SVFdXWFFdWFZcVVRPWFJXV1hZWmBcaHNfXFtbXV1fY1pfZGRlZ2RkZGNaZGJnZmZtbm11ZmZnY2BmXl1nYGRsaGZna2hwemhnZ2t1amhnaWxQSUtLTE1LSlRSTlJRUExWVlRQVFVYVVpVUlpdVVVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVJQUFBUVVJYV1xXU1NQUVVVVlNaUU5SUldUUlhVU1hUU1FVU1VVWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNnaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE5RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVXVVlaW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVdZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1laWlhYVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTk5RVFZVUlJSVFhWWl1cWlZWUVJXWFVbW1ZQU1VVVVVYU1dYVFJRWFZWW19bXmBfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFthW15dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SU09NUFNSVVtVVFBQTFBXVVBWUVJSWE1PUFJVWFVUVFNUWVhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXl9bXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXV9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOU1hVU1FSUFJaT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjX1xiYWJfZGdpZWdeXGRgYWBhY2RfYl9ZWl9bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUldSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTVRQUlpSVFVUWF1XWFhTWFxYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlNUVF5eYF9eYlxgVV1eYmt5dW19bFpVWlZRUVRcVFRUVlRWWVdMUlpWXFtcUlBVU1dVVVJPVlBTWFNXVVZbXlhbWVVaXlhfXllcWVJXUllYWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5fZGNgXGdlaGZlYmBlYV9hYWJiX2BeVlleWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntoWFlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVJXUVNWVFhYWF5eWF1bVV1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV5gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2JiYWFgX15WVV1aW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1b2haXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFVVWVBUVlRSVVVRVFVXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxiWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoXlxdW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19bXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZW1laWVlaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZGFkYV1eWWFjYl9hYGFfXF1dWFdbW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXWFdWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXl1fWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZqZGZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWFZVXF1dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYV1tdX11gX11bYGRcXFhaYmVjYVJcWU9YVllbWVlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGpnZWBiYWNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRiVF9aUVlXXF1cW1lbW2NgY2NjYGJkYWBjXmBcXl5eWlhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNoaWdkYGJgY2JfX19dXVtaW1lYWFhWWlZcW1pWVlVMWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiHiYeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp6e3t7e3p6e3t7e3t7e3x8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dXZ2dnZ1dnZ3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent7ent6enp6e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4OCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8doiLi4uLi4uBfX19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PTxL6+vr6+wqKKjIyMjI2Jfn9/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX12jJCPj4+PkIN+f39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5OXSy8zNzM3Qqo2QkJCQkot/f39/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ4eHh4eHh4d3d3d3d3d3h5eXp6eXl3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDg4KCg4ODgoOAfHx9fX19fXx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dXV1eHZ2dnp7eHt4d3Z4fHp5eXp+fHl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ent7e3t8fHt8fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9eXt7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eXt4e3p4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eXx6fHd8eXh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp9fHp8eHx4eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgYCAgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5eXp5eXh4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl5eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXl5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgoGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7fHx8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fH19fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4SFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKBgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLiI2JiImGhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYCBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoKBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSDg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoOEgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoOCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGioyIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYGBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX+AgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIuLiYqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgIGBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGCgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/f35+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f39/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4SDgoKHkpOQi4qKi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYGBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoOCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgYKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoKEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEhISFhYODgoGCg4GAgoOBg4WFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhYWEhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISCgoKCgYGCgoGBf4CBg4KAgIB/gIKCgoODgoKBg4ODhISDgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6QjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIODg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIGBgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYKCgYCBg4KCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomIh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYGBgYGAgICBgYCChIODgoOCgoKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJORkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiYeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpGRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SEhIOCgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKCgoKChISFhIWFhoWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTk5KPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGCgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGBgoKBgIGCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWEhYWEg4SFhYaFhYWEhISEg4SEhYWFhYWEg4OEg4SDgoaUlJKUko+Ni4eEhIODgoGCg4OCgoODgYGCgoKCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaHh4aGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgYCBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSFhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGg4SDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWFgoGCg4KChIKBgoaFhISDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhISFhYWFhIWGhYaFhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYWFhYKCgYGCg4ODg4KDgoGBgoODg4OCgoGAgYCAgICBgICAf4CAgICFhYWFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWFhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoaGhoaFhIOEhYWFhIWFhoaHh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KEhYSFh4eFhIKAf39/f3+Af39/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGh4WEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/f4CBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImKi4uKiYiIh4iIiIeHiIeHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SEhYSDg4SDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aHhIOChYiIiIeHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYaIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKEhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f4CAgH+FhoaFhoaGh4eIh4aBgoSEg4OFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhIWEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoOEhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgISEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKChIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYODf35+f358fH+Dg4KDgoOBfn1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn+AgH59gH9/gICBf4CAgYB/f4GBf319f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX59fH1+goODgoKBgX99fX5+gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gIB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSEgoKBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fXt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBf4CCg4OBgYGBgIB+fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYGCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKiIeKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/f3+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4KDgoKCgYKBf359fX1+foB9fX19fX19fXx7enp5eXl5gIKCg4WDgIGDgYCCgIGBgYOCgoOBgYJ/gYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgYGBgYB/f39/gICAgH+AgYF/fn1+fn9/f36DhoeHiIKGhIWEhIWEhYaFhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8g4OEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKAgYGAgX+AgYB/fo6TjIeIh4iHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiIeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoaIh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIGCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4SEhIiSjouJiIiKh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgYCAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIOBg42Jf31/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICCgoOFg4SFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH18fHx+foqCe3p7enh6e3t8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHyAf4KAgYB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjoyIh4iFhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgYGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fX17fX19fX18fH2Af4CAfoB+foKTkYuMjI2PioWGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgICAgIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fnt8fX9/f4B9f36AjJGNi42OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fX+AgH+AgH9/fX18fH1+fXx9fX19fX18fnx9fHt9fHx6e3p8fX1/hoSCgICBfX59fn9+jISBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fX9/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHt8en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+MioqMi4qIhISEg4SDg4OCgoKCgoKCgoGBgYCCgYGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5/f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjoyKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9+fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCNi4iIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeIi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gICAgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+Eg4SIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gYGDh4SIjYyKiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYqHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6Afn1+foCAf4F+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt6enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhoaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoSEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4GAf35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f359gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+fn1/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fnl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhIKEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl8eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzd3ZzdIaEhIWDgoOEhIODgoKDgYKCgYCBgXyAgH6AfX59fn+AgIB/fn9/fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf36AgX5/gIKCgIGEgoSFhoOAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B9fX18f4CAgH9/f398gH9/gYCBgIB/fYB/fn5+f399fn6BgoKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXh5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GAgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCCgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f39/fnx9gH9+fX6Agn9+gIB/foGDgoKEhYWCgn59fXt7fHx6d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/f359fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t5e3p3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoGBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GBgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9fHx8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgYGBgICAgICAfn2Af4B/gYKCf4KCf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CBgYGBgYKBgIB/f39+fX9+eoGSi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx8fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCf4CAgIB/f4CAf399foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl4c3R1bnNxcHhydXqFhoODgoOCgICAgYKBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/fn9/gICAf4CAf4CBgYCAgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH18fHx3eHV4eHl7fHx9e3x8fHx9fn9/f39+fX1+gH+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBg4OAf4KBhYODhIGBg4GCgoGBgICAgoOCgIKChYN/gIB+goOBgIGAgIB/gIB/gYGAgoB/gIKAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fHx8e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAgIKChIGBgoKEgn+AgH+Bg4KBgIGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoGBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoKBgoGAgYCAgIGCgYSAfoGDgn9+gIOCgIF+gIKDgoCBgYGDgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OCgYGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBg4SAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4ODhIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBf3+BhISBg3+CgoGDgoKCgYSDg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t8enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+BgoGAgIKEg4OCgYKCgYOCgoODg4ODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0f3Z0fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGCgYCBg4WEg4KDgIKCg4KDg4ODg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn19fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dXZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCg4F+gICCgoOCg4ODhIKBgoKDg4KDgYKBgYOBf4GEhIODgoR/goSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2BgoB9fHx7fHyAfX1+gH5+fX9+fHx9fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fIGBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYODg4OCg4CChYODg4OEg4OEg4GChISFg4KCg4ODgYSDgYODhISEhIWFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWKiYSEg4SFhYOHhoaEhISEhYSFhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4SBfYF1gXqDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/g3uFg4CEg4F/fn1+fX2Cg4F9e399foB+fXt8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SGhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4GCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4KDf4ODfYF9fX59foKDgXx/gX1/gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWDgoWGhIWFg4ODhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fX18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIh4SDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2BgH98f318gX6AgH5+gICBgH5+f39+gX+Af359gH1/gIF/gH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4WGhouKhYSGh4eFhIWFhYSChYWFhYaFhYaFhnF1cHJzb3N6eX6DdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgYGAgYGAfX9/gX6Afn1+gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYV4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3psc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYaGhoWEhYWFhYWGiYmHhYSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4aGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFhISEg4KBfX9+e3x7fnt8fH1/fn18fn6AgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeHhYWFhYaGh4iGhIaFhoaFhYOFhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoeFhoaFhIOFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5+fHx9fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4eHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX57fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOFhIeGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fnx8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aFh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhoaIhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fX5+e3x8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHh4iJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eHh4iGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWJioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeHh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn9+f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWFhYSEg4SCgIOBhYKBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeKh4SHhYeGiIaFh4SGh4mGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGh4aGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgYGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhYeIiYaFiIeJh4aGh4WEhoWFhoWEh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhIB/gYCAhICDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXp6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDg4WHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHhoiIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoODf36AgICBf4OAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH6AgoJ9fX9/e39/goODhYaFhIODhoOBg4SCgIWHhYKDgYGDhISEhYaHiIeFhYiGiYeFg4SEgoWDhIaCg4WFhYaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af35/g397gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp6e3t8ent7e3x9fn19gX19fHx9gH99fIaDhoaGhoWDhIOFgoWBgYB/f4CAfn+AgXx+f39+gICCgoKEhYOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x7e31+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+BfH1/f35+foGBgoSDgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p6enp5e3p6enp6enp7fHl7fXx8fn9/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYSFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnx9gX+Ag359gIF/fn99fHx8fXt7enp6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgMrKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3NzMzMy8vLy8vLy8vLy8vLy8vMy8vLy8vLy8vLy8vLy8zMzMzMzc3Nzs7Pz8/P0NDQ0dHR0tLS0tLS0tPT09PS0tLS0tLS09PT1NTU1NTT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXV1dXU1NTU1NPT09PT09PT09PT1NTT09TU1NTU1NTU1NTT09PT09LS0tLS09PT1NTU1NTU09PT0tLS0tLS0tHR0dHR08eGc2VgW0tZZ1VNRkhAPTc3ODk3PDw8Ojw7PjY6PTg8Ozo5ODc4Ozs6Pzs9Ozw8Pjs/QT9CQkFDREVEQT49PDtAQ0NBQENDQUFHSEdJS1LC1dLT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzczMzMzLy8vLy8vLy8vLy8vMzMzLy8vLy8vLy8vLy8vMzMzNzc3Nzc7Pz8/Q0NDQ0dHS0tLS0tLT09PT09PT09PT09LT09PT1NTU1NTU1NTT09PT09PT09PT09PT09PU1NTU1NTU1NPT09PT0tLS0tLS0tPT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXU1NTU09PT09PT09PT09TU09PT1NTU1NTU1NTU09PT09LS0tLS09PT09TU1NTU1NTT09PT09LS0tLS0tHR0dLMjHJnYFxNWWVSS0dLPzszNzg7ODk+PTk8OkE6Oz03Ojw8Ojo3ODo7PT87Pzw9PD8+P0E9QUE+Q0NEQkBBPjo7P0NEQUNEREJCSUdISElOvtXS09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXVysrLy8rKysrKysrLy8vLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3MzMzMzMzLy8vLy8zMzMzMzMzMzMvLzMzMzMvLy8vMzMzNzc3Nzc7Oz8/Q0NDQ0NHR0tLS0tLT09PT09PT09TT09PT09PT1NTU1dXV1NTU1NPT09TU09PT09PT09PU1NTU1NTU1NTU09PT09LS0tLS0tLS09PT09PU1NXV1dXV1dXV1dXV1dXW1tXV1dXV1NTU1NPT09PT09PT09TU1NTT1NTU1NTU1NTU1NPT09PS0tLS0tPT09TU1NTU1NTU1NTT09PT09PS0tLS0dHSz5J3aF9eT1dnTUtGTD04NzY1OTk5PD45PzxEOTs8ODo8PTs5Nzk6PD1AOz49Pjs8Pjw9PkFAPkRDQ0M/QT06Oz1CQ0VDQ0RBP0VISklKTLrV09PT1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLysrKy8vLy8vLy8vLzMvLy8zMzMzMzM3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzMzMzNzMzMzMzMzMzMzMzMzMzNzc3Nzc7Oz8/P0NDQ0NDR0dLS09PT09PT09PT1NTU1NPU1NTU1NTU1NXV1dTU1NTU09TU1NTT09PT1NTU1NTV1NTU1NXV1NTT09PT0tLS0tLS0tLT09PT1NTV1dXV1tbV1dXV1dXW1tbW1dXV1dXU1NTU1NPT09PT09PU1NTU1NTU1NTU1NTU1NTT09PT0tLS0tPT09TU1NTV1dXV1NTU1NPT09PT09PS0tLR0dGafmdhYk5VakpISUs/PDo5Mzc2Nzc9Oz45PTo6Ojg5Ojs7ODg6Ozs8Pjo9PT06PD88PT9CQD9DRENEPkA9PTxAQ0RDQkRCRD5ESElJS0y219PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzMzM3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzM3Nzc3NzMzMzMzMzMzMzMzNzc3Nzc7Ozs/Pz9DQ0NDQ0dLS0tPT09PT09PU1NTU1NTU1NTU1NTU1NXV1dXU1NTU09PU1NTU1NTU1NTU1NTV1dXU1dXV1dXU1NTT09PT09LS0tPT09PT09TU1dXV1tbW1dXV1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTU1NTU1NTU1dTU1NTU1NPT09PT09PT09TU1NTV1dXV1dXV1NTU1NTT09PT09LS0tHSn4NpX2RTWGxISEhLQD03ODQ3Njo6PztEPDw5PDw5Nzo5Ozo6Ozw6Ojs5Pj0+OT1AOz9BQUI/QkJBQz0/Pz48QEJFQ0NCQEE7RklHTUxJstjT1NTU1NTU1dXV1dXV1dXV1dbW1tbW1tXV1dbWy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzc3Nzc3Nzc3Nzc7Nzc3NzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3Nzc3NzczNzc3Ozs7Ozs/Pz8/Q0NDQ0dLS0tLT09PT09PT1NTU1NTU1NTU1NTU1NXU1dXV1NTU1NTU1NTU1NTU1NXU1NTV1dXV1dXV1dXV1NTU1NTU09PT09PT09PT09TU1dXV1tbW1tbW1tbW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NXU1NTU1dXV1dTU1NTU1NPT09PT09PU1NTV1dXV1dXV1dTU1NTU1NPT09PT0tLS1KOIbF9mUlZqR0hHSUE+MzY2Ojs8OEM8QkE+PEE8ODk6PDo6PDw8OTw9Ojs8PT08Pz1AP0BBP0BBQEI8Pj4/PEJDQ0NGQEFBPUhKSU5NR67Y09TU1NXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vLy8zMzM3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Ozs7Ozs7Pz8/Q0NDQ0dHR0tLS09PT09PT1NTU1NTU1NTU1NTU1NTU1NXV1dXV1NTU1NTU1NTU1NTV1dXV1dXU1dXV1dXV1dTU1NTU1NTT09PT1NTU1NTU1dXV1tbW1tbW1tbW1tbW1tfX1tbW1dXV1dXV1dXV1dXV1NTU1NTV1dXV1dXV1dTU1NTU1NTT09PT09PU1NTU1dXV1dXV1dXV1dXU1NTU09PT09PS0tauimtjZVJYaExKR0lCODQ5NDo7OjlAOT9DRUA8PDk5OT06PTs8PDo9PDs5PD07Oz89QD09PkBAP0JBPkA8PTlARENCQUFCPjxISktNTkio2dTU1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbMzNHT09PT09PT09PT09PTzsrLy8vMzMzMzMzMzMzMzc3Nzc3Nzs7Ozc3Nzc3Nz8/Pz8/Pz8/Pz8/P0NDR0dHR0dHR0dHR0dLS0dXZ2NjY2dnZ2tra29vb29nZ2dnZ2dra2tra2tra2tnZ2dnZ2dna2tra2tnZ2tvb29vb29va29zb3NvZ19fX19fX19fW1tbW1tfa2tra2tra2tra2tvc3NfV1dXV1dXV1dXV1dbW1tfW1tbW1tXV1dXV1dXV1dXV1NTV1dXV1dXV1dTU1NTU1NTU1NTT09TU1NTU1dXV1dbV1dXV1dXV1NTU1NPT09PT09LVuopraGhSWGVJSUxPQDk5OjQ7QTw3PTlBQz5APz04Ojo7OT07Pj86Ozw8Ojs8Ojs+PUA9Pz8/QUBBQT9BPDw7PkFEQ0FEQD08SUlKTU5Go9rT1NXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW1tbWzM2EbXBwcHBwcHBwcHBwaqfj3d3e3t7e3t7e3t7e3dLQ0NDQ0NDQ0NDQ0NDRyLm5ubm5ubm5ubm5urq3paSkpKSkpKSkpKSkpKeGYGNjY2NjY2NjY2RkZGWEi4qKioqKioqKioqKiZKZmJiYmJiYmJiYmJiYl4yLioqKioqKioqKioqIoL+8vb29vb29vb29vb60ioqKioqKioqKioqKi4e95uHi4uLi4uLi4uPj4+LY19fW1tbW1tbW1tXV1dXV1dXV1dXV1tbV1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dbV1dXV1dXV1dXU1NTU1NPT09PT1cORcWtqTlNiTExWTjw6Ojc3PkM+OD46Pz9BPD9ANzs6Ozs9Oz4+Ojs8Pjw7PTs9Pz5APD8/PUBAQEE+Pzw+PEBBRUJCRkBAP0dISktPRp7a1dXV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX18zOTiYrKysrKysrKysrKyKK9Ovr6urq6urq6urq6+nV0tLS0tLS0tLS0tLS1MSpqqqqqqqqqqqqqqqrpoaEhYWFhYWFhYWFhYWKTgwSEhISEhISEhISEhETSlRTU1NTU1NTU1NTU1FibGtra2tra2tra2tra2lVU1NTU1NTU1NTU1NTTnqvqqqqqqqqqqqqqqqsm1NSU1NTU1NTU1NTU1NLqvLr6+vr6+vr6+vr6+vp2dfX19fW1tbW1tbW1tbV1dXV1dXV1tbW1tXV1dXV1dXV1dXV1NTU1NXV1dXV1dbW1dXV1dXV1dXV1dTU1NTU1NTU09TLmHZsaUpOX01SVU0+PDw3O0BDPjY6Nz0/Oz1CPzk8OT07PDo8PTs9Oz07Oz08PT49PTtBPTxBQEFBPTw/PDtAQkNBREU9QUBDRktLT0aY3NXV1dXV1tbW1tbW1tbW1tbW19fX19fX19fX19fNzlIrMTExMTExMTExMTEnjfPp6enp6enp6erq6erp1dLS0tLS0tLS0tLS0tTFqqurq6urq6urq6urrKiIh4eHh4eHh4eHh4eHjVISGBgYGBgYGBgYGBgXGk5ZV1dXV1dXV1dXV1dWZXBvb29vb29vb29vb29tWVdXV1dXV1dXV1dXV1N+sKyrq6urq6urq6urrp1YV1dXV1dXV1dXV1dXT6vx6urq6urq6urq6urq6dnX2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1dXV1dXV1dTU1NTU1NTU0Zx6cWlKVF1PUlVORD4/Oz5AQDg6Ozg8Ozs8Pzo7Ozg7OTk7PDs6PDk7Ozw7Oj09PT49QT8+Pz8+PTw9Pzw8QUFDQURFPD5ARUZKS01Gk9zV1dXW1tbW1tbW1tbW1tbW19fX19fX19fX19fXzc9cOT09PT09PT09PT09NZPw5+fn5+fn5+fn5+fn5tXR0tLS0tLS0tLS0tLTxa2urq6urq6urq6urq+rjo2NjY2NjY2NjY2NjZJdIicnJycnJygoKCgoJylaY2JhYmFiYmJiYmJiYW94d3d3d3d3d3d3d3d3dWNiYmJiYmJiYmJiYmJehbKvr6+vr6+vr6+vr7GhYmFiYmJiYmJiYmJiYluv7+np6enp6enp6enp6efZ2NjY2NjX19fX19fX19fX19fX1tbW19fX19bW1tbW1tXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tXV1dXV1dTU1NTU1Naje3FkSVtgTk5VT0BBPz1EQj87PTo5Ozo9PTs8Ozo5ODk5Ozw7PDw6Ojs8OjtAPTw9PEBBPEFBOzs8QD88PUI/RENDRTw+QkRGSkxMRY3c1dXW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2M3NxcLDw8PDw8PDw8PDw8LJ0M/Pz8/Pz8/P0NDQ0NDPzs7Ozs7Oz87Ozs7Pz83MzMzMzMzMzMzMzMzMy8nJysrKysrKysrKysrKx8LDw8TExMTFxcXGxsbGy8zLzMvMzM3MzMzMzMvNzs7Ozs7Ozs7Ozs7Ozs3MzMzMzMzMzMzMy8vLy8/T09LS0tLS0tLS0tPT0c3Nzc3Nzc3Nzc3Nzc3N1NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY19fX19fX19fW19fX19fX1tbW1tbW1tbW1dXV1dXV1dXV1tXV1tbW1tbW1tbW1dXV1dXV1NTU1NTXr39wXkZeYlBRV05HRkNDSUE/PTs8Ojw4QEI8PTg6Ojg5ODs/Ozw8Ozs8PDw8Pzs8Pjo+Pjg+Qjw+PUE+PD5CQERFQ0A8PkA+Q0lJS0SH3NXW1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2NjOzc/Q0M/Pz8/Pz8/Q1NDQzszNzM/T0tLOzc/Szs7Ozs7OztHU1NPO0NTSz87Q1NLPz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0NHR0dHR0dLT09TU1NTV1dXW1tbW19bW1tfW19fX19fX19fX1tbX19fX19fW19fX19fW19fX19fX19fW1tbW1tbV1dbV1tbW1tbW1tbX1tbY2NjY2NnZ2dnZ2dnZ2djX2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NfX19fX2NjX19fW1tbW1tbW1tbW1tbW1tbV1tbV1tbW1tbW1tbW1tbW1dXV1dXU1NXV2LiCb1dKX2NSUVpLSEFBPEI9PTs6Pj48Pj89PT83OTo5OTc4Pjw8Pjs7PDs8Oz89PT45Ozs5PT4/QD5APTs6Qj9CQ0I/PT5APkJFR0pCgNzW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjYzs7Ozs7Ozs3Nzc3Oyp/Kzc3NzdC5g4SLx9PAmsvPzs7OztGwg4STz8mUqNLQxpOr0s7Ozs7Ozs7Ozs7Ozs7Pz8/Pz8/Q0NDQ0NDQ0NHR0dHS0tPT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tXV1dXV1tbW1tXV1dXV1dXU1NTU1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY19fX19fW1tbW1tbW1tbW1tbW1dXW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1djAgG5VT2BjV1lbTExDQD09Oz06PD5CPkJDQDw6ODk4Ojo6Nzs/Pj88PDs8Ojk/PDw9ODk8P0E+PT09QUA9O0FCQEJDPjtAP0FBSUdKQXrb1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2NjZ2c7Ozs7Ozs7Ozs7N0qmPrdHOzs7Om7e2pKLAk56s087Ozs/Jm7q4nayeq5uw0JmtmbPSzs7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHR0dLS0tPT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1dXV1tbW1tbW1dXV1dXV1dTV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX2NfX19jY2NjY2NjZ2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjZ2djY2NnY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXXyH9vWlNhZV5dXE9KRD1APz47Nzo+OT9EPkE5ODc4OTs7PDg5Pz09PD08Pjs6QTs5Ozk7PENAPDs9PkBBPj1CRD9CQz09Pz4/PkhJSD912tbW1tfX19fX19fX19fY2NjY2NnZ2dnZ2dnZ2dnOzs7Ozs7Ozs7Oz8ievKbS0NDOyqCXfoLDppuvp9TPz8/Rw6KPf4rClIecnsWThp2dzs/Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0tLS09PT1NTV1dXV1dXV1dXV1dXV1tXV1dXV1dXW1tbW1tbW1tXV1dXV1dbW1tXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2dnZ2dnZ2djY2NjY19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1tXV1dXV182Ic11YaWheX2BPSUY6QUA+Pzw8OjY/QkBDOjY0Nzo7Ojw6OT48Pj09Oz89PEE+PDw6PDw9PDo8QD1AQj4+QUI9Q0M9PT47P0FFS0hAcNnW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZz8/Pz8/Pzs7OztKspaep1cC80sedj57L08mKmarUz8/P0b+eiqjQ1LvImJnGvcmWmcbQz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDR0dLS0tLT09PU1NTV1dXV1dXV1tbW1tbV1tbW1tbW1tXW1tbW1tbW1tbV1dXV1dXV1dbV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2djY2NjX19fX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbQkHVbW2ppYV5dU05JPENAQT5APjo4RkE/Qzo3NDk6Ojk7Ozg7PT8+Pj1BPTw/QD0+PDw8PDw6PUBAPz89PkJAP0BCQDxAPT5BRUtHP2vX19fX19fX19fY2NjY2NjY2NnZ2dnZ2dnZ2dna2c/Pz8/Pz8/Pz9DMnY2XrNCal8rFnrKels3WrZmq1M/Pz9G6pa2cntLRlJafztGRmKDO0NDQz8/Pz8/Pz8/Pz8/Pz8/Q0NDR0dLS0tPT09PU1NTU1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fX19fX19jX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0pRyXl5ra2plXU9MRz9EQ0NAOj07PEI8Pj05NjQ6OTk6Ojk3Oz9AOzw9QDw8QT48PTs9PD88OjxDQD49Oz1APkI+QEE+QD1AP0ZJRD9m1dfX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2trPz8/Pz8/Pz8/TsaKAm6/JoKO/ypyljKet2KqZqtTPz8/RwKCfk6W8s5/Cm9qto7+d1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTU1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1dbW1tbW1tXW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tKTcGBecGhmZVpRSEdCRUNAQDc6Ojw+Ojw5NzY1OTo2Ojw7NzxAQDw6Oj06PT8+PTw5QDw8Ojo5P0A+PTw9QEFDP0A/PkE7P0BGSkI/YtLY19fY2NjY2NjY2NjZ2dnZ2dna2trb29vb29vbz8/Pz8/Pz8/Qzp+QbJyW16qj09KuprWYn9WqmarUz9DQ0NKmr66bp9CLk57Hy4iVnsjS0dHQ0NDR0dDQ0NDQ0NDQ0NDQ0dHS0tPT09PU1NTV1dXV1tbW1tfX1tbW1tbW1tbW1tfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19bW19fX2NjY19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fW1tbW1tbW1tbW1tbW1tfX19fX19bW1tbW1tfSk25gXHFkZ2RaVUpAQ0ZDQUI4Oz88PTs8PDg1NTg5Njg7Ojk8Oj4/PD09OTw/Pj06Oj45PDo6OD4/PD09PD5AQUNBPjw8OkJEREpGQl3Q2dfX2NjY2NjY2NjZ2dnZ2dra2tvb29vb29vb28/Pz8/Pz8/P0b2fw7fWl8DT0dDSytLNl5vUqpmr1dHP0NDRydfEmKHQ2qWZs9Dbopm11dHR0dHR0dHR0dHQ0NHR0dHR0dHS0tPT09TU1NXV1dXW1tbW19fX19fX1tbW1tbW19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX19jY2NjY2NjY2NjY2NjZ2NnZ2dnZ2dnZ2dnZ2dnZ2tna2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19fX19fX19bW19fW1tfX19fX19fX19fX1tbX0ZFsXVxvZ2hiXU9GQEhJR0VAPDw+Pjw9Pjw3NTY6OTY5Ozo6OzhAPzo8PDk8Pj07Ozo/OT86Ozk9Pj09Ozs9PEBDQj8/PjtDRkZHSERZzdrY2NjY2NnZ2dnZ2dnZ2dra2tvb29vb29vb29vQ0NDPz8/Pz8/PlX57pZLUoprTzJKXo5uh2KuZq9XSl6bVxY2eoJ6gkqeZoK2QqJieu9XR0dHR0dHR0dHR0dHR0dHS0tLS0tLT09TU1NXV1dXW1tbX19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW1tfX1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NnZ2dna2dnZ2dnZ2dnZ2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fW18+MZFZecGtcYGBORUhNSUlPQz46Qj09QEI7NTU3PDo3Ojs6Ojs5PT05Ojo5PT4/PTs5Pjs8Ojw7OT48Pjs8PT5AQ0I/PkE8QUNHRkZFVcnb2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3Nzc0NDQ0NDQz8/P0NHVp5mtyaOovsqdsZ2jtdmpm6nYuKuhycGhraGjpaakqKCvp6KpnNDT0tLS0tLS0tLS0tHR0dLS0tPS09PT09TU1NXV1tbW1tfX19fX19fX19fX19fX19fX19fX1tbW1tbW19fX19fX19bW1tbW1tbW1tfX19bW1tbW1tbW1tfX19fY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19fX19fX19fX19jY19fX19fX19jNhl1XYm9kT11US0hGU1FLTEA+PUQ8P0NGPTU1Nzs5Njo7Ojw9Ojs/Ojo5ODo9PT8+Oz87Pj06Ozk+Oz08PT5BREJAPz4/PEBBRUdFRFLF29jZ2dnZ2dnZ2dna2tra29vb29vc3Nzc3Nzc3NDQ0NDQ0NDQ0NDQ07mAvdObls/UtYuRn9PUvIG71M6UoNPVq42PqtackY661ZqRjr7W0tLS0tLS0tLS0tLS0tLS0tPT09PT09TU1dXV1tbW19fX19fX19jY2NjX19fX19fX19fX19fX19bW1tfX19fX19bW1tbW1tbW1tbX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dnZ2dnZ2dna2dna2tra2tra2trb2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NfX19fX19fX19jY2NjY2NjY2NjY19fZy35aVWpqW0xfTUpMSlVMRkI8PT9HRkhLSD02NTc6OTc5Ojs6PD05Pjk5Ojg7PT4+QT49OTw8Oj0+Pjo9OTk6P0VBQD49Pz9CQEdFREVQwdzZ2dnZ2dnZ2dra2tvb29vb29vc3Nzc3Nzd3NzQ0NDQ0NDQ0NDQ0NDRwdHRysjS0NTEuNLS0dLC0tDTx8zS0dTBvtXT07nH1tPTuMjV0tLS0tLT09PT09PT0tLS09PT09TU1NTU1dXV1tbW19fX19fX19fY2NjY2NfX19fY19fX19fX19fX19fX19fX19fW1tbW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29ra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2NjY2NfX19fX19jY2NjY2NjY2NjY2NjX2sd3XFJnaVpOWk5MUFFXRUo/Pz0/QUVMTEA+Nzc1Ozg4OTk6Ozw+PD44Ojo5Oz4/QD0+Pjo1Ojo7PT86Ozk6PD5CQkA/Pz8/QUJHRENETrzd2dnZ2dnZ2dra29vb29vb29vc3Nzc3Nzd3d3d0NHR0NDQ0NDQ0NDQ0NLQ0NHR0NDR09TR0dHR09HR0dLS0dHR1NXS0tLV1NPT09bU0tLS09PT09PT09PT09PT09PT09TU1NTV1dXV1tbW19fX19fY2NjY2NjY2NjY19fX2NjX19fX19fX19fX19fX19fX19fW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra29va2tra2tra2tna2tra2tra2tra2tra2dnZ2dnZ2dnZ2dna2tna2trb2tra2tnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NvBc1hVaWtTTFJOUFJZVEZJPD5DP0FCRUo+Pjc4Njk3Nzg5OTs7PT9APD04OTs7Oz8+PDw5NTo9Pjs5OTs8Pz8/QkJBPUE9QEFCRkJCQku13tnZ2tra2tra29vb29vb29zc3Nzc3N3d3d3d3dHR0dHR0dHR0dHR0NDQ0NDQ0NDR0dHR0dHR0dHR0dHR0dLS0tLS0tLS09PT09PT09PT09PT09PT1NTU09PU1NTU1NTU1dXV1dXV1dbW1tfX19fY2NjY2NjY2NjY2NjX19jY2NfX19fX19fX19fX19fX19fX19fX19bW1tfX19fW1tbW1tbW1tfX19fX2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnY2NjY2NjcvG9UVGxsTEtSSlRSVUtGRDo+R0REQURGPD84OTo5NTk5Ojc8PTs+QD09Nzk6Ozk+Ozk5NjY6PUBBPjs8OTo+P0NBPj9CPT5CQ0VCQUJKsN7Z2tra29vb29vb29vb29zc3Nzc3N3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX19bW1tbW19bX19fX2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2dnZ2djY3LZrU1twa0tVV1JcUVdIRD48QkpFPUhKPz08Nzg4OjU5ODk2Oz48PUA8PDU5OTw6Pzs5ODQ4PD09QUE8Pjs6PD5APz0+QT09Q0ZHQj9CSarf2trb29vb29vb29vc3Nzc3Nzc3d3d3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dLQz9TQzs/S0tPS0tLS0tLS0tLS09PT1NTU1NTU09TU1NTU1NTU1NTU1NTU1NXV1dXV1dXV1tbW1tbX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d2wZFNhcl9PWlRXX1FSR0I9RUlMQUFMRD8/Ozo4ODkzODY4Njk+PT4/PTo2Ojs+Oz09Ojk2ODo9O0BAPEA/PT8/Qj48Pjw8QkVHSUI+Q0mk4Nrb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3e3tLS0tLS0tLS0tLR0dHR0dHR09PRubvMupucutDI09PS0tLT09PT09PT09TU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2NnZ2tra2tra2tra2tra2tra2tra2tra2trb29ra2trb29ra29va2tra2tra2tra2tra2tvb29vb29ra2tra2tra2tra2tra2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dneql9VYG5bVVlRWl5PTEdDRk1JRkRESjtBQTs8ODg2NDg2OTg3PD9BPz06Nzw/Pjw/Pzs6Njg4PT1AQT1APkFAPUA6Ozo+PUFFR0lCQENHnuHb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7S0tLS0tLS0tLS0tLS0tLS077AypqgopWIkZ6qk6nP1NPT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19jY2NjY2dnZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ3qJcVV5uWF5dTlpQVE5DQ0xJSUlGSkQ8QkE8Ozg3Njc5Nzc5OT0/QT88OjlAPzw+Qj86ODc3Nj0/P0A9QEE/Pzw9Ozs4Pjw/RUlIQT9DRpfh29vb3Nzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e09PT09PS0tLS0tLS0tLS1MiVnK6bmbWJfZOMgoGExNXT09PT09PT09TU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29va2tra2tra2tra29vb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2d2aWlhhbllhV09XTVBFQkRMSU1LRklFPkJEOTg4Njc5NzU2OTg9PUE+Ojg5Pj48P0A/PDU2NzY8Pj8+O0BAQD8+Pj8+Oz8+QUJGR0JAQ0iR4tvb3Nzc3Nzd3d3d3d3d3d3d3t7e3t7e3t/f39TT09PT09PT09PT0tLS0tPPqH6RrI+SjoyGgIiJhJCjytTT09PT09TU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjX2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2trb29vb2tra2tra2tra2drcklpZY25aWlJVXlBMPEBHTkhSSUhFPjtIRjg5NzU3ODc1ODk4Oz4+PTs4OUE+PUA/QT43NTk2Oz5BQj8/QEBCQj8+Pz5BQERBRkhCP0VKjOLc3Nzc3Nzd3d3d3d3d3d7e3t7e3t/f39/f39/U1NTT09PT09PT09PT09a1pZqIi5CFgIWLiIGDiot/hsLW1NTU1NTU1NXV1dXV1dXV1dXV1dbW1tbW1tbW1tfX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19jY2NjY2NjY2NjZ2dnZ2drZ2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29va2trb24haW2dqXFhMWl9WSDpMSExKSkNFRkNATEg3Ojc2Nzg4NTg3ODk8PDs7OThAPz0+Pz88Njc8NDc/QkJBQEA/Pz9BPT0/QD5AQEZFPT1ES4ji3Nzc3N3d3d3d3t7e3t7e3t7e39/f39/f39/f1NTU1NTU09PT09PT09TFkoKDhYZ9gYJ9fHl+gYKDfqTb1tTU1NTU1NXV1dXV1dXW1tXW1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NnZ2dnZ2dnZ2dra2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19jY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2trb29vb29vb29vb29zc3Nzc29vb29vb29vb29vb29va2tra2trb29vb3Nvb3Nvb29vb29vb29vb29vb29vb29ra29vb29vb29vb29vb29vb29va29mAWl5taFpTSV1bWEpETUhKU0xHRkFAP0pCODs2Njk5NzU4Njg7Ojs6PDk4PT07QD07OjY1PDc7PUJAQUE8Pj1AQT08QD8/PkJERT48REuD4tzd3d3d3d3e3t7e3t7e3t/f39/f39/f39/f39XV1NTU1NTU09PT09PYsoSQqH2DeXaEiH97d3mCfn6LrsDV1NTU1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dra2tnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dna2tra2tra2tva2tra29vb29vb29vb29zc3Nzc3Nzb29vb29vb29vb29vb29ra2tvb29vb3Nzc3Nzc29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zWeVxabGZYUk9gUVJBSEdKRlhMRkBAQ0NLPzs7Nzg4NzY1NzY4Ojk8PDo9Oz89Oz0+PDs4ODw5PT9CQUJDPDw/QUI+PUFCQ0JERUNAO0NMfeHd3d3d3d7e3t7e3t7f39/f39/f39/f3+Dg4ODV1dXU1dTU1NTU09TSu56fdYp5e4iAgIKFgYNyc4CFg4ys19XU1dXV1dbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2dnZ2dra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2trb29vb2tra2tvc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tvb29vb29vb3Nzc3Nzc3Nzc29vb3Nzc3Nzc29vb29vb29vb29vb29zc3Nzc3Nzc29vb29vd0HJdX3BlV0tQY09LQkdDSkhLRkE8QT1IUEE6Ojc3ODc2Nzg3PDo4PT08PjtAPzw/PTs6Ozk6OTxAQkBCQ0A9QUA/PUBCQ0NBQEA/QDtFTXjg3d3d3t7e39/f39/f39/f39/f4ODg4ODg4ODg1dXV1dXV1dXU1dTXyHiLhXyCiHqDhIF+goJzaXSFi4aQndTW1dTV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra29va29vc3Nzc3Nzc29zc3Nzc3Nzc3Nzb3Nvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb3spqXGNxZVJPWF5LP0dMSU9LRUA+QUI/SU8+OTo3Njs3Njo7Nzs6ODo8PD47PT07Pjw6Ozg5Ojg5QUJCQUBAO0BCPTo+QUJDPz49Pj89Rk50397e3t7e3t/f39/f39/g4ODg4ODg4ODg4ODg4dXV1dXV1dXV1dXWzp2GmX5/k5OKf4KBfH2Cc3GbiYCCg4nA2dq3tNDX1tbW1tfX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2dnZ2dnZ2tra2tra2tra2tnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2tra2tra2tra2trb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29/AY1pbbWBWUFNTSkRMSE1ISTw+QURDRk5EPDw5Nzk6Njg7OTc8OTg5PD07OUA+OkE/PDc1Nzs4OkBBRUE/Pjk9Qj87PUJCQjo+PTs9PkZOcd7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4eHh4eHW1tbW1tbW1tXW2MuKgIeFg5eMeHt7eW99gXVrd5t0dnt4icfGmIyt2NnX19fX19fX19jY2NjY2NjY2NjY2NjY2NjZ2dnZ2tnZ2dra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra2trb29vc3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb3Nvb29vc3Nzc3Nzc3N3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3c3Nzc3Nzgt2NXWWtiUk1VUUxKS0ZLRkNAPkJBP0VNPj49ODk5Ojc5Ojc1PTc3Oj48OztCPDk/PTk2Njg9OTpAQkZAPj08QEJEQD1AP0M7QD08Pj9GT23c397e39/f4ODg4ODg4ODg4ODg4eHh4eHh4eHh1tbW1tbW1tbW19Wthnp3faufeXh6e3N0f4N+b3F7eXpze3aTioWAiaTN2djX19fY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dra2dra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2trb29vb29zc3Nzc3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29zc3Nvc3Nzc3Nzc3d3d3d3d3d3d3Nzc3Nzc3N3d3dzc3Nzc3Nzc3d3d3d3d3d3d3d3d3Nzc4a1hW15sYlJNVkxNR0tLREZCQjtBPTxFTENBPjg6OTo3Nzk2Njo1Oz5AOz07Pz08Pz06OTk6PDk8RUNGQD8+QENCRD05PT9BPUI/PUA+R09p29/e39/f4ODg4ODg4OHh4eHh4eHh4eHh4eLi4tbW1tbW1tbW19CYf5CHg316g3Z7dXN6eXqQqqZ3cnJ+h4eHgIB+goSEkcnM2dfX2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2trb29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2NjY2dnZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29vc3Nzc3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nvb29vc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3OGlX1RibWJQT1NJSEdGSklJQkE+QkI8RUVEQD44Ojg7Nzc6Nzg4Nj4/PTs8OT08Oj49Ozo2Nzs2OkRBRj4/Pz8+Q0E/Oz09PjtEQz8+PEhPZ9ng39/f4ODg4ODh4eHh4eHh4eHh4uLi4uLi4uLW1tbW1tbX2NjIfnZ2g35+dHZ4hoJ6eXV3nKG7oYSCgIB+h4qKfH+BhoycqM7Y2NjY2NjY2NjZ2NjY2NnZ2NjY2NjZ2dnZ2tra2tra2tvb2tvb2tva2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7d3d3d3dzfmltPZ2tcUFFQSUNPSktHTEdKQkA/QUdEQEE8ODw4ODU4OTc2NzdAQD87PDk+PTg9PDw6Nzg9OT9EQ0Y+QT9CQEM/PDo+PT8+RUQ/PTtLUWPX4d/g4ODg4OHh4eHh4eHi4uLi4uLi4uLi4uPj1tbW1tbX1cHctG54cnN7cHp5doWIhHt4fYCBmKWMf3x+e5GFlouGgYOBjpG93dnY2NjY2NnZ2dnZ2dnZ2dnZ2djZ2dnZ2dra2tra2tvb29ra29ra2tra2tvb2tra2tra2dnZ2dnZ2dnZ2dnZ2dra2tnZ2dnZ2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3d3d3o1YV2huWVBRS0hKU0lNSE1JS0FDP0NGQkFEOjo8ODY0ODg3NjY2Pz4+Ojw5PDs6PT08PDg7PDtERERFPj8+Qj5CPzg9Pz9DQ0JAQT47TFRj1eHf4ODg4eHh4eHh4uLi4uLi4uLi4uLi4+Pj49bW1tbW16yUtnp4cm93lXt0e4uAeHVufoWDe3+FiHJ8fZucjomKgn6DfYeTmsfU2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tvb29vb29vb29va2tra2tra2tra2tra2dnZ2dnZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tva2tra2tra2tra2tvb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3tl/WWBobFxRS0dHT0tOTk9NREZCSD9DSEREQDo7Ozg3NTc3Nzg1OEA+QDs8OTw7PD46OTs5OTs5RkRFQjxAPj88QEM7PkA/QD9CPz46O0pVY9Xh4ODh4eHh4eLi4uLi4uLi4uLi4+Pj4+Pj4+PW1tfX28qFhHdxcm5ueJWEe3iEf3l2cHhzd4uRjoJ2c32Khoh3d3V3g4N8iIiTw9vZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tva29vb29vb29vb29vb2tva2tra2tra2tra2tra2dnZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tra2tvb29vb2tra2tvb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/SdVloaWpWTkpITU5HTURQSUZIP0U9RkxEQz47Ozw5Nzc5NjY5NTg+Pj89OzxAOz08Ojc7Nzk5OEdERUI9QT1CPz5APD9BQT9AQkA+OzxLVGLU4uDh4eHh4uLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj19fX18SSe4l/b2xudXZ+hIGDioZ+dXJtZW2IhoqOhHtzg4eKe3h7g4+PgYSKirHO2tnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29ra2tra2tra29va29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/e3t7hyWxbampqU05HR05PRUhGTUlJQDtEPkhJQD08Ojo6ODY4Ojc3OTQ4PTw9PTs4PDw8PDg2Nzg5OjpFQkVBP0A8Qj9DQz4+Q0RBQEA/QDw9S1Fh0+Pg4eHi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pk5NfX19mpdoV+fHdscHd5eHyMfYqFgHdqc3R3en1ui3t+eXp+hH+AgYN+eHx+h4aWttPa2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2trb2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f397e471qYWlraVFORk1MS0pYTU5HQUBAT0FDP0A7PDg5OTk2ODY2Njg0Oz48PTs5Njo6OTo5NTg5ODk6QkRGPz4+PkBAQEI/PEFAPzw+P0E5PkpPXtLj4eHh4uLi4uLj4+Pj4+Pj4+Pj4+Pj5OTk5OTX19fayoqEgHlzb21xc3V3gJR4doB8dYeFd3VydaCZent3dnl2hHRtbG57eICai5O73Nra2tra2tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzb29vb29va2tra2tra2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f3uOzaWluaWhQUE9MTE9ST0tTRj9FREREPjw8ODs4Nzk5NTY4NzY3Mzo+Oz49Nzo+OTk5OTY6Ojg3PENFRz8/Oz8+QD0+QT07PT45QUBAOEFOUVzQ5OHh4uLi4uPj4+Pj4+Pj4+Pj4+Tk5OTk5OTk2NjY2Nq5joB6dnVuam94cIF9a3RydneEhXmHh3mVjnl5enV3enNrb3yAfHZ9iHyAst7a2tra29vb29vb29vb29zc3Nzc3Nzc3Nzd3Nzc3Nzc3Nzc3Nvb29vb2tvb29vb2tra2tra2tra2trb29rb29vb29vb29vb3Nzc3Nvb29vb29vb29vb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3e3t7e3t7d3t7e3d3e3t7e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/g4ODg4ODg39/f39/iqmpraGtkU1BPRlBUUk5IUks+RERDQjs7OTo6ODY3ODU2Njg3ODQ7Pzw/PTk8PDc7Ojo3Ojo3Oj1DQkM9QT4/PDk9PkFAOzw8O0VAPjtDTlNc0OTh4uLi4uPj4+Pj4+Pj4+Pk5OTk5OTk5OTk5NjY2NnWnm92e294eHZwbnR3cHB0cHNvfolzeoaFjYR6c21ygHqGfW+Dk4F2fH2DhrXd2tvb29zb29zc3Nzc3Nzc3Nzc3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nvb29vb29vb29vb2tra2tra29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg39/f4qBtaGZrZlVWUkdQUU5LTExFQkhFRz04PTw6Ojc3ODY3NzY1Njc0OD48PT06ODo4Pjo7Nzg3Nzo6PkNEO0NCPj04PUBBQz8+PD5FPD49Qk1QX9Lj4eLi4uPj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTY2NjcwHZ2gIJ+enh4cGx1eXJrf31sc290Z2hpgH9paHhzZ36JiXhwgoZ7d31+hYq93dvc3Nzc3Nzc3Nzc3Nzc3Nzd3dzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4N+Ua21mbmZTU0lQWVRMSEZORkZFQkY9Oz48Ozk3Nzg1Nzk2NDU3NTg8Oz0+Ojo7O0A5Ozs4Nzo5OUBCQTxBQT8/OT9AQkVDQUBAQzs7PURLTWDW5OLi4uLj4+Pj4+Pj4+Tk5OTk5OTk5OTk5OTk2dna2Zhze6qEloJydHV2fXhobHx3aHh3bmtwdHmAg3Z0fIGEgn1zcICKf3iCf3mDyN7c3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3c3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/g39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHbi25tZ3NjWVFNVVtXSENJRk5LR0JEPz9COjs6NjY3NTY3NjQ4NzY7PDs+Pzo8OTxCODc5Ojo6OTpBQUJBQkNAQT49P0JDQ0RBQkY5OD1ESk5i2OTi4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5dnZ2tyocYK1eJF+c2x6boSBdoJ9a2hqf4N4dnx1fYWFdGZweX13fXqAioV7fXx+gLTe3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3c3N3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f3t7e3t7f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODg4ODg4ODi2IVvcWt1YVZPVVVcT0RNRj5KR0pFRDw/Qjo8OTg2ODQ1Njc0NzY0OTs7PDs4Pjs8QTg4Oj04PTg6PT1AQEA/QUI/QD5AQ0JDQUFFNzY7RExOY9rk4uLj4+Pj4+Pk5OTk5OTk5OTk5OTk5OTk5eXb2trdnmxuc3GFjXJtcG5/f3WEfmtydnZ6c3iBeHNvdXBta3Z8eYWIgH9/f3Zyg4Ox39zc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4ODh4eHh4eHh4eHg4teFbXFvdl5SV1NaWlFKSENAUUBCRDw5P0E6PDk3NTc0NTY2NDc1Nj08Oj09OT46PEA4Ojo8Njs5Oz49QkJCO0FCQENAQEREQzw9QDc6PEVLTWXc4+Li4+Pj4+Pk5OTk5OTk5OTk5OTk5eXl5eXl087GwH5xbG94e3ZvdW5qc3NtkoZ4bnR0bm90hn9va3BugnRtdnJ9jYN2cX93eYqBpt/c3Nzd3d3d3d3d3d7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3d3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLWhm5wbXFgUllQV19ZSkxMSVI/RD05O0JGOzo5NzQ1NjU3NTQ2NjY+PTs/Pjk9OTs+OD07OjQ4O0BAQ0JDQUJGQT9DQEFCREQ7PT45OzxCTE1k4OXj4+Tk5OPj5OTk5OTk5OTk5OTl5eXl5eXl5bm3tahzcmxwd3p0d3htcXJ1d3+EdHJzbGxrcXxucG50a4F/cYB3fYSDfnmAc3KBiqDZ3dzd3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t3d3d3e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHj1YdxbGpsXlhaVVdgVlZQT1BMPUE6OzxGQTg6ODczNjU2OTY1ODU3Pz07Pz45PTg7PDk9Ozs1Oj1DQkI8Q0NERERBQT8+QkNDPD0+ODk8Q0tLY83R2eHWyNjj5OTk5OTk5OTk5OTl5eXl5eXl5eW1tbarcnlybn1/dnV3aGpoaXBvdm1ra2dlZnF0bXmAbm15d3aIeHFramh1dXl0dX/B39zd3d3d3d3d3d7e3t7d3d3d3t3d3d3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eLi4eHh49WGcXBjaWFXU1lXX0xST1JNS0A+ODk7QT44Nzk2NDc2Nzo2NjY0OT4/Ojw/Oj85Ojo3Oj08OTk8QUE9O0FDRUNGQD4+PkFFRD5AQTc4PkZISl6ytbjBubW7yODl5eXk5OXk5eXn5+fn5+bl5ubmtra1tY59fnB6hHVydmdiY2Vsa3JvZmlsdm13hn2FeWxsd3hrdnB8fXhzdXl8d3aHueDd3d3d3d3d3t7e3t7e3t3e3t7e3t3d3d3d3d3e3t7e3t3e3t7e3t7e3d3d3d3d3d3d3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLh4ePVh3VuXm5jWlRTWFdLU0tKTVJHQTg7Oz48OTg3NTY1NjY5Njg2Njk/PDo9PTs/Ojs7OTw8Ozk6Pj4+Ozw9QURCQ0FAQEE/QkM8PD03Oz5ERUpesbW0tba3t7bL2sne5eXd4OLe1dTW09Tg4+Df37a2t66He39ueY16cnVtY2hsbG1pdHh6cXl6eoiHg3ppaH1xZG9xfIaBfnl7fXx7hqfa3t3d3d3d3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4uLi4uLi4uLi4uLi4eHj1oZ2bGFvX11XWVxaUlBISldMRUc9QD07Oz05NjQ2NTU1ODY3Njc4Pzs5PT08PDk5PDo+PDo5OD5COzs+PkBEQENFQUBAPT9APD09NTk8QkdGXbG1tba4ubm5ur24w9PSvcHBwLq7vLq7xMzFv8O3t7eEaXWBfWd1h3lndXFra3l4cHd8fXltaXd7eHduaXWPgXBseXh3d32Be4aCeYCg3N7d3d3e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODf39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4OHg4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLh49eFcmtndGFbWFhfXlNVVVFVSkxGP0lEOzk9NjY0Nzc1Nzg3Nzc4OTw8Oj48ODw6PT45Ozw5Ozk/QTw9P0M/QUBFQkJBPD1DQDo+PDU0OURHR1qxtbW2t7m5ubm5ube5ubi4ubm6urq6ubm6ubq7t7e5f25wc3pvcH95c25zdWxzdnhxcXBva29xfoFzaYeEgX10c4d1bXWFiYGAcnaFp93d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODf39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4ePXiXFrbHJbV1ddYFRRVVRQUk9KQ0BNQT07OTY1MzQ2NDY4Nzc3OTo+Ozw+Ozk8Ojw8OTw9PDs9PT49Q0REQENCQT9APjw+QTw4PTo2NjpCSkhYsbW0tra4ubm4uLm4t7e4uLm6urm5uLi4uLq6u7e4rHtyeHF/dnN+cGxtenJnb2xtbnRwe3d3cnJ3em+GknZ/fHx6dnl8f3N9h3J1rdPf3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4N/f4ODg4ODg4ODg4ODg4ODg4ODh4eHh4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLj14dvanFqVVZXYVtPUVJQTldJRERJSj86OTo3NTM0OTU3NjY3ODg6PDs8Pjo8Ojo9PDk7PD07PT08Oz1ER0RDQTw8PDw+PkA7ODw4MTU6QUZFVq61tbW2t7i4ubi4uLi4t7i5urq4uLe3uLi5uru3uapycHh3fHt7gndobnFqb2pjaXJ/bXNyfnh0cWxqdoB5fYCAf3V2gHVriouAdpHV393d3t7f39/e39/e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/g397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uLi49iGbWx0ZVZQXGdYTVhTUlFZRUNLUE47OTg4NzU1Mzk1NjY3Njg4OT45PT45PDk5PDs2ODk5OjxAQD0+QEZAQkJAOj48QT0/Ozs7NjE2PEJHRFCotrW1tra2t7i3uLi4uLi4ubq5uLi3t7e3t7m6t7a0iXJ3eH2JfHB6b31zaGpsZ2dsdGxxd3RxbHZzcXF3cXJ8eXiDdnt3aYuRin2Qzt/d3t7e29jZ2tnb3t/f397f4N7f39/c29zc3d7e4ODf4ODg4N/e3t7f2NLf3t/f3t7e39/e3t/e39/e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/g4N/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4uLh4uLi4uLi4uLi4uLi4uPj4uPj4uLi4+Pj4+Li4uLj4uTXg2hndWRWVWRlV0paWVdbVD1FTUtIPTg3NTc2NDM5NDQ3NzU2Nzk9Oj0+PD08OTs8OTk6Pjk8Pj8+QUFDQUVFRD47PEE+PDk8OzczNz5ESEVKoba1tbW1tba2t7i4uLi3t7i4uLe2tra2tre4uba2tot9emxsen9wbHl2bmpoZ2VxenhvaW9vcHVzbXN3gWdvfYKBg3J/eWpwcnp/qeDf3dnLxr+8vb++ws3S0Nbe2dzg19DNw8LDw8fV19PZ3NfU2NfQx8TFx728z8rPztjd2M7c3dza3dPR3N7f397f3t7e3t7g39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4uLi4uLi4t/i4+Lh4uDh3tbb39LDysnH0dvc4uTh4eDZ2t7WxsTFxM3a2t/k4eLi2tfey31pZnFhWV5lYU1MVEtSWkw7SE1IRkE9NzY2NTM0NjY0ODc2NTY5PDs+Pjo+OTk8OTc5Ozs6Pj08QEBDREJHRkJBPTxDQD05PDs3Nzc/REZGRpm2tLW1tba2tri4uLi4uLe4uLeztba3tre3uLm1treil3Fvb3BpbnR2cWZlY2tuZ29ybWZna3KBZW92fIB4ZHOPf3NocXJpZWVub7Df0cW/u7m5ubm5urq6u7q9zcbDx7+6urq6u7u7wcK9wcW9vL++vLu6urm5urq5ubrDxcO5wMPBvL+5t7/Pz9Te2Nze3+De0trg39/g4ODf39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4ODg4ODg4ODg4OHh4eHi4uLh4OHi4uLi4dra3dHCw8K7xdPW4N3J08OuucCxqqurq7C0tsnSxdHEsbi/tKurq6yvtLS8zMTVzrS0u6t4bG1tYF1iX1lLU1VUUVBEQFFNSEQ/Ojc4NTczMTU2NDk4NDY2Ojw7PTw4PDk2Ojo4ODk3NTw8PD9AQUBCRENCQTw+Qj8/PT09NzU4PkNFQ0CPtrS0tbW3uLi4uLi4ubm4t7Wxq62vs7Gzs7O0tLS2pp6La257dnF5eGdjaF9xd2Frbm9ob31vbmNraWx4d2xrhn5scHp2bWxwb3mxxry6u7u6ubm5urq6urq6urq6urq6urq6uru7uru7vLu6urq5uru7urq6urq6urq5uLe3uLi3t7a1tbW1uLe7x77DxcfNxLjAycfS3NnZ397e4N/f39/g4OHg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHc2OLi4uLh4eHg4eDe18bG0dDO1N7e087S39K4uLyyra2srKyusb65rresqKmpqaqrq6uqqqqrrKy4rKqqqqurq6utrq6urq6uvLOtrKukeW5vbV9eXV1UTVJTXFRKQT9QSUg+ODk2ODM3MzA1NzM3ODU3NjY6PD88ODk7Ojo6ODk6NjU5Ozw+P0Q/Q0VCQ0I/QEBBP0A+PDc4NzpBRUQ/hbi0tLW1t7i4ubm4uLe3tK6sq6qqra6urq+wsbOztaNwbm5ybXCDfXVpYWVoZmRjZHFzbW13bmdpbW1lcHNvb3Nxc3yHgXp1fXWfu7q6u7u6urm5ubq6urq6urq5urq6urm4ubm5ubq6urq7urm5ubm5urq5ubq5ubi4uLe3t7i4t7e3tra1tba2trW1tbW1trW3t7e3usG+vMbJytvf4ODe293d3uHi0Nbi4eDg4ODg4ODg4ODg4ODg4eDg4eLTvrzM2N3c4uDR2dvEvbewsLGxr7O7u7OwtL2zrq6ura2trayrqqqqqamoqampqamqq6uqqqqpqaipqampqampqqqqrK2urq6urq6urqytpHhpYnFmYVlaVlFSTlxTRj1CUkRBNzw7Njk1NjU0NTY1ODc1NjU3ODs+PDs5OTk6ODc3OTc2ODw7PjtEPz9DQEFEQT4/Qz0+PD46Ojc3P0NGPniysLO0tba3uLe2sq6urayrq6qpqq2trKyur7GztLW3jG5ydGpogHlmamZlbF1obnBobHFiY2Zygn52aGhsam56hoGFfHhxcXmAr7q5urq6ubm4ubm5ubm5ubm5ubm5ubi4t7e3t7e4ubm5ubm4t7e3uLm5uLi4uLe3tra2t7e3t7e2tra2tbS0tbW1tba2tbW2t7e3t7e3t7e2t7i/xs/QxL6/wMTX17zJ2trg4eDg4OHh4ODg4OHh4Nve3tTNvLe2t7rAwMnEt8i+srCwsLCvsK+urq6vsLCvrq6urq6trK2sq6urqqmpqampqampqamoqamoqampqamoqamoqamqqqutrK2tra6vrq2sraF5amRtZ2JcWFFQUUtUSkI6SVE/QTc8OTQ6NTY1NDU1Njg4Njg2Ozo5PD09Ozo4NjY4ODo4Njc+PT09PkFBRUJCQ0FBQEE6PT0/PTk6Nz1BRzxsqqaoq62wsbCuq6moqqurqampqausrK2tra6ws7S1uKWAh29pZ3N0ZmtwbWpkbG9ybmttY2twfImEbmpsfHhje4p+c2pzbmtxj7u5ubm5ubm5uLi5ubm5ubm5urm4uLe3t7e3t7e3uLm5uLi4t7a2tre3t7e3tra3tra2tre2tra1tbW1trW0tLS1tbW2tra2tre3t7e3uLi4t7a3tra4ubi4t7e4vr64ur29x9vg4eDY2d3h4eDd18rBw8K6ubm4t7i4uLe1tLS0srKxsbGwsK+vr6+vr6+vr6+vrq6traysrKurrKqqqaioqammp6mpp6GlqKmpqaiin6GhnKKnqKepq6ysra6vsLCura6deHBsamFjYFlRTVFMUkZDOU1QRT44OzcyNzk2NzQ0MzU3ODc5Nzs6Oj09PDo6OTc0Ojk4NjU4Pz9AQj1EQ0NDQUNAQkFAO0A/QD88PDo7Q0g9Y6ilpaWmqKiop6enqKmqqaioqKmqqqytrrCwsLO0tbW1pZh2fnFma3hxb21mZWxoY2xnZmlpfXVtaW99dnmFZmh3b3hvcW9yeKe7ubm5ubm5ubi4ubq5ubm5ubm5uLe3tbW1tra2t7e3t7e3tra1tba2t7a1tbW2tre3t7a1tLS0tLS0tLW0tLS0tbW1tra2tra3t7e3t7e3tra2t7a2t7e4t7a3uLi3uLi4uLjAxdPKvLzDzc/IwL26ubm5urq5uLi4uLi3tbS0tLOzsrKysbCvr6+vrq6ur6+vr66trKysq6usrKyrp6GgnqCfm52hoZ2WmaSkpqifmZmZmZqdn6Cfnp+kqq2ur66traysmXVwaWtjYV5dVU5TS1JERDhOS0dBOjg1MjY5NjU0NzM3Nzc4OTc5Ojs9PT44ODg3NTo5OTU4P0BAQUQ+RkFCQ0BCQ0JBPzxAQkJAPT46OkRGPlympaampqampqeop6eoqKiop6epq6usrK2tra20tLS1t6RzfXVuc41/cmZqcWNpbWNoZmhsbnVpX2NndXN2em5ncHByfnpxiKG7ubm5ubq6urq6ubaztrW4uba2tbW2trW1tbW1tbe2tre2tra1tba1tbW1tLS0tra3t7e1tLSzs7S0tbW0tLS1tbW2tra2tra3t7e4t7e2tra2tba1tba2tra2tra2tre2tre4uLe6uLi4uLe4uLm5ubm6urq6ubi3t7e3tbW0tLSzs7KysrGxsLCvrq6urq6ur6+traysq6mlpKampJyZm5uamZqamZeXl5eXlpmbmJmYmZmbnZ6fn52cnqCkpaSjo6KiopB0bmNwYV5eW1RTVEhUSj88UUJGQzs4NjM3OjU1NDgzODk5Nzg5Nzs5Oz07Nzo3NTY5OTg1OD4/P0BFPkI/P0M/PEFBQj89P0RBPz49OT1DRj9VpKWmpqeop6ipqainqKioqKioqKqsq6qpqKmrtbW1trmjd4pxcoeGd3RwaHlrYmNhZWxpbnNqX2NlY2NlamtiZGpsdpeNfqi9ube2t7m7u7q4tbGsq6uqrrCsrKurra2rq6+wsa+vsLK1tba3tbW2tbW1tbW1tba2tK+vs7S0tK+trq+ytbS1tbW1tba3t7e3t7e3t7e3t7e3s7CytrW0tra2t7e2tra1tbW2tre3t7m4uLi3t7e4uLi5urq6urm4uLe3t7W1tLS0tLS0tLSzs7KxsK+vr6+vrq+vraijoqCcmpqampmZmpubmpqampuamZmZmJeXlpiZmZmanJydn5+gn6CgoKGhoKCgn5+LdG5pdF1gZl5SVEtEVEk9RVNIRUI7OjQ0Njk0NDU3Mzg4ODc4OTk6Ozs/PTg6OTM1ODk2Mzk9PkA/QDpAQkJCQD9AQkI/PT5BQUI/PTo+RUNAUaOmpaWnqKepq6qopqioqKmnqKioqKenqKipqrW1t7e3spm0f32QjHVnaWpsZmNgY2hlb3hwaWJxfHlwamZmZGZrc2qFjKy2srCtra20t7KwsK2sq6qpqKinqKmpqamoqKeoqKmpp6iqq6utrayqrK2trKyurq2tq6elpKeqrKiko6SlqbCxsbO1tba3uLe3tbW2t7i3t7e3sqmlpqyrqK+0trWztbe3trW1tba2tre3t7e3tra3t7e3ubq6urm4uLe3tbGztLS0srGwrqyrrK6usLGwrauqqaqoqKOcmpmYmZiYmJiZmZmZmZmampmbm5ucnJuZl5iampycnJ2cnZ+goaGioqKgoaCgoJ+einVqa25ZXGFWS09ER1VHPk9XSEQ9PDgzNDQ4NDU0ODI4OTg4OTo6PDk5QDw2OTozNjc5MTQ8Pz9AQEE6Q0ZFQkFEQkNBOjs/QUJDP0A9QERDQE+jp6alp6aoqqqqpqSmp6eoqKioqKampqirq621tre3t7itsnVwe4N2YGJpa2JlZmFkZ2Z9iHlscoB9cW9xeGNtbnFmj6ysq6urrKytrq6sra2srKqnpaalpaWmqKioqKilp6ioqKiop6ipqamnpaSjoqKio6KgoqKhoqGgoKGhoqOko6OlpaWosLSzs7Owq6qpqrO0tre2sailo6KhoaKkqKqpqKuztLGurrGztba2tre4uLe3t7e3t7e3tra4t7Sxrqmmp6usqaempaSkpKSkpaippqOgn56dnJybm5qamZmYl5eZmZmYmJmampqampqampubmZianJ2dnZ2dm5ygoaCho6OioKCgoJ+enYV0a2xoV1hTSkdNRUhNR0BTV0ZHPT05MzYzNzQ1NTczODo6Ojo5PD06OkE8Nj04Mzc4ODM3O0A/P0BAOkJFQ0BCRENBPzs8QENCQ0FAPEFDQD1OoqempqenqaqrqaSlpaWlpqioqKmmpqeoqamqtba2t7e3uLNzaHtzYmdqa2lpYmFkaWhdXW18cmZrcn98dHxubXNzfqCpqaurq6qrra2sq6yrqamopaOkpqampaanp6qppqanp6eoqKenqKinpaOkoqGhoaGfnp6fn5+fnp+goaGjpaSjo6SkpKanp6empaSlpqamp6qtq6akoqGhoKGkpaWlp6elp6iopqWlqK+0tre2tbW2trW1s7Csq6mprquopaWmpqalpKSlpaWmpaSkpKSloqGhoaCenZubm5ybmpqZmJeYmJiYmJmamZmZmZiZmZmZmpmZnJ2cnJycnJucn5+foKGhoqCgoJ+dnZyAc2tuZF5TSkhNRkRMS0VEUVNDRz08ODM2Mjg0NjQ2NDg5ODo7OTs+PDk9Ozk9NzM1OTY1NjxAPT9APzw/QkM+QkJCPz0+PkJDQUVAPzo+RUA7T6OmpaSmp6ipp6WkpaWkpaenp6iopqenpqWmprW1tra2tba5im1xbW98fHFnamZgYWxgVE5baGpub22Bgn1xZ3F2fpqop6iqqamqq6usqqqqqKalpaSio6WmpqWlpaapqqmmpaOkpaampKOjoqKioqCgn5+enpycnJycnZ2cnZ6foKKhoqOjoqGioqSlpKKio6OkpKOkpKSjoaCfoaKkpqenqKmpp6WlpKKkpKWorbCwrKuqq6yqqaelpaalpaWlpqWmqKipqKWlpaSkpKWko6Oko6KhoaGioqCenZycm5ubmpmYmJiYmZqbmZeXl5aWl5eYmJmampybmpqam5ubm5ycnqCgoaCenp6enJybfnpucmJeU01KUEVGTk1CQE9FPkk7PTUzNjM4MzY2NzU6Ozg5Ozk6Pj07Ojk6Pjc2Njk2NTY+Qj4+QT89PkNBPkNDQEA7QEBCQkJFQD47PkU/PFCgpKOko6OjpKSipKWlpKWmpqanp6ampqWmpqW0tbW1tLS1uIFofH1lc4J6bHB1YV9jVE5PUVtobGlsbHFtbnFudJyipKeoqKipq6qqqqqpp6alpKOjo6OkpKWmpqWnrK2ppKGenZ6jpKGenp+goJ6cnZ2cnJyampqbm5ycm5ubnJ2enp+goKGgn6Cho6KgoaOkpKOipKWlpaSin6CjpKSkpqmpqKeloZ2cn6OlqKmpqKeoqKipp6alpaSkpKWmpqampqamp6elpaSjo6OjoqKioaGioqGio6Sin56dnZyam5uampmYl5eYlpaVlJSUlZWXmJiam5ucm5qampqbm5ybm5yen5+em5ycnJqbmn9+cXRgW1RNR01IRkxKPz9OQzxAOzw0MzgzNzQ3Njc4Oz04Ojo5OTs9Ozs4OT03Nzg5NTg4P0A9P0E+Oz1EPz1EQD8/OkBBQT9BRUA+PDxDPzxOnaKhoqKgoKKlpKSkpaWmp6enp6ampqalpqaltbW1tLS0tLeMdqWxd2Zzcm9zbGNkaVhPUlFPT12AbWRgWm2RkZKioqOlpqamp6eoqKinpqWlpKOioaGhoqOlp6amp6ysp6agnZyboaGem5qanZyZmJqbmpqamZmZm5ubm5qampqam5ydnqChoJ+en6Ggnp+io6Sjo6anqKeopaKgoaGhoaSlpaWkoJyZmZueo6ampqampqemp6alo6WkpaWmqKinp6elpaWlpaSko6OjoqGioqKioqGhoqOjoqCfnp6dnJucm5uZlpSUlJOTk5OTlJSUlZaXmpqbm5ubmpmZmpqcnZ2dnZ2dm5qampqZmpd/d29zXVpOSEpOR0VGSURFTkA8PT08NDU7NDY0NjU2Nzk7ODk5ODk5PDs8Nzo7Nzg4ODU4OD9CP0FBPD4/QDw8QkBBPj1BPj8/PUJBQDo6QDw8T52ioZ+gn52fo6SkpKWmp6iop6enpqampqampbW0tLS0tLS1tJe2p3VmeHZjbGNjZWNbUlNTUk1eoIx4WGh2lqOenqGho6Ojo6OkpKWmpqWkpKKhoaSjo6Oio6Wmpaamp6emn5uam6KgmZaWlZqbmZeXmJiampiYmpqampubmpmZmZ6dnaCio6OjoqSkpaKeoaGhoqOlpqalpKOhoKCfn6Ghn6CgnZqYl5manKCko6OkpaanpqWlo6OkpKSkpaenpqampqalpaako6OjpKOioqOkoZ+goaGgoaChoJ+fnp2dnJqYl5WTkpKSkpKSk5OSk5SVlpmampubmpqampudnp6enZycnJubmpqZmZmUfXRsdF5aT0hFR0ZCRU5FP0Y7Oj4/OzQ2OjY5MzY0Njg4Ojg5Nzg4Ojw7PDk7Ozo6Njc4OTk+P0A+PD1APkA6OUBBPz1BPz9BQT5BQT86OT0+OlCdoJ+dm5ycm5+io6WlpaWnqKinpqampqempqe0tLS0s7KysbCwrauQeIaPfpuaf3diXVNSUVFMYqCii1qIoKCfnZiZnJydnZ6hoaCkp6empaSioaOnpqWloqKlpqalpqempqCbmZuhoJeTk5KXmpyal5eXmJqamZqampqbmpiYmZqgoKCgoZ+hoqKkpqainqCfn6Cho6SjoqGfnp6enJqdm5mampmYl5meoKGhoqKioqSlpaakpKSkoqKioqSlpaWlpaWlpqWlo6SjoqKioaCgoaCen5+fn5+en5+gn5ybmpmXlZSUlJORkJGSkpKSkpKTlJWXmJmamZmampqbn5+enZycnJyamZmamJeXkXxyZ3FeXVBGP0FEP0pPQkJGOENFPj45ODs3NzQ4NDU5Ojo7OTc5Ojw7Ojw9Pjw8OjY3Njk4Pj9BPjs/Pj08ODo+QUBBQj8/QUJAREE+Ojg+QTxTnJybm5qanJydoaKjoqOipKanpqWlpqampKOjsrKwraunpqanpqWmqKWfqKinqqeheYRcUVJPTFycoIBimaCenZyVk5WWl5manZ2eoaampqako6KipqenpqOlpqalpaanpqainZyeoZ+XkZGQlJebnZiWlpaYm5mampqampmXmJqboaGfnp+enJucnqCgnp2fnp+foKKjpKOioJ+enZmWl5eXmJiZm5ueoqKioqKioaKjpaWko6KjpKKhoaGio6SkpKSjpKSkpKKioqGioaCfn6CenZ6enZ2dnZ2enp6bmZiXlZOTlJSTkpCPkZKRkpKRkpOUlpeXmJiZmpqanJ6dnZ2cm5uamJiamZeVlo16amZqYGJORj4/QD1KRUBDQDtAQTw6Ozk6NzY1ODQ2Nzg5PTg4Ozo7Pzs6Ozw6OTo3NzY4Ozs7PTw6Ojw9PDc7PkNCREM/PUFDQERBPzw6QEI7V5mYmpqZmZqbm5yenZ+ioqGipKWkpKWmpKKgnqinpqWmpaWlp6anpqampqSlpqeop6Gpck5RTUpUlqF6cpqcnJ6cl5WUlZaYmJeXmp6ioqGio6Sko6OlpqWlpqempKWmpqWlo6CgoaGfmZKQj5aamZ6clpeXl5mbnJycmpqZl5mbm56fnZydnJmZmpydnJ2enp+fn6GhoKChoqCfnpuXlZWVl5qdnp+foaGioqKjo6GhoKCgnZydoaKio6Sko6KhpKWko6SjpKOioqKioqGgoZ+fnZydnZycnZ2cnZ6empeWlpWUk5OSkpKSkJGSkpKSkZKUlZaXmJiYmJqbnJycnJycnZybmZiZmJaUlZeLeGxjZGJkUUdBPUM7S0hEOjs7PD45Ojo5OjczNzk1Ojg4ODw5ODs5PT07Ojs6OTw8NzY0Nz88Oj07PD8+PDs4PEFDQUNCQj4/QkBCQUA6P0A/O1mZmJqampqbm5ubnJ2goaGhoaGioqKioqGfn52kpaamp6elpaanpqampaSkpqWkpKSlpoZQUlBPT4+YcHqam5ucnpycnJybm5uZmJibnp2enp+go6SioaGioqKjpKSlpqWko6OhoaGenJqVk5SYm5qbnpqYmJiYmpyenJqbmJaZnJucnJycnJ2ampucnZ2enp2enp+fnZycnKGhoJuWlZWVlpygoaCfn6GgoqOio6Gdm5mWlpaWmJyeoKKnqKShoKCio6OioqKgoKCgn5+fn6CenZybm5ydnJ2cmZqcm5aTkpKSkpSTkpKSkpKSk5KSkpGSlJWWl5iYmJiZmpybmpubm5ycmpmYmJeVlZaXh3dkZ2hkYk1DRTxEOUlKRTk6Oz09Ojo4ODo2NDc5NTw5Njg5Nzk8Ozs8Ojo8Ozo8PDg3ODc+PTs+PjpCPzo6Oj9BREJDQUFAP0RBQUA+OkA+PTpbmpiZmpuam5ubm56foKChoqKgoKCfn56enZ2cpaSlpqempaWmpqSioqKjo6SjoqOjoqeWVFhVUk5nbWuBnpqbm52foKCfnp6enp2cnZ2cnp6en6ChoJ+foKCgoaKjo6Ojo6OioaCem5mZmJmZmZqZmJ6emJiZmZqbmpaVl5aVmJycnZybnZ2enJucnZydnpuYmp6hoZ2bm52goqGalZWWlpmgoqCdm56goaOin56bl5eUkpKUl5iZnaCip6eloaCfnqChoaKhoJ+enZycm5ucm5uampmanJ2cmZeZlpWTkZCQkI+RkpKSkpKRkpOTk5OTk5OUlZaWl5eXmZqcm5ucm5ycmpqZl5eWlpWVlIRyZmxiZFtEQkw9PzhGS0I8QD4+PTk7OTo9ODU4ODY7ODU2Ojg8PDs7PDw7OTw6PT05NTg3PDk8Pzw6QT86OjpAQENCREFDQD9DQUA+PTxAPT06X5qXmZqYl5ianJyfn5+hoaGgn5+fnp+goJ6dnaWkpKSjo6Kio6Ohn5+hoaKko6KjpKKtp1deXVRXX25rjZ2ampucnp2bm5ydn56dnJycnJ2dn6CgoKGhoaCgoaCgoaKhoaKhn56cmpqampucmpmam5mcnpmWlpaXl5OOjpCUlpucm5qbm52fnZycnJycnp2WlJmcn6KfnJydn6Ggm5eXmZmanJycm5udnp+dmpeWlpaUk5OUmJqamp+goaampaCfnp+eoKGhoJ6cm5ucnJubnJubmpmYmZmZmZeXmJWUkpCQkJCPkJKSkpKRkZOTlpiXlJOSlJWUlZaVlpmZmZqbnZycnJqamZeWlpaWlpCAb29lXmBXQEpIOD83SUU/RUE8PTs6Ojs7Ozc1Ozg2Ozc0Njo6Pjs6PT4+PTs7Oz47Ojg6OTk2QEE9Ojw9Ojs5P0FDQkRFQz4/QUE/Pz4+Pz08O2CXlZeXlpWXmZueoaGgoaKioJ6enp6eoKCfnZulpaOkpKKgoJ+gn52dn6Gio6Ojo6ShsKNdZWRgYW5rgZ6cm5ubm5uZmJqcnZ6cm5ubnJycnqKkoZ6goaGioqGgoKChoaCfn56cmpmam5ubnJuanZ2bmZqcmJeVlZaRjo2PkpidnJybnJyeoJ2cm5ycnJ6alZWbnp+hn52cnJ6enZyampqampqampubmpeXlpOSlZWWlZOVlpqbmpqdnp+ipaOenp+fn56fn56dnp+dnJybmpyampuamJmYmJiYmJiVlJORkJGQkJCRkpOTkJGTlJiZmJWTlJWVlZaVlpeZmZeZmp6enJqYmJeXlpaXl5iNfW5tX2VWVEVLPDc+N1JFQz5CQTg7PDs5ODo4Njs3Nzo2Nzk6PT46PDw9Pj08PTo/PTo4PD05O0A+Pj89Pjk5Oz9CQ0BDRUM9P0NCPkBAPkA9PDxhlZKUlZaWl5qcnqCgoKChoKCenp6enqCfnp6bpaWko6Kgn5+enZ2bmZucnJ2en6CfnquYY2ltbmlmbZ6dnJubnJuamZmZmpqbm5ybm5qbnKCjpKCdnp6foKCgoKCfoKGgoJ+em5qZmpqbm5ubm5+enJmYmpqYmJiYko6Pk5ecnZucnZycnJydnJyenp2empWXnKChoZ+enZ6gn5ycm5qampuampiamZWTk5OSk5aXl5WUmJiZm5ycnJ2gn6Cenp6en5+fnp6foqOkoqCenpybmpqam5mYmZmYl5eWlZSUk5GRkJCRkpOTk5KSk5SYmZiWlZSVlpaWlpaXmJiYmJeZmpqZl5eXlpeWl5aXiXh2Z11fV1RFRTk5OzxZPkA4Qj85Ozs+OTg7ODo7Nzk6NTg5Oz08OT07PT48PT47Pz87OT48PD4/PkBBQT04NztCQ0U/QUVDPUBEQkFARDs7Pjs8YpaTlJSWlZSWmJiZm5ucnJydnZycnZ6fnp2cmqSkpKSgn56enJubmpmYmJiZm5ydnpymiWVrdHhtW4WinZ2cnJ2cmpuampqanJ2dnZuam5ugoqKem5ydnJucnZ6enZ2dnZ+enJqam5ydnJybnJyenpybmpqdmpqbnJWRk5ebnZ2cnZ+dnJycnJydnp+en5yXmJ2foaGgnpyfoJ+cm5ubmpuamZmZmZmXlZaVlpiXl5eWlpiZm56enZ2foaGgn5+enp+fn52fn6GioqGhn5+fnJmbmpydm5qamZeWlpiXl5eWlZOSkZOUlJOUlJSUlpmYlpWVl5mYl5iXl5eXl5iXmJeXl5eWlpiXl5WXl4N4dl9bXV5RPUY6OTg/VUNBO0NDOjw+Pzo6OTc7ODg4NzQ4OTw7PDg7Ozw9Oj0+Oj9BPTo9PD4+QEA9QEE+OTY8RENFQEFFRT0+RUREP0I7Ojw5OmSXlJWVlpSUlJSUlZeYmJqZmpycnJ2enp2dnJujo6SjoJ6cm5qZmpmYmJiZmJqbm5ubpYlrcXZ6b2Wan56enZ2cnJudnp2cnZ6enZ2cnJ2bnKCgm5qam5uam52cmpqam5ycm5mZnJycnZ2dnZ2dnZ2enJuan5+bnJ2bmZmZm52dnZ2fnZ2fn52cnJ2fn5+fm5qdn6Cgn52cnqCem5ubm5ubnJqam5qZm52cmpmYl5iYmJianZ+goKCgn6GhoaCgn56fn5+enp+hoqGgn56en56cmpqbm5uampmWlpeZmZiYmJaUk5SUlZWTk5WVlJWWlZWVlJiZm5qZlpaXlZaYmJaXk5SUkZGTjJGQk5Z9eGphYmJcUDxAPDY4Q1ZIREI6ODs6Pjs3Nzk2PTo5OTY0Nzo7PD05Ojo7Pzs9PTxAPjs7Pjo9Pz0+QEE/QDw3O0FDRT8/REQ+P0REQz5CPTs8OzpnlpOTk5OTk5OUlJWWl5aXlpaXmZubnJubm5qZo6OioJ+em5qYl5iXl5eYmZiZnJubmqSAampveXNxl6CenZ2cnJ2enp6en56enZycnJ2enZucm5qampqbm5uZmJiampqZmZmYmp2bnJ2dnZ2cnZydnZybmp2fm5ycm5ucm5udnZ2cnJ2enZ6dnJ2dnZycnZ2bm56enp2dnJuem5ucnJycnJ2cm5uamZuamZiZmZiamZmanJ+fn6Olop+hoqKhoZ+eoKCfn5+eoKKhoaGfn5+fnZmam52dmpmYlZaXlpWVlpOSk5STlJOQkJKTkZSRj46QkY6VlpuYlZiUmZeUmJGMkI+TnJOSjIWMh4OGd3FnamRbXFFBPjg2QkdgQkVHQD47PDs6ODg2NTw4OjgzNDo2OT09OTk6PD07PDo8Pjw6PkA6PkA+PD9APz48ODpDQUQ/PkJEPz5DRUI9QkA8PDw6Z5iTkpKTk5KTlJWUlZeXlpaVlpeZmZmampqamqSioJ+fnZuamZiYmJeXmJmYmZydnZyofWdlc3t6c4min56enZ2enp6dnZ6dnp6enZ2dnpybnJuam5ubm5ybmJiYmZmYmJmZmZudnJydnp6enp6enp2dnJubnZucnJucnZ2dnZ2cnZ2en5+fnZydnZ2bmpucmZmcnZ2dnZ2bm5qcnZ2cnJyenZ2dnJuZl5WVl5eYmpqbm5udnp+io6GgoaGcm5ybm5udmpyZnJyfoJ+dmJmZmZSSkpSXlI+Pj46RjI2Ji5CLiYuOkZGPiZCYmJCSjI2LkpCPmJiiqKqmpaWso6ahmp6np7KoopWjoJ+Xf3BxaWxcW1xNRjw3N0dHWD5ITlRGOT46ODk4NzU9OTg3MzM5Njo+PDo3Ojw7Ojo6Ojw8Oz8+O0BAPjs9PkE8PDY3QD5CQD5BRj48QURBPUNCPj08OWaYlJOTk5OSk5SVk5WXmJiYlpeXmJmZmpqampqioZ+enZybmZiYmJiYmJiZmZmbnJucrH9qbXp/eXGHoZ6enZydnp6enp6enp2enZ2dnp6cm5ucm5ubm5ubm5mYmJiYmJiYmZmcnZ2cnJ6enp6en5+enp2enp2cnJ2cnZ2dnp+dnZ+fnqCgn56dnZ2dnJucnZ6bmpubnZ6dnp2bm5ucnZyenZydmpiXlJGOj5CQkZWYlJaUmJmam52Ym5iVjYyOjpOSkpGPiZCOkZGOj4qLjY2NiIiLj4uDjY2Rj4yQjZCTlZWcmKGgnJKfpKKkqZqbl5qco6mtvcHBury4vbq5wLy5ure6u7u0vbPBtX9udWZnWl5ZTElFOjtMSVM8VlJJQzpBOjs7Nzc1Ojo6ODI1Njg7PTw5OTs7PDo3Ojg6PDo9Pzk8Pz48PD1BOzk1ODw7QD9BP0Q9PEFCQDxEQz09PTphk5ORkJSUk5OTk5OUl5iWl5mYmZiZmpuampqan6Cen5+cmpmampqamZiXmJmZmZmZmamFcHV7gHdviaGenp6enp+fnp6fnp+fnp2enp+enZ2cnZybm5ubm5uamJiYmJmZmJqbnZycnZ2enZ2enqCgn56dnqGgnp2enZ6dnp+fnp6foJ6dnp6cnJ2dnZybmpicm5WYmpqYmJiYmZKMkJeUoJeTj4yNioqIiYyIk5GHkI+NioqQkIuOioyLj4iIiYmOkY6NhoWJhoqGhYuIj5KQkI2QkpeWkpqYnZOUnqSmpqqrsayvr6umq6qxubm1tLSurK+0wMjFxcG+xsPExMO6tb63trSzsLa1vqpwdHJcZl9dXUlGPz9FS0xWSVxMRD89QjpDOTk3Nzs5OTcxNzk4Oj44ODo8PDs5Nzk6Oz06Pj85PkE8Oz48Pjo5Njk8OkE+Q0FBPTxCQEA+QkQ+Pz45XIeEg4eLjYqJhoWBioyRk5WYmIeVlpaSmJqamZ6dn6CfnZqam5ubnJybmJaYmZeXmJuqjnp1dnt/eYKgn5+en6CgoJ+fn5+goJ+enZ2en56enZ2cmpubm5ubm5iYmJeXmJmbm5ycnJ2enp6enJubnZ2dnJyhoZ+dnp2dnZ2enZ2cmJaWlpiVlZKWmZaTkYqMj4+Mj42Qi4uPj5aJiISLkZmOfYWLjY+NjIeKjJCbjJGPj4uKjpOMjI2MiJKLjIWJjI+Gi4iHjYqFjISPipeQk5ialZuco6qhoqScoquxt7S5tbGzra+ysqWns7qxurq8tre2wMPDvb28tr+6urzBtbjAvrSvrqapr7eabnxnW2NaXV9IRT5BS0lTWFleQUY5OT05Rj8/Ojc7Ozs2Mzo3Ojk+ODo6PD05OTg7OTs8Oj49O0BAOzxCPEA6ODQ3PDtCP0FCPj47Q0REQENDPT4+OWGZlYuRhY2PlpKIeX17f4WLg4qCiomGa4B4kIuWmpGdnZSUkZOWl5qamJaTjZKTkpCbm4h2d3NxfX9ykaCdm5ubnJ6dnZ6goaCbm5aWm5yanJucm5iZmpiYmZqampaLkJOWmZiVmJiWm5yXlZKRjZKRkJSTkpebmZibl4+OkIuOjYKHi4uLiouIjZGMh4eGioiJkYqHjISFio2Lio2Ej5SQjIOQk5SZlY+LlJORlZGWlY6PkYyUjY6PioiPh4+Gh4mJiY2KiYmKhY2HjomYkpSam5eYoKGnoKSjmqqps7axtbCoqaKorq2fqq+wrbW5uLzCv8HEuLG1sK62s7C4vry6vL66s7OnsbfCkHWAY2JeWldSTUhGRVBJWVdfW0NQOkJDPUdGPzg3Ojo3NTU5Nzw5PDk4Oj0+Ojo3Ozs+Ozs9Oz0/QTs/Pjw/Ojg1Mzc6QUFAQj4+OkNEQz9BQzs9PjlnqaWiopmfoKKml5SIjYKIgnWHiIqIint7dnt6eY96iJJ+fXx6foKRhYGAfXN8f318hId+dHB4dnN8doGPiIiJh4iKjIyRmJyXiI6Ei42LiI2Qj4+LkY+LjI6PkJCOi4WFh4uMjIeIi46Lh4yFhoGNi4aKin+JioaImJGIg4iDgoV8i4uMhomLiIqQjIiLjY+Mj5aHiYuKjo2NjZaTk52cnJqWnJybnpuam5idl5ORlZaQkpGLj4uWlIyNioOLhISJjJCQio6KjYuKkYmNk5OTlJWTkpyZnpefoJ+loq+xqa6kpJ+YpK2mpri3rKy7vb3Cw8C/v6+lrbCwtLe4s7S4trS1rqy0r7i0toF5emNmYF5WUFFBRUtPSVxeX1RHR0JLTEJEQD04ODs5NTc3OTc7Nz08OT0+PTk7ODo7QDw6PTo+QkE4Pzw6Pzg2NDI5O0JAP0I+PThBQj8+QEQ7QD43YKWgmpedoZqhoI+Xl5+XlYKNoJ+joZ2ako6MjHJxcG92cW5wbW5wdm5vb3BocHFwdH5zcXJxd3tyeXZ3cnJ3dnp7eXx9e3+IgYSLf4+Rho2Li4aKi4uJhoSBhoKAgomRg4CDjH+Gj4uJhYCHfYCBkpCGhISGjYOEjI+Pj4iNj4eLiJGQlZGOkIqTl46PlZinpJ+dlZiWlqWfm52rpqq3tbiysaevqqemoZ+anZaSlZWRio+MiZONm5WNi4uGhomMlZCQkIuZkpWVlJuQmJOUjI2RjJaXlaKVnqapq6ejo6qwm5ymn6arobS9vrOzv7m7u7q5vL2uqK6xrrC4vLO0sbGqsKmosbGyqKV3cnRfaGFgVFZRSUpIVk1eXl5UTEpFUUpFR0M9Ojk5NzQ4NjgzODg9Oj08Pjs5Ozg6Oz88PD45P0M/ODs6ODw3NzYzNzlFPj9DPz03QEBBPT9EPD49OFSPjIaHh5SMlZmXnJaZlo2VnJaVnJ2goJ2amJZ4cW5tcnhxcWxucnBrcW9wbXJze3V2d3l+dXF4dnR3e3Juf3yBfXl4fX95g4aDhYKDkIuQi4uLjo+LiYmFgoF9f3N9iIB+nJCEhYWJi4+Ken19ho6NioaNlJGLkJePlJeSmKGWnpeVm6emn6CgprCroaOltbSyqqaqr6Kxtrm9wru5w768uL24tbGssKylm5KTmZ+blI+TlY6anZ2gmp+fl52jqqyhn56braGnqrCppqakmJGRlZSjpKKspKyztLOzqLe2u7iwsq+trbK3trqytbqzt7m7uLy6trKvrLGxsrO0s7Gxra6zsbOzrKGXdnFzX2NeUlFUTU9JR1hPWlxkVE5HVU9FREpEPjg6ODc1ODg4NTk3Ojo9PD86ODw4OTk9Oz09OkI+Pzg7Ojk6OTg2MjU3Qj4/REBANj4/Qj88Qzw9PjpOf3yCjoyMk5OXl5qPlJaNlpGRlJeTmpqeoZ2ccm9ycXFxcXFwbnNxb3V0cnF2d4B1d3x5hX53e3x5fX98gImJiYN9en+HgYiJgYCAgYaIgYaLhoiFhIiIiYSAgn96fHx9fpKQf4h4gYWLioOEhYqPjI2RmZ2UlJSgmpqfoq2xramkpa2vrKysta6+ua2uqbWwt7Grsbasr73CwsC+ury2sq62trG0rrq7s66sp6mnq6eiqa2gqaiir7C4tLG8urq6srS1r7y0t7O3t7u3ua2tsKmstbmxt7K0t7awu7u8u7q6vLW8uLTBtayqqqu0sbe4ubW2tLOwrKausKqrsLGrrK6wsrG0rqqjk3h2cmVnW0xSUEZNSFNXUmVeZ1RQTFxRSExSQ0E5OTc5NTg4NjY7Nzk6PDo+OTg7Ojo6PDw+PTxEPjk2Ozs4OD45NTE1NkJGREQ/QDc+PkM+OkE/QEA7S3+CiZeYlJ2WlpuYi5KWjpeRkZWXlJmXn5uZnHx0dXZ1eXVzdG52cnN0dXZ3fX2BfnqBfIN+gn99gH+EgoWPnZGJgX+Cj5eOjoeCgIGIi4V+ipCLf4eNjIuKh5KKh4aNkZORkYSHfX2DiIyOi46KiZCPjo+UlJiRlZuanZ2orrKvr7W0s62ytbiwvLW1saqwqrO1tLu3tLO2tLWvuLi3raeipqywsK+2t7e+tbm8s7KxrrW7sLSvr7K7trG4wL20tLSzuLO8ura0usC9ubq5ur65ubm+tbKxr7KvqrW0sbOxtLOuuLi1v6+kpqijq6yxr7OurrCwrK2rqquioqaooqetq6qlrKeip5h4eXFmZVlPT01JUk1XTE9fXlxOVVRiUURUTTs/OTw4OTU3NzU3OTU6Ojo5Ozg6PDw6PTw+Pj8/Qj04Njo6OTpAOzUyNjZBRkNDPj83Pj1DQjk/Qj8+O0uOkZOYmZWZkZOimJOSkouTi46Qj5WXlpuVlJuGgn16eHZ0dHN0fnd6d3aAgoOGi4yEhIWKhpCJh5GTlpGNlpqVj4iMj56YlpWSkJOXmpqYkJ2gnZOXmqCZnZujoJWQm6Cko5qTjYiIi4mRkY6RjouYmo+PjJSal5ycm5+cpKy0ubq8r7a0uLS0sre4ubOrr6qorLWysrWusauuprezs7Gloai1sK+trKu1urK7urq0sre6vru5sbiwua2osri7rq20tLe1u7a2ubm8t7SvsbS3trmzt7WmramrqKivrKmura6norG0sbSrpqinoKOrrqiqrqissrCvr6mooZ6hoaOmo6CimqWjnqiXcnduZ2JVS1RPT0pDUEtfYlhaUVxTX0xIUUlBQDk6ODY2Nzc1ODk0Ozk7OTw3Oz46ODw8PT9CQEE9OzY5OTk6Pzs2Mzc4PkZCQkBCOT49QEM+QEZCPjhHk5aRlZOSlJCRn5mdmZWQj5KSjoyTlpaSjpGVkZKQhoF5cnN1e4GEjoeFkZOSmJycmJWQlZijnJqhp6qpn5yWl5WdoqKhnJmemaWorK+tqaeqqainoaWoqKupqa+hm5+ho6Ogmp+gnJSNmJSYoKChpJ6bmqSnpKmrrqylo6irr7G0rqqsrrOvrKy0s7S5rq6trKqssrCwrbCoqqaytLS4rqq2urCvqq6ssLezuLS3tbS7vLi1tbG1q7KsqLKzu6+tsbK0trWxsbSzs6+sq6+ztrSxrK60qqqmpaetq6ioq6mqqJ+ps7Cqp6mlo6KjsK2ppq2lqKutrKmlpKKgpaKlo5iZnJWeoqKml251ZWdkVk9YS0tKS1NUcGJZZFdfW1xSWlBMQzw4OTo2OTg3NDc3NDg6PDo8ODo9OTc8PDs+Qz9BPjs5Ojk6Oz49ODQ1OEFERURCQzk+O0A+Qj9HRD43QpKblJWVlpWPjpaXmpmVkYqTlJKOj5KRioqJjZSXmpONiYKGjpWRlJ+am6Kfn6OeoaGfmKOkp6WlpqmpraupoqakqKWkoZ+eo6OtraytqKuurqqqq6ShoqWpp6epqKOinJubpKClqKOgmJ2Zn6GiqaegoqKurKuqp62uqKWkqampqaajqKqpp6SnrrCvs6+rsKuqr7KvsLO5r6uosLGusLK5s7Svra+1sKyzsa6stbW0tLOzsK+srKqsq6yvsbSzsLCusLCwrKqtq6qrpqWusLKwq6apsK+po6Spq6eopqimq7Crqa+ppqippqWjqLCtqqmooqmjpaekoaGgoqWhnZ6XlpiUm6CkqZRuc15qaV9VWk5STlBPUmRcZGNbXFlcUFlPS0A8Ozk6Nzo4NzM1MzM4Oj05Ojg5Ojk6PTw8QEQ+QD05Ojw8PD47Pjk1OjxCQUVBQ0E5Pjs/QERAQ0JAN0CRnpiUl5mWkYeLlJKXkYiDiYuTj46QjYeHhIWVmZaYl5mWmp6inZqcoqShoJ2fmp+goaCmoaCgoKOjoqWoqautqaqmo6aloKWgpqimpaeopqmoo6emmZykpaKhoKGhoJyYmZ+goaSkop6elqCbmqKioKGfoKKooJyfoaWhoKajop+koaymnp+hoaSsqqesqK+rp7Sxrq6vtbKsqrCrqa2ttbCurqyut66nrKqkqK+yr6yrsq+qqqmrq62prq6usbGtqq2pq6enq6ipq6KdpqmoqKWoqKyoqKWkpainqKimqayvr6irqaGioqWjo6mrrKaopaOooqGgpJ2dn6GhnZudn5qZlZyco6qUb3NmbnJkXV1QVU9XT15kZGxnYmFaWlJUT01BOj06Ojg7OTUxNjMyODg7OTk5OTs5OTw7PT9DPkA9OTs6OzxAPT48OTk8QUFFQUZBOj07P0FBQkFFQjg9ipaUk5ialo+IhI2OkZKMiIiIj4mJkJGOioqIm5uZnKCloqWeoqOhmp6hnJqdnpuco6inq6Cgo5ignZecoaOjpaOioqSsqKWpoJ6mqaerqaSfoqCipqGmraamnZ+fn5+fmZqcnKGgoaSfoZudmpygnqGfnp6go5mWmpijoqKkn5mcoaGioJuanqChpKCdp6Oqsaiuq6yppKqqq6ispqWsqrCzr6urqbCrpqmlpairrKemp6+rpaerq6mrqKuqqqutqKWoo6alp6yprKiinKSho6ajqqmopqejpKeopqeop6moq6mhoqijnJ6mpaOoqKejpaWmqaCknqKel5idn52ioqWemJSVnqCjl3V3a3Z3YV9cVVlRVVZbY15yYGhfY1NRWFRIPjw9ODs5Ojg1MzczMzQ3Ojg5PTk7Ojk8PEFAQz09Pjg7PD08QD9DPzo4Oj4/Q0BEQTo7PjxAP0NDRUM5PIKYmZ6dnZqVkoqJkZGXkZCHhImCgY2Pj5KPjZydn6GkqaWpp6israaiop+YpKajpK2xrrKnpqybnp6bmqOnoJ+jn5+ir6uqrKioq7CpqKmooZ+gp6mtsLKvrKOipqGppZ6ko6KmoKWkoqWjnp2gnp+loqKen6KYlZ6anp+koZuVmKChnZ6cm52dm5mZlZ6fo6ienaKooZqho6aipKipqqirsLGopaWnp6ikpampqqeipaaopp2epaWioKWlo6WmoKOlo6Olp6Wpqaqkp6SmoqanpKupp6ekoaWorKempaWjo6iklZ2jn5udoKOpp6imoaOjqaigqKKgnJWRmp+goaaim5eSkJqaoJV8d299eWZbW19eWlxWXGhkb2NtaWhiXlBQQD87Ojg5ODw7NjM0MzMzNzk5Ozw5Ozs5Pj1CQEA9Oz04PD1APTw8Q0E+Ojg9P0Q/Qz46OT88Qj8/QURCOTqAnqSnop6bn6CZj5mdoJaWioaPiISLipOXlJGjpaeqrq2ss7KztLi3ramqp6+0srGqrq6xsq6xraWrs6yxsamrr6urrLawtLCrsbKxo5+iqqmnrre2tLS2s6+sq66rtrCpsrGtrqemnqKjo5udnJeiqKWhn56jm56hmpadpJyblpmip5+gn6Ogm5SWmZaXmp+gmZWeopmYnZ2lnaCkp6qpqKqtrKWppKWpp6qpqqynpKSko6KZmaGempqhoJ+lpZiepKakqqiip6Wloaqnqaenp6OopaaloaSop6yip6ShpqWlo5WXnZibmZWjp6WlpJ+dnaWjoqqjn5qZmJacnJqhoZqQk5OXmJuNf3dydnhpYltfXlxiWWBkbm1rbWFfZGBQT0FAPDs5Ozg6OTYxNDM2NDc3Nzo9Ojw7OT09Qj8+Pz08Oj85Ojs8PkJFQD05O0BBPkM8Ozk/OUBAQEBCQzs5e5qjo5ygnZ2inZmfoqKgmJuYlpiSlJCbmpaXtLSutbiztLi2t7S4ube1ubi5vby4qoucsri8tL26tbu6u7izur+4t7m7sbevqK6yraKcn6qyuLy8vbu6v7SvsbO1tLe3r7W0tbKwqKSin6CXlZqXpKqmpqGko6SrpaWYoaSjnaChoqiho6CloZyTmZiYmZyjnpyam52Xm5mWpZqbn6Goqamoq6+vrqmoqausrK2rqKunpaOgnJ+jo6OfoKKlqaaanKKnpKmfoaOioqClpqempKign6KkoaOiqKino6WgoaimpqWjmZuYm5OPoaSeop+YmJWgm6GloJ+bm52cm5qZm6CajZiZmJORhoB2eHl4Y1tSWVRfX2FsaHVrcGdpaWJZU0xAPDo7ODk3OTc1NTYyODU2Nzg6PDs7OztAPj9APT4+OTo8OTY3PjtCRkI8ODs/Q0NEPD45Pjc+QUI/RkM7OHCSmpuUnpubnZWXnZ2ipqOilpeelpeXoZuUmL63sbi5tre3uLuXlLa9u729wMW1oruYoLe/v7rBybSdu7aytr/FwaigtrO6saqutLGwsbS0try8vry8vca6uLe6vbSvtbGxuri3srOyqqamn5ikpKeopK6kq6u1ta6zoKeqrKeqqaWmoKegoaahk5aYnZ+ipKOdnpyhoKGdl6SamZ2gpqqqqq2ura2wsausraypqauuqKalpqWmpKSmpp6jp6mkoZygoqOmoKKjn6OknZ+ipaCknJuhnp+joaGlpKWpo6SloqSnp6GfnZ6Wk5ygmJmSj4yMl5afm5acmp2cmpKWlJSYk5CanZiKi4eAgHyCeGFdWVNhaGBmc29zaXRjaWRiW0xLPjo4ODk4ODk3MzQ1MjU0NjY5PDw7PTw/QT9AQD0+Pjg5Ozg2Nz85QkVDPDs8PkNEQz1AOz03PUNDQEVCPDdnjJGTipqVmJuVlZiboqerppWXmJCVmaGel5e+tbO0u7q5uLnCh5i3q7i7wMLFs6PDp7izvb+0xMe9tLu4vrbAxMSuoLCitba1vb7Bw8bDw7m9v8DAvb/Evby6vb60p6qYscC9uLW5wLOvr6qqqK2np6Svp6q0vLG0taivsbCvrKqipqOsn5+mq5eaqJ+lpZ+gnJ2gq7CwrKKrnJiboKivsrKzq6iut7Wyra2ppqWoq6WlpK2ppKGfoKeenqaoqaaen5qeoaWmqZydo5uXoqaam5qdn5yaoZyZnZ6gqKOfoZ+dpaKgo6KhlJmamZOPiouEjZCTm4+OmJWbl5iQk5GSiY2XmJiTi4qLfYCAhXBgYV5eamJibnd1dm5sW2JRVVxNRzs8OTc5Nzk6NzQ0NDE0Mzc2ODw7Ozw8QEA9QD8+Pz46Ojk6Nzo/PkVFRTw9PUBCQkJBQjs8OEBDQ0BEPzs1X4yMhoWWi5SVl5iXmJ+mp6WWlZaRl5ufm5qXubG2s7m8vLm6taqyvLG+wbS8x7m4u66/p8bDv8rGycjFxcm8wsfHv7Gxp7y8vsXExsnHxca7xMDFxsC5r728wL6+s6uqjLO7vrS1t8K6ra+wtaqrpqqjraSnsbartbKts62orq+nprCvsq2qr7Okq7Wpp6ikoKCeqbK4vrW1taqppq6yt7i3tqmruLy5t7Gvrqeio6inpJ+oo5+eoJmhnJ2ipKenoZ6Um5qgoaWeoKGelqOdlJCWmJuhmp+Wk5GWlKKfmp6cm52hnqSfnpWcmI+Sk4+MiZOQl5+JkJaRm5SYkZGVloOMlZeWkouMiHx/g39qZmhha2xmbnVxcnVxZl5fXFJJRT86Ojo3ODQ4PDc2NTQyMzM2NTc8Ojs8Oz1APj9APjw9OTk5Ozo8PD5CREU+Pj1AQ0NDREQ6OjhBQkJBQ0A5MluTiISNkYqLkZGVkJKanZ+ck5KYlJ2dmpealbaxubW1vr62uLW4s7y8xMS6w8fBv7SzxcXGv8LNx8vOy8vHwcPGx8jKxcTFw7u8vMHFwcXFv8PCxsXAsZO+ur/Dwra2uqm0s7Spq7O7u7Gfm7GvrKSsrrSnqqmoqq2sqaWlnqmvq7K7uri7t7m3s7m4s66ss7SqsLW5vcG6vr68vrS6ubi7urKxtLy7uruzs7KnpKarq6KhoJ2am52anJeam56cnKCdlpyWm5mdnqKjnZSckI2Jjo6RnpuclY2HkouYmJaanJuYnJuenpyanpSOmJiak5GZl56hlZiakpeUlJGUmpiTj5OdlpKLkX56fH90a2xuY29saHF3bnlpaWFcZ2FRRkRBPDk5NzY0NDo4NDY1MzMyNjU2PTk5Ozs9Pjs+Pj07PTk5Ozs7Pz1BQ0FCQUA8QENDQ0VCOzg5RD8/QEI/OzJXm5CRkJCHhZKOjYiNkJOVkY+NlJSblJOWmpGzt7i4uL67sLWyuLa1tsDDwb7DwsC+u767u7zEzMTM0MrGxsDFx8vI1MvKyMa/u7u+xL7FyMbGw8TDuLTAt7S8wcK5wre3v8C7rqWut7y3rZyjt7CmrbS1rK6lpaOopKCgpZmqs7K+wb66ubq4tbSysbS0s7rAvsC/vr27u72+wMK3tre2u7uyu765uLi7tre0rKipqaumqKOek5qanJiRkpmXkZGYmpeemJaTlpybn56Uk4mJfoaIi5aUmJmRiZWRl5aVmZualpiXmJ2enKGYlZmZm5iXnJufnqOcnpaYl5OXnJmZnJSWnZSWk4l2eXp7dm5raWd1WmZyd3N4ZWZdZFtSWElGPzs3ODg3NjE2OTc0NDMzMzY0Njs4Ojw7PTw4PT48Ojs8Oj07Oz4+REFBREJAQEFCQ0NEQz05OUJAPz9APz0yTJaalpKTjIqYkIuLjI2SkoqIho2QmIqPkJSXs7u1tr+9vbG2uMG9vLS4v8GxuLe+wcW9u7zCxsm/yM7JwcTBx8rKxsrFzMjNxsjFv8PAy83PycbDw8TCxL24vsHDwMS+wc/Pzsarr7a0taugp7Szrqu4tbOrqaOiramspq2frLW0v8K+ubi9trCtq6yvtbS6vsW/u7y6s7m7uLm5ta2wtL27sb+8uLK2ubO5u7StraisrKqpp5eem5qVjYyYlJOLlZaUnJmXlZaZkpifmZCKin6JioqRjpWXk5SfmZaQlJmYmZaYk5SboZ6hmJianZmZlp6emJuimp2cm5iam5mWl5eWnJmUnJh+gHh5dXVlZWlpZ11pb214d2JiYGBdWFdGRTg6ODo5Nzk0NDk3NjY1MTIzMzQ7Oj0/Oz09Ojo9Ozw+Ojs/PjxCQENCQkVCPT9DQ0NDREVAOTpCQUFCPkJBNUKQl5SVmZKPmpCOkpGNlJWLioeMjZSIiY+Smra7tLzGwcTCvcHFwsC0s72/rLCvusPKw8K+zcjFt8HIxb/BwsjLysLCxMnMzc/PzMPHxsjIyMfJx8XJx8jHv8XHxMTHyMrSz9LMvLi2tLi4wb6+ur26vLq8rK2mqbu6ubfAsrW4ssDGure3wbOxra2pq7Wzu7bDtra9tbG3vrazt7iwtba/u7C9urSrsLGxs7y6s7Ouq62rrbGdo6OgmpCOmJeVkJyWlpiWlZKcmZObn5yWkZSOlZCJjJCVk5SbnpiZkpKcl52UmZKTlpmYnZWcnp2jnJWdn5OcopycoJ+do56YlJWXl5uamaCQf31xdHFvYmBndWdpaXRteGxdZFtVX1lMSEM2PDk5ODg6NTM6NjY0NDEzNTI1Ozo8Pjs7PD08Ozw9PDs8Pz0/Qj9FQUJDQz5AQUBFRURFQTs3PkNCQj5DQjg7j5qRlpqUkpSNkJSUjpWUjo+LjImTi4iQk5u3wLrGxcTDzMLBxL2+ta+3u6+vs7rAx8XEwczLxba5wMLCxMfK0cvCw8TGycXN0M7HzMnCwcbBy8rIxszJzcXGxcPGxcnN0M3PzMfEwMPCyc3HxcHEx8G7vrSxsLDBvr/Bxr++uLfDwrq6tsC+tbKsqa+yuL60wLS0uLS3ucS5r7y+ub6/wr+1urarqqyur7C3vry2tK6tra61pKWoqKaanJydnJ6inJ2Zk5CSnZWYoJ2YmJWZmZmXjoyUfZCQl5+ZmZiTkZOgjo2Sj5WOkJSVop2cpJ6bnp6WnKOgoaKko6SinpqZm5ucnZ6cg31yfHhwZ2BqanZsaWR0bnNiXGJUV1RTTUc6Nzs5OTc3Ojc0ODc4NDUyMzQyNTs6OT46PTw/PTg7PTk5OT08QEFARUJBQkFBP0A/REVERUA8Oj5CQ0JAQ0E6NIChl5SZmJWQiZSTlpOJkYyUkY6IloqLkJecxcvDw7zAw8fBub29u7i2t7eusre4vMDCwMLHxse6vMDCxMfIxtLJwcPDv7++xMvIysvIvLvIx8nNyMPIycnFxcPCwcLHx8jKx8zIx8jNxszPxbfAwMDAu7u9tbOzv7+5v8O5wLe7wby6uLu5vbuysK+wrLnCuL25t7W3ur3FvbjGyMLBwsbCvby1qa6usLCvs7q3ubawr62vs6mmq6mupqeepKWjo6OioJuVmJ6Rl5yXkZGVl5mVmZGUmJKVjJijmpyenYWJn5N8kpaVkpSUl6edoKKkn56fnp+hoaSioqOho6KcnZ+eo6GmmXl6eX9yb2ZlZ2NqZGFqbW5uXlhcVlVOUEpGOTk7OTc2Nzc2Mzc4OTU2MTM1Mjc8OzxAOz88PDo4Ojw5OTg+PUA/P0Y/QkFDPz1BPkBEQ0NBPDk8Q0FDREFAOjNsop2Vl52Wj4+YmJmYiJKNkZWQj5WOjpOWlsrLu7m6ucG7ure+wby8u7mxrrW6uLi7xLq+wL6+u7zAxcHGwr7Gwbm7w7q4uby+wcbBxrq5ycnDxcTAxMHCwcTBw769wsDAwcLLw8bMy8XI0MKwvr24uru8vre0sLm+s7y+sbm1uLu2vLO1uba5trm3sa26wbq8wb+3vsS/xsPDx8fCu8DCv8K/uLKzs7W0sa63tLe1tLGsrbGnpaWnsK2on6erpqOopaamoKCflJiZlJGRlZSXk5iXmqGdnqGcoZ2hpaCWlJuRl5eYmpOemZmppKWkpZ2ioJqeoKSio5yioaOgnpyenqmlqJV9e4N4bmZhZGJhYmNjamJmYlpZWVxYUU5FPTs5Ojs3Nzk5NjQ5OTo1MzE0NTI3Ojs6QD0/PDw5Nzc7Ojk6PD5APz5EPEJBREA/Pj1CREJCQj46OUI/QUI9Pjg1WZ+cmJOZlpGVmJial5CRkJCTkZOUkpKSlJTFx7i1urnCubm8w8XCuLu5sbG2vLq1ucC7u7m2t7S0tb+6vb+5vbq6tL+4tbezr7u8t8C3vsK/wbu/wLy7xb67wcTAvr64vMHBy769ycTAwMrAscG/u7i7vrm1t7S4vLS9uLW0sLO8sbe2uL+2vbm9vrm3ur67v8DFvb3Lw8bDxMDDvra5ura/uLu/vLi2s7KrsLCytbOzrqyrp6aep66tq6Koq6amqqOnqKqjn5ibnZuamJycmJecm6GlnZqeoaGgoaagmpucmJugn52cn5ygqKGjpKSdop+aoqCin56XpKGin52amJ6opaGLfHmHfXFjYGJiZ2pmZmllaV1VVVNZT1NLRTg/Njs7Nzc5OzY1Ojs8NjMxMzQxNzs5OD89Pjs8Ozc2OTk4Ojs9QD8+QD09P0I+PEBBQ0NBP0M9OTY8QEFAPD04N0mUmJuPk5SRlZiVkZaSlZGQkZSVlJOSkpiVwcLAury5vra4vsTAwrG9urK0s7i8tbe8wLy9tLSxsLW3tbrBuL64v7y9t7W3sK64trm/u8DAt8G8u8O2usi4trm7vbm6trvFxcq9ucXAv7zBvrjGvcHAvMW4tre0uLa2u7u4trS3urW0uLy9ub+5w8DAu7m8u769yMS9x8TDusC9vraytriyubS6wsK6t7KxrKyrrbKvsq6vqKOknqusrKqkpqSkqKqip6atqKGhoaafo6Kinpucop+go52cm6GfoqCkoJ6bl5mfoZ2dnp6hpaShoqKhnqGjnKKeoJmdmKOfnZ6gmpmgoqadhHqDgHhwbWVlZm9pZWtnWFhOS0tKUklMSEM5Pjg9OzY6Ozk2Nzw4OTg2MDQzMTc5OTs/PT46PDo4ODk8ODo7Ozs8PUE+PT1DQTw/Q0NEQD8/PDo3PkJEQT9AODg/iZiajIyQj5OXlYySkJqSkZeYlpSUkpCalMO+xsHBvLy4uLq/t7yxwra0vLG0trizur2/vbyyra+ssbC3vLa7vMDEube3t7a6ubq7wL3DwLrEwr7HuLm4rbe1uLq0t7O7xcbLwbvGwMC/vby/ycPExb7GuLWysr24uLi+urq5vLu6tLe7urm/vMTAv7m6uL+5u8XGvcXDwrK6vbuxr7a4s7ezur7Aubassauuqaqpraqqrqakpaeuramlo6KjoaSlpaaipq2joqWjn6GjoZyanKGfoKWhoJ6dnKCdpaCel5WZnZ+fnaCfoqaloKSenJufo5+fmZyZnZ6knJaco5yeoZymln5/hnxrbnBncGtzZWJsX1tUSEtKREpCQ0c/OTs4PTw3Ozs5Nzg7Nzw8NjI3NTE2OTw8PTxBOzw6Ozo5Pjk6Oz09QD5EPz0+REA/P0FGRD8/PD05Nz9BQ0JAQjk6OXecmIuHi5CSk5aNj5Oak5CdmJKRjpCOmJK9t8e+w769u768vba6uL26t72zs7C4uLW5vLzAt6qtpK6wt7uzvb67xLe2uLa3wL/EvMLFxcfHysnGz8LBuK+1tby+uLuyvsTEysXBycPCv7++vcfMx8fEx721tbbBvbq7v8K6v8G/vba3vb29wcHAv7y5t7zCu7e/xbvCv761t7y8r6+3trC0s7q5uruvqa2rrauspqqip66opaqtra+npKCfpqOeoqOoo6Oro6Kinp2bm5uUlpmcnJ+lnp+emZiel6OgnJeZmpmao6OinqOjp6CmoJudoKOenZagmZygoJuUl6CfpZyYopCBhoFxZWxpbnRud2NnYVtiUEtUSEVFQ0dDPDs5OD06Nzo9Ojg5Ozc8PTUzNjUwNjg5Ojw7QD08Oj48OT45OT0+Oz8+Qzw/PkA/PT8/RkRAQT8+Ojc/QENDP0E9OjhmoZiPi42VkpWVjo+WmZWXm5WOjIyNj5uTubbBtL+8ubzDwL7AurW2srLAuK+yvLywt7u2u7yrqqOwub2+s7y+vMW4sri5vcfJysPHyMbGycjMztHMysW1usDDyL+/tb/Av8bGv8vGw7/BvMDDzMrHxcbBub28xL/Av8LIvcfHxcW8usS/u8G/usC8u7vAxL23ucK5vr23tLa4uq6vtbGwsLK2t7S3rK6sqqysq6iroaazqqWtr62sqKmlo6Snn6Kjo6ehp6KinpydnJqZjJCWl5mdopmem5WSnZShoJ2Znp+YmKamop+ioqaip6WioKSjoZudoJucop+XlZWenqSalp+JgYOBdG9sbHRrbG5fYl5hYU1ITT9FQD9EQzs7Ojo7Ojg7PDo5PD45Oj40NDU1MTk5Ojk8O0A8Pz09PDg8Ozo8Ozs/PkM+Qj5APz0/P0VFQkFCPzs2P0JFRD1BQTo6WZ+Yk5KVmpWak5CWl5yVm5mWlJWRkpOdmba4trG6u7q+wbm5xru2tbKlvr20tsG/rbO9tLjBsbCxtLzDvLq6vrzEv7e9v73HzMbHycbGv8TEysjMzM3LxsLDy87CvLm9urnAw7/IxsTBwb/FwMrJw8PDw7nDvr25v7zCxsLJzsfGvrrGvbq/ubfAubm+wMK+tbS8uLa7sK+ysrWvsK+urK6zsLOyuKuxsrGqsKurrKustq2orK6ypqusqamhpaClpqSspKahoKGeoaCdoIyUl5Obn6aZnp6Zk5idn6CenZ6im5inraiipKCgoqqmqaGooaWboKCdnaOflJiYop2noZ+bgnt6h3ptbXd7X3BjW11fXlNJPkJFSUJDPkM7PjY5Ojs7Ozs7Ozs9PTk9NTY2MjE4Ojk7OzpBOz88PD43Ozw7PD09PD1APkFBQT4+QUJBRUNCREA8Nj5DREU+QkQ/O1OZm5mYnp2aoJqWnJmfkp2VnZuglZaUmpi6vbSwu7zBxMK/xca6trmyo7u9tLfEu7C1urW5xLi0vLa6vcG8u7+2v8G/vL+6wMvCx8jAv7y8v8XCx8vIwcPAwMnKwsC7u7C0u73AxcbFxb/Awr/Lx8LAyMC6wru6s7q6wb7Ays7KxL21vLy5v7m5tbWzv8C+t7SztLitt6qvsLCysa+rr6evtq6ysbmutra4tLOwsa22tLqxrqyutqessqytpKOhp6eosquqpaSnp6WloKaXm6OfpKatop6jopqdpaKin5+hpZ6esLSwpKWen6Spp6+nqaCroKKimqKknZqeoaanr6mxlYJ7fYJ6bXN4c2dwXVpeXFlRRURDTUlBRD1HOjo1OTs6PDw6Ozs7PT86PTU0NTEyNzg4Ozw7Qjw/Pjo7Njo9Ojs+PT9APztBQUE+Pj9CQEFCQkU+OjU6QUJJP0BCQDtMmp2dnp+dmJ6dmZqanJKglZuen5uVkZGWxb66tsO8xsK+v8jFt7W4t7a5u7Svt7aytbO3uby7tru7vbrDu7e9t7nAu7q4uLXFwcPDu7mztLrBvb/HwLnAvL7FxL2+ubKwrri3v8PHw8S9vb+/w8O+v8e8vL+0tK61tby+v87Ny8K3sri4uL25u7G2ssjAu7a0sbC3rLOpsK2ts7evq66qsbWvsa+3s7q6wL+2t7ayu7rAtbKts7essLqvsqWipausr7mzsqiwr7GvqqKooaStqK2ss66fqKempaarpKSepqqjprK4s6ulnJ+npqeuq6qlsKWlpZuko5ifp7Gstbiwso6EeX98d2x1enBtaFxfX1lTUEFFSEdLQERDSDw9Njs5OTw7Ojo7Oj0/PD01NTYxMzY5ODxBPkA7PUA7Ozk8PTg6PTxAPjo6Pj0+PT0+QEJCQkFEPTc0NT1ERz1DQj88RZSeoKCgnJeamJiVmZ2ZnZ+anZuclpGPksPAwr3CvMS8vLvFu7ezt7a2u7uzoJa1rK+xtLS0tri5wcC3vbm4uba1v7O0srixu8HAw7e3rbC1uLi4wrq0u7e7vsC7u7yur66zsrnBwsTDvry/u7q4tsHCtb+6ta6vrbC9wLnPysnDsa+1tLS9ur65urvKw7u6tq+wvbG4r7KzsLe9tq6vrrC3sKyssra9vMTCur23tsC/wbe1sLaysbO6sbGvp6uvq7a/t7WpurO1ubGnq6intq6ysbW5qKysr6qvsKqop6yxrLK2vbSxrKSoq6ioq6yrqLappqiepp2Yo668sbvBtKaJgXyCenJ2dndtcGBeZV1bVEo8Pj9GRj1GQ0M5OjU7OTk+PDw6Ojw+Pj4+ODgzMTU3ODk+P0E/Ozo/PTw7PT05Ozw5Ozo3Oz49PUNBPz9BQkRCQTw4NTg9Q0Y9REQ/PD+JnZ6fnZeXlZSTlpmem5uam5iUnZSKjo7BvsPCvr6+uba6wLG1sbO3t8K1s6uts6iprrWvrbS2ucO/t7q3traytMC2srS4s7rAwcO5t7KysrSyt766s7WyvLq8trq+srS0tLC4vsPGxMC9v7mzr7K8uq67tLOmq6itur64y8K/vqyrsK+zure5vrvAxcG7vLewtcS1v7S4u7S7w8KztraxuKyppauyvbe/v7u7t7G8vby2sa+rq6mts6+wsKuwtKm4wLayqbS1sLe2raymq7uzrrS4wrCxsbWxsrWxrLCyuLi5uL60sbOurLGtqa+uqrK4rq2tqKehnqm2v7i6v7CWiX2AfHFzd3R2cWxeYmBbXU5IQT89SENGTURANzc1Ozo5Pjw8OTg9Pjs9Pzo4MzI1NzY4Pz9CPzo4Pj49PDk8OTs7Ojw7Ozo8QD5CQj1AQT9CQj88Ozc6PEFEPkJDPz5BiqCboZ2UmJWVk5ianJablZqVjZuPhIiGu7S9v7u8ubezvLyss7K0tLbAtcCvsrOqqrG3ram5s7fAvbu8uLa6trHAure5uLm7wcHEw7u7trS0sLa6trSyrLy5uLW4wbq4s7Gst7zBx8O/ubq1rqWss7CmsK2onqCfpa22tcK3trSlqKuosLazsrq1u7u7tbi2sLXEsr68v7y5usXIur2+trGnpJ6hqbGutbi2srCrtLe2saimnqCZpaakrKerrLapr7qxraSmraWrsausqa24trCyuMG2sbG1sa+7trK3tbWyvLW6srCxsq60sqqurae4tbK1ra6qqKiyur3AtrSpjoJ7f3Zve291cm1iXGZYXF1STk1BPkpCQEpJQDY2NTs3OD46Ozg3Pj48Oz86OTMyNzU3NTw8Pjw8OD4+PDw5OTk7Ozs+Ozs5PD4/QT08QkA/P0JAPjs2NzpAREFDQT9BQomgnaWglJaYmJWeoJyXm5iZkYyZiYOGhLWvtLu7tLWwsba6rrC0s6+1urW6sLWzsa22uq6svLK4ube7v725vsC0v7u8uri+wrzCyse+wLi5trK0trO0r6y7uri2ucDDtq6uqrK2vL25trKxra2fpKennaOmnZaZmZqfqa65rKurn6WopKuurqevrK+xsa2xrq6wubC0vL64ubjHxby8u7ipopyYm5+npqyxrrKppqmqrqmimpeXkZyamKOeoqKvp6Sspqiamp6aoaenpqepr7ayq7S2r6qwr7GpubaxtbGurLeztq+uq66rtLWtr6ursa2xsqitq6uztbe6vbCroYt6gnlxdnNtdGlrXVtqVFxcT01IREZMQUZNRjg2NjU6NTo+ODs5Nzw9Ojs9OjkyMzY3Nzc+Oz0+Ojo/Pjw7PDo6Ozk7Pjs9OTw+PUI8O0A/QD9BPz46NTU6QEVCREFAQkGIn6KmoZibnp2apamYm52amZSMmYeGh4aura64ubGyqK6vuLKrsLCqsrW5ub61sri0ubq1ubu1tbO1u7zAu77AtL+5ubqxusO8wsrFv7u/v7mztLOxsa6wubm2vLi7v7Kysq6xrrmvqqutrKOooZ2dnpeYoZWSlZeQmJ+orqSjpKCip6Kjqamhpqelqq2nrKeop6yrrLK7tLO0ubq2sratqaCalpabnZ+rrKuvo6Ojoamgm5OOj5CTkpKZlpqdpKWgn56nmJWSlJiepKOhpaqsraKpqqmkqa2upbSxrrGtqqmur7CtpaaqpKizrq2sqaamqaumqqersqyvs7GrqZaBf4F3cnhodHNuZFRgY1dcUU5MSD9IUUNNQz04ODc1Ojc8Pjo7PDg5PDs7PDs4MjQ4OTc4Ozs8Ozg8PT47PTw6OTw6Oz09PDo6QD08PDtAPkJAQT8+OTU4OzxGQUNEP0FBiKOmoqOeoJ+nn6iqm5+bnJmYjpeLjY+Mqqmosa+wraWnprKvqaaroK+wu7W9vLfAwb68vLy5rq2vsrK6ure3tbW8tK+0q7a6uMDEwbu1vL24sq2zsK+srre2srS0r6qknpucnJ6oqJ+gqKmfoaeWm5eXj52Tj5CWjpebpKigoKKioqWlnaOjoJ6loKSspKaopKKjo6uss66prq6up6qtqKyhnJqYmZibqaiqq56lopujnJSQjI6PkJOQlpWWmJ+enpqYppeTj5KWnaKgpaOmpKegoqSjoaGrq6SyraqsrKejrK6tq5+hoqSkr6ysqaajoqqkqqqkqaumqayrpqCIeYN8dn95YnZsblxQaFRQTkdPTExDT1FAPjs+Mzk6NTs5PTs6OT05OTw7PDw7OTM2OTk2Ojs/PTo4Ozo+PDo8Ozk7PTs8PD0+PEA9Pzw4O0BAQT8/Pjk0OTw3QUNCRD1AQ46qpKOioaKdqqSmqKahnp2ZnY+YlZOQlaekoaaoqaWkoKGnq6Gcopunq7WyvL3AwsLAvsC5taelrKqotbKxsK6vsqemr6OvrrXBurW3sre2srSrsrSuqquvsLK0rqWekpiUj5mgn6KgnKSln56olJuWl4yXkY2Ql5OYnaKqn5+foKOlqJyfoKGcop+jqKecp6GgpJ+sqKysoKmrpqCkqKaso52enZmXmqumqbCjpaeeoJyVk4+PkZCYkJaVmJefmJuZm6OZl5SVmp2gnaeopaCjoqGjnp2gqaqlrq6mqKmhoqquqqehoKKjqayrp6mmpKGpoqWppqWkoqakqKOSfX2AdXV9bWt7ZGhVUWNNSUhHTlJNSk1HO0RAPDI/ODU5Oz47OTk7ODo8Ozs7OTk0ODs4Nzs7Pjw6OTw6PTs7PD05PDw8Pj09QT5AQkA9Nzo/QUJAQD84NTU8OkBDQEQ+QUaWrqSipZ6joqmoqKmqpaaenaKYmJmZlZuinpueo6Kgo6ChmqCYmJeWoaisrra3urm6t7e7rqigoamhoK2rqqappKmjpK6lrKy0vLessrGvsa21r6+ztaqnrayjnJmUjpGWl5mZnaCjopudpZ6apJeXl5aQkpGRk5qXm6Ckqp6hoZ6mp6qin6Cnn52fpKepnqOmn6qdqq2qrqeosKWjpKanrKahpKGbmJ6vqK6xqqWqqqCamJiYlZOWmpOVlZmVmpeXmKCenJyXm6Ganpqip6WfoaKio5yboaanpqito6mlnqSnqaSlpaGlpKysqaarp6KgpKOkp6ehoKCloqagiXuAfXZ4fGR4eWBiUlVfSElJS1NUSVJQTDk+QTY3PTY1Ozo8PDk7Ozg6PD06Ozg2NTc6Njk+PT48OTk9OT09PD49Ozs8Oj49PD8/P0A9PTc6PkBAQD8/ODY1PTw+QUJGQEBHoK6kpquho6qsrq2nrKmooKKmnpubnpqgnJqVmZ+fm56fnpaUk5eTk5yeo6iurayrq6+qr6mfl56lnp6lpqSgop+moKKuq6yttbK2pq+0q6mqtLGwsLitp6GcnpqUmJqakY6SlpGMj46UmaKcl6OZmpeYmZSZmJadm5+lpqmgpqOep66uq6aisaOapKamqqKhqqKppKiyq7Gyq7qopqunq6uprKynoKCjsa2ysLSpsa+imZydnqGYm5uamJmblJWalpicpKGgmqOgmpyZn6SinqCfoqadm6WmpaSlqKOno56mo6KepqWipaWorKSmraegnZ2fnqCloZ6epaCmmYF7gXx2dnNogmxlW1NaWU1RSk5PVExSTEE3PkI2ODw3Njo8PD06PDk4Ojs8Ojs5NzY6PTU5PDtAPTc4Ozc9Oz09PTo7PDg+PT1APkE+Pj44ODw/QEA9Pzc1OD0+PUFARkBBSKGqoKuroaSqq7Ctqa2pp6WlpaSgoZ+epZeXlJiZnpicnZuWj5SZkpKcmKGdqqKmoJ6noaSfnJKcopufoaOenaCfo6Cir66sr7Gstqetsa2mprCuraywp5+fo6CXkZScoZyamJKTn52hpJuem5afmp+Xm6KepaGepJ+kqK2tqKyopKy0t7awp7Ssoq2to6+lpKahqaiutbOyvba+sKyxrq2pqrSxsKerqLK1t7O3rLG0o6CdpZ+roaGioJ+amJWVn5ubmKShoJ2joaCem5yloJ+dnKGon5+nqZ6ho6SgpqCep6GfnKajn6Klo6igqauln52dm52apqKenKOep5CBgn98eHVpd3VdbFpSYEhRVUhGVVZKQk1HPUpIOEU8Njc7Pj08Ojw5ODo6Ozo8OTY2Ojw3Oz49Pz45Nz05Pjs8QDw6QDo6QD87QD5BQD08OTc6PkA/Oj83NTg9Pj9BQERAQkacq56pqaKlqamuqKaqpaanpqiqoaWko6aSk5WYlpyampyalZOZm46Tnpmona6ep56boZ2empqSmJ6coqKgoJ2in5+en6mrp6ypqrSrq62rpaWqqKusqqWgn5qSkpSYmZaWloyIi4+VnZ2dnZ6WnpqmoKCopbGqp66jq622sLSysa62uL3Auq21tLC3sK60qaakpaypubO1u8O8w8G2urarr7G5t7yvs7C1wby3vLKytKGroqmosamqqKenmpidmammoJmnoJ+ep6elpJ6dqqGinpufqKCkp62Zn6OenqeeoKaenJyioZujoqGdnKalpaSfopmcm6SfoJugnKOJhYR+dnFtaXZtaG1cWFtCVk1KR01HQkZNPD5MPTQ8OTY6PT88Ozo6ODg8OTo7Ozw1NDo8ODk+Pj8+ODg/OTw7PT87PUE9Oj8+PEA+Pz4/PTw2Oz9BPTs/ODY3PDxAREJEQUJDlaqgpqmjqaqoqaOhqaCmqKesrqWppamqlJKXmZSampqcmJiZnJqYmqqgsaK3o7CmoJ6dnZeZlpmem5ykn5+dpJ2anZykoqSjoqqvrKepo6ChrK+uqqunoJ+foqOen56bnZuUlJWVnp6YlIadmqGbq6SrsrC5srKxsrG6vby8uba4w76/wr+2urrAxLm9u6yup7GtscK2uMLGwMjKwMq/sLm5vbnCvbizu8XDvMK6trOpsq2qsrSvs66prqOdq6a1sayir6Wgoq+xrbCkpK+joaCaoaehpKqqmZ2gmZqjoKaooZyeop6ZpJ6emJijo6GknqaZm6Kknp+bm5uch4WBe3Rya2t1cnBoV1tRRVRIRElQSD5FQTRFSDk1Oz02Ozw+PDw6Ojg5PDg5Ozg6Ojg7PDc7Pj0+PTY4QDk7Oz1APD1AOTc8PTs+PT49Qj4+NzpBQD48Pjk1OD07PUNAQUNCQZGqoaWqp6WqqKafoqecpqynsbKrraOprJWSlZqUl5yioZueoKGcn6myq7uyv6uvrKWeoKGdnJibn6CboJ+fl6SdlZubnpqenJ+lpqedoKCssa+npKSjoZ+mrKefl5yVkpqdmZWMioaIhnltiKCkoqustLy2w76+s7vBw8LFwL/CxsbFw8jCwMXIzdDIy8Oyt7W+sr7Fu77MzcXMy8vSxr6/wMK9x8bCt8PJyMLAxb25s7m6tLu3sLWyqrqxrrq2vrq6qresqqq4urS7rq24o6ainqeloqOpppmbn5ianaeqp6ChoaSYlKOWlJqRnJ2fpJ6nn56fop2YmZSYlIiEfXpya2Rpb3hqZVpbRkpMRERTTERCRDc6Pzs1NDk5Nzk+Pzs8Ozs4Pjw2Oj05PD05PD06Oz0+Pj43O0E6Pjk9Pjk9Pjg3Ozo6Oz8/PUI+Pzc6QUA9PD04NjY8OjxBP0FBQT6Sq6Cnrqiiq6WkoqKloaWqq7Cyra6kqaaUlZWalpSbpKadoaqnoqusvLy/w8GzsrinoaGrqqKdnqGinpyboJKfn5CWn5mSmpadm5mjoa+zqaGbnZ2fn5qXmJiTjY+Wl5SPjZCLgoOCd3NxbnCPpq2utLnFu83Hy7/CzM7NzMjJ0czNzMfJxcbM0NLVztPJvcC/w7vGxcjF0dPM08/S08zKwsXGxsrHzr/I0MvGxMbEwLvCwL6+vrW9s62+v8LCxsTGw62+uLG4vMPBwbq8vLWup6etqKCiqaWalqCamZ2oq6mjpKSel4+bi5CZiZWYm6Cfo52dl56ak5OLlY+FgHl0c2ViZ3JvZl5aWUNOTENFUElEQkA1NTU4OUI9Njg6QT47Oz48OT49Nzo9OTo8ODw8PDs/Pz48PT5DPDs6QD06Ozo6ODg4OTtBPjxAPz44O0FBPDs+Nzg2Ojw+Qj5DQUA+k6+fqK+mqKujoqWgpqakq6irraquoqqjkpyXl5uYm6Osnp+upqWxqsXGzM7Nv7DCqaWora2qoZ2jn5ydmqmTmaGQjqCTjZSSl5mksbGrpKCdoJyZl5WTlJeSkI+Mh4SEiYeDgIGBgHlycm9seaS2urm+y8HT0tPIzc7R09HS0dDR0c3OztDFztTV2NLXzcbHyczDxcrOytPX0dfS1NXT08jMxszNydLMzdPNxMbJycDFy8fIyMW+wrOzx8TLysrOxcm/vb68wcfEzMzIycDDv62vsqieoqqjmpOenJiepqmspKWmlpeKlYWRlIeSkpKZm5qWmJCblZCMhpGLf3tydXZnYmh3aWRWV1FETUZASVFCPUI8OjIzQDxEPDc5PEI9Oz0/Ozs+PTk6Pjw7Pjg6OTk6Pzo+PUA+QDw+Oz47OT09PDk2Ojo+PTw8QD8+OTpAQTs5Pjk6Ojo7Pj48QT9BPpCsoqKppqeopJ+inaqoo6yjo6emrKKpn5SjmJafnp2kr5ugsKuorLHJzdTXz8a7x6yttLisrqOfpKOeoKSsm5aplo2XjYyNl6awrqWdnp2hpaKem5aVlpSKfXdwa2ViaHFvcXuFioB2cG5xdHCFs8K+xdHQ19bW0tbN1NbX1NPR09TU0s/Rw9DT1tfV1tLLyc7Qy8bN0cnR1dbZ1dfS1tjO0snO0czO0MvSz77GxsnCy8vLzs/Fxsa2v8m+0szLz8XJx77CwsfOzM/QzszKx824t7uon6arp5+YnqOenaqlramoqJKViJCEjJGGjYyIk5WZkJaMmJKPhoeMhHx4c3ZwY2BlcmJdUlxJSkZBRUhJPjtAOD00NTg1Ojc2OjxAPTs+PDs5QDs5Ojw7Ozw3PT07Oj47PTw+PD86Ojw7Ozk7Pz05NTs8Pjw8PT8/Pjo7QEI7OT85ODs9PT4/PEFARDyGq6Ccp6Cno6KboJuppKWpoJ+hoaafqJ+YpKKbqaaipqyapLCxqai10NTX2tLHxsu0tsLGsrapoqWmoaKrtaeasaGWlYyQpq2rnJWYoZ2boaKfnZ6blop4aWRhX19fX15fYF5ibHVzcXBvbHJxdZLEx8bU1dbX19PWz9XU2tTUz8/V1NTR0czRztPX1tPV0M/S09HJ09DH0NjX2NDX0tfZ1dXMzs/JzNHLzs+/xcHGxc7M0NDRyMvLv8nLxdPNy87Hw8nGxsjLytTT0NTP0szSwbnFsaWota6nmqispZ2yqLCzrKyTj5OOiIuOg4+LhJCOmY2Tj5mPj4KFjHt6cXN0bWFjaW1fVlBfSkpCRkNRTT88PjQ0Oj01Mjc1NTw8QDw7PDo5OkA6ODs6Pjo9OD46OjxAPTw5Oz0/OTo/PTs9PD09OjY8PT9APTw9PT46PEBCOzo9NzQ6Pjw/Pz1GQUQ9gqScoKWdpaWjmZydpJ6jo5+dn52gmqeenKGpn6+uq6qrnaauuKirt9jU1dnZ0c7QwLzMybfAr6erqaOksbazo7aqn52hqqmhmJaYmpudoZ6ZnZ6UfnJmY2NfX2FgX2FgX2BgX2BmbXBwbmtvcnd3m8zA0tXT2NjW2dHS0tfP087L083V1NHKz8zT1tLR1s3Q1dXRxdHUytDU1dXN0dDY19fXy8jOw8jOzMnMv8i+x8jNzc/K0M3Oy87Ox8rPz8rOysHIxsnMycvR0szT0dHPz8q9x7mwrbu4taq2sK2ouK2zv7uxmo+flJGOjYiOkIWRjZmMkZGVjpGAhYh5dm9wb2tiZW5wYVdcWklGRkRMV0U7QDwzMzw9ODY4NTU7PkA9OTw8ODw+OTxAO0A6PTg+OTg6Pzw9ODs+Qjo6PTw6QT09PDo2PTw/QD08Oz0+ODtAQT06PDg4Oz48PT46RUJFPoGfmaWnoJ+jp5qbn5yXnp6hmp2anJqmm5+kp564trW1raWtrr61scDZ0tfa3NbPzcvD09DCwrKrra6sprOxuKuzt6mjn5yWlJebnp+fnpWWmJWKbF9fXmFkYmBgYGFgYGFeX19eXWJtcm9vc3R1dnmkvsvV0dbU09jWzs7Ty83Oxc7K0tLPxs7NzdTMztPNytfV0MzR08rL0NHTyc3R1dLV1crAycHFzMLHycLMwsXHysrOyszMz83Ty8XHz8zHx8rExsDFycvMz9DGz87NzczPxcfAt7m9wsO9w7mys76wu8PEtqqYpaGZlpGVlZKLlI2akZSUj4+UgomFeHBya21oYGBxaFhYaFZNR0xJUFBCO0Q+OzY3Ojg5OjU3PT1AOzo8PTk8PTk9PTo+Ojw4Oz05O0A8Pjs+PkE8OT0+PUI9Ozc3NT88PD88PDs8PDg7QUA8Ojw5Ozo7PD1BOkVBRT6EnpuorZ6kpKqcnp+Ykpebn5qbnpmZopWhqamlxcPBv7u1srHHwrnL1dbZ2tvYzM3PydbWxcS4sraqo66tuLmxssChl46NmJaQlJKRlpeWkYx9ZmJjYmBdXmFjYmBfYGBhYWBfXVtdZ3JxcXJzcW1yeaTG08/L0M/U1cnEycnGxr/Dxc7Ox8XHzcrRyMvOzcbR0s/OzNTKx8rNzsfGz9LL0M/FusS+xsm8wsbIzsTCx8DGzcfDy8nKz8fDw8/IxsHGx8O/wMbLy8vOwsrLyMfM0MTFx7rHw8jIws/Avby/sMHKx7m9qrCyp6WdopyYkJuQo5mXmZGVmImPgndudGRrYF5mcWFbV2BHSEhHSU1URz9KPTY0MzU1PDw0OD09PTo7PTw5Ojs5Pz05PDs8ODo8OjpAPUA8PT0+PDpDPjw/PTg4OTpAPj8+PDs7Ozs4Oj4/PDs6Nzk8Pj07Pj1GQUM9g6Cbqq6lrqqrmp2gl5SOl52amaCampybpbOxrMnNysjEvr26zc3G0NXV2drb2NDK0NDS1MrFur6+sKi3qr65ubOlko6OlpCGg4SEgn6FhYB0YFteXl5gXmBjZGNfXV1eX2BgX1taXGFrcnJvb2tsb299uNHIycrPy83Eur/Du7u6ub7IxsLDwMPHysnIysfBxcvGyMvNycTBycnBwcvQxMvIv7nBusXHvb/FzsrCv8O6ycfIusfFxMq/vcHLxsXDvsW8vL/CxMvExLu/ycLFx9LFwci+ysnGx8bQw8PGw6/Ey8fDyre/vLq0qaylpZifmKyjoKWao6CblHt2cnRmaVphbm1aW1hRRExGQkdETENGUj81NDMzND88Mzo8PDs5PDw8ODs9O0E9Ojw6Ozc7PTk7PTs9Ozo4Pj48Qj47Pzw5OTs/PTtAPjw7OTk5OTo7PTo8OjY5PD48Oz47Q0JEPn+lnKmyqbSusJ2enpiciZSbmZqfop+anai/uLzL0NLMx8LDx83Pzs3V0NbZ2NnQzNTOz9DLxLjGwba1vLHAtrqskYyTl4d7gIWGgHZ4dXNxX1pbXWBhYmNkZGVkYFxcXV1fXmBbWVpcYm9yb2tpbHBvc4/GvMnFzMDGwbC2urKytLKxwby7u7m4wMHBxb69ub2/ucTKxcXCvcbAt7vEyb/Cybu3urrFw768wc3Cxr69tcC9w7q8xrrCubO7xcPCwra/trW+v7rLwry1usi6v73Lw8HFwsXIxcjF0MbCzMeyxsnDzs3AxcK/vbK3sLOnqKi5saWtsKutrJR5dndqZWhgaG9jVl5ZSkVKRkhLQUVCRUlAOTo2NDg4NTM7Ojs8OTw8Ozk7OTpAPjo6PDo3Ojs3Ojs7Pzw6PEA9QD89Pz87PTs7QDw+Pj46OTk4OTc4Ojw8PDs5Ojw+Ozs+OkBART5+rKCstaq3tLKhnp+Xmo2UlpqfnaainZ63xsLEyM7Sy8rKx83Nz9LJ0cbW1dbYz8zQyM3IysW9ysGytbq3uravkY2KjIV5gIaGgH6EfHR1ZFxcXV5gYGJjYmJlZWJdXVtcXlxeXVpbXV1oc3FtZ2ducHJ5nb3MwMO6wLitsLCnqq2sp7i0trSzsrO6tb2xt7C0rrK7wrvBxLy/urWyur7AuMe4s7u1wMK8t73GwMO7tK+ytrq+s8S2urWsuLy9wL2wubautrqyxby2rru/tLa0xby+wsW/w8TFx8vFwMbGu8fLwM/Jx8PGwcO3w76+trm+xr+stbq1t7aOeHR4ZmdlYmtuXlZeYEZLSEhKRkJDQURFPzw6NTY1NjMzOzo7PTo7Ozo7Pjg8QT08Ojs4Nzk5OTs8Oj47OT4/PUA/PkJAPUA6Oj47Pz09OTo6Ojg1Njs9Pjw8Ojs5Pj05Pzo8QEA8iLemq7OxvLyxrZ+gmZSUmJeeq6OvqqekxsvOyMbJzszQzc7Jy8nLysvG0c/T0c/HysbKxcTAvM+9s7m9ubi3m46HiYp7eX6Ghnd4gX10aF5dXV1fYF9gZGFeY2VjX19cW15cXV5aW1tdX2xwbmhmam5ucnykx7+5uLWwq6ynnqKqp56rrLOtqaups622sLKorqessru6tsK5urmwq7W5u7TCua+/sL28u7W7x7nCtq2qqLCxwLW4vK+wp7GztLu8q621pa62rrqxsKq5r627rbu4u7+/vbnCv8bCxcC8xsHHy7jFx8W/x8PDusTGwrvFyczLs7nCvLqyiHJ2dmtpYWJsaFlXV1tBTEtNSUVBQz9GQTs5Ojk5NTg1NDo6OTs8PTs6Oz44O0A8PTk6Nzk+OTs8Ojg7Ozo+PjlBPT9APzs+Ojs8Oj08PDg5ODk3Njg8PD07PDo6Oz49Oz87Oz5APIrAq6i4t7nDrbOpnZmUlpmhnKawtbG3psbP0szExsLF0MjPw8THwcbGxcXMw8rMw8TBx8C6u7vKt7S7vbW1q5GJkJB8eX6KhXp7hIF4bl5dXV1dX2BfX2RjYmNjYmBfXltbWlpdWlpaWl1kbm9oZmdpa25yga25sLWupqWnp5qgpKCanKWrraOnoquprKqwo6afqq20trG9ua+3r6iuuLS0u7ezvK63ubSxu8Gxwa6kqKKrsbKzp7yqq6irrK20s6WoraCkr6mypaeorqWntqywsre5uruxvL2+vsS/tcHAx8i3v8DEt8TCwLu/xMO+xMjMyr++w8DAqYZyc3JqaV1hb2RXVlhQSFpSU0tGRkU+P0A6Nzg5Nzc2NDM3Ojk5Ojw7Ozw8Nzs9Ozs7PDg5Pjg9Ozw2Oj07Pz03QT4/QD86PDw6PTk6Ozo3Nzc4ODc5PDs8Ozk7Ojw5Nzk+PD4/QTuMwq+uvLe5xLC2sJuZlZyYqqmwsbO1va/G0dDNxMi7u8zDzMC9yrnAxcC8zLrDxsW6vMS9uba8xbi2uLuusZWDiY2Be36Af3h0f3xzd2ZfXVxcXl9gXl9jY2FiYGBfXl1cWlhZW1tZWFpcX2ZrZmVnZWhrb3KFqqWspqCcoaWUnqObl5Gho6qjop+kpKekrJ+dm6Slq7KvtrensKynqrSrtLmwtrSstrixr7q5sLekn6OfprGnq6e5qqSmp6insq2gp6aemqSmrJ6fp6SfoLCsrKyxs7KzsLW8trvBwbK6vsPBsbm5wrPAvb+1uLu9vrzCxsTCw76/w6CDd3BsYWVfa29gVVlfSE5oT1RHRUpGPD0/PTo7OzgyNTUzNjk5OTs5Ojo8Ojc8Pzw8Ozw4ODw5PDo7Nzg6Ojw5OD46Pz05ODw6Oz06NzY3Njc4ODY2Njs6Ojs5Ojs8ODU5PDo+PkA7jci1tr24usG7vrWgnpSdoaa6tquzs7uzxdDJzMPHubjJws7Busu5vci7tse7t8PGs77Fu7avuL+7sLO2r6KEh4eCfXl2dHBta2pqcWlfYF1cXF1fYF9hY2JgYGBgXVxbXFxYWVhYWFZYW11eZGNiZWdnZ2ptb4idqaCXlZqhlpuimJWNnqGippuen6OloKeemqKbn6qwrLG1oqmqqauspLW4rbavrLK0rrK1rrCqn52eo6KypKWpuK2hpqafqKyrmZ+fnZmdn6WamaOcm52vqKunqqusrbCyuK64ubqwtru7uquzsrmyvbS2sbG1tL+1vb+9wsG6ur2Xg3pya19lXmRkWFRYXklXXUtQR0lKRkE8Pz9AOz88MDQ1MzY6Ozk7ODk5PDw3Pj87PTs7ODg8ODk4PDc4Ojs7Ojs/Oj07Nzg8Oj08NzQ3NzY3NTc0NjY7Nzk6Ozo4Ojk4Ojs5Ojw/O4nJtri+u7fBwcG0pKSZmqSmwLKvtqy0t8bQycnBx7y8xcXQwbzKu7vBu7XFuLXBwbPCw7usqbS5t6exsqmLhoiAeXNucG5rY15iZmZdXV5dXV1cXV9gYWJjY2JhX1xbW1pbWVhYV1dXWFhYW15iZGRlZmZoaWtyjaidlJSUm5eboZaWkJyhoaidm5ylpaCkm5+gmpitra2vsqCloq2rpqG1sLGxrKeusqe5sqa2oKKemqOhraKhqbWqoqOmnaWmo5aYnZeYm52fmZednJybrKGrpqKjpa2rsrOqtLCyqrK4s66pr7KysrezramsrrG3sLq1ub2+trOxlIR5dWVeZV5bWVZTWlVMXFFMSkVIS0lCPT9BQUBAOjI0NTI0OTk4OTs5Oj08Nj0/Ozw+Ozc7Ozc3Nz42Oj47Ojg6PTs8PTo7PDo9Ozg3OTc0NjU1NDY3ODU6Ojg6OTk8ODc6ODk+QDqByL24vb+2vr2/s52lo5ilscK1tr2ttbjDzcnIwca4wsHI0LrDxsC2vL22w7q2v8G1u7+6qqawurGnsa+afYWFgHlwcXRxaGVkaWVjXFxbW11dXFteYGFeX19gXlxbWlxaWVhWV1dWWFdYWFZXYWRlY2RlZGRoanainJSUj5WXl5+XmZSYn52hm5agoaijn52onJuaqqausKubo6O2qaCfrqi1qaamrLCjtq+jtqCim5iYq6ahm6y4r6Kho5yhn6CTlaGUlpabmJeWl5yVn6idqaOhnKOqqrCtp7OrqqassrClqq6ysa+wrq+mp6eyrrG0r7uzubeto5SBeXVkXmFWWVdTUlRLTV5MUExHSExLRTxAPjxCPDs3NTUzMzk4ODk5Ojk+Ojg+Pjs9PDw3Pj02NzY9Nzs9Ozk3OTs7PD45OTo7Ojg2NzY1NDUzMTA0NTY3OTo4Ojk6Ojc6Ozk5PUA6dsC8tbnCsb64vK6dp6ejqrvAvcC5rrS4ws3Ix8TFvse6ys21xMXEsb+/ucDBur+/ubm8t6emsLumqKGkiYF+eHJqbHJ0cGloZWRnYlxcWllaXFxcXV5dXFtcXlxbXFlbXFpYVldXVldYV1dXVVtjY2JiY2JjZGZqgZaTlYuSlJObmJyWlpugnJ+VoJ+lpKOlpp6cn6Sfqq+mn6KktaegoaKns6Glp6SupLCsq7SeoJ2UlKmhoZSssbCeoqOdnpibk4uhlJGTl5iSl5eYlp2mm6ahopmkpKSrpKSwpqWiqquspaiurq6rqKmps6Wmq66zsa67tbCvrp+SeXZyZWFcWl1YTkxRR1JhTVZQT0pNT0VCRD85PTY5Ojc1NDU5OTs5ODg3PDg5PT47Pjs8Njk6Nzs2Ozc7Ozo4NTo7Ojs7Njw7ODg0Njg2MzMyMS4vMjU1Njs6ODs3ODc2PDs6OztBOHi7u7G1vbC7sresnqSmrbe7vMHFurG5tsXKy8HEx8fJuMjGtcXCyK66vMK8wsDBvby3uralp7G1naKKmIiAd29kYmdpaGZoamdqbWBdXFtaWllaXF1cW1xeX1xaWVtZWVlbV1VYV1RUV1VTVFNVYGBfYGFfYGFjZGmBlJOJkY6TkpOclJWWpJmglpyfpKGspaOjoqOhm6qqpZmepbCpn5+cpKqdp6Gdq6upqK2toqGhlJeimpyPqqiwm5+in56XmJOKnpKNkpKVj5iYk5ugopykoKGVoKGjpJuiqqSipKqiq62lrbGppqWmprWmqqits7W0ubqvqayei3Jwb2BbV1ZVUkZRT0haXE9SSlRLU0xFR0lDODs7PTw4NjY2Ojk7Ojo3Njk3Nzo7Oj08PDY7PDg+NTk4Ojg4NjU5Ojs8OTc/PDk2Nzg0NTIxMjEuLjE0MjY6ODY6ODU5ODk4Ojs5QDl7tbSttLuysKyyrZ2np6+5ubO/yLq2wK/Gyc68wsvNybfLwLTAx8ywtbzHu8HHw72+trq1pKqvrp2Zh46DfHVpamptaGpsbmtrbWVdXFxbW1xaWFpdW1teYGBcWFhaWVhXWFdUVlZVVFVVUlNPUVldXF1eX19fX2JkbY6PhJGGj5GOmZOUkpyaopyboKeoqqeqpaikopikrqSUmaWvqZ+bmJqgnq6Zm6myn6Smn6OjoJSTm5aVkaiprJqcoKGgmpSQjJmOi5CMkoyWlJCdoaCinJuilZugoqCXoaiioqiroKuvpK23paKjoqytqairr7O4sr21s6uvmINycmhbWFlTVVJFWUxRXFlNVE5QTFFSSU5JQjw/P0E/PTY1Nzk5PDw5ODc6Nzk6Ozw9Pjs3Ozs6PTY3Ojs4OTc2OTg5OjY6PTk5NTc3NTcxMTQwLSsvNDM0OTg4Ojo4Ojo3NDg9OD85frOuqLO2rqinr62bqaist7asu8q7tr+szMfGucLP0Mm1xr66vsbLtLC9xLzCxMO8wLK5r6Wqr6uel4aBd3hvbmlubm5xZ2hpZ2RdWltbW1tcW1laW1xcXl9fXFhYWVhXWFdWVVRTVVZVVVRTTk9RWVpaWl1cXF5fYGR+jYGLf4uQipKNl5GWmaKgm5+qqqatqqavoqeZn6yglJWkqKedl4+OmZ2ulpemqZienJOloJ2RkJKSkpWnqqSZmZmdnZaOjIuThoiNg5CKkZSQoJ2go5eVn5WaoKGdkpulpaeoqKCxsKaxvKafo6y1q62nsLSwubW/sa2xq5B8cHJiVlRVTlJJR1ZQU1JMTFhNSkxOUkdNS0FDRkRDPkA3NTg4OTs5Ojc6Ojc8PTo7QD46OTs5Oj83NTk6Ojg3Njk1ODc3OTs4NTU3NjY2MTMyMC0qLjEwMjg3Nzs5OTs4OTQ4OzhAOH+zraaxt6qlorCrnaqnqbKwpLbGtLm6s8vGurzDy9HMtLm6vsDEx7W0tryyurvDvsGws62wrrCrm6KIa2htb3JvcWtwa2RmZ2VeWllaWVpaWltaWlpcXF1cWlhYWFlZV1hXVVVUUlNVU1ZVUk5OTlJXWFlZWVlcXF1haoB6f3aJjYeQiZiJlJOYmpidqJufqqSkq5ymmKClm5KPnqKal5aEg5Gao4+TopyVlZaHoZqak4uOio+Zo6eclZWXm5CSh5SOjICLjYCQipGSkaCZn6GVk5iYlKGkmIyZpKanpqCftLKnsregnKK3rKqtpLKyprW8taursaOIeHJtXU5QUUxPRE5OTlBMRk5OS0pOTlFITUpBR0tISEM9ODU4ODg5Ojs2OTo2ODs5OT48ODo+OTs/ODc4OTo4ODY4NTc2ODg5NzQ1Nzc4MjAzMDEqKS0vMTI3NzY6OTk5OTg0OTg4QTd3tqektrCkp6OppaCppaSzqqKyw7W1srPHx7i7xMrNx7WvvL+4vMSzsq62oqy1w7q6rqqrtK+vn5enfV5gZ3NxdnFqbmlmaGhqX1hZWFhYWVlZWlpZW1tcXFlYWFdZWVhVVlJTUlBRVFFTVVFOTUtMU1dXVlhYWVhbXWFvc3ZwhIiCh4CRg46KlJCTnaGOmpuioKKXpJahm5WMh5iajHONgn2MlpaFkJmQk42OepmOm4uCiX+JmJ+inpCTmJaEjoGTfn5ziY56kIaSkJCcmpmZkJWPnY2ioo2JmqCho6OborSvrK+sn5iluKalsKGxrpywu6qpr6qZgXZyYlZMUU9QTUNTTkxRTUNQUEhJTlNNSEpKREpMRUpKPDc0OTg4ODs7Njk7Nzo8OTo6Ozc5Pzk+QDc5Ojw4OTc2NDQ0NTg3NDMxMjU4NS8wMTAyKSgsLTEyNzY0ODg5Ojo2NTo4N0E3d7eio7SopaWoo6alpqWms6eltMG4sLSwysa5usLPx7+0r73Dr7HHsq2nrJWjrb+3sK+fp6ysqpaUonJXVmBoZ2loaW5jamhnYlxYWFhYWFlZWVlZWVpbW1tZWVlWV1dXU1RQTlBOT09QU1RSTU1KSE5TU1NUVVVXWVtdaWxybH+FfHROWHKPgpeGjZyXipOQnpeclZSVk46WiH+TiV87V297ipOJf4uRjI+FhnKKhJaBeIJ6hZOdlIOVjpGPgoZ8knhxb4WNfomAkI2Pl5mYk4qPiJyHnpeGh5aemqCgl6evqK2pqJ6WrbSipq2ZrKuYp7Ohqa2jknxxbV9aTlNRVkxEVEpQTU1GT09KRUxRTUtPSklNT0ZJSD03NTk5OTk5Ojc6Ozo+Pjg6PT02Oj84Pj81ODk7Nzk2NzUzMzM3NjAuLS8zNDQxMTAvLygpKystMzg0NDg3OTw6Nzk7ODZBOXi3oKKtoaamqaCnqKeiqbCop7TCubG1sMnDubS/z8C6sbG4xKuuya6nop2FmqK6raanlaWko6CWjpZpUE1SVlpaV11eYmdjX1lXV1dYWFhZWllYWVhZWlpaWVhYVldXVVNSTkxLSEdiXE1PUk5LSEZITlFRTVBSVFZYWmBtb2l6gnRQQkB/lZGRfYmUjISKjZqMlpWKkoeFlYV4iH9gSlFueIqRhHyEjImEfn9ufn+Td3V2eISNmXBRjYiKh3t+eJR2Z3eFiH6KiJWKjZCRlouDiYeUhJqLgYSSm5aenJSko6eppaOem7GroaSkkaaqlqGpnKKmqIdza2VdW0hRUVNNSVVNU0lMTFBJR0ZLTkxNVEtRUU9GSUM8NzY5Ojg6Ozs4Ojs4Pj85OT49Nzs8Njs7NDc4OzY3NzUzNDQ2OTYvMy8uMTE1MjIxLywnKSsqLDQ4MzM5Nzk6OTk6Ojo6Pzl2tpyipp2foa6hp6ilpqevrKq2vLa4trPCvLeou8m5t6mqt7ittsCqopuSgo+ZsZ+hmYyflpiUkYqMZU1MTk5PTE1RV1tcWlhaVVVWVlZXWVlYWFlYWFlZWVpYWFZWV1VTUE1KRUBAm2tzc0lNS0RERElOT2hZTlFTVFVaboN0d35qaV1Vj4mUiXR/hoB7hYySgJGZi497ho9/dX94c251cHSNjYF5fYmqhHl6aHZ7jnBybXiAioySeHqAe4B2cnGSeGd1hIOEhHqViYiKjIqAf4OKjH+Tg3qAj5iUm5WRn52onp+fnaCppZ+dmI2opJOgn5WenqR/cWZgXFxKVk9RR0tYUk9KTU1TSkpKTVBITFFMUlRNRUhBPDc4Ozk5Pj06Ozw5OEA/Ojo+PTc9PTc5OTM3Nzk1Njc1MjUyNTcyLzIuLC4vMjAwLy0rKCgpLjEyNjIxOTg3OTg3NzY6PDw3dq6Yo6GYnJ60qa+ppayrsLGqvbSyvLi2u7WzoLi7s6udn62rrLWzpZ6WkZiGk6SWnIyCloiPiYaGg2ZKSUpJR0ZISFBUVFRXV1NUVVVVVldXV1hYWFhYWVhZWVdXVVZVU1BLRj45M048fp5NSEpEQD1BRGqUfkxPUVJTVl51g315Z3eNl5iOj31neYB2eH+Jj3yEmJKBcoaPe3Z6b2t+rXxzkIp/e4aSgH1/dGZ2fIVsb2dzfImMh4BseXF9cG11j3JocYB9jnBDioSCg4R/d3d6ioR9i3p0fo6Sj5iKkpubo5eZnZqdnqKdlo2LpZuPnZeOlpiOdW1rZWFZV1hUUUpTVlRPUE9RV0tOS09PSlFPSU9PS0ZEPDs3OTs6Oj89OTw6OTk/Pzs4PD03PDk5OTkyNjY4NTY2MzM2MjEyMjQuLCwtLi4tMC0rKicnKi4xMzYyLzg3Njk2NjUyNzk5NXmml5+elqCmsKyuq6epsK+xrLy4rLu+ubSuqZuxqK2ckJeep6ynpJudk4eWfY6VkZSAe4p6hIB+foBlSkdIRkJAQ0RJTExNUVJQUVNVVFRVVldXV1hXWVlZWVlZWVZWVFNRS0Q3OGY3MD+oaU5IQz07OkSKhXpaSk5QUVRYXmVwcm2Ip6rAfnV5Ynt3b3x5iI95fIuFb22MkXhzeGpqf4JylpGLgX2Wf0mSmG5od36CbGljbHmFkJKGa3NsfG5ye4VpbXB+c4yIg4V6fX56dm90dIWBeYF3cHyOjIqTg5aXmJqQk5aXmZeel4yDiZ+SipKNhpCWfWxobW5tV1VXVFJRWU9TVVVUWVZNTkhOS05OS0NJTkdFPzo4OTs5OTo+PDk8Ozo6PT46ODo8OT84Njg3Mjc1NjU1NDE0NDIvMDI0KisqKi0uKy0qKCooJywtMTI1MCw1NTY3NDg1SEE4OTV3mZGbmZqepK2woq2qqLWvrqy0v6u8wr+mo5qVpZifjoWMlqKkm5uUlo92kX2Ei5CPfHh+dH13dHd8Zk9FR0RAPD4+QUZHR0tLS01QUlJSVFRUVFZWV1dYWVpZWVpXVlRTUExFMUCaMyBqckGZbzs8OTU8gIKGX0lNT09SV1pSWVxgp4himml0emV+b21/eouIdYGIhnRsmZFzc3xqa52OTHmEkomEjmcxdoZzbH59g3RmZXR+hISFgGZpbHVrcH97Z3Bwe26SjY57c319cXBudW2Cfnd5dGp5iYKIiYOWk5KQi42RlJWPl46AeYiXiIaJhn+Qh3VpaW5nY1dRWVdYWVxOUFZXWllPSUlFSkpIR0JBRkRDRz05OTg7OTo5PDo5Ozo6OkA8OTo8OTg+Nzg3NzE1MjQ0NTMzNjQ1MDMxLioqKyosLCsrKSgrJyksLDIyNi0rNTc3NTQ3OGlPODs1bpKImZGalqSorp6ynqa6rquysMKyu8PHm5ePlJmLjoZ6hZGalo+SjpKKc4mEd4uPjH92d3V4dm94c2lVRklEPzw7OTo/QEFEREVHSkxPUVFRUVJTVFVWVlhaWllYVlVUU1BLRTgwL1xgs0c5WFA7OTQ0MZa6i0hMTU9QUVZMQUlRSWKvs6BxfHhtfWxxg4GFgXmDhoZ5cZ+Uc3iAc3WUhzVxnaidjqGhhKKEdnCGe4Z7c4ytjYiAaGZiaW1xbW+CdWlvWHVvjZqRdmx/e3xtcm5wf3pzdW1idoR/hoCGkZGKi4qSi5GMi4+DdnmLj4B+g4B9jnhwbm5qXlpbXVtZWGFgU09cW1lYTEhKRkpHP0NBQkc+Q0Q9Ozk3PTs6Ozs5Ojk5Ozo/PDg4PTo4OzY2NjUxMTIxMzUzNDc1NTMxLi8sLCspKikpKioqKSgqKSsvM0RNMjE2NjY0Mzx2Ujc9N2KSgZKIlpGdpKeer5WltKitsK7Bs7rBxpeQjJSQgYl9boKRk4qEi4mQiHeEhW6Xiox/eXt7cXt0fGtvXkpQRz5ANzQ1ODs7PD0+QEJFSUxMTE1OUFFSVVVWV1hZWFZVVFNQTEU8NSqdS1tALWdJOTQvPpKDqa5fSExNTlBMN0NNUlNESoZ2gHx8dn5sd4eHfH2Fgn+MfnWhmXl+hoCEmYWbnGGGqp+di4KQjXp2iH6Jh45zipePg3tcZHF0ent3im1naWF5boWPgnpugXdzhHpxc3l3a25pXXeHfYd8iIiPgIuTl4ONho2HfXGFgIR8dXd7fId0bXFyZGVeWlpdU1tnXlhRVlldV0dLS0VMRz9GQERDPkFBPTs5Nzw7Oz08Ojo5OTs7PT43OT45OTg2NzU0MjQ0MTA0NjQ2NjU0LSwpKygnJycmKCgpKSgoKysrLzAwVXE8MjMzMzFFflc0PTlcjHeJf5SMkZ2dn6aRoKqfsKmvwLG7xbqWj5GUiHqGdmuAjJKDfouFkI15hIJ0ooWNf3+DgHODgX1seWxTWExBRTMxMTI2NzY4ODo8P0JFR0ZHSktNT1BRU1RVV1ZWVlRTUE1GQDoyPSAjlmOMWzUzMTFpP0dvSUZJTE1PUkxLVF1ZUkpphIh7iXl8cnyPi3p8iIZ+l4d3oZmIho+SlKWNrKlIhq2vr4qAgJOKgYuBhJGoh4CYmIqcc2x8gYaHfY5oZ2d4fm2FhoGFcYSFR2uAeHF5dmhta193fYOIf4iFjHqVnpyKi4mSf3t1i3Z8eG1vd359cXFwalpcW1pjY1dnZl1WUFFYWlFETExHT0lERkNDQUBDQT05Nzg6Ojo7Ozo4ODg6Oj8+Njs+NzU5NTc3MzM0NDIzNjY1Njc2ODtERkxNTUxDNysiJScrKSsrLC8wMCtudTIyNDIwTIFcNT08XoR0fH6KhYeRj5aYkpegnaygp7mvs720l42Si5iLfXRxf4qTf36Ng5SVfYd/hqWHiYCDiIZ5iIqAdYV5X2NWTEM2MC4vMjMxMjM2Njg6PT8/QkVHSEpMTlFTVFVUVFZVU1FPR0M/ODAsI4dbPj84NC5dlXBzo1VGSUtNTlBXYFlwWlxeao2Th5WAhIKFkZN+hYiQgJqWgqCgl5WbmqWtk5m7sae7yMOnioyhpI6TiYCQe3KDnp+RnH52hYWLj4eQaWhvg4B0jIaEi3GHgnaHgHt2hX1udnVngZSPhomJiImIoqujlomPmIB7gop7em9na3l+d3twaWNcWVlcaV1hZ2BbUE1OWVNSSVFLRE5HQ0tEQkBEREE8Ojg3PTw6PDo4ODc3ODo9PTg8PTY4NzU2NjIzNDQ1NTc2ODY3PEJCPzw4Oj5DUV5lXEcyJyYsLC0tLjEoP4xbLjMxME+DXzQ/O252cGd4g3uAjICBkY+LmpqknKGspquvsJeSkYShlIR4d4CNlH1/koaTln+LgZKbjoSAgoyLgomOhYCKgG1wal5DQTQtLS8vLy8wMjIzNDc3OTs9P0JESEpPUVJTUlNTVFJQT0hEQjw4Ny85Qz48PDYzLmyTl01RSUlLTEtOVmBjf2dnbXWdm4+ak5OLjo+aiJOPnYugoZKjqaSjrJOotqKnwcKux694upSafIyhnpmEkoSCj6Gek5mShIqFj5iQlWxvdYmLgZWMjY93kIRxbIWBipeSg4WIcomhl4eTio+Ql6W2qZuNlqKDh5OFfoBramt9fn1/cV9bYl5ZZmpcbGxfWUxIUFNRTk5NR0lRRERORkFDRUdCPjo5Nz08Ojs6OTg3NzY3Ozo2PTo3ODU0NTYzNDU1NjY2Njg1NTYzMTAuKiwsKSgpLjpQYVxALCgtKyswLCdyiDcyNDBPhGIzQDx1bmhZcINwdYdxdpGGfpeWmpSfn5unoKqWk5ieaGakmn6FlJJ6gJGJkpJ9i4WZkpGDgIGLjomGkoiEiYV4eH9oTlI+Ly8uLC8uLS8wMDAyMTI0NTc7P0NGTlBSVFBRUVNRTlBJRUU+Ozw6Q0Y/Pjw3NTI8QFI1SEhITExNTlJeb4p8c4F9oJ2bp6aimaGXopWcn6ieqaufqKypqrWXq76rtsjJt8jRz76boHBpqqifhJORhZygmpqZp5GRiJWhmZp3en6UmJGhkpeXgZSee3aVkquziY2XoH2VnpyOk5aapKOntrCekZqoiJeQjoKJbHNzfHx5bmZeW19fYWdjYGdnXVJFS0tRT0pKTUdHTUNITUZGQ0JHREE6ODU8PDg5OTk3NTY1OD43NT04NDc0NTc1NDU0Njk1ODo2MTY4NjMvMC4tKiwvLi0nIyo7WGJCKCosMS0oS5deMDYzUYVmM0FAaWJfUHF1YG59YXeOfXyUjo6Kn5KXnpWcqpieqkJEfYeJiJmOeYKNi46NfIqGkJGPgoOBiYyKhZOFgoaJgYCHd19iUDQ2MC0xLywuMDAuLy4uMDAxNT5BQU1RUlNQUlRVU05TTEVFQDw+PUZIQEFAODY2Mjw5PEZIR0lKTk9RWW2GkHeVi6OnqrW9uKWurKyoqbSssLeysq27sbO+nLPDrLvJy7jDv7elo7CyrKyqo4qWmIWlpqCimIKmmY2iqqekh4WTo6CgqqGkqY6csIuVpKe4u5yho7CTo52jnpGkoqywrbO1o5Wmq4maipOLlXp7foN7ZV5mWmNgXWJjXmZnYFtQREpIVE9GSExHS0hGR0hBS0ZDRkZBOjg3PTw4ODo5NzQ2NTg8NTQ8NzY6NTQ2NDQ3Mzk8Mzg8MjAyNTUxLzEuLSoqLywtKigqJiU1WFgvLDAsLDCEgTg3MVCFaDVBQ1tYVExpY1dqcFh6hXaCk4WIgpyDkpGMktrInZZzVpeIj4icj32GjI+LinuJg4eRjoOFgYyGhYiShoKEiYaHh4dxbmFARTY0PDMvMTEwLSwrLTEvLTQ/REFOVlFSU1VVV1VNXFFHR0Q8Pj5GSENEQDg7PDVDOz1GS0pHSFJPUFeBk6CErqOzqrLBx8Srs8W2rbPAs7i+tr+1wba7u6S4xqm2yce2vrm0qKO0rbCwm5mSmp+Jp6+qpJV3n6SXoauxspiWqa2orrW7srqsr7Wisayytby4ta61oKeoo6ibqbCus7q3uaicuKqNpY+SlKCGeoGAclhfYlVkYGBhX19mYFxVSkRFTFZSSUpLRUtIRUFAQEtEQk1GPDg2Nzs8OTc6OTg2NTU1NzExPDg4OTU0NjY1OTc+PTM4OTEuMDEyMTEzMCwqLC4sKysrKignKilFWjAwKi8raJJPNjBSh2o2QUVXUUpMXFpRY2RXenVxgZR9hIaTdoZ+gI17v7ujvIK0lJOOm4+EiI+Tiol6h4GMk42IhYKOgIGJj4Z/hoiFioeRenlvXVdARU48Njo0NkFCNzY0Ly83Q0hDUVxPUVVYVVxXT19VSUtKQUA+R0tGRkQ7PkA3RDc/QkpLRUZXVFBej6StpLK0w7a4wczKt7zEvbO0wri4wrW/sLh0sbSmusWksMa5sbOytKiktraqsKCilpuikqWxraWtrKekmKCss7mhqLG5tbu+zL/Fxb28s8K4uri/uLu4uq2tsaaxqq6+sb28wsKtmbupla6PmJmriX6AeWhVYV9WaGNpZVZbZFpXVUpIR01SSERJS0FJRD4/QkJMQEBNRDk5NjY5Oj82Ojk5NjYyNDYvMTk1OTkzNjQ2Mjc7PT82OjEuLzU4Ojo2NTAqKCwtLS0sLCooKCsrKEVTLyowMEqPazUyUIdtNj9GUkxBTFJXVFlWWndqcH+PhIGOhG97cniIYrmhmqOJlZSWk5STjY+XkoeHe4eBjZWKgYSBinp8i4iGfIqCgYuElX14enVmUFxkR0VMOlFkYFteU0Y/O0hQRVtjUVFZWVpnWlNgYU1TT0VBP0lKSEVGQUBDPEQ2Qj9IR0pMVFpUXpSvuLW7ucnAu73Kzby9wby4try8t761urLGYHWypbGanqu+qqWoq6qkorO1oKunnpWWnpifrqWnp6Weo5Sip7Czp7KyvLbBvdPJydPGwsXMwsrDwb6+v7y9uLWwube3w7rGvsTJsZ66q6Ksj6apt4qAfG9cXl5cVWBdaGZTWWJXU1dKRkZOS0E+SEQ9S0I9QkA9Rj47SEA3OTYzNzk+NDg5OjU3MDQ1LzI2Mzg5Mzc0NTI2PzhAPkdLUlRUUlBQUVJRSkE5LywsLCorKCgsLSsvUD4oLjQ4gH08MkuIcTk+Q0tFQEpNUFJMUV1obWxxkI2GkHNscnJziNXAtpqgjZWZmZGPl5KWlo6GiH2Hg4yWin+CgIJ5e4uEh3uLeYGKgpd/dH16bGZwdlldXFBlZWJgZWRdW1hYXE5kbVVSbW5fb19YZ2VVWVRKREJLS0hGSEhISEJJOURASEtUVFZdWluTucC5vrjGwbu5ysu7t7q2uLm0uLW1rre3mWR1qZ6tcF6irZ2YoaKbpJ6rpZSfn5CUjpaYmKiepp+fmpmDo52spKqwrLewvLjU0M7Wz8nL0czPzsrHwMDCyr7BvcHBxcTGysDJz7SkvLG1sJysub2afXdpW1xZV1tfWGFiUVxhVFJMREJGSEY8QEY+QklCQEQ9OkU+PUo/NDc1MzU7PTQ2ODk3NzAyMi8yNDE2OTc3NTU1NUQzRUxNPjUxMDAwNjo0NzdASU9KOy4mKiooLS4vLEBNKy81NG2JSTBIiXQ/PkJEQENER0tPRFJcWmlgcJeTkZRubG90dYezrKGhn4uZnJmNjZaRm5KFiop/iYaMkIyJfIGDc3uKg4V7inSBioeVf3R7eWxtdXxpc2VpbGhmamloYGZpaW1abnSXraS9iIdnW29oXVpZVEhLT1BKS1BMU1FITEFKRktQX19iZ2pimLjHsLq0u762scXHtrC5sbG7rbOyqKy4rY22qJ6cp5pOm56Nj6CWkaeYpZWKk5OIkYmQkZKdm6GYm5WWh56Zppqsr6ivp7Oz1NTU1tHLz9PUztPPzMXCytC/ysnLydLIzc7D0NK4sMS9xLqmt7vFon5sYVlaW1ZeVllkWlBdWE9SQ0NJRkRKO0FEPkJIP0BCODtEPkBJPTU2NjU1Ozo2ODc2NTQvMTAxNDYyNzg4NzUzNjdDNUI4Py0wLDEzNDg9OTcsLiwxO0ZMPSksKC4wMDA3Sz8tNDZUiFcwRId3QztCPkVCQUNKTT9VWVNmV3OQkZmCaHJweXmDoaqeppeMm5uYi46VkZqOfYmLho6KiouQiHyFgnB/h4KGe4dyg5KLj35xeXVscXh/cntueHNsaYBwbWNpbnB5aXh9fsu/w9+nbmN4bmRbYWBLUFJVTlleUF1dTVFOVFFVVFxubneDcpeuuKy1qLC2q629wbKrtaaluaesr6KstKSPsa6bmJiMkZSShY+bgY2nkpyJg4uEiomEi4SUlZeXlJuQnJiZmZ6dq6ykp6KsrM7S1dHNy9LT09DU0c7Iw9TRyM7S09PWzdLRxdLWxsHPyMjDqb+40Jx2a2JaX1tVXlFcWlBQVVFPST5BR0JDRj1BQj9GRT5APzo9PTw8SkE0NTQ2NTw4ODg2NjQ0MTIvMDM1MjY3Njg1MzM7PTxFPUAxMSsvMzQ5PzU5MDEwMjItMkVPMykvMy4zMj1OMjQ4Q31fMkGGdEQ6PT1JPkBDRkg8VlJNT1t1h4aLd2x3cH1+gKCenqGMjZmTlIuMk4+WhXmFkJGPjIqIkYd/g3tyfoCCh3qFdoWTkYmAb3dzbHN8fHd8c4J4cWuAcnJpcHJ6eXJ7vsubf42yhHZyhXdpYWldRFpaW1dmZFhla1RYXV1hY15jeHt/jIKZqqSkoqChqaaqsrqrprSjoq6ipK6jp7KgiaablZORipKPiYKUiWuVo42ZhIGGfpGDg5SXrYuVjpWajoWSkJ2Xp6+hoKClpKjIzc/HwsvQ09HU0s7TzcbW083U2NbW2NXX1crV2s3K2NbRy63Ew8yHb2tfXVxWUldSW1BKSEpKS0A7OjxFQ0U9Q0Q+SEM/Q0I7PDk8OkdCNDY1NDQ8NTY4NzU0MzI1MC8yNTQ2NzQ1NTQ0PD49RT9BNjIvLTE2Oz0wODEvMjU0Ly0uO1IwMTcvNTMyRUQyOD5uYjU9gXRNOTlASTxBRD9BO1BMRktZcYB2fmlzeXKCioCdlZ6UhYuWiY+KiY6Ij4B4hJSZi42JiIuJf4R5c3t9g4d3gHuHkZeBhG94cW51gHZ4fXSGfHlsh3Z1bn12hHV5fJ62jTxBi8alfo19amVXSUNlY2ZjaGpkb3lbX2Zoa25pboGDiZKMnp+gnpGXmaCjpKezpaSyoKKln6KpoqOynIefkpKTkYuPi4eEj4R+nJyMjYKEhXqUf4KqlqOMkouYk4t9l4qakaqzmJqcp5ymvcPFuLbFzdHQ0tDL0svJ1M7R1drX19jU2djN2NvOydra0ta/zM20dHNqYVlWUFNQWFVFR0tKRkY+Ojc6QEJDOkdFQEVEQkRBOz87OzdEQzc1NjU1OzA2ODk0NDMzNDEwMTQ1NTg3NDQ0NDlAPkRCQzwzMy42RlRXT1FKQUpGPzIqKC5CVDI5MjU0LzdLNzU8YGJBPHN2Vjg3QUg6P0I+PDlRRUNKVGxub3BicXF0ho19l5Gei3+HkoOJhoWKgoh9eIWXl4mPg4iGh3uFeXF7e4SFdXqFjo2eeo1wfXBweoBye4FyhIeAbo56dXd9fYN1gH2HibB0WarCt42SgXBuYz1eaHJxcXBud3eCZmlvcnV5cnqLh4+UkpuWoJaIjJOcn5ufq6ChrJyimpqgpp+grJqMmo2Rk46FfYiIg4WLjqCZlIiDh35smXqEmYeIk4yOlYyGe5uIk4+uq5OVl56Ypq61vKitvcbLyMnLy8/Jw9LK1NfY19jX1NvX09nb1s/b2tLWydXMknR3ZWRYV05RUlxHQ0ZJST9CPj04Oj5AOz5JPUBCQUJFQT4/Ojg3REI3NTU0NzkuNTY2NDM1NTMyMzIzNjQ3NTUzNDU4RUJEQ0VCNTY8Rk5TTVtuZmNuc2tgVj4sNUxHODY1NDMzQkY0PVdfaEx1eF44Oz9GPDxBPDo5RD5DR1JrX21kYmZsdoCIcZGQm4B5gI5+g4GChX+EfH2EmI6HjH+Gh4F3g3lve3uHgnR6kp6OoXaQdoN0dYF+dICEb4GQgm+ShXV9goV6d4d8ibjGpcPKuIKWnI94cGZOZWOCeoJ3haGRi3l5d3uEgHyEdm2UlpWWkJiRg4mPl5qXl6admKCXn5OTmKOem6yWkZCLjpODjIWJiYKGkJGenJqIhYyBhph7iImfl4+JjouLgnygiJCKvKCYk5eZnKimpa2ep7W/v7+4x8nNzsTNytHV1dTZ1dfb1NfZ2tvX29rZ2M7bxoJ1dWNlYV1SVVVUTUtETkQ7PT08OTo8Pzk+QTY+P0A9Pz49OTg2N0NBNjQ1NT04MDY2NTU0Nzc0NTYxMzg1NDU2NDU1N0hIPURKRTc5MjU7SD47OTs3SVBcWlJVWEw5VD47OTUzMjdJOD1OWU1IeHhkNT0+Qz08QDo2Oj4+QEVRX1lmYV1caXR6eWyJjZJ3dnqKfH6Af4B+hnt+gpGKhYZ6hYh8dn51bX19h350f5KekaCDknyGfniPfnmLim+Dm4F0mYd+goqFfH6Re5Cpj5DDoL2NnKScfoqFfYlzjIuAc6aanJiUhXuPkYmEaUdwoaSejIyRkoWIi5GTlY+dm5OUkZeNjJafnZShlZKOjpGMfpCPjouEiZKWmZ+fiIyUkZ2Qg4x/ppmIhY6DhoSApIWKi7eXnZGUlaGmoJ2dnaOutrm0q8DGytDHx8zP09LS2NLV18DX2Nnb2Nra2dnX3LZ0dHNmZmJUXVlST05IRExDPj0+OTk7Ojo6PD02QT4/PT05Ojs7MzdEQDgzNzg+NzA2ODgzNTc8Mzc4MDQ5NzY3NTU1NDZGUDVETkk4OTM4QUs9OzNDQEk8OkRXTzxNVEhOPzk2MzMzPkM7W1g+NVl5cFo8PEE8PT44NTg5Pz1EUlNSWF5WWGZtbW1pgY6KcXN4int7gHx/fIh7fXyLh4J+dYOGenN6dG2BfoV+d4aboZuelJOAjIh/mIeAnJJuiKmFe6GMfZGOg4mFnX+bkYqNo6KfkaSvoIuRi4WLgZOGV3Kti5+rnJCDmZyQkI5bgqKRgo2fk5WMh4iMkpKMlJWVkIyPioiWnJ2PlpeSjJOUhoCMiZKOi4qdl5ijo4aTnZWgioqIjpyQg4mPgIOHhaSEi5CymJySlJehoJ6Zkpudp7K4rKW9wsfNx8bPy8/MztbQ0dSt1tXY2tja2tfW2dmca3hwY2NZWVVRVVdDQElEPz8/OjQ4Ojs3Ojw7NDw8Pz0+Nzs6OjE6Rz06Mjc9QDUwNjc3MjU1PzY1OzU1ODU4OjU3NzM1SFI3R09LOTk0PUVKQj4xRkNMQjk4OkdYQDVIV0k2NjIyMzpFQ2VYPyZfeWlfej4+OTw7ODg7PEA7QlFLS1NZUFRjYnltYn6Rg29ueIt5en97gX2HfHx3hoWAc3CFgnt1d3Z0hIKFfX+SpqKfpqKXip2QlJeLiqiXcoqzjYSokoSZlIWajaOWoJiTiZueopOpsJ+RlZGOjoiWjG+Nt4SaxMiynaKmnZyYlpGykGSkzceVjoaHiZCSjY2TlYqFioqGlpqcj5GVk4eVmISAkIyZiY6Qq5eXpKOImZ6VmomPh5eXioWPjYF/h4+kiI2TqJqXk5aYoZiemZOcm6KytKWjvcG+x8XFyMjJwsrSzc3UqNLR1tbW2NrU09rOf256ZF9bWltMSFRaQkJIRDtCPjgzNzw8Ojk+NjQ6Ojw6NzI/OjkyOUk6PjY3QkMzMjo5NjI2ND49NDs+Njk0OTs1Nzk0NEtRPEpRSzlBN0JHSUA2NEpFTEY+Ozg4RVRBNz5cODYyMTQ6O0VgWEFGYXRoTGNaPjU7Ojo1Ozo9OkVNRkhTV1NSQmOCR3aBjn18bX6IeXt+e4KCg393d4CDfG1ui397fXh4fISHin6LorOno6qzopenoKWklpWuooORuJWSs5qNoqGMpZywo6SdmZGnlqmarK+kmJWWlZCLmJqXocCOo8m4q5yjpq6Ykpudsp2FhqiinJiFiYmOlYyLk4+IgYaHiZOYlYyMlJOHlJiGhJKQnHWSmbOWl6Whh5yZko+KkYqXm4mLl46GfoyYnomQkJuampOYl5+ToJ2Unpugsa6ipLi+tMXHxL3Dw8DGzcrJ0qbOzdTS0NbY09DYuW51cVldUl1VTkdJTkVBQ0U1Pjs3Nzo/PDw3PTQzNjY5Nzc0PjU7NTxLPD47PEJBNzU8OzQyNzc/QDY/QDc4NDk4Nzs8NTVPTURQUkw4QD1FQUdBNTpKRU5FRDo2QUBCUz45RE8zMjM1NzU9dlw8Ulx0aVpNXVM8PTg4NDY3PTpKRkRHTlpcWUpmYDtJhIt6em6Fhnp9hHiBhoF+cHh9fn1vc416foJ8eIaLiYaEkqa7rKixva+lrbOzqaSisKyKmrWdo7mmla2llqqtuKeko6CaqZiqpK6wqpqZnJSWkZegmJq7u67KoWq3uKuwlZmeo6yTl76jXqqyg4qKjZSHkXyOjn2Dho6QlJWIiJOWjJCVjYuNl5mTnZm0l5WrnYqclJGNkJKMmZuLk56Qi4qWn6GMlI2XmZ2Sm5ielKGglJydpa6ooaS0uKzCyMW1ur28xcfIwtGgxsrNzcXX1tHL1J5sdmRZV1BbUE5FQz89Q0JCOEA4ODU/Rz08NjwzNTM0NTQ1NEI0OTpCTDpCO0FIQzs6QDw3NDY8Qjk/QEI4NzQ6OjY+PDQ3VEtDVVFKNzw6SUFEQDRBSkhOQkE/NkRBPEpORC9UPTI1NDpFSlxYSlpRbWdwcERpYEtJNjc1Nzo+SkBDSVBkSGJgYnBJQIuKfoFzhod9goh1g4qCf259fX1/cHeHd46Ch3yNj4yGjJmqwsCvvca7s7TAvbWtq7O2jKiyrq29q5u7paitubmrp6aioqSjqq+ysaqenKSZm5iYn6OmpZKjuq+pv7ytrrK5paWofoiHnK29sIOMjIuQg46DkY96gYiQjY6ciIiPl42LlZeUkZqWnaiasZqRrJyOmo+SjpSQkJaXj5KgkomVm6OslJaPlJydkqCdm5ifoJOanqalpKKjsLKmwcbDsLC7t8XDw7/NpsfEx8S91tHNxcqFb29eWVdcWUxKQktBRkg/QUBDOzo1PkE+PjU8Nz0zMzMyNDFBMTdAQk0+R0BDTkNBPUM9Ozg2Q0M1QklCOjg3ODo1Qj43OVZLRFdPRjg9NEtAQz40RUtITj5CQTZCQj9CU0U1OFAxNDU7PDg7RD45TGpqXTtXUmRLZ1pVTjc5R0Q/Q0ZcZUZgaWdaXV2TjIyJe4eMh4OMdYeRioFvfnuCf3F+gXqVepKUlJiQk5ans8bJv8HMwsO5x727r6u6u5izt7qywK6mwKSrsLu9qq6ro6Oep6uutbCpm6CqnKGclp+wtaeMo7u6tsG8rKmdtKWlqZSFjqrEw6SCi4+HiISGlZSNeoONkY+RoYyMlJKOiZefmJOZlZemoK+cjKucjZaPkZGVlY6RlZKQoZSHl5+hs56UmZOfoJeknpqfm5+UmJ6lo6ampK+tpcDEw66ot7bJw722z7LEv8S8s9HKyMK0cHVpWVVZZ1BLSENNS0xKQUI+REU8NUFFPDszPTlCMzMyMjYzQTA1SUVOPklASFJASD5DQDs+PUZBNUFVQDs5OTg8N0U+OD5WSkNXT0c4PzRMQEI7NUpLQ0w/Qj88QkY9QUhMOStHPDM2NzQ2NEE/N09hT2FFLz0+NmtsamBAOkg+P0VCZVpNZVxlVGJqmY2WiouIk5CGiXmHlJCBcoB7jX94h4KCkHmNoZaomZqZur3HyMnB0snKws29wrOtvL6nusC9u8S3rMGprLO8v6qwqqSlpKyus622taCgr5+lopmjtL2pnKm9wqO2t6+slLKsrK2Xh5qqpqWRgoyTpZaKgXWKknmFjpKQnZ+Tj5SLj42Uo5mXnJSUo56qnpGlmoyPj4+Vloh8j5aTk6OblaCinLWlkJ6WpKOhpZ2dpZidlZebpKOpp6KyrKi7wMSvpbO3zL+5r8Szu77Cua3Cw8LAl2h1XlZUWFhJSkxJRkRESURDQkRMOjRESTo7ND04RS4xMjI0MkIyNlNITzxKQkpRRUtDREU6RUxCPDdFVj07PTg5PzxJPzpFVUlBV1FHN0E6SzpCNzlKTUJJQEM+PERHPEJDTz0yMEgzNjYxNzA9Qjo9ampKSzVRUzNTcHBkTjtEPUBGPmlIX1hhWmNjVp6PnY6Xjp6SiYp/iqCThHiFf5V/f5CIipGAlqGZraekmMK9x8PHxdPOzs3LvMK4sLq8tL3Lu8PCtra8rbO/ub2ur6igqai2rq2psreanq2ip6Geq7e4qqWvv8WxvbqzqKu3tK+vl5alrKigkY6TssWnlo58kpV8h5KZj6mYl5OTj5KVk6Wdk52Zk6GjopyYn5iLjI+OnYhakJeXkpekmWWYop+ypZWhlaqrqaaanqaXmJaYlKCjqKWetqupubvDtKW0tsvAuKq2q7K7uK6ouLq9t39naldUUlNNRUpSTUs/QkhFRUlIRzk2Rk07Pjc+QUouMzIwMjVDNTVPVk48TEZLUkxPSEdJPklRPzo4SVM7Oz83OT5ETEJASFNLQFdQRjpBP0c2QTc7SE1DRTtDPjRGRTpCQUJHOS86QTM2MDM+R0Q5ND10ZE1HO0UrOmZ8Z1Y7PkBCRkJwRWpJUmVhTEallJyXopeployRg4imk4iCh4KchIOVkJCUj5qinq++r6HGvMTExsbOzs7Syr+7trK7u7u+z7XEvrm5t7OxtbO4s6unnKusuaqop6+vmKSvpKekpbXAsKystL/DucC6tKi6t7m0sJalra+upIuTlaGNdMKafZeahI6XmYywlZqalZKSmZmlo5WgmpaaqZ2boKCZio2PlZxgSpacm5WapZZUlq+fr5yeo5SuraqkmaClk5OYmI2bn6eimbSoqrO7u7ursLLIv7imrKutsrKjobKytKRtamJZV01PSkRPUFBSO0hLSUhKQ0Q+OktVP0E6PUVNMDc1NDQ6QjQ0TVdPO0pLT1VOUUpQSEhKT0I8Pk1SOz49ODo8Q1I+REhSSUJXTklAQkFGMz41OEpLQ0E9Qzs1RUE6QT8+SEA1K0M1Miw+Y11nOjM1dGRlQFI3JiMzfWhXOzpCQ0A9UUVXU3NiV0ZIqpeZoKKor5mRl4eLqJaOiJOFoIeEnZePnaCbo6S0ybWpxbnCxMjKycjMzce/u7OuubnBwcy1yLrCubW6sK+vs7Wmo5uqtLWqqaatrJqlrqWkqKy6v6istre/wsC+ubOzxbO6vq2kr7WsuaaIm5imm3a/n4SZno6TmpqMrpehnJuXlJqfoKieqJ+ZmqqaoaeemJCNkZ2DbnaSopqVnaKdka6yo6uUp6mXqqyjop6kp5KRmZyHlJyinZaxpqmruba9srKuvrm2oKOnqKWmnJutqamLX2JeXU9KS0ZHTUpWTT1ORk9LTUJERDxRVj1BQUJETzE4PTc2P0I3NVVYTz9ITlFZU1BRVUtRSkpFQUVNUT8/PTg9O0dSPEVEUUJHWU1LQUhERTo6MzlLSUI+Q0I5OUM+PEA+OztHNy0yPi0xgmhOelwvMGtoYDw9QkI4NnpmVzs6PS4tUmBNVUh+ZV5IRauVm6Gfu6+ZlKCMk6uckZKTiauNhqGejKOslKOktsa+tMC5wsLHycXCzcjCvrmyr7q1wcLJtcaywry1uqqora2woqOYqrS7pqmmq6qdqa+no6qrvbuorL21uL7HvLe2ucKzv8G1qra3rL6lj6OYkqKgvZ+JmqGZl5+ej7efqZylopucoZqopLOgm52mnKiqnpiVkJSbi5aJjKShlJ2inaC0r6Wlkq+qmaqpnJyioqiQlJSfgo+enpuVqaShobO0urStqLaysp6do6Wbl5SYqqGedVxZXVxIR0VGTFBJTkVHSENTTEpCRUdBV1NDSD1BR1ExO0I3OkJGNzlcWUtBTFBUVVNNV1JOVUpFQEpKTk85REA1PTxOUUM/P1A/RVpNSkFLREdANTM9SUc/PUVBOTdBOzxAPDwzQDwvKDsqSJFCOlNKMCxbb1c3MTwqHUKAZFQ0OS0xOWZcRkNDnXBiR0Wnl6OfnsOtnJelmJqqnJebmo+qlpWnppWtrJmiq7bEw7y+tsHCwMfDv8zFu725srC5s7/Cx7W/sLy3ubalpKurraChmaqqxKKkqaulnqyvq6Kpqb63p62/srm3x7a1ubnAs8DDuLaztLC9o5ejl5SclK6fkKKjpaOjoJC9pamdqaucnKGbpZ69opmjn6KprKGdl46WnpOeh4+EjZOfpKCetaymnJWwppmupZyZqJyfjJiUnoOOoJmbkqWkmpirsbWxqqWqraycmKCgko6QlaielGVfV19cTUhHSU5MSEZESUI+UUlBPEdJSVxST0s9SU9VNUJGOT5HRzVDYVpLQk5SVVdWUVhUUlVJQDhSUVBNOkdBNENIUVNJQztDPkdWS0NATz5LPDA2O0dGPjtGQTU1Pzk6Pzk7MTVEMC0sL012XDRLWjUsTW5XPC09KR4jemJRNUNLUTltUUY8S3hlYVZLopqjnJ7FrKGfrJ+erqCTo5+WpaCmqayYtrGjqrO2xcS9v7XAwrvIwb7Jx7a4tbSxs7S3wcW2vrG4tbi0n6asqqydnp6lpMGln6mtn6Sqra+ipqi8taaxvbm3tsSytLi7wLTFwrm5r7O1taOdpZWSlKGun5minqmorKOawqypnqyum5uemaWgvaGdpJirq6ymoZqNmp+SnomOV3+Wn6WhoLiqppOYtKKesJ+dma2VnY6Yk5yBjp+XlY2ho5aQpa2xq6mhoqWklZWdmIqOkZKknoheYVhiX0tISkpORkVBR0s/PktCOjlKS05dUVFJPUxXXDlGST1ETUg4SGJbS0NMUFNZWVZXT1peSUE9V1FKTD9IPzVITFhTSEE6QEFEUEg/PlE+SzcwOTlGRTs4Rz8uNj43OD43Ny8xPzkxJTFRVW1bSk8xMD1nV0QxNz0tK3dgUzZTW2tXcUdFNj11ZVxLTZ6eoZmfxKimobSinbOolKuloKSframsnbuwqKy2scfFwcKyw8O9xsO8xMm8r7C2rbC0r77DtLmysLq0rJmosamqmp2loafBrZussJuqo66xqaSovLant7u+sLfErbOzw8C0yLS8uKy0tq2qoqaWlZWjrKGfoJunq7Cvr7uxpqCpqJqZmJOio7igoaOSsLCspaafk6KelZ6PkI2Vnpuinqe0p6aMl7Kboq2ZnJqrj52SlZKZf5GglY6Nn6CUi6Wrr6WmoZygnZGRmpOFipGNm51+X2RZZmVJSExJU0FDQElIOztHPzk5T05WXlJTSj9QXl09SFBCTExJOU5jXExFTFJUWVtTVU9cYkhBP1pRQUhBS0I3RkVMS00/O0JIRE5CPTtOQEEzLzk3Q0I5N0Y7KzY8NDY8MjUtLzRAMSsmVnRTZU8/MTA0YltNMjM+MDx2XV4/W1RdZXBAODtIlndlQTSeo5+boMOppKqzoqS1qpazraeipLKsrqm7sq2xtbTGwMTCtMDEvcnEtb/HwbSrtaivuKy/w7O4r622uaWYqrKrq5ifppetu7SbqLCaraCttLKnq7myqLq0ubO5wKq3ssS+tseowK+ut7Wpp6yhmJeSpqWiopiZpa+4rrK1tqCfqaSalJaUpKC3oqWllrCysqerpqKfmpqblZeon6CYoZ6vsqKmjZatmKSqlpecoo+ajJKWmIWVnpOLkJudk4qoqKqipqCZnZWLjpmPgYWUiJOed2FnW2ppTE9NTlQ9Q0FOQzs6SUA3N1JPXV5SVlFBV2BcQkpTSFZLSDpUZFxORk9OW1dbUlBRWF1HQUJbUEJHPk5DOUhHSE9QPz9DSUJMQjwySUE5NDE3N0I+OzdFNys2OTE0ODAxLS8uPDYtI0JxZ3NrMjMvMVtiWjIzODA2cFtiSDA0SW9nVUNXRox5ZkM7o6OdoabAp6ivsaKqtaueurGspKu0trGwubewt7i4xb3Dx729xMLFv7jAxcC5qbakrLutwMG3t6qtsbqhk62xrbKWpKeRqrmqn6axnKugr7Szq6m1tq28rbSzubesuLHDu8DAp8Srsbevqaurp56YmauhoqGRmKGxr7OssLmam6mfmpeTmKegtqmmo6KxsbSss6itoJygoJuepZyil52js6+bn5CTpJmfp5mToZ2Tl4iTlpKVlpySiJCamJSOqKimn6KbmJuShY2Zin2LlYSNmWhma2BsbVdQUVtVQUJFVEA8O0lBODpYUGReUFdXRVlfXk5NUk5eS0o+WWNeT0hQT1xVWVBLVFdaST9EWFBERj9OQD1JR0dRUEI9REVCTT86MUQ/Nzc1NDc/PTk1RTQrNzUvMjUxLS0uLDE9KicrPVxwPT4xLjBkWmM/MTY0N2dZYEYoPzhsfWdbVjuJe2NDPqefnaKqvaKqsKyksrmqpra1rKGttb2vs7i7u763tsDCv8nEucTDv7+3w7zAtq61pqu3sbu9vrSprrG2nparrqeul6aojqe7n6Sss56sorGws6yptbS1va6xsrWssLSzwbvGt6y9sLG4rK2qo7KmnqWqoKSXkJqfs6qzq6uzmp2nnJuWjqGmpLSuqKGtrq6xqLSts6qknJ+opJ6VopmbqLWpl5mRkZ2ZnZ+dj6mclZeElJaKnZibk4qNlpaalqalo6CclpWWkn+PlIV6jpKCi5RkanFmb3FeRllnVkRDTVdEWzlIQzY+XVFoXE5aXUdbXl5PTlJYZEpKQlxiX1FMTU9YV1hQSlZWV0w9RVVKRURBTUBBRkhIUVBBO0dERks9ODdCPTY4NzE5Pjw2NUQwKzgwLzA1LyosLy0qPSwsJTIrKjVLMS8nX15fVDE1MD1gVl44KkMzWVVcZ0s2jHpmTECkmqGlrbekrKqmr663qq+2vKinsbfGt7G2vcHDtbW6xL7MxrnDwLm+ucO3wLixs6upura6ub60qa2wtZeYp6yprJurq46rvp2rrbGjq6CxrbOurbWyuLiqrq+xqLWvtbu8yrOqt7axtK+upqG0oJupraCmlpabmrKjrqGmr5ehpJqak46jpqizqqKns62rtqWvsravo5mdrKeal5+bmau3opeTkI6YnKCXlpKpnZqSf5GXjJybmJaQipSSnpmkoaKgmJaSkpV6i4+FeoyKgoqRam13bHR7YUZha1lJR1paPXtKRkQ2QWJUaVtNXGJLXF1bUlNSYmBMS0VfYF9RTElQV1ZVT0dXVlVOOklWSUg/Q0s/RURISFFOQT9ISEhFPDc9Pjo3NTYwOT84NjZCLC04LC8wNCwoLC8tKjc2KCg5LiQ6SzUuIlVfVF8vNShDX1FcLipBL0pHUFtHM2NZVUtEmZehsqmyqq2mpK+utqq4trqlrLS3yru0u7q/v7Wzt8PAzMi8w7y2vb+/t767sLutprm5trXCtqqtsLeUlqeuq6mjsKmUr7qkrLGzp6ijsrSxsrC0sbezqa+ssqe3r7e0xMa3qba3rLGtqaejtqCgqLKhpZWcmpWynqicoKqOqaOem5aYpqaluKijsrWsqLKorrK2q6SZoKuom5yenJSpuJyUjo6Kl5uhl4+WpJ+blIKQlI+cmpeWlYiWj5eap5ykn5GXkZCVdoOPh3uEgYOLimxvdnR7flxMZm1bS05jXD5ie0dJOEdnV2ZcTF5jTVlZV1VYVGldT09IYFxeUEpIUVZVUktIV1VWTThNWk5FQEZLP0hCQ0tTTT8/TE9IQDs6Pjs2OzA0MTw9NDU4PykwNykxLjIpKSwsLSstOSQwNDIlOUI3LiNBTkdlMjcnR2JMViUsQS49RUxRPDNya0lDQ5GZpa+lrq+rqKWxs7SruLK4oay1ucm5rsG7w7izsbXCws7FwMG9tL2/vrq+vLLDp6i4sLW1v7yuq7Kxm6Cnsa2mpq+lnbK1raqxsaypqLW7rbSytK2zraqsqKypuK2ysMjBuaW6samtraWorrGmpaSvpKmcnp2bsJqjo6Ojka2fpKCgoqump7qlrLa2pqusqa2xtq6jnqOoqpugm5uSo7OZj4mNhpChn5SMk5uekZGDjJKSnJmXlZSHl5KVmaeboJ6Mk5GOkHd9jYV8e3yGiIhwcnF9fHxcU2RvXU5YZVxGRJZbRztObVhiXE1gYk5WV1ZXVFhnXVFSTGNZWlRLR09UU05HSVZTXE47UF5JQkRISkFFPz9LU08+Ok5NQzw8Pjk6NT0rMzI9NjI0OTooNDUpLysxKCkrLC0qJjUqLyYwKTM4OjEmKjNCYzo2KkhlSEoqOkc+M0JIUyw+kGs7R0iPnKqso6qxpKmltLWytbaysqKsrr3Muq7AusextK20wsPRxca+wLK+wMK7vre7xKartquytrzAr6uxrJ+jp62pqaWwo6qyqq+ssK+wrqy0vae2sLKpsqmrpaWjrbqtqrLDuratu6mpqKypp7GlqqWjr6qoop+co62VpZ6YnpmsnaKnqaKtpqSurLizsqKqo6Crr7Gsnp+mp6mZpJmZj5+mmIeEjomLnaCOiouUmo2NhIWPlJ6clJeVhpaUk5eknJ2bi5KQjol+foeFfHZ+hYOEcnFwh3RsX1pgbWFRcnBcSzyFfEY/WHRYYVpOZFxOVlZVV1FcYV5TT05nWFZWS0dMTlJIRUlWUl1jPFBdRDxGSEhCRz89SlBMOj5PSj05Pz0yOjc7KjI1PjEwNDg1KDUvKiwuMzA7KSwsJyUyMzQkLDItODYwKSgxO1xKMC5KZ0VGNjtCLzRFS1gyQJVZPUxFlpitqaKrs5yqqrG3rbm3r6ymq6u9ybywvbbCr7Grs8PDzs/Dv7+0wMHDub+zx8Oqrratsri/vrGsraukp6qwqKipsaW0rqqxrq6ysbSutb2kt7OsrK6oq6CjnrC3q6qturelt7akqqesq6qtoamnp7KypKemoaGsl6qhlZugpp6loqqkraOgp7G4rq6kpqObqqytqp2ipKOkmKCblo+XnJOCg4+IhZugi4mNipeNjomCi5eimpCQm4yTkpGTo5qbmomPi4t8hoCBg3pzf4J/fHJ1i6SHeGtfYGxlV2SGY04/Z5NMRWJ5V2NZUmVVTlZVVlRPXF1hVUtNaFZVVklKSElPQkdJU1FZb0FOWEA6SkdGRUc+PkVRSDhDS0U4N0M3Mjo6OiozOT8uLzQ2Myk0KyosKy4jNC4tKyYoKzc5KiY2KzwtMiwmMDZWWS4wSmdBQTs7Qis6Sk9eNESHPUdGRJeTsKajq7GYq6qutqy3s6ymrKqpvMDAt7iyvLWmsrDDycvRwMC7ub++wbnBucDDrLG0sbO6wL6ysK6sq6uotqqnrq+qubCosrKvs623q7m4prS3q6ykqaqdpJ6zs6mopLS0oLeuoKqoqqirp6CrrKm5tqqqqqqiqqCtnJKqoZ2gpaKmo6qfnai1r6mmq6OkmaWop6qcoqOjn5mZoJCNj5iNfoeMh4OdnYaDiImNjI6LgoWVoZmNjZqQkpGPk5+XmZaMi4N/dYeBf394dIJ+eHZ9gIedj29xZ2Zvd1xfcohqT16ZVkhueVVlV1FjUE1WVFVQT1haYlVIT2lUVVNHT1hVST5JSE9RUHhMTlc9PEtEP0BBPEBDVUM5QUs9NTtFMTM7OjcqNDo9Ky0zNDEqOCoqKyosKSkoLyomKSUzOywkMikyMDIxJS8xUGEwMj9mPU5YP0MsPkxUXzBKaTVPRDyXj7GipqyvmqymrbC0tbCsprCqqbq+u7+wrbmuoravycfI0cC+vbu7wb26w7++v62xsbG1vLvBsbCzqrOppLSppa6zs7mxo664srGzu6u7sKqutquqnqqrn6Ogtq6poZ+wsqG2qp6op6qjqqGira2ovrCsrq2iqKigrJmQsKGYoqCnqJ+om5qrsaqjoK6ioZSipKOnmJqopZiXmJ6PioeUiH2NhoSEo5aEgYGKhY2LkIODk5+Wh5GdkJOQjZGclJePioaGeHWCf3x1eHl/eXJxd2Z+hqR2aV9jaYB0ZoiMfFJYcF9LeHNTZFRRX01NU1pmTkxWWWRYR1JoUlE/Qk5RYVE6SUhMU0lxUUxTOzxJPzs8PTtAQFc8PD9INzNDQjE1OjkzLTU6OiktMzEtLTUpKCstLDQyIzIpJywlLjsuJjEuMC0xNCUsMEtnOjQ4Xz1hZD9GMUNQW1sqSEw5VUA0kpCzoaWnraSnpK2ntbOyq6Wwp6q3vcC7r6e5qqausMnHyNHDvL++uL2+vMi6wLevr7Oxurq3wLKyuqy4rKK0p6its7e6s6iovravt76wv6etrLWrrZypr6OfpK2sqJyeqrKktKibq6epo6ido6moqb6stLCunaqkoK6cm7OilaSbpKagpZubqqymoJyropyTnKKmnZiXqKmSmJqUkIqCj4V+j4OAiJ2PhX59i4aQjY+Df5OakoWTooyUkYuRm5KVh4l/gHJ7en58aXh8eXNubnpmg3eFimRhZl9xg3lsZnhdXlQ/V3ttVGJQUVlMTE5ydV1IWltnWUVVZU9DPkpORENBOUhHS1M/amFJUTg9SDw8PD46PD9UNjo/QzQ1SD4yOzU5MDI3PDUoLjUvLTExJy8+S0gwJRo5MCUsLDA5LywsKzYnMTcjLTBHaUkyNFg9ZmJBSjdHU2BVKj05Q1Y9KpCVspqgoaqmpaKrpbiztKaqsaast8G9ta+iuaynp7DCysnMwba9wLS3v7rItMK0srG0sb23ub21rbi1vqyhs6errLG2uLWsn7+9qrPBtLyhr7O1qqyfrbCjnKWpqqSenKSwpbCgn6upp6GpnKWpoa28qK6xrqGro6Sunp+tppefm6GknaCdm6Sro5ubpaWWl5Wgo5eblqWsjJ6RkZGLgoqAgI6Be5mUjIh7fouFjo2LiYSSl5CGlKOKk5KHkZqRk4CJfXlsfnZ5eGN8enBubnB1Zn9yaoRoZGZda3KMbGBocGBvPVt5bFVeTlBSS0pNVFpXTVxebFdEV19PXk9ITURGOzdIRUtPPHJoS0s5QUU7Oz0+Ozs9SjQ5QjwzO0c8ND8xOC02ODsyKDA5Lyw0Ly49LSpLPikdNDkmJy4zNC4wKy80Jiw6JDQxQWdZMTRTPWVfREw2S1ZkTyo7MU5XPSOUmq2aoJiopKSgqKS4sK+kr6+pq7jBubKtn7mvq6i0usjLyL62wr6vtL23xLbCsa24sbLAtLu9t6i5t72qo7Soqauyr7qxq5y9vqawwba3oq+2taemp7Czn56lpqiippmfrKipnqGqrqagppikqaCxuZ+ksa+hrKGspJynp6iZmpufpZadnZufq6eXnaGqk5qUmZ+UmZahqZGaiY6QhnyHfoKNfXygjI2IeIKLhImLi4WHk5qOiZWfiZGVgouXjpF9hXxzcH5ydHRgenhobW5ubWd9cWN7bWlkYFtkhH5eWXNqcklJf2lYWk1QTEtIUFJRSU9cX25TRFhaUmdOR0tFRjU2SEJMSTVaZUpANkVCOTo+PT46OkM1OT46M0BGPDJAMjMuOjs4MyYyPDAsODVCKiktQiosNDtOTkA7NzMtListNyoqPCU1MzxlYzI0TT9lXUZPPVFaZ0gqPS9XVDUol5+nmp2XrqGhoaWht6uyprS0qai5w7SyraC4ra6tsLXGyMC2vsG5sLS8t767va+qvbC0v7G9w7mpu7q3p6e1qaissq60saicv7imrr24s6Cxt7CopaevsZuhpKClpaCXnK+moZ6jqK+hn6GUpaWiuLChprGrn6yjr5icqqWonpeanqWUm52bnqismp2fppeXmJaejpOXoqiikImLj4Z6hH6Ei3qPl4mNhniBhoOHi42FjZOYjY6WmYqPl36Gl42PeYF6cHJ3cHB0X3l3ZGtramdmgmxlcmprZGdXYHJ/XllrdWlYRX5eWlhPT0tISFJVRzI5Xl5tUERXVVllTEhKRUUwN0Y/S0I2SUpIOzZGOTQ5Pj08OThAODs4OjdAST44PDQtMzw8NzUoNT4xLDtBMSgrNjwjOFI9KjExMz5ENSwtJzQyKzsrMTM5Y2w4NEhCZltIVENUXWhFLjoxXVEsMpeko5iWnauepqGjobiqsKG7uKWsvcOyr66itbCsra+1xcS9s766t7Czubi6uLqurb+ztbivv8G4q726tKWis6upq7StrrOknsO2p6q4t6ygs7yqp6Wor6uZoqecpKaUmKGypZmepKmpnKGflKagpLmopKetpp6loaiToKmhoaCZm56hk5ydl6GjrJycm6OWk5aWnI6Uk6OnpJCJio6GeYR8hYZ9nY2JioZ4gISHh4iRhZSTkoyQlZSNjpR7g5eQi3d/fG11c21tdGJ4dGhmaWZjbYNmZ2hkZmdoXWRhaGVaZXpiYFBzVFtbU0tKSElPU0AgKmleakxDVlVeYEtIR0VDLjpCPEY8NktQRDg6RDM1Nz09ODk1Pzo7ND44QEw9PjkzKTg+PDo5KjZAMy5FNCgrLD4wLU8/ListNy0xMTk1LCYuNS04MDU3NmBzQjNDRGhbS1dHVWBoQjM3N2BMJzKfpKWTj6annJ+enqS2raiqurenrMPAtq+soraup6+vt8DAvLHBt7Gusra1ubi1rKq8s6+ysb2/t668vLCln7aspqe1qquvoaHFrKqosrWsrbS6naepq7Gll52qn6elkpmlraKYnaSqoZuhnJihnqe3pbCrraGhnp2hlaGmn6KgmZyanJSbnpWmn66jmZiflpWPlZmMj5iap6CQh4qKiHiFd4KCgp2HioKIe3+FiIWFkISWlY+PkJGQkY2Se4OVj4Vzf35neXBsa2xndXNrYWZjYXN+YWRlZmRoaGJlblldWFxsY2FMZ1daYFZJR0lLTVJYPjlgbGlIQlVTXFpJR0ZFQS48PzlBODlSRkA3OkIwMzc9NzY5Mjo8OTc6OURNPUI8MCo8QDtBPC01QjM3PSsrLC9BKkpLLi8qKzM3MjIoNTckKzcuNzI2ODVceU4yPkhpWkxaSlZiZkE6M0BhRSU1naWhkoyvoZqZoJeltLKjsr63obHFu7mwsaO3q6uuqbm9vLutwLKur662r7O5sqerubCvrrS2u7avub6tpp61q6ChsqarsKCmxaGzprCysbettJ2rrqyuopmdqKumn5Wbp6agmaWjqZ2an5uVnZ2tsaW6qK6ioZqbnpmfpJqlnZefmJyWmqGUqpetqpyVnp2UjZWajpWUmKenjYyKiY57gXSCgouYhYZ8iIiEhYqMiJKFlJyTkpCQkZePkH+BjY6Db4J/Z3luaWxqZ3Fya1poY2Fxf2BkZ2ptamRoZWNsXGxsdXFiU2JpY2VaSUdMTU9ZUVBVYWWBVEBWUlpURkdGRUAvPD03PzY8RU1hODo/MjQ5QDM3ODE4Pzc9OD5GSkBEOTItPUE9QT0wNUA5QDEtKy4zPDtLNi8uKywtMjQ6NSMzKik2LjU1NDY1WnxdMTpMaltNW0tYZGNAQTFHYEEnNJSjnY+Psp2claGbqbOwn7jAtqC0wbu9ubGmtrCprqW4ube3rbuwraurt6q1ua2ks7Wxr6mxtraxs7a7p6mgtqqen6ujqq6drMSZr6ewsri1rKuesK2vqqKbnaStqZuVnaeknZqqo6WWmqCckpyjrKupu56mpKCXmpqdoY9ro5aZnXGDmJ2lgHaSrKmel5iik4qYmYCXip+OeIWSjYJsaX53hHFshoqGfYSLhm9dZGFnhJiGbIuQlJJ1eIuEf4OQf2aIgWh2amZYXGl0bk1PaWJlcINlXWRmbmpnXFtciZCEiGhPS0Q4RlRnXkpIUVBVVktIUmFwdGVGW1FVUEVHRkM+MTs9Nj02PDRmXDU6PDc1O0Q0ODYwOkI3Pzo+RkxDQjM0Mz1AQEA9MjhART0xLCwwOD5HNzAxLiouKi82NjgsIzEnMjE0OjI4NliBbDE1T2tcTltLW2ZiPkcxTl87Ky6PpJuIlrKbnZShnKqurKO9xa+pt8K4vrytp7expqukuLSys7G5rqmnrLSmsbWip7i2tainrbazrrSutKKqn7SrnqOmnaepnLC/laiosbW5ra2kqKyqq6Whn5yhqKibmKKmppycp6idk56fmZCfqKuktbCjoqOclpiZl6OIoY+SmoehiJWfooClgKitn5WUnpSJhHJ4jY6DiKB1h4xplohmfnN4oG+Hh4R+jHx/oaCgmYB8h590iI52m4prh4KDbmllZHttcmJUhm1kbWmYcVhpb22GVl1oWmtpWYdwa3lyh2iHhFleRk4+Rl5NRlNWVlFQUldUZ15NWkxSUlBFRkc+PDQ5PTk8NzswPDw3OTk6Nj1GNTg2MDxCOzw5PUZRRz0uNTw7QD1APjU5R0E4MiovMTxJOi8wMS4qLygtNDU4MyUmMjExNT4xPDhYg3QxNVJrW09bTFtnXz1LMVRdNy8ojqeYhJ6tnZqZnZ+rqqiqvsOusrm8t8G/qqS3saqsprO1r6+zt6uppbKtpba0m6y1trWlpqmzsq2yqK+eqqGyqaCkpZyipZ6xuJWmqKi3vqatpqmprKeloZ+Zoaikmpmno6SYnKWql5SinJSTpKanobelo5+jmJWTmJSdiK6QmJWKqoyZpJ2GsYGlr6CVm6GXeoLUqICHlMCbxnh3saW3l2SAwJy/eYSEeY+DfJCQkcpxlrycxXtytqe6kHuBbJexq7F5aWxYsa5vZmq8k7xuZ3ltcY7YfVJqYrayfH5wlXWaoaqQVk5XYU9WTUZWXFhQUFOLXFdbUEFcRFBOREZJPDw1Nz07Ojk6Lj07ODc4Ozk+RjY6NzQ+QD42OT9FUkk6LjU+O0I8P0E4Oko+NTIqMjJBRS8uMzIuKy8pLS8xODYtIC80MTZBMT06V4N3MTFUa1xPW01dZ1w+TDFZWjQxIY+nlIGoqp+YnZ6lrbKqsMK9srXAtbe/wqumtK6tqaivtKqwtrSoqKa2pqi5r5yysraqpaSnsq+usaernqelsqWioqCYnKKhsq+Wn6ShtbqjqqigrK2koZ2bmqOpoJibqaCfl56oqJGdp5uUnqKno6Gwo56fo5aWk5iSmYWva2qMjqp/aIWWh61mcqCflpupl3GuoaR/d7p8a6CPdrFfarRbpYBlnJBgZoF6Zn9peGuqZb5zZ6aMdrFqfLF4dZKUY21tp25chKBFaWeIlkV1nF99ZnujpoFYXoqrZ3yMd3tqqDhKr1tYVGxjWktPWWBcVlY7TohQV1YwSVNTSkNFRj0/NDY/Ozg6OTA9ODk5OTo9PEQ4Ozo2PUFANjxASFFHOTA3PEFDPkBEOEBHPTEzLTMzRTMvLjUzLysvKC4wLjo2LyckMjAzQi89O1WCdjItVmpcT1lMX2dZOk41XVczMRuSo5aDraeln6Olq7K4rbS9vrC3xbK4usOnqbCssKmqsa+ksbuxpaWvs6Oquamds7Oxo6Sgqq2wrK+nqKCjo7GcpJ6ZlpmdnrCpmJyjoLWzoauaoaysn52al6CjqZ2ZnqWgnJmhp6SQnaKbl6GgrJ+mpqCan6GVlJGXkZuGtZu1eYepmraZeIe0m7d/lZiYrJd/a4Gme4GFhpGUknerZ2qxW6x7joeUdIlwjoaBf4iRl3iDg4uXjIOgj4WwdnefcmtrbXyLT6VYSGRkmX5jaKZfeHF0UpKGXU+pbWJveoWAYZ0vU6JuW1RrZ2BMS11kWFxaQj6wd1dYQSNNaUVCREFAQTE5Pjg4Ojg0Ozo5PDk6QTpFOjo7NjpDQjg9P0tOSDo1OkFGQkFBRDxGRDswMjAxO0UsMC45NDAsLigvMyw+ODMxHy8yLUQxPDxTfW4zK1hqXE9YTV9mVzdLOWBUNTAcl6CVibSnp6GtqaizrKq7t8KwvMKtubbCq62tr6+or7OqorC8q6Kotq2jrLWkpbO0qKOinaiqsqiwqKafoKCwl6CblpaXm6GxpZybpam2r6GojqmnqZudlpigpqmbn52koJygo6WjlpuemJqeo6ucppqcmqKglpORk5OdhNWTmblxscJ/xod91pScu32cl6iSj52NpHuNhqGApYJ5q3mPnVave4l+n2q5Wrl3h4R9poOUfJl7qXmOnZB7sW2OhHWQvIZvlVCvp8WKUaB6Y2CqYXNyhmuWh15StbTIhX6JfGOkNEOddV1RaWhkUEBYZ1ljYUpITWpKWlNPWWZaQ0Q/RT8wPDw1OTs3NDw8OD06PEM6Rjo7PjY6QEM7NkBPTEg8OjxESENCQ0Q8RUY4MTIxMURCLjAwNDgzKy0pLjMyMzk3MSMlNSo+Mz09UXdqNipZaVtKW1BfZlQ3SDphUDcyJZyjk5myqKmls6qltaikvLjBsLrAsre0vbS2p7KxpLK0p6Cvtqmbqbuuo7GyobK0saGknp6oqbCptKmmnZ6frJiZmZiYlpijrqCcl6musamjno6soqeVnZeboaehmKKio6GboqKonJ6gnpWZm6ehnKeUm5qfoZiQkpWQnYiybmi1cqyIcI+ncrR2dLZ7nJqmjpCdjaN+j56jfbB1gpDS0nVcrnyFf6Rum6qma4eFfa19mJmQe7Fzk52PebNllnSFnm6fZpRSyYtawlyfeWJfrV92c4RhlohdWcqdb79+ck1LtVNVxmRVUWpjZVhBT2tfbGhQVUZIOT1XUltXWEhCP0o8Mj87NT08NTY+Ozc+PD1DO0c5O0A3Oz5EOy5DUkpHPj88SUpGQ0VEPklJOjE3NDZAPi8uMjQyNTItKS4yNiw3NDImHzYwOzU6PVBxaDknV2lcQk1UX2VQNUc9YU02Mi6jnpGmsK2lqbutprSlp7a7vLO7vri4tby8tKa1taOzsqOgrLClmKi7rqWysZy0uKqgpZ2hqqWyqKyqpZqdm6mflpaZmZOUpauimJSnq7GmoZWSrJ+lkpShnKWnoJWbpqeim6Ogrpqgnp2Qlpujn5yllJ2VmaOelZmWkpuFrHx4qHejj4uHqnCtjIWohJqbo4uTm4uifpGXh66Ef4GzXHKyU699goKjfnHXfXeFfo+eh5mad6+GipGciHe0YZplm4GBlWySW7BXS5p1mHlmYa1ednaFZpeIal2vdpWej3drNXnIrrNgRFVvXWdgRVBsX3BtVlVNLmVjaFJZUTtBQ0BMOjU/OTE+PDE2Pzk4QD06QzpHOzw/Oj4+RTktRVVKRUBDOk1LSkJIRz5HSzk3PDQ2Oj4vMDQzMzMuMi4uMTgqLjMyJSEwNDc2Nz1Qa2U+JlZnXEA8VV9jTjZHQmBJOjc3oJ2UobexmbPBraiyp6qzure1ub66uLO3vramuLWhtq6goKmsn5WptqupsrKrrbSkm6mgoKiitaemqqSZnpWloZSUnZqSlqWonJSRqK2wpaCUmaieoo+RopqppaGVmqapnp2kn62coJ2fjZSenJ+hmZiblZaioJSYkaedh6l+f6Z5oY+QhKpwrY2Dp4aXoaOLmJeIo4GQhpSqen+LnXlwsVqog4KIoHh02H92h3Sogo+bjZKkfJaQn4R7sl6cZKB9gpVuk12rXFuTf5F/aGeqY3J6gGqYhnFdq1qJoI9rbWRPSkOhXFtNdF1iZk1aYV9ydGBKVTVKmpFYSEU9R0VBTDM1QTguOz4wNUE3OEA8Nj08Rj86PDY/PUI3LkhWSkVASDZLSU5ASUtARU46OkA0Ljs+MTAyMTU0KyowNS83LCYyMSgkJTY2NzE8T2VkQSZVZls/MFRfYkw3RkhfQzE9N6Kdmpq/rZizwq6rrKintbG4sbW+uruzsrm8qru2obKln6aoqJ+TrLGpsKu3raqvoZiioKalpLmjo6yhl5ySo6CWlZ+blZmioZGOjKqwsKadlpqnpp+MkqSYp6uolpipqJ+goaSuo6CeoY6VoZmgoJKcl5uVnqGWlo+snI+ubnK0dKmMd4umdLR6dbSClKeklJ2NiaSHjnW4b4t7i6Jra7ZaoYZll5dooKKnbZRytHSTmX+zaoaSiK1qdbRhnWaib4aSa5hdrWBOoXyHkVJzo2x5fn1umIZvXK9WPJx3ZVRvbi5bp09jUmtlYmxaYlxgcXxjU1lRPj9sbzJCQkA+TTohN0A2LjtAMzdDNTg/PzM7PENEQkpGTUlGNjJKVEtFQko2SUpQP0hPQ0ZQPTxFNTA7OzAxMC83NSwrLDMyNi8jMDAsLB0yODkvOU5gZUQnVWRZPi5VXmJMNUZNXjgxQTilmpyeuqSbscCuraurqLequK+1wLW9srG7uKzCt6qsoZ2npKKdkqyrqLaktKiuqqGXnaigpau4naOtnJaZkKajl46eoZyZn6CRlJWstrCmmJObrKmWjJSmmaWto5KXq7OkoJ6orLCYoaKQmaGXoJuWm5eglJ2pnZSQq5mH1JSau3WxxIDEh37Wl5y4eYqSmY6Yioynh3mitnV9d3bBg5qyYYO6ecB8dbhitYGMh6l9lYKsqXF7f3W8iKegaZ1hpo6von6NdYerfb5uc7x0soN1eICJbZqIcG2NpHS9XXd9W2F5vGpaVlxqel5pYWNmYm55b1hbWUNBQHE/Q0crNEgiJzs/MTA8Pzc6Qjk5PUM0PEBOWl5gYF9fX1pQUFJLRUZKNEhMUkBKTkVGT0I8RTg0PTkwMjAuODctKi4vMTgwIi0xLDMeLDs6MDhMWGFGJ1RjWDwvU11gSzU8TFstNj85p5qforyjl7DDr62pq62xqLmvt8Sxu7OvvLCuwrKtpqOfpaKdnJGrpaqzpbWnraSglpqrmaesuJ2jrpiVoZGmoJOOnaOemZ+akJaTsLmxq5WWo6enlJCWpZ2krZ+RoaisoJyfqaSynaKkjqahlaGZm5aVo5mQsKCSlaqehZCZtoCSko24lnmDk5u2d25sb3RveY+EjolynsC7vJp7gbKocIF0kbmDfIaGi4aNe4qHjJd9pLu5vZx1ebOjdHWXdXSwdZmeZodqjbZ0c3F3totegHl8iGeDeWx6YouscHSFfldbp2lEZFpUZl9jXWJQZ2ZxbnVCTU9MRDtaTD5KMjswIDg+Oy4zPUE5OT89OzxDNkJUWVpaW1taW15gYmBdU0dHSDRESVRBS05HRU9GP0c8Nz83MDcwLzk6LiwvLSo4LyUmMig0JCg+Ny83S1RfRydTYlc4Kk9dXT0rO1ZWJz06PKadoaG/ppWywrOsqqitq6q7r7DGr7W0sLintbmuq6Sip5+gnZmUraWuq6e2qKifnJahpJ6spL2noaqXlZyRopuSkKKoopSfl5KYlLK1tqyXnaOjoouSkqabpauclqmlppyboaqmpqKooZGsnpeinpeWl52ej7CplJynoo9rf2qdqnqJdH+cj3Z7Zoh7vb7Aum+Sg3GUhV9yalpem4phY4ePlmxgf5VjbZx2YpVsgJmVlGZeYGNxm4locox8hpRman5xdHh/fmNceHWBaFBcboR8fIpqWGx6gnFISm+FcE5xTURWXGZhTFtXZmNeT1ttdWtyUk9ERE08SEg8TD8xLDJBPzgvNT9DPDk7QDs9Qz5SVlZXWVpbW1xdYGFhYWBcVUc1Q0ZURUpPSEZQSUlIOzg9NTE6LjE7Oi4vLTc2PTUmIi8qMiwlOzgtN0lSXkknU19WNClQXkwoMz5cTyc/Mj6on6miwaSas7m2o6ymr6aotrKsyKywtK22pL6ys6ehpKqdo5yamqynrqSltqqlm5iWopynram+qKmllZSblqCak5mmqaiSn5CPmJywsr6rmqadp6KJk5Gpm6iknJysoKOam6OnrKKfqaGZrpuUpqCWlJ2fnZexpZmiqJmdkp+dpaabqKSbnpucm5KXgmhvfnF3kZeUkISJtKqNhZiVj4qMmZeIlJWJg5OTkYmOkpSYlJmXmp+hmpuUn5uNgXqkhWtqfJF9gXWKi4Nygnd5dnaLf3yJanOBdIR0Y3Z9dmtveGxfYltvZ01YWWZqX1dZb3pvbmZTT0ZSOVBaTlJPJyo7S0I2MzU9QEE5OkM+PEVOU1NUVldYWlpcXWBiYmFfXl5bVEtDUkdLTkRHUExPSTw6OzQ4OSwyOzgyMCk2SVJPOCIpKy8yIzQ7KjdGT1tJJ1JeVDEwVF46Kz04XUssPC1AsqCzor+io7Cxt6CqprOnpbC1qsirrbOntqbBqLWhn6WmnKWWlaGsp62kpLesoJmXlqGYraqlwZ+spJaSnJefmJSVo56do6iTkJioqLLCr5mqnKqej5WWqZ6qnJ6hrZmhm52ipa+moaOnnqyYlqWdmZqhnp6dsKGdoqeWmZSZlKKkmKSgmaKPmJWMi46QmK6QfJWcgpGBiamohYCYl4uEj6CIe4SRhYWakYeGipWPm5eOkZieo5aZkpCcjX6NZaGzroWKhHd7kIt+eHl6b2Z5kYGBiGt1gXmJcWhzf3l1g4aAanNid2VfaGVjZGZqWWt7cWpqXFJLUERfVUZAPj4sNEBGOzQ1Oz5BOzw/Pj5ITk5PUFNUVlZYWlxfYWNhX15eXV5dWFZKS0xCSU9NUko7PDo3ODYvMzk2NC4oJiQtMS4uKSsqNyUrPCg2Q01MRC9UXFEwNU1bMTdFNFxHNTwsQLKfua++rautsbKgqqayraOss7DFsKuupLOvvKW1nKGoo6GemZepp6qmpaaztp+VlZ6amrCmrr6hrKKRkZ6ampSSlqGbl6mdhJ2pq6O0x7OfqaOqlpWXmqeeqJygpKyUn5+dn6quqKSiqqGrmp6foJiln5yenbCkmZ+plJqZnpKmnJqqn5yYZoWUfWV/j5uQY3qNbWhqepCjq2plmph+Z4WLZWVpaHqNoo5raIyYkaJ3a2qLmaOfmHNsbXqEjIZ5WGVdhoJebIuLg3dcaHR3d5KAh4FveIJ4gHJteIRzdoiHjoN6aIRYXWp0ZF1ziGhqfHFtY11RTVdKZFhASTM9Rjg/RkQ3MTw9P0FDOztER0hISUxOT1JSVFdbXmBhYWBdXV1dXV9eWlRPREhPS1NOPT49PTY1MzU1NTQqJiYlLColLisrJzYqJDsnL0JJW0ouNlpPNilFWS9ETzFZQjs/Lj2knrq8ua+rsrCrpaitr7Gnrq6wvbGqqaWusLGgrZehpJ6impqmrJ2tpKaoqrSunpakkKOwpre5pa6jj4+aopqTkpugmJimlnukq6KotMO3pKGmrp6dlJ6jn6OdpKqpk5+gnqCqr6mpoqmeppulnqegrJehm6WxpZidrJajn5uTp5mgrJqff72EinS0c4Wfhq1od7nEuHGSoaN6ppmZdKuCfcvAwLpxi6OHg559lpiInsC9gpadnY2cwcF8gXqRjJrCwH1qpbJwjoJvynqAm3iSg46Ad3mBgHlwe3+GcHiEipJ4bHWRYWVeeGRfZYFiXXRobWRiWExVSVFZSE9EMklFP0RCPi88Pz5AQTo4RENCQ0VISUtNTlBTVlleX2BhX15eXl5fX19eXFNNUEdVTkE/Pz02NDY4MjY2KiYlIykqJi4rKikxMB85KiM+SVtMKiNDUC8jRlszUFkvVUFCOy84laG5w7Svr7+pqZSjsKqwr66msrWvqqenprGroKuYm6OgnJuqp6OerKOlqaWltKSeo5Smrqy4tKevopKRmZ2mk5GgoZeboJ6Ipqukq62/v7CgqK6olpGfnaKZoqSqpJShoZ2drK6oqqWioqSfo6ScramSpJqorqqcnqudrqOXmKeYo6SZnn/OlHp7pYJ6lpebX62PXY6ogKGhfKeVm3Wrg4GvXmSMqnuoh4WgdJeTiLNjgquGoI2Ns2qEr3R8loe4YYKtWaPNbpF2e9t7f5lxfoiSdn9le4h1dmt9h219hI6QfmuAjF5wanBnYF94ZFtxaGpjZWBSVFNXXkpPQzRBSEVEOD41O0A/QTs9OEA+Pz9CRERGSUpMTlBST1NcX19fXl1dX2BgX15eW1dPVUo9Pz48NTU3ODE2NCgnJCEnLCYmLygmKzMdNjAkNztTTCssLUowJztcOkwtIVBARjQuMazBwMC0tLC3mJ6RpKqprbWrprKsrKylraawqqGnnJqmmJyir5+hn6ino6ahn7GsnJ+Vpq6tsauorKCUkpufpZOQn6WXnaiknq2jqrCov8Wyp6mxrZaSnpyil6Gqqp+VoZ6dnK2upqmnm6aloqCqkqyzlqWiq6qepKino7Kik5upnKKclpWRl6FyhoyYdoaoh3GwfJ1xrH2goIKlj554q4J+rX+dcq1/rIeGn3aYknt8l3+qiKKMkYycfat6iJOPn396rVacxHuQcJPBfYGVbXVwjG1md2WHbmF4bnJuh4mPjoJsjo1jbnN1b2BmbWRfb2lqbmZjWFNcYFpSUkM4SUhAQzw+PEBGRENFQT08PDw+QEBBQkVGR0VAQ0lTV1laXF1eXlxeX2FfXl5dW1pSQz47OTI0Nzg0NTImIx8cIDEnIDEnHyc0HjUtJjc9V0otPSg+MSkzVkBGIRxHO0MxLiuv08bHsrOgnaOPo6Oirq+3r6mxp6iqqa6rrKeipJ2ao5WfpqugoqagqKijn56wrJiblqinr62op6mel5WapKKSlKGump2no66soqy1qbnMsaymrauWlJydopmfrqydlqGZnp6psaeoqJqqpqOhqpqusaKoq6+mmqesq6uzpJOZpaeclpOFpGukdYp6qXV7snGCpYqYi3GIoJuHpF9hUquFgK6DnHWugqiGhp96mZeGe2aAo4qkmIaCo32pf4GUhq5ee6hVnaKSgnujn4B8xLDFjHOvtLO5cmKpr8J0aIuLlY2Aa5aPbWx4d3dua2ZlZHFxZnxpY11WX2lYWFRMTFBMQ0NBQjtDQEBCSTw9Ojk6PD0+Pj9BPTg2O0RMUFJUVlhbXl5dXF5hYWBfXl1cXVtTSUI2Nzk6NjY0LCYkIiAnJyErLSIkLiEzLSZARFdILEcrNjYqMVBLTCMgQTlENCwnwcnW1sCgmauooa+in7G0sK+prKOnp6urq6mlpqCbpZ+dpqempJ2smqKsoaSgr6Oem5OqpLWwr6Gpm5yWlaekkZuiqJ+fppywpaKosay2x7G0qauplZGdnaGZoKWznZqhlJyep6qqoqyZqqagoamhsq2hqbKyoZyrqrGwuKaUmKaqmp2Tfaptn4SIdqt5fLBugqSLiJ+WlZ6WgdK4tLjJgYKyX2CUqYOliIegepiWmnmqyXSao5SoqZCSmox+momaxsZ3ZaGCpXSCoI6Cfa9fb7VjsXVLo4dtp0eDk2SNj5yQem6UjnxueXR8em1bZmpycWeBaV5hV2NtXF5ZSUxMSkVEQkI9QTxBP0o7Nzk3OTk6Ozs7My42PEFGSUxNT1FTV1pbW1tdXl9eX2BeXFxcXFxYTUI3NTc4NS8pKCUmJSQmKSw1Rk5QUE1GTEpWRipMMS89LTRPVFEdHDs8RjIsJKekwMe5ramyrq2lo5yzuayroaWbqKarrKmmoKalmKujn6+snaahrZqfqaWdp7WgpJiUqKu2s6ycppyglpCmrZKanKejoKqmraCjp6mws8Gxsqmsp5OJl52lm6Kkr6aXopWYnKWlqZmtnKulpJ2ro7aroLG4sJ6csKi1tbanlpmqppyhkIOeTneagoCfe4SjfIKkg4amn5yflIS4fH16uYOAzcbDtnibopKLn36Zl5eKdp+XiqSYpKh+r4Wcg56DrH2ZlGGlbKNxkIWQgX2WhHKsYKRzcYCaYbx9UlV1jZGhlHp7j42GcnlzhX9wW2xud3NqgW5aZF5nbmJkXUtLUVNBR0dGSDo6Sz5CMTA4ODU2ODc3LSo1PT0/QkRHSUxOUFRXWVlaW1xfX15dX19cWlpaWVVTT0hANzcyLiwqLisqJyY/UVRWV1dXWVhYV1VPVEY8RTI6UFtTHBs2P0csLSCLh5mpq6SruauvoJyhrbO0pp+hlaWvrq6pp56lpZqkp6GzrqKpp7OgmqmklKO1o6OWl6Gptbmkm6Odo5OQorKZnpumpaCir6ycpKiitbHDsK2prKmRh5Ccp52jpJyll56YmJmlo6iYrKGroqSXrqS6rKG2tq6enra0urO2qZqgsqSmoIiQ0rXDt3qHjoaRk4+ApneUoneMoZKFpYOMcquIhrRuc2qapJ2Wip99l5mHh5BzroKlm6ONpoqTnYiUkJptcLJcpXOTepxsmX97mX5uqWGicnN+n2Jzsrhod46So5Z7iYmOh3V7eI6CbGh3aHhzboB0XWRjbW1maGBKWVdXPEdGP1MzQEY+PCooNjMuMDEzKSY0Ojs8PT5AQ0VJS05QUlRWV1dZXV9fXl5gYF1aW1pYVVJSUUY6MjIzMC8rKyhAUVJUVVRTVFZXV1hYV1VVVlVRT1FbVSUhMkFIIyolknKNiq2/v7y7tZ6XqKSutqKimZWjqqiuqauZpaKfpqCgtaaiqaexpJSro4+kraSekZqaqrS0pJ2lnKmSlJevoKCepqOcp5yzmaCqo7Wqwq+oqqihjIOPnaKhpqOVmpqcmJqYpqOll6mmq6Cjm6ymvKyUvbCtn6Oxtbutt6meq7Wnq5p8qJJ9fLB4i4CkpYicbbFvoIetfKKPg6iXmoKsioathqGVqKGjmIafgZmWgXuSfquBnZmWi6t3naCPiJOSf3qvXaOBfaanZZ6AfJd1aq5dpWxyhpldYFuMoG2Uj6OWgJGJkoh4eYGXf2psfmJ9dG2AeWBoZW9vaGdoQlhfWj1KUzJTOEFBQzckJDMrJyczLCAvNjY3NDM2OkBDRklLTU5RU1NTVlpdX2FgYWFhXl1bWldTUE9OSTgxNTIuKixBVFZWVlVUVVVVVVRUVVRTU1ZXV1hWVVVRSEZJSiMoKLySmoSpxsO3wbSfm62grrmmo46ao6Sgr66pn6Oena2Ynrmgo6uhsKqarqGRqqmll4qakK2xraegqJutmJmPraKhnaWhmaScrZefqKW2qL6upKmjn4t/jpuaoKaekpSZmpOamaSjopinqqqgop6np7ykl8Ksq6OirbS7rbCpo7ayrK6ad69/kIqchYd8uq2JmGSwjGSWrn2hkISnl5yCrYyFsIeomqSio5KFoFxsa4KzYH+tfHuCgbJsZ26Zl4uHsVp9tVykg2vIomafgXu7WXa1WrJ9U6+BeqxYgKFtlo2lmIeUjZGSeXeMnH1jc3xig3d0gHxhamZvbmZlZk9UYltBU109SCg+OT00ISEsJB8xLiAqMS8wNDU3OTo8QUNGSEpMTlBQUlRXWl5gX2BhYl5fXFtYVVBNSkdDNTUzLi9AVVlYV1hXV1hXV1hXVldXV1dYV1dYWVpaW1xYV1dHQjvSn7Oxt767tMKzo5ytp6W3qaCLmaCfnbKxqJ6in521mKCzqKqrnrCtnqycla+po46Jm46urKmno6iarpOaj6maoZ2kn5mjoqWYnqKosai7rqSonp2OfIublqGgmZCSmpuRmZeonp+Xp6yko6Sio6i6np/Gp6apoay2t66xqqG/sbCwmIKqk6OujpuAhqSXmJCAgLjDuoSPnZSFqJmeg6yMhK+KqZ2bpquSf9W9wqpipL+9fX+jgoPXu7i1hJSSgp69voRro4Jwq4RvnYB6srHHg2ursb2seXiivrt0gJSMo5mMmI2SmXd/j5l5Ynx5ZIxmeIF7YGtlampiUGJbUmlcP1NgQkwpPDo0Lx8fJB4lMiAdJCgwNDk2Njc4Oz5BREZHSktNTk5RVFddYVxfX2FeYFtcWVRRTUhDPjxBPzU9U1lZWFlZWllaWllYV1dYWVpaWVlYWVtbXV1cWlZYVFdau5W0tLLAurK+s6Kdrqels6edjJelv6m2r6ehv6amsZuesZy5qJ+ur6WnlZSvrJeMg5qRrqajrKGlnKqgmIqjk6adppuaoKiimJ2grKypuK2no5qXknuHmZGnm5OPkJeYj5iTqZielqinnqimoKGqup2oxaOhsKSstLWssqyjv6uzsp11dqqktoVliZ9wZ6yQio9ubnelkJuhgnaynJhxkY5yl6ukm5mvpXJtbW1mi3hvbYOacYF6anFpZ4mWlZdyaWmFh2dxh2Rei2NqcFpdZ354pmBicpCScGZkgIyRjp+UlJaNkpp6hI2TdGSGd2eManh+eWRsY2VsYkpkV0lqWTlPY0RPJ0o5KyMcIBsiLCkYGxgtMi41OjQ1Nzo8P0FCREVIS0xNT1FTVlxXW1xgYGFdXVtUUExIRD06QUI3TVhZWllZWllYWFlYV1dWV1ldXl5dXFxcXV5dXl1bW1VXXqiVrbSpurqys6upoq6fo7OqmJK9scPHvLSpnr+rrKOgp6uguqOkrqytpo6WraqQjIWVlq2fpquin6SkoJKLpZKmmamalqKpoJWcpaWmrrmqq5mak5J7hJeNppeNkZCXlI6XlaaTnZamoZmupZyhq7iesMGopbSnrbGzrLCuqrynsryYjKOppbWciZaimIepm4+UnZKqtJqcpK6itZmlpKCjpJ+kpqKWrKeNk5ONh5OdnZWQmZOYkY+VhX+kmpeWjoyUk4qQiIV/aIyBdYN3dYeMcadtfZaTlJSBgY+Pjo6bkJ2Sk5Kdf4WTjHBoj3ZviXd1fHlpa2Vjb2NVYVg/aFpHYl9OVytFPSsmITY0MC4fHCAlMigqNzk5NDY5Oz4/QUJERkpLS01QUFFXVFZZXmBhYl1eVVBLRUM+OT1AQVNYW1xZV1hYWFhYWVhYWlpbXF5fX2BeXl5fX2BgYF9ZWWCllqmqpLW4rq+isKWuoKC3sZCOqsS8w7m2qaGknZulnbCopLennam1p6iRmKyjjIiKj5ynlq2koZqonp+TlqSXqJqomZOloKOPmqeYoLS5p6qYmpCNe4GVi6GUipWRlZCPkpekjp2Yp56as6Kcpaq2p67Br6S4p7Cwsq+srba+pLPBmpOnpaa0opKdpp6OqaCMkp+irbGboqWzq7OapqOfp6ygoJ6emK2ek5qinJSQl6uZjZmal5CXn5GHoJ2VlIaUjZCOlo2Cf2aOiHaId3qIhHScaoiSlpWSiX2MlpGSlpCdjpiSnYGFl4Z6cZRyeYl/cXt+am5kXnBpYFxfWGxiT19jT1g5RkZEPTI8PTcuKiUrKSYdJjQxNjY1ODo9PT9BQUNISkdKS0xNU1NTVVpgYWlhZVVQSkFDQjs5RU1WW15eW1pcW1tbXF1dX15dXl9gYWFiYWFhYGJiYmRiXFtjmJakqKOwtKyvo6qnrqCntaqRj5ujsrmtqquhopl6nKGwpKaxqZecuKajlJipnI6GiomcopCvn6SWqaChk5eZnK6LqpaOp5injJiojp24taOll5uNiXmCk4ybk4qVkZOQjpGWoYucnaacnbaifoOutKKwr3Wkv6SzoHl7o621wJh4sKahioCqfmRcYnafj6Seg5Z+bZS1naWpsa2mZqCilXV7nJlxgZmqmW2ApKmKZZylnJGYmZeMk5yRhZ2bkJWElIiPj5OLhnlskYh2iHJ8hoGBYWmJjJWTjFt2lZBmaI6LcXiflZRkd5eGgXeXaIKJgm55f2twZWB2b2traFtkY2FhbVFZPU1NTVJGPT9TQjkwLx4fJjQ6MzA2Njc4PDs+QEFCRkhCR0ZJS0xUVVVZXV9nZ2dXUUk8REg8OVZSW2BhYmBeX19gYWFfXF1fX19hYWJjZGFiYWFlZGNoZF5dZpyWpqOhsLGsq6qmqa6jp62lkpWqtK6wpZmppaqWc4ucr6Coq6eUl7mgoI+cpJ6RfoiJmp6NrJqklaiino6Xkp6Fda6PiKWZqJGWo4iauLOnn5iYi4l0d5KNl5OJk5CQk4yPkp+MmZ6kmJuwlICMm7WdtIySj72non6no3ulsruEjpCpoISMhY+xqq+MiZajmnmAi6yGnZ+jqauqiZaIm3elnHuInIGYp4SCe56ze4qGoJiZlZiXgZGXloSammJ5iJKFjpCTi4RucpGIeoJygYGGgId0iIaXk3iWaJN0oJp0e5mBm5iEmH6QiYGCl2mMjIRqeHtxcGdleG1pbGpbY2loZHFaW0hTS1BARTUtWVNUNikhMDk9Pjc0MzU2ODs6PT4+P0RJQElFSktHU1hbWFthYWlmWVFIOUVMPD9iVl5iZGVkYGFhYGJiX11gYWFiYmJjZmdjYmFgZWRjZ2NhYWidmKSgpq6uq6itoKmxpqeqpZmTrMS8r6CUpaeznI+Dnaydp6KgjZC+npmNn5qhkX2GjpiXiKydo5ahoZKNlImGgJGojoahnKOTlp2FnrixqJ2ako+FcHWQiZWQipOPjpuLjpGdkJWeopSdqoaftIm0mq6Lyoirr4q3hY2whLOzh6mPqpqNnXuoj3J7d5yOppZolaR5tIyhoKiqlJrCgoGriZmhcp6Am6V+l4aWsoGhfaGTn4+YmICPlJuJmZKLfYaUh42WlIqFbnSThoB7c4eChH2FdYaDmIKPxWaAqYePommdgZ2WgJmAiouDiJhvjZKEZ3d0fHdnaXZwZ2hrXmJubGZqV2RGXFFMMkU0Nk1gYzcmMzxFR0Q6NjM2NTg7OD49PT5CTD9OSUpMQ1FaXVxXYl5qbFtRRT1LTUBKZFhdY2ZoZ2JiYmJjY19fYmFiY2NjZGlpY2JiYmVjYWZjYmJplZeioLCpqaimrKClubGpq6aalJ6hpKmhlKOotaGvf6CnnaWenYmUvZqTjaCSnZB5g5aWkYirmZybmqKFj4x3m5yOoJGHnaOblpiXhaG4raWZm4yMfmJtj4uTj4yPjIyXi4+Rno2Snp+XoKZ9oaeHrZ2glq6QoJ6dkYeCoY2us4mkj6ycjJp9onWAmZRrgqt1Tat4h42dk5yqqYKqq3+Fonx7p2qegJNsZ5eGmLeJnn5uYGNYg5h/jXxkZ4xzmX56mGxdfZhvYVRyh11gbXqEYFllgn6FgZlyqKprg6NucqVvn4GaZ2SebFpsiXtlWV+CfmFXUHB2ZW90cWpqb11pb2xqZ1dmTVxXRThBNEZDXms0K0lDUU1OPTg0ODU5OzZAOzs+Qk8+UVJLTUJKXF1fV15eY3VfTUQ6TU9OVGJcXGZmaWliYmRiZGRiYWJgYmRjYWJqa2RiZGRnZGJnZWFjaJiXnaG5oaqkpqySora8qq6imZaeoKWrq5+crbShp5GgoKGnnJmOmLSZkIuejJWLdYGUkY2KppaWmJ6ffpOFhqykh5yRipiol5makYekr6ailZmHiYBpboiIi46NiYqNkYuPkaGKkpyemqGjf5OBj6OhlKB3nJaQp4OjqYCHrLGIpXqNf4SafKJwcpOHlXuejHlth5uLmpKdqpyPh51+hKJ0d6Znnn53pV+Ye32Tc6JumLe0unSTiIKAtqhkgcW5fHGVtoxygZukZHWsq2F+ap2zfm5+iYSPg4yYcYCja3Kjcp6BfKNenJmzlXB8l56zdHJbnrKDamJxdHVxaG9YamtxcGRbZ1xhS0M9RDZRQVlxMjxTR19KUj08Mzk1Ojk2Qzw7QElQP1ROTlFARV9eW1lXYGB7ZElDN0xXVVZjYVpmZmtrYmJlYWRjYGFiYGRkX2Bja25jY2RkaGRiZ2ZjaGiUlpWkuZmrnJOgjqW4taytoJqhm6KjpKyamrGsq5OYoZmhpZqalJ6sm4uJkXiLhXGAlYyJkKGQk5Sdl32Rio6ooIeYjomRopObmoyKqKekno+Wh4R+anqGfn2PjYOKj5CJjpOfgZScnpufnouJd5yYoo2gcqGMiamJnaiSmauugq6NfnqgmXmjk3iAc5eHjJx9lJ6Gm46anaiIo2ShfoyXkJuNbZ5om45vmpl7gIqnfXJodKuDnoNzqmeUml2bhXeFnmiqaoC5ZlypcIGcYZWMX6d2d4qLgJ1omnWHk5KYjX2ebJiPaqaZXKh+d7tqfalajoRds2dbbnJ4d2tpW3Bpd3dhXmRWYUFQRE43VUJRbTRKWlpeTlpEQDE1MTw7N0g/OkNIVT9ZU1hdPkRiXVZgUWFkfGlGQjlOW11ZZWZYZmZubWJiZV9hYV9fYGBlY15iZG9xX2RlZWtlY2loZ2tplp2JqracqIljlZysu7Gvq52lm5qnn52smZ2wp6uel6OaoqCZlpagpJmGiY1piIByepaIi5aWhJKUmI96i4SWpJyJlY+Gip2SnJuIj6iin5qLkIqAgGmAhXl/lot6iI2Oh46VmX2SoZ2foZKXcmifiqCPjHCSjYKpiZqhpaqjq3+wrqSiuJd2o7Oio3+IlHideqmYf6KPn52ZiZhyoH2IjrC1fWyakaF4fpm1o6OrqISZfJt9nJt/dKpaXW97l4x5nmNNf3t7hmV6mEJNn1mianN9j2+CioSZdpt5h4mxs399mZKmc32dbXB8lG+ZcmmjXZV2SGVjX3RxfH1uZV9rZ3V6YmNfUF1XXFNWQFlFUGdEUlZcYVheSUQ9Qjg/QjpJRTdMRVhBV1JbVkVGYlxaYEtgbX1xRUM8Vl5iWmVqVmdobW9iZmZeYWBcXV5gaGJfZWN2bF5lZ2ZsZGVsaGlsaZSegbCumoRTX6GntLqysqiaoouaqZubp5Kgq6OgqI+enp2amZWYoJ2Wh4eJd4WBbniUhI+bi32Rk5aIcoGJkqGbcpKQgIiYlJ+ahI6onJqVioqKfINshIVxgqGLd4SMiIeRmJR6kaKfnaKHrYZ9tYSPnp17ppZ6qYKXn5GMpKGAp2l4bn6Zc6BzcXydhZhvk4Kse6OEp5+bg6RwX6lodqNkcKZhnNOPfHuZeHJzY6KGkX6icqOQdmuQs4xgg5iLdauzqLx/d4Rvf7+mqrRenG9/cpdwgnSjcl6kZ3SmYGima5rTmHmBmm52eZdrm3l2l3JsqaVnX2V5cX+EbGhmY211dmZfYVFaZVBRYUhWSVRfV1NbZWpbZVBFQ0tMSUtCS0U4UEBRTlhTWE9TUWBlZGlTZHh5d0pHRWRdZVpoaVNpaGpuY2pmYGNfXF1dX2hiYWhlfGReZGdka2RqbGdobWiYm3+wrFRdS36qr7G0sLKinJiEl6agoKKMpKefl6mKmZiZlJqTkqCYjoeFe3B9g2h8j4KTmoF3kY6PinCAho+TkWuYk3yIkZKjlYKNqJmTkoqFiXmDdoiAboGfhnd/kYWGl6CVeJGgopmfiLOhoraLeqynpK6lcamAm5GGgp+VfqWBo5uGmHGehKKtr4qXi3+MpI2Vg6+jlXe1trbKonSUjYOfYJ2XqW15loegm3Whh3egfpGXi4FvTWajk3GbiXSle3p1YoSDbn6gbXJkYJxzf3SYa3tqtLa0xqZzmH15nGqamatzgJpsc3eXaZl5dJhxUER9s15pdmt4hmZrZmJzdG9sVVtSWWhPUWdJVUxYUlVcZ2tuVWdXTUpBSU1LSEpOQVFKUGVjam1ldXNzf3l7bnSJentVUU5tXmhba2lSamhpbGdtZmNlX1xcXF9pYmRoa3tfXWRnY2pmbmxlaW1lop2Ir6eFZUCUorKrr6+1oaKPf5anoaGji6SmnZymgpmXl46XkJCbk46Ig3lreYZlg4x/l6B5dY+IjIJqhYWShIuFnY16jIqVpZKCl6iWjJGLgIh6gH2LeXCPoIV5gJSGiJWelH6SpKablZaEZm54nGyiZHxypXicmHBop4Oajn2le6KXg5Zyn3aBiZSWj7lukIqiYn2ao5eJbnRrq2t1oG5wp2GbaouQaZaHm5V1ooF+mmCLho11b4hiaKFmnn9qm3VxZWeJgm9zoltfW2Shbl6JjXF8gHRyZKVueKJjZqdnl3GKl22hb1KIj26gXmSnVItdVJhtbXNrcYFtcGhrd3NqblFWVVVlWFJsSVhPW0hXaGhzallrVlBSRVZcTFhSYVVoal53dXt8cH18coN7f3N3jYCDd15Rc2FnYnBnUGtoaGtsb2hkZ19dXV1gamJqaXZ1XVxjaGNqaXJsZmttY52mmaZ7ZXRtjKeupamwsaWfi3+VqZydo4uhoZqiooCVmZOOmpCLl5GOinuGcYCIaIqKfJebc3WJfZB8ZYOHlYqJlZqCfIiGlqaQgKGqj4SQioGJfYCAjnNpj6aDfYWSjIeXn42GkailnIimeJWbfqWJloyymZ6RhK+Xn6V6mIl7qXWokYSabqWijJKEjIO8bXylr4KHhYeVmJ6jfqZ8c6iVoZZpn39wrGOWipaTeKhtqqOBiXaJg3erkaaIa5KxbHezjalsi4Zvb6CekpVif6uMqniBgI6nn3effYWklp2gZ5mGdKtmnq2MtnN2voykk1mDpo2rYXZydG97dXBian5uZ2xSVFhUYGBcakxcUVtIXWxtdl9bcVhbX1pnc2Vub3FjcXRgd3p+eXJ5g3OEfoF7e4yBgoB2YnlkY25zZFJsZ2dvbXJpZmlhX15cYWpibGx6b1xcYmlibWl3bWdsb2KWpqqdgYCfpZaqqp6np62jmIiBlqmZnaKJmqScqJ2EjJqPhpyRhZKNjIx0hXqIg2+MhH6Xk3R1hnKRg25/i5KGhZSPfHuBhZekjX+kpI2AjYmElHWCh5NubIuogIKKk42Im52IipKpop+Pf3STl4h+gXmUr6R/gp1xj4Z5k46GgXtzqY1xfX16l5abhY54e319hpOVk4t3kpqho4V8f4ttjYZcenlze3Fpbn6TinKAdIKPlJNxhoSDZo1/X4KBjHh3dJV2cHpvcIluhYZfd2l4jmeCg4aPqpx/dH2WaYmIb311e4J0bGxmjHN4e5d3hFtrV3mPaW53cnJvd3hvXGuFbmlmVlleVlxlamNVYFRdUF5vd3lranZkaWpqdXtwcXRzYW90YnR7gXh1eoJ1f4B/gXmLhYJ+e26AbWR5bl5XbmhodWt4amlqZFxgWmNpZWxxdW5aW2JrZGxreW1obG9gjpS5qaeLoaObpqSZpJ2roZ+Dg5apkZ2fiJmmmqiZg4Gci36WlIeOiomNcoJ8jnx+joR7l450c4RwlYZ8fZKLhoaPhXh+gIaYo4x7pp+KhI+PhJWCho6Yd3GEqoWNkZuOh52dhoqapp+gq4OIjZSbf36Kl62okJOokXlxn5SFfJVwgKyHcX6VcWpwfYGfi3+RjYpnbV2EjI6dnqGRdJeOinN1bIN3dIFZcm+HkYJ+f4xqXWlke4WEiYBgaXl8nHyEjYR3goiFanqNiWxicXODd2B0jYOKkaiWh2eNjoJsdoqBbYKKdm1jZWN5g3qVWlxpZ252W3t5d3Vuc3KDZltsiWtrYllYXFlYa3FbXl9ZXVxlcn16dG90YmpqaXt7cXp2dGRtdGhte351en17eXqAgH9vhomDe31zf3pzf2hUXHJpbHZvdWdsZ2RdYVlqaGtqcXJtV1tlbWxncnlvaGptYIyMq7GikKOhmp6emJ2ZqKGgfYKWq4yfk4aaopGllX97mIV8kpmJiIeHinF9gIp2hIuBhJaKcm+Ac5iHhH6Tg4OGioJ6gIOKmp+PgaWfhneOl4iVioucl4SDeayBkJeYk4mdnIWHoKmeoaKji4eSm52jmparoqioopOdiZmRfnqRkIaqf3+TkZKTnbKmmpSejoywkZiEp46Olp2ii5KdhYqTi2x9j3d4ZoKGkYt9iZ6EiIyPiIiBhYSReHx7dZykioiMoIyHloCAjoOBd3F1hoWAeYqIi5GnkYSHjoeCi4+KeYOIhYx/dGqBg3x5mWlyaGFzinF+e3d3cHd0gV1dboZobl9eWVpcU2dxVWNbWmBrZ3R7e3Jub2Nqamh+e2x4fnBob29rZoB7coKAd399f4R7bYOMhXx6eXx9eoR5T2R3a3NucHplbGViYmBbc2ZwZnJxbVVdbHRtaHh6cGdpa2WNiJ67n5ejoZiVmZiUmKSgnHp+l6mNnYyFn5yLnpd9eJWDe46ZiYaDhIZteIB/coCHfoiThG1rfnqXh4SDkH6AhoSHfIeCjJqdkoapnYJyio+FkpGLnZF8jXupg42RlpSNm5WFhZqln6KanoaDkpqZmZCZpqCmnp6Ql4KUjXl+ipCGp3x9j5CRhpiqoZ2TnY6NqIyRgJ+OipWcoYSQmYCIj4RweYdydWF/hJCId4yZgYSPgYaFf4aElW56dnWUpIyOh5yGhpB2go1+fnRzfIqFfHqOj4WUqJCHhI+BgomIiHOChYWIeW1qfX97bWhrbGdeeX9nfXt2dXZ1e3dcX3B9bXRgY1pbXlBmbFNkWl1gamh0eX5wbGxja2pngH9rcn9ra3Rud22EeW6GgHaCgH2FdnGCjYd+e3t9gHuCi2BpfGt1aGmDZWpjYGlcY3Vnb2J1bWxUYnF5ZW95enJlam1ti4qfuJqipJ+TkpaXi5qfnpx6d5ukkJuJhqSUi5iaeXqNhnyKkoOMgoKCbXt+d3KAhX2KkH1raH2Bl4mBiI58foWEh3yPgY+bm5CIppt/cIuKi5KGoKGKhYx8qJCHjpGVkZSRd4yjoKGdlpuAgZCamJONmqKipJuYkpx/kIh7goaRiaOBfo2Nj3yYpKCgkpqQj6WLj4GckoqUmZ2AlJR/iI+CdXWCcXdhfoGOiHOKln2JjHGNf4OGh49oeHJ6jpqUkYGZgIqNdISKfn9ze3yNhnx7k46El6aUjIaQe4SFhoNzfoCEhXhkcHp/d3lwbGpmXn1zaHx1dnR8c4BqXmB0d3B3ZGNYXV5SaWdUZFheYGdpdXiBcGZrY2xnZX+Bam19Z21wanx3hnpri4FygYF+gXV2go2Gf3x7gIF9f49qcoRudGliiGlsYl9xVnRvbG1geGhtV2pzdmN0enpxYmtveYmNn7OSpaadjpCYj4WcoZqbfHWino2Xf4yhioiblnh8hoh+hIp+iIKBf3B/enN1goV+iZB3Z2N9hpeKgoqNeH2AjIN5loCVl5WNlZ6ZfW+LgZCThaWbh4yJg6aUhJGJlJWRkHWRnaGhmJSYen+PmJeOlpqdpZ6alJWde5KJhXqImY+gf4KLjoxzmKOeoJKYjo6gi4uDmJiElJebgJqPfYmOgndyfm57ZIB9i4dxh5SAkYJrh4OCgIuGZnZwfYiUmo5/lXmOi36CiX59c4F5i4d7hpKLjJmkl4OEi3aHg4GAc3h/hoJzXnZ3fXJ9dmZsZWB/aWp3c3R1fXF8Y2Rhc291cm1hWV9dWmpjUmJXX19nanR4hnBiamJrZmh8gmtodGhsb2h/fIF5bI+FcYCDg390fIOMgYB+eoKDfnyQbXWJdHRtZopsamJjdVaDaXBuYHhnbGFqdnBmeHt5cV9xbIWFkJ2vmKepno6Nl4eFn5OVl3x2p5uKmHmXnIuMmZB5fIGMfX2De4CCgHhzeHlzfYCDf4iLgGRefYuVh3+FiHR9fol/fpiElpSWjKOgln5xhnuTkYqmj4yOipKgkIKPjpOWkIqAj5egmpKQknOAjpKUiZ2dnqeZmY6Vl3WRkoxtiJqSnHyIiZCJb5idmqKSlYqLnYuGgZOdgJSUl4ibin2KioJ7cXprdm18f4x/boWTg5V4cIKEfn+MgWVzan2CmJiGgY91kouGe4l/d3qCf4iCfoWPh42VpZF5hYJ0iIZ7fnFyfoSAa2B5dHlwe25hbmNle2Jub3ZzeHd0dGF3YG9sdW5wXVpeXV1pXU9cV2JgZ2xyeohqX2lkaWNod4dtZmxoaWxngHx6d26PiHOAg4V9dIGGiXqDfXqBhH18jnJ5i3l4bmyHa2hfaXJih2hxb2V2Z21sYXpoanx7eHBhd22LgZmZq6GlqZ6Li5GGiZ2LlJZ8dqyYjJZ8n5ORl5SJd357inx8gHZ4f4Bvc3N6b4V8gICJfnxgW36PkYeAhIRyen+Geo+Rh5GRm5KkmpOBfIF8jYqSpImNio2WmoyEj5eRlI2IiIySnZOQjI1uhJCPkYmemaKhmJiKl5NwjJyGaIqbkZZ7iYWQinCWmpShkZGIipiMgn+Sn32TkZSNmpB8i4aIdXN1a3FudX2LdW+GkY6ScnSAfIKCin5nc256f5uVfoaKdpKNg3WKe3GDgIOJfoaOi4aOlquOe4h8foqEdnxubH2CgGFmd3N0bnphXm9ha3RecGp6eXltdHFlel5ubHNtc1lZXV9gaVpPVldkYmVwcH6HZV1paGZiZ3CNbmNoaGVoZ4B6d3RvjoVzgYKDfHaDiYV4hXx4hIZ6gIl3f4t8e3N5g2pqX3BodH9rcW9tcWdva2V7YW1/eXdwbHd3iX+jmKOooaebiIuKgY6chpKadH+olJGNh6GNlpSRgXR8doV4eH9yc3qFbHFveGyJdn+Ahm5xW1l+ko2IgIGBdnWAf3+gho+KkpyXoJKWd4l+gIyInJ2Kj4aSl5aFiJOYjpaLio2OjJ2KjpGDbYmLj5GKnJahnJmWhpmJbIimhWiJoIyTgI2FjIF4lJiSnZGQiIiTjX9+kJl9ko6Rj5uTfYuBhXB2cGxub3B8hmpzg4+Zi3J4gHWCiYN6aHVwd4KbkH2KhnuWk3x4inZyjH2Ij3yMiIWKj5yliXyEdoGKfnd3a2h+f35bcXJxb293Wl5wYXBrXm9qfHpxbm1qbXdgcG9rcW5ZWGBgYGxXUFJZZWVhdG+EgWFda2xkYmZrkm5gZmZfZmqBdXFyb4uAdH+DgXl2gYuAeYZ/eIeGdoOFe4aLgHt3i39qcGN8YoV8b3BsdGpobmx3d19xfnl7dHVzf4J+pZWbrZ+nl4WMg36WlYOOnXSJnpOShYubjJaOjHpyeHSCcHKEdHF1iGxubHRsh3aCfX9tblVRgauUh4J4gHZygnmCoIKQgZKSmJqRmHeQeoKMkqOak46IlJiSg4WVmIqSi4mOj4idhJGLfXKKhYiPiJyZnpuXloGVgGmJn4ppiaOKlIaShIpxg5GYj5qNj4uLjo13e5ORe5CMjpOXjn2JfoJsd2pvbGxte4Bien6Ql4J3e4J4g419eml2bXaIl4yAiYh9lZJze4ZyeY98jI98in+FjpGfoId9fHeBinx2b2dpfn92XXZubWtwclVdbmJyYV9tbnlwaHBmZ3R2aXFsYXdmXVVlYF9xU1BNW2VjXHdviHteXGhwYWJlZpFqX2dkW2dvfW9scXOJfXZ8hoF1dn+MeXyGgHiHg3OGhX6MjIR8epV4Z3Fqg2CHfm9va3tgaW10gHRec3x4hnh0c4V8eaGQmrGcpY+Din+CmYh/iZt+iZiSjoSImI6Pj4R3dHdzgHBvhHRwcYNvaml1bYJufHxtdHNSToLfyZLWk3xvdIN1g5+CkXaUkJibj5h7k3KFj52hk5OQiZKak4V9lZWHjI2Hko2JnH+OgXh7jX+IjImcnJyblpR7jndpjJSKboumh5WKmISGY4yRmI6UiZaLjImLcHqVinyOiYuUkot7h32AbXxlc29rbXt6W4F6kJCBe35/gIaPe3ppdWt0jJCLg4eGfpeNbYCAcIKOgI6JfoV8hJGWm5yMfXd4go53cWtkbnyAaWdzbmdpc2xTXm9lcFlfbHF3Z2trYmd5dHBwZGB4YWBVa19ddE9NS19lYlt3cIlzXFtkdWBiZWWOY2BmYlhpc3Nta3F2i3xzeYaCdnd+i3OAh396iX9yiYeBkImJfX6ZdmVzbnxlh35ub2t/WWxueXpyYHZ6e412cnaJdnmfjJyvm6CQgoR4h5R+e4ibhoSdkI6FjJeEk4+IgXV3cHlxb4RwbW1+cmNkd3B8bXl8amhsY6Sawdyu76JzbHaDdYShhJBulY+Vn5OagJFwhYqhlomOlYqQnJWCgJSPhYiPgJKKipd/h3t2f4p4hoWNm5uXmZCQd4x3cIqLjoCNp4eUi56Ghl6LlJeKjoiNioqEiWx8l4N+iYaLk5CHd4d/f2x9ZHh1am96dFiJe5KIhnt/f4CGjX96Z3RqgYqPi4SEgY2Yh22Dd3CJkoOShoCEfIGSl5SbkXV0eIeLdHJwZHJ2f19ybG9haHRmUmBxZ2tVX25zeWFyY2BpfnFzbltjc2FjVm5aW3ZMTEtiZWBddXKJbVtcZHheYGRlhF9jY15YaXJrbmtyd4t9c3aEgXh4fIlxg4V9fYh7dIuIh5WFjH9/mHNodXF5bYt6bnNwgFdxenZ5cWR2eYaMaHaAiXGAnYiZqJyjkoR9cIuTd3iJm4OEn42OfJaNf5qIhXxzd3Bzam+BbGpsfHReYHd2e3B0emdgZXzr2rXJw9yJc2x0gXaJmYiMaJePj5uUkoGIcIWIn42Fi5WKjJeTe4ySh4KIj3qRi4aPgoB3eIOEcoeCkpuWk5iHjXaIf3GIhYyKnaWGl46ghIphhJWPhoiFiIyGgIdofZSAfoOFi4+Pg3KIgIByd2h2cml1d2xajX2Tg4Z+gYSBhIuDd2J1bYqCkYyDf4CUk39wg216iJGIlIZ9g3+Bk5SRmIpucXmLhXRqb2lvdX5dcmhtXGl0X1JkcWlmU19xdnRgcGBdaIRxc2pXZ2lkaVdtV1tzS0lLZGVdYXFyhWlbXGV4XV5kZ3pgZF9dWWtuZW5qc3eKfnNzgX57dnqIc4WEfH+HdnaJhY+YgYyCfJR2bHd2eXiTdG53enxYeYZxgG5neHaRgmR2hoVwipeGmqGbooqGc26RinJ2jZp9ipmIiXyff4Saf4J5cnNub2RyfmlmbHd3W194enpxcX9pYWdhf9W2jpGmeG5xd3twkpCMhWmYjYiakIuFemiHi5mGgZKQhoaXjXuMjICAiY17kI1+iYV6dXuDfHGGgJWZjZKUgol2hYh5hoOOlqCiiZiSoYCJYX+Uh4SHg4iMf3+CZn2RgH+Ag46QkX9uhH6EdWxtd3V0eHZrY46Cj4GGf32FgIWJf3BgdHKGfZCOg32Akop7coVne4WMiY6FfYaAgZWQkZSFbm94i350bG1oaXh6YGdpaVhrdVlSaXJpYlFicnhtYmVeWmqEbnRiXGhgZW1eblRabU1HTmVjW2ZtcH9rWVticl9cY2x2ZGVdXVpsbGJsanN2hn9xb398fXR4hniFg32Ah3V4iYCSlXyJhneJgW94eXqEkm9teoB2XoN/dIFsaHpzlHNncod8cZKShJqfm6CHhnV1k35tdZKVfYePhIqNmn2MmnZ+d3JvbGphdHxnYml1eVpgd3t5bXB+ZWRoaFedj19yc5e8xIR1cZSIj31xlouGm5KLh3JpiI6VgHuVi4GEmot7ioZ8eomLf5SIdYmGdnd+gXJ1hYGdlIWUj4SEc4GKd4d/jJygnImWj56BiWZ9k4J/hYKIiHGBfWZ+jHx5f4CJjZB+aoF+hXZmcHl4dHh0bGqPhouCi4F5g4GFhIFsX3N5e36Oi4Z8g5CCf3ODanqFiY2IhnmFfoKZjpGNfm5teoh8dXNtZmV7dGJbcGJXbnFTU25zaGFOZ3V4ZmBeXVlvgW90WmZiXmtuYHBQWWpRRFJmYFlqbWx7bllbXWxiWmJvdmRnXF1ga2lja2pzdoGCcG5+fIB0dYN6g4N9gYV2fYiBlpB4hIt1gYhyeHl+jZBvb3qAcWmBeHp+bWx7dZVraneEc2yTjYafmZ+ZhYdufYt1aXeWjX6AiYOVl4p6kJZve3Rxa2pkYHN6aF9lcXpaYXJ8eWdweWFlZI+xsndLYlql2dCWcXqQio93fJOKhJiQi4Vua4WRkXp5koaBhJiJe4Z/d3eJioSWgG+LiHF1fntqeYWDpZCDk42EgHCAhXiGfImfnJiOlpKWhYhwe5OCfYKCiIJtgXZogIV5coCBhYuIfWZ+f4V2ZHFzgGl5cHB1mY6Gg4t9d3mBhHqDa1xyf3OCiYaKfoeKfIlzgm5yhoiRh4d0hnuCmo2OhXlubn2DfnV5Y2Zoe29eWHZaV3BsTldxc2dgS2x3dGFeXFtadX5zcFhnXmdqcWBvTldnUT5YZV1ZbmpneXBaWlhqZVljcHhfZ1xeZWxnZmtpcXd/h25sf36AdXCCe4CCf4J/doGEiJeJcYKNcXuGfHp5hJSMdWp5fmtvfnR/fG9ye3qTb2+BfnhnkouCoZmckYKFZoaCb2d5lIh9foSCmImBfI6NaHhza2tmX2BveG1fYm94XGRrgnpgcXVfZWXU6r2LMjo+i45/cXmFh42MdYKWjH6SjYt+bWuEjIx1fY9/hIGUiHuCd211hoSDl3duiIVsdXt1ZnmBg6aLgo+LhH5ugXZ5hn2JoJOPk5SVjoyHf3uShnh/g4yCa39xaIB+eW58fIOLhHhieoWCcmVyaX9udXJ1gpyMgYCGgHR2f4F0gnBbboB1eYyEi3yIgX6JeXtybYqFkoWNdIN6gJiMi4B1bmp2gH90c1tnZ3VuV1Z8U1lvZEtacnJlW0lxeG9cW1tZXXV/dGlaYltoZm9jak1XZVA9XWVcXHVlYHRvWlhUbmNZZHF5WmhdYGdtZ2lraXB3fY5saYKEf3lugHx9goCCenWCgI2ThHCAi254foB7e4iTin9oen1qc3tyhnpzdn1+jHl4hH18a4uNg5uelouBgGyMfWpofo2Len1+g5SCfn2KiGt1cWdoYltiZnJuX2Frc2BocIh5YnNzXmNkm6CPbl02Wq+1dGmAiHyRhnWFlYVzjoqJdm9rhIKHdHmJeIh8kod5fnJmdYh+fphvcYd/aXZ5bmZ5h4SkhoCHjIp/b4B4goSAkJyKhZeTmoqMhYl8kIhxe32Ee2h+bGqAe3pqe3eDiIFzYHiCf3Jlc2d2g251fIaWkoJ9g4FweHp8dYBtWHCAd3WNg4d4iHaEiXx5dG+LgpKCh3OAfn+UiYp8b25pbYGBdG1bZWRxb1Baek5bb1tOW3JvZFVLc3hpV1laWmFxgXVhXl1gZ2RpaWZOWWdNQGBjW2B1YF11bFdXU3RgWmRvcldqXWJoa2dtbGhwd3ySa2iEin18b35+fIKAgXp3gH+Ki4NxfIdvcniDf3uJjI+Dan17bXZ4dop2fHh/goZ/g359em2Ei4eYo4yEg3t1inhqbIOHkHh9eoKRgIB+i4NwcnBjZl5ZZl9wb19gZ29mam6JdGF0b1thZGp1eoC/nKakyLhxhYJyknt3hZKCc5CLh3Jyb4N6g3N0h3SHd5OHeHlwYnaHeoCTaXKEd2d3dWNqfIKHnYGAf46PfnOBdYd8g5aThnuZkJeQiIKJe4mJa3h5fnRnemhrf3lzaXp3gYR+aGB4iX5sa3RofIFpdoKMkpV/fH+AcXx3fHSAYlZ4fnN0i4WCfYRyiIp5eXJxhYOPgIB6f353j4aEd2pxaGyHgXFvXGZgcWxJZHVLXW1VU1lzbmJRT3R4YVJYWF1hcINzXGJcaWVlZGtkUVtwSUNjYFtjb11deGdUVlV2XltlbmhWa11gamdlbm5ocHd6km1piIx5fXJ7fnmCgYF8dn2DiIaDb3eEcm53goJ+iIuTf3CAfHd4eoGMdIJ4f4GBgoR6gHVvfoqLm56HfYV5d4V6Z3SFi5B5fn97iIWEd5CAZ3BuX2RcWGRZbHJhYGBwbGtoiW5gc2hZXmNuf3ep2qnHhoeycYh3b4x0eoWNf3mSiX90c3N9dn9vcX9thHOThXh0a2B5gnmJj2ZyhHBodW5bbX1/kJJ/gHiRk355fG+KeISUjod3mY2TkIiGhXyAhW10dX5sZnZkbXt2bmt3d4CAfWFjeYd6aXZ2Y358aHWHj42WfXaBd3GAe31ugVpXdX9wdoWIf4B6bYqHdXlsdoKEhX99fnp9dIyCfnRodGVuioNsclloXXNkRm1tS1phV1ZVeG1iUFJ0dlhQVlheYHKEb11hY21lZF5vY1RccUZCZV5dZWddW3piUVVbdFtaZ2tgVmpeYG9mZmtxaHB2eI50a46NdX92eH53gYSBe3R9g4iHg29ygHRxdX6FgYmNi3t3gHiCe3yFh3eHfH2BfYSAe35ydXmLjaCMiHmIdnSCeF59hZeLeIWDdIWGhHiKe2JubFtiW1tgVmlzYmBbZ25vZodyYXFlV1xia398ys6HuaFqbW2Ja3GDcXuDiX56kIR5eHN4dHR7amx1YoN1kYF2bmZffYJ6jIplcoJranFjWGx6hJuIgYFylpV3f31wi3OFjY+KdJqQkomGi4N7eX5xcG98ZGdwYW14cWttcXh+fnpdZnuBeGp2eWaDd2h0iIyOln5ziWtvfoJ5b31eWXSAbXSBi3yCb3CKgHJ3aXiBgoGDeH9ze3WIfXtzZ3JhbouAa3BWaVx2W0dtak1WVV1TVXtrYU9UdXJQUVRXXmN1hWldYGxqZmNab2FYYm9HQWdcYGVeXFZ7XU5VZG9ZWmpoXVdnYF9yZmpocmdwc3eGeG6Vi3R/end+eoOIf3Vyf4eFjoJwcHx4dnZ6hYWHjIZ6e390in19hoSDh39+fn2Gfnx5dXh3kZOffot8im11f3hjgoaVhnORim+FhYF7hHVjbmpZX1pcXVRnc2RgWGRxcmeAcmJrZFZaX2p/eL6ue5+2bWFzhGdzenF4gYV6fYt+d3dydW97dmVqbmCGdY6Ac2lhXn55eYuEZnF/aGtrWlZvd4migIR/cJmTcoF6d4VwhYWVi3aYi46JhYmFfXl0cm9oeF9pbGBtdmtoa2t5eHt3W2d+fXlmc35thXVldYaOhpeAcY1oa3uEdW52Y11yfmx1fYx7gmd2iH5vcml3gHqAgXR+bXt8g3t4cWZsYW2JfWtsVWlfdlVKaWpOUk5nTFh8aGFOVXVrTFBUVV9ndoNnXmFxaGdiWGldXGtnSkRqWWJjVllVeVlNVm1pWV1rZFxZZGJedGZsZHFncnB1gXdwmYZ2f353f32Fh311c4KIgJSCbnN5e3p0c4SGiYmDeYF+dY5+fISKjYOChHt+ioN7d3x3d5qcl3qIgoZpdnx7bIODkn9yjoFxhoJ/g4BwZmxmV11bXFpTZHBkXldicnVpdW9lZWJXW1tof3BvcoBziWRkeXxoc3VzcoGDd4CCeHZydW1qenFhZ2tmhnONg21mXV99cHuJf2lteGdqZFVXcm+MpXyEe3aWkXR9dH59cH9+lIh5m36Jh4OHg311cHFsZ3Rba2debHRkaGZpem98clpogXd1aXGBeIJ3YneGi3yVgnCNa257g3JndGZhb3tnc3iKfH5jd4R3a2xydnxyfHt1f2h/gIB5d29kZmJthXtsalVoYW9SSmhpT0tOb0deemZhTVV0ZEpPU1dha3d/Zl1ndGlmYFdkV2JwXEtLaldjYVVUVXJWS1h1ZFlea2BbWmNkX3ZmbWJwaXRvcn91dJmCd3+Ad39/hoR6fXWChH6XhW1ydHx6dXGEhY+BgHqLdnOQf3yBlY2AhYR9fYyGen6Bd3ujpYp5h4WDa3R7enWCgIt5boRzeYR9goN2b2poZVZdW1pZU2JuZFtYYXN7amhsaWBiWF5aaX9pa3CAZ2xgZ3l3aXJzc2yDgHl+e3V0bXpnaXlqX2VuaIB2j4RmZVhid2p/h3tvanBnZl1UWG9njad2gHp8kI56dnGAcXV4fJODe5d2hoSAhoh2anJ1Z2duW2xkXW1yX2hhanlofG1bboNzdWtwgX56eGF3hoV5kYZ0iXJxeoFzY3JqXXB4ZXJ0iHx5Y3SBcWdqenVzbXp5dnllhHyAeXdxZGRjbXt8ampUZ2FlU0prZk9HUWpFYXhmYU1Tcl1KTlVZZWx4e2ZfbnFqZF1WYVVublZKU2dXZV1YTVVrVElbeF5bX2tdXVpiZV95aGxhb292bnB4dXqYfnd/gXmAgIeGenl6g36Bk4NxdHR/end0hIiRfYF8kWtylYB7gp+Ffod9gH6GgoCJe3eEq55/eoeHgmpygHl1gH6AdG6Gbn2Ac4qAam9tZGRZX1pZWVRiamdbWl91gmlebWxcYVdbW2uBZXF0fWlpXGp2dGZzdnFrg3p9fHh1cmx5Zml3Zl1kcmd5d5KAYmJUZXBogoV4eGdpamFXVllnYo6nb353gIuOe3Fyf2l7cX2Pf3mRc4V+gICGbmR2cmRnZ1xqYV1vb1toX211ZXtoXnWBb3Jrcnx+dXZidYaMe4mIgoF5c3aAdmJxbltydGNxcoV8dWVzgG1hbXtxa2p8e3ZzZ4d3e3p2cWViZG1yfWlqU2ddXFRLcWFQRlZgR2N2ZmFLU29YS01YWGhrdntlZW5xZ2RaWF1Yd2VUSlxiV2dXWUhXZE9HYXhaXV9sW15cYWNefmlqYG90eG1wb3aDmHpygIB8f4mMhn12doZ4h4x8c3V1gnl7eoKMjnx+hYlpc5aBeoqcfn6FeoF7f32GiXNxj62Le3uGj3xlcYd5c3x6dXJuhWx7fmyPemNwb2JlXWVWWVlWY2ZrX11cc4VoWHBuWl5YWltremJwd3ZsYVlscnJmdHVva4N3fn94dm1uc2RodGVbZ3RldXaReV5cUmZna4OCdH5iZGpcVFddYWKOpGl4c4OGkXlucXxqem9/iX53i3SCeX15gGlkdm1gZl9eaV9ddGtZZl1vb2N6ZVx4fWxvb3B4eXR1ZXOEk4CHhIp8eHBzfnRjeGVccXFicXKBfHRnc4FlX253amVoe311b3CDdnR9c3JiX2ZtbnxkaFNmV1hTTXZeUElZV0hidGNhSVNsU0pOWldqbHJ8ZG1tc2NhWlpbYXdcU0tjXVdoU1ZGWF9NRml1WF5gbFtbXmFiXYRpaGFueHltcGt2gJB5bYJ+gIGTiISBdnSJdIyGdHF2dYJ4fX1+jJB/fpR+cHeVg32ZknmAgHh6fX90iIR0cJmgenp+h5R3Y3SHeHJ3dGt0b35reHxwkXNecG9gZ2JsVFpaV2hjbWZcXHGJZVNxbltaWFdfa3ZkaXVqaV5ZbHJva3NzcmiEfH5/e3ZubWtkaXBjW2tyZHR2jnNaVlRlYXKAf3KCXWJjXVNZYFtjkJ9lcXGFhJJ1bGx7b3ByfX9+c4J4gXR7enpkZXVnXWJZYGdbXnZoV2JdcGlheGFcfHZqa3JveHRzdWlxgpaEh4CFd3Rrcn5vZ3hYXWxuY3JzgHp0Z3B+XGBxc2Nha3OAbW52f3NyeGtwYVxlbGx6YGZSZVRXUU91WlBPWFFIY3NhYEZValFKUVpWa2trfWZub3JiW1pYWWxxV1JQZlZWaFNURVlbTkhxdFhfY2xiWGBgYF2LamNkbXp4bHBpdXmHe2uDfYCEmnyDhHl8iG6Ph3Judnp9dIKCfIuPgoOYdHiBk4WBnol1gYCCdH+CcYiDdnChlnN5hYqGemR2im5uem5meHB5a3J2c41rXnRuYWdla1JdW1VnYWxrWlxxjGRPb21cVldUZmlzaGJ0ZWRcWG10bG91dHhqhXx/e4d2j3NjZGtuYFxtbWNzeIdrWVRWY2R4fX1xhl1kX2NUWl9YYpWVY21wg4WKdGtpfHBndXl2fm17dXZwe391X2ZzY1tdVmFjWGF0ZVVfYG1kYXFdXX5waGl0cXRxdXdrbYWUgol9h3JzaHB/cXRwVFxna2ZxdIB2c2Ntd1Zjc2xcYHBof2dueH5zc3NqbWFaZGlqd15lU2NUVVBTbFZQVlNQR2RyX2BFV2lPSVhUV25pZX1pbHhsYlddVVt0ZFNSV2hRWGZUU0dZWU9Nd3VaX2VraVlhYF1ejm5iZmt5dm5vaXV2gH9sg4B9h5h7gIeAiX9rk4hyZnSAe3WAg32Jj3+Mk3J8ipGEh5+Ge3+GjXSBhnN+gnZupItygIyKdnZseYtgZHtwZnlzeGxtcneDZ2R7bGJmZ2hTX15VZ19rb1tebo1oTWlsYFVWU25mc2tleGVkXFhvc2txendya4d6f3acenlrYWVsbV5gbmplcXh+Z1lWWGBseHx7cIRfY15nVlhfV2ObiGJrcIGHfXhsbHpuXXhzbn1rdnRvcHyBc1hqbl9ZXFVhYldkcGJTX2JpYmJsWmF+bGZsdHZvbXd3bGmGjYCKfIlucmdxfm50bmRbYWlpb3SAdHJfaW1TZXJlVmRwZHxlc3h9d2twbWtgWWFmZ3RcZFVgVVJOV2RRTltOT0hkb1xiRllpTUpfS1ltZGB5aW5+ZWBVX1RddVxTUmBmTlxgVVJJW1hQWXR1XV9la2hYYmBaXo1xY2dqeHFzbmh2c3uDcoKDeoiOfnyJh415bpCJdGtzgXR/f4iFh5KElo95fYyPh5GbhIB8jYVzgIFzdHhzb5OTk5OTk5OTk5OSkpKSkpKSkpKSkpKTk5OSkpKSkpKSkpKSkpKRkZGQkI+Pj4+Pj46Ojo+Pjo6NjY2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2NjIyMjY2NjY2Ojo6Ojo6Njo6NjY6Ojo6Pj4+OjY2NjY6Pj4+Pj4+OgoB+enp9fn59fX9+fn5+fn5+fn5+f4B/gICAgYCAgH+AgYGBg4eMjo6Ojo2NjY2NjY2NjY2NkpKSk5OSkpKSkpKSkpKSkZGRkZKSkpKSkpKSkpKSkpKSkpKSkZGRkJCQj4+Ojo6Ojo2Njo6OjY2NjY2Ojo2Ojo6NjY2NjY2Ojo6Ojo6Ojo2NjIyNjYyMjI2NjY2Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjY2NjY6Ojo6Oj46Cf316e3x+fn19fn1+fn5+fn5+fn5/gH+AgICAgICAf4GBgIGDhoyNjo2NjY2NjY2MjIyMjIySkZGRkZGRkZKSkpKSkpKRkpKSkpKTkpKSkpGRkZGRkpKSkZGRkZCQkJCPj46Ojo6NjY2NjY2NjY2NjY6NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY2Ojo6OjY2NjY2NjY2Njo6OjoJ/fHp8fH1+fX1+fX19fn1+fn5+fn6Af3+AgIGBgYB/gICAgIOGi46OjY2NjY2MjIyMjIyMjJKRkJCQkJCQkpKSkpKRkZKSkpKSkpKSkZGRkZGRkZGQkJCQkZGRkJCQkI+Pjo+Ojo6Ojo2NjIyMjIyMjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Ojo2NjYyMjI2NjY2Ojo6Og398enx7fX58fX59fH1+fn1+fn5+fn9/f4GBgYCAgICBgICAg4aLjY2NjY2MjIyMjIyMjIyMlM7a2NjY2NqagYSEhISIXS0wMDAwLUahoaGhoaGgmpmampqamoqDhISEg4R3ZWdmZmZjgL67u7u7vbNtZmdnZ2dlkKGgoKCgo4BjZ2dnZ2ZvhIODg4ODg4uMjIyMjIyNjY2NjIyNjY2NjY2NjY2MjIyMjI2NjY2NjY6FfX17e3p9fnx8fn19fX59fX5+fn5+f39/gYGBgICAgIGAgICChYqMjYyMjIyMjIyMjIyMjIyU2+nn5+fn6px+goKCgoZTGB0dHR0ZN6SkpKSkpKOcnJycnJyciYGCgoGBgnJdX19fX1t+yMTExMTGu2deX19fX12QpaOkpKSnfFxfX19fXmqCgYGBgYCBiouLjIyMjIyMjIyMjIyMjIyNjY2NjYyMjIyMjIyNjY2NjYZ8fXp7enx9e3x+fX19fn19fn5+fn9/f4CBgIGBgYCAgYGBgYKFio2NjIyMjIyMjIyMi4uLi5KXmJiYmJmZko+QkJCQkIyHh4eHh4eJk5OSkpKSkpGRkZGRkZGPjo6OjY2Ni4mJiYmJiYySkZGRkZGQiYiJiYmJiY6PkJCPj4+LiIiIiIiIiYqKioqKioqLi4uLi4uLi4uMjIuLjIyMjIyMjY2MjIyMjIyMjIyNjY2OiHx/eXp6e3x7fX19fXx9fX19fn5+f39/gIGBgYGBgYCBgICBgoWKjIyMjIyMjIyMi4uLi4uLkZCPkJCQi46RkYmHjoqQkpOPiI2Mjo+Ij5GRkZGQkJCQkI+Pj4+Pj46Ojo2Ojo6OjY2OjIuLi4uLi4uNjY2Ojo6OjYyMjIyMjIyNjYyMjIyMi4uLi4uKi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjI2NjY2Jfn14eHl8fXx9fX18fH19fn1+fn5/f4CAgIGBgYGBgIGAgYKChIqMjIyMjIyMjIuLi4uLiouQkJGRkY+EjpCQhoqPhY2QkYqHjouHjYeKkJCQkJCQkJCQj4+Pj46Ojo2NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjY2MjIyMjIyMjIyLi4uLi4uLi4uLioqKi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjYt+fHd2eHt9fHt9fXx8fX1+fn5+fn9/gICAgYGBgYGAgYCAgYKEioyMjIyMi4uLi4uKioqKipCQkJCQioWOiI6Gho+JjZCRioSMi4aPhoyPj4+Pj5CPkI+Pj46Ojo6NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uLi4uLioqKioqLioqLioqLi4qKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIyMi357d3Z4e3x8fH19fX19fX5+fn9+f39/f4CAgYCBgYCBgIGBgYSJjIyLi4uLi4uKioqKioqKkJCQkI+Fg4yOkI6JjImNkJCPjYeNhoyJiY+Pj4+Pj4+Pj4+Ojo6NjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKioqKiouLi4qKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyKfXx2dnh8fHt8fX18fX1+fn5+fn5+f39/gICBgIGBgYGAgYCBhImLjIuLi4uLioqKiYmJiYmQkJCQkIyGjImOh4WNiY6LjIuFh4eGiIaJj4+Oj4+Pj4+Ojo6NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLioqKioqKioqKioqKioqKioqKioqLi4uKioqKioqKiouLi4uLi4uMjIyMjIyLi4yMjIp/fnd4ent6enx8fHx9fX5+fn5+f35+f3+AgICAgIGAgICBgIGEioyLi4uKioqKiomJiYmJiY+Pj4+PkIyOi4+Mio+MjoyNjYmNiouMiY6Pjo6Ojo6Ojo6Ojo2NjIyMjIuLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uMiIB9eHl6enp7fXx7e31+fn5+fn9/fn5/f3+AgIGAgICAgYGAgYSKi4uKioqKiomJiYmJiYiIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Pjo6Ojo6Ojo6OjY2NjIyMjIuLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uKioqLi4uHgHx4enp5e3x8e3x8fX5+fn5+f39+f39/f3+AgH+BgYCAgH+BhImLioqKiomJiYmJiYmIiIiPj4+Pj4+Pj4+Pjo+Pj46Pj46Ojo6Ojo6Ojo6NjY2NjY2NjYyMjIyMi4uLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqJiYqKioqKioqKioqKioqKioqKioqLi4eAe3l5eHp8fHp7e319fn5+fn5/f35/f39/f39/f4GBgICAf4GEiIuKiYmJiYmJiYmIiIiIiI6Ojo6Ojo+PjoyMj5KPkI6Ojo6Ojo2NjY2NjY2NjY2MjIyMjIyMi4uLi4uKioqKiouLi4uLi4uLi4uLi4yMjIyMjIyMjIuLi4uLioqKioqKioqKioqKiYqKiYmJioqKioqKiomJiYmKioqKioqKioqKioqKioqKioqLhoF7eHl4enx6e3t8fX1+fn5+fn9/fn9/f35+f39/gICBgICAgYSIiomJiYmJiYmIiIiIh4eHjo6Ojo6Ojo6Oj4yQk5CQj46Ojo2NjY2NjY2NjIyMjIyMjIyMi4uLi4uLioqKioqKioqLi4uLi4uLi4uLi4uLi4yMjIuLi4uLi4uKioqKioqKioqJiYmJiYmJiYmJiYqKioqKiYmJiYmJiYmJioqKioqKiYmKioqKioqFgHp4eXl8e3p6e3x8fX5+fX5+f399f39/fn9/f3+AgIGAgICBhIiKiYmJiIiIiIiIh4eHh4eNjY6Ojo6Ojo+Pj4+OjI2QjY2NjY2NjYyMjIyMjIyMjIyLi4uLi4uKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiYmJiYmJiYqKiomJiYmJiYmJiYmJiYqKiomJiYmJiYmKioV/eXp5eHt7ent8fHt+fn59fn5/f35/fn9+f4B/f4CAgIGBgIKEh4qJiYiIiIiHh4eHh4eHh42NjY2Ojo6LjY2PlY+JjI+NjI2NjIyMjIyMjIyMi4uLi4uLi4uLioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJhH55e3l6e3t5e318e35+fn1+fX5/fn9+f35/f4CAgIB/gICAgISHiYiIiIeHh4eHh4eHhoaGjI2NjY2Nj4yMiYqPjYiMkY+NjY2MjIyMjIyMjIuLi4uLi4qKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4qKiomKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmDfnl7enx7ent9fXt8f35+fn59fn9+f35/f4B/gICAf4CAf39/g4aIiIeHh4eHhoaGhoaGhoaMjIyMjIuJjIqIh4mGjI6MkIyNkY6MjIyLi4uLi4uLi4uLioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmIiYmJiYmJiYmJiYmJiYmJiYmJiYiIiYmJiYmJiYmJiYmJiIiIiIiJiYJ/eHt7e3p6fH18fH1/f35+fX1+f39/f39/gX+AgH+AgICAgICDhoiHh4eGhoaGhoaGhoaGhYyMjIyLjI6OjIqKh4SIi4qMi42Oj4uLi4uLi4uLi4uLi4uKioqKiYmJiYqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiYmJiYmJiIiIiIiIiIiIiYmJiYmJiYmJiYmIiIiIiIiJiYiIiIiIiIiIiIiIiIiIgn94ent6enp7fHx9fX5/fn59fX5/f39+f4CAgIB/f4B/gICBgIOFiIeHhoaGhoaGhoWFhYWFjIyMjY2MkJKMjYiLiYmLi4uLiYuMioyLi4uLi4uKiouLioqKiYmJiYmJiYmJioqKioqKioqKioqKioqKioqKioqKioqJiomKiomJiYmJiYiIiIiIiIiIiIiIiYmJiYmJiYmJiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIeBfHh7fHl6enx8fH19f39+fn19f39/f35+f4B/gH9/f4B/gICAgoSHh4aGhoaFhYWFhYWFhYWMjI2Rj4+NkYmMhomMi4iIiYyJh42Oj42KioqKioqKioqKiYmJiYmJiYmJiYmKioqKioqKioqKioqKiomKioqKioqJiYmJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIeHh4eHh4eHhYB6eX17e3t6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+Af4CChIeGhoaFhYWFhYWFhYWEhIuLjo+OjIuPiIeJiYyNhYWOjYqJjI2LjoqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYqKioqKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eGhoeHh4eEfnl5fXp6ent9e3x9fn5/fn59fX9/f399fn9/f4B/f39/f39/gIKEhoWGhYWFhYWFhYWEhISEi4uMjoyMjYuHiYiKiYaCiI2OiIqLkZOPi4mJiYmJiYmJiYmJiYiJiYmJiYmJiYmJiYqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIh4eHh4eHh4iIiIiIiIiIiIiHh4eHh4eGhoaHhoaGhoaGhoaHh4N9enl7enl6fHx7fX5+fn9+fn1+f39+f35+f4CAgIB/fn9/f3+AgoSGhYWFhYWFhISEhISEhISKio6NiYiIioqHiIeKiYiKiIiHioaLkY+KiYmJiYmJiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIeHiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaHgnx5eXp5ent7e3t9fn5+fn5+fn2Af39/f39/gICAf39+f3+AgICChIaFhYWEhISEhISEhISEhIqLkI+JiYmLioeHhYeJi4qJhIuNiY6NiomJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiYmJiYmJiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaBe3h6enh7fHt7fH5+f35+fn59fX9/f39/f4B/gH9/f39/f4B/gIKEhoWFhISEhISEhISEhISEj5CPj4iJi4iGh4iJi4uMi4mKio2Kjo6PiImIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhoB7eHl5eHh6enx9fX5/fn5+fn1+f39/f3+AgH+AgIB/f3+AgH+BgoOGiIaIhoOEhISEg4ODg4OSko6Kh4qLiouHi42JiomLiIeKi4iKj5KKiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGf3p5eHh4eXl5fH1+fn9+fn9+fX5/fn9/f4B/f39/gICAf4CAf4GCg4eOj4+OiIeEhYWGhoWFhZKQjoqJiYiIiYqKiIiHhoqMiIeJiY6QkY2HiIiIiIiIiIiIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHhoaHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYZ/eXh3d3d5enl7fH1+f35/fn5+fn5/fn5+f4B/gICAgIB/f4B/gYGDh46Ojo6OjoyOjY6NjYyNkJCOiYeGiImJh4iKi4iJjImJhoqNjo+Ri4iIiIiIh4eHh4iIiIiIiIeHh4eHiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWFhn55d3l3d3p5eXx7fX9+fn9+fn5+fn5+f35/f39+f4B/f39/f36AgYSIjo6Ojo6Ojo6Ojo6OjY2QkY6LjYmMiIiJhoeJhoiKiIeLjIuOkJCIh4iJiYmIh4eHiIiJiYiHh4eHiIiJiIiIiIiHiIiIiIeHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWGhoWFhoWGhYaFhISEhYWGhoWEhYWFfnl3eXZ4eXh7fHt+fn5+fn5+fn5+fn5/f35/f35/f39/fn9/f4CBg4aNjY6Ojo6Njo2Njo6NjZCPjY2LjoqGiIqEhIuJh4OFhIOLiYuPjYmMjpCQj42NjIuNjo+PjY2MjY2Pj4+OjoyNjIyNjYqJiIeIiYeHhoeHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh4eJioqIh4mLjI2OjYuIiYuLjY6NjImIiYyAeXd3dnp5eHt7e31+fn5+fn5+fn5+fn9/f35+fn9/gH9/gH9/gIGDhoyNjY2NjY2NjZCPj4+Pjo2MjoqJi4yMh4WJjYuHhoiHhoeHi42Ojo+Pj4+Oj4+Pj4+Pj4+Pj4+Pj46Oj4+Pj4+Pj4+Pj46Pjo6PjoyLi4mHh4eHhoiGhoaGhoaGhoaGh4uJh4eIiIuNjYyLjIuNjY6Oj46Ojo+Pjo6Ojo6Ojo6Ojo2Ojo2NjYB4dnh4enh6fHp8fn5+fn5+fn5+fn5/f39+fn1+f39/f3+Af3+AgYOGjIyMjIyNj5CSk5OTkpKNjIyMioeKjIqHh4mJhYKKi4iJhYmOkI2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2MjY2MjYuJhoeHh4eJiouNjo2NjI2Njo6NjY6NjY2NjY2NjY2NjY2NjY6MjI2PkI6NjYyMjIuLfXd1d3l6ent7en5+fn5+fn5/fn5+fn9/f35+fX5/f3+AgIB/f4CBg4WPkpGQkZKTk5OTk5OSkouLi4uKiYyKi4uJi4qGh46NiIiMjo6Mi4yMjI2Pjo2Ojo6OjY2NjYyNjY2MjIyMjIyMjIyNjY2NjIyMjY2NjIyMjY2MjI2MjIyLjIyLjIyMjYyMjIyMjIyMjIyMjIuLi4uLjI2NjpKTk5KSlJGQk5WVlJOTkI6Ojo57dnZ3eHp6e3t7fX5+fn5+fn9+fn5+fn9/fn5+f39/f3+AgH9/gIGChI2SkpOSk5KSk5ORkpKSiomKjImLiomMi4qKiIeJioqLiYqNjYyPjo2PkpSUk5SUk5OSkZKQj46OjY2NjY+Sj46RkY6Mi4qKiouLioqLkI+OjIyMioqKioqKioqKi4qKioqLjIuLi4yMjIqKi4uLjpGSk5OTlJSTlJOTlJSUk5OTkpKSkpKTkXp1dnZ4e3t7enp9fn5+fn5+fn5+fn59fn9+fn5/fn9/f4B/f3+AgYKEi5GRkZGRkpKSkZGSkZGJiYiIioyJiImJi4mGhImGjIqHjJKSkpOTk5SVlZaVlZSTk5SUlJSTlJSUlJWVlZWVlZSUk5ORj5CRkpCOjJGVlZWTkpKOj5CNioqLioqLjY6NjpGSkJGSkpKSkZGSkpKTk5OTk5OTk5OTk5OSk5KSkpKSkpKSkpKPeHV3eXp7e3t6e319fX1+fn9/fn59fn5+fn5/f39/f39/gH9/f4CBgoSLkZCQkJKSkpGRkZGRkYiIiIiLi4mDh4uLjIyIh4eNjI2SlJKSk5OUlZaWlpWVlJKSk5OUlJSUlZWVlpeWlpaWlZSTlJSUlJWUlJSTk5WVlZSTkpOTk5OQkZKRkZKTk5OTkpKSk5KSkpKSkpKSkpKSkpKTk5OTlJSTk5KSk5OSkpKSkZGRkY92cnd6ent7e3x9fn19fX5+f35+f35+fn5+foB/f39/f4B/f4B/gIGChIqQkJGRkZGRkJCQkJCQh4eHh4iIiIWLj4qMjo2Oj46QlZSTk5OTlJSVlZWUlJWTkpKTkpOVlJSVlpaWlpaWlpaWlJOTk5OTk5SUk5KTlJWVlJOSkpKSk5OTk5OTk5OTkpKSkpKSkpKSkZKSkZGRkZGRkpOUlJSUlJOSkZGRkZGRkZGRkZGRjHRzd3p6e3t7fH19fX59fn5/fn5+fn5+fn5+f39/f39+f39/f39/gYOEipCQkZGQkJCPj4+Pj4+HiIqLjI2Ni46PjYyOjpGSkZKTk5KSkpKTlJSUkpKTk5OTk5KSk5STk5OTlZWVlZSVlZSTk5OTkpKTk5STkpOUlJSTkpKSkpKTk5OSkpKSkpGRkpKSkpKSkpKSkpKRkpGRkZKSk5OUlJSTk5KRkZGRkZCQkJCRkJGKc3R2enx8ent9fH19fn1/fn9/fn5+f35/fX5/f35+fn1/f3+Af4CBgoOKkJCRkZCPkI+Oj4+Oj46Pj4+Pj4+Pj4+QjY6OkJGSkpKSkpGSkpOTk5OSkZKSkpGRkpKTk5KTk5KTlJOTk5OUk5KTk5OTk5OTk5KTk5OSkpKSkpKSkpKSkZGRkZKRkJGRkZGSkpGRkZGSkZGRkZGSkpKSkpKSkpKSkpGQkJCQkJCQkJCQkYZzdXZ7fHx7fH19fX5+fX9/fn9+fn+Af359fn99fn9+fn9/f4B/f4GBgYqQj4+Qj4+Pj4+Pj4+Pj46Pjo6Pj4+PkJCIjY+QkZGSkpKSk5OTk5OSkpKTkpKRkZGRkpKTkpOSkZGSkpKRkpKSkpKSkpOTkpGRkpOSkZGSkpKSkpGQkJCQkZGRkZCQkZKRkZGRkZKRkZGRkZGRkZKSkpKSkpKRkJGRkI+Pj4+Pj4+Pj4+Rf3J0eHx8fHt8fH19fn5+f35+fn9/f4CAf31+fn5/f35/f39/gIB/gYGBio+Pj4+Ojo6Oj4+Pjo6Ojo6Oj4+Qj4+Pj4aOkJCQkJGRkZGRkZGRkZCQkJCRkZGRkZGRkZGRkZCQkJGRkJCQkZGRkZGRkZGQkJCRkZCQkZGRkZGQj4+QkJCQkZGQkJCQkJGQkJCQkJCRkJCQkJCQkJCRkJCQkI+Pj4+Oj4+Pjo6Oj4+Pj494cnZ5fH18en18fX1+fn5/fn5/f39/gIB/f39/fn9/fn9/f3+AgH+BgYCKjo6Ojo2NjY6Ojo6Ojo2NjY6Pj4+Pj4+OiJCRkI+Pj5CQkJCQkJCQj4+QkJCPj4+PkJCQkJCQkI+Pj4+Qj4+QkJCQkJCPj46Pj5CQj4+QkJCQkI+Oj5CQkI+Pj4+Pj4+QkJCQj4+Qj5CPj4+Qj4+QkJCQj46Qj4+Pjo6OjIyNjY2MioOJiHNzdnh9fnx5fXx9fX5+fn99fn9+f3+Af39/gH9/f39/gICAf4CAf4GBgImNjY6Ojo6Ojo6NjY6OjI2Njo6Ojo6OjY2IkJGQjo2Ojo6Ojo6Ojo+Ojo6Ojo6Ojo+Ojo6Ojo6Ojo6Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo+Pjo6Pj4+Pj4+Pj4+Oj4+NjYyNjI2OjIuLiYmJiIWFhIOCgoSCdHl9enh1cmtlaW1vbGZmZ2dwc3N3eX1+eXp7fH19fn5+fn1+f39+f39/f3+AgH+Af4CAgYCAgH9/gIGAiY2NjY2NjYyNjIyMjIyLi4uNjIyMjIyMjIaPkZGMjIyMjIyMjIyMjIyMjIyMjI2NjYyMjIyNjIyNjYyMjI2NjY2NjIyMjYyKiYqLi4mHgoCHiISBe3qAfnt9fHx9eXNycnJydXVwbWtqamlnY2RhX1tcXV5YVVdYWVNLRUlKSktMTU9PS2B0dHd5fX14enl7fHx9fn5+fX5/f35/fn9/gICAf4CAgIGBgICAgICAgYB/g4SFhIWIi4uNjIyMi4uLjIaJioqKioqHg46QkY2Ki4uLi4yJiYqKioqKi4uLh4OLioiJiYaFhYSEh4mJhYKDf3t8eXp7enNwcXFxbWxqZ2xtZ2VmZWZkY2VkZWRlZWVlZGRkY2FhXl1cWlhYV1RQUVJTUlNNTUpJRkRISkdHSEdHTE5JZ3N1eHl9enh3eXx8fHx+fn5+f39+f39/fn5/gICAgH+AgIGAgICAgIGBgWdeYGNhY25xfXt6e399d3x8dnh6e3h4em9we3h5e3x7eHd7f3h1d3R0dnV0dnd1cXJxbnBycGdoa2xub21qaWloaGVlZGRkX2BhYmBgXl1ZWFpaW11dX2BfYF9fX2BiYV5eXl5ZWV1cXVtXV1ZSVFJTU05RSkhJRkRFSExMSEZHSUtKSU1tcnR4ent6d3d5e3p7fH5+fX5/f35/fn9+fn6AgYB/f4CAgYCAgICAgIKBZ1hbWllcW1xjXFpcXmBrcW1wcG9ubm9ua2lubGtsb2ppa2tpamtpZ2ZnZ2dpaGdtZ2pnaGVoZ2JjYmFiYGBdWFtbV1hXVFZRUFRTU01KTEtMTE5OT1RYWFdVVVRSUFBNTVBPTktMTVBRT0xMSkdJSUdISElISEhHRkdISkpISEhJSUhJVnBzdXl6e3l2dnl6ent8fn19fn9/fn9+fn5/f4CBf35/gH+AgICAgICAgYFsW1hWVlZZWVpZWVhVVmhqbG5ubGtramhoaWhkZWRiXGJmX19gY19cX11gXV5aXl1ZWV5iYV5eWllfXFhXU05NTEtLS0xJS01OS0pLS0xKS1BMS0tGR0dJSUZHSUhJRkVIR0ZGRURFRURERUlJSUdIR0hGRktNS0lJSUhHSEtNTUtMTExVcXN2eXp7eXZ3eHd6e3x+fX5+f39/f35/f4CAgYB+fn9/gYB/gICAgH+BgmhSVFVWU1VXWVlZV1dXW1thY19eXFtYVlZZVlJUUlFRVVRTU1NQTUpNTlBST01QUVFRUVJWVlJQUVRQUE5OT0xKTUxLTEpKS0tGSUlKTElHSkhJSUVHR0ZGRUVISUpHRkdGRkdHSEpHR0hISkxKSktJSUhKS0tKSEpLSkhJS0xNT1BQS1R0dHV4enp4dnZ3d3p7fH59fn5+fn9/fn5+f4CBgH9/f4CBgH+AgICAf4CCaVBSVFdVVFZZV1hYWltUVFNSUFFTUVFRT05OUFBRT0xOUE9OTk1MS01OTlBNT1BQUlFQTk5PT09OT09QUU9OTk9OTlBOTU1LSUhISklJSUlHRkdHR0lKSElISElISEdIR0hISUhJTEtKSUhKSklKSkhHSkxLSklJSEpKS0xOTU5NT1FMVXNyc3d6eXd2dHZ4ent9fX1+fn5+f35+fn6AgIGAgIB/gYGAf4CAgICAgIFsT09OVFlVVV1bWVdXWE5NSkpJRkpPTEpKR0lKTU1LSkxNSkdJSUlKS0xGREZKS0tLSEpMTExPTUxMTk9PT01OT0xOTk5QUE9MTUxOTUxMSklIR0lISUhISUlLTEtLSklLSklKSUlJSUlHR0pJR0lJSkpOTU5MSElKSUlKTU9PTUtPUk5ZcHByd3h3d3R0dHd6fH59fn5+fn5+fn5+f3+AgYCAgICBgIB/f3+AgICAgW9LSk1OUU5OVVdWVlJTSUVDRUVSRERBPkI/REBAPkJEQUBBREdGRUhFQkFAQENDREVBQ0VIS09LSUlKSEdKSUpJSUtKTFBOTUxNTUxNTU1MSUhERkZHRkZGSUpJSUtKSExKSUpKSklISEpLS0hGR0lKSUtNTk5KS09NTEtNTU9PTlBPUGBwb3J3eHZ0cnN1d3p9fX1+fn5+f35+fX+AgICAgIB/gICAgH9/f4CAgICBc1BQTk5QTUpLUFJQTlFDREJBRVFFPUM9P0VIOTo7PT89PEFGQD46PD4+PEVEPT9FQT9AQUBERUdHR0dCRERFRkVHR0dHSkdISktHQ0RHSkdDREVBQUNHSEdIR0hKS0pISUxLSUhKS0tNTkxNTExKSkxLSUtNT09QU1FPUFBOT1BSUU1QZ3Bvc3Z1dHJxdHh5fX19fX5+fn5/gH5+gICAf3+AgH9/gICAf4B/gH+AgIJ2VFVRUVBPTE1QUE5PT0FBQUBCQT87Pjw+Pz88ODk4Ozs6QDo7Pjw7Ozw8SEw9PUFBP0JDPUFEREZCRkZER0lIQz9AQEBBQUJBQT8+PD0+QUBAPz4/QEVHR0dJS0xOTU5NTE1NSktNUFVTTkxOUU5OTU5MTU1OT05OTUtLTk5OTU5OTFRucHBydHRzcXJ2eXl9fX1+fX5+fn+Afn6AgICAgICAf3+AgICAf3+Af4GAgnhRUVJUUlNRU1NRUVJPQEA9Pj88Pz5AQT89Pjk7Ojo7ODg6ODc6PDk3ODs7Pj07Ozo4OkBAQUI/QT9DRkRCQ0M/Oz4+QENDQT8+P0E+QEBCP0A8P0JAQUNFRUVKS1BPUE9NTU5MTExPUlFQUk5MTE9NS05PTExMS0xLS0pLS0pNTUtLXHFxcXRzdXNxdHh4en1+fX5+fn5/f39+fn+AgYCAf4B/gICAgIB/gIB/gICBfFJNT1FQUVJSVFJTU048Ozw7Ozw/QEFCQD08OTw9PDk3OTo6OTg4Ojo3ODo5Ojs7ODc4OTs6ODw7PUBBQD07Oz48PT1AQkNBP0FCQT0+PT07PT9DREJAP0FEQkVHSkpKSkpMTUxMTE1MTE5VU0tMTVRJUEpJTUpJSktLSklIR0pLSUpmcnFzdHN1cnJ2eXl7fX5+fn59f35/f39/foCAgIB/gH+AgICAgX+BgX+BgIGAVkxOUFBOUlFQUFFRTjg9Pzw8Oj0+QUBBPz4+QD8+PTs8PD4/PTw9Ozo8PT09PDw8PDs8Ojs8Pj0+Pz9BQD4/QT9AQEFAQEA9Pz89PDo7PT08P0BBQkJBQEJERkZGR0ZHR0hJS0xMTEtMS0pLSUpKTUxMSkxLSUhJTExKSUlISUtHTW1wcXV1dXVzdXh5eXx9fn5+fn5+fn+Af36AgH9/f3+Af4CBgICBgIGAgIGBgIJhS09PTk5PUE9PUFBPOjw+PD07Pz4+QUE/PT9CQ0NAPjw9P0A/Pz07Pj0+Q0U/P0A9Oz09PTw7Oj0+QUE/PkBAP0E/Pz08Pjw9Ozs8PT5BQD9APkBDQ0RCREVIRUVHSEhIR0ZJSklJSUlJSEpKSkpMS0pKSUlISEpKS0xLSUtKSkhWcG9xc3N0dHV5ent7fH5/fn5+fn5/f39/f39/f4B/gICAgIB/gYGAgICAgYGAgm1MUFFOT1BOTk9QUE8+PDw9Pj8/QD5AQD8/P0NFRD89OzxAPjo7Ojo5Nzo8OT09QD06PDs7PDs4OTs/Pj08PTs8QD09PDw+Oz08PT5BQEJBQEA/QkRDREVGRkZDRUdISUlISElLS0xNSkpJSk1NSktKS0lISEhISklKS0pKTkxJSV9wcHJycnR1dnp7fX19fn9+fn5+fn9/fn9/foCAgH+AgICAgICBgYCAgICAgYCCdk1OTk1OTkxMTlBPTD5BPDw9Pz5CQz8+QUFBQkFAPTw9Oz49Ojo6PDo4OTg4Ojs9Pz88Ozs8Ozo6Oz4/Pz08ODo+PD0+Pz07Pj9AQkNCQkNDQUJCQUJCREJCREJEQ0ZJR0ZFSElJS01KSUpKS0xKSklKRURJSUZGSEhJSkpMSkZGZ3BvcXF0dnZ3e3x8fXx+fn19fX5+f39+gH5+f4CAf4CAgICAgIGBgICAgICAgIF6TklLS0xMTEVJTE5NPD88PD0+QEBBQTtCQ0JDQD8/P0A9Pz8+PD5APz09PT89PT5DRD87PD0+QD09PkFDQDw5O0E/Pj5BPTs/QkBCQ0JAQ0NBQ0E9PT5APT9BQUFAQ0VFQEBDQkNHR0VEQ0ZFRkZHRURAQUdHRkNGREdISkdDPkhscHBwcXR1dnl8fH18fH9+fX5+fn5+fn5/foB/f4CAgICAgICAgYB/gIB/gIGAgX5RSEtNTU1LSktMT1FAPz4+QUFAQEFHQUNEQ0RBP0BAQD89QD48PT8/QEBAQ0BAP0BAPj08PUBFQUJCRkhDPTxARENBQT8+PUBBPj4+Pzw+QERHRUA+QEE/QENGRUNCQkNAQkREQkRFQUI+QUJCQUJAQD1BQkNEQ0NBQ0VHQT89VnBwcXBydXV3enx8fHx9f359fX19fX59fn5+f39+gH9/gICAgICBgICAgH+AgYCBflJIS01NTEtLTk5SVURCQENDQUFCQEJDQEBBQUBBQD47Pjw/PTw6Pj0/QkJEQD8/TmFfSkBDRUlJSUlNTUtFQ0ZHSEVHRUVFRERDQT9APj5CRkpKR0RFR0ZGSk5OS0pJR0dIS0xKR0dDRERERURBQkJDQENERURERURFRkNCQUVlb3BxcXR2dXh7fHp8fH5/fX19fX1+fn1/gH9/f39/f36AgYF/gIGAgICAf4CAgIB9UklJSkpISkpMT1JTR0ZFR0hER0hEQD48Oz5AREVEPzxBQ0RCPz1BP0FERURDV3WGiYp+WEdISkxMTU9PTEhHSEdISUlISEdHSEhFQ0VFRUVGSEpKRkVHSUpNT09NTUtKS0pNTktJSEdISUhHRkVGRkZERkhHRUVISEZIR0hGUW5ucHFydnZ5e3t7en19fn99fX19fX5+fX9/f39+fn+Af4CBgYCAgICAgIB/gYGAgHxQSEdISUZHSUpNTk5KTElJSktMTkpGQ0FCQ0ZJSElHSEhJR0ZCREZERENBVXSHiYeHhoiCV0lMTUxNTkxKR0dHR0RHR0dHRkhGSEVDRERGRURESEhDQ0NGSkpLTExMTExMSUpLSkpJSUlISkhIR0hJSEdHSEZGRkhKSUlJSUhdb29xcnR3d3p7e3p7fn1+fn19fX19fn59gH9/f35+f4GAgYCBgICAgICAgH+AgICAfE1HRkhGRUZHR0pLSkxNTEtNTk1PS0lISEpLS0tLSktNSktISEZGR0ZFUGyEh4aGhoeHh4d8UEtMS0hHRkZERUNDQEFDQ0NDRkZFQkA+PkBBQUBCRD8/P0RGR0RFR0lLSUlHSElHSUlKSklIRkpKSkpJSklKSkpGSUxMSkpLS2ZvcHNzdHZ4eXt7e3x8fX9+fX19fX1+fn1/f39/fn9/gICAgICBgICAgYCAgICAgIB9T0ZGR0ZHSEdFRkdHTU1NS0xLSUdDQ0NESUtLS0tLS01MS01MSUZKVWyBhoWEhIaGhoeIhop1SUlGQj8/QD8/Pzw8PD46OjxBQUA+PDk5ODw8PTs+Ozk7P0FCQUFDQ0NAQUJFREJDRkhJSEhITE1MR0lKTU1OTUpKS0tKTE1TbG9xdHNzd3l7e3t8fX1+f359fX19fX5+fn9+gH9+f3+AgIGAgYGAgICBgICAgH9/f35RRkVGR0lJR0RDRUZOTUxKSUhFPzk6PkBFSEdJSEtMT05OUU5RXnKBhYSEhYWGh4eIiImJjI5mQkI9ODg6Ojk4Nzg4OTY0Nzk7PDo4NTY3Nzg5Nzg3Njg5Ozw8PkE7OTk5PT0+Ozs9QURFSEpNTExHSUhPUlFQUE5MTU1PUV1vcHJ0c3V4ent7fHx+fn5/fn19fn19fn5/f3+Af39/gICAgICBgICAgICAgICAgH9/f1FHRkdISkhGRUZHSExMSklJR0NCNTY6PENAQkZIS0hMS05UZ3uEhIOCg4SGiYqLi4uKiYqLjIlUOzg2NTY3NjY2NDU3NjM0Njg6ODc2NTY1Njc3Nzc4Ojc3ODg6Ozc2ODg5ODk4NzY6PEBHRklGSUZFRk9TUlNTUk9QUFJUZXBxc3R0d3l7fHt8fX5/fn9+fX19fX1/f39/f4B+f4CAgICAgIGAgICAgICAgICAf39+UkhISElLSUdJSklKSktERUhEQkA1Nzg4PTo8REJERkZEVniEhIKCg4OFiYqKiYmKioqKi4mKioFINjc2NDY4ODc0NTc4NDY3Nzk5Nzc2NzY1Ojo7Ojo8ODk5OTk4Nzc6Ojo4ODc4NTg5O0E9Pj5CQT9BS0xPUVBRT09QUVdrcXJ0dHV3ent7e319fn9+f359fX19fn9/gH5+f39/gICAf3+AgICAgICAf4CAgIB/f35USEdJSUxNS0pLS0xJSD9AQT88OjU3OTg5NzpBOTxEP1B9hIODhISEhomKioiHiIiIioqMiomJjXo+Ojg4Ozw9Pjk6Ozw4OTs5Ojs6Ojk7Ojo+PT0/Ozs7PTo+PDo8Ozw8PTs6Ojw4Ojo7Ojk5OTw/PD1BQkRJSkxLSktMV29yc3V0dnh7e3t8e31/f35/fn19fX1+f39/fn9/f39/f4F/gICAgICAgIB/gICAf4B/flRGRUZJTE5OTEpKTUI/Ozs8Ojg5OTg5OTk5Oj49Pz9DdoSDhIWFhoiJiIeGhoaIiYiJi4yLiYqKjGw8Oz5CQ0VFQkFBQj5AQ0FAPz0+PkA/Pz9AP0A9PT9CP0FBP0E/PUFBQD8/QTw+PDs6Ozo5Oz89Ojs9PUFBQ0FCQ0FYcHF0dHR2eXt7fH17fX9+f39+fX19fn5/fn5+f35/gH9/gICAgH+AgYB/f3+AgIB/f39+UkVDQUdKTk9MSUdLOjg5Ozk6Ojw8Ojo6PDs9PkA/PWGFg4SEhYWGiYmIh4aGhoeIiYqLi4qKiouJi14+REdJS0pKRkdHREZIR0VDQEBDRUNDQUJDQj9AREhFQ0VERUVBRkVGREZGREBCPj1APj0/QD4+Pj8+Pz4+Ojs9PGBxcnR0dXd6enp9fX1+fn5/f359fX19fn9+fn5+fn+Af3+AgICAgICAgIB/gICAgH9/gH5QREA9Q0hPTUdGQkQ5Nzk9Ojw7Pj0+Pjs+PD8/Qz5KfoOEhYaGhoiJiIiHhoaGh4mKiouMjYyMi4qKh1dHTExNS05JSUtISUpKSUVDREZHRkRDRkdFQkhJS0dIR0ZHR0VLSkxJSktKQ0ZDQ0RCQUFDQkRDQ0REQ0E9Oz1AaHBzdHR2d3p4e3x8fX1+fn9/fn19fX5+f35+fn1+f4B/f4CAf3+AgICAgICAgIB/f4CAf09BPj0/RExLQEJCQTk3Oz47PDo9Pz4/PD8+QkFFP2iEgoWFh4eIiImIiIeGhoaIiIiJioyNjIyLi4qMf1BNUE1LTktKTElJSkhLRkRHSEhJRUVJR0ZFTExNSUpHR0hJSk5NT01MTktIRkdHRUVDRkZGRkRFSEhGQ0E/QExtcHR1dnh5eXl8fHx9fX5+f39+fX19fX9/fn5+fn5/f39/f39/f4CAgICAgH+AgICAgIB/UUE/Pj9GR0c9PEBAODc8Ojs8Oj0/PD09P0BDQkhTfoOEhIWGh4eIiIiIiIiHh4iIiImKjI2MjIyMi4qNcU1RT01MTExMSUhIRkpJREpIR0tKSUpISEdLTE5MTEhISUpNUE5PTk1PS0lHSUpISURJSEhGRkdHSUZDQkFDVW9xdXd4eXt4eXp6fHx9fn5/f35+fX59fn5+fn9/foB/f39/f4B/gICAgICAgICAgIB/f39UREFBQkdHQj84P0A4Ojs3PD06PD88PT1AQkNETG2Eg4SEhYWGh4iIiIiIh4aIiIiIiImMjIuMjIyLi4uLXlJSUE1OTUtKR0ZDSEpHTEpHS09MS0tKTE1MT1BOSElLTE9RUVBRT09KSUpKTUtMRkdIR0ZHSUZFRUJAQkJccHJ3eHl6eXl5e3p7fH5+fn9+fn19fX1+f35+f35/gICAgH9/f3+AgICAgICAgICAgH5/f1VFQ0VFR0dFRDs/QTs9PDg/PT0+QEVEPkNEQ0ZKdYaDg4OEhIaIiIiIiIiHh4iIiIiIiouLi4yMjIyLi418V1ZSUlRST0xLS0VGRktPTk9XVlFQT1JTUk1TVE9NU0xQU1VXUlNSUExKTU1NTE5HR0pGRkhKRERFRUJEQ2NxdXl5enp6e3p7enp8fn19f359fX19fH1+fn+Af3+AgIB/f39/f4GBgIB/f3+AgH9/f39/VUZGR0dHR0hGPkBCPT89PEE/QUFEVEtCSElGSUx5hoOFhYSFh4iIiIiIiIiIiIiIiImKi4qKjIyMjI6Li4tnVlZrYUVSUVFQSzs6UVNSYHVdVVZUVllZUlhYUlpmUFVXWl1SVFdRUE5SUFBRUUtLS0dISkhFRklJSUhJanN2eXl6eXp7e3x6e3x9fH1/fn19fX19fX5/f39/f4CAgH9/f39/gICAgH9/f4CAf39/fn5USEpJSUdGRkU/P0FARUFDRkRDREtWUEpQUE5PUHmGhYeGhYaHiIiIiIiIiIiIiIiIiYiUnIyKiox9YYqLi4dsW2RVOlhYWFNRPkBWVVlcZGBWWWJyXl1WXVpWRVFZWlxZX1RZZ1JVVlhUVFZTT09NS0xKSUlMTUtPTVRwdHZ4eXh3eXl6e3p7fH18fn9+fX59fX1+fX9/f35/gICAf39/f4CAgICAf3+Af4B+f35+flZKSklIR0ZEREJBP0hMSU1QS0lKT1NSUVRWVVZUdYWEhYWFhYaHiIeIiIiIiIiIiIiIiZydoI+Jjmc7foyJiot6bnBYWltaUlNSVlZUWlp1g1lVfZBhXFhdXldJVl5eW1tfWUhZWFlcXVhYWVdSUU1QUU1NT1NRUVVSYnRzdnd3dnh4eHp7e3x9fX1/f359fn19fX5+f3+Af3+AgH9/f4B/f4CAgIB/f3+AgH+AeHl9WU5LSklJRkJEQEE6T1FRV1hQUFBRUlNSVldXV1dsgYKDhYSFhoeHh4eHiIiIiIiIiIiIlpqcl4iKgW6GiYiHg4p+ZllZXFlTVlRXUlFXVmOWgFFlclhaV19oUGBmWlpYXGhiR09aaWdcW1xdXVdTTlNQUFFWVlZWWVpvc3R3dnZ0d3h4e3t8fX19fn9+fn1+fXx+f39/f4B/f3+Af4CAf3+AgIGBgH+AfXJ9f39vdHxdU1BPTUtKRUM/QDtQUFpaWlJTUU9RUlFVUlVTVl51eICFhISFhoaGhoeHh4eIiIiHh4iHg5GOiYmIhoWIiIZ9gHtcUFZYVFJUUlFRTE9NS2Z5Wl1UWVVWXVpMVFpVU1ReWllXV1d6a1haXFxeU1BQT0lOT1dWWFpaZXF0d3Z0dHZ4eXl7e3x9fX1+f31+fX59fX5/f39/gIB/f4B+fnp4d3ZzdXt/f4CAdGt+fmtyeV5bVlVTUk9LRkNEQU1eg2xWUlNPT1FPUVZRU1JSVGNkdoCDgoOEhISEhYWEhIOGhoaGh4iGfomJiIeGg4eHh3ltcVZJS05OS01LSEpERkhFQz5TY1V/UlFRTktSVVJNT1lSTk9RU1VVTVFTUlBOTEtIQ0lHUlNUWV1tcnZ3dXR0d3t6ent7fXt9fX1+fX19fn1+f39/f3+Af319fn5/f3+AgH57dnN3fX5+ZHV9aXF0YGRdXVtZVVFMSExJYWySdFBRU01RUlBTW1JTUlFSVVVic3t8foCBgoGBf317e4B/g4KFhoeChoaGgYSBhoWGdV9dS0M+QkJDQ0E/RFBDQ0BDPkJIR1ZASE5NR11pUUhGT0ZFRkZIR0hCQ0hHSEpHREFBQ0BOUE1SZHR1dnV0dHZ5fHt6e3t8fX18e359fX1+fn9/f4CAgH9/fHx9f4B/f39/gIGAfXZ0e39taHxnbnFmaWVkYlxYU1FQVVJzV2VbT09OTFFSUFVZU1VRUVRST1Zga2xzdnp7eHl0cm5zdHN5eH5+g4CDg4KAgoCCgYFrTEc+Pjo6PkA/Pj4+alBLYUVGSElFQj9HTE1HTVFVSkJFPz89PTw9PT89P0FDQj8+PD1CPklNRlVvdXV2c3R2eHt8enx7fH19fX18fn19fH5+f39/gH9/f396eXd4d3Z2eHt+gH59e3h2fHVheGdscGpsamlmYFtRUVpcWV5JSk9QTktMUVJRVFZVV1FRV1ZQWFtiXWFnbW1sbmpoYG5yaW1scXV7en17eHp8fHh3eGRCQEBBPDpCQ0FBQ0FbXE97Tk9PTktMTU9PUExLTFdOSUdBQTw5Nzc1OTk9Ozs7ODk4OT87QUc+XHR1dXZ1dnd5fHx8fXx8fXx+fXx9fX19f39/f39+f39/fXh1d3p7end5eHV3e3x5eHV5d2NxaGlwbW5tbWhmXk9PXlxaSUdPUVFPTVBRTlFSVFZYU1JZVE5ZWltXWVxfXl9lX11ecXdrXmBna3dvb2xqb21ubGZiWUdGRkhCQUZIRUVGQ0xRT2FXUlhRUFNTUlVbT09RVlBNSURGPjk5NjU4Njk3OTozNjU3OTU8Qj1mdHV3eHd6eXt9fXx8e3x9fX5+e31+fX1/f39+fn5+f397d3V5fXx6eHx8fHx0d3Z3dnV3a25paHFub29vamtgVVdeWldNS1NUU1BRVU9MUlNUV1hTVFhRTFhZWVZYWFZYWV1XWFhoc2tdVmB0a2FhX11kYF9eWVVQTU9OTElHSktJSEVDUE9TWldUVE5RU1lTXGVVT1NUUU5LSUhDP0E5OTg4OTc4ODQ3NTc4NTk5R25ydXl5ent7fX19fXx7fX19fn56fX58fX9/fn1+fn1/fnx0dHV7eHJxb29udHhxcnN4dnVxZmRncm5wcHFubWRdX19ZV09QV1ZWU1RWT09VVldYWVNVVExLU1VVVVVXUFRVV1RVUl1uXlJOWWBbVlk7RFVXU1tmSkxQUlJPTU1OTU1MSkVQUFVZU1RPSk5PVVNTXFZSVVNSTk1MSUhIRj8/PTo3ODc2NTk5Njc2NjVYcXF0eHp6e3x9fX1+fHx9fH59fXl9fXx+fn59fHx9fX59fHJ2cXh4cnV1cXFucHBvcHV2dG5qZGRqcHBxcnBuZmVkY1xeUlRaVldUU1ZUUlhXWVlZUlVPSUdPUE9PTVJKT1BPT05OT1RMTUlQUFNUVTI8WE1JQFE9Y2BRU1FQTVBQT05NTFBOVFJQUkxJTEtPUlBRUlJUUVJPTE1LTExIQ0JBPTo5ODc2O0I0NTY2O2VwcnZ4eXt8fH1+fH18fX19fXx7eHx6e319fnx7eX18fXx7cHVvd3VwdXRvc3ZwcXFwdXV2Y2pnZVdodHJycW5paWhwVlZUVVhVVlVSV1ZVWllYV1ZRU0ZGQUZHR0hGSkRISkhHRUhMSEtJR0xNUE1HL0VfUj40QD5qb2FSUlFAR1RQT1BPUU5RT1BPTEpMTE9QTk1QUVFOUU9KTE1NS0dFRUNCOz09PDk9RzY2NzZFbnF1d3p7e3x9fXx6fHx9fn59e3l2eHd5eXx9enp2fXt8enpvcW53cnB2cW1wc3BvcHNzc3RmZ2BoWldrcnNybG1ta25iZVBTVFJTVU9XVlVZWVZRUVFPQD47PT9AQkFDP0JFREFAR0hHSEZGSEpNTERHQ09SQzhFTVNdZ1NRU0FHVU9PUVBQTU1OTEpMS0xOT09RTE9OTUlMS0lLS0xLR0ZGRUQ8QUE+O0BFOzw4OVRyc3V5e3t7fHx8e3l8enp+fnx7dXR1cnZ2enp4enJ8e3x5eW1xb3hycXVubnFyb29vdHNzcnV0a2dnXmVqbXBrb3FtaW1jTE9OTVFTTFRVVFdXVUxMS0g9OTg3Oz9BPzw9QUBCPT1FSEZERkZJR0pKQEZBQUBGR0RJT0hRUmFcUVBST1NPT09MTU9NS01MTU9OW1ZLTVFPR0lIQ0lLTExLRkZGRT9CRD49Qkc/Qj9AZHJ1d3t6e3t8e3p6d3x3eX5+e3txc3RwcnN3dHh4c3p7eXZ3bHFvdnF0dGxvcXJubm9zdnJ0c3Jya2xlbnNobW5tbG1samtJTEhIT1FKUVNRVFNPS0hDRT05ODc5P0I/Oz5BQEA+QUVKRUNIR0lHSUVCQj8+PEJBQEdKRU1PYmVQTU9NVktMTktMTU1MTEtOTlNkTUpMUklJSUZCSktMTU5KR0lGQkJCQD9FRkVIRExvcHZ6eXl6e3p8endzeHR4fHx5em5xcW1ub3JydnJzeHx4dnZtcG1zcHV0bHBwcm9vb3J2dXJWVm5xZ2x5hGptcXJubmpob0hKQ0dMTElNUE1QT0hLRT9CPTk5Ojo/Qj88QUJBQURFR0tGRElJR0dIQ0M/Qj4/QEE9Q0VETE1RVExKSU1URklJSkxJSktJSUxNT1BSUEtHQ0tIQ0NLSkxOT05JSklHRENDRElKTUxJWnNueHl4enp7eXx2cnB1cnR5eXZ4anFva2xsbnR0bXN2e3N0eHJvbnFvdnNucG9ycG9wc3R5ak5gZ3NqdHx5Z29zcWpxaGVxSEtDRkdIR0pLSUpMREdCPD49Ojo6O0FCPz1CQkNDSEVKTEpFSUlGR0hDQztBQEI+QD9CRERJTU9HSEpHSEtESElLTUhKTEhJSkxKTV1SSElETkdCRUxLTk5QTktNSktGR0dKTU5STk1jbmp3dnd7eXt6fXFtbHNrcHR0dHVocG1qaWtrdHBudHR5cHJ6dG9ycW93c29xcHRycHJ1dHlrTlZtdWxxe3Zpbm9pa3RoZXBGSkNGRUZERUVGRUdDQ0A9PD06Ozo7QURAP0JDRUVJRkpKTEZJSUdGRkRCOkFDQz4/Q0NDRUdLTUhKTkhESEVJTE5NSElMR0ZGSUlMTktJSEVPSUNHTk1PTVBOTk9NS0lISU9TUVJOU2dnZnJvc3h2e3p8bGhqb2VrcG1zcWdubGhpa2x0bW91dHdxb3h0b3RzcnZzcHFydHNydHV1dnZYVnV1a290cmtvdmxobWZfcEdKQ0VFREJCQUVAREI+Pz47Ozs+Oz0/Q0I/QUNGR0pHSklMSEdHR0ZFQz89REVCPkFDQkNFR0hJR01QSUVGR0tOT0tGSElGRUNESUlIS0lHSFBLREpOTFBOT05PUE9KSklNUlVVUk9YZWFhbWZwcm9yeXpnZWhoY2lsZnFsZmxtZ2lrbHNtcHd1dHBudnJvc3JzdXRxc3N1dHN1dnZ2eXZ1dHZsa3V1bXJ2cWxubGVyTUdFRUZCQUBBRDxCQT5BPTo6PT87Pj9BQj9AQkVHSkZKR0lHRkZGRENCQUFFRkNCQkJERUVHR0hGTFBMSE5KSkxLSUZIRUZFQ0NISEhLSkdLUk5DT09OUVBPT05PUEtLS1BVV1ZVVFlgX11pYW5pbmhyc2JlZmZkaGhmbmlmbW1oa2ttcmlxdnVzcW12bm9xcnN3c3JzdHV2dnZ2d3Z3dnZ0d3Vrc3VudXRzcXNra3NNR0dFR0FCQERFPEFBQEM8ODo9PjpAPUBDQEBBREZJRUhGRkhGRUVEQ0VCRElGQ0dFQUVHRUZGR0VJTUtIUU1KS0hISUVGSEhFQ0lJSUtNS1BTTkRSU1JRU05QTU9QTUxOU1dWWFlXWV5bXWRgaWNqaWdrX2RlZmNoZ2drZ2drbWttbHBxZ3R0dXJzbnZvcXBydHhxc3N1dnWCkXl2dnR4dXV3eG5vdW9yc3VxcWlwek1HR0dIQkJCRUU8QENCRDw3Oj4+Oz47QEI+Pz9DRUdERkRER0VDRUNERkZGSkVFSUdCR0hGR0ZFQ0ZKSkdNSkxLSEpLRklISkhFS0tMTE5PUlRPSFRVVFFUUFJNTlJPTVFXWlZaWVdbXlpYYWBgYF5oZWNgZGVnZ2poaGpnaG5sbG9tcXBpdXV4cnJwdXBwcHJ1dnB1c3V2dXt+fXh2dHd2dnZ3cGx1cG1zdW5vc3N5TUhIR0lEQkNIRT1ARUJEPTg6Pj49PDxCQj1APkFCRkNFQ0NHQ0NEREZHR0dJRkhLSENJSEdJR0ZESEtJR0pITUtKS0xIS0pNS0lOTE9OT1JVVk9MVlZUUVRSUkxPUVBPVFpaWVxaWl1gX11fY19cYmRsY2BkZ2hyhWhnamZqbm5wb25zcWp0dXhyc3N0cm5wcXZycXVydXVzfnmOfXV1dnZ2dnhyaXVxa3J0bHF3cXVMSUpISkZCREdFPUFHRERAOjw+QD8+P0NCPEA+QUFGQ0VEREdERURGRkhIRkhHSUtKRUpISEtIRUZMSEhISkdMS0xMTElNSk1OTU9MUFBSVVZXT0tWVlVTU1JRTE9SUlFWW1tdXltdXmBfYWBiZl1kYGZoYGVpamRzc2ZqaGdscHJxb3NzbnN3d3B1dnRzbW9ydW9yc3B1cnZydIF2dXV1d3Z1d3NndHJrcXJrcndwd0pKS0lLR0JFREU8QUZEREI7Pz9BQEBBREFAQj5BQ0hCRURGR0VIREZFSUhGSUhKTUhISkpJTEpFSktISUpKR0tKTExJSU1LTU5OT0xPUVJVV1ZNTlRWVVNSUVBNTlRTUldbXl5fXV5gYGFhYmBkZGViZGliZGlqZ3aLbGtpZ21vc3FwcXBwcnl3cnV1dHNtbXNzbXFyb3R1dXNwc3d0dXV3dnV1dWZxc2twcWpydnB3SkxMS0xHQ0NBRTxARUVEQz1BQUNCQkNFQUNEQUFFR0NHR0hGRUlFQ0dJR0dKRklMSElKTUtNTEZLSUhLS05RS1JQTFJMSk1NTlBQUFVPV1hYW05TUVdcWlNWUE5UVVRUWFpfYmJfZGFeYWNfYWZjYWJobmhiaWhobXh2bWhpbm9zcnBxcnJydnRzdXNzc25rc3FtcHJvdHZzcXF1dnVzd3l3dXR1Y210a29wanF0cXdMTUtMTEdEQUBEPj5ERUZDP0NBRURERkNCRUdDQkhGQkhJSUdISkZES0pHSEpISUtHSkpOS05MSUxIS0xKWmZKZFtKbFJHTk1fblVsc1txcGJ3Y1JQYnZ1aHVjYXZhWG5xYmR2aW16ZlxsdGBsa1Zgd3ZpamdoZmdsbWptb2ptb3NycHJycXJzcnNzcnRybmx0b25wcXF1dXJxc3R2dnV1eXd1dHRga3RrcHBrcXNyeUxOSkpKRkI/QEM/PERERkRDQ0NFRURGQkVGR0RESkVFSUtLSUtMR0dOSkhKS0dLSklKSk5MTU1MTElNTUxbc2Jkb11sbFVMTmVyXWdlcWxudGdwaV9hWW5tYnBwYmtqamdvcXRldG5vXHB2Z3BPTHJ5dmthYWtlZWx4bWt2bG5vc3JwcnFwcXJxcnJydHJtbXNubm9wcnV0cXNzdHV1dXR3eXZ0dGJtdWtwcGxycnJ7S0xJSEdFRD9BQT89QkVGQkVDRURFRURCSEhHRERLSEdLTU1KTExGSk5ISktKSUtKSklKTU1OTU1NS05NTVtycG9ucHBrakxPUG1YTmlidHJwYW1vdlxZbFBbbW1acW1rcGx4eHRzaXBdYHNscWtVdXl4b2Nea2ZiZ3BwamlvcHBzc3BxcHFxcnJxcXJydGxtcm1tbm9ydXRxdHJ0dXV0dXV6dnV0ZW51a3BvbHNycnlKS0dHRUVEQkFCPT8/RUdCR0RIRUVEQkZJSEhFR0tKR01MTkpMTUdMTklNS0hJTUlKSUpKTk9OTk1MTk1MXGhkdV1scVZrTU9RblVaa15rbHZhbGR0VGVjTmxZbFx0b2xqbHhqd3Vob11gc2toV2Jjd3xvY2BnaGFjaXR5a25ucXNzcHFwcXBycXBwcHJ1a21xbW1tb3FzdHJzcnR2dnN3dnp2dXRob3Vsc29tc3J0dklNRklFRURDQUI8QkBCRkNHRktHRUNDSEpISEZJTEtGTUtLUlJMSE1NSU5KSUdNR0pKSElOT01OTEpNTUpadHBwb3FxbGpPUVJuWXNrZ29vcXFvbXReblhhdF9ub3BvcXNvb3VzdHRqW150Y3d4cmpuemhhYWNmYWJqbXR1cHN0dnNxcHBxb3J0e39+fXdsa3FubG1ucHJzcXR0c3V1dHh4eXl0dWtvdW11cG5zc3Z0SUtISkNEREVAQD1DQ0FGQ0hJTUhGQ0ZKTElHRkpNTEZPSkpXUktHS0pKTklISUtJS0pJSUtMTU1MSUtLSlNrYllpXl5pYnJyWl9Zam9fZWVVa19jW2FhUWBtaFxqXG5pamRbb2VkcFxaXGtbbXFjcHNsZGdjZGdgYGttcHBvdHlydXFvcHFueYWIh4eGhYB2c25rbW1vbnFydHRydHV1dnl4eHN1bnF1bndxcnV0d3JISEZKREVDRkFAQUVEQ0ZCSEpMR0ZDRktMSUVGSk9MSU9KTFtRSkZISEtNSUhKSUtLSUhJR0tLS0tHSEpJS0tMSklKTE1TW11UUFVNUU9OT09WUU9QUU5PUUpKTlBRZHFpVFlWW1tcVVlbXVhdXFxjZmFhZmJjZl9eZmttaG10eHJ0cm9wcHSGh4aGhoWFhoeDenBtbWxrcXN0dHJ0dnR1eXl4dXZxcnVvdnJ0c3V1c0hDRUdGRkBFQz9DR0RGR0NJS0xHRkRHSkxIREdJUEtMT0tMV01JRkVHSUpISUpITEpJR0hISkhISEVFS0hISk5LSE9cVl1PXVxgXk9YWVNcXGJeTVlaTVhhUktZYVpTYGRcYVhbZGRWVlhcWVpYXFZZXF5jX2RgYV9laGtnbXR0cXF0cHFygYaGhoWGhYWFhoaGhH1ya2lvcnNzc3R3eXl4eXh3eHRxeHJ4c3FydXJ0UEJDRExNQUNDQkRJRUdHRktKS0dFRUpKSkZFSEhQSkxNSk1SSUhFQUhGSklLS0lMSklHRkpIRUZHRUVKRkJJTElKVF9ZX1hgYVtgVVhaVF1eWl9SWVxQXlxZTl9cXlNbXmReWl1gY19ZX2JbYF5bVVlZWl9eY2NiYWNlaWVrcnBvcHBub3eGhoWFhoJ7gIWFhoaFhoV/dXFwcnJzdXl6enl5eHh4d3J5dnhycXh2dHZhU0pKTUlEQ0FDRkdFR0dJSkpJSURGS0tLRUZJSU5KTkxITE5HSEY+SEdMSUtLSktLSUdFSUZEREVCRkpEP0lLSE5aYlleXmFfUlRTV19fXF1ZXlFZXE1WX1dLUVlbUVtfYmFdXmNhYGJhYmNjZVpSWldXXVpdZGBfX2NlYmhvbW1sbGxsdYV/hIN5dXyEhYWFhoaFhYaGg313cnJ0d3l5eXl/fn15dXl2dnJuend2eFlRSkZDR0VCREhIRkdISUZHSkdIRkhLSUtEREpKTU1MTEhKSkhJR0BHRk5KS0tNS0tLSUdJRUVAREFISUE+SElGT11gWltkXV9UUVJYXVxcXF9bS1dcTFJcWUlNXlFRXV9iY2NjY2JcZGJhZGNmWFJXVVRcWFthX15fYWFfZGxrbWprbG52fnWBenyEhYWFhYWFhoaGhoWFhoaCenJzdXV7hYeHh4aFhIF+eHB6d3Z4XFJNQkBJRkNFS0lGR0dJR0dKRkZGSUxKTkVDSkpMTkpMSUtLSUlHQ0hIUU1LS09NS0tJSEhGRUBFQkhIQUBGRUNTXVleWF9YX1tdVVhYUF1cUUtKVl5YXltdVlphUlJfX2JiYGBiYl9jYmFkZGFYUFJSU1xTXF1dXl5fX19kaWdsa25ucHt7fH57gIKDhIWFhYWFhYSEhYOEhYeHgXNyd4WHh4eHh4eHh4eHhYOAfHhcU0tCQUdGREdNUkhEUktGSEhIREZLSU1QRUdJSktOTExKTExKSUdESEtRT01MUE1NS0xJSkRFQUVDSEZBQUZDQVVVRVxUXlNWYFhOVFVNWVpMSktUYGFbX1hfXmJdT1liXGBgXmJjYV1iYVdgX1VRUFFSWVNeXFtdXV5gYmZmZmxmb293fHuAe31/gISEhISEhYWFg4OFgoOChYWGem+BhoaGh4eIh4aGhoWFhIWDfklORkRGRkdESVNjUUVXX0lHR0hERk1KUFBGSUlKS05MTEtNTEpKR0VKTlFRTk5QTU5MTklMQkVBQ0NGQ0JAQ0Q/TEdDTExPT09NRk1GRkhJR0ZMS01PUElMT1BQU1BMUVRTVVlYV1lXV2NWTlJUUFFQT1FWVFxZWVtdXGFhZWZkaGRsbXFzc3p5f3t6f4SEhISEhISEgoSAfnuBg4F9e4WEhoaHh4eFhYWEhISCgYB9S0lFRUdGR0RLTl5NSEhZTUdISkhHTUxRUUlLSktLTk1VTk9LS0xHR0tQU1NOUFBOT09PSUxGYUVEXkxEZmJDTFpHXlxzbU9MVm5ZS0NPX1RrVmdJXVdVXkRMUVVMTVNWUVNUWFZUWFRUXFRPZVpoaGVaVWtUWFdVW1xbYGBhYmJjYWdpZ25saHJ6fX1+gYOEhISDg4OBfX16cnuBent/goCDhISFhYGEhYGDg39+entMSUVGRkhFRUxQVEpLR2BUSEpPSklPTVJRS01LTE9SVVJPUEpMTkdJTVFbWU9QUE5QUVBKS1F/UUl8WVlyc1dQbUdxbm9hVlFxcXRPQmpzbnFzcFNvX1tuWF1WXFhVa2hVXVZjWWBZWl5VVVd/aXR1dWBhdl9ZYlxcZltfYWFhYl9hY2dtb21gcHd0eIGBgoODgn99foB2eHptdn50eH2AfH6AgYKEfICDen+Bf353d05JRUhNTUJETExHSkxGUlZMS09ITFJYV1FOT09NUVROT1FQTExPSE5QU1taVFFST1BQUUxJWnhdVHhkaFhSU1B2ZnRscGJuZmtSck5Md21qcnBzcnFycG9vgF1lenV4cXF6cX5yfWt1fWFSaHxlc3Nwc3N8fXB+eG9/cmBgYGJiW2JhaGxua2JsZmdtd36BgIN+e3h3gHR2emlxfm50fH53eHt+gIN4fIF1fH98fHNzTktGYF1HQURNTUhLS0hLUE9NTkpOVl5ZVUxRU05ZWUxTU1NOTFBJUlJUWVdXUVRQUFBSTEhneGxjeHFtWkpLVHlwdW11Ym52UGRkSGV2cW13b4BqZnh4aVdyUWh6bWlqenp9bHh6f3Boblh1dWp2dXGBYXNofWlseHxvX19fY2JcX2RlZ2pqZWdiY2RsbHBwc3Rzc3N5cXJ4Ym10Z3J5e3NzdXl+gXN2em58fXl4cm5NSlJ0TkNCRVBRSEtMSkxRT09PTVBZYFpYS1RXUGFeUlZRWVNNUEpTVFZYV1dQVVBPTlJKTHJvdXVxdXFjaGBWbktxcF5HaHlXdlRLaHh9d2B5e3NtYF1tb2RTZ3J1bm15cHdrdXN0cWxtXHN+emtteXxsdW58a3F3dXheX19iX15gZWRpZ2hmZV5iYmlpaWprbm9rcW5tanBhY2Zkb3d4b21wc3l/bnFwant6dHJvbUtLWlZIR0VHUlFKTU5MTFFRUFBQUVdcWVVOVllVZlhSUlleVE1OSlRUV1dZV09TT09OUUlSbUhpd0tgZHZ2VFZsTm5se3Jhamd/dVRLVmtnfGxtbHdeWnB6e19genNjcm94cWdjfGlye11US2xfdnVsanZ8e25/eWx8cF1eXmJbX2NlZWdmZWVjW2NjaWtrcnNyd2dtaWhkZ2BhbGFnc3JrZ2xtcnxrbWhre3RtbWttT0dKS0hKSEhSUU1PUExMU1NST1NSWFJXVFBXWlZWVFRUYWBRT05LVFNTUVZWT09NTk9RS0hRTlBVTEtLUlNSUVJPVlVRUU9SUlhYUE1PVVRXWFhaWlRRUldbV1dXW09SVFdXWFFdWFZcVVRPWFJXWFhZWmBcaHNfXFtZXF1fY1pfZGRlZ2RkY2JaZGJnZmZtbm11ZmZnY2BmXl1nYGRsZ2Vna2hwemhnZ2t1amhoaWxQSUtLTE1LSlRSTlJRUExWVVRQVFVYVVpWUltdVlVUV1VZWE9PTE5XVFBOVVNOUE5MUVBLSVFRS1FNSkpPUVRRUFFTUkpITU9QUVFQUFBTVVJYV1xXUlJQUVVVVlNaUU5SUldUU1hVU1hUU1FVVFVWWVlYXlpfYV1cW1pcXGBjXF5iY2RnZWVlY1pgYWRhYmhoam5jYWReX2NdWmNcYm1hXmZmZ21zZGloa2tlZGNmaFFKS0tOT0xNVFFPVFFSTVhXVVRWWFdXWlZTXGBWV1ZZVVhUUVBLT1hTUE5VUE1RT0xTUE1PVVNOUU5NTlFTUFRQUVRUTktNT1JUVFFRUVVWU1haW1lSVVJUWFdWWVxTT1NUV1RTWVRWWFRSUVdWVlhcWlxgXVZZX11eXVxdYWFeW2JjY2hnZmRjWGBgYl5gaGVnZWFeX11dXlpaX1pfZ2BeXl1jaGthaGZoZmRgYmRiUEtNTFBRTFBVUFBUUU9RWllYV1lbWlhZVl1qZFZYWVpXVlNUT0tPVlRQT1RQUFFPTVJRT1JYVFFRT01PUlRNV1FTVFVPTU5RVFZVUlJSVFdVWl1cWlZWUVJXWFVbW1ZQU1VVVFVYU1dYVFJRWFZWW19bX2BfVl9dXmBdXGBfX19aY2NlaGhlZWJZYmBiXl9mZGNgYl1cXFxcWVpbWFtiXF5dXV9iX19iZGRiZF9fYFxQTU5OUlFNUlNQU1RRT1ZcWlpXW1tcWVpbZHFtaGRfW1lWVlhSTU1XU01NUk9SUk9MUFNSVVtVVFBQTE9XVVBWUlNSWE1PUFJVWFVUVFJUWFhbXl1cW1ZST1VXVVtaVlFTVlRVV1VTWFpTUlFaV1ddX1tgYGBWYlxgYV1gYl9cYF1jYWNoaWVnYVpjYGFfX2VlX2BjW1pcW1xaWllZV1xaXFpgXmBbXl5hYF9jXFlgWlFOT05WUVBVU1BVVVNQV1xcXFleXF9XXF5qcHd5gGNcW1ZWWVJOUFdTTlFRUFJUUkxSVFRZW1dVT1JOUldVUlJUUVJZT1FTVFZbVlZWU1ZaWF1eXFxeVlNOVFZWW1tVUVRVVVdYUlNZW1NSUlxYWl5fXWJhYFdiW2NiXmFjXlxiYWJfZGdpZWdeXGRgYWBhY2RfYl9aWl5bXFtYWFlXV1paWmFdXVtdXFxaXWBXW1taUE9PT1lQVVVTUlhSVFBbXV5dXGBcYFVcXGhqcn1zbGhcVVlXUU9TW1NSUVNSVVVVS1JXVlpaWlNPU1FVVVRSTlZRUlpSVFVUWF1XWFhTV1xYXl1ZWl1VVU5WVldeWldRVFVXWFhTVllbVFJWXVldXmFeY2NfWWBbZWJfZGReXmNjYV5lZmllZ19eZGFhYWJjZF9iXlhbX1tcW1hYWFhXW1pbYF1bW1xbWFpbXlZeWV1QT09SW1BaVVZXVlRUVF5eYF9eYlxgVV1eYmt5dW1+bFtVWlZRUVRcVFRUVVRWWVdMUlpWXFtcUlBVU1dVVVJPV1FTV1NXVVZbXlhbWVVaXlhfXllcWVJXUllZWV9ZWVJUVVlZWVVXWVtVVFpdXV5hYmBlZF1eXV1lYWJmZF5eZGNgXGdlaGZlYmBlYV9hYWJiX2BeV1leWlxcWllZV1ZdWl1eW1pbXFtXWVxdVlhXXVNPUFdZUV1VV1lXV1VYX2BhYWBjXWBVXV5iZWV2gntpWVlaVFZUVlxYV1dWV1ddWE9VXFleXV1UU1hSVlVTUVNXUVNWVFhYWF5eWF1bVl1fWF9fWFxWUVhUWlpaYVhbVFZXWllaV1hZWVdWXV9gX2RjYmZlXmJcYGZiZGZkX2BkYmFbZmNoZmRmYWZfX2FiYWFgX15WVV1ZW1xbWVxZWV1bW1tYWFlbWlpaXV9dVFldVU5UWlZUXFVXV1lXVlxgYWJjYWNfX1ZbYGRhX3p1cGlaXFpWWFZYW1pZW1lYWWBWT1VdW2BhXFRVWVBUVlRSVVVRU1VXW1tcX19aX1xWX19ZXV5ZXVZSWFdaWVxhWV1VVlpbWltaWlhaWFlfX2BgZGNkZWVjZFpiZmNnZmVeYWJgY11iY2llZGdgaF5iYmNhYWBeX1lUW1paW1tYXFhYXFtaW1dXWlhYXFtcYF1WXV1TT1ZaVlZaVllWWFdYXmBiYWRhZGFeWVlhZGJga2ZoX11dW1dYWVpcXFxfW1pbYlZTV15dYWNcU1ZZUFZVVVVVVVNVVFhdXV9gYF1hXVdhXlteXFteWFVYV1taX19aXldYXFxcXV1bWlxXWl9hXmBkZGVmZmdjWWNmZWhnZF5jYF9lY11maWRlaWBnXmNiY2FhYF9fXFhZWllaWVhaWFdbW1pbV1haVFpdXFtgXFVeYk1SV1pXV1pZW1xYV1leYGJhZWFkYV1eWWFjYl9hYGFfXF1dWFhcW11dX19cWl1jWFlYXWBjZF9SWFlQV1VXV1dWVldWXV1eYWJhX2JeWWFdXV5ZXV1ZWFVWW1tgXlxfWVleXV5eYFxaWllbX2JfY2ZkZmdmaGNaZWZnaWdjX2NeYWZlWmlpY2ZpY2ZfYmJjYWBgX11dWldbWVlYWFpZV1pbWllXWVZVW11dXWBgYmJ4S1dXXFlXXVxcXVpXXF1fYGJkYmNhXWBYYmNiYGNhY15cXVxYWFxcX11gX11bYGRcXFhaYmVjYVJcWU9YVlhZWFlXWVpgXmFiY2BhY19cYl1fXVteXVlZVFhdXF9fXl9bWl5eYGJiW1tXW11gYmJkZmRnZmZoZV1lZ2hpZmNhYltjZ2BcaWljaGlmZWBiYmNhX2BfXV1cWVxZWFdYWVlXXFtaV1ZYUFhaXWFjZmZya39KWVddW1pfXVxeXFldW15fYmNiYWFdYltiZGJgY2JiXV1bWldYanFgXGBfXVxhY19eWVljZWRhVF9aUVlXW1xbW1lbW2NgY2NjYGJkYWBjXmBcXl5eWVhVW15cXGFhX11bYGFiZmJeW1NcX2BjZGRmZWdmZmdmX2ZnaGhnZGRgW2VnXmFoaGNpaGZjYGJhY2JfX19dXVtaW1lYWFhWWlZcW1pWVlZNWFhcZ2lraHV4gXZ2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp7enp6e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx8e3t7e3x8fHx8fHx8fHx7e3t8fHx8fHt7e3t7e3t9iYiGioeFgoGCg4KDg4KCgoKCgoKCgoKCgYCBgIGAgICBgIGBgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHt7e3t7e3t7e3t7fHt7e3t7e3t8fHx8e3t7e3t7e3yJiYeJhoWCgYKCgYKCgoKBgoKCgoKCgoGBgYCAgICAgICAgYGBgH18fHx7fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2dnd2d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh4eHl5eXl5eXl5eXl5ent7enp7enp6enp6enp7fHx8fHt8e3p6enp6e3t8fHx8fHx8fHx8fHt7e3t7e3t8fHx7e3t7e3t7e3t8fHx8fHt8e3t7e4eJiImFhIOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgICBgoGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ3d3Z3d3d3d3d3d3d3d3d3eHh4eHh4eHh4eHh4eHh4eHh4eXl5eXl5eXl5eXl6enp7e3p6enp6enp6ent9fX19fH18enp6enp7e3x8fHx8fHx8fHx8fHx8fHx7fHx8fHx7e3t7e3t7fHx8fHx8e3t7e3t7homJiIWFg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgYGBgIB+fHx8fHx8fHx8fH19fXx8dXBvb29vcHB6fn19fX19hIyLi4uLjngpKSoqKikrPT8+Pj4+Pm2Afn5/f3ul19PT09PTz8TFxcXFxcfS1NTU09PYWiUrKysqIovb0tLS0ta6fX5/f39/fn18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHx8fHx8e3t7e3uEi4eHhoeCgYODgYKCgoKCgoKCgoKCgYGBgICAgICAgICBgIGAgH58fHx8fHx8fH19fHx8fX11cG5vb29vb3qAf39/f36GkI+Pj4+TeRkaGhoaGhwxMzMzMzMyaoJ/gICAe63p5OTk5OXg1NTU1NTU1uPl5eXl5etUExsbGxsQj+/l5eXl6cd9fn9/f39/fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7e4KNh4iHh4OChIKBgoKCgoKCg4KCgoKBgYGAgICAgICAgICAgICAfnx8fHx8fHx9fHx8fX19fXZ1dXV1dXV1dnd3d3d3d3h5eXp6eXp3b3BwcHBwcHJycnJycnJ3enl5enp6foODg4ODg4OCgoODg4KDhISEhISDhHdzc3Nzc3J8hYSEhISFgnx9fX19fX19fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHt7gIyGiYeHhIOEgoKCgoKBgoKDgoKCgYGBgYGBgIB/gICAgICAgIB+fHx8fHx8fHx9fX19fX19dnZ2dnZ2eXd2dnp7eHt4d3Z5fHp6eXl9eXl5eHh4eHl5eXl6enl5eXl6enp5eHh5eXl5eXl5eXl5eXl5eXl5eXl5fH19fX19fXt6enp6enp7fHx8fH19fX19fX19fXx8fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx/i4eLioiEg4OCgoKDgoGCgoOCgoKBgYGBgYCAgYB/gICAf4CBgX59fXx8fHx8fH19fX19fX13d3d2dnd9eHd3fXp4fXh3dnp9enp7eXx7eHd3d3d4eHh4eHl5eXl5enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX18fHx8fHx8fHt7fHx8fHx8fHx8fH6KiYyMiYWDhISCgoOCgYKCgoKCgoGBgYGBgICAgICAgIB/gICAfX19fHx8fX19fX19fX19fXd3d3d3en14e3h8fHd7eHd2en56eX14fHp4eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx9fX19fH19fX19fX19fX19fX18fHx8fHx8e3t8fHx8fHx8fHx8fYqKjY2KhYODg4KCgoKBgYKCgoGCgYGBgoGAgYGAgICAgH+AgYB9fH19fXx9fX19fX19fX19d3d3d3d9fnl3d3h7ent4d3d4eX15fHp7end4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3x8fHx8fHx8fHx8fHx8fX19fXx8fXx8fXx8fHx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx+iomOjYmEhISDgoOCgoGBgoGCgoKBgYGCgYCBgoCAgICAf4GAgHx8fX19fXx9fX19fX1+fn53d3d3d3l8eXt4fH15e3h6enp8fHx9e317eHh4eHh4eHh5eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7fHx8e3t8fHt8fHx8fHx8fHx9fHx9fX19fX19fHx8fHx8fHx9fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH+Ih42Kh4WGhoODg4OCgYGCgYKCgYGBgYKBgICCgX+AgIB/gICAfHx9fX19fX19fX19fn5+fnd3d3d3dnh4eXd5enh6eHl5eXt5enp5e3h4eHl5eHh4eHl5eXl6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fXx8fXx8fX19fX18fX19fX18fHx8fHx8fHx8fHx9f4eIjIiGh4eEgoOEhIKBgoGBgoKCgYGBgoGAgYGBgYCAgH+AgYB8fH19fX19fX19fX5+fn5+d3d3d3d3d3d3d3d4eHh4eHh4eHh4eXl4eXl5eXl5eXl5eXp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fHx9fX18fHyAh4iLh4eJhoODhIODgoGBgYKCgYGBgoKBgYGAgYGBgICAgIGBf3t8fX19fX19fX1+fn5+fn53d3d3d3d3d3h4d3h2eXl4eHh4eHl5eXl5eXl5eXl5eXl6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHt8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18fHx8fX19fH19fIGGioqJiYiEg4WEhIKCgYGBgYKBgYKCgYGBgICBgYCAgYCAgYF/fHx9fX19fX5+fn5+fn5/f3h4d3h4eHh4dnFkal5qbXl5eXh5eXl5eXl5eXl6enp6enp6enp6ent7e3x7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gYWJiomKh4SFhYSDgoKBgYGCgoGBgoGBgYGBgIGBgICBgIGAgX58fX5+fn5+fn5+fn5+f39/eHh4eHh4eHltZGJlX19eb3h5eXl5eXl5eXl5enp6enp6enp6enp7e3t7e3t8fHx8fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fH18fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChYqKiYmEhIaFhIODgoGBgoKCgYGCgYGBgoGAgYGAgICAgIGAfnx9fn5+fn5+fn5+f39/f394eHh4eHh5bmRlZ2VkYl5meHl5eXl6enp6enp6enp6enp6enp7e3t7e3t7fHx8fHx8e3x8e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4mIioSFhoSDg4SCgYGBgYKBgoKBgYGBgICBgYGAgH+AgYF/fHx+fn5+fn5+f39/f39/f3h4eHh4eXdnZWRlZmRlYV9peXp6enp6enp6enp6enp6e3t7e3t7e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t8e3x8fHx8fHx8fH19fX19fX19fX19fX19fH19fX19fX19fX19fX19fX19fX19fX19fX18goaLh4mHhISGhIODhYGBgYGBgoKBgYGBgoGAgICBgYCBgICBgX58fH9/fn9/f39/f39/f3+AeXl5eXl5a2VhYmVlYWVlXmJ4d3N7enp6enp6enp6enp7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX2DhouGiIWFhoSCg4SEgoGBgYGCgoGBgoGBgYCBgYGBgYCAgYGCf3x8f39/f39/f39/f4CAgIB5eXl5eXRjY2VkY2ZjZ2hkZmxkXnN7enp6enp6enp6enp6e3t7e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+foOGi4aGhoaFg4ODhIOBgYGBgYKCgYGBgoGBgICBgYGBgICBgYF+fHx/f39/f3+AgICAgICAgHl5eXp3ZGFjZ2JiZF1bZV9hXV5gYWh4enp6enp6enp6enp7e3t7e3t8fHx7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+hIWLh4aGhoaEg4ODgoGBgYGCgoKBgoGCgYCAgYGBgYCBgYGBgX59fX+Af4CAgICAgICAgICAeXl5b29iYmJkXmNnX11hYWBcX2RiW218enp6enp6enp6ent7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t8fHt7fHt8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn+EiIuGhIeGhoSEg4OCgYGBgYKBgYGBgoKBgICBgYGBgYGBgYGBfn59gICAgICAgICAgICAgIF5enBdYmVkYmReZmdnYFliYmFjZV9cXXN7e3p6ent7e3t7e3x8fHx8fHx8e3t7e3t7e3t7e3t7e3t8fHx8fHx7fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fX1+fn5+fn5+fn5+fn5+gIWMioSFhoaFg4ODhIKBgYGBgoGBgYGCgoKBgIGBgYKAgICAgYF/fn6AgICAgICAgICAgYGBgXl6bGJkZ2NiZ2ZhYGBkYWJlZGNkY15cYnV8e3t7e3t7e3t7fHx8fHt7fHx8fHt7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f3+Bh4yJhYaGh4WDhIOCgYGBgYGBgoGCgoKDgoGAgYGBgoGBgYKCgX9/foCAgICAgICAgYGBgYGBent0Z2dmZmRkZmZgXl9hY2VoZGVeYmRgdHx7e3t7e3t8fHx8fHx8fHx8e3t8e3x8e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f4KJioiGhoiGhYOEg4KBgYGBgYGCgYGCgoKCgYCBgYGCgoGBgoKBf39/gYGBgYCBgYGBgYGBgYF6em1oY2NnZmdlZ2ZmZ2JlZGViZ1tiZWB2fHx7e3x8fHx8fHx8fHx7e3x8fHx7fHx8e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/f39/hImKiIaJh4WFhISDgoGBgYGBgYKBgoKBgYGBgYGBgoGCgYGAgIGAf3+BgYGBgYGBgYGBgYGBgXt6aWlkY2pmYWBmZWNjY2dpZGNiYGJkYnR9fHx8fHx8e3x8fHx8fHx7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/f35+f39/f39/f39/f4CEioyIh4mGhIWFg4KBgYGBgYGBgoGCgYGBgYGBgYGCgoGBgYGBgYCAf4GBgYGBgYGBgYGBgYGBdnNlZGdjZGZlYmVmZ2RmaGZlY2BgY2RgcX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fHx9fXx8fH19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9+fn5/fn5/f39/f39/f4CAgIWKjImIiomGhoOCgoKBgYGBgYGCgYGCgYGBgYGAgYGBgYGBgYKBf4B/fn9+gIKCgoKCgoKCgoJzc2dlZGRlaWpoZmdnY2FmZmVmZ2ZlZWN1fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX18fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgICAgICAhYuKiomKh4eGhIKCgYGBgYGBgoKBgoGBgYGAgYGCgoGBgYGBgYB/gH50dHN1fX+CgIB+fn+BgHRyZ2RlY2ZpamllY2VjYGZkZGdnYmJlYXB9fHx8fHx8fHx8fHx8fHx8fH19fXx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/f39/f39/gICAgICAgH+Gi4uKiouHh4eEg4KBgYGBgYGBgoGCgoGBgYCBgoKBgIGBgYGCgICAfnNzc3N0dXh1dXR0dXZ1dXBmY2ZlaGhpZ2hnZWZlYl9kZWZjYGJnd3x8fHx9fX19fXx8fHx8fX19fX19fX19fH19fHx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f3+AgH9/f4CAgICAgICAgIeMjIiLioeHh4OFgoGBgYGBgYGCgYKCgYGBgIGCgYGBgoKCgoKAgIB+c3Nzc3Nzc3N0dHR0c3N1b2NjYWdlaGhnamZkZWdmaGZjYmViXmJ5fXx7e3x9fX19fXx8fH19fX19fX17fH19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+f39+fn5+fn5+fn9/f39/gICAf3+AgIGAgICAgICBgIB/gICBgYCAh4uLh42JiImFhIWBgYGBgYGBgoKBgoKBgYGAgYKCgYGBgoGCgoGAgH50c3Nzc3Nzc3Nzc3Nzc3VyZ2VlZGVqaGhnZmloZ2NlZWJkY2hkZ3t4dXNzdHZ2eXh2dHR0dnd3d3Z0dHR1dXh3eHh3d3p7fH19fH1+fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/fn9/f3+Af358e3t9fnx5eXZ2dnl8fHp6d3Z3eXt9e3iEjIyKjIeHiISFhIGBgYGBgYGCgYGCgYGBgYGBgoKBgYGCgYGCgYCAfnVzc3Nzc3Nzc3Nzc3NzdXNoZWdoZWtsaGpnaWpnZ2dmZGRiZWRudXR0c3N0c3Nzc3Nzc3Nzc3Nzc3N0c3Nzc3Nzc3Nzc3R0dXVzdXd4eXt+fn1+f3x/f39/f39/f39/fXh8fn59fHh1dnd5d3h2dHNzc3R1dHNzc3Nzc3N0c3NzdHRzdHR0c4OMjYqJh4iGg4aDgYGBgYGBgYGBgYKBgYCBgYOCgoGBgIGBgYGAgIB/dXN0dHNzc3Nzc3Jzc3N2dmljaGpoamxlZmlsaGBmZWRjYGRkZnR1dXV0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHN0dHNzc3NzdHZ2dXV3dXh8f359f358enh1c3R1dXV0c3Nzc3Nzc3R0dHR0dHR0dHV1dHR0dXV0dHV1dHV1dXV0hoyNi4iGh4SEhYKBgYGBgYGBgYKCgYCBgIGBgoKCgYGAgYGBgYCAgH92c3Nzc3Nzc3Nzc3Nzc3Z2c2dnamZoZ2ZoaGZkaWdjY2dlZWZwdnV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0dHV0dHR0dHR0dHN0dHR2dXV3dnRzdHR0dHR0dHR1dXV1dXR1dXV1dXV1dXR0c3Nzc3R0c3N0dHR0dHV1dHWJjoyMioeHhISFgoGBgYGBgYGBgoKCgYGAgICCgoKCgYGBgYGBgICAf3dzc3Nzc3JycnJzc3NydnZ1bmRdY2dlaWtoZWhnZ2pqaWdlcHZ1dXV1dXR0dHN0dHR0dHR0dXV1dXV1dXR0dXV0dHV1dXV1dXV1dXV1dHR0dXV1dXV1dXR0dXR0dXV1dXV1dXV1dXV1dXV1dXV1dXR0c3Nzc3Nzc3R0c3Nzc3NzdHR0dHR0dYqOjIyJhoaEh4WCgYGBgYGBgYGCgoGBgYCBgYKBgoGBgYGBgoGAgIB/eHNzc3NzcnJycnJzc3N2dnd3aWJoaGdqa2loZmRkZWZpaHB1dHR0dHNzcnFycnR1dXR0dHR0dHRzc3JxcXFxc3N0dHR0dHR0dHR0dXRycnJzdHR0dHR1dXV1dXV1dHR1dHR0dHR0dHR0dHR0dHRzc3Nzc3Nzc3Nzc3Nzc3R0c3R0dHR0dHR1i46MiYaFhYWHhIKBgYGBgYGBgYGCgoKBgYCAgoKCgYGBgYGBgYGAgH95c3Nzc3JxcnJycnNzc3d3d3dsamhkaGlrdnprZWZlaGdtcnN0c3RzcnBwcHFyc3R1dHRzc3Jyc3JxcG9vb29wcXNzc3JycnJzdHR0c3FwcXJzdHR0dHR0dHNzdHNzc3N0dHR0dHN0dHR0dHR0dHN0dHRzc3JycXFycnNzc3Jzc3N0dHR0c3aNkIyHh4WFhISCgYKCgYGBgYGBgYKCgoGBgYCBgYKCgYGBgoGBgYB/f3lzc3JycXFycnJyc3Nzd3d3d3NzamdpaWh5f31xbnVsbnBxcnJycXFwb3BxcXFzdHNzc3JxcXBwbm5ubW5tbm5ucHFycnJycnJycnNxcG9vcHFycnNzcnFycnJycnJycnJycnNzcnNzc3Nzc3Nzc3NzcnFvb25ub29xcnNzcnJzc3Jyc3Nydo+Pi4eGhYWFg4KCgoGBgYGBgYGBgYGCgYGBgYKCgoGCgYKCgYKBf39/eHFwcHBxcXJycnJzc3N3d3Z2d3ZycXRzbnZ/fnZzeHBwcHJycnJxcXBwcXFxcXJzc3NzcXBxcG9vbm5ubm5vbm9wcHFxcXFxcHBxcnBvbm9wcXFxcXFwcHFxcXFxcnJycnJycnJycXFycXFycnJycXBvb25ubW5tbm9xcnJycnJycnJzcnF4j46NhoODhoSCg4KCgYKBgYGBgoGBgYKBgYGBgoKCgoKCgoGBgoF/gH93b3BvcHFycnJzc3NzcnZ2dnZ2dnd2dnVzeX9+d3d3b3BxcXFxcXFwcHBxcnFycnNzcnJxcHBvb3Bvb29vb29vb3BvcG9vb29wcHFvb29wcHBwcG9wb3BwcXJxcXFycnJycXFxcXFxcXFwcHBwcHFvb25ubm1tbm1ub3BxcXFxcXFxcXFxcHuPjY2Gg4OFg4KCgoKBgoGBgYGCgYKBgYKCgYKDgoGDgoGBgYCBgX9/f3Zub3BwcHFxcXFxcHBwdnZ2dnZ1dHRzc3F9gH19f3NvcHFxcXBwcHBxcXBwcHFycnFxcXBvcG9vcHBvb3Bwb29vb29vb29vcHFxcG5vcHBvb3Bvb3BycnJycXFxcHFycXBxcXFwcHBwcHBwcHBvb25ubW5ubm5ub25vcHBwcXFxcXFxcXFwgpGOioSEg4WEg4KCgYGCgoGBgoGBgYGBgYKCgoKCgoKBgYGBgIGBf3+AdW9vb3BxcXFxcHBwcHB2dnZ1dHNycnJycYCCgIF5cHBwcG9wcHBwcXFxcXBxcXFxcXFwb29wcHBwcHBvcHFwcG9vb3Bvb29xcXBwb3Bwb29vbm9wcXFwcHBvcG9vcHBwcHBwcHBwcG9vb29vb29ubm1tbW5ubm5vbm9vcG9wcHBwcHBwcHCJkIyIhIOEhoODgoKBgYKCgoKBgYGBgICBgYGCgoGBgYGBgYGAgYGAf4B0bm9vcHFxcXBwb29wb3Z2dXNycXFxcXFwgIODf3JwcHBwcHBwcHBwcXFwcHFxcXFxcHBwcHBwcHBwcXBwcHBwcHBwcG9wcHFxcHBwcXFvb29ub3BwcG9vb29wcG9vcHBwcHBwcHBwcG9vb29ubm5ubm5tbm5ubW5ub3Bwb29vb29vcHNxdY+PjImDgoWHg4OCgoGCgYKCgoGBgoGBgIGCgYGBgYGBgICBgYCBgYB/gHRvb29ub29vb29vb29vdnV0c3FxcXFxcnKAgoKBdHFxcXFxcXFxcXFxcXFxcXFxcHFxcXFwcXBxcHFxcXBwcHBwcXFxcHFwcHBxcHBwcHBwcHBwcHBwcHBwcXFxcHFwcHBwcXBwcXFwcXFxcXFxcnFycXBydHJydHR0dHV2dHN0dHR1d3eCkI+LiIOChoeEhIKDgYGBgoKCgYGCgYGBgoGBgYGBgYCAgIGBgIGBgH+AdW9vb29vb29vbm9vb291dHNycnJycnJycoODg4J2cXJycXFxcnFycnFxcnJycXFxcXFycXFxcnJxcXJxcXFxcXFxcXFxcXBxcXFxcXFyc3NycnJzdXV0dHR0dHR0dXZ3d3d3d3d4eHh4d3d4eHh3dnd2dXZ2dnZ3eHp7fHt7e3p6enp6fIaQjYuIg4OIh4eFg4OCgYKBgoGBgYGBgoKCgYGBgYCBgICBgYCAgYGAf4B3cXFxcXFwbm5wb3Bwb3Z0dXVzc3Nzc3N1iIOCg3lyc3NycnJzcnJzc3JycnJyc3RycnNyc3Nzc3Nzc3Jzc3R0dXV1dXV0dXd4d3d3d3h4eHd4eHh5eXl5eXh4eXl5enp7e3t7e3p6enl5eHd3d3V2dXZ2d3l6ent+fn59fX5+fn9/fn6AjJCLioeDhYiLiISDhIOBgYKBgYGCgYGCgoKCgoCBgYGBgIGBgYCAgYB/gHx6enl5fHl4eHZ1dnZ0eXZ3eHd3dnd2dnp/fH5+fHZ2d3d2dXh6eHh4eHd3d3Z4fHl5fHp5eXx7eXl5eHh5eXp6eXl5eHh6enl5eHh4eHd2d3d4eHd4eHl5ent7enx8fX59f39/fn17e3t7enl6eXl7e39+gH9+fn9+fX19fn5/fn5+foCOkI2Kh4SGiouIhoaEg4GCgoGBgYKBgYKCgoKCgIGCgoGBgYKBgIGAgX9/gH9+fX19f39/fXx7e3t5eHh4eHl5eXh5eHl5eXh6enp6enp7e3t8fX58e3t6e3x7fXx7e3t7e3t6eXh5eHh6e3p6enl5enx8e3p6fHx8enp6e319fH5+f4CCgYCBgoCAf3+BgYGAgH9/fn5+fn99fX5/gIB/fn5/f35+f39/f3+Af4B/g5COjIeGhYiLjIiHhoWDgYKBgYGBgoGCgoKCgoGBgoOCgYGBgYGAgYGAgH+Cg4KCgYGBf31/f39/gXp6eHh3eHh4eHl4eHl6enl7fnx6fH19e3x9fX18fHx+fH1+fn5+fn19f39/fHx9gYOBgIB/fXx9fH19e319fHx8fX19fX6BgYKEhIOCgH+BgYGAf39/gH9/f39/f35+f39/f39/fn5/f4B/f3+AgIB/gICAgICEkI+Lh4aGiIyLiIqGhoOCgoKBgYGCgYKBgoGBgYGCg4KBgICBgYCAgYGAf4KEgoKAgICAf35+f4CAf39+fXx9fX19gH99f4B/fn+Af39+f3+AgYGAgIB/f4GAgIB/gIGCf39/gIB/fn5/f35/f39+fn5/f3+BgH9/gIGBgICBg4SCgYKCgYKAf4CBgIGBgYCAf4GAgIB/f3+AgICBgYGAgYGBgICAgIGCgYGBgICBgYWOjoyIhoeJjIuLioaFg4KCgoGBgYKCg4KCgoGAgYGBgoKAgIGBgICBgYB/goWDgoGBgIB/f35+f4B9fn5+fX19fn9+f39/fn5+f4CBgICAgIB+f39+f4B/f4CAf39/fn9/fn5+fn1+f35+f39/fn+AgYGCgoODgoKDgoGBgoODg4KBgYGBgoGCgoKBgoGCgYGBgYGCgoKBgYKBgoKCgYGCgoGBgoKCgoKBgYGCgoKCho+Rj4qHiIqNjo2JhoWCgoKCgoGBgoKDgoKCgYGBgYGBgX+AgYGBgIGAgX+BhYSDgoKCgYKBgICAgHx8fHt8fXx8f35+f35+fn5/fn5/f39/f39/fn5+gH5+fn5+f39/f35/f35+fn+AgH+AgH9/f39/f4GBgYKCgICBgoODhIODg4OCgoKCgoKCgoKCgoKCgYKCgoODg4KDg4OCgoKBgoKCg4ODg4OCgoKCg4ODgoKHkpKQi4qLi4+PjYqHhIKCgoKBgYGCgoOCgoGBgYGAgYGAgICBgYGAgYCBgICDhIODg4SDg4OCgoKBfH18fH2CfX5/gYKIgYKChIKBgYODgYGBgoKBgoGBgIB/f3+AgIB/f4CBf39/f3+BgICAgICAf39/f4CAgICAf3+Bg4OFhISDhIOCgoKDg4KCg4KCg4ODg4ODhIODgoSFhYODhISCgoOEg4KDg4ODg4KCg4OCgIqUk4+KioyOkI+Ni4aDgoKCgoGBgYGCg4KBgYGAgYGCgYGAgIGBgYCBgICAf4GCg4ODhISEg4KCgoJ9fHx+foCBg4CDg4KEhoWGhoWEhYWDg4ODg4GBgoSEgoKCh4OCgoCCgYGCgoKDgoKDgoOCg4OCgYCAgoKBg4KBgoKDg4SFhYSDg4KEhISEg4SEhIODg4SDg4ODg4SDhIOEhYSEhIODg4OCgoKCgoKCgoGBgoKCj5SUj42OjpGRjoqIhIKCgoKBgYGBgYKDgYGAgYGBgYGBgIGAgYGBgIGAgICAgoKEgoOEg4KDg4OCgn19fYCAf4CCgYODg4OEhoSEg4SFhYODgYGCg4GAgoOBgoWFhYWGhoeGhoaGh4eHhoaGh4eGhoSCgYKDhIODg4ODg4OEhIWFhYOFhIWEhISDgoGDg4KDhISDgoKDhIKDg4ODg4KCgoKCgoKDg4SEg4WFhYWGhoiTk5OQj4+PkpGMioeCgoKCgoGBgYGBgoOCgoGAgYGBgYGAgICBgYGAgICAgICEhISBgoKCgYGCgoGBf4CBg4GAgIB/gIKCgoODgoKBg4ODhIODgoOFg4KBgYGChIWHh4eHhoaHh4eIiIeHh4iIiIWEg4GAgYGCgoKDgYKDhISFhIODg4SDg4SEg4GBgYKDg4SEhIODg4ODg4SEg4OChIODg4OEhYWGh4eHh4iIiImJjpOSko6PjpCRj4uJh4KCgoKCgoGBgYGCgoKCgYGBgYGBgYCAgICBgYCAgYCAgIODgoKBgoKBgYB/gIGFhYWGg4KBgH5+f4GChIKBgoOEg4KDg4ODgoKEhIOEg4KDhIWEhIWFhIOChIWFgoSEhYWDgoGAf3+AgH+AgYSDg4SFhYSCgoKCg4KDg4WEgoOEhISFhoaGhoaGhYWGh4eFhoiHhoeIh4aGhoiIh4aFhoaGh4iRkpKQjpCOkJGMiYeFgYGCgoKCgYGBgYGCg4GBgYGBgYGAgICAgIKAgICAgICAhISDgoGCgYCBgYCBgoiHhoeFhIKAf319foCAf4CBgYGBgYGCgYCBgoKCgYKCgoGBgYKBgoKDgYGAgIB/gYCAf4CAf36AgYGBgoKDg4SDg4SDg4KCgYGCg4ODhISDhISEg4WFhoWHh4iHh4eHh4eHh4aGhoaHhYWFhoaEhYSEhYSFhpKTkY6Oj46QjomJh4SCgoKCgoKCgYGAgYKCgoKCgoKCgYGBgYCBgYGAgICBgYCChIODgoOCgYKBgoODiIeHh4eFhIKBfn6AgIB+fn5/gIGBgYKBgIKCgYKAf4CAgH6AgoGAgYKDg4B/f3+AgIB/gICAgIODgoODg4OCg4GBgoKCg4KBgoKCg4KChIOEhIODhISFhYWFhoaGhoWEhISFhYSEhYWFhISEhIOEhISEhISKlJOSkJCPjo2IhoWEg4GBgoKCgoKBgYCBgoKCgoGCgoGBgIGBgIGBgYCAgICBgYCDg4KCg4KCgoGCg4KIiYmJiIeFhIOBgoSEg4GBgYKCg4KCg4SCg4SFhYSChIKBf4CCgYGCgYKEg4GBgYGCg4KCgYODhIODhISDg4KDgoODg4ODgoKCgoKCgYOEhISFhIWFhYWEhYSEhYWFhYODg4SEhISFhYWEhISEhISDg4ODg46VkpCRkY6NjIeFg4ODgYKCgoKCgoGBgIGCg4KBgIKBgYGAgICAgYGBgICAgIGAgIOFhISEg4ODhIOEg4aHiYiGhYOEg4SDhYOBgYOCg4WFg4ODhIOEg4OFhIWEhISBgYCBgoOCgoSDg4KCgYGEhYSDg4OCgoOEhIODg4ODhIWEhIODgoKBgoKChISFhIWFhYWFg4OFhYWFhoWGhYSEhYSFhYaFhYWEhYSEhIOEg4OEkZSTkpKPjIyKhYSEg4OBgoKDgoKCgoGBgYKDgoGBgoGBgYGAgIGAgYGAf4CAgYCBhoaGhoaGhoeHhoaFhIOFhoKAgYGBgYeCgH5/gYCAgoGBgIGBgICCgYKCgoGCgoKBgIKCgoKCgoODgYKBgoOFg4ODgoODg4SCgoSEg4SEhYSDg4KCgoKBgYKDg4ODhIWFhYWEg4SFhYaFhYSEhISEg4SEhYWFhYWEg4OEg4SDgoaUk5KUko+Ni4eEhISDgoGCg4OCgoODgYGCgoGCgoKBgYKBgYGBgICBgYCAgICAgICFhYWFhoaGhoaGhYaDg4ODgYCCgoKBgoB/fn9/gIB/gH+AgYCAf4GBgYGDgICBgYKEg4GBgYGBgoGBgoOCg4OCg4KCgoKDg4GDhIODg4ODg4SEgoKCgoOCgoODg4OEhYSEhISDg4SEg4ODg4SEg4ODg4ODhIODg4ODgoODgoOCi5STkpORjY2KhoODg4SCgYKDg4ODg4OCgYGCgYKCgoKCgoGBgYGAgIGBgIB/gICAgIOEhIWFhIWFhYSEhYKDgoOCgoODg4GAgICAgICBgICDgoKDgYGCgoODg4SCg4ODgoCAgIKCgoOCgoODg4OCg4OEgoKCg4OCgoODgoKDgoODhYSDg4ODhIODhISEhISFhYSEhYSDhISDg4SEhISEhISDhISFhIODhISEg4OCgoOQlJKSko+LjIiGhISDg4GBgoODg4ODg4KBgYKCgoKCgoOCgIGCgYCAgICAgH+AgICAhIOFhYSFhYWFhIWFg4SEhYODhIWEgoKCg4KChIKBgoaFg4SDg4SEhIaFhISFgn99fX1+goSDg4ODg4SDg4OEhISDg4SEhISDhISEg4SDg4WGhYWFhIWFhYWFhIWGhYaGhYWFhYWFhYWFhYaGhYaGhoWGhoaHhoWFhYWDhISEh5OTkpGSjIuIhYaFhYKCgYGCg4ODg4KDgoGBgoODg4KCgoGAgYCAgICAgICAf4CAgICFhYaFhYaHh4aFhYWEhIWFhISEhISDhIODg4SFg4KDhIWFhoWGhoWGh4eGg4F+f35+fn5/g4SDg4SEhISEhISEhISEhIWFhYSFhIaFhYaFhoaGhYaFhYeFhYaFhoaGhoWEhYWFhYWEhYaGhoeGhoaGhoeHiIiIhoWFhoSFhYaNlJOSkZCLioeGh4aEgYKCgoODg4ODgoOCgYGCg4ODgoCBgYGAgICAgICAgIB/gICAgIeHh4aGh4eIh4eGhoSDg4OEg4ODg4SDg4ODg4SEg4ODhYWFhYeHhYWHhYF/f39/f39/fn+AhIWEhYaGhoWFhYWGhoeGhoWGhYWGh4eHiIeHh4aGhoeHh4aGhoeGhoaFhIOEhYWFhIWFhoaGh4eGhoaGh4eHh4iIh4aGhoeHh5GTkpCRkIuIiIWGhIOCgoGCg4ODg4OCgoOCgoKCg4KBgIGAgIGAgICAgYCAgH+AgIB/hoeIh4eHh4iJiYiIg4OCgoODhISEhYSDgoKDg4SDg4KDhYSFh4iFg4KAf39/f3+AgH9/gH9/hYWGh4iIh4eHh4iHiIeIiIiGhoeIiImJiYiHhoeHh4iIhoeGh4iGhoWEg4SFhoaFhYWGhoaHh4WGh4aHhoaHh4eHh4eHh4WHk5ORj5GQi4eGhYaEgoKBgYKDg4ODg4OCgoKCgYKDgoKAgYGBgICAgICAgIB/gICBgH+GiIiIiIeHiImJiYiDgoKDg4OEhYeHh4WDg4WEg4ODgoSEhISFhIGAgYKBgYGBgH+Af39+e3qAhoiIioqJiYiIiYmJiYqLioiIiImJi4uKioiIh4iIiIeHiIiHiIaHhoSDg4WHh4eGhYWEhISFhYSFhYaEhISFhYWGhYaFg4mUk5COkY6KhoWGhYOBgYGBgoODg4OCgoKCgoKCgoKBgYGBgYGBgICAgICAgH+AgIGAf4aJiIiJh4iIiYmIiISCgoODg4OEiYqHh4SFhYSDg4WDhYSDg4KBgoKCgoKAf358fX19f358e3yDh4mLi4qKioiIiomIiYuKiYmIiYiKiomLiYeGhoaHhYaIiImIh4aGhIOChIiIiIiHhYKCgYODgoODhIKCgoOCgYSDhIOBjpOSkI+Pi4iFhIaEgoGBgYGCg4ODg4KCgoKCgoKCgYGBgYGAgYCAgICAgICAf4CAgYB/hYiHh4eGh4iIiIeHhIKDg4KDg4WJiomHhYeFhIWFhIOFhIOCgoKCgoOBfn1+fn5+fn59fX59fX2Dh4mKioeHhYaHh4eHiIeHiYeIhoiHh4mIhIOEg4WEhIWFhoiHhoWDgoKDhYeGh4aGg4KCg4SCg4SEgoGBgYGBg4OEg4SRkpGOj42Lh4SGhoOCgYCBgYODg4ODgoKCgoKCgoKBgYGAgYGBgICAgH+AgYB/f3+AgH+FhoaFhoaGh4eIh4aBgoSEg4KFhoiLioaFhoSChoaCgIODg4ODg4KCgX18fX+Af35+fn18fX18enyEhoeGhIOBg4OEhYWFg4OFhISEhISEhYSCgoOChISBgoODhYaFhIKBgYKCg4OFg4SEhYSEhoODhIWDgoOBgoODhIWEh5KRj42PjImGhIWEhYKBgIGBg4ODg4OCgoKCgoKCgoGBgYGBgYCAgIB/gICBgH+AgICAgIOEhYSFhYWHh4eHhoCBgYWDg4WFhIeIhYOBgICBf359goODg4OCgoB9fX+AgIF/fX5+fX19fXp6en6DhISCgYGAgYGCgoF/foGBgYKBg4GCgYKCgoGDg4B/gICBg4KAgICAgYGBgYKBgYKEg4OFhIKDhIOCgoGChIOFhYaMk5GOj4+LiIWFg4KEgYGBgYGCg4ODgoKCgoKCgoKCgYGBgIGBgIGAf3+AgYGAgICAf4CAgoKDg4KEg4SFhYaGf4F+gIGAgIB/gYOCf35+fn58fH+Dg4KDgoOBfX1+f4CAgYB+fX19fX59fHp6en+CgoB/f39/fn9/gH59gH9/gICBf4CAgX9/f4GBfn19f4CBf39+f4CAf4CAgIF/gIKAgIKBgYKBgYCBgYGBgoSDho+SkI6PjYqHh4aDg4KBgYGBgYKDg4OCgoKCgoKCg4KBgYKBgYGAgICAf4CAgICAgIB/f3+BgoOEgYKCg4KDhIWAgX98fX1+fX1+gIB+fX5+e31+goODgoKBgX99fX5/gICAf359fX18e3t7enp5eoCAf35/fn5+fH5/fn+Af35/f4B/gYB/fn5+f39+fXx+f4B/fn5/f4B/f39/gH9/gH5/gIF/gH5/f3+Af39/gH+FkpKPjo+Li4eJhYSDgoGBgYGBgoODg4ODg4KCgoODgoCBgoGBgYCAgIB/f4CAgH+AgX9/foGBhISBgoGDg4KDg4GAf3x+fn9+foB/gH9+gH19f4GEg4KBgH9/fn1+fn+AgIB+fX19fHt7fHp6eXl5e39/fn9/f359fn9/gIB/fn9/gICCgH98fn5/fn59fH9/gH9+fn9/gH9/f39+gIB/foB/f35+fn9/fn5/fXx8fYWSko2Mi4qIiYiEhYSCgoKBgYGCg4KCg4OCg4ODg4OBgIGBgYGBgIB/f39/gICAgICAf39+gIGEg4KBgYOEhIOEgIGBgIGAgYCBgoKDgYCBfoCCg4OBgYGBgIB9fX1+fn5/fn19fX19fHx8e3p5eXl5fYB/gIGBgX9/gYB/gX+AgICBgYKCgH6Afn9+fn5+gYCCgX9/f3+AgH9/gH+BgH5/gIB+f39+f4B/fX59fXt8hpORjIuKh4eKiIaGhIOCgYGBgYKDg4ODg4KDg4KCgoGAgIGBgYCAf39/gH+AgICAgICAf35+f4GBgYCAhIaHhoeChIOFg4GDg4OFhISEhIOBg4ODgoKCgYKBfn59fX1+foB9fX19fX19fXx7enp5eXl5gIKCgoSDgIGDgYCCgIGBgYOCg4OBgYKAgYB/gIGDgYSCgICBgIGBgICBgIKCf4GAgX+AgH+AgIB+f39+fHyKk5CKiYiIiImIhoaGhIKCgYGCgoODg4ODgoODgoKBgICAgIGBgYB/f3+AgICAgICAgYF/fn1+fn9/f36DhoeHiIKGhIWDhIWEhYaGhoaGhYWGgYCDg4OCgoB9fX19fX1+fn19fX19fX19fXx7eXl5eXh8goOEhYKBhIOCgoOFhoKDhIOBgoKDg4GDgoKBgoWDiIWCgYGBgoKBgYGBhIOCg4KCgoKBgYGAgX+AgYB/fo6TjIeIhoiHhoaFhoaEgoOCgYKCg4ODg4ODg4KBgYGAf4CBgIGBgH9/f3+AgICAf4CBgH9+fX19fn5/foCDhIeIhIaGhoWGhoeHhoaHh4eGh4d/fYCAgYKBfn19fX19fX19fX19fXx8fn5+fHt5eHd4eXmAgoN/g42Eg4SEhJeXg4OEgX1+gYKCgYKBgoGDhoiMhYOCgoGEgoSDgoOFhYSFg4KDg4KDg4KCgoKDg4KCkpCLiIiHiYeGhoSGhYSEhIKBgoKDg4ODg4OCgYGBgICAgIGAgYGAf39+f4CBgIB/gIGAf39+fX9+f4F/gIKBhYWFhoaHh4aHh4iGh4eHhoeHh398fXx9f359fX19fX19fX19fX19fHuIkoJ7fHp8hnl4eXyBgX6Jl4SDg4SElJOAgYF/f39+foSLgH+AgISGkImFhIKCgYWFi4OBgoWFhoaEg4WFg4SEg4OEg4WEhIiSjouJiIiJh4iHhYaFhIWEgoGCgoODg4ODg4KBgYGAgICAgICAgH9/f39/gICAgICAgYF/f39/gICAgYGBgYGDg4aHhoaHhoaIh4aGhoWEhIaFf3x8fHx9fXx8fX19fX19fX19fXx8f5GVloN7eoSUfHh5ent8f4KDgYGAg4KAfnx+fnuIkXx8jpZ/fX9/goaKhYODhIKBg42Jf35/g4SFhYOFhoWEhYWDhIWFhoSEjpGPi4qKjIqJioeFhoWDg4KBgoKCgoOEg4OCgYGAgIGAgICBgYCAgH9/f4CAgH+AgICBfn5/gYGCgoKDhIOCg4KChYaEhIWFhIaEg4SDgoGBg4F/fX18fH19fHx8fXx8fXx9fX18fHx7i5GXjHp7fIB6enp7fHl5fX1+gH+Af3x7e35+fYKVkX+EiH58fn+ChHx8gYKEgoB/h4N9goF/goKAg4OEhISEhIKEg4SFgoSRkY2LjIyOiomJhoWFg4OCgoGCg4OCgoODgoKBgYCAgYCAgICAgICAf4B/f4B/fnuAgIF6fICBgoOFg4OFhYWFg4ODhIKBg4OCg4KCgYCAgH+Bfn9+fn18fHx8fHx8fHx8fHx8fH19fHx+foqCe3p7enh6e3p8fXt+fX5/fX19fXx8f4GBfYaPgX59gn5/foCCfHx/f4GAgoB+fXuKgn2Af36BgICBgoGCgICAgYB/i5OPi4uNjo2Ih4iGhYSEg4KCgoKDg4KCg4OBgYGAgICAgICAf359fHt8fH1/f4CAfHqBgXh7gIKBg4WEg4WEhoaEhICGlIiAgoGBgYGAf39/f39+fn6AfHx8fHx8fHx8fHx8fH18fHx8fHx8eXt7e3h4eXt7enyBf4B+f4F8fn5/f32AgoKAgICBf4KRgX9/gIB+gH5+f36AgYF9fH17fX19fH18fH2Af4CAfoB+foGUkYuMjI2PioaGhoWEhIWDg4OCg4ODg4KCgYGBgYCAgIGAgIB/gIB/f399e3p8gICAeH6Bd3uAgX+BgoKCgoOGh4aGfoiVin6BgYCAgH9+gH5/f39+f4F+fHt7fHx8fHx8fHx8fn18e318fHx7fHx8enp5e3x6fYWDgn+BgX5/fn+AfoWCgX6Af35+gIWGgoB+foOHf318foCAgYB/f359fX19fXp8fX9/f4B9f36AjJGNjI2OjY2HhIaGhYSEg4ODg4KDg4ODgoGBgYGAgIGBgYCBgYGBgYCAf39/f3t6f397eYB3en9/fX5/f4B/goSGhoV/f4WBfn+AgH+Afn5/fn+AgH+AgH9/fXx8fH1+fXx9fX19fX18fnx9fHt9fHx6e3p7fX1/hoSCgICBfX59fn99i4SBhn59fHx/foKBf319fX2AfHt9fH6BhIOBgH5+fn59fH5/f31+gH5+foSSjIyLjo2LioaEhoSEg4ODg4KDgoOCg4KBgYGBgYCBgYGBgH99fHx8fX5/f39/f3t7f313fnZ4fn18fXx9fn6BgYKDgHt+fXx+foCAfoB/fn9+f4CAf4CAf39+f35+fn5+fX5+f318fn1+fX18e3x8fHp7en1+f4CDg4J/fn98fXx9fH2Bg36Mfnx7e31+fX5+fXt7e317ent7e4CGhIKEg4J/gH5/goKCf3+Cgn+Aio+LioqMi4qIhISFg4SDg4OCgoKCgoKCgoGBgYCCgoGBgoJ/f4CAgH9+fXx8fn9+fnl9fnZ7dnh9fHx8e319foGAgIB/fn9/fX5+f39+gH9/f39/f4CAgYGAf32Af39+f35+f39/fIJ+fn19fXt7fX18enx8foCCgX+AgHx8fXx8fHx8fXx9e39+e3t7fHx8fXx7e3t7fHx6en16foJ+gYOEgoGCgYWGhYWGhoeGgoSQjYuKiYqGh4WCg4SEhISDgoKBgYKCgoGCgYGBgYGCgYGCgoCBgoGBgICAf357fH5+fHp+eHl2d3x8fHt7fXx/gYB/fn9+gH9/fn9/fn+Af39/f39/f4CCgoB+foGAgH9/f39/f359g3x8fX18f319fX17fH5+f35+fX9+fHx8fHx8fH5+e3x7fHx8fH18fXx+fH18fHt7fHl7fHt7fXt9fn5/gICDh4mJiYqJi4mFiJCMioiIhoWFg4KCg4SEg4OCgoGBgYGBgoGBgYGBgoKCgYKCgICBf3x7enp5e316fH5+eXx5eHh0fHx8e3x8fH6Bf39/f3+AgH9+fn59f4CAf39/f4B/gIODgH+AgYCAgH9/gICAfnx6fH19fn19fn6Mhn19fnt7g4J9fX19fXx9fH19fX58fXt9fH19fnx+fX19fXx7e3p8e3x8e3p7e3p6ent+foKFiIeHi4uLiomMkI2MiYeGhYSDgoKCg4ODg4GBgYGBgYGBgYGBgYKCg4KBgoGAgYF/f4B/fnp4eXl6fn57eXp4fnN8fHx7fHx8fn5+f3+Af4CAgH9+f36AgX9/gH+AgYCChIOBgICBgYCBf4CBgYF/f35/fX6Afnt+gZGMfH1/ioCNjH5+fX19fn19fn18fHx9fXx9fH19fX59fX5+fHt7e3x8fXx7ent8eXp5eHl7fn+EgoSIiYqIiY2PjIqHiIWEhIOBgoKCgoOCgYKCgoGBgYKBgoKCgYKCgoGCgoCBgYB+gIB/f357enl7fX15fHp/coF9e3t8fHx+fn19gYJ/gYGBf3+Af4CBf3+AgYKBgYWDhIKBgYKBgoKAgIGDgoB/gX99foB+fH9/iIJ/foOQhISDgX9+fXyNh319fn18fH9+fH19fH19fX59fn99fX17fH1+fHx7fH16enl5enl7e35+gIGDh4SIjYyJiYWFhISDgoKCgoKCgoGBgYKCgoGCgoKCgoKCgoKCgYKCf4CAgH5/f39+fn96e3l9fXp6en1xfoJ6e3x9fX19enh+goCBgoKAgIGAgYGAgIGCgoKChoWEgYGBgYGDgX+AgoSBf36BgH1+gX59f3+AgH1+f4SAfn5/fX59fYqFfX5/fX5+gH99fX18fn5+f31/gH19fXx9f398fHt8fXt7e3p6ent7fH1+fYCDf4iMiYmHhYWFhIOCgoKCgoKBgYGCgoGCgoKCgoKCgYGCgoGBgoJ/gICAf39/f35+fn15enp9fHl3e3R7h3x0d31+fXt7dnZ+gIGDgoGBgoKCgoGBgYODg4KFhoSCgICAgIKBf4CBhIF+foCAfX6AfX1+foCAfoF+f4B/f3+Af31+f39/f4B+f3+Afnx9fXx+fn5+gX+AfYKAfH2AgX18fH19fHx7fHx7e3t8e3x8fH18iImHh4WGhYWEhIOBgoGDgoCAgYKDgoKCg4KCgoKCgYKCgYGDgn+AgYB/f39+fn5+fnt7enx8e3Z7dHd/fnZye35+e3h1d3yAgYKCgoGCg4ODg4KChIOEg4WGg4KBf3+Ag4CAgICDgX5+gIB9f4B9fX5+gIB/gn+BgYCAgIF/fX9/f4CAgYCAgH9+fH19fX1+fn2DfYB+goB9foGBf3x+fn19fXt8fnx9fHx8e3x7fH2IhYaEhYeFhIWEgoGCgYOBgICCgoOCgoKDg4ODgoGBgYGBgYKAfoCBgH9+fn5+fn5+fnp7en2Cg311cXp8enF6fX15eHR0gICCgoKDgoOFg4SDgoOEhISEhYSBgYCAfoCCf35/foF/fn9/gH1+gH19fX6Af3+BgIKBgICAgoF9foB/gYB/gICAf359fX1+fX5+fX2BhH+Af35/gYF/fYB/fX1+fX5+fX58e3x6fHt6gIWCg4SFhISEhYOCgoGBgoGAgIKCg4KCg4SDhIODgoKBgoGBg4B/gIF/fn5+fn59fn5+e3t6fomHfnhyeX1/cXp4e3h5dHV9goOCg4ODg4WEhYSDg4SEg4OEgoGAf4B/gIF+fX1+gH5+fn+AfX1/fH19foB/gICAgoCAgYCDgX9/gH6AgX6AgYCAf35+fn5+fX9+foWFgIGAf4CDgX9+gYB/foB+gH9+fXt6e3p8e3qCg3+CgoKCg4KDgoGBgICCgYCAgoGDgoGDhIOEgoSCgYGCgYKCgH6AgX9+fX5+fn59fn19ent8hYR7e3J5e3xwd3V2d3l2dHqEhIGEhIOEhYWGhIODhYSCg4OCgIF/gH9/gH19fX5/fX5/f39+fX58fX1+gX+AgH+AgH+AgYOCgYB/foCAf4CBgIGAf39/f39/gICAgYKCgoF/gYSBf4CDgX9/gH+Bf4B/fHt7enx7fIGAf4F/f4GBgYKBgX9/f4GAfoGCgoOBgYODgoSChIKBgYGAgYKAfoCAf399fn59fX1+fX17e3qAf3h8dnl6fHF0eHd2eHVyeYWFgoWEgoSFhYaEhIKEg4GDgoCAgX5/gH+AfH19foB9fn9/f359f3x+fn6Bf4F/f35/gH+Ag4ODgH9/gYGAgoGBgYCAgYCAgICAgYCBgoOBgX+AhIF9gYOEgICBf4GBgoF9ent7fHx9f31/gHx/f319gYCAfn19gH9+gYGBgoGAgoKCgoGDgoKBgH+BgoB+f39+f319fX59fX19fX16e3t8dn15eHp6cnV5eXZ3d3N1hoWDhYWChISFhISEgoOCgYOBf4CBfn+AfoB9fX1+f35/gH5+f31/fH9/f4GAgX9/fH6AfoCBgoOBgICCg4SCgYCBgH+BgICBgYCBgYKDgoGBf3+DgH6CgoSAgIKBgoKEgn57e3x8fH19fX59en59fXl+f398fHx+fX6BgIGBgYCCgYGBgYOCgYF/gICCgH1+fX1/fX19fn18fX19fXp7enx2fHp3e3hydnl7dnZ2c3SGhISFhYGEhIWEg4KBg4GBg4GAgYF9f4F+gX19fX9/f3+Afn5+fX19gH+AgYGBf358foB+f3+Bgn+BgYKDh4WBgH9+foB/gIGAgICAgYKBgIB+gIJ/f4GCgoGBg4KDg4WCf319fXx7fHx5ent6fnl7eXh/fnt7e359fX9/gX+AfoGAgICCg4KBgX+AgYF/fX58fX59fX19fXx+fnx9fHl7fHh6fHd6d3N4d3pzdnZzdIaEhIWDgoOEhIOCgYKDgYKCgYCBgXyAf36AfX59fn+AgIB/fn9+fH5/f4GAgYB/fn1/f35+f4GAfYCAgYOEg39/fn1+fn5/gH+AgH+BgoGAf35/gX5/gIKCgIGEgoSEhoSAfn18fHx8enl2eXl6eXZ5dn58e3t7fn17f32Af319f39/f4GCgYGBfn+BgX59fXx9fX19fX19fH6NgXx9eXt7enl8d3h4dHV1eHJ3d3R2hoSEhYODg4OCg4KBgoOCgYOCf4GAf39+f4B+fX18f4CAgH9/gH98gH9/gYCBgIB/fIB/fn5+f399fn6AgYKCfn9+fX5+fn5/f4B/fYCBgH5+fn+Bfn6AgoF/gYOCg4SHhICAfnx9fHx7fHV5eXh4eHl3e3x7ent+hn1+fX96e35+fn1+gYCAgYB9foGAfn19fH19fX19fXx7fYOCfHx6e3t7ent3dnh1cnN2cXd5cniFhYWFg4SEgoKDgoGBgoGAg4GAgH9+fn5+gH59fnx/gICAf4CBf3uAfoCAf4GBgH99gH9+fn9/fX19foCBgoF+f35+fn19fX9+f358foB/fn5+f4J+foCAgX+Bg4KDg4aEgIF+fH18fHt8eHd7eHV5d3d5fHp7e32Sh318fXd6fX5+fX1/fn6Af3x+gH9+fX18fX19fX19e3x6e316enh7fHp6e3h0eHVxcnRweHhxeYSFhYWDhIOCg4OCgYGCgoCBgICAgH1+fn+AfXx+fX+AgYB/f4GAfIB/gH5/gYB/f32Af35/f359fXyAgICAgH5/fn5+fXx+f35/fnx9gH9+fX6Agn9+gIB/foGDgoKDhYWCgn59fXt7fHx5d3t5d3h3d3h7e3p7fIWKfXt6d3p8fX18fH19fX9+fH1+fn19fHx9fn59fXx8e3p6fHt7enl6ent6eHN3dXFxc3B4d3F7hYaFhYOFgoGDg4GBgYGCgIGAgIGAfn9+f399fH59gICCgYB/gYB9foB/fn+Bf4B/f4GAf4B/fX58fX+AgICAf39/fn9+fH5/f39/fX1/f31+foKBgX+AgH9+gYOCgoSDhIKCfn58fHp8e3t4enp3c3Z3eHl7ent5en9+e3t3enx9fHx8fn18fX18fX19fHx9fX19f319fH17eXt8fHx6enp6enp4c3Z1cHByb3d2cnuFh4SFg4SCgYOCgoKBgYKBgoCBgYB/gH9/f319f35/gIGBgX+CgX1+gX5+f4B/gH+AgoCAgH59fnx/f4GAgIB/gH9/gH59fn5/gH9/f3+Af39/gn+Af3+AgH+BgYCAhIGCgoB/f35/fH1+fnp9hH10fH16enp6fHl5enqGhXd5fHx8fHx9e3x8fHx9fX18fH19fX1+fX19fXp5fXx8fXp6enp6enlzdXVvb3Fvd3RzfIWGg4SCg4KBgoGCgoKBgoGCgIGBgICAgICAfn2Af4B/gYKCf4KBf4CBfn+BgH+AgICCf4F/fX1/fn9/goCAgICAgH+AgH5+fX+Af39/gH9/f3+Af4CAgICAf4CAgYGBgYKBgIB/f39+fX9+eoGRi3p8fXx7fXl7enp4eYGBeHl7fHx9fHx7fHx8fH19fXx8fXx+fX5+fn18enx8e3x9e3l6enp5eXN1dW9vcXB3c3R9hYeDg4KDgoCBgIKCgYCBgYGBgoGBgICAgYB+foB/gYCBgoKAgoKAgIJ+gIGBf3+Bf4GAgX98foB/f4CCgICAgIB/f4CAfn99foB+fYCAf39/f4CAgICBgIB/gICBgIGBgoKAgIB/f399fn98gYaIfHx+e3t+eXp7enuNfnd3eXt8e318fHx8e318fXx9fXx9fH5+fn9/fnx6fH17fX17eXp7enl5c3R1bnNxcHhydXqFhoODgoOCgICAgYGBf4KBgoGCgYGBgoCBgX9+f3+BgYKBgoGDg4CBgn+BgYF/gICAgH+Bf31/gX+AgIGAgIB/gH6AgIB/fn1/gH5+f4B/f3+Af3+AgIF/gIGAf4GAgYKCgoCAgICAgH1+gH2Ag4J7fn57fH17enx8e4d5eHh5fHx8fXt8fH19fXx8fX1+fX19fn5/f4B/fXt8fXx8fHt6eXt7eXlzcnVudnJweHF1doWFg4SDgoKAgICCgX+AgoKCgoOBgYOCgIKBgH+AgIKCgoGDgYSEgIGBfoGCgX+AgICAf4J/foCBgIKAgICAgH+Af4CAgH9+fYB/f39/gYCAf4CAf4CBgX+AgICAgYCBgYGCgYCBgICAf3+Afn99fn1+fnt9fH17fHx3eHV4eHl7fHx9fHx8fHx9fn9/f39+fX1+f3+AgYB/fH18fH17ent5enx4enNydW53cXF6cXZ3hYWDhIODgoGBgoOAf4KBhYODhIGBg4GCgoKBgH+AgoOCgIKChYN/gIB+goOAgIGAgIB/gIB/gYGAgoB/gIGAf36AgICAgIB/gICAf4CAgICAgH9/gIGBgICAgICBgYCCgoKCgIKBgYKBgH9/gH+Ah35+fHp9fHt9fnh3dnl5eXx9fXx9e3x8fX1+fn+AgYB+fX6AgICCgYB8fn19fnx3e3p6e3l5c3F1bndwdXpxdnmFhYKDgoODgoOEhICAgoGGg4ODgYKEgISDgoKAf4KChIGBgoKEgn+AgH+Bg4KBgYGBgIB/gYGBgYCDgX6Ag4J/fX+CgYCAgH6BgIF/gICBgYGBgICAgoKBgoGBgIGBgYGCg4KCg4GDg4KBgIGAf4CEfX19fH99en2Aenl2enh5e3t8fX17fH19fX1+f4CBgYCAf4CAgIODgH1/fn5+fXl5e3p6enlzcnVvd3F3eXN3e4WCgoOCg4SCg4SDgICCg4aDg4OCgoSBhIOBgoCAgoGDgYKCgYKBfoGAgIKBgoGBg4GAgICAgIGCgYSAfoGDgX5/gIOCgIF+gIKDgoCBgYGCgoOCgYGDgoKEgYCBg4GBgoSDg4SEg4OEg4OBgoGBgIJ/gH99gHx6fH97e3d8eXl5e3p9fn18fHx8fX5+f4GBgICAgYGBhISAfYB/f39/fnt7e3p7enRweHJ5dHZ4dHd7hIKDgoODhIKEg4OBgoKEhoSCg4OChIGEhICDgIGDgoKCgoKAgoB+gYCAgoGCgYKCgoGAgYGBg4KCg4B+gYOBfn+BhISBg3+CgoGDgoKCgYODg4SBgoSCg4KCgYKCg4GDhIOEhISEhIWDhIKBg4KCg4GBgYCAfnx8gHx8eHx5enl6fH1/fHt8fH19fXx8gICAgICBgYGBgoF+gYCAgIB/e3t7enp6dXB4d3l2dXx1dnyAgIOCg4ODg4SEhICCgoWEhIODgoOEgYSFgoKBgoODgYKCgoCBgH2AgIGBgoOCgoKCgYCBgoKDgoKDgH+Bg4F/gIKEg4OCgYKCgYOCgoODhIODhICChIODg4GBf4GDgoOFgoSEhISEhIOEhIKEg4SEgoGCgYGAe36Bfn15fHp6en18fIF9enx8fX18ent+fn6Af3+BgYCAgICAgYGAgH99fXx8fXx2cnZ4eHZ0fnZ1fYeHg4KEhYODhIWEgIKEhYSEg4KDhISAhIWDgoKCg4OCg4KCgIKAfYCAgYKDgoKCgoSCgYKCg4SCgoGAgIGDgX+Bg4WEg4KDgIKCg4KDg4OEg4SDgIKDgoSDgoJ+g4GChISCg4OEhISEg4SEg4SDhYSDg4OCgoB7gIF/fHx9enp7fX99f398fHp8fn18fX1+fn9/f3+AgICAf35+gIGAgIB+fH19fn9+fXx7eHZ/dnZ/hIeDgoOFg4OEhoSBgoWGhYSEg4OEhIKEhYWCgoODhIKDgoOCgoF+gICCgoOCg4ODhIKBgoKDg4KDgYGBgYOBfoGEhIODgoR/gYSDg4OChIODhIKAg4SDhIODgoKDgoKEg4KDhISEhISEhYSDg4SFhISEg4GCgH2Bgn99fHx7fHyAfX1+gH5+fX9+fHx8fX1+fn9+f4GBgYGAf319foGBgH5+fX19fn19fn5/f4B8fICBgoKDg4aDhIOGhIGCiIeFhIODhISFgoSFhYODhIOEg4OCg4KDgX6BgYODhIKDg4SEg4KDgoSDg4OCgoOCg4F/gYSDg4OCg3+BhYODg4OEg4OEg4CChISFg4KCg4ODgYSDgYODhIOEhISFhISEhYWFhYSDg4N/fYGEf319fHx8fH+Bfn1+f399f317fH19fX19fn5/gIGAgYGAfn18foJ/f35+fn59fX9/f3+AgIB/gISEg4OEhYOEg4V/foKKi4WEhIOCg4WBhoaGg4SEhISEg4ODg4SCf4GBg4OFhIWEhYSDgoSEhIWEg4OChIOFgYGDhIWFhoSCgIOHhIODg4WEhYWEgYSDg4eCg4KDgYKBhIOCg4OFg4OFhYSFhYeHhoeFhISFhIF/gYN/fn58fn19f4GAf358fH5/fnx6fH19fX19fn5+f3+AgYF/fX18gH+Afn5+fn5/f4CBgYGBgoCBhYWEg4WEgoSDhoCChYWLiYSEg4SFhYOHhoaEhISEhYSEhISDhISBgoODg4SEhoSFhIODhISDfIOEe4GEd3mDgX2Efn5ydYOCgXZ+g4WBfYF1gXmDf3+AfoSEgoODgoGDhIODhIWDhIWGhIWGfYR5fH5/hHuFg4CEg4B/fn1+fX2Bg4F9e399foB+fXx8fH19fX18fX1/gH+Bgn99fXx/gYGAgICAf4GBgYKBgoODgoKGhISEhoSBg4SFg4SFhIqIhYWFg4WFhIaGhoOEhIWFhYSFhYSEhYKCg4SFhYWGhIWEg4SFhYJogIVqfHtxcXyBc4ZzdHR9goR1c3GDhnRwdXJzdIN2e311gX+Cg4CCdnmFgIOAhH+FhIKFhYJoenJzc3yAc4GDf4ODfYF9fX59foKDgXx/gX1+gH19fHx8fH18fHx+fX6Af4GBf319fYCBgoGBgYGAgYGBgoGCgoKChIeEhYSFhIGChIaGg4WDhoiGhoWDhoaHh4aHg4WFhoWEgoWGhIWFg4KDhISGhoaEhoSDhIWGfXF7gXB5dn6Df4JueXB1c3x2enmFcoSDcHZ4cXZ0dHVyc3R2aX+AbnJvdHZudWx3bXtzboCIeW19cnN2c3ZtbXhscHlsdX1/fn1+gYCBfYB+fYB/gH99fXx8fH18fX5/fYB/gIB+fH9+gIGCgIGAgICBgICAgoOCg4SFiIaGgIKFg4OEh4aDhYWFhoeHhIOGh4iJhoeEhYaIiIWDhYaFhYSEg4WEgoWGhoWGhYSGhYd2cHR7cHJ1f4eFg211b3ZvfHVyhHl5h3hxdHdud2h3em5wdoJyg35venl5bW9uem9vbXd9eIZwcXpwcnRmgXV+bnt5c295f4B/fX2Bf398f318gH6AgH5+gICBgH5+f39+gX+Af359gH1/gIGAgH5+f4GAf3+Cg4KChIWHh4R+h4SDg4WHhoSGhYWGhoiEhIaHiIiGh4SGhouJhYSGh4eFg4WFhYSChYWFhYaGhYaFhnF1cHJzb3N6eX6EdIh0dX6Idm6CcoSGeW5qcn9xbXN3fH91dHyEfnhxdXdueXV6cXZ4dXp5hHFqb3l4cGt5c3pvend2dnCBgH9+fn9/fnp+fX1/fX9/fn2AgYODgIKDgYGEgoGAgYGAfX9/gX5/fn5/gYB+foGCgICBhIeGg4OGhISFhoeGhYWFhYaGiIWEhoWHhoWGhIaGiYiFhImKiIWEhoaFhYOFhYSFhoaGhoWDeIt5coh6e3BwhYR4hXh5a3N+eXtrcoOHg3p8bXt5eXR9gHZub4CAb3R8dXdxeX19bX51b4OFhnqAcnJ7fHRwb3prc3xud4KAgX5+f319e317fH19f39+fX9/goJ/gYOBgYOBgH+AgIB+f35/fX9+fX+Afnx9gYB+foCDiIWGg4WFhYWGh4WFhYWFh4eIhoSGhYeGhoWEhYWEhYWGiYmHhoSGhYaGhYaGhIaGh4aGhYaHh4eGhoSGhYaHiIeFh4aGg4eGhYWDhIaGhYaEhoSDhISGhISBhIOEhIWEhYSFhIaDhoeFhoSEhYeGhISFhYSFfXeFg4SEg4KBfX9+e3x7fnt8fH1/fn18fn6BgH1/gX9/gYB+fn6Afn5/fn59f319fn98e3x/fnx8f4GJhoWEhoaGhYeGhYWFhYaGh4iGhIaFhoaFhYOEhYaFhIaGhoaFhYaEhYaGhoaFhoaHh4aFh4iIiIiGhIeFhoeIhoWIh4iFh4aGiIWFhoaFhoaFg4KFhYaFhYOEhISEhYSFhYSFhYSGh4aGhYSGh4aEhIWGg4WEgoSDg4WDg4J9gH97e3x9e3x8fX9+fHx+fYB/fX6Afn6Af319fIB9fn5+fn5/fH19fnt8fH98e3t+f4iHhISIhoaGh4aFhYSGhoaGiIeEhYaHhoWEg4OEhoWEh4WFhoWFhoSFhoaHh4WHhomIhoaIh4iJiIWEiIWGh4aHhoiGh4WHh4aHhYWGh4WHhoWCg4WGhoSEg4SEg4SGhIWFhYaGhIaGhYaFhIaGhYSDhYWChYeFg4KChYOEgX6AgHx7fX17fHt9fn18fH59fn58f359fX5+fX18f3x+fnx9gYB8fHx9fHx8fnp7e31+iIeChYiHh4aGhoaEhIaGh4aIhoOEhIaGhIWHg4SFhIWHhIWGhoWGhIaGh4eGhoiHiYiGhoiHiIqIhYeIhYeHhoeGh4aHhYiIh4eFhoaHhYeHhYGEhIWGhYWEhISDhIWFhoaGhYaEh4aGh4WFhoaFhIOEg4KEh4OEgYKEhIOBgICAe3t+fXt8fH19fHx8fX18fXx+fXx9fXx8fH19fH59e3yBf318fXx+fHx8enp8fH2Ih4KGiIeGh4aGhoSFhoWGhoaFg4WEhoWEiImDgYSDhIaEhoaGhoaEh4eIiIeHh4iKiIaHiIeIiYiFiIeFh4aGh4eHhYeGiIiHh4WHh4eFhoeEgoSDhIaFh4WFhIOEhIWGhoaGhoaHhYWHhYaFhoWEgoOCg4OHgYOAgoODgoKCf4B7fH5+fHx8fn18fX18fXt8fHx8fHx9e3t7fXx7fnx7fH99fXx9fX99fHp6e3t8fIiHgoaGhoaHhoaFhIWGhYWFhYSDhYKGhIOIh396eoKFhoSGhoWHhoSHh4mIiIeGiIqHhoeHhoiJh4WIh4aIh4aGh4eFh4aIiIeGhYeGh4aGh4ODhISDhoaHhYWEhISFhoaGhoaFh4eGhoeGhoSGhYODgoKCg4aBg36CgoOAg4N/f3x/fn58fH1/fXx9fXx9ent7ent8fHx7e3t+e3t9e3t7fnx8fHx9fn99e3p8enx9iYeDhoWGhYaGhYWEhYWFhYWEg4GFgYaEgoSEfICGf4KFhYaFhYaFhIeHiIiIhoWIioeFh4aHh4iHhYiFhoeIhoaHh4aHhoiIh4WGh4aHhYWHg4SGhYSGhoeGhYWDhYWGhoaGh4WHhoeGh4eFhIWFg4GCgYCDhYKDfoGBgX+DgX5/fn99f3x8fX99e319fH16ent5e3x9e3t7e358fHx8ent9fHx8fH59gXx7e3t7fHuJh4SGhIaEhoaFhIWGhYSEg4SCgIOBhYOBgn96hIx7gISFh4aGhoWEh4iHhoeFhYeJh4SHhYeGiIaFh4SGh4iGhoiIh4eGh4iGhIaGhoeGhYeDhIWEhoaGh4WFhIOFhYeFh4aHhYaGhoWGhoSDhIWBgIGBgIODg4J9gYGAfoOBfn9/gHx/fH19fn17fn18fXl6enl7fX16ent7fXx9fHx6e318fH18fn6AfHt7fH59fIiHhYaFhoSGhYWFhYWFg4OBg4GAgoGFgoCAf399fHuBhIWGhoSFhIOHh4aGhoWEhomGgoaEhoaGhYWHhoeIiYaFiIeJh4aGh4WEhoWFhoWFh4OEhYSIhoaHhYWEgoaFhoWHhoeEhoaGhYWGg4ODhYB/gYCAg4GDgHyBgH5+goB9gH+BfH98fX59fnt+fXx8eXl6eXp9fXl6ent8e3x7e3p7fX18fXx+fn58e3t9fn18iIaFhoaGhIWFhIWFhIOCgoCCgYCAgIOBfn5+gHl6fYCDhIWHhYSDg4eGg4SFhIKFiIWChIODhYWFhYeHh4iIhYWIh4mHhoWGhYOGhIWHg4SGhISFhIeGhYaFhoSDhoWGhoaGhoSFhoeFhYaCgoOEf36AgICBgIOAe4F/fX6Cfn6AfoB+f319fn1/e399e3p5enp5enx9eXp6e3t6fHt7e3t8fX19fH9+fXx8fX9+fHuIhYWGhoaGhIWEhYOFgoGAgICBgH5/goJ9fX9/e39/goODhYaFhIOChoOBg4SCgIWHhYKDgYGDhISEhoaHh4eFhYiGiYeGhISEgoWDhIaCg4WEhIaEh4aFhYWGg4SFhIWGhYaEg4WFhoOFhYGBg4N/fn+Af3+Ag398gH19f4J9gIF+foF+fX19fX97f3x7enl6enl6enx5enp7e3t9ent7e3x9fn19gH19fHx9gH99fIaDhoaGhoWDhIKFgoWBgYB/f4CAfn+Agnx+f39+gICCgoKDhIOCgYKEgYCDgoGAhIWFgoF/gIKDg4SFhoiGhYSFh4WHhYWCg4KBg4KChYGDhYSFhoSGhoeGhoWChISDhIaFhYOEhIOEg4WEgICCgn99fX9+foCEfnt/fHyAgX2BgH19g3x+fn19fnt+e3t6eXp6eXp6e3l6enp7e3x6e3x8fH5+fX+BfH18fH1/gH6AhoSFhYSHhIODgoaCg4CBgH5+f4B9f3+CfH1/f35+foGBgoODgoGBgoJ/gIGCgICChYSCgH+AgYKBg4WFh4aEhIaGhIWDhYGCgYGCgYKDgYKEhISFhYaHh4aFhIODg4OEhoWEgYOCg4KEg4OAf4CBfn18fn58f4N9fH58fIGAfoJ/fX+CfH9+fXx8fHx7e3p5enp5e3p6enp6enp7fHl7fXx8f39/gYB9fn19fX+AgICGhISFhIWCg4KChIKCgIGAfn1+f35+foB9fYB/fn5+gYGCg4OChIeBgX6AgIF/f4KEg4F/fn+Agn+ChYSGhIODhYWChIGDgIGAgYGBgoGAgYSDg4aFhYeHhYWFhYKCgoOFhIKBgYGCgIWDgX9+gH9+fHx+fXx+g317fnt9gX+Ag359gIF/fn99fHx8fXt7enl6eXl7eXp6eXp6e3t7ent9fHx/f4GCgH6Af4CAf4CBgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZGEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDY5IEBACis1IDMyIDAKKzUgMzIgMAorMzM3IDEgMAorMzIyIDEgMjEzMzMKKzI3OSAxIDQyNjY2CisyODAgMSA2NDAwMAorMjgzIDEgODUzMzMKKzMxNyAxIDEwNjY2NgorMzE4IDEgMTI4MDAwCiszMjEgMSAxNDkzMzMKKzMxMyAxIDE3MDY2NgorMzEyIDEgMTkyMDAwCiszMTcgMSAyMTMzMzMKKzMzMCAxIDIzNDY2NgorMzUwIDEgMjU2MDAwCiszNTUgMSAyNzczMzMKKzMzMyAxIDI5ODY2NgorMzI1IDEgMzIwMDAwCiszNzYgMSAzNDEzMzMKKzMzNSAxIDM2MjY2NgorMzUxIDEgMzg0MDAwCiszNTAgMSA0MDUzMzMKKzMzOSAxIDQyNjY2NgorMzI5IDEgNDQ4MDAwCiszNTAgMSA0NjkzMzMKKzMzMCAxIDQ5MDY2NgorMzU5IDEgNTEyMDAwCiszMTYgMSA1MzMzMzMKKzM0NSAxIDU1NDY2NgorMzU3IDEgNTc2MDAwCiszMjUgMSA1OTczMzMKKzMzNiAxIDYxODY2NgorMzM5IDEgNjQwMDAwCiszMTIgMSA2NjEzMzMKKzM1MCAxIDY4MjY2NgorMzM4IDEgNzA0MDAwCiszNTMgMSA3MjUzMzMKKzM0MCAxIDc0NjY2NgorMzMyIDEgNzY4MDAwCiszNDAgMSA3ODkzMzMKKzMzOSAxIDgxMDY2NgorMzMzIDEgODMyMDAwCiszMzMgMSA4NTMzMzMKKzM0NSAxIDg3NDY2NgorMzQwIDEgODk2MDAwCiszNDMgMSA5MTczMzMKKzMzNSAxIDkzODY2NgorMzM5IDEgOTYwMDAwCiszNDIgMSA5ODEzMzMKKzM0OCAxIDEwMDI2NjYKKzM1MCAxIDEwMjQwMDAKKzM1MSAxIDEwNDUzMzMKKzM0MiAxIDEwNjY2NjYKKzM2NiAxIDEwODgwMDAKKzM0MCAxIDExMDkzMzMKKzM1NCAxIDExMzA2NjYKKzM0MCAxIDExNTIwMDAKKzMzNCAxIDExNzMzMzMKKzMzOCAxIDExOTQ2NjYKKzM0MCAxIDEyMTYwMDAKKzM1MSAxIDEyMzczMzMKKzM0NiAxIDEyNTg2NjYKKzMzMSAxIDEyODAwMDAKKzMyMSAxIDEzMDEzMzMKKzM0MyAxIDEzMjI2NjYKKzM0MiAxIDEzNDQwMDAKKzM0NSAxIDEzNjUzMzMKKzMyNiAxIDEzODY2NjYKKzM0MiAxIDE0MDgwMDAKKzM1NiAxIDE0MjkzMzMKKzM1MSAxIDE0NTA2NjYKKzM0MyAxIDE0NzIwMDAKKzM0NyAxIDE0OTMzMzMKKzM0OSAxIDE1MTQ2NjYKKzM1MCAxIDE1MzYwMDAKKzMzMCAxIDE1NTczMzMKKzM0MSAxIDE1Nzg2NjYKKzM0MCAxIDE2MDAwMDAKKzMzMCAxIDE2MjEzMzMKKzM0MCAxIDE2NDI2NjYKKzMzNSAxIDE2NjQwMDAKKzM0NCAxIDE2ODUzMzMKKzM1OSAxIDE3MDY2NjYKKzMzNyAxIDE3MjgwMDAKKzM0NiAxIDE3NDkzMzMKKzMzMCAxIDE3NzA2NjYKKzM1MSAxIDE3OTIwMDAKKzM1NSAxIDE4MTMzMzMKKzM1MiAxIDE4MzQ2NjYKKzMyNSAxIDE4NTYwMDAKKzM0MiAxIDE4NzczMzMKKzMyNyAxIDE4OTg2NjYKKzM0OSAxIDE5MjAwMDAKKzMyNiAxIDE5NDEzMzMKKzMzNyAxIDE5NjI2NjYKKzM3OCAxIDE5ODQwMDAKKzMyMSAxIDIwMDUzMzMKKzMxOSAxIDIwMjY2NjYKKzM0NiAxIDIwNDgwMDAKKzM1MiAxIDIwNjkzMzMKKzM0OSAxIDIwOTA2NjYKKzMzMSAxIDIxMTIwMDAKKzMzMCAxIDIxMzMzMzMKKzMyOSAxIDIxNTQ2NjYKKzMzMyAxIDIxNzYwMDAKKzM2NyAxIDIxOTczMzMKKzM2MiAxIDIyMTg2NjYKKzMzNyAxIDIyNDAwMDAKKzMzNyAxIDIyNjEzMzMKKzM2MCAxIDIyODI2NjYKKzMzMyAxIDIzMDQwMDAKKzMxNyAxIDIzMjUzMzMKKzM0NCAxIDIzNDY2NjYKKzMzNSAxIDIzNjgwMDAKKzMzNyAxIDIzODkzMzMKKzM0OSAxIDI0MTA2NjYKKzMzNiAxIDI0MzIwMDAKKzM0OCAxIDI0NTMzMzMKKzM0OSAxIDI0NzQ2NjYKKzM0MiAxIDI0OTYwMDAKKzM1OSAxIDI1MTczMzMKKzM0MCAxIDI1Mzg2NjYKKzM0MCAxIDI1NjAwMDAKKzM0OCAxIDI1ODEzMzMKKzMzNCAxIDI2MDI2NjYKKzMyOCAxIDI2MjQwMDAKKzM0MSAxIDI2NDUzMzMKKzMzOSAxIDI2NjY2NjYKKzMzNyAxIDI2ODgwMDAKKzM1MCAxIDI3MDkzMzMKKzMyNiAxIDI3MzA2NjYKKzM2MCAxIDI3NTIwMDAKKzM0NCAxIDI3NzMzMzMKKzM0MCAxIDI3OTQ2NjYKKzM0MyAxIDI4MTYwMDAKKzM2MSAxIDI4MzczMzMKKzMyOSAxIDI4NTg2NjYKKzM0NSAxIDI4ODAwMDAKKzM0NSAxIDI5MDEzMzMKKzMzMCAxIDI5MjI2NjYKKzM0MiAxIDI5NDQwMDAKKzM0NCAxIDI5NjUzMzMKKzMzMCAxIDI5ODY2NjYKKzMyOSAxIDMwMDgwMDAKKzMzNSAxIDMwMjkzMzMKKzM2NiAxIDMwNTA2NjYKKzMyOCAxIDMwNzIwMDAKKzM0OSAxIDMwOTMzMzMKKzMzOSAxIDMxMTQ2NjYKKzM0MCAxIDMxMzYwMDAKKzMzNSAxIDMxNTczMzMKKzMyNyAxIDMxNzg2NjYKKzM0OCAxIDMyMDAwMDAKKzMzOSAxIDMyMjEzMzMKKzMzNCAxIDMyNDI2NjYKKzM1MCAxIDMyNjQwMDAKKzMyNSAxIDMyODUzMzMKKzM2MSAxIDMzMDY2NjYKKzMzOCAxIDMzMjgwMDAKKzM1MCAxIDMzNDkzMzMKKzM1MyAxIDMzNzA2NjYKKzMyNyAxIDMzOTIwMDAKKzM0NiAxIDM0MTMzMzMKKzM0OCAxIDM0MzQ2NjYKKzMzOSAxIDM0NTYwMDAKKzM0MiAxIDM0NzczMzMKKzMzNCAxIDM0OTg2NjYKKzM1MCAxIDM1MjAwMDAKKzM1NCAxIDM1NDEzMzMKKzM2MyAxIDM1NjI2NjYKKzMyMiAxIDM1ODQwMDAKKzMzNyAxIDM2MDUzMzMKKzM1NSAxIDM2MjY2NjYKKzMyOSAxIDM2NDgwMDAKKzMyNCAxIDM2NjkzMzMKKzMzOCAxIDM2OTA2NjYKKzM1NiAxIDM3MTIwMDAKKzMzMCAxIDM3MzMzMzMKKzMyMSAxIDM3NTQ2NjYKKzMzNyAxIDM3NzYwMDAKKzM0NSAxIDM3OTczMzMKKzMzNSAxIDM4MTg2NjYKKzM0OCAxIDM4NDAwMDAKKzM0MiAxIDM4NjEzMzMKKzM0OCAxIDM4ODI2NjYKKzMzNSAxIDM5MDQwMDAKKzM0NCAxIDM5MjUzMzMKKzM1NyAxIDM5NDY2NjYKKzM2OCAxIDM5NjgwMDAKKzMyNCAxIDM5ODkzMzMKKzM0MyAxIDQwMTA2NjYKKzM0MSAxIDQwMzIwMDAKKzMyOSAxIDQwNTMzMzMKKzM1NiAxIDQwNzQ2NjYKKzMxNyAxIDQwOTYwMDAKKzM1MSAxIDQxMTczMzMKKzM0MCAxIDQxMzg2NjYKKzM0MCAxIDQxNjAwMDAKKzMzMiAxIDQxODEzMzMKKzM1NSAxIDQyMDI2NjYKKzM1NyAxIDQyMjQwMDAKKzMyNyAxIDQyNDUzMzMKKzMzOCAxIDQyNjY2NjYKKzMyMyAxIDQyODgwMDAKKzM0NiAxIDQzMDkzMzMKKzM1MiAxIDQzMzA2NjYKKzM0NyAxIDQzNTIwMDAKKzM0MyAxIDQzNzMzMzMKKzMxMSAxIDQzOTQ2NjYKKzMzOCAxIDQ0MTYwMDAKKzM2NSAxIDQ0MzczMzMKKzM0OSAxIDQ0NTg2NjYKKzMyNyAxIDQ0ODAwMDAKKzM1NSAxIDQ1MDEzMzMKKzMxOSAxIDQ1MjI2NjYKKzM0OSAxIDQ1NDQwMDAKKzM1MSAxIDQ1NjUzMzMKKzMzNyAxIDQ1ODY2NjYKKzM0MCAxIDQ2MDgwMDAKKzM0OSAxIDQ2MjkzMzMKKzMxNiAxIDQ2NTA2NjYKKzM0NCAxIDQ2NzIwMDAKKzMzNCAxIDQ2OTMzMzMKKzM0NCAxIDQ3MTQ2NjYKKzM0NyAxIDQ3MzYwMDAKKzM0OCAxIDQ3NTczMzMKKzMzNCAxIDQ3Nzg2NjYKKzMzOCAxIDQ4MDAwMDAKKzMzMSAxIDQ4MjEzMzMKKzM0NCAxIDQ4NDI2NjYKKzM0MiAxIDQ4NjQwMDAKKzMzNiAxIDQ4ODUzMzMKKzMyNiAxIDQ5MDY2NjYKKzM2NCAxIDQ5MjgwMDAKKzM1MCAxIDQ5NDkzMzMKKzM1MCAxIDQ5NzA2NjYKKzM2MyAxIDQ5OTIwMDAKKzM1OCAxIDUwMTMzMzMKKzMwNSAxIDUwMzQ2NjYKKzM0NCAxIDUwNTYwMDAKKzM0NiAxIDUwNzczMzMKKzM0MiAxIDUwOTg2NjYKKzMzMCAxIDUxMjAwMDAKKzMxOCAxIDUxNDEzMzMKKzM2MSAxIDUxNjI2NjYKKzM1NCAxIDUxODQwMDAKKzMxMyAxIDUyMDUzMzMKKzMzMCAxIDUyMjY2NjYKKzM1MCAxIDUyNDgwMDAKKzM0NyAxIDUyNjkzMzMKKzM0NiAxIDUyOTA2NjYKKzM1NyAxIDUzMTIwMDAKKzMyNSAxIDUzMzMzMzMKKzMzNSAxIDUzNTQ2NjYKKzMzMSAxIDUzNzYwMDAKKzM2NiAxIDUzOTczMzMKKzMyOSAxIDU0MTg2NjYKKzM0OSAxIDU0NDAwMDAKKzM3MSAxIDU0NjEzMzMKKzMyNiAxIDU0ODI2NjYKKzMzMyAxIDU1MDQwMDAKKzMxOSAxIDU1MjUzMzMKKzMyNyAxIDU1NDY2NjYKKzM1MyAxIDU1NjgwMDAKKzM1NiAxIDU1ODkzMzMKKzM0OCAxIDU2MTA2NjYKKzMzOCAxIDU2MzIwMDAKKzMzMSAxIDU2NTMzMzMKKzM0MSAxIDU2NzQ2NjYKKzM2MiAxIDU2OTYwMDAKKzMyNiAxIDU3MTczMzMKKzM1OSAxIDU3Mzg2NjYKKzMxNSAxIDU3NjAwMDAKKzM3NiAxIDU3ODEzMzMKKzM0MyAxIDU4MDI2NjYKKzM1NCAxIDU4MjQwMDAKKzM1MyAxIDU4NDUzMzMKKzM0NCAxIDU4NjY2NjYKKzMzNCAxIDU4ODgwMDAKKzM0NSAxIDU5MDkzMzMKKzM1NSAxIDU5MzA2NjYKKzMyMiAxIDU5NTIwMDAKKzMzNCAxIDU5NzMzMzMKKzM1MyAxIDU5OTQ2NjYKKzMzOCAxIDYwMTYwMDAKKzM1MSAxIDYwMzczMzMKKzMzNCAxIDYwNTg2NjYKKzMzOSAxIDYwODAwMDAKKzM0NSAxIDYxMDEzMzMKKzM0NyAxIDYxMjI2NjYKKzM1NSAxIDYxNDQwMDAKKzMxMiAxIDYxNjUzMzMKKzM1MiAxIDYxODY2NjYKKzM1NCAxIDYyMDgwMDAKKzMxOCAxIDYyMjkzMzMKKzM0NCAxIDYyNTA2NjYKKzM2MyAxIDYyNzIwMDAKKzMyMSAxIDYyOTMzMzMKKzMzOSAxIDYzMTQ2NjYKKzM1NiAxIDYzMzYwMDAKKzMzNCAxIDYzNTczMzMKKzM1NCAxIDYzNzg2NjYKKzMyNSAxIDY0MDAwMDAKKzMyMSAxIDY0MjEzMzMKKzM0MSAxIDY0NDI2NjYKKzMzNyAxIDY0NjQwMDAKKzM1MSAxIDY0ODUzMzMKKzM0MyAxIDY1MDY2NjYKKzM0MSAxIDY1MjgwMDAKKzM0NCAxIDY1NDkzMzMKKzM0MSAxIDY1NzA2NjYKKzM2NCAxIDY1OTIwMDAKKzMxOSAxIDY2MTMzMzMKKzM0OCAxIDY2MzQ2NjYKKzMzMiAxIDY2NTYwMDAKKzMzMyAxIDY2NzczMzMKKzM0MyAxIDY2OTg2NjYKKzM0OCAxIDY3MjAwMDAKKzM0NyAxIDY3NDEzMzMKKzM1MCAxIDY3NjI2NjYKKzM0MiAxIDY3ODQwMDAKKzM0MSAxIDY4MDUzMzMKKzMyNiAxIDY4MjY2NjYKKzM1MSAxIDY4NDgwMDAKKzMyOSAxIDY4NjkzMzMKKzMyMyAxIDY4OTA2NjYKKzM1MCAxIDY5MTIwMDAKKzM2MSAxIDY5MzMzMzMKKzMyNiAxIDY5NTQ2NjYKKzM0NSAxIDY5NzYwMDAKKzM0NSAxIDY5OTczMzMKKzMxMSAxIDcwMTg2NjYKKzM0OSAxIDcwNDAwMDAKKzM1OCAxIDcwNjEzMzMKKzM1MiAxIDcwODI2NjYKKzM0NyAxIDcxMDQwMDAKKzM2NCAxIDcxMjUzMzMKKzMyOCAxIDcxNDY2NjYKKzMxOCAxIDcxNjgwMDAKKzM1MSAxIDcxODkzMzMKKzM0MCAxIDcyMTA2NjYKKzM0MSAxIDcyMzIwMDAKKzM1NSAxIDcyNTMzMzMKKzMzNiAxIDcyNzQ2NjYKKzM1MiAxIDcyOTYwMDAKKzM0MSAxIDczMTczMzMKKzMzNCAxIDczMzg2NjYKKzM0OCAxIDczNjAwMDAKKzM0MiAxIDczODEzMzMKKzMzNSAxIDc0MDI2NjYKKzM0MiAxIDc0MjQwMDAKKzM1OSAxIDc0NDUzMzMKKzM0OSAxIDc0NjY2NjYKKzMyOSAxIDc0ODgwMDAKKzM1NiAxIDc1MDkzMzMKKzI5MiAxIDc1MzA2NjYKKzMxNiAxIDc1NTIwMDAKKzMxOCAxIDc1NzMzMzMKKzMyMCAxIDc1OTQ2NjYKKzM0MiAxIDc2MTYwMDAKKzI4NSAxIDc2MzczMzMKKzMyNiAxIDc2NTg2NjYKKzM1MiAxIDc2ODAwMDAKKzM5MiAxIDc3MDEzMzMKKzM2NCAxIDc3MjI2NjYKKzM4NCAxIDc3NDQwMDAKKzMzNCAxIDc3NjUzMzMKKzMxNyAxIDc3ODY2NjYKKzMyNiAxIDc4MDgwMDAKKzM3MyAxIDc4MjkzMzMKKzM1NCAxIDc4NTA2NjYKKzMyOSAxIDc4NzIwMDAKKzM0NyAxIDc4OTMzMzMKKzM1MyAxIDc5MTQ2NjYKKzMzOCAxIDc5MzYwMDAKKzMxNyAxIDc5NTczMzMKKzM1NCAxIDc5Nzg2NjYKKzM0NSAxIDgwMDAwMDAKKzM1MCAxIDgwMjEzMzMKKzM1MSAxIDgwNDI2NjYKKzMzMiAxIDgwNjQwMDAKKzM1OCAxIDgwODUzMzMKKzMxNSAxIDgxMDY2NjYKKzMzNiAxIDgxMjgwMDAKKzM1OCAxIDgxNDkzMzMKKzM0MyAxIDgxNzA2NjYKKzMxOSAxIDgxOTIwMDAKKzM3MCAxIDgyMTMzMzMKKzM0NCAxIDgyMzQ2NjYKKzM2MSAxIDgyNTYwMDAKKzM0MyAxIDgyNzczMzMKKzMzNyAxIDgyOTg2NjYKKzM1NCAxIDgzMjAwMDAKKzMzMiAxIDgzNDEzMzMKKzM0OCAxIDgzNjI2NjYKKzMyOCAxIDgzODQwMDAKKzM0NSAxIDg0MDUzMzMKKzM0MCAxIDg0MjY2NjYKKzM0NiAxIDg0NDgwMDAKKzM0MSAxIDg0NjkzMzMKKzM0NCAxIDg0OTA2NjYKKzM0MiAxIDg1MTIwMDAKKzM0MSAxIDg1MzMzMzMKKzM0NSAxIDg1NTQ2NjYKKzMzNyAxIDg1NzYwMDAKKzMzNSAxIDg1OTczMzMKKzMzNSAxIDg2MTg2NjYKKzM0MCAxIDg2NDAwMDAKKzM0NSAxIDg2NjEzMzMKKzM0MSAxIDg2ODI2NjYKKzM0MiAxIDg3MDQwMDAKKzMzOCAxIDg3MjUzMzMKKzM0MyAxIDg3NDY2NjYKKzMzNiAxIDg3NjgwMDAKKzMzOCAxIDg3ODkzMzMKKzM1MyAxIDg4MTA2NjYKKzMzOSAxIDg4MzIwMDAKKzMyOSAxIDg4NTMzMzMKKzM0OSAxIDg4NzQ2NjYKKzMyMyAxIDg4OTYwMDAKKzM1MSAxIDg5MTczMzMKKzM1OSAxIDg5Mzg2NjYKKzM1NyAxIDg5NjAwMDAKKzM0MSAxIDg5ODEzMzMKKzMzMyAxIDkwMDI2NjYKKzMzNSAxIDkwMjQwMDAKKzMyOCAxIDkwNDUzMzMKKzM0NyAxIDkwNjY2NjYKKzM0MyAxIDkwODgwMDAKKzM2OSAxIDkxMDkzMzMKKzMzMSAxIDkxMzA2NjYKKzM0NCAxIDkxNTIwMDAKKzMzMCAxIDkxNzMzMzMKKzM0NiAxIDkxOTQ2NjYKKzMzNyAxIDkyMTYwMDAKKzM0MSAxIDkyMzczMzMKKzMzOCAxIDkyNTg2NjYKKzMyOSAxIDkyODAwMDAKKzM2MCAxIDkzMDEzMzMKKzMzNiAxIDkzMjI2NjYKKzM0MSAxIDkzNDQwMDAKKzM0MSAxIDkzNjUzMzMKKzM0NSAxIDkzODY2NjYKKzM1MSAxIDk0MDgwMDAKKzM0OSAxIDk0MjkzMzMKKzMzNiAxIDk0NTA2NjYKKzMyNiAxIDk0NzIwMDAKKzM0OSAxIDk0OTMzMzMKKzM0MyAxIDk1MTQ2NjYKKzM1NyAxIDk1MzYwMDAKKzM0MiAxIDk1NTczMzMKKzMyNSAxIDk1Nzg2NjYKKzM0NiAxIDk2MDAwMDAKKzMyNiAxIDk2MjEzMzMKKzQwMiAxIDk2NDI2NjYKKzMzMSAxIDk2NjQwMDAKKzMzOSAxIDk2ODUzMzMKKzM3MSAxIDk3MDY2NjYKKzMxNCAxIDk3MjgwMDAKKzMxMCAxIDk3NDkzMzMKKzM2NCAxIDk3NzA2NjYKKzMzOCAxIDk3OTIwMDAKKzMzOSAxIDk4MTMzMzMKKzMzNyAxIDk4MzQ2NjYKKzM1NSAxIDk4NTYwMDAKKzM1MSAxIDk4NzczMzMKKzMzMiAxIDk4OTg2NjYKKzMxNiAxIDk5MjAwMDAKKzQ3NCAxIDk5NDEzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODI1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE2MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDk0IEBACis0MSAxIDAKKzQxIDEgMjAwMDAKKzQxIDEgNDAwMDAKKzQxIDEgNjAwMDAKKzQxIDEgODAwMDAKKzQxIDEgMTAwMDAwCis0MSAxIDEyMDAwMAorNDEgMSAxNDAwMDAKKzQxIDEgMTYwMDAwCis0MSAxIDE4MDAwMAorNDEgMSAyMDAwMDAKKzQxIDEgMjIwMDAwCis0MSAxIDI0MDAwMAorNDEgMSAyNjAwMDAKKzQxIDEgMjgwMDAwCis0MSAxIDMwMDAwMAorNDEgMSAzMjAwMDAKKzQxIDEgMzQwMDAwCis0MSAxIDM2MDAwMAorNDEgMSAzODAwMDAKKzQxIDEgNDAwMDAwCis0MSAxIDQyMDAwMAorNDEgMSA0NDAwMDAKKzQxIDEgNDYwMDAwCis0MSAxIDQ4MDAwMAorNDEgMSA1MDAwMDAKKzQxIDEgNTIwMDAwCis0MSAxIDU0MDAwMAorNDEgMSA1NjAwMDAKKzQxIDEgNTgwMDAwCis0MSAxIDYwMDAwMAorNDEgMSA2MjAwMDAKKzQxIDEgNjQwMDAwCis0MSAxIDY2MDAwMAorNDEgMSA2ODAwMDAKKzQxIDEgNzAwMDAwCis0MSAxIDcyMDAwMAorNDEgMSA3NDAwMDAKKzQxIDEgNzYwMDAwCis0MSAxIDc4MDAwMAorNDEgMSA4MDAwMDAKKzQxIDEgODIwMDAwCis0MSAxIDg0MDAwMAorNDEgMSA4NjAwMDAKKzQxIDEgODgwMDAwCis0MSAxIDkwMDAwMAorNDEgMSA5MjAwMDAKKzQxIDEgOTQwMDAwCis0MSAxIDk2MDAwMAorNDEgMSA5ODAwMDAKKzQxIDEgMTAwMDAwMAorNDEgMSAxMDIwMDAwCis0MSAxIDEwNDAwMDAKKzQxIDEgMTA2MDAwMAorNDEgMSAxMDgwMDAwCis0MSAxIDExMDAwMDAKKzQxIDEgMTEyMDAwMAorNDEgMSAxMTQwMDAwCis0MSAxIDExNjAwMDAKKzQxIDEgMTE4MDAwMAorNDEgMSAxMjAwMDAwCis0MSAxIDEyMjAwMDAKKzQxIDEgMTI0MDAwMAorNDEgMSAxMjYwMDAwCis0MSAxIDEyODAwMDAKKzQxIDEgMTMwMDAwMAorNDEgMSAxMzIwMDAwCis0MSAxIDEzNDAwMDAKKzQxIDEgMTM2MDAwMAorNDEgMSAxMzgwMDAwCis0MSAxIDE0MDAwMDAKKzQxIDEgMTQyMDAwMAorNDEgMSAxNDQwMDAwCis0MSAxIDE0NjAwMDAKKzQxIDEgMTQ4MDAwMAorNDEgMSAxNTAwMDAwCis0MSAxIDE1MjAwMDAKKzQxIDEgMTU0MDAwMAorNDEgMSAxNTYwMDAwCis0MSAxIDE1ODAwMDAKKzQxIDEgMTYwMDAwMAorNDEgMSAxNjIwMDAwCis0MSAxIDE2NDAwMDAKKzQxIDEgMTY2MDAwMAorNDEgMSAxNjgwMDAwCis0MSAxIDE3MDAwMDAKKzQxIDEgMTcyMDAwMAorNDEgMSAxNzQwMDAwCis0MSAxIDE3NjAwMDAKKzQxIDEgMTc4MDAwMAorNDEgMSAxODAwMDAwCis0MSAxIDE4MjAwMDAKKzQxIDEgMTg0MDAwMAorNDEgMSAxODYwMDAwCis0MSAxIDE4ODAwMDAKKzQxIDEgMTkwMDAwMAorNDEgMSAxOTIwMDAwCis0MSAxIDE5NDAwMDAKKzQxIDEgMTk2MDAwMAorNDEgMSAxOTgwMDAwCis0MSAxIDIwMDAwMDAKKzQxIDEgMjAyMDAwMAorNDEgMSAyMDQwMDAwCis0MSAxIDIwNjAwMDAKKzQxIDEgMjA4MDAwMAorNDEgMSAyMTAwMDAwCis0MSAxIDIxMjAwMDAKKzQxIDEgMjE0MDAwMAorNDEgMSAyMTYwMDAwCis0MSAxIDIxODAwMDAKKzQxIDEgMjIwMDAwMAorNDEgMSAyMjIwMDAwCis0MSAxIDIyNDAwMDAKKzQxIDEgMjI2MDAwMAorNDEgMSAyMjgwMDAwCis0MSAxIDIzMDAwMDAKKzQxIDEgMjMyMDAwMAorNDEgMSAyMzQwMDAwCis0MSAxIDIzNjAwMDAKKzQxIDEgMjM4MDAwMAorNDEgMSAyNDAwMDAwCis0MSAxIDI0MjAwMDAKKzQxIDEgMjQ0MDAwMAorNDEgMSAyNDYwMDAwCis0MSAxIDI0ODAwMDAKKzQxIDEgMjUwMDAwMAorNDEgMSAyNTIwMDAwCis0MSAxIDI1NDAwMDAKKzQxIDEgMjU2MDAwMAorNDEgMSAyNTgwMDAwCis0MSAxIDI2MDAwMDAKKzQxIDEgMjYyMDAwMAorNDEgMSAyNjQwMDAwCis0MSAxIDI2NjAwMDAKKzQxIDEgMjY4MDAwMAorNDEgMSAyNzAwMDAwCis0MSAxIDI3MjAwMDAKKzQxIDEgMjc0MDAwMAorNDEgMSAyNzYwMDAwCis0MSAxIDI3ODAwMDAKKzQxIDEgMjgwMDAwMAorNDEgMSAyODIwMDAwCis0MSAxIDI4NDAwMDAKKzQxIDEgMjg2MDAwMAorNDEgMSAyODgwMDAwCis0MSAxIDI5MDAwMDAKKzQxIDEgMjkyMDAwMAorNDEgMSAyOTQwMDAwCis0MSAxIDI5NjAwMDAKKzQxIDEgMjk4MDAwMAorNDEgMSAzMDAwMDAwCis0MSAxIDMwMjAwMDAKKzQxIDEgMzA0MDAwMAorNDEgMSAzMDYwMDAwCis0MSAxIDMwODAwMDAKKzQxIDEgMzEwMDAwMAorNDEgMSAzMTIwMDAwCis0MSAxIDMxNDAwMDAKKzQxIDEgMzE2MDAwMAorNDEgMSAzMTgwMDAwCis0MSAxIDMyMDAwMDAKKzQxIDEgMzIyMDAwMAorNDEgMSAzMjQwMDAwCis0MSAxIDMyNjAwMDAKKzQxIDEgMzI4MDAwMAorNDEgMSAzMzAwMDAwCis0MSAxIDMzMjAwMDAKKzQxIDEgMzM0MDAwMAorNDEgMSAzMzYwMDAwCis0MSAxIDMzODAwMDAKKzQxIDEgMzQwMDAwMAorNDEgMSAzNDIwMDAwCis0MSAxIDM0NDAwMDAKKzQxIDEgMzQ2MDAwMAorNDEgMSAzNDgwMDAwCis0MSAxIDM1MDAwMDAKKzQxIDEgMzUyMDAwMAorNDEgMSAzNTQwMDAwCis0MSAxIDM1NjAwMDAKKzQxIDEgMzU4MDAwMAorNDEgMSAzNjAwMDAwCis0MSAxIDM2MjAwMDAKKzQxIDEgMzY0MDAwMAorNDEgMSAzNjYwMDAwCis0MSAxIDM2ODAwMDAKKzQxIDEgMzcwMDAwMAorNDEgMSAzNzIwMDAwCis0MSAxIDM3NDAwMDAKKzQxIDEgMzc2MDAwMAorNDEgMSAzNzgwMDAwCis0MSAxIDM4MDAwMDAKKzQxIDEgMzgyMDAwMAorNDEgMSAzODQwMDAwCis0MSAxIDM4NjAwMDAKKzQxIDEgMzg4MDAwMAorNDEgMSAzOTAwMDAwCis0MSAxIDM5MjAwMDAKKzQxIDEgMzk0MDAwMAorNDEgMSAzOTYwMDAwCis0MSAxIDM5ODAwMDAKKzQxIDEgNDAwMDAwMAorNDEgMSA0MDIwMDAwCis0MSAxIDQwNDAwMDAKKzQxIDEgNDA2MDAwMAorNDEgMSA0MDgwMDAwCis0MSAxIDQxMDAwMDAKKzQxIDEgNDEyMDAwMAorNDEgMSA0MTQwMDAwCis0MSAxIDQxNjAwMDAKKzQxIDEgNDE4MDAwMAorNDEgMSA0MjAwMDAwCis0MSAxIDQyMjAwMDAKKzQxIDEgNDI0MDAwMAorNDEgMSA0MjYwMDAwCis0MSAxIDQyODAwMDAKKzQxIDEgNDMwMDAwMAorNDEgMSA0MzIwMDAwCis0MSAxIDQzNDAwMDAKKzQxIDEgNDM2MDAwMAorNDEgMSA0MzgwMDAwCis0MSAxIDQ0MDAwMDAKKzQxIDEgNDQyMDAwMAorNDEgMSA0NDQwMDAwCis0MSAxIDQ0NjAwMDAKKzQxIDEgNDQ4MDAwMAorNDEgMSA0NTAwMDAwCis0MSAxIDQ1MjAwMDAKKzQxIDEgNDU0MDAwMAorNDEgMSA0NTYwMDAwCis0MSAxIDQ1ODAwMDAKKzQxIDEgNDYwMDAwMAorNDEgMSA0NjIwMDAwCis0MSAxIDQ2NDAwMDAKKzQxIDEgNDY2MDAwMAorNDEgMSA0NjgwMDAwCis0MSAxIDQ3MDAwMDAKKzQxIDEgNDcyMDAwMAorNDEgMSA0NzQwMDAwCis0MSAxIDQ3NjAwMDAKKzQxIDEgNDc4MDAwMAorNDEgMSA0ODAwMDAwCis0MSAxIDQ4MjAwMDAKKzQxIDEgNDg0MDAwMAorNDEgMSA0ODYwMDAwCis0MSAxIDQ4ODAwMDAKKzQxIDEgNDkwMDAwMAorNDEgMSA0OTIwMDAwCis0MSAxIDQ5NDAwMDAKKzQxIDEgNDk2MDAwMAorNDEgMSA0OTgwMDAwCis0MSAxIDUwMDAwMDAKKzQxIDEgNTAyMDAwMAorNDEgMSA1MDQwMDAwCis0MSAxIDUwNjAwMDAKKzQxIDEgNTA4MDAwMAorNDEgMSA1MTAwMDAwCis0MSAxIDUxMjAwMDAKKzQxIDEgNTE0MDAwMAorNDEgMSA1MTYwMDAwCis0MSAxIDUxODAwMDAKKzQxIDEgNTIwMDAwMAorNDEgMSA1MjIwMDAwCis0MSAxIDUyNDAwMDAKKzQxIDEgNTI2MDAwMAorNDEgMSA1MjgwMDAwCis0MSAxIDUzMDAwMDAKKzQxIDEgNTMyMDAwMAorNDEgMSA1MzQwMDAwCis0MSAxIDUzNjAwMDAKKzQxIDEgNTM4MDAwMAorNDEgMSA1NDAwMDAwCis0MSAxIDU0MjAwMDAKKzQxIDEgNTQ0MDAwMAorNDEgMSA1NDYwMDAwCis0MSAxIDU0ODAwMDAKKzQxIDEgNTUwMDAwMAorNDEgMSA1NTIwMDAwCis0MSAxIDU1NDAwMDAKKzQxIDEgNTU2MDAwMAorNDEgMSA1NTgwMDAwCis0MSAxIDU2MDAwMDAKKzQxIDEgNTYyMDAwMAorNDEgMSA1NjQwMDAwCis0MSAxIDU2NjAwMDAKKzQxIDEgNTY4MDAwMAorNDEgMSA1NzAwMDAwCis0MSAxIDU3MjAwMDAKKzQxIDEgNTc0MDAwMAorNDEgMSA1NzYwMDAwCis0MSAxIDU3ODAwMDAKKzQxIDEgNTgwMDAwMAorNDEgMSA1ODIwMDAwCis0MSAxIDU4NDAwMDAKKzQxIDEgNTg2MDAwMAorNDEgMSA1ODgwMDAwCis0MSAxIDU5MDAwMDAKKzQxIDEgNTkyMDAwMAorNDEgMSA1OTQwMDAwCis0MSAxIDU5NjAwMDAKKzQxIDEgNTk4MDAwMAorNDEgMSA2MDAwMDAwCis0MSAxIDYwMjAwMDAKKzQxIDEgNjA0MDAwMAorNDEgMSA2MDYwMDAwCis0MSAxIDYwODAwMDAKKzQxIDEgNjEwMDAwMAorNDEgMSA2MTIwMDAwCis0MSAxIDYxNDAwMDAKKzQxIDEgNjE2MDAwMAorNDEgMSA2MTgwMDAwCis0MSAxIDYyMDAwMDAKKzQxIDEgNjIyMDAwMAorNDEgMSA2MjQwMDAwCis0MSAxIDYyNjAwMDAKKzQxIDEgNjI4MDAwMAorNDEgMSA2MzAwMDAwCis0MSAxIDYzMjAwMDAKKzQxIDEgNjM0MDAwMAorNDEgMSA2MzYwMDAwCis0MSAxIDYzODAwMDAKKzQxIDEgNjQwMDAwMAorNDEgMSA2NDIwMDAwCis0MSAxIDY0NDAwMDAKKzQxIDEgNjQ2MDAwMAorNDEgMSA2NDgwMDAwCis0MSAxIDY1MDAwMDAKKzQxIDEgNjUyMDAwMAorNDEgMSA2NTQwMDAwCis0MSAxIDY1NjAwMDAKKzQxIDEgNjU4MDAwMAorNDEgMSA2NjAwMDAwCis0MSAxIDY2MjAwMDAKKzQxIDEgNjY0MDAwMAorNDEgMSA2NjYwMDAwCis0MSAxIDY2ODAwMDAKKzQxIDEgNjcwMDAwMAorNDEgMSA2NzIwMDAwCis0MSAxIDY3NDAwMDAKKzQxIDEgNjc2MDAwMAorNDEgMSA2NzgwMDAwCis0MSAxIDY4MDAwMDAKKzQxIDEgNjgyMDAwMAorNDEgMSA2ODQwMDAwCis0MSAxIDY4NjAwMDAKKzQxIDEgNjg4MDAwMAorNDEgMSA2OTAwMDAwCis0MSAxIDY5MjAwMDAKKzQxIDEgNjk0MDAwMAorNDEgMSA2OTYwMDAwCis0MSAxIDY5ODAwMDAKKzQxIDEgNzAwMDAwMAorNDEgMSA3MDIwMDAwCis0MSAxIDcwNDAwMDAKKzQxIDEgNzA2MDAwMAorNDEgMSA3MDgwMDAwCis0MSAxIDcxMDAwMDAKKzQxIDEgNzEyMDAwMAorNDEgMSA3MTQwMDAwCis0MSAxIDcxNjAwMDAKKzQxIDEgNzE4MDAwMAorNDEgMSA3MjAwMDAwCis0MSAxIDcyMjAwMDAKKzQxIDEgNzI0MDAwMAorNDEgMSA3MjYwMDAwCis0MSAxIDcyODAwMDAKKzQxIDEgNzMwMDAwMAorNDEgMSA3MzIwMDAwCis0MSAxIDczNDAwMDAKKzQxIDEgNzM2MDAwMAorNDEgMSA3MzgwMDAwCis0MSAxIDc0MDAwMDAKKzQxIDEgNzQyMDAwMAorNDEgMSA3NDQwMDAwCis0MSAxIDc0NjAwMDAKKzQxIDEgNzQ4MDAwMAorNDEgMSA3NTAwMDAwCis0MSAxIDc1MjAwMDAKKzQxIDEgNzU0MDAwMAorNDEgMSA3NTYwMDAwCis0MSAxIDc1ODAwMDAKKzQxIDEgNzYwMDAwMAorNDEgMSA3NjIwMDAwCis0MSAxIDc2NDAwMDAKKzQxIDEgNzY2MDAwMAorNDEgMSA3NjgwMDAwCis0MSAxIDc3MDAwMDAKKzQxIDEgNzcyMDAwMAorNDEgMSA3NzQwMDAwCis0MSAxIDc3NjAwMDAKKzQxIDEgNzc4MDAwMAorNDEgMSA3ODAwMDAwCis0MSAxIDc4MjAwMDAKKzQxIDEgNzg0MDAwMAorNDEgMSA3ODYwMDAwCis0MSAxIDc4ODAwMDAKKzQxIDEgNzkwMDAwMAorNDEgMSA3OTIwMDAwCis0MSAxIDc5NDAwMDAKKzQxIDEgNzk2MDAwMAorNDEgMSA3OTgwMDAwCis0MSAxIDgwMDAwMDAKKzQxIDEgODAyMDAwMAorNDEgMSA4MDQwMDAwCis0MSAxIDgwNjAwMDAKKzQxIDEgODA4MDAwMAorNDEgMSA4MTAwMDAwCis0MSAxIDgxMjAwMDAKKzQxIDEgODE0MDAwMAorNDEgMSA4MTYwMDAwCis0MSAxIDgxODAwMDAKKzQxIDEgODIwMDAwMAorNDEgMSA4MjIwMDAwCis0MSAxIDgyNDAwMDAKKzQxIDEgODI2MDAwMAorNDEgMSA4MjgwMDAwCis0MSAxIDgzMDAwMDAKKzQxIDEgODMyMDAwMAorNDEgMSA4MzQwMDAwCis0MSAxIDgzNjAwMDAKKzQxIDEgODM4MDAwMAorNDEgMSA4NDAwMDAwCis0MSAxIDg0MjAwMDAKKzQxIDEgODQ0MDAwMAorNDEgMSA4NDYwMDAwCis0MSAxIDg0ODAwMDAKKzQxIDEgODUwMDAwMAorNDEgMSA4NTIwMDAwCis0MSAxIDg1NDAwMDAKKzQxIDEgODU2MDAwMAorNDEgMSA4NTgwMDAwCis0MSAxIDg2MDAwMDAKKzQxIDEgODYyMDAwMAorNDEgMSA4NjQwMDAwCis0MSAxIDg2NjAwMDAKKzQxIDEgODY4MDAwMAorNDEgMSA4NzAwMDAwCis0MSAxIDg3MjAwMDAKKzQxIDEgODc0MDAwMAorNDEgMSA4NzYwMDAwCis0MSAxIDg3ODAwMDAKKzQxIDEgODgwMDAwMAorNDEgMSA4ODIwMDAwCis0MSAxIDg4NDAwMDAKKzQxIDEgODg2MDAwMAorNDEgMSA4ODgwMDAwCis0MSAxIDg5MDAwMDAKKzQxIDEgODkyMDAwMAorNDEgMSA4OTQwMDAwCis0MSAxIDg5NjAwMDAKKzQxIDEgODk4MDAwMAorNDEgMSA5MDAwMDAwCis0MSAxIDkwMjAwMDAKKzQxIDEgOTA0MDAwMAorNDEgMSA5MDYwMDAwCis0MSAxIDkwODAwMDAKKzQxIDEgOTEwMDAwMAorNDEgMSA5MTIwMDAwCis0MSAxIDkxNDAwMDAKKzQxIDEgOTE2MDAwMAorNDEgMSA5MTgwMDAwCis0MSAxIDkyMDAwMDAKKzQxIDEgOTIyMDAwMAorNDEgMSA5MjQwMDAwCis0MSAxIDkyNjAwMDAKKzQxIDEgOTI4MDAwMAorNDEgMSA5MzAwMDAwCis0MSAxIDkzMjAwMDAKKzQxIDEgOTM0MDAwMAorNDEgMSA5MzYwMDAwCis0MSAxIDkzODAwMDAKKzQxIDEgOTQwMDAwMAorNDEgMSA5NDIwMDAwCis0MSAxIDk0NDAwMDAKKzQxIDEgOTQ2MDAwMAorNDEgMSA5NDgwMDAwCis0MSAxIDk1MDAwMDAKKzQxIDEgOTUyMDAwMAorNDEgMSA5NTQwMDAwCis0MSAxIDk1NjAwMDAKKzQxIDEgOTU4MDAwMAorNDEgMSA5NjAwMDAwCis0MSAxIDk2MjAwMDAKKzQxIDEgOTY0MDAwMAorNDEgMSA5NjYwMDAwCis0MSAxIDk2ODAwMDAKKzQxIDEgOTcwMDAwMAorNDEgMSA5NzIwMDAwCis0MSAxIDk3NDAwMDAKKzQxIDEgOTc2MDAwMAorNDEgMSA5NzgwMDAwCis0MSAxIDk4MDAwMDAKKzQxIDEgOTgyMDAwMAorNDEgMSA5ODQwMDAwCis0MSAxIDk4NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjdhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfMTc2XzE0NC5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MTE2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfMTc2XzE0NC5pbmZvCkBAIC0wLDAgKzEsMzAwIEBACis2MDI3IDEgMAorNjg3OSAwIDMzMDAwCis1IDAgNjYwMDAKKzUzMiAwIDEwMDAwMAorNSAwIDEzMzAwMAorMjQ1OCAwIDE2NjAwMAorNSAwIDIwMDAwMAorNDc1IDAgMjMzMDAwCis1IDAgMjY2MDAwCisxMjYyIDAgMzAwMDAwCis1IDAgMzMzMDAwCis1NTQgMCAzNjYwMDAKKzI3IDAgNDAwMDAwCis2OTcxIDAgNDMzMDAwCis1IDAgNDY2MDAwCis2MDEgMCA1MDAwMDAKKzUgMCA1MzMwMDAKKzMyNzYgMCA1NjYwMDAKKzUgMCA2MDAwMDAKKzY1OCAwIDYzMzAwMAorNSAwIDY2NjAwMAorMTY4MCAwIDcwMDAwMAorNSAwIDczMzAwMAorNjEwIDAgNzY2MDAwCisyNCAwIDgwMDAwMAorNjcyOCAwIDgzMzAwMAorNSAwIDg2NjAwMAorNzY0IDAgOTAwMDAwCis1IDAgOTMzMDAwCisyNjU2IDAgOTY2MDAwCis1IDAgMTAwMDAwMAorNDYyIDAgMTAzMzAwMAorNSAwIDEwNjYwMDAKKzE0NTkgMCAxMTAwMDAwCis1IDAgMTEzMzAwMAorNjA4IDAgMTE2NjAwMAorMjQgMCAxMjAwMDAwCis3MDM4IDAgMTIzMzAwMAorNSAwIDEyNjYwMDAKKzcyMSAwIDEzMDAwMDAKKzUgMCAxMzMzMDAwCiszMTAyIDAgMTM2NjAwMAorNSAwIDE0MDAwMDAKKzc1MiAwIDE0MzMwMDAKKzUgMCAxNDY2MDAwCisxODE1IDAgMTUwMDAwMAorNSAwIDE1MzMwMDAKKzc1NSAwIDE1NjYwMDAKKzI1IDAgMTYwMDAwMAorNzY1NyAwIDE2MzMwMDAKKzUgMCAxNjY2MDAwCis4NTIgMCAxNzAwMDAwCis1IDAgMTczMzAwMAorMzUzNyAwIDE3NjYwMDAKKzUgMCAxODAwMDAwCis2NzMgMCAxODMzMDAwCis1IDAgMTg2NjAwMAorMTc3NCAwIDE5MDAwMDAKKzUgMCAxOTMzMDAwCis1NTQgMCAxOTY2MDAwCisyNCAwIDIwMDAwMDAKKzgwMjggMCAyMDMzMDAwCis1IDAgMjA2NjAwMAorNzE1IDAgMjEwMDAwMAorNSAwIDIxMzMwMDAKKzMzOTUgMCAyMTY2MDAwCis1IDAgMjIwMDAwMAorNzM2IDAgMjIzMzAwMAorNSAwIDIyNjYwMDAKKzE3NTkgMCAyMzAwMDAwCis1IDAgMjMzMzAwMAorNjA1IDAgMjM2NjAwMAorMjMgMCAyNDAwMDAwCis3NjUxIDAgMjQzMzAwMAorNSAwIDI0NjYwMDAKKzYxOSAwIDI1MDAwMDAKKzUgMCAyNTMzMDAwCisyNzg4IDAgMjU2NjAwMAorNSAwIDI2MDAwMDAKKzU1NiAwIDI2MzMwMDAKKzUgMCAyNjY2MDAwCisxMzM1IDAgMjcwMDAwMAorNSAwIDI3MzMwMDAKKzUyMSAwIDI3NjYwMDAKKzI0IDAgMjgwMDAwMAorMjI3NCAwIDI4MzMwMDAKKzY3NiAwIDI4NjYwMDAKKzI1IDAgMjkwMDAwMAorNjIyNCAwIDI5MzMwMDAKKzU3OTggMCAyOTY2MDAwCis1IDAgMzAwMDAwMAorNDQ4IDAgMzAzMzAwMAorNSAwIDMwNjYwMDAKKzE5NTAgMCAzMTAwMDAwCis1IDAgMzEzMzAwMAorMzg2IDAgMzE2NjAwMAorNSAwIDMyMDAwMDAKKzEyMTggMCAzMjMzMDAwCis1IDAgMzI2NjAwMAorMTMxNiAwIDMzMDAwMDAKKzUgMCAzMzMzMDAwCis1ODAgMCAzMzY2MDAwCisyNiAwIDM0MDAwMDAKKzY2NzMgMCAzNDMzMDAwCis1IDAgMzQ2NjAwMAorNDczIDAgMzUwMDAwMAorNSAwIDM1MzMwMDAKKzI0NjcgMCAzNTY2MDAwCis1IDAgMzYwMDAwMAorNDI5IDAgMzYzMzAwMAorNSAwIDM2NjYwMDAKKzE0MjAgMCAzNzAwMDAwCis1IDAgMzczMzAwMAorNTgzIDAgMzc2NjAwMAorMjkgMCAzODAwMDAwCis4NDkyIDAgMzgzMzAwMAorNSAwIDM4NjYwMDAKKzcyMCAwIDM5MDAwMDAKKzUgMCAzOTMzMDAwCiszNjM1IDAgMzk2NjAwMAorNSAwIDQwMDAwMDAKKzYyMSAwIDQwMzMwMDAKKzUgMCA0MDY2MDAwCisxOTY5IDAgNDEwMDAwMAorNSAwIDQxMzMwMDAKKzQ5IDAgNDE2NjAwMAorMjUgMCA0MjAwMDAwCis3NDE2IDAgNDIzMzAwMAorNSAwIDQyNjYwMDAKKzk0NyAwIDQzMDAwMDAKKzUgMCA0MzMzMDAwCiszNzEzIDAgNDM2NjAwMAorNSAwIDQ0MDAwMDAKKzcxNCAwIDQ0MzMwMDAKKzUgMCA0NDY2MDAwCisyMDAzIDAgNDUwMDAwMAorNSAwIDQ1MzMwMDAKKzc1MCAwIDQ1NjYwMDAKKzI1IDAgNDYwMDAwMAorODQ3MCAwIDQ2MzMwMDAKKzUgMCA0NjY2MDAwCis3MzcgMCA0NzAwMDAwCis1IDAgNDczMzAwMAorNDA5NCAwIDQ3NjYwMDAKKzUgMCA0ODAwMDAwCisxMDE5IDAgNDgzMzAwMAorNSAwIDQ4NjYwMDAKKzIxNjAgMCA0OTAwMDAwCis1IDAgNDkzMzAwMAorODI4IDAgNDk2NjAwMAorMjQgMCA1MDAwMDAwCis5MjgyIDAgNTAzMzAwMAorNSAwIDUwNjYwMDAKKzY1NSAwIDUxMDAwMDAKKzUgMCA1MTMzMDAwCiszNDkxIDAgNTE2NjAwMAorNSAwIDUyMDAwMDAKKzY1MSAwIDUyMzMwMDAKKzUgMCA1MjY2MDAwCisxOTA2IDAgNTMwMDAwMAorNSAwIDUzMzMwMDAKKzY2MiAwIDUzNjYwMDAKKzI0IDAgNTQwMDAwMAorOTcyNCAwIDU0MzMwMDAKKzUgMCA1NDY2MDAwCis2MTcgMCA1NTAwMDAwCis1IDAgNTUzMzAwMAorMzE0NSAwIDU1NjYwMDAKKzUgMCA1NjAwMDAwCis1NzggMCA1NjMzMDAwCis1IDAgNTY2NjAwMAorMTU5MiAwIDU3MDAwMDAKKzUgMCA1NzMzMDAwCis1NjkgMCA1NzY2MDAwCisyNSAwIDU4MDAwMDAKKzEwMDE1IDAgNTgzMzAwMAorNSAwIDU4NjYwMDAKKzYwOSAwIDU5MDAwMDAKKzUgMCA1OTMzMDAwCiszNjE4IDAgNTk2NjAwMAorNSAwIDYwMDAwMDAKKzczNCAwIDYwMzMwMDAKKzUgMCA2MDY2MDAwCisxNzQ4IDAgNjEwMDAwMAorNSAwIDYxMzMwMDAKKzU1MCAwIDYxNjYwMDAKKzI0IDAgNjIwMDAwMAorODgwNiAwIDYyMzMwMDAKKzUgMCA2MjY2MDAwCis0OTggMCA2MzAwMDAwCis1IDAgNjMzMzAwMAorMjkxMyAwIDYzNjYwMDAKKzUgMCA2NDAwMDAwCis1OTcgMCA2NDMzMDAwCis1IDAgNjQ2NjAwMAorMTIzNSAwIDY1MDAwMDAKKzUgMCA2NTMzMDAwCiszNjIgMCA2NTY2MDAwCisyNCAwIDY2MDAwMDAKKzY1OTIgMCA2NjMzMDAwCis1IDAgNjY2NjAwMAorNDY4IDAgNjcwMDAwMAorNSAwIDY3MzMwMDAKKzE5MjAgMCA2NzY2MDAwCis1IDAgNjgwMDAwMAorNDE5IDAgNjgzMzAwMAorNSAwIDY4NjYwMDAKKzg0MyAwIDY5MDAwMDAKKzUgMCA2OTMzMDAwCisyMzcgMCA2OTY2MDAwCisyNCAwIDcwMDAwMDAKKzI2ODcgMCA3MDMzMDAwCis1IDAgNzA2NjAwMAorMzk5IDAgNzEwMDAwMAorNSAwIDcxMzMwMDAKKzIwMCAwIDcxNjYwMDAKKzE0MyAwIDcyMDAwMDAKKzI1IDAgNzIzMzAwMAorMTI2MDMgMCA3MjY2MDAwCisxMTM5IDAgNzMwMDAwMAorNSAwIDczMzMwMDAKKzU2IDAgNzM2NjAwMAorNSAwIDc0MDAwMDAKKzI3MyAwIDc0MzMwMDAKKzUgMCA3NDY2MDAwCis0OCAwIDc1MDAwMDAKKzUgMCA3NTMzMDAwCisxMDIgMCA3NTY2MDAwCis1IDAgNzYwMDAwMAorMzkgMCA3NjMzMDAwCisyNCAwIDc2NjYwMDAKKzM2MzUgMCA3NzAwMDAwCis1IDAgNzczMzAwMAorNDYgMCA3NzY2MDAwCis1IDAgNzgwMDAwMAorNjQ3IDAgNzgzMzAwMAorNSAwIDc4NjYwMDAKKzYxIDAgNzkwMDAwMAorNSAwIDc5MzMwMDAKKzgyNCAwIDc5NjYwMDAKKzUgMCA4MDAwMDAwCis2OTEgMCA4MDMzMDAwCisyNyAwIDgwNjYwMDAKKzQ1NzMgMCA4MTAwMDAwCis1IDAgODEzMzAwMAorNDczIDAgODE2NjAwMAorNSAwIDgyMDAwMDAKKzE2MzcgMCA4MjMzMDAwCis1IDAgODI2NjAwMAorNDUxIDAgODMwMDAwMAorNSAwIDgzMzMwMDAKKzk2OSAwIDgzNjYwMDAKKzUgMCA4NDAwMDAwCisyMzQgMCA4NDMzMDAwCisyNCAwIDg0NjYwMDAKKzMzNjEgMCA4NTAwMDAwCis1IDAgODUzMzAwMAorMTY4IDAgODU2NjAwMAorNSAwIDg2MDAwMDAKKzY2MiAwIDg2MzMwMDAKKzUgMCA4NjY2MDAwCisxMjkgMCA4NzAwMDAwCis1IDAgODczMzAwMAorNDQzIDAgODc2NjAwMAorNSAwIDg4MDAwMDAKKzE4MyAwIDg4MzMwMDAKKzIzIDAgODg2NjAwMAorMjc2OSAwIDg5MDAwMDAKKzUgMCA4OTMzMDAwCisxODIgMCA4OTY2MDAwCis1IDAgOTAwMDAwMAorODkwIDAgOTAzMzAwMAorNSAwIDkwNjYwMDAKKzE3MSAwIDkxMDAwMDAKKzUgMCA5MTMzMDAwCis1OTkgMCA5MTY2MDAwCis1IDAgOTIwMDAwMAorMjM2IDAgOTIzMzAwMAorMjMgMCA5MjY2MDAwCisyMzE2IDAgOTMwMDAwMAorNSAwIDkzMzMwMDAKKzMzMyAwIDkzNjYwMDAKKzUgMCA5NDAwMDAwCis3NTkgMCA5NDMzMDAwCis1IDAgOTQ2NjAwMAorMjEwIDAgOTUwMDAwMAorNSAwIDk1MzMwMDAKKzMyNCAwIDk1NjYwMDAKKzUgMCA5NjAwMDAwCis5OCAwIDk2MzMwMDAKKzIzIDAgOTY2NjAwMAorMTEwNyAwIDk3MDAwMDAKKzUgMCA5NzMzMDAwCis0MiAwIDk3NjYwMDAKKzUgMCA5ODAwMDAwCisxNDUgMCA5ODMzMDAwCis1IDAgOTg2NjAwMAorMTA5IDAgOTkwMDAwMAorODkgMCA5OTMzMDAwCisyNCAwIDk5NjYwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjliYWNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzY0MF8zNjAuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTc4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXYxXzY0MF8zNjAuaW5mbwpAQCAtMCwwICsxLDE2NyBAQAorMTI1NzEgMSAwCis5ODgxIDAgMzMwMDAKKzUgMCA2NjAwMAorNTQ0IDAgMTAwMDAwCis1IDAgMTMzMDAwCisyNjQyIDAgMTY2MDAwCis1IDAgMjAwMDAwCis1MzEgMCAyMzMwMDAKKzUgMCAyNjYwMDAKKzEzNTkgMCAzMDAwMDAKKzUgMCAzMzMwMDAKKzU1MSAwIDM2NjAwMAorMjggMCA0MDAwMDAKKzEwNzkxIDAgNDMzMDAwCis1IDAgNDY2MDAwCis2NTUgMCA1MDAwMDAKKzUgMCA1MzMwMDAKKzM3NjkgMCA1NjYwMDAKKzUgMCA2MDAwMDAKKzcxMSAwIDYzMzAwMAorNSAwIDY2NjAwMAorMjAwNCAwIDcwMDAwMAorNSAwIDczMzAwMAorNjU3IDAgNzY2MDAwCisyNiAwIDgwMDAwMAorODk2OSAwIDgzMzAwMAorNSAwIDg2NjAwMAorNjMwIDAgOTAwMDAwCis1IDAgOTMzMDAwCisyNzg3IDAgOTY2MDAwCis1IDAgMTAwMDAwMAorNDA0IDAgMTAzMzAwMAorNSAwIDEwNjYwMDAKKzE1MTggMCAxMTAwMDAwCis1IDAgMTEzMzAwMAorNDkzIDAgMTE2NjAwMAorMjYgMCAxMjAwMDAwCis5OTAwIDAgMTIzMzAwMAorNSAwIDEyNjYwMDAKKzYyMCAwIDEzMDAwMDAKKzUgMCAxMzMzMDAwCiszMDcyIDAgMTM2NjAwMAorNSAwIDE0MDAwMDAKKzY2OCAwIDE0MzMwMDAKKzUgMCAxNDY2MDAwCisxODIxIDAgMTUwMDAwMAorNSAwIDE1MzMwMDAKKzY4MiAwIDE1NjYwMDAKKzI2IDAgMTYwMDAwMAorOTU2MCAwIDE2MzMwMDAKKzUgMCAxNjY2MDAwCis2NjcgMCAxNzAwMDAwCis1IDAgMTczMzAwMAorMzI0OSAwIDE3NjYwMDAKKzUgMCAxODAwMDAwCis1ODkgMCAxODMzMDAwCis1IDAgMTg2NjAwMAorMTgxNiAwIDE5MDAwMDAKKzUgMCAxOTMzMDAwCis1NDggMCAxOTY2MDAwCisyNiAwIDIwMDAwMDAKKzk5MTYgMCAyMDMzMDAwCis1IDAgMjA2NjAwMAorNjI4IDAgMjEwMDAwMAorNSAwIDIxMzMwMDAKKzMwMzQgMCAyMTY2MDAwCis1IDAgMjIwMDAwMAorNTkwIDAgMjIzMzAwMAorNSAwIDIyNjYwMDAKKzE1ODEgMCAyMzAwMDAwCis1IDAgMjMzMzAwMAorNTI0IDAgMjM2NjAwMAorMjYgMCAyNDAwMDAwCis4MTgyIDAgMjQzMzAwMAorNSAwIDI0NjYwMDAKKzU1MiAwIDI1MDAwMDAKKzUgMCAyNTMzMDAwCisyNDEyIDAgMjU2NjAwMAorNSAwIDI2MDAwMDAKKzQ4OSAwIDI2MzMwMDAKKzUgMCAyNjY2MDAwCisxMjI3IDAgMjcwMDAwMAorNSAwIDI3MzMwMDAKKzQzMiAwIDI3NjYwMDAKKzI2IDAgMjgwMDAwMAorMjAxNyAwIDI4MzMwMDAKKzUxNiAwIDI4NjYwMDAKKzI2IDAgMjkwMDAwMAorMTY2MTkgMCAyOTMzMDAwCis2NzEwIDAgMjk2NjAwMAorNSAwIDMwMDAwMDAKKzQyNSAwIDMwMzMwMDAKKzUgMCAzMDY2MDAwCisxOTY0IDAgMzEwMDAwMAorNSAwIDMxMzMwMDAKKzM4NiAwIDMxNjYwMDAKKzUgMCAzMjAwMDAwCisxMTI5IDAgMzIzMzAwMAorNSAwIDMyNjYwMDAKKzExNTYgMCAzMzAwMDAwCis1IDAgMzMzMzAwMAorNDg2IDAgMzM2NjAwMAorMjggMCAzNDAwMDAwCisxMDMwNCAwIDM0MzMwMDAKKzUgMCAzNDY2MDAwCis0MTIgMCAzNTAwMDAwCis1IDAgMzUzMzAwMAorMjYwOCAwIDM1NjYwMDAKKzUgMCAzNjAwMDAwCiszOTcgMCAzNjMzMDAwCis1IDAgMzY2NjAwMAorMTUxNCAwIDM3MDAwMDAKKzUgMCAzNzMzMDAwCis1MzMgMCAzNzY2MDAwCisyNiAwIDM4MDAwMDAKKzExNjk4IDAgMzgzMzAwMAorNSAwIDM4NjYwMDAKKzU0MiAwIDM5MDAwMDAKKzUgMCAzOTMzMDAwCiszMzM0IDAgMzk2NjAwMAorNSAwIDQwMDAwMDAKKzU0NyAwIDQwMzMwMDAKKzUgMCA0MDY2MDAwCisxODA5IDAgNDEwMDAwMAorNSAwIDQxMzMwMDAKKzU1IDAgNDE2NjAwMAorMjYgMCA0MjAwMDAwCis5NDk2IDAgNDIzMzAwMAorNSAwIDQyNjYwMDAKKzY1OCAwIDQzMDAwMDAKKzUgMCA0MzMzMDAwCiszMjMyIDAgNDM2NjAwMAorNSAwIDQ0MDAwMDAKKzYwMCAwIDQ0MzMwMDAKKzUgMCA0NDY2MDAwCisxNzY2IDAgNDUwMDAwMAorNSAwIDQ1MzMwMDAKKzU1MCAwIDQ1NjYwMDAKKzI1IDAgNDYwMDAwMAorOTk1MSAwIDQ2MzMwMDAKKzUgMCA0NjY2MDAwCis2MjQgMCA0NzAwMDAwCis1IDAgNDczMzAwMAorMzYxNyAwIDQ3NjYwMDAKKzUgMCA0ODAwMDAwCis2NDQgMCA0ODMzMDAwCis1IDAgNDg2NjAwMAorMTg0MSAwIDQ5MDAwMDAKKzUgMCA0OTMzMDAwCis2NDkgMCA0OTY2MDAwCisyNSAwIDUwMDAwMDAKKzk5MDEgMCA1MDMzMDAwCis1IDAgNTA2NjAwMAorNTE1IDAgNTEwMDAwMAorNSAwIDUxMzMwMDAKKzI4MTQgMCA1MTY2MDAwCis1IDAgNTIwMDAwMAorNTExIDAgNTIzMzAwMAorNSAwIDUyNjYwMDAKKzE1MjEgMCA1MzAwMDAwCis1IDAgNTMzMzAwMAorNTA5IDAgNTM2NjAwMAorMjYgMCA1NDAwMDAwCisxMDU3OSAwIDU0MzMwMDAKKzUgMCA1NDY2MDAwCis1NzUgMCA1NTAwMDAwCis1IDAgNTUzMzAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWU3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTYzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjIgQEAKKzI4IDMyIDAKKzEwIDMyIDAKKzQ3ODAgMSAzMzMzMworOTYwIDAgMTAwMDAwCis0ODAgMCA2NjY2NgorMjQ2IDAgNTAwMDAKKzI2NCAwIDgzMzMzCisxMTYwIDAgMTY2NjY2Cis0MDQgMCAxMzMzMzMKKzIzNyAwIDExNjY2NgorMTkzIDAgMTUwMDAwCis5MzYgMCAyMzMzMzMKKzM4NCAwIDIwMDAwMAorMTk5IDAgMTgzMzMzCisyNzUgMCAyMTY2NjYKKzEwODYgMCAzMDAwMDAKKzUyMCAwIDI2NjY2NgorMzAxIDAgMjUwMDAwCisyNzAgMCAyODMzMzMKKzEyMzIgMCAzNjY2NjYKKzU1OSAwIDMzMzMzMworMjg3IDAgMzE2NjY2CisyNzQgMCAzNTAwMDAKKzEwODQgMCA0MzMzMzMKKzQ4NSAwIDQwMDAwMAorMzA3IDAgMzgzMzMzCisyODQgMCA0MTY2NjYKKzEwNTIgMCA1MDAwMDAKKzUwNCAwIDQ2NjY2NgorMjk4IDAgNDUwMDAwCiszMjcgMCA0ODMzMzMKKzExODkgMCA1NjY2NjYKKzM1OCAwIDUzMzMzMworMTcyIDAgNTE2NjY2CisxODUgMCA1NTAwMDAKKzExMTUgMCA2MzMzMzMKKzQ2MyAwIDYwMDAwMAorMjE4IDAgNTgzMzMzCisyNTUgMCA2MTY2NjYKKzExNTUgMCA3MDAwMDAKKzYyMiAwIDY2NjY2NgorMzU2IDAgNjUwMDAwCiszNDEgMCA2ODMzMzMKKzEyNDAgMCA3NjY2NjYKKzYxMCAwIDczMzMzMworMzQxIDAgNzE2NjY2CiszODAgMCA3NTAwMDAKKzEzMjYgMCA4MzMzMzMKKzYyMCAwIDgwMDAwMAorMzk2IDAgNzgzMzMzCiszNTMgMCA4MTY2NjYKKzExOTYgMCA5MDAwMDAKKzYyMyAwIDg2NjY2NgorMzc1IDAgODUwMDAwCiszNjIgMCA4ODMzMzMKKzExOTIgMCA5NjY2NjYKKzY1NCAwIDkzMzMzMworMzU5IDAgOTE2NjY2CiszNTIgMCA5NTAwMDAKKzgyOCAwIDEwMTY2NjYKKzQzNiAwIDk4MzMzMworNDAxIDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4YzY4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmM2I5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwyNDIgQEAKKzI5IDMyIDAKKzkgMzIgMAorMzg0NjkgMSA2NjY2NgorMzI3MCAwIDIwMDAwMAorNDQzIDAgMTMzMzMzCisyNDYgMCAxMDAwMDAKKzIxNCAwIDE2NjY2NgorMjI4MCAwIDMwMDAwMAorMzY4IDAgMjMzMzMzCisyMzggMCAyNjY2NjYKKzY4OCAwIDQzMzMzMworMjg3IDAgMzY2NjY2CisyMzQgMCAzMzMzMzMKKzE3MiAwIDQwMDAwMAorMTM2MyAwIDU2NjY2NgorMjczIDAgNTAwMDAwCisxNjYgMCA0NjY2NjYKKzE4MiAwIDUzMzMzMworMzczMSAwIDcwMDAwMAorMzQ5IDAgNjMzMzMzCisyMTYgMCA2MDAwMDAKKzIyOSAwIDY2NjY2NgorNjA2MSAwIDgzMzMzMworNDA4IDAgNzY2NjY2CisyNzEgMCA3MzMzMzMKKzI0MSAwIDgwMDAwMAorNzAwNCAwIDk2NjY2NgorNDQyIDAgOTAwMDAwCisyNjEgMCA4NjY2NjYKKzIyOSAwIDkzMzMzMworNzM1NCAwIDExMDAwMDAKKzQwNCAwIDEwMzMzMzMKKzI2NCAwIDEwMDAwMDAKKzE5OCAwIDEwNjY2NjYKKzQ1NDIgMCAxMjMzMzMzCisyODYgMCAxMTY2NjY2CisyMDUgMCAxMTMzMzMzCisxMzEgMCAxMjAwMDAwCiszMzI5IDAgMTMzMzMzMworMjE2IDAgMTI2NjY2NgorMTM2IDAgMTMwMDAwMAorMjM1MyAwIDEzNjY2NjYKKzk4NiAwIDE0MDAwMDAKKzgwOCAwIDE0MzMzMzMKKzMxOCAwIDE0NjY2NjYKKzYyIDAgMTUwMDAwMAorNTU2NDkgMSAxNTMzMzMzCisxNjA2IDAgMTU2NjY2NgorMjkzNSAwIDE2MDAwMDAKKzM1NjQgMCAxNjMzMzMzCiszMzI0IDAgMTY2NjY2NgorNDU0MyAwIDE3MDAwMDAKKzE3NDAgMCAxNzMzMzMzCisyNzM3IDAgMTc2NjY2NgorMjc2MiAwIDE4MDAwMDAKKzMxODUgMCAxODMzMzMzCiszMjM4IDAgMTg2NjY2NgorMzM5NSAwIDE5MDAwMDAKKzM0MjEgMCAxOTMzMzMzCiszNDgyIDAgMTk2NjY2NgorMzM3MCAwIDIwMDAwMDAKKzM2NTYgMCAyMDMzMzMzCiszNTA5IDAgMjA2NjY2NgorMzY4NCAwIDIxMDAwMDAKKzM3MzIgMCAyMTMzMzMzCiszMzY2IDAgMjE2NjY2NgorMzM3NCAwIDIyMDAwMDAKKzMyMDIgMCAyMjMzMzMzCiszNDQ5IDAgMjI2NjY2NgorMzM2MCAwIDIzMDAwMDAKKzMzNzIgMCAyMzMzMzMzCiszNDYwIDAgMjM2NjY2NgorMzUxMSAwIDI0MDAwMDAKKzM0NzEgMCAyNDMzMzMzCiszMzMwIDAgMjQ2NjY2NgorMzM3NyAwIDI1MDAwMDAKKzM3NDQgMCAyNTMzMzMzCiszNjY3IDAgMjU2NjY2NgorMzg2NyAwIDI2MDAwMDAKKzM3NzYgMCAyNjMzMzMzCiszMzI5IDAgMjY2NjY2NgorMzg3NiAwIDI3MDAwMDAKKzMzODUgMCAyNzMzMzMzCiszNTY2IDAgMjc2NjY2NgorMzMwMSAwIDI4MDAwMDAKKzM1NzAgMCAyODMzMzMzCiszMTMyIDAgMjg2NjY2NgorMzQ4NyAwIDI5MDAwMDAKKzMyNzAgMCAyOTMzMzMzCiszNDcyIDAgMjk2NjY2NgorMzQ4NyAwIDMwMDAwMDAKKzM1MDMgMCAzMDMzMzMzCiszNDQzIDAgMzA2NjY2NgorMzUyOCAwIDMxMDAwMDAKKzMyNTggMCAzMTMzMzMzCiszNzA3IDAgMzE2NjY2NgorMzEyMCAwIDMyMDAwMDAKKzMzNDcgMCAzMjMzMzMzCiszMzcyIDAgMzI2NjY2NgorMzE2MSAwIDMzMDAwMDAKKzMzOTMgMCAzMzMzMzMzCiszMzk5IDAgMzM2NjY2NgorMjkwNSAwIDM0MDAwMDAKKzM1NDMgMCAzNDMzMzMzCiszMTAzIDAgMzQ2NjY2NgorMzA5OSAwIDM1MDAwMDAKKzM0NTcgMCAzNTMzMzMzCiszMTkxIDAgMzU2NjY2NgorMzI5MCAwIDM2MDAwMDAKKzMzMTIgMCAzNjMzMzMzCisyOTU1IDAgMzY2NjY2NgorMzM0MSAwIDM3MDAwMDAKKzMxMDIgMCAzNzMzMzMzCiszMTg2IDAgMzc2NjY2NgorMzE4MCAwIDM4MDAwMDAKKzI4MzkgMCAzODMzMzMzCiszMDg5IDAgMzg2NjY2NgorMzExMCAwIDM5MDAwMDAKKzMxNjUgMCAzOTMzMzMzCisyNjg0IDAgMzk2NjY2NgorMzA4MiAwIDQwMDAwMDAKKzI2OTQgMCA0MDMzMzMzCiszMDUxIDAgNDA2NjY2NgorMzAwMiAwIDQxMDAwMDAKKzI5MjkgMCA0MTMzMzMzCisyNjc2IDAgNDE2NjY2NgorMjQxMSAwIDQyMDAwMDAKKzI4NzQgMCA0MjMzMzMzCisyNTcyIDAgNDI2NjY2NgorMjQyMCAwIDQzMDAwMDAKKzI1MDAgMCA0MzMzMzMzCisyMTM3IDAgNDM2NjY2NgorMjM0NCAwIDQ0MDAwMDAKKzIwMjggMCA0NDMzMzMzCisxNzU0IDAgNDQ2NjY2NgorMTYyNyAwIDQ1MDAwMDAKKzEzNzUgMCA0NTMzMzMzCisxMDY5IDAgNDU2NjY2NgorODAxIDAgNDYwMDAwMAorMjE2ODkgMSA0NjMzMzMzCisyNjEgMCA0NzMzMzMzCis3NiAwIDQ2NjY2NjYKKzQ1IDAgNDcwMDAwMAorMzM0IDAgNDgwMDAwMAorNjEgMCA0NzY2NjY2CisxNTc3IDAgNDkzMzMzMworMjgwIDAgNDg2NjY2NgorNzIgMCA0ODMzMzMzCis0NzkgMCA0OTAwMDAwCisyMTgxIDAgNTA2NjY2NgorOTE5IDAgNTAwMDAwMAorMzQ5IDAgNDk2NjY2NgorNTM0IDAgNTAzMzMzMworNDg2MCAwIDUxNjY2NjYKKzc1OSAwIDUxMDAwMDAKKzY3NyAwIDUxMzMzMzMKKzMxMDEgMCA1MzAwMDAwCis0OTggMCA1MjMzMzMzCiszMjcgMCA1MjAwMDAwCisyMTMgMCA1MjY2NjY2CisxNjQwIDAgNTQzMzMzMworMjU5IDAgNTM2NjY2NgorMTYyIDAgNTMzMzMzMworMTQ4IDAgNTQwMDAwMAorMjEzMCAwIDU1NjY2NjYKKzM5NyAwIDU1MDAwMDAKKzE5MSAwIDU0NjY2NjYKKzE4MCAwIDU1MzMzMzMKKzE3NTcgMCA1NzAwMDAwCiszMzggMCA1NjMzMzMzCisxOTQgMCA1NjAwMDAwCisxNDEgMCA1NjY2NjY2CisxMTAzIDAgNTgzMzMzMworMjg5IDAgNTc2NjY2NgorMTQ5IDAgNTczMzMzMworMTQ4IDAgNTgwMDAwMAorMzkxNCAwIDU5NjY2NjYKKzEwMjUgMCA1OTAwMDAwCis3MTQgMCA1ODY2NjY2Cis0MjggMCA1OTMzMzMzCis0NjA0IDAgNjEwMDAwMAorMTQ1NiAwIDYwMzMzMzMKKzY5OSAwIDYwMDAwMDAKKzg5MiAwIDYwNjY2NjYKKzQ1MzUgMCA2MjMzMzMzCisxMzAxIDAgNjE2NjY2NgorNzA4IDAgNjEzMzMzMworNTkyIDAgNjIwMDAwMAorMjE3NSAwIDYzMzMzMzMKKzYwMyAwIDYyNjY2NjYKKzQxMSAwIDYzMDAwMDAKKzE4MTMgMCA2MzY2NjY2Cis1MDU1IDAgNjQ2NjY2NgorMTUzOCAwIDY0MDAwMDAKKzIyMDEgMCA2NDMzMzMzCis2MjQ5IDAgNjUzMzMzMworMTQyMCAwIDY1MDAwMDAKKzIyNTQgMCA2NTY2NjY2CisyNDQxIDAgNjYzMzMzMworMjkzIDAgNjYwMDAwMAorMjA2MiAwIDY3MDAwMDAKKzIxMyAwIDY2NjY2NjYKKzI0NTUgMCA2ODAwMDAwCiszNDQgMCA2NzMzMzMzCisyMDQgMCA2NzY2NjY2CiszOTIwIDAgNjkzMzMzMworNzUxIDAgNjg2NjY2NgorMzc2IDAgNjgzMzMzMworMzM3IDAgNjkwMDAwMAorMjg4MiAwIDcwNjY2NjYKKzQ1NyAwIDcwMDAwMDAKKzIyMiAwIDY5NjY2NjYKKzE4NCAwIDcwMzMzMzMKKzI3MzQgMCA3MjAwMDAwCis0NzIgMCA3MTMzMzMzCisxODUgMCA3MTAwMDAwCisyNTAgMCA3MTY2NjY2CisyNzM1IDAgNzMzMzMzMworMzAxIDAgNzI2NjY2NgorMzA3IDAgNzIzMzMzMworMTA5IDAgNzMwMDAwMAorMTg1MiAwIDc0NjY2NjYKKzMyMiAwIDc0MDAwMDAKKzE1MyAwIDczNjY2NjYKKzE5NSAwIDc0MzMzMzMKKzE1MDYgMCA3NjAwMDAwCiszNTAgMCA3NTMzMzMzCisxNzAgMCA3NTAwMDAwCisxNDUgMCA3NTY2NjY2CisyMTIzIDAgNzczMzMzMworNDMwIDAgNzY2NjY2NgorMzY0IDAgNzYzMzMzMworMTkwIDAgNzcwMDAwMAorMTI5NiAwIDc4MDAwMDAKKzE5NiAwIDc3NjY2NjYKKzg1OCAwIDc4MzMzMzMKKzM4NjUgMCA3OTMzMzMzCis2OTMgMCA3ODY2NjY2CisxNjA2IDAgNzkwMDAwMAorNDg4NCAwIDc5NjY2NjYKKzI4MjEgMCA4MDMzMzMzCisyMjExIDAgODAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0MTUgQEAKKzQyIDMyIDAKKzEzODYgMSAwCisyNDAxIDEgMjQwMDAKKzIzMjEgMSA0ODAwMAorMjM2NyAxIDcyMDAwCisyMzcwIDEgOTYwMDAKKzIzMzQgMSAxMjAwMDAKKzIzOTYgMSAxNDQwMDAKKzIzNzUgMSAxNjgwMDAKKzI0MzEgMSAxOTIwMDAKKzI0MjggMSAyMTYwMDAKKzIzMzQgMSAyNDAwMDAKKzIyNjEgMSAyNjQwMDAKKzIxMjQgMSAyODgwMDAKKzIxNTIgMSAzMTIwMDAKKzIyOTUgMSAzMzYwMDAKKzIxODMgMSAzNjAwMDAKKzIzOTMgMSAzODQwMDAKKzI0MDAgMSA0MDgwMDAKKzIyNDYgMSA0MzIwMDAKKzIyODkgMSA0NTYwMDAKKzI0MDAgMSA0ODAwMDAKKzIzMzUgMSA1MDQwMDAKKzIyOTQgMSA1MjgwMDAKKzIyNjAgMSA1NTIwMDAKKzIyMDYgMSA1NzYwMDAKKzIxODUgMSA2MDAwMDAKKzIxNTUgMSA2MjQwMDAKKzIxMTggMSA2NDgwMDAKKzIwOTQgMSA2NzIwMDAKKzIwNTAgMSA2OTYwMDAKKzIwNTkgMSA3MjAwMDAKKzIwMzAgMSA3NDQwMDAKKzIwMjIgMSA3NjgwMDAKKzIwNzggMSA3OTIwMDAKKzIwODIgMSA4MTYwMDAKKzIwOTQgMSA4NDAwMDAKKzIxMTEgMSA4NjQwMDAKKzIwNDMgMSA4ODgwMDAKKzIwMjMgMSA5MTIwMDAKKzIwMjQgMSA5MzYwMDAKKzIwNTYgMSA5NjAwMDAKKzIxMDggMSA5ODQwMDAKKzIxMzggMSAxMDA4MDAwCisyMTQwIDEgMTAzMjAwMAorMjExMSAxIDEwNTYwMDAKKzIxMTAgMSAxMDgwMDAwCisyMTM3IDEgMTEwNDAwMAorMjE1NyAxIDExMjgwMDAKKzIxNzQgMSAxMTUyMDAwCisyMjAwIDEgMTE3NjAwMAorMjIwMyAxIDEyMDAwMDAKKzIyMzcgMSAxMjI0MDAwCisyMjYxIDEgMTI0ODAwMAorMjIxNSAxIDEyNzIwMDAKKzIxMzMgMSAxMjk2MDAwCisyMDkxIDEgMTMyMDAwMAorMjA4OCAxIDEzNDQwMDAKKzIxMjIgMSAxMzY4MDAwCisyMTM5IDEgMTM5MjAwMAorMjE0NiAxIDE0MTYwMDAKKzIyMzEgMSAxNDQwMDAwCisyMjgyIDEgMTQ2NDAwMAorMjI3MyAxIDE0ODgwMDAKKzIzMDQgMSAxNTEyMDAwCisyMjkyIDEgMTUzNjAwMAorMjI1NSAxIDE1NjAwMDAKKzIxODEgMSAxNTg0MDAwCisyMDgxIDEgMTYwODAwMAorMjAxMiAxIDE2MzIwMDAKKzIwMTEgMSAxNjU2MDAwCisyMDY2IDEgMTY4MDAwMAorMjA2OSAxIDE3MDQwMDAKKzIxMjAgMSAxNzI4MDAwCisyMTQxIDEgMTc1MjAwMAorMjE0OCAxIDE3NzYwMDAKKzIxODEgMSAxODAwMDAwCisyMTc2IDEgMTgyNDAwMAorMjI0MCAxIDE4NDgwMDAKKzIyOTcgMSAxODcyMDAwCisyMzI1IDEgMTg5NjAwMAorMjMzNiAxIDE5MjAwMDAKKzIzMjkgMSAxOTQ0MDAwCisyMjk5IDEgMTk2ODAwMAorMjMyMiAxIDE5OTIwMDAKKzIzNDcgMSAyMDE2MDAwCisyMjg3IDEgMjA0MDAwMAorMjI4NiAxIDIwNjQwMDAKKzIyNjkgMSAyMDg4MDAwCisyMzIwIDEgMjExMjAwMAorMjMwNSAxIDIxMzYwMDAKKzIzODQgMSAyMTYwMDAwCisyNDI5IDEgMjE4NDAwMAorMjM3MCAxIDIyMDgwMDAKKzIzNjUgMSAyMjMyMDAwCisyMzYxIDEgMjI1NjAwMAorMjM3MCAxIDIyODAwMDAKKzIzOTMgMSAyMzA0MDAwCisyMzQyIDEgMjMyODAwMAorMjMyNSAxIDIzNTIwMDAKKzIzMzQgMSAyMzc2MDAwCisyMzE2IDEgMjQwMDAwMAorMjMxNyAxIDI0MjQwMDAKKzIzMDUgMSAyNDQ4MDAwCisyMzYwIDEgMjQ3MjAwMAorMjMzMSAxIDI0OTYwMDAKKzIzMzIgMSAyNTIwMDAwCisyMzYxIDEgMjU0NDAwMAorMjQxNyAxIDI1NjgwMDAKKzI0MzggMSAyNTkyMDAwCisyNDAzIDEgMjYxNjAwMAorMjM4NiAxIDI2NDAwMDAKKzIzODIgMSAyNjY0MDAwCisyMzUwIDEgMjY4ODAwMAorMjM1NSAxIDI3MTIwMDAKKzIzODMgMSAyNzM2MDAwCisyMzg0IDEgMjc2MDAwMAorMjM4MyAxIDI3ODQwMDAKKzIzNzMgMSAyODA4MDAwCisyMzc0IDEgMjgzMjAwMAorMjM0NyAxIDI4NTYwMDAKKzIzNTMgMSAyODgwMDAwCisyMzgxIDEgMjkwNDAwMAorMjQwMSAxIDI5MjgwMDAKKzI0MDEgMSAyOTUyMDAwCisyMzg1IDEgMjk3NjAwMAorMjM4MiAxIDMwMDAwMDAKKzIzMjggMSAzMDI0MDAwCisyMzAzIDEgMzA0ODAwMAorMjI3MiAxIDMwNzIwMDAKKzIyNzAgMSAzMDk2MDAwCisyMzEyIDEgMzEyMDAwMAorMjI3MyAxIDMxNDQwMDAKKzIzMzAgMSAzMTY4MDAwCisyMzM5IDEgMzE5MjAwMAorMjI5NiAxIDMyMTYwMDAKKzIzMTcgMSAzMjQwMDAwCisyNDQwIDEgMzI2NDAwMAorMjM1MyAxIDMyODgwMDAKKzIzNDYgMSAzMzEyMDAwCisyMzAzIDEgMzMzNjAwMAorMjMwOCAxIDMzNjAwMDAKKzIyODcgMSAzMzg0MDAwCisyMzE2IDEgMzQwODAwMAorMjM2NyAxIDM0MzIwMDAKKzIzMzUgMSAzNDU2MDAwCisyMzUwIDEgMzQ4MDAwMAorMjM5NSAxIDM1MDQwMDAKKzI0MDggMSAzNTI4MDAwCisyNDEzIDEgMzU1MjAwMAorMjQxNSAxIDM1NzYwMDAKKzI0NjggMSAzNjAwMDAwCisyNDM3IDEgMzYyNDAwMAorMjM3MiAxIDM2NDgwMDAKKzIzNzEgMSAzNjcyMDAwCisyMzQxIDEgMzY5NjAwMAorMjMyOCAxIDM3MjAwMDAKKzIyNzMgMSAzNzQ0MDAwCisyMjQ0IDEgMzc2ODAwMAorMjIzMyAxIDM3OTIwMDAKKzIyMjkgMSAzODE2MDAwCisyMjUyIDEgMzg0MDAwMAorMjIzNiAxIDM4NjQwMDAKKzIyMTcgMSAzODg4MDAwCisyMTc5IDEgMzkxMjAwMAorMjI1MSAxIDM5MzYwMDAKKzIxOTIgMSAzOTYwMDAwCisyMTk5IDEgMzk4NDAwMAorMjIxMiAxIDQwMDgwMDAKKzIxOTAgMSA0MDMyMDAwCisyMTAyIDEgNDA1NjAwMAorMjEyMCAxIDQwODAwMDAKKzIxNjcgMSA0MTA0MDAwCisyMDI0IDEgNDEyODAwMAorMjAxMCAxIDQxNTIwMDAKKzIwNjcgMSA0MTc2MDAwCisyMDM1IDEgNDIwMDAwMAorMjA1MSAxIDQyMjQwMDAKKzIwMTIgMSA0MjQ4MDAwCisyMDY2IDEgNDI3MjAwMAorMjAyNSAxIDQyOTYwMDAKKzE5ODcgMSA0MzIwMDAwCisxOTcyIDEgNDM0NDAwMAorMTk2NiAxIDQzNjgwMDAKKzE5OTkgMSA0MzkyMDAwCisxOTg3IDEgNDQxNjAwMAorMTkyMiAxIDQ0NDAwMDAKKzIwMjAgMSA0NDY0MDAwCisyMDcyIDEgNDQ4ODAwMAorMjAyMSAxIDQ1MTIwMDAKKzIwMTcgMSA0NTM2MDAwCisyMDk5IDEgNDU2MDAwMAorMjA2NCAxIDQ1ODQwMDAKKzIxMDkgMSA0NjA4MDAwCisyMDkzIDEgNDYzMjAwMAorMjA5MCAxIDQ2NTYwMDAKKzIxNDggMSA0NjgwMDAwCisyMTg0IDEgNDcwNDAwMAorMjE3OSAxIDQ3MjgwMDAKKzIxNTIgMSA0NzUyMDAwCisyMTQzIDEgNDc3NjAwMAorMjE1OSAxIDQ4MDAwMDAKKzIxMjMgMSA0ODI0MDAwCisyMTI5IDEgNDg0ODAwMAorMjE0NyAxIDQ4NzIwMDAKKzIxOTIgMSA0ODk2MDAwCisyMDUxIDEgNDkyMDAwMAorMjExNiAxIDQ5NDQwMDAKKzIxMjQgMSA0OTY4MDAwCisyMDg4IDEgNDk5MjAwMAorMjA3MyAxIDUwMTYwMDAKKzIxNDYgMSA1MDQwMDAwCisyMTMzIDEgNTA2NDAwMAorMjA3MyAxIDUwODgwMDAKKzIwNTkgMSA1MTEyMDAwCisyMDQ0IDEgNTEzNjAwMAorMjAxMiAxIDUxNjAwMDAKKzIwMzQgMSA1MTg0MDAwCisyMDUzIDEgNTIwODAwMAorMjAxMyAxIDUyMzIwMDAKKzE5ODEgMSA1MjU2MDAwCisyMDk0IDEgNTI4MDAwMAorMjA3NiAxIDUzMDQwMDAKKzE5NjggMSA1MzI4MDAwCisyMDI4IDEgNTM1MjAwMAorMjAzMSAxIDUzNzYwMDAKKzIwMjAgMSA1NDAwMDAwCisyMDE5IDEgNTQyNDAwMAorMjAzMCAxIDU0NDgwMDAKKzIwMTUgMSA1NDcyMDAwCisxOTYyIDEgNTQ5NjAwMAorMjA3MCAxIDU1MjAwMDAKKzIwODcgMSA1NTQ0MDAwCisxOTY0IDEgNTU2ODAwMAorMjA2OSAxIDU1OTIwMDAKKzIwMzQgMSA1NjE2MDAwCisxOTk0IDEgNTY0MDAwMAorMTk4NSAxIDU2NjQwMDAKKzIwMzAgMSA1Njg4MDAwCisyMDY2IDEgNTcxMjAwMAorMTk1NCAxIDU3MzYwMDAKKzE3MzMgMSA1NzYwMDAwCisxNjQ5IDEgNTc4NDAwMAorMTY1MiAxIDU4MDgwMDAKKzE2MzEgMSA1ODMyMDAwCisxNjU2IDEgNTg1NjAwMAorMTY3MiAxIDU4ODAwMDAKKzE2NjcgMSA1OTA0MDAwCisxNjk2IDEgNTkyODAwMAorMTY3MiAxIDU5NTIwMDAKKzE3MDEgMSA1OTc2MDAwCisxNjUxIDEgNjAwMDAwMAorMTY3NCAxIDYwMjQwMDAKKzE2OTUgMSA2MDQ4MDAwCisxNzAyIDEgNjA3MjAwMAorMTcwNyAxIDYwOTYwMDAKKzE2OTQgMSA2MTIwMDAwCisxNzI3IDEgNjE0NDAwMAorMTczMCAxIDYxNjgwMDAKKzE3MDggMSA2MTkyMDAwCisxNzA0IDEgNjIxNjAwMAorMTczNSAxIDYyNDAwMDAKKzE3NTggMSA2MjY0MDAwCisxNzUzIDEgNjI4ODAwMAorMTc0OCAxIDYzMTIwMDAKKzE3NjMgMSA2MzM2MDAwCisxNzM3IDEgNjM2MDAwMAorMTc4MyAxIDYzODQwMDAKKzE4MzkgMSA2NDA4MDAwCisxODYxIDEgNjQzMjAwMAorMTgzMiAxIDY0NTYwMDAKKzE5NDcgMSA2NDgwMDAwCisxOTM5IDEgNjUwNDAwMAorMTkyNiAxIDY1MjgwMDAKKzE4OTYgMSA2NTUyMDAwCisxOTA5IDEgNjU3NjAwMAorMTg2OSAxIDY2MDAwMDAKKzE5MDAgMSA2NjI0MDAwCisxODk2IDEgNjY0ODAwMAorMTg4MyAxIDY2NzIwMDAKKzE5MDMgMSA2Njk2MDAwCisxODk1IDEgNjcyMDAwMAorMTg2NSAxIDY3NDQwMDAKKzE4NzggMSA2NzY4MDAwCisxODgxIDEgNjc5MjAwMAorMTg2MSAxIDY4MTYwMDAKKzE3OTEgMSA2ODQwMDAwCisxNzg3IDEgNjg2NDAwMAorMTc5OCAxIDY4ODgwMDAKKzE4MTEgMSA2OTEyMDAwCisxODI0IDEgNjkzNjAwMAorMTg5NSAxIDY5NjAwMDAKKzIwNzkgMSA2OTg0MDAwCisyMDM0IDEgNzAwODAwMAorMjAzOCAxIDcwMzIwMDAKKzIwMTggMSA3MDU2MDAwCisyMDMwIDEgNzA4MDAwMAorMjA2NyAxIDcxMDQwMDAKKzE5ODIgMSA3MTI4MDAwCisxOTExIDEgNzE1MjAwMAorMTkwNCAxIDcxNzYwMDAKKzE4NzQgMSA3MjAwMDAwCisxODc2IDEgNzIyNDAwMAorMTk0NCAxIDcyNDgwMDAKKzE5NzcgMSA3MjcyMDAwCisxOTc3IDEgNzI5NjAwMAorMTk3OSAxIDczMjAwMDAKKzIwMTIgMSA3MzQ0MDAwCisxOTYxIDEgNzM2ODAwMAorMTc3MyAxIDczOTIwMDAKKzE3ODAgMSA3NDE2MDAwCisxODAxIDEgNzQ0MDAwMAorMTg5MiAxIDc0NjQwMDAKKzE4NjkgMSA3NDg4MDAwCisxOTM2IDEgNzUxMjAwMAorMjE1NCAxIDc1MzYwMDAKKzIyMjYgMSA3NTYwMDAwCisyMTU5IDEgNzU4NDAwMAorMjI1MyAxIDc2MDgwMDAKKzIyODYgMSA3NjMyMDAwCisyMjE0IDEgNzY1NjAwMAorMjExMSAxIDc2ODAwMDAKKzIwMjcgMSA3NzA0MDAwCisxOTk0IDEgNzcyODAwMAorMTg4MiAxIDc3NTIwMDAKKzE4ODcgMSA3Nzc2MDAwCisxOTkzIDEgNzgwMDAwMAorMTk2MiAxIDc4MjQwMDAKKzE5ODIgMSA3ODQ4MDAwCisxOTY2IDEgNzg3MjAwMAorMTk2MiAxIDc4OTYwMDAKKzE5MjggMSA3OTIwMDAwCisxODc4IDEgNzk0NDAwMAorMTg1NyAxIDc5NjgwMDAKKzE4ODUgMSA3OTkyMDAwCisxOTE5IDEgODAxNjAwMAorMTkwNCAxIDgwNDAwMDAKKzE5MDkgMSA4MDY0MDAwCisxOTA5IDEgODA4ODAwMAorMTkzMyAxIDgxMTIwMDAKKzE4MjQgMSA4MTM2MDAwCisxNzU2IDEgODE2MDAwMAorMTczMyAxIDgxODQwMDAKKzE3MDUgMSA4MjA4MDAwCisxNzU1IDEgODIzMjAwMAorMTc1NiAxIDgyNTYwMDAKKzE3MjUgMSA4MjgwMDAwCisxNzYxIDEgODMwNDAwMAorMTczNiAxIDgzMjgwMDAKKzE3MDYgMSA4MzUyMDAwCisxNjYyIDEgODM3NjAwMAorMTYwNCAxIDg0MDAwMDAKKzE2MTMgMSA4NDI0MDAwCisxNjkyIDEgODQ0ODAwMAorMTczNiAxIDg0NzIwMDAKKzE3NzkgMSA4NDk2MDAwCisxNzY4IDEgODUyMDAwMAorMTc1OCAxIDg1NDQwMDAKKzE3MDggMSA4NTY4MDAwCisxNjQyIDEgODU5MjAwMAorMTY0NSAxIDg2MTYwMDAKKzE1ODEgMSA4NjQwMDAwCisxNjUxIDEgODY2NDAwMAorMTczMSAxIDg2ODgwMDAKKzE3NDMgMSA4NzEyMDAwCisxNzE3IDEgODczNjAwMAorMTcxNSAxIDg3NjAwMDAKKzE2NDYgMSA4Nzg0MDAwCisxNTUxIDEgODgwODAwMAorMTU2MyAxIDg4MzIwMDAKKzE2NDkgMSA4ODU2MDAwCisxNzQyIDEgODg4MDAwMAorMTcyNCAxIDg5MDQwMDAKKzE2NzYgMSA4OTI4MDAwCisxNjY0IDEgODk1MjAwMAorMTU4NyAxIDg5NzYwMDAKKzE0OTcgMSA5MDAwMDAwCisxNTAzIDEgOTAyNDAwMAorMTY0NCAxIDkwNDgwMDAKKzE2NTggMSA5MDcyMDAwCisxNjgwIDEgOTA5NjAwMAorMTYxMSAxIDkxMjAwMDAKKzE2OTQgMSA5MTQ0MDAwCisxNjY4IDEgOTE2ODAwMAorMTY3NyAxIDkxOTIwMDAKKzE2MDQgMSA5MjE2MDAwCisxNTY3IDEgOTI0MDAwMAorMTYzOSAxIDkyNjQwMDAKKzE1NTIgMSA5Mjg4MDAwCisxNDg2IDEgOTMxMjAwMAorMTQ5NCAxIDkzMzYwMDAKKzE0ODAgMSA5MzYwMDAwCisxNTA5IDEgOTM4NDAwMAorMTQ1NyAxIDk0MDgwMDAKKzE0MjMgMSA5NDMyMDAwCisxNDU5IDEgOTQ1NjAwMAorMTQ0NCAxIDk0ODAwMDAKKzE0MjQgMSA5NTA0MDAwCisxNDEzIDEgOTUyODAwMAorMTQ5OCAxIDk1NTIwMDAKKzE0NTUgMSA5NTc2MDAwCisxMzkzIDEgOTYwMDAwMAorMTYzOCAxIDk2MjQwMDAKKzE5MTkgMSA5NjQ4MDAwCisxOTc5IDEgOTY3MjAwMAorMTg5NCAxIDk2OTYwMDAKKzIwMDIgMSA5NzIwMDAwCisyMDYyIDEgOTc0NDAwMAorMjA5OCAxIDk3NjgwMDAKKzE5MTkgMSA5NzkyMDAwCisxNzM4IDEgOTgxNjAwMAorMTg5MCAxIDk4NDAwMDAKKzE5NzEgMSA5ODY0MDAwCisyNDI5IDEgOTg4ODAwMAorMTg2MSAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlNTQ4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzgxOTIgMSAwCis4MTkyIDEgMTAyNDAwMAorODE5MiAxIDIwNDgwMDAKKzgxOTIgMSAzMDcyMDAwCis4MTkyIDEgNDA5NjAwMAorODE5MiAxIDUxMjAwMDAKKzgxOTIgMSA2MTQ0MDAwCis4MTkyIDEgNzE2ODAwMAorODE5MiAxIDgxOTIwMDAKKzU0NjIgMSA5MjE2MDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjNGExMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcKQEAgLTAsMCArMSBAQAora29nT8fF2NVKdkN1c1jT1Ul2Sn59S3VZXcHIxPT09MrYSXJ0QlJU8/nH2sbWVMX57Ozj/9VPZWJ92f7t6evhwVtzZ2dE9OXg4ODlxl5MTEt/ZVpRSdn38fNQdnhubXBV5O3k/txgaBcUZnb56O/m58N1Z21/dGV3WFvfX1jYxNTPz9jBWNDWeWV/Z3FS2/jl/+H4VEdlc0Z8T8L1ydBZ31l1wubvlebISmsQEWt3+OuQl+fHd2JpbUz55Obs5NhDenx5YnDD5ePn4ej4W3Z4eEpC9P/1/vRdcWdhdV/d++Dj5cLGVmV8VcFUT3BJcGBkcdD0wffk2ExCRktyZXZ0eXNnZn1zT9RCcVLc3EZx3M1OTk1xd1rC++fl+/TZc2lh2Pvj6Ort/VtlYmbc5OmXlejv+Fl4ZHh8Svfn5OiU6uLYc3hnZmZ5xPzZUExkZntP2sz28dFAcWBvekDO5f/L2l99YmxD8OXn+d1GZmltYmRbzeTlVkZIcnx8ZHZc2MdfRdvWSXBhftD2+uPn8FJ8f2BvcPHtlO349ERkbmtk3eSXlpXr7v3VcHBDRNj28c3JxPbx3VvHw1N/e1LT3MzPVNxTV9RQ1c7JyNV2RkVW9/jNXXFLcmNnVeTt58bUSGBrbmN+d8P7yVNBQ3d4Y2ZkeH57ZmdnfExkZnzT9cXV9vfQTX9nZ2dG5+mXkZGX4UJ9TNztl5Ock5Xt1Hh8dfTl9fH80sXbwPFTdVxxZmd7WMRBc0t3W1dNXlhzdnJhfUXN4Pjx/1NyfWBlck/l6eDn9lx0ahBqZNnh5vrMdmZvamBD0fPwU05zen94Y2dgfdnfwefk58h4enxA/OTl4v/YVXN/SNbk7ujq4ubh+NheUcT298LG8fLz2NDMzs/DRHlnZnNE2fL+5u7nx19a31dNdn1P01hE3MnIV3hia21M3/7lwE5kaRcTFXPW291Ndk5/ZGN6dUdQzv38+fBQdn5lQMzk4eT/+8LV03VQ8PfPxvTg/9BdeWNkcM3t7e/h8FxkYUXK+ub50ERaXlTG4JTq5PVadXJkfFfE+uPrl+D88FB7YWNIzPD5xEtzY2tpFWJ31tJXXtR8bmtqFWthQc3D311TZGxufcX3//rKQXV+cnJY/Of1yMP95/3k5PHXREXH1c/h7eDKRkJESdbWxsLb3d1TVdPdXHVKQlxfXVVeQFDY+PrMy8xEfWdI5e2Vlurv5PH6//Hl5+bk/uHu4PvbfmsVYlrJ+uzu8GcWHRAXa2dzeWRvFBESEW9hcVfU0UZ8YRUXaWVSwPf//PdJZGVwRN3By9d3dEhcxsH35/jwx93bV3Z8ZmVV8uX7++flUUpLU/bglZfvw0BzeXLU5ZSU7OPk5OPm98DV8OTh6JeV7/vC9sDaxMVTWHFSw9zcWnF9e2NibHpOSnN5bxVrYHFfVUF7aWsXFGNIQH1mZF/ayM3UV1FyQdffzcjPXn5OxtHa9vH9/vP3WkPR8Obl9PX5wk52XNdXxfjh4OLlR2ZtYkXl65GQkZX8yMZB0+Tt6OLg7PdQU1PM91FQxM/axcLfZ2hiZXx2RXF4Y25rb218RkZ3ZHx1ZmhkenNwS1BLf0dTQXRhZE3C28TByEZ8dFzy7ZXgzFlWU9/fw8vNwtjL+PvAytJ9bWFI2c7n7O3gzk18cXJKWsTHy+Th5OXk8dL14+/olJfu/V9LX8/32NjC2lPYxVFJRXdlZGR4eH1/YW9jZH5zentKfW4TEmpteFD2/vLcR0pJXsXx5fDS9M1RWkRG1vXl583Q20hkbGl7Xlzb+uXzRHlyYm59W1XA3vTj5uf7V9fHxO2Ul52T6frDyObl5+nk+f3Xwc3U3vPO3Hd6RV5IUk53QX1wQXN4fmxqFWp8QHdcT3p4enRcc2ZlZn5LSPf7w1FBT1jW9vjy9cdbQ3ZnSdn2+fPH0EZ10dZAUtxU11TH9vBQeWd2cU32/f7n4O3h3kBwc05Xy+Xk+v3L8cHM5fzE/vr+ys3WVNfd8/nm+srTWnhlcF7fVdbbWEtSdn9NV1fJ01hHSkF+YGBiYljw5fnG01BlYXZx0f/Jws9xY2ZkZmVlf3NK0lVybGpoZ0394cnV13ZNd2xmUFXA88bawP7v6+P6wNrz+uPj+fjh+uLs5+DjyM3w0Uxdxfjl9PHI/vPR38NO18nY91tmeXJgfnxnZkte2tJOSkhAc3x8f2phd3F0SHza2WRMcWZwWF/+91NxeX56d838/+39UGRoaXNZyeb9xcXKyP7ed3fQVFXw+/PH0UZZSnBD8/P2zEVJXNLz4OXl5uP9y85YdcXMw//w/OPg9195eXXP7ZSU50ZyfGVMUUTP+NvY3n9mZX9LQndzfHVCdEJ9YHJJfFlZQvTWfnNgamVBVNBaQk1G3VZezVh1VkZ3W3N8QE9C1kxy2Mnx+M5AW1LO/v/61kTY1MXj4e+U4PLOXMbn5OP+1kBZ2v/n7OPy89VlYHp6Rdj3+OT3xc7fxlV1cEbZ+uT3QH52cHbX3lb2zFBLZWZwSElyeXZ1THxhbWsTERRqYGV4fX9jbW1jZFP/5+XJSHh5ftfx9czm4Pv+8/3m4O3q7+f55uH68P3l4+jvlZTt4+DJ0sXF8OXk5frAQnJ2cHl4fUlc3sryU2dncnRR3t/2+PfRUHdzX8rCQ3NlZ3p6e3BlZX17ZHplfHNgbGNnbGhhe2FgYmoVbGF+fWdz0v7g5vbaxcfz5OX95+nu4OHh4+jq6urp4+zo7+b5/uXn4eLu4/n/xE19fGVlcnFERH1hYX58f0lE3PX7+s98bGF6fndHV830zdpZfnNMR0NE0VBFRk52fH913s3a2FtzZG9ubWkUaGBhYmkVFhYVaWFnZHBf1VBES03R/eLp7O3qkZaRkJOdnZycn5KQkJbo4Ofn4OPh+8l1Z2dwSd/O3dbUUkZ8Y2BkfnN1T9TD9vbBUH1zV97V3FFFVNPeyt9ATnN/eXlkZGZmYWNiYnpfXERFfGdmYGZ8YGxibm5pFWtubGd8c3BCU8Pc395e0c/w+eTz/eHn+uTk7O7rlpOQl5Tu6OjqlJWWkZeV5NvU2sTD9Mvz8f/53HR9cFzN8/H5/czMVFZNc0lfTHVLfHp6ZGdtaW9sZ2RgbBURERVuY2ZkemZsaRUUaX5MU1ZFWNHd1VhAR1Ty5OX3xsbPxMLy/fDy8/XJ2NHc98v2/Pz8/+bh5fbOyPT85uPj4+nqle/++eHt5uXl+uXg7u/n8/Ln5uTn/fP1z8JVfW1oFRVobW9qFWpoFRAWFWluamoWFhRvfEx2QlNU119ze2R9WdffUlzRVlBZcXBN3Pnn9sf1/Prk4ef4/vvs6OP+xNzRU9DU2PHl5/5XdEdayebg7eb4+vTTR0bb9/Pl4eX/8/z59PHw++zs6OL+8svKwF50emd6eX9wZ2F8e3BzZH5nbGkUFxMdEBdrbW9iYW1tYm9iYXfX3sNBdEVxWt9EXtPG5ef98PTz9vf82VDK/uHi+/Ly8P7m4Of+5Pj75/H0/PH67+zs7uiV7fNEelzD8O3kzsjRV8dU0fzk4+Lj4fXLxVhYcWR8cXBMdWFqFG5ndHJjYG4XFRcXa214eWVhaWxmY2FmaW1+fUZAfX1kZGR7fHJW8+Tg5dtX2M7/5OT+z/Dz9vzZxfP66ZXj//H1y/X3yvDh4uPp+8/++/v99MvJ8crD98/a/eXl5/32+uTt6OPxX1FVW9FTcXFyeXR0fnx3RndhahEXFxZqFxITERRvY2FhZmRiY2ZiccHAyNhR0dFQ1tRMSlHO/Pv3Xk5KcFzFys/N9dlWWUbU/ebs4/z55+fi5vnn5uLt6ejg5ub78czHw/z75vr3wkJa0fT+9f76+eb91ltS2t7RXklnYGJseGdmeX1HdWdhY2BhYWBhZmV5fkh+ZHNKXV5OcGV2SHNxd3B7Z3tJd3N3SVTWTn9kSd/E8/fXW1Le/+f+9PX88sLI9/vi4ebk/P785OiXleHj4Ofk+vL6lZWXlpTo5Obm5+XJ9fTCx3dgYnx/fHRnbRQXFGhha2tjZHFmeHh1RHlkaW5iZHVYxXVzcWF8ZX52X8na3kN+Y2BP1/bdWNR2RXZ7fHBQUcrNQnF9Wl3Hzcvl+eHm5OD64uPj7efm5Ofi6ezg7efg5vjm/fn6+uXAU1/14+/s4f5Vf3l8X0ZBVF9JbhESF2d9Q0JwcHhkYWR+enxwQXRkZ2VTRHVPfHB5eHxGUk3SwfTHTHF51sn0zFpbf2RhZUZLWlzdwVpwetfKyv3Fz1RJVNP6+fD5+OXPw97/4+Pv5+Hh8ffJ5u3j4uDs5PTb9O3rlePk8lfWVt/b1tNS0lh4bWhtYGVhZHV/eGR2QHZ8ZHB0ZG1pYnt1eWd7Y2NmfEVRw9RfWHJ/e17w5flRQXBhZn9V09FEQNZKcnp0zPXz9cLO2drA/+Xm4+fh5OT+9uHj7u7g4eXn5O3u5ub7+PHGXUHz+f/42dZAW1tS98DEx1B3fWRrYXNMw1B1f3t5c93VREdzZ2BgaWdBdE1xYmtraW5yQ0lYdXJzdnh1zvfy9lBISUJ9SEFzXd7c0tVzZXRO9ePm5fLDUNrxx/T98f3/zlDy5uLq4vj65ufi6+Lt7PrxyvbB+OH/5Ml2fn55d8j39P3TR0xwYGF3dt3BQEJ2ZGJ+dHPV0VldXHFkfHp2RHpkZ2FiYmdjeUNLdHB7Y3RS0fdQQXZ4Z2ZCSkxAfX97emN5X8Dg5/338fz97+7t7Pr9zMzU3fnk7eDt6+uV7Ovr4u/j4PvzxVLM9vv+2lpyfWVzU1bE0VRNfmFpekzA8/XGRU19ckFATUJISHFxe35AU9VDTHByZGxjYGBgZHpzcGRlR9HE0UZyYGNieEhwc0RYTEp1dcPk4+nj/8PDVdbw+vn5/cLTQnlAyfT67Ovt7eHn7eHn4+ju4+Ly9Pr+/NpNYWZ7ZELTUETcy9rESHbb0tLV2kJ8Sn9BVNTZwPdNcX5gfXNHVNZCYWRvb2BhZWVGQ3V9YmVL1cHCxHRNdnRacHhkcUl4ZWJ7dULbwf3EwPfJ+/v45OXn8cBcR9/a+Pjn5Prn++Pv7+Lv6+nm8sfKw/HOX3FsZ2d/dF7d2vf999Re0/3n5PH53Ud4eHRHXXVRWnlsbmljcltDUHZ6ZGR7fltxR9DXdHlnZULWS0Bac3d0XUtTdUPcUnZlfXFe8PXExEdMTd3T5ez65cnUTE9QwuPs5Of1U0bJ//vt5O/v5MvB8f3i6eX9V3Jlf0hxzcj1zlZLcNXe9uP79tl8YGBJXcP0ycxccmR1T17G2tVPZ2NhcXVB0tFUcGMVamllVtBedmZtYErSwMnN30pma2ZK0fzz89l9bG9wxvrv7Oz800JT0sTg6+rg8ddaxfzglZWWlu782s315+Dk9ltlYmZ2RcP1zsZKfn5M1/Tg4PNWfWRnd9n39E14Ym9pb3tG8Pvbd2BrFG5zWtvX0V54YhVgd9v4yFxxfHN82f7t4v702thHXMX0+/dfcHtkYE318/DJzd7T0drx++Pi8Fh2QEBf9v7m5fP8/PfeyeHg599yeXt/cMvm5/Laxt1U3MT+/fjzQXJ4cUvZ8MveSk5NdUt3xfHJ3HtmbWxiZUNHQkt0fGZhe0tMcEB9Z2NkS1bYx9pSQkNc1tPF2NPcT39leUve+PzDUVlQXVP34Ozi4+XDRk3H8uHm4eby9ffz+OHt4P7I10x7fXHb/cnD3sj0yfb45PDFzcRDenF0RVlleHt5f35DRtHBXUJzZWJ6f3LdRnJlZ39kcUTY8UR0QXZnZE1T9vTX1kNf3Pnm/Ofw2Fp5Z2d3d1fDQXZ8T1zV9/Lt5sPdX0BC0s7w5fLM1tbE8uT75OfwzNPSVNvP8+Hlw0BcwPD++uPj/NlZXnVD3Mv9wFt4YWR33vDn5/FFY2lpYnJxQUl7bhRseELQ09JEeWd6dH1MUtPSTnhjZVrd8ffDy8VbdUFC0dtdUUxwZ3jXyubt7eP83tb18v7i7e/mz1hO3PTh7uDn/sNeQkdG28LC2UB+ZnDR/uHl+PVVTE7U1M3J09dzZmBlRNr/88jWTnd8dUZZUHRwem1pb3tHwVVHR0JZX9vC2sbc20V5enla3/zk5P7D1URGX9HGVkdyYGxvetX75uXz30V1SNHN9c/xwHV7eEbT8+fn5/zx5fnl5uDm+/LPxtrA8uf6x1XVR0XRyeX69NzRdGRlf1nM8ff32ndxTHNIQUN9ZWwWF2pvctVAd0hyeHB9Xc7eVFZYeWV3TdDxzNHSdXhf3ML85PLRW3h+d3DX//7PwsjK5eTk7ezl9ffXSFJR0v359ffywPT5/OXk/s3QRXFASHfc9tdKdHJ0Vdvy4eXcUUB6YGdz0vbGy/bbXdDRXNfUdH1gamppbm9wSnx3SV7G9Pzn5/HKzsDG0NXXwthBR0J0WsfD3t5fS35lZXh4ZU7RVkVGXMfa3Mv6+M3VUk1wfHBU8PHK+eT65eft7eb58PL5/ffNwvfNXE1YV9/F9fXI3EHXwtlSXNLSUEZYx9/SwffPUU55ZGFtbW9sb3pxZ3pzSlbb3N7BUnVGRkh4f0lEX3RPUkdb3dpX0lBzS1BU29rb9/32yf7l5uHh7eLn98T20XZ3SFLZXUTEwsH++vr5yfX08c/e311OcHNyd0NIV9jdzvTdWN3WWFNQ0N9XwMTUXdbOwdJASnF5ZGNkf2VwTEdDdUzc00Fc09/bw87C1VhJcXBzRNfSxsXdVNdLcEBBSHRIT3dA38bNx/T9/uf68NPYwE92cV3e3tDVzMrw///6/P32/+fw9fD9xF5fUNbQRVVX19JAQHRUxNfY3tpV2MJXz9jYxd3fTXF4fnhiYWR6e3p+ZHtycEdFXdbc3F3F211TT3F4f35wU1vX0s/KV1pCV83OyPfz/fP2wfDl+Ofk+fHLwNTWVNba28zV1VVeUV5BW9zCxtrQw8pSR053TUhPd3J1QEZSxNzMzcH++vL2ysPb0VLY8PLA3VVIemFnend1dEJNdndPSEtfUtLSV9FTVN7Nw9ZSWV1ad31/RUJMR0hATEJFX1JbUEdBXFDSwvP28/LOwtxT1cPw98NUVMPOxMz8+uTh+PD88Pzk+vXb3VNOdnFDU1tZ0FBd09DT3snOzdpbTlPW0NhXWFdYd3B5ZHhwfX59fHh8fHpkenNaQHdKVdzSysrM2V1CQ0FGX1BTRU1MXNnZ0sDz8PTKxvf74ePn+vv+wldbRF/X31NOd0BQVd/FyfHz8cze2N3T3cf1ycVWQXN2SXB0S1pGQ1Hc2MT0/vzL3drL/fLM21VTdHFyfXRDWk12fX98c0tHRlXc0FJ3dlnWxNvO8N9OdExATUFfU3dxcH15ZHp3UlbYzc3K9/DMxczDw8TXVNvD28TE2ddTW8TF0M/8+fP4+/745+Dm5v3GV3F0TUdA0dNR0V5YXFbc2vbwwt/cxMvBXtvPW3VDcWdhY2dkZ3h5c3Z0dXR1TnB8S3d8QtPa9fL11EJ1QF9fVsbBxNFedXNxQlHay/Xz/PH9/PL65fzy/c3ZVVRVWEFOdnRf0tjd391SRFPd3sbx/fPyyNhUW1lbUFTS09vQQ3V3T9fN/+Hn+fzy9src2MPD2FNIf2dgZ2V4fHNwQ0p2QUpKQ1tfV93J88veXUB0fnxMU1PUX0BZcXJwfnt00c73wcHDxMTNwMnw8v3dT0dLWNzayfDzycDc11tcVMfMyf38+PPx+PL0wNZRVdjf2N1V1FFBQF9Qxsn1xNDSV8T1zdPbz8xecX9lYGxgZGV7c3dycn98Q0ZQVdnLwFfV0lfF0lJHTFHRV1rX3l1FdEZf0vP+//zJ3fXH0cPI8/j9zcdRWF9AX1DQ3V9DWEN3REBdwtvGz8ZeX1DRyNBU1sHF19zc1tHH1l7UVNn08fDwwcr+8v3x8PDKxEJkZHx5fExeXU9zeXB9dkFBWF7XVUBMd3Rc0VFaTnVHQUxARFlX01NNQlFSQdLaV9HC8fLLwvfNx9re09jf0MbD9sBB111R3dLH2NjUwNZT1lHB9vL2zdTRxFTD31TE2NzQ1V7ZxMn0w87Nz9rcUdXcSEJ3c3J7ZWV9ZX1lY2BgeXdJR9fR3snYy8PY8f/M1EV1U1pbUVBfXVxJSnFKXdbOzPb55f/4+/Ty8MLcVltQXUhQ2d3VQ3RwdFDYVd3dUcfG0tbU1szNWU53dVHf0tr25eXI2tBd09nC9vDx/vDNy83ZxNJATk52cHl+d3R0dH1+fHRHdXx2TEJbRkZT2MH3w0F0f31KTUdXxMHRXkNCRNDZ0NjNxdLQ3cnI2vD48/b0wdBQXdr3ycZSVsvE2dJFWdbX29zW9//Cx9RNQVlV2d/B8Mzc30hyQ3Va2Mv4/tnex9nIy9rG0FJVcWV/Z2d9Z2FkZ39Kc3Z8ZUPQ3MDN9uXyy/PTR19LQNPRxstTQkx0QFJU2MDK88XZ98r95PHD8/Dx9Fp2SHVa09FcWFbVX0dYdUBYd0nYy/L531NedndGXNf18/XF2sDGysfdxf36+fJWX1BQ2MjJ0sLRSktKdnVYTHd5c09Id31+eX19dUNBUVBaUFRF0d1AQFnA//bQQXF5d3Vex8X2/NpQ1933//77+Ofh5c/E1VLQ0MLCUF5Wd3FRV1XWW0lEwfLwxMXaVEdAVNjayvzdVN9ZVtdZTdr09PfeVVxaWdLLydNfRnhkc310SnJwSnx7f3llf3ZzS0xfXd/D09vP9c/fXV3Awsn33UBDS3NAV9rOy/Xb3NvDzvDy++Pm+OX21dNQR1tYX1FGfXN0Q1lbQUlOVtvQz8vWx9JSR09ewM7TyvTH29vDyfPn5vPwzltATEdZU9TXTXtycn53WVZZ1cTfd3F0ent/cn58cU9IdkFESEBWVlLSyv319srZVVlETl9QwcdV0NnVX9738/vh5/z0xt7Hzsv09Mj130ZIWEFLV1RBTVPS0N3d2tVfUVFDTVTcVlXH2d7Nysn09NjQU3RKdUXUxcTK8sBcdEh1dkdXUVNfTEt6bWFkZX93d0p0Q19fVd/Ex8nDzMrEz9BeWU12StHfwM3LwVNW2MDY8uX6/Mr/y9TQw8Da9srJ0NFfT1pc1dTMwNRYRlxLdklaQ0HSwdldVdZTV8T0zsz95PL09NtfSEVSVMbyy9HVTXJ8TUVD1cTRdHdPfmFhcn14SFVZc3JydnRJT0hd0dHUV1daTEfVUETb88jFwcbb3MHOz/Xl4eX//P7JxPbx9vrl9vfe1NVW0NVV1sHRRHV5eGV8WkdfzvL0xFfSx9XTxMHC9vbwx0NMd3BKd03S2tVSWdXVWFNfTFfH3dxfdnJlY2V6cUVER09xcnRaXU5By/fL9NhSVUNBVVpW2djf1tzCzPXL2MDx8uT69Mz1xM3Kw/D48MTf29RbUFhwdFfExlBMd3lmfXd10vf3wdLR1NnI21fD+uT98PHGXUTXXkTV38dVUsfF0VJ3fXNFV1BaQHR9ZWFjZnx3SXJ8Q3V2S3ZzTs329djfWXRzdEhK1/f20dn/8fTHxdLZ98H28PPy/fPI2N/44fry8Obl/8NQRUHF0tVZdXZ7bWJhZUXD9/T08/XC3dRXw/jzz871311zfXx+XFVERtXKwt5TQXB3WkdaQndJQ3ltbmJ/cH1OUFdbWEdDQdL38/79zN1dd35yWsn0z8718PTOUEdW3vH18fv6+v3PV1tawvH0/fDl5f7DUV5F1FtZ1151c2RjZ3hd19ny9vfZ011bWNr59Pb98vfaX3dPdkfXUt/dzM3eWUh2cEZIQ1lxcHN7Z2Rkd0Z3QkdKfH95cXRaycPz+MZFdnJ7e3nR98f18f3xyt5QUFX19vjg5+fl8d7WVMr45eDm+/n599VQ38rF2NJBcXphYGRkSVZXxNvBz8jIx8HJ/v/2x1TfR3JkYGZwTUTS38vIxtRJQUZU0dLVQkl7Z21pYXRNRl91SndKdHXdyvj98vHP31JJfn98WlDbwNDI8/RWWtXdyvbk4OHg5/RcTU1Vwfb5/f38ytpU0vf9zdjFRE52ZWZkfEJWXVFFXdvY0t30/vDCwc7fyMtRTXVLQVNVwsr099tSdEldXVdRUURJZW5ubWd3Xl9QQXZwfXt9X8TB2t/Z0FFHSE5OX9fUUlfVUlbQW0xFWVHY8Obt7+/h8MLJzvb74eDh5P/E1cbG2tlRUkR0c3l6fXVKRVlMQ19R2NnC/vvwyNnQVVleV051dnNGRFbEzcTJ1ElETnFOSltdSXJlYGd6eURUUdJXWFJ2d9fQVdrQXV9BWFtKW1VZ1t7U3tHTz9dHUVhewc3y4+3s4/jww9DN8fPl5P72V1LYU1HTXFtQRUBIdkNETkFEdXRCVMz1/OT/8vHM2t1XVlZJTEp3RV/VxvbKxNLVUHZxRFHc1lNKZ2NhZmB+dXV0SE1Id0pBXFlaX0BIRl5ZVMZTXNVZWllX1tbTVllITFTO5eDr7uHm+8fJ8/jj7e3t5/fH3FdYRd3f0d9QRkdMcF9SSUN2ckdd1MzIwdvYzMXYzdReU055dnFKVVHf99lbRHZyd3VX0dhSf3plY2FycktFR13VUFPWUVPe3VXX3dHX2NzXV1JAX1xFUdPXU1BMdUTTxf/h4eLl+crFy/Lm5ODj+vXS001fWURFWt5XVV3W3VxWU0R8eXR0XtrMycPE097AzvLxycFWR0xdVFLFw9hDcn55f3xEUt7JwkV/d3J5f3RDfXFPdHZyd1pEQVh1fUxIf0/WVl5bUF5f1drAxN9TXEhA1lb97u7i5+T45fr74uzs4+b5zMLdUlJeTUPUVVdUVsTO01NfT3ZCSHNe31RPTE9LVMXb09HZRUh0QdRewPfaXEpKeXB0cV7FwENxcH94ZX93QlpARUHS3NbB38VQRV9aWXVNU1dAcEpARdDfxMTb0UNGXdLP/OPh5OT89cf38fz65PrMzsfa0VTRVt/F0l9A3d/V2dzcUUxzf3dDW93b3tHR38n2yvHKzFRDdnDcw9zFxMtUQ3BwU0RT0N9EcnxleXllfnZLdnFwd1pGQkJY1VNGcnNaSXB3TnB6dkpZUN/2xN1HRUfc++Tm4Ozs4ebk4eDv7eXl//Xc2MXf0sLIxszD3cL0wcTV0NBxZWVxdXJzcHB3TVrXw8D0xFpfQnxzUtvXU9ZWTEp3dVLW1dFMSnZhZXF0cXZASHR3R1zTz9jG39nTQ01OQEdAUEl2dnZbUMXB0lBATn921MD/+efj4+Ph7ePi4+f6wN1YQVl1XtDU1t/N0d718/P1y8XTXExNd3Z1c3B/cXZY2/T4//fF2dVPTVpe1VFTV1dbSULQ0l5eRnd9f3N2cHVyeXF0dnFA3NJEUFRNR0FOdXFxcH1zc3JzQ9fPzdDfWEBHRlfA8vL/5+Lt7e/u6+/h4/zYyMva1NPdV93N9/T1/vr79MDSQV1Fc35zfmFnYGV2S9LN98PfxEdPSndKTlhDUtLQ29FT38TVQVtzfkp+c3B/Z2Rxckhf3M/0y9LE3FbB1lZUdX54f2V+SVbGwczXXk1+d0ZB0s7M9vj75eLv7+zv4OT/wM/A09jVSkrQ11TO/fj45vn299PU0EVDTmVtZ2BvfkfB9v//yfLfVtLW39rddVzXSkBV39DZ2UReSn5zcHNyZWNmfWFhTVZUxMrV1dFTRF5dTnZkYGdgYHxZU1bCUVpHSE9Txvbl++Xg4+Pj6erolevg5+T/9vL1xd9Y3dxUxfDk5OPn8/THUXRITGVhb2toaWN/U9Hb99vb1FtcXNdRUkhxdXxxTFPc0/fbQEV2c3VLfHt+YWVmZnBD1Nvz9MP1wNLUUEBxTWViZGd8Qldc2slS0FZO0MzO9fjwyeXn5uLp7umV4PrkysXJxFfF3UtDR07W/+fm4uH+/cVaUEd5f39saGBmekZdUsbIwMbE1Mnx3cTNUnRMQ0bSwMXB3k9wdnh4c2VhemdubGNhdldUx8jH11RQRUVLc3Z4b25mZnlMXtbA2tTG2cD/+P385/j44+Lrl5aUle7n5Pv/+/v0wM/WTUdY1vz6/uX4zdhURVZTT3lhY2lpbm16c3FCVV5H2d3M88BTVddCdUNQxc/C0lF2ZX55eUJAfnh5YGJlfljHycjOxFtFUFLYzdVwf3lhYWZldEde0NrV3czO/eX49fb5/Pnn4umV6+bk/s/18fH/8N9TV1pxRMP9+Pj58svbV9bHyfVdfX9lYmJmZXdfVNPY29DI///1yMbU2VFb19Daxkd3cnJlZGV4fHhnY2JibmRDXtzVU1lETnVD1NpUSX16ZG5jYGdLW0VTxtjVzv38+/jn4ePg7euVlpbu7ePn//3+9vT3zcTa1NH3/Pjn8szA01tCWdZURXxmb2lramxmRdBD2cDZV8b0xcva31FDT3dM1djbQ0lET3x+cnxycmVhYXp+cFDFz9LS11heX9r1zsVZfWRhbWB7TdDYV1fc2sPA8vn/5/j1y/H7+O3o7uPn5PDO2M/K28zQRdPayPbm4+fl9d1RUtVW2NdEcmJjb29nStnB9d9Sz8Pezf7/zMRHdHRwUN/Px1VYfHBlYmRzfGJiaRRiY2RF39PT03N8TUfY9/VXdnhsb21hT9/RX9xJdMj18ebt4uH6y8/+5uiWlJTr58rz+cr54f/RW0ZFyP7k7u7i59h1dURFVM3Vf21qFBVsZFLBU1twZUrB9/L+/8xMZWdlfFfB8NpUWGZmZX10R115bBUUYn/T8/74/cx2fkLF/Pzw0HZkb2xjctHaxUF3emdaz+Hi4eL5xUdcyubqleri+stMUs755v73UHN8SNj/65Xr7+TJTHFVwPD02kxkYm5he1Xw98dCS3RJ2ffn5/TSd3pkZHTd9fLJQXZ/YGRxQFx5bhYQFG5hQvf/9lx3Tn193ffxx1N9Y2NgZkjC2tRxYXxMXsT47eLn9sfx+uTilpWV6Pny8vL94O/lyVp8SM3z8uiU6u3M0NvG083w00FybRVpZmdD0kNOZGF9Q1TS8vHYRGVmf15G3MJW0El6ZXNAUdNEeGFqFWxyRtX98/Pcf3FQVsXy8dBQc2FgeUTRylJCcWNndFbB+OX29tVH1Pf65+nv5uT3wcz2/+Ptx1pLc0hT/+Hr6+bn887M8vz9+ttCfXtnY3XVz/FBS3RwcEPL8eTwUEB2cX7XzdHAXXRyf3l9UFpWcG1rFhUVY3RM09VDdUtPXvXCxsvVfWxneHtS3MfSd2Vnck7H9P/h/slQzfz57+7o6uj4yvn/4eLi7Pjed0nRxfvi6eLlzNj3yfrk9PfFd2xrYmB9RFNDfGZrbGZzwszxwkJ/ZXZx1vfE21FMZ2F/ccHcQE1+YxRoY3/EwMTb10dA39L65s3200lhZnJ0zcPV0F18b2V33eX85PzGVlHL9+bv7OP68FBXzvfi4OHl20RzQ9Dy7O/j+P7wy/rm7+7h9EhzYWJ9R9jfQHxlYGxlSNvx98xYTUpyWMXP9sZxf39iZ0pZ015JZ29oFWx6cXR3eHh/e0jV0sn1w0F3cWR4QVJWV0J5ZGZ5WNn65+X5/vjz5eLv7+7g/frxwPL44ePs587AVtH35OTm4f/78v3i7O/i+8hOcWVjZHF9enpsamhpZ3da3t/SXkxOSVfPzFdfRX99dnFXx8/FWHxsYmBhdEdLdUBwc1PTy//+999RSEtKfEVfTXR9YW16ckLJ8vL09vH1+frm4uby9s3X2MXc8Pn68sjF0M/C9Pn88v7w9/jm4+3p7frwxVlPcX90d3J6ZmBme3FDVd3c2VdHWFfV3cHUV1VbRk9MT1pcSX9hb25tYmF8fX92cnNCVtfWxdtRQHFycn5ydXZzfH95c0hT2Pb5///z5Obg7eLs4ODh+fPz/PPz/c/Hz8r08f38+vr7+fjl5OPv4Of5y8FcT3dzeWRnb29vaG1jZXp4d0lLQVJR3dFTVNfU1ldeUEV1fXZ9ZXt7e3tlf0hCSE5FWNbe29Lf2llYT3Z1SHR8dHZ7cn1xXVTE9fLPwfD/5+Hm5Obm/vv88f7L2tXVV1na3sbz9PH64OT64ebt7O3h5ubK2lNMWkN+fnF+ZHp7fUp0W19VX0pZXdfY2cPNztFfXEReQHJnYWZtYGNhfnl4eXZzeHNCQVxHQVZSTHRPdEFPfXdyfXpnc0ld28n0//n75+Lv6+ju6ePl+fPw8PDaUldX3tnA8fz5/fvy8/z95+Ps5vnk9d1XR0p/eWNsaWhiY2Z/dEB2d0tKWUZe0d9V2fTd0lBb3NFSSn9/ZmZken1xR0ZBdkPVU9vZzcdfW0txQ01eQUhxfHx4c31Y2Nra0VTUwfzk4+bj7+Lm+Pj1y8DVUVNIS0ld2PX++ubn+vj7+ubh4O3g+PD09/f3yll0fWRjYGV/ck5eXVBeUtn18c3f0lxCTnRzcnZwf31ze2FgZmBhYGdgZmFgZHBMd13N2F5fQnVzdnN9ZHp8en502Mb2/P3x8/zn7Ojv6ejg4frm5/rx9cDV1lXS19vO9vPw9P74+frj4OXh5+X58cvNX3FwfmFnZ2FmfnZ3QUJBRkZZRVjQ1tNSXlpITE9JSkl+ZHx4enNxcHRLdHVwc3d1R1jV2tvexd3aX3Rycn5keXJ3dFfeyfXOy/H+5P7/5f7+/PzLwMDB1NnM3tTe2MXcWNjHzvX3z/H/++Pp7uDg5Pr8/cNXSHZxfXNLXk5bVdBEWE1FV9xTU9LW1FdTQnd/d3FwZGdmYGR6ZGBmYGZ6ZWR9cnBKUlBRU11FT0x2cH18dk5PVcfEz//59fX38fnn4ePs7OLi4+H48PTAVF9TXFTby8/18vzx/fD3/vj65+b48P388MnY101zcnF1d0lwfXN1dnN0TXFM0FZU1lBER3R/ZGV/fn55eHN7enN9c3dxc0tPSFrXUVlQRU9EQkpISklNd0tSU1PU1FXDwt7D9/XN/Prk5ubk5/72yPXA0txGTEZER9bcx/b99v35+fv65Ofn/vzz/Pb2ysXH3FDfzNDR1FNERUpLSHZ0WlbcycDf0dd1c35mbGJtaWBkZWR5ZX9wf393cHByeXdwcnFFQnZ3Q3RLW13Q2dlcVtDTxcvPyfX54Obg7Ozj4ebk/fP3yMbb2MfE3VBUxdr18PP4++X6/fbw9vXDyMzY2sTaVlBT1VFedENednZ0THRLTktPR1PcxdVXRkNKcH5kZmZke35kenxydk5NX1RdRVFdT0ZGQVlEdnZwcnRdw8Tf01dS01ZWV1XZyP79/v/l/v3w8crax8TQTFhW1lxETl3cwPLl4Obk+uf49PT3w/T/+Pzw9/f28fPD2F1S1NxQR0bR1ltTX15HUVZXX0Fxd3Z5ZGFgbWNjYmNlZ3p+fXdPd3BLSX17cnN1d3FzcXBYXdnfxc3X38Te0NjG8vvl/uTh5uXm5/j89/758sLBwtvVX0tDW9T18v755uT75PzOwd/T397Q3cXO9szJzd1BT0VMSnRzSUVMdkpcQllbVlhNTENPfH5/fmdhYWZmfXNa1URQ2dhAQ0FKcHd3SndydV5Q0N7d0VxW1tBbRlzE0871yMnI/fvn8fL29s7Iz87E0FJWWXZaRFTdyPL65+Tk5PPO8P3z8vfOyvX4+uf98vLMxMRZTFlBU9DWcUxeRl7bVUZCT01JdmZne2RnZ2xvaWJkcXZzQ0l3dXZne3p5ZX9lZnhLRtXF1dNQ1VDH1VHcyfH+/fT++fjn7uHl5+Hk5f/IzsvF1tJBdUHeyvD85eT5zvX30NLAzNjN9MzK8s39/9zV1V5MTU11dEdDUFhxSl1YVN1TREFHc0h2ZXpzemR5ZWdkeXlFU15TRnd2dHB0d3NwTnF2Q0FD199RVF1bXtZdV9Pf0vTxyvz4/fzk+vj8ytrLz9nY3VpMQENF1FLc9vn8/v/C9ff38fz19P38/Prz9v75+P39w8fY29DaVkFfW0FXxFTQ0t5YWnV8emdhYWFvb2JnZ3h7cEpLcEpwZmR6emZ7ZXp+fHxGQ0hH3VZE0NzSVlTQ9/X18+bn4Ozu7u/s5uL79sr229Pc3F9dXFnKxcLI9FNS09zW3NPe88bG9fPay/H3z87E3/TT19ZTQFFZRkJcTlPJVNvRQXJ1SHN8f2Z4cmR/cn55SURS1V1wSkJxd3ZyfHBwc3F1eUhfU9RcREZd0dbS11bPzsH0/fD25ebm5v/38PTb01ZFTUFbQV5d3M319vHFWVjTx9zCyPD8/Pnk5fDw+Pn9+fv7//L3yMTbwMnQUN/Y39ja1lJwZ2R4YWxgZmZhZ2d/eWR+dHB8c3t6fmRnc3x+c3F6f0lPQlteUdFR0t/Z3c33/vj6/+ft5eXh5uTg4efn+sDBzdBWUVlCVdvCzMVZUVBNdk9zcFjXw8rM1PX3wt/Y1872/fn/ztT0yczLxEFU2d/e2kVCXnFyc2RvYGF+cn14d0t1Rl5xfE5LX0R0ZXB2SV3UcHJAR9PUWV3HUtbeUnZc3dv38ffy+vD88vXRzPf398JRXkZL19BcS1DUyfLO3N/VVFVfTHNNXM3z//T8/fz98/Tw+vjm4eT85fr6/vv20Nbc0dXXXltAdGVlYmtoY2dkZXp5fX98c2VmZ35keHhnenJ/dF91cnBPdVPGz8jI3NnA3dv1//3h4+bh5/L+5f3w8svT0FRTVNDQxNJR1tvbwvfDxdNMd05yfUhBW971w8jBxc7x9fLwws3x8fH/8Pf+/MPH0VNf39HWXXd4ZWNjZHp4cEl2T1tATVlASUlwZ2V+eXFBTEFRWlhGW09Q39jGx1Rc1lXR2/XC8/3y8/L0wMvN2N3XSHF9d0hSWVpXXFnZzdvI98zQ1E9xTkZB3cPEy/Hz9Pnk5+Hn5eT7/Pjl5frg4eX7/czDwNfS1EZ5ZGJpaWxjZmRle2R4fHFyc3FyemRhYGBmfndETElJQktZ1sLAy8rG0dzZx8j25efm5Obk+uXl8/TC1EVDdHFYV9Xc2VJS1dPc29vQVEV2cnx4ck1HW1ZWWVzTzv/+/v7/8vHy/vz85OHj5uT/9/fJy8JVTH1nYGBkZHt5eX9wcnFBWVpDQUlzfHtlZXhydExCQk1OXFTdzsDAx9zUV9nBzvb9+P789sv29cbfU050fnt9dnFCR0RSVFJW28XE3d1TRUt3SlhR3NzfwMLOy/nk5+bn5+Hl+uTm4Obh4+zg5/r/ys3WQXJkYm5sYmFmZGBkZXp7fXd1cH55eGdiZ2ZnZX5+c3VJUMTazPD1y/f0wczI/OX7+Ofg4efn5/vxw8BVRnRITnR3d3F2dUlZ0NPEz9JRWkV1fHBMREVEXkdaUdD08fH28fPy8vjl5+Hn5eTn4eHk5OXz2lVPfnpkZmV7ZWR6fntzdUlAQHdyfH5/fntzdHJwd3VIRNTB9ff28PHLzPX29PHx9/Pz/fr8yPTM1kRxeXtlZXt/eGdke3h5Q1fR29PU10BKW0dAVdnEzM3L9vPz/OXk+uXn+eXj7O/v4efm5fj7+fL3ysxWdXxlZGRmZGRgZmdne3F2d3Z/emVkYWV/fXZLd3x0dXVT29jL8fTx98j3//Ly8vPy5eXk4eb68/HeWF9FS0NMd3R2cnxzc3ZHX0FJdXZ3c3h/fXJxQEBAWVPSwM3O9vH09fL4++Tm5+Tl5eDh+uTg5Pz1x9hXT3R2fmRlf3llckJEX1pCSX16fX9+fXdAREhJX1JRUcb29/T8/vP+/vj68Mz0yMzP9PH29MvTQnVwcn97e35kZ2dhYWV6f3ZzfXJ9cnBydUxFRENFVFBUwMjy/Pj7+P7l5+bm4ePt4+bj4OHg5vr0011QQHBydHd+ZWdnZWR7dHd+cndyen99c3RxcHR3cE5eUtT2//z+/vjh5Prg4Obk5Pr5/uXm4OXx9/XQW11PdUxKdUt4eXB+eXJ3c3pnZmBmZ3h3d3p5d3lkZ3t2dXFHWERQ3szKzvb5/vz55eTh4e3j//P32dVFW9zfVFNQWFtLSFpZXtVRVkdDUFVdW0BDRHVIQFvXy/P88vbw/Pfz+ubj5OXm5f778vfNVVPXT312d3VIcX9+emdle3p+TVh1fnt7fnJ5d0V0cUVBd3ZMU9fUUNbE1VPFyfb098PEyPb+5/n8+PzPU01/eHZPWV13S1lESkldUltFQk5DS0NW0lxcVklycnxN1t7L+OT65+f++uDt7+zi4Ozu4+3i+fzyw9jUXlTBxdPUR3B/ZWd6fHJydHxkemZjZWVlfn57ZHpke394e39+fHBLR1X3yPfK2sHK2sHBxdvHzd3WWkFeVV5dW1xTUd3G8PTN2t9cUl1R1dzYwcpVQEtAR1NU2s/y/Pjk+fv65uX6+frl4ebg5vzK39d0S0BR09jTw9rVRkxacX18c31yf3N0SX1JUU5Kcn13TUhFUll2S098cXRBUdjf38/GUcTYRVtHRF9Ac3dMdnJMdnp6ZX9KWEZXx1dCVFBF1VBWx8PcxsVWX1dZVdHUw/D4++Hi4efg5OTl/fjn5P/k5/329cbIz8Dx/f/w8/PIzNtSXU1zd0tKd0RaWlhPcH16Z3p/cHdBdnNyeGV/eWVycklFU17WUV9AQUlwS0tBWVFd0NRSTUR1dkRHV9vSVtNUXEZUR0dTXdPD0FbUUl5F3FfR2N7w5/r//v/w9PDMycr2++f9yvX3zcDK2sXE2s3x2dbAwFJeUl5X1tPD8szM9vbb2dHR1FFQ389TQVJTRFJeQk5OQ9DZWEhASH55ZWZgYWZ/cHh4cHN/fH58d05A0tJYQllETU11cHFLTFXXVlbf0N3f1lLX3Mf29vT198/PzMDay/Tx/v7y/Pj65+b6/fz38/3xyvXZ2cbbUFHc08PDwcbIw8Dc1kJeUV/UU1pW1kJfVllLW0df0t/bz9lDQEFBfn95f3F3c3dwZHlwfGVwc1pRU1zWUEVTWUJzSkpNSVpG1lB0TFxFRlFc0dfR0N5aSU1bR0tNQERQ0VXMwMT18cTawcj38PPy+fTOzfHx8fz+8fn75OHl+f/6+P/xzNnKzM3N297Dy8fYzMTf9cLA31NYUllKdEJ8e356fH1lZmRkZ2VyZHlxdEt3eHtwdHB2Sn5AXlxdREtFX0ZEW0VJVF3cxNJR0F1eXVVRQFRcwcrMwfTBycvL0VDW1fTO2tvLwMrPwdDW0sXy8ffz//f0zszawdLa9sPB9PXJ8fH39PfN8/rw9vfG2trWUkVZRdLfW0FEdUhAdXd1cH5KcH5zcX92d3FKTUt0WV5ZWF5AW1pATUpwcU13d3N9fHZ2d31+c3VPSEZBXVhfU1BYRlPR3sXNy/bL9fP88PD55ebj4fr+9/H/8M738/H5//Dw/vzl5fHL9/fC9c7L9MrYxttWVd7TVtJcWFNBT1fRWEdMcnx/ZXl/enl3cHl+fH92SXRNXkJBXUBKREFOXl5FV1x1QlJHQ15eWlBQUdJXR11UQnR0cXBJSk5ET3RBX0Vd1NrGz9rBw9vfwfXPycr2zvD95OHn5uLi4ebl5f77/f7zyM/KysPAw8vawd3AxNLFw9nV19LXWFJf2tlWV15ASnR0dnBCTllPfX1yc3xzfH5+fXt8ZGd5en59cn94eXJxTU5BREFGQ1pEQ0BYXd1ZRVxZ0d/e0dRQ1NzZ0Nbd28fd297YwPb++vr65fv6+OTl+/vh4efk+Pn+/vD6//T3/fHP21BeUVJAU0N2SlFQVlJaRF5FQFZfQkZTQExLdEhbQU1FTHZCVlbWVVRUVURMdn16d1xaTnRKd0pyc3B9eEpCTnF8cHJ9eXtlemdxRlpJR0ZHWVzW2sHH/Pr68PDz9/Xx8fH89vjn/vH9/Pvk5OXl+/P5+PDJ9vL2yvXf0t7WzvDL9fH3ys3B0FFSXdfVW0dBR0t2fWRkZHpxcX12dnZ/enpkeHFY1lBZX1pGS0hBTVrXxNvWV1RfX09OSHZzd0pwf3l8cnB+cXR2S1Hd3VXV2cHC2vb2z8P29PHx8uTg5uXi4eT++/z88/z4+9pe1E90R9fV2MXHz8NT0cRU1MP29snw9vzzUVbb097Kzs/MwNz3xXdzfXlyRF5Ed0pzTH9kfHB4fUpzdH1wclxxfXdAdXd2c3N9cXNEeWV4fmVxSk91T0ZPXEJcVl1NXN3Z0M3w/Prz/fv6/f7n4OHp6OLi+/L7/fHl5eXl+vz9//bKxtjQ2trX0cZUUF52SVhFWNvc3cTeVNBfS0lEdUpVQUh1SnBGQk1X1UBa01BUU0R1T3N9dnJkf0t9TUdFQlpKcEpwZX1yZX94fn53cnBHcXNDW0fW3dNU3FTdzt3QwcnN/vz99/L19/zC9Pvn+efl+PD2zvD33sLz+fD4+fz09MP39sv18v/85Pj78/XezcLQ1NjRUdFBdXN9d05wfnhwfH9PdnJ4eHt8f3l5cnJ0Rk5IdHV3R1xMRV91RkFxfXtkZmVkZmZ6e0pET0p0dXRQUFpQ0tPz/Pf09/TC+P78//v84OLn5ub68ub//fDO2/fJ2tdTTnXT1dbd2t7xzdPdxFpRwcXJ3sPC9vfCwM9ZUMnQ1ddEQ9VFcUx3Z3N3dlt1SEJGWnZFSnlPT0NIfXVCXlZb1EF2TUlKcmZnZGdkZHhgYGBnfnl8SUJbWl9USkhA1Mbew/by/+Xh4eXm4O3s4ODh5uHm5f/OzMT19PHx98/DwdjfXlNRVFxQVEVYVtrIzcD18cnEw95GS0l3TnZ5fElydFxATktLdUVKdn1yZH9OcX53cHVdSUXVUnZZRHRyfXpye2NsbWJsc0h0cXB4d3R1d0Z0d1bT2Mbb2ff3/Pvh5efv6O7g+vjk+/j+5fP65+T79VbV0lTd1tRZ1Nbe3FdA08PI8vzxwfP95f703tjVV9rfXFrS0sr20kJYTV3XXUp0R0dfX3B7cXJA1VxwdkFOTndlYWJuYGdlYGZlZmdkaWtqam1mYGB9d3V3Rk9AXtL25/jw5OHn5u3h5uDu6peV6pXq6env5//x//3lz8TB001Y3FVW18HB8cbBxsdV38VQWlPayP309ff12s/B00dFXllQQF5WWUFW1lNZWERcU1hdWEFNTHd3dHd0RllYUkRMTUt5Z2BhZmFjbWFtaG9jY2R4d1pV1t7Z0tDTVtfDwM784OPolZXq6u7s4ufk5vv95f3NyPLK9MXcw8jC9/POwtjMXVvP39L48/rt4ubs7eT+8vzK8MbP9F5wRUl3S3NJW11H01R3e3psbmlpYGFmeEJPdXdGdXVwfXZzeWVyeWZgZWR/fmVIdXZD11BeVVJDWkRRx9ja/eT55eLi4Ozg7e3j5uHg+/3x9/H+9fz7/ffwytdGQHF5e3pxdnVFx8/Dz/bDzszC8v7/8fn59MnKzfP39Pj/ytrM31pBd2V6ZmNmZmZ6fGVlcXJleHl9dnZ+enl4eXNwcnB+eXN8ZXt6Z2ZmYmxgZHh+cEHY2sHw/f3y8PTw/P/k4OPs6+vq6Ozj7O3n5uf+/P/11ldFWNHRRVfWXd3b01bS3d7B3lfZx9dX3tLDw9zFysrGydvY09VHT319fHBwcE1JdEJbdHZ/f3tzfnt7eX5wd3Jwfn5ld3lkfXJleXhhYWFgYHJ6enRDdVbeV9VUQEbGXlrd3t3+/vHn7eDvlO7olOjh7+Hy/Prx8/zI+fj0zs7UV91Fd19cSFNVRVHA2Pf48vzh5f/m/s3y89nDwFxZ13dwTXxnemRnc3xgZ3ptYWVjZnlleUt2eXVOc1pefnZEdHB0eGV8ZmB8dn9KSXVKQ3N8SnF+SFtA3tjdwv339PH39fn59/77+/36/ff1ydn39sfMyM/bysfW0VFNWVVRV97d3P748OXn8vr68fbz9dr29sj2y9zLyNzN8cPR31hwdHxmfnFxcHtibWZtb2dia21iY2dlYGB5f3lxfnhNRFHd2tzW01RW2VBDVcLDw9/Z2sXBy/3IxcbKyM7b28Tx9vH/9/Xy+P3w9ffR3tXRU0p5d092dnRMcEFORkdDStXD9vLy//zk+Pn/8Pzj4uLt7uzi7OHn81dXwNfU19rd1V50dUp+f3x/f3h6ZHp8ZH55YX55f352dn95cH98ZWF2TUFB3dvF9fHD8/39+f/98Pv58PL9zPHK9/zy8Pb59sfY0V9RSE5bXVxUyvTM9MPe21TS3tBeX9FUV95UW13R0Nbf1t7298bOyMj08f37+/vl4eT75Pnz8vr78MzBxcDQUVRGdndEW1tFWkZfW3ZzdndKTE1MQkFRx9zQ11BZU1BBdEhDS0BEWFpCT0ZeWFzV0d3a19RRUdVRVFRUx8DP8PbM0NPU0VdaXNzXVNLSyc/Iyvb8/+Tg5uf5/PH08MjAwtjN9c/z8vLI0lFWXVBBW19T3FTZ2s3a3cbI28zDwcRTXtXDxtJCT1pdQ01HR09aUUdBREJYVE1LWNXTzMfb29rV1N7UUldxZ396ZGRkZXByfEpGeXlwcnx9fXFFRkpNVEZVwd/fz/Tx/v3Bz/bV0sPMz871/fL3zv7l9fHy8Pzy9PXKzMXDxcH98cvCwfXOxFxBW3Z9S3dHT0tR115S2fT1xdJS2VRfU0B1RVXY2d9T1thQWVJZSk50c2dnYXpkY3xHdUlMS15aRWRkfHdOdGV6fH18e3hlcXdFxcJRVFPVXERBWtnO8Pjl5ebn+vj22MH19fTM2Mfb39NVVNRR1MX9/vfJwMzH3FxETUTW2F1S19TY11JPQUFfXUd3cl3cUHF8cEVBRlbN9Pz/9spedHVJdVrW38P0zdnXTnB8eGZkZWBgYWd+ZW9tZ2Znc3RIWk9IQHRnYWdneEpwTtvbxvffWNNVRVPG0MH2yv368cn99c375P7h4ubj4v3OyN7cy9hV9vP3/fDUXVBMd0R0cltXVNfWdX9+Z2V3fEvRUUF0cn57ZGR9dUtfxPXxzdHa0VJQ1lFCR1zf9dZS1F7XV9BX3szGwMBCdXFnYGNtbWR+dlBUS17VSk9DcnxxcnNQWXZRW3VBQ0hc2N7L5ffbysfT3F1Vyvbz5eD4+eHn+uT3z/Dwy/jk/fr898LHU97Px9XJ3EFMdXxyfmVKdExf0l/U3d5WU3d5f2dkfnB/Sk9OTVp3TFNHRdDS19xXXkVDfE9Jf0Pd2PX8/v/z9tTVW3VFX1JZ0NbWxVBeV1BWzPf988z1wl1HTVJTXtLay/XDysBU2NxQUlHXxfTD3PHwxMvK2drQVvTxyM768cf3yMDB2NLJ8fT/4PDJ9FRNdGV6QkZN1MJZXd9YdUNzW8PQW1FEf35zZGd4ZEzSxcTyyFlbQHFzdnxC3dfSzs3WwfXD8ff1+uHl5Pv48/Dwxd/T0sf29P/l5eXl/cnf2dzG1cX0wPbf0NJScEJBSEB0dUZeSEVRU3NGWtfBz/Tx/M7B1VNF1tHCzfP45uDk5fD3wff1y8DB295cT3RyeXh3S9RTx8rxzN/UWnZlc3Z0dklH0lTR1l5ER1fQ3l3WyfDP38DBUFfR2P325e/r7eDh+fT09fb7+eTt7Ob49dRd3lRXwVBX9ffJy99wfnF9QVVcwvvEQEt8Ym1nY2VzfVLz2dnE2d/M2FXJyFTC8sL09d9Y39zC+/r94+f0/vFVWlt8eX97YUpJdF1CTdRXSlrXUV/w3NDO005Kd31dx8Lw5Pb95v3PwlVG3vXFyuXy+uXw9PTG3fX3yfL5yv/ywVJRWEPTwtrH1khGQXd5fXl9SElxW1Re2cDcTEV1c3d2f3N/eX1xZGdwcnZbVFvbzNnB99xdV0pwTk92VtDf/+HxzPfRRlxWS1tQRNZZZGdkZmR2dHbcx9/28tNTXFxF1VZR9/XJ/fbGzNZdUMnZVc3Mw8JXW1tB1Nb129ffW1/VV1BcU1FBUFBQ1dL1xdrAUUZxfHRwdkpwSn9KTX9wd3RLTUJLdkxzS31hYmlqamtoYnlwfkVJcXBxT0NGUNHS1VrH0sXHx8Dz+fj8///8+/XL2NvW1FtYUVJCWlFcWHVa1N1V29NWUVZRV93W1VZSWF5BTEdRUVp0eXx4e2V3Q0RVxMLH1ERT0NBW3tDYzMrMysrBzsPe0sRRVcTfTHJ4ZXp6ZXpzeXxKQkt3c39LTn15emFjY2Nvbm1tZnt5c01P1M/L29zM38/Iyc328fzm5vv4+/7h5vrz8M7F2MDW18fRUUN1fHBzR9fXTk9bREdOTn1HQUlZ1U9ZXFfZUkBbUENY0FR3RNJbXNfcV9PN/MjD3dXfxFDVxFfR2cLe2ldW0dlEWVl2dHRKfU9zdkVBc1lSQlrd00Bcd312d2Vye2FheHl/QE1B2PTb9vbKzfb19P3x+eb69vv78fL69vD+9fXxyN3RX0RZRHVaVVjV00FIUkJCVtHd283N9dtWUNrf0cTB2cDF0czOwdvUTURGdUtSXlrRUlfG3UxfX0ZaU1nA8cX0//zx+PLI8M3Wxs/R0dFMdERKT1fbx/H92M7NRHBMcnt7eH51SnJITXBI09NX9vH35P7wz8jQxMzz9Pjk/uT08f320cH2ytvHzcT0yPHJxdvezsHQ01FT3Mfa0t3e0drXXVRR0NDA9MrQUtfaUlnT3NLeys/I2tLd3VbdxdPbxcTTUEZOQ19dzvf8+ufm5uf1xN5fW9bT3dDf39PRUFTW0sPwydPTXU1zdmR4fnh1RE1LUcDI+fLz9PvG9MfJ3fHLzvbx8PL42/TKxN3PxdrBz/X931ba+kfO8Nj899daUXx8dEZeUF7Tw9Be1t1XVcfC2MTCz9nQwMvf08/x8/D88PXA3tLbXk1FXlTVXHVc3F3D8Pf/5+Dn/fH0z9/Z9sRNXsXS3tzT38fb2s5TSEx2dFFYdXNMTEXUdH9wdU1FRVNTW1718tlT3d3H8PL5/crIysdfUlxfwvD2zvXDyPLA1tBQ1sDWTUt9Z3JOd3N3dENcXVDSUEBUV17V2NfEys/L9srZwsHA9djTxVBIT0d2dllaWVlKdkhBQtba08zGVNDf1tVU0cXKyPb8ysHF09NUdXNydUhwcXRKd39xdHVfVdjWV19zdE50QXRO0cTaw/XYRV5YW9lSdXxMWkJISVje0NTbRkpGXt1RWXR4cXRNdXJzdVtUx87D2trEzMjRXFfb9/H8/P/z/fz+/crYw/XB03B7Z3x4Z2dmZn9yfHZ4YGd8f3NlYGNlenpyfXxycnBdVVnWwdj29NNU2s3Zy83D/Pn45f/O2MfUwMBAdUZXXcf1wM/CU9zBXVNWS09NfmRgZWR8dHlBR0BRzFdxcGRhZWIVaWpvYXB/cHVyf01GSNnb3Mf1xd7I98r85ebu7ODi6eDn5vrn5fHS0MbSzPfZXkl9ZHN+YWRhb21iYm1hZ2B4eXlPT2V8fGR5dHplZGBhZnx91d5S3t9f18jX1t9FT1fTXtDO2Mn55ezr7e/q7ODv7OH68dnbycjI8sjbw1FZwdNMRHx6eGdjYmwVamNsYHlnbWxjbWdkZHhmZ3xPUd33ztv0ycL+8vfz8/b8/Pz/+OX64+zs6O/k8vHExfTN3ldLQ0BQV9DOUEVfS052f3JhYmNjZ2JgZWFndkhYV0R3Q0xydHJyf2ZmYX5IcFzcWdDZ2/L64efn5uPs4+Li7ePslZfq6+Dl5+X4//3L2t/XWtRaXF1wZXp8ZH5yZWBiYmFhZ3pxQkna8PD3xNTT3tVW0MZTU9TV9f355Pn+/vn6/vvO1UVAUFDRQEbW1dzw8f7/z8PH2FTUXUVMQ17dzMvzydBSU1bV09BcR3Z2R013eH9/cENT2t5ZW9BUXNzHxtjI8vrt7OLi5P765fvk5P3y8Mzw+Pr8//r+/Pj4//bd0l9LSElMfXpwc1vazPHNwNjN9MHL3VpTdktBQ0NwW1Bf3cTw8sbPx9dYRk9+ZGV6cVrWz9vXVNfA2MLERtdTU9zfzFXezcby/uTg5OX+/MrI/MjbwMbP9vby8cBWXllYXll2cHByQFPS1dfc3/f8/ufl5fz0wVHfUEBd3Nv1+efh4fr9+fPD0UV2d3J7fUFdWNXSVMb3/fP8+/zy3lTVS3ZDR1pS1d/ZztBOW1JcWkVPc3hlZX9kZH94c3VdUl/N3FXfTUdMS0BQ9Mv1//7j4vrn5+T/9PbWU9RRyffw88PLz8bfXtlcck1xc3F8dmVP0FHHxPX8wsj29cDF9VJOUEVY1FFWTEdW0Mzez8/eysZNd3F9YWF/eXRMV9lV3M3CxcbK01/S0NnC8P3P28fEy8DFxF9EXkReXkF8fExKd3RCQ392QlxWQUd9ZXhydnZNRUhD197K/fbIwc70zsXYUUBySlDdxcb1z8P18/HO3V9yeXJKWU9DRnZG0d7I29vB09jT1d5fR3R7cUNASEheTUFU2cBfTkt+fnB3fGZ7ZmB+ckdAdFpLRVVU39Pa0FzV08/KyfHJwfb75/v3wlNb1tvAVNfSRdbG2MXX01JBREdNd3d8ZmZ7eXp+TXVJUNzDwMJVQ3NzfWR4eXh6c1LWUcDH1NPT1UlBWE1Kd3VJdkPWR0xY3tnA9sjd01NQVtPYTU5NWFJZ3NZBXF1eTEDUQXdxfGRnZ2VlZX9zcU9QTHh5f2dlc3Jyd1tW2/Dn4OX5+vzJ8/z08PP/yvX2yfHx9czcyfDxxsfMU1Lc1Ehwdn1/R11S11lUUHVH0FJURU95eX1nZX1IdHdfVlZZTXVnYGdmZmZ5emVI1tna9cxTWVlR0srw9MDD8fXI9f3aUtDazPHz8/T29sPMVV59ZHh6dENFWXRId3NAUMHXTUt9fU9TUFfUxcz85PPK2NzTQVDDxFZR2Mf8+vP9zMfA0Mfy+vPCxtDYy/T99cTX0Nvz5fz29vDCycJUXHZ+eX9JTUVCdndxSkxJdmZiYG1iZGV/eHt5dN7M0Fx1dXBxU1rfxd3I8+bk+ef8/vr45+Hv4ub+//j78/T3ydTdxsPIz8RV19nIXkhDdn1+SHRxXV5bVlzc3PfywUVzQ0NM3MXQV1Df0sfG3NfX3tlVXNJdSVtV2svz//f9/f/75+Lg+/b1y/b7/svZ2M7J9vf029FWU190fXhmYG1iZ2R2eHh6Z09WwdRHSHBH1cXz8/bx9f7l5vr98Pfw+/z9/PX02sfK9/bGyMbW9fH88M/00VDdyvLc2tnUzMr4/fXyyNrL8M9fTnZ/c0JQXEZbWXZB2tlSSlt0cHVMXEhNSnBIUMDY0dtU0PX//cPLys7M9/zz8PH/+OTj7eb65f7M0tDcx9PT0sb1zsDbx8bc2c7YVUJyfXFMQ0BNd01FRdzV1VVAUFHR1FDY1tjUX8NfRFxMRUJW21zQRUNfWsr1V8HExs/25/zn5v/78+T/UN7BxdzQ/szA9cT30sfMd3ZxZGBteWdiYW9ibWVefWVwfX9/VlZyRV9c1Vb/9NbGxs/G++D/++X/y87n+sVW18Td9Pvy/v/yysvn+NhbUddU2vDxyvb131718NlTTndkZnF1dnB4ZGB+Sn5hYmZhZ319ZGZke3p/SkdYT3Z8e3VV29raUFJXyPPw983Dw/f08uXg5vH9/frkzt5bQtZQ0tjBx0tPW1pQXllzYGZhZXdKXnN4cnpKWk9wYH10eHRBX39lcHh3WlNWeX51fUPdyt5MUFZR9OTk98798vjg7unm4Of9+ODg98fKx9vL+vjO2FpIcEpcfWdsFWpqYWRiY25qFWx5YWJhYGFkTNBcRHRzfErZ21BQTHFP1f/w9fXWWl7x/svzwlBUxfr+/v32zsj65PD2x11WwvL75f7xUUhWw9lUX31hZX9xdHB8ZmxjZ2NmYWhqaGFleXB5eWd/QkFZR053TtLA9+Xn+8/1/uXl5uHl+OTh4uLt4uX+8/Hz8M9XWdTV0cjPwdZbXkx3dHdxemV7f3dxT0twdmdmZ2Z5ZGV5ZXF0Q0dAQUFISEJ1SnJ2eH1CU9DQWE9N0dHay/Lh+vLl5uzi4OH+++Xk5fv6/vz8+OT6//XRTXZ0cH9ycn5/eGVxSkh2YG9tbW5tYWdmZ3h+d0t3d3p8WE1cXl1UQd30/OXz8dzE/PPk5+Di++Tg7O7t4/LB8/3/+vD+/fLn4OHn/sFJSkp2cX9yfnJIR1hJUERmZmFhYmhjYWFkfkh1WUZ/fHJ0dHNDdXFE0PbIyvDW3cPF98744+bg4ujv4+36/v/19dLN9MPw/eTn++XDRU1KS3h/c35xXlxATV9Ad3xle2FjZmBndEBIdllJckhKREBGWUlEVvT89+Dn9MjD88zx5fnh7ZWX6pXq6eLm4f/5+vTy5O3s5+fk8c/SRnF4eWdhZ31AS1tVR3R4ZmxsYWxtYXtIdEZaRkFJQnBIUUtDUt30wfDxzMzd3ElL3Nbc8P7n4O7q7+7t5vLf9fPP8//k5+yU7OH7/8RG09FGWl/USUbYVVxbXHFjZ2RgbGNnbWF+d3F4c35gZXdNTVve0dHk7+Pm5uHy9Pvl5+Po6u6UkJCXlJTm8fz19crNx1TG+PrxxsFZZGd8ZGRwemR8SV5CSUd3ZGd6Z2d9cH97dV5zdU14ZGF+cX5KdXFJUPXIyPfVRXVOVlH0/vvh45SUlZaV7uLk5/nk4fH8+ufg5uH79N9BREFMWXB6f3B1fnZ3ZGBvbmlvYWBheHt9eHFCfWZmZGR21FFa3Pb8/ufh5ffMxVJFzfn95e3v7OiUleng/sLQ9v/IyvP4/vrs4vzEVlpwWFRLdHBOd352Sn5lZ2MVFWJib21tY2FkcWRvaWkVF25nZ35LVNzM5fbF0V5Bd170yPb74+npl5fp6O/k/fH9/M7J9ff18uHwwsdbSnNDXkZeSk1Gd1FafnhhbW5pZmBhZWd4enl7Y21obmgVYHt7cndWwvX4xNJXc0h2T8vO8/jn6eiRluqV4ufn/uf69sPQz9/G8cHZWnVIcEpOSE58cUp9dH5hYhUVFBRiZmR+dkZCQklweWdmY2N7TkxzR8fK9fTP3FJPTnVK19ZX9/jk5uPt4OX59srHxPfT3cPezPH++cLZ2drX1sZVX1pOTHF2dGRnYG4VFGxgYXx5c0JyfXpibWhqaWR2d0HUyfzl5OX+/MnY38by8fzl5+Dt7e3t4ef88fDOyM/F31fSw9jBVFlFSFzQ1sba1kZKU0lxcH9yZ2Z6ZXB0QltN31N9fXt6Ymtvb2F/fEtxR1VHX1pNcmZ+dEnUzvPy5O/s7ejq6Ofn4eXk+vz32vTy8Pj5/MTfysnI/crURkpOcXxzemNiY2FnTNFZWFlUUkN3cHhnYGZmeHR0SkTZx9fU3EtxfHhydFDc3cH95/r67Ob45OX45Of49vD9+OHh7u7g4+Dm4OLj+fDIVV9eXkFkY2FiYGZ9cHBwfnh+fGZva2kVamlneWR8QdXHwdhQSldGd0DXwMfD/Ofn4ePh5fr68PDn+/fF3sbH9PP98/z4+vrg4+T9/fzD2MDY0VlPTElZVFTYxd1UQl5bZWZmY2JvYGd6SH16c1jXQX12TUpIW1ZU2Mf1/fjh4uLr6+zs4e3g5uH7+uTh4uXk4+Tm4O3t5uX/999FRXB4eGBnZWV7eVxQTV51TE96f2FpbWxiYWVxZXhydlFDdkt2TktOXVXN2NXG9Pj6+uLm4O3j7OPj4f/+/+Ti5+Lh+uDl5OLi5vbP3VLSXFlMfndxSl1Ww9ZAW3RDQXJ5bWxtbmR+cnV9dktD291fTHZ1dkNT28XQ3V7T5eX65fvk5O7p4u7h98/2+uXn4eXm4u/u6ejn8s5T3NVRWXx/ZGF6fEN0eH9nen95eWJqFRdqaW9sbmxtYHlKU1lIQEhZUN/02MfZUd3N+Ob65+Hl5uPi4Pr02s318Pr/8/355Pjg4Pz3zMbXUsnaRUx1d3BN1VdeVNjWRtzWcGRgYmJtYWBvb21hYHBFfGV+c3xnf3dydnRKckPC98r/5Ofl4e/i4+3i5Ofi4+Hm5OT7+OHl8fPI0FxXV0t2cnhmYmNjY2R+eXl5cmdgY2NgYm9saWJmYmd7cXR9cEx1dHRLdnRfS0hHWkdF2P39+P/wztjOzcLw/cnbw/TAyvLz98v2/Pz5+87V2cZRVlRRcHpwT1XbydRydHd4fmR6YmpraG1ge3dkekh1R1/R1E9aU9XM9P7MUMTfzP/m4//09s784OzkyPLJxMbNyN5X1VNR3MvHSnd8eXVETXB4ZGd/RM7OVkZxZGVLRXB+emBhekJcQ0l/fn1A31xcSGR4c9z03cVFdUHf+/L+5M/AzP/j5+b810Zc9cjF8dFAX9j+/PL1RHR2VNlPXnBmZn3XwczAS3pkSdZBVFd0ZmVPWdHNX3hlStLf9/dWcUvT8fjn/NBIVfH08eX72sTw/ubp7+XCyv78++Hn2ETc38P/+MZ+YX5wdH56Z2JmZX1f0lJ6bWFldk11emBmYGRawfVTeXFb3cryzVtT2dv95OT0U0FY0vT65vHT1Mfl4+Pk8s7U18f088DTXV3I8vn8wdhaXsHw8FdYUUlezMPN1XV+fExf01h1dGFmSllXWElkbXJBTkB3dH9/UcnwxdnYQdH95+Hk5PbH++Lp7uLnyMD2+OT8/s5Q3fD89svAT3RbVMXWWEdxc9/x9NzccXpzQcbC9cBYT0LUyMTPRXh4fkhCTnBnenZb29TbXHdZUsHOxcVBSUBc8fL7+t7F9fzm4eLk8vXH9vP3wllbVtfJzvbbXdLY9/DK2U1zcnh9dl5fdHVxR9va9NtdWHBMTVdScXd1QlTEwcVX19PD9fz62tPUXdz1+Pr1wtnE9vH/9drBX0RW0dxeWk1e2sn2ycfBUFPD2tBPf31lf0xSxtLWV0TC8fT031J1fXRMRUN2cXFP0trEzPXC1sj//f730ltP0NzB9NrHRVnLzPTDxFN2U0VAVkl2cH5OUFzQ0F52RNRS3spdc31zSdHKx8xGR8Xby/H03EhKSndYW11NX8TF9vf/99bHwfP59PzVS9fU9ufn5MPY3cj4yP3DTEp5dk9FUHtwdXHXQU5HfnBwQVFMRntjZ2B9RFFUSn1yQ/T9//VQRXFA29jI105NT9fGzcze2dXb8/Dywl9GRd7K/fTeU0JDxv748MFfd0JWxcfST3R3Td3E1lxEdXdexdxfcGRnZHJPQEl1cn9HwvHC1VNIcXZPQXd8Z3twwP/x9sLD2/Dh7eH0V01Szcv3yMTAXFT0+vr32VFHX9HDzlhwe3p3TURBdkxDWcLB2Vp5ZGB3RFNRcXJ9f1/BzsjTUHZzcH9yeGZgbGRNX9dT0VxJRU1ZU3d+f3fAy8bY0d9Txf7k4ub3w0XRXERQRVp2TNXYxsvb3NfQxtPE0HV+eXdKRl1eWE5Z9/7l+/HNRUN2fUp1cHxyS0BFxN7SV1xRSE1ATHVwQVLb9/XM3N709fP/9MVZXV9RwPT000VHQV3F3tdBRkVHVlBEfWV7ZH5NXNrF0srP/+H5zNZfW3BEV15CcEtG1czM2vTa109G3Udwe3lwdtr3wPTWXkFb9cBQ1UVFdUb0XEJGd3J5R110UdFeTVD588jA3FdO2P3VzfLNz/zs4uXl8thAT95QXMXXSnTKylXdxtdFXs7M2dFWXlry5/X2+fTX1/L3zcHa3XVY2dRURUtlbX99en99TXJNw9zWWEt2fVTSV9bYz9LA4efl5uXz3NPZVFNYQUxzWN5HQVhHdUlUXFnRUFpb2/Xf3cfE2M3298XK9N3b9/T28PHSREx2Q316fX5L1sfG0N9Ef3VNUVtNUlxQwPzl9/38xcPC8cdT2VlIXFzY08XN1c308snUxEdI1tryys703Mzf9P7K+fbE8fH78c31UltEQkh+dHxhcEDT98P3xV5bTF1DX9Z1WdrK5fj6/MHH09zRWl1MS0d3SXF0QHZycnFfWlJHdUVMWcT18/bJ98n09/XO2vf0yvn799vVVUF2TUVeQXV1ckbew8bV11FQ2d/BxdTLyP7h4OLm+/LCyvLA2UB0dHRETVFYd35tYXl5dnJ2f2RzcVPc1sfU2PL0/vj4+vP55eTm+PbVVtFT0ddEcGZ5cHdATExzZHBKXsHZwFZU3M755Obk8vb09vfx/NjQ1NTK8/zZd355cXZneXJ9fGF7RdhTfXx2RFZRxMrFUEtazP7/xVdFSV7X2PXW1V1Ry//z3l1ITkRVzfTD3VdWwfL+/fHA0FLEztrBW3d/f0BTVdnRWUhIW1PUUU5DUMT298zYV1pGV1fSxcLfXtjxzfXFWnd+cH5+SHF5e3t2XlBAW3VzT0FZ395WX9Lx8uXn5uTy9//z/eXLVFnXV9TY0kx8fXdwc3R1emF+fnJPWF9xcXVe2c3xy8jx8+Ds7OP48cbdwNjD00l1dUhVUEF0en9+eGVkeWRlfXBS2/HI2d9Swcn0+/bMx9rP9vzz2tNGRlLXUVhCdHZ8cHF3dEh3S0ROXF1T3t/F8Pn69s739PT2zPP99clDQ9zTU1hBWXR9fHpwdU5Ad0BYRU9G1NHc3FBdWFJcWF1QV95dUE5B1NdVWlnVUUdfdElKdVtITFlYV19R0lTAwNzR0tnb0Nfbz8DE3sD3+fnJ2trf1FXQ9/3w8/H09sjJ2NbTUlbXXNZVWEB1TlJNRkp+d3x+fHx5fmdhY2dyTltBXlpBXcf19vHw8f//8vj8/Pv19PH09cTd3EJ2ZmBhbWdhb2Z1XFldxvDDzPD8+/34+vzk4OPm4e/g+/X3ztVFf2djbm5rFWhsZ2Rmf39/dmVMQ3FTWVHTU/T88//x5OD74+ns58fYT3x/eWZgeHFZ09vJx9zEyvHx9s5TdHdIRkdM1tRYx/T75/jKSWR7f3J9eHN5c1rQ98/QV0zV9Pf7/vbMU11E1cbb3FJX2sn7+fHdd31+fX17eHx9TEXUyv349v3l+/3w8M3VVd1SQlTeUVPd8fHaVll6YGd6Zmd+cnFlf1pU0NTaUN72zPb1xcDQwvXG8fHe2tj08PX31kt9f0B2eHR9ZWVyRlHM/fD18+X8+Pv98NzEyt7z/vXN08XAx9BMcn1lY2NiZGRhZXh3Qdzw98X19fHk4eLg+efk//nn7eDk5+bn5PH3wltxZ2Jra25ub2FxdUVSSUpJW15Y09JBd3xyT3Jf0d328vj5yMjJ1VtaQ0JKX1xMR1HX2tNdRHVxWlbTxNLe1VleUN3I9PPl7evi4OHw/vLx/8vJ99/b9vz7/vTLUFnVUN1FdnV6ZHZ9d012TktMxsRfTX9kZmFlZ2V3TkdNQ9PWxd/T2srO8+Xl5+Xy8cnz5+Hk/vLn5Pry2ldwYWNob2BgemdldnVb3cf0yPL65u3v7OPk+uX65OHk/frl//LXX3dhbW4VFBRqbm5mZWF7fHRd1NLe1N/bxcr09PHHzNrew8708fXdWnFMR3x4ZHlLWPX2wczV29rS5Ofl7ODk5Pzk+cLLz9rZWNvK3/3BRlRF3dh2SH17cX1GXnRIfGZwd1zM09PXV9xQ0PTHzPTFx8f35Prz3E1Dcnp8e353dktETV1Pd3R0RFlXwMTKyN/axvL7/uXl/P/x5eH799d0cHBxd0h0dnxwfHt0cH54ZHt8cE1YTHR2c09PREVCVlNR3c//+v3E1UdAT0ZcRFnUVNn0/+Hj4OLj7eLg5/bS0EdKQUtwcWRke3l8fURHcX13cHB8ZHJ+eVlF0MTN9vT2+uXl5efm+8r198DdXl1OcklNS0hKTUd+cHR9SElzZWNkeHt0TdFXRNTO9/D45OT2yvLKx8j19VdXxdfEzc3BT0NScX53SmVoFWNmZHp0WnN20d7C9//l+Pfk4Obi4eb8wvHKzfD299dI39Hf3UxaSXl2cXp5fmZiYHRAfn50WXF9R1FORdxWTElSwFNe2NtUQNH8zNvc0UVCRd/c3Pf59vbx8/P3+fPM9/L8/srO+vbO9ffPUkBUQ0BQ0dVOfXZ9Z3lhYGNlW0B0Q3ZOdk7A8fHx9ff+/OX59PbJy/naxMNR03JkZXxxZ29oFWhiY2ZlZXBxdlTZxN3Azs755uDn5Prl/Mzh6Oro+t5Wd1pOcnVKRk10Rl5FSHddQEvFx97c0VpZTETfwvfFyvLPxdxMfHV7c319RUDX8fbJzvL68vbxw9JGQFxLQl5Mdn9hZ21jcn16emltYm5hen5JX/X99Pjm5efn6JeXkJOU6ePm5/vs6Ob/9eTh88HWemNibW4UFm5oamlrY2dlcX1lfnp9dEXNwNZZU/T58Pj85+zr7uL7wdlTQ0xF3sv2wkB0dnRFUVdTUV1Ld15cU1fX2c7y+vz9//zxUFtYRtDWTXV0TFfY9/Hx997Ez8TKycLN2FXSXU5LTHRkZn5IWU5+Z20VbGd5fXFF1tHy+Prh4+vp7OqWl+rp7OH4+uT4+svdUUlGV3VyfmBpa2loaGJmeXl6fkRfVNPY01XdwMbQ09tfXEXE9sD0//Dx///39M719Mvb9/7+8fn99Mvw9cbAxd1fQE1PQVt1cnN0cHR3XcXHyl1MR3JOTXJ2cnVXVsDZXNLTU9nSw/TBzcXXxtjH9ff5zl/V3s7z3UBzZmBjYmFtYm1pY2VwTELW0F3D9/Ph5+Hu4uzv7eju6e7m5uDk+VR2fm5pFBcUFxdpahVub2Z4fnNZXdL3/uHn4+by+uTh7+Hm4Obs4v/4ydDQRnV2eHRNSHd9dk9MWVzR21Z1TnB2cWZgbG5ib2Z+ddzRc3NwQlBMVtFaxf3k6ezp6OPk5+Lp4uD4yc3WRtZCTUpnYWJhdHhtb2hrbWJ8fn5NcHTX0vvk//z1yfPw5+Hl7uPl5OXs5/T10VTCysTWcHphb2xuY3phZ2NjYWBnfmFlcnxKcUTM3N7QUcv+++bm5eLi5vv/+PDZ30p6cnRf0EDQXULDyfbx1MnVSVTczfFQ2sJQ2Mv67eTh/MXX0l/cdHNMRlNQVPfR0MHbzPP87efx+9vQV3dNSHp6YG16Z35naW4Ua2NvYWNpYWNgd0NU1lnG9ubqlJeW6peV7u7t7eLx8OTh4+H5+VdYX15bcn1DfGVhYHp7ZmZjZmFmeHFJX0VYQl3exPbK2cbJ/P/85frn/src2cf3z97Z3N1VR0l1T0pLTVtbUk9wfn1xQHVIRdfHx99dWVNSR1xGW1JR09rC/fP6+vvn5fz/8fz99vTeXdVGRnFzcXx7dH1+eWNnYG9nYXBSUc3M2/bw/+DolJXplJSV6+Ds5ML9/8PTT1JLd3Z3dnh4eGRpbmxob2NnZGFnZWZnZUxCcUlbUVlFV1l0VM709vrule3m4ePt7JTv5Pvm7e3m4OT02Mb02kVFcGZjbWRkYGV6fnJ6fn10xvXR1lzb3V/Ey8D29+X79Pz6ydBYzfz38fn22k9DXHVewtJ1ZnBacH19cGRiYHlgb2Z/e2R9UtDC8vrg4ePq7+mUlOrg5OX68PH9z8PeylxPcHNkaxcUampvZGFsbWRwSFX/5Pv8/OT6+uDh+uXk+MrRz/XFVUZHVVtTVHd9dUFGR1fEXkJ+ckVY2/PFUkdxcXN8c3hlYmx6eUNQQ3FwQFzT2vDy+/n+5/rn4OTk5/vk+f7lysJWS013SVJFc3tkfnx7dHV9YGtvYmNxQURLfk5fUdze2ttS1drHyvv6//Dn7O3g4+3t5vr8yvXIwV92fHx6YWNtbGsUamtsZ354ZmR8dU1e2sxUUlHP/uHo4+X4++T/ycvHUEZKQVpE1EJ3R0XZx1fa3UV0eXFeUN1UW1Ba0MnfyMHQ00d2QVf09MX29Pf4+Ofm5fn4/f34+spU1ER3d3J6YGloahYWFxUUF2tobmRxQ3R0XlRR0/Hg4eDr6ezv6evi+uf69cHJ+vDZ9fXYwcvzwlpFXkxxT9BVcXZMf35zRHVyc3F/ZGd2SnV3Rk5E1fbyzNvLwt/K/fPz+ub89fT58N5TV1JKdFRWSHdMTnN9RkB0dU5XXnVQWEJOR1FYWMP3xllOVN3Wxs7HwMvy/P3z89rUUtDSX1TC2tzGRHRzc3d4Z2BgemZkTU5PUMzCyvji7OX75+Hn5Ozv+/H65+f45/nQdnZPc2V7cHpgZHx6emVwcmZhf3tkeHNzfnl2d3VAVNFcTVlRQF3ex9zM+uXn4O/v4e3p7f72/fHZ187M2sDPy1p9dUh7ZHx2emB6d0t0TdxR0/fn5PHIzMHe2Pf65fP79sDE2s7C0VReQEHTyfPbU0p2cHZJdEt/Y2hpY2FySUVxZH52QVDSy9VOSlnC9PD/5fn75u3t7Ozh89Hd9fPKyPTXS3d3Q13TVVRHd0lNX0dG0MXfwv/m4ef10EhKWlhUXENJTUdXx/Hwy8LNwMD3zcLVQlH19v3yzd11cEh0ZGFpaxATFhRienNOTkbF9f7+8/r45+zulJGUlOng7+iVleLh9F1SfHxNdXV8Zndyf3NlfHtjeHBKWkxGR3dZV9HJw/VQfUpQU9DVVdVK18rI8Pzh4vD8++Xm8/TIV0BaVdFRRFtwbWxmYWFheXl9ZWV5fHdDUsvcx/385eTk5fr/+eTk+95X2kh9eHJPcn11W1ZTwvTdQVzdW3N0UNFAXd32/ff65PHP9OT31tnI31vfxsbSVsb08Pb099VwS0RcRUBSUEB3dnBweWR7ZGZgbGRgY2V+SUx12dtV1crwwlhHUklCWlbZXdrm4Ofl4uL2y/bI9dj1+f30+Pzk5fDk/9bc1VZPZ2BiaW5pbGBneHZ/emR5dl/G9vL68/Xz8v338eXww/b2yvLy9vTR10BKdWF4fG8Va2JkZXNIcHN1WNXf2fX0y1VH1tXWzPf++v/8w9PCy/XPwM33wMD39PTE3lRU1EdW3Ex8ZX13fU9WXlBdQlXTVvfP3lhxRFp0Xsfz+/3J9c7Dz/TNXUxwckxIUtRKWkRL1FzT8fdURXphZm17c39xZmFwe3lY0dhYR1LXV8b//vXA9/L7+Pvj5MLOyPjm4ezi/MLWR0xwdFdDf2djYWVyWFzR0FxeUdzbwdJBdnFI3PfD9PzR1V9X8Pb/5vFWXd3398r9+8NbdEtKc0ZGfWBubWFhZXx2emxgZ3NbUERPf2VKWvTn5u/i+P77/v/m5f7IXU5NVtXB9vLGW0xdVt/H0lZ1U8nf8/Dz+1N038P05uT3z0lT0VnJ/PjDWHJ5ZXpOUFtAdXdKQdz/8s5SeXt6Z0JJYW1qFG1gfcfYUVZMcdVcwv/MydTYx/T94OPh5+T5+vr+5PHVTk1M3c7/4fdbW0NQwvPk/MZWV1NU2Mz+y1dJfmV6fnJ4fWZmZWd8WtzH105dU1L0/PLyVdPCyPrh7unm98deSVfYUkZ8YGRkZn5ZVN5XdEx7d9jf0lh1W0Bd9fn991F3cHlZ9vTO3EPRw8n54OLh59tdQ1rLzM3J0tHH39zw/sHdc3h6clJdRUJ+ZXB10/vm5//d1cf07eD58sjUW0VNw8pV0XFmZGZ8ZWdnbW5rb2B9Q3dxYWx7TtfGx/PM3NXByPni4PvI2l3Tyff1/vP+//jk4+zj+crfUlzMwttcdHhkd9fBztFbcWFtZUBSQUxJSlDVxNjM9Pvxw9jC/cvEw9hZVd/SV9nZ2EFnbGNwTk5HQHF8cn922cTAXnN9f1pfd0FRVlPQ2tP8+f3IQE9GwM/B8vPaX1f0/eLu4/FZc31d1djYRnROR9/A9vvKXVLVUfXywMjFcE/Z39zx8MreeWd+dkVdWkVIc01RUtzO0UBxf3h0VlpITHRf9MTR2t5DeWFjZXBCXk1dWHdB09305ub92VnVx/f88vr99uXh+ubg+8RcQkzT0FRaWERPWtHFyfr23E5zZmZzX9ZU21BAQFje/sRSQ3F7eUVcVl5dUc3l7+jr58ZCd3N22dhXQ05+ZHhyS9FWcHtmY2lldE58cU5NUFfP//3EXdXD0ff7/sXSVVTY3Pnk9lVHcXx8RsTYwuXn5OTk7Oji+cnX1Vpaxt5HV1Bf2sT2+d9yYWhvY2NzRklBUkZW2vzg5cnWSXZwZH92e2VyeUtKRsVGY29uaGN6WNRJdV5G0fHl6ZX6z9vRVlfO8PHx4ePm4eDt4/XTVFBUXdRU1FpWxfLl7evv9HV+Z25qbWBgbWF5dUHT9/Fdd0FbS3BU39xV08j75++V6+TXdHZzeERAcHtnZHN9d9LcXnV7ZXB+S19eWNP15OT44+Dy1Ul3cH52Qnd1QnVWy/Pv6uH0UElBS1vBy8z08fnm5+7u5M1SWUx/ZXp8cH93VPfJ8eT301x3f3N3TlTeUFhcx83/7eTEXnB4ZmNhZ2RhZUrT0M7l+VN8eXxlZ2RySX903cL84OuV+tdYdn5/Zn1adVnx5O2UkZfj4eDm8dNbdnVzd9Px8+fh5MlHfX1gb2xif3Jnddze8uTg5PBU3FhNSUXBQkhEyPD+5fjA1U5xfWVkZXF2SV7PyPTl5/z01XVlbGFnZ3xAQ9vc2vT+8t9JfnVwZH9PW9De9+bu6pSU6OHHVF5/dlHQzNdbV/fl7eH09F51f2Z5dFhX1djO5ebi4PDHUUxlb2lgbWZ6YGVcxPf5/Of930xgY3Fhd1JJSsH88P/z88TVcGRgYGBneXhyUsrN8/P5//rY0NPC8d7y8P375/vn4OHl4PV3cnJPT0dA0cX39sDN9tvZXXp7Y2JnTV9dU83D1/D89fZSYGNtbmN/SFjc9f/44O3i7e3xWEd9dnR5fEhR0NfTxFlMdWVrbm5kcnx9cFhW283z/P/y3nxNVVPf2djL/fDm5/n6+vRafnVURFNGdcH5/efi7uPn5c5TREhwfHZwXcne1ML00d/bVUR3ZWNoaWxhc3dYz/fG9/z00EtKdHVzd0hwfHxIU15UzlFyZWVlTEBFV3RaXdTO9fPh/cBeTlHEwVPExsHI+ePolerg9lVNSUfRSFTRU11X2s7y88JLfHtmZmxrYmFtenXZyvD+yPXcUUFfWF9fVVZT3/Xx9PfYyddHcX12cHJOdU1QQkFb2dZUQHZ0ckpMWkVPU93F2Mnh5vnAdH17YGB4WlfB9v/95uvv7eP1zMBeWklKdEFd3ML87+Hl5vJVRXd+T05leXtxQ0bExNzDVUteW3F1dHx3cUbFVt7TX9BOdN70Xk5JeXFDX97b9cdVwNN0c3R6ckF7f03X8/z3z9DP/MrM/vfw8tVGVMjk5+ft4ef+zNrz9N/extBMdkhFU15HVk5zcdVcTnVMXt7Y0NhSRndxZ2ZnT0JJW1xHVVbf+Pzk8//IVFdQQHdZ0VZa2sj++PBcUnxiY2FyeHh/YWF5fEXL+Pbx9t3a9fP2+OX9+v72+O/o+sFQfnFZXtfAxl9HSVnQ/eTNxVN7flDQwvf3xdb0ydnK/vfWXHhrYmNtZWRgYXN2dkH//NfSWV/Gz9789dFAQkBKVvXx1FdHT3dyZH1KdHN1T3dBUMfd0tvK8+Tl4+jt5+T88OXh7OTPxcbf21Xf99t1S0pwS0Ld2VR1XVZfWkXb00p1WEZS3sbF13F3T9f09f/PTnF9YXhAUdLTQ0xVWcfC881c1dVETNLcRnBmZnRAU9vy+cNdQ0ZP3vb1wU5wRt7G/OTm5Pr58/X95/79zs/ByN70+vL1x8zH09749dNbTV5ZRNv79MnVQHd8fERaSktwd3d2TV1f1lVTSnRAXVZcQH5+ckpfzvXOwFl3SlLP8MLcQUFeXdj8+/PxzNxWV9rG28bZyvPw/Pn48PbN19LHyMHS0lZTQt395+f55fRPdHdKdn5zZGd4ck5T3FTOzFRWWF1TW9xRQUFXUFfD9PLN1El0RNnTVFNKdkNCW9zQ9cReTnRJW3ZxXURc3MTCx1zH1Et3cXN8dFLV1FJE3MH9/fL7yNjPxN5VWtZMf9TC0M/aw8rT1N9VVF1Od09LQNhdUlXb9M/b3ldQzNjS39jb21dXWUdRTnF3TnF8fHFKQNTM2MXf2cnXXV5FQ39/c3l0TlheVNXU9VB0d3x4ZGd/fEhExsrx8PXh5eTg5Pn3xMPfXV1V19BU0v3y3Ud5Z2ZtZXN7f05KWNVUyPH39//8+/X09MH0/P3n5PP798bSWmdmY2BkYWF+fHJCW8b1xV9YTnd4ZHx4eVpHXN/W9cPJ2PX8/t1xdHx7fXVJVFXMy/LI29HVVV3HyszNwlLT1tdV0szN29za1NvXXl9Z1crCwNnc1lfS1ddcUVTa11tf2NnS9vnw2UFDTGFne3FDUU5PRXVKf3J4fHRKcX15eHt5dElYzfj/8/Hz3tHQx/Dl5PDfzfzy9sTG39NMS1PXRktUXFfD8vr90F1HREF1S0BW1MZVUdVexvf/5Pr0XXRhYXhnYGF6dU1axMdRUVhPVdn09lt1QENaRdPGwthUVnRzc093S19bQHN+T9vOzsLLwffzx/X10MXCzvnm4+H7zVJKTEpOW9XC1kZEdUpQ193GwF5OdX19fH5wTkxfVNHE3VRRX13Z2dNfRFJYQlb19P33zMZbSENHW9bP8/zIysjLzdnd11hLS39kZ3hwdnRHwfnn4ObyzURxTFtKRdvfUFzT9/364eLmyVRd11tOSUF0cVnTUEl1fHp+RFHTWXdMdnNzdtPy8PD8z9XRz/HM+ePi4Pvw/vr+ydzRUEBwd0txcnxkYULe09JbdHN8cnlxd0xTw8/bzPrl+ePv7u7j5fbBw1TUycXNUENxdEl0eGZ5cHZXxFXRU8bb2fDy88rQQUdcVd/0+efk5fj75+Dm011DfX5nY2JjZ2RyUPX2/uXIwMnz9NzEy8Hf2dvO8fP9//bw9vTTcXB+Z2JsZ3FzfHJxc3hK2MfO/P3zyNbZ9P3+8P7zz/TNxlDO/Pv/+f/MxFVRX0JfS3VAfGR6fnx2W8/Iyvv7+vjJ3tLezszb2dPb8dhe19rLws/YW1rEwFpJcU5ZV9dCSnd2cXx4eXRUWXdDR1lX9+Hj4Pv30tjA29vE9/L8+/Pl5uT598zCxt/STXZJTEZc2cv/5f1XVd1GdnFJcXFycn5/Rl3Uz8j38sjW3Mr12kZS2Vff21x2TkZAUkVczMjFTXF5f310R05ASHFze31dwvz7++Hn8Pv65ebl9cLdUFpOTHl9T1NZRNTW0V1CTFjf/eHn+fbb3VTD8+X/zdddRElAdHN3dEJfRFjU0HZnYWV5d1pSWFRRfHZc3cbK//fRUUdMUt/CxNPX193P3kdXX1hX1lJ2f3Z2fnRTxMv65//3z1pPWFPNyvXZQnRASV7ezfXK88LH//jO3VZXWkBcS396ZG1ubGZkcHR3dXNlZX9IVd3O31tfXd3J8Pjn5eD7zcFX1EV9cHB9cHZ8eGRnenVa1tvDVkxDdELS/eT4+fn1xNv25frH1UZJSX56ZmBkZHl2S0FWQk1dWsLw/fvw8cBAcHZ/dE5NTXVdRXZxdEnVVlbX18DG38nSUcHE9MjF2l5NRnVf2NHJw1hZWHFwZXXE0cfeRHF9cHF2RUVe1FbX1UdEWlHb3Mb2yNZEd3N7cU93QUR1fnhAR0xF3lhe3tBQQt328eHh+uf7/fHJxVNFUkB3RFZASnBycVnLzdHwztNccnh4SUh1X9FXVVFX2Mb08870+vLO3VJfX9TVRNjeRkd3emVwX9JHSnBgY21sZ3t5e3BXVlHKy8L54Ovp6ZTu4eb2zc7E2cTxwl7V0XZORUdFR0dFcnt/ZXBP1cb2/PPw8vD0//77/vH23ltBT01ZWUZeXUBJdn1kZHJNTUDRUEpKdnh8c392Rkp9cEt1X/Pk5+Ht7OPn/vL2yMzDxtjZ29ZUV9fHwcnw9lBwd3RA1FfTzsnx/Pz8/P36+Pj8+/rI1dfVU99T0PDMV0d8Z2dkfX18dUp2c3x9cHN2SltYVsfBwsb15ODm7+ju4v7D3VRcTnR0fnRATEBAUPT19fn8/ffSVlhA19j1/v33ysDfzvL/9PL98vLN39DQV1dVUV/Y0llwZ351d1rfXFdedHRJcnBPdH56cnB1TVTJ5ebt7O7u4fvJ3VtSU19YW053f3h3QEZbR3FCQEpLSndFUdr2/uPu7+Hm4OD65Ob+98HX0FJBUtJO1nxLUGZ0T05G3dbRxs/VRnd4ZX19d052Q3ZD3MT/4u/v4OTk88xdcnB8e3x2Q0dIRdXRy/XIwl7WVlrWRkHQUdXW19DaxszR2fny+Pv//ttcRUzX3dDVRnZ8ZGV9ekDUWl9BWlBMdHxkfXJ9TtfJ9832+ubs4uLi4fzEXU5xc3Fzf319cnRCVlbd2dbR0VdPd0FGR1bDyvTy//n1zvXP8vnx8MjYU0N0cn19d3x/f3FxfErV0NFRXN1XQHN4e355c319cXZd0NnM/ODu6ZTq4vLS0sbe3NdLWkN2cXdIUVfX1EHdXE12fnVGTdzM9/r9/eX9/+f55fb08t1JfnJKSkp1fH94YWd/enxZ0FVNWFhxZWBmf3lzc3xHQ05W1cb45uDm5OD/009xdkdXUUReVURXxsTC+vrxw8LaX3ZyT0RUVdXTzNrdxcHUx+Hs4eDg89heUtXB9cbU1VJweXxyf09Hd35wfGBsaGoVY2ZkeHZOTV7WzP3i6e7s4/DK2dNXVdpcTk9dTEZMTUvVzsDa39RMT3llSsT0//L29vX38/L+4+T4+eXJ11h9eH93f39/fX98c3dY09BUWEdLeHlkZ2ZlZ2V5ck1wfU5AVfD45efl88/Z1t/IyMbP29BUXdHY0NFHSkhKdHhkY2NmZHFBxN/DyPb2/OHv6Ozt5+X5ysDa3dxUX1hPRkl+ZGd9dHB9fn1xZ2hqaGN4eUdGS9XQx/Pm7e3i7ung/MLM0kFHU0BIdUBKfH5KRFlfRkJNRn1+cn1zR9PE2dfC3tHD8vP28ffw/PDH0NLZ2Pfwz1ldVUh3SkF3cEFGS3J4YGgVa216dnB+QVJKWvfm5uzu7eHk5P/M3cLx8/XTXdrQVl9eSHFNdH1kemRgYX5HwM3CyMv4/+Xh5uTg4ub6/Pr0VUVMSkNKdHh4Z2d4cn5ndnRDSXVwfH95fU1VUFJX1933+OX/4e3g4+Dm//fx/fXy8szO29HYwdJHdlHdWNXWTXVzcUJbzMDW2N7Pysny8/Pk5f/6/vD5ysNWRVF1eHh+e3J5ZGVleWZmZGJob2ZlenJDQlnU8efg7+ju6urt6ezn5frz/cLcVEtGQXR2cnN3cXV1WFZSRVfdxsHSz/b3/uTl5frn4eTk5uDm+vvzzclUdXR6ZH5+cX1+cXZITXZ+eGVhYmZ6Znl/ZnxE1NfU9+f/+uLi7ezu7uHt4PLzy9LMxtxScnR/YGV6ZXh5enp20ENx09bA/+Ts7OiWlZWWlenu5PzPyMVlY2Nub2BjYm9tZmN4TnZwdn1ye3x8enRIRt318/3z+uX4+vz/5frz8PH30kJPdH1KW0VYWllBRlNQQkFOTkNa1l5ZXdHfy/fz+fvk4+7plZXq7u3m8sNfcH1wcnd/Z2NibGhqbGFjYm1jY2RlZnpNVdr47emVl+ru6evu4efk8srJXHB5f3lnYGJsbWd5ck9VWV7W1lNe3tfX2PT//ufn+Prk++Xk4ePj5vFdRHJjYmJgZXBwdk5MSHFwcX95ZGVnY2RkYGZxQ1jV18z45Obs6+rqlerp7eLlwl1R3VlIZWJibGhraWFnZ3h6eXR3fHBC2/Ln7O6VkJGWlpSU6e/t+8hVeW1rFWoVamoWam5oZnJ1Qk1ASkhERVhYX9v08+fl8vnLxsP1/fvm5v/8yl1Lc3REWdbfRF3TVFBQVlTf1VlZTHB8Z2NnfHdIR0HA8fLk4uqXlOvv7ObzxURLT3V+Zm0VFxAdEhMRFhcWFW5uaGtmdsX85OiXlJGX6pWVleqU6Ozn3kp3emJtaBdrampsbGZwR1Pd1t7O9cvA/uXk4+3v7+Hm/vnn5+Hn9tZccmJrFBVvYGdncn1/dnB9f31xTUREQUh4YGNjZn56fnROUNTZzPrj7+no65SV6e3h5/DI1kBwZW1oa25hZmRnZWR7YmB+XsHx4e2Vl5eXlZWUlJXr7OT52XRnYm1qFRQXERYWFhYXFWliYWVM0d3Hzvjl5ODn5Of7/fL19fzl+cNaTnB6ZGd/fHJ0fXdCREF0Slb09/T3yvHHUkhKQ03Xxsbx8v/64O3v7uPi7enu4PjPzdNLfmdsaBUXERARFGhvbGNgYGd9VMDy5eHv7+7i4OHk4+zs7eH+8MtdS3hnZGZgYmJoaWxiZ31MSdTI8eTt7eHg7+zs4uPi4+bm5vvn/83ZWHZ7ZGZmZHJ5ZXNLcn5hYmBncElfWEdKdnJ9cEpZX1XMx97Ayvnn4Obi6Ovo6+ni/dvYT39nYWJraG9tY3p8ck1PcEHV0srl4O3ulZSVlJSVleqV7ub+yF9JfGZvbW8UFRUWEh0QFhRvYXBRzeXi6uvq6Ojo7u/v5//58cTR10l2dnZ2d3RPTVvVUFJR1VDQyvXG8Pr6/ffP1kRPdUfT08HKy8HC+OT+9vD5/uXh5vvIwFJ2d35mY28Va2hrFGhsbmlvZHJOUcz19P3n5uHg4Ozo6Onp7+3n5PPbSH1xZWFiY21ra2lpYmBlRtnz4Onu7uuV6+7u6pTo6ezt4Pr498NYc3x8fn9wfWZlfHt6YWBgYGF7eXR2dlpZRExAR13f2d/H3dvNzdHW0FTE8PLk5//19vzF1trR0dnXXUZZ1dZWRU5S11ffz/Lyyvjn4+zu65WUkZGW6u/i5M1aS3lhbGgXFhASExIdExYUbmFwVNv1/Ofg5+fm5ubk5f/z98/b0nR4e3l9fk5KdnRIU190dFvT38Hy+eTk4efy0trB39zN8/TI9Pzk+vnh4+Dk5+Dm+fP+8tNPS3V2ZWVmYmgUahQWERRvbG16Tl1R3PHl+/jm7eLrlpTu5ObkwV5wdnZhbG5ubxVuYWFgZndDUvXk5uXn4u/j4OPv6eLh4u/i4efy3lJFXUlKSHF/ZmV6ZGZjZ35lZ3p0cXlwQUl1cUDfXVpDTEl0R1ZZWlpW1UBF1snI2/XPycPX2sTTVVNZd0lbTn1leHBweXNxRUhN0dDBzv7s6+qWkZaVlZfr4frwwFN7Zm1pFBQVFxAQERdoaGNleH9f9/z8/Prk+vr65+T+5f3QQnFwdHN+f2VgbWRzfn1IWFVX2PP6/v7l+vD1/OXh+MvHUHV11Mfd0MXNwMXL/vnx9vTA1lFYUl10cXx7Y2BkbxUVFBRqaGN+fXl6f3BM0/bh7eLs7Of75ub13NPVUUd2dXZ5ZmFkZ3p+dkd0S1JTVcH95Pj+/v75/f/m5/vk5vj3//P09srNx0V2dXV9Z3p4eXp6c0lyZmNhYmxnenZCQVtAT05b3cdX0NDbUFPNyt7VV15CQdLQwcbb2NVTUdvERXd0d3B00vD9wNrY3d32++Du75WWlJXq6uLzy8TdXUVfVkhmaRQVamxvYGFsb2JhZnBFTUtHXVTTyvL88/TB1kVGQ3V2ZGRkZ2R+Qkl/eXZEVsH+4+7m/ffAwcjK//ny9/T29c3DV1hf0MbO8vrn4uH75fL64+Dm+/7ywt3d3F1ybBUUEBMWF2pvbm1jZnFEwP374+zu6evo4/PRdHN+c0NATHd6Y21iZHx0dEhPdUXG++f4++fj7O2VlJaV7+zn//39/P3Z1ERLSE9eWnR9Z2RxSVfF9srERXdLTnZxSndwc3Z21NNYQHF/cXZF1thQdXVxc3Rcz/z38f/y8/3k5PHRSnBxcn92WkNMdHZMX1XF/fn9/+Ht65SXle/n+vn5+uTl987WQndPQEFLeGZnY2xgZmJsYGF4dlvN5eXl5Pvl5fn8/fbRTEt5e39+ZXt6Z2V2V83x8fL2w/Xy+fn8+PL09cHz5/vI9cPc0N7B/+b/98/HxPf++uT/zPfI2vXx2FtKZGBgYG1gbW5oampseEtc3dnB/Pz54+HIw95aRkpPVtJCdEtNS0hf0cfWdUBVVsTOwVXexcP08/Lg7Of7+OTm4efn5Pj198zJ//LGRFheU1bVwvv+ysXHXUlCdGVgbW5hbG5hZWRhZXFF19HE8vTD3tJXx/Hy9vfE0cPf28jXR052d3Z1Q1FSQ1pQX1jG8/7//uXh7OuXkZTv4Of68vfx/vfVRFhDSkFcWU59e3x5eHhkbWlpb2BkfEtdXERTV1HQ9PDbU0BPSn10QHBhY2d8dktG0s7FxPL5/vnm5/z3xcjN0t/cRHZ0TVPHzvf//vTN8P/75uzv4u3j7+3g5vvDUlpZTHF8ZHphFBYVahVobG1tZ3Pfzc745/jx9vLL3NTW3EZ5en16ZGdkZ2dnfURARF5ZTF7S28r55+Lj5OXm4+Hi7OLn+Pnn+cLAw9VIT19TUF9S29ddXsfM2tvXWHJnZ2VhbG5sahcVaWN4dkJcWkRQ1ltWVllNSEbawVBNRE1lZH93cXd3Q0dxcFpeQltdXVhY3P7m5+Tj4uX75uDm5uHg5PPO9sLS1VNAdUfU2NZESEhlY2B/cXlwQEFxeX53cXVZVkZCRNDVTHZ3S39hZHB8fHx1THZBV9Dc3szNX1LQy/Xax95YS3dAUlzF/+f65ODv4+Tm4Of9/ubj5/30ztZMdF9YTUl1cGdgYGBhYGNnYmliZUhHX8fLws30//HLy8BeSk5Bd2RgYG8UFG9nZHlxdXR3S9zJ8Ofg7eDm4uLg5ufn5PH1y8PN01dfW1ZU2s7JyvfLz/H45+f+8/DZR0ZFQnVxfGFsa2pvbmxmf0pMVsnIx93YwdBX3sXd1FlNcX15ZX55fnF2fn59cHBOUN/A28DI9PDl4uiVlejp6O/o6+zg5uHn88jcXE96Z3p5cHVLdXN8ZX5zdVxURUNOSkN1dUtIT3R1SnN/cn9hYmFle3t6eXhkenZeV9/DxNtSTFbbyfb85f789sLNw8XCwszz5OLg5f7y+fjy+ufm5uT4/f388vf29PfaUl9HSXF9fnplYWNjbWJkSURc28PEwMLF3ldfRkVNSXFlYG1ra2hvY2d+c3VxdkPTyPz65Obs7uzv7+3j5vv5/vz45/vx9/Tx9vD98MfQ1Nj19vz5987d1tJSXlpCTXR8fH5le397ZmRyQlPQ0lNOd3B2TkBbUVB1cHBzfX97eGRhYWZ4cHB3Tk9F1/Tz+Obi7unrlJeV6uvu4ubk5f/y8/DK31VXV1XV2fHMx8v2+fvxzMfNyNxcWkBd0VNEd3FKTUBCSXV3cH17enxxcmVmZmdlf3VAT3N+ckt1dFtX1t7Eyfb++vzxycb1+OHt7+nu7+Lj4umUleji5uHg4OXzw9pVQE1Z0dZHc318eGV4cnR0d09YV8f0wtBFSXJ6ZmZmZGVkZGBjYmxvbm9tYGR5dkJFW1NRx/X54Onq6pWVlero6Oju7+/v4+Tk5OT788rOwvb/+efn5uX74ODh5fPAUnV0dnx5Zm1oFxcXFW5sY2ZnYG9jZnl/fXJwd3RBQkdOf3phYXp3WlHVwc3C/OXg4uPj5OTj6ZWUl5To7OPg4+Pm+/799vfw9NBSWk1PS05BRkJxZWdjaWpuYWBmZGVlZXh4fnh6emRlZWRken9yd0JeVtze1tnAzsbI/vj5+P/9//n+//rn5+bk/vHw//j5+vv/y9rb3lNCcHxwcHd0SnFxfmRlZHhxSkp3c3llf3d0cnxyf3N9cUZCQltZWVlHUtVRVlbdUdXPy83SXFpQ08fx//3/+/L//PP+//j88/D3///3wtlfWlNZW09yZ2dke392TEBNSk5aQ0ld08TTWVlZQnRLR0B1R0RaXVJW0dLS28DO9PTGzMzCyPf39/fG0NbURXB9eHp8cnh8fHp8d0RdWVjQ0FLTwNjUX9TQVtPSwMHRRUVNSEfWxcbNx/TNyf/4+fj7//XEwsLAwMjD3l1d2cnGVl9TUnJ/fGVmbW1ibWd+SkV0cnVHSEpe2dZWU1ZST0JJdUBLdXV2Q0XX2dzdyPHx5eHg5+Hg4+f65ufk+/LyzsH19/nxwsDcXnZLW05wd3ByZGNjYm1obm5obGBme2RhZ2ZmZHNISU9LSXN+c0hAW15ZW1rdwPH5/P7k4Obh7OLj4+Hn+Pz5/fD02NVEV9rx+vnw9vf29/DzwNNFQHR4ZWFtaWpqFBRqaG1vaG5sbm9iYXt7en53dE9YXVXT28vJ9uTg6euV6uju6Oju7ODn5+X55eT68v398fTz+vr49s7YVkFERE1Icn97YWFnZ2RjYWFsb21hZ2FgYWdjbGNnZGFiZmFjZXdaXETQ2tzF/ePt7e/o6+/s6ejs4eHh5+Tk5eT/9/fA0tXcwNjb39XVRV/a0ER1SU9PU9zbwFJPRkN0cExJfXpnZXhkeEpyZnp1c3DRwfXwwsv39PT28vPw9vH+/PL4+vL09fTC8OX4+/n3yPTA39rbUFpGW1lAW1pNcn1/f3B0TU9MS31zfH5xQlNTWdbZwPb95f/z8vz//OXm5/72ws3XR15TR3RLV1xNXdbaVltdXl1fzfPK3lZU1URBXV1YdUNRQk3V11BJcXZyf3VSU0RMS19STlvSx83P9vj64e7qlenv7+Li7+7t5//w8cLSxs7HVlfF01DW3tNOf3lnY2NmZ2dgbGJjb25jY2BgenR3SVfHw9FR3NJR38v398bU28ffxsjIyvbk5uXh4+Dh5uTl/f7l5uf6++Xk+/H3ytPUVNnTRFJXUFtJdXJnZ3t+ZWR6eHphYGZmY2NmeWdkfXRJd3F2cHh0VPb98P77/v3k4OLh4unu4uyVle/j7e/g+uTn4eX5/vfa28/JxdLc0Vl1SE5MfXplZGJvbGNgbGxtY2xsbWJvbmxgZmF6c3JwdFpWWdTJ///64+Lk5Obh4uPg4uLh5Ofh+/z+++fl+/r58ffzzt3a3lFFTU11dXRKR0NJT0FRX0tISXZ8fH5jbWZhYWdnZGdkZHJJdk1Q0djT18PLzfT+5ff0/PDw/fz++Pn85Ofk5+Tn5uT4//bB0tVJe3NzfH54emVlZGV0SXNwfH5/fXJxc39zRndyRF9R1dnB9fXay/73zMjOzMHA2sffW13WRFDb09/Z3MTN293Mw9FTXl9TWFhCS3V3cXZ3RdFXVN3Y2MJXRVJYSnVIdkpPdHd2fXNKcXx00N3a9/P65OX55OTl5OT6++X998bBwPXHwfH02dvax9RdRUl0e2RkZGNjYmxib2ltYWFme35zdEpMcXNzdEl8eH9lendxd0RS18j98ufv7O/v6+vu7uzt4OX7+PfK8PHKxNnPz8DZwsTR3lREfWdhYGNiaW9ua25tYWR5enl9dkpfX0NPRFJGcU93fmRmeXxxdETRzsr2+vr55+Lj4O3u6O3j4uDh+P388/76+fj/8Pz99sjL91VGQXd/Z2Fjb2loaGlpbGxsbWNiY2Nua2xjbmJhZXpkf05YQUBZ3Mr0/eHg5+bi4ufk7Ozh4OPj5fjl+PPw8fD1zfTK98La11lHS01DTkJIdnVKTdDb095VWkxGXF9SQ3RyemBvb21tbW1gYGNlfXB0TkNcVM3z+fr55Pr5+uTh4+Hm+Pv6+Obg5vr4+PL18ffM31RdTU13fXB2c3FxSUhMWUt9e35yemRleGRlZ2JjY2Nkc3J2WdHN9//6+v/9+/r2yPbxz8LAwdzc0dnIzNra11tcV9rdXE1GQXd2TFZfXVpDQFfTzf358vD28//y/M1YWldadE1bWlxdTH91Q1zA8/Dx/Pz29Pv/987O9MHZ3NPExNVZTnVOVNdQUkRBR1pT1k53cn9NS391SHd1d05BdEtbTUdPTkdARkd1fHp7dkxGWVbd2sL85OPv7u7t7+/p6O/s7OH48vDy9Mbd3VRXVNVTWkpKcXtkZ39lYGdkYG9uYmBneHRGU9RX09lX19xRXUVX31tGUV9BTltcUN7F8eXl5Obg7eLu6ezt7env4OHg5PPPysjPyPT8/PD09cvM0t1adHF7fH5mZGRjaWlsb2JuY2R7YG5ibWxiemdmZXhxSHF0QlFVwvHx+OXg4+/u6urq6uqV7uLm4eDk5Pr921bGxsfEw8bdV1BQW05NR0hwfXBOUkdHXkZNXlJdUVHdUEx0d3RxeHx5ZGBjZ352dV3exdj38//8++X65uLs7OLh4f398fH3wvXP9/D1yPXM29rJydvBws3M0FNWXllbUERBTkxbQXBwR0t9eXt6eHtzc3x4eX95f09bU9fa9vL99vjk+/rl+v785ebm5+Tl9tZCRF9VXVdfT3V7fHJ1T3R0dXN3SNXBwsfRUlxR28jD8PP75fzy8vD3zd5WXVNe1N/a3N/S2sbMyPf2zv3z9v/3zcdVRU5HU9RXRUxLQ0RcU1tLcXplZGd6ckpxeWdkZHJKRllQSn15dEBaRF/UXlNd1cTLyNnd19ffxMP1/OT48vz55+bi6e7s7eX89f32xt7U3NZNcnplZ2BmY2NuFBQXERcVaWxjeX55eWVwTFpZRdbRVNrZyvzz9s7b29DAzPL49cHewsj08vvn4Ofh4eHo6Ons5/71yfby5uf58Nhcd3dPQ3R5Z2FpFBUVFRcXFRVqaGlibWlrFBcXamlsY2Zydnl+dERZXtr08/z44OPk5OHt7uiXkZaXlZTq7+3v4f79+fP75fz+z1NNQERCREN5ZGNuaWhobGJsamlsYWVnZWdnYGJnZXlLWlZAdnB2SUXF8PPI9//w5efk5uXm5+bl5O3u7eDk5Prx+uf68ff7+vz9/fDKwddYcWV4fXlmZmBgb29gYmxvYmBgYWZ7ZG1nZWdhelzQRU5EUVNR9fHEX1NR3M3y4ePm5+Pi5uXg7e/l9v/yyMjLydRBRVLd1N329NFHQHRnYGR7emNhfHt8fXBxent2XVtNx/bDUVNU2dPJ/fPxzP3l+PL7+vTc0N7M9vDk4eXw9fTSWFzaw1xAUF5LQkRYS0tWUd3ewvzz3VJFdXpjbWNib29jbW9ubG4Va2xhZmdP1tHUxfTz8/vg4+Pg7enp7unp7ef+8PH08fj79NvTXnF6e396ZmV5emVzdHB9cHRITUTe9cRHTHRkYm5ob25uY3Nxdl5QQUHXwfbx8eHp4eTs6e3s6pWV6uuVl5SUl+vh/vXN21VU0dNSQENxeGRnf3xlZ3BZd0tBdH18SVt0en51fWdnZ24XExMQExAWFW5keXdLSEfE8/Tx5uzi4O7u7OnqkJCQkJCSkJCSkevi+vTTSU5aSHl+fntlZnhxcHN8f3l5cEd2f3JO0kJwfXd3d3F+eGFiYm1iYWNhZn1WVlpFUcn9/Ofg4+zq6pXq6JWXkZCTkJGRlpfo5/HC1HZ+eWV6ZmVwcnl/dEFDV8DZX1jF2k16YWZgYm1sb25rb21vaWJgYGF6dnNyTMXKzcXNz8nx5Obt6e/r6uvo6O/s65Tr7eTl4OXO1ERyeXt5e39+eH59ZXtyfnNCUFx1fndPS3J+ZGZ6TllWxd7f2sTYzMXW08zx9M3D8fn4//v98PHk4+3u7u3t5OXm/PT75vn99/Xw8dFEdH56e2Rne3B0cXR+e2VkYXtkZn5mbWNmaRVsYGN+dkBQ2Mzy/v3k5Pj4/PP3wPf75+Hm5+bh4uDu6+3u7+D48crB9MLUXERCRVnUU3RweGJvaG5jZ3tlfHtke3x7e31yfXl8dEFwcFbRWlTc9Pjg7pWV6e/v7ebk/fz75OLp7+Ls7+Pj4eb78fTIxldYXlZYQE11Q0NdUEV0eWVhaRVqaGtuYmNsbm1ob2FgbhUVaGxkcU1R28/2+Obt7+zt7+Pn5+Tk+ufh4OPi7+qV7+iV7efB3t3VVdfYV9/RUFVX11l2e2ZnZm9tYG1tYmZlZmF4f2ZzQVxzYGdmYWFyQdr08frk5eT+//v8/P/l5Ofi4u7p6Ojp6+Lpl5Ti+P7dWnVPWdPb3sHCyMRdREVxZG1ua2luahVqFRRqaxRrYXlgaGhpa2hsYGRlSN3N8//+/fbPysPEy/jn5uHs7+jq6OzqkZbv+PrxxFhNTnVITVzc28VQUNdddn9lZGRjYGV6enF2emZzWdJ/bGdvaRRuZX94dFbA9PT1/vj/8v7//fD55Pnk7ejq6eyXl5Tjx9tacX58cUlxcHdBW1NQWtRUQ3BxSXZ/eWdib2BhZmlpZWZjahYWFhYWaWZme09Uwv/7/vLw8vX0zfb99fH75OHt4u3j7Ons6OfOwVB0eXN2c3dxTVhOQ1nTUnR5eGRgY2BleXh1S3xhZnR0dnlgbmtob2Bkf0leVc/z5+Hj7+7m8/3k5+bg7OLi4u7s7ZXo7uH0yNJYX0JET3JleXdaW0RFSmVgZ2dhY29vb2lvb2NhYGdmbGoUFBQXFWtoa2x6cFzR8f//4ePh5OHj6e/m4+zs7u7r4+3h4Oz/+fz0wFbR1khKSkFRR0tKRUN1c3F7YGBnemVkeHJ2enlzf3hnZWRgbm1kZHp+cXd1WfT95u7oleroleqVl5aXlOvu6e/v7+ni5vr+9tnL98zA1FHTUVZV1VFOfGdmY2BnYGJoFRUVFWlvbmJvYmJtbW1gZmZhZ3N2RdnPzPHm4eDi7O3qlOrr7eHg7+Dh4Pv75ODv7uzj4+H+8fLx9vL2yMnFUl1ZTnZ4ZGdkZ2V+ZGVlfnp7ZGZkeWVgZ2FjZHl9SkzUzvnh6ZTr6evrlZSVlJSX6e/t4eHi7ODk5f7z8/Lk4fj29vT39fb98cJEdXZ7enJ5ZWNtb2liY2V/eWVmYGxvaW9iaxRpY2ZzUtLF9Pzk4ujqlJaU6+jo7OLg4OXx8ufk/vjk5PPIxtzO9vL75fPJ9/TMyt5RR39leWR5dk9PcnpgZX1KQ0xKcnh6ZGNgen9wcFrH9uDplJeV6enqlZWVle7t4fvMyv/x9s3R3cD08vz2zsHWV9ba29nRW0N1fHt/e2diaBQVbmxjbG1ibWJgZH53dnl8cnBKRNXP9fTI8Ofg6JWXl5Xv4+T+8/P0xN7ax8zz+OX//sr3/fP//PP02FtOdU53c317fX14eXt/fmRjamhsYGRlfH5le35/cXdORl/e9Pvh7Ojp7+Lh4+iUlJXq7+Xwx9/C29/a0M/y++Hh4OT0UkpKWdTW019zZ2FiYmNvbm1sbm9mY21vahcQExFpYmZydHthZnxxTEfX9/Ln7eqVlZXi/cDQxPP4+vL0zMXS28vw/OXk5+Pi4OXywVN8YWR9dUtdUUdyZGRnZmBgZmJsZHh5ZGNtaBYRFxVsZXl3dXRN3fzm4Ozv6peQkpCX6+H2UkZU0Mnx8v778v345uT5/fTMzf/+zlJJe2kXF2tvYGd7eWVuaGlrFRcXFRUVb2JsbmoXExIWa2Nlc1/K/Pb74+Pg4ODj5ufh+/HGUHV8cl7b+ObslJeU6O7h+MrcU19BXNxHd316YGlvZHJHTEldQ3dye2RjbW9sbWd3S3hnZm1sbWV01fTx5+/v6eju7Ob78/L75ODh/vHM2tRV2/bn4+Ps7eTk999GeWBuFWpuZmdiY2xvFRRvZnp6cnRyZGdnYmhub25gf0PVW09PdHRzQt3P/frh4+Hn+P3J29jT38T54ODn+P/n5fb+4e3v7ODl9VRFcGdsaGlobmRxfXl7eHB/fkhHdXF1dXRyc3V9ZWR/SFnP5eHg5Pn7//fx5eT+5Ofm4OTk5P745ebn5ezo6ezn5Of8z8Dy9cnP11BbdnpiFRcRFxYUb21gbm9iY2BgZnthZHl4cHN2dXZ2dF/ayeTj7+/j5vj13FBWW0PQwfb+5OHh+ufj7+nplZWV6e3m/cjZVNBU0d/e3dbTUnF4ZWFhYmJneH15ZWFtY2ZkeXZ3Tl3W383A19DD9vng6ZSU6eLg+v/5/fD29/b65OXg7ezi7O/v6enu7+Tw9NBMdnphYmBjYWV7fXZzeWdjbGxtb21iaWxgY2Flf3FMU9/38fz+/v/9/fLx9fH9/PDD8vDJ8/n45+Hm4+Pt7+np7OPj4efk5Pr4zsXb1VpLQU13fnFJRV9OdEp0cnx5cnxzentlZXNxdkJVwfL94eDh4Ofn5Pn+8M/MyPn68/T3/fHz+uDv7+7q6e/u7eLl//bBxN/e3Vp2eHpnYWdmYWZnfndlZ2ZmYWBgY2FnZHxxcHJwQFDTwMD08/f55fP29cHTUNZTXNDK8/3w9v3+5OPt7e/v7+ns4eT89VdHX15BXVDR31NHTnZ2Sn19TltERHVzc3x6e3F2c3RJRNbfwsnOy/Tx98nL8f3+/PP99sva0N/Azcrz9/H+5fj5/Pn9zvT09dvU1l13e2dmY29tZ2dke3lkb2hobGxiYWZnZmV+ZXpmYWdkeUzfx9jB9MVcWEdZ1NfK9srJ9/DIw8XHxMfK5eT6+fv+wFZcV9FRVMXH1FZVUEdxf39lenBCTHB8c31nYGZ4fHl7cntlfXB9ZWVydHRGy/DNycj3ztHezM3MzcjD287I9vb38vz99PL/8PbAx9xQTk9PSUp8cnx/fHx6ent7YWJvbWFtYmBib25sZmNkZXl4Z2dne35ydUh3cXFEU1PQ1lFZR0VX1cD0///w/ufh4eTm+8rG1tLU0dvHx9vY19HK98/XXl3UUn1lcUZOc2R4dExIcHpnZHpmYWR2UER1SdrzztjNz/TwzcPexM3F1kFBVlLZzvng4fr85Of4/vbdw8L3x9zC2dBYQUJ1cEtMQF90f2VkYGJnZ2FnZmRmYWRkZ2VnZGd4RVTXUlpYU1h2dFhcRE5YXFBV1sbG9fH39P/h4uDm5ufn8vD5+vrl5Pv98vL899nf1FhDXdLe3tBcRl5ITUp0Q0l2cEhEW1FHQVRSVcD08/b2w9zDw9BTXdHd0l1RzfXz+/r4+OXk4e3i5uf89vLJzd7SwFRQW0FCdnVJdXV2cUtBWXRJTXBye2V/ZWd5f39/cktLdU9NQk9ZUdPFV9nSWV9TU9ZQXd7YwcbJ8fH75OXm5Ofg4OPt7u3g5uT7+/zw8sve3N3b28DL9cHC9vHLwt9TXk90d0BWWlhcQ0dT0cfM9/TJycPAwdRXUFhEd3FIWsXJ9vzx8/Dz8v398fL38/vx8P7zyNDX3tVdXFxEWFRTXNTTWEhLSnRxdX1/e2ZnYWBgY2Z6eXh+d0pc09LRXFpDcUlNS0tOWl1e0Pfz5eDs7O+VlJeRlpaWl5eUlerv7eD/y95XV9/HzM/P9vf19sre0lNZXkt0c3NxeWZjYmJsY2ZkeXp2dXJzcn97f3N0R9DPyPfx8/z+++bh5/j6+ubg4u/h+vj+8/bz8/z4/fz9ztrRX0ZKfXtmeH9+f3tmY21vaWhtYGVnZX55fXdKc35le3NKcEtPdHVY0dbfy/7m7O7qlZWXkJCRl5eXlJTr6eP5y87b0dTS0drb3Mn1zMHMV1hJS3B4ZWBibxUWFhcWFhVrbG9tZ2FgZGRnZGVxWlfB9vHx9fH5/vL38/Lz//vl+uTm+P/x9vL++OXm5eX78vPJxsZdTHZ5e3plZWZvaxUVFWpobWR7fnx/fXx5c3x5eH9/eXp7fnN8fnNPRl3C++Dm4+/q6+7q6e3i4eT/wMXcWXJxdXx7cEJbQkNeUFxYUllOd3RxeWZgZm4XERYUFxVjenB8fnl5fXdPQV9SVtLHzvf3zN/S2M708fPy/crb39vf2NPX1tj08vb3+f3AXdfa2lFeVdvVXkJzcnNze2BgZ3p7Z3p3dVhdXFbQwcLc1FxbWU93cXN/fHBweH13TkfW9v3x/vr65Pr/w9vXdH9lZGNubGxgZ2R+dnRJVs738P76+fHD1kZzZWFsbmhgZ2JiZn93TkRFX1LI5ePt5uT48fb2yNPR3FRe08/G08DaVd3Yxff//vr8+//8887M2sXaxPX1xMHC1FNeXV1CQUNzeH14cn13WkFeVcD3ztLe31RTWFpDcXR2d2Rne2Z4fUhbR1bC9vbz//PKy8HF31JOTnd8eHx9cXR2cXFD2vf+5uT5+/v//PTeVERHSn96fn9wSEt1dXFOw/Ly/+Xg4uDj4OXz9cvC39ve19zZxNrawc3w/+ft6Orq6+js4eDn/PDxzcXdX1JCSUJBRV5ETkdZWlhGQnVxTU9AWlhYSHR8fXZ9Z2d6eX5/eHlyf3J2dnde1d/x//rm5fnl/crI8vXc1l1JfXx6ZX9xRcTx8OTs7unr6O7g+vz0zdBcSX9le319cXdLRkxW9fDl5uDi7+/j7OLj5vr/9s3CxNfX0tLV2sD1/eTk5ubh4eLs4/rwzdnUXlNCcX5hZnl/eWRkZGFne2ZnZGZhZmV7fnF3dkJKdEJJTU9PUVvW1Fvd3Nnb0FZU2cn85Pr//vH9/PL+8/TC2tdTTXZ5Z2Rke392QkTdwPzn+/vk5eTl5fDTUE12f39zcXZC0trN9PDn4+Pulerv7O3t7OPn8N5UWERIW15FX0JTx8bH9f39+f/999/TUnVwemBva2oUFxcVbm1jZnpnYGZ6dEJBV1xPSFxQW1BQVV1PTl5Q18LY2s/D8fL2+eX7+uXn5+Pm5eT+8vzwzdvQUk93fXpneHpgY2V9StTAzvT/+Pjg4u3v4eT9y9hQT0JLd3Fwdk5FXVTa9Pzn4+7p6Ovp6Ozn/M5SSmVgZ2FgbWxsbW9vZntAV1De3tLSXEVOeGdgbGxvbG9iYGNgYWFneHxxdEdcWNDA3NHRxMjOy8/d11JE1fXx9/TOwdrDwM785P///f/2wcHC9fH3zsLc1FJY1tBZQklJRVxSRltU1sz38fP39vn5/fj32FVUQndZUEhEVVzT2NnY2sXd38H3ysjb0tRPdnxhYmNvaW5uaxUUF2hjYXtH2s/w+fH19MHVUFZfcGFmY2Z6YWdnZmR7TVLAwdn29fL7zPTxwMfZxsZQXU9OSUhCV1DV3cL28/D08PL44Obk4fny8Pb98c/a38HF1lxbdHx7ZXp/e3pzTdz39/D35+D55OD+yt9ESHFlYWNvbmhuY2ZhZGV+RFFPRNDQwMjE1ll1cHB9ZGVkY21ibWZlZXh8clL3/fn7+OXl/vDK31deUllOc3JlYHtxc3dBU1xZ0cLE3sTA9PP2yszH0tzPxd3T0NTG/+Xh5ubh5+Lp6Ojp4+Xl5fHeUUVNSUhYWEfU19Tb31BFT3R2TUdQXU52cU/UQHB6Z2RmZmFjbGgVam1jYmZ8Qdn1/+Xn4eX/4ebw9dxZWnR8eGdkZGZ5TEVW0sf25ebj7+7v4+Lv4/rK0UZwZGFgYWNgZ3BPRFNR2vH75OPv6ezh4+Pm+vb3/fLKw8rG3N/W1snx8PXx+P/85OiWkers7unt+/ddSURJemxqFBVob29oFGpjeXFyc3RNRVZZdXR1TEpxfXh8c31we2V/cUt1Rdb3//rn5Ofg4ODj4fj3wcHXQHR8fHF9cUFTVl/TzvH/8/3l5uDm+v3A29RZWEFYWUlcUlPSzfDz+OTg7uvu6eng5PL1xVVSTXN3TEFGWNLA8f7l4eLi4OLg5uT/98/RW3hmZ2FoFRQWFxcREBdraW1hY35NWlTG9srNwNrcXNVGdU1+Z3t7eH9zTEdb08rx5Obh7O7s4+7s5vry8cLfUXNycXl7ZGd+SEBNVMH//+Xt7O/p6O7t4ODn8vbEUl5DTl5BTEZQXlvQxv3/+uTk+Ofg4OH78sveUVtLcXJ4ZGFmZGRkeX1KQ0Jc0VlOUlRTTnNxent5ZmJsZmdhZXxzcXF1TkFOQ1LVUdP9/cbCzMTTwcNVVVFcQEta0cfF2sjw5Pjn4eTk5eXzycPa2N1VUllZ1ddU3Njby8z35OXl4eHk++Tl+/v58MrD3FFYTHV0Sk9b9PLy8v/98OXg5/79xF9DS3xmbW4VFxcRERVqam5vaGlsZHNMw/b2/Pj4/v/z9cPQRUJ8e2dhYWBheXJxSkxS0Nr29cLJw8bY0sryzsfG0FRHRF90cXJ/dl5NR9zC9Pvh4OiXlOjo6ePm+v/TVF1LSkZfT3Z3THVH097H8fP9+/rn4ePi4+b7yNFWWExweWBtbG1lf358cnt6e35wc39kbG9uaGhvbW9iZGd5d3V2dnZ/eXFPSUBU0N3M8PP1/vvz9sXf0d/RTEp2cnNaV9bZ29/Zxc/ZVF91dkpGXNnAw/Xx8/fy+fn4+/z9//38+Obm5uHh5OTk/vTYQnJ8cXZ3S05NXtHc097LwPXw8/HI3FXQWk91Tkp7Z2Nsb29vaxVoaG5tYGRxUtPDyPX08fn3xdRNcXtnZ2NhYGNne3FEV1dUWVLU3fXw9sj19/f9+Pj6+vTJy8LZXEJIcHlnZ3FQUcD39fzl5uHg7OLn5fr78vj7/ffE1VHVVF5DSXV1U8HG8ufn4ePj4e3t4/r0zVx2eWdnZ2dgYmxsbWd4fHJzZGNmZH94ZX5wd0pVXk9TUFtbVtR1emRzW8bFX0JJU8r+5fXcXVDd1lR1eXNEUlJNf2V1VNZVU1Bc0d7Zx9ZV2sL95+Hs7+zs7eDg5uT49c3L9fL7//fOzdnUV1LW2dLA28LAxMzIzcv0xczw9Pbx9szA9MfA8c3F2tlRRXRlYW1pahUUFhYUFWtpYmdLw8jI9fX09Nr1/N1SXEhbW3V1dVtcQkxdVFPS3sjz8/P39/bNxPb+9vf03NPVQHFydEt+eHJ8ckFR2PT19/z45uDt65Tq6+volJTp5v/1wVfV3lFeVdDZzcnL3sjKyffy5+Ph5Pj299pFWVJCT3ZzcX5lZWFtYmxobGV9cENHcEZTRdLHV09JcXh+eGVnZmRnZUvR11fcxMDbz/TP9vfw+/nK0VdBdnZxSEfR2NfQ0tra3NTFz8zIyvb9+/r4/PfKwcHz+v7/8/Dz8/TIwtZcXNvGwPf9///k5Ofh4fr++//3ysn38M3SUdTURUJbRHR5ZWd7dnxhYm9pbm9tYGZkZHh0Q1Pe29ndVlHb9cjbUV1EX1BJTVtbTHZxcnZMXNdRU1NS0sXY28PHVNTfy/H39sTTXHRISkhOdnRC3M/38fb/+ufg7+ro6e/s4ub8ztNRS3Zzf3J3dktaTUddVd7C8ufh4eHh7O7h5Pr+8fTKxFBKeWFgYG9ubm9sbW1tYmdgYmNkcUtDdnB1c3BKTkp0d0pGR11dTkVRUVbXwdvFwcL3zd5RXEdKQUFJcnNHRVxZSHRxd0xPWd7TUkdUyf3w/P/7+/z/+uHj4eT//PHD3lfV11lbVNnB9/Dx8vX29djAxFRWRURcXEFFQUhPRNDF3d7SUUd0QUpLdHx+emRgYG1hYGFke3Z1R15RVNlXVN9VV1tLd3Z/ZWR6fWRmeHB1X9zS29DUzcLN8PbNxNTfxNhR11l9cnJ3QEx0SHZMWlXQ1t/Y9PHk5uXl5+Dn+uTk+PTHxtZXXtTZ1N3f1tZXUdLW3PTz9fDk4+Pg5uT+ysrM1l1Kc3psaBUUFhYXFBUVbGFnck5DXlPE9PH29/X09t/QV1DVQUt2dU1PTFhfVlbH8fTG09NRR3ZycXF2cXVMQEZBX9PUV1dQ2Mr08/n2y8fTwczbwMj0//r8/Pv65fDz+crNwNnf28HFxt/W1tDFxMP28v/5+v3+5eX48vj88cNVWVhdRlhKcXZ1d3Z+YGZnZmRnYGZmY2NjYGdlZH1xSlbO8vDz8cj38v3y8v328fTN3dLdVkZDUl1Rx8n19vf3yMvA2tbSWn9xcn52c3B2d3VC2/Dz9vH4+uTj7emVlenj5fDw8/XQXFBHRkBIT0ha1tfSzfb95eXl5/rw//n38PbI9/D3x9dSXHV8f3l6YGJtbG1iYGR4fHJIRl7d2MbI9PbH11BUVlFDcHthbWZlfEpLRNTFxcn09v39+ufm4+b49MLfX0ZBS3V0dUtaV9TA9fz98vH19fXK21bUV1Ld3sz3zcbB98r19/L+9cj3/f3wz8PY19v0ycjBVN3d2sTSV1fd0d7S1NFXUVFbcWZiYmJjYGZ7Z2RmenNzT31/Qkxc1tdSXVxf18z32NzQ3cDP9szXwVF1VtBWT3Z2e3t5c3dOTUxd3MTQ0cHPyvDM9fb1wfT8xVRWdUtdxtvSyPH4+uPp7uL4//v898XSTX5hbm1kZ2Z+T9/Py/H//uTg4+/s4ODh+MbXW3VJdHB7YW0VFxRoaW9nZGd4cnR1SXZ5c31PVd3XX1JWVVzZy97WXEFeWlVVXFpKdHBb3NLaxtjB9Mj28sjE10RCT3RxeGFiYWdnfXVHXdPZ08XO8//k4+Pi6eju7OP/wd1RRUhaXkVCXF5Rwfby8srI9M7dU19Zdnh7e3tzQ09OWd3G9PPyycTS3V91dHxkY2Jgb2toa2xpa2JkfEpT3Mr38uTn5Pr9xFRXTHxxT0h0QEZCUlTW0sbJzsHA9cre0EVJXEdDU9JVV8fDwcnJ397M31dZ1tdGRFDZ2MbMyvH+8/b9/f38+fn7+Pz1yPf121fR11Jf0dja9/35/ufg4eDg5PPN315OfWNqFxETEBYUa25hZHJd3sz0/fP19PDzysXF11FXQ0NFTHl6eXJxSFLWzfPy9vTy8cr1wdRdW3VyTEJxcHF1TVPE8/758cXO/ffdUNfR1FXfyvfx/+Th4ODm4efwwNnMx11IcndLcnt+TNVXVNzQ2/Hw+ODv7uDl5Pv4//zwxthfWNVZdUpxfn98cHB4emRhZGdsaxVqa2xmfXVWwfT/++Lv7+/t5uX/9NrTUk91f2ZgYGFkeUtdWV3X2Mf0/v7//fTLw8HRR0lycnx9fnt3cHbT8/rm4uzv7eLt5/v58/TAxFfUxdrb2FRT0NvHy8LExFRU1tvPzdrVUFHRzMjKwMfJyPTO2FBXUEJAQ3RKc3tkeHJyfX13Sk9AW9fezs7L995eT3RwfX96e3l/SV3T09HH9/rh4u3n+/3a1lNLfGdgYGd7f3dJQ3RIV8b09PDz9vLz/vz/8cTF2ddTX13Vxd7e2sj5/f7k+/n/8M7GwNtQQU1KQlhcVFXU38v/+fv68vP0wttaS35mY2JtbGNjbGluY2VycXRWwsHD8/z45OX6/v/z9crCzsXX0V9YXUdZTXBxcH54f2VlZH59dkNBW9TS28r8+ubg5fzJwNpZdHByeGRkeXNxdUVT1cn+4ePi7+zm5uTw9cNXW1x/ZmBjZH59cHFB0c/3/ODg7ePh4fL68cn03NRHdn5KdGVgbGF6e3hkY21tY2FnZGFmenF1fXZKQlb0//P9++Hg5PLE9fL59VhYXd1Xc3BaXXV8cnZJd312dUJDdHRKSHNyTlhZXd3a2NPA8frn5Pjz9c7G9/z0zcfVUV1RWElCQ3VCVNvF3sLM2NnVXlBYTkFZWFtdX1lFXlNe08nOzMDA29NWUUdKdnllZ2FmZ2VlZX55eXZaXdPF2sXcwvD3zsLaVltBdkpIdnxlfEpeVN3e2cnLzfT8/fH99s3298rdV0d2d3RJSHFPS3xwcXZNTE1aUdfH9vvk+ufk+Pn+/cnLyM7L09/YUklwd3Vyc0lPTllY0M32//3y8vX3ysbBw1Z3dXZzeWdmYWBmYWNgeH1wQF/Q3tDR2MfA9vL7+P76/Pf0y8DdRFtGTUFNSUtLTXR/fnJ8eHh3WlTR1NPawvP5+fr65uf75eX8y8zCw8DP29dTWEVaX1hW1NZU08zG0tXR3NzJ9c3AwN/T3VdET0pIQV7V3c70z8fbxtrEyvf2ysrBUVxbX0VOdXNyfn97fn9lZmBgen5yd0DW28DO8v7///z65Obk/ffB31TV19dRR01BRkBNdXdzcnN0TVze3txWRUZbV9fVX1PX19PU197c2cD3//vl5OTk+Pv4+fv6//b1zszZ11BETXRxdHJydXZzc3ZIXtfay8zL9Pb1w9vRUkxPWVJTVFJAd3x9cHFKdXJ8fnxyfXN3Tk1GVMbM9vzy9MDFwc3NzdrY3N/QXldXU0ZOWdfXV9ddRktOUdjD9Pf39PTx9cHQV1p3dEJFRFxdWk5LQEFH1dnbxs/38fDy/f/y8vrm4ebm/s7S1VxaWUVNdHBLWl9RUVJeRFbf093Z0VhPQV9cUFdRUFlHTnF5ZmBibG1hZ2V8SU1G0sv95OPi4Ofk+v/99cbWX0JMW11eXE9+f3NxdnVMTUFFUFTR39/T0trEzczAzcbW197Gx8XHwc/BxsHf2d9WXVlbVt3EzsrZ1dLe2sLJw9lXX0RARUFISUZZ3cjx8/33z/Xw987CzMTR19RRXkVPcnx4enp6eH57YWBmZ3pySVhfXFhX38PJwsfawPT28vn/9MD18fb0zsLRU1hHS3RxeHxwdEZZUNTUVVxX0NfW3vT39fXIx9/fVVFdXFdX3MDCzNLWxMvx/eX6+PP09MzC0Ed0fX98cElARk5ORFzUVlfQ1ldZWEdYXlpW2c3MzvXKw9JRXkBKc397ZWRnen5wTEZZV9HbyPz7+/DMw9jS38HBxN7W1FdRU1pLdnF9fXFKRl9f0s3PwM7CxtnYxt/X0dHVVtPf3dzFxsXb29ve3N/c3tLVVFFfW9TcV9ba2NjEx8XWX1haRlbW0sPHx8/3ycLA111EQEdNWlNZR1hdWFtcX15GQkpxfXt4e3p+fHJ9cU9bXFLf3sXJws7Nxs3Awcz39/fx9vP//v/yydJdWVFdQkNLdXVKRUZGXFtZ1NLawMv1y83JyNBeR0JGQU1DR0ZEREdaWV1QUNDFzvfw8/b0ycHY0NbR19vb0NzX19je3d/Z0d3W19DR3dPS1dbd1VJJcXF8f3hlZ2Zlfn54c0h3SF9U19zDzsv29MrI9PXI9fb8/fzy8fbw99nQVkFBR0xJd0hBTHVMQEZATE1aUtDb28TGw8He3d3Q1dXf3N/e2sHDw8zNwsDe09NUUVtAWkVHREl1RFDW2vfy/P765Pr99sVGcn96ZHt4eX5zSUZf1tfcw8LBzcza1l1JdnNzdnVOQVDU3dje38bOz8nOxMbf1VTVVtXR19PZUV9CS0xNR0FcUlPU3tjXUVFMTEFbX9HByPT09MrC9vb18fz4/fXG2NbT1FteXFtXVt3GwMvw98Ha3FBYTXV2cXRwcndDQVLVUF9FRl9R1tjC9fP09PHJzMzF3dJXWU9IQExKQUJOW1fU09jMy8r399tTQXZ+emVnZ3t8c3RS39jCyMbGys3axdjSVNRXVlJU1tLHz87x//3z8//+/PL3xdZSQE9ARkRbXVBXWV9SWkVeQVhX11RX19VGTV9GQlhT0M3z+vrl5fjz/fbMz8HQU01xf3J3dUxEWVxWVFRWXVbXXFtbQHRyeHple3lydklBX97b19bX1N3Yw8vw/v3x8PDO3dZWRExNQkhKTE9a193aws/IzcDOwMLNxNvb09RUUV5GTEVTXVXY3t3TVEBKdHNwcnRLRdjFxsjIz8LJ9PTz/v75+uXk5OX/98Ha3VdEQnV0dHFPQ0ZHdXdyemRkZGFmZmdlfnN8fnF0Q9T0/uXn5+X5+fPA3VNBQVteXdHdx8z08fb298Pf19zQVNdUVlBSUkdJdXNzcn9zd3R2cXR3dEtIQlnV28fL8vL09PbI2sP38/zl5OXh4+Hm5/vyydvQVlxZREZeWV5RX0N1cHZ1cXRJd0pJSEtPd3Byen5wdVZVVdBRXVBcRVhR0dvGyMnC9Mra39rXVl1BQUBS38X08vz99cPXRHd5Z2BhYWd9cXZ2dUpKQlzTzfL4+Prl//fP2VTX3cfCzPXO9P39/v78y8ffUVJQXEFPUtHdxd9XW0FBTkJT3djAyvD2z9tedH56fXZAWUdQUVJYXlZR19fW0NbeVVhdUlhdXkBPdXd2d0Jf18XOw8TF39DQUFtHTElKTVpcQHZ9Z2RlZX1KW9HHyPLxzcLI9PX19MnJzsDO8fv6+vv/8PX3yvX0y87DxtNETndzfHJ3dnVGX1TS2dJWRkxJQFxX0dnBxdPf0dTf2cPAz8rDzPTy/f7l+fHbX098Z2Nge31zdUJPS0lAQUBEQUJJSkpxfX9nYm9tZnpzdVjZzvfy+uX65OXl+v//9sjx/vrh4uHk88/fVllHRlzQ1dfRUlpNc3N3d3FydkJHQFxVXV9YRVbSxvTx/f31zvX0ysvCwcHfUlLX2cbC8fL2zdNdTXB/fnJ1T0xaWFpdUlJeR0BPSkNER1lBdHFyeWR6e3h+c0hPQFHX3vfz8v////755ebh4eH6//TXRE10dE1Y19Pd2N/fwcPa2d5TQU1PREdMT3VMTE5DW1he3cfYxMj0yMP1wtJVUEVFXdHN9PHy8PPxycDZV9HCxtnZ3dVRW1FUXUB3cn15eX1yfHx/cnFyfH5lZXl5cVhU0NnA9vf0yvT38Pzk4+3g5uX8991eQ3R3dUtDRkFGRURf0drF0FdUXV1cREBAT0hMT01OTkNc1sT08uX6//j78/fa0d1W0dvYxNjR1dVaQVpEX1bW2MbEz8Hd2t5YSXFzfX99dnZxSEpOTEpOREJIRlPU39rDxcXNxtjY3tvO8vn5+Pr4/v3J3tdddHx2SnRJTEFCTFpeRk5ISExZWFtZREVIdEhOTENPW9fEyv3+/Pn88v73ysrJzc3bxMLa2tvQ1F9GQXV1QFlS3tjfwcPG1UBDSndxdHZwdElMTUxBSElaRV/d9PPz8fPxysvfUlfW0tnDycjI9fH1zcHd1lxEXlJXU11BT0dZWEFPdUpNREBPRkNIdE5fXkZPS0tCUtHbwMTExvX1xNzazcXTx8j38cjExd5URE1DTE5Y18XNw83JwNVTVVTUX0dDd3Z9fHJzc3xxdHdNUd/T2vT18f33zMDP9fHw/P3y+fv/8vLxzdnQVNDQ3lZbRUt0fXllZ3p5cHJ9cn1xdnRHUdFUUFDRx8zKz8vNz/TB09bX0Nze397Fw/XDx8Hf1l9HQ09MQF5FWlfQ1EN1Sk9EX0FKQk1LQkVHTHdxd3FLWlfbwsHJ/eX598rw8fD/+/n4//3+/ffLw9jQUdXc2t7VX1PVXE1KdnB9c3Rwf3B9cnB1SUNfXF5d283P9vbK9/XN01JfUV1U1Vlf0NzQ0N7Y1tXUUV1XUF5dWUVW0dJFTkBEQ0FCSk5PdEpLTXd5fnx5fU9aVd3SxPX1y8TB8PLw++fn5+fl+PLwydjf0VJW3txVUlHXVl9cWkdbQU5GXkVFXFBYTUNATEhAXNTZxcbK9c3E39ZXVNfS09XX0sbCx9/e2NBWXFXXU19YW11QXVxDdn14ZWVkZXF0Sk5MQk91dHR1W1fWwMzM9fXIyMDFyMnJyMrx/vz9/fDx9MzD0FXW1lFWU1Dc0tRdRUdAdEtFX9bGxdje1lFaQUVPRlbdxcbDw87DxMTG9crNz8zCxsPYVF9U1lTUUkZDR0FARl5R1tHVU1tCcHt/fXJ0TUhyfXxlZGVnZHxMW9TBz8v1yMnJ8P3y8PHy/fz88crK9vf19cLf09nd0d/HxN1QRktxcn18S13W2tjd1tFRWkBPTUdXxNjax9rH2NrDyvHz8Pb8+f7+88rO9/TA3VRMfXlyfnxzcXF8fX98c3BzcUXR0NZXXE1JdHN9f3h8dUdW09zA2tbbwvfw9c/Pw87Ozcz0y/X0wMDfVNLS1sXK9MnfX0FxcnFLQFPT3NNdUlBfU0F0S1tU38/298zHxdPR2MfBzPX19P388cvK8PL8/fXeVFZfWVHVWU90cX5lf31/c3dEX0ZPdXZyc397ZWZkfn10QFNVU1HX1tv39PD+/Prn5+f6+P73zMbWRFNdQ1tV2NBYX0R2d3V2Q9XS2N3Z2dXRxdZeWkFEVtHYw8L0zdvGxd/F3NPD9PD88vPwzcDPxsbeVlJTXljV0VZOcXF8cnF2TkBQ1NHX0VNAQUxLd3Fze3p5eXJPQ0tPSkNYXtHazfP8+eXk5Pr99PXN2cXX19JQ19NUVkR3Tkxxd1rW2sTEz87CydrS10FJQUZcV9Xc0lTR11TRVF1U2/Xy//r6//32yMrKw8bF3t7b2NZFTnR9f398cnJ3QkxBWEFMTXZzc3FyeHt9dEhZVdDa2Nzb39rAz/H58//7/PL29cvB2dHUUlBSRkFKT0ZJS3ZxcXdGVt3X2sLBz8n0ysDRQ0ZeVd/Ew9zW39zXXVdSU9jL8vzl5fL29fb28chUV1RQXkZMdn18fH94fXZKQkZFXlxWX0JCTU5IcXh+cHVKS1pT1dVV197Ew/Dz8v77+P7w9Pb39c7SUdbY0FlAWF9aXFpPQkh1Q0FTVFfT3tbe9fTEVFlfXdDaVV/VU19TXllZWl3W18r//P3w8PPx8fL22dLf3t5ZW1tPSHZ/fXF/eXJwTUBGXkFMQ093c317eH1wcGVxRUBY1cTBzvf9+Pzl5fv7/fP8+fPNzM/C2tzWR1hWUlRSWkFPdnB3dVtdWF1c083A3dTW1NHR2d9U0dnfxc3Y3cXT19vJ9cjC9PXM9vbJzs3A21VeWXRwd3h5d3N8c3NKSURXUkBeRUlETnZxfXBze3h8fnJIRtXBxcDKy/Py/v7zyvT1yvL2zvb39vXDwN5WV1ReVdNSX15FWV7R01xbU1HWxsnGx8bO0FPTVFxEW1BeUF1eW17R28r28fH2/P/y8vDx9fXF0dJWWkl2d3FzfXNzc3Z2SHF/fHh4enl8fn9ycXl+c3N0T1Pc2Pf29PD55fj6+vzx9/H0ysrOwcHD2NRQVFtMRVxTXVxHTEZHQkFfWFnRxs7x8Pz98fXH3NfUV1TRVNTVU19T2drbwfXPx8jHxszGw9LZ2FREWVx1dHZ2TXVLT0xYQXd3SnN/c3N0SnZCdXR3fnh/cXdEUlTE2c/z/f//8vH1wcHE2MLMzfb09/HC2d7TUVJaXNdTUlBfWUJKSElAUdDZyvf19/XOx1FYX1FRUl1dXVld3cL298rx/fP98fb29/X3/fbI2FdRWktzcnZzfXBKdXF9eXt7ZXp4e395enl3fXl/cndMX93czfT0/+Tn5/v/8PXAycnBycj38PLz9N7TVFpaXEZX1FtYQ3VOSnB0RVPZwMn99/HwzMDaVFfd0dbZV9HQX9HFzPXDxM7Jy8rMzfbI9PDJwN5SXEd1dnR2cXdxdEhOdXJ8cXFwdndwdnRwc318cn55fHFJXlBc3crw/uXl8MjMwMLL8PH9+Pn5//LwwV5EU1tFXF9SRUFaQkh1d0FQ1sHLzvDzz8LB3NPUX1tbUVRHWlfS28H0zcDH9ffI8PDw8v388fP2z9JZRUZfR3dwfXJwcnx7emRlfn55ZX5/enplcHZ8fX12T1dTUsTM/Prk5/j+/fXK8fLy+fLw8vTx9dBbdHZ0d3d3dHd1d0pCS1tV3c/3/fvk+/j99PfM2N1WUVRbW1BT3M3GwcbT3drHwNrawNvS3Nzb31BSXEBeVF9ERkRfVlhaQUlKSk9Ldnd2fnt4enJxfHtlf3Nwdklc18X39vHz9sPP9c/1/fz88/P98PfD11lHTklITkdaR0ZCWl1V3vX39PL++fPw8M3e29BHT0h9cnZ1WNLAz8HLys/18vD39vH88cv0wt3b3VBU1lfWWU1MTUJ3f31yf3Nwf356ZGVmZ3h5fHRzeX1zdEtGVM385fv4+v728Pb38P3//fb3y8HY015NQ0x3cnN3S05Jd3VAWNXGyfDw/Pj9/Pn98MzZ11t0cXNwTEXcy870zsfOy8j1ysHPx93e0tHWWV9UUlbT1FNfRVFUU1ZHT0dMS0pIc394ZHt+cnF4emdgZHl9d1vQz/Tx8vLz8PT09vD9/fH3zM/2xtfc1FfXWEdMTEFLdE1HW9TFzff18/L09MrP9/VWR0xKdH1yd01c1sXA9/X38/b9//3//c7CxdzF3FbV09za3dHUXVpPSU9IdkhIcHN+fH9kZGV4eXx/emRmZGRlcE9c38D19/by/P3/+f34+/n89v30wMLcVFTWXUFJQl5MQltDQ1lT09rMyMj08fb08vbCxV5fUERGQF9W1NfHz833y8jw9/X3wd7RRNXQWF3WXdHYV9NWVNNaW9PUXNVZRV91SnB6f3hkfnpnZWRmZ2Zhenp/Sndc39738fH75Prl+fHy9/X3y8zIwMXD2d/cU9DVX9ne0trc1t7BwMDGwc7FxMTUVEVPREJORFhZUF5T2MP08P/5+vv+8vTOx9vTUlxWUdXV19PW0FdfXFpNTEJKS3FwcH5lenh6e2dmZGd6e2V8c3BxcXdYXdT18/P6+uTl8vPx9fD2zMrLx8bf1dFdV1RHR9HQ1NjSxsrFz8zM98j08fTA2tvY3lBEVlZWWHVaVlHW2sv98svOxNzURVPXVkZd297SV9DY2MPf3MjG01TX3NZdQUlweXhkZ2ZhY2xhZGZnZGV5e2V6cEhHVMj85eTl+f789PX39/Lx9fPyys/b3MbF0lTYxtLTwvb1ysrazsLW1VXWV0db1NdeRVpAQk1PS1vY3s355OX4//b3yN7axsDY0d/Hx9BRUVZXVdDUV1FGQVxZWURKf3h5Z2dnYWNtYWdkfnl8fnxwdE5Z3NjM8P3+/v/wys/OzMPOy9raxdnHUVfQ1dNQ0t/awszx/fn+8PzL3sLH3tre08TN0NpVSERASndAUdPHxvTK9fTY0lJZ0djax87C9sBS31ZR1dVXxc7dxcZVxcbQUk99ZHh6YWFgY2NhY2NmZmRhYXp2TUXU38/9/P/+/szP9/X3zvb08/ffw8XeydNX3czFxPfazPv/8fH10tVRXkNKWkBcV1DD1VDWdUpJ3FvX997w+/P+zsLbVlbWz9DH8c7H0dZaQ1hKR1TQVtfVUN7QV1d0T3JyZ2dkb2FmYmZgZmRlZGZ0cU/VVNn0/vPw/MnL9vfDwsPDyMXS1EXRXkDU08/AzMLYyvD4+fr+9/z3zN5QXV/TXFfF38JVT15TXlvR0tn29fPxz8nA0VJX2Nrby/TF3ttXXEVbQ17F0VFSz8BSxt9XUFpweXNmbWJiYGNtbWxibGxiZnl8dF318fXz9fH0w83//s73+//x9PXdX9DRXcbzy8T19sjK+/3K+vzOzv5UStZKfVJfRtLcSlfUf1LBR9r9y/37yvDw0Mj0Vsfx3sbOy81cXNFKddJNTdrUQVrE3l9e21120EhneXhuaH5maWdkbWZmbX5Ke1nIX8v73czz1tr2zPL+2Pf5xs3E1tZBX9hXxuXA3fHJzfbn+8/w4fHY5cN0V9NydsZTd1pFfnFfW8bJXcn608j7UtbzU1bw2/H7183yWVPeXF9DVfLfV/5fTPDaRFjB2nV3TWRiZG1pYmFibmBnFW15ZnJEXdbF8MBUwsNFwffM8Pjn8/HlxlX8UXHCzcfL8/3c1vvLWuXk1PHjw1vNzHZ23Ed02sB9c9REftb91lHn+Fvz5FxF+c91zubBz+XGTcPecUrfTkPM3V7T2lNb11d3UM1DdllybGV/aWlweRVndWloTnVsQfZYW+XMcd/5SXTn/l/77s/O4MdMyPVz1eXD3+T/2/rmxfTj8Mnn58308EdDxtd9VPRwflF1ZVbSdlXk3V7/wHVZyklZ/snW5ODFzf3WTMfWd9jwXUT22k/b9U5AzUF2wsVmd1NjbnR+a2R2FRR8bRR9XGBy/NNN8vZzUuRTTePmVefo1lHhw3nJ/3XW7/Vf4+DU5+7Szu7w1efkQd74Q3P02Hve/ntk8l1nzeVIV+70fPn8Zk3lRH3g+Ujl4HRW4FFk8MF6wv5+d/5MYfzfbFH2YXHzemDNfxRKSBdkXRQWWmIRQVFrSeZ9c+DcZvDletHuxVnp+Xvw43lL4UJ64Ptz+etWypTzUuvjW+DoRM/uQHHkUGbz9G1K8GV85Vh65OV2zuZ9dvxNZ/TzdsrjV1vg9En+9nvR5kxx59dk8PdgRPN6fvJCYfXFYn1dbm1HZhdlZhBgd2pv3kxhw8pl0OVPdefxRuDjQvPiXkbm1mTw83HM5lPN6f5X4eZT++zUze71ROT0e8v8f0jxcWfK2mdX+U1G595+9MNlWfZMUuD+WfLm1d7h20z//U/B5E1G/l94UFJndsNKf8vQeV9fYmRfYmhzZBVhc2hpdn5mUNN/WPRYW/bKX/rkU8Xk00zxwH3F/3RG58ZI5+JRyu3A0eP60+XswMLhxEvz8HBE9XR+xlB70fR1X/5XfMHaf1nzQlvg8Vj551za5NRd5fJMzuRPS/JdZ01YYXbBd33N0X9a0mR6U2ZrfH4VYHAVa316Y0HeenXyXHT++Vrw4VfX/8V03t54RP5cd/75SPHgU9vt/1Dn7MH17v5c+OVE0udSfcPLfEnGSnPKxXnf+3Jz/lR6zPp10ebEQuXlct/nVNbi9nX85Hdb8HZn3FZnRvBxcP5RYF/GZGZYZBRkSGsUeGMXe1hsZchfZc3/Qc/uwkbk+HzS/n168sNx9OVE0Oz/SvPt2s3u+F/h71XG7MdA5fp/W/x0fvfWYF/7fXD8VHP1939b/1RM/vpBweNUd/PNcfLi393h/0zF+3N48lFiW/Fne/NYbUXLZWLRcxZ4URQXTWMQZERuYPZQZ8Lkd0Du8HT64FpZ+lNj2/l/SuHGeOTjTcfp9lvt7Fv2lfRD4uFA9ejWfvjxZVj6d2PM92B15NR/8f96T+DRe/7hdkDj2GTO+n/W7MdJ4+1JUeJZes/FY3P/cWHKy2d1/HRsRkoVbUZvEGR/EWtGemlcyGR1+tp2++FGxe/FcvPKYXb+XH3550XA6fXX7OxXyu/23+Pm3cjt89Tn/ktW83V+2EdmWM9xQuX1dcj/fXX51XLz+1rY59hyx8N2WP/EXuXlUsL41XPTQmB303J5wV9kVcx8f9NlaXx8FBVkahF6dmJwwUt/zsh02ObBTP3nR9b/SWHX3GdG+VVI5ObQ++j23+7hxOOV8Mnj8sbs7dTA59dz2lBicld9cfLxQPX9dnTz0H3N/EtT5vZC9vV9Rf/UQeTlVvbm1lP/3GdAynNz9VF7W9l5W85zY3R/FBVhFBZhYGlzUWR9xkN/2vdfxefQQvj/fU70cXrJxn3Q4NvS4+Hb+u739OnmxOTg19Dj/VX+9nBEzH1sd3BiSfdBReb/dNv+XkHy2nfH/VnR5NZ3yfR01vjdUeX9Q8f7VU33V2XUwXt53UpmWdFlfVd6a2RmEBV/b2hKSGZG9kN1/PdL2f5GWPrefN3JfUr1VHPE9Vn14sLe7eTM7ZX75JX+Ufjnx8nhxkH+wXpH1mdiUFd7WfZfUv3Md/TkQ3fPUXz09Xla+F5l9vJ0w+bBV+XxdfX6Skz8wHLXxWZ+ynZtXERvZ0toFmdsEWFwFGLQfGf1znTe5dV1881LwcJ9R/vfcMH8Qdbj8Vbg4Nf46vnxlezM5+BA3+3HcvzzTNH3d37RSmVVwnZF5PRe+uDXxeDVffj9d9PnVXXn8n/a4UBY7cx48fZ8X/NHcvfUZFxSYXvNeG9eQml5SmsVdWQRYEZvYtlQcPP7WcfnVnXz1n9Q0Hp08U1nxsBP3OdVReXxX+Hp/fqW41bj4lza5t9P+v9YyflLdPVNZFDSZVH71FTn+U7Y8nRM8tBx9vZO3eTWdvPxRcH9WETzx3Pf801QyEF330NkREVjZkJ4aH5+FGJzahd9f2lyzUJ188xO9+VY0uffccjLdd3NSl7lwlv7+k7c58NW4+PZ5+nH3eL/d9fyT1n82Un0wn1dzEZ+0tRN/fLc8+ZTRPvHW/nlX9viy0L+/Hdd/tR9xNJ7TlZyft1SZEXSenDddWRddGFKRGFiTHhvfXtoZEVmZ/fcf9LzdEf7zE728HNCyEplX0R/VMpE1fDbQPf80PPj9vDp4fTv7NzK4M1Q+/9e2ufUQvnafFPNdEL21Enf2HZR+cdG5eHVy+HAUuf1SvT6Rk73X3pW3WR2xHtnzFN7R9l2cdV8Z3ZxbmB3Y2h+emtnR2Vmx0JiUfB0WuH3WObtR9DhQnr0zHPG5EZW/NlH/fNAzeXexOLn2v/k3s3hzUvx80rV+thT89172vp1Tv/QfMXJTfTn2sDv4cDk5FRU+811yvF/csV/YkV0bHtGZmXfQ2be93hD8EBlU0lid0RhYUZlb09QZ3/Ycmfd2HPE4cTR5vlYx8R6SvV1fPH0e1H7WUHkwHn04tzD6eX17ObD5uPV0+b1RfP7R1zxSXL1UGFe3Gd8x01z8+VZ9pXz1OD6S/Xi0VH7131U2GRz1mZtREljTdhlRPZJd/dRYEtZYWZGYRVwcRRkRGNnUHph9dR7wuPIwOjn1vrwcdblTU751n/M8XZR+1t99cl3zeDZw+7zy+zlTvfmQ9bhwXH29XnZ+3Vz8tFlxPB01uDDxertyOXjU93gyUvzzXp1xGdj1HsUfnZqZ9RlZM/dc8L/ck7wSmXaWG9yUm9mV3pnVkNgQMNyRvNfUeL5Q//lekX8fXr31GJT/Hxb+1B8ycxx9OLd8ZTm/JXoyuTtwvbtyV/7yGRc/Xx89HNt295mTfhBReDwxOzkWv3mQc7tV0Lm1mfOw2Jy1m5s33xu3dZmV/F7cPFyY9pPaU9ZFWJGaGtdeGpS32Nc+HVN4vxf7+9c8+xOcfrQfsjBelHOfEj1cWXGUX/O/1v36c7B7PtU5/7T4OZX+/p20uZMd+fQevLwZdnkRd7v987o/13793DM/UnQ83N71nFvdXJqZXZrecx6evxRe/DFf8rwel/yZHrbZm1VcWld02xeyWNN+3da78pS4tp//VZs08RgXP9kQuR3cvxafeX0SOLgU+Ho2vroV8bp10fsyHT4xWf39mbb8WFE/GVx4EFw7P1c7uJB/uF51uJG0u9affl3b9l2FV1Ya17IY0T+ZHL+fmb3SmnUWxRz1BRj3mxty39t+1Jt5fdk5pVa5JdPVu19eeRafvtcYfnfbfTAb9T/Z8TpSNCVxlLr83Dt/GDk4HD87HNX6lxP6vR85Np75OV55OtO/5VfzehyceBBcOJfYfFbFFtAFndOEX7abnrleWTkcG3lRmj03mtb9Wp282Jy8mR6/3xj/E1g+vV44eJ98eRhTvBhc+R6YPpIYeDeZvv4e/bvQ/mV0P2W8cfry3DjwHjj/2T8+GT352XH4GR153pk4lB76fxx7eBy9uBlwO9wUe1Lefl0bctIa9lBakHYY0rGe3HRYmFRZ2ZffmxeSW9K2np0znB38Vhx8M5a5Ofe4eR09PxlUPFzQvRwdPZ0d/d0fcvFdsr8XvXm2tn631L311n3y9Dxyt35+c79/NvJ9MfDzsTY+PLK+PzbzdF1W8V3W8V1RMNAf0dzZnV2eHZyfE5TdHXWSXRBcnZNdHdAdXxYQEHTXELQ0Exe3U5QxdXb/PHRydF9W0NzRF91QN7RV91c3PbMxPTxw8r99/fwwM/xys3Jw8/M3dHSxcPE2cDC2s/P197F2cL09czw/sTQx8XfzcVT2sZW1tdMSkdYQEF0fXNzZWFnZ3t+e3x2cnNye399f3NFWEJd2s3Z2fXM9/L29PP+yN/b0UVFV0NMUVNbUF9OQltd193X0tjY1VZWWlLZzvTy/Pz99sr98/vw9c7J8M/y/PDz/fn///DCzsRZXVdaX0VDSlpQTXdPcHJPTUZNdHZxeWV6Z3x3dEtHVdVFT0hJSXVZ0FNeV97V3NRS3szH08fP1l5CdEhGSU9HR0VcUdTT1dvB9/TxzM/2xVHQ1F3WzvT2+eXy8vXe0tvbxcXSV9nZUM7b2/X9/fD/wcvGV9vY9PTWw1HX30PZV0zUV1ZSX0N4fmZsa2ljYXp4eF5Jc0x9eX9zQl7ZXdLCzfHY8f/35M319NPCRFpWWl1WV19MWFpdRUdf3MZUV9tETVl3fXBKW9/L9/7++uH18/7y5/H59vT5xvT+y/fy+P/xy93b0U1BX8ZS19N4XNFKckdfTlLXSVpEcXhmZ2FiZXh8TElZQ0p0R3d1VNfX3/TLUsHD1NPKxN3AzUZBQ3J2ckNHSVtBQFtd017QxP30wczB31FZVk5GUV5UyPD09vj0zfXw8PP88fT39djH09rBzdj0/cfYx1Rc2vXFyPDaXdrDUlbFxt3H3FxMdX1mbW9vbGlgYWRle3thZH54f1jf0M758M/9//H9+P7++PLO21VEQ0REQl5HRUFHRnVYXl3B00TXW3d2QHF+d0Z12cvB9P/8+Obk4enh4+3h5Of78ffByfH1wMfbV1JDWlFYVNBQRVpZc3ZbQUnX2tRY10J5d3NmZWVleXJxSHNnf3JleXRC1cL19/Dz/PPBzfTOw8VUUVNbTnZzcnVAfENGWVnR2dHO+/HSw9Zf0V1FSXZUyNRRxsPNwcbVzP79+fj75vz/8/TZVsPd3cbT1N3F0VbO8cfeztrK0UDQUdXK3dHO31lIdHhgYGxuYm1nZmBiYmBobWBsfV/c8/vk5O3i5eXm+Pry2cbLwdlYcEp0dnN0cGVwSUpfUNPG0VZLRkJNSGdlQkxeUdPN9/bI/uXk5+Lh7ejh4+36zfPw0NpWWF9f1FlGX9ZUR1rcR3ZFcXBYUlTbzMTb1l9ZWmVhfGRkdnJgenxiY2dlen5NU9ry5uT/+OTw9Pj2R1bdXk1ARn5/eXtxc0LRQk7Uycb3+/bb9cjRXEt3dHBaQkLewdvfxvf25eTh4efg5OTn+/D2zsNHQFdaXdNY18DE1N3E1NdURVxfT9LCwcj/wtbNdGBhZ2JpZGRjeGNiYGhgaWJyfVfS+OHn7uzv4OT/y8j13t/dU9RMT0l4fXZ6cUpISlfP2/Tw3sLQcXd9fHhKc3HZXtn09fD14OX5lOTqlP6W5OaVRZRnx8Fi92P1Zl9L0UfYQ19GeMBhxmXzW8D43uTRzUV8SmRle2R9ZH19fWV6ZmB+ZHJNV8XI5fzz4sz99nT+d9DNZfhuwXZ612PGZ9t0x1H9zOHy/uHY+n33YElxZEFkREtG2FnYzvfl8uHk5ufs4eDi+OXKxV5AVHRK13PP0lrncvZRQ/pv5nLY9FTmW+TX93xYY3RofHptZWrTFnNtaWVocGB833Py/PPj4e3m4f/89cjB21VFW0BPeHN6Tnh2WXHeXs78XM3lZcnSaf9sYPUW8GZ/6Wru1cyRQ53w6e7kkPzo4ezl+tT9SFB3fUhh2Xz1Sl9LWltMWEzYR8nY29/x8NbWRk5DYHVAF1B/afYXf1sX+hdwyRfrY//mZ5N069XF4HrwccV2UtzEZMZk1096/2TmQeDN5fPB50f7eVJFYMdqfX1syGVM2Hf+w9ns3ebv1pb2+ZTI7Ode49l+72/2y2ORYMr4bJVjXeQVl3jY42qVYvTCauwXRnIR8R9xfBDwH81tZ8wU/GHOxFPn2OP/4vjk4dPnWvXBTs7S0l1zSE9nUnB3xHH013T1WEjzbMBdFeEWXkQR4GhV+G+RQOWXcp7f7JFxnk7ql2WeYOHKF5QQ/Eht6RHhenz2av5m0tFf80vx3/hc8tTWyWbNb0h/bsEUS35o9BfRdWrgFPlfZpdmlNvZ63zhcM5UTfZF/Ub0dMJzcdll83D09HHnfeXPe+NsyHFq4RPWfhXmEOd1Q+Jw6tHk5fvjwu346PDu/vbkdORzxt5C4nv4xHjgaPJYbO5q411hlWvpdEjha/pjSntrchR/aGZhf2F7TXtZZfZJVv1U6sHg41HtWNHmZ/v0futny/du9mBzV2ZLyHZ283/c0nnOTmTMeXn1b8ZWbex/xeJ9lPDEkUGU7k6e0u+VQZZG1PlGU8tNRPp60sVu139v9GJ/5m/992aXf9KUaOPDYJQW0M8d4hN+xx7gEXTAE+xpWf1vl3zm4X6XaeDHbZYV7Mdnlm34xWH6ZHH/evTLZu5k3Ppq729b8xbpaUzDF+IV39ptlGji/HicYpTtUJ5MlOtWlcXP7E/m5niUe8H4F+hqePcQ62lO4BfoaVfmFpdq8/4XlhL1ZBbyG8hqZ8EW5m7JxniUZer/35JmkVnC7m6RZuX2eO4V/ndw9hf6Y3XzaOxqwtRr4RXncXTkZeJlwNZ39Gb+RP30TOtK4uFUktHo61qWVPnkRObVzlPPXnfTFdpnb8IRwH5i7WL0+mbsXlnvUs7iU9DybVNFE9VvFdgWclER3EJ74XHH7XX35GTnyHvrd1/sY/jbYOd6deB60PB55vRh7UN/4m1S52L7+G7idGroFHjmE+TKaJZgXJNs6O93n/TDnFn+lnPq7GCW12WVFFzkH+F6F+sWxfgQlHRilmvz5xeTdH6XEPhDHeEdfEcT+WpaXWbhZOPKyZR2ltxGlm3uyWSQbdvnF+9gbO8Ry1hplGv09mnvacfUb+di+V917mzlcXLjFOBBWulv7PBJ6F3l7tXv59LjzfT43/HTwEta0m5eYmdCEcdgcMlp7Fl16kjk503qy9XgQtdRen1kZWlyZxRQa0pMaOZkzfx9l33X42T60HHmWUX/1EP3QnTNc1n3UFX9/kP+9HH8Q2TwWGL2WGD1dGTKembLf3ryS0LnQPbi3+Hs++Tt5Pnt5Pfu/XXqxWX6e2FRaGzDb2H5ZnPtePbuYOz9bepTZ+NvfOURd0QW2Wtu8xVHyG3iVF2QXviWcuTlZelSfe9xUflt0s0W0Ehr/GN07Grx4G7tTX7iat7+aPlGcuNj9PRm5mRS+2HnU9jgdOn88+xUldzI7kns01ztetnIbcNibVYRQHJj8GHw9NHi1O7+0+lO5t9942ZNVGtVbGpFEH5/avRj1P1k49fO4Hfn08H4cOZUz8p24HZG/GXY13Pl1ErhwFr71F30fUfaZXPUfUFQZFdLZF18QHFz+V9Y4ff04vHk6t/lldTh6V7t53XyyX1DVmZnQmJkVGJ5+15x4v915/Fy/95k/9BgwlpucHMUfH8URVFjwOZP/O5U8+JTVOxPQ+JNduZOdvhzefB0Y8pDZ/Rbe/nbcvvHesTKYVj8Z9/9ec/4ZkT5ZGXnfnfrfdaUQMyWRdOWc8qXZvjtafzKbv92bvZhaPBtZ/1rwvxn6vLDl1jg7Xvg3UvnZNzXbFhsY2YVS25502PwTkrvf/L9e+5eT+J22flwzuVM0uFIV+Jx3+Z92/tPXOBQZeVxY8pne894W9t+1HJiwWBj+Htc5Eb4993j2uXmXejl25X1/uFV/93VyXT0c3vwYkRCbPVmX+V45sFy4nF0+nxW+UpDyGFn3BVjUWl223BF/8lC5/18+vhMyfFc193NWln1dFzxd11H0ERg8U9h4N585dJl3NFkQv9PS+3FdubJYM/Jb9ngZdjucUaVVnyV0mWX3WXq2GTuyGHn2GHnVGbxWmDQWGDT23D4zlbkwcLDR/zXR+Fcc8J6ZH5iZ2N9dmFaVGfW9nxE/1BE5cBw+Mp+5eR7/eh02+pZU+tAeu1WZuzPaeTaF/RWF83DbvL6bMP1bVlRYVDOcdz2Tv3OTOZf2+1N+uZS7fHR7sNe49tA5UNx+XJ4xmV6w3Rz9ERzyFFzydF289XV/X7bXWzbZGfZZkHGZFT5fVH4f8XlfMf+ed74SMf6QMTnV9r6XtL/cFzVcv1wcPNhXdFj0kdnzclI5/525Ml69tB+8MR5xsB2yc1wwc918vBB+d/R5nX85Urkw0TzVkT2W3/AdXb2d9XzftjwcFP0WV343V7+1X/XX2Ny3WZkyXNh3EdlXN1KQM/RS8PLV8nJ8vXX5fdc+fvZzeVWUPZId9d0Y0pGb3FQYUHwRFL+0k/V20txy9Z93specd70fV/+V1P++Nz57PXC5/5M9+FlReF0ffTQZV/TZknYZnnDf2bNWXv18kzZ+NJfx1xITVpEdlvPWnj02G7P/2BE/0Bz5PJ08v1L9OVzWOdBcfjHdcDFfXVYcHlzdnl5d9VFV+PQR5Xxf//4c0n6SHvl3mbKxG1d+WFR7XPU68jW7c92+vZj9+Zg0O1lTuJ5ceFkeOZ+Z+ZwY+VGc+ZEQuFRcfDXZMfdZ8VWbfTUatHQa1HMY8H7f/zoddaVSHHuX3ji/X3g52X94G1N5GZh9X9o1U5s9Mpj++dn/OVi1OdmWudnUuFmTuRmffZ9WuPc9ZH6wZTKQu1MZPhKeuZSZ/jeb9rCblrJaHX0bnLjcmXty2Xj53j7ymT4zmb982HN/2Nd8WlO/G5HlXFT6VxY/nFJ9Hp55E9+41R749Zt5cRv99hpV8dh3PVx++R35u5mxu9mQO5lduF3ZP1BblFRakTke83rQvfqcFbse2XjRGXs0GXjQ2bn0WLlzGL73GH63Gbn8Gf45mHT5WZA/3tM9mFy+Xth/3hoyHBm5spx6ed+7f5k+chm+vl84eRm9uRh3/9mUfVuR/Zpc/F5cPZYdv1Hev5ZZeX2ZfTnedz6YVj1bEX4cN7p9cTq/1rg32b22GP2/2NF9GBO92Jb8G5G+GN95n9/4ltO60F06UJn7PBk5PNn+ftjyPpqdeRpe+NwfO3QfuPUYvtUas/8YFTlYVrjZXXucGTu0GLlwm39+Wf44GTx7GdE6HJ/7XZl4kth4HUU9NEVUPJgVuJzxOtKQu5NZ+DKZvr8bMr+b8PgYdbvSHfi2Hrlz2bn8GD75G9X4GR95nlk5Utn5F9u8cUU0eVsXOx83+lyXO5AeOP8Z+XnY/DnYNjhYk/iemfhdm//UW38yWz15W9W7WFJ7n9y7ltI711m+8Rpzedg0Ox01+lQX+xdeuHPbff6aXf5bGX/YGThcGDiwWDn+mT+5n797WTb7GF37HZz4NRy49tn5cBoy/EVReVsSedkcOd+ZONWbefzbvfkbNnjYlPsYU3oeWHtXWHtyGbv9Gzm+xX04G5W72Zc6GVx6WNi7WVq5kVp5s1u5f9u+O1i9upkRO9keO1lZOhBYe7KY+PkYOfvY/zub8DuaXftY2fgeWbiTWDi32jl8BXG+2rf5mlR4mlOlX1zltlylc1h7/Ru4Pxq/eVp3+VuSuBgcOxlZuxxaOReb+DDYuP/YeHmY8ThZ0/hZHLsc3rvdG3i0WPh/Wfl+2zN/BRN+mtk43p+7nx7lVxwl/R77fph8vhtyuZj2O1lXpVOSu9HeOdNbfdKatpTF1LAaF3lYt3rf0TodnzvVnHt1nvgwWPy8GH343zW43R1+H9n+E1j5fVh/eRkxuVjReRtevhmeeF3YOdZYufNZ+Dne+bxY+TTaeBPbO12d+560+ph4e5j6/Jt7mFn6RXa5hHsWmKRYFCUFOP3FZZteesTwsAR62RklGvn7G6X0GGUYHXrbcHtbNX0bt75Yc/6ZlX+Z3D1f3L8WXHk90jz+nBT5lx+9d1nWfN3c/FUZ0bJfnH78nNd5EVg3/1mYv7JbEXv1WHhlEB3lO5nde5QatDrRm397H1j5e19eODnYWL6/mFi9sFqbfbAaGbn5GVz7+J/fuHhcHzg73Rgx+dAZc7t02ZY5VJtcPzAYX74+nR+9uVEZdznUGB59NlmePb+fWfS/lp6w+L0cEf/9Hx73/BFfVPwxHZR5eTRWvzk0n9ezlFydc7JTnfS9VRAxfvw1VfO99VPUMRFf3BZX3F3xPfdXtv3wENN09nRXdXHUHdK09xZSVLEWHNJ08ReRs392tDP8cnR183IVkRFVlF1d1pVWHd3Rll0WtfRVEVfUFh0dVhdUEBR2dHewvP+8fb98Mfe2tLS1tXc0NzVVd/ax8TBx8VXWNbVXnV1QnRzfUpbRFhQ39PWxsHZ39vIyMDe29NeXdBUX1PXUFhcV1XVVVRfR9fcVlHT2t5RVFFQXl5aQENMQV5BWV5X0tveVVTUUkdPQkFTUFxR1NbSw8zOzcHNx9jbxNzV0tZSVd3UU1Tfw87K9PfPyMjM2FRRQnR0dUlNWFhTUlTQ1FRUU1hTVFHUXllTW1hcVNPXUlLUVdTb29LT3cbH2sHAxt7FxNZSV9NTQF9cREtKQkJ2Tl9GdElHQ3V1dUZBQVhZXFfR38HL8v/+/PD3zsPDzt1c3MXdVd3YxszMy8zCx8TZ0dVfTHZxdnx0TVhGSVlVUVNQ3t/fwM/G3d7TVlFd1dPW393TV9bZ3VNZXVhEUFJU19fQ1FNS3dFWX19dWFtQU1NeU1BcREdHSU1ZSUpFUlhGRFDR1dDH9cvL9PDJ39ncUkVf1dDQ29rdxcrwy8z28/PK9vHM1l1cQnR0RERKS0FEW1NQWlxSVF9dUV5DQEJaXVfe29vd3d7axFbX3dfQ39vYw8PE2dDcUFfVV1JeXlHVWk5aREBwcnF8eH1wdnBOW0dNR19AWN3fw/H65fj4/PP0ztxTX1bHwsfD9fb39M/Kysbaxd/S3NVaSXdzcElMdHV0T1xdRNTNw9jFxMDT1VVTXFfd29vb2dDV39RaWFJTXllc19VR1NVcU1NTXF9UV1FU11RdVVfQXUJJd3FxcHZIQkxbWkJGWkRYU8T0zPT89MfYx9JeR1TS3c309vP/+fny8/nw9/bx9cTZ3F93cUp3c31zd3Z2QE1GUdXV0FdRX0ZGW1lV0NvG2dDbxtRSVN3Z383Kwd/Dwt3X0NRYTFhaQkNeUEdPR1ZFSER1fHh7f395c0NDQlpRUFte3dja9uXl/v3y8Mzc2NDX2szIzcry/vTK8vTFxczCV1tV10x1Qk9KdE50cEtBdUtY09nByff03tTW0ddU08bA1VfT111aWFtFVNLXVNTXUF5dVFRFXNVZT0FU1FJW1t/R0t7WXlpEc3t9d3F2RkdLdVtTR0VR19LH9fXNwdrX1FXdzvHw9v38+OTk+vD28/3KzcDa1VtbXVhFX0Nwc3dMdnZ2dXVIUdFU1dVGRVxV297T3NDW38PGWlZXXd3PzfXF0dpQWFZS3dVaQHVPTkBHSEZfV11aUkZ1cXx9c0p1QkJBQE9Q0NHT1MT29fTx/vHRUtjA2cv/z87x+fD08f/2xs7wwdFXX0R2cE5SX01AW1l0SVtfQUVX1Nffyd5X08jF383P2lbQxF5PXlZAdEfX0VdQ3VZDQkJXV1fc3FdU2E9F01XEWF3Nx1RQ1lp3fXVBdHJ3WUR6dlxBREpdxd3KzMxadtZX3v7k9vP+5f/w++D88OXk/vfz215USF9YcU9DcXN9dHFzc19DcntMVUBKUld3UvTOUNP0/s5YVVdTUsHL1vHKwOV4Sv3DcEv2zMLGcHleRnVwT0fTWXXSX3JyWUdLelvbX1txdlFX39VHXdvC2d70ytXR2/D808L+9cnk5fv88fDB2/f0XUrXVNd1Sd1fT15Q0U1PWFxbQ13RVl1eVVZC1NpWXsXJUddT1dR0RtFRQ8JRQFtS21Z3XMVUX9j13VpcVFVIR1tWUdRWUFFEXNxLcddYRk1xTEN2cl9ZddrF1VNV19ZRwtvK/vjk5Prh7eDm5ub98PPzzdPGz9BFV9NIcE5Cd3FNWU91Qk5TQHV1cnV2c0tM1dLS09vf3ddf3dbW2czx2MTG3cVWUUVAWFjUXFtZUURFTEpJcnN1fXNPQ0t0d3VGRkxFdUBGWFRTU1hT0l1SV9/UU9rJ9P/+//n75+Ph5OX4+fX0yN/f11bRX1TdU11OWNLawFZcXtPbXFpAXUdlck9NSk1RXHZ1XFBJQF3dxcL1ytbU08TQWF5U0FpeV8DQxcDJw1hVRE9JQF9AR0JaSXZKdH19c0pOcXZMSFpYSXV1Rk5yQdbd1ffm5/vn7Obm4ePj4//49/TQ1fbR1NLR2kl7WdFeU9zQWkbXXUxMd0N8Z2Rxc3NJWUJH9MZZXcra9fjj5P72wPTM29DH3k9If3JBzlVR1tDD2H53UXVzdFZOcnd7c3BG1UxXRHdXXEdQQdR0UFl8d3R10fv7+eHj5fnG+ub/8dv0yddTX1FWRkzM0EJHdsJRRcXN0sbZ2kR3X0RNR11AQnZyQE18dHdefXBZX/f5wv7SzfTcVnPSdXbx0PvY+cVK8Mv9z/TLwFr02l1YTNdPdXZleENmSkZ2XXZST31YcUp4ZHJ0V8PL8ubn+Ofm/f775f3z9/j9/VxNUFvZTHd5f0Z2UltEVkXVQUFYcHpCQ3NVd0VYQExNVlZbWVJYwf7n5Pzg+PTw3dP10tjJxc/C31HWVFPfWdNRQkZzR0JxSHRMdXdOdHVLRVJbQtZDTVdfX15MSE5CXcD29v785+f5/uX65P/89vrnx9NfVt/H0t9fUtVf09DZ0NvSVFhFWHB+fn55fElwc0xKRkhIS3ZwRNjHyPTx8cfE9cTA0NH09MDF3snI0VTE8VDRV1JUTF5IQXJ7eXx5fGV8dHZ9dUVNdHBGT3R0S3FKQ9TGxMr//PPl5+Pk5OD7+OTk8PPBw8vA3MXFXFNUUNVeStRAXEZeVF10SXFwREFFRV5AUlHXWUpY09HS2fX/8MjIx1Tf0dRTXdbF2dZd1N5RV1FTdU5bXU9zT0pxdkp0dUtxc0tLX9ReUllFWlhfQnR2dk1Q0Mf1yPz49/Lk4Prl5OX88fbxxd3bwczR1tlRW1tfUNXRU9TY1FZSX0h1SU1OTlpDSUZGSHVxTU9KQVTV3NrGxMbMwdLSxNvS3M3Mwcf09cDFxtNTWEdAdXd0d31wd3B8ZGR8e3l3T3R3dnVOcnB2dnRIV9LE9uXk5+Hs6ens7Ozj4OHh//L39s7A2dRXU0VOSEhAQU1HUkRHRk90dU5FWkxbWllBQVpTRVnQ1dRQ2MHE38z0zFXR0ERNXtFSWVfY29PX2t5YSUx1fHNyc3F0dk1JTXd0QUdYXVBSWURGTU50SnRKQkFY0sfG8frk++Th5/j8+/v99Pz89sT09N9W0NhXWlzXUlpQ3NJWV9dTXFhTX1JPd0FATktARUdCW1lZWVJR1t/bzMzE3VVR1VJW09nS3Mz1zMXaxddPSUx1fHt9cHx+d3R9eHBId3BLSXdzcHF2dnB0SEFNXNv0/Pnh7e3s7uLh5uDl5OX4+M7z2tbeTVhQSF9LcVJEQHVbV0JIR1NXWFJXUFpMWV9DQlHVUFJV0trf2c/F28fY0FxHWEdBR1tW1FLT2N/f1tVfQE5DQ0p2dnVJT0lYWVpHTlhYSU9DT3J8cHN8ZX1xc3RE3vD95ebh5ufj4eT65OT6+ufl//XJ98HU0NdXX1hQ0dZZVtdQRExZU0VAQUxOdXZNRnVJW15cWVDf2dDazcDH0dfUXF1W1NbV0d7Z1N3D3dZUVVJMSURFdXJyT3dxQ11YS0pOQ3R9cHFyf35zcXN8fEpbWN3y+/v65uDm5uHg5vvl5eT4//z0wdLR0NVQVNRdWVNTWk1PREBKQ19fQ0pFXUFPUlNFQUldVlbWxcbG2d3F3lFfWFtbWlDR19bT0t3S09LVUVFTUl1fX1hCdHVAW1FX1ddbTEBFQnZyc314e355ZGR8dURRw/bz//vk5+fk5+f7+eTn5vr++PL19MnCwdjZ2NDWVFlaQHRLQ0hNSnF0dExGTUJFWkBCS0NXUNPF2sPb38Tf1tXX0NTV18XH39jc0NZXVFxAXlZSRU1Od3J9dHVOR19ZREx3SnVxcXt7eXp/fn91TV/e2s/28PLl5ebg4OPl//rg5uX75f/O9PTCxtjAxdLXX0dBT0x0dU1PTEpMR1hbUlNYRkRBQkJHWdXf09HS1tRRUFNdXEREXlHX3sHH31JX01BYW1De09RVVllOTERdWkVUXFhGQEV1d3N/eXh/emRlf3dNX9XY2sn3/uXk5+fk+OXn4eHg5uHm5Pj98fDz8fPxwddQXkx1dUt0cnxzc3Fzd3VASHdaWUF1QVbUUVXQ0NPR387Yxd/R1lTbxcTDwsTWUNFcRUNEU9VfQ09IcH99d0hwdU9HSnd1QnR9fH1zfn13TU9EUd/f3MT38vP55eX6+P7k5+fk5+Tl/P39y8n18PbPwtrUXFhGSnZ2Sk1KSUFdWkBHV1JNRVNXXVPX3lBQVtBUUl5X1FpFX1VXVNzPz8/EwNNbR0VcUldU1FdeRVlEREJLTk1DX15KdXZ2fHh5fX9le3RNSE9f0VLRxfbz9ff9/PP9+ufh4eHi4ODm5Pj29/zyy8vG31dETEpzcHN2cXB2S0p2QklDSkxeXEdfX15ZXFBU1lxdV93RVNfZ3dfYzMj1z9neXEZDUkRNR0dFT0BATXR0Sk1ORFJcS3F2dnFzcXVJdkteV19W1t3T0NjK9MzL8Pzx8Pjl+/rk5ub6+/nzycr3ysHBzMVVWkdHTHRPQUF0SUFFTE5aVlxIRNzcRV5U1FhFX1dNdU9aWElHV9bW08b09c/Y2VtIR1BeQEdT1VpaX1BCdEBRREZfUktydnRJcn5xdnF2TFNaRVjT31ZR2crc0Mzx9vby+ufn5uPt5v74+vL09PD2ys/Nw1RYXllGQkxaTnZzS0FKSltTTELV3VlBRdTUWF9UXUBAUtVfWlDS0dXe8/3N3d5VQU9NQ0t3dF1fQENZWk1BXd9SQklCdHNwSHBkZXZ1SklDVlZT087a3tnAzs3P8PL19PDl5OXk4fj8////8fXw8snGw83dUllUXV9FQEBKc3RGQ0h1QVlRU9XRVllX1lJEX1BHWF9cUFNZU1fX2s/IwN9U1FNGdE9GQ09YVltZWVNXXVPd0F1MQEJJdHB8eHl5cXd2cUBdVNTfx8XT0cTDwcXIzM/1+eXl+vr6+f/88/f38f/x9MvI2tBW1dPUXkdcRENARENIdE1BWkRGRVlcWVxSVVNHWlNSUF5YWlpW19jawNnExdpUX1lEQ05GU1RSU1FV1tzR1VxZRkRGT3RzcH1yfXd2c3ZLQl7Qw8bZycvOzcnPx9PH9ffw+OX7+/7l+/n98ff2zsP3yNxWVdZRR1LRUExaWVtPSkBDTU9GWlRaRVheW1ldWFxcXFFYQURGX0Rd0N7R3drYVEVRVEV1RlJbR0dF1NRWVNHcXF7XVkp3dUt5enxKd3BDR1xfV8TJxdnN98Dc2MHcVtLP8fb9+uTy/Prk+PDz/PHOyvf03tbc0FlR0dvdUVHS00NJQFp3ckPVUkJAUVlORtXWRU1DQ3Vwd0FEQ0fTxN/ewM5VXFbQUkdW0VFDXdHQXV3V11JTUNxZcXxycnplfHR9f3BDQVpc28vE2vT2yNzQ21JY0/Dy/Prh4+bk5ub58/Xy88nB98JTRV9UREdR0V5HWFJGT01ESHVMXNVYR0fVV19c3t1RXlhYS3VOWVhZUNnDzNrBxNFSWlZTWFHUWkdcV1NTWFDRVlFW1UZzeXJ8enxKR093Q1NeUd3b09vfxMbUUFlbW1PY9/Ty5Obm5OTn5P3K9PH19M3P21RdV1RW18HH1VFRUUVEQk91T1pTWk5NRVxZR1vVUk93SXRycU9FQl7Qxsfe2djWXF5X1dnFxcTU0dLUXkdR09VTXV9Pc394fntlcE5MTkJTVERZ09DW38fe0dXT1Vbfwcv55eXj4uDm5Of59PP898fBxthUWlxcWV1T19BeWlFcQEJBRkFBW1hOSEJARERb0dZTWFlbT3ZPXllb3cLd1dHcVlhEX1HW3MTH2dbVVF5BQlNWWEFeRUp2cHBzdnREUFNdVNFUQ13T0NdT0N9XXdHXVtDC9/P++uHh5Pv6+fH18v3IwsDH0lXexNjc0sXF39RXV1tNQFtYQklYSX1zS093TkJHWlpYWUBKcXRaX9Tc2NnVUdfUUlbZxcXJ9/bD09DQU1pf11lIQUFKc3JzfHxzdEJbUFZXVl5aWlJQXNTe117U2tjZzPf/+frn5+f4/PP88PH29sjZ19PRUdXd0dXX09/WVlRdRkxGV11AT0BMd0dFREBD197f3dFQX0NLQkZGXFRUXkxCQU5ORV3R3NnGx8XfVlBTWVtcU0N0dUJNTkJPTURTVFBX3NFWUllbVtdUUFlSR1jW3dLeyfL4+/rl+fL29/P//vL3z8fG2sfH2sTBzsPS2N9WWFxaSnVPW0tzcXF8c3B2Sk9EUVfVV0dBTEhOW1DX1tLdV1DS09be2M30z8zLwN5WUFFZW01KdHZydnd3dnRPSEdHR1FSWFNQV9Xb2VVdUtfW09jI9/Tw+OX6//L2y/XP9vP2yvXCxd7f097b2cXE2t7b3VFAR0dGTEhPQHR3QE1CWVZTUV5SUl5SSUp3SklDRVhERkFATUBQ1NfczfX3zMDY39RX1VdGSU5OQnVOQ15bW1pfX11TUl9HXdfQWl1QWE1OR1hd1NrMyvf/+Pjx9PX0yvT39vH2/fPx9Pf29s7Oy/fIxtDQ1URNTkJ2fHB0fH52Q0dHQUdCTkBPSHFKQk1NQFhTX19S1N1U38bC28HL8fTG2dnURkFAQnV1dXF8cHFKS3RIQVpFW0RTVlbV2tNXXNTRWlzay8rI9fbK8P389Mv0yNrawM/Cx8/DycHEz8/b3szy8Mfc0tpXWkdGTkhNRExFXdTQ1NFVWE1KcXFzdnV1dHFwT1t1dEXQ1FdUws/By/fJxsXF3l1fXFNZVlhdWExaUlpMQ19QQ0xS0V1aWNVcTEtASHFGUN/d08fOx8r19vf39vH0w83P9MjP9P798fDy8PX3/PDCx97ZX0NPS3RxcHB0S0lBUllbTUd0fHlzcnN2dXVwTkVdW1TB9PXIyvH3zsnL9MbZ3dZeTU5YXFpJQFtCdXd1d3VNRkxGWVNTU1VUWUFBRlpEV9/Czc3B9PDIz/by/fDx8M3a3tvW3dnBwdvEwM3O9fX3yMDAwtxWQ0JHQE1EX1NQU9HTVFlFd3FzcHB8fXJ+eHZKdUhe09rFzcPMyc3AzMrOw9nc11JZVVFQV9fXUVZfR01YWEdaXFJcWFxdR3V2dHZ2dERdUlHdxczNyffw8vz++/n1zM/I28b19MnL9/f19v3w9vT2zttWR0h1dEp0SE1NXVBYT0ZBSn19cXN5eXN2fn53QEJM18339ffz//DP9PfKxtjf319EW15FTEVVUVtYQXR3TUFESFjV1FxW1FFPdk5DR0xZ0cTf08vwzM/3/f328P/x29ra3lBW2MLH38TOyc3P8vj39vLxxV5BWEJ2SVxQV9Pc21BdXUR0cXB2fGV7eGVke3x0d0/XzsffxPHx2Mbx8cLBw8/cU9TQ1NHdxMHcVVFdREVPWFtDWVBYTk5MdXx5c3RwdENUVFLQzM7J9v/7+/78+fPLwMvJwsHK8cvI9fP29P36/vHKztFFdXdKcHB0WlhfWFxET0pIdXB8cnRyfn5yeXlyTV5Q1sn39Mv08Pf1yvb0zd7Q0FdYXVVXVFFRUltJQnZ2cXdIREVdU0ZHd3V0S3FNTEFfVNzc3dv19vL9/vn/9vH0z8DEwcXe3cXCw8XDyPf18fL+/PHP3ldGR05ARV1V1NzRXVtHQ0x2cXNzeGRmYWdnenJ0SUNe19DW08TYwsPO9/X0zdvZxsbEwM/CwN3E31JcQUh0dUtbX1pLdHR0cnZLdHVLQURaQ1LU0cbI8Pjl+v///fH29ffLysrP9PfI9/Ly/fPz/P31xVFfRUh3dExNSUtBQ0pLTEtKdHF3TnF6emV4eX11R1zW2cXHwM3CwMXHwMvKzdja0dTbxdvb29hVX1lHQnRxc3B1SVpFQkJBXFJHW1ZcRFhQUl9Q3d7e28vz/fH18/bNwMDH2N3FxNrFz8/O9ff9/P3/8PTO3NzfUERd1VNaRVBRXlNfWkZKd3F+ZmFhZmRkf0pNQF9V1VXU09/Q28j09vX08PTDyPTKysnNxNPQ3NREdHZwcn9ydnZwcHdPSnZMWEtxdUNYQUZVwc31/Pv4//3/8vDw8vz2zsvw9Pby8PfJ9PH1x97F3VNHRVtPc3FKdXdKWllOTF1SXFpNdXJ4enh9cXdHVlVU2cDb0dTS3NnYwcDGwM7OzcXax9/U1dLQVFdWWUh0Tkp2cXRDRkdBXlNcQUdcR0lNUlJZVtrAw8LL9PXPxsHI9MPMzsLByff29vfz8vzy8Pfx9MjA2tPR0VxYWlxQXl5TWUdBRk5LcHh7ZmFgZHh/fHFCR1taX11cVdnFwPXx/Pv+8vPy8Mn1y8/GwM7G3VdBdXZzcn9xdnNycUp1SHV1dnZ3dU1HUtXfzvT38PPy9Pb08Pzy8ffy//z//PPx9fTJysnFxsPA3VRUUEdER0RFREVBQEdbQENASXF2cXx8fXF2dUJGRFBTUFPVVdXT19Ddw/T29fTJwcbDx9jY3dbT09VXXERMTk51SU5OSHVLQkBNdU9MSktMXFFV1sLIzMbO9M7Bzcv29/X2/fzx8vLx9Mrx8fX19/bKzMna0NbSV1NUUFNdRU9OdHN8fn57ZWVle3p4cnZ3cU5CWkVBVtnS2Mz0zsny8vzy/PDy8MjL8/TD28XTWkZcWHZ2dkp9fHJ9eHh+eH9/eXNKc3RfxcfbyPL39PDy/fDy//v9/f765fnx8P3IycvL2sfPz9zQ0NHXUF5cVV5bRlpId3RCd3l+c31leHxwc3d3dUxBQ1xXX0fUzd7Q3svD2svy9M738PXJyM3Nx9hQV9NVXlRXREJFTXFycHF/fXJzcnJwdEp0TF/R1FTb8fXP9PD29vDy8fby8vn6/vb5+fL28vz0xsjK3dbBx9RXUNRZWEF0dkl2fHJ/ZWR7ZGRlfH1/c0p0d01aXUVQxczDwMD38/DK8v/x8fD89vT0ydzSUV9eXFtPQkBCdHRwfnl2fXh+cn5lfnZ2SllQ1dHGz/by/PD/+vnz/f7x8P/6/fL5+P3y8/b39M/e2NnUUdVTWFtcQEpKSUlJWEBKcXZyeXl/eHxwfXNOQUhJRVhEVtnE09Lax8/39PXw8/D1/P70wczEU1bXUFlaRUBNW0BLdEtxc3Z0cXJyfnp5dHd1WdZSVMTK98rx/f798/P+/PTK/P78/+Xl8vD98M/OwNzX1llHWV5NT0ZPdE9cQkhARndydnF7e3NzfnBPdUhNTEpEVdXQzPTCx/f0zvf9/v3z8PD29MDS39NeRVNbQ05PSkpMRklJTXdwdUhwfH5/eH13SEfR2dfb9Pf18f/89v34//z58/fy+f7/+vry9PD0w8HE1VNRXkNNW0J3SF5BQ1JQRERNdn5/f2VleHtkfHFxc3d3SkFQ093Bzsv08/Dx/vv8/fn68vDxwdXT2VBQ111BTUJMS0BDcHB0cnlwd3thZXJ4ZXdPTl/Q3Mf29Pfx/Pzy+OT4/Pj7+Prk5+Tl5f3398nZ29dZX15Od0JGS3ZCWkxMW0VMdXZzfXN/e359eXl0QXZxQVtGUMzKzcvx9PXw8PHx8/H28/30wsXRWVbWUUVeXkNPRVxHTUh0dnVyfXFxe3p8c31zTkVf1NnHyPf28f/88/L4+vLy+PL3/OX7/vv8ysDMx9De1lxfX0dAXlRESV9XR01fWndwdHB/eXpnZXh7fktCd0pZV1zSz87Cyfb09ff39vL98/L+9sfBx1df1txdW9TVWFpcQU5Idn1zcXl6fHNkZ3l+ZX5LRkJXw8PK/Pv++uT6++Tn+Pz6+/375+T/8vbB0dBTRkVZQUVXV1taXkNLRFxCTkdCdnZ0cH97e3t8dnF2RVJEX9rLx8bL9s7198nDwsbA9vP3y/TP3VXXX0ZZV1Jd1NZYTUNPd3RIdnZ1dn1ycXl7cnZwcENeUNzM9PH/+vn75OT++/vxzvfx9PD+/ffLwNZTU0RGXFTX0sTfXV5RVlhX10RIQ0lzf35lZmR6ZX53cHFHVFDVwcjHxfT2zs/N2dHbwsP18vbI98rQVdvcUNTY39TWUE91dnBzdnRyfHByenp+eWV9dnN0X9XXwvD9/uXk5+Dj5+Xk+PT3/vz09/z2wtjWQE9BTE5cVV1Q0VBCQl9GS0ReTndPdX18cnx5fHFwS1lZWNfHwsLx8/X18Mrc0tZdXNTS38PIwMbH11tQ1lBe1NnQUFFRWkFGS3VCQnV0SHd/cUlxckhCSURV0NLG9Pf2+ufl5OX/9vTI2trIy8P0/M7R0tBfWlHX1NPZ3sTD3FXX3VBBRVJNcnJzemR4eHt8cHB0REdDUdnfx/Hz9PX0xVTR2dVR2c3PyvbJ2MfaV1XH0lzV2FBAXVl3cEh0fHZLcn9zcH99dHF9SFlMTtXH2cL8+uTg7ebn4OT8/f30yfT2zcTFVUFNQElKRV1BQNXf0dLWXVbT1Vhc1UZ0SE92dk5PdUpARkRSVFLUz8rJ9PfD39vcWkRRWUdU29LQxN5WUNfXXdXRVlXc0FJQVVhJRVNMdURaSU5DSnVPT3F2TEt1WtXX2/b5+OXm5OXl+vHP9cvMzM7b0NFQQEBfRUFY19TQzM7ExMDb093RWEBaRnR3d3x5cnJ+fXRMd0pZUNXEzcHNzs3Fx9rQUNbf09vMzcDHx8be2NhUUdfRVdVWW0RGREx1Tkp0Skl1SnV0d3d1dHdIQkZR28jx/uXm4eDg5OX78/b09c/ExdZdR0FJdkp1dEFX19bR3tjT39/VUVBSWF9fQE5OT3FxQkdARltdVNHYxcfGxsTF2dBTX1xdX1bT3dLQVFTR11FZU1HV11XR1tVRVtVQUFNQV1JbW0VDTkpxcHZ2cXVBRVDYzPf85eTl+vv+8ff09cvCxtvS1lNFWFpDQFHT3MTBws/PzMTd0dRTW1xeQHR3d3N9fXBwdnZKWFJcV93axdnc3dPX1NbU3NjEz8/Ows/Dxd7Q0VfX3VdR1VZfXkVHQ0BEQk5GTHd3dHFwcHBzfHVbXdfMyvf85Obm5uHk+P7w9PH0xt7c1FhHRkpzd05NWlNVVtbS3NnY21ZSVFxeV1BBTUVDSElFR0BdVlXS2N/Q28XWU9bRR0ZbW0dc0tfW3NPU19ZWU9VUVtXf3tfZ2tFX0d9RXdVVUF9aTkt1c3x8fH52RFxS18bNyPH+//38//b098rI9c/a2sfSV1BRXkFc19bc2sbB2NnF2t7UWVpSRkhMSnF8fXFwcU5AR15W09jc2NrQ1VXX0NdQUdVUVN3DyMXEw8Td09LRV1BTV1dVVV1SXkBBRkFCTENIdEpJdHBxcHFJWtXbzsr18vj5+eTk/vzy88rMy8Df0NBXW1tBSUhKTEFWVlPX0tzX0tjQU15SUFJZW1pPS09NRVlS1N/Y2sLDwcba3NbUUF5YQU51T0ZFXFdVVlPR0NVU1VdQ1dna2cTDxdHVVdfXV1ZSWUdISE50cHN2S0lHVNLT2MHJ9Pbw8fT19MrD2d7Y3NTQ0tPX1tddXFbV3MTCxsTJzMXY3dRSU1JGQkJ1c3B3dE5HRVpT19TW2NnVVNfVU1BVUFlZQUdQ19TV3sXe2szF1NzdX1bZ2NbR3tFTUlBYWFxDSkhLcXNKS3F2REVa0tvSxvfx9/P+8vD98vX38cfc2t5WXlVVRURcQktaRU1e3dFR3cfWV9LTXlbQUFpbW0xNUVVT1sXFxsjD3sDO21dRV0FMWkF0SU1IdU1GRl3R0FTU3VFdVlNd0s/D28LLwcXF31XQ3lNAR0ZCTEFAS05eXFxQVdbYwMTYxcLNxcDA2MDG3dTW0NDS3djWV1RVUVJU3MDNzcjL9c/f3NdfWVlCd3dLTk1AW1pc1VRU1VXQ1NVXXV9V0VFRUFNR1NRR1djDx8XC293UXVpHU9XV0NLe3djEVFhbRU10d3Z3TkJMQl5R1NLZ3NnN9cvNyfT09/XIy8nP2dDTVFfR01ZeU1xHQ0l1Q1xcX9fFw8bAwNnd39NVVlNbWNfZ1dTEwNnQ3N7e2FVeXllBT0dFQk5DRENOQ1pZUdVQV9DRXlpcXFbZxsHN9cvJ9vXE2tlRQ0NaQ0JEW09NWERaUVZdV9ndUdTa01XQ3dLFw9zQ2sTf2snO09bdVVJZXVfT297Ez/TPxs7a1VdRWENBQk5DX1hAUFdERlxXV9dVXF5WV1tf1lNd1NBWXdza3tjF3Nfe0UdBXFlGUdnZ38XH0t3eVFxeQHFzTk1KSF9eW1dWXdfH2NPGzMTFysjGwMPF28bf1tPa0lbd2FdYW01xd05JTlHQV97IzsbK98bf2dBSVNPUUdLa09HF2VBU3NVdUVFHTUVPdUJGdHRCT0tFVlFU1tZUVlRfXNfc1t3Mzsn18crD9c/T19BaSERESEhFW05PQE1DUFdeXdVVXFLe3dTbwd/TwcPGzcPY28DH1ldQW0VSUVTe2tvYx8/AwM3a1VNXWURcW0BHUV9NWVFZW1dXX1fUU1hRU1te1FFGX9RUVt3b3d7F3VNQVlhbUVVX09nc3MXb0dbTV0ZHXkRPTUZBRVhHWl9eXVXc3NHdxMXEzczDwMTe0N/Z09HS19TS01BeWUdNQl9ZW1TQ0dDEzMbF2tjW09jT19DU1dbc09XX3VVeVlZeRFpbWV9ZW0BNTXVJR0FAW1bV1NXW19Tc0tPY2dLdxsPDz8nD2cTZVlFRR0hCWkxIQ0RCTFleWl1fRFnS2d7AythR3MbT1trZ19Le3N/F31JX2dzR3NxVV93f0sXN3FPT2VFQ11FbRVpaX1RSQVHcVVLU1VhaUlRQVdBfQFxSRltVUlpW2dPU3thX0szfVd3cUVzQ31ZV2NRb1NNdRV5BS0xZQUhYX09b11ZfVdDW3sj1yff2xdTGwdZU11FbUdNVV9PVR1PYVFpX0F9d39nV3MLWU9rFV1XF3FLV299V2cXX0sfUWVfVRVvQ10dFVUV0QEZKTERAR1Td1Vfbx93bzN9X3dNcU97eUNLM0tHPw1BdXENCRVpLdVxdTkRXREJe1VTQy/fAw/XH3cHYXllUUF7U3VVUx8Lc2MbZ0dHXXVHe3FfV0lTV3dZdXdZRXtbdV9fGxtHS3tdQUVZbV9lRRlpTRUJeUkFCUVNbVtZQ1MLM3tzH3lBQUEZZ19RSVMTH2Nrb1VheRE5CQExEXFlNR1FSXdHawMrz9s3O9cPb39VbRV9HQV5QUlHZ2tTcw9xSUNdQUNHWU9TE3FTS09bf3N3Q2c7B38Tb19TW1VxdUFNWUV1GWl9PTEVHREVFQ0ZdVdfR2dnQ3NzWV1dUVtXf39zPyMbYxMTUUVxNSE5NTE1ATExDR15c0sHDz83JzcDCx93X1FJYWkZFVtXV397Yx9zRVFLU1tTVUNbd0NDc0NHf0d3d1dDb39bU0dZXXVNSU9fWVVRWV1dcX11YX1FbWlhFWlzV0dXT2dFX1VddVlVXUdXc2N7F2NnZ3dVZWkVDQkRaQEBFRUdbUtTHzszAzsnDw8Ha3NHUXkFEREdYUlBQVdbUUFZUUNDZ0dHY2t/Zx8Da28TR1d3f0tLd1FdU1FZbVtVRVddWWV9dW1pSU1lYUkRDW0dEX1JUV9Td1tHF3tHT3NDU3NvY2MDZ1tLRWEVYW0ZEWUZPQEBPQ1JXV9/F39PFwMXFzMTT3NNQXlNTWV9SXVxWVVxW0N3X0dnd0NnF3tva09bQ0tTU393W09FQU1BdW1PR1tXQ01NQVFBdXFBdW1JTRENEQUBYU1NQVNHU0MTb09/c19Dd3d3QVVJeU1BZXlBdU9VRX1tFW0NbVNXW3N/Q3djFx8fF3NDc1VtZX0VEW1hZWV1QU1PU1tbc2Nnaw8DBx9rd09/d19za09bT1lZQV1RXV9RQXFNeX1JWUV1WUVJcXVlAQk1IQl1RUNHf3sXGw8HBxNnZ2sTc0NddWVhTUlpeXkVaXl5FWlhEW1xSU9XUVlfU0tnGwsHH29/W1FRTXlpZXVFXV1TV1tDd28Xe2NvS0Nza39zZ0tDS0tDQ1lRXUFxfUVVXUl1RV1XX1tXV0d3W0VVeRENMT0ZeXFFXVlXcx8fHw8TY2N/T1FVdRUZaRVheX19cVNfVVVRcW1FXUlbT0FTR3NLew8PY2dzRV11fRkZFW1pFU1FTUVRV1tjY3MfE39vBxtrbxdvf39/T28HS1FVUXFheW0BDWEVb1VVX0NvcVNfQUEZBTXVGU1PU0t7dxMnOxcLLxNjG2dDWVF5CQEZMT1hbQVJVXVleXkdFXEdCVtdcUdDS3sHNzcfH2N3f3FZR0NVcXFZUV9TTUV3XV17V0ldU09NV1NjTVN/F3dzB31dWVFZdVlVeWFdQXFXd3NnDwtve2ddZW1pMSUFFX9XX1NzBwN7bw8TS2dnW1VFFTU5MSU9f1FJR3dRT1NZSXVRRWlzS1V3T3dfdwcfExNvTVNRUXlxUX0RcVl5ZUdVTVt/XVN/SVNHc19bbx9jZwMDawcfQ1dZUW1pRXUFZUUREV9VW3cHb38bbUV5RRU1cV1NV2dzW3sDH2cLJ3tzE0V5SU0dJQkFPQFxFR1ZVXl3QUVtfUVhaUVRfUdzQ0s70zsPNwdzQ0FBS0NdYXlRZQ1pSWF7R3FfU11pGVlZT1d/Y3djG2t7Gx9fR2ddWVFRZRVNRRF7R1NDCz8fDx9zVUlxaW1TVXF9WU1HX2NvFz8LT19NYRl1cREVcXVhYWkZaV1FZUtHXX11XXFhSUVNX38XA9/TGxMfZ1VNQUF1RXEFDQkxCRFJR19jE1FhSXFxW19Hex8fZ2cTGxMbB3dbd2dFSX1lFW15FRdfe09Lb2t7c3VdcXVFQUlBYRVDT0NLN9c7Cw9xQVdRdX1NSRVtbT3RMRUJAXFNeVlVZRl1RW1zX1lTH98nDy8jExdvUUlXTXVpSW0xFVlhY1N1WUtdcTFhUWVjT2dHU3dVXxMnF2sjD09jYUFtW1VtF1VRf3sbR1NvC393a1VhU0VtEU11GU9DR3s/10tXa3VHR0l1YVdVFQEFKd0FYTUXU1V9eXEVGU1VYUt7T0cTP2tvLzNLS3tVf1VVaW1VXR1lRX19VVFpb1FFaXFZZWdPSUVfT1tfHys/N9c7d09JWU1RUXVDc01BU1FbXxsXS09xUWlxQWF/WUUVQ0NLcxMfR18fb1dDTVlZXXUFGX0dKTF5aXtVQRURdU19S1lVX3tNU1t/ax8XZ0NfS0V1SV1NSVVFQVlZQWVhSU1DXUFpdVVRXVFRWVd3f08TJw9rF2ddV0dFRVtDQVdfVXl5V09TQ2t7W0NFTUNDQUFHW1tHT3NLdxdrT0NLXUFVVRENFR0ZFR0xDXVlNRlhaRl5TUtfZ09fW0dXWw8Dcx8/b1t7a0dLb1l5X2FRaXVtNR1NdQVpdRFpQUFtS0FRW3cfFxM7P3NjCxN7Zx9rFw9zU0tJXUdfUUNXXXEVZUlhdVl9ZV9LVVtPe0t7F01fS29ZX0FRcUdRTWVTUXlpYWkBEXEVDX9dRXVdeQVtXVlPQ3tzT3tZW3djWVtHd0dzY0FZV1lRRVlBeXVVdW1fVUVXW19DaxdHX3N1X0NnW1NjF3dDQ1FHU31VX2d1W1N3WV9DZVFPS3tbd2dbX3sXSV9bXX1BUWUVYRENHWFlfVlBBQkVFRFlYWFBXVVNQ1lBaVtbU3cTb3N3e3d/D21XQ2t/R0tzUXV5fR0FbWkNHWFlS1dRW197Z3MTF3tvGxNvExsXe39/R1tDW1dHT09LRV19WV1tFUFZSU1ZVVdLT0d3d09XU0NVRV1XUVlFSUldQX19RVl9dVlNTX1hYWVtaWF5ZRERaXFJRUFDU1tPd09vE29raxcHH29/S1FRTR0VaW11S1dbU3djZ3N3T3tvY3dzZ2NBRVFRQ1dRX1dze3dzY0tbS0tZXVFfX0tZX197e19DY3dXUVV9eV1ddU1JaW19GT0FERVhX1F1R111BRF5aWFJSWFLT1FDX1FJU3N3d2sPa38bH3MXOxdTX0VNbR011SEREX9TQ1dPcVFTexMXGzMPEwMbXU1RUXVbW1lXcxN/Q3N3R3NxWXFRUXltQUFJX0dDT3t7VUFBcUtTd09bT0FZfRUFBXFJc1d3XVlBZQ0FFWkVaW1pZXFhHXlBdUlTVVFXS0dfcxMXEzcPFxsbSUFxcWFhdXV3W0tXV1FNQ0d7b2NjH2dBUX1xXVlPU3NzS3Nvb38TB3NrE09zY11xS19DW0d7f2MHdV1RSWllSV19ZUV9OSkt1TFpaWVPVUVtERUFYUlxTVVRQUVdSXdTc11fd3dfW1lZR19ne2sbb28HbVV9SW0JBX1xZVNdSX1dV1NLY3t7GwdzT1FfU39/Q39re1tbc0tHZ2dLS3dZUUF1BRVTVVtDe38XB2dDd3NVQ1NZW1dZTW1tZWVxQXVxW1VlDQEBNQV5eXlJRWkdeWFhX1tVV0N3WVlZQUNfT09nHwcHBxtjQ09FTWV5fWF1fRFhRU19X1lTU0FdeXl1TVNzf397H29DdxMbax8DBxszD3dDRV9Tc3NDfxdncxcTf09NRX11TXVtFQE1BWFtbWVlaWV5ETURZWlpT11dV11ZQ1NHR0t7c3Njb0VJcUlxSVNXT3t7XV9HRVlTVU1tfXFpGWFldVdBUUdbT1tTVVlDV0t3Yw83H2tre3drb0dTS2NnZ3tRdUlNTV9HQ0tnc19DFxtve0tDQ0NZXV9dUVtTUUFlcX0FAQUdYUl1ZXFRUW1tdX1lTVlJV0NzT0dFQX9XQ1dTf3tLd0tHR39xUV9HXVVRQWVpZU1xeUl5YX1lAQ15SUdbfxdrCwd7bxdvY29jc3d/E29/e393f3dbdxdrd0t/d0Nnf19Hc11JSXVxdVdRdXVxFQEBBSUhFU13X2NNU1FdeU9PTUFDW0dDe2dFVV1ZQVtPUVdFVX15SUFFWUVNX09ZQV1FcXVbVV11dWUVFW1hT3N/T2svLwMDG29jD2tbT0VVfU1VfWVXQVlTf0tfS0tfV39nW3Mfa2drY0dHf2N3S39ZRUF5MSUdGQ0RXVFfQVF5GRkFEUl1GRlJQWF3UVVJWVFXQxNvX0tnW19vY1VfS0tbe2NHX3NReU1FZTk5PcXZBWV7Rx9rFzM3f38DF193a0VRVUFtZVldW3drT38LB3NzF2d3e2dbRxd3U0tBTUtbRV1TWUkRHR09CUlNd1sfa1t3cUFhfR0xBRE1MWVlAWNTVXVDVV9XQ01VU0NFV09NUVNLd1tzG2tLf3FZWVlpPQkZDQF/X0d7NzsLAxdLT0tVcXVRdRkBEQkZTV9ff2tjZxsHb2MLA29vGwcfDxtvYxN/R0tzVUVVTW0dFWkBEXl5S1tdeRUdNSnV1dnZKSHVNW1hQ097f39vE39/a3t3FxN3d2dnf28fY2cTfVFXWU1tGT3R2dU5PR1XS3cHC2N3c3VRX1VFcVlFbX1VXV9LFxMXHw8TFwsLHwcDZ2cfE39zb0lHU1lNX0tVQVlFfRVleRVjV1FXQ11xGQ0x3c3d2cHVPS0NSUlzV3NBV0txV1Njf3MTA29rDw9/Yw8TT3dxU1dFRWltfQ0tGRUFf3NvZxMbc0NBRR1lRWUdeUlld19PRxc/Bxc3DxcfKzMfMy8LByMHT28VVUNbQ1dfc1lBVVVlGWFpGW1dQX1NTQUlPd3J2dXFxT0FDWVRXUdDc1tDY2N/YxdnbzMrJw8PF3dnF0tXR1lZRVl5HRkNLS0deUdLd1tbc39ZRXFhGWlxfUtTW19PexMfJ9cLBz8jJysjBw87MxsXY0tVXVlDV0dLS1tdXUVZTWERbXl9dXVxRUV5AT0l0dXd2dUhMRF9dXFDVVlNXVFXQ3d3fxMPIzsfa3NPT1tbW0tPW1FZTUFNZRFtaRVbU1dDZ39DVVVJZXkVARV9RV9Df3NjAzcHBzszCzsnMzvfIx8fF0NDd0VXX09bR297W0d/UX1JdWkZGQUJFX0FJQ0F1dE9KdnVJTkNcXFpQ1F5YVNDX0NjbxMj1zMDPzdzYxNzT3N/V1d3UUlBUREJZW0JYVlJW39lXU9VdRkRZRVrV1VbSxNnT2s/axcr1yffxys72ztzc2NRfUdVQVdzR19jF0FTR1VpEWEFORltAQV9ESE1GS3dDR0pCWVpFUlBGRl5YRlPXUVTYx97FyM/HwczE2sLa1t3Z1Vfbxt3T3VdFWlpCWldQU9be0NXVVltaWUFHUlZcV9nc19Pb2NzGwcfO9MvPyMze2cbf19LTU1PW1tHbxtjf3tFdW0RPS0BGTEJEQ0hJSXR1QEB1T1pHRl5eR0RZWlpW0NfTxsbZwcvOzM7Ows71wd3S01VU3d3R1tdfR1paQkdQXVtR1lZSV11HWVJeW1ZUUlTf0Nbd3trYwczJ9ff1z8zMxNrb3dXV1VJfXVFW0NLX1tBUWVtEQUBaWFpEWVpNTE1DQ0RZRUZbXl9ZWUBGRENDRVxdVtPY2cXGw83BxsHB2tLQ1lRV0dnf39nf1FBdUFBR1dXQ0dbVVVZSUFZdWVhcWVpR1FVX0Nzf39zbx8zBwcLOwMTDzMTe0tZTXl1dUdbS0Nzd11BcRk1HRENNRURNTEBAQEZAQ01NT0lAREFPQV5EWlHXV9bb2dnGzMLMz8zCzMLa09DUU1bS3tHR3NNQUFfVV9VX1ddVUlJVXVlQVV1eVldeXFTXVNTYxcTGzcDI9M/Dyszd38bbVdHe1l1QUVxcVFRUV1NbR15aQ0RSW0BYUkZAWVxbWFFfRkNCTEFATE5HWUdaVNdX08XA2MHNw8bEx9nb3tdV1FZT1dvf0tnbVVNU1lVU0NDR1NDU0NNUUFVWW1tX1V1R0tLX3dvY39nYxMbHw8LO2N3FwdnS3trWXFbUVFNRUFFcWEdaRENMRFtBWlJRXlBVVV9ZXkRIdHV1SnVIRllaWlLT1tTewMXYxsDGxcbBwsTZ09LQVNXc297Zx8XX1dbXXFPU0dXV1NTT0ddU1V5aXFZSXVDW0VfQ39zT3sfNwMLMycDc0sXA39vGxNPVV1dcW1pFQUlKT0NJTk1HRV5T1VZd19NUX1xfWE1PTUNPTEFZW0Ff1tPU3NrB3t3Yxd/f2MXF0tLe3FdX08Tb3NrF0dXVVdRU09jF29nawNjW1tZSRV1XVlxR1NVSUFTU1NXU0NjZ39jE3tHfw9vc38Xa0tfR0FdSUlJaTExGTXVOX1RRVN7F11XW1VpDRkVCdXVAQnR1T0RBW1fW1dDYxdjQ3cbG28TDzMbbxcDY0d/ExdPQ3tvUUlDUVVHVx9nQ2MDeUlPVVUREU1VcXlbWVFDQxMXT0sfC0tbFwdzewcPY2MHC2tPT0tFTW1lESHRLS3dzS1tbWVXY297SVVdRXltaWE1JQ0B1d01bW1lV1tDT2dzd39zc2t7R09rH09bex9LS3N7U0dTc01ZW09vd0ML0wNnEwVZYUdBTQFnVUURGX9RTXNHH3NTSx9ZaVtrb1djPxt3Fz8Hd2sHH0lFSU15MSUJPSkpGXF3U28DbVVNZX0VCTkFCd3F1dHJwRllARtXe1VPR2t7dwfXI2N/OydDWw8je0dvG1tXYxdVS193RVtHaxd7f11RfW15fXllfXlpBQUdc19zf28zA3Nff3tbTyMvH2/X129HHzt/U0t9TQUdTQHF3Q0J3dVhQW1Pc0lpCXlFGQlJXR0hITkh0TFtbW1DU1VdU1NfdxMLEx8LH3dDbx97awtlX1dreV1HS0lZW2s3E3sPO3FDR29RZUNBXWlhTR3RMU1FYU93eU19U09TWwcjC2s30zdnY2trE2tzd39NVUFNfRkZZXFlEXNZWWVhSWUBPREZ1dEJ0eH9LTnZKUlBBRFTXUl3Yzsffz/D1x8TPzd3ezMPT0cTYVVXS0FVV1NbW09DVVF1cV9TX1NdRXF1bR1tSUFlf1tDX08Tf19jLycPL8PXMyvXM29/BxVFf1NFbTkReQEte119CXldZSUZSXVleUlxZREZGT0pDWkRARF9eW15SXVHR39zY2d/Yxd5UVdra19Ha31VX0NNQXdPG29bSw8bVVdrb0dPG2tRQ09NZR1xQUllbX1pBQkRYRVzSxsfGyPT09PXOwsLCx8fH29PS3NVdVtHVU1bQ115FX1hBQ1hdQEtPQXd8c0p1dE9bREFbXl9eX1fc28TCycrKysrLzMjLz8DB2NzR0NVdV9VQUtVVU15ZWkRFUNfX19XS0VJZUVdQUtXVUl9WUVhYUdbSw8j1yvX0y8jIy8nA2Njc01ZSXEFCRFJeXlTRUF9dUFxfUFBfXl1cXEdDQ0ZaXlNQXFtZR0JDWVJW1NLf3Nnc0tPS0dzaxsTFxNnRVVVV0NdV1N/d19De0lfR2NrS2MPE1lZWUl5fVlJZRFpHTHRKQk9AU9zbxs7Lw8PPy8rKy8zAx9vR19bVVlTX1tPQ0VdRXV1S1VJFWl5ESEt1dnB3S05PRFtaRkxNRFlZ0NjFxc3IwMXM9M7J9Pf1y83G0tTWVdRXU11RXFpFXl5fUldXVd3c0tXVXF1RVF1TVFBaRlpGQVhXVd/ByvT0ysbDzsvNyMjB3dNRRUReRE1HW1lfVlBdX1ZXUVRdX1FUXkdAQ05CQUBDWFZeWkVaRkVfU13X3dnd0dTV2MXb28PCwMbB2NLY2NPX0NHW1NRQV9Df3tna2drAw97W1NRQUFJfX1lBSnd2cXdOQ0dS3NvExsDDzMjIyvT29cPF3VRXVFBeXVXX0dHW1NRWU1dRWURcXkBKSXV2c3Bxd3VLTkJAR19TVlTT2tve28XHwM7KycrK9c7Iwdva2tPU0dDVUFFdWFhdUldQVNHf39fR3N1RVd3TVNTUUkBNRkJAQ1tS19Dex83HwMjIws3Kycfe31ZdWEVPQltEWl1UXVLV1lBX1NDX1FVTXV5bQUBIdUpCS3dPWERPW11cWlFVVVbR2cTG2sfNzNvEw8PZ2MXY0djB29LW0VdVVNVU3NjY2sLG0tLd111QUF9GQU9JTkp3SEBNRlPT0d/C9MjL9vH1yPXKz9jY3dBQWVlRWERSV1JYUFFfW1JSWVpbRkBDQkNIdXd3cXR0SENbW1NUV9bT09DExsDD9MvCzvXLw83Cw9nd3tnW0dbUUF9fXlxeUNbe09jAwt/FwNrS19dQWERZWkFNRkZBRl5R1dHbyMrKy/TMxdva0tHVV1xYXkdHR1hFXlNWUdXR393R09DRVFdSU1pHRk13cXR1dHdOQkBMRVlbRFzU0dHcwMPGxMnLzMbPzsHEzMvA29nH2dzR1tdVVNHS3N7YxsTZ0N/c1l1bQE1KdU9PS3VDRFpHUtHc2c/w8vH28fTNx8PB3FZU0VZYXFFTWVlXUF5aU1dTWlhTXVpEWkVBSUxLd3F0S0xPTEReWEdfVlZdVdjH2sL19c3C9fTMxMPNwd/FxtnU1N/TU19U11BS3drc0dvG2NLfxd5WWF5ZQEhNQENMQUVbWVLW0tnHyPf0ycPMwN3U09JXUlFUUF5X0ddV1NLQVVTc39FWVdRSRF5RW0xMQU9xcUtLcXFJQExKT0ZGQVhU0NzYw8nIzs7Jz83My8/Pzs7Cxdjb2t1U1NLSVNXbxtjT2NrTUFTRUURAWkVOdUlPdXRDWEREUd/f3szx8MrK98jF0tva3NDT39PXVNPf1lTV0dRRV1dTX15SXFhGRUROSEhJdXF3S0h3dERZRE9bU19eV8bNzc/38c7NyMnB28PNwcXb2tDX0NPUXVBXUF1T0d/c0NLe0NdV0dNQXFxTWEFCQUVDTUdZU1JU3NvbwfXLwsXY2NbR0tbUVNdUUFJU3dHW0N7b0dDd39dWVVdRX11TWUVCSU9JSnR0dnVLdHR0SE9IQF7X3dvDz8rDwcPMy8LDyPfLwczCwtre2Nzc19XR0N3d39DR0ldSUFVXWFhSV1hMQ0NDSnVPQkZEUNLFxsDKy8rLw8fbwdvd39vH0VTV19ZQUdTQ0VFWV1RdWlhZW0FDR0VaT09NQ0BJTk5PTU5NQ0VFRltT093dxcn3z8DPyM/ax8LD2NLY2dnQ0dPX0VRSUlHWVNTR3N7V1dTc0lXQ39rQUFBTXUFNRltYRF9U0t3Q28TE3tHT0t3U1dPd3NVWXV1XUlHV2dnX0Nna0VDV1FZbRV9cXERbXltBS0hKdXFxdHVPTklCQFpbUtbZwsHAz/X0yvX09vTDw83JwdnHxtvUVdLd0VfW0NPXUVBdUlxbXFBUUFtaRVtOSUNGRUFaUNPc3cDL9c3HwcPC29jGwMHS09HUVllR1dVWVtfU1VZdXkVaRkNARFtGRlhcW01CQ0BPd0pDWkJPRVlcWFDfxsDAy8rKy/X39crMxMXZ297T0NPf1FXX091XU1Xc0FDV09BQU9DQ1lFTVlJcWlhYWEVAWl1X1tDS2MfE2dzexdzS2MTH09fW11ZYU9HS1FTT3t/X1ddUXVpYX1lZXlNfXl1fW0BATXd2dUxKdEhGWUREUd/e1t3C9crK8PL2ysnLwsXe2Nve2d7Z2cXF09VV3d9XU1DUUFteUVRZRlheQUtDWVpDQ19QU1DX3N7Exdvaxs3AwMDDzMba3t7SU1bU11FeU1VUWEVdUFxAQ1lZWUVZX1haWl5FQUxOTkpITEJBWFNeWVbbwN3fzfTKzvTw98/BwMbc1dXf09dV09/e3NHVVdbUV1bX09dQVNHSVF1dXVpPQlpeWkRS1NVdXFXR1lXW2cXGwcDHxMbF39HT11JeUVVXUNXW1V5YU9VXW1lWVlJZX1BSXlhbRkZOdHR0SnVLTVtaQVpc1t/S38TOz8fM9vP0zsr3ztjcxdjT19zb2N/S3dPWVFTV19BVUlNX1FBYWlxZSnVHX0RAX1RUXFLR3t3Q3cTBxsXHwszG2sXZ3tddXlNXU1JQUFdeQEZeXkFYVdBXX1DUVVlHWlpGTkpNRkJJQ0NCQ0FBRFNUVNbYwsDEw8j3yczPy87Y39rDxdPd2djd19Lf3dfR3sfa0t3d0dVRUlxcXkNJQltGQ1peV19bV9LTVlDQ2t/Sxs7Pw8HCxtrc1VFU1VZQVtVUXkRbX1xZXVbWVFxSVlZYQEdbR0l0SE1OdEtARkBCQVlRUFfS28bAzcvK9MvJzsnJxtrEzcHd09nY09TU0tjd0d/b29RXVFVTW1hdUkRBRURaREFaXFNeX1DV0VXU0NjF2cXCz8PZ2dva0FTX0ddSUlFUUVtYWV1dWVBV0dVTVNRVU19ZRUFJS0hOTU5PQEVET01FXFhe1djCwsDJ9PXMzczDxNzbxsba2NvY2NzQ0d/Y0NbfxcXT1dTWVlhFWFxaQEZZXVlYUlRXWFtSUFBeXVXQ09Lex8Ha39nb29/S09DXU1xS1dVSXVfUV1JV3d3UVtTVVFJeXkVASEtMTElKTkBFWkBEW19eW13QxdrYwPX0z8zIy8LbxcHB2t/axNre39vZ39ZV1tPd1FdU1VdYR1peRUJHXFddXNfRVF9fUlNSWFxV3dLW3sfD2tze2dnT1NbQ111fU1RRX1JX1tdX1Nzb0FfW0NRZRVlYQU5NRkVHQkFHQENDRkVeW0Re1dzR0d7Az8bHzcjPxMfDzMbbxs3CxMTAxtvT0dDd3NHW3NzWXVpEW0VAQ1tQU1xQ1FRZRFlfRE9HUlRRUtbZ2N3S2djY3t3d3dzRVdTQ09HX1tLWVlTT0lVTV9PVWEFYWVpBR1hZW0ZHR0ZBQVpZXl5eU1fV19TcxMLDw8/1ysDGwsvM2tvBxt7exNvdVVXW11VRV9DXUVxcX15eWFxRV9VdU1TVUV1QVlZYW11QXFtR09zQVdHd0FdX0dPR1dfT0t3W1dfU0dfX0dDWVtTR1lNaXFJQWV5WV1JEREdBQ0NGREdGRkVFW15c1dzbxcfDw8DFx8v0yMLOyMjC28HDxdzS2dPW1VfWVVBdXFxcX1heUVZcWVxfXV9aXVdQWURZXVxeUdzb3NDe2NLX1NLY39HQ2dzQVFbU1NVWV1dSU1ldVlFTWF9TUFxcVNZRRURZXltHWl9eRUJFWVlZUtbfxdvawcbE3tnHz8zFxcDG2NLZxdvf1NDd1lVX1NVUU1HVVFRW1dbRVVJR1FVTXl1SXEBNRkRFRljV11RTUdHX1dfdx8Xd3d7f01RU0dLT09HQ0VVcXVBTUVNQVFRRUFfUVV9EXl5ET0NHQEl1SUNEWl9V3NrZ2cfBwMTAzsvLzcLNzcDe28HH2dPf2dBRUtXVU19SUF1dW19SUFddVNVXU15eWkRBQkdeU1NT1N3QV1fS3NPT2MTExd3f39DVV9HR19RV1VBZR0VfWV5dUVTQ11bX0NPVV1dVUUVBRkBNTk5GWEVaUdbW19ff2dvb2cfGx8XFx8fF2dvBxsHb2dre0FTV0dRUV9fQ0FdX09PWVdTUVl5ER01DTElBWltYXlNWV1FQVdLe39jDw9re2drE3dDZ393d0dfUUVlZXFxcWFJWUVFSVNbX0FRWVlxHTk9JSUhPQUVbR1xUVdHU2cXGwMXNz8zBx8PAw8DBxNjb0tPT1lVSUdVUVlBWVFRWUtXQ0dTX01VdRVpFRkZAW1xTUlJVVNXV19ze39LZxNvY0NHQ1tfU1tPQVFFXVl1ZX1xcUlNR1NTW1NPe2dnW0tZQWUdaREFCT0BBQU1HXl5YWVXf3t7c29vb2N3EwcbHx8LGxtne2dPRVdbW1dZXVd3W0NzQ3djW19JWU0ZDQU1NSE5CQUZDWVNSUFTQ2drZ2sDE2t7Z29je0dzZ09ZU19ZXU1xTUlFdXVdU1FZX1lVVUVVcXFxHRE1BQ0lGRkNAR19dUlHT3tzbxcTDx8XHw83MxtvF39nR0FXVVV5cVlNUUlHX1lXV39Pd0tbS1VZSXF1eRENGREVYWFBQUlZW1NPe39LZ2dvS1t7T0dTW3NfVUdXVV1ZcVFVVV1Tf09/S3dnT0dTVVFBTWFteWkFMTEtJSE5ER0RZX1TQ3dPf29jY2MHDwcDNzsDGxd/Y3N3RVtFV19XR3NLf0NPf09BX1FZfW0dEQE5ISEJJQkFYUlJUV9He2Nvcx8bGx9vBx9zQ0N7f0NTV0lFSXVHVXFZW1dBV1tXWVdVVXVFfX15YXVheQEdEQUdGXVdXVlHW3d3T3sbF2t/ZxtjH2trE397X0dRQUVPVV1fR19zf2dLS2d7T1NfRVFVdUlxEQU9GQkJbRVBSVlRU09DQ09Dc39LR0tzQ0VXd0NTUV9TRVFRX3FDQxNLBV97d0djVV19QXFxZRllZREJIQkJOTUddW19fVdTW0NfG2sDF3sTAzMDHzMHE2NzZ0NdR1dDR3NPf3N7c0tvd1FJcRFFTWVtBQEl1SEhARkVdVlbV0d3f39PewMXExdjF2tnT3sXZ0FTU1VdWUtfXVVRX1tZXVlfUVlxaRV5HW1pYXFtHTUFEXF5Z1tDW1dTe3NPQ2cXe393bxNre2djc09dU11ZQUFPW19PW09/d3tPe2dPWVlZXUVNQVlxYR0NFRERbXVRXVFZX11VVUVXX1ddU0dPT09fc3tDU1NDXVFXT2NzS0tjG2NPQ3NBWUF9SXFxYW1lAQ0tIQU9MQVlQXFlZUNVXV9TZ2d3Z2MDAwcDCzcXY3tre19LQ3dje39Lf2d7T1tzWU1lFXlpHREVFQE1MRkZGXl1RVlFXV9bQ0tHd29/Y3NvBxMfFwMDE2dbT1VFXVtbXVlBW1VZSUlFWXF5YXlJcWVtYWFpEW11SUFBW11RWUVfQ1tbS2dvd3NzY2t/f3tjf0NdV11ZXV1TQ19bR0NLQ09Hf2dDWVNHWVlBQ1VNdX19TWFlYW19aWV5dUl5dXlBRUdTV0t7c3NjBx9jd3N7Q1tPaxNjb2NnS19DU09FUV1NRW0RGQkFOTE5NRkNDQFpYX1xdVVFU1dHf3tnYx8HBzcHMzsHCx8HB2N/c39LQ1lTQVVdXUldTXVhbW0FGQ0VaRVtbXVlaWlpdWFxQV9HR0tLc297Y3sTAxcbFwcfa3tPSVFZQU9VRUlNQUVNQUlRRUlFZUl1YWUVfX15YXFZfX11QV1BUVdTUVNHU0d3R0dDQ19bW1tPU19fR0tDS0Nzf3dDX0NPQ3dzY2N7d0tNUVFBQUV1SXl5aR0FMQEJMQkJbXl5eXVRUVFfX3N3e2cXAxsbGwMHHxsfGxNrY3djc0NDQ0FVXX11SRUFCTU5JTnVLdUtITUVEWVlcV1fV193Y2draxszCwMHMw8DB2sfExNvT09dVVlFVVFZT1dVRU15SUlhHQVhYW0RGRURHRkVfXlxR0dLS3NLa2tvb2cTH29nZxcXY3N/d0dZWUFNSUFNWVFZWV9VWUlNQVlBTWVhQUllaXlxYWFpZWV1UV9TQ1tfX09fT19fc0NPW0NHe1dTQ09PX1tDd0NDQ2N/e2sDExMPY2d/cUV5TXV5ERFpGQkxPQkxAR1tSUFFT1VXX1Nff097e2MPBx8XFx8ba2MXG29nf3dbc2cPJxVDdX1lUTkBNTEFOd05MW0h1TEFBUl9e1lLTVNjcU8bAxtrG39zd0sLQ0NrC3NzQ39/XVlbYVtDdU9XeV1lVUFtHQ1/URUBdWEJYQFXeUVbBwcXB2s3M3N7H2s3bwc3M2cbb0sXUUcTSUVRYVl5cX9/WUsPUV1FT0VpfXl9KVlpwXHFbdEbWUFVcUV7c1lbdW9XYVFRR2VfVUVRVVVXY0dba31faxVPYx8vZxPXK38X03lXV0tfVXF1JQUN0RHJCW153QVZDR1LUd9PARdHD28AKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwYjljZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbwpAQCAtMCwwICsxLDEwIEBACis4MTkyIDEgMAorODE5MiAxIDEwMjQwMDAKKzgxOTIgMSAyMDQ4MDAwCis4MTkyIDEgMzA3MjAwMAorODE5MiAxIDQwOTYwMDAKKzgxOTIgMSA1MTIwMDAwCis4MTkyIDEgNjE0NDAwMAorODE5MiAxIDcxNjgwMDAKKzgxOTIgMSA4MTkyMDAwCis1NDYyIDEgOTIxNjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzhmMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcKQEAgLTAsMCArMSBAQAorP0NLXuXm6v1cWGBaVGry/l1YW1BTXFtrb+Pc5dna2tzqXVRaYHB81c/l6OT4e+fPxMTH0f5eTUZT69DFwcDJ42lVS0tm2s3IyMjN5GxeXlxRTWh2XevZ19V0WE9CRVZ9zMXM0O5IQDw9SljPwMPKy+FbS0VRWk1ZaWnsbWrp5fve3unjavX3T01RS1dw6c/N0cnPfWVNVWRSXuDb3fRr7Gtb4MrCvsrcXD85Oj9Zz8C5vMvlWUZBRV/PzMrEzOphTVFPRlbhzcfLycDOaFdOT1tg2tHb0NpvV0tJW2zvzsjHzeDjd01SfeJ8XlZdVkhMV/PZ49jM6l9gY1xUTVhaT1VLSlNVXv1gV3Du7mRX7t9dXV9XWWjgzsvNztrqVUFJ6s7HwL/F02hNRkruzMC8vsDDz2tPTE9SXNnLzMC8v8bqVU5KSkpP5tLqdF9MSk5e59/Y1/diV0hDTWLdzdHc52xTRkRh1s3Lz+9jSkFFRkxo38zNd2NdVFJSTFdt6uRsZun4XVZJUPTYzsfL1nBRUUhDVtbFvcXP2mZMQj9M7sy8u76/wtP+VlVgZunY1t/d5tjX7mnl4XNRTnDy7t7efe5yefx0/t3d3f9YZGd42c/fb1dcVEdLfszEy+T7XUg/QkdQWeHO3XFjYFhPR0lMT1BOSktKUl9MSlLy2+f+2Nn0X1FLS0tky8G8urq8yWBTXu7FvLi1uL7F/E9SW9rM29bS8Ofp4tdyW25XSktOauZiVVxZaXpfbGpVWFRJUmffyM/X0XFTUkhNVF7NwcjL2G1aPzk/TOrJys7fV0pDP0hh99XVcV5VTVFPR0tIU+vt48vMy9xPTVFh0szNxtHqfVRRXfnMwsC+xsrJz+lsdebY2eDj19PV6vTf3t7hZk9LSlVm6tTQysHL5Wxo7XtfWFNe8mpl7t3dek9GP0Vf7dDN4V5MQTw4PlX46e5fWF5RTEdNWmV13tPSz9VzWFBNYt/MyczRzuD+81t11tje5NnI0fNvT0dMVt/FxcPJ1m5MSWfczsrP82VnbH3kyL2+y9toW1RMUnrlzsa/vMfS1XVOSUdd39XP5lxVR0BAPUZZ+PB5bPtSQj8+Pj9JYt/h7W5xTERCU+fZ0c7cY1pQVFRq0svb3eHSy9LMzNf7Zmfl/t7JxcjcZGBmXff44+Do7+5xfvHvbltbYG5tb35sYnTpz87f3N9mU0pdzcW+u77Dy9fO0dfMy8rM0MnCyM7pUEA9RmjdzsTC1ks7Njk8P0tVT0xDPTo2OkNJV3r99mRSST48QU1w4tnR0tldTE1WZu/i3PpZWlxt4+PZy87W5e7peVhSSk191M3OzsvNdVxcctjIvrzD4GJVUFP8zb29xMfMzMfK2eH+1szJwLy+w87g2OLo5udyalZw4e7uaFdTTkdGRE5eW1VPQz5ASFdsfmJOQT88PUddYVNKTG3n3N/9endUY/rs393ebFBe5Pfo2NfT0NXZaGH21crN2tvP4F5Ybvp6587JyMbNZUlFRmbNv7q5ur7S3ONj88zFwMbIxNl0cnPf2HV05d7o5uDtS0BGTFJXZ1dPR0JAQ0VSZGRZTFJbSkBMTlVVXHRcUWVxYlpJTF/g6ebj3GRSWW7Uxb7I32t3ce3s4dzf4Orcz87h3PBTRUhd693LxMXI3l9SVlRcaObl3MzIzM3M1/Dbx8PAvbzC021cbd7Z6eng6HPq5nZdZ1lNTExPT1JRSUNHTFBVTk5bU0I4Nz9FT3TY0NTuZVtdbOfXzdbw2t91aGVj+NrNy9/z6V1MREFObG3pzs3VZk9TRkFSaX3i7NrHycvOevrl5sS9vLa4wc7h3MrNy8HMz9P549/77NXd7llOZmtdcF5ZY1NWY1VPUEM/Pj5SYlluXk5PTlpuVUpNSlBcXdnO4HZjXmr42M/U2+RpYVhLXevYz9Xl9GRb9/licO58+3vl2NZ1T0tXV1/Y09DLyMXJ62JWVV173M3MzdPc1+PfzdLm0M3Q29/4e/rv1c/KztzyaE9NVmztfvfpaVxwV1FfeXrd8WlkW2NQSEhGRmrWzc/k8XRNSVhX9tHd4N5XR0pMSk1NUVRc8X5TRD9AS1/Tyd3/+1dfWURKdH7i1eTo4tDDv8fO4ujVzcfHz8/JzsbEy8jH3d/W9l9v58/N2tbc0NX37eFe+d3p2GlJT1RIUFJLSlxs6PBeXF1hVVJSUD9JWVdaXFLn6kxfV0pVamzQ2HNXT1BNWd/S0cXTdExAQVVr3crS5ufc3dDsWVjzfH7WztXl9mRrXFZh1dXY3mddbvDVyM3NysfT3N1qWuff4dHW0sfI2WxPT1vexb29y2RUUk1fdmbez+nq7FFKTVFcYFlVUltgWmBTSFRdUmtqYNr4UFVIP01jfPRoYF9j7nhs32pbeGRZaFVRYl5g+F9U6t3Xz95iaXDe0NDO+Gbp/OfGycK9yNPdbeTLzMfQ92Jr6NHLxMfU1P9NSE1OZ+nZz8zZ593t5H1bVWTqzczYYlBYVlj67HjX33RcTUpWXV1UT1hbX1FIRT84Oj0/SE1PU1FHRUVHTHHQy83dXU9PUPrX29/KyM7Q1dPKyMW+w8vPysnO1tPNx8DDvr3Fx8jd8Obm1s3Mzc7iYFRYVk9PU11u7NvUcUtLVFp27O3Yz9n2c1lVbdvgYVVNS01OTlZNTVNOS05NUlVIREZLREBJTklIRj4+RElQU0tV8NDIydjo5+XUzM3Ty8HCyMnJx8C+vr/Bx8TAw8rP0M3LycbCx8/R5V9TUk1NVFdlZlJJSVBRUV1m7tvOzd5SRElNUFlke9/a3+drUFVfZWFm9XNmY15YUlFb7N/o6WlVTENCRUE9QEhJRkE+Ozs+QElLTFZt/3NmXF/308bBxMW/uru6uLi2trW1tLe5ubvAx8vLyMfJzt1bS0tWXeze7/j7cGRSR0hMUFVbXvvh2NjjdFNVeuz+7XdnfPLs2+1iXlVRT09MTEpKSUdGRk5tbWZnUktKSEpSSERGQkJBPj9BREtSVVZgcuHu7Oxs997Vz8zV08nLzszMxMK/u7i5vL3CwMC/vb67ury+zOn85+bh2dzV19HP7lpTVm7f1dfP09/ffHhfVV1tX1pcUk5NTEtFQUNES0xIRD46OT5CR0pMTkpEQT49QVBfcndnavfv/mpiZXvUzM3Y5OTe5uDU09bU1dvd6vXu2dzY0tLS0crJzdje3dnSysfHxsG/vsLQz8nFys3Nzc3IwcPL1dPLyszL09Xb3uB9U0VAPj5ARUM/Pj9APjk6PkFCPz47Oz1DUl5XYHJ7+m1VTkxTa/rtcG72eHVrV1Zf7s/L2OTb0s7MycvP0M7EwMfQ5u73c/T76tfNy9B7WmVo3crIxcrPztrzZWTp2dXNyc3R1dLQ2dfWzsTDwMbQ1Nzc4mxaTUtOT1FVS0hSTlZVTFBLREE9PDg2OTw/RUNGSUVFRkNGSVn77OBjWmZXaO1mbPLkzcvT1trV2NnS63Tc0MnGztTU1tDKyMvQzM/Oy9ba0tfOw8TEwsC+xdVmTm7h1sXM3d31euR79tLMx8bHydvc52lqV0xSV1ZfW0k/PUJLWlRHSEI8Pjw8QEVPT01JQURKR0lKQUVQUmRiU1NMTExOUlR41czIzel66t7RzMzQ3tbV2NLr5tXOwb7H0dfb3NvZ3NbJxsfBzt7Qzs7T2tzd19zh2d7n083Ny9PYzszFwMfXbXd+afZyVldUT1paUFFZZFhJPzo8PDs/PDc4Oj1DR0lJSkxGR0pGV+Pi3ep39vd0+PxeXHbe0c7ZbF1bVm7n3N7f2up4a2T808rEx9LPy8vGytDLysbFwcDIysrO19/l4dLOys3Z4GBo9trQ29DOz8rT92hx6Oz1bF1KSEVETkpKT1NlW0tJR0hJSUhJSk1PUFxQTFVbb2xeVkxYXFRXWVVOS05dWVVZXXz3XlFMXezm1dn5aXDs0cvQ2tvS1ODd2c7GycrM0tDSzMC8vsnHyMvMztPOvr68u73AzMrJy83d2trg5VlIRlJRUlpLRTw8PUBJPz9HTFdKT09bZk9MQUJGTFtp5ltVV0lSTVBYbN3o7GFQR0he+djvavxYZlhOUlZ0ddzfYFdTaG7k39zNz8nJzMfNxsfHxcvKzMrGwMTIxcvIys/K08/Ozs3icmzbx8PEydB9UVBSbWRie21dQjo3PEtSYGBWVk5MSUxQTlJWY1pMS01yZVteUVZPT1JjcF/x49rlX1dP+N3a32hpUUxJTWRcZ27v42hWTvrb3NPm3nxdffLOz9bPz83e4evRx8fDy8nJ19ndysXHxsjEzNrp2cXAvsfM1Hr5eO3p+fJw8GpORUBFSE1JTFtRT0xYYldSTFZaTEVBRk5aT0tOR0dKUmd34fttalRRTmzWzc93Y1VJSVF+8fVmYvhbVE5a39vU2+Dd6+ji0c3Kx8vJzMzQ2MnHwsLIyM3LzMXCysrOztbkbmLVz9HP6vhiaWlw2eLl5XVZU0xASVVf4XRaUU5PVe/9ZWRUS0hIQUtjWl9WRkA/QUJUYV1qW1RVWE9b3tnU2HRdXWBTXWJVb+zu8f1VTVle28fKzdThdOjX5drT19PR3XPUysa/xs/OysvGv8bFxM7X29jjz8nRzN1YUFBPWd3Z2tPzZV9WSElZV+/iYWBYTEZQWlX+9WtubldMUk5YZU5MS0lGRkpHT2FcWlZOR1pw9tlzY1hPS0pgW19iU1FOTkdQbeLIytPZ19LSw8LFxM3S3t/978/LxcjFv7++xL+/xsPHyM7U5nHf2M7Q6GhUU01Ucnnm9X1fUElBTV/i1dvjZ19TVGNiX2BdXVdXTlBicv1hX1ZUTERHSEhITE5VVkxNZfXl9WRUSEZGT11WVWZqX1tbW+HMx8HH0eHgffjWzs/P0+DzYE9h3drOxL/FxcnLxcnLx8DCx8bU2s7Q0uhfSUpOTGDydGbt3OfmXFjp8PD+6GBSW1Fjffzr4tlfV1BIU1Rle/lgSUxDQ0hJTU1kYVtSRk1c/uLg5lpfWFpoVk9MV11PTUZOW2Dp49Pl4dndzs7OzM3L1+JuZOzoz8/LzM7KzsbDw8bDv8HK1OXc4NfebVdES0pRWmzv59nT2f1s8tPKzNfP72VPT1plb1t1Z09EQkFHVGlhdFhNTExOUGhWZfT6Wk9LTWD4XGJoVVlZblxxW2DucFdNU1ds1tvm5WVfX+/xzMTOzd37X1504MfEzMvbcWPd0c7FzMPDzNzj19PGwc3Te1RMUV1X393b3nhcVv7s18fO2OtSSEhdb+Ha3d9uVExbXmzj5/9eS0dJV1pj8fZ7Vkc+P0FNePRsV0pFSFzw4t3f7FxKQEpb9tLV1OpSRENW5M3DxMTS8mBx8ObIv7/I1/po59LIvr67u8LS59/by8jM12lNRUpYZ+Ha3uRbUFBf+trIyNV3U0xLWevZ2l9PRkNBQ05k1s7pWUg/PUJVZ+n692xPRj5IWenP3W5WUlVS69DFxtDa5+plbubZztltVk5MSF/a1dbd3+zy9+jXzsfG1mpYYmJs2NDKzdXS0tnr3cnIy+1UT05RVtzKy9Tn5O987ubQ08/UY1RPV1zq1tzsXF5fW1xZ59fd7k5KRURGTWFlYFxZUkpITlxeVWJTS0dLXHnq5ehxYGBu+PPn6fLuXlFNT1zrz9Lgdmt0bnPZyMTGx83hY1/k1MnKycrU29jVz8nFyNDd+V9OU1fp093h7Nza3djPzNbm3+ZhTVZZZ2pNT05QUVBhZPXjb2BVTUZNUVTvZFNNS1FMV2bq12ZaY1hLS19y19r6+WFt7s/K0svW6mhPS0tZWXvhY1hSXm7+2dTFyuDvbWJg8N7WzdTf+Pjl1MzOy8vW3/HwfOje1cnN4WJu4tbQzcfH0utrbFth7tzS4mhPSUxY69bKy9dnR0FBRlRXYl1OQj1ET2D08fFmT0tOWlNfcPLwXk9HTWju19nh3OZpW2Ng9uludl9WS0/628rFxcfR6/jb1NDGxcPK3mpe7drIwsjL0OFsYGVk6eDg62JQSlX30MnNz9t+X138/d/d8flVSkhNZufR1d34XllSW2Rrc1pWTUVBQ05k431lZWBrbeng6OTu6WdPTlBn7NLLzNDh/2ZkbfbkeGVUSERDTf3OyszV7GdbXfXf297X4VtOTmTy1cvLy9LXzc/NysjKztTe5Ojh1MvO5H7+ZWf33c3N2u71WkxNUWvf19nZ6FlXX1VcYmFTTUQ7PD9DVP5iWF1UT1ZTb97rfXlpT01ZX/TX3/fwW09t7uDSy9T2aU9QWVb60dDe4N3czczMxcPN29n5XXF28NPP29nU4drP0s3M0N/0ZldhXVnu2PpcWVRafujUyc3td2JNSEtV8Njk3Njpb/X1bvv8WlNIPz9BQkNWXFJZXWzk2tLLy9fc3uLk9f774OpjZWBaaOXh7OttXFBNTU9PTV73eGdkbuXn7tzOz9/+cF9WUlZ81tfcz8zOzcvFxcrP1tTP09nf4Nnfbl9peu3n29vc7mL74OtxbvDwdGNq5e3w49jedV5PTElFRUNEQ05XS05VXHnp7uzicFtkZF1PUV1mbVpecGVp7uh68HRVXHN86ejp2dPY3dDNysnJxMbL2ebY9lhYXXDrb2bm4OPQzs7P3dvZ197s7W9eVlVUWGFceurv3trvau/4anNz8+x54eb8bvfe4/BiXFdPS0dMUU1VX2VhWl/u8mNt8e3p4d7g/WpdV1ZVZvnw5Ofve/pcVmJiXFpdXlli7eTf5drS0MvN1fHp4l5YV27r7PT+3tvW0NHN0tPY0cvV29bT5Wxtc/jzZ355+fBiYlp75vnq6+h+6eB63urq5u/tX1dPUE9GSUxOTk1QTE5UVmVnb/fu7m7n6W9zXlZPUVBWc2j58N7ceWhget/e3djV09XX4tbNzsvMz9fc4vz5fffo6d/9/n5sdWtiaO3g4+j14NxwZV5ZX1xeWVRbYmNw5u3f3+PQzdTY2+Dp9XDq1tTi7n1dTklLTVlbWmBfV1leXFxtcfHwefZye+vf4Phxa29oWVNQZ2BfZV1hXmBnbXFoc2VjbnTx4NXY1dTe4O1y/uHW2eF8feHe5t/SzcvJz9bS1tLMztvo7nJeWFZhcmlq9HVu8vTz7N3e3+hoXnP48+p6anpqWVZPS09WU1BTUk9SUk1MTVVoYlhcfu7w3Nvf629gYWNkbXNxZ19eburr8eLV1trb5NnOycfLzs7Q4HpoZWz67HFeWWJ0fe3n3dfV19/s6u/x7+Xb3ed5Y1VXXVZaXGdkYHbt6uba0NLc7+fc09Tf6X1yWlZUU1phZ19YU1FSVVxkZH7u9HBZWGr45une1u1eWl9iX2NtcllWVlNPTE5ZcHnq39/c2dbf59/h4eb6e+jg6ebm6/lxaebn9N7Sz9XPztDPy8jKytPjeldaX2Vi9vF19mtqbXfu59jW4O3t5dzjbOjeaVthV0tJR0tMS09PVVhaW1pbXlZSXFlSYPLo29Tb/GBbYW1seePj5vVrW1VXYHfo3NrV0tfT0dTOzdLU09/rfXt+amNeWFpt8Orv7e9wZnLu7OTX09XU3ep7aGtodX3x8ej0YFtZXvrf0cnLz9LU2Nzu6uDh6nFdUUtIS0xPUVVWYFtYY1xcYWlsee/d1dzrbmJaUFJfcnL8bWFrV1RWUE5a997Z4+Lh5ebf4d3W1NPvXmVcau7o3dbV3eLu+2lte+Xf3dPSz9XXztTZ4fl1furt6e9+/HZjYmx05N3b5vXxe+bb3/Lo3t9sV1BNSERITE1OVVlUVFFSYWR1furc4nn+8Hrn8HBlX3b2emj57G9nWWRt8NTQ0dHd7tvl9uHd1c/T3+V3aW1ibHTz7m1haWFZZmJu4Ojk3uNsbXX13fR8+OLn++3u9/Xl+Wv8fOva19bV4tvQ1NLX1tbc5mBMTFJPUl9sb15VT1VTWGJjamz6fmJfWVpu9nZoXlplY19iZmt783NfYHdwY/DoevXg19Tc4Njf5efr8urt8+Ph2OJj+m927vDl6ur74vlz+HXi2NTY3/335Xzh7Xzl6u30/2vq5t3a4d3f3ujudv7uXWBYVVNOTU1TTVNNR0hIT1hdZfn27N3p3OHp19Hf/GdbcmhpdnVsb25dW1dcb/je3tjPzdHPztrT1uDud2lzbl106+/+YVpWWnTqfe7vdeXk8fj7+N/fa15ZWnbt8OjYzc3d6PNv8evg2NbW0NXf3N/r5fFiXl1YVk9QWFpaWlNQUlplWlJYX2BoZGRx6uLY4GNaUVNcX2V55uP1a2BgZvTr9Onf5/Dz793d59bP1Nja4/Vzb+fZ3eRwd9zm6/Bna/n66O732dHg5fxfY2t+6+3i1t/u7F1UYVtn6tzP0Ors5evd3Ojk9XF9V01RS0tTS0lLS1FcVVhRTWH07uLf2M3U3NXyZWxcYvL35NxxYF9aYnB86eLc1efr2dvTzNfg1dbX2mdYXFto8vZuanj/bWVqW2JqWV3q3NTP7HJsWFhjbvrb1dvm6OHk3OXu59POz9R3bXR06tzd8eD3W1xcWFtqXllPVV5dWVNQT1NTW2Fjd3Roc3tn9+9iYWvi0dj1Y1dPWVts5efY0uh0+e/Y0dDOz8vJzd7m/XHz9ODgdGx4WVd2en74aF1m4tTV5efoe2VifOro29Lvfe1refprX+fa2tnsfm5na/Dc3fJsZE9MVVNaXFRWXFJOUU9NUFhVXF9sb+3h8+ne297tb2/h4N3Z72JhXFVieuje3Nvo7ung3tbUzsfKz83Y/fJ1ZWlqbXVkU1VaYGtpYl1eeOn13tz45fBwZV5r4t7y3Nrk6enh3dXLytXW3WliX2Vrcvz6X05UVFBYandr/eXtWVZaTU5RVFBSV15dWGNlXWJ4eHDw29Pb2NvrfmpmXmx04+V99Or+bOzZ1c7JytLa5Ozl3dza2d3b7WRdamJceXxiX3Lw9e7u6P5td3ZhX3vteX7l6+zf3N3a2ur0clpbWmb85+bc1OFuWl1bWGR6dnFtX1xNRUlMTVFZWVxaYW1tfu3m5d3h39zm3vVsa19YXPft4d/c43F36uLq1M3O0tvQ3Pv14eLo2Nzd9fZtXmhu//zf4vxqY25cWF1oYWLw4utvfvlyeuXa3t/TzNTa2ultXWZxe+TU3Pb/X1RSX2dh/ub2WlleUElJVFNOXH5rVVRUWFpdXl1v9/X8e3loX2X+c2Xo1d3n4+To7uPe3tvNyc3R0tDd5djW2M3N2Nns+/548/99+OP2ZltPT01SaGVs3tTa5nnx5P7x5uPg2NfW5GFfWVZbWV/w6P5wav7+anNtXnvl7u5tWFRNR01OV2dmZV5XVFpob15j3Nnc2ulwfmBifmh46+nt+O7g39vc6uHX08zO2t/b5t/b4dbP1ubt6fxodWpWWnrm43ReWU9KU1hb8dnZ4/D1/Ovd6XrhzszT1tfjb2b6bGb+7eV+cOXm9XBZU1VnenVnYlpTTUlHSlJZXVRRYVtYXFhVXd/Y2+rtalpVWl1c+dnY9evR19rl5/Hr2ePY1tXU09Xd6e3Pyc3U1srN0eFzZ2Pn8f1rW1hORUZITWfh2dna1dvg7/x54c/V3t7b7W5VU1JQbn5mZP/b4OxyYlVZaGRoYFldYU9EQkZRVlNedHlpaWVhY/DY1dDT3u9vWVBUaN3a3t3b1drdc2V369fb187NztPeemlo4Nfa09bNzdDgdWtn/Wlr+2xbVUxHS09u+evT2Nnr8m5paujP2tjT1NnobVleWGT7ce3v39/sa11YVmRdYGtWVlVOS0xMWWRZYGVbUlBPV1lo3eDUz+RnWFROTk/32eXb19PX2+x0dH7b187Iy8vN1+v4fNvPzcjKzs/P2f5z7Nvn6fBiV05JSExMXXh65uji3tzd5ePd0NHY5XvtZVNMSEpVX2bw7dzd5PxdY2R89vH+YF1OSkVBSVpfZG1bW1lcWlvv3M/T1Nfe7XBdUFFSZ3Pp4fXd1dp3aP/v3NfMyMnIy9puX19+4tjP09LS3Od88NnT3+nnZV1YTUpMUmB3bnZnb+nq8O/a0Nbg497t3dx2X1tcY3J+4Nva2elwWl1ub3l3dWZdTUJCRUpZbG10Y1hWU05TbeXj6O3r9HVkXV5ebfr8cXv9cXjzaV9na3fq1srEw8PJ1uDd3djOycjJzNHm/eTk5+p2cGVaVU9OU1tbZ2tfYWx16uvg0M7W3Ov1fmtsel5bWFVjZnjl3+Xd/F1lXVdeW2hvXVRNSEtOT2V8dfB5anBYWfv0fuj0b21jaWlcaX5r9+v87Pfz3vlld2ps49/Tx8XEx8/W4fPf1tXNzNDYenDqcXfybWl0Z2FdWGFmXmNlW1pgfd7a0szR1Nff6O96eHhdX1tYZ2z+49fb5vH9dFhXZnXu93NbS0dJSkhQW1taXV9cWFtibWtobWJdZGxre+Rzbv5raGt7+PjxeGtdX3zezci/wsnKzuXd1c/HxcXFy9nl7nlpZ+/s9ux0Y2VfVm1wXWFYVGVv+9/d4+nq3+fp3/1scl5PWFdcfnbt2eppZlhUWVt69upwUU5NR0hUU1xnZW//dHH5dXLr73767/X56u76enFhbW5ndvL7cnRfWmby59HJycbNz9zn3NTKzMjHztvw8l9tamZnZ+x6fW/57m54cmZRT1paa+jf3eHm8+zi3tTX3eJ4ZV5ve3Dm4ephVFBPUVJmcOzd4GdRWVNPUVphU1deWlhUWWhlY2lbU15dUV74eWxpc2tt/efi5u1xblxi+HnTwcLGy8zPzM7OxsTEx8nP3+DvcHBrX2H8fXp9eOXd8nNtXlhgXVVs7XxeX15ce+fo8/XrZl1ZY/xr4tnnbltbT1ZZV2zn4mFWVlFPTVFZYGdiZ2Lw7vjj7ed0Zm1na1tfc3piVlxiZvXt5ebp9mBkbvDe0sfJzMzS2uXZ19LOzM7f3uXo9nz2eezn8G1h7+3/6+7tdV9VUVlgae/p7Pb27N3Y29fc331hWFbu4O3n5tx7YVZWcmZz9OxmVFJNT09MUFhcV1dWWWdkYGBq/3JkVFVnXVVZXlZNWFtrdO3Y5u9lZ2TuzszKyMTEycrMycjDxc3N0Nvu6ufs8ODd497h7+Da4+b/9fNXTU1WWlNVVVZYX2j64eLa5mhtYFJVcen6cvh3X1xZW3D3/fZfXFhJTFdaVldiXVpZZW7y3urk7evyYV9eYmVic11YWFhodefj8HRiXlFY/eHRz8vHx8fJxcfGxsvO4u9pY2tba/P8+O3f9uzb1dXb3Ofybl9fWVhbVVZRV1hq6drP0dnn6v1eX2hr/XZzeXtpXWD08GxsY1lTUVVYVltUT1daWFdi7vBmdH1fZGNeW1dXVlNVVVRVYPre3/PtamJlY3nh1NTRy8bFxcPCv8LJx9Lp3Nzo/fHveu7f2drb0M7O2uHwYm9mVVBVUElLSE1XXPHf2eDs5mVeXFhcXmlgcPD16fZy7eb9Y2hVUFtQVVZRS0xXVF1t7t7Z3PHm7njj+Xh7W1BPUU1QXXjj49/7bF9QWWRj8d3f2M/OzcbDw8TDyMzR4t7h8ur9XFv1+nze08/Pys/Y2fL99WdgXU1FS0dDUGXi2NHR3dTsePD47OjvW275XGJ+7fPq6mZsXFBVVlVUTUdKU0lJX3d75tz+/vZxZmtvXlhMSEtISFJqcnngdmhlXV5z5NjNzs3Ix8fHwb/Avr/Iy8zR2NPa5+1q7+5859bMzMfL1NrldlpdX01JQ0BAQUdRcfbo2enp/Wlubvp3cF1XW1JXXnLu8dnpYmdYVVtcUk5QSUxKSlZh++nV2uHb4vH8dWJXX01GTEtRYHpt6N1w83le9N7e28/V3c3LysbBwcG+yM7M3Ofd5nnn71xgZV730cvKxsnQ0+dodWVQUVFEQEhKTmRvcOTd4uTm/d3W7ubfcFpfYWTw4ufj7F5WWE9PVU1JTktCREdJWHt75N3l+nt0Z2ZcVVhPQ0JKSk9fbPji6Pzk6uHRz9LSy8/Px8a/vLu9vsLLzM7Rzs7a4t73X2Vq+NLO0M3O3+p9ZnhxXk9JR0FAQkVOVVdgfWxl6u/f1eJzfftgW2Fz5t7g8HZYTVBPT2BiUE9PSEZNUGrk3d3e5mlndHDq3/5WUU9JSUpNWmVs8+j+79/e083P29jP0c/LxsG+v8rM0N7b19fR1uxzemdXZuHTz87P1Nzpefjk3dtuU1FNRkZKTVltffLq6fPd0dHb3eT86ndp+/To5GVZU1RNTE1PUk5LR0ZGQkxhbO3+cWtmXlth/ed8XVNNTEJHSEtcaWdx5Or+3tPSzs/LyMfIxcC+u7vCxcfL0dPQ2NrZ3+bo+/fY0s/K1N7i8Wlga/l7ZlFKQ0E/P0RKZ/Rh6+Lre+Ta5tzo7XdhXlhf/urpYV1lXlJQU1JUVE1JSU1QVnTn3vHw+mpsbejb3uZrU0xJRUhOX/Tqenru6ODh1M/Ry8/a3NfOz8XAwsfLzNbd6t7b6d/zZvPo3djKx8vN2+92cf546vlmVEZGQ0NLXOri2uxw3uDs39DR3+ZlWlpWdO3e5H5pUlZMRkxVUUVGQT1GR0xn7fLy8lVSX2Xq2dt6WE9EQ0VJXuz3be5dWt3b18rFxsnO3N7QysC7vL2/y9zVz9zPydH1aWRm3dDMwsLGy+pbWmZmfN/+UUU/PT5ETHDjc2lWTVzj2dTQ0d9fTUtNUnnj1ud8akpKTVNZZW9PRD49RlDy1dDP099YUGDn0tLW9FhMQ0RHVPfn52NZTktn3snGycbP5mVt3Mq/vr/GzdxfcN3PytDZdFVSXerRv76/w8zdX1Z94tba6F9MRUJJTn7W2ORgXFpd69nLy9nwWU5MTFrv29TdYldRSExXYm5PQjs5PUJJYNnR2G5ZXlNS79nX5XNTR0dISl3g5/xXSVJfa+XPxcbL2OXXzszGu72+wM/U1NTTyMPN3WhSXd/V1MC9vsXe8+nk8d/W8mNURD5BSktg8GFeTElTYHzw1NfpZk1KUWtj7eB59F1NTVVidvJmT0k/PkRUZP7T1NXuUVd0eOfU1/V0VUlIT2b13HBgV0ZLWnnjz83Y2P5l/dnNy8HDyszZ49/Y0cfE5WdcVV1x0Mm/v8rL1d7f1NLSzelgU05LR1v/3tdjXFpWVmDc18zWdWJYV1D53/fib1pTUU9TdGh3VkQ/Oz4+R1pf8f5gW1xea9vg5Nz/UkRLT05x7uXwWU1LVF7k2tHJ0N1139LPw8LAv8DP3M/RycbGxM/rWV33587GwcbN3+rZ3c7M2tnnWUQ/RkhTZnFhUko/REpV4N/X4GBRTVhX+Njm6HZfS0lQVuPuYl9QRz1ARlHm4ebo+WVi7fDOyt/Y8l1JSlRa3+H+9W9RQ01Z783SzNLkeHbc2MrDxMfO1nR63dnGyMjN6WZVYfXUxMLHztDW3M7Kw8LJ2l1VSUZTZentYlJNSERNXenW2d9qX1tUaube2ORXUVFGS1tr8mxdS0NAPkROV1pZT09RTl3/8N3b4WJZVkxPY3B3emBPTEpPauvOy83P0M/UzcbDw8LI087W4tTPycfEy97iefbZzMzKydHO1NPGxMPGzt1eV01HTFdTTk1EP0BBS1ho6+3wbF5eXXne3nttZ1FTV1d65d7nalJERkhJWmRcW2FWVXHy3NHQ2O12XVxcUmZsX1lTSUVNU2Dd1NPa2Nfbz83KxcrU2N/56ufu1s/O1N3n9N7g2s/S1NDW2M/Kx8XBxc7V52teV1FaWVNNSkhKTldhfu/u6nllann/7uP8en1pY15fXmhuXVBJQ0JFRklSUlFYVFVgePr45+l1YldTVFBUW1hVUlFPVVxy6tfP0dHVzMrIxcbEyMjIz9XV0tXV097l3tza19LRzc7Oz8/NzMfDyMvP3OJuXllVT0xLQ0NCQEVHTU5PWV1cYnB27/Zxffr8+XprdGdbU1hTTU5OTk5NUV1gXF5mavjr6fHs6GtqXlhaXVpSWldOVFNXb3vl29Te49bRy8nKzMnK0M7R1tDc6P79emvo7OTV2tfOyMzOycrFxMXJysrb6HJeaGBQUFdQTE5OU1taaW1+bVxqb/rq6+Hf3vVsbWZsYVRLSUpFSEdJUE9PT1hUT1VgYm5lY3lwXlpeWmNeU1lTU05LVV1v6d3a0dDOy8bDv8DCwcfNz9TW1tbocHl67Ovi19LP0s7U1dLTy8fEys/M2+96ZFtRT0dEQUBGR0pRWmJYWVxcamRr9+x+69nu8XVp7vVwXFFRSkpMTlJXZGNjWGH+cunr3+VtaVxXYF9rY11XUlJPVVNq6ufo9X3849LMx8rHw8bKz8/b3OH+dnJdXF1u6dvQzcrLzc/OzsrJyMXIz9Xa2NnZ22tZU0tHR01RVF1sb3RscOrb19/t8G5gXlpUVFhWUVNVTklISkhJSEtISklITFZfWG/f6mttYFtVWFVTTE5STVBa6eTY0tPX1dLLxMDDwcDIyc7Ky87X2+L++X7w+une2NXV2dDPz83HyM3Jy83P19zfbVdWUElKS0lKUFhYY2BiZGRrZmr0+PJwbGhdX15dXF1QTFFPTlVXVlpcWlpVVVlbZWr/6Onr5+/obFpUVFBMT1RZWnvs3dvd3NfQzNDRzdDQ0tLc4eLi/evf7Pzr6ufuaunl3tvZ3tfRzsfBwsjIzM3S0+F6XVdWU1Vca15ofvVlaV9neu1xcvD5/HlxYFlRWVZWTEtKSExNS0hKSEpOTUxTVFZbcHV2c29nXl5YVlNSWF5efuXm3tHP29rY19DLycfExMbFx8nP1trifG1ybX3p3N7b09LX09XZ0M/Oy8rO1tPS1t3q+l9VVFdbWV1WU1VbWFRaX1df83d7+HRlZVpRTE1RUFBPT1ROTlVTVVlXVFxeXWj6dmt0Zl5mYFxcW11fWVxxcnH8/H7g4Ozg2drf0s3MysrMy9DY3Nvi8O5kXmRmZffu5djT2NPPz87NzMvL0NLV0tfY3Obl7nXt3vT2+3FmZ1tcXVdaaHnt3eLt9vpbVVBKREZFQUhMTUxPTVBWUVFZVlVUT1lWVFdmYFhZYVpcaW706+tuefPy59ze3dvPyMrIxMTHycnM09XZ3eTo6eXm73V75+jb1tTPzs3O09fW2Nvh3d/p5+XoeXRz/nZsWmFsWFhaX1pcXlxeZHLu5/57ZGBcVlBMSkpMTlBMTlJUWF5fbXxvZ3ZvXmRjY2tmWFhWVFpv4eXs8Xpx83h4en7r3NDT0NHN0NPW19zo5OX1X2p4+G5mXm/u4tPNyMrMzsvO2trZ4drRz9LV2dnY19Xg6m5x/O5zZWT392lzbWxld3h7bGJWWVhPS0lIRUZHRkdNS05QU1leWVZcXVNOVFVbWVdVVlZpb+rt59/77ebs9Onk1M7N0MzJys3Ky8/S2dDP1ODj4Oj+bVxhafvb1NDPyczOzNHe4+3z7Oz17+fd197d3+9jXmZfW1pVXWdfV1xtYGppeGpfX2BeUlBRUEtJSUpKU1Vo/WZ06+phYWNcVllZXFlUW2xz8+zv9W54+fNpZG7m8t3b3d3d087L19TY2N7d3t7m9XB4a1hoZn3v3dTNy8zMy9Xe1tPV1Nne3NvPzsvT1NTf5uZrX2picvX3V19sZGzpfWNgXl9dWElLTkxLSkRDQUZMVlhVYV1ZW1hLTk5PTVFNSk9cY//n/vF0/3Tl/3fu3dfQ09nQz8/LwsnNy8nMzdHd3dzn+PBiW2Ps29bSzczP3dvZ9fDh3urf2t/c1N/T0e79/mxfX19bWmVgc2pXXG9qfe5zZmJlVV1YTU5VTkxPTUtMT1BmcmxyZFhYWlZaWVVVXldYYWNh++11e29pa/hvefHs8NrX29LP09LMzc/R2+fc3uvq72dfYWFn/HHu2M/S0NHg2tnZ19Lb2tPS0s7V2NDPz9PT4eXq6fToeWNtaWN65nv08OxpaFtSTkpJSUlDQ0ZLS09OVVxcVlxWSkxOTkpOTU5QUlFkYV1l7nlm8+7xeXzz2dva1MrLyMTCwsPEysbO2NzY6fHu7mxvbmrc5+Dd2nFw8e737vPs1OTk29Xo3NfZ3t3m7Nry+vhyYnVrZGBuXXLde+n2YlRbXVVSUUpPVExRVFBPXWZx/m9WXGBXWVhUUlZWVVZbT11tcvxtZmNv9/fx+3je3uPa09XXzcrKytHY1trp8XhmX2JpYmtv7t/b2Nfna2rz5e7g3dbS0s/MzdbWzs/T0M7O0dTZ3ebp4t31dOzq7ero+HBWS0xPSURISkpJS0tRT0xQWlZRVE5OUExLVVJQVVdNUV1eYGlsd/V38e3r79/Z0M/N0cvFzczJyszIycvLzuLj3/N5dmtgfung3+drd3RfWF5VVmr74dvf/NvY4O3p+d7Y08/R3v3a3d/c5mN86+3r6GdgbFdUVUxDSElQVFJPWVxbZGxXUl5cbGZaTVZYXW/9VlRiZPL7a27lcPfscFht7+nZ19nUztbS1Nv239nY2OB2bGRc+vRuXHT83dTd7u3+e31tXlVfbd/V0drS09LT1dnWzs/KyczSzc3O0M7Y8/fu9v36a2liWk1NRkBAR0tMTU5PU1FSVU1KS1BMT05LTlRRWW1bVFZeW3Pk3t3d7evi7+na0dLIxsrJy9TQzdPW1Nzy9HxyfPTz5vF29+no4Nnh5/NfWF1UU11jaezb4d3j597X29TW4N/X19fR1tnQ0uDl93Ft7fb3b1lPTUdHTE1PVl1YXmliX2tiXV1WS0xQT1djX2N1aGpkaF5z7erk5H1u+X726dvg1dPU1dTa4dzf6u77XVdTWVxwamd5bmvq3+nd2d70+15XXmRj7+Hm3NfV2s/Ly8nLzczO0s/Nzc3IyczO09/h4vvw+2RQTEZBQURGSkxNTkxPUldUVVdUTUxISEhKUFllX11dYFxr9+Di3Nvk9e7r5N3YzcvKzMrMzs3N1dng/GdhWldqev7u63Bw/vHu6en0fGZYVFFPVF9kaXd5a23x3dHQ0NDR1NfU0NHSzMnHyszR2dnd3OB9X1NLSEhMTE5PT1FWU1dja2dgY11VUk5NTU9UWl9gYF9ebX3u3eLh5O79euvi3tjTz9DR2NzY2+Tscl5aUE5TWFdgZWZwfHB46efm7+5zZ1xYXGp27u7s4uDd3M/My8rLy8nNzczKyMrJx8TIy83R3N/3YlRMRUJERklKS0hMTU5OU1lbVlBPT0tGS0pLTVBQVVtddebo39ba3NnZ49/d0s3Oz8rHycvLy87X4eJ+ZFpdXlpZWVdYW11r9PLm3vB3aGdbUlZeZWZmbGVodfTa19fY19TU1M7Ny8nLzczLycnMzM3U6H5eUE5MSk1OTUtOUE5VW11hYllUUlBRUE5VWVRWWVtdZvzj29nY1dfc39vY2tfX2dXV083S3drf+GZXT05NTU5RT0tMTk9PYHr26PP7+mJcaWRifurm39/c2NXV0szMzc3Lz83HxMPDycvKzc/Oz9TZ3N94W1JNTExKTExISktLTldYWVhRTU1MSU1RU1hcWVJaWlty6erc19rX2N3Z0dTU1NXUzc3MycrO1dfsaW1nXGFfWVpYVFJUVVhkbWJdW1hZVU9RU1RXYmJia3Pw4t/e2Nfa29TPzszKy8zNzcjJzczIzNLb5ep6XlpYUExNUU9NVGBlbWdgXVNOU1FQU1liZl1dbHB2duPY2drS0NXQ0M/O1t/a3N/e2tfY2dzxYFtWVFFOTlBMS0tJSU1OUVhVU1RTVFZUW19nZmFne3V94tzT0s/Oz9DNy8rKycfFx8rHyMnIyc3a8W9zYlZUWVlQTUtLTExOWVlQVFlUTlFTVVlXVllZVl1rcPzY0dLQ0M/Jy87IyMrMzM7P0M3KyM3X2dv0aG5eW19cW1xPT1ZQT1RZVU5LSkhKS09ZWU1PWU9LS05XW1dlamZ07N7c3tjP0NHPzczJycXH0dXY6v1nae7se3F0amlcXWhqbP91d2Vhc31vaGFgZltdYWj63NTS1NjW0tnVzsrHzM3KzdDO09nffnH6XlNYWVpdVlFQTktMTk5QX2paUE5OUFRPWWdZVmdiWVhfcvr7dfjl/3Ln3dja2eHm3djQy8/Sz9Lec19RT1hea29ZXGtmXF1ucWhmYF5hXGB58G1ueF1UVFJf+OzczszOy8vQzsjFw8TGyMTCx8TGz9LU4er9bHzj5/L7ZFZRTUtNUlNTWlFMTkpHTU1MUFBOTE1MTlFPTlFQUlZcZH7Z3dnb6OLb5+Lj5+nl3+/4aGNsfmxvaW5xd+/k1trf6O1ucG91/u7q49t+YlxhZXJ96N7U0s/Mz87Oys3Oz83NycrIytHc7PlaXGF18erx4Of9ZF9nV1NSVVNUUVVaXVNddl5bVFNZX11ncGtYXF5SV1pjd+rt7d7kduXqZmlkZm1iVVlfWFReWE1OTVFcaWR55HlgfXRn/3N55OHt5Od3bHtrfvX74NbPzsnGycvIzMzN08/LzNHMy9PY2+Pd3uHX09HW1dXd3+lwb19VWVxcWWVoaGleVlNOS05RVlljWFVUT01RT01UVF1ncmv3dW1iY11WXFxia3Zu8/twX2ZbWGZkeunwePJ7bWR7ZWRxb/Lh83f8cGxm7nn26uvWy87R0NDW2dXf3dvYzsrT3NvZ3+Lc6Ofm6N/X6vni4XFscWx7+PLh1N/f2Njp6vb2/Hd17d5zYnByZnBrYF1eYfTral1iXVBPTUlISUpRVk9PVlVRUlBSWV5i8PBqYGtmX19bVldcX336eHjs8+/t+XH67uXY19rb2N7e3uLo3NrW0NDU0s/Oy8rN09LZ1dPW3Nvq6+TpdHfu8+Dh4uPd4eLu92Bsd238cmd4+GBseGtcaWRt8O3p3uthYmNiUFFPUVdZVVlWTE9WUk1WVWd2cW74dGdya2BVXFxfXWhk+HVaX25nZHVu9vv39exoXV9pZVxfYWV1933f4ubb1+bo493Z1tTUz9rd39fW19LQ18/OzMnNz9HOz9HX3+rc39/f6Ozh3OXp3+bt2+Di7XFqcGtcWmBSTlBOUVNNSktMS01UTE9XWVxZT05WWlZXXFBibG1vZlxnbWRmaWZdfW/u5vB1825sb353Yn1u49vf49rj3dzc9nT3/9rd6Onc4tze4/X38ObU19nV0dna3t/o4/Ho2OHj2tvd1tfZ2tnf1c7W2Nnk5+j5cGdrZ/HtaWNmW11iW1hbVlBcVlBVV1FYWFdcX1xaamxqamxhaGdiX1tWV19ZWVVTUlhYWVNQVVteXWRjb2ptcnVqY3H17Off3Njc29XS1tXPzcrHyc7Q2dfR1t7Z1dfP0dXW0NLNzdfc2dng297c2tzq5Ol4fuvyePBuanFjXnr2aWVfVFJRTU9RTk9ZVk9QUlFYXVlfa2Bjb2FcZmNebGxme25bYHBlYWtsZ3R0d/F7ZW99YFlaV1ZdXF1mXlpjbWZv/Ojk3ufj4ent49ve3dvY3dXTzMnLysbGycrNzdDO09DV3d7c3OHi4dzn4+7h5vDn4ev9+vD5aXBs6Ot4e2xiXFpaWFZgXmteU1NUVVJVUlBQU05STEtPTlBTVFFPT1RXX11jZmNkYWdmYWJpb+5rZ21r9u3r9/x0++3r8/fv6eTv6ezp4tjQzs7Nzc7Nz8zNzs7JycvMztDQ0NXO0drZ0tfe6HNsdXBicmFYW3Z1eXBoZmxnYXhsYGRyYl5cWlxpY19nX1hgeHj5fX18fWZfWFNOWG5oXlpcWVxUVVZTT1xgXldSVlRST05NTktXZGddZGRla2736OPl0s7O1tbV2dvW19bS18/L0NfS0s7MzM3NztXPz9bd2NTY29vt8Oz43dbc2tfZ3N/j83Zwbvv/aWRiZVxXU0xMTE5XVlNYWFhRTk5MT1dq+HRrbGhkXF1jX2f55uj4eX1tbF5eXFhVWVtWUU9SVFZQV1lYXHfv73396+Lg6NjY3uHY2tfX08zIys3GyczQztLS1dLPzuhs+15aZfv96ufk3uFy9eZ8/OHY2N3W2NLVdXjp8uzc3t7f4e7Z51lVU09UZmxmWVxVX1FLUlZPU1tVWlNWVG5XU1liW1lYVVVTV1VmT01PUE1XXF5bXmRebmBueW9fbu/r9N/W0s7V087N09DLyMnBwMbGztTO09bNzc3NztLT0dfc5Or06Oj69uR7dGxYXWlnaunu7+bre/RtXF1lW1x9Y1xbXFZjYF95/mJo8nV7cmZaXlVTWFRMUFxTX2VnYGhcVlxWTVJUTVFPUFBZVFZlV1VhaWX37/F87nzv3u70493f0NLT2dTb2dLg2s7Lz8vNz9bY3dbZ7ODUz9bPz9LZ2uHZ2Nzb1NHSzM/O1dvr3+D0/Or3dvZjW1VTWV1WUE9WUlFeWFRPT05SUU9PVFRaZF5dWltZZW1eZ21aZGNWU05MSk1MSUpOTlxmXltaW1p1dGh08PHV0tja2drgz9DS0c7SyMbLysrO1MrR09be6dnd6PpzXVvy/vju6OzX3/Pv5md24+fd7ODg2Nng4t5rdd30/fpmYf5nV19ZS1VYWGlbXWBkaFhnW09eXmFdU1tga3dp/GJYX11cVElLTEtMTE9ISEhLUE9SXWBpaGx7W11i/OTs4djU0M3Jyc3JyMTEyMjJysnKzNHe3+bb2dfX2d7h4urtbHJ2fG51e2dqd+jd3+Lb193m4etjXF1ZXlhPUl1UWm1hXlxcW2dcWFNUTFFeV1BZVltvXWf9cFhrZVpUU01TTkdERUVEVF1aV1ZPWVpbWWRaWXjx6uTp69nZ0s7JzcvDwMLIzc/Mzs7QzdXNy8vO23n98Xzv+Ptr+/js7nli8uHc1NLX4tXTzdDa6+n/e+jtbmjx8NzY8GBpX276b1xaZGVtbVZOV1Ri/21WWGJdXllNSUZCSEtNSEpNSktMQT8/P0VKSEhTWVpZZF5ha/HXys/WzMnKysXJysjCv7y+v76+wMHDy9HW0dPN3uXj819q7X55++Pi1+Tj5OV+7ed0aHLo3dPa29nb597j8mVna2t0Ymx4a2J4+XFramZucmlvamNfX1lZWVlaZGtqcGZfX1xPS0hJSklHRUlFQENHR0xPWWh++Ozr8PPxePrh4t7SyMfAvr6/v8LExsvMys7TzdPf3NTc2ufu4d3g2NXe4Orfb2ne7fHP1c7FxsrExczQ1NLb1uTe2mxWZl1ZXFVdaW9l8nxZTk5EQkFBSElKT2BeW1lkW1tWUlhVT01TT0pITUxRUE1dW1hh+3VsfXFhaGZ25eno08zPzcbGyMTHxcXHysnIztLW2dfQ29LO09nV2/lkYldPTk1XWFpn5N7h3tjh3d/g1NDR19DP2d3c39XZ2s/R2+je7WhiWU1NSkdKSkpNUk1NV1NMT09TWFhQTVBPT1VWVFZQUFRSTU5OS0pKRkRITE9QVmPq5+PW0tPU1trW0tHMyMfEwL+/wMTHxMXLysvQ0tHb+Hlnafb2Z3r5b+/p8njw7+zj7Hrr5ft77PHg4e7n3Nvk3enq8/5kXlNTUlVWVl9dWmBpWlhRUU5VUE5OT1BWWVRWUFBNWU9MUlRNT09JSUlISFROTlpgW3jse/57YmTkbGjv6+/Q0NbLxcjDvMLAvcDJw8nU0s3X1dLcz8/Z3t77eu9nWWxuXHJ9Z3bi6tnP09LIzdHK0N/T1evh4m1r+VlWX1FKTkxLVVJIS01FSUxHSk9NT1xXT1teVWhrUFhmWlZaT01SSkhSWFFbXVtcYVVSXFdQXWli7Orv4NPZ2tfZ2s/P2dDOztPO09nb3evZ1+Xf3d7p3OX593Zfa351eezv7dDP1czL1M3N19jV2+jY193Y3O7c3O3f1+D27WlVWlJKUFdXVU5GRUpFQ0tGP0VGR0tNSEhPUU9XUE9fZnbu5+3383x463NhfuDh4e3r5+fj3NPc5uTb3N7p6ebX2NfR2NvUz9PW29n17P72cltPWV5YWFpfVmJeZGVgXP7h2NTU0NLMz8/R1tLHxsbFwsTGxMnL1Hp74vr9+eju/mxaW1xQUVJRUU9OTE5STFBPSVBPUVBXWFFPVlBSTUlYX2Nj7+nn29bh1dLSz9HT1s7P1tTT39fb2dLU1tjP1+Xq9212XV1pb2573Nrf2eHr6Xzw7PRsbfV9eex7aW/29fft9+zY2OTd3Nza19POzs7MyczOzM/V1M3O1t/j5+L1d3xkWFlmaGlnaGNtaVhVV1lbX19eYGN15O7z+3RqcnVjWl1hXGJmamhgXmRsam799+/o+vt2dv51fHx85eLe1tjf9PH993lobu77e/Hx3d7d29jS0czIysvQ0tba1t3i4Onf297V1NPd8HZ3b3RjaW1y7nvq6N/n7+Td6d/h4uZza/7h4/BgXmdvYV9lZV5odmRjZWBqfF9cav/y3uXo6Oj+/Ov7cHtXS1FOTExMTVZUUlxkUE9WVFJTU1dnZFtffGN+4+3t3trX0NLj3tj+8ODf3t7b0tTZ3tDN29fU1tLU2tvb3+fg5+LT19zg49re5m5jaFdTXFllXlx2+mxw69rb5/Fx6nttcmJbZ37q6u1y+Op0a3BrXF5aVUtLSU5MR1JkW11fXGtoZ0xMUVleWkxNUlNRTk9NV1lm5+B3e3P+bmZjaOve1s/NzcrLzc/Y6uPb29rf6uXp7fJ+e/x2/efT0Nnd4t/l7m5mX2X56m5w+vzq+nBeY2Nsb2RZVG/tdFdSVmdjY3jf2tLR2NxsWltdW2j47eDa3+r5XlVST0pMTUhISUtQTUNES0pLVVpdaF5dYlpLSUtLT1tWXejp5NjtavJ+ZnPj9OPY3NPO193T29/OzNDJxsrHxtPe3ezu3Op+2NXZ09X8b3RfWWZaVGl6e/r4W1BQS01ZUVz1dWNaVFBOTExTW1xs5trX3/bo93B0+HVgZG7t2/hx/Wz7e/R67N/j4eJgW1ZLSEdFRUxQV3V9XGz/XF5hVFFXVFV0a1h1aVtjYFxu6evczdno2+Xz7m9+29fVzcjP0MnKzszZ3tbW3M/M083R2eDlcuze5f3d7mNfW1JUUE1cWl9t8Wz77+x3cllPUUtMUFZRXF5dX2dYX3NkZ/Xw+u16bGdhUl5dUWHv6trS0NDV2P3+aVtnbXBq9Pj453NseXN339nT1d/b4G9lX3Bya/Ho3Nvh2+F86u5zcHb65trh7tfW5tzc6ufzedrW3N7O1+XZ3eLj6vDd19rRyNbd2nxfWk1OYGRf/OBrb+1qW2FVaeD0aXVmUVBVTEtPTF7w5+bU3WtoYldVWFJg7/vw3t/34tvg19nbzcnNzM7P1dbW5+3z8eXY2tDNzc3M093t6+3k/ufa4tjt9PBwVmBjXGJZW2NsXGZ1clVjaPrj3tnX0t3j/3Nn9/fg39XPysjMzdbZ49nb3OLj6exuXlpUT09ZXPxy5NvX3+38aFhNVFhaV11l8Hz3+GxmZXv07G/43dbe7eHidXn36tPXzcO/xMjJz9ra29jOz8zFxMrP2/xu63x743N629nd3O1WUFdTY31u4M7lYlxSRkVLR0xVUnDV6uvm6+3f6n7d3Xvg1ODa2+xq7e7gzs3Tx8vZ0Nd9Z2hST1FOSVxdWm9gX/x5W2j6d23W7vTd8l5cWVNv5eDWzNjTytPe4H1k7Nvn3M3Uzs3W2trk79vY3dPQ29HU4nB2amHz4Ojl+F1kY1hPU09TXV1XaXts6+LtX2dbVVhXUVVRT1NXTEtWVFhoe2jp3+vj2e5ve1tVXV5YefPt0cnX39n1Y213XGl0ZvhrTEtMSkxYWljt5OzY1PFxbm5n/3h32dvd09jk3/lvdN3rft/f4OB7aWlj/Pnb6frsaW3/enRtcXdjc3N0//Hb5+jhd2RXUlpWWFtWXFFcX1FWWVpcX2BcWF9VXFJJRkE/Pz9ARk9WUGZdV1ZXXmFkdPbw/Wjl8Obl5eLVz87S0dHSztrc6un3+2lqdnBgaHZtalto++9+6fJ3dnh3e+74/XlwaWxjXmV2dmhaT1JPTk1ZYWZ+5uDl+2Vx9PR36/Tp39vf29vj3uHr8OZ3fuXsXlRPTU5OTU1VT1JcYFxYVVBcXlNPTUlHR0dCQkVFSk5PVV9e/N7c6e7f7N7d3d/Y1tLKys7PztDJys7U1t3n6uL4++X2dWFbUlZVZPv6Xl5pZWVeXVNkY11r/15qbXvrcGJpdGBp9X1ZZvBpbvrtefLf0d3h7v3t5nT95nn26+Ds6Hp49utma2tYWllbU15VWGdjVWtwYGjv8mJuWVNXWU1TTklJT09RYl9i6trp2Njc39ja2tPX0MrN2M7O19TO2NXQ29vX3e/2bGZqZltofmr+82NdcGBgefbv6N/f2+l4dOjs9eXj6uLn9d7d4+j9X2ZkW1xwbGj3cXrj715tbWRocWvh1+fa0dLXz9Td1d/35N729vZfWWZcXnro5dfT6t3fZlZfVE5OT1BbXFRdX1Zc8/N62NfZzNDW3t305t/V2s/M0Mza19PX9ePY2+jl3+ba3dfd5+ns3eLz83dy7uXo8O/r9uj6b3118/Ti2tz0cProcGvx7fDs297c6PDu73fv5/Hp5ubydGReYW1v3tnSzsvKysvb5uttafjy7/Pt7PL1dXz58ODV3fLzbl9VWExOUE9aZl9cduLdz9TV2c7j2uXd79fc3tjX1tTP6drb5u/e5ujj3trT7XjozmXe1urS2ftndVJSWmRsdGzx4fRs9+95fuXg6ubg3uvz4tzt8d7X1dbS1tvh7PHpbF9na3z+bltt7m7h1tnRy8jL09fa3u3r2OZfbObw7O7y7OTp6N5yXV9YWnVqW1VfXmf9WlFWW19nZ3JxaWvb0+py7+/k1tTP09zd2+RtcW5t4NbY3tvh3NPh+PN0+OH3X1xTS1ReWFVZWWFub3TwdGF8emv96vvm3N7c2Nzr4OPi2ury5nRdXmVXWGpna2tbWF1jYPjo8t7je/Xs9/589ufc3dfS3OPn8/N8WlRUW11WV1pcWFFXWltsfur3e21VWl5aY1pe9ubo4dvqZ2xqaetxW1JeZ2BcXWns9fzpZFxkbO52a1pPV1pfW1NVW2l85d7h6Ojl3931bXvp2dfS0tHV09HQ09vq4dri8lZOS1JPS0tJSlFUUlhPSEtRUFVNSEdNTk5UU1JUVFZvfmv44+rX2vF759/q3N/g0s/PzdHe6eX84uFiWmR6b+Xb4d7gcu7jb3F5XF5fUExITUxSWk9iZWJ23ntWVUxJTUY+QT9DSVZRVltUUF9jXevp7uTb5+zd2dzSzcrCxMjGwcjLys7Lzdfw9OTw39nrbF1TTFVQSUxIQ0VGRUVJS0hPT1BeXk1SUkxPWk5NTEhJSlJT/utw7Oxt+937+e1nXnrzbPTe6t3PzcTAxcO/xMjDxMnO1+ro3d3c1Nzp4Xdr4/NfZVJNT0pHRkQ+P0dESE9LRURHRUtMTE9KS1Jede/Z3una3eDQ1NnV1dfS0tLRzszOx8TEwMPM1Nfm59rf7HpcYWJ0evTedGdtXF5XUVRJRkdHS0ZHTUlLV11pemZZYV9UWlRUUUpKSVBdVm3tavTr6dPNycvLysfEx8bGxMfEvby+v8jNy83P0dPc6O36aP1obm9VTU1STFBUTUhGRklJS05WYF3o1dbZ5vzx7P939eRycvz+29PPzM/Q0M/O0M7e/2didXP2YWP5/+7W19DR3uHl6X38b2deYWzv39zV3fRxc3n+8vRtZVhYZV9ZT1FRVmBx6OxraPR7bu7l5Orc1M7FxMbGzNDOzc7My9PU1t7Wz87S0c7Q0c/P0djv8G1cXV1fU05WVWjo39ff4erf2uPc72hyWFxjYWFWaHRt7+bV1OTe5ftqZF5QTE1NV2j43un7e/ni6eDmZPtyc+7t337r3+TU0MzIzM3Q0tzc0t3p4eTe19fT1+J5a2tqa2tXVlZUYnHx/vvu7NnS0MvNzdLa43Xtc2Fu7unbz8vIyc7S0NXh9mZYWFROU2Nvav3wfOTZ09XSztLU6339XFhhZWhw/+3r3vReaHBuaGdeVU9NTVFMTFFPVVpvcG3f7n7tX2VfXGFz2tzb0dDHxs7Ly8zR2tj4cvx23dnV1eDc3uTsbOpuVF9XVVdSWE1e9Hbk5tvS4NzY2+Ln23Fec2dq/HZ4X2V389/s3t7s2+RfWVdTSUlRT1peeut+7t/g5+Tb8m3w8+vg1tPe6eXm3OLm5m1mbGZsbGNSUl9cWVpgYVBYYG13YmVTTU9UWFhfZ1xg+evc09jc497Z3ufqd2JUXHXv5+Tb3uDb1dfe721UT1Rca15hZFdj9uvd6enj8urx/uxtZVpOV2FiXV1sX2N76+JtXlxQUFVZUkpOSkhQVGViWmhcZ3597fLo9G7+8t7c3dfd49jOy87Y4HJp9+niffvwZ/nk6ef68XFiZmVfWFlSSkpOT05QX1tddO3g4uB+YVVVU0xPUE9OVHH4duLk+/Px/11jal9bWVtdWGH4ZF9p7Ori2N3u8nF0d/LqX15faXFq7vljbm9sX2H7YlhXUkxLS01NTVFVV15zX09PUUtNVVRUWWl46dbLyM3PzdLd1NLa1tXR3NvY3dfX29/u3dbW4+XecXDu+11WWFNQZW9w+2t7dFtk9HB7Zl5QT1NLTVNdWlhtd3hrX1tLSEtKSkpPTk1c+evn295ya2t28NzW2uHh19vd29PncPPo3tfV1drY2OHffWxTTE9NWmFna1pdWVRidOP5X1xTU15xdXr85t/SzNXc6u7zYnXh5nh26uXSzdXS3+Xi9eXUztXg5PPq3NrT2+b79enVzdLY2Nbg3eB8blhQT1FdX2dgWFhXXF9dV0pGSEVGTE1RTk5PWuzf825bW1ZXcmjt5u7c1crM0MvS0M7Py8nDxsrQ0c/O1NrZ3f3v5OHd3uV++uvdbF1hWFNQXFpWb2xpeG3t7dnT42dVYWFf7ubzenTt8OXj7fr57Ot9bfBvXWh+6NzU0dnT0tHOy8bIztjb3NjO0Nzr6d3d2Nna6fd5cm1aU09KSEVGSkxYT09NS1554/xkXVZl/efV1dfX29DNys7T1tnWztLT0tra6OTb2Njk3eT429fS1t7a93Tv3NTt6Or939vP09vU3ejc1t5sXVhRVWB1bmRpa1hj6OtwW2laVltfblxfW1ZddeLq9ul79NvR0+Dc3N7e2dLV1tfRz8zHxMrNzdDf8fTu5PLz8OTb3uLp5OTu697qfWBTU1dfYWJfWF9nZ+7+/X5idHb2/HPq+On8bOFtZW1eZ2B46W7zZ2FsaNzaeuPm5N7Yy9LKytDO1MzRdevi5+700N/i2+XY8OXfWVdWTEhFT0tGSUNGRU1sU01WU1BReXdUZ21u/XjR2vjk5N7kzsjRzs3R3N7Lzud4+ebu2s7U0NHU29zLz+ppd/p86NbX29jb7Gvb1utxXllMSldbV1ZPTEhQXFBJRkpJS1NTS0pMTk5RXGVpXlhSTlt+6efodXB63dXW2d/g4Nna1M3IytfT0s7M3utpYPh08Orj5VxeaGd1bGtVSEpJTVlca1RPVE1caF5WSFNaT1pjbFFNVk9ZZ3J4T1BbU2Hv3OtfdHh12szL2d7T1M/IwsHJyMvSz8jH2eXc5enczs/e6mhdVlttU0pEPj4+SUxGR0I/PkNPSUZJSElMX/RuZlpVUlvr6XN0X1de/tHW29v4Z2zX0NzV4HV75s7Q0NPY3tzOzNbY5W534NTOzdDWd1x44et9bFNJTVFXWlZSSkRHS0dKSUA/QElNT1ZPT0tRYGNrZV5ZXfDi2c3Lzt7b0M3NysnNz8zJxcbFxs3Q1NfV1d55avz+993e4/dpbF9ZWlhXTk1OUVhXXlxWWEtKS0pPTE1PTVdaYWViY2JdXWBbW1RYT1NgcvP0al5f9/bn3NTJzdTNysTGyMnQzs3MzM7O0NLRz8zO0dv1X1daVlFUVFBRTk1XXF1YSENFRUJFSUtKS09QWVxYWU5Sal9ubG97Y+7Z0s3V1+3l0tXMy8jGzszIxMLFx9Ti1dPQztbQ09TLyMnL0ONdW1xYV1FTUFRdZGpdc2ZKSUlJRkBHSElMUFxba2RRUlRaWlVhW1dm9djc3Nb37+Hm2d3Px8rIxcDDx8XN0NHb2/Hf2uHW08zLzs3hZ19cXE9RVFBXa25iX21iWVJNTkhGSkhKWmFcWGtdVF1cZWJkal1medrS2cjL2tzh1N/Xzc/Jxb68v76/wcbKydHPztrUzMXEy8vM197wY1dPT0tJS1NhXGl+ZFpOSkRESUNFSU5dWmRnZGNdYFZddlxhcO7a49bX39/u7V1c7fjt1tDKyMK/wsLFytTt29Xe1dHMy8S9xMnO0OZk8/VkZ239XWTpfm5obldHS0xIREdKRUlQWVdOVFBITFhfX2ns9/XMw8fKysnU2c7Ny8fAv8K9uLm8vb3K19Lb29zf5Xvkzs7X5ONrTEtSTExWTkxSXWtgXWVZTEtOS0tTVlFOW2xVW19PTElQV1BbW1dddNvd3Nn/Z1tdeHfa0M7Jx729vru+wsbMy8/MydfSzsvHysnO2u1jZWNfa1ZOUFZbUFhYTEhDQUFDSUhJT05TTldgU0pKTEtY/HZn7tjS0MvJzdnf53Bn38/TzcXDxMC9vsHI0ODz2NHd3NXP0M3ExtLmeWhWan1cWlVdWVBYXFBNS0c+PkZGQ0VFR0lMV0tDQEE+O0JLS1Bce+7fzdfm9mxiWWza3djOx8HBvLzBwMPM0tfT0t3d29ja1MnW4OVpW1VhbGNrW19kWXZnUE9JRUJBSkhJTUtPTk9OR0VAQkA+SE5OVFh44NvP5vB6VV1XXtze1c/LwcC6u7++xsvL0MvO2OH03u3j1uPraFtdVlxeXV5SV1xTWVBJRj4+PT1GSkxQWGRgYF1WUEtKR0dOXl5VZeTc29re7nBeXVtb+vd62M/MysfFyM3P2Nzl5tnx7uDr39fQz+Dr6uj5+eN+bGhdX1dXWkxLSEI+PURISVFPVWBUU01GRUA/QUxYWWP73dLNzM3Q0t3q7ePU1tLNy8fFxcXFycvS19be3d7n7Xnw4OnjfWtmXW70+OTo+GRccl1XVlFUSklOTVZaYGhf7XJTUk5NRj9DQ0lRUlxXZX5lbWhfVEpQWl393tXUzMPExcC/wMvLyc3MztLZ6NrU1s/Q0uXt3N3d09v9ZFxeV1FVTkdGR0lLX/Vramt7cGFZVk9LSElKT1paXGbr5Pr87lxXUk9TWnXu7+LTy87OxMrPzM3OzMvP2NbTzsnJwsLIx8jKyMbHz9bdfmxrbGJMR0lGSEpTVlZWUE9QUkpDQEE+P0FLT0xSY/7l4up0W3tjWGL74uTh0cvLycfJzc3O1tbLztnn6+Pl2tXT1dLPzs7Ix8zS0tLg6uLq9WteX11rfXvq5u57YGxpTUpKR0ZDSEtOXFJOVWr6YlNXX1tdaXh76eXb087Jxsa/v8TEycXIysnOzszJxs3Mx8zKyMXFys3R2e1mZ1ZPT0hLTU1OT251X2xbX15OUUlARURGSE1XTU9UWHVhWFxYXlxeb37f6v3k2s/OzcbKyMXHxMfHydHQ0czGy8bJzsjNzMbGytje73HwbmtfUFlXW2954fliaVpgY1NPRURFQkxQVFtSV1xh6O9tX1hbV2Fx6Of172zxzc3Ozc7MzMLBxsLJ2d7Xzs3LyczKxsPCwcDL1N5y7v53a1JRTElOUmBaT1BLTVFQT0Y/Pjw+QUJEQkRFSE9bcWtdYl1rc+za6uXrdu/fz8rOy8nNysfGyM3a6N/b1s7Q1dPPzM/IyNLY3uP7cd3oZ19bWVVf/nlsfOr3ZO75VkxIRkZFSUhDQ0VJSFZnUk1QVVJLUVlUWFpcVGHg2dzRzMvNycPGx8XGzMvGx8nKzMzOz8nN19Xd9G16e1xYVE9KRkdHR0xQT1BPVEtIR0dIRkNEQUZKRktOV1pTVl9bWlpcWFptXF1lZ2Vm6tLSz9HW3ure3+DW093p4dri29TV2dzY0dLPzt3/6uR3eXt2VU5WXn3p3f1UWllPUExORT4/QEVITllMTl1aZG31+15ocv3f2tDfdObt39HKx9Ha2N7SyMTM3dTd5ePf3ex6/nF27tzlW1hST1tmX1ZPTEtRZt7eeGRXTE1cZ1ZQTUhJTmBuYF1RUFNi7W5uXUxPVe7a7+dmW2PsztTQzN7i3tDHy8rS+WRt293m1/ZiberQ0tTbZlpYfetebFZKSlP649/iXE5MXfdifHtaSk1ea/ffbE9NW/Dt2dl4V1zx187L0vRdfdfa183O6OXW0MrBw83g29DSzsnL6Wbu7eDRz+RQSVBWWlBNS0ZKTVJt8XBORUlNWF9bTUhKSExo4ttxUFdp7tvU32lx6+nTzMzacWNq8drOytfz/OXNx8fM1N38+uTZ1eLxbm/d1M/S4+pobOPW1Xppdl1s3+Df/VpQUl9s82pbWklKW2t6al1MRVNjXmJZWlFQdt3W5+vqY/bTy8nMzNjlzsXBwsbL3OHYz8zS0N5179bS2NziXlpofOf5amVXVe3X2u7tV05VY+Tg2+JqXmD83eXeZ09PUF1gXVZLTVhp6fvobllrcOPd5uZjXWJu1tPOzuzm29LKycbM1Nvl2NXZ4GtpePrd3tjpb/Dq2dXc6l9UVE9TWGxtWltXZenn2uhvalZeX3pwV1lbYH3m4uZ7+vPg29HN6PP8b+7bz87b4Ovm2NfR2ujjbWZ39u1saF9r6N3Y3eXjc3Ph5/NeUVNNUF9w5PH5embg19ra7XBbU1lfZ2BYV1de8Ojl39rg+NzR09DZ8Ghe9O3j2ujlZmvc39rg5nJYcmdieV1YVlBec2709GxYZvxw7NxvVVNVXfbc5d5jZOfo3NfZ7lxbXFlqaW9fbebn2NnR2fnl49XP2tL9XPn82MvLzOHp7t3P3dPgX1xPWF5mdE5VW1f7Y15lUFZVY3deY05HS0hTZnd8W1NTYNrT0dt0Z1di6erc+l5fXvrk39/s6v3o1dbU4G1kZ+zc09rrc2Bh5NDP1uJsWWB35+TwXllZX+/m+W5mW1ls5+5tVkxLTFReYl1bVFFl4Nfg/nJdV1heY1lSS05W4tHX2ODg6NbJxMnaeV9w39zZ3OXhbnzZzs7Z6nZlbffh3mlWTk1ZX2ZjWF9ha+Dj62hPTEhZZnJ2V1RTUW3j3t3yc1hUVlFUT0pIRExfbfpy9m5dZl9rcllQUVni3OTp9uxy59DMxsrZ4Wf2bmZ0Z2hYXv3q49zp7vrz4/Lm9FpQT1lcY29saV5r2dDNztffZmBYU1xbVlJTXGFm5uzweW11XV9iX1pWY3Dp2dvf7eza29XR2udrbm134tra8mZlY2/n7PpjZGZleHVmU01OTFBfbujn8Nze0cnP3/htaVZmemxgVlxk/t7f6Nro+V5j7mVWTk9WWOfZ4dr3bGNp2+J1/mdnW2PabmBkWVRPZG9advZsX3PP1d3h7nle6tP+39Tf3tLExs3N1OpiXutzbuf6XFrc237v5PpnbN7f6vV4bGjUy9rYz9r7+tTZ3+Pn71tq6/18Z1xNRVFTTlFTX1Rf4e74alxYUnvwevjq3vDiycvNys3V7vHrfXJpY19VauxlY2llW118bmv3dGhp6drt7uXm6t/Y2efc2u/p2drY1tfwZl5YYVNOU1Bc+OXk9OxmUVpfdmlfcG104tLN2dPS5+Dg1+Vy62pcbm7q8uff/t/Z1N385mVd+OjU297a7t/t2tDcz9jm19fO19/bcGllYF1QWlJJVWLz2eDZ52toX29gbfhba+fczc/O0uLl8u73aG9fXGVZXVdaYlhUVFdsZ3BkW2dfaubb1djd2d3a2dve6Nna3M/O2ej9fmNYX2dsY1tbVGPs4eT++3V16u3j5/zc3NDIyMXKztTg29Ti62JaWlplX3ZpWVBFSU9PWFRXUExUV3Lu9+X96tTa0M/PztXPzMzKz9j9ePdy9fplVkpPVllhX19VTFZcbOLr4Xd77t7PzMrM1NfZ2NnX0un0/f3b1dLrWVBPV1hLT1RSUklOZupyU1JYZXh15dzndVxo3tDR5ntnXWz76dv5/m923NDV7G9cXmZ939rh73p449TQ09bi9HDm3ejjaVlRUWJyfev2a11daXL9dl1hdObY2d/qemhkeXnw5+Dta+rX39vnZ1lQVlBQXVdPTk5YbHNiaVtVXmNr7Ox4bfDX1M3LyczU2dHV083ce2v5e/zq8F9SU1lWVVpbTklQUFReaW1XV1pr69/X3N3X1MjExMfP1+Tu4urg8V1bW11+dGNaTlFQT01MT0tNUlZx6Nfd6+1w493aztjf5eje2NLU6PNkZHD6dmpgWlhSVVdYWl1ZXGZdbm9y6+3n1c/O2N3Y2trY3tXT291hYe7zcWpja1pTUk1WWl5hWWJqZ15j/Pbu7nNvanFuam5ze+xvdF5j/Pl+aGv/dWRsWl1bWmldXmpqem138Hvi4u738Ovp9Prp3uHm7OLZz8/d6Oft/X702dPW1Nfa193d6fnycHf7bfl+aWJbXnBfZFxQWVJQUlJPUEtJR0tUXmlia2hib+Xb2NfW19HR1M/S0s7b2tfZ2ubv7mBXSkhJRUtJQ0pabmtu5Nbg3tbSztPOztLMyMfKycPIztvZ3f5nUUtHQkI/PkBES0xKUVFRWE1eYVdxanXzctrR1NHXzMjOx8HDy+XqXlJRT0lIT1dr8end5e7l3NbW2N5zWVlcZGRe+Pxq5drOy8/cXUxOUVRTT1VPVWjz2d70e1/92tjO0Njfc29m/uTp7nB66N3Oz9fvWVNQU1NOT1JTXmf929LP19PNztPW1t/+fe9wYHzsdXLu19fneGpOSEtOSktQVFZNUWh78/zoc+zY39jb5uL04Nvk19fs6Ora1dvZ+VxTUWFYT1pTTU1UY3fe09bb1c3Sz87T1u7l3OzV0Nvf8+fh5fNfVFNNR0dGTExJTU9ZY+7W2efb29fLycbIz8vM0c/LxcjMy8rLzNfZ4GlXS0ZAP0JCQ0lXW2dwXVtdaGxq8vBjWVJUXlNs9e/X1M/P3d3d/WhoYWBcbG5eZXb66PFuZVtXZ3nz5vHr/mtsdO/d2tXNxb/GyMnV0NTX0dzd2ezp2NLO0NrcdGv/c+9nWFtNTFhTWV9YXlxf4+ZtX1FMSklNS01ZXmVfYfP35uzz6Nzd1c3Ny83U193Vy8nM0NTLzM7U6HpWSUdAQ0hITktNWFtp7+Xa3NTNysXDxMfLzc3OzMnM087N0dT6bVhJRUI+PT0/QkJJTUlOUVpu/PDs/O3p59va2tfl3+jr4N3a19vuaFdfZVJPTE9catrY49/96ejwzMvNxMjMzNLMz+Dc3ujraejb7NPjY31n7+lYXVNOV1NkbFlcUUpWWW7f8/L7eu5z89rl39rn5OXZzM7V7l9gU01STlBZWFxlX29eWVlaZmp64ebc3e3n5NTO0M3N0tHXzcnO2flZVlZXWV1aWFJWUk5ZVlBPTE5SVl9qX1lYVV5eZWZgd3J1797RztPl/2RhXmRuZmv8e+va0cnHyMbHxcbIy9jx9GVcYlxWV0xMTk9RUmVkV1NZVlZSTFRQT2tn9Obf2NnYzs3NzcvKztzb2eLva25dVF1fXFxcX2VQVlpTXV1VTUdMT05ZX/Z7Zvzd2NbPzMzY29Tb5N3b23t55vvl39/jXmFwV1BZXE1APkZKTE5aaFRY9+zg2dHNz9nMyMrGycrR4Nfc39bY2Ppd7fbt7l9oXU9YVk5PUEpGR1piUFBaaldTZXdeZu54X11x4nFs6uh8YvXS3unt9mdgZ+3u7tnP2NjX1dXZz9Tf2dTR0Nzdztjd29necWJ8YWJz9/1dU1hTS09JSEZNaWFaYFhdWF7h19fX29nQ0s3P2djd3M/o5uB18VRMTVJXS0NAPkBGR0pNTVZXWH3r5e/i3d3PysjLzM3N0t/JwL/Azux4WWhdVFpbZF9aZGxnXFluYlzn5Ozu92drX2Xt4Nnm3NTe5+5fUltOVVNTZ2L619fd3dTN1NjX4fBjYm5cYGxfWFFJS0VHVFNOTUFFRkJJTlBdbdvT2s/KzcvLwLy8ubi9wcfKy87EwMrR2szJ1eL4TkdGRUI8O0JAP0E/R0tNVlNNUE1TWWff4vlqctrP1s/RysTAwcbO4+tyYV9n7NzY4GJaWFpndnpzdW9cWWxtcnr7693UztLT0dHXdWhpZPX5X1paX3vq2dfX2evm3ubc3eDf6n3wb15cXlpMSlBda11QS0U+REtPU1dn+fbTz87Jx7/BxL+7vL7BxMnPzszPztzvdV1keltUUEhBP0FAQEZKT09NUGZtffLp8n3v4uT18elsbmfm2OLa0dXX0dHZ2t7b2tzp2dDQ18/T2tzW2+Ti5u9tYl9eY2lbVFVaVlpZb+fl229fZFReX1RYU1t6d+LqbvHyc+vw4drj3+f55Orl2tnP3W3/7N7V72JUSkhHRklFRkVBR01WX2D59G/h2dTJy8nCxsTDxcDCwcLKysfM0HxYUEJBPTw9PDxBPz5CQ0pPUFVqb/DZ0MnLxsrUzszJw8nKyMrExtHP3fX0ZFtYT1pfXVlTWF5fam316XhbXVZXV0pIREJGQ0pQW+72VVVWYHVfePZo59PMwcTBwMfMy8bBxsjP3d/4ZPhgX1tLSUZJWk9FQ0A/REZSUFBfVlr78c7M0dLb3dTVysjNwsfNzM3Ey9rb93zg2+b5Vk5JQ0RCR05JSkdHSUhLUElMVFJbV2bf7uz0dtzQzsrKzcbGys7Rz9br7VxNVFps82H0b2Dh3djX/N3+XXzu39d06OBz6dzOxczJ0uf68G3uWlVeZHF0fNn18+Lo3tXSxcvXzunzellfXU5OSEVNS1BLQUI9P0dDSUdBSUdIWWF9+Wrk2Mq/vby7v7y+wsLFxMbX1czJx8nQz3ppbWxoVFNgUk1JSE5OSUpHSklKTlddbGdqYG7s5djb6uTd0tDSzc7L0Nzu6+XZ3uvr7u99ZF1bXlxcX2lpcV5WUFNXYltdZ/vl5exvanFwZW5jaXF28ujg09XNzs7LzdHR19LT19rsb/1kZFdVV1JOWlJQT0dLSENLSVZwdt/f6djW0cjAvb7Avb2+v8jEzODT0eHxXnBcWVhZWE9PT0xBQkRAQ0dLTElLTUpLTV9gV11odmtne2tae97a2M7CvsXKycfFxL3DzM7KxcXKyMza6uPa6GdnVUpHRExMSE1OUFROUFNa5Nv2+W7o7mzm3OLY2M3O2tLN3fRq39LZ18/X6F5hblts4PBbSlZoVlNTVkxGSFBIQ0pQTkxTcPXg1M3Iyce/w8G9vb/IzM3O1tfT3uHs3G5eVlVMPzw9Pz9DTElERUxWXH3RzM7S0szNzcjJzczMz9z23tvmfmNkfWlxe1lSW2NkZXrlbGBQU2Zq6dXncGVXV1VSVE5NRkROT2F0YVdWYW7x6NbUzs/Qy83LyMzMy87Mz9DN3OB5XF9ZXXBnVU5MUFJOWltTSD9DRkdXY2VcUF1tdu7r6Olx/+jk287O0dbLxMTIx8XFys7R3Nvc421YUlJNSUdFRD89Pz9ES1BOSkxSW19s6N99cHbe0MnAx83OzszR3dzldGNbY2dm+2BZZWfr5Xrn7mdZT1dsc+99aXRo9N3s3eL08mVYYnra2ufY2tnPz8vKzc/P09POztt9+2ZZWVRNSEFAPzs7PD49PD9AQkxXYFpabHt38dfIyci/wcTDwb/GzsvO2+Ldztbr2tvq49zV4GhnbF9XXvR+V1hfUVBVZVpUVVdRTEtXW1pZZF5m/tjU3unc4O3b09XUzsnS29nP1uxxe3BbWnt3XVleXlVTZGJaW155bFtzamBeZHZqaeHZ5Gtdfe/55N7l4tzU0tPV1ej9cfTwbXzg6O7kZlpVVVlPS0hITUpMX15edN/g3M/FxM3Oy8nLy8TDztfNysvOys/1V1heVU1OVk5HTFJOTk1WVEpJUU5MT1VVUE9YWVtifPZuX2t3YW/s5O7fzs3LyMPDycXBxdDY0tfr+t7f5+Le3GhTW11OTFJYTkhOWVxaX+528tjLzNfd3uPs6tnNzdXO2OHm6N3g9nxsYmPx3dXoclxYVlhdWlxRRkBBR0lUXWZXTFBXY3Px3P9eXGvg2dbQzc/OysXFw8TJ1fbv29Tc3Nr7XFlZYW/xfnxkWV1fbGVk9Oft4NHKycvb9V1caGp9bmFdX2R55dfW3ODf4uLZ3+D+YHXb2NPU3+9bVlxaTElBPzg4Oz1GTVReXmTn29DQ1c7Py8TCvbq9vcHIw8C+vsbJ2W9wUlJfW1tSSlhTUVVNUk5HTlZcaF9kZVlrevbd4dp0U1xzcfX/ff1b+dzd1tHJxtbSzs3K1drdemJoffd2ZWlWRURJSUlJT09TTUxPUllhcNzu5dPSzczMzM3Rz8zMzux66FxST1ReVFJaaXhz4NrvY23vaFVadPZibu7Y09jOzNfe2szZ+evd7Wnt5OTwd+Ta1tjZ2f5WXGVuZ2JxdGJZWFZWUExOTEpIQ0xIR0xQXV9b6+l9/tvW4GplcF1gaHfrbujKyMvNxsbY3Njc2+rbz9Paz9LMzdbM0fnt/3heS0hGQUJBREhLTldRTkxQWG3j2NPO1NvV09PZ183W4NfY29TU2Nn2+2JcW0lOUkM+P0ZMTVVdVlVbaf/t69va3H5l9/7539nQztHS4fHg3Nve4t/Z4uHZ2tnl7Hx8/WV47l9RTVNZUl53bHRvYH7xeNne7GpXZmhabOXVztPd293h3trfbl9WVF9dcP1caGZc/W3y19l8Zk5JSkROVVFWSklWTk9q9upqZHD6euPR0Nvi2dTOz87HzODe3c/KycTG0uD5ZF9WWnthUUtHSU1Uam729W5sdu7p4/BjWFdd7tnh2tL2/m161tjRytd3b+/Z2dzTzuFpWlxcVWNkU0hBRUhJTFJXTkRIS1RpdGVeUE1bZ9rLysPFz9DO0NHKzdDcbl1fef7j2NTjaF9vd+3k8Xlbct3t1dXVznNa7eDayszZ3l1x9mvd0s/haVRPTU1edGliW1hbYu3R1N5xT05OS2BdSUU/PURIU+TqdnlfVv5t4NHe3fvq5drTyMfJy8zPzs7QzNf9Xl9f797RydlpaWB04NXM0uN4enF96t/Q3HpdUE1NUFRPU0pKTUtSaO7l+l5vcXHa0tTUffHg3c7JwsHK2eRsXXnqcGRRSExLSlBrfOx5Wl9OWens8GpbaWJv28/T2HVZVk9q2Nre7WH24N3PyMbIy+lvYGfc39/d8fbl7e7W0OPvVU9NVHBvZ2BQTVZa8s7Ky9Hv/uXaxcjP1N39aWdf4Nx+9VdKTEpSTUtLRUI/Q0hTYVlWSUROXfvk5dXf7f7i3c/FyM7d6G7x3dna0NXQ0c/Mx8THz9ztcG7f4OluWk9MWfri3vdpV0lFTWFwYl9dW3T95urf2c7X4Org0tzl4epqfuzxeevr6mNLREdWXl5lYldSVFFY6ubhbFVTUWhtWWJ2eXL06PHSz9PdYV5j4t7i1NTobXra08bCx9drVVJv/urqZFleZe3h187cb3D9dtvU4tznVl7r7e7W1tvsT0tQWGZuaGZdVV92ce7e9WFWUU9aeWhdXlps2uX16OxhT0lHTVZgbF9vaVli8u/aysrT6mv+5NnS1M7T2M3JzsrIzuZuYF/y9HxoamZeaPfn3c7Y7l5VSkpVbfh86XRiYWns0OVwYVdOT2dueGtvd9/Nw8DAy+RgWVVY6+p7YF5QTE9UXPV5Vk5KR0FNWV5SVl1fc3ne0NPmb/3h99nO0OfwfXzq7c/L2H5kV1JSZObp4M3LzMzMxMDGz937/2hn4+xkenVt6ObYz+1TSUBDR0dVY11icWN56NLIzd33XVhWTFFYTk1UT1xcZOdkR0NCQEdOaftdW2xj9dfNwb7O3un2eHne1tfXycfKycjFx9vye3R9b/t8/Gh459PNxb/D2ltQS0I/RUdIRUlPW2Pz2NZvWWNoXFZ97O598dzOy8O+v8z6WVhVT2ZhVk5LTFVTWfHubFtOTVZQXGxsavLbzMzPx8jU/l1ZVlBYYFlbYFt43NXDv8nadF1iXGnj3N7a18/Ky8LCzN9wa15RTU5SVVFZfNnd18zZ825ZUVRZXn3sdGlu5d/RxczmbFVPSkdJS0xJTVvx9N3Nz3JST1JNS0xTXVBa7+DRyL++zfpqWFBQSlNoW2vXzMW9urvHycjK1/FpWFtVWfHX1cvJzN1lU1JIQ0RGUVRLW+7r08zIzNZ77WlfXWfjYF1m3NXQzc/i/l1XU01MTFdYXWze3drNy9La/VtNRElLS1JhYenu6NrQ1O1dUFtVTFFeaPTs2crCv729wMnlfGxRWHfz3/loetnNxcnZ2mxbUUpPWml5/urdzcrGyNbldl9NQ0BIRUpOSE1u5tjQ0cvT7V5IR1dJWXBdW+PS1tHV1eb/VkxIR0hLT05Ucdzf1dXP0c7q8/Lg1+zU1tPOy87LyMnMyNtZVFReXmVi9efZ1+Lf2Ojqb01OR0VLX2xucd/g+tbS29hxSEdFQkdRXGru29HPyMXGxcXXamVSWFpPUl138/ny5mtfW00/QUJMVFJTVmp46d/V0tHU61JffXLs6+rc09bKy8/NzdpoUFt8ZnFkW+PP08vFwsfLzd5xZV1WUlhWbt3s/ODa9u3pfWZZTUdAQURJVVlq3tjj2dLZ9VxcWltVWV1WUlJdcWt83nZUTU1NX2Jnelpob/3d29XJ0+FsXnbm4nPm5OLcz8fAvr/I2H1fXWT2XXz2c297597U1eBcUk5KSkRARUlFTlvq29bQ3NvtdmNsam1sfnlz7dvX2tnq3fllV1NYVlReW191YGNp6/l9YlhZVFxfaGZecu7n6t3Jys/iWVNOR0hPZ3vj2NHTyr/Dxcfb3+FraF1bWmJu7eDSw8nNytR9Z1lQXl5NT05WYGTm5u7hflxsaVZbWVJZV2Tnd+zybPReWuvabF5dUFdhbevo2+V94vJaVVpOVGNOUV/61dLZ3vTe0tvf0NnW1P9ke93My8vFycvQ3ujV2u3s5PRfV11mc2xld15VV/5uXlpfbOvp9epwZFlXS0lLXmBdaW5kfnntz9LM1dHdfHt0Yllr93ho6N3QztVucFJGR0lTT09RSUlPUmbcz9fW2O/o2tXYz83TztDYz8PAzuN1UFdrbPri5G1lXWvz08zf53JOUHT04NnZ5/ja3evc0Nn4bU9ARkdFTUxISVVYWGPR0vrxa23k3uzS2/VhYGJceNvX/HtlXllUTFNcWVRbXlljc+Xv8Onb1czNx8DFy8zS1s3IxMze5+Tt6X7t2elaXFtVXGDv63xbb3hsaGfp8ltbamRw7OTn+ldZXvrZ29HeXlZTSU9idfHxYV99a+Xg1d9u/v5lX/DuZFZKSlpicujUz+FuYGNe7Njb4l1WZOzk0szKzM3P1dvSy9DS3d7j3evazdTb5d7l8uvP2/FoX2trZujO2d3+YlhSUWZoXFxVWVlYX29s+H1xW1pib3ltYVBQVFxs3tvd4mtZXHDe1uDuY2Nrb+rSztXX3+55eujj6eTr29TV0s/P1tff+/Hl3ePx8HhzYO7Ty8vPzdpeWllbV1BVTEtPVF5y7n3e3nx3am9zae11Y2N6dXrh2tTf/F1aZuvyfXNbWGFgae702uZsXlldaFhXb2Zu7ebg5W7l/FxZV1VSWnD+/XBm7uLT09TO3ere5ut9Z/hfUfzg9d7o4dzz/O1+fG9eWV5cYepvcX3p2t7p7Ht03+nw7ero6Hp6amV2XldYXldSUVZbYvvf6eft6t36b2xnYFFRVU9aXWpsfP7823VZWVFPTEtQUl1l5NzX1tvJzczIzM/Z5eHtb29++vN88NPU72RPS0lFTVVOUV1caf593dfZ2dHSztva2uPa0tPLzNXO2eTwaEtKR0hMSElQUlRgaeTb52xqXllPTFJPUGdlbu342+Hd6tvS0O9XWlJOU1pde37e3NTd6Pb/fm/k3N/f4HDz9/p98d7f6e3o++n7a21r/tvg4uvu93nx//pudXzo+Wls6urx2M/V6mNhX0lLTldhdl1eZ1tcUVRPUlpcV1NQT05PWl1q38/Q1dfV6/b15NbNzNbt39LU2Obk7fJfXHP6ZFx8bnnh1M3T9G5kZWNbXGJ4/OR9d/5s5NnRzM7ab1pJSU9LSElOW19o5uV1dWpefeva2GlbYmBnZ/Lk4Op8eFpVVV5ZXG1pYlVQXund3uDc49nV5dva8+fg3tDKx8nO33BbXlxeaf7g+GRmW1xz+e/k4mxeWlNTUlBWXl9tfPfm7n12bW/r6vJtZnBpYHnb2tPZ3+NpXWFlafne1dLd3N3c3+vv+mpcXFFMSk9WWFpl4tDLyMrU32ZXXmlbZ+ntdG3y2dPOycbK3Xtv+2leXWNaV2vydV1bUk1QZnbya1leWFVVWPHU1tbS3v323tbfz8fGyM7V0M3Q3e72dGJWWVxXVFJMSWDs8fBoWlVRVE9XWV9y4d7o387N0MfDwsLHzdjj4X393ebfdGBXWl1aT0pPVlh65n72cuTp69bU1dz0Y2Vtfezaz8vMzc/Oy8jK8W9hU1BLR0ZGS0xUdNvY0M3d4t3V2u7l3OLt6+ne19XT0dfW19ryV1ZQS0VES1dVUlRXVU9c6uXd0tPV3fnr2tPQ1tDV3trf5HXe0s7R0NDf5n52bWBtXFtiUkxOUFJYad7c287Ozs7d7PHs3t/o6/Ho1+ps+ujc4N7qaWjm4mddVl5revpgXFhYV1JOT1p8a1lhZGp52cnHyM7Z8Ori6Onm2NTRztXNyszP2d/g4+3xX1hdX2Ru69zRzdN7fe9kWFddV1dUU1BRZG/73t3Z1Nz47tzb6GRw63rs6W5YXmRhcGZu393nX1dPUVNaZV5iXFdVTlNv4NLOzsnL1s7OzcrN2+Dvc2heX09TXnJrZfv39m5gX2rt08nKz9jp7nzg1M3R3/lvZl1iWlVZWmBtZWn99VhLSU1PWWhwaXx1Ulhu7+Tc0dn2dmVecO3g5vP6+u/e62V5bWp6+XBYUVhXUFpy5tzOy9HZ3mdeaXPf29vqYFpiXWzr39vc1ODl0c/e7nh5aGJuXFBNTEVCREpMVlpZW1VNTFFdfu/e7Wltb+/d1s/LzcfO3+N6/GdTVlZTVlhST0xLTlto+OngeF9hWmDw08zPz8/a5unYzc3l/WRdXVBOSkhMTE9YXGJ5YF9uZ+DW087V1+FiVlhRWl5fX1tuZ1hXWV3+d3f5+uHk7d3wduLm2t3n6GxfZFtt6vbd4WpraldWTVvm9uXsZVdSVldXZ2ds+3j7/mVlaHfp7eTY3flmWVVOV15ZY2ZbUE9iZF9n7Gpr7PR0YO/X18nJzcvO09fd53JncGJZZnhhW1ZUV2vc3/XW3vNtVE9PXV1bbPV7fXZ56uPa1N7aztPe7nBtbfv9ZersZGVZTk1WbfBlXFZIR0VES05PTlZ5d3fc3ODPyL/Bwb3BycrY397m6ubX4Gv99lheZ2VnZWVnVE5RTVZe/eTY0dXW1Nba0NDO0NfY7GljXl9ra2Nsb2JdWFNMTFRfX2H1dVxcWE9RVVFXZFxSVVxbbdXMy8nFw8fL0NTY3d7h4+rq6Ph7e/rl4t3W2HNWWVpi/Hrz3t3X0tLS0tPOz8/Szs7c/vr+c+1y89bfemVSS0tMU1NSWltYVVJTVlVYXGhqeeXj4OPbzMjKw8DCxtDh73xuXlpZUFpiX2FidNrb28/S09nweGpi++rb0NPZ3OLt3tTR2tTT1NTf7fP0enp+dm3q8WtWS1BbWWjtbnpsWlpdVFZeWlBOVFVbX3zdzcrFw8LCyc7d72lwcWxqaF5ZUU9ZYmRpZFdgYlxcW1lnd+jY0MfCw8nKyMjOzMrQ2eP683BjcPFe+FJcdUpaXl5k7/j35N7+Y1lOTVNTWV5YYVhg7uXRxsPDyMzM1d5vVFZSTlJYYWRdZ//33Nvc4Gz3eGj5ZGPzdv75+/Xo5N7368/Uz87R0OltZ1/67/X/ZFdSTE1TTmL8Z21jaHReWlJMU1RTXfrd2d/YzsrExsbGydLmb15XVVdVUVJTVFlgeHjv6/j29npeWWNkZHnh3NnU0c/a3dve1M/W1t3pcmFaVFNTWVJRUVdWUlv/9Pd1bu95YlVPTlBPVFNTV1hv9Ovf0cjCwb2/xtTw8OTr7vtcaGBYV1hddnr7+2Pvbl9YUFtkX+7f2c7T083T0cvPzdja1O5dUFRcW1tbUlFOSUtRTVJr9H5fampXTUhKUU9VVVJlYV53/+PPysjKzMjR8l5XWGV5d2ZrfmZ54+Xgzs3X4eDobVhUXmZ8fv/z3+jv5+P85cnEycjI1epscf7j2+T9/3BVUFJUUV5lWVBWUkhEQD8+R0pMT1heX2z439PFwcLEx9bc6/J5fedtXl5vX2RfX1z93uLn7fxfXk9NXOba0dTX19vZ1dTQx8zPz83d+mpST1FZUVFRU1FSVVlq8vN8aWVcT09MS0pNS01PVF9WU15ifdbPzcvN1d7q+Ozd3ePe6PV8b/bq8/VlXF1bWk9MR0dJTFdj5u3h3djY0snDwMTFy83P2+Ho7+59bWpeY11QTEtTWlZTUFJXS0A/QEZOT2RkXP715dTKxcXGwsHI0uDe8GNlcmFdW2FbUlBbZmptZGBfZFNQVFJVZPPl6/vg7Pbh1NTY19nW0tbk9fDr6dnW3mtufl1ZXGNZVmNkXFRPSEA+P0VOWFZQYnFcZ9nKysTCxcjMzNHe7uDX1dvxbuj0eW1sXVdfWlNLTkxISVBl4t/g3dzP0czJyszIxsrO0c7afmdfW2FcWk9OS0tOVFBLWFpgXVtWUlFPU19+dXB7+u/Zzs3RycXIx8jK0dnX09rU1N/e6fXq4vBlV3bvav35X1tUV2Bp3uL46uve3N3U1dXMzdHO0NbP3OB4Z3VbT09QTlRPTE1MT0pKTEZAQ0pNTlNhYGv718vIw8DCv7/EwcTLzc7V0+DtfFxjY1pYVFVZV1tbanlwZ3rv5OLw3tjZ0MzNzc7LyczMysjKzc7V3917WlpOTFBQV1NQV1hdX1hQT01JRkpOSVBRSVJl/Pr82cvRzcbGxMTCwsnFyNTV3PDf4+5wVFlRSE1OTU9PTk5Y9WFX8vfi0czExMC7vr67vsHCzNLe3edNR0dCQ0hHRkNFSkdOXVhWWFNUTlJRTlpdZO/a1dPVzczPztLRzc3V1tfZ8GBeWlNcaGZqaGtjY3J0YGNeXmFo+Wxqb/bt3NjVz87Mx8LAvr6/wsXK1OFtVlNWVFlRSkdGREA/RElHRkVHR0xNSk5ffejPxcG+vL7CwcDCycrM1NzdblZPUVBLSEZERUtPVF59a2z3+HNr7Pv76trR0MvLzs7Mzs3MycbHytdvZlRHRkZITVZWWF5fXVdWV1FPTE1LR0xMSEpWYWr++t/PzMrEv76+vr/BxcbN4G9172tdTUZFREBAQElLS09OT1lZUlZg6dTLxMK+ubq7u729wcPFztx+T0U/Pj8+Pz87PkFASlRbYF9iXF1mZ2pqbOna1cvN1M/c5OHb087KytHS225cVVpma/fsZW/yfHR1eX3s/WtqXlZSS0dLUlldZWPi19TMxr+8vb/DxMrV52ZcXltQSkU+PDk2Nzg6Ozw7PkJCQD9KWOfSzMC8vbq8v76+vr+9wMTK61xZTkZFQDw/Pj5EREpWZXHv+Ove29zi0M3Mx8XDw8nK0M/Ly8nL2PhtVEVAPT5DSEtLVFNRWFZTUVNXX2ZmY11PSEdHSlBOUFpedPzq387Hw8HAv729wcXJy9bc+WJWTUVAP0JJSkxLTUxORkhQbOPXycW+vLy8vr69vb6/xMzP61pLRkU/Pj08Ojs7Ozs8PkFGSU1f9u7l3s/NzMjLzMvO09Tb29LNz+FoXlZOTEtQUlRaU1hgZmNaXHja2dnZ29fkcF1cYV/65OTX1NDOx8XDwsfGxcHCyM/e3/FcUEpEQD47Ojk6PUBDREdISEtTe+HUzcnDw8LGyMnLx8TExcnQ1txvXE9LTEpHRkZAQURGS1NfXf3d18zExcnIw8PExsfGx8rKys7L0N/ralhOTEpKTFRPTVVcVFBJRkhLVl1taWVcWFRTVltrbX7e5evi3M/LyMrGwL/Av8DG0+nqXlFLSUY/QENFR05SU19eVmP+8dzNyMXBvr2+vb2+vr++wsnQ3GxdUkpDRUM9Pj07NzY5Oz1DSVZ2383Gvr+/wMDAwsPDy9HP1+X1+V1YWFhYWVleX2n/dXB2/nT03Nvk1s3O0tje+WVeW2Ty8uPc3OPgz8zQ2NbP0M3Jys7d4nBYWVBKR0M+P0A/PUBEQkFDTFRddt/b2tLKysnIyMTAwMDBw8XLzNXpXVNWTUlGR0U/P0FBRkhNZOvVyMHCwr++v8LCv73AwcTFyM7P2eFqVVJRUFFWU0pNUk5NSUhIR0lOT1pYWGhrZV9iZW7s6+3l7+nf3/b383zm1tTMy9Ha2NLn9+j29ur6bmRr/fh4Z15x+nrs3tTT3M/Lx8TCwL69urq7vsPGzN9oXE9JQ0A8Ozk3ODc2ODs9QklWe+jb0cvIy8vKysrMzdHV2d7p8FpPTk9TUF1cV1pdc2xaWmjz7eLUz8zMycvU8Ojj7e7f1drd2dLMzc/Jx8jMy8jKz9XQ1PNeXFtYTU1KRkA9Pz07Oj1CREVOXm517dbNzs/Kxca/u73CzMrM42xWWFhJREJCQz5CSElISllhcNvMys3LxsPHyMfDwcbJxsPGycvU63Bnb11bXFdRSk1OTEpHS1BMS05ZV09WY11aV2Ltb2hhX11ZZXdrZ2d3/2Fm993d6Nve3eH76OXzfnJqWV1pXlNNT1ZVT1VXZl1f9fTj3dDEwL67uru+vrzAyM3W4XFOSUVAPT0+PDk5OjxAQEdNTlFs2dLS0s7Mzc7Oy8zQzdL0YFdWWVVQUU1IRUxVUFJdan576tTO0NDMztbb0s3JztzkdFta/OTu9Off4efc0NDW2Nri93ZqcG9aV1JOR0hMQz4+PT0/QEdQU09OUVZf8djJxcbExMvOysrb7fL/dmRYW1hPSklMS05QWGRaXHByfuPTzM/Q0NDP09HKy87Mys/Z0dTa2Nzf5GdYW1pTS01PT05OVV1USkdJRkRLTlhgY2liXl5o7uV69PTpdHHf3Oz+emxgY/Dz4+Po6f1ydunlZ1haWVZa8NbT4efq7+/XzsjCw767vb6/vsXV3Obvb2dteF1JQT0+P0RDSElEQ0ZJSlZnX1xlb33z29TS1Nrj+WZkYVpYTExMS0xQYF1RT1dmeOPQx8LK0tji493c0c/U2drY29/hempt9ePd1M7LxsnOzdTNx8jKztDT4O/v7m9URD49OTg6PD9DQkVHSlZm4tPOx8TCwcDAx9X2WlVQVGFiX1lNR0VGTFJaWlxeWmfkzsrPzsvHxMW+vLu+w8TL0dPS0tPr/GZcXF5sZ1pTS0xWXXnn2NzmZ1lcXlhXXFlWVVhY/PJqYlZRV1hn9+p0W1tXVVpu3tLZ19HT1dPMzNf1XFZXVFFYaGFfWlhfbX3n09DT0MnFv728vsPLzc/PzszN2d74YFleYmNcT0pLR0RISkZESElPWGnfzc3NzM7Nzc/S09f2X1xPTlFQTE5OS01Yet/X1tTY4dvU0M/Sz9TZ2+PVy87d2+Ht8+zj0crR2d7k5tnQzszR3tnd6NrX6mhcTEhIR0VIRUJAPj9ETlxu7+vj0dLPx8nd4exoZFxed/BgWlxfXFxt9+X5W2J+eeXd4n7s5+Ha1dTIxMvOz8zKycvLy8/b2d/d0dTkZmpscnj94M7Q3Oflb11gWU1IREJIREJJTUtJTVdm+/bl1Nrh7PB65dbU2Nnl9uHt6N37ZV5YWVhbYXdxYWh0bWrk1dDR0M3JxL+8urzDyMvO1NnX0Nj/ZmphXGNta11TTlJPT09LRUBAQ0hMUlxvbWVxenbz2tXpc2FeXFJaYlZJRktSWFxj8N7n5tTP0M/Ky9LY593f8ezuZlhZX3Ll3tnR0Nrf1tHOysPDxsXGw8XIys7hcWhrX1dSTE1JPTs+Pz5AREVFS1Ts397Py8/X2NTc7v347mNPTlNOTEtMS0tLU2ZiZWxrXmzw6dzPy8bHzM3Kx8nGxMbLzs/L0ODi4f1dXm1zdG1w6fpvbOXe6On7aVNLS01JREJEPzw+QUdPWGBuaGV092h4eGtfXWTn4nRfZl9NTFFZV1lZYWVXVmhsYGlub2lq7tDKy8zHxs3OysjKysnIzNXe2ODw/nFhW2X76vhmXV1NR0hRV09VYmJXT1BZV1treWNgZvT9X1hZXFFJTFZSUlJbX1hje/Tu69/fbXD03Nvo5OxqXFlicW7m0MvOzMjDx8zJyMvS0MrHy9Pa3vdfWm1qX11aVktHSEhJSEdKRkFGTVxlbeTc4N/a0dfc3OJsW11jWUxISEM9PUNKTE9XW1pZXO3d1svIxcjKxsbIysvKy9fb3OHf8XpsaXl76N3d3Nnc3tfPy8vQ1dXrZWRnYFtXUUlEPz5DQkNKUVteed3c5e7q4/R77Ofv/GpfV1NPTVBQUFdYUFBTVlVec+3i6eLc2tbNxsC+vsDBwMLAv8TIysnL1Nzubl5OSk5PVltcW1VSTVBUW258Z2BdXGFbW1xdXlpbW1VRVFFJRklNTk5OT09MTlhreu3h5uhxX3jp3djSzdDS2ODf4efg4N/VzMbIzdDU0M/UzcvKysvP09PS1NnY2tnocG1kXVdTUE5NSUdHRUZMXWZu6eHl4uDn7HlsZGZfXVdNSEQ/P0BDR0tQVVtXWGHx3dLOzMnEwsTDw8XHys7P0NLOy87X2drX19bS1uT0/Orb2NLP2d7v9/BwbGdgX1pSUlBNTlFOSkxUYHHz8XFdWVZYXWJpdnNbVlZVU1FOT0xJSUpOVlZZXl5n+9rVz8rGwsG/vby+vr/CxsrMzdDU1dbb7H57eX3/69ff5NzY0M7X3+Tf3O1uaGJv9nFmWVZbX2FgXVtZVlJOTlJXVE1KSkpNUVtiXlRQVFxbWWh69+zm3djQztHX3eTbz8nFw8HCw8bHxsG9vsDGysnIyM3V4Oh9Yl9r9vllVFNST01PU1paWV5qeuTa4PRnXVRNSkpKS01MTEhGRkRDQkNFSExQWGBnaXJ25dvPyMG/v76+vr/AwMDCw8PDx8zMzMzO1dze4NjRz8vLys3OyMjJzdXicFtaWFJPSUVAPDw8PkJER0pLSENHSlBRU1RWWVpjYGRdUU5JSU5ZaHf/49/g0s3IxsfHzMzHwb69vL3AxMfIx8fKztDT19nW2vNwZ19eXF5jZGBXTUtHQT9CSUhKTE1NTU9PUE9OTkxNTUxMTVFUWWBreO3s+Ori3uTd0M/Pz9HT0c/Q0c7Ly8rM0NbW0M7Qzs7R3Ojp63NgVlJWVllaXFdXUExNTE9XW1xZVU9NUVlaVFJTUVVSV2RgYGlra2plcP52d3nvdv7e3N/wbmh18eTX0dPRztTQ0tXQ0M/R1dbZ0dHZ4OttaHJqaV5US0tMTlFYX2JfXF5oYV1v8ubyamtrYFpcZWFbZWZnb3B49fHw6eLe2trj39/g3NnZ2Nnk9fj9ZlZST05SU09SUk5SWWVuamrz83Hy4er9bP31efHw4eP2Z2dfXWX35+Tf5drf3dHP0M/O0dvm4ODi4t3h7G5v6t3jeGxycFRRUU1KRUVGRUtQW2daU1tlXVxs6/d4cXhwXmBdW2JcW1tYYWf66+7u3dfXzcnIy8nIx8vNysvMztTU3ePb2c/X4OHubFhcaF5WWVZUTEdHRkVAQkJAREhKTkxJS0pKTFVcXV5cXVVQVV1haWxraGjv4dfP0dDMyMrJxMbHx8nLz9LP0tba6v5meejXzs/W2NjY2dbU4vNnYlpPTUlFQT8+PT0/QEVDQEJEQkNGSU5OTVBZWl5qb37y6Nzd18zIwb++vsDCwMDCxMjLy8zPzczO1NPS19rVzs3P2N3qeWNmZl9dU1FOSUlKS0xHSUlEQ0RJS0lISUtHREdLTElGSUlHTVlobWb06O7n0sfFxcPAwMPEwcDEycnJy8zMzczR2dnh8P7t4urp7f3+Z23o9GZbXV5ecu7p4nBeZGFaVl9dU05LTU9MT1xUSk5bVFb249vW4NzZ2drY09XW2NbQ0tTPztTZ2trg1s3Pzs/Z3drh7OjpdGhkaWtiaGdfVFJRUVZaX15fXFNVUlBWYHJya/jr4djTzdDV1NLR0s3Ky9DY4N/6ZGxzZVpce25fbvfoeGlva29t39Xc7Hh7/WVjb29qW2B2YF/++XVdVlhTUFpwcWZeXG1wXmnw5d/e2M/OycK+vsHDw8bGw8LFy9HW1+Dw497leHvn8XP57PJeUU9LR0dKS0pIREZHQkJHR0hITVpZXXrl4fV17vF27dzZ2OT96eXt5N3d29jMyszJx8jJyszN0tDNysvOzs3MztfZ3PH9e+rxZnB5dWldW1RLS05QTUxOT05JSEpKR0dKT0tMU1pdWVdYVk9afdjT1tDO0NPMyMbJxsHCxsS+vsPHxcLIzszLyc3P0Nnn6d7d5/Hu9mtbXV5fU05NTEZDREdIRERFR0NERUZDQkRISklOVVRWWmh5avzd0dHOx8bMzMrJxsfIxsbJzMvJztLQzsvNzs7P19nU3u/o7HdmX19aW1lcZWFdXmN1bVxdXVhSUlBHRUpISUtLS0tMTFNdWF919+rx+eHc39rQzdja0tbW09LQz8/RzMvMy8zLyszP0Njj8P5dTlVVUlBPTk1NTE1aXVVWUVBRU1RXVVFVZFlUZm12/uvj2tro3NDZ393e3uPh6OXtaW74ZXPp8+3r7ubf6e7e4PZya21yampgXFtYV1hZZ/Z7e+/q6uB6Z3BqW1pdWFxeWllYU1VbV1Ja9e/n2dXNzM3PzMzNy8zOzs3T2eTj4tvk49ba6+nn5fxvZ11aTktMTEdHRkRGQ0FFSElKTlBVWltfV1VUWl1STlFNTllXWWZw+93T08vDw8PCv7/CwsTFx83Oz9nb1tfc5uve3uHr4Ob2631mU0tJSEdGQUNCP0JFSUxPTU9TWFxtbWBeZnFkV15ZUExKT1FXWWb33tzYzs7Py8bHyMXCwMXHxsfJz9PS1dDOz8/Q1tLT2N3c2X1jY1lRS0lHQ0FAQEFBRERERUdGR0dCP0RHQUZITU1MUV1qY2Jr7tza08nIy8rGxsvMxMTIyMfHzc/Nz9XW19bb39rc2eDo+WtlXF9hXmBdWFtbX/Tp8ex+Z15kbmxwYVpUTkhDQ0VFRUVISEdNU1ZaXmFtfN/Vz83PzM7QzczJx8nKz87Oz8rIys7Pz9Ta19nf7H1uX19ZU1ZXVVZXXV1ea1xTTlBUTUxNTkxNS0ZHR0dMVVRYa/bf2dHOztHTzs7X3NjX3uDi4+7t9erc3+jo+Wlue+jvbl9kY1lYX3hsbmhgYnnz39PP09bY1dHU0t9pZ3poWl9paG5uX1FbYW3i1dXX0tLY2s7R2d7e2uPr7vLl5v5qXltefPt1cGZjZWdy+V1ZU1FfXFFaXFlbWF5jWlxpX2VeXmVhZGRaUk5OWF9ka3nv5+DSzMfDwsLEw8PAwMPExMnP1NbT2uTv7nt5fP5yZ1xbV05MS1FNSEpMSENCRUhLT1pkcvt68ut6+u11b2d67WhkdW1jXmltc+zn183NzMrIxcbCwMTFxMHDyMnIzNTe3N3e3drS0dba29zf8O9nWVdOUlBKTExHQUFEQ0ZCR0xOSEJGRURGTUtKTU5XXVdaYHV+4NfXz83Ix8PCvr+/v76+wsbKycjLzM7T6Hjj4+Xm4OPve3N1aV5fZV1WU1ZecGVlbGRfbHBvdnbvdF5aWVpXT1JPTEhHS1BYW2/s5+rZ1dHRzs3OysbExMbJydPT19fZ4Nve2dbb3drf6Ojd3enj4N/f9HN4bGtpdGZiXV9oY1ZWZVxTT05OT05VVVJPT1FPUV5ocvnn2NTT2M/Mzs7NztDSzcrKy8zN2PdgZm1+b3ttXltOUlNbXlpaW1VZXf3j4OX2cW536dzh1tXOzdLU09bZ3+x3b3Fr/Ozn7u3x5+Pe3dnY3tPV2NHZ3+V9Z15lc/x7Z19cYGVtcmlcV01NTEtOVFtXT0tMTFRcY2t1XFNPWWFoZW38a3Nv/ubc3Orv+/rt5uHb0szP09LPy8rGwMLExc3S29PY5Oz77vdfVE5NS0hKR0dCPT08Ojw+QURHT1BPT01WXmhrZ/f2fOfr29LU2N7p6fPi39TO2uPs4N3a1M7LyMvJycjAwMHEy9Db3djUysvP1uptWVleYVlPS0lBPT4+Pjw8PT4/QEFGRUFAPTw8P0FER0pUWE9QWmVra+ja1dLPyMfMzMnFwsC8uru8vr2+w8XDydDTz9XOzdLQ3nFfYWVgZmFPTEdCQUBAREVEP0FESU1LTEtLSEZLTU9caHdiWFZYXWbm1tXd2dHWzcvMys3Ky8rNzMXBxcjMzM7WzsvO19nOztLS09Xc4/lqV01PU09KSkhHQ0NIRkRDRkhISUlOTEVLTEtJTm3zZ15ldnJ229fmbXF27d/UycfKy8fGyczIxcPN2NHT3dzc3f1jZ3Dv/e/Y2vdkYlpLSExOTUdJUk5SU1ZXTk5Ybmlf5djhd3F96/Ld09TX39PNz9POztru9Ovf2NbMyczW29rxam7o4W5ic2xcYGVqXFx5du7s4NLV73BnW05HRUdGQkNHRUJCREI+QERJSkte+Pb859rV1c7Ix8fIxcHAwsHBxcvQ1tfa18/O2unybFdNTlBNSk1PTU1VWlZTVlpdX2Xs2+ZlX1lMRkJAQ0JCR1RXWGxzY2P64tjX18nAyczEwcXEv76+v8C+vL29vL/J0Nvf6X579/JwYWFXT0xLUVJNS1ZrWVxjWlNSXWlaTlBaU0tLS0I8ODg5ODk7PkJMT1lcXGXm1drXysTGyMLCxMG/ubm5ubm3ubm3usDGztryXV5oXE9QUE5NSk9WVlVSUU9PVmVYUVRd8WBWU1lZWFdQTklGRkVGSUZJSlN5eWhnd93T0svIx8S+v76/wL68urm4uLm6u7zAy9fg/FhQT01NSk1WVE9RWmNhe+HrbWrn519OSUpIRkVEQ0JAQ0VCQUZISElOV1VUXufb3+ff3t3XzMrFwcO/v8DAwMPEv72/xczNyMze/GZUT05PTlFQTlBTTU5TUFVgdW5bUFleXFNQTEpOXWp45+zt6Obp3uf38t/X2t/h18/P0c7T1tbLx8XCwsXFzM3K0drOys/T2drW1vZlWlBOTkxLTlZaV1pQTk1MSU5MSlBKRUdKQT5ER0dQWGFz6t7U0NPMzM/P0tXY4tnOy8nKy8nJxsjCv8XCw8jP1tzj2uD9bmVgZ2v7c1pWT0ZDQEJHS05NUk5MTlJOTlNUU09SWmNWVnn3Z3zt2s/Iwb6+wcLDxcrM09LOzMbBw8bDw8fHycnO19rd43pqbHhpYV9bYGBvdWZaT01JQT4/QD9CRkdEQkVAQ0lIQj4+QERMV1926N7YzsrFw8TFw8fLy8zLzsvJyMfGw7++w8C+xcvi6+7+fvrqe+31dX56+mtYTkpLSUJFSEVFRkpNSklPUUpVY21VSEtKSUlUY+ja1s7LzczQ0c7S0tDNzMvGxsLBwMDAv8bBvL3Gz9DvaFteavLp6+Pg3eZvZmdXTEVCQEFCPz4/Pj0/Pz0/SU9IQEBBP0BESExNXe7f1dHQ09je3OHl3M/LysnEw8C/wMS/urvDz87X5mlfXltcX27u6eZzc/tvWFFNTExHSE1NTldYTkpVavFRREtDQT1CTVFPWnfi2trb0M/R1NDQ09XPzM/MxcC/wcO8vL3H5eloV1BSV11XVVljaXJzaPx8YVZXXVhQT0tGQ0hJSkFBTUpHPzs7Ozs7QUpKTl584NHO0NPW1Nva39jS29fOzMnFxsXHw8HDwMvd43RaUFVYVVlXX2peYGvzcFpQT0xIR0hNT09bXFJJSlpaWE9IQj9AQ0dMUV1sft7Uy8nHw8LK1dPMy8rIxMbGxsLExb7AwsnZ3fBpbWBmXlRNT1lnaGVnW01IS0pJR0NDQ0FDQ0dISEtKRD89PT08PkBAP0ROVm7319HRycfJzMnGwcPKx8TEwsLAx8XJyMPRz9La4Xj1911bXGJ1ZVxcZ2BbVVdOSEhLTU1MTlRXTVBVUE5LTUxIQkVMTE5QV1lba9rTysLAvr/Avr++vLu8vb/CwcPCw8HGys7Q2Ovc2d/h/Hfyd3h9/3VeUktKR0hLSEZAPj4+PkFDQkZDRkZFRURISkpJS1VXZ+ve3tbJycjGxMW/vb/AxMnIw8jJyM7OzMjDwsTHx8nQ19TX2NTY3d3ncG9rXlhOTEtMS01QTE1NUE5OTEpMUE1IS0lHTE9TXF/83s/Jwb2/wL+/vr2+vb28wcPEycnGxMjLzdDU1dTMyc/Y2NrZ29jT1uBmW1hOTlNQTUdFQ0FGR0xRT01KSERDQUNGPz1BR0pVcPDn2tLMxsC/vbu9v8DAxMbIyM3X1MvM0M7MzNXc5O3e2NTOzdXd2dnf3Ot2ZVBNT0xPWF5eVE5ITVNbYV9cVE5NTEdITlFWVmjl2MjBvby+wcG/vr6+vsLFyc7e3NHX19/17+La09LY3eP5efjo6ev2aWFbUk5RTktGQD0+QkRHRERGRUZITFBYWE9SVFZbZf3e29rc1svHwL68vL7Cx8zQ1dXZ5ezo5d7Vz83R0NvZ09XQ0tXa6mldW15ZVVNOU1NPT05RUExHP0BER0xNUVBNTlBRV1leY23s2c7IxMDBw8bJx8C9vb6/w83W5e3g6Ozo9N7UzsnJyMzacFxba/z58mxVS0hGRkdDQkVEQkNKR0VDPzw5ODpBRkpUWk5JSlFXX2X72dTLxb++vr7G0+H05dXPztTa3ufw6dzW0s3My8fGyM3U43JSSUxTW1xvdmVUTExLSkhISUZETE9PTEdFQDs6PD5ETU9ZW1pf79LKyMTDvry4t7m8v8jYcGR79d3X1NDO1NPPyszP0trf39HQ3XBdTkE8PD9DSEtOT01CQEE/Pjw8Pj4+Q0ZEQj88ODc7QEdNVWzc0tjOx8fHyMjHysvJztfkdVtSVGvpz8rEvby9wMLJz9zuc2xjbu5kWVNOSEFDTFRkX11vYVlUTkxHRUNERUtZXE5LSkVERU1a/trXy8PDwcDCxMrO1dTOzMjJ0Nff5/196djLx8fExczM2e1jT0hCPj9CSUtGR0RDPj1DSk1NVFpUTEtLRkBCQ0JIUWH9aV5eWVpUYO/e087Jx8nLztPd6Orz7eXPyMfLztHLzNjQycXDxMjN23xnVktEQEFAQkxXU09OT1ZRUF1lW1dbW1pUVVtTTUxRXWvezcnIy8/O0djXzczQzMvKyMzMzNDPzcrLzcPAwcTLzMvS3uLU293e+3NpV05GPjw6PDs9Q0VIQkNGR0hISk5JTE9PVlVYW1hYWm3o3czHw8PHys/b7nV5aWDz49jQzMnJzcvHwsHBvr6+wcXK093rfPR99+3s7/jxcFdPTUlJRkZKT1NPTUhFR0pMT1hZXW/37N/i+fTh18/Iwb29wcbIzdHP09bY2NjNzM3IxcTGxMPDwcHCw8zW2vNfWE5JRkhHSU1OUlhVT0tHRERFQ0VGQURIR0lNUVdfce3Z19LQ0NHT09TX29fT0tbg1Nbd1c/Oy8nKx8fFw8HBxMfHycvMzM3P3efo/2dcY19ZUFddZ21dWlxaVFJPVFJVTk5MTVVXWGB+49TSycjJyMvLzNDQ1d7e3dDO1NrZ09fVzcjDwsK/wMPCxcbN0dji5e3s72hYT05LSUpKSUpLUFlNSkpKSUhIR0lLTFJXVlRWYnTx4eLa1dnPzdXY2+PydPdzbfPc1dPW2NPQzMfFxcPDw8HEyczS23plbWxjbnT27XJkXlhXW1NTXmhmZltVVFJOTldYVVpdZvft4N3e3NrX2d3c19PQ0tXT2Nzo9ezh39zV2NfQzc7Q0s/T3drZ2+n7+W9ZTktJR0NFS0tMTk9MQ0BARERGSUpLSk1QTU1KSUtMT1/t5erj2uduamVr/Prc2Nvd2dbd4efl5eXczcvOz87Q4nluevZ2fefl/Xh9c2VXUVBNTVZgX1ZSVVNLSEpPUk9OVE5NU1ZSTUxUWVpj3Nbf3dzZ3ffs3t/e393h6d3d2NjZ1NLT2tPR1tji5e51XV5eXVxSVFJRUVFOTk5OSUZDRUlFRkhGQ0JESkdMTU9PS0tLTlBUW11YV1dmcnL0+XZrZWd5/+La0dHW0MvJyczKztzk9/H89enl5enq+/bc2d75a277cFNNV2ReVUxPWV9dVk1LTE1KSUxYdWZbXejV3urf3trW3+Hr5t/n+WNjeHHr3s/Iyc7SzMvO0Nfu4eDZ5e7g6/RpY2BbVlxeYW1aUU1MSEZLSklLSkxKSUxMS01LTEtPZ335cWhpcmpYWmluZl5pbnR++OPk29fZ2dHJxsjKysvL1NbQzs3NzM7T1NTS2evs/Gpgb/Dr7PRuZGxdX1taYV1YVl1laHVlY3xwfuLa1djY4e7h4fRyb/bv8G9139vVzs7Pz83MycXGysrS19Td3+zw4ntzaWJgWFtdW1tXV1xia1pdX1VUTk1RTUtPUVFRVFxcWl5fYF5rdvHneuvxa21yc/d0b+zp4+Td19fOzMzKzMvIyMfFwsTIyszOztHW1Nzs7u/p6OLc2+Pg19fc4O1xbF5ZWWJ4aGpuYWVz9uXf2drd3eHi4vx7dGpmWVddaOfd2NLX1dbU1NPT19TZ1c7X1tDV3fT77P1vbm5maXtxbvzxal1cXFpXW1JRTkpLSUdIR0pOT09QWVtu8vD1bmdhV11fXFxeaG9s9NnVzcjExMO9vby6u7u7vLy9vb/DxcjR3Ox5eu3k397e2Nnb2Nzr8HFra1xaVVVXT0pHRkZER0pMT05XW1RVVFFOUVVaZfTe3dnX1dLQzsrJy8/OzcrIxsPJzs/Q1NjV1dLP09LT3uj2bWRbU05KT1FQUU5KR0VDQUBFSE1LTVBPU1hcVVBNTlVcVlxeWVtp9vft3NDKxMK/vr68ubm6vLy8vb2/wcfP3N7p9vzw9ujo7t3b3+PfempdXFZPTUhGQz47Ozw7Oz4/RENFS0lITEtLTExXZ3vj19fX29fP0NTZ1dTU0c7NzszKz9HX2NTQzs3Kzc3O09Xd4+RuX1hQTk5NTUpDPz4+Pj5ARUxOUFJRU1JPVFJPT1FRT05OUFRSUFVeZG7gzsjJx8O+v8G+wcXGyczR4ubua1RWW1JOVmBoYGFrdW5pcGteWVpXT0pISkI8Ojs9PD5HTVZSUE9PU1leY21wefDk3dnZ3+zw6t7a1tXU09zp7ens6vL5+Ona1NjZz9Phb/ro6HZsfun9a2BVVFVUTkhIS05OS05ZW2lubnn04+Du/W5pal5YV1VRUVZWT1NZXmX32NPX0M7OzM7R4On5WlFNTEdCRERIS0tQWFpdeN7Z1dDN0Nfh92RVTUlEQkBHS0ZFSlFZXmZnbXHdzcfFyszP19jY3fL17ntr8t7k8uHofu7q5tnR0M7SztHS1d7e6Obo5tvb5ePg/HNsbm9gYmFVT1NPVFNZaGNrfeLZ3vDs7X1yamhgV1pYWUxLTkpPU11pZXng2NjU0dXb3OPn7HBeXllST1JTV1pYV1dg6NjQyszPzs7R0trsfGZlW1BOUFFWXVxbW1de4dPU0c3IxsjHyM3V29zg7ejs++7r5ufo49/W0MvFwL+/v8DEycjL0dbX3+fvbXBgXWBjZmtlXWVraGljYFtXX15iaGppXVpSU1hTS0tOT1BRT09UUVRYWFls/+3X0c7Kzc/N09zd1Nvu+G9dU1JNTVFXZ+bX1czEwsG/wMLIztHa3/RuXVFNTlNTVllcZF9429bNysjGw8PHxMbHys7R2N/g5vr68PD/6OHa08zMysrJycbEx87W3+r9a3JgV1BJSk9RUExMTElLTkpLTEpJSk1OUFdZWGBcWmBdX15edWn4/Gnv7evp9Xl8693SzM7R0NfT0tTQ1drg6PpxX1hPS0xMTlBYYGbv4tLLzs7MzczNzdbydV9YUVFUV1hg8Ojf2tbLx8fCvr/DxMXFw8fL1ux9amZcaWxnbWBy5ePl29PT0NDT2ezycFtWTkhCPz49PDw+QkVHSk1LSEpOWWBjem5eXW10aXN0fm9eXmx0+eDq6N7h19TYz83Ozc3Ly8fKzczQ1NLW3+j0cF5ZU01LT01IR01TXPzi3drRz8/IxsXDyczT3Ol0XmBcWVdVWF5nbnvn2dLLx8LBwL/BwMTL0t5wXE1IS0lIRURERUNDSk5henPs7PDxbmdeT0tIRERDRENGSEdISUlLT1FXWmVuavPh7fX35t3d3N7v+3Bl/dvX2dre4+jh4t7SzNHR09HX4uPg29fZ3uDu+3Bq+PRrYF1dZm5wZGh8+N7Z19XZ2M/Q0s/Z6X57YFlrdV1lfW7y6uvq6Ofv7ePZ3N3p8fteV1JJRkdDQUJCPz48PEBHSU5l597Wz9fa2eP/dXhtVUlKR0pNSUtLSktOX3Di4+vY29TO39rX4uTq5OR0b15eXV1geXT97+DY1NXa1tTPyMrMyc/U1tjT197o7OLn+W1pWlJOTU1RTk1VX+7Z2NbZy8fQzMjQ3OxmXVZNSUdDQkBCR0pJTE1QZnZeZvXz4t3m92tbVlZTTE1MR0VGRUpNTU9SVHDZ08/Ozs3N0Nbc7XpscWteVVNNSE5WVVljcm5r9+Dl7Obh2tXY3N7l8O7e5u/x9Pzj0c3JysrJy8bBwMDAx83MzdfrdmdfXV1pamX8+/zp7XNnXlpYX2V0b15XVl79YVZOS0tKSklHREA+P0RHRkpSY+rb0c3Lyc3QycrW2+5qaFpST0tMTEpPX2Z38OXXzcrHw8LDx8bDx87c9mRWTElISUdIS1ZeZXJ26NfOzMfDwcTJx8bKztjZ09Tb4Nvj7uz3+d3X1tvXz9HSy8C7ur7EwsHFzthvXWVdTkQ+PT5AQ0NAPT9HT1dUVVlfZnhqW1pbX1xXUk9SVVNVTk1RV1xbZ/jZ0c7LzMvIyMfHyc/Z4+P5YlpSUldTV2Nyd23y3tbR1dPNysjKztPi6ftraWNqal1ucHLw39bVz8zHwr/CwcHIzNPb531wX1VZX2JkavDi19DNycbGyMbIyszR2N72aU9KS0lAPj07PDw6OTw/QUVJR1BfaHzj19vf4ujubv5kW19QS05OT1FUX2Vp8dvXzMrJxMLDxsLEys3U1+DtdVVTV09OTEtQXWJffOPR0M3FxMPBwMLFyMjL1NjmcGxhXmxjX2R0bGjz5NPRzszMz8vIyMnO1Nzsd2lcV1RPTElKTExMT1NbYWBu9mtecXxzXVVXTU5PSkZESktJTVFVV1dbXWNdYHH9dvPT0+Tg3+bz4+F+fnZuYVxo9+Xn6N3WzM/LyczMzc3U3eHo6u99cGtr/vp97urp3N/ZzM3NycjMzsvNzs7Q1tvg7nZqX1taW15p2tTT1NHS1c3Hy9DT5mxhXFJKREI+PDw6Oj4/P0JDQEFETFVf4NfY0s/P0NHV2+H0Z2BSTktJSUhIT1RXXF9w9OjY2+Dd4OTq8NzU3eTk9XtlZm1ZV1RQV2tfZe7g2s7JyMC8vcDAwcfKzdHxe25cXGRtXlhZX1pl8+zl1tXTzs3LycfGx8rO3fV4al9WT0dFREVNUVBSVE5OTlBWVVFMRENCQEBDRENGS0tPWVtYWFhRT1deXWJ99O/f1tXb0M7U2Oft9+32X1tYVFVne/fr6e3r597re21bWFxkbuvi4dvX1djUz8/OztLT0dPSz8nKysnJzMzL0NrpYFNSVlhZXF5fa/Xu8uzc4dvW1dbd7X70Z15bXlxOS0dEQ0NDPz5AQEJFSExXcPLh3dva18/Z5/xfV05LS0dJSEdKTldmenp8a3H87trV2N3b2dnTz8/Oztrd3ODrbmBdVlBLS1dzdeLZ29LNysnIxMbLzc7O1M/O09jl/nf9fGxhXVtbcePk08vLycfHycXFx87a325YT0tLS0tIRkRERUtOUlRVS0dKTFFPTVBWWVx+bF5xdWlpd/xaTUxVaOTnbWBdctzQzdvub3Tv+HxbT1VmcHBfUU1bfPh9cXVu9ezr5fh+6ODTy8nEw8TExcjIyszP2t/c29PO0dje3+r8enD36/Dh6eDi5d7d39za59/W2tfX19/i2uXi19/m6Ot3Z1pNSUVBPz49Ozs9PkBBRktc4N3d2tva2ufb0u9xbl1paVtbW2huYF9ufHHw693V1NXZ2djf5tjQ2Nna7vL/YVdUWlxQT1RSVGJ16trb2dLPysjFv72/v7/Avb3BytHb43v97HZrfvPq393c693b3dnTy8fJzM/Y2ehna3BgXlhUV1BNTElFRkRARE1TVmFlVmNxZ/DleV5dV09QT01KSkxLTVz1+nnt5eLp3tre2NnWzs/b9ntjV1dXXGX16vv08Ojo7vzm3t/d3NjTzs7P0tjc4+PVztDQ1dbV1drd4Pdtbunj4tnT0dHMzMvIyc7QztHZ3N3Z1t/xd/z7ZmBoZVpPTEtOWFJJRkNBQkNFSEpMTE9aYXHs6evueXXp29zpd29mbHRdX2hpX1dXVFhfbvl3cXNw8Obp6eDlfPzt3NfY2ObzblpdW1xdWFpg7t7Z19jRzcrIw7/AwcPExsrR3vJ2XFhVUVRZWFxnX2Vvfezg1MvJycnJw8LJzM7Q19rc5XVcT0lISENCQkNERUVFRktIRkdMV1xgWFZbVFZbXlxaWVtjZW9uXmd1d3j74+jm4+DY3+x3bmRbY2NdVFVkZ25rXVpWWV9ea+zycWV93dPW0tDOztLRzcnHyczR0tfh63r++mpofOvj2dbX1NvY2+ri5n14Z2ZubmNnY11eZvPn7uzwdmRaYlxcWlJQTkxISEVISElMTlhbZGx2e+t5e+x+emhcWVhRTUxNU0xKT1Zbbe7x6fP93+Df1djf5vzt5up2+mtTVFRZYV9ZXVhfaH70+O3q2tfMys3Ny8jLzszMz9rl4/h6bPzq/O/t+Ph5dfD47trV29bMx8fIyszQ29ve929cVU1EQD49Ozs8PT4+RElLVF5hbHHm2tfY2dva2O31eXT+Y1xYW19eX2pteXnk19nk8/N3ZFhUV1dYV1tfYWRjbfL7eXp06dva1c/Y3OXz49/p4t3a0c7S0s7OzdbVz9zf4urt6eLm5Oz3+fTn5eDY09DPztPQzc3P08/S1+F+a2puZGlcV1hbWVhQSEpLSkxLSEpJR0dHSEtNTFNXXHje1NbV193Z1NPU1NPY19rf7/DveGRgcG915d3b2NnZ3Nzi6PjxZ1FXVFBYVVZYWVtg6dbU2NfPzszHxcG+vsHHzdXW1dv0bXNkZGJdXl1o+Pnx39fSzc3Ny83W0c/Y1tfd2NbZ5flwbltSUU9OSEZFREVGSExPUlRdZGzv6uPd2tjl+nN8eHdgVk5JRUpNUVxcZvzm593a19LTzcvKx8nP2uDsbWRiXFtaWlxoev3i2tHT1Nfb29vb6Xf7enDv7N7Z3+Pi2dza2NTQ293Z09PW3uDp+una3d3jfe/v6Obwenrv9ezw/PZ7dndpV0pGRkZGSEpOS0xKTVVVXlNRYF9u9/pwbm5t+t/Z6u707+He2N/743Zbd/N4XldYTk5PVVheX19v7eb19uPe3Nbe29jb49nS5314W1xu4+nw3dfPzcfBwsbP0c7S2OfwX1BIQkVMS0pQXu3e3NfQ0MzIx8PEyMjIz+P6aVtdWlZOSUU+PD1AQUNLTEtPVFpbXVdPVVJefu77bXB5fm7r3Ov4bmNsaH59bmdcWlZp7vHo4+rj2t3Y1N3m+mVgXlpXT0lGSUtLUltkb/Pr8ufd1dDMx8fGwcDCxMfR4+91Z11obGdgbWt249jU1Nvc2t7vcm1rWE9OTk5VYV5ea+7j2tXU3ebw721bWVJMR0ZIQz9AQERAP0ZMUVxy7dvZ1MzLzM7T5n15X1JXXlxaYmRgcXz48OTd3uLi29zr9GddbmVgcvB9euXh493d7eze7Xpr+PpkZnTr6uTf3NfQ1djS09LR0M/Oz9Lb3dna6Xr2+nBt9+ro2dPQ0MvIycjIzNXf7WteU0c/PDo4OTs9P0JJTFRv7N7a09Xb2tbV3Ofn+3V5YWFnXk9OT1RXXXH439XT19rU19zb4/xvaVtUXmBXVlZbX3Pm1dDP1+fe09nudPv1/H7t3NnX0czJyMjKycvW4erf5W9dVFlcVE5QXv55fO7z6dfWz8jDwcjNzM7P0dLW5Optav9rWlxWUFBSVlVPTkxJTEtEPz4/P0RKUlt349rRzsbDw8PFyc3R2ujzcF5bUUpISElMUFxva2/66uXa0NDR09rc4eP1ZV1UVFJTUE5ZVljy1c3KxsTDxcbFy87P1dri5nv95+jo6nxz9Ojl3ODm5nt7+Oje3+j9dHb2393c4uXd3drd6XR5dGBiYVpbVU5MT1NUU1NZW15iafns3d7c2exsXllWU1FOTk9RXW/x8vXk2M7JxsXLztPo93JcUktISEtOUVldYVpdeuTa2tbV2NTU0NLR1+Xn6/lybW/+5+zr6N3P09DMztDR1t7k4ul0Y19cYGpufH797dzRz87O09Xa4OhoXFBKR0ZFREdHREFBR01UV1p54OPg1dLPzM3O0NHV29zg3ef7921qbmRrX1ZXVlBPUU1NTFBTV2Fjafzx6dvSzsrIzdLd4uhrWlVUT0xMT1VXWmdz/t3QycfGw8TKyszW2uF7aW5RSkhHTFBTVldj9d7Z0sjIxcfJydTN193a7fxlWFBcWk1IRElNTk9MR0VFR0lLTElKTldaU1hcYHja0dXTzsnIzNTl29TP22pqbu96VVVnb1tSVFhdWVNYW2BgWlpcXVVUXmprbu/o6fHh187KzM/U297k2dLa3+X/d251al1gYVtgfOnm7ODf6uv+a3RqXmNraWlvbWtnbHJs8d3e3+Li6fJ4d2VbWFBNS0lKS01NTVBPT1hob/Hn6Ofu4NbZ3uDoeWljWFxdWFJNUlxsfe/r693c39rS0tbT19/Y2dzuemVYWVpdXVdeXFJWV1hfXl9ndvrl2M7MzsvMz8/Q093c3d3c8e3qcF1WWVpTVV1eXmtq89/Y0dLU1NvY2+Tj4XdZW1hUT0tKSUhKSUdIT1NWYm3z6/X16uXh2NTOz9DO0dna3OHvZmlkX2NfXVxcX1pRUFRST09YZ3z2/PLo4NXPz87OysvOzczS3N7g4eLe6PtzamdnbGp4/fh98t7j8P727u3d29/h4u3y73lmXlxdY2v9793a3uXp4+jm3NnY3Nvjdm5pbWZeWlVUUFFOUFFMSkhITlBUWWH36eLe1NDR0dLNzMrM09nj7Xz9+vl2ZV9jZGJfW1lVU1VaX27s7O54Z2Roevn9bXL6+/L8+uvu6+LZ0c7MzMzMz87Pz87O0djb3t/r+nVmX1pXWVRUW1hVVVhcbPno3N/c2tjb4en1cF9ea3Bze3FiWVJTVldbW1RSUFJUU1VYXl9kfOTf2NLU2eHm4t/f3+jq7u31bHl6c2Rea/r6e/puZFxedurg2tnY2tnX2+PzemdZWmBnZm5uZ15cYWNl/+vp5N7Z19bU09HU1M7KycrK0N7w/W5na2dfWlZcZ2x2dnBsZXns8u7q9mpeY2xudHl2dGtkXldPSkdGREVJS01SXV9j8NzTzMfGyMvMztDT2uP4bWBfaG5sbl5QUVVXV1tfX2NndHz27O3z8Ojl397i3+T3+evk5Obl497j5OPs6u15b2tpeO/m3tzr/fHs5+Dd4Op6bWVhZmNdXWRr79zX1dPZ3tvW2d3g3+b2+/t3bGdeVFJPTk5NT1BOSUdKS01UXWptbWl67eDd4OXo4trY1NDR2eHb19ja3eD2c2plXFpXT1FWWmRrc/z7fm169Pn57NrZ29vd5e3tfnZvbXp77uHg3vD45tzW083Nz9Xa2t/g9GVaUlFSVV1hY11eZm78eHr0+HlqamVqa2h469/e3tvc4PB3bGJcVVFOTUxLTVBWX2RqevXo3dLOztbe4erw7OPj5uz3/Xp2cmhcWFZTU1dbZG1t8N/e4t7g5Ovq5Oz79/X+ePPt7+7n5Ofo6enr7e3t7PD+e3dsaP3ueffn6unm5ef4bWpoZHn48ODl5d7Z3eDi+m5mYmVfaHNrZWpvamlubWtkYFtXU05PTk5QUlRTVl5pbnDt7Obd4N7f5N/i4t/Z2dnX2NXR0NHU3fFva3duYGBcW1tcZmRjbmlr/PDo4dzb3N/d3fRrZWBkY19hZWRmZmRoa290dfXn3dnW1dfZ3ePp9fn2+enp9O75+urr7+3r9u/4+/X37vLw/ffv/nBdVldSUU5NS0pNUFBPVV1ZXG19++7g3tzY2tvd2tvd2tjS09LT19jW2evzeWNjZF9dWV1jX1teYWRiX19ocPXp6ebk4OPs7u/0//3t7u3s5+Ph4d/f4OLs8fN8dmliaGZlZl1bZnT459nU0dDNzM7S2OdkVFBNTE5PT1BVXWNt+Pru4eDj397o+G5dWFVVWFteYnT87urs7OTe3t3d5uTt/nz/eP/3+vHrdmxgXF9fZGNtcXL97Or6dnZfX2Npbffj3Nra2tzg2Njb1tLP09vj6fjy+2lsbml5eO7k4tzW2eLn7nRqX1tYVllWVFlhYnH+dGxnZG13+Org29Xa2tfd39/n7/B7a15cYl5cY2BdaXv88+nf3NzZ2elzYlhQTU1LS05SVFpw7erg3ePj3N/o5+nwff15eHB8+PHl3t7X0dPV1dDQ0tTZ5/hxYV5hY2Zob3N5a21xaGdsY2l6+X16+v5kX2xkYGpz9d/Vzs3Nzc/V09jf3uP0cl9WUVNZW15mam55fXx3b3j6bmlpYllUT01NTlBUWF1ibezp+vf5/e/p4dzW0NLX1tbe7/d4ZV9fYFxcXl5o++/n4N7d3+Ld4uDf5ujp8vx9d2xkX2dyb37p6+/ye2JbWlVWVFpcZ+rm5N3c3uDd2trV0NDPzs3MzM3R2ePo73tlYFtaWldeYWRkW1lUTktMTElKSktNUFVSUFdaYfzZ0M3Ly83Pz9Xh73JiY2lrbvfv5d/a19jY2eHt++70fPp8eHNwcWVdW1VVVFFUWVlYV1pZWlxcYGr+6eXc1NTa2tjc5+HZ1NLNzM3Jx8nKy87U3ej0eG1qZWRsa2x2bWFaVlhaV1pdWVxdXVxeWVVTTlBWW3d+fvV1b3RuZ2p39+nj3d3g2tvo7ef6eG9jY2Jw7eba1NLT2+D6ZVlPS0hJSUtTV1hYW1xcYG7x39TPz83N0dje6nv57+Xg39vd2tPT0NDS3OXtdnB0bmNecPXv5+x6aWNjXmBz7+ri29bY3ulsWlBNUlhiamV0dnBqa3h3+vn49PnsfmlvcGpvbGJeW1lYWWBt+ufe4OXn7PT0c2llXl1cX2htYlhTS0xNTVNbaPfl3dTX3+Dd2dvb2t3d3uLe187Ozc7R1tvZ29va3N7h5PJmXllUUlRZV1tkbHzx6/B4ZF9dYm559erj5/Ht9/vt6+Hh3tvh39rU09DN0NfobF5SS0dITlNVW2BeXF1iYmJmYmBdXFxXU1FLRkNFSk5VW2rr3tnUzs3NzM3NzdDR2NzX0M7JxsnM1d7teWtlZG70//v1cGhfVVVZWVdUV2BlYm59bm1qZ3fw49rX09Pb3tva3Nzg4+PtcXD56+Pg19TY3/FvX1ZRUFRbXl5oaWdvcHBrZWJeXGBmZWpiWldUT0xOTk9QVF1eYnf57NnV1NHR0dDPzcrJycnO0dn6Zl9aWl9q+/Lu6u3t4uDo6uxxYl9eZmRfXltfX15haGps7+Xq5d3a3eHb4PF+dGdnb/bf2tfU1dTX3eLrevXg5Ovr7/12aXZ9bmJZVFNPT1NUUlJRVFdUUlBNTU9PV2l98+vi2Nja3NrZ1tLMxsXIys3S2e9sYVpZW1xhZGJkZ2Zt9+jm9Hl8b29uZmJhXlxfXl9eXmFu+Oba1M3O0c/O1Nno9u949enq5ur2/v9oY2hmbXf36uTm3uLv5+xqXVdUU1FTWFhXXFxeX1xeZWBdZHH87ejh5uff4+rq6+je1M/Pz87P0NPd7PlvWlJYXFpdX2NgX2hsZF5dXV9ramhrZmddWl1eX2Beafvl29PQ0s/S09DY29zd39/o5uDo6Oj0+2xjY1tbYWpx7Ont4+Hj/WJgXFlXWlhWWl1fX19jXV1oZm3u2tXV19XX3NztcHr48evg3d3d29fb3+Pv+G5mbHB6cm5jXmVramNeW1tfZmJeZGFcWl5ta2ReXFxgcPbo4ebm5Nvb5u7o3+fy5N3Z19zl5+t8ZV9hX15q+uff4d/d4f9yfn38bWVhWVhTUlRVVVJXWllfduzx6Nrb19PZ3uLe29fW0tPUz87R1NTX3+v1ffTz7HhoZ1xaU09NS01PVlRSVFNXWFpld/d8dHX15d/c3tzf3trj8fn69e7s7ezm4dvg5ePs+GxkYF5fYmtnaHrz/WFbW15lbWNbYF9cYGdlX1lXWVdcaHvp4OPd0s3P2dvW19bRzs/P0dPQ09nc4erzdv/u6Oz+bHH9bl9bWFZTVVpWUVZTVFZbXWBtbWtu6d/e2Nfc2dvf8nBtdm99/2tt9e308+vq+f/8dW96c2xvamZ59vFnXmFmYWJgW15eWlxcX1lQUFJPU15ofe7x5trb3Obj1dTWzsvLy8vNz9TW3ert9nF47O5+cXX7eG1uaGVpY15jbGdnbnRpX2FiX11ibvzr5+Tb2t/m7fh5ffrw8v/58OTg5O3s6vV4bn77cm1qaG90b25hWFNPTU1MTVdaW15fYF5bWlpaaXr34t7f29vd3eLm3d3d3dzX0NLT09bX2t/h9H73+Hd4cXXu8PxuZ2ViWlxnbfjk5+rs+HVoYmdeZHnv5+Th4d3g5uXk2tzf3t/g5OHqfG17+H38cGRhZWNiY2x39/b9cmlgVk5RU1RZX1xUUlJNTE1LTFJfafzj3tzb3d3d1tPU1tfU09LS19vc2Nnb2+Dt8uru9e3l5u5zZFxXVFNRXG/45+rv+Pd2aGJeX2V65ero5efl6ujg3NfV1tjSz9DQ1dve2drh7nxeU09UUFJVV1dSU1FRVVZVV2b29Pd7bl9dWlVTUU9SW2V48u7i6Pno4NnW297e4d7d39/a3Nra4uHtfPDx9+bc2t3tbWJXVFdcYnLy7fJvcXRtcWNaXGl87d7Y2d/l5vL26uXj3tvb2tPR19zb1tTS09vrfXdta3b+a15aV1BNUVNRVVlmbGReW1dUVFFOTUpMUFNaYnN+cnb6+OnZ2dbQ0s7Ly8vOz9DY3uP4ZnJvYWh96fVqbGZYWVtYYP7w6u/r6//15/hsaGNlePbq4eDa3+nj5+zn7vPh2tbR1NXW3+Le5OTrd3Bxa2r99XheVldSVFdYXmJ1+/b693JiYl5cWVdVTk5PT1NeYVxeXGFqbPbn39XRz83MzM7T2tvf6+f7+fB0+vN8d2ZZXl9XWWj45+bl3t7g3ejw+mJdY2Rtev7u8H31+nv2fG976NvU0c7N0dPY3dzc4eTm7Ovp6vdnXVpTUVFSVFRZYF9jaWNfX1hUVVdUT05TWV1rffTo6u7o7ejh3tfP1NHO0tTY29zj6/f9cHVxY2NcXmNdXFhXV1ljee/56ODj3t3a3OH3YWRsfu3l4e337e76b3twcenc1NLNzdTY29jY19x8e310a2NfWFNSUlFPU1hcYGRnbG53bWBgX15dVk9QVltbXGdz/v1+++zm4dbU1NDOz9DW2dfZ2t7xdvnq9Gpham1nbmheYFxaYWJyfXvy7Pnr29rle2tsb/Xofm3+c21ybGpraG/4+tzR0dPW1dXX19TY6/Dt6+xraWleXFhRU1dRT1RWX2Jja2JfYF5ZVVNOT1NWVk1XZ2Jp/ubj3tnTz9LNzc7O0tXSz9Xf397g5+75ZGp5cHxwaGNeWFVZWmlvam9u89/i7/35/Pb36+x89uvt59/p7+by+end293g2tvf19jd3t/i6H1sa1pVWU9PWVRSVVVcXWZ6cGFsZ11lXlhXU1ZVTk9SUFRcZP7j5+Hb3NXT0NDV29rb3NTY3tjZ2Nvh4ux3eXxsfvJwbWxna2z38m1pcXf5493k5ePe83HzfG1maXVsdG5saWz26dzY19fY0tHU1NbX29vn9vF4aF1YWVdUUlVVVVhYXVdQUU9PTk9RUFFUV09QVVVaXnPu6dnY2tXPzc/OztLX2dfa3Nve4+Ph6ft0fGlfZ25yb25lX2RkYGNsamv15N3X1tLT19vl7vn9enz2fP3+c2xx6ufp49ve5d3l5N/j4fDr6n1ma25bWlhYX1pcXl9qY1hYW1VRVVVaXFhgW1pZUE9RV1lmcXzm697V09HR1Nfb4+Ll6uDe39ja2Nfg6+zyd3BobfpzcHNta2BcXF1idvXr3Nnb2dve5XZpbHZ3cG9ubmtu7+DY2dzX09XT19jX2dvZ09fd6np1aFxVVFhVU1ZcWldTT05OTU5PTlFQTU9ZU09RVFlfbe7u39rZ0czLy87R1dvi3d3j3d3Z1tTU2uvxfGhnbmR5/WlqYVteW1ZaZ3Lr4t3T2dfW3uLofHrv9vjre/bzbffm39vh5d7d3Nve39jc2tbd4exwbmVbWFpYV1lWWlxeW1RRV1dWWFlVWFpWVVJSVFBPUlddbHNu7tvW0M3N1t3f4eDc1tbTz8/P0dTV42tmc2lnbW1wZmJoYF1bWWN09+Pc3dbV3uDi7fL8bGlpd3tkaHrx6ePa3+Lk29nc1tbW1NPS19XY3vBrZmRtZVhWU1RWVFJOTkxNUFBQTVBRTU5NVlhSU1NYXnpxcebf0s7My8/Q09rb1tTU0NTW1NnX2/RpWlhaWVlZWllbWVxgXGl+797Y087Mzs/T2tne6e93dXxpaHVz7t/k4+Tx7+fl4ufn4unw7u7p7XNwbWJrfG1mZGZteGloYl1cW15cWFlYUE5PTlRXUk5NUVVVWF1u+efZ2NbV2ODe297b09LS1NXT1tnh+2plXl1dXWVoZWRgZ2997NvZ2tPQz9XW1t/s6fVkXl1SVFhaavDh3uPc297b1NbZ2NfS1tza4O/p73R8+Hr4a19fX2BZUVJUUVVWUVBNTE1KS09PUlpVUFNVWVxjfN/Szc7PztDY1tjZ1tLR09jZ3OPq8WxfYV5ZVFVZXF5dWVtiav7k3dbW0s/T0s/S1t/q+2laV1VWX2fu3N3a3eXd3N3b3OLe5e/s8PX4a218cHnx/XJtZ3Z9cnhlXmVfXFtcVVFPTE5QVFdPTktITFBSWWj03trX1NTV1tra2NbT09fY397Y5Pnu/Xn6aWVfX2NcWl9laPzn39nb1dTa2tze2dt3ZV9cWlNTWV9u+Ofi2dvZ1dfT0dPR097g5+3n7Xj+8+7o7vf9b2heXV5cWF1dVlVQUlFMTE1OT1JRTkxKTExNVl5u7OLb2NjU0tPRz9PPztDS19Pa4uDufH34bmNdYGxfYGlhYWpx8ujf3Nza19ja1Njg52xtdGZjYmx4+/rk3t/Z3N3W2NvZ4uz2Zv31am/4bvbqevF5e/FnaPL8bv9rZ21bXFZOUU9MUE5LTUxJS0pJTU1RW1lt7ezZ1tfOzM3N0NfU2dvZ3N7d4efh6+zucvP/bevs8Ofu+Ovj4eLk493m5uX8fGdeZmBeZmprdWxy6eHa1tHPzs7Q09rd5enycW54dv/++vL59XpsbmhfX2BcXFdWVlBNTU9OTktKTEtOTk1SVVZXVlhqb/vb1dXOzczM1NXX29bX39vc5eTt//VvenxlZfb0++nx49zm3t/f2N3a19ri5+jp7HNmeHd5altod3b46NzT1Nze5e38Z3P5eGRv6ezwe/Xp6uDt7t3k83v67vhvY11WT09MS0pJR0RJTEpLTE1PTk1OVl1le93SzczNz9DS2tvZ2NTX29XU297p7uTn8X3q5PDz4Njb29zo3uD4/334eWRo/PtsZmdiYF9eXGnq7N/PzM3P0djZ3Ozo5OLq9u3k5fR1dnh6fvT8eXZkY25ramVbUU9PS0tLSUdFSUtMUE9SUFJWWl5q7urf1tPQ0NHW3N7d3+De3Ojn5+rldnr1//F08O3o4N7X08/Q1tLc6+Dl6+js8+bf9Od9XWZhW1lidvLl5Nrb29rq8XBr9ern5N7g2OJw7Xh3/f56593v5+R+5uT0cV5TTE9NSUlIR0dJR0dKSkxJSU1YX2f87d7T0dHQ0N7e2dvZ3tja1dnt4efs3fN579/n5tno387R19bb8P93bGBbaGJueXPg/nT4W1td7mj52evVztXQ3uDpeXn53vTl197l9/hoYWpcZXvzePn+c+z1e3paXlRUS0tMQ0lKRkpISkxNTEpaV17+fOva0NXW0t3c2Nnh4ODh3efw/Gb1a2L78d7i3+Dq3NXPz83Q2dLZ3+t1b2zzbXnn7eB9XmxybGn28OvY29XX3t3i93B66ufp3Nnn7Ol7bWdpYWzn9ndw3uJw5O16dWdWT1RKRUZGSEdFRURGRERGSk9SWm7b1trV29ba4d/R0N7ZztHW2trvbfT2buTV3Oba2N3bztLbztLe3tB8W/lbU3BsY/DtW3n7UXHjZefT3NPO3NXW9N3aeOXX6+Te3N9ubvdcW/FfX+j8Y2jm7Gxs6W5Y811LT09CQFBKQUtMRUpKRVBcTmrdbdzO79/V9+jY3tTQ6tnP5N/m9/ljbep65M3i79fd39jLzt7WydfqzeBaevFUWORxWWhmUFdsaeTdb93O893OcPfVcnjW6NfO+t/Ua3Hrbm1hftTtedBtX9boZmrj6FtZX0xGTEVBRklGQkhLPkVPSlRlb/fn1eJ94OFn49je1s/L1dfN5H3Sdlfg3+Xc1dPt+c7cZ8zM/NfH4Wjf31hY7mRa6OJTVf1lUPjT+HbLz2jVzG5mz95b3sri3s3kX+HsV1zsXmHf72zz53Np+3lZdN9gWGpURE1RQUFWTz5LW0FAXlpEYthpaM3fV+3PXVrL0GzOwt7eyOVf3dtV/c3h7czR6c3K5trH1t3Ly9/a1mVh4/pSfNpWUHZbTXnwWH7M72zR4ltr3F1r0N35zMjn39L5X+X4WerWbmbY6F7o215i32NX4OdKWHFHQlpQP0xYPj1SRT1SbkhT0vJf1NdVcMxyX8fKfsvA+HfJ4VDd0Vv4w9ptx8j9y8Lw3sLW/svMY+vPYVTa6k7r0E5M1G9L381ce8LaUs/SSl/NZlPIz13MyFp3yHZM1uNO4NBQWdBfSdLsRHbYSVfVTkjfUT1cXTxMbz07Z0Y6YnY/XcpTVcjtStbNTvbC52vBz07Wx1BcyWBOyM5Uz7953L3VcL/HacjAZt7CYVfLdErV2kVc1k1SzWpOzM1Y3spTWNFfS9rVWNzHe2nI2l3Q2E72yl9Xy/pM1dlIZdVOUNRgSdvnRlNvQkVlSjxNSjlIWT9D7F9J4dtN881eW8vXZMjHYNXGbGPK+EzV1VffynHfwdB6ycpxzsT838LbZszaTtzSUVzXV0vc6Et7z19ky+xQ2uBNa9hfcMjQa9TJ/uvJ6V/R017jzF9k0G1OdHBLWOFbUdz0T2xtRUxtRkBVTD5JVUBBWFBKdPJRatlqadfcbc7McufM8V/X4lPn0Vpjy+Rdy8Z13MTi9sfO8s3E4uDJ5lzV1lZl21pQ5HRO9dlabdB6UuLoUWrVYGjI1mrPy27ozP1vzdRe3sxeXNRvS19qSVjjWVPf9VFo8UxOcko/UVA+SFY+P1NNRmPsTVvUblrQz2jWyXr60Oda6+xPZdBuWdDPXdfIcunF0XPLw+LbwtBuz81l8MtwU+HcUl3kW1Xc5k/szlRV0HxN385b9srmYM3NVO3LfPnG2FvSzFlo1VhL7XhLZNVXVtB2SG3kTEppTD1MXD89T0c8TmlETNxtTd/RY97C4GPMzlLw0FNO0+FX2c1m9MTRW9XF59/Cz23Jw37kxORizc5RadJaUNn4SG3OU1XSe1Xb2VBo0Xxf0M5j48Z8WdXfV9TG7e/J0V/mzlVP1HdGaddLTtVqRWbcTUX1VTtOdz08X0Y5TGZCSNh0S+DMWWLC1lrNyGdrznJH6c9RXMjkT8zHX+XB12jFxGnYvtpgxsli28D4UM/XTWnOWUbf2Uhby/xR19FNXsj1TtDJWGLH6kzezlH3xORdx8VddcZrTt7nRlXRVknc3Eta0lpEY1w+RWRDOUxROj9kTkFu3UxazuhXzslk58PnVNXcSVjQblPPy2bhwdv7xMR63MPY7cfK793F1fzL0Fx41VtQ6mVKat5XYM3bW93RU1rP/1TVzmjqy+lU5eBYadHmbMzNcODP/lXzYEhZ81RP4m1Mft9SUfFNQVJSPD5MPjpOWEZW41xR3t1Z6srjX9PLZPjRXUn77ktkz31dzMr0zsDY7MLJ5se+1t3G1OTExfziy/tV53RGU3tSVtTXYtvTWFrV9VPf0lxyythg2NtTZtH8Y8zNd9jK+XLR7Uth21VV23VOaOtQad5VR1pRPT5JPTtJSEFVdUxT5GFR6Nlt58vzYM/RU13aV03d5FP0yOjwxsnozcLZ2sHK5szI+/TH037Q2FZl31NEWVZGXdljZsrRWunQbGPU6Fnl02v1zPlZ3dpa+M/vds3TYeXOfl/Ze038405Q71xKa/ZNU3tOP0xKOD5QQ0BcXEpj2GFb0dlc6tBkas3sUu7dU1zbfVXl22rbxuDsxczfxb7OzL7Qd8/L5d3J5GPQ401l+EtGdXpOa9htcNPfWdrMYFnedVLZ209nz2tN2NRa4crjes3XW9vOXF/R4VT65kpQ3FhFbmZDS1xAO0tEOkhWPUb0Ukva3lrszP9b1d9c4+BTZc7tVuPSY/jH13jIyPnPvs/WvsTfy8hi7cXlVNLVX/XYWVD1XE1+4FhnzNpszcj55sj+U8/SWfPLflvL1FHnyWFqxd9P19hSbdVlVNn8TG1xSU7fT0NsYEFQXD8+Wkw6SGRDRut1VtXOauXLeFvV+FF09E1a119L5OFe7st+Z83XbMnB0867x3jHxm3oyu1eztFq3c9cWttfS3TwTHfO+3zLz17q1Fpf1PRX2Nhd7sz4WNXXZ+PSambV5VXt1V9z3WNZ7WFMZmZHSmBPQFBQPUZVPzxTUUFU32Ba1N9e2c1q8cvsV93cW+/fW2vN4GjOzl7uy+B3x8fqy8Hl78bQWfvTXmrS613a4FNv32RQ8f1f0tPu1cpxZs7lac/NbenG3GDQ0lhv0PxS5vFOXndUUO9wTGfwTlbvW0xvWklcZklGXk9DU05ATGdKS9juUfDVWmXO317Y1VVg3VtNbWZQe9tl/9bpYtjS89XH2NbByNrDxO7cyN91ztFs6Mv8YM/oUXHfWmDY+13t6Vh2z+Rjzcn+3MnicMvbW9rOZF7YbU1470xY5k5L3nJOZOpYV/5RS1dWQUhZR0BQTj9LZU1K5WBGdtVaaMnZasrFZfTJYE3a31XjzGR40utl09Vi383s5sbL6NHM7N/J31zX1Vv9zupx1e9O6M5bXtH1UufdX9rL5+HDyeHMzH17zt9b3NdRU+dRRmdZRE5kSk3tYUrs2U9h1mJMcl1GWWZJSWNNQ15zS1HqVEvu6lXmyeb2ys9q5eZOW9tbUtfaTnbOa2PL4k/axu7hwc3bxMnhysf/8crbZ9XOZG7XXVTbdUls7ktS5V9V1c1r2L7V/MjOXNvG93bO+1N86kxV90pFZl1HX+pMZdhdWdl3SFxrSUpkST5WVz1MZkdLdE5J2/xO4Mfd4sDL+M7WV/nNX17P+VHf11d2zmlT291Z38jr4MLV3MTNXtnKYfnJ41fY20/qzltV1PZN5tZZ98jg5r/F3c3Hc+/I3VzV305a5ktH/E49UFg/S/tNTN7uVeDRVF7WW03nakNUcENKe01Ld2FIYeFUZNVtdcbPYNHNTmfSU07Z/EZx0lJoznRS3d5X2sbu173K0b7A3MzF4NjF3W3O3Uxu01FS2lRF6exKX89jZ8jW5cPMaNPKY97FeWDK+Eve4UZT90JE7VJC7/hKe9dOVtdUR+deQV5qPkZkQD9vTz9w7Eduz1tfxtJtw8Nu1cReV870UN3jTnfdUV3bV03kd1Hd0WjZwd3jxM57y9DxyMp6zs5Y8MpfWcv0TdTWTevMZuzD2d7A0W7O2Vbf01311VVO+FZDW1Q/TVdAT99OTdJ3TtbnUNvWTm3UTE7oSkV9V0Fv80Rs3Udfzllow9twxuhR03lE8eVIbtFMYMxYVNJoUs3aXcbHc8nA6M7AeuTA+WXE3VnP50vZ2Erp10lm0U1XyGNWw9NtwsZi0MlP+MVk8MNoU89ZQ+tXPm5qP2zdR2XQTFTQUErYXEH8aD1V/D1H60RF3FFFznFFzdlMyr5ozLxeeMVTT8xoUM5uSc/tRdriQ/zQS+bBXPS+5HC/1VbF0kjMyFXSxFV7v25ev9lSzOhOzM1PzL9e0L5s38BUV8hjVsZtSdZoPWliO1leOlDoQk7NUEzMVkXNZEDa7D9p2z9Y1UZU1ExO0VJH0V9IzttOycVT18xJXtZJVcxNSM1cScjrSs7PTtjDYNC+9NO71+TA3FXH4U7H0UzSz0zZy03lyExby05MxnROwdJXxchU2MhN4sNWd8VcT89aRdxdQOtiP2PqR1zjTlf3Rkl2S0ptUERrXUNb501a3lVZ12pX1t5ozMvsycxZ2tJNdNdVYNpWWthZWdlaU9znWNzSa9rK6OvO7XHZ+mvZ3PPX3O/Pz93T0und2uXh3ubqz9Tbz9Lp3/VbaeZZaOdbZuFiUWVVSltXT1hUUV5xWlv4XVpjU1hfWlliW1JpYWPybWD09V9s71505v3p0tf23fZTaWBVZmxbYuz1e+5u7tje5drW4dzT2dnW4t7X29/d4N7f7vXx5+Hl6uLg6N7e+ezn6+Da297W0Ob05eft3+dy6OR3+ftfW2VqYmNaU1RVTUlKS05QTlJYVFVUTlFTUVVmaWBv6N/r69vf2dTY2tXQ3O3p9mZnemFfd3Jpc2xdYGlv+u/78Onq/Xh3aHHr3trU0tLT2NzT1c7W2t7d1t7U0tbV0s/R0Nbg3uZrb3lobWdgXGdzX1leVlReX2RfWlhXT01NS1JZWlxkfv1nXlxdXVtq9HFseuz97fxw69/l8uXe+GtgWV1jXV5kZWdudvvz/unj2drX397X53X1/G/33trYz83U09vs8enp5+fwe+vqdd7p6dvT09XR49zkeunq2tr54Hf67GDreV/9enhxbWFPUEpEQEFHSU1OT2xdVV9TT1FVYGzrbvDg39fp19HZzN/a2fPgZWh5Z254emxfamhvZ2Vt7uN8eellX2tZU1Zbae3c2NDQzcnb1dDTy9bP2NrP5NrQ3NnUz9HX3O7o9V9ibeRw+vJPbvZcVGVtXXD5XWhmV09KS0lGTU9SX11rYFtaZVlbffr67drccePg/fLc5u/h32RjYVRYVGFlXWljYWhu8mz15tPa497j7HdreV1jdWt83dba18/a39vW1tXS19nZ2unk8ujj3+ra0+Xq5X1u6Nvn3dbnb+jhcHfn5O/l7m1fW1NKRUNDREFISUxNTk5JTFBPUGrt9d7P1t7T0dfTztDQz9Te6X5lYWZmYGxlZ2JlY1tqbG7j8WX6aVlYYldQWWRb6tzi2dHSz8nMycHJx8XJzMvO19ni3dfa4uXpenBhaHZqffRzZ2hrVVhpY1375/1q+mBPWVVKTU1NT1RXXVVLUVRNT1lg/eDb2dbV0tXi39rd4eZ8dnJoXVhVVFthUmFka2v16/feztfw4Pht9W9nXVh83Px25OHf4+T+3tDTz8/OytLR1drrd+Hv7+Tz/e7n9Xje1+Xr3ujc9mHzdv7c7/be7GtdWk9ISENCRkVLSkhGRkhARUhEU2zu1c7MzMXGzc3Kzs3U6uTc4+tpVltaWFVZVk1WXVxtdPPk9ndcZGBfXUtNYF9sdvLf2djd0M3My8bJxcDJx8TO39TW9Oh4aW1t/Gtkbfh7ZGjuZVhnV1ZqcH3p3+bp+W1qZ01JUkxMV1RITlJGR0tNTlBfcujUyszRz8zW2s/YZXjubF9hZFBRUE5XVGD1YF783eTZztjp2933bVxZWlZoYGDs4uns5NnYzczJycvIzMzKztbX3uBkYnpob/Jq+eLl/e/m+/l8Z25sXvHg493R4PjfWkhJS0ZBTExHT0dGSEBIQUVUU3rwz8nLwsTDyMzR3N3b7Ozuc/xeXl1PU1hOV1tdXHre6drW7OD1V1lSUk9bVVfra+va29bbyM3Pvcy/vdC7zMq+Z71L5eNF2UfbSmxc9mXqYW1kT+JJ403VaeLP68v232ZRXExNTktTTFNSU01OSkhQTFRfeefczdLVxt/S2FrQWfTfTc9C41hN+kfkS+la5HbT38nU0MnqzlPZSF1XTGNMZlxj6mrq3tnN1MnMysrEycjGz83c52xie1pc+lTe8WfLVNh3YM5DylTq2n3Kacz62VJqR1pAUk5ETT/yO1VEQU1AVkhS7VXU0tXHycXKydDS293j6X5naWJeT1VOXk9Xa1fsbN3Sbt/NTd3wQdBDSNs71kpQwT/C/t+6YbbVwcLMuNLAyMTNzfzTXXRZU11J61LbW2xcaGhfaV/pZd3q6e3X1vj5ZF5hSFthPHRQQdg8UGk8zjxW3Ty/R9HKS7hav/7myE7WV+dYcO7mTORL+V5O0UvJY8jfzdXjy2XOT3FmSOU/U1JE3U1f6VnQ4evE78rD97vXz73cxMtsx+tQw0PY3Ee6R9vPRL5Hb8w9vE/pxz++RtrgP8Q8Y1Q61zRXUjnWNN9FS9490kne5XLL6sfRxs/MyfPLaNvjXt3w8W5VXV5LcFZZ5lfa+VrbalzVROJvPck7bGY6yEB9zkO6Yc28VLPtxLpXs12+vE2zSMnbPL050l1FwTrJTVLXP9BK8PZs1VzX7c9u1P353UrfQ11RQuM9XFBA2jz3Wz/IPc9sSrxJvejrv1HJVt57X9hn02TaWuBVV+tN1VXZ2lfKU83eTsdE3Vc/yTj3UD7KOctbYcZWvvbLzc7H4MXPwNbC0NjMWsxV5Oxgxk7P5k/IQNNpRMI/x29Jvj/BWl3JQM5HW04/VD1QQEpJUUlOX05rTdddd9N8v+LIx3fFavfJS87aUL9L3NlC10hVeUpc3VhY1VDt8U/eXkzfT0/bQuR4RcRR58ZTvdbmumO9wl2z8MK+Y7tj/M9jctxfZs5O8OdC+VFD2kZRykPT2Uq8UfC9QMfhSL078941xThQ5TLIOlrhN8RBatNDvFLKyVC8QcjlRbs+xOVLu0XP50nOTFfRTtrcSsJM7c4/w0Np1DvBQV/gPMY+7OhFvUDG0k+1Rr3Fc7Nfvb93vufexF7Kyk+9TuPPO8A/T9k5v0FeyDzAQXrKO7w+1NA8uzfbTDvTMN0+SuI7ykLd5E+9Tb/R7LdKumvgwkK6Ss3YT8I+0FhW2DzOR1rVQMQ/4P0/yT7LV1rMTcZN4vdY2UrQZtPaX79bxsl7t/fAwGi7fc/MZcr93XLebFnxPuhLQ+A64VBGxUbazkrEbGvDcN7GcvXURXFnOP1DPuo6VHc67mBOyVfkxVvZzEzL3E6/WW3ER8/pSMtNW8hO9NZPytpJxWBRxkVwy0bOz0LGWj/APU/KOMzcQLtIbrhEwMNYtNrhtWvQu1W/xEi7+k2+PW7MNMlNPL875845vVpGuz/Vyzy4WlC8Oc9hNsk2UmU4zz9ob0rITMfc3b1Yu+5ku0XC3Uy4RenLPMNIRMM63GlBvT/a2EHDQeX8Q8tG0G1bwkTNV1THPchiZ8FDxNZdwG7Nwv3Dy/DH39rP7dfy4lxo8UJsRktgOuRIVd1BxGpbv13Myl+/3P/IYPt3TVNMTUFUSz11P1tfQMpM39JTvFP7x0zO9VfKa2fR+2DZYFrfVWvZdH3T0GHQ2lbSYEzWakbYakjaWkvcTkrcUU3UXGDLYdjG7cnEzszFzM/FzNnC01u+503OTkh2QEThQ0nPSlXFT9jCSMTTRL9yS8dDUs06WWY76z9C1D5l3EXGfG+5bM+7VMzMTMFwU8NWds9F8N87810/0kdaxD/XyELEX1DGPuzQQM9kVMdH2tpKykxxzknLcurHWsHS1MR8vu3dwl3E8m3FTuvdReFGRXg6YlRH1knW2vXG/MLQ88FeyuxTxkpfez9+RD9nOVBRP9pG/NNMx/rex1nL8uPPVsp73txYyFhk0k3q+VXN/VzJ4mjO+2/aU2ToTVX7UmN0THpcTG9SYldVz21qydjaxtbMvuzNvv3JwWzFy1vU3VNheEpLYEZMe0ZPzmxXxtFby9dU0exM0fRH4GhCVlU9UlE9Z3ZH4spe0sJ81cZye8ReYcZfWMpeWM9VT9ZaR9thS9ppTs/pVM7kTubcSWrRS+3TT97PSmbPTE3LUFm/U/i9Yt+7Z/G7Vdu8Ss/FQdHcQtFXQthJQNZFS9I/4NJLv9TgvGrIxU7I71zLS+76RGpER0o+XEJP8UfWXlzDUNTTTsJsXsVY689W3s1f8cldesZX7cpT6M5ebchzTc1XR9xLTt5PaOhQ/FNG40hHz05uzGTP2e/H583Kb8DN6b7a0Ml+0e/+3VraVU7WRmZgRNtKbc1PyuNTxldazlJ5z1xh3UlL7j5Hd0FY6FZn0N1gy9NSzc9e3ddu++/faGrbWm7XWW9l9GZI115JyOxSzfBN7fVMYNFeXMXnWMrdSN7dQ+vITenCV2S+eVK+8U28702+6kvC3UnL6knLfErXZ0j1akjy6VbP3XjM4+DgZdL6ZcluVeBOTFBGS0dTWElofEv42FJl0XRmzeJVz9tQzcxO08Ba6b9rc79iTsV4SsTeQczoPNp4PN/hQtPNROHbRWt1SXPeV+7YXdPeXsps6cVfzcpwxdf2wuFsx+lizWFWz1RP5E1O4FlV2mZU3XZV3fdY1f7/01DpbkTpTEvrSmLkTH3QUnXPUefNUuTQT+zPXOXNYubLe+fObPHRVm79VNNWVtVJb/dH8GVL391dy9BYzN1N2PRQ1uZP5OFX3d9W495b1NZj0Oz1ylvRzVzM4GbVeGXYaFHiW1jYWP3VUOrWVnHaa2/O7mvQ/lH7bEdU70pM3VRJ7WVNbu9cYd71XOHcet3d1Nv6zdltz87r3815dNhdWflaR1xkQ1d0SWPWZXHQ8F7/6VxX3PhT7NxrV+zaU23QenPQz+7PxNvgy9Bf2clNZ8laU9r0TW3ySl3qSk/hUUrfa07b1F/rzvFt5G5dX2hlWGjeaE/a6kLe0Uhl0WJVzNRa1NNc2s1UactiV8/lW+LnUltpVlBVWE9PWf9nesf1Zb7XUNHOVV3NXU7N7Erc5kVvz0l1xVX8v9z5xd5XzdhH2cpI9MVNXsZPV8lLT8pQS8pWR81kVcplYMl3V9X7TOXuS+d3Rdr8P/bzP3ffR+POUNLAW/i+XVfCbU7F01PIy03SyEVfzEpJ21FA/l5E2ttHzstL0s1G+8tKaMtLcMlKXsxKU9hTaMft27rN473cYMVfS89bTspwS8/sQ+jgQmjdQFvZQlTHVE3F3E3Hy0/O20zP3UrT1Unf0Udv10Fe0kJlvldywW1p0Fdd2k5PzF5Qx3xOxvhFzOZD2epBe+VI7ttXzsxZysJK5MNKYsJNWMlZTNNjQXd2PmbMTt+/YNm+VnnETk3HZk3E9E3HYUrL9UbN30bO7UnN7UrL1kvPyknxzUpi0U5f2ElTz05J0U5A3FZKyttXwctQxdBMz9xKzs9SycxK2MxJ7dFKd9tCZdhBVddPVtdqWNNlTtBrTc3YTNnLT+7OSWrbRGfPVuzB2+a/0WjI7ErY6UfY0Edn2khd2UZp1kJkz0dTylFRxmhev2JawWBLxNZMzNVLz85H3M4+W8xBTsdVUsX1UMf8Rs59P97SSHvNSWjHTVrCVkzC9EbN4EXTz0rPyEzWxEpmwFRRxVhNxlxJyFs92vc+dNRIeMZV5r9bYMJfS8jcSs7SRNzQQ+HISfnDXVnG6k7N3krL1UjOy0N7x0xTyk9MzVxKzG1B1+c9981DbsRR7cFUbsJhT8bSS8zLR9XLSOrJRl7GTkvJWEPRdkXS3UTbzUN4xUldwVFUwWlcw29KzuZB38tI88Ra+sFzbMRvTsneRNnOQVnPRE3RSEzJVkjG40jLzkzQylDTxUzow0lZxFhVyPxUx+lLzeFA3Nc+Z81EXctMVstQTMd4RcrVQtnMROvHRnLESV/AT0nFb0nF3ErD2kTKzj7ayEJ4w0puwE1XwUdGxU0/ymZByt9CzdFCzsVG2L9MZsNMT8VNTMBjScLbR8fMSMvDR9LCQ+HCQVnFRkvIT0rGX0jF7UDN1j7kzj7tykF2xkFevlNVu+pUvt9Jw9pCyNI/08xB7c1CXMhIVsRNSsNXQMxsQ8fhRsfRSMnKR+bJS17JTFTEVU7DWkXF9kfJ00vNzkTf0j1fzT9Mxk5QwlJOvW5WvNpOxc5J1M5F3MpH6sVNa75eXMNlT8tfRdlcP+hxPHHiQG/NRu+/UWXAWFLDeFfF+E7I40fU1knZx1L5x1pbzlFLz19HzdtJ08xL5M1HZ8xFTc9KT8hZSMtqRsrfS8jLTsrXR8zyQcheRMVYWcJN8b9JyMJHv9RFwklLwT7nyjrEaEa6SHW9PcbZPbtFT7844OE6v0xMvT/KxEK89Em9SFu/ROLFRP3ZQuzPSd7NSn7QS1bbUFTSa1fM2V3VzlZxym1Q2+5LatVZVdd8S2TdUFfO1FVvzGdI7NNKRtDdRGfD/0nJvWJZvcJLW8J1P/S/ZEXTxFNHzcVTTsjLSUbO0ElG2OI/RdjiQErLzE1Vw8ZRUMnJVVLHw1pI5cthTd7F8kppzXFFVtLiSVDPzlpQ2M1mTe7Lc0hP2utKT9jQU0vw0GhO4cbaVmXQ2lFO7dZnU3LW5lh2zcz2aNLM8VFs3nZUW97dXlnw23ti587W/3ne2f1edOZnUVZrbFdZ5djvbOjZ4mBf8uv3b/3kdFlb8u1rXXDmaVVd8uZrY9/T6PTe1933+t/deGZnd3ZbWWh+allZZGtaaPr2fGdtdGpaW2pudGF26/Xs4NXQ19jT1uXs6PDw+f3u9e7+fu3n5ebj5Od7avj+bFtbYFpVU1xpZmp17PL34+Pr7Ojd3eLr6fJsbvN8bXL7dWpuen79fnxtZfvueHfz6Ot3e3d0a2toYmFfY2tia2x78OnsfX38cGVeYGJydW51/Pjx4d/d3+Pf5Orp5u798Phxfu/8c3vt4N7c2tne3d3f6nx1YFpaW11famlycHz0/Xt7cmlyfXf9bGpyaWpufPL6cHD8ffvp6PDz7+Tl6OLi5Ozn5fhwevFyYm1uZlxcYGBYXm1kWl1lYVtbW2RjY2lqbnr17ePc1NHQ0tbZ3uHg3e9t7ubvfu7q5N/f3N7g5ebr9v9tX1hXWFJZX2pjXWt+dnF17O3t4d7k7uvyeHZu/vP47O/yevjr7nJrbmpmc3B8+vn0+3Jw7vV4bW1vaml0cXFrcnRuZWVkXV9rXVxncGpjZnP3/vPl29zc2dbd7erucWZt//T06eju59zW3N/X1dXc2Nff+G5uYFpZZmZbXGNmaXF1aG1wfW1vdWxhYWBob3rs6Onu7+vo5nf77/vz7ejp4eHm6vTudHr9eXBsbHX+aF1nZmFWVFdST1NVWFZeaWVfZW1iae/t4dfOzc/P0tXa3u5ybXjl4OXh29fZ2t7c2+Po5+3w7v5oXVlVVl1fWltaXm5uZvvf4ern5uLy/n5ybnrv6Onp6/T97fxoanBybGpu+v52/f5tcXJzbm18enV8+ntvfnn0b2BdWVdXVlhcYF9pZ2BkaGZqceba3trS2uXq5fBsZHzx79/Z2NXRz8/T1c/W2djX2ubr7mxZV1xZVVNVWVhYYl9kd//+9Hp3bWRkaGp+9Onk6/Tp5PtxfO7r7d/b4+zh4O779PxqXmpoYGBsdGVeZXhnXWZaUU9OUVFPVWFhYGh2dWls7uro2M3N0NPU1d7u6vP66N/d39vT0Nnc1Nrm59/geml9+19bYF5bWV5aVlxjW1xq8erj3dna7Pv49/p88uTi/nry+m5oamhnffD5fPv6dGxve3xnbv9qXmJ8/HB49+328ev3bGhmVU5TWFdXZGVcW2hzZWd2+vHk29vf4+j6/H3u3tfW2NLSz8zMztbY1dPb3+Ln/2hobmpmbWFVVVlfWFhYW1pddvZ9//9kZ25+6ezy7fT57eHkaHh5bu7e39rn9ed1aXhw7v9nYlteXmJlXGRtem9ncGNbV1JTVVxbYGBiYl519PXz/ObY29rX0Nb2ceri69zR3t7Xz9ba19DY497W4vV6bWZXVl1xbV9iaWtaXWltY2d5/frs3et689zn7d/e6Hj15WtebHhiWmX59nt073hhYGB5eXru7Xl76l5m8X7lam/f5Ht1+GhZU1tjWlRZamZOWG1iZVxu5u/b399oV/l67NDM2NXQzdHVzsjS1s3M0NnV6Gx9XWxqV15hV1VTWldVVWxhU05ffWJccHtYcNnedPLZ0N5qfnpzcOPc+dfc4c1PXNLhVlzY3+DjVk9rZFpWXmXyalvwbVRTa2VcTmnpbWhXWHd77f5kb+ng6+za2//26dbS8uDQ293Mzc7S19Xi6dnab1z5fPpbXe9tXmx1919eam5pYW73eG9sfnhg/eh4a+bddflz/vxaZPd2YeB2Ymlw6XhZbud7benb72hufH1dZGl4dvx3dHZmbu5cV/lpY19WXmFYVGxrW+fm/nJ9+vh24Onb0M/MzM7JxcjKycrS1tXV3/Lk3vNme/NdVl5gWVdfal5aYF5zYlpbVFtYVVxe//Dw8ejt7/pt7/j56t/X6ebk7uZ3d2diamr7bmlqd2ZnX1xdVFVaU1VeYVxZWVtjZF9mW2Jkantzcmpy8G9weu39cejd2tHQ0c/Oy8fJzM3Pz9ra3e3t+Xf2bX3ucm9eavDn4Xlua/Ppbmhib2RNVF5fXF93blhbbnRdYW/v5+Db2/j88ub1amx99WhseuHz5+Ld4Wp+ZV5dYm1iZWBoXVhcWlNTVVxdV1heXWdqXVpbY15TYvnv/9nKy87LxMrKycfHx9HP2dr0/tj1+/H36F1Oa/Zrcu7zZ2T6bl9eWWFSS0xWVFVda2Bl2uRrb9vo2s/HzNDY4trf6fTk7F5cUVRj3n51+fXh6lBZdltVWndeVFlOVVZk/155Zll7bmVzY/xadGpSWVpb9s7O0MnHzM/kzsrR1una3fpzbXd4ZF7f9GBlWOB2Z+ff8eTr6GZZbWZfZG9iYFhUYl9SWVlsU1ZrbNnQ4NDw39rueVXwW1fX9c7qz+dc1tzT3trc4mja525qX/teW1hNT2BKW2NYb1hwXlNqV1xOTFRaeuDc1MrLz8rK09DOzdPV2c/T021fdWjrX1lQUWRYcGhleGf9Y2NqVk5gYVV+WWdqYl9fd3dpa3Bq49DLzNLHz9rW7vLb8Ond597g7Xb4fHLtavJ2YGRVZGBWXFpfW1heWltcZ3BoYPhhX3ltbWxfXV1gb+LY2NDSy8vP0M3OzNHS2M7L5fFseOzl8O1scP9t8vTr9enwe2pnaVZQUFBPUl1WVV9bZF1dXFhWZunl3drX1+Xm2+bi8/ba2uLm7N3d9Xzm13T2e3B9XmtdY1ROT1JPUk1SWVhTW2ZfWlZkXlpaXFdcYf3j5tzR0tXNy8fLzMjOz8zM1tTj4Nzi7ufnbnF8dP5sXPthbmRsfW5aXVdWZmJnZ2ticHX7alxp8vbw6tvR1t3c5Xvt9ftzbvjn6/lu/Ox1enZxW11ob15VXltXWFtaW1xXVVxcbf1scGtmaGptYFpYWF909eXb3dLP2dTMyM7NzM3S19jX5+/p49/1+Op2aWhtdP73cfzq/HdxbV1bXV9eXmhhXWRkXVtXX15cY3z+7ufk5uTf4/Dw5unw7t/f4+Xa2uLn5PJyamViW1laWVJWWVZSTEtRTk9ZXllZWFteVFVYV1pcevDm2M3My8nEwcHExMTHyMnJ0dTZ2N7h6/15cWZeXV1iY19lcWZkZF5aW15maF9paGtjY2dyZ2vz//x06uLm7d7a33729GZfbPdwannp6fP75+xqXV9bUlRUVVdaWF9dX1haY2Vqb3VwamZkX15aXFpcYGNq8OXk187MzszJy87Szs7T2dLS2OXa2u139Op5Z237cWd07vF3evtzbWlybXBeWWNiXVxiZmVgaWtra3F2+O3p39/m7312/nB38urw7t7b3+fo5/peXV9bUk5TVlJQWVpTT1VdWVZcXVlVVldYWFZaXWNfbuna0s/JxcXEwsbJysfNzM3Pz97V6PjrX2pzXW1cV3BmYlpoe2BdZHJ7aXF6dWdfa21hYHb/dHB+8Ojt6t7m6eTq825laWVjZGl5+3Dx6uzt+P9tYl5hYFtYWFtdXl1qa2hlXmppXV5hXlRSVlVSTVNXVVpm7NbTzcrJysvHyczNzMzOzsvN0dvd2eP79fl6bWp19vlrefp0Zl9qcmdiY19eWlhfY1tdaWtua3Tt6/Xo3+Hl9fr7bm94/ff99uzr/e/h7/l8fnFeXWZmW1RUXllXYW5qXFxeYVpTVldUUVBUV1VRUVxpau7Uzs7NysjKysnIys7NzczO0dHa4/D29P50fP1va3NzaF9eZWJcYWxtYVtnb2NecXJnY11veHj45uPk6+/n7HZtaWloaHX1+vjy8O/w8vH9dnZxcG5tbWpgWltiaXd6//lpX2JnYFhUVVNPTlBPTExSW2Z14djV0c7My8rMy8vOz8zLys7Qz9Tb2t3g4+nq6vX4e2poYlpcYVxfXFdaWl9kX2BnaGJgXGF6c/Lm5+Hp7Obt+P378/v9+ubl7Onu9fh7e21hbHhwZ19eWVRTWlteZWxqZl9ZW1tXV05OUE5RUFFbX23s6N7Y1tTNzcrIyMfN0c7Iys3OzdDd2trg4+rh5vD6bWViXl9aW19eX1tfZWppcHJqZGZjYGBlav7s8fbw9/x1c3JubmZmbHf57OPl7XB783RqaHTs8/1+d2teX2ZvaGZ7bmpkYmdbWVVRT09RTkxNUFlfbf3q593Z0M3My8vMzs3LycnIysnKzM/T19bV19XX4/l0bF9bW1xaVFJVVVdVWVtiXVlna2NbY3j8dX708/L37d3q5+33+Hzo5ubh4Ob5dfZuZ2Flcv1sYV5dVlFTWF1WW15lW1lbYFpTUlNVUFNZX15mdu3t7ubZ09XPzc3Oz9DMysvMy8zN0tPT3N3b1tje4Oj8bWpkXFdYXF9cXWNuZ2JkenFfZnN5b3L67HNzePR8cWx6+2hnbX16fO7e3t7m4fJpZWducHp9/HpsZ2pmZWBcXV9hbWxcW1dYUk9PU1FNTlpfXV5t93D259jV29nT0tXTzsvJycnGyMjKzM/X2dLT3Nzk7XpmX1tVVlVXVlZYXFxYYF1hXF9sbmRtbWxrbXV9925ve+/3fPrr7/rp393b3uvsbmNhcGZfZWVmXmFiX1pZXF9eZXBuXFdYWFZVVlpdWFxremx5+e/y8+rc2t7c1tLX1s/Nzs7MysrOzs/V3dzZ2+Pj3+d9aGVkXlpeY2NaXWNmX15od25dZe7uZ2x9/WpnbXpfWl5oal1kevj58+Pa297q6mlcZHNsYmVx/mdobXNgWmJ1ZmNtcFxUWFpdU1BXWFdYX3JoZ2ry7Hh269zu9d7X2NjUzsvLysfEytDPzdTa2tbY3N7f4XtqbGpkYF9oXlhVXGNcW2hyXmD+72tjZ/v7aW17bmFicP5taHTw9v7r1dLf7+x+Yl5fYVxYWm9tYmFraF9ibu1wYF1gWVVWXFZMTVhbXF1heHdz897o6+vh3t/e1tTb2tXNzM3Myc/S0dDR19vW1N3j4N/vcGp8b21nYWFbVVpjYVxbY2t2c/32eGt793BmbXNlam1udHFrcnn66N7d4ux9/HJkWl5kYF5qeGlqa3F6b3Hv825fYmBdWVZST09PV1lYV2Jue/3s5efz9ubh4+bd397bz83Nzc7Oz9HS1djZ19HX2tzd6PR4/vP8bGVuZmBhZmFdWl9jZ2ZjZ2tuam5wfnJkaHJwdGxqaGh4+urn4uvm5+d9bWtlYV1kc3twc3d+9+33/m5rY2ZjXllVVlJUU1lYVVhcYGz04eTq3dze393e5PHk29nWz83OztDNzs/S19nY3eHZ3e13ffh2ZXD2dF9oamleXGJhX15kZ3tnZ2praGpvam5ubXZqY2ZkbWVv8+z37+jqe2Z2fGdaZHBpZWVn/Px4e/fubmz6d1tZW1xPTVJcWVZgZW5te+bd5urf2eHu6uPud/De19fTzszU0s3MztbV0tfe29na7Pju9Wt29+nvdnbw82BdYmdZVGH+cGBidmpeY/33Z19hYFtWWWNlYWXz5e3s4d59bnn0cGV39nZhbvXzbm7++XFydO5rVlJUU05NUVpTUFZhY2du6dzl59rY3e716XFq8tbU0s7Jx8rLysrP1dvU1d3j2eBxZ217ZmV392xlanBjXl9lXFpfbv1qZGX/eW1u7O93a2pqXFpda2prc+vh3ujj5vdxaHdxaXX7Z2Rue3FxaXP1eHZ3/mRVT1RSTlJcZV5ZYXJsd+/p8ent5uT8dGppaXLp2drUzMrKy8zLzNPb2tfb2t/e6X1veXx4+uPl/nV2dWZmYF5bXmdzaF5fZ25qZWn+cF5ZXVpUV15mYGzz5OXr6ur4bmx5/evm5+b89vD9bGV28v5yb21eVVFPUE5NVl5fXWBzfGVr8/P47eXr9f7z/nft4tzPzc3HxsjKzMvP2tXS2eXj5Ol7aG5ua29y+vNraHVuYWBiZGNjaWldXWBiZmVp9/dyaWppXlhebGtp7+Dv/vXueGlmbHX47uXl6/j/fWxjYHF4amJsZ1xYVlZVWFpmdHJvffd8YW/x9Ppy8+16b/f7ePTg2NXQzcnJzM7Oz9fb1NPd4OLl8H3s5enu8Ofn7ft5emlfYmlqYF1qXVNVXF5ZXmBlZ2hpa2FbV1pobfzu6er+dvr8cXjr5+fd2djh8vT0cWht+WtdY2NbVVRVUlFVWmBodXh7eGxnaHB1bf3s+Wz75+rq39nQz83Ky8vP0tXS1tfY2Nzq+vH2dv3v9v768ez4eH1vY19ke29hXmJfWGVnZWJg+evt7vV0bWFcYGRkbnx7bF9gY15dZ2/37uvj5efteHRzamhtcWFaW2BfXmBeX2Zze3V67vZ4cGtpePl8c2twZWn47/Ds3dTPzs7Nz9TY2dXR0NPZ3uXk6OXl5+Xj3eHw6u14am5nXFteaVxVV1dRVVZYXF5mdXv+emVjX11daXX69/DvenPx8ffs6t/a3t/c4ex3dXdraF9bWlhUWFlZWFpeXWVlZXVwanF0e/7o631vcPv48end2drWz83O0dTY3Nve2NXX3Nvg5uzt8+zo6+fm5+zo73ZiZWVkX11eYVpZYV9ganlzd2xwcWxwXVxZW11gZmlmZGNiX2J0/Prt39vZ3+Lq7Px5/XpkXV1eYFteYWxpaWhtbW9ycG1lb/r1aG91aV9eZGpu/ejf3NnQz8/X2tva3NrZ2NfY09XX2tnY193e3Njd5PPz/mZfXmBYUlZaUlBXYWVlY2RgXmJeXFdcYF9fYWpybW1w/O997eTg6OPc19rk6+v8ZGNiYFtbW1dSVldbXFldY2hnaWZyeHn+6PJ7bvz3aG7o3Nvd29jb1tLS2tzZ3ejn4t7g5d7h3ePm3t7p7N/T1uTu8Oh5aGVkXl1fZl9mb/vz/PZ9al9cV1dVWFtbWldWXmlbWWf0/Hp74N7j3Nnd4+fn7G5tbnJreWpval9ocGheYW10YV9w9W5oav1uX1xiXFdkdO3v8eXe5dzb2NnZ2NfZ4d/e2tze2tDT19bU1dvZ0tbg5ezqbWFeXFpXVlZaXF1icGtpX2VaUk9VVFRYW1tWXWZvaXzj2tvc29bZ3d3c2uTr7/dsX15pbmddYWlgW1lbWVtfZF9ka3Nxcn19a2NjZGhmeu3g39/j2tbd3tfU09XX1t/o6+j47+rj4unm4d/e29vZ3OLi4O14YWBlYl9mbXJ0cvfyfWtnWVdVVVZSU1RQT1dbW1xr8ejn3+He3d/i39ve4evt+nBrfXZ1evr5dXlsZV9qaWVnbXBuam5vZVtYWlhYWmZvcHfv597f3dnW1NLQzs/a397d6eTa2t3c2dnb2NPV2NnX3ul4ZV1bWlxaXV9fbnRqXmRjW1NTV1VQT1VYUFBZYmBe+d/Y29nV0dbe2tnb4+rs7W1laWxmX2d+dmlpYlpZX2JmXWn9+215/HVeV15hZF9r9+bt8dzW397Z09PY1tDX6Ojn63V46uDl7eXe3d/e1M/Z2NTW52xiamBYXW1ze/Pt6XRub2ZaV1ZXUk1OT01MTlJZWV773uXs5dfW6uTW1+Dj4N7ucvv0/PXv5uPtfnVvZWZeamlha3RqXl5fW1JPVVpWWmF8e3H0393d2NHOztDSz9Xc4dzd4OPc19zd29XY2dPO0Nfb3vZnW1lcVlZaaGltam1mXlxdWlZSVFpUUFBUT1BUX2xz+d3Z2tza1tnb29ja3+z083pqb357fHV3cGldYFhYV1ldZWducWRlWVtaXFdfXmJte+7u7+nb2NTT0NDR2Nfa3uLm4+fs7+fg4efh3dnb19TQ0tfe7HtkZV5iZ25+++32bmllYF9YV1VVT0xKSUtLTlRaXWFs+vX38uXp4ODd2dva3+nr4+Tm4t7g4e7m7HFuY11aW1xobGhcWlpaVFhcWltcY2ZoYXH99eTd1s/NztHR09fX29jc29ze2tnd2dTU09XU0tPa53ZsZ11ZWl9fXVxjYFxcX1xcWldZXldOTU1PT1NbZW746+fl4t/g4ebl4tzc3+ro9f3p5+np6Op+bGtlYFpWVFZbXWhnYGBjbXBlaXduZWpzcW117uzs6dzV09fb1djf4uLl6u7m5ujn3t7e29nS0tPR1tre7u3tdWZv/nJnZ3R2bHFtaGNcWVdQSklJSUtMUVxfYm19/n788e306N3a2Nva1trh3drb3N3f5vL07f1lWlhWVFBUWFhWVlleXFhfalxXW2FpY2R+49/b0s7P0dPR1NbW1NLY3tzW2tjT1tnd2tfb5evn73JlZ2heVFdcW1lbaGteXm9wbmhfW1RPTU9TV1lleH196+Lp9/zw7uvq4uLj4d3d3+fn5e37//Dze3p4a11aXVxYV1phY2VibHNtYmRuZF1fcHBreOji4ODc2tve5OLd2uHf3uDj3dnX2NnV1NLU1tnW2t3i6PL1925qaG51bGxxa2RjZF1cVk9OSklITE9RUldgZWhnbW9uferm4tvW0s7Q1NTU1t3b3N7j4t3k73tjW1hUVFFXWFVUV1xbXVpbWFhZWl9lcP3s3drZ1dXU2tfa1tLU19nU0NLR0tXX29rd293n5OHh73x9c2VmZWZnZmdjYmVpYmFhXVdYV1JSU1dYW2BkZnRydHL/fv/y+vXv4drY2trd4+Th5erq7/jz8f55bWZeXV1bXV5eXVtcYGJfW15eW1xebnV99+Dc3+Te2t7j39zY2dvY09HX09TW2tvX19vb2djb3t3o8/jwe3J7c3FuZ15dWlVSUFBOTU1NTk5PVFhZV15gaGdjeevw6t/a3t3U09LU0tbU1t3c1drg6efxaGNtaVhYWFtTUlRTT09QT1FRT1VcVVpt5uXp3dTY2tbT0tbU0c7T09DOzc/X1tPd3dzc6OXe3u718/f6dGttfmxoZGhdWVpgWU9QVVNNT1JWVVlZW19jYW57bWX83+z07Nzh6NzU2t7Z1trd3d/f5Op0evJ+a3x5ZmBnX1dUVldRU1RVVFRWWlxaX232/Hzp19ve2tbY2NbU1tfU1M/N0NjPz9TY09La5N3c7/fi5fx7df1qamNaWF1YUlRRTExOTExNUlNRVVtZWV9ob2d059/h4eLZ1dbc1NHX19bS2Nra3e7wdm1sbmleYGJgWlpVUE9YU09QVFBNUFhXW2t1/fbk3tjU0tbRzs/V09DX1tDO09TPz9PU1djZ2t7s6uv7df5yaWluYlxbXV1damFbV1dUT09QT1JWU1VeY1xdZmpmeevm8/Ho5d7Z2dvW1dXb0tDa49/mcnf7c2toZ2FfaWJcWlxXVVhaVlRUUE5PWllba/hwe+bb2dzX09DT1dXQ0trb0tDS0c3N1NbT1t7e4u76+Gtla2xfXmReWl5uYF1iZFlUWFdOTlRVUFZeW11fXltmff7039ng5dnZ3tnT0NPV1tbY2uLw7fFrZ3FoYF5eXFteZF1dX1lWW11WUVBRT1NZXWX16/rp2tna19HS2NPP0dLP1dnUz9DRzs3U2tba4ePm/nN2bGBfaWBZXWxjYXF0ZmZfWFBRUU1NT05MUlZXVVhZXGN08+/i3dza1dbX0M7S0s/O1NbW4/7x63V1+29iX2BeXGJhVlZaVE9WWU5JTVROTVleXm3z7uXX2tnX0tLUz8zP0s/Oz87My8zNzdPZ2d3r6fprbGxdWWBkXFhgaF9faWdfW1hVU1VRTlBTT09aYlhXY2lkdN/c39zX2tvW1dfX1NfY1NPa4Ob1a3j3d2drbGFeZ25kX11aWFtUUldXTk5SVVJVXmdt/Ovk3dnY19HR1NTPztTTz9TZ0s3O0M7S2+Hf5fTs+G5tbGVibH1mXW16ZV9saFlWWlZRT05LTU9OUFxgWVxqem7x3t3g3dja29nZ2NTT1NPQ2OTj5Xtt+O5vaPz+aWhuY15dWFJVV1BNUlVMS09QTVBcZGB74eHb0s7QzszNzsvLz9LNztPOy8zR1Njj9fVzZGdrY2d6e2lobGFcZW5gXmVgWFhaVVFOTk5SWFdYZ3Bmbefc5eTc2N3b2N3g4OPi2NXZ3Nre7376bWRreXBv/PdpX2FeWFpdWFhbWFNUV09OVFhWVmBsdO7f2tfQzs/OzMzQzs7X3dnX2tXQ09nc4fdyc2VjbXv58Obtb2t2eGp6+2ZdYV1VUFBNSkxOTVBZVldle3T/493l5trY3t7f6/bp4OHb1Njd2dz0fentdf3q7fv4dF5aWFZVV1pUUlZUTk5QT01SWFVabP754NbT0MzMy8jHy83Mz9nZ0NLa2dLY4On5Yl5iX11tfm9z9XVgYG1kXGZsXlleW1NSVFJPUldWXGpravnl4ODX1dvb1tvu8flvbv3w7eHd4eTl+2l1+XRs/OvzdHV2aGJkXFpgYFtaXFlRVl1XVF1gXWZ99fHj2tnYzsvNzM3R19rd6Ofd3OHa0t728PNtaHb5/PLr7Obh7n7673NjZ3BfVFRVTkxPT05SVlVaZmRhduvs5dfV2tva53z16/5369/e29jd6uToen7l8G3/6nRib2tZVl1aUlhcVFFVVlFTWldTXWteXf7l6+DSzszIxcrKyMzS09PZ3drY3+XmfWJfYl1cZm9jYv/t9/D3b3jx/Wpu/2NaXF5YWF5eW1tiZGZwfHD73tzd2tnh7ejtaGZ2a2V86PDz5ux4dfn7bv71eH3t9XB1fmpdZ3JfW2VoXV5hXFteXldXX1xbaP366djPz83KzM3Nztfe29zf397p9PV0YmJtZ2Np+vz0397m5uLp8u72amJoZFpZWVJPU1RQUlpfWVtrc/7l3+Pf3t/m5ej1dfjs8unf3+Ll5eTs6ep7dvn3fv54aGZjZV9bXVxaXF1bXFtZWVlbWlldYGR26N3X0M3KycjIzM3O1dja297m5/luZWNdWFtbWmJ6+vn17Ory7O3/dnRxamxtYl1eXldXYGViY2lvfPbq5+Xk5Obn6/NybG1vbXjy7/Dze332+ndrcXf++X73+P12eP10dHN0e3BpaWdhXltXVldYV1tjZ3Tp39nSzczNzs7Q1tnZ29zg4+nw93JnaWhgYXbz7ebj4N7e3+Xv9/xyaW5sYVlZWVVTU1ZWWFhcanBuee/n5+vt7/L6+/f87urm3t7e4N7h5+zz93n673p2/nhsa2dkYWJmYF5jX1lZWldWVlZUUltpbvnf3NnSzMrKysnMztDW2dfa5Ovt/GpkZFxVWV5faHN+ePjx7evq6XhwfG1senRjX2ZhXV1mZWJud37w6u306Of3cvn2ZWRpaWVu8Pn47fH7+/l4cv18eP7t7Pnr6PZ69u13b/5+c21nXlxbVVJSUlBYZW5w+uTf3dbQ0NPS0dfa2dzd297n6OXwe3N1bGNu+/jt6OPi6uvn6Oz8a2hwZF1eW1dSU1dVV15iZWx58enu6uj0/X368/p0dv97fe/h3ebm4ebu8/D3enRye3t+fm9wa2FjZGNgX2BcWltdWlZXVVddaP7p3tva1M/Pz8zM0NLU1dze3OLs9fV7aWljXV1cX2N5eHP78O378On0c2twdHBraWheXF5fZmtw/O3q6ODh4uTo7fn9dGxpYl1aXmNnbnl+d3P29P59/3pz/evo6ubh5/X9fvr7e3dwa2VdXF5aVVVYXF1lfPDx6uLd2tfW19rb2tzg6uzp7vv08PP79/pvbnj+7ubg5Obd3+fp7/xwc3BjYGBbVFZZWl5lZ2hy+v346ur9e/r/c3R+dGtrY2V0+vz96+fs6N/n/O7vbXjr6vj37PZzcHRqam5hXF1cV1VbXFdYZWdn8Onw5NnW2dXQ1NbT1NvZ1+Tu6Ox4bH59Z2ZuYFxnZ19s7/V37+X3efDybHf1dGhpaV9fdX5x+ebn5N3h7OLe6Xt3emNfaGNaXV9dW19kZG/39Hz873ZveXJv8N7g6ODc4ufn7H7z7HNiZWRgX2JiXF5rbm10ffjq4eXp5+Df5+Li6eLk7v338/Pw7ur3enx+dXB77uLf393c297t7vpta2pgWVlcXl9haWhu/nx9/371/P57b21+9nV1dXJ1/P12/urh5efg6e/9b2dlcf798/Ds7+rlfWpoZ19aWVhZXmBfYGt2/PDr7evf29zf3dra2dvc3N3e6/Xxe3r28Xhrcm5lYV1bYW1ubfvn4ePi4urv7PF9eXJpafrr/v3m4ur17uzs6X5sbGtjXmVnYF5hZmBeYWdrdv1ze/P1bGhubnfr5OPf29zd2Nvm5+t2YWFoYWBmaV5faWZndXlveuvvdvzn8n3z7/Dn4e706OXt6N3e8/fufnBrb3ny6Ozm3tre5N7o/3l3amFjYF1hbWpidHtmZG56evp9bWx4emlt+HFv/fN5bu7o7Orn7vrs92Vjbmtkd+vr7efk8e/sfW5sYldVXV9cXW1saXp3bvnl6vLk3ubn3N3k4uDm6ePs+fHo8Hfu6nppaV9XWV5dXnf1e+zd3uTc2eTt6/Rwe/H9dvDo8/fn63V87f1vdndlX2deW2BjWVpgXlxneXd8+Ph9eX1tbfnu9+/f3t3a19zh297z+/RoXWZmXVxmaV1eYl9hdHpsb/5+bnHs7/zp4+3x4uHj3+Dp6OLl+Hp0aWdwdXvs6Onq5d7i4t/n/nF5a2ZuaGJldm1fa3ZraXp6bXr8cmp2c2lr/XZjbf19eO7p7+zn73N0eGppdX568evu7ufp9/jze2RkbGZeX2RjZ2plZ21sbn7u7vbv5ufm39/h4ubs8+3r8fbw+f3x8nRsa2RfYG1raXz19vTm3+Tm5+r58urz+vX7//ju8v76731sd3hsZmdoamxqaWJfX1tdZGNiaHf9/P/4+fvu8PHq6/Dv4+Hh3t3h6+breHV3ZV1gaF9dYGZgX2tsaG5tZmvx6+zi3Op17uTx+Ojr+/Ds7e3n7XB66+327e5+e+/t8Off7nLy63dz+XdpZmhobXxwY3XufnD7/WlocHxzfvNtYm5xZGl+cGh46/P87Op78d/sfu/udm7z7Hh+6vxp/fJuZ2xjXF5rYlxpbV5p+XdtffP47N3a3dnX5/3k4/h8+nZpd/N+evL+ZHLqe2h79Gxv7ev97uD3cujne33n7nD/6e1+6+f78OX7a3v9Z2n0+2VnfWZZYmRbXmViZX3v/3vp5O/p3u167/Juc+vsdfDf8Pfe4XVvbmFgZ2hcW25vXmZ6ZmBs/n303Nni4drl7+Pqa2t8c2z873595eDu6uTr9vf7b3bs7nr/8Xz+7/hvb/h3a/jvevrk5PXw6/lzdndpeut3ZGhxZ2BrcGNgdnNpefh1/ODe7O7l63V1dGRr+f1wfebk6ujp/mlrZV5gYl9mbmtfZXdwbvfn4tvV2N/d2+Dp7f1pZ21lYmx0cHXr6Pvu4e1wdPl1dPX5c/zm7Xzw8vns7e/z6t7j7ebp+fv3/W5udXF3d29kaG1eXmZlZWdnYWRvfvv36uv07u75e3l8ef3t7e3e3eTq5ub7dm1fXV1fX19iX19gZWxt8OPh3t/d3+Lg5e/6/HBqZ2Rnd/7+7ezp5e71e3D7+Pv9dfnv8/Tt9Pbt9e/v/vTp7fj79/h6b3Jwc/n4fXx3enpubW5qbXVpZ2lnaG7+9v7z6/Z6/npvd316dv/u6uzn6evr7/9qZ2ZhYGZoYmJnZ2VpcP3l3t/i3t3h4ePo7fb8bGNlZmVqcHN0fvj8dHd8dPXq9/fq6O3r5OHo6eb1/u/s8PDu+3p8/Xhoef12fvt3a21vaWdwcmtpcGZhaGVlbHB7e/zv+Pbm6/fx7vX97ejq6uLr+PD3amZqaWNma2ReYWJeYHB7eu3n7fHn4ufn3uby7vJ0a3Jya21wb254fW549O769uvv9evn7Ono8vj08Pz97e/38vd0c3NvaXL29/7083N0fXNvbnVvaXByZmFmYmFqcnFzffb79Obp8uzu+vXv7+/zfnFsc3NrbHNvcf52bWlnaGFpff757u307+rn5OTn7fPu/mlrbWdmaWpra29zcXL9+Pnu6uvn4eLj5eju8+zv+e7o8fnx93h1enx5efx1bnFsbHB5dm94dnBub2tiYF9dYG52dPbt6+fj4ePj5uvr6OXt9PpvampycGhsbGZoa2xnaGpmaW5xcv/7eHr78Ovk4OPl6e33/XtxbGhrb3d5e3z++PPv6efr6ujw9e3o7e7r8PTw8PP0+Ht5c21tdX55cG92en76+P7+9e/5935rZmFfXmRsbnZ7eX7u5eTk4Obq6e3y+31vZ2RnZ2psbG1tfPn+fXxuaXZ5cHnx9Hv27vDs4eHq6u31em9tY2RnaGhncXdxdnt+9+rq7uTl7enj5Ojp5unt7e3y6ePw+358bWpsaWJhaWdo/n579OjtfPn0dGNiX1tkcnL88Ozu5t3e5uDc5urk6/P5fGxgYmReXmppY3B9b2trbGRmbmVgefpudvXw7OPf3+Xl6e7t7nh19f9ubnh8evzzdm/6emz/8Xt88vJ+/enyfe3n7+7j7Ht3fHhveX5sanlzbX3v7uvh4Ons6vtraGheXWNnbf/5++7i4ezp4Obw6+v3/3ZnX15fXV5t/HB37/1y/Pdwb3t2aG7w/2/z7vrv4+Xm5unzfPx9a259bWZteWxrd/5yeO37fe3we/bu+vnp5enr4eHo4+X1/vl8aWh1bmNqdmZme/557+Pp7ePpdWx1Zl9te3F+6+757OLl6+Dd7O7m9WxwcmRdYGNeYm5mZXd+bG/0dmltdWlndXttdu708N3a3eHf4+709XVw9Ptqa3trYWhwamv17nr9+mdjeXlx/uzq7urk6Ozj5fr26/p5fH1rZnJ2Zmz3/fTg3uTh5e3+cG5oaHz/bmx5c3b66ejm3uDy+vNpZG9uZmdtbmpqaGRoeXdrcPb7bW96bmlwdnJ77efi2drk5uXr/nNzdG91bmJhYF9gZnB3++rl/Wpwbm15+/fr5eXq6ubk5uTj7/nu6/dwbWtmaWxnZ/vs8vDp6Ovu73ptb3d0cHVqZ3Tx9PDf297g4e50fvxvbXFxZ2lpXlpfZ2BibnFseH5rZG91aW35+Hzl2d3h3N3m5+j9cH7xb2hwaF9nd2pp/e95cPttX2l8a2ry6/b77/165t3n6N3h8erqdGl4/Wlm/Xxt7OT2/ejg7O7o/ml89mhmcm9kc/T27N7b8f7o73b28G9qff1mYWNcWWNqX2f8/W1sbmdkcn5pcOzy9ube5+nc3/Dw7P5t/n5naX56ZWt2bW1+e2hp/HVobXhra/Hwd3ny+fnl3N7f2t7v8vB5c3x8bnPu83R8+3j55Obw8+18aG11aW34dWZz8/Ht5uX3+uXp/vPyeHh7bmNkbWRcX2xoa/90Z2Zvcmxw+H167PF8+O3o5ebr9frw9m9wenFxfnd0eHd0a2pwcnP6dGhvfn15fXx3fu/t8+bd4Ojn6/p99fZ2efP1fvn9bGx+8vz06Oz48/ZxdPX0c3X5+Pby7fDv5ujy9PD7dH19ZmFnZWRmZV9hb2tfY2pnY2xycPrr8/r39v344eLu5d7o9+zo9/Dp+Gx66nxob2hfZXNvY2hvZmh0dWlw83x37uXn5d7e7urg5uvq5Ojn4e788fF6dfn8c/75bWdrcGpveG1qe/D/d/Pr8Ozn83vw6fl69Xtudvtza338bGhqaGFmbmdhbfp1bntsY2l7eHL16+7y7Ph47ur4ePbu9e7p83h++Xx2eXRsb35vaXv+d374+fXo5/b67u968+v4/Orn7/T0+3X97X556+94/e/4e/PrfXLw6/jv6/f67Ofwe/j6bXN9a2ZqZWFkamtteXNjYGdnZmpqanN7fnJ0+HRoePj87+bo7u/s7+3g6X316O328O38b2xtZWJpZ2FlaWtw/vt4+ezr7uXn7Ojj5ujl5Ofs7e31+PT4/vXz8fD1em14eWlndXhwcnl+fvDx9u/v8/789f53e377eXVwcHpzbG13eG1ueXNzbWpqa2loamxqZmVobnB1dXT9+PLv8ujm6ejn5+Pl6e3x/H1xZWdnaW9w/fj97+rr7e/x7Onq7u7r6vV2fHt0//t7/e7s7+7q8Pfw8Pl6e3r78Pd5++vs+vXq7/78fW1seXlvcnBoaW1kXmJmZmp6/G91+m9jZWxoanBxaXDy/XX7/HB87u/v5+Ho7OTk7efe5/z59nJpZV9bXWZmbPz1//LufXvs5ebk3+Hm4uT5c3x7bnj3+X7u5e307u737u55bXt8bGh0c3F79fTy7Ov/dXNucPzu8vjz9HltZmNibnBt/u/7d3NrYGJnaGdoaWhqbmpkbHVucHz/fH7w9vvu5ubm3+Hn4+TwdW1taWlvbm/48P3+/HFz9+zp6url6vR7bW16d3L77u3w7ujp7Obj7ujm8e7q+m5w+vP49uzt6uPve3xwaGtxe21qd21eW1xbX2hoa3P+d2hmZ2NqcG5yfn1zdnpwb/zu+nnu7/n593h1+urs6OTo6ePpfW1waWBjbW5qfPpwbXt+/PDq7Ozj4+7y/Hn97O307ejr+fft8fXr6/Dw7/h7dW9jZ3z+ePXs7efj6/Pv7v10/Pd4/vlyaGlram50bm55/mtgYWJfYmxsbHB2aGVsamp69/598+/5eHlzdPny8uvl4uLj5On08vZza2xtam5tZml2cW16+Hv783lrbG9ze+7s7ezl6fPv5uPo5eLj5N/h7/P1efzu7vXt5+vu5+bs8vN2bG9yb2lnYl9jaWloa2toa2xmX2ZrZ2hx+3p9+3d0/fX28Ozu7urp9nBucW5xfP7y6+z6evb1eHv+cmltbmhkaWtvfvV9dvjz9/39eHP+8O/q4N/l6Ofr7+jp9f3w6uvr7P1vcHJye/f08Ovt+/Pn5Ons8PX19Pd6evt9ef38dWtubGNiY2RpcG9qbnx9aWlubWtxeHB98+7x9vd0bf/z//zs7PDv8Pb17e19efX5fnx1amhqcW5scGxqbWtiYGtwd/nt5+jg4+zp5+nq6ert7+3m6e3r7e/t7/fv5+jv8Ozv8+rt+vbu+nBxb21vfftvb25nYmJiXV1ncW/76vJ7+3tscvLydXP59fTs6/V+endzefL8ffZ+bWxxdHZ5dnN68vl1endub3n+eW9va2dnaWpz7u3z6Nzc4eLj6enh6Pjz9X1tc35ta331eHzt8Pnx8Pv+7ev47uXo6+fq9/fs6u/w7Ph2dGxfXWRkYWZ6fHvzfWtkZGNmcG9kZHFzam/7fnB4fH7z5en78ev3+enq/3rw8Pns6fb77vtscnZrXl5eV1hja2z15efn3t/t7eLn+u7n93x+c2lreHt47+jy7eDi7u3n6+/r6/f25u/78PNxcPj1enz5cGZlZF5gcXJv9+Xo9+7udGltZV9jZl9eamtiav3+bnX9ev/18n589Pd98vJ7ffDu9+7k5/Dt7nl4d2heYGRgYm359+vf3uDi5/Dz8P5ubnxuY2FmYGRye/rs5+rq5OPo6eDi6ejj4+Xh4+nq5u338e79dn1zaGRnZ2Jma2xw9/lsZ2VfW1tbWFhbXVtfaWp08uzt7enm7e3n6+/n5e7v6+vt6OXq6+bte375cmlkXlpYW15eZX3w7uPg6e/u73x6/nVueHdobH56evHn5ufk4ebn4ODl4+Lq6+Xl7e3p8Hf893N78P51d3ZsZ2tsZ2r+/H71+m1kYV9YVVlYVlpeXGFwcW3+7vR+8O5+/Ors7eXi6Ojh4e3q4eXy7+58/vZ2Z2ltYVxjZ2Nt7unq5eTu8/V1ZWp2a2RscGtv+fH1597j59/h5+Tc3+Xe3ODj3ePx6Od9dfjz//rt93V+fmtjaWhjaXl0bXNyY11eWFRXW1dXXmNha3x7dvTu9/Tq6uzq5+ro39vd4OHn7+vm8f72+Hh2d2tlZGBcXGVsdvDu9/fu7fd2bWpkaG1scPz4+fPr5uXd2+Dj3t3d293j4d3f5Ofq8P17eHT/9vDx+fp6d3lyaWZobGxvb251d2xiXl1aWllYW11fZm1vbnX/eHJ5fH707+7t5eHd3uXo7vHy+fj38fP5/XhxdHNqZmloZ3j8//Xr7fP+fXBra2diZm12evTt7uri3+Pj3t7g3t3f3dnc5eTm9fTu93378/j26ez49+37bXFuaGRjY2BnbWJdYWNbWl5cWFtdXWFubmh0/GxqffX69Onp5t3b3uHe3+3q5e7y7u3+/e78cXR7ZmBraWBqeXB47et5c/5vZGVrZmj9/njw5erx6N7o59vb3dnX3N3Y3u7u6ftsdv9zfu32+urn9Xz2/mhlamJdY2hiY21lXV9jXFlhZFtga2hncXRkZGxqZHL7dnzq5evn3d7l49/m6ODo+O7r/nvp5O/z73lnaGhgZ3p0c/fr9f3+eGhna2JkcHhteuvu+vLp6u7k4uXd2tze3N/r6+Tt+vHyc3H4+Pfp5Ort6/ZvaWZeXGFjX2BmYV1dXVlaYmJbXmhkZGxsZWZrZ2h39fvy4+Tq49ze393e4N3b4+/x83587+/3+PtsZWhoYGRzb2h2+XhweW9la3BsaXh7cHvt9Pnv6+fq4t/d29na3t7e5ujo7/7//nBtb3Z38/D5+PR7a2lmYmJoamhma2hfX19hYGVrZ2Roa2xqa2FkZmBhZm5uePPq6ufk4d/j5OLi6PDz931+9evs7Ovt/HNvdXN3/v/19vf9fnhwc3hva2pta2h3/H578+7s7O3p5N/j4+De4uXh3+Xs8fdxa29vdvjw9O3v+nNuY19kZmFfZ2ZfX2JhYWRiYV9fXl1iZWJeY2xmaHX7evnp6uvk3uDf3t/g3uDo8fT8cnfw7Pb37fN0dHv+ev97/vl+cHF+bmt0fW5seXpsbn35fPvp5ubj3+Ld2t7h3N/v7ePofffs+G90dm5ufHx8enFpZWtnYWZwaWJqcGRia25paXVtZGBgX2NiXl5la2Roe/p68efi6uPf4OTl5ero7Pp++3hx/unt8OrpfnF8+H579PP3/PX89PJ8dH14aWl6/m538fD77+nq7evq5uPk4eDe6u/n4+rw6+f3bnj8e3J2dXZuamVoZmFfZmljaHB2bHR+fmxrbGZdWltbXFtdZGtoZ3Hy+Pzr4efq4+Lk5+Pj4Obr8vDzff7t6evr5eb7//j6bnL79v/++/zz9vp9/mxobXhwbnT49nv07e3z7OXf4uDf3eLt8efi7enj5vP9enpuaGdnYl1cXmFdXl9lZ2xx/nlv+vF7bW5tal9eX2FeXmNqaWNt+fL97efj7O/q5+zs6ubn8fDs7Xt68ubp7ujm9v/+fv188urn6evo4ur5+flwZ257eW52/P5wdH38+//89Onr7Orm7Pbt4enu7efo8Pr383pwcHBnX19kX1tebX11e+zn+373/mhhZGdgW1tiYFpbXmZjaXv4/vTq5ur07+Tj6OXh3+Tp5+Lq9+3m5/H07On8cHT7fnX95er16uLscHH9fWZmc35ubHn3fXX05efy8OXg8Pjn4+7s4uDq6ePg5/Py8fdyaWtmXVpcXFhVXGhpa33p6ezxfnt3a2loal9dYWJbWV9oaGp9+PPz6+7v7e7t6Oz18ujl8vjs5fHx7ez89vvt83h38unu9ODZ4uvm43hqdvVzYmr9dmZkbfxxbvXk7v3x5PloeOfp/+ne4+/n3uPv6OPl8XVxcWxfXWBeW1xjbm/96eLpfXJrbWZgXWNgWVZbWlRWZGtiZP/r/nL35+zv49vd6uze3fT44Nzs9ujk9/7q5v1w+u73ePbo5+vt+31taWxtbGtsbGhjY2Vu+e7t6d/i7frs6/nx3Nzl6Nva6fbl3uz88OxxY2VyYldZYGBZWmlzaHHu8GhgbHVkYHF6ZV1dXl1aXmlpaXT9/3l7+/nv5uDl5ODl7/Pp5ezo4Op7/ejse3fw8Xh56N/m6+De7nT36fxrdPV6aGpyZFpfc3Vpce/scmx98f344tzg59/a3+vq5+jm5+7v7fJ+dXFtZGRrbWtmbvh4ampwa2JeZmRbWmBaT1FcXVhbcHRjZnv5cG/q3eXs3tba5ebe3+/s3uDz9ebqfX7w9X5+/fj38vT+e29uev35/fp1bm5pZWhwdGpt+PT68uXt++rc3eHc1tvf3Nve6ezj53Vs/PVoXmZsYVxs+WxgbHtrXWRwb2tscG5rZmRkXlthZ2ZiZm1saWxxbnb17e3q6+zp5ut8fufo+vXo7X168/F0b/Lk6ffw4OT/fujo9vPk5/x08vJrZG10cWtpbWhiYGZqZm3x4+Xj3Nra2tve4ODg5eXl6fLw7f1vePb/cnj1+2tnbWpjYGluYlxeYllSVVtbWl5pZmNpbG1sbXru6ebg3dzc3Nzc3t3c3uLj6u729f5vef9zcP5+c2xqaGZnc/r6+v3w9nBqd3p0cP7+cG14dmpqdvfw4d3b29va3N3d3N3h6ent8nhwbWNgZXBsbHv2c21vdG1tdHNta29tbmRhYWNobHF1bmlrZGBga3B4+/Dt7uvt8fHw9+7o5OXn5ev1fn1+9Pl9/O3v+vXr8Hv36ejw6eDm+Hl5cGxteHBrZmdkXlpcYF5ice7p5N7c4OHe3Nzb3N/h5On3+/f+d336+fL193l3b29w/3BmaGxmXVxaWFZZXF5eZWloZF9fZmpr9Onn59/d4uff2t3d2tnb3N/k8Pz5fv16c292bmhmbGttcXt7fu/u8P7+bm92e29xfHRoY2hjY2p5fu3i3Nra3OPh3tzf3d3j7/N1Z2ZrZl9laWtteHVvbXd6dntvbXZ9bGViYV5gY2JhanlraGdoZGdtcW/77+vu9vz+6ubo6OHg4uTj6vDp6fH59Pf4+/tzevTt6+vo6ufh4ez4+/x1c3BtbWtjW1lYVlldYWVw7unm5OLh393d3NrY2+Hm73x5fHVsb3359vf3/Px3cnl2a2Zua2FcXVtYVVZXWVpcXWBiZW1yeHvy6Ojs6efl4t7b3dzb293d4uno6PH89/T+c3ZuampvcXl0e/bt7Pr27u92fu/xfPz8cGJfZGBiYWhw+fTs5d/l4t3d4N/b3eTs7XhvamdeYGlmaG59bnD/+XN5/PT6/X5yb2xoY2JdW1xgXFleamVeaW9taHd9fXn26+Xk6OXf3+nm4eHr6ebq9erj6PH493p9fP597erp5+Dk8PDv+W9zc2xkY15dXlxZXGJfZHLy9+3g2t3c2Nfa3dvb3unq7vVza2t2amVwenFqdXZtaXFwa2hpZGJhYGFdW1lZV1paXWFoaXF7efjx8vTm5OLh2tzg3tvc4N/g4evv7Ov59fj8dG1sbG5sc/ns8uri4Ozn4ufw+ftzamZrZ2NfZGNjZGx2/vXp3dzc3Nrf5+no8Pb+eW5qa2VlZWpnbHJ3dv737e/18fX2fHtwcmhlZF9ZV1pbWVhdYGJfZ2ppZm799/fu4uHj5t3c3+Te3uPm39zh6evl6+72+ft9fPXw7uzq5Obr9O3u+G9oYl9cW15eXFthZWhlcPbt697W1NfY19rf5eDj7nd993hqbXdza2t5c2xocnlyaGpybmhmaGdiXV5cWVdZXF5eX2ZraWVseHdvfurl6ODa29/g29rf5uHf4+3m4+v9/O3xcm18+3Rx7+ju9ujk6vDt5+x5amxqYl1fYmFfY2dpa3H58Ovl3dna3eDf4u/88vB6cXZ9dGx69vl+/PH0fXzu7fZ5fvtxZmx1aV5eY15XV1xcV1ddYl5cXmNjYmp79O7q4d3d3t7d3t/f3N7e3t7g5+rp6O99/PDwff7p5Ory6ujzdHv1dWZiaGdeWl1eW1pgamZmduzt697X1tvc2dzn8eno7vTy7PH7fPHt+Hz+9vx2enlybWxwbmpjZ2ZdXFxdW1dYXF1YWmZrZV5ocmxreuTf397Z197f3d3j6eHf4+fp6PP69PL8b3V7dG9y9e3t9PDs9Pt+9vJ0bW1xamJgYmdhX2VrcnB87enp49vc4Ofp6vn28Pj9e/t8c3B77vf49Ovo9/Pv7fp4fnp3bW9xa2dgXV5dXFpaWFpcWlpaXV5dYmz57+nh3tzh4+Hf3ODg3Nnc49/g4Ojs6u7u+v338+/u7fT38HpwdH57amlxemlfYWFhXFteYGNldPDn4+Lb3Nzc4eXp4+jv7enl9X3/+vd0dvzz9nV4entvaGpqaWNhZWdoXl5fYGJdXl1eX11fYWdnZGlz8u/u5t3Z3uHe3d7n5eDg6vDq6uvz9vP693twcXf4fPv17ez+/vzt8H707ej0dXRxb2NfY2lqZW188e706ebl6/fx8O/8//Pv7v53b295cHf96+r68+vn93X/+3doZ21ubmVpbGljXF1cW1dXWVteXl1gYWhpcPnq4OLi3tva3Nva2Nrg4d/d4+vl5On9fvHv9nn48/P6dnVvcG1pbnR8c2lnZ2heXWBkZmNodfPu7+Hc29/k4uDg6enk4ePw8/X7eGt2/f53d/r9/XhubGdoZGFiZmlkZGptaV9gYWJeWVxgaGBeZ2tuanTt5OLi3Nzc3NvZ29zf5ufq6ezy9PHt+3378e56cn7t9HT/8vR0cvXz+XZzeHFuaGlpaWdiaG95+PXw6uTm6+3r5+7w6ebl8vr4+nlqc/fx/Hzx6+z6//p7b2dqbWprbHFta29taWJiX1lYW15cWl1kamZmdu3s+O7g29vb1dTX3N3c4Ofs6ens6uzr6+fn8v9+7+17c3X9dWlsdX1rZGpsYlxha2dhYWx0c3X67ezl5+no5N/i4uHh3+To7Ozwcnj9+Xdscn58aWdvdG5iYWtra2drbWpoaGtnY19eXlxdX2BianNsa3jp4u/t39rb3trW2d7j4uTt//7t8fl98+zs7ff+fvj7eXf78fp1ffbwfW5ub2deYGhsZ2Zw/P1vbn72+X756+bj4+Ll5eTn7fXz+nBsdn56df73/2xqcf57aWt4eHBrbXVwbGlpZGReWlpaXFtcX2hoY2hu+e3w7ebe3uXf2NXa3tzZ3urt5+ry+u7o6e3w7/P4e3z++/R+cXJ6/HRqaG1qW1tlbWVhbX18bnD27O717+bj5Obl4N/j6Ofr7PpvbHF6c3FzdHlsYmRsbGJqfvV5bHP7fWtlaGhkXVxfY2BdYGFgYWJjZXJ9e/jq4OLm4d3Z3d/e3N7q7ejg5vLv6+rv+fHt7/r27OXo8e/v9f12cG1tbGBdYGlkYWhsem1pefHyd3Tz6O3w5N7e4ePg5Ofu/nd7/XlzeP99bGZpbW5rbnf5fG1weHlpYWVpZV1aXV9eWlxhZGJgY2p2dHvw6eTi39zc2tzd3t3d5Ofm3+Pv8uvp8v378erv9u3o6ft6fH5yaWpvcGZjZmZoZWNobnNsbXP99n788+rn6+fg3uHr6+nn9Xz59ftwcHV8dWlpa29va3V+9v1zfP19cW1rZ2NdXF1eX15eYWZmXl9nbmps/urg4OLd2tvf397g5u7p5OTn6unq6e709+3q9ffs5+fx/v34eWlnam1oYmRrb2tqcHx6amlxdHRsbn708fHr5ePn7evo6e3w8vP6cm1w//5wb3n7enB+7+78eP3+fXFsbGZiXVxfX11cXmFnZ2JlaW1saW/05+jq4dva3t/d3ODo5+Pj6O3o5ujs7enr7fd++fLv+3l8/ntpZGhrZ2Blbnlvbvr3fG1tcXNwaW1+7/H47OXh5+7s6+vx/Pj1+29tcnt3bXB5+Pp5/e7o9Hr49PtrZ2tpY15fZGZkYGNkYmFhY2ZraGZs/+719evi3uPk39ze5eXg3uTp49/g5ubi5Ony9/Tv7vX37u35bmdlaWZiYWh1c250/XtrZmptZl5lcHx3cfnr6u/w6urq6+/v7u71fvz18/b69/D4d3vz8X5xe/P9amNqa2djZWpraWRkZWRjY2hqa2xscnr9+vvu5eDh4N7b3OHk4Nzf5+ni5Ovr5ujvfn74+X53evX6dW1tbWtsaW52ev9vc3v+dm90eXdpaW9zbml18+30fffv9Hp69vP2/vnz8O/4/vr99vn79/X4ePz3+XJnbXB0amx4eXFmZmViYGFjZWRkZGdnaWxu/e7o5uXg4eLn5Nza3eDe3dzg6eLh5+7w6/P3/3r4fXRvbW1ubGpsdndta25tb21nb3p1amZqb25rd+7p7vTs6fD5/PDq7Pb06+70fHj9/f94enpwcmtveHZyam1zc25ufPl3Z2ZrbGhlZ21sZ2BnamtrcPfs5+no4uTm7Ovl3t/n5+Lk6vDr5+jt+/Pv9316/f98c3b9fXx5/vj2fnB2/H1ya29wbWJfZGZnZGr++31zdvb6/vrv5efv7+zs83x79/Dz8/f09X5ub3VydnF1fHt3dHn8fm1mbGxmXmFkYl1bXWFmZ2x97ejq6+Xj4uXi3dzc3+Df3+Ls6eLl6/Lt6/R3cP7/cW1wdG9vaG1xdXpvff55cWxsaGZjYGVrc3Fz/O/0enrw7vHy6ubl5+7t7fT9evf3+fx+/XNrZWdsa2xudXz0+3j68/H+ent+dWdjZGJfXl5kaWZndfn4+frt6+no6+Xj5Ofm5OXm6+nj5OPp6+js9Xz+9vx8evn09Xp78fL5fvv9eWtmZV9gXl1iaGhpbHF4enZ0fvDs7erh4efs6+jm7/Tr7O/v9fv9dWtrbW1uanB5d3dwfPj79Xt4eG5lXl5dXVxeY2dpZW58fvf76+fk4uff3t7j5eHi4OLi5urp8PPx+H5wdv59eHR3fHx4cP709fz68n1vZ2hnY2RiaW5xcHB+fP79+u3s7fDr5unq9Pbz9/n9+PL1fHV6eG9rbW5ucHF2+/v3/PLs6uv38Pd0amRoZmNgXmJiYl9kbGxqa37t6+zu6ejp6u/l4uTl5ODk5Ors6/L2fvn5//h5fe/39O707+r4+/B4cWRgY19fXF5gYmRha3Nwc3v16+fr6OLm6Ozr6Ons9u7r8fd8+vh6cm5xcHZvb3l7/Hl5+H5+dn5tbm5lZl9jYV1kZGBiZW1ucHXz6+7o5+bg5ebl4N/e4+jn7ev29X7+fmxueHJ8cHX7+X797fPv8Pfw/Xhwbm9sZmBkZmdqanN0cXh4+/Ps7PDr6+nw+Ozz9/347vn+d//9eXdtfH5+eXzt8u3w7+rz9fv+fHVyamlsaGNfX1xdXV1mZWZrbH307/Ht6enq6uPg4+Lf3uLj5u3p7u72d/Z++f727vDs9PLt8vV6/XltaWVmYl5dXWBdYGNqcHF8efbs6unt5ePk5enj5O709evt9Pv+8HZwbnX+bnd4/fR9+P74fv5+bnZtbGxqb2psYmVmY2Vkb3p6d3f57u/x7OTn5+zr5Onl5+jm7ez69fxzdXL/eXr2+e7s6/Dx6+zx/Pn2fX1vcG5lYl5kYGBpZ3Vwd3x88vXz8fTu7fD28O709n7v9P38efz3fXx67nPz5vDjeuzv9er+em11bm5rZGtrZmBcYGBdX2VvaW1tfvz49Pnk6OLn7Obi3+Ll3uPm6e7r9Pt1/fT27vLs7uzu8ejv+3BuZnZxa2ljYl1bXV1hY2dveHn/9u/t7PLs4ufm5+rn6Ovy7Obq9Xv8/nl4cPn6fX16+Ph6eHv8d25oZ2tlaWdpbmllX2Nmbmxr9/P5/vzs7fL06+fr7O7p5ujs6+nt8vp8+nl1dHL3+/P48uzv7PPs6/H4eXl6dnN1eG5pZWFmZWZobnx5fXd5+X5+dX36/vt89/Ly8vnt7PT8+/X6fH7y6u3x8Orj6fP17fR5dGxwbm5qaWpiYVxdYl5fYmtzbWtrdf56efzr6+7r6uLh4+Lg3+bq7Ojs+fD07+rs7fDs6+zy+O75cmtma2dlZmdnYV9fZGRka292eHZ6evf08Pbu6ezq7ujj5uXn4uLm6/fx/nZ5ePj7eHR3/3hxcXV5bmxqbHFua2lqamhmaG9wdHR3+3x5dXn0+Pnx6uju7u7q6Ozt7Ort8/p++nl6e3v0+vj29fHz8vbt6/X4e/b3d3Rz/nJvbWxxaWtqaW1oa2tvcGxva3R1d/z98Ozt7urj5eru7ez09/Po5uro6uvw+vX88/d7enN2aWZjYGNeXl5fZGBhYmdqbG5vfnV7/fbt7Ovq5eLj3+Pf3uLg5OPj6u3u7PD0+Xv0fXt6cHpyb2ppaWJkYWdoZ2hpbmtoaGdvam51efb28PDu6evq7Obh5uTn4+Xo7PHwfXdzc/52cXJzdXF1cHt3cXZqcG9qa2dsbWxqbndsbG90e3N7fv38ffb89u/19fT1+ff3+PL8+vv28PPx8+7t7/X78/H17u7q6uzv8PN8fHN0d29wbGxnZWNfYmBfYGBoa2xrb3x7fHr77e/s6ubi5OTk4uPl5OXk5ujq7+ru9PT09X16bW9wZ2NgX15dXltcW1xdX2dma2tuenr++u7q6+jo5N/g4uLf4eLj6OXm5unz8/l+eHZ+fHhz//53cWxwcGplY2pqaGZkZ2VlY2dsbG519/Dw7vDn6Ojp6+Xl6evr5+fp7u3v9vh3dHNwdHJ4e3l5e/13cXF1eHVya2p0cGtobG5pamhra297evzz+fn58vny+/ru9fL49PXs/vv08vP6+PPu9PT06u3s5+Ll5uDq6+ztdmxyb2xmZmhkYF5eYF9hZWlwdXdy/n76+/vt8uzr6uHj5Obm5eTo6efk6evt7/ju6+Hd53TvbGt9XmJfXmJeWV5faFxbX2NjcGxs93Hye+nucuTi5Ojk7O7v8OD09Ojg7u717e36eHjqePTvcf7re2t+dGllYW38Z2FvamBqYn7sd3jj4+fj6N/f7ezl6N/p49/f6+Pp8Ob9dubwd3xqeGtube35cOH9enZz9WhtbG1ceWdWbldoWmP4c35tdmzt93fvaf7qfXx263v/dn19fn7q9/jo7Xno53Hq5dzq5tvc7eba7H7+8Pv/bW9dYmFaZlRgaWxZY3dhZHD9WfPiZvbh6OIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGZiZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbwpAQCAtMCwwICsxLDE3IEBACis5NzUgMSAwCis5NzUgMSA2MDAwMDAKKzk3NSAxIDEyMDAwMDAKKzk3NSAxIDE4MDAwMDAKKzk3NSAxIDI0MDAwMDAKKzk3NSAxIDMwMDAwMDAKKzk3NSAxIDM2MDAwMDAKKzk3NSAxIDQyMDAwMDAKKzk3NSAxIDQ4MDAwMDAKKzk3NSAxIDU0MDAwMDAKKzk3NSAxIDYwMDAwMDAKKzk3NSAxIDY2MDAwMDAKKzk3NSAxIDcyMDAwMDAKKzk3NSAxIDc4MDAwMDAKKzk3NSAxIDg0MDAwMDAKKzk3NSAxIDkwMDAwMDAKKzUyMCAxIDk2MDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViZmNiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvCkBAIC0wLDAgKzEsMTIyIEBACisyNjM2MiAxIDAKKzEyMDIzIDAgODMzMzMKKzEwNjQ3IDAgMTY2NjY2CisxMDI2OSAwIDI1MDAwMAorMTEwNzYgMCAzMzMzMzMKKzExMTA0IDAgNDE2NjY2Cis1OTA5IDAgNTAwMDAwCis0MjkxIDAgNTgzMzMzCis1MTQ5IDAgNjY2NjY2Cis1MzUzIDAgNzUwMDAwCis1MTg1IDAgODMzMzMzCisyNzM2IDAgOTE2NjY2CisyMTU3NSAxIDEwMDAwMDAKKzIxOTYgMCAxMDgzMzMzCis0MzQwIDAgMTE2NjY2NgorMzEwOSAwIDEyNTAwMDAKKzQ0MTAgMCAxMzMzMzMzCisxNzMxIDAgMTQxNjY2NgorNDU1NyAwIDE1MDAwMDAKKzMzNzYgMCAxNTgzMzMzCisxMzUyIDAgMTY2NjY2NgorMjg0NCAwIDE3NTAwMDAKKzE3ODcgMCAxODMzMzMzCisxMDg4IDAgMTkxNjY2NgorMzY4NDMgMSAyMDAwMDAwCisyNTIwIDAgMjA4MzMzMworMzc0OSAwIDIxNjY2NjYKKzM3ODQgMCAyMjUwMDAwCiszNDAyIDAgMjMzMzMzMworMzc5NSAwIDI0MTY2NjYKKzIzNDUgMCAyNTAwMDAwCiszMTQyIDAgMjU4MzMzMworMjk0OCAwIDI2NjY2NjYKKzIwMTggMCAyNzUwMDAwCis1MTMzIDAgMjgzMzMzMworMjI3NiAwIDI5MTY2NjYKKzIzNDY4IDEgMzAwMDAwMAorMTUyMiAwIDMwODMzMzMKKzIyOTkgMCAzMTY2NjY2CiszMjczIDAgMzI1MDAwMAorMjYzMCAwIDMzMzMzMzMKKzI5MTUgMCAzNDE2NjY2CiszMDMyIDAgMzUwMDAwMAorMTg5MCAwIDM1ODMzMzMKKzM3MTggMCAzNjY2NjY2CisxOTkwIDAgMzc1MDAwMAorMzEzOSAwIDM4MzMzMzMKKzE4MDYgMCAzOTE2NjY2CisyMzIwOCAxIDQwMDAwMDAKKzE0MTkgMCA0MDgzMzMzCisyMjYzIDAgNDE2NjY2NgorMzEzMSAwIDQyNTAwMDAKKzI2NDUgMCA0MzMzMzMzCisxODgwIDAgNDQxNjY2NgorMjIzOSAwIDQ1MDAwMDAKKzM2MzcgMCA0NTgzMzMzCisxOTQxIDAgNDY2NjY2NgorMTU3NyAwIDQ3NTAwMDAKKzM3NzcgMCA0ODMzMzMzCisxODE2IDAgNDkxNjY2NgorMTk2MDEgMSA1MDAwMDAwCisxMTA0IDAgNTA4MzMzMworMjgwOCAwIDUxNjY2NjYKKzI0MTEgMCA1MjUwMDAwCisyMTU5IDAgNTMzMzMzMworMjQxMSAwIDU0MTY2NjYKKzI0MDggMCA1NTAwMDAwCisyMzg4IDAgNTU4MzMzMworMjQxOCAwIDU2NjY2NjYKKzE0ODEgMCA1NzUwMDAwCisxOTI2IDAgNTgzMzMzMworOTAyMiAxIDU5MTY2NjYKKzI5MiAwIDYwMDAwMDAKKzcwMSAwIDYwODMzMzMKKzc0NyAwIDYxNjY2NjYKKzIwNTkgMCA2MjUwMDAwCisxNjkzIDAgNjMzMzMzMworMjA3OCAwIDY0MTY2NjYKKzI5NzUgMCA2NTAwMDAwCisxMzE3IDAgNjU4MzMzMworMTc0MiAwIDY2NjY2NjYKKzEwMTkgMCA2NzUwMDAwCisxMDUzIDAgNjgzMzMzMworMTQxODMgMSA2OTE2NjY2CisxNDY3IDAgNzAwMDAwMAorOTk0IDAgNzA4MzMzMworMTcwOSAwIDcxNjY2NjYKKzgzOCAwIDcyNTAwMDAKKzEzMjggMCA3MzMzMzMzCisyMjkyIDAgNzQxNjY2NgorMTgyOSAwIDc1MDAwMDAKKzE3MjggMCA3NTgzMzMzCisyNDM2IDAgNzY2NjY2NgorMTg1MiAwIDc3NTAwMDAKKzIxOTAgMCA3ODMzMzMzCisxNTE2NyAxIDc5MTY2NjYKKzExODggMCA4MDAwMDAwCisyMDcwIDAgODA4MzMzMworMzMxNiAwIDgxNjY2NjYKKzI2MzYgMCA4MjUwMDAwCis5NTAgMCA4MzMzMzMzCisxMjYwIDAgODQxNjY2NgorOTA2IDAgODUwMDAwMAorMTI5NCAwIDg1ODMzMzMKKzEyOTggMCA4NjY2NjY2CisxODk3IDAgODc1MDAwMAorMTM0OCAwIDg4MzMzMzMKKzEzMTk0IDEgODkxNjY2NgorMTA0MiAwIDkwMDAwMDAKKzEyNTggMCA5MDgzMzMzCisxNDU3IDAgOTE2NjY2NgorOTkwIDAgOTI1MDAwMAorOTAwIDAgOTMzMzMzMworOTYzIDAgOTQxNjY2NgorMzQ0OCAwIDk1MDAwMDAKKzc3NCAwIDk1ODMzMzMKKzEwNzUgMCA5NjY2NjY2Cis3NTAgMCA5NzUwMDAwCisxMDU0IDAgOTgzMzMzMworMTMxMzkgMSA5OTE2NjY2CiszMTA0IDAgMTAwMDAwMDAKKzMzNjYgMCAxMDA4MzMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyMzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM1N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MSBAQAorMTY5NSAzMiAwCisxOTM4IDEgMzMzMzMKKzQ3MSAwIDgzMzMzCisxNTMgMCA2NjY2NgorOTkgMCA1MDAwMAorNjU3IDAgMTUwMDAwCisyNjAgMCAxMTY2NjYKKzExNSAwIDEwMDAwMAorOTkgMCAxMzMzMzMKKzYyMiAwIDIxNjY2NgorMjExIDAgMTgzMzMzCis3OSAwIDE2NjY2NgorOTUgMCAyMDAwMDAKKzU5NyAwIDI4MzMzMworMjg4IDAgMjUwMDAwCisxNDUgMCAyMzMzMzMKKzE0NyAwIDI2NjY2NgorNjc2IDAgMzUwMDAwCisyODQgMCAzMTY2NjYKKzE0NCAwIDMwMDAwMAorMTMxIDAgMzMzMzMzCis2NTggMCA0MTY2NjYKKzI3MCAwIDM4MzMzMworMTAxIDAgMzY2NjY2CisxNTEgMCA0MDAwMDAKKzUyOSAwIDQ4MzMzMworMjU3IDAgNDUwMDAwCis5OCAwIDQzMzMzMworMTYwIDAgNDY2NjY2Cis2NjQgMCA1NjY2NjYKKzE4NiAwIDUzMzMzMworMTQ3IDAgNTAwMDAwCis2NyAwIDUxNjY2NgorNzggMCA1NTAwMDAKKzU3NSAwIDYzMzMzMworMjMwIDAgNjAwMDAwCisxMzQgMCA1ODMzMzMKKzExNCAwIDYxNjY2NgorNjI5IDAgNzAwMDAwCisyMjQgMCA2NjY2NjYKKzEzOCAwIDY1MDAwMAorMTI5IDAgNjgzMzMzCis2NDUgMCA3NTAwMDAKKzI2NCAwIDczMzMzMworMTQ1IDAgNzE2NjY2Cis3MDUgMCA4MTY2NjYKKzM2NSAwIDc4MzMzMworMTU2IDAgNzY2NjY2CisxNjAgMCA4MDAwMDAKKzcyNSAwIDg4MzMzMworMzMwIDAgODUwMDAwCisxMzggMCA4MzMzMzMKKzE2MiAwIDg2NjY2NgorNjM4IDAgOTUwMDAwCiszMzcgMCA5MTY2NjYKKzE3MCAwIDkwMDAwMAorMTMzIDAgOTMzMzMzCis0MzIgMCAxMDE2NjY2CisyODcgMCA5ODMzMzMKKzEzMCAwIDk2NjY2NgorMTM2IDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MWY3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTQ5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDIgQEAKKzEwNzUgMzIgMAorMTA3NSAzMiAwCis2ODYxMyAxIDY2Njg3CisxOTAyNSAwIDE5OTY4NworMjQwNSAwIDEzMzY4NworNzc3IDAgOTk2ODcKKzY4MSAwIDE2NjY4NworMjAyNTQgMCAzMzM2ODcKKzI5MjcgMCAyNjY2ODcKKzc2NiAwIDIzMzY4NworNjU4IDAgMjk5Njg3CisyMDc4NiAwIDQ2NjY4NworNDIxNCAwIDM5OTY4NworNjA5IDAgMzY2Njg3Cis2NjEgMCA0MzM2ODcKKzIwODM4IDAgNTk5Njg3Cis0MjA5IDAgNTMzNjg3Cis1MDYgMCA0OTk2ODcKKzU4NiAwIDU2NjY4NworMjA0MTUgMCA3MzM2ODcKKzQyMDcgMCA2NjY2ODcKKzQyNyAwIDYzMzY4NworNTE0IDAgNjk5Njg3CisyNDQ1NyAwIDg5OTY4NworMTkwNCAwIDgzMzY4NworOTIxIDAgNzY2Njg3Cis5OTIgMCA3OTk2ODcKKzU0MyAwIDg2NjY4NworMjQzNDIgMCAxMDY2Njg3CisxODIyIDAgOTk5Njg3Cis4NDAgMCA5MzM2ODcKKzg5MiAwIDk2NjY4NworNzE1IDAgMTAzMzY4NworMjI4OTMgMCAxMjMzNjg3CisxNjE4IDAgMTE2NjY4NworODgxIDAgMTA5OTY4NworODkwIDAgMTEzMzY4NworNzk0IDAgMTE5OTY4NworMjQyOTIgMCAxMzk5Njg3CisxNjczIDAgMTMzMzY4NworNzU1IDAgMTI2NjY4NworODEwIDAgMTI5OTY4NworNTg4IDAgMTM2NjY4NworMTk4MjggMCAxNTMzNjg3CisxNTM4IDAgMTQ2NjY4NworODk0IDAgMTQzMzY4NworOTMzIDAgMTQ5OTY4NworMTk4NTMgMCAxNjY2Njg3CisyMDExIDAgMTU5OTY4NworOTgxIDAgMTU2NjY4NworOTAwIDAgMTYzMzY4NworMjI4NjkgMCAxODMzNjg3CisxNTYyIDAgMTc2NjY4NworODQyIDAgMTY5OTY4NworNzY1IDAgMTczMzY4NworNjY1IDAgMTc5OTY4NworMjIzNDYgMCAxOTY2Njg3CisyMjQ1IDAgMTg5OTY4NworNTE2IDAgMTg2NjY4NworNjA0IDAgMTkzMzY4NworMjQzMzMgMCAyMDk5Njg3CisxNzY1IDAgMjAzMzY4NworMzE4IDAgMTk5OTY4NworMzIwIDAgMjA2NjY4NworMTg1NzcgMCAyMTk5Njg3CisxMTIzIDAgMjE2NjY4NworMzM3IDAgMjEzMzY4NworMTc1MDkgMCAyMjk5Njg3Cis4NjkgMCAyMjY2Njg3Cis5MDEgMCAyMjMzNjg3CisyMzM2NiAwIDI0MzM2ODcKKzEyMTcgMCAyMzY2Njg3CiszODAgMCAyMzMzNjg3CiszNDcgMCAyMzk5Njg3CisxOTU0MiAwIDI1MzM2ODcKKzE4ODcgMCAyNDk5Njg3Cis0NjcgMCAyNDY2Njg3CisxODkzOSAwIDI2NjY2ODcKKzI4NjMgMCAyNTk5Njg3CiszMTcgMCAyNTY2Njg3CisyNzIgMCAyNjMzNjg3CisxOTM1MyAwIDI3OTk2ODcKKzIwOTIgMCAyNzMzNjg3CisyMDMgMCAyNjk5Njg3CiszMTAgMCAyNzY2Njg3CisxODgwMCAwIDI5MzM2ODcKKzIwMzggMCAyODY2Njg3CisyNDIgMCAyODMzNjg3CisxOTkgMCAyODk5Njg3CisxNzQ1MiAwIDMwOTk2ODcKKzEwNjAgMCAzMDMzNjg3CiszMDEgMCAyOTY2Njg3Cis0NTIgMCAyOTk5Njg3CisyNTYgMCAzMDY2Njg3CisyMTM1MiAwIDMxOTk2ODcKKzQwOSAwIDMxNjY2ODcKKzE3MyAwIDMxMzM2ODcKKzE5MTQyIDAgMzI5OTY4NworNjQyIDAgMzI2NjY4NworNDY4IDAgMzIzMzY4NworMTkwNjYgMCAzNDMzNjg3Cis2MzUgMCAzMzY2Njg3CisxOTcgMCAzMzMzNjg3CisxOTAgMCAzMzk5Njg3CisxODgxMyAwIDM1NjY2ODcKKzk2OSAwIDM0OTk2ODcKKzE2NSAwIDM0NjY2ODcKKzIwMyAwIDM1MzM2ODcKKzE3MzYyIDAgMzczMzY4NworMjQ2IDAgMzY2NjY4NworMjM2IDAgMzU5OTY4NworMTc0IDAgMzYzMzY4NworMTY0IDAgMzY5OTY4NworMTcwODEgMCAzODk5Njg3CiszNTMgMCAzODMzNjg3CisyMjIgMCAzNzY2Njg3CisxODEgMCAzNzk5Njg3CisxNDggMCAzODY2Njg3CisxMDgzNSAwIDM5OTk2ODcKKzE4NSAwIDM5NjY2ODcKKzEzOSAwIDM5MzM2ODcKKzc1MTAgMCA0MTMzNjg3CisxNDkgMCA0MDY2Njg3CisxMjkgMCA0MDMzNjg3CisxMzIgMCA0MDk5Njg3CisxMDYzIDAgNDE2NjY4NworODA1IDAgNDI2NjY4NworMTU3IDAgNDIzMzY4NworMzk0IDAgNDE5OTY4NworOTA4NDAgMCA0Mzk5Njg3Cis2MTU5IDAgNDMzMzY4NworMTc1MiAwIDQyOTk2ODcKKzk4NSAwIDQzNjY2ODcKKzMxMzM4IDAgNDUzMzY4NworMzM5MCAwIDQ0NjY2ODcKKzc3MiAwIDQ0MzM2ODcKKzc4MSAwIDQ0OTk2ODcKKzMxMDg0IDAgNDY2NjY4NworMzQ5OCAwIDQ1OTk2ODcKKzgxOCAwIDQ1NjY2ODcKKzg4MSAwIDQ2MzM2ODcKKzMwNDE2IDAgNDc5OTY4NworMzI2NSAwIDQ3MzM2ODcKKzgxNSAwIDQ2OTk2ODcKKzc5MCAwIDQ3NjY2ODcKKzMxMDUzIDAgNDkzMzY4NworMzEwNiAwIDQ4NjY2ODcKKzcwOCAwIDQ4MzM2ODcKKzcxMyAwIDQ4OTk2ODcKKzMwMjMwIDAgNTA2NjY4NworMzIxNCAwIDQ5OTk2ODcKKzYzOSAwIDQ5NjY2ODcKKzc2OCAwIDUwMzM2ODcKKzI5NjU3IDAgNTE5OTY4NworMzAxMyAwIDUxMzM2ODcKKzYyMiAwIDUwOTk2ODcKKzcyMCAwIDUxNjY2ODcKKzI5MzQ0IDAgNTMzMzY4NworMzE5NiAwIDUyNjY2ODcKKzcxMyAwIDUyMzM2ODcKKzc3NSAwIDUyOTk2ODcKKzMwNDIwIDAgNTQ2NjY4NworMzM3NCAwIDUzOTk2ODcKKzgwMyAwIDUzNjY2ODcKKzcxNyAwIDU0MzM2ODcKKzI5OTYwIDAgNTU5OTY4NworMzI4MyAwIDU1MzM2ODcKKzc5MyAwIDU0OTk2ODcKKzc5MCAwIDU1NjY2ODcKKzMxMDExIDAgNTczMzY4NworMzM5NyAwIDU2NjY2ODcKKzgwOSAwIDU2MzM2ODcKKzgzMSAwIDU2OTk2ODcKKzMxMTk0IDAgNTg2NjY4NworMzQwMSAwIDU3OTk2ODcKKzgwNyAwIDU3NjY2ODcKKzgyNyAwIDU4MzM2ODcKKzMwMzI2IDAgNTk5OTY4NworMzE4NiAwIDU5MzM2ODcKKzgxOCAwIDU4OTk2ODcKKzg2MyAwIDU5NjY2ODcKKzMxNTU5IDAgNjEzMzY4NworMzM2NCAwIDYwNjY2ODcKKzg0MCAwIDYwMzM2ODcKKzkxOSAwIDYwOTk2ODcKKzMyMDEzIDAgNjI2NjY4NworMzQ5NSAwIDYxOTk2ODcKKzg3MSAwIDYxNjY2ODcKKzgwMyAwIDYyMzM2ODcKKzMwMjk0IDAgNjM5OTY4NworMzE1MyAwIDYzMzM2ODcKKzcxNiAwIDYyOTk2ODcKKzgxMiAwIDYzNjY2ODcKKzI5OTUyIDAgNjUzMzY4NworMzI5OSAwIDY0NjY2ODcKKzgwMSAwIDY0MzM2ODcKKzc0OSAwIDY0OTk2ODcKKzMwNTk4IDAgNjY2NjY4NworMzUzNiAwIDY1OTk2ODcKKzg4NyAwIDY1NjY2ODcKKzg1MCAwIDY2MzM2ODcKKzE3MjQ2IDAgNjY5OTY4NworMzExMTAgMCA2ODMzNjg3CiszMTk4IDAgNjc2NjY4NworODA5IDAgNjczMzY4NworODM2IDAgNjc5OTY4NworMjk3ODQgMCA2OTY2Njg3CiszMTU1IDAgNjg5OTY4NworODU5IDAgNjg2NjY4NworOTU4IDAgNjkzMzY4NworMzA2NjYgMCA3MDk5Njg3CiszMzcxIDAgNzAzMzY4NworODg2IDAgNjk5OTY4NworODYxIDAgNzA2NjY4NworMzA0MTYgMCA3MjMzNjg3CiszMzUwIDAgNzE2NjY4NworOTE3IDAgNzEzMzY4NworOTg3IDAgNzE5OTY4NworMjk1MDkgMCA3MzY2Njg3CiszNTc0IDAgNzI5OTY4NworOTcyIDAgNzI2NjY4NworODg1IDAgNzMzMzY4NworMzA4NzIgMCA3NDk5Njg3CiszMzk5IDAgNzQzMzY4NworODk4IDAgNzM5OTY4NworMTAyNyAwIDc0NjY2ODcKKzMxMTU1IDAgNzYzMzY4NworMzQ1NCAwIDc1NjY2ODcKKzk2NSAwIDc1MzM2ODcKKzg0MSAwIDc1OTk2ODcKKzI4NDg3IDAgNzc2NjY4NworMzYxNiAwIDc2OTk2ODcKKzkyMSAwIDc2NjY2ODcKKzk5MSAwIDc3MzM2ODcKKzIzMjA4IDAgNzg5OTY4NworMzU1MSAwIDc4MzM2ODcKKzkxOCAwIDc3OTk2ODcKKzg5NCAwIDc4NjY2ODcKKzE2OTgyIDAgODAzMzY4NworMzQ1OCAwIDc5NjY2ODcKKzg0NCAwIDc5MzM2ODcKKzk0MyAwIDc5OTk2ODcKKzMwMzk2IDAgODE5OTY4NworNDk2MyAwIDgxMzM2ODcKKzE0MTYgMCA4MDY2Njg3CisxNjM5IDAgODA5OTY4NworNTI0IDAgODE2NjY4NworMTM2OCAwIDgyOTk2ODcKKzU2NSAwIDgyNjY2ODcKKzM5MiAwIDgyMzM2ODcKKzQxMzE3IDEgODM5OTY4NworMTg1IDAgODM2NjY4NworNDc3IDAgODMzMzY4NworNTM0MiAwIDg1MzM2ODcKKzEyNzUgMCA4NDY2Njg3CisxMjEgMCA4NDMzNjg3Cis5ODIgMCA4NDk5Njg3Cis2NDY1IDAgODY5OTY4NworMjYwNiAwIDg2MzM2ODcKKzExNjMgMCA4NTY2Njg3Cis5NDMgMCA4NTk5Njg3CisxMTg2IDAgODY2NjY4NworMTE1OTMgMCA4ODMzNjg3CiszMTIyIDAgODc2NjY4NworMTI3OCAwIDg3MzM2ODcKKzE1OTMgMCA4Nzk5Njg3Cis5MDk5IDAgODk5OTY4NworOTc4IDAgODkzMzY4NworNzQ4IDAgODg2NjY4NworODM1IDAgODg5OTY4NworMzY0IDAgODk2NjY4NworNDc5OSAwIDkwOTk2ODcKKzM2NSAwIDkwNjY2ODcKKzIxNSAwIDkwMzM2ODcKKzQzNjcgMCA5MTk5Njg3CiszMDIgMCA5MTY2Njg3Cis0ODAgMCA5MTMzNjg3Cis2MTgwIDAgOTMzMzY4NworNzcxIDAgOTI2NjY4NworMjQ2IDAgOTIzMzY4NworMjgxIDAgOTI5OTY4NworNDYzNiAwIDkzOTk2ODcKKzIxMSAwIDkzNjY2ODcKKzQwMzcgMCA5NDk5Njg3CiszODIgMCA5NDY2Njg3Cis0ODYgMCA5NDMzNjg3CiszOTc1IDAgOTU5OTY4NworMzEyIDAgOTU2NjY4NworNDc0IDAgOTUzMzY4NworNjg4MCAwIDk3MzM2ODcKKzExMTYgMCA5NjY2Njg3CisyMDYgMCA5NjMzNjg3Cis2OTggMCA5Njk5Njg3Cis2MjU0IDAgOTg5OTY4NworMjU4MSAwIDk4MzM2ODcKKzEzMDMgMCA5NzY2Njg3Cis5ODUgMCA5Nzk5Njg3Cis5NjcgMCA5ODY2Njg3Cis2NDg2IDAgMTAwMzM2ODcKKzM1NTUgMCA5OTY2Njg3CisxNDMwIDAgOTkzMzY4NworMTYwNSAwIDk5OTk2ODcKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYmZkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDE0IEBACis1NzYgMSAwCis1NzYgMSAyNDAwMAorNTc2IDEgNDgwMDAKKzU3NiAxIDcyMDAwCis1NzYgMSA5NjAwMAorNTc2IDEgMTIwMDAwCis1NzYgMSAxNDQwMDAKKzU3NiAxIDE2ODAwMAorNTc2IDEgMTkyMDAwCis1NzYgMSAyMTYwMDAKKzU3NiAxIDI0MDAwMAorNTc2IDEgMjY0MDAwCis1NzYgMSAyODgwMDAKKzU3NiAxIDMxMjAwMAorNTc2IDEgMzM2MDAwCis1NzYgMSAzNjAwMDAKKzU3NiAxIDM4NDAwMAorNTc2IDEgNDA4MDAwCis1NzYgMSA0MzIwMDAKKzU3NiAxIDQ1NjAwMAorNTc2IDEgNDgwMDAwCis1NzYgMSA1MDQwMDAKKzU3NiAxIDUyODAwMAorNTc2IDEgNTUyMDAwCis1NzYgMSA1NzYwMDAKKzU3NiAxIDYwMDAwMAorNTc2IDEgNjI0MDAwCis1NzYgMSA2NDgwMDAKKzU3NiAxIDY3MjAwMAorNTc2IDEgNjk2MDAwCis1NzYgMSA3MjAwMDAKKzU3NiAxIDc0NDAwMAorNTc2IDEgNzY4MDAwCis1NzYgMSA3OTIwMDAKKzU3NiAxIDgxNjAwMAorNTc2IDEgODQwMDAwCis1NzYgMSA4NjQwMDAKKzU3NiAxIDg4ODAwMAorNTc2IDEgOTEyMDAwCis1NzYgMSA5MzYwMDAKKzU3NiAxIDk2MDAwMAorNTc2IDEgOTg0MDAwCis1NzYgMSAxMDA4MDAwCis1NzYgMSAxMDMyMDAwCis1NzYgMSAxMDU2MDAwCis1NzYgMSAxMDgwMDAwCis1NzYgMSAxMTA0MDAwCis1NzYgMSAxMTI4MDAwCis1NzYgMSAxMTUyMDAwCis1NzYgMSAxMTc2MDAwCis1NzYgMSAxMjAwMDAwCis1NzYgMSAxMjI0MDAwCis1NzYgMSAxMjQ4MDAwCis1NzYgMSAxMjcyMDAwCis1NzYgMSAxMjk2MDAwCis1NzYgMSAxMzIwMDAwCis1NzYgMSAxMzQ0MDAwCis1NzYgMSAxMzY4MDAwCis1NzYgMSAxMzkyMDAwCis1NzYgMSAxNDE2MDAwCis1NzYgMSAxNDQwMDAwCis1NzYgMSAxNDY0MDAwCis1NzYgMSAxNDg4MDAwCis1NzYgMSAxNTEyMDAwCis1NzYgMSAxNTM2MDAwCis1NzYgMSAxNTYwMDAwCis1NzYgMSAxNTg0MDAwCis1NzYgMSAxNjA4MDAwCis1NzYgMSAxNjMyMDAwCis1NzYgMSAxNjU2MDAwCis1NzYgMSAxNjgwMDAwCis1NzYgMSAxNzA0MDAwCis1NzYgMSAxNzI4MDAwCis1NzYgMSAxNzUyMDAwCis1NzYgMSAxNzc2MDAwCis1NzYgMSAxODAwMDAwCis1NzYgMSAxODI0MDAwCis1NzYgMSAxODQ4MDAwCis1NzYgMSAxODcyMDAwCis1NzYgMSAxODk2MDAwCis1NzYgMSAxOTIwMDAwCis1NzYgMSAxOTQ0MDAwCis1NzYgMSAxOTY4MDAwCis1NzYgMSAxOTkyMDAwCis1NzYgMSAyMDE2MDAwCis1NzYgMSAyMDQwMDAwCis1NzYgMSAyMDY0MDAwCis1NzYgMSAyMDg4MDAwCis1NzYgMSAyMTEyMDAwCis1NzYgMSAyMTM2MDAwCis1NzYgMSAyMTYwMDAwCis1NzYgMSAyMTg0MDAwCis1NzYgMSAyMjA4MDAwCis1NzYgMSAyMjMyMDAwCis1NzYgMSAyMjU2MDAwCis1NzYgMSAyMjgwMDAwCis1NzYgMSAyMzA0MDAwCis1NzYgMSAyMzI4MDAwCis1NzYgMSAyMzUyMDAwCis1NzYgMSAyMzc2MDAwCis1NzYgMSAyNDAwMDAwCis1NzYgMSAyNDI0MDAwCis1NzYgMSAyNDQ4MDAwCis1NzYgMSAyNDcyMDAwCis1NzYgMSAyNDk2MDAwCis1NzYgMSAyNTIwMDAwCis1NzYgMSAyNTQ0MDAwCis1NzYgMSAyNTY4MDAwCis1NzYgMSAyNTkyMDAwCis1NzYgMSAyNjE2MDAwCis1NzYgMSAyNjQwMDAwCis1NzYgMSAyNjY0MDAwCis1NzYgMSAyNjg4MDAwCis1NzYgMSAyNzEyMDAwCis1NzYgMSAyNzM2MDAwCis1NzYgMSAyNzYwMDAwCis1NzYgMSAyNzg0MDAwCis1NzYgMSAyODA4MDAwCis1NzYgMSAyODMyMDAwCis1NzYgMSAyODU2MDAwCis1NzYgMSAyODgwMDAwCis1NzYgMSAyOTA0MDAwCis1NzYgMSAyOTI4MDAwCis1NzYgMSAyOTUyMDAwCis1NzYgMSAyOTc2MDAwCis1NzYgMSAzMDAwMDAwCis1NzYgMSAzMDI0MDAwCis1NzYgMSAzMDQ4MDAwCis1NzYgMSAzMDcyMDAwCis1NzYgMSAzMDk2MDAwCis1NzYgMSAzMTIwMDAwCis1NzYgMSAzMTQ0MDAwCis1NzYgMSAzMTY4MDAwCis1NzYgMSAzMTkyMDAwCis1NzYgMSAzMjE2MDAwCis1NzYgMSAzMjQwMDAwCis1NzYgMSAzMjY0MDAwCis1NzYgMSAzMjg4MDAwCis1NzYgMSAzMzEyMDAwCis1NzYgMSAzMzM2MDAwCis1NzYgMSAzMzYwMDAwCis1NzYgMSAzMzg0MDAwCis1NzYgMSAzNDA4MDAwCis1NzYgMSAzNDMyMDAwCis1NzYgMSAzNDU2MDAwCis1NzYgMSAzNDgwMDAwCis1NzYgMSAzNTA0MDAwCis1NzYgMSAzNTI4MDAwCis1NzYgMSAzNTUyMDAwCis1NzYgMSAzNTc2MDAwCis1NzYgMSAzNjAwMDAwCis1NzYgMSAzNjI0MDAwCis1NzYgMSAzNjQ4MDAwCis1NzYgMSAzNjcyMDAwCis1NzYgMSAzNjk2MDAwCis1NzYgMSAzNzIwMDAwCis1NzYgMSAzNzQ0MDAwCis1NzYgMSAzNzY4MDAwCis1NzYgMSAzNzkyMDAwCis1NzYgMSAzODE2MDAwCis1NzYgMSAzODQwMDAwCis1NzYgMSAzODY0MDAwCis1NzYgMSAzODg4MDAwCis1NzYgMSAzOTEyMDAwCis1NzYgMSAzOTM2MDAwCis1NzYgMSAzOTYwMDAwCis1NzYgMSAzOTg0MDAwCis1NzYgMSA0MDA4MDAwCis1NzYgMSA0MDMyMDAwCis1NzYgMSA0MDU2MDAwCis1NzYgMSA0MDgwMDAwCis1NzYgMSA0MTA0MDAwCis1NzYgMSA0MTI4MDAwCis1NzYgMSA0MTUyMDAwCis1NzYgMSA0MTc2MDAwCis1NzYgMSA0MjAwMDAwCis1NzYgMSA0MjI0MDAwCis1NzYgMSA0MjQ4MDAwCis1NzYgMSA0MjcyMDAwCis1NzYgMSA0Mjk2MDAwCis1NzYgMSA0MzIwMDAwCis1NzYgMSA0MzQ0MDAwCis1NzYgMSA0MzY4MDAwCis1NzYgMSA0MzkyMDAwCis1NzYgMSA0NDE2MDAwCis1NzYgMSA0NDQwMDAwCis1NzYgMSA0NDY0MDAwCis1NzYgMSA0NDg4MDAwCis1NzYgMSA0NTEyMDAwCis1NzYgMSA0NTM2MDAwCis1NzYgMSA0NTYwMDAwCis1NzYgMSA0NTg0MDAwCis1NzYgMSA0NjA4MDAwCis1NzYgMSA0NjMyMDAwCis1NzYgMSA0NjU2MDAwCis1NzYgMSA0NjgwMDAwCis1NzYgMSA0NzA0MDAwCis1NzYgMSA0NzI4MDAwCis1NzYgMSA0NzUyMDAwCis1NzYgMSA0Nzc2MDAwCis1NzYgMSA0ODAwMDAwCis1NzYgMSA0ODI0MDAwCis1NzYgMSA0ODQ4MDAwCis1NzYgMSA0ODcyMDAwCis1NzYgMSA0ODk2MDAwCis1NzYgMSA0OTIwMDAwCis1NzYgMSA0OTQ0MDAwCis1NzYgMSA0OTY4MDAwCis1NzYgMSA0OTkyMDAwCis1NzYgMSA1MDE2MDAwCis1NzYgMSA1MDQwMDAwCis1NzYgMSA1MDY0MDAwCis1NzYgMSA1MDg4MDAwCis1NzYgMSA1MTEyMDAwCis1NzYgMSA1MTM2MDAwCis1NzYgMSA1MTYwMDAwCis1NzYgMSA1MTg0MDAwCis1NzYgMSA1MjA4MDAwCis1NzYgMSA1MjMyMDAwCis1NzYgMSA1MjU2MDAwCis1NzYgMSA1MjgwMDAwCis1NzYgMSA1MzA0MDAwCis1NzYgMSA1MzI4MDAwCis1NzYgMSA1MzUyMDAwCis1NzYgMSA1Mzc2MDAwCis1NzYgMSA1NDAwMDAwCis1NzYgMSA1NDI0MDAwCis1NzYgMSA1NDQ4MDAwCis1NzYgMSA1NDcyMDAwCis1NzYgMSA1NDk2MDAwCis1NzYgMSA1NTIwMDAwCis1NzYgMSA1NTQ0MDAwCis1NzYgMSA1NTY4MDAwCis1NzYgMSA1NTkyMDAwCis1NzYgMSA1NjE2MDAwCis1NzYgMSA1NjQwMDAwCis1NzYgMSA1NjY0MDAwCis1NzYgMSA1Njg4MDAwCis1NzYgMSA1NzEyMDAwCis1NzYgMSA1NzM2MDAwCis1NzYgMSA1NzYwMDAwCis1NzYgMSA1Nzg0MDAwCis1NzYgMSA1ODA4MDAwCis1NzYgMSA1ODMyMDAwCis1NzYgMSA1ODU2MDAwCis1NzYgMSA1ODgwMDAwCis1NzYgMSA1OTA0MDAwCis1NzYgMSA1OTI4MDAwCis1NzYgMSA1OTUyMDAwCis1NzYgMSA1OTc2MDAwCis1NzYgMSA2MDAwMDAwCis1NzYgMSA2MDI0MDAwCis1NzYgMSA2MDQ4MDAwCis1NzYgMSA2MDcyMDAwCis1NzYgMSA2MDk2MDAwCis1NzYgMSA2MTIwMDAwCis1NzYgMSA2MTQ0MDAwCis1NzYgMSA2MTY4MDAwCis1NzYgMSA2MTkyMDAwCis1NzYgMSA2MjE2MDAwCis1NzYgMSA2MjQwMDAwCis1NzYgMSA2MjY0MDAwCis1NzYgMSA2Mjg4MDAwCis1NzYgMSA2MzEyMDAwCis1NzYgMSA2MzM2MDAwCis1NzYgMSA2MzYwMDAwCis1NzYgMSA2Mzg0MDAwCis1NzYgMSA2NDA4MDAwCis1NzYgMSA2NDMyMDAwCis1NzYgMSA2NDU2MDAwCis1NzYgMSA2NDgwMDAwCis1NzYgMSA2NTA0MDAwCis1NzYgMSA2NTI4MDAwCis1NzYgMSA2NTUyMDAwCis1NzYgMSA2NTc2MDAwCis1NzYgMSA2NjAwMDAwCis1NzYgMSA2NjI0MDAwCis1NzYgMSA2NjQ4MDAwCis1NzYgMSA2NjcyMDAwCis1NzYgMSA2Njk2MDAwCis1NzYgMSA2NzIwMDAwCis1NzYgMSA2NzQ0MDAwCis1NzYgMSA2NzY4MDAwCis1NzYgMSA2NzkyMDAwCis1NzYgMSA2ODE2MDAwCis1NzYgMSA2ODQwMDAwCis1NzYgMSA2ODY0MDAwCis1NzYgMSA2ODg4MDAwCis1NzYgMSA2OTEyMDAwCis1NzYgMSA2OTM2MDAwCis1NzYgMSA2OTYwMDAwCis1NzYgMSA2OTg0MDAwCis1NzYgMSA3MDA4MDAwCis1NzYgMSA3MDMyMDAwCis1NzYgMSA3MDU2MDAwCis1NzYgMSA3MDgwMDAwCis1NzYgMSA3MTA0MDAwCis1NzYgMSA3MTI4MDAwCis1NzYgMSA3MTUyMDAwCis1NzYgMSA3MTc2MDAwCis1NzYgMSA3MjAwMDAwCis1NzYgMSA3MjI0MDAwCis1NzYgMSA3MjQ4MDAwCis1NzYgMSA3MjcyMDAwCis1NzYgMSA3Mjk2MDAwCis1NzYgMSA3MzIwMDAwCis1NzYgMSA3MzQ0MDAwCis1NzYgMSA3MzY4MDAwCis1NzYgMSA3MzkyMDAwCis1NzYgMSA3NDE2MDAwCis1NzYgMSA3NDQwMDAwCis1NzYgMSA3NDY0MDAwCis1NzYgMSA3NDg4MDAwCis1NzYgMSA3NTEyMDAwCis1NzYgMSA3NTM2MDAwCis1NzYgMSA3NTYwMDAwCis1NzYgMSA3NTg0MDAwCis1NzYgMSA3NjA4MDAwCis1NzYgMSA3NjMyMDAwCis1NzYgMSA3NjU2MDAwCis1NzYgMSA3NjgwMDAwCis1NzYgMSA3NzA0MDAwCis1NzYgMSA3NzI4MDAwCis1NzYgMSA3NzUyMDAwCis1NzYgMSA3Nzc2MDAwCis1NzYgMSA3ODAwMDAwCis1NzYgMSA3ODI0MDAwCis1NzYgMSA3ODQ4MDAwCis1NzYgMSA3ODcyMDAwCis1NzYgMSA3ODk2MDAwCis1NzYgMSA3OTIwMDAwCis1NzYgMSA3OTQ0MDAwCis1NzYgMSA3OTY4MDAwCis1NzYgMSA3OTkyMDAwCis1NzYgMSA4MDE2MDAwCis1NzYgMSA4MDQwMDAwCis1NzYgMSA4MDY0MDAwCis1NzYgMSA4MDg4MDAwCis1NzYgMSA4MTEyMDAwCis1NzYgMSA4MTM2MDAwCis1NzYgMSA4MTYwMDAwCis1NzYgMSA4MTg0MDAwCis1NzYgMSA4MjA4MDAwCis1NzYgMSA4MjMyMDAwCis1NzYgMSA4MjU2MDAwCis1NzYgMSA4MjgwMDAwCis1NzYgMSA4MzA0MDAwCis1NzYgMSA4MzI4MDAwCis1NzYgMSA4MzUyMDAwCis1NzYgMSA4Mzc2MDAwCis1NzYgMSA4NDAwMDAwCis1NzYgMSA4NDI0MDAwCis1NzYgMSA4NDQ4MDAwCis1NzYgMSA4NDcyMDAwCis1NzYgMSA4NDk2MDAwCis1NzYgMSA4NTIwMDAwCis1NzYgMSA4NTQ0MDAwCis1NzYgMSA4NTY4MDAwCis1NzYgMSA4NTkyMDAwCis1NzYgMSA4NjE2MDAwCis1NzYgMSA4NjQwMDAwCis1NzYgMSA4NjY0MDAwCis1NzYgMSA4Njg4MDAwCis1NzYgMSA4NzEyMDAwCis1NzYgMSA4NzM2MDAwCis1NzYgMSA4NzYwMDAwCis1NzYgMSA4Nzg0MDAwCis1NzYgMSA4ODA4MDAwCis1NzYgMSA4ODMyMDAwCis1NzYgMSA4ODU2MDAwCis1NzYgMSA4ODgwMDAwCis1NzYgMSA4OTA0MDAwCis1NzYgMSA4OTI4MDAwCis1NzYgMSA4OTUyMDAwCis1NzYgMSA4OTc2MDAwCis1NzYgMSA5MDAwMDAwCis1NzYgMSA5MDI0MDAwCis1NzYgMSA5MDQ4MDAwCis1NzYgMSA5MDcyMDAwCis1NzYgMSA5MDk2MDAwCis1NzYgMSA5MTIwMDAwCis1NzYgMSA5MTQ0MDAwCis1NzYgMSA5MTY4MDAwCis1NzYgMSA5MTkyMDAwCis1NzYgMSA5MjE2MDAwCis1NzYgMSA5MjQwMDAwCis1NzYgMSA5MjY0MDAwCis1NzYgMSA5Mjg4MDAwCis1NzYgMSA5MzEyMDAwCis1NzYgMSA5MzM2MDAwCis1NzYgMSA5MzYwMDAwCis1NzYgMSA5Mzg0MDAwCis1NzYgMSA5NDA4MDAwCis1NzYgMSA5NDMyMDAwCis1NzYgMSA5NDU2MDAwCis1NzYgMSA5NDgwMDAwCis1NzYgMSA5NTA0MDAwCis1NzYgMSA5NTI4MDAwCis1NzYgMSA5NTUyMDAwCis1NzYgMSA5NTc2MDAwCis1NzYgMSA5NjAwMDAwCis1NzYgMSA5NjI0MDAwCis1NzYgMSA5NjQ4MDAwCis1NzYgMSA5NjcyMDAwCis1NzYgMSA5Njk2MDAwCis1NzYgMSA5NzIwMDAwCis1NzYgMSA5NzQ0MDAwCis1NzYgMSA5NzY4MDAwCis1NzYgMSA5NzkyMDAwCis1NzYgMSA5ODE2MDAwCis1NzYgMSA5ODQwMDAwCis1NzYgMSA5ODY0MDAwCis1NzYgMSA5ODg4MDAwCis1NzYgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODNhNDQxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDA2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8KQEAgLTAsMCArMSwyNDkgQEAKKzY0NTggMSA0MDAwMAorNDA0MCAwIDgwMDAwCiszMjU1IDAgMTIwMDAwCiszMDI2IDAgMTYwMDAwCiszMjkzIDAgMjAwMDAwCiszMDg5IDAgMjQwMDAwCiszMzA1IDAgMjgwMDAwCisxNzk0IDAgMzIwMDAwCisxODQ4IDAgMzYwMDAwCisxMjg4IDAgNDAwMDAwCisxNTExIDAgNDQwMDAwCisxNTI3IDAgNDgwMDAwCis2MTQ2IDEgNTIwMDAwCisxMjQzIDAgNTYwMDAwCisxMDk5IDAgNjAwMDAwCisxMzU0IDAgNjQwMDAwCisxMzY2IDAgNjgwMDAwCisxMDQyIDAgNzIwMDAwCisxNjAwIDAgNzYwMDAwCis4NzUgMCA4MDAwMDAKKzE3MjggMCA4NDAwMDAKKzEyNTQgMCA4ODAwMDAKKzk5NCAwIDkyMDAwMAorMTU5MSAwIDk2MDAwMAorNjI2NSAxIDEwMDAwMDAKKzEwMTggMCAxMDQwMDAwCis4MjUgMCAxMDgwMDAwCis4NjkgMCAxMTIwMDAwCis5MjEgMCAxMTYwMDAwCis5NzUgMCAxMjAwMDAwCis5MjQgMCAxMjQwMDAwCis4MzQgMCAxMjgwMDAwCisxMDY2IDAgMTMyMDAwMAorNzkzIDAgMTM2MDAwMAorODg5IDAgMTQwMDAwMAorMjA1MCAwIDE0NDAwMDAKKzYyNzYgMSAxNDgwMDAwCis4ODEgMCAxNTIwMDAwCisyNjAgMCAxNTYwMDAwCis3MzAgMCAxNjAwMDAwCis0MzEgMCAxNjQwMDAwCiszNTEgMCAxNjgwMDAwCiszMjEgMCAxNzIwMDAwCiszODAyIDAgMTc2MDAwMAorMTQ2IDAgMTgwMDAwMAorNjQ2MiAwIDE4NDAwMDAKKzMyNDYgMCAxODgwMDAwCis1MzMgMCAxOTIwMDAwCis2MjMxIDEgMTk2MDAwMAorMTM3OCAwIDIwMDAwMDAKKzcxOSAwIDIwNDAwMDAKKzgxOCAwIDIwODAwMDAKKzg1NiAwIDIxMjAwMDAKKzkzNyAwIDIxNjAwMDAKKzYxMSAwIDIyMDAwMDAKKzMwMzEgMCAyMjQwMDAwCisxMDQxIDAgMjI4MDAwMAorNjA0IDAgMjMyMDAwMAorNzE0IDAgMjM2MDAwMAorMTI4MyAwIDI0MDAwMDAKKzc1NjUgMSAyNDQwMDAwCis2MDIgMCAyNDgwMDAwCis1MzAgMCAyNTIwMDAwCisyNTc5IDAgMjU2MDAwMAorMTE1IDAgMjYwMDAwMAorMTA1OCAwIDI2NDAwMDAKKzY4OSAwIDI2ODAwMDAKKzExMTkgMCAyNzIwMDAwCis2OTggMCAyNzYwMDAwCisxMDA2IDAgMjgwMDAwMAorNTQ1IDAgMjg0MDAwMAorMTYxNyAwIDI4ODAwMDAKKzkxMjMgMSAyOTIwMDAwCis1MjcgMCAyOTYwMDAwCisxNTc2IDAgMzAwMDAwMAorNDY1IDAgMzA0MDAwMAorNzQxIDAgMzA4MDAwMAorNTIxIDAgMzEyMDAwMAorMTMyMiAwIDMxNjAwMDAKKzc3NSAwIDMyMDAwMDAKKzg2MyAwIDMyNDAwMDAKKzkxMCAwIDMyODAwMDAKKzkxNSAwIDMzMjAwMDAKKzkyNiAwIDMzNjAwMDAKKzc1NTYgMSAzNDAwMDAwCis3NDEgMCAzNDQwMDAwCis1MjcgMCAzNDgwMDAwCisyNTE2IDAgMzUyMDAwMAorNDU5IDAgMzU2MDAwMAorNDA0IDAgMzYwMDAwMAorNTA5IDAgMzY0MDAwMAorMTIyNyAwIDM2ODAwMDAKKzE1NjEgMCAzNzIwMDAwCis0OTAgMCAzNzYwMDAwCis3MTIgMCAzODAwMDAwCis4MDMgMCAzODQwMDAwCis3NTI0IDEgMzg4MDAwMAorNzMwIDAgMzkyMDAwMAorNDYxIDAgMzk2MDAwMAorMjUyNiAwIDQwMDAwMDAKKzQ1MyAwIDQwNDAwMDAKKzYzMiAwIDQwODAwMDAKKzc4MyAwIDQxMjAwMDAKKzg0MyAwIDQxNjAwMDAKKzkxOCAwIDQyMDAwMDAKKzk2MSAwIDQyNDAwMDAKKzk0OCAwIDQyODAwMDAKKzk1OSAwIDQzMjAwMDAKKzc1OTggMSA0MzYwMDAwCis2NzggMCA0NDAwMDAwCis1NjkgMCA0NDQwMDAwCis4OTMgMCA0NDgwMDAwCis2MjQgMCA0NTIwMDAwCis3NTUgMCA0NTYwMDAwCisyMjM0IDAgNDYwMDAwMAorNTU2IDAgNDY0MDAwMAorOTQ0IDAgNDY4MDAwMAorNzM5IDAgNDcyMDAwMAorODYyIDAgNDc2MDAwMAorOTM4IDAgNDgwMDAwMAorNzU3NCAxIDQ4NDAwMDAKKzY5OSAwIDQ4ODAwMDAKKzcwMSAwIDQ5MjAwMDAKKzUzMCAwIDQ5NjAwMDAKKzY4OSAwIDUwMDAwMDAKKzc3OCAwIDUwNDAwMDAKKzg1NiAwIDUwODAwMDAKKzkzMCAwIDUxMjAwMDAKKzk3NSAwIDUxNjAwMDAKKzEwMjEgMCA1MjAwMDAwCisxMDc0IDAgNTI0MDAwMAorOTc4IDAgNTI4MDAwMAorODAyMSAxIDUzMjAwMDAKKzcwNCAwIDUzNjAwMDAKKzYxMCAwIDU0MDAwMDAKKzY5NyAwIDU0NDAwMDAKKzcxMSAwIDU0ODAwMDAKKzgyMCAwIDU1MjAwMDAKKzg0MyAwIDU1NjAwMDAKKzI1MSAwIDU2MDAwMDAKKzMzNjcgMCA1NjQwMDAwCis1MDcgMCA1NjgwMDAwCiszMTY4IDEgNTcyMDAwMAorNzc5IDAgNTc2MDAwMAorMzE2IDAgNTgwMDAwMAorNjM1IDAgNTg0MDAwMAorMjA0IDAgNTg4MDAwMAorOTc4IDAgNTkyMDAwMAorMTI3IDAgNTk2MDAwMAorNTg5IDAgNjAwMDAwMAorNjA0IDAgNjA0MDAwMAorNjY2IDAgNjA4MDAwMAorNTgyIDAgNjEyMDAwMAorNzI5IDAgNjE2MDAwMAorNDE1MiAxIDYyMDAwMDAKKzg1OCAwIDYyNDAwMDAKKzczOSAwIDYyODAwMDAKKzg4NSAwIDYzMjAwMDAKKzc0OSAwIDYzNjAwMDAKKzk1MCAwIDY0MDAwMDAKKzU5MyAwIDY0NDAwMDAKKzc3MSAwIDY0ODAwMDAKKzY3OCAwIDY1MjAwMDAKKzUyOSAwIDY1NjAwMDAKKzgzNSAwIDY2MDAwMDAKKzM5MSAwIDY2NDAwMDAKKzQ2OTIgMSA2NjgwMDAwCis0NzMgMCA2NzIwMDAwCis3MjQgMCA2NzYwMDAwCiszODEgMCA2ODAwMDAwCis5MDkgMCA2ODQwMDAwCiszOTQgMCA2ODgwMDAwCis2NTkgMCA2OTIwMDAwCiszNjcgMCA2OTYwMDAwCis2NTggMCA3MDAwMDAwCis1MjMgMCA3MDQwMDAwCis1NTQgMCA3MDgwMDAwCis1NTMgMCA3MTIwMDAwCis2MDgwIDEgNzE2MDAwMAorNDk2IDAgNzIwMDAwMAorNzYzIDAgNzI0MDAwMAorOTM5IDAgNzI4MDAwMAorNzE1IDAgNzMyMDAwMAorNjcyIDAgNzM2MDAwMAorNjE0IDAgNzQwMDAwMAorODExIDAgNzQ0MDAwMAorOTE2IDAgNzQ4MDAwMAorMTE1MyAwIDc1MjAwMDAKKzk0MCAwIDc1NjAwMDAKKzMyMiAwIDc2MDAwMDAKKzY2MTMgMSA3NjQwMDAwCis4NTEgMCA3NjgwMDAwCisxMDA3IDAgNzcyMDAwMAorNTIwIDAgNzc2MDAwMAorNDU2IDAgNzgwMDAwMAorNjM5IDAgNzg0MDAwMAorNzU4IDAgNzg4MDAwMAorODc5IDAgNzkyMDAwMAorMTE1MiAwIDc5NjAwMDAKKzEwNjEgMCA4MDAwMDAwCis5NDYgMCA4MDQwMDAwCis4NTkgMCA4MDgwMDAwCiszNjEwIDEgODEyMDAwMAorODcxIDAgODE2MDAwMAorNzQ2IDAgODIwMDAwMAorMzY3IDAgODI0MDAwMAorMzk3IDAgODI4MDAwMAorOTMwIDAgODMyMDAwMAorMzM3IDAgODM2MDAwMAorNDE4IDAgODQwMDAwMAorNzQwIDAgODQ0MDAwMAorNjM3IDAgODQ4MDAwMAorNjY2IDAgODUyMDAwMAorNjI3IDAgODU2MDAwMAorNDMzOCAxIDg2MDAwMDAKKzc0NSAwIDg2NDAwMDAKKzc4MyAwIDg2ODAwMDAKKzQ2NSAwIDg3MjAwMDAKKzQ2MCAwIDg3NjAwMDAKKzQ1NSAwIDg4MDAwMDAKKzUwNiAwIDg4NDAwMDAKKzQ5MiAwIDg4ODAwMDAKKzQ4NSAwIDg5MjAwMDAKKzUxNyAwIDg5NjAwMDAKKzUzNCAwIDkwMDAwMDAKKzM5NSAwIDkwNDAwMDAKKzU2MjYgMSA5MDgwMDAwCisxMTY5IDAgOTEyMDAwMAorNTY0IDAgOTE2MDAwMAorMjYxIDAgOTIwMDAwMAorMzI3IDAgOTI0MDAwMAorMzAzIDAgOTI4MDAwMAorMTE0NSAwIDkzMjAwMDAKKzI1NyAwIDkzNjAwMDAKKzQ5OCAwIDk0MDAwMDAKKzQ2NSAwIDk0NDAwMDAKKzQxNCAwIDk0ODAwMDAKKzU1MyAwIDk1MjAwMDAKKzU2MTcgMSA5NTYwMDAwCisxMDUyIDAgOTYwMDAwMAorNTkyIDAgOTY0MDAwMAorMzIzIDAgOTY4MDAwMAorNDk3IDAgOTcyMDAwMAorNDY3IDAgOTc2MDAwMAorNzA1IDAgOTgwMDAwMAorMTA4NiAwIDk4NDAwMDAKKzEyNTMgMCA5ODgwMDAwCisxMjUyIDAgOTkyMDAwMAorNzc2IDAgOTk2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY5MGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3Y2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorMTY2ODAgMSAxNjY2NgorMTcwMTcgMCAzMzMzMworMTA1MzQgMCA1MDAwMAorMTAyODkgMCA2NjY2NgorMzY5OCAwIDgzMzMzCisyNzc2IDAgMTAwMDAwCisxOTM2IDAgMTE2NjY2CisxNDkzIDAgMTMzMzMzCisxMjE3IDAgMTUwMDAwCis5OTMgMCAxNjY2NjYKKzgwNSAwIDE4MzMzMworODU3IDAgMjAwMDAwCis1MDgyIDEgMjE2NjY2Cis4MTIgMCAyMzMzMzMKKzcxOCAwIDI1MDAwMAorNzQ2IDAgMjY2NjY2Cis3NjIgMCAyODMzMzMKKzg2NSAwIDMwMDAwMAorNzgyIDAgMzE2NjY2Cis4MzMgMCAzMzMzMzMKKzc1MCAwIDM1MDAwMAorODE5IDAgMzY2NjY2Cis4MjYgMCAzODMzMzMKKzg0NiAwIDQwMDAwMAorNDUyMiAxIDQxNjY2NgorNjc4IDAgNDMzMzMzCis3MTggMCA0NTAwMDAKKzgwMyAwIDQ2NjY2NgorNzY5IDAgNDgzMzMzCis3NjIgMCA1MDAwMDAKKzU4NyAwIDUxNjY2NgorNjM1IDAgNTMzMzMzCis2NTggMCA1NTAwMDAKKzcxNCAwIDU2NjY2NgorNjc3IDAgNTgzMzMzCis2OTkgMCA2MDAwMDAKKzQ2MTYgMSA2MTY2NjYKKzgwMCAwIDYzMzMzMworODMxIDAgNjUwMDAwCis5MjggMCA2NjY2NjYKKzg2OSAwIDY4MzMzMworOTMxIDAgNzAwMDAwCis5MzAgMCA3MTY2NjYKKzk3NCAwIDczMzMzMworOTc4IDAgNzUwMDAwCis5MzIgMCA3NjY2NjYKKzkxOCAwIDc4MzMzMworOTc4IDAgODAwMDAwCis0NjU1IDEgODE2NjY2Cis4OTcgMCA4MzMzMzMKKzg5NiAwIDg1MDAwMAorODgzIDAgODY2NjY2Cis5NDkgMCA4ODMzMzMKKzk2NSAwIDkwMDAwMAorOTUxIDAgOTE2NjY2Cis5MDEgMCA5MzMzMzMKKzk2NSAwIDk1MDAwMAorOTU1IDAgOTY2NjY2Cis5NDggMCA5ODMzMzMKKzk2OCAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY3YzJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJhOWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMjQxIEBACis0NyAzMiAwCisyMTExNSAxIDAKKzE2NDU2IDAgMzMzMzMKKzExODgwIDAgNjY2NjYKKzEyMTU1IDAgMTAwMDAwCisxMTQwMiAwIDEzMzMzMworNTM0NSAwIDE2NjY2NgorMjk4NiAwIDIwMDAwMAorMTkyNCAwIDIzMzMzMworMjI3NSAwIDI2NjY2NgorMjc5MyAwIDMwMDAwMAorMjc1NiAwIDMzMzMzMworMjkzMyAwIDM2NjY2NgorMjExMDAgMSA0MDAwMDAKKzEzMDIgMCA0MzMzMzMKKzIyMDYgMCA0NjY2NjYKKzE1OTkgMCA1MDAwMDAKKzI1NTggMCA1MzMzMzMKKzI3ODQgMCA1NjY2NjYKKzI0NTggMCA2MDAwMDAKKzI0ODAgMCA2MzMzMzMKKzE0NDYgMCA2NjY2NjYKKzMxMDkgMCA3MDAwMDAKKzk0NCAwIDczMzMzMworMzEzNCAwIDc2NjY2NgorMjEzNDIgMSA4MDAwMDAKKzY1MiAwIDgzMzMzMworMTcwOCAwIDg2NjY2NgorMjIwMiAwIDkwMDAwMAorMTY5NSAwIDkzMzMzMworMTY2MSAwIDk2NjY2NgorMTY1MiAwIDEwMDAwMDAKKzE2NzkgMCAxMDMzMzMzCisxNjkwIDAgMTA2NjY2NgorMTgyNCAwIDExMDAwMDAKKzE4MDMgMCAxMTMzMzMzCisxNTk4IDAgMTE2NjY2NgorMjE1NDAgMSAxMjAwMDAwCisyMDUgMCAxMjMzMzMzCisxMTI0IDAgMTI2NjY2NgorMTA2OSAwIDEzMDAwMDAKKzgzOCAwIDEzMzMzMzMKKzc2NSAwIDEzNjY2NjYKKzQyNjUgMCAxNDAwMDAwCis5NCAwIDE0MzMzMzMKKzIwNDYzIDAgMTQ2NjY2NgorMTAyOCAwIDE1MDAwMDAKKzE0NzUgMCAxNTMzMzMzCiszNjMwIDAgMTU2NjY2NgorMjgzNzMgMSAxNjAwMDAwCis3MjUgMCAxNjMzMzMzCisxMTE5IDAgMTY2NjY2NgorMTQyNyAwIDE3MDAwMDAKKzE2NzkgMCAxNzMzMzMzCisxODY2IDAgMTc2NjY2NgorMTE5NyAwIDE4MDAwMDAKKzE1NzIgMCAxODMzMzMzCisxNjUxIDAgMTg2NjY2NgorMTY3OCAwIDE5MDAwMDAKKzE2ODggMCAxOTMzMzMzCisxNjU5IDAgMTk2NjY2NgorMTk5MDAgMSAyMDAwMDAwCis1ODQgMCAyMDMzMzMzCisxNDc1IDAgMjA2NjY2NgorMTY3OCAwIDIxMDAwMDAKKzEwMTAgMCAyMTMzMzMzCisxNDM1IDAgMjE2NjY2NgorMTYxMiAwIDIyMDAwMDAKKzE2MDIgMCAyMjMzMzMzCisxNzA5IDAgMjI2NjY2NgorMTczNyAwIDIzMDAwMDAKKzE4MzUgMCAyMzMzMzMzCis5MjYgMCAyMzY2NjY2CisyMDA5MCAxIDI0MDAwMDAKKzYzMSAwIDI0MzMzMzMKKzE1NzYgMCAyNDY2NjY2Cis5NDEgMCAyNTAwMDAwCisyMzQ5IDAgMjUzMzMzMworMTExMiAwIDI1NjY2NjYKKzE1NjYgMCAyNjAwMDAwCisxNzczIDAgMjYzMzMzMworOTc5IDAgMjY2NjY2NgorMjI0NiAwIDI3MDAwMDAKKzkwNCAwIDI3MzMzMzMKKzEzNDIgMCAyNzY2NjY2CisyMDE0NyAxIDI4MDAwMDAKKzYzMCAwIDI4MzMzMzMKKzk4MiAwIDI4NjY2NjYKKzIwODkgMCAyOTAwMDAwCisxMDIxIDAgMjkzMzMzMworMTUwNiAwIDI5NjY2NjYKKzE2NDIgMCAzMDAwMDAwCis5NjggMCAzMDMzMzMzCisxMjYyIDAgMzA2NjY2NgorMjI3MCAwIDMxMDAwMDAKKzg2NCAwIDMxMzMzMzMKKzEyNTIgMCAzMTY2NjY2CisyMDE0NSAxIDMyMDAwMDAKKzU5NSAwIDMyMzMzMzMKKzkxOCAwIDMyNjY2NjYKKzExNjcgMCAzMzAwMDAwCisxMzQ3IDAgMzMzMzMzMworMTU5NyAwIDMzNjY2NjYKKzE2MzYgMCAzNDAwMDAwCis5NDQgMCAzNDMzMzMzCisxMjk1IDAgMzQ2NjY2NgorMTM5NyAwIDM1MDAwMDAKKzE0MTMgMCAzNTMzMzMzCisxNDMyIDAgMzU2NjY2NgorMjAxODAgMSAzNjAwMDAwCis1MjUgMCAzNjMzMzMzCisxMDY4IDAgMzY2NjY2NgorMTIzMCAwIDM3MDAwMDAKKzE0MjggMCAzNzMzMzMzCis5MTYgMCAzNzY2NjY2CisxOTQ4IDAgMzgwMDAwMAorOTY2IDAgMzgzMzMzMworMTM0MiAwIDM4NjY2NjYKKzEzMzggMCAzOTAwMDAwCisxMzc5IDAgMzkzMzMzMworMTI5NiAwIDM5NjY2NjYKKzE3Mzc4IDEgNDAwMDAwMAorNTgzIDAgNDAzMzMzMworOTM2IDAgNDA2NjY2NgorMTc0NSAwIDQxMDAwMDAKKzk4NyAwIDQxMzMzMzMKKzEzOTMgMCA0MTY2NjY2CisxNDk1IDAgNDIwMDAwMAorODY5IDAgNDIzMzMzMworMTkzOCAwIDQyNjY2NjYKKzgyOCAwIDQzMDAwMDAKKzE4NTEgMCA0MzMzMzMzCis4MzQgMCA0MzY2NjY2CisxNzI4MCAxIDQ0MDAwMDAKKzU4MCAwIDQ0MzMzMzMKKzg2OSAwIDQ0NjY2NjYKKzE2MDUgMCA0NTAwMDAwCis4NDMgMCA0NTMzMzMzCis2MTQ3IDEgNDU2NjY2NgorMjIwIDAgNDYwMDAwMAorMTEwNiAwIDQ2MzMzMzMKKzM5NSAwIDQ2NjY2NjYKKzMwNCAwIDQ3MDAwMDAKKzE5NDYgMCA0NzMzMzMzCisxNTQgMCA0NzY2NjY2Cis0ODIgMCA0ODAwMDAwCis5NDkgMCA0ODMzMzMzCisxMDg4IDAgNDg2NjY2NgorOTc0IDAgNDkwMDAwMAorODc2IDAgNDkzMzMzMworOTE2NCAxIDQ5NjY2NjYKKzEwMTkgMCA1MDAwMDAwCis5ODMgMCA1MDMzMzMzCisxMzc1IDAgNTA2NjY2NgorMTA0MSAwIDUxMDAwMDAKKzc4OSAwIDUxMzMzMzMKKzEwMzcgMCA1MTY2NjY2Cis4MTIgMCA1MjAwMDAwCis3MzIgMCA1MjMzMzMzCis5NzIgMCA1MjY2NjY2Cis3MDggMCA1MzAwMDAwCis2MjMgMCA1MzMzMzMzCisxMDY2NyAxIDUzNjY2NjYKKzQ2MyAwIDU0MDAwMDAKKzkxMSAwIDU0MzMzMzMKKzg2MSAwIDU0NjY2NjYKKzUwNyAwIDU1MDAwMDAKKzEwMTUgMCA1NTMzMzMzCis1MDEgMCA1NTY2NjY2Cis5MzQgMCA1NjAwMDAwCis4MTIgMCA1NjMzMzMzCis4NTUgMCA1NjY2NjY2Cis4MDQgMCA1NzAwMDAwCis3ODMgMCA1NzMzMzMzCisxMDYxMCAxIDU3NjY2NjYKKzk1MCAwIDU4MDAwMDAKKzEyOTIgMCA1ODMzMzMzCisxMDAyIDAgNTg2NjY2NgorNzI4IDAgNTkwMDAwMAorOTYwIDAgNTkzMzMzMworMTIzMCAwIDU5NjY2NjYKKzEzMTUgMCA2MDAwMDAwCisxMjQ4IDAgNjAzMzMzMworOTk1IDAgNjA2NjY2NgorMTQwMSAwIDYxMDAwMDAKKzkwNSAwIDYxMzMzMzMKKzkzMjYgMSA2MTY2NjY2Cis3MjYgMCA2MjAwMDAwCis2NjcgMCA2MjMzMzMzCis4MzMgMCA2MjY2NjY2CisxMDA3IDAgNjMwMDAwMAorMTE3MiAwIDYzMzMzMzMKKzE5MTAgMCA2MzY2NjY2CisxOTU0IDAgNjQwMDAwMAorMTQ5OCAwIDY0MzMzMzMKKzExODggMCA2NDY2NjY2Cis3ODQgMCA2NTAwMDAwCisxMDA1IDAgNjUzMzMzMworMTAwMzAgMSA2NTY2NjY2Cis0NTIgMCA2NjAwMDAwCis3NjMgMCA2NjMzMzMzCis2MzkgMCA2NjY2NjY2Cis2NzEgMCA2NzAwMDAwCis4NjcgMCA2NzMzMzMzCis5NjMgMCA2NzY2NjY2Cis5ODIgMCA2ODAwMDAwCis5OTUgMCA2ODMzMzMzCis5ODIgMCA2ODY2NjY2Cis3NDcgMCA2OTAwMDAwCis1NzQgMCA2OTMzMzMzCisxMjM1MyAxIDY5NjY2NjYKKzQ3NCAwIDcwMDAwMDAKKzk2OSAwIDcwMzMzMzMKKzYzMyAwIDcwNjY2NjYKKzcyMyAwIDcxMDAwMDAKKzEyMjEgMCA3MTMzMzMzCis2NzQgMCA3MTY2NjY2Cis3NzYgMCA3MjAwMDAwCis1NzIgMCA3MjMzMzMzCis5MTIgMCA3MjY2NjY2Cis1NjQgMCA3MzAwMDAwCis1OTQgMCA3MzMzMzMzCisxNjY2MSAxIDczNjY2NjYKKzUxOCAwIDc0MDAwMDAKKzY1NiAwIDc0MzMzMzMKKzYyNSAwIDc0NjY2NjYKKzU4MyAwIDc1MDAwMDAKKzU4NCAwIDc1MzMzMzMKKzEwMjcgMCA3NTY2NjY2Cis4MTIgMCA3NjAwMDAwCis3MjkgMCA3NjMzMzMzCis3NjYgMCA3NjY2NjY2Cis5MDEgMCA3NzAwMDAwCis5NjAgMCA3NzMzMzMzCisxMjMzNiAxIDc3NjY2NjYKKzk0NCAwIDc4MDAwMDAKKzEzOTggMCA3ODMzMzMzCisxNjI1IDAgNzg2NjY2NgorMjEwMyAwIDc5MDAwMDAKKzE2MzAgMCA3OTMzMzMzCisxMjI4IDAgNzk2NjY2NgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VhZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWQxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0OTkgQEAKKzE5IDMyIDAKKzggMzIgMAorOCAzMiAwCis1MjkgMSAwCiszMjkgMSAxMzUwMAorMzQ5IDEgMzM1MDAKKzMzNiAxIDUzNTAwCiszODMgMSA3MzUwMAorMzU5IDEgOTM1MDAKKzM0NCAxIDExMzUwMAorMzQzIDEgMTMzNTAwCiszMzIgMSAxNTM1MDAKKzMyMCAxIDE3MzUwMAorMzE5IDEgMTkzNTAwCiszMjMgMSAyMTM1MDAKKzMyMCAxIDIzMzUwMAorMzI4IDEgMjUzNTAwCiszNDAgMSAyNzM1MDAKKzMxOCAxIDI5MzUwMAorMzE5IDEgMzEzNTAwCiszMzUgMSAzMzM1MDAKKzUxMSAxIDM1MzUwMAorMzk1IDEgMzczNTAwCiszMjcgMSAzOTM1MDAKKzQ3OSAxIDQxMzUwMAorMzMyIDEgNDMzNTAwCiszMjAgMSA0NTM1MDAKKzMyMSAxIDQ3MzUwMAorMzEwIDEgNDkzNTAwCiszMTAgMSA1MTM1MDAKKzMxMCAxIDUzMzUwMAorMzI2IDEgNTUzNTAwCiszMzAgMSA1NzM1MDAKKzMxOCAxIDU5MzUwMAorMzA5IDEgNjEzNTAwCiszMDQgMSA2MzM1MDAKKzI5OCAxIDY1MzUwMAorMjk0IDEgNjczNTAwCiszMDAgMSA2OTM1MDAKKzMxNCAxIDcxMzUwMAorMzA0IDEgNzMzNTAwCiszMDcgMSA3NTM1MDAKKzMyMSAxIDc3MzUwMAorMzMzIDEgNzkzNTAwCiszMzUgMSA4MTM1MDAKKzMwNiAxIDgzMzUwMAorMzE1IDEgODUzNTAwCiszMjAgMSA4NzM1MDAKKzMxNSAxIDg5MzUwMAorMzA4IDEgOTEzNTAwCiszMjAgMSA5MzM1MDAKKzMxMSAxIDk1MzUwMAorMzExIDEgOTczNTAwCiszMTMgMSA5OTM1MDAKKzMxNCAxIDEwMTM1MDAKKzMwOCAxIDEwMzM1MDAKKzMwNyAxIDEwNTM1MDAKKzMxNyAxIDEwNzM1MDAKKzMyOCAxIDEwOTM1MDAKKzMxNyAxIDExMTM1MDAKKzMxMiAxIDExMzM1MDAKKzMwOCAxIDExNTM1MDAKKzMxNSAxIDExNzM1MDAKKzMyMCAxIDExOTM1MDAKKzMyMiAxIDEyMTM1MDAKKzMyMyAxIDEyMzM1MDAKKzMyMiAxIDEyNTM1MDAKKzMyMiAxIDEyNzM1MDAKKzMwMSAxIDEyOTM1MDAKKzMwMyAxIDEzMTM1MDAKKzMwOCAxIDEzMzM1MDAKKzI5OSAxIDEzNTM1MDAKKzI5NyAxIDEzNzM1MDAKKzI5MyAxIDEzOTM1MDAKKzI5NSAxIDE0MTM1MDAKKzI5NyAxIDE0MzM1MDAKKzMwMCAxIDE0NTM1MDAKKzI5NCAxIDE0NzM1MDAKKzI5OSAxIDE0OTM1MDAKKzI5NiAxIDE1MTM1MDAKKzMwMyAxIDE1MzM1MDAKKzMxMyAxIDE1NTM1MDAKKzMwNiAxIDE1NzM1MDAKKzMwMyAxIDE1OTM1MDAKKzMxMSAxIDE2MTM1MDAKKzMwNyAxIDE2MzM1MDAKKzMxMCAxIDE2NTM1MDAKKzMzOSAxIDE2NzM1MDAKKzMyNSAxIDE2OTM1MDAKKzMyMCAxIDE3MTM1MDAKKzMxNSAxIDE3MzM1MDAKKzMxNiAxIDE3NTM1MDAKKzMzOCAxIDE3NzM1MDAKKzMyNSAxIDE3OTM1MDAKKzMyNSAxIDE4MTM1MDAKKzMyOCAxIDE4MzM1MDAKKzMwNCAxIDE4NTM1MDAKKzI5NyAxIDE4NzM1MDAKKzMyMiAxIDE4OTM1MDAKKzMxMSAxIDE5MTM1MDAKKzMwNyAxIDE5MzM1MDAKKzMwMCAxIDE5NTM1MDAKKzMwMSAxIDE5NzM1MDAKKzMwOSAxIDE5OTM1MDAKKzMwMCAxIDIwMTM1MDAKKzMwNiAxIDIwMzM1MDAKKzMwNSAxIDIwNTM1MDAKKzI5OCAxIDIwNzM1MDAKKzI5MSAxIDIwOTM1MDAKKzMwMSAxIDIxMTM1MDAKKzMwMCAxIDIxMzM1MDAKKzQzOSAxIDIxNTM1MDAKKzI5MiAxIDIxNzM1MDAKKzMwOCAxIDIxOTM1MDAKKzMwNSAxIDIyMTM1MDAKKzI5OCAxIDIyMzM1MDAKKzI5NyAxIDIyNTM1MDAKKzI5MyAxIDIyNzM1MDAKKzQwOCAxIDIyOTM1MDAKKzI5OCAxIDIzMTM1MDAKKzQ1MiAxIDIzMzM1MDAKKzI5NyAxIDIzNTM1MDAKKzMwMyAxIDIzNzM1MDAKKzMwMCAxIDIzOTM1MDAKKzMxMCAxIDI0MTM1MDAKKzI5OSAxIDI0MzM1MDAKKzMwNiAxIDI0NTM1MDAKKzMxNiAxIDI0NzM1MDAKKzMwOCAxIDI0OTM1MDAKKzMxMyAxIDI1MTM1MDAKKzMwOSAxIDI1MzM1MDAKKzMxMCAxIDI1NTM1MDAKKzMxNSAxIDI1NzM1MDAKKzMwOSAxIDI1OTM1MDAKKzMxNyAxIDI2MTM1MDAKKzMxMSAxIDI2MzM1MDAKKzMyOCAxIDI2NTM1MDAKKzMzMyAxIDI2NzM1MDAKKzMyNiAxIDI2OTM1MDAKKzMyMyAxIDI3MTM1MDAKKzMxNiAxIDI3MzM1MDAKKzMyNSAxIDI3NTM1MDAKKzMxNiAxIDI3NzM1MDAKKzMxOSAxIDI3OTM1MDAKKzMyNiAxIDI4MTM1MDAKKzMyMCAxIDI4MzM1MDAKKzMyOCAxIDI4NTM1MDAKKzMxMiAxIDI4NzM1MDAKKzMxNCAxIDI4OTM1MDAKKzMwOSAxIDI5MTM1MDAKKzMwNiAxIDI5MzM1MDAKKzI5NSAxIDI5NTM1MDAKKzMwNCAxIDI5NzM1MDAKKzMyNiAxIDI5OTM1MDAKKzI5MSAxIDMwMTM1MDAKKzI5OSAxIDMwMzM1MDAKKzI5MyAxIDMwNTM1MDAKKzI4OCAxIDMwNzM1MDAKKzI5NCAxIDMwOTM1MDAKKzI5MiAxIDMxMTM1MDAKKzI5MiAxIDMxMzM1MDAKKzI4OCAxIDMxNTM1MDAKKzMwOCAxIDMxNzM1MDAKKzMwNCAxIDMxOTM1MDAKKzI5MiAxIDMyMTM1MDAKKzM4MiAxIDMyMzM1MDAKKzM4MSAxIDMyNTM1MDAKKzI5OSAxIDMyNzM1MDAKKzMxNiAxIDMyOTM1MDAKKzMwOCAxIDMzMTM1MDAKKzMwMSAxIDMzMzM1MDAKKzI5NyAxIDMzNTM1MDAKKzI5OSAxIDMzNzM1MDAKKzI5NCAxIDMzOTM1MDAKKzI5NSAxIDM0MTM1MDAKKzMxNyAxIDM0MzM1MDAKKzI5NyAxIDM0NTM1MDAKKzMwOSAxIDM0NzM1MDAKKzMxMyAxIDM0OTM1MDAKKzMyMCAxIDM1MTM1MDAKKzMyOSAxIDM1MzM1MDAKKzMzMCAxIDM1NTM1MDAKKzMyNCAxIDM1NzM1MDAKKzMyNCAxIDM1OTM1MDAKKzMwOSAxIDM2MTM1MDAKKzMwNCAxIDM2MzM1MDAKKzMxMyAxIDM2NTM1MDAKKzMxMiAxIDM2NzM1MDAKKzI5OSAxIDM2OTM1MDAKKzI5NSAxIDM3MTM1MDAKKzMwMSAxIDM3MzM1MDAKKzI5NSAxIDM3NTM1MDAKKzI5NyAxIDM3NzM1MDAKKzMwMiAxIDM3OTM1MDAKKzI5OCAxIDM4MTM1MDAKKzI5OSAxIDM4MzM1MDAKKzI5NiAxIDM4NTM1MDAKKzI5MiAxIDM4NzM1MDAKKzMwNyAxIDM4OTM1MDAKKzMwMyAxIDM5MTM1MDAKKzMxMyAxIDM5MzM1MDAKKzMxOCAxIDM5NTM1MDAKKzMxMyAxIDM5NzM1MDAKKzM1MyAxIDM5OTM1MDAKKzM3MSAxIDQwMTM1MDAKKzI5MiAxIDQwMzM1MDAKKzMwMCAxIDQwNTM1MDAKKzM4MSAxIDQwNzM1MDAKKzI5NCAxIDQwOTM1MDAKKzMwMSAxIDQxMTM1MDAKKzMwNSAxIDQxMzM1MDAKKzI5OSAxIDQxNTM1MDAKKzMwNSAxIDQxNzM1MDAKKzMyMiAxIDQxOTM1MDAKKzMxNSAxIDQyMTM1MDAKKzMyNiAxIDQyMzM1MDAKKzMzOCAxIDQyNTM1MDAKKzMyMCAxIDQyNzM1MDAKKzMxOSAxIDQyOTM1MDAKKzMyNyAxIDQzMTM1MDAKKzMzMCAxIDQzMzM1MDAKKzMxMCAxIDQzNTM1MDAKKzMwMyAxIDQzNzM1MDAKKzI5OSAxIDQzOTM1MDAKKzI5MyAxIDQ0MTM1MDAKKzI5MyAxIDQ0MzM1MDAKKzI5NCAxIDQ0NTM1MDAKKzI5NSAxIDQ0NzM1MDAKKzI5NSAxIDQ0OTM1MDAKKzMyMyAxIDQ1MTM1MDAKKzMwOSAxIDQ1MzM1MDAKKzMwOSAxIDQ1NTM1MDAKKzMwMSAxIDQ1NzM1MDAKKzQ3MyAxIDQ1OTM1MDAKKzI5MSAxIDQ2MTM1MDAKKzI5NyAxIDQ2MzM1MDAKKzI5NCAxIDQ2NTM1MDAKKzI5MyAxIDQ2NzM1MDAKKzMwNCAxIDQ2OTM1MDAKKzI5MiAxIDQ3MTM1MDAKKzMwMiAxIDQ3MzM1MDAKKzI5NiAxIDQ3NTM1MDAKKzI5OCAxIDQ3NzM1MDAKKzMwMSAxIDQ3OTM1MDAKKzMwNyAxIDQ4MTM1MDAKKzI4NSAxIDQ4MzM1MDAKKzI5NCAxIDQ4NTM1MDAKKzMwNCAxIDQ4NzM1MDAKKzI5NCAxIDQ4OTM1MDAKKzI5NSAxIDQ5MTM1MDAKKzMyNSAxIDQ5MzM1MDAKKzMxOSAxIDQ5NTM1MDAKKzMyMyAxIDQ5NzM1MDAKKzMxMyAxIDQ5OTM1MDAKKzMwMyAxIDUwMTM1MDAKKzI5NiAxIDUwMzM1MDAKKzI5NSAxIDUwNTM1MDAKKzI5MCAxIDUwNzM1MDAKKzI5NyAxIDUwOTM1MDAKKzI5NiAxIDUxMTM1MDAKKzI5NiAxIDUxMzM1MDAKKzI5MiAxIDUxNTM1MDAKKzI5NSAxIDUxNzM1MDAKKzI4NyAxIDUxOTM1MDAKKzI5NCAxIDUyMTM1MDAKKzI5MCAxIDUyMzM1MDAKKzI5NyAxIDUyNTM1MDAKKzI5NyAxIDUyNzM1MDAKKzI5NyAxIDUyOTM1MDAKKzI5MiAxIDUzMTM1MDAKKzI5NyAxIDUzMzM1MDAKKzI5MCAxIDUzNTM1MDAKKzI5MyAxIDUzNzM1MDAKKzI5MyAxIDUzOTM1MDAKKzI5MSAxIDU0MTM1MDAKKzI5MiAxIDU0MzM1MDAKKzI5MCAxIDU0NTM1MDAKKzI5MSAxIDU0NzM1MDAKKzI5NiAxIDU0OTM1MDAKKzI5NSAxIDU1MTM1MDAKKzMyNyAxIDU1MzM1MDAKKzI5MyAxIDU1NTM1MDAKKzI5MSAxIDU1NzM1MDAKKzI5MSAxIDU1OTM1MDAKKzMxMSAxIDU2MTM1MDAKKzI5MSAxIDU2MzM1MDAKKzI5NCAxIDU2NTM1MDAKKzI5NiAxIDU2NzM1MDAKKzI5NSAxIDU2OTM1MDAKKzI4OSAxIDU3MTM1MDAKKzI5NSAxIDU3MzM1MDAKKzI5NSAxIDU3NTM1MDAKKzI5NyAxIDU3NzM1MDAKKzI5MiAxIDU3OTM1MDAKKzI5NyAxIDU4MTM1MDAKKzI5MiAxIDU4MzM1MDAKKzI5NSAxIDU4NTM1MDAKKzI5NiAxIDU4NzM1MDAKKzI5NSAxIDU4OTM1MDAKKzMwMyAxIDU5MTM1MDAKKzMwNCAxIDU5MzM1MDAKKzMwMSAxIDU5NTM1MDAKKzMwNyAxIDU5NzM1MDAKKzMwNCAxIDU5OTM1MDAKKzMxMCAxIDYwMTM1MDAKKzMxMCAxIDYwMzM1MDAKKzMwNSAxIDYwNTM1MDAKKzMwMSAxIDYwNzM1MDAKKzMwMiAxIDYwOTM1MDAKKzMwNSAxIDYxMTM1MDAKKzI5OCAxIDYxMzM1MDAKKzMwMCAxIDYxNTM1MDAKKzMwMCAxIDYxNzM1MDAKKzI5MiAxIDYxOTM1MDAKKzI5NyAxIDYyMTM1MDAKKzMwMSAxIDYyMzM1MDAKKzI5NyAxIDYyNTM1MDAKKzI5NyAxIDYyNzM1MDAKKzI5OCAxIDYyOTM1MDAKKzI5NyAxIDYzMTM1MDAKKzMwMCAxIDYzMzM1MDAKKzI5MyAxIDYzNTM1MDAKKzI5MyAxIDYzNzM1MDAKKzI5NyAxIDYzOTM1MDAKKzI5NCAxIDY0MTM1MDAKKzMwNyAxIDY0MzM1MDAKKzMwMiAxIDY0NTM1MDAKKzMwNyAxIDY0NzM1MDAKKzMyMCAxIDY0OTM1MDAKKzMzMCAxIDY1MTM1MDAKKzMzMyAxIDY1MzM1MDAKKzMzNyAxIDY1NTM1MDAKKzMzMSAxIDY1NzM1MDAKKzMyMyAxIDY1OTM1MDAKKzMxMiAxIDY2MTM1MDAKKzMyNiAxIDY2MzM1MDAKKzMyOCAxIDY2NTM1MDAKKzMzMiAxIDY2NzM1MDAKKzMzMyAxIDY2OTM1MDAKKzM0MCAxIDY3MTM1MDAKKzMzNiAxIDY3MzM1MDAKKzMyNCAxIDY3NTM1MDAKKzMxMiAxIDY3NzM1MDAKKzMwMSAxIDY3OTM1MDAKKzI4OSAxIDY4MTM1MDAKKzMwMiAxIDY4MzM1MDAKKzI5NiAxIDY4NTM1MDAKKzI5OSAxIDY4NzM1MDAKKzI4OSAxIDY4OTM1MDAKKzI5NSAxIDY5MTM1MDAKKzI5OSAxIDY5MzM1MDAKKzM3NCAxIDY5NTM1MDAKKzM5MSAxIDY5NzM1MDAKKzM2NSAxIDY5OTM1MDAKKzM0MCAxIDcwMTM1MDAKKzMzMCAxIDcwMzM1MDAKKzMzNyAxIDcwNTM1MDAKKzMyOCAxIDcwNzM1MDAKKzMyOSAxIDcwOTM1MDAKKzMxOSAxIDcxMTM1MDAKKzMxMiAxIDcxMzM1MDAKKzMwOCAxIDcxNTM1MDAKKzMwNCAxIDcxNzM1MDAKKzMxMiAxIDcxOTM1MDAKKzMxMSAxIDcyMTM1MDAKKzMxNiAxIDcyMzM1MDAKKzI5OSAxIDcyNTM1MDAKKzMzMCAxIDcyNzM1MDAKKzMzMCAxIDcyOTM1MDAKKzMzMCAxIDczMTM1MDAKKzM0MiAxIDczMzM1MDAKKzQzOSAxIDczNTM1MDAKKzMyMiAxIDczNzM1MDAKKzI5OCAxIDczOTM1MDAKKzI5MyAxIDc0MTM1MDAKKzMxMCAxIDc0MzM1MDAKKzMwMyAxIDc0NTM1MDAKKzMxNyAxIDc0NzM1MDAKKzQ1MyAxIDc0OTM1MDAKKzM3NyAxIDc1MTM1MDAKKzM3NCAxIDc1MzM1MDAKKzI5MiAxIDc1NTM1MDAKKzI5NSAxIDc1NzM1MDAKKzI3NCAxIDc1OTM1MDAKKzI5MiAxIDc2MTM1MDAKKzI5MSAxIDc2MzM1MDAKKzM2NyAxIDc2NTM1MDAKKzI5NSAxIDc2NzM1MDAKKzI5OCAxIDc2OTM1MDAKKzI5NyAxIDc3MTM1MDAKKzMwMSAxIDc3MzM1MDAKKzI5MiAxIDc3NTM1MDAKKzM0NCAxIDc3NzM1MDAKKzI5NiAxIDc3OTM1MDAKKzI5NyAxIDc4MTM1MDAKKzMwNiAxIDc4MzM1MDAKKzMwOCAxIDc4NTM1MDAKKzMwNSAxIDc4NzM1MDAKKzMxMyAxIDc4OTM1MDAKKzMwNiAxIDc5MTM1MDAKKzMyMiAxIDc5MzM1MDAKKzMxMyAxIDc5NTM1MDAKKzMwNSAxIDc5NzM1MDAKKzMwNCAxIDc5OTM1MDAKKzMxMyAxIDgwMTM1MDAKKzMyNCAxIDgwMzM1MDAKKzMxMiAxIDgwNTM1MDAKKzMxOCAxIDgwNzM1MDAKKzMxMSAxIDgwOTM1MDAKKzMwMiAxIDgxMTM1MDAKKzMwNSAxIDgxMzM1MDAKKzMxMiAxIDgxNTM1MDAKKzMxMyAxIDgxNzM1MDAKKzMxMiAxIDgxOTM1MDAKKzMzNSAxIDgyMTM1MDAKKzMzMyAxIDgyMzM1MDAKKzM0NiAxIDgyNTM1MDAKKzMzOSAxIDgyNzM1MDAKKzMzNyAxIDgyOTM1MDAKKzM0MSAxIDgzMTM1MDAKKzMzNSAxIDgzMzM1MDAKKzMyNSAxIDgzNTM1MDAKKzMyNCAxIDgzNzM1MDAKKzMxNyAxIDgzOTM1MDAKKzMxNSAxIDg0MTM1MDAKKzMwMyAxIDg0MzM1MDAKKzMxNyAxIDg0NTM1MDAKKzQ1MiAxIDg0NzM1MDAKKzMyNCAxIDg0OTM1MDAKKzMyMSAxIDg1MTM1MDAKKzMzNSAxIDg1MzM1MDAKKzMyNyAxIDg1NTM1MDAKKzMxNSAxIDg1NzM1MDAKKzMyMSAxIDg1OTM1MDAKKzMxOSAxIDg2MTM1MDAKKzMwOCAxIDg2MzM1MDAKKzMxNCAxIDg2NTM1MDAKKzMyMiAxIDg2NzM1MDAKKzMyOCAxIDg2OTM1MDAKKzMyMCAxIDg3MTM1MDAKKzMyNCAxIDg3MzM1MDAKKzMzMSAxIDg3NTM1MDAKKzMzMCAxIDg3NzM1MDAKKzMyOCAxIDg3OTM1MDAKKzMxOCAxIDg4MTM1MDAKKzMxNCAxIDg4MzM1MDAKKzMxOCAxIDg4NTM1MDAKKzMxOCAxIDg4NzM1MDAKKzMyNSAxIDg4OTM1MDAKKzMzOCAxIDg5MTM1MDAKKzM0MSAxIDg5MzM1MDAKKzMzMyAxIDg5NTM1MDAKKzMzMCAxIDg5NzM1MDAKKzMzOCAxIDg5OTM1MDAKKzMzMyAxIDkwMTM1MDAKKzMzMCAxIDkwMzM1MDAKKzM0NCAxIDkwNTM1MDAKKzQ3OSAxIDkwNzM1MDAKKzQ3MyAxIDkwOTM1MDAKKzMzMyAxIDkxMTM1MDAKKzMzNyAxIDkxMzM1MDAKKzQ5NSAxIDkxNTM1MDAKKzM1MyAxIDkxNzM1MDAKKzM1MiAxIDkxOTM1MDAKKzM0NCAxIDkyMTM1MDAKKzMzNiAxIDkyMzM1MDAKKzMyNCAxIDkyNTM1MDAKKzMyMSAxIDkyNzM1MDAKKzM1MCAxIDkyOTM1MDAKKzM0NyAxIDkzMTM1MDAKKzM0MyAxIDkzMzM1MDAKKzM0NSAxIDkzNTM1MDAKKzMzNyAxIDkzNzM1MDAKKzMzNSAxIDkzOTM1MDAKKzMzMyAxIDk0MTM1MDAKKzMzNiAxIDk0MzM1MDAKKzMzNCAxIDk0NTM1MDAKKzMzMyAxIDk0NzM1MDAKKzMzMSAxIDk0OTM1MDAKKzMyOSAxIDk1MTM1MDAKKzMxOSAxIDk1MzM1MDAKKzMyMSAxIDk1NTM1MDAKKzMxNiAxIDk1NzM1MDAKKzMyMiAxIDk1OTM1MDAKKzQ0OCAxIDk2MTM1MDAKKzMxMiAxIDk2MzM1MDAKKzMwNiAxIDk2NTM1MDAKKzMwMSAxIDk2NzM1MDAKKzMwMyAxIDk2OTM1MDAKKzI5NiAxIDk3MTM1MDAKKzMwMCAxIDk3MzM1MDAKKzI5NSAxIDk3NTM1MDAKKzMwMCAxIDk3NzM1MDAKKzI5NyAxIDk3OTM1MDAKKzMwMCAxIDk4MTM1MDAKKzI5NyAxIDk4MzM1MDAKKzUxMiAxIDk4NTM1MDAKKzI5MiAxIDk4NzM1MDAKKzQ2OCAxIDk4OTM1MDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZiODcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJmNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0OWViMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUyNGNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzE2Mzg0IDEgMAorMTYzODQgMSAxMDI0MDAwCisxNjM4NCAxIDIwNDgwMDAKKzE2Mzg0IDEgMzA3MjAwMAorMTYzODQgMSA0MDk2MDAwCisxNjM4NCAxIDUxMjAwMDAKKzE2Mzg0IDEgNjE0NDAwMAorMTYzODQgMSA3MTY4MDAwCisxNjM4NCAxIDgxOTIwMDAKKzEwOTI0IDEgOTIxNjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGIyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWE2ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw1MjAgQEAKKzMwIDMyIDAKKzQxNDAgMzIgMAorMzMgMzIgMAorNTIgMSAwCis1OCAxIDI2NjYKKzYxIDEgNTMzMworNTYgMSA4MDAwCis1OSAxIDEwNjY2Cis2MyAxIDEzMzMzCis2NiAxIDE2MDAwCis3MSAxIDE4NjY2Cis3NiAxIDIxMzMzCiszNzQgMSAyNDAwMAorMzY2IDEgMzYwMDAKKzM3OCAxIDU3MzMzCiszOTMgMSA3ODY2NgorMzkzIDEgMTAwMDAwCiszODYgMSAxMjEzMzMKKzM3NSAxIDE0MjY2NgorMzg4IDEgMTY0MDAwCiszNzggMSAxODUzMzMKKzM3OSAxIDIwNjY2NgorMzc0IDEgMjI4MDAwCiszNTYgMSAyNDkzMzMKKzM1OCAxIDI3MDY2NgorMzMyIDEgMjkyMDAwCiszMzUgMSAzMTMzMzMKKzM2MyAxIDMzNDY2NgorMzQxIDEgMzU2MDAwCiszNjAgMSAzNzczMzMKKzM0MSAxIDM5ODY2NgorMzM1IDEgNDIwMDAwCiszNTcgMSA0NDEzMzMKKzM1NSAxIDQ2MjY2NgorMzYzIDEgNDg0MDAwCiszODIgMSA1MDUzMzMKKzM3MSAxIDUyNjY2NgorMzU3IDEgNTQ4MDAwCiszNTMgMSA1NjkzMzMKKzM1MCAxIDU5MDY2NgorMzI3IDEgNjEyMDAwCiszMTUgMSA2MzMzMzMKKzMwNyAxIDY1NDY2NgorMzAzIDEgNjc2MDAwCisyOTUgMSA2OTczMzMKKzMxMiAxIDcxODY2NgorMzE2IDEgNzQwMDAwCiszMTUgMSA3NjEzMzMKKzMxOCAxIDc4MjY2NgorMzMwIDEgODA0MDAwCiszMTggMSA4MjUzMzMKKzMxNSAxIDg0NjY2NgorMzIyIDEgODY4MDAwCiszMTUgMSA4ODkzMzMKKzMxMCAxIDkxMDY2NgorMzE1IDEgOTMyMDAwCiszMTQgMSA5NTMzMzMKKzMwMiAxIDk3NDY2NgorMzEzIDEgOTk2MDAwCiszMjIgMSAxMDE3MzMzCiszMjMgMSAxMDM4NjY2CiszMTkgMSAxMDYwMDAwCiszMjUgMSAxMDgxMzMzCiszMjggMSAxMTAyNjY2CiszMzAgMSAxMTI0MDAwCiszMzMgMSAxMTQ1MzMzCiszMzAgMSAxMTY2NjY2CiszNDQgMSAxMTg4MDAwCiszMzEgMSAxMjA5MzMzCiszNDIgMSAxMjMwNjY2CiszMzkgMSAxMjUyMDAwCiszMTQgMSAxMjczMzMzCisyODUgMSAxMjk0NjY2CisyOTUgMSAxMzE2MDAwCiszMDIgMSAxMzM3MzMzCiszMDUgMSAxMzU4NjY2CiszMDkgMSAxMzgwMDAwCiszMjcgMSAxNDAxMzMzCiszMDQgMSAxNDIyNjY2CiszMzYgMSAxNDQ0MDAwCiszNTAgMSAxNDY1MzMzCiszNDYgMSAxNDg2NjY2CiszNTIgMSAxNTA4MDAwCiszNDEgMSAxNTI5MzMzCiszNDMgMSAxNTUwNjY2CiszNTEgMSAxNTcyMDAwCiszMTkgMSAxNTkzMzMzCiszMjggMSAxNjE0NjY2CiszMjggMSAxNjM2MDAwCiszMjQgMSAxNjU3MzMzCiszMzggMSAxNjc4NjY2CiszMTcgMSAxNzAwMDAwCiszMjggMSAxNzIxMzMzCiszMzUgMSAxNzQyNjY2CiszNDEgMSAxNzY0MDAwCiszMzUgMSAxNzg1MzMzCiszNDggMSAxODA2NjY2CiszNjIgMSAxODI4MDAwCiszNjEgMSAxODQ5MzMzCiszNDQgMSAxODcwNjY2CiszNDAgMSAxODkyMDAwCiszMzMgMSAxOTEzMzMzCiszMjkgMSAxOTM0NjY2CiszMjggMSAxOTU2MDAwCiszMjMgMSAxOTc3MzMzCiszMTAgMSAxOTk4NjY2CiszMTggMSAyMDIwMDAwCiszMTIgMSAyMDQxMzMzCisyOTUgMSAyMDYyNjY2CiszMjkgMSAyMDg0MDAwCiszMTggMSAyMTA1MzMzCiszMTEgMSAyMTI2NjY2CiszMTcgMSAyMTQ4MDAwCis2MiAxIDIxNjkzMzMKKzc1IDEgMjE4MTMzMworNzMgMSAyMTg0MDAwCiszMzIgMSAyMTg2NjY2CiszMjcgMSAyMTk4NjY2CiszMzIgMSAyMjIwMDAwCiszMjUgMSAyMjQxMzMzCiszMjkgMSAyMjYyNjY2CiszMzAgMSAyMjg0MDAwCis2MSAxIDIzMDUzMzMKKzYxIDEgMjMxNzMzMworNzAgMSAyMzIwMDAwCis3MCAxIDIzMjI2NjYKKzMxOSAxIDIzMjUzMzMKKzMwMyAxIDIzMzczMzMKKzI5MiAxIDIzNTg2NjYKKzMxMyAxIDIzODAwMDAKKzMxOCAxIDI0MDEzMzMKKzM0NiAxIDI0MjI2NjYKKzMyOCAxIDI0NDQwMDAKKzMxNiAxIDI0NjUzMzMKKzM0MSAxIDI0ODY2NjYKKzMyOCAxIDI1MDgwMDAKKzMzOCAxIDI1MjkzMzMKKzM0MSAxIDI1NTA2NjYKKzMzNyAxIDI1NzIwMDAKKzM0NyAxIDI1OTMzMzMKKzM4NCAxIDI2MTQ2NjYKKzM1OCAxIDI2MzYwMDAKKzM2MyAxIDI2NTczMzMKKzM2MyAxIDI2Nzg2NjYKKzM1OCAxIDI3MDAwMDAKKzMzOSAxIDI3MjEzMzMKKzM2OSAxIDI3NDI2NjYKKzM0MyAxIDI3NjQwMDAKKzM0OCAxIDI3ODUzMzMKKzM2MyAxIDI4MDY2NjYKKzM1MCAxIDI4MjgwMDAKKzM1OCAxIDI4NDkzMzMKKzM1MiAxIDI4NzA2NjYKKzMzOCAxIDI4OTIwMDAKKzMzNSAxIDI5MTMzMzMKKzM0MiAxIDI5MzQ2NjYKKzMzOCAxIDI5NTYwMDAKKzM0MCAxIDI5NzczMzMKKzI5MiAxIDI5OTg2NjYKKzI3OSAxIDMwMjAwMDAKKzI5OSAxIDMwNDEzMzMKKzMwMyAxIDMwNjI2NjYKKzI5OCAxIDMwODQwMDAKKzI5NyAxIDMxMDUzMzMKKzI4MCAxIDMxMjY2NjYKKzI5NyAxIDMxNDgwMDAKKzI5MCAxIDMxNjkzMzMKKzMwNiAxIDMxOTA2NjYKKzMwMSAxIDMyMTIwMDAKKzMwNiAxIDMyMzMzMzMKKzI4OSAxIDMyNTQ2NjYKKzMxMSAxIDMyNzYwMDAKKzMxNyAxIDMyOTczMzMKKzM0NCAxIDMzMTg2NjYKKzMwOCAxIDMzNDAwMDAKKzMwNCAxIDMzNjEzMzMKKzMwNCAxIDMzODI2NjYKKzMxMiAxIDM0MDQwMDAKKzMwNSAxIDM0MjUzMzMKKzI5OSAxIDM0NDY2NjYKKzMwMSAxIDM0NjgwMDAKKzMxOCAxIDM0ODkzMzMKKzMxMyAxIDM1MTA2NjYKKzMzMCAxIDM1MzIwMDAKKzMyNSAxIDM1NTMzMzMKKzMyNSAxIDM1NzQ2NjYKKzMyMSAxIDM1OTYwMDAKKzM0OSAxIDM2MTczMzMKKzI4OCAxIDM2Mzg2NjYKKzMwMCAxIDM2NjAwMDAKKzMxMiAxIDM2ODEzMzMKKzMwMiAxIDM3MDI2NjYKKzI3OCAxIDM3MjQwMDAKKzI4NCAxIDM3NDUzMzMKKzI4NiAxIDM3NjY2NjYKKzI3NCAxIDM3ODgwMDAKKzI5NSAxIDM4MDkzMzMKKzI4MSAxIDM4MzA2NjYKKzI4OCAxIDM4NTIwMDAKKzI3OCAxIDM4NzMzMzMKKzMwNiAxIDM4OTQ2NjYKKzYyIDEgMzkxNjAwMAorNTkgMSAzOTI4MDAwCis2MSAxIDM5MzA2NjYKKzU1IDEgMzkzMzMzMworNzAgMSAzOTM2MDAwCis3MiAxIDM5Mzg2NjYKKzMyNCAxIDM5NDEzMzMKKzMwOSAxIDM5NTMzMzMKKzMwMSAxIDM5NzQ2NjYKKzMwMSAxIDM5OTYwMDAKKzI5MSAxIDQwMTczMzMKKzI4OSAxIDQwMzg2NjYKKzMwNiAxIDQwNjAwMDAKKzMwNSAxIDQwODEzMzMKKzI4NiAxIDQxMDI2NjYKKzI5NCAxIDQxMjQwMDAKKzI5MCAxIDQxNDUzMzMKKzI5NyAxIDQxNjY2NjYKKzMwOCAxIDQxODgwMDAKKzI5NiAxIDQyMDkzMzMKKzI5MiAxIDQyMzA2NjYKKzI4NyAxIDQyNTIwMDAKKzI5MSAxIDQyNzMzMzMKKzI5OCAxIDQyOTQ2NjYKKzI5NSAxIDQzMTYwMDAKKzI5NCAxIDQzMzczMzMKKzI5NSAxIDQzNTg2NjYKKzI3NSAxIDQzODAwMDAKKzI4MCAxIDQ0MDEzMzMKKzI4OCAxIDQ0MjI2NjYKKzI4NSAxIDQ0NDQwMDAKKzI3NCAxIDQ0NjUzMzMKKzI5OCAxIDQ0ODY2NjYKKzMwMSAxIDQ1MDgwMDAKKzMwMCAxIDQ1MjkzMzMKKzMwNSAxIDQ1NTA2NjYKKzI5NyAxIDQ1NzIwMDAKKzU5IDEgNDU5MzMzMworNTYgMSA0NjA1MzMzCis1NyAxIDQ2MDgwMDAKKzU1IDEgNDYxMDY2NgorNTggMSA0NjEzMzMzCis1NyAxIDQ2MTYwMDAKKzU4IDEgNDYxODY2NgorNjggMSA0NjIxMzMzCis2NyAxIDQ2MjQwMDAKKzcxIDEgNDYyNjY2NgorMjg5IDEgNDYyOTMzMworMjgyIDEgNDY0MTMzMworMjczIDEgNDY2MjY2NgorMjc5IDEgNDY4NDAwMAorMjg2IDEgNDcwNTMzMworMjgyIDEgNDcyNjY2NgorMjg0IDEgNDc0ODAwMAorMjc4IDEgNDc2OTMzMworMjgxIDEgNDc5MDY2NgorMjgwIDEgNDgxMjAwMAorMjYzIDEgNDgzMzMzMworMjYwIDEgNDg1NDY2NgorMjcxIDEgNDg3NjAwMAorMjczIDEgNDg5NzMzMworMjgyIDEgNDkxODY2NgorMjc5IDEgNDk0MDAwMAorMjk3IDEgNDk2MTMzMworMjkxIDEgNDk4MjY2NgorMzA5IDEgNTAwNDAwMAorMjgzIDEgNTAyNTMzMworMjkyIDEgNTA0NjY2NgorMzA0IDEgNTA2ODAwMAorMjk2IDEgNTA4OTMzMworMjkzIDEgNTExMDY2NgorMjgyIDEgNTEzMjAwMAorMjczIDEgNTE1MzMzMworMjg0IDEgNTE3NDY2NgorMjgxIDEgNTE5NjAwMAorMjY1IDEgNTIxNzMzMworMjcyIDEgNTIzODY2NgorMjc3IDEgNTI2MDAwMAorMjgwIDEgNTI4MTMzMworMjc2IDEgNTMwMjY2NgorMjczIDEgNTMyNDAwMAorMjc4IDEgNTM0NTMzMworMjgwIDEgNTM2NjY2NgorMjgwIDEgNTM4ODAwMAorMjY4IDEgNTQwOTMzMworMjgyIDEgNTQzMDY2NgorMjc3IDEgNTQ1MjAwMAorMjc0IDEgNTQ3MzMzMworMjc1IDEgNTQ5NDY2NgorMjcwIDEgNTUxNjAwMAorMjgyIDEgNTUzNzMzMworMjc5IDEgNTU1ODY2NgorMjYwIDEgNTU4MDAwMAorMjcyIDEgNTYwMTMzMworMjc1IDEgNTYyMjY2NgorMjczIDEgNTY0NDAwMAorMjc2IDEgNTY2NTMzMworMjg4IDEgNTY4NjY2NgorMjk0IDEgNTcwODAwMAorMjcxIDEgNTcyOTMzMworMjc3IDEgNTc1MDY2NgorMjg4IDEgNTc3MjAwMAorMjc2IDEgNTc5MzMzMworMjgyIDEgNTgxNDY2NgorMjc2IDEgNTgzNjAwMAorMjc1IDEgNTg1NzMzMworMjY4IDEgNTg3ODY2NgorMjcwIDEgNTkwMDAwMAorMjY2IDEgNTkyMTMzMworMjY4IDEgNTk0MjY2NgorMjgyIDEgNTk2NDAwMAorMjc5IDEgNTk4NTMzMworMjc5IDEgNjAwNjY2NgorMjg3IDEgNjAyODAwMAorMjg2IDEgNjA0OTMzMworMjgwIDEgNjA3MDY2NgorMjkwIDEgNjA5MjAwMAorMjY2IDEgNjExMzMzMworMjkyIDEgNjEzNDY2NgorMjY0IDEgNjE1NjAwMAorMjcxIDEgNjE3NzMzMworMjc3IDEgNjE5ODY2NgorMjkyIDEgNjIyMDAwMAorMjk4IDEgNjI0MTMzMworMjg0IDEgNjI2MjY2NgorMjg3IDEgNjI4NDAwMAorMjc1IDEgNjMwNTMzMworMjkxIDEgNjMyNjY2NgorMjg3IDEgNjM0ODAwMAorMjgzIDEgNjM2OTMzMworMjg0IDEgNjM5MDY2NgorMjcxIDEgNjQxMjAwMAorMjgyIDEgNjQzMzMzMworMjc3IDEgNjQ1NDY2NgorMjgyIDEgNjQ3NjAwMAorMjg1IDEgNjQ5NzMzMworMjgwIDEgNjUxODY2NgorMjcxIDEgNjU0MDAwMAorMjg5IDEgNjU2MTMzMworMjg3IDEgNjU4MjY2NgorMjk0IDEgNjYwNDAwMAorMjc3IDEgNjYyNTMzMworMjgxIDEgNjY0NjY2NgorMjc0IDEgNjY2ODAwMAorMjcxIDEgNjY4OTMzMworMjc5IDEgNjcxMDY2NgorMjg4IDEgNjczMjAwMAorMjgwIDEgNjc1MzMzMworMjg0IDEgNjc3NDY2NgorMjc4IDEgNjc5NjAwMAorMjc2IDEgNjgxNzMzMworMjc1IDEgNjgzODY2NgorMjYzIDEgNjg2MDAwMAorMjY2IDEgNjg4MTMzMworMjQ3IDEgNjkwMjY2NgorMjY5IDEgNjkyNDAwMAorMjYzIDEgNjk0NTMzMworMjgzIDEgNjk2NjY2NgorMjgwIDEgNjk4ODAwMAorMjgxIDEgNzAwOTMzMworMjk5IDEgNzAzMDY2NgorMjg1IDEgNzA1MjAwMAorMjg4IDEgNzA3MzMzMworMjk5IDEgNzA5NDY2NgorMjg4IDEgNzExNjAwMAorMjc5IDEgNzEzNzMzMworMjc2IDEgNzE1ODY2NgorMjc3IDEgNzE4MDAwMAorMjgyIDEgNzIwMTMzMworMjg1IDEgNzIyMjY2NgorMjk1IDEgNzI0NDAwMAorMjk0IDEgNzI2NTMzMworMzA0IDEgNzI4NjY2NgorMjgyIDEgNzMwODAwMAorMjk5IDEgNzMyOTMzMworMjgzIDEgNzM1MDY2NgorMjgyIDEgNzM3MjAwMAorMjg3IDEgNzM5MzMzMworMzA2IDEgNzQxNDY2NgorMzA0IDEgNzQzNjAwMAorMjg5IDEgNzQ1NzMzMworMjk5IDEgNzQ3ODY2NgorMjgxIDEgNzUwMDAwMAorMjgxIDEgNzUyMTMzMworNjYgMSA3NTQyNjY2Cis2MyAxIDc1NTQ2NjYKKzI4OSAxIDc1NTczMzMKKzI3MCAxIDc1NjkzMzMKKzI1NyAxIDc1OTA2NjYKKzI0NiAxIDc2MTIwMDAKKzI2NCAxIDc2MzMzMzMKKzI4MCAxIDc2NTQ2NjYKKzI3MyAxIDc2NzYwMDAKKzI4NSAxIDc2OTczMzMKKzI2NyAxIDc3MTg2NjYKKzI3NSAxIDc3NDAwMDAKKzI3OCAxIDc3NjEzMzMKKzI5MyAxIDc3ODI2NjYKKzI4MSAxIDc4MDQwMDAKKzI5NyAxIDc4MjUzMzMKKzI5NCAxIDc4NDY2NjYKKzI4NiAxIDc4NjgwMDAKKzI5MCAxIDc4ODkzMzMKKzI5MCAxIDc5MTA2NjYKKzI4OSAxIDc5MzIwMDAKKzI4NiAxIDc5NTMzMzMKKzI4MiAxIDc5NzQ2NjYKKzMwNiAxIDc5OTYwMDAKKzI4NyAxIDgwMTczMzMKKzMxMiAxIDgwMzg2NjYKKzMxMiAxIDgwNjAwMDAKKzMwNyAxIDgwODEzMzMKKzI5MyAxIDgxMDI2NjYKKzI4OSAxIDgxMjQwMDAKKzI4NSAxIDgxNDUzMzMKKzI5MCAxIDgxNjY2NjYKKzI4NSAxIDgxODgwMDAKKzMxMSAxIDgyMDkzMzMKKzMwNyAxIDgyMzA2NjYKKzMxNCAxIDgyNTIwMDAKKzMxOCAxIDgyNzMzMzMKKzMxOSAxIDgyOTQ2NjYKKzMxNSAxIDgzMTYwMDAKKzMwMCAxIDgzMzczMzMKKzI5NSAxIDgzNTg2NjYKKzI5MSAxIDgzODAwMDAKKzI4MiAxIDg0MDEzMzMKKzI5NSAxIDg0MjI2NjYKKzI5NiAxIDg0NDQwMDAKKzI4OCAxIDg0NjUzMzMKKzMwNCAxIDg0ODY2NjYKKzI5OSAxIDg1MDgwMDAKKzI5OCAxIDg1MjkzMzMKKzMwNSAxIDg1NTA2NjYKKzI5NSAxIDg1NzIwMDAKKzI5NiAxIDg1OTMzMzMKKzI5NSAxIDg2MTQ2NjYKKzI4NyAxIDg2MzYwMDAKKzI5MiAxIDg2NTczMzMKKzMwOCAxIDg2Nzg2NjYKKzI4NyAxIDg3MDAwMDAKKzMwNyAxIDg3MjEzMzMKKzI5NSAxIDg3NDI2NjYKKzI5MiAxIDg3NjQwMDAKKzI5MiAxIDg3ODUzMzMKKzI3OSAxIDg4MDY2NjYKKzI4OSAxIDg4MjgwMDAKKzMwMyAxIDg4NDkzMzMKKzMwNyAxIDg4NzA2NjYKKzMxMCAxIDg4OTIwMDAKKzMwMCAxIDg5MTMzMzMKKzI5OSAxIDg5MzQ2NjYKKzI5OSAxIDg5NTYwMDAKKzI4OCAxIDg5NzczMzMKKzI5MCAxIDg5OTg2NjYKKzI5MSAxIDkwMjAwMDAKKzMwNCAxIDkwNDEzMzMKKzI5OSAxIDkwNjI2NjYKKzMwNCAxIDkwODQwMDAKKzI5MCAxIDkxMDUzMzMKKzMwOSAxIDkxMjY2NjYKKzMwMSAxIDkxNDgwMDAKKzI5NiAxIDkxNjkzMzMKKzI4OCAxIDkxOTA2NjYKKzMwNSAxIDkyMTIwMDAKKzMxNyAxIDkyMzMzMzMKKzI5MiAxIDkyNTQ2NjYKKzMwMCAxIDkyNzYwMDAKKzMwMSAxIDkyOTczMzMKKzI5NSAxIDkzMTg2NjYKKzI4MiAxIDkzNDAwMDAKKzI5NiAxIDkzNjEzMzMKKzI5NSAxIDkzODI2NjYKKzI4NyAxIDk0MDQwMDAKKzI5MiAxIDk0MjUzMzMKKzMwMSAxIDk0NDY2NjYKKzMxMSAxIDk0NjgwMDAKKzMwMSAxIDk0ODkzMzMKKzMwNyAxIDk1MTA2NjYKKzMwMCAxIDk1MzIwMDAKKzMwOSAxIDk1NTMzMzMKKzI5OCAxIDk1NzQ2NjYKKzMwNCAxIDk1OTYwMDAKKzYwIDEgOTYxNzMzMworNTkgMSA5NjI5MzMzCis2NCAxIDk2MzIwMDAKKzY0IDEgOTYzNDY2NgorNzcgMSA5NjM3MzMzCis3MiAxIDk2NDAwMDAKKzMwNiAxIDk2NDI2NjYKKzI5NyAxIDk2NTQ2NjYKKzI5NCAxIDk2NzYwMDAKKzI5NSAxIDk2OTczMzMKKzMwOCAxIDk3MTg2NjYKKzMwMyAxIDk3NDAwMDAKKzMwOCAxIDk3NjEzMzMKKzI4OSAxIDk3ODI2NjYKKzMwMCAxIDk4MDQwMDAKKzMwNCAxIDk4MjUzMzMKKzMwOCAxIDk4NDY2NjYKKzY0IDEgOTg2ODAwMAorNjMgMSA5ODgwMDAwCis2NCAxIDk4ODI2NjYKKzY0IDEgOTg4NTMzMworNjAgMSA5ODg4MDAwCis3NCAxIDk4OTA2NjYKKzY5IDEgOTg5MzMzMworNjggMSA5ODk2MDAwCis2MSAxIDk4OTg2NjYKKzcxIDEgOTkwMTMzMworNzYgMSA5OTA0MDAwCis3MyAxIDk5MDY2NjYKKzcwIDEgOTkwOTMzMworNzIgMSA5OTEyMDAwCis2MCAxIDk5MTQ2NjYKKzY5IDEgOTkxNzMzMworODIgMSA5OTIwMDAwCisyNzggMSA5OTIyNjY2CiszMCAxIDk5MzQ2NjYKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzEwMjcxIDEgMAorMTA2IDAgMTcwMDAKKzEzNCAwIDMzMDAwCisxNDkgMCA1MDAwMAorMTUyIDAgNjcwMDAKKzE1OSAwIDgzMDAwCisxMTQgMCAxMDAwMDAKKzcyMyAwIDExNzAwMAorMTc1IDAgMTMzMDAwCisxODYgMCAxNTAwMDAKKzIwMSAwIDE2NzAwMAorMjcwIDAgMTgzMDAwCiszODMgMCAyMDAwMDAKKzI1NSAwIDIxNzAwMAorMjg2IDAgMjMzMDAwCisyNzMgMCAyNTAwMDAKKzEyMjQgMCAyNjcwMDAKKzIyMCAwIDI4MzAwMAorMjMxIDAgMzAwMDAwCisxOTIgMCAzMTcwMDAKKzE4MiAwIDMzMzAwMAorMjg5IDAgMzUwMDAwCisyMDQgMCAzNjcwMDAKKzIzNyAwIDM4MzAwMAorMTg3IDAgNDAwMDAwCis4OTggMCA0MTcwMDAKKzIzMSAwIDQzMzAwMAorMjY2IDAgNDUwMDAwCisyNzggMCA0NjcwMDAKKzIwNSAwIDQ4MzAwMAorMjU1IDAgNTAwMDAwCisxNjkgMCA1MTcwMDAKKzIzMyAwIDUzMzAwMAorMTAxMSAwIDU1MDAwMAorMjAyIDAgNTY3MDAwCisyNTEgMCA1ODMwMDAKKzIyMyAwIDYwMDAwMAorMjgzIDAgNjE3MDAwCiszNjIgMCA2MzMwMDAKKzIxNyAwIDY1MDAwMAorMjQ1IDAgNjY3MDAwCis5NjAgMCA2ODMwMDAKKzIzMyAwIDcwMDAwMAorMjg2IDAgNzE3MDAwCisyNzIgMCA3MzMwMDAKKzI1NCAwIDc1MDAwMAorMzMxIDAgNzY3MDAwCisyMTggMCA3ODMwMDAKKzI2MSAwIDgwMDAwMAorOTgxIDAgODE3MDAwCisyMjYgMCA4MzMwMDAKKzIyNiAwIDg1MDAwMAorMjc5IDAgODY3MDAwCisyMjUgMCA4ODMwMDAKKzI5NSAwIDkwMDAwMAorMTc1IDAgOTE3MDAwCisyNDkgMCA5MzMwMDAKKzk5NiAwIDk1MDAwMAorMTY5IDAgOTY3MDAwCisyMjQgMCA5ODMwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJhNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMGM3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAwIEBACis4Njk4MCAxIDAKKzY3NDEgMCAzMzAwMAorOTQzMyAwIDY3MDAwCis5MzYzIDAgMTAwMDAwCis4NjcxIDAgMTMzMDAwCis5MDAzIDAgMTY3MDAwCis3NzUxIDAgMjAwMDAwCisxMzIwNyAwIDIzMzAwMAorODU0MiAwIDI2NzAwMAorOTM0NCAwIDMwMDAwMAorODA2OSAwIDMzMzAwMAorODU4OCAwIDM2NzAwMAorMTIwODcgMCA0MDAwMDAKKzczMTUgMCA0MzMwMDAKKzk2NTQgMCA0NjcwMDAKKzEzMTAwIDAgNTAwMDAwCis3ODMyIDAgNTMzMDAwCisxMDA2MCAwIDU2NzAwMAorODU0MCAwIDYwMDAwMAorODY2NyAwIDYzMzAwMAorODUzMiAwIDY2NzAwMAorNjAxOCAwIDcwMDAwMAorODUyMCAwIDczMzAwMAorMTUzNTAgMCA3NjcwMDAKKzYxMTAgMCA4MDAwMDAKKzc4NzYgMCA4MzMwMDAKKzYxMzMgMCA4NjcwMDAKKzk0NzYgMCA5MDAwMDAKKzExMDAyIDAgOTMzMDAwCis3NDg0IDAgOTY3MDAwCis4NzYwIDAgMTAwMDAwMAorMTY1MTUgMCAxMDMzMDAwCis3NDgyIDAgMTA2NzAwMAorNjk4MyAwIDExMDAwMDAKKzc1NjEgMCAxMTMzMDAwCis4MjYzIDAgMTE2NzAwMAorMTA2ODIgMCAxMjAwMDAwCis4MTA4IDAgMTIzMzAwMAorNzkyNCAwIDEyNjcwMDAKKzg2OTMgMCAxMzAwMDAwCisxNDE5MCAwIDEzMzMwMDAKKzczOTMgMCAxMzY3MDAwCis2ODY0IDAgMTQwMDAwMAorOTQzMSAwIDE0MzMwMDAKKzc2NzQgMCAxNDY3MDAwCis4NDU4IDAgMTUwMDAwMAorNTg5OSAwIDE1MzMwMDAKKzgyNTkgMCAxNTY3MDAwCis3OTYzIDAgMTYwMDAwMAorMTQ3NzkgMCAxNjMzMDAwCis2ODc3IDAgMTY2NzAwMAorNzI2OCAwIDE3MDAwMDAKKzg1MjYgMCAxNzMzMDAwCis4NDY3IDAgMTc2NzAwMAorMTEyMDAgMCAxODAwMDAwCis3MjYxIDAgMTgzMzAwMAorODI4MCAwIDE4NjcwMDAKKzY3MTggMCAxOTAwMDAwCisxNzc0MiAwIDE5MzMwMDAKKzUyMDYgMCAxOTY3MDAwCis1NzAwIDAgMjAwMDAwMAorNTg3MiAwIDIwMzMwMDAKKzc5MTUgMCAyMDY3MDAwCis4NDkzIDAgMjEwMDAwMAorNjU0NSAwIDIxMzMwMDAKKzkwNzIgMCAyMTY3MDAwCisxMzIwMCAwIDIyMDAwMDAKKzk2MzIgMCAyMjMzMDAwCisxMDAxNiAwIDIyNjcwMDAKKzc4MjQgMCAyMzAwMDAwCisxMDYyOCAwIDIzMzMwMDAKKzEwNDAxIDAgMjM2NzAwMAorMTA4OTIgMCAyNDAwMDAwCis5MDIzIDAgMjQzMzAwMAorMTA3MzQgMCAyNDY3MDAwCisxNTA0NSAwIDI1MDAwMDAKKzc5NDAgMCAyNTMzMDAwCis5NjU3IDAgMjU2NzAwMAorODc0MyAwIDI2MDAwMDAKKzgwNzQgMCAyNjMzMDAwCis5NDQ1IDAgMjY2NzAwMAorNjQ5NCAwIDI3MDAwMDAKKzg2MDEgMCAyNzMzMDAwCisxMzQ3OCAwIDI3NjcwMDAKKzY5NDIgMCAyODAwMDAwCis4MDAyIDAgMjgzMzAwMAorNzk0MCAwIDI4NjcwMDAKKzgzMjAgMCAyOTAwMDAwCisxMjIxNSAwIDI5MzMwMDAKKzY2NjggMCAyOTY3MDAwCisxMTM4NCAwIDMwMDAwMDAKKzgzNzggMCAzMDMzMDAwCisxMjkwOCAwIDMwNjcwMDAKKzg0MjAgMCAzMTAwMDAwCis3NTAyIDAgMzEzMzAwMAorODQ4MiAwIDMxNjcwMDAKKzEwOTY4IDAgMzIwMDAwMAorMTIzMzggMCAzMjMzMDAwCis4NjU3IDAgMzI2NzAwMAorMTA0NjggMCAzMzAwMDAwCisxMzg3OCAwIDMzMzMwMDAKKzkzNzQgMCAzMzY3MDAwCis5ODU3IDAgMzQwMDAwMAorMTAzODEgMCAzNDMzMDAwCis5OTg0IDAgMzQ2NzAwMAorOTk1NiAwIDM1MDAwMDAKKzg5MDUgMCAzNTMzMDAwCis4NjcyIDAgMzU2NzAwMAorODEyMiAwIDM2MDAwMDAKKzk2NzcgMCAzNjMzMDAwCis5ODEyIDAgMzY2NzAwMAorOTYyMiAwIDM3MDAwMDAKKzkwMjMgMCAzNzMzMDAwCis3MTQ3IDAgMzc2NzAwMAorOTE0NiAwIDM4MDAwMDAKKzc0ODggMCAzODMzMDAwCisxMDgxMiAwIDM4NjcwMDAKKzgzNDAgMCAzOTAwMDAwCisxMzI4MCAwIDM5MzMwMDAKKzUxNjcgMCAzOTY3MDAwCis2OTkxIDAgNDAwMDAwMAorNjU0MyAwIDQwMzMwMDAKKzU5NTIgMCA0MDY3MDAwCis1MTY0IDAgNDEwMDAwMAorNDAxMSAwIDQxMzMwMDAKKzM3OTQgMCA0MTY3MDAwCisxMjk1OSAwIDQyMDAwMDAKKzcxMDIwIDEgNDIzMzAwMAorNTM1MSAwIDQyNjcwMDAKKzYyODMgMCA0MzAwMDAwCis1MDgwIDAgNDMzMzAwMAorNjcwNyAwIDQzNjcwMDAKKzU4NTcgMCA0NDAwMDAwCis1MjIxIDAgNDQzMzAwMAorMTA5NzIgMCA0NDY3MDAwCis3MDIzIDAgNDUwMDAwMAorNjkwNyAwIDQ1MzMwMDAKKzc4NTEgMCA0NTY3MDAwCis0ODQzIDAgNDYwMDAwMAorNjA4NSAwIDQ2MzMwMDAKKzQ4NjggMCA0NjY3MDAwCis1MDkzIDAgNDcwMDAwMAorMTI4MDcgMCA0NzMzMDAwCis2MzMwIDAgNDc2NzAwMAorNDIwOSAwIDQ4MDAwMDAKKzQ1OTYgMCA0ODMzMDAwCis2MzE2IDAgNDg2NzAwMAorNDk1NCAwIDQ5MDAwMDAKKzU1MzMgMCA0OTMzMDAwCis3NzQ5IDAgNDk2NzAwMAorMTI0ODYgMCA1MDAwMDAwCis1NDY4IDAgNTAzMzAwMAorNDM1MyAwIDUwNjcwMDAKKzU3ODYgMCA1MTAwMDAwCis1NTUxIDAgNTEzMzAwMAorNjcxMSAwIDUxNjcwMDAKKzU2ODggMCA1MjAwMDAwCis2MjU4IDAgNTIzMzAwMAorMTI5NzUgMCA1MjY3MDAwCis0ODczIDAgNTMwMDAwMAorNDU1MiAwIDUzMzMwMDAKKzQ4NDQgMCA1MzY3MDAwCis0Nzc0IDAgNTQwMDAwMAorNTAyNSAwIDU0MzMwMDAKKzUyMDQgMCA1NDY3MDAwCis0ODE0IDAgNTUwMDAwMAorMTQ4MzUgMCA1NTMzMDAwCis1MzQzIDAgNTU2NzAwMAorNDgwOCAwIDU2MDAwMDAKKzUwNzEgMCA1NjMzMDAwCis2MzI0IDAgNTY2NzAwMAorNTI0MyAwIDU3MDAwMDAKKzQ5OTUgMCA1NzMzMDAwCis1MTM0IDAgNTc2NzAwMAorMTEwNTQgMCA1ODAwMDAwCis0ODA3IDAgNTgzMzAwMAorNTExOCAwIDU4NjcwMDAKKzY0MjQgMCA1OTAwMDAwCis0OTg0IDAgNTkzMzAwMAorNzE4NyAwIDU5NjcwMDAKKzU1MDUgMCA2MDAwMDAwCis2OTQxIDAgNjAzMzAwMAorMTE1MTcgMCA2MDY3MDAwCis1NjQ2IDAgNjEwMDAwMAorNjgzMiAwIDYxMzMwMDAKKzUyOTQgMCA2MTY3MDAwCis2MjAwIDAgNjIwMDAwMAorNjMyOCAwIDYyMzMwMDAKKzQzNDggMCA2MjY3MDAwCis0NjA3IDAgNjMwMDAwMAorMTI5NTggMCA2MzMzMDAwCis0MzA4IDAgNjM2NzAwMAorNjA4NCAwIDY0MDAwMDAKKzQ0OTQgMCA2NDMzMDAwCis1MzM4IDAgNjQ2NzAwMAorNTc0MiAwIDY1MDAwMDAKKzU0NzIgMCA2NTMzMDAwCis4NDU5IDAgNjU2NzAwMAorMTMwNzUgMCA2NjAwMDAwCis4OTg2IDAgNjYzMzAwMAorOTU4MyAwIDY2NjcwMDAKKzg3OTIgMCA2NzAwMDAwCis5MDA0IDAgNjczMzAwMAorOTYzMiAwIDY3NjcwMDAKKzkzOTMgMCA2ODAwMDAwCis5MjU5IDAgNjgzMzAwMAorMTE5MjcgMCA2ODY3MDAwCisxMDMyMyAwIDY5MDAwMDAKKzE1MjQ4IDAgNjkzMzAwMAorMTEyNDQgMCA2OTY3MDAwCisxNTU1OCAwIDcwMDAwMDAKKzYxOTcgMCA3MDMzMDAwCis4MDQ0IDAgNzA2NzAwMAorMTE0MzIgMCA3MTAwMDAwCis4NzM3IDAgNzEzMzAwMAorMTM4ODUgMCA3MTY3MDAwCisxMTE1OCAwIDcyMDAwMDAKKzE1MTUyIDAgNzIzMzAwMAorNzAyNSAwIDcyNjcwMDAKKzgwMjUgMCA3MzAwMDAwCisxMzM2MiAwIDczMzMwMDAKKzgwOTAgMCA3MzY3MDAwCisxMzYzNyAwIDc0MDAwMDAKKzYxNDggMCA3NDMzMDAwCis5MjcwIDAgNzQ2NzAwMAorODYzMyAwIDc1MDAwMDAKKzEwNjczIDAgNzUzMzAwMAorMTQyMDggMCA3NTY3MDAwCis4MDg0IDAgNzYwMDAwMAorMTM3ODMgMCA3NjMzMDAwCisxMDY2MCAwIDc2NjcwMDAKKzc0NjYgMCA3NzAwMDAwCisxNDQzMyAwIDc3MzMwMDAKKzEwOTM0IDAgNzc2NzAwMAorNzIzOSAwIDc4MDAwMDAKKzEyNTQ4IDAgNzgzMzAwMAorNjU2NCAwIDc4NjcwMDAKKzEwNzYxIDAgNzkwMDAwMAorMTA5OTIgMCA3OTMzMDAwCisxMjkyNCAwIDc5NjcwMDAKKzEyMzQ4IDAgODAwMDAwMAorNjc3MCAwIDgwMzMwMDAKKzE0Mjg4IDAgODA2NzAwMAorMjkzNDUgMSA4MTAwMDAwCisxODIyIDAgODEzMzAwMAorMTA4NyAwIDgxNjcwMDAKKzExMDkgMCA4MjAwMDAwCisyMDA3IDAgODIzMzAwMAorMTc5OCAwIDgyNjcwMDAKKzE2MzUgMCA4MzAwMDAwCisxOTYwNyAwIDgzMzMwMDAKKzkxOSAwIDgzNjcwMDAKKzIzNTcgMCA4NDAwMDAwCiszNTc4IDAgODQzMzAwMAorNDQ5NyAwIDg0NjcwMDAKKzQzMTQgMCA4NTAwMDAwCiszODUxIDAgODUzMzAwMAorMzgyMiAwIDg1NjcwMDAKKzQyNTIgMCA4NjAwMDAwCis0Nzc1IDAgODYzMzAwMAorMTIyMDMgMCA4NjY3MDAwCis1MDc4IDAgODcwMDAwMAorNTg3NiAwIDg3MzMwMDAKKzYxMjQgMCA4NzY3MDAwCis0NDkwIDAgODgwMDAwMAorMzUzOCAwIDg4MzMwMDAKKzM0NTAgMCA4ODY3MDAwCiszNjExIDAgODkwMDAwMAorMjg0NyAwIDg5MzMwMDAKKzI2MDUgMCA4OTY3MDAwCisxMjI0MyAwIDkwMDAwMDAKKzE5NDYgMCA5MDMzMDAwCisxODQ3IDAgOTA2NzAwMAorMjAzNSAwIDkxMDAwMDAKKzI1NzIgMCA5MTMzMDAwCisyMzI2IDAgOTE2NzAwMAorMjY0NSAwIDkyMDAwMDAKKzI5MzggMCA5MjMzMDAwCisyNDk1IDAgOTI2NzAwMAorMjYwOSAwIDkzMDAwMDAKKzk3NDQgMCA5MzMzMDAwCisxNzk2IDAgOTM2NzAwMAorMTk4NSAwIDk0MDAwMDAKKzE3NTkgMCA5NDMzMDAwCisyMjU5IDAgOTQ2NzAwMAorMjIzMyAwIDk1MDAwMDAKKzIwNDQgMCA5NTMzMDAwCisyNTAyIDAgOTU2NzAwMAorMjMwNyAwIDk2MDAwMDAKKzI3MzkgMCA5NjMzMDAwCisxMTcwNyAwIDk2NjcwMDAKKzUxNjggMCA5NzAwMDAwCis0NDgzIDAgOTczMzAwMAorMzA0NCAwIDk3NjcwMDAKKzQyNDEgMCA5ODAwMDAwCis0MzkyIDAgOTgzMzAwMAorNDkzNCAwIDk4NjcwMDAKKzU5MzQgMCA5OTAwMDAwCis1NjQ3IDAgOTkzMzAwMAorNTMyNiAwIDk5NjcwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzQ2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzY5MzkgMSAwCis2ODE4IDAgMTcwMDAKKzMxMCAwIDMzMDAwCisyNzMgMCA1MDAwMAorMjY3IDAgNjcwMDAKKzIzOSAwIDgzMDAwCisyMzIgMCAxMDAwMDAKKzIyMiAwIDExNzAwMAorMTg2IDAgMTMzMDAwCisxOTQgMCAxNTAwMDAKKzE4OSAwIDE2NzAwMAorMTggMCAxODMwMDAKKzIwMTQgMCAyMDAwMDAKKzI5NyAwIDIxNzAwMAorMjg3IDAgMjMzMDAwCisyMzcgMCAyNTAwMDAKKzI2MyAwIDI2NzAwMAorMjM4IDAgMjgzMDAwCisyNTcgMCAzMDAwMDAKKzIyOSAwIDMxNzAwMAorMTg3IDAgMzMzMDAwCisxOTEgMCAzNTAwMDAKKzE4IDAgMzY3MDAwCisyMjAzIDAgMzgzMDAwCisyNjUgMCA0MDAwMDAKKzIyNCAwIDQxNzAwMAorMjU0IDAgNDMzMDAwCisyNTIgMCA0NTAwMDAKKzI3MyAwIDQ2NzAwMAorMjA4IDAgNDgzMDAwCisxNTQgMCA1MDAwMDAKKzE4MiAwIDUxNzAwMAorMTM4IDAgNTMzMDAwCisxOCAwIDU1MDAwMAorMjUwMiAwIDU2NzAwMAorMjg2IDAgNTgzMDAwCiszMDQgMCA2MDAwMDAKKzM0MSAwIDYxNzAwMAorMjU5IDAgNjMzMDAwCisyNzUgMCA2NTAwMDAKKzIyMiAwIDY2NzAwMAorMjU0IDAgNjgzMDAwCisyNTMgMCA3MDAwMDAKKzIyNSAwIDcxNzAwMAorMTggMCA3MzMwMDAKKzI1MDEgMCA3NTAwMDAKKzI4MiAwIDc2NzAwMAorMjk4IDAgNzgzMDAwCisyNTIgMCA4MDAwMDAKKzI0MiAwIDgxNzAwMAorMjUwIDAgODMzMDAwCisyNjAgMCA4NTAwMDAKKzIxOCAwIDg2NzAwMAorMjEzIDAgODgzMDAwCisxNDQgMCA5MDAwMDAKKzE4IDAgOTE3MDAwCisyMzMgMCA5MzMwMDAKKzI1NCAwIDk1MDAwMAorMjI5IDAgOTY3MDAwCisyMzkgMCA5ODMwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjMzYzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlOTY3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAwIEBACis1NDkxOCAxIDAKKzQ2MjgwIDAgMzMwMDAKKzIwMDYgMCA2NzAwMAorMjg0MSAwIDEwMDAwMAorMzA0NCAwIDEzMzAwMAorMzQyOSAwIDE2NzAwMAorMzE5NiAwIDIwMDAwMAorMjkyNiAwIDIzMzAwMAorMjgyMSAwIDI2NzAwMAorMTE1MCAwIDMwMDAwMAorMzYgMCAzMzMwMDAKKzM4MDg0IDAgMzY3MDAwCiszNjg5IDAgNDAwMDAwCiszNDczIDAgNDMzMDAwCiszMDExIDAgNDY3MDAwCiszMDkwIDAgNTAwMDAwCisyNTE2IDAgNTMzMDAwCisyNzcxIDAgNTY3MDAwCiszMjUwIDAgNjAwMDAwCisxMTU5IDAgNjMzMDAwCiszNCAwIDY2NzAwMAorMzk2OTAgMCA3MDAwMDAKKzM2MTUgMCA3MzMwMDAKKzI0OTQgMCA3NjcwMDAKKzI4OTMgMCA4MDAwMDAKKzMzMjkgMCA4MzMwMDAKKzI5MzkgMCA4NjcwMDAKKzIzNTIgMCA5MDAwMDAKKzI3MzIgMCA5MzMwMDAKKzE3NDYgMCA5NjcwMDAKKzMzIDAgMTAwMDAwMAorNDE1MDEgMCAxMDMzMDAwCisyOTk3IDAgMTA2NzAwMAorMjY2NiAwIDExMDAwMDAKKzM1ODIgMCAxMTMzMDAwCisyNjE2IDAgMTE2NzAwMAorMjkyMyAwIDEyMDAwMDAKKzI2OTYgMCAxMjMzMDAwCisxNjI4IDAgMTI2NzAwMAorMTg4NyAwIDEzMDAwMDAKKzMzIDAgMTMzMzAwMAorNDI4NzYgMCAxMzY3MDAwCisyNTg4IDAgMTQwMDAwMAorMzMxNiAwIDE0MzMwMDAKKzIyODcgMCAxNDY3MDAwCiszMzc1IDAgMTUwMDAwMAorMjEwOCAwIDE1MzMwMDAKKzI5NjEgMCAxNTY3MDAwCisxNzMwIDAgMTYwMDAwMAorMTgwMCAwIDE2MzMwMDAKKzM0IDAgMTY2NzAwMAorNDM3OTcgMCAxNzAwMDAwCisyNDg0IDAgMTczMzAwMAorMjU1NiAwIDE3NjcwMDAKKzI2NzEgMCAxODAwMDAwCisyMzM4IDAgMTgzMzAwMAorMzEzMyAwIDE4NjcwMDAKKzIwMDIgMCAxOTAwMDAwCisxNzk0IDAgMTkzMzAwMAorMTI3OSAwIDE5NjcwMDAKKzMyIDAgMjAwMDAwMAorNDI2NDIgMCAyMDMzMDAwCisyNjg2IDAgMjA2NzAwMAorMjIwMiAwIDIxMDAwMDAKKzIxNDUgMCAyMTMzMDAwCisyNTY2IDAgMjE2NzAwMAorMjE5MCAwIDIyMDAwMDAKKzE1ODAgMCAyMjMzMDAwCisxNzExIDAgMjI2NzAwMAorNjQ4IDAgMjMwMDAwMAorMzIgMCAyMzMzMDAwCis0MDQwOSAwIDIzNjcwMDAKKzI2MjggMCAyNDAwMDAwCisxOTczIDAgMjQzMzAwMAorMjM2MCAwIDI0NjcwMDAKKzMwNDMgMCAyNTAwMDAwCisxNzMwIDAgMjUzMzAwMAorMTQ1NiAwIDI1NjcwMDAKKzIzMTIgMCAyNjAwMDAwCiszNjkgMCAyNjMzMDAwCiszMiAwIDI2NjcwMDAKKzQxMzkxIDAgMjcwMDAwMAorMjk2NyAwIDI3MzMwMDAKKzI0NTQgMCAyNzY3MDAwCisxODI1IDAgMjgwMDAwMAorMTg1MyAwIDI4MzMwMDAKKzE3NDYgMCAyODY3MDAwCisyMzQ3IDAgMjkwMDAwMAorMTM2MiAwIDI5MzMwMDAKKzQ0MSAwIDI5NjcwMDAKKzM0IDAgMzAwMDAwMAorNDI1MDMgMCAzMDMzMDAwCisxODc3IDAgMzA2NzAwMAorMTY5MCAwIDMxMDAwMDAKKzEzNjcgMCAzMTMzMDAwCisxNTIwIDAgMzE2NzAwMAorMTI0MCAwIDMyMDAwMDAKKzEwOTQgMCAzMjMzMDAwCis3MzkgMCAzMjY3MDAwCiszOTIgMCAzMzAwMDAwCiszMyAwIDMzMzMwMDAKKzM1MTA0IDAgMzM2NzAwMAorMTQ2MyAwIDM0MDAwMDAKKzIwMjkgMCAzNDMzMDAwCisxNjI2IDAgMzQ2NzAwMAorMTk1NiAwIDM1MDAwMDAKKzc5OSAwIDM1MzMwMDAKKzU1NiAwIDM1NjcwMDAKKzU4NCAwIDM2MDAwMDAKKzE5MSAwIDM2MzMwMDAKKzM2IDAgMzY2NzAwMAorMzc2NTIgMCAzNzAwMDAwCis4NjIgMCAzNzMzMDAwCis1MjQgMCAzNzY3MDAwCis2NDEgMCAzODAwMDAwCis1ODQgMCAzODMzMDAwCiszNjAgMCAzODY3MDAwCiszNjUgMCAzOTAwMDAwCiszNjEgMCAzOTMzMDAwCisxNTQgMCAzOTY3MDAwCiszNiAwIDQwMDAwMDAKKzEyNTc0MCAwIDQwMzMwMDAKKzMzMiAwIDQwNjcwMDAKKzM4MSAwIDQxMDAwMDAKKzQyMCAwIDQxMzMwMDAKKzQ2NCAwIDQxNjcwMDAKKzI4OCAwIDQyMDAwMDAKKzI2NjAgMCA0MjMzMDAwCisxMjc1NjQgMSA0MjY3MDAwCiszMDY5NiAwIDQzMDAwMDAKKzM0MjMgMCA0MzMzMDAwCiszMzEwIDAgNDM2NzAwMAorMzUxMyAwIDQ0MDAwMDAKKzM3MzUgMCA0NDMzMDAwCiszMzU4IDAgNDQ2NzAwMAorMzEwOCAwIDQ1MDAwMDAKKzI4MDAgMCA0NTMzMDAwCisxNzUxIDAgNDU2NzAwMAorNDEgMCA0NjAwMDAwCiszOTg2MiAwIDQ2MzMwMDAKKzM3MzkgMCA0NjY3MDAwCiszNzU1IDAgNDcwMDAwMAorMzQwOCAwIDQ3MzMwMDAKKzM3ODMgMCA0NzY3MDAwCiszNDIzIDAgNDgwMDAwMAorMjgwMSAwIDQ4MzMwMDAKKzI1NDkgMCA0ODY3MDAwCisxNDYxIDAgNDkwMDAwMAorNDAgMCA0OTMzMDAwCis0MTY2NyAwIDQ5NjcwMDAKKzM2MjMgMCA1MDAwMDAwCiszMzU2IDAgNTAzMzAwMAorMzQyNCAwIDUwNjcwMDAKKzM1NDggMCA1MTAwMDAwCiszMTE5IDAgNTEzMzAwMAorMjkwNSAwIDUxNjcwMDAKKzI3NzIgMCA1MjAwMDAwCisxNjIzIDAgNTIzMzAwMAorNDMgMCA1MjY3MDAwCis0Njc4MyAwIDUzMDAwMDAKKzM0NjIgMCA1MzMzMDAwCiszNDcwIDAgNTM2NzAwMAorMzY3NyAwIDU0MDAwMDAKKzM2ODQgMCA1NDMzMDAwCiszMjY2IDAgNTQ2NzAwMAorMzEyNyAwIDU1MDAwMDAKKzI4MDkgMCA1NTMzMDAwCisxNzUwIDAgNTU2NzAwMAorNDAgMCA1NjAwMDAwCis0NjIxNSAwIDU2MzMwMDAKKzM1OTkgMCA1NjY3MDAwCiszNTU4IDAgNTcwMDAwMAorMzU0NCAwIDU3MzMwMDAKKzM2MzIgMCA1NzY3MDAwCiszNTQ4IDAgNTgwMDAwMAorMjk2OCAwIDU4MzMwMDAKKzI3MTUgMCA1ODY3MDAwCisxNzI5IDAgNTkwMDAwMAorNDEgMCA1OTMzMDAwCis0NTk1OCAwIDU5NjcwMDAKKzM3NzYgMCA2MDAwMDAwCiszNTI1IDAgNjAzMzAwMAorMzY0NCAwIDYwNjcwMDAKKzM3ODYgMCA2MTAwMDAwCiszMjIyIDAgNjEzMzAwMAorMjkyMyAwIDYxNjcwMDAKKzI3NTIgMCA2MjAwMDAwCisxNTkyIDAgNjIzMzAwMAorNDEgMCA2MjY3MDAwCis0NjAzMSAwIDYzMDAwMDAKKzM1MjAgMCA2MzMzMDAwCiszMzgwIDAgNjM2NzAwMAorMzM3MSAwIDY0MDAwMDAKKzM0MjcgMCA2NDMzMDAwCiszMTM1IDAgNjQ2NzAwMAorMjk4OCAwIDY1MDAwMDAKKzI3MzAgMCA2NTMzMDAwCisxNjcxIDAgNjU2NzAwMAorNDEgMCA2NjAwMDAwCis0NTg0NiAwIDY2MzMwMDAKKzM1MzUgMCA2NjY3MDAwCiszNTA3IDAgNjcwMDAwMAorMzQyOSAwIDY3MzMwMDAKKzM0OTEgMCA2NzY3MDAwCiszMzI1IDAgNjgwMDAwMAorMjk3OSAwIDY4MzMwMDAKKzI4MDAgMCA2ODY3MDAwCisxNjEwIDAgNjkwMDAwMAorNDAgMCA2OTMzMDAwCis0NTk1OCAwIDY5NjcwMDAKKzM3NjIgMCA3MDAwMDAwCiszMjU0IDAgNzAzMzAwMAorMzQwOCAwIDcwNjcwMDAKKzM4NjAgMCA3MTAwMDAwCiszMTk4IDAgNzEzMzAwMAorMjk2NiAwIDcxNjcwMDAKKzI4ODIgMCA3MjAwMDAwCisxNzYzIDAgNzIzMzAwMAorNDIgMCA3MjY3MDAwCis0NjEzMCAwIDczMDAwMDAKKzM1OTMgMCA3MzMzMDAwCiszNTIzIDAgNzM2NzAwMAorMzkzOSAwIDc0MDAwMDAKKzM5ODAgMCA3NDMzMDAwCiszNDcwIDAgNzQ2NzAwMAorMzE5MSAwIDc1MDAwMDAKKzI5NjkgMCA3NTMzMDAwCisxNzQwIDAgNzU2NzAwMAorNDEgMCA3NjAwMDAwCis0NjMwMCAwIDc2MzMwMDAKKzM3MzkgMCA3NjY3MDAwCiszNzgxIDAgNzcwMDAwMAorMzk2NCAwIDc3MzMwMDAKKzQwMjMgMCA3NzY3MDAwCiszNDgwIDAgNzgwMDAwMAorMzA2NSAwIDc4MzMwMDAKKzI5MzQgMCA3ODY3MDAwCisxODA1IDAgNzkwMDAwMAorNDIgMCA3OTMzMDAwCiszODE2NiAwIDc5NjcwMDAKKzQwNjIgMCA4MDAwMDAwCiszODQ0IDAgODAzMzAwMAorNDU0NyAwIDgwNjcwMDAKKzkzNCAwIDgxMDAwMDAKKzM2NSAwIDgxMzMwMDAKKzE4MSAwIDgxNjcwMDAKKzQ2MyAwIDgyMDAwMDAKKzQxOSAwIDgyMzMwMDAKKzM4IDAgODI2NzAwMAorOTcwMiAwIDgzMDAwMDAKKzM0NCAwIDgzMzMwMDAKKzI3NiAwIDgzNjcwMDAKKzEzNTAgMCA4NDAwMDAwCisxNzAzIDAgODQzMzAwMAorMTg0MyAwIDg0NjcwMDAKKzEyMjggMCA4NTAwMDAwCiszNTU4MCAxIDg1MzMwMDAKKzI3NDU4IDAgODU2NzAwMAorMjE0NCAwIDg2MDAwMDAKKzI0ODIgMCA4NjMzMDAwCisyMDA0IDAgODY2NzAwMAorMjgyMiAwIDg3MDAwMDAKKzI1NzAgMCA4NzMzMDAwCisxNzI2IDAgODc2NzAwMAorMTI0OCAwIDg4MDAwMDAKKzg0NCAwIDg4MzMwMDAKKzM1IDAgODg2NzAwMAorMTQyMDcgMCA4OTAwMDAwCisxMDM3IDAgODkzMzAwMAorNzQ5IDAgODk2NzAwMAorODI5IDAgOTAwMDAwMAorOTE1IDAgOTAzMzAwMAorNjg1IDAgOTA2NzAwMAorNzY3IDAgOTEwMDAwMAorNzk4IDAgOTEzMzAwMAorMzQyIDAgOTE2NzAwMAorMzEgMCA5MjAwMDAwCisxMjU5MCAwIDkyMzMwMDAKKzkyMyAwIDkyNjcwMDAKKzgxOSAwIDkzMDAwMDAKKzc3NiAwIDkzMzMwMDAKKzg2MyAwIDkzNjcwMDAKKzcyOSAwIDk0MDAwMDAKKzQ3MSAwIDk0MzMwMDAKKzYzOCAwIDk0NjcwMDAKKzI3NiAwIDk1MDAwMDAKKzM4IDAgOTUzMzAwMAorMTcyNzIgMCA5NTY3MDAwCis4NTYgMCA5NjAwMDAwCisxMTU4IDAgOTYzMzAwMAorMjE3MiAwIDk2NjcwMDAKKzI3NTEgMCA5NzAwMDAwCisyMTQyIDAgOTczMzAwMAorMTI2NyAwIDk3NjcwMDAKKzE5NjUgMCA5ODAwMDAwCisxNTEwIDAgOTgzMzAwMAorMzQgMCA5ODY3MDAwCisyNjkyIDAgOTkwMDAwMAorMjc3OCAwIDk5MzMwMDAKKzI1ODUgMCA5OTY3MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWUyMDAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFmMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbwpAQCAtMCwwICsxLDgzMyBAQAorMzIgMSAwCiszMiAxIDIwMDAwCiszMiAxIDQwMDAwCiszMiAxIDYwMDAwCiszMiAxIDgwMDAwCiszMiAxIDEwMDAwMAorMzIgMSAxMjAwMDAKKzMyIDEgMTQwMDAwCiszMiAxIDE2MDAwMAorMzIgMSAxODAwMDAKKzMyIDEgMjAwMDAwCiszMiAxIDIyMDAwMAorMzIgMSAyNDAwMDAKKzMyIDEgMjYwMDAwCiszMiAxIDI4MDAwMAorMzIgMSAzMDAwMDAKKzMyIDEgMzIwMDAwCiszMiAxIDM0MDAwMAorMzIgMSAzNjAwMDAKKzMyIDEgMzgwMDAwCiszMiAxIDQwMDAwMAorMzIgMSA0MjAwMDAKKzMyIDEgNDQwMDAwCiszMiAxIDQ2MDAwMAorMzIgMSA0ODAwMDAKKzMyIDEgNTAwMDAwCiszMiAxIDUyMDAwMAorMzIgMSA1NDAwMDAKKzMyIDEgNTYwMDAwCiszMiAxIDU4MDAwMAorMzIgMSA2MDAwMDAKKzMyIDEgNjIwMDAwCiszMiAxIDY0MDAwMAorMzIgMSA2NjAwMDAKKzMyIDEgNjgwMDAwCiszMiAxIDcwMDAwMAorMzIgMSA3MjAwMDAKKzMyIDEgNzQwMDAwCiszMiAxIDc2MDAwMAorMzIgMSA3ODAwMDAKKzMyIDEgODAwMDAwCiszMiAxIDgyMDAwMAorMzIgMSA4NDAwMDAKKzMyIDEgODYwMDAwCiszMiAxIDg4MDAwMAorMzIgMSA5MDAwMDAKKzMyIDEgOTIwMDAwCiszMiAxIDk0MDAwMAorMzIgMSA5NjAwMDAKKzMyIDEgOTgwMDAwCiszMiAxIDEwMDAwMDAKKzMyIDEgMTAyMDAwMAorMzIgMSAxMDQwMDAwCiszMiAxIDEwNjAwMDAKKzMyIDEgMTA4MDAwMAorMzIgMSAxMTAwMDAwCiszMiAxIDExMjAwMDAKKzMyIDEgMTE0MDAwMAorMzIgMSAxMTYwMDAwCiszMiAxIDExODAwMDAKKzMyIDEgMTIwMDAwMAorMzIgMSAxMjIwMDAwCiszMiAxIDEyNDAwMDAKKzMyIDEgMTI2MDAwMAorMzIgMSAxMjgwMDAwCiszMiAxIDEzMDAwMDAKKzMyIDEgMTMyMDAwMAorMzIgMSAxMzQwMDAwCiszMiAxIDEzNjAwMDAKKzMyIDEgMTM4MDAwMAorMzIgMSAxNDAwMDAwCiszMiAxIDE0MjAwMDAKKzMyIDEgMTQ0MDAwMAorMzIgMSAxNDYwMDAwCiszMiAxIDE0ODAwMDAKKzMyIDEgMTUwMDAwMAorMzIgMSAxNTIwMDAwCiszMiAxIDE1NDAwMDAKKzMyIDEgMTU2MDAwMAorMzIgMSAxNTgwMDAwCiszMiAxIDE2MDAwMDAKKzMyIDEgMTYyMDAwMAorMzIgMSAxNjQwMDAwCiszMiAxIDE2NjAwMDAKKzMyIDEgMTY4MDAwMAorMzIgMSAxNzAwMDAwCiszMiAxIDE3MjAwMDAKKzMyIDEgMTc0MDAwMAorMzIgMSAxNzYwMDAwCiszMiAxIDE3ODAwMDAKKzMyIDEgMTgwMDAwMAorMzIgMSAxODIwMDAwCiszMiAxIDE4NDAwMDAKKzMyIDEgMTg2MDAwMAorMzIgMSAxODgwMDAwCiszMiAxIDE5MDAwMDAKKzMyIDEgMTkyMDAwMAorMzIgMSAxOTQwMDAwCiszMiAxIDE5NjAwMDAKKzMyIDEgMTk4MDAwMAorMzIgMSAyMDAwMDAwCiszMiAxIDIwMjAwMDAKKzMyIDEgMjA0MDAwMAorMzIgMSAyMDYwMDAwCiszMiAxIDIwODAwMDAKKzMyIDEgMjEwMDAwMAorMzIgMSAyMTIwMDAwCiszMiAxIDIxNDAwMDAKKzMyIDEgMjE2MDAwMAorMzIgMSAyMTgwMDAwCiszMiAxIDIyMDAwMDAKKzMyIDEgMjIyMDAwMAorMzIgMSAyMjQwMDAwCiszMiAxIDIyNjAwMDAKKzMyIDEgMjI4MDAwMAorMzIgMSAyMzAwMDAwCiszMiAxIDIzMjAwMDAKKzMyIDEgMjM0MDAwMAorMzIgMSAyMzYwMDAwCiszMiAxIDIzODAwMDAKKzMyIDEgMjQwMDAwMAorMzIgMSAyNDIwMDAwCiszMiAxIDI0NDAwMDAKKzMyIDEgMjQ2MDAwMAorMzIgMSAyNDgwMDAwCiszMiAxIDI1MDAwMDAKKzMyIDEgMjUyMDAwMAorMzIgMSAyNTQwMDAwCiszMiAxIDI1NjAwMDAKKzMyIDEgMjU4MDAwMAorMzIgMSAyNjAwMDAwCiszMiAxIDI2MjAwMDAKKzMyIDEgMjY0MDAwMAorMzIgMSAyNjYwMDAwCiszMiAxIDI2ODAwMDAKKzMyIDEgMjcwMDAwMAorMzIgMSAyNzIwMDAwCiszMiAxIDI3NDAwMDAKKzMyIDEgMjc2MDAwMAorMzIgMSAyNzgwMDAwCiszMiAxIDI4MDAwMDAKKzMyIDEgMjgyMDAwMAorMzIgMSAyODQwMDAwCiszMiAxIDI4NjAwMDAKKzMyIDEgMjg4MDAwMAorMzIgMSAyOTAwMDAwCiszMiAxIDI5MjAwMDAKKzMyIDEgMjk0MDAwMAorMzIgMSAyOTYwMDAwCiszMiAxIDI5ODAwMDAKKzMyIDEgMzAwMDAwMAorMzIgMSAzMDIwMDAwCiszMiAxIDMwNDAwMDAKKzMyIDEgMzA2MDAwMAorMzIgMSAzMDgwMDAwCiszMiAxIDMxMDAwMDAKKzMyIDEgMzEyMDAwMAorMzIgMSAzMTQwMDAwCiszMiAxIDMxNjAwMDAKKzMyIDEgMzE4MDAwMAorMzIgMSAzMjAwMDAwCiszMiAxIDMyMjAwMDAKKzMyIDEgMzI0MDAwMAorMzIgMSAzMjYwMDAwCiszMiAxIDMyODAwMDAKKzMyIDEgMzMwMDAwMAorMzIgMSAzMzIwMDAwCiszMiAxIDMzNDAwMDAKKzMyIDEgMzM2MDAwMAorMzIgMSAzMzgwMDAwCiszMiAxIDM0MDAwMDAKKzMyIDEgMzQyMDAwMAorMzIgMSAzNDQwMDAwCiszMiAxIDM0NjAwMDAKKzMyIDEgMzQ4MDAwMAorMzIgMSAzNTAwMDAwCiszMiAxIDM1MjAwMDAKKzMyIDEgMzU0MDAwMAorMzIgMSAzNTYwMDAwCiszMiAxIDM1ODAwMDAKKzMyIDEgMzYwMDAwMAorMzIgMSAzNjIwMDAwCiszMiAxIDM2NDAwMDAKKzMyIDEgMzY2MDAwMAorMzIgMSAzNjgwMDAwCiszMiAxIDM3MDAwMDAKKzMyIDEgMzcyMDAwMAorMzIgMSAzNzQwMDAwCiszMiAxIDM3NjAwMDAKKzMyIDEgMzc4MDAwMAorMzIgMSAzODAwMDAwCiszMiAxIDM4MjAwMDAKKzMyIDEgMzg0MDAwMAorMzIgMSAzODYwMDAwCiszMiAxIDM4ODAwMDAKKzMyIDEgMzkwMDAwMAorMzIgMSAzOTIwMDAwCiszMiAxIDM5NDAwMDAKKzMyIDEgMzk2MDAwMAorMzIgMSAzOTgwMDAwCiszMiAxIDQwMDAwMDAKKzMyIDEgNDAyMDAwMAorMzIgMSA0MDQwMDAwCiszMiAxIDQwNjAwMDAKKzMyIDEgNDA4MDAwMAorMzIgMSA0MTAwMDAwCiszMiAxIDQxMjAwMDAKKzMyIDEgNDE0MDAwMAorMzIgMSA0MTYwMDAwCiszMiAxIDQxODAwMDAKKzMyIDEgNDIwMDAwMAorMzIgMSA0MjIwMDAwCiszMiAxIDQyNDAwMDAKKzMyIDEgNDI2MDAwMAorMzIgMSA0MjgwMDAwCiszMiAxIDQzMDAwMDAKKzMyIDEgNDMyMDAwMAorMzIgMSA0MzQwMDAwCiszMiAxIDQzNjAwMDAKKzMyIDEgNDM4MDAwMAorMzIgMSA0NDAwMDAwCiszMiAxIDQ0MjAwMDAKKzMyIDEgNDQ0MDAwMAorMzIgMSA0NDYwMDAwCiszMiAxIDQ0ODAwMDAKKzMyIDEgNDUwMDAwMAorMzIgMSA0NTIwMDAwCiszMiAxIDQ1NDAwMDAKKzMyIDEgNDU2MDAwMAorMzIgMSA0NTgwMDAwCiszMiAxIDQ2MDAwMDAKKzMyIDEgNDYyMDAwMAorMzIgMSA0NjQwMDAwCiszMiAxIDQ2NjAwMDAKKzMyIDEgNDY4MDAwMAorMzIgMSA0NzAwMDAwCiszMiAxIDQ3MjAwMDAKKzMyIDEgNDc0MDAwMAorMzIgMSA0NzYwMDAwCiszMiAxIDQ3ODAwMDAKKzMyIDEgNDgwMDAwMAorMzIgMSA0ODIwMDAwCiszMiAxIDQ4NDAwMDAKKzMyIDEgNDg2MDAwMAorMzIgMSA0ODgwMDAwCiszMiAxIDQ5MDAwMDAKKzMyIDEgNDkyMDAwMAorMzIgMSA0OTQwMDAwCiszMiAxIDQ5NjAwMDAKKzMyIDEgNDk4MDAwMAorMzIgMSA1MDAwMDAwCiszMiAxIDUwMjAwMDAKKzMyIDEgNTA0MDAwMAorMzIgMSA1MDYwMDAwCiszMiAxIDUwODAwMDAKKzMyIDEgNTEwMDAwMAorMzIgMSA1MTIwMDAwCiszMiAxIDUxNDAwMDAKKzMyIDEgNTE2MDAwMAorMzIgMSA1MTgwMDAwCiszMiAxIDUyMDAwMDAKKzMyIDEgNTIyMDAwMAorMzIgMSA1MjQwMDAwCiszMiAxIDUyNjAwMDAKKzMyIDEgNTI4MDAwMAorMzIgMSA1MzAwMDAwCiszMiAxIDUzMjAwMDAKKzMyIDEgNTM0MDAwMAorMzIgMSA1MzYwMDAwCiszMiAxIDUzODAwMDAKKzMyIDEgNTQwMDAwMAorMzIgMSA1NDIwMDAwCiszMiAxIDU0NDAwMDAKKzMyIDEgNTQ2MDAwMAorMzIgMSA1NDgwMDAwCiszMiAxIDU1MDAwMDAKKzMyIDEgNTUyMDAwMAorMzIgMSA1NTQwMDAwCiszMiAxIDU1NjAwMDAKKzMyIDEgNTU4MDAwMAorMzIgMSA1NjAwMDAwCiszMiAxIDU2MjAwMDAKKzMyIDEgNTY0MDAwMAorMzIgMSA1NjYwMDAwCiszMiAxIDU2ODAwMDAKKzMyIDEgNTcwMDAwMAorMzIgMSA1NzIwMDAwCiszMiAxIDU3NDAwMDAKKzMyIDEgNTc2MDAwMAorMzIgMSA1NzgwMDAwCiszMiAxIDU4MDAwMDAKKzMyIDEgNTgyMDAwMAorMzIgMSA1ODQwMDAwCiszMiAxIDU4NjAwMDAKKzMyIDEgNTg4MDAwMAorMzIgMSA1OTAwMDAwCiszMiAxIDU5MjAwMDAKKzMyIDEgNTk0MDAwMAorMzIgMSA1OTYwMDAwCiszMiAxIDU5ODAwMDAKKzMyIDEgNjAwMDAwMAorMzIgMSA2MDIwMDAwCiszMiAxIDYwNDAwMDAKKzMyIDEgNjA2MDAwMAorMzIgMSA2MDgwMDAwCiszMiAxIDYxMDAwMDAKKzMyIDEgNjEyMDAwMAorMzIgMSA2MTQwMDAwCiszMiAxIDYxNjAwMDAKKzMyIDEgNjE4MDAwMAorMzIgMSA2MjAwMDAwCiszMiAxIDYyMjAwMDAKKzMyIDEgNjI0MDAwMAorMzIgMSA2MjYwMDAwCiszMiAxIDYyODAwMDAKKzMyIDEgNjMwMDAwMAorMzIgMSA2MzIwMDAwCiszMiAxIDYzNDAwMDAKKzMyIDEgNjM2MDAwMAorMzIgMSA2MzgwMDAwCiszMiAxIDY0MDAwMDAKKzMyIDEgNjQyMDAwMAorMzIgMSA2NDQwMDAwCiszMiAxIDY0NjAwMDAKKzMyIDEgNjQ4MDAwMAorMzIgMSA2NTAwMDAwCiszMiAxIDY1MjAwMDAKKzMyIDEgNjU0MDAwMAorMzIgMSA2NTYwMDAwCiszMiAxIDY1ODAwMDAKKzMyIDEgNjYwMDAwMAorMzIgMSA2NjIwMDAwCiszMiAxIDY2NDAwMDAKKzMyIDEgNjY2MDAwMAorMzIgMSA2NjgwMDAwCiszMiAxIDY3MDAwMDAKKzMyIDEgNjcyMDAwMAorMzIgMSA2NzQwMDAwCiszMiAxIDY3NjAwMDAKKzMyIDEgNjc4MDAwMAorMzIgMSA2ODAwMDAwCiszMiAxIDY4MjAwMDAKKzMyIDEgNjg0MDAwMAorMzIgMSA2ODYwMDAwCiszMiAxIDY4ODAwMDAKKzMyIDEgNjkwMDAwMAorMzIgMSA2OTIwMDAwCiszMiAxIDY5NDAwMDAKKzMyIDEgNjk2MDAwMAorMzIgMSA2OTgwMDAwCiszMiAxIDcwMDAwMDAKKzMyIDEgNzAyMDAwMAorMzIgMSA3MDQwMDAwCiszMiAxIDcwNjAwMDAKKzMyIDEgNzA4MDAwMAorMzIgMSA3MTAwMDAwCiszMiAxIDcxMjAwMDAKKzMyIDEgNzE0MDAwMAorMzIgMSA3MTYwMDAwCiszMiAxIDcxODAwMDAKKzMyIDEgNzIwMDAwMAorMzIgMSA3MjIwMDAwCiszMiAxIDcyNDAwMDAKKzMyIDEgNzI2MDAwMAorMzIgMSA3MjgwMDAwCiszMiAxIDczMDAwMDAKKzMyIDEgNzMyMDAwMAorMzIgMSA3MzQwMDAwCiszMiAxIDczNjAwMDAKKzMyIDEgNzM4MDAwMAorMzIgMSA3NDAwMDAwCiszMiAxIDc0MjAwMDAKKzMyIDEgNzQ0MDAwMAorMzIgMSA3NDYwMDAwCiszMiAxIDc0ODAwMDAKKzMyIDEgNzUwMDAwMAorMzIgMSA3NTIwMDAwCiszMiAxIDc1NDAwMDAKKzMyIDEgNzU2MDAwMAorMzIgMSA3NTgwMDAwCiszMiAxIDc2MDAwMDAKKzMyIDEgNzYyMDAwMAorMzIgMSA3NjQwMDAwCiszMiAxIDc2NjAwMDAKKzMyIDEgNzY4MDAwMAorMzIgMSA3NzAwMDAwCiszMiAxIDc3MjAwMDAKKzMyIDEgNzc0MDAwMAorMzIgMSA3NzYwMDAwCiszMiAxIDc3ODAwMDAKKzMyIDEgNzgwMDAwMAorMzIgMSA3ODIwMDAwCiszMiAxIDc4NDAwMDAKKzMyIDEgNzg2MDAwMAorMzIgMSA3ODgwMDAwCiszMiAxIDc5MDAwMDAKKzMyIDEgNzkyMDAwMAorMzIgMSA3OTQwMDAwCiszMiAxIDc5NjAwMDAKKzMyIDEgNzk4MDAwMAorMzIgMSA4MDAwMDAwCiszMiAxIDgwMjAwMDAKKzMyIDEgODA0MDAwMAorMzIgMSA4MDYwMDAwCiszMiAxIDgwODAwMDAKKzMyIDEgODEwMDAwMAorMzIgMSA4MTIwMDAwCiszMiAxIDgxNDAwMDAKKzMyIDEgODE2MDAwMAorMzIgMSA4MTgwMDAwCiszMiAxIDgyMDAwMDAKKzMyIDEgODIyMDAwMAorMzIgMSA4MjQwMDAwCiszMiAxIDgyNjAwMDAKKzMyIDEgODI4MDAwMAorMzIgMSA4MzAwMDAwCiszMiAxIDgzMjAwMDAKKzMyIDEgODM0MDAwMAorMzIgMSA4MzYwMDAwCiszMiAxIDgzODAwMDAKKzMyIDEgODQwMDAwMAorMzIgMSA4NDIwMDAwCiszMiAxIDg0NDAwMDAKKzMyIDEgODQ2MDAwMAorMzIgMSA4NDgwMDAwCiszMiAxIDg1MDAwMDAKKzMyIDEgODUyMDAwMAorMzIgMSA4NTQwMDAwCiszMiAxIDg1NjAwMDAKKzMyIDEgODU4MDAwMAorMzIgMSA4NjAwMDAwCiszMiAxIDg2MjAwMDAKKzMyIDEgODY0MDAwMAorMzIgMSA4NjYwMDAwCiszMiAxIDg2ODAwMDAKKzMyIDEgODcwMDAwMAorMzIgMSA4NzIwMDAwCiszMiAxIDg3NDAwMDAKKzMyIDEgODc2MDAwMAorMzIgMSA4NzgwMDAwCiszMiAxIDg4MDAwMDAKKzMyIDEgODgyMDAwMAorMzIgMSA4ODQwMDAwCiszMiAxIDg4NjAwMDAKKzMyIDEgODg4MDAwMAorMzIgMSA4OTAwMDAwCiszMiAxIDg5MjAwMDAKKzMyIDEgODk0MDAwMAorMzIgMSA4OTYwMDAwCiszMiAxIDg5ODAwMDAKKzMyIDEgOTAwMDAwMAorMzIgMSA5MDIwMDAwCiszMiAxIDkwNDAwMDAKKzMyIDEgOTA2MDAwMAorMzIgMSA5MDgwMDAwCiszMiAxIDkxMDAwMDAKKzMyIDEgOTEyMDAwMAorMzIgMSA5MTQwMDAwCiszMiAxIDkxNjAwMDAKKzMyIDEgOTE4MDAwMAorMzIgMSA5MjAwMDAwCiszMiAxIDkyMjAwMDAKKzMyIDEgOTI0MDAwMAorMzIgMSA5MjYwMDAwCiszMiAxIDkyODAwMDAKKzMyIDEgOTMwMDAwMAorMzIgMSA5MzIwMDAwCiszMiAxIDkzNDAwMDAKKzMyIDEgOTM2MDAwMAorMzIgMSA5MzgwMDAwCiszMiAxIDk0MDAwMDAKKzMyIDEgOTQyMDAwMAorMzIgMSA5NDQwMDAwCiszMiAxIDk0NjAwMDAKKzMyIDEgOTQ4MDAwMAorMzIgMSA5NTAwMDAwCiszMiAxIDk1MjAwMDAKKzMyIDEgOTU0MDAwMAorMzIgMSA5NTYwMDAwCiszMiAxIDk1ODAwMDAKKzMyIDEgOTYwMDAwMAorMzIgMSA5NjIwMDAwCiszMiAxIDk2NDAwMDAKKzMyIDEgOTY2MDAwMAorMzIgMSA5NjgwMDAwCiszMiAxIDk3MDAwMDAKKzMyIDEgOTcyMDAwMAorMzIgMSA5NzQwMDAwCiszMiAxIDk3NjAwMDAKKzMyIDEgOTc4MDAwMAorMzIgMSA5ODAwMDAwCiszMiAxIDk4MjAwMDAKKzMyIDEgOTg0MDAwMAorMzIgMSA5ODYwMDAwCiszMiAxIDk4ODAwMDAKKzMyIDEgOTkwMDAwMAorMzIgMSA5OTIwMDAwCiszMiAxIDk5NDAwMDAKKzMyIDEgOTk2MDAwMAorMzIgMSA5OTgwMDAwCiszMiAxIDEwMDAwMDAwCiszMiAxIDEwMDIwMDAwCiszMiAxIDEwMDQwMDAwCiszMiAxIDEwMDYwMDAwCiszMiAxIDEwMDgwMDAwCiszMiAxIDEwMTAwMDAwCiszMiAxIDEwMTIwMDAwCiszMiAxIDEwMTQwMDAwCiszMiAxIDEwMTYwMDAwCiszMiAxIDEwMTgwMDAwCiszMiAxIDEwMjAwMDAwCiszMiAxIDEwMjIwMDAwCiszMiAxIDEwMjQwMDAwCiszMiAxIDEwMjYwMDAwCiszMiAxIDEwMjgwMDAwCiszMiAxIDEwMzAwMDAwCiszMiAxIDEwMzIwMDAwCiszMiAxIDEwMzQwMDAwCiszMiAxIDEwMzYwMDAwCiszMiAxIDEwMzgwMDAwCiszMiAxIDEwNDAwMDAwCiszMiAxIDEwNDIwMDAwCiszMiAxIDEwNDQwMDAwCiszMiAxIDEwNDYwMDAwCiszMiAxIDEwNDgwMDAwCiszMiAxIDEwNTAwMDAwCiszMiAxIDEwNTIwMDAwCiszMiAxIDEwNTQwMDAwCiszMiAxIDEwNTYwMDAwCiszMiAxIDEwNTgwMDAwCiszMiAxIDEwNjAwMDAwCiszMiAxIDEwNjIwMDAwCiszMiAxIDEwNjQwMDAwCiszMiAxIDEwNjYwMDAwCiszMiAxIDEwNjgwMDAwCiszMiAxIDEwNzAwMDAwCiszMiAxIDEwNzIwMDAwCiszMiAxIDEwNzQwMDAwCiszMiAxIDEwNzYwMDAwCiszMiAxIDEwNzgwMDAwCiszMiAxIDEwODAwMDAwCiszMiAxIDEwODIwMDAwCiszMiAxIDEwODQwMDAwCiszMiAxIDEwODYwMDAwCiszMiAxIDEwODgwMDAwCiszMiAxIDEwOTAwMDAwCiszMiAxIDEwOTIwMDAwCiszMiAxIDEwOTQwMDAwCiszMiAxIDEwOTYwMDAwCiszMiAxIDEwOTgwMDAwCiszMiAxIDExMDAwMDAwCiszMiAxIDExMDIwMDAwCiszMiAxIDExMDQwMDAwCiszMiAxIDExMDYwMDAwCiszMiAxIDExMDgwMDAwCiszMiAxIDExMTAwMDAwCiszMiAxIDExMTIwMDAwCiszMiAxIDExMTQwMDAwCiszMiAxIDExMTYwMDAwCiszMiAxIDExMTgwMDAwCiszMiAxIDExMjAwMDAwCiszMiAxIDExMjIwMDAwCiszMiAxIDExMjQwMDAwCiszMiAxIDExMjYwMDAwCiszMiAxIDExMjgwMDAwCiszMiAxIDExMzAwMDAwCiszMiAxIDExMzIwMDAwCiszMiAxIDExMzQwMDAwCiszMiAxIDExMzYwMDAwCiszMiAxIDExMzgwMDAwCiszMiAxIDExNDAwMDAwCiszMiAxIDExNDIwMDAwCiszMiAxIDExNDQwMDAwCiszMiAxIDExNDYwMDAwCiszMiAxIDExNDgwMDAwCiszMiAxIDExNTAwMDAwCiszMiAxIDExNTIwMDAwCiszMiAxIDExNTQwMDAwCiszMiAxIDExNTYwMDAwCiszMiAxIDExNTgwMDAwCiszMiAxIDExNjAwMDAwCiszMiAxIDExNjIwMDAwCiszMiAxIDExNjQwMDAwCiszMiAxIDExNjYwMDAwCiszMiAxIDExNjgwMDAwCiszMiAxIDExNzAwMDAwCiszMiAxIDExNzIwMDAwCiszMiAxIDExNzQwMDAwCiszMiAxIDExNzYwMDAwCiszMiAxIDExNzgwMDAwCiszMiAxIDExODAwMDAwCiszMiAxIDExODIwMDAwCiszMiAxIDExODQwMDAwCiszMiAxIDExODYwMDAwCiszMiAxIDExODgwMDAwCiszMiAxIDExOTAwMDAwCiszMiAxIDExOTIwMDAwCiszMiAxIDExOTQwMDAwCiszMiAxIDExOTYwMDAwCiszMiAxIDExOTgwMDAwCiszMiAxIDEyMDAwMDAwCiszMiAxIDEyMDIwMDAwCiszMiAxIDEyMDQwMDAwCiszMiAxIDEyMDYwMDAwCiszMiAxIDEyMDgwMDAwCiszMiAxIDEyMTAwMDAwCiszMiAxIDEyMTIwMDAwCiszMiAxIDEyMTQwMDAwCiszMiAxIDEyMTYwMDAwCiszMiAxIDEyMTgwMDAwCiszMiAxIDEyMjAwMDAwCiszMiAxIDEyMjIwMDAwCiszMiAxIDEyMjQwMDAwCiszMiAxIDEyMjYwMDAwCiszMiAxIDEyMjgwMDAwCiszMiAxIDEyMzAwMDAwCiszMiAxIDEyMzIwMDAwCiszMiAxIDEyMzQwMDAwCiszMiAxIDEyMzYwMDAwCiszMiAxIDEyMzgwMDAwCiszMiAxIDEyNDAwMDAwCiszMiAxIDEyNDIwMDAwCiszMiAxIDEyNDQwMDAwCiszMiAxIDEyNDYwMDAwCiszMiAxIDEyNDgwMDAwCiszMiAxIDEyNTAwMDAwCiszMiAxIDEyNTIwMDAwCiszMiAxIDEyNTQwMDAwCiszMiAxIDEyNTYwMDAwCiszMiAxIDEyNTgwMDAwCiszMiAxIDEyNjAwMDAwCiszMiAxIDEyNjIwMDAwCiszMiAxIDEyNjQwMDAwCiszMiAxIDEyNjYwMDAwCiszMiAxIDEyNjgwMDAwCiszMiAxIDEyNzAwMDAwCiszMiAxIDEyNzIwMDAwCiszMiAxIDEyNzQwMDAwCiszMiAxIDEyNzYwMDAwCiszMiAxIDEyNzgwMDAwCiszMiAxIDEyODAwMDAwCiszMiAxIDEyODIwMDAwCiszMiAxIDEyODQwMDAwCiszMiAxIDEyODYwMDAwCiszMiAxIDEyODgwMDAwCiszMiAxIDEyOTAwMDAwCiszMiAxIDEyOTIwMDAwCiszMiAxIDEyOTQwMDAwCiszMiAxIDEyOTYwMDAwCiszMiAxIDEyOTgwMDAwCiszMiAxIDEzMDAwMDAwCiszMiAxIDEzMDIwMDAwCiszMiAxIDEzMDQwMDAwCiszMiAxIDEzMDYwMDAwCiszMiAxIDEzMDgwMDAwCiszMiAxIDEzMTAwMDAwCiszMiAxIDEzMTIwMDAwCiszMiAxIDEzMTQwMDAwCiszMiAxIDEzMTYwMDAwCiszMiAxIDEzMTgwMDAwCiszMiAxIDEzMjAwMDAwCiszMiAxIDEzMjIwMDAwCiszMiAxIDEzMjQwMDAwCiszMiAxIDEzMjYwMDAwCiszMiAxIDEzMjgwMDAwCiszMiAxIDEzMzAwMDAwCiszMiAxIDEzMzIwMDAwCiszMiAxIDEzMzQwMDAwCiszMiAxIDEzMzYwMDAwCiszMiAxIDEzMzgwMDAwCiszMiAxIDEzNDAwMDAwCiszMiAxIDEzNDIwMDAwCiszMiAxIDEzNDQwMDAwCiszMiAxIDEzNDYwMDAwCiszMiAxIDEzNDgwMDAwCiszMiAxIDEzNTAwMDAwCiszMiAxIDEzNTIwMDAwCiszMiAxIDEzNTQwMDAwCiszMiAxIDEzNTYwMDAwCiszMiAxIDEzNTgwMDAwCiszMiAxIDEzNjAwMDAwCiszMiAxIDEzNjIwMDAwCiszMiAxIDEzNjQwMDAwCiszMiAxIDEzNjYwMDAwCiszMiAxIDEzNjgwMDAwCiszMiAxIDEzNzAwMDAwCiszMiAxIDEzNzIwMDAwCiszMiAxIDEzNzQwMDAwCiszMiAxIDEzNzYwMDAwCiszMiAxIDEzNzgwMDAwCiszMiAxIDEzODAwMDAwCiszMiAxIDEzODIwMDAwCiszMiAxIDEzODQwMDAwCiszMiAxIDEzODYwMDAwCiszMiAxIDEzODgwMDAwCiszMiAxIDEzOTAwMDAwCiszMiAxIDEzOTIwMDAwCiszMiAxIDEzOTQwMDAwCiszMiAxIDEzOTYwMDAwCiszMiAxIDEzOTgwMDAwCiszMiAxIDE0MDAwMDAwCiszMiAxIDE0MDIwMDAwCiszMiAxIDE0MDQwMDAwCiszMiAxIDE0MDYwMDAwCiszMiAxIDE0MDgwMDAwCiszMiAxIDE0MTAwMDAwCiszMiAxIDE0MTIwMDAwCiszMiAxIDE0MTQwMDAwCiszMiAxIDE0MTYwMDAwCiszMiAxIDE0MTgwMDAwCiszMiAxIDE0MjAwMDAwCiszMiAxIDE0MjIwMDAwCiszMiAxIDE0MjQwMDAwCiszMiAxIDE0MjYwMDAwCiszMiAxIDE0MjgwMDAwCiszMiAxIDE0MzAwMDAwCiszMiAxIDE0MzIwMDAwCiszMiAxIDE0MzQwMDAwCiszMiAxIDE0MzYwMDAwCiszMiAxIDE0MzgwMDAwCiszMiAxIDE0NDAwMDAwCiszMiAxIDE0NDIwMDAwCiszMiAxIDE0NDQwMDAwCiszMiAxIDE0NDYwMDAwCiszMiAxIDE0NDgwMDAwCiszMiAxIDE0NTAwMDAwCiszMiAxIDE0NTIwMDAwCiszMiAxIDE0NTQwMDAwCiszMiAxIDE0NTYwMDAwCiszMiAxIDE0NTgwMDAwCiszMiAxIDE0NjAwMDAwCiszMiAxIDE0NjIwMDAwCiszMiAxIDE0NjQwMDAwCiszMiAxIDE0NjYwMDAwCiszMiAxIDE0NjgwMDAwCiszMiAxIDE0NzAwMDAwCiszMiAxIDE0NzIwMDAwCiszMiAxIDE0NzQwMDAwCiszMiAxIDE0NzYwMDAwCiszMiAxIDE0NzgwMDAwCiszMiAxIDE0ODAwMDAwCiszMiAxIDE0ODIwMDAwCiszMiAxIDE0ODQwMDAwCiszMiAxIDE0ODYwMDAwCiszMiAxIDE0ODgwMDAwCiszMiAxIDE0OTAwMDAwCiszMiAxIDE0OTIwMDAwCiszMiAxIDE0OTQwMDAwCiszMiAxIDE0OTYwMDAwCiszMiAxIDE0OTgwMDAwCiszMiAxIDE1MDAwMDAwCiszMiAxIDE1MDIwMDAwCiszMiAxIDE1MDQwMDAwCiszMiAxIDE1MDYwMDAwCiszMiAxIDE1MDgwMDAwCiszMiAxIDE1MTAwMDAwCiszMiAxIDE1MTIwMDAwCiszMiAxIDE1MTQwMDAwCiszMiAxIDE1MTYwMDAwCiszMiAxIDE1MTgwMDAwCiszMiAxIDE1MjAwMDAwCiszMiAxIDE1MjIwMDAwCiszMiAxIDE1MjQwMDAwCiszMiAxIDE1MjYwMDAwCiszMiAxIDE1MjgwMDAwCiszMiAxIDE1MzAwMDAwCiszMiAxIDE1MzIwMDAwCiszMiAxIDE1MzQwMDAwCiszMiAxIDE1MzYwMDAwCiszMiAxIDE1MzgwMDAwCiszMiAxIDE1NDAwMDAwCiszMiAxIDE1NDIwMDAwCiszMiAxIDE1NDQwMDAwCiszMiAxIDE1NDYwMDAwCiszMiAxIDE1NDgwMDAwCiszMiAxIDE1NTAwMDAwCiszMiAxIDE1NTIwMDAwCiszMiAxIDE1NTQwMDAwCiszMiAxIDE1NTYwMDAwCiszMiAxIDE1NTgwMDAwCiszMiAxIDE1NjAwMDAwCiszMiAxIDE1NjIwMDAwCiszMiAxIDE1NjQwMDAwCiszMiAxIDE1NjYwMDAwCiszMiAxIDE1NjgwMDAwCiszMiAxIDE1NzAwMDAwCiszMiAxIDE1NzIwMDAwCiszMiAxIDE1NzQwMDAwCiszMiAxIDE1NzYwMDAwCiszMiAxIDE1NzgwMDAwCiszMiAxIDE1ODAwMDAwCiszMiAxIDE1ODIwMDAwCiszMiAxIDE1ODQwMDAwCiszMiAxIDE1ODYwMDAwCiszMiAxIDE1ODgwMDAwCiszMiAxIDE1OTAwMDAwCiszMiAxIDE1OTIwMDAwCiszMiAxIDE1OTQwMDAwCiszMiAxIDE1OTYwMDAwCiszMiAxIDE1OTgwMDAwCiszMiAxIDE2MDAwMDAwCiszMiAxIDE2MDIwMDAwCiszMiAxIDE2MDQwMDAwCiszMiAxIDE2MDYwMDAwCiszMiAxIDE2MDgwMDAwCiszMiAxIDE2MTAwMDAwCiszMiAxIDE2MTIwMDAwCiszMiAxIDE2MTQwMDAwCiszMiAxIDE2MTYwMDAwCiszMiAxIDE2MTgwMDAwCiszMiAxIDE2MjAwMDAwCiszMiAxIDE2MjIwMDAwCiszMiAxIDE2MjQwMDAwCiszMiAxIDE2MjYwMDAwCiszMiAxIDE2MjgwMDAwCiszMiAxIDE2MzAwMDAwCiszMiAxIDE2MzIwMDAwCiszMiAxIDE2MzQwMDAwCiszMiAxIDE2MzYwMDAwCiszMiAxIDE2MzgwMDAwCiszMiAxIDE2NDAwMDAwCiszMiAxIDE2NDIwMDAwCiszMiAxIDE2NDQwMDAwCiszMiAxIDE2NDYwMDAwCiszMiAxIDE2NDgwMDAwCiszMiAxIDE2NTAwMDAwCiszMiAxIDE2NTIwMDAwCiszMiAxIDE2NTQwMDAwCiszMiAxIDE2NTYwMDAwCiszMiAxIDE2NTgwMDAwCiszMiAxIDE2NjAwMDAwCiszMiAxIDE2NjIwMDAwCiszMiAxIDE2NjQwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1N2VlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQyZDcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX3ZpZGVvX2RlY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzIiLCBtcGVnMn0sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sIHsiYXYxIiwgYXYxfSwKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBjb21wOworICAgICAgICBzdWJzdHJpbmcgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIC8qIFRPRE86IGJldHRlciBhcHByb2FjaCB0byBmaW5kIHRoZSBjb21wb25lbnQgKi8KKyAgICAgICAgLyogImMyLmFuZHJvaWQuIiA9PiAxMXRoIHBvc2l0aW9uICovCisgICAgICAgIHNpemVfdCBwb3MgPSAxMTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN1YnN0cmluZy5maW5kKCIuZGVjb2RlciIsIHBvcyk7CisgICAgICAgIGNvbXAgPSBzdWJzdHJpbmcuc3Vic3RyKHBvcywgbGVuIC0gcG9zKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKKyAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBkZWNvZGVyIGNvbXBvbmVudHMgY3VycmVudCB0aW1lc3RhbXAgYWx3YXlzIGV4Y2VlZHMKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKAorICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKworICAgICAgICAgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHNIaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IG1UaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNIaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c0hpdCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHRzSGl0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRpbWVTdGFtcCBub3QgcmVjb2duaXplZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgSU5GTyAgIF0gUmVjZWl2ZWQgbm9uLXplcm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAvIFRpbWVTdGFtcCBub3QgcmVjb2duaXplZCBcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgbUNzZDsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgaDI2MywKKyAgICAgICAgYXZjLAorICAgICAgICBtcGVnMiwKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICBhdjEsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgdWludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgdmlkZW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBEZWNvZGVyLCBnaXZlbiBFbmNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoInZpZGVvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgVmlkZW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBudW1iZXIgb2YgZWxlbWVudGFyeSBzdHJlYW1zIHBlciBjb21wb25lbnQKKyNkZWZpbmUgU1RSRUFNX0NPVU5UIDIKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMSkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICB9OworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKKworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdmMsCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0In0sCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoZXZjLAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyJ9LAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzIsCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IiwKKyAgICAgICAgICAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2In0sCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmgyNjMsCisgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyJ9LAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWc0LAorICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYifSwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA4LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4In0sCisgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA5LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5In0sCisgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXYxLAorICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuYXYxIiwKKyAgICAgICAgICAiYmJiX2F2MV8xNzZfMTQ0LmF2MSJ9LAorICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuaW5mbyIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5pbmZvIn19LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTFtzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mb1tzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGRlY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiogSW5mbywKKyAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgcmFuZ2UsIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBpbnQgZnJhbWVJRCA9IG9mZnNldDsKKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIHx8IGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gKCpJbmZvKVtmcmFtZUlEXS50aW1lc3RhbXA7CisgICAgICAgIGlmICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzKSBmbGFncyA9ICgxIDw8ICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzIC0gMSkpOworICAgICAgICBpZiAoc2lnbmFsRU9TICYmICgoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSAtIDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSAtIDEpKSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemUgPSAoKkluZm8pW2ZyYW1lSURdLmJ5dGVzQ291bnQ7CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgc2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywKKyAgICAgICAgICAgICAgICAgICAgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBzaXplKTsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCisvLyBCaXRzdHJlYW0gVGVzdAorVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgRVhQRUNUX0VRKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSwgdHJ1ZSk7Cit9CisKKworLy8gQWRhcHRpdmUgVGVzdAorVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEFkYXB0aXZlRGVjb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJBZGFwdGl2ZSBEZWNvZGUgVGVzdCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBpZiAoIShtQ29tcE5hbWUgPT0gYXZjIHx8IG1Db21wTmFtZSA9PSBoZXZjIHx8IG1Db21wTmFtZSA9PSB2cDggfHwKKyAgICAgICAgICBtQ29tcE5hbWUgPT0gdnA5IHx8IG1Db21wTmFtZSA9PSBtcGVnMikpCisgICAgICAgIHJldHVybjsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIHVpbnQzMl90IHRpbWVzdGFtcE9mZnNldCA9IDA7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBTVFJFQU1fQ09VTlQgKiAyOyBpKyspIHsKKyAgICAgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICAgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgICAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIGkgJSBTVFJFQU1fQ09VTlQpOworCisgICAgICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXBNYXggPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgICAgICB0aW1lc3RhbXAgKz0gdGltZXN0YW1wT2Zmc2V0OworICAgICAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGltZXN0YW1wTWF4IDwgdGltZXN0YW1wKSB0aW1lc3RhbXBNYXggPSB0aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wT2Zmc2V0ID0gdGltZXN0YW1wTWF4OworICAgICAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICAgICAgLy8gUmVzZXQgVG90YWwgZnJhbWVzIGJlZm9yZSBzZWNvbmQgZGVjb2RlIGxvb3AKKyAgICAgICAgLy8gbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgICAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgKGludCkoSW5mby5zaXplKCkgLSBvZmZzZXQpLCBmYWxzZSkpOworCisgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBvZmZzZXQgPSAoaW50KUluZm8uc2l6ZSgpOworICAgIH0KKworICAgIC8vIFNlbmQgRU9TCisgICAgLy8gVE9ETyBBZGQgZnVuY3Rpb24gdG8gc2VuZCBFT1Mgd29yayBpdGVtCisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9ICgoSW5mby5zaXplKCkpICsgMSkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkgKyAxKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgRVhQRUNUX0VRKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSwgdHJ1ZSk7Cit9CisKKy8vIHRodW1ibmFpbCB0ZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgVGh1bWJuYWlsVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIHRodW1ibmFpbCIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JVEVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgICAgICAvLyByZXF1ZXN0IEVPUyBmb3IgdGh1bWJuYWlsCisgICAgICAgIC8vIHNpZ25hbCBFT1MgZmxhZyB3aXRoIGxhc3QgZnJhbWUKKyAgICAgICAgc2l6ZV90IGogPSAtMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKEluZm9bal0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9bal0uZmxhZ3MgLSAxKTsKKworICAgICAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOworICAgICAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBqICsgMSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBFWFBFQ1RfR0UobUZyYW1lc1JlY2VpdmVkLCAxVSk7CisgICAgICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVsZWFzZSgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAvLyBQcmVwYXJlIEMyV29yaworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAibVdvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmIChtV29ya1F1ZXVlLnNpemUoKSAhPSBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Xb3JrUXVldWUuc2l6ZSgpLCAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgRmx1c2ggY2FsbHMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAvLyBEZWNvZGUgMTI4IGZyYW1lcyBhbmQgZmx1c2guIGhlcmUgMTI4IGlzIGNob3NlbiB0byBlbnN1cmUgdGhlcmUgaXMgYSBrZXkKKyAgICAvLyBmcmFtZSBhZnRlciB0aGlzIHNvIHRoYXQgdGhlIGJlbG93IHNlY3Rpb24gY2FuIGJlIGNvdmVyZWQgZm9yIGFsbAorICAgIC8vIGNvbXBvbmVudHMKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTI4OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgbnVtRnJhbWVzRmx1c2hlZCwgZmFsc2UpKTsKKyAgICAvLyBmbHVzaAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKworICAgIHsKKyAgICAgICAgLy8gVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBTZWVrIHRvIG5leHQga2V5IGZyYW1lIGFuZCBzdGFydCBkZWNvZGluZyB0aWxsIHRoZSBlbmQKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQgaW5kZXggPSBudW1GcmFtZXNGbHVzaGVkOworICAgIGJvb2wga2V5RnJhbWUgPSBmYWxzZTsKKyAgICBmbGFncyA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgKGludClJbmZvLnNpemUoKSkgeworICAgICAgICBpZiAoSW5mb1tpbmRleF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baW5kZXhdLmZsYWdzIC0gMSk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBTWU5DX0ZSQU1FKSA9PSBTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICBrZXlGcmFtZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGVsZVN0cmVhbS5pZ25vcmUoSW5mb1tpbmRleF0uYnl0ZXNDb3VudCk7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorICAgIGlmIChrZXlGcmFtZSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClJbmZvLnNpemUoKSAtIGluZGV4KSk7CisgICAgfQorICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUZsdXNoZWRJbmRpY2VzLmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIERlY29kZVRlc3RFbXB0eUJ1ZmZlcnNJbnNlcnRlZCkgeworICAgIGRlc2NyaXB0aW9uKCJEZWNvZGUgd2l0aCBtdWx0aXBsZSBlbXB0eSBpbnB1dCBmcmFtZXMiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmcmFtZUlkID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0gZmFsc2U7CisgICAgLy8gVGhpcyB0ZXN0IGludHJvZHVjZXMgZW1wdHkgQ1NEIGFmdGVyIGV2ZXJ5IDIwdGggZnJhbWUKKyAgICAvLyBhbmQgZW1wdHkgaW5wdXQgZnJhbWVzIGF0IGFuIGludGVydmFsIG9mIDUgZnJhbWVzLgorICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGZyYW1lSWQgJSA1KSkgeworICAgICAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDIwKSkgZmxhZ3MgPSAzMjsKKyAgICAgICAgICAgIGVsc2UgZmxhZ3MgPSAwOworICAgICAgICAgICAgYnl0ZXNDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICB9CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgIGZyYW1lSWQrKzsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworLy8gVE9ETyA6IFZpZGVvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gVGVzdAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg1Yzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX3ZpZGVvX2VuY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitjbGFzcyBHcmFwaGljQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgR3JhcGhpY0J1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykKKyAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpDMkZlbmNlKCkpfSkge30KK307CisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCitjbGFzcyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIDo6c3RkOjpzdHJpbmcgZ2V0VGVzdENhc2VJbmZvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gOjpzdGQ6OnN0cmluZygpICsKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50OiAiICsgZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiSW5zdGFuY2U6ICIgKyBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIlJlczogIiArIGdFbnYtPmdldFJlcygpLmNfc3RyKCk7CisgICAgfQorCisgICAgLy8gZ29vZ2xlLmNvZGVjMiBWaWRlbyB0ZXN0IHNldHVwCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisgICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0VuY0hpZGxUZXN0IFNldFVwIik7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgICAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaXN0ZW5lciwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUdyYXBoaWNBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1HcmFwaGljUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtR3JhcGhpY1Bvb2wsIG51bGxwdHIpOworCisgICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOworICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImgyNjMiLCBoMjYzfSwgeyJhdmMiLCBhdmN9LCB7Im1wZWc0IiwgbXBlZzR9LAorICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LAorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5lbmNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgbUNvbmZpZyA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtRmFpbGVkV29ya1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIHZvaWQgc2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KTsKKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIG1GYWlsZWRXb3JrUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtQ29uZmlnOworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHVpbnQzMl90IG1GYWlsZWRXb3JrUmVjZWl2ZWQ7CisKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1HcmFwaGljUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgordm9pZCBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJWaWRlb1NpemVTdHJlYW1UdW5pbmc6OmlucHV0IGlucHV0U2l6ZSgwdSwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JmlucHV0U2l6ZX07CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChmYWlsdXJlcy5zaXplKCkgPT0gMHUgKSBtQ29uZmlnID0gdHJ1ZTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBDMl9PSyk7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogVVJMKSB7CisgICAgc3RyY2F0KFVSTCwgImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Iik7Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGdyYXBoaWNQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgZnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRnJhbWVzLCB1aW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoZWQgPSBmYWxzZSxib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBuV2lkdGggKiBuSGVpZ2h0ICogMyA+PiAxOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYnl0ZXNDb3VudCk7CisgICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUSgKKyAgICAgICAgICAgIEMyX09LLAorICAgICAgICAgICAgZ3JhcGhpY1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gR3JhcGhpYyBWaWV3CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkdyYXBoaWNCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwWSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCogcFUgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QqIHBWID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgIG1lbWNweShwWSwgZGF0YSwgbldpZHRoICogbkhlaWdodCk7CisgICAgICAgIG1lbWNweShwVSwgZGF0YSArIG5XaWR0aCAqIG5IZWlnaHQsIChuV2lkdGggKiBuSGVpZ2h0ID4+IDIpKTsKKyAgICAgICAgbWVtY3B5KHBWLCBkYXRhICsgKG5XaWR0aCAqIG5IZWlnaHQgKiA1ID4+IDIpLCBuV2lkdGggKiBuSGVpZ2h0ID4+IDIpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IEdyYXBoaWNCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBFTkNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkVuY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpOworICAgIGlmICghbUNvbmZpZykgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgRU5DX05VTV9GUkFNRVMsIG5XaWR0aCwgbkhlaWdodCkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBFTkNfTlVNX0ZSQU1FUykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJWQiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEVOQ19OVU1fRlJBTUVTKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmICghbUNzZCAmJiAobUNvbXBOYW1lICE9IHZwOCAmJiBtQ29tcE5hbWUgIT0gdnA5KSkgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkNTRCBCdWZmZXIgbm90IHJlY2VpdmVkIjsKKyAgICB9CisKKyAgICBpZiAobUNzZCAmJiAobUNvbXBOYW1lID09IHZwOCB8fCBtQ29tcE5hbWUgPT0gdnA5KSkgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkNTRCBCdWZmZXIgbm90IGV4cGVjdGVkIjsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworICAgIHNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBudW1GcmFtZXNGbHVzaGVkLCBuV2lkdGgsIG5IZWlnaHQpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNGbHVzaGVkLCBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLAorICAgICAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgdHJ1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBJbnZhbGlkQnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmZWVkaW5nIGxhcmdlci9zbWFsbGVyIGlucHV0IGJ1ZmZlciIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSCAvIDI7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUIC8gMjsKKyAgICBzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAxLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBsYXJnZXIgaW5wdXQgYnVmZmVyLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIG5XaWR0aCoyLCBuSGVpZ2h0KjIsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBzbWFsbGVyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAxLCBuV2lkdGgvMiwgbkhlaWdodC8yLCBmYWxzZSwgdHJ1ZSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSAzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAzIiwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtRmFpbGVkV29ya1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGZhaWxlZCBmcmFtZSBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZmFpbGVkRnJhbWVzUmVjZWl2ZWQgOiAlZCIsIG1GYWlsZWRXb3JrUmVjZWl2ZWQpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwgUmVzb2x1dGlvblRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZW5jb2RpbmcgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgaW50MzJfdCBuV2lkdGggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGludDMyX3QgbkhlaWdodCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dEKCJUcnlpbmcgZW5jb2RlIGZvciB3aWR0aCAlZCBoZWlnaHQgJWQiLCBuV2lkdGgsIG5IZWlnaHQpOworICAgIG1Db25maWcgPSBmYWxzZTsKKyAgICBtRW9zID0gZmFsc2U7CisgICAgc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpOworICAgIGlmICghbUNvbmZpZykgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDU1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0OThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgXSwKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmM2U1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApAQCAtMCwwICsxLDEzOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkNsaWVudCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyN1bmRlZiBMT0cKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBjMl9zdGF0dXNfdCB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGh3YmluZGVyIHRyYW5zYWN0aW9uIGZhaWx1cmUuCitjb25zdGV4cHIgYzJfc3RhdHVzX3QgQzJfVFJBTlNBQ1RJT05fRkFJTEVEID0gQzJfQ09SUlVQVEVEOworCisvLyBMaXN0IG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcyBpbiB0aGUgZGVjcmVhc2luZyBvcmRlciBvZiBwcmVmZXJlbmNlLgorY29uc3RleHByIGNvbnN0IGNoYXIqIGtDbGllbnROYW1lc1tdID0geworICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICJzb2Z0d2FyZSIsCisgICAgfTsKKworLy8gTnVtYmVyIG9mIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KK2NvbnN0ZXhwciBzaXplX3Qga051bUNsaWVudHMgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrQ2xpZW50TmFtZXMpPjo6dmFsdWU7CisKK3R5cGVkZWYgc3RkOjphcnJheTxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piwga051bUNsaWVudHM+IENsaWVudExpc3Q7CisKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gb2J0YWluIGtub3duIGNsaWVudHMuCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoc2l6ZV90IGluZGV4KSB7CisgICAgdWludDMyX3Qgc2VydmljZU1hc2sgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICJkZWJ1Zy5tZWRpYS5jb2RlYzIiLCB1aW50MzJfdCgwKSk7CisgICAgcmV0dXJuIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBrQ2xpZW50TmFtZXNbaW5kZXhdLAorICAgICAgICAgICAgKHNlcnZpY2VNYXNrICYgKDEgPDwgaW5kZXgpKSAhPSAwKTsKK30KKworQ2xpZW50TGlzdCBnZXRDbGllbnRMaXN0KCkgeworICAgIENsaWVudExpc3QgbGlzdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbGlzdFtpXSA9IGdldENsaWVudChpKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK30gLy8gdW5uYW1lZAorCisvLyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQKKworY29uc3QgQzJTdHJpbmcmIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWU7Cit9CisKK0NvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6QmFzZSogQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpiYXNlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCYXNlKj4obUJhc2UuZ2V0KCkpOworfQorCitDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OkNvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudCgKKyAgICAgICAgY29uc3Qgc3A8Q29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpCYXNlPiYgYmFzZSkgOiBtQmFzZShiYXNlKSB7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgIFt0aGlzXShjb25zdCBoaWRsX3N0cmluZyYgbmFtZSkgeworICAgICAgICAgICAgICAgIG1OYW1lID0gbmFtZS5jX3N0cigpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gbmFtZSBmcm9tIElDb25maWd1cmFibGUuIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICBoaWRsX3ZlYzxQYXJhbUluZGV4PiBpbmRpY2VzKAorICAgICAgICAgICAgc3RhY2tQYXJhbXMuc2l6ZSgpICsgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCkpOworICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBzdGFja1BhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgaWYgKCFzdGFja1BhcmFtKSB7CisgICAgICAgICAgICBBTE9HVygicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbSBlbmNvdW50ZXJlZC4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgIH0KKyAgICBzaXplX3QgbnVtU3RhY2tJbmRpY2VzID0gbnVtSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICB9CisgICAgaW5kaWNlcy5yZXNpemUobnVtSW5kaWNlcyk7CisgICAgaWYgKGhlYXBQYXJhbXMpIHsKKyAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+cXVlcnkoCisgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1TdGFja0luZGljZXMsICZzdGFja1BhcmFtcywgaGVhcFBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHBhcnNlU3RhdHVzID0gcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VTdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5IC0tIGVycm9yIHdoaWxlIHBhcnNpbmcgcGFyYW1zLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhcnNlU3RhdHVzOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJhbVBvaW50ZXJzLmJlZ2luKCk7IGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbVBvaW50ZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1TdGFja0luZGljZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpICYmICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gc3RhY2tQYXJhbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5IC0tIHVuZXhwZWN0ZWQgZXJyb3IuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSAhPSBwYXJhbVBvaW50ZXItPmluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicXVlcnkgLS0gcGFyYW0gc2tpcHBlZC4gaW5kZXggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXNbaSsrXS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja1BhcmFtc1tpKytdLT51cGRhdGVGcm9tKCpwYXJhbVBvaW50ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInF1ZXJ5IC0tIHBhcmFtIHVwZGF0ZSBmYWlsZWQuIGluZGV4ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihwYXJhbVBvaW50ZXItPmluZGV4KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWFwUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInF1ZXJ5IC0tIHVuZXhwZWN0ZWQgZXh0cmEgc3RhY2sgcGFyYW0uIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJxdWVyeSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Y29uZmlnKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIFBhcmFtcyBoaWRsUGFyYW1zOworICAgIFN0YXR1cyBoaWRsU3RhdHVzID0gY3JlYXRlUGFyYW1zQmxvYigmaGlkbFBhcmFtcywgcGFyYW1zKTsKKyAgICBpZiAoaGlkbFN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJjb25maWcgLS0gYmFkIGlucHV0LiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5jb25maWcoCisgICAgICAgICAgICBoaWRsUGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZwYXJhbXMsIGZhaWx1cmVzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtcyYgbykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjb25maWcgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBmYWlsdXJlcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLT5yZXNpemUoaSArIGYuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNmIDogZikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJigqZmFpbHVyZXMpW2krK10sIHNmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvbmZpZyAtLSBpbnZhbGlkIHJldHVybmVkIFNldHRpbmdSZXN1bHQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdXBkYXRlUGFyYW1zRnJvbUJsb2IocGFyYW1zLCBvKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjb25maWcgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogQ2FjaGUgYW5kIHF1ZXJ5IHByb3Blcmx5IQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1pbigpLAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIHBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+JiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBwYXJhbXMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnJlc2l6ZShpICsgcC5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgUGFyYW1EZXNjcmlwdG9yJiBzcCA6IHApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCYoKnBhcmFtcylbaSsrXSwgc3ApOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZXR1cm5lZCBQYXJhbURlc2NyaXB0b3IuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IHsKKyAgICBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBpbkZpZWxkcyhmaWVsZHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdGF0dXMgaGlkbFN0YXR1cyA9IG9iamNweSgmaW5GaWVsZHNbaV0sIGZpZWxkc1tpXSk7CisgICAgICAgIGlmIChoaWRsU3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBiYWQgaW5wdXQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5xdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGluRmllbGRzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZpbkZpZWxkcywgJmZpZWxkc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0PiYgcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyLnNpemUoKSAhPSBmaWVsZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBpbnB1dCBhbmQgb3V0cHV0IGxpc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmZpZWxkc1tpXSwgaW5GaWVsZHNbaV0sIHJbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gaW52YWxpZCByZXR1cm5lZCB2YWx1ZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpIaWRsTGlzdGVuZXIKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyIDogcHVibGljIElDb21wb25lbnRMaXN0ZW5lciB7CisgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25Xb3JrRG9uZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zOworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBvYmpjcHkoJndvcmtJdGVtcywgd29ya0J1bmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJvbldvcmtEb25lIC0tIHJlY2VpdmVkIGNvcnJ1cHRlZCBXb3JrQnVuZGxlLiAiCisgICAgICAgICAgICAgICAgICAgICJzdGF0dXMgPSAlZC4iLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyByZWxlYXNlIGlucHV0IGJ1ZmZlcnMgcG90ZW50aWFsbHkgaGVsZCBieSB0aGUgY29tcG9uZW50IGZyb20gcXVldWUKKyAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycyA9IDA7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0gY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgaWYgKHN0cm9uZ0NvbXBvbmVudCkgeworICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzID0gc3Ryb25nQ29tcG9uZW50LT5oYW5kbGVPbldvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZShjb21wb25lbnQsIHdvcmtJdGVtcywgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJvbldvcmtEb25lIC0tIGxpc3RlbmVyIGRpZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiYgc2V0dGluZ1Jlc3VsdHMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyU2V0dGluZ1Jlc3VsdHMoCisgICAgICAgICAgICAgICAgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNldHRpbmdSZXN1bHRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBjMlNldHRpbmdSZXN1bHQ7CisgICAgICAgICAgICBzdGF0dXMgPSBvYmpjcHkoJmMyU2V0dGluZ1Jlc3VsdCwgc2V0dGluZ1Jlc3VsdHNbaV0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dJKCJvblRyaXBwZWQgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFNldHRpbmdSZXN1bHQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMgPSAlZC4iLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMlNldHRpbmdSZXN1bHRzW2ldID0gc3RkOjptb3ZlKGMyU2V0dGluZ1Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25UcmlwcGVkKGNvbXBvbmVudCwgYzJTZXR0aW5nUmVzdWx0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgib25UcmlwcGVkIC0tIGxpc3RlbmVyIGRpZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkVycm9yKFN0YXR1cyBzLCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR0QoIm9uRXJyb3IgLS0gc3RhdHVzID0gJWQsIGVycm9yQ29kZSA9ICV1LiIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oZXJyb3JDb2RlKSk7CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yKGNvbXBvbmVudCwgcyA9PSBTdGF0dXM6Ok9LID8KKyAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlIDogc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJvbkVycm9yIC0tIGxpc3RlbmVyIGRpZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcjo6UmVuZGVyZWRGcmFtZT4gcmZzOworICAgICAgICByZnMucmVzZXJ2ZShyZW5kZXJlZEZyYW1lcy5zaXplKCkpOworICAgICAgICBmb3IgKGNvbnN0IFJlbmRlcmVkRnJhbWUmIHJmIDogcmVuZGVyZWRGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChyZi5zbG90SWQgPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICByZnMuZW1wbGFjZV9iYWNrKHJmLmJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYuc2xvdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmLnRpbWVzdGFtcE5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cm9uZ0NvbXBvbmVudCkgeworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gcmYuYnVmZmVyUXVldWVJZDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih+cmYuc2xvdElkKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIGRlYXRoIG5vdGlmaWNhdGlvbiBvZiBpbnB1dCBidWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lSW5kZXggPSAlbGx1LCBidWZmZXJJbmRleCA9ICV6dS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPmZyZWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25JbnB1dEJ1ZmZlckRvbmUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXJmcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25GcmFtZXNSZW5kZXJlZChyZnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgib25GcmFtZXNSZW5kZXJlZCAtLSBsaXN0ZW5lciBkaWVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorfTsKKworLy8gQ29kZWMyQ2xpZW50CitDb2RlYzJDbGllbnQ6OkJhc2UqIENvZGVjMkNsaWVudDo6YmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmFzZSo+KG1CYXNlLmdldCgpKTsKK30KKworQ29kZWMyQ2xpZW50OjpDb2RlYzJDbGllbnQoY29uc3Qgc3A8Q29kZWMyQ2xpZW50OjpCYXNlPiYgYmFzZSwgc3RkOjpzdHJpbmcgaW5zdGFuY2VOYW1lKSA6CisgICAgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KGJhc2UpLCBtTGlzdGVkKGZhbHNlKSwgbUluc3RhbmNlTmFtZShpbnN0YW5jZU5hbWUpIHsKKyAgICBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiB0cmFuc1Jlc3VsdCA9IGJhc2UtPmdldFBvb2xDbGllbnRNYW5hZ2VyKCk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImdldFBvb2xDbGllbnRNYW5hZ2VyIC0tIGZhaWxlZCB0cmFuc2FjdGlvbi4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyID0gc3RhdGljX2Nhc3Q8c3A8SUNsaWVudE1hbmFnZXI+Pih0cmFuc1Jlc3VsdCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgeworCisgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIEJ1ZmZlcnBvb2wKKworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIHNwPENvbXBvbmVudDo6SGlkbExpc3RlbmVyPiBoaWRsTGlzdGVuZXIgPSBuZXcgQ29tcG9uZW50OjpIaWRsTGlzdGVuZXIoKTsKKyAgICBoaWRsTGlzdGVuZXItPmJhc2UgPSBsaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBoaWRsTGlzdGVuZXIsCisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbXBvbmVudCwgaGlkbExpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29tcG9uZW50ID0gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4oYyk7CisgICAgICAgICAgICAgICAgaGlkbExpc3RlbmVyLT5jb21wb25lbnQgPSAqY29tcG9uZW50OworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUNvbXBvbmVudCAtLSBmYWlsZWQgdHJhbnNhY3Rpb24uIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmICghKmNvbXBvbmVudCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlQ29tcG9uZW50IC0tIG51bGwgY29tcG9uZW50LiIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHN0YXR1cyA9ICgqY29tcG9uZW50KS0+c2V0RGVhdGhMaXN0ZW5lcigqY29tcG9uZW50LCBsaXN0ZW5lcik7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiY3JlYXRlQ29tcG9uZW50IC0tIHNldERlYXRoTGlzdGVuZXIgcmV0dXJuZWQgZXJyb3I6ICVkLiIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAoKmNvbXBvbmVudCktPm1CdWZmZXJQb29sU2VuZGVyLnNldFJlY2VpdmVyKG1Ib3N0UG9vbE1hbmFnZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnRlcmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudEludGVyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlSW50ZXJmYWNlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+KGkpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUludGVyZmFjZSAtLSBmYWlsZWQgdHJhbnNhY3Rpb24uIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpIHsKKyAgICBSZXR1cm48c3A8SUlucHV0U3VyZmFjZT4+IHRyYW5zUmVzdWx0ID0gYmFzZSgpLT5jcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIGZhaWxlZCB0cmFuc2FjdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgc3A8SUlucHV0U3VyZmFjZT4gcmVzdWx0ID0gc3RhdGljX2Nhc3Q8c3A8SUlucHV0U3VyZmFjZT4+KHRyYW5zUmVzdWx0KTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAqaW5wdXRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICAqaW5wdXRTdXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2U+KHJlc3VsdCk7CisgICAgaWYgKCEqaW5wdXRTdXJmYWNlKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVJbnB1dFN1cmZhY2UgLS0gdW5rbm93biBlcnJvci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgQ29kZWMyQ2xpZW50OjpsaXN0Q29tcG9uZW50cygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtTGlzdGVkKSB7CisgICAgICAgIHJldHVybiBtVHJhaXRzTGlzdDsKKyAgICB9CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5saXN0Q29tcG9uZW50cygKKyAgICAgICAgICAgIFt0aGlzXShjb25zdCBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4mIHQpIHsKKyAgICAgICAgICAgICAgICBtVHJhaXRzTGlzdC5yZXNpemUodC5zaXplKCkpOworICAgICAgICAgICAgICAgIG1BbGlhc2VzQnVmZmVyLnJlc2l6ZSh0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG9iamNweSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRyYWl0c0xpc3RbaV0sICZtQWxpYXNlc0J1ZmZlcltpXSwgdFtpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsaXN0Q29tcG9uZW50cyAtLSBjb3JydXB0ZWQgb3V0cHV0LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImxpc3RDb21wb25lbnRzIC0tIGZhaWxlZCB0cmFuc2FjdGlvbi4iKTsKKyAgICB9CisgICAgbUxpc3RlZCA9IHRydWU7CisgICAgcmV0dXJuIG1UcmFpdHNMaXN0OworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNvcHlCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIHNyYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgZHN0KSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50PworICAgICh2b2lkKXNyYzsKKyAgICAodm9pZClkc3Q7CisgICAgQUxPR0UoImNvcHlCdWZmZXIgbm90IGltcGxlbWVudGVkIik7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPgorICAgICAgICBDb2RlYzJDbGllbnQ6OmdldFBhcmFtUmVmbGVjdG9yKCkgeworICAgIC8vIFRPRE86IHRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGV4cG9zZWQgYXMgQzJQYXJhbVJlZmxlY3RvciBvbiB0aGUgY2xpZW50IHNpZGU7IGluc3RlYWQsIGl0CisgICAgLy8gc2hvdWxkIHJlZmxlY3QgdGhlIEhBTCBBUEkuCisgICAgc3RydWN0IFNpbXBsZVBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoMSk7CisgICAgICAgICAgICBpbmRpY2VzWzBdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oY29yZUluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Z2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgICAgIFsmZGVzY3JpcHRvcl0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4mIHNkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldFN0cnVjdERlc2NyaXB0b3JzIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNkLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImdldFN0cnVjdERlc2NyaXB0b3JzIC0tIHJldHVybmVkIHZlY3RvciBvZiBzaXplICV6dS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Quc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb2JqY3B5KCZkZXNjcmlwdG9yLCBzZFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImdldFN0cnVjdERlc2NyaXB0b3JzIC0tIGZhaWxlZCB0byBjb252ZXJ0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgICB9CisKKyAgICAgICAgU2ltcGxlUGFyYW1SZWZsZWN0b3Ioc3A8QmFzZT4gYmFzZSkKKyAgICAgICAgICAgIDogbUJhc2UoYmFzZSkgeyB9CisKKyAgICAgICAgc3A8QmFzZT4gbUJhc2U7CisgICAgfTsKKworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZVBhcmFtUmVmbGVjdG9yPihiYXNlKCkpOworfTsKKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3QgY2hhciogaW5zdGFuY2VOYW1lLCBib29sIHdhaXRGb3JTZXJ2aWNlKSB7CisgICAgaWYgKCFpbnN0YW5jZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPEJhc2U+IGJhc2VTdG9yZSA9IHdhaXRGb3JTZXJ2aWNlID8KKyAgICAgICAgICAgIEJhc2U6OmdldFNlcnZpY2UoaW5zdGFuY2VOYW1lKSA6CisgICAgICAgICAgICBCYXNlOjp0cnlHZXRTZXJ2aWNlKGluc3RhbmNlTmFtZSk7CisgICAgaWYgKCFiYXNlU3RvcmUpIHsKKyAgICAgICAgaWYgKHdhaXRGb3JTZXJ2aWNlKSB7CisgICAgICAgICAgICBBTE9HVygiQ29kZWMyLjAgc2VydmljZSBcIiVzXCIgaW5hY2Nlc3NpYmxlLiAiCisgICAgICAgICAgICAgICAgICAiQ2hlY2sgdGhlIGRldmljZSBtYW5pZmVzdC4iLAorICAgICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb2RlYzIuMCBzZXJ2aWNlIFwiJXNcIiB1bmF2YWlsYWJsZSByaWdodCBub3cuICIKKyAgICAgICAgICAgICAgICAgICJUcnkgYWdhaW4gbGF0ZXIuIiwKKyAgICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudD4oYmFzZVN0b3JlLCBpbnN0YW5jZU5hbWUpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkZvckFsbFN0b3JlcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPiBwcmVkaWNhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9OT19JTklUOyAgLy8gbm8gSUNvbXBvbmVudFN0b3JlcyBwcmVzZW50CisKKyAgICAvLyBDYWNoZSB0aGUgbWFwcGluZyBrZXkgLT4gaW5kZXggb2YgQ29kZWMyQ2xpZW50IGluIGdldENsaWVudCgpLgorICAgIHN0YXRpYyBzdGQ6Om11dGV4IGtleTJJbmRleE11dGV4OworICAgIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc2l6ZV90PiBrZXkySW5kZXg7CisKKyAgICAvLyBCeSBkZWZhdWx0IHRyeSBhbGwgc3RvcmVzLiBIb3dldmVyLCB0cnkgdGhlIGxhc3Qga25vd24gY2xpZW50IGZpcnN0LiBJZiB0aGUgbGFzdCBrbm93bgorICAgIC8vIGNsaWVudCBmYWlscywgcmV0cnkgb25jZS4gV2UgZG8gdGhpcyBieSBwdXNoaW5nIHRoZSBsYXN0IGtub3duIGNsaWVudCBpbiBmcm9udCBvZiB0aGUKKyAgICAvLyBsaXN0IG9mIGFsbCBjbGllbnRzLgorICAgIHN0ZDo6ZGVxdWU8c2l6ZV90PiBpbmRpY2VzOworICAgIGZvciAoc2l6ZV90IGluZGV4ID0ga051bUNsaWVudHM7IGluZGV4ID4gMDsgKSB7CisgICAgICAgIGluZGljZXMucHVzaF9mcm9udCgtLWluZGV4KTsKKyAgICB9CisKKyAgICBib29sIHdhc01hcHBlZCA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhrZXkySW5kZXhNdXRleCk7CisgICAgYXV0byBpdCA9IGtleTJJbmRleC5maW5kKGtleSk7CisgICAgaWYgKGl0ICE9IGtleTJJbmRleC5lbmQoKSkgeworICAgICAgICBpbmRpY2VzLnB1c2hfZnJvbnQoaXQtPnNlY29uZCk7CisgICAgICAgIHdhc01hcHBlZCA9IHRydWU7CisgICAgfQorICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50KGluZGV4KTsKKyAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgc3RhdHVzID0gcHJlZGljYXRlKGNsaWVudCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAga2V5MkluZGV4W2tleV0gPSBpbmRleDsgLy8gdXBkYXRlIGxhc3Qga25vd24gY2xpZW50IGluZGV4CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAod2FzTWFwcGVkKSB7CisgICAgICAgICAgICBBTE9HSSgiQ291bGQgbm90IGZpbmQgJyVzJyBpbiBsYXN0IGluc3RhbmNlLiBSZXRyeWluZy4uLiIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgICAgIHdhc01hcHBlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7ICAvLyByZXR1cm4gdGhlIGxhc3Qgc3RhdHVzIGZyb20gYSB2YWxpZCBjbGllbnQKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PgorICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgY29uc3QgY2hhciogY29tcG9uZW50TmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgW293bmVyLCAmY29tcG9uZW50LCBjb21wb25lbnROYW1lLCAmbGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KSAtPiBjMl9zdGF0dXNfdCB7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gY2xpZW50LT5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50TmFtZSwgbGlzdGVuZXIsICZjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3duZXIgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIklDb21wb25lbnRTdG9yZSglcyk6OmNyZWF0ZUNvbXBvbmVudCgnJXMnKSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRJbnN0YW5jZU5hbWUoKS5jX3N0cigpLCBjb21wb25lbnROYW1lLCBhc1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0koIkNvdWxkIG5vdCBjcmVhdGUgY29tcG9uZW50ICclcycgKCVzKSIsIGNvbXBvbmVudE5hbWUsIGFzU3RyaW5nKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gY29tcG9uZW50OworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+CisgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKAorICAgICAgICBjb25zdCBjaGFyKiBpbnRlcmZhY2VOYW1lLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBpbnRlcmZhY2U7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gRm9yQWxsU3RvcmVzKAorICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgIFtvd25lciwgJmludGVyZmFjZSwgaW50ZXJmYWNlTmFtZV0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjbGllbnQtPmNyZWF0ZUludGVyZmFjZShpbnRlcmZhY2VOYW1lLCAmaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvd25lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKm93bmVyID0gY2xpZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQzJfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJQ29tcG9uZW50U3RvcmUoJXMpOjpjcmVhdGVJbnRlcmZhY2UoJyVzJykgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0SW5zdGFuY2VOYW1lKCkuY19zdHIoKSwgaW50ZXJmYWNlTmFtZSwgYXNTdHJpbmcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dJKCJDb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSAnJXMnICglcykiLCBpbnRlcmZhY2VOYW1lLCBhc1N0cmluZyhzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICB1aW50MzJfdCBzZXJ2aWNlTWFzayA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyaW5wdXRzdXJmYWNlIiwgdWludDMyX3QoMCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bUNsaWVudHM7ICsraSkgeworICAgICAgICBpZiAoKDEgPDwgaSkgJiBzZXJ2aWNlTWFzaykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50KGkpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2U7CisgICAgICAgICAgICBpZiAoY2xpZW50ICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZpbnB1dFN1cmZhY2UpID09IEMyX09LICYmCisgICAgICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFN1cmZhY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1coIkNvdWxkIG5vdCBjcmVhdGUgYW4gaW5wdXQgc3VyZmFjZSBmcm9tIGFueSBDb2RlYzIuMCBzZXJ2aWNlcy4iKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIENvZGVjMkNsaWVudDo6TGlzdENvbXBvbmVudHMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0c0xpc3QgPSBbXSgpeworICAgICAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBsaXN0OworICAgICAgICBzaXplX3QgbGlzdFNpemUgPSAwOworICAgICAgICBDbGllbnRMaXN0IGNsaWVudExpc3QgPSBnZXRDbGllbnRMaXN0KCk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mIGNsaWVudCA6IGNsaWVudExpc3QpIHsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0U2l6ZSArPSBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGxpc3QucmVzZXJ2ZShsaXN0U2l6ZSk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mIGNsaWVudCA6IGNsaWVudExpc3QpIHsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0Lmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5saXN0Q29tcG9uZW50cygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfSgpOworCisgICAgcmV0dXJuIHRyYWl0c0xpc3Q7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6TGlzdGVuZXIKKworQ29kZWMyQ2xpZW50OjpMaXN0ZW5lcjo6fkxpc3RlbmVyKCkgeworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudAorCitDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6QmFzZSogQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJhc2UqPihtQmFzZS5nZXQoKSk7Cit9CisKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpDb21wb25lbnQoY29uc3Qgc3A8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkJhc2U+JiBiYXNlKSA6CisgICAgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUoYmFzZSksCisgICAgbUJ1ZmZlclBvb2xTZW5kZXIobnVsbHB0cikgeworfQorCitDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90KiBibG9ja1Bvb2xJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlkKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBibG9ja1Bvb2xJZCwgY29uZmlndXJhYmxlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBJZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbmZpZ3VyYWJsZT4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlLT5yZXNldCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZUJsb2NrUG9vbCAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpibG9ja1Bvb2xJZCA9IHN0YXRpY19jYXN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90PihwSWQpOworICAgICAgICAgICAgICAgICpjb25maWd1cmFibGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gYmFzZSgpLT5kZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxvY2FsSWQpKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZGVzdHJveUJsb2NrUG9vbCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1Jlc3VsdCkpOworfQorCitzaXplX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmhhbmRsZU9uV29ya0RvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeworICAgIC8vIElucHV0IGJ1ZmZlcnMnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gaW5wdXREb25lOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlucHV0IGlzIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgaW5wdXREb25lLmVtcGxhY2VfYmFjayh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzID0gMDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnB1dEJ1ZmZlcnNNdXRleCk7CisgICAgICAgIGZvciAodWludDY0X3QgaW5wdXRJbmRleCA6IGlucHV0RG9uZSkgeworICAgICAgICAgICAgYXV0byBpdCA9IG1JbnB1dEJ1ZmZlcnMuZmluZChpbnB1dEluZGV4KTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBtSW5wdXRCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9uV29ya0RvbmUgLS0gcmV0dXJuZWQgY29uc3VtZWQvdW5rbm93biAiCisgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGZyYW1lOiBpbmRleCAlbGx1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaW5wdXRJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvbldvcmtEb25lIC0tIHByb2Nlc3NlZCBpbnB1dCBmcmFtZTogIgorICAgICAgICAgICAgICAgICAgICAgICJpbmRleCAlbGx1IChjb250YWluaW5nICV6dSBidWZmZXJzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlucHV0SW5kZXgsIGl0LT5zZWNvbmQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudC5lcmFzZShpbnB1dEluZGV4KTsKKyAgICAgICAgICAgICAgICArK251bURpc2NhcmRlZElucHV0QnVmZmVyczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IGJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoaWdicCkgeworICAgICAgICBob2xkQnVmZmVyUXVldWVCbG9ja3Mod29ya0l0ZW1zLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIG51bURpc2NhcmRlZElucHV0QnVmZmVyczsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZnJlZUlucHV0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBzaXplX3QgYnVmZmVySW5kZXgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5wdXRCdWZmZXJzTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtSW5wdXRCdWZmZXJzLmZpbmQoZnJhbWVJbmRleCk7CisgICAgaWYgKGl0ID09IG1JbnB1dEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0koImZyZWVJbnB1dEJ1ZmZlciAtLSBVbnJlY29nbml6ZWQgaW5wdXQgZnJhbWUgaW5kZXggJWxsdS4iLAorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgdW5zaWduZWQ+KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChidWZmZXJJbmRleCA+PSBpdC0+c2Vjb25kLnNpemUoKSkgeworICAgICAgICBBTE9HSSgiZnJlZUlucHV0QnVmZmVyIC0tIElucHV0IGJ1ZmZlciBuby4gJXp1IGlzIGludmFsaWQgaW4gIgorICAgICAgICAgICAgICAiaW5wdXQgZnJhbWUgaW5kZXggJWxsdS4iLAorICAgICAgICAgICAgICBidWZmZXJJbmRleCwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIHVuc2lnbmVkPihmcmFtZUluZGV4KSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBidWZmZXIgPSBpdC0+c2Vjb25kW2J1ZmZlckluZGV4XTsKKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICBBTE9HSSgiZnJlZUlucHV0QnVmZmVyIC0tIElucHV0IGJ1ZmZlciBuby4gJXp1IGluICIKKyAgICAgICAgICAgICAgImlucHV0IGZyYW1lIGluZGV4ICVsbHUgaGFzIGFscmVhZHkgYmVlbiBmcmVlZC4iLAorICAgICAgICAgICAgICBidWZmZXJJbmRleCwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIHVuc2lnbmVkPihmcmFtZUluZGV4KSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpdC0+c2Vjb25kW2J1ZmZlckluZGV4XSA9IG51bGxwdHI7CisgICAgaWYgKC0tbUlucHV0QnVmZmVyQ291bnRbZnJhbWVJbmRleF0gPT0gMCkgeworICAgICAgICBtSW5wdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgbUlucHV0QnVmZmVyQ291bnQuZXJhc2UoZnJhbWVJbmRleCk7CisgICAgfQorICAgIHJldHVybiBidWZmZXI7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpxdWV1ZSgKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICAvLyByZW1lbWJlciBpbnB1dCBidWZmZXJzIHF1ZXVlZCB0byBob2xkIHJlZmVyZW5jZSB0byB0aGVtCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5wdXRCdWZmZXJzTXV0ZXgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKml0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGlucHV0SW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIGF1dG8gcmVzID0gbUlucHV0QnVmZmVycy5lbXBsYWNlKGlucHV0SW5kZXgsIHdvcmstPmlucHV0LmJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCFyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYXBwZW5kPyAtIGZvciBub3cgd2UgYXJlIHJlcGxhY2luZworICAgICAgICAgICAgICAgIHJlcy5maXJzdC0+c2Vjb25kID0gd29yay0+aW5wdXQuYnVmZmVyczsKKyAgICAgICAgICAgICAgICBBTE9HSSgicXVldWUgLS0gZHVwbGljYXRlIGlucHV0IGZyYW1lOiBpbmRleCAlbGx1LiAiCisgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRpbmcgdGhlIG9sZCBpbnB1dCBmcmFtZS4uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWlucHV0SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnRbaW5wdXRJbmRleF0gPSB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKTsKKyAgICAgICAgICAgIEFMT0dWKCJxdWV1ZSAtLSBxdWV1ZWluZyBpbnB1dCBmcmFtZTogIgorICAgICAgICAgICAgICAgICAgImluZGV4ICVsbHUgKGNvbnRhaW5pbmcgJXp1IGJ1ZmZlcnMpIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpbnB1dEluZGV4LCB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXb3JrQnVuZGxlIHdvcmtCdW5kbGU7CisgICAgU3RhdHVzIGhpZGxTdGF0dXMgPSBvYmpjcHkoJndvcmtCdW5kbGUsICppdGVtcywgJm1CdWZmZXJQb29sU2VuZGVyKTsKKyAgICBpZiAoaGlkbFN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCJxdWV1ZSAtLSBiYWQgaW5wdXQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5xdWV1ZSh3b3JrQnVuZGxlKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgicXVldWUgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJxdWV1ZSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Zmx1c2goCisgICAgICAgIEMyQ29tcG9uZW50OjpmbHVzaF9tb2RlX3QgbW9kZSwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZCltb2RlOyAvLyBGbHVzaCBtb2RlIGlzbid0IHN1cHBvcnRlZCBpbiBISURMIHlldC4KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5mbHVzaCgKKyAgICAgICAgICAgIFsmc3RhdHVzLCBmbHVzaGVkV29ya10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBXb3JrQnVuZGxlJiB3YikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmbHVzaCAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9iamNweShmbHVzaGVkV29yaywgd2IpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImZsdXNoIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBJbmRpY2VzIG9mIGZsdXNoZWQgd29yayBpdGVtcy4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gZmx1c2hlZEluZGljZXM7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6ICpmbHVzaGVkV29yaykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlucHV0IGlzIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5wdXQgYnVmZmVycycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIGZvciAodWludDY0X3QgZmx1c2hlZEluZGV4IDogZmx1c2hlZEluZGljZXMpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUlucHV0QnVmZmVyc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dEJ1ZmZlcnMuZmluZChmbHVzaGVkSW5kZXgpOworICAgICAgICBpZiAoaXQgPT0gbUlucHV0QnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoImZsdXNoIC0tIHJldHVybmVkIGNvbnN1bWVkL3Vua25vd24gaW5wdXQgZnJhbWU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmRleCAlbGx1IiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylmbHVzaGVkSW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoImZsdXNoIC0tIHJldHVybmVkIHVucHJvY2Vzc2VkIGlucHV0IGZyYW1lOiAiCisgICAgICAgICAgICAgICAgICAiaW5kZXggJWxsdSAoY29udGFpbmluZyAlenUgYnVmZmVycykiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZsdXNoZWRJbmRleCwgbUlucHV0QnVmZmVyQ291bnRbZmx1c2hlZEluZGV4XSk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50LmVyYXNlKGZsdXNoZWRJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBicUlkID0gbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LnVubG9jaygpOworCisgICAgaWYgKGlnYnApIHsKKyAgICAgICAgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKCpmbHVzaGVkV29yaywgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRyYWluKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5kcmFpbigKKyAgICAgICAgICAgIG1vZGUgPT0gQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImRyYWluIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZHJhaW4gLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnN0YXJ0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5zdGFydCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJzdGFydCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzdG9wKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5zdG9wKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInN0b3AgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJzdG9wIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC5sb2NrKCk7CisgICAgbUlucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlckNvdW50LmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVyc011dGV4LnVubG9jaygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+cmVzZXQoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgicmVzZXQgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJyZXNldCAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJzTXV0ZXgubG9jaygpOworICAgIG1JbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJDb3VudC5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IGJhc2UoKS0+cmVsZWFzZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgicmVsZWFzZSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJzTXV0ZXgubG9jaygpOworICAgIG1JbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJDb3VudC5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlcnNNdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IHN1cmZhY2UtPmdldEhhbEludGVyZmFjZSgpOworICAgIGlmICghaWdicCkgeworICAgICAgICBpZ2JwID0gbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KHN1cmZhY2UpOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwgaWdicCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoInNldE91dHB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJzZXRPdXRwdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgpOworICAgICAgICBpZiAobU91dHB1dElnYnAgIT0gc3VyZmFjZSkgeworICAgICAgICAgICAgbU91dHB1dElnYnAgPSBzdXJmYWNlOworICAgICAgICAgICAgaWYgKCFzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dEJxSWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdXJmYWNlLT5nZXRVbmlxdWVJZCgmbU91dHB1dEJxSWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNldE91dHB1dFN1cmZhY2UgLS0gY2Fubm90IG9idGFpbiBidWZmZXJxdWV1ZSBpZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtT3V0cHV0R2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpxdWV1ZVRvT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KSB7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIGlmICghZ2V0QnVmZmVyUXVldWVBc3NpZ25tZW50KGJsb2NrLCAmZ2VuZXJhdGlvbiwgJmJxSWQsICZicVNsb3QpIHx8CisgICAgICAgICAgICBicUlkID09IDApIHsKKyAgICAgICAgLy8gQmxvY2sgbm90IGZyb20gYnVmZmVycXVldWUgLS0gaXQgbXVzdCBiZSBhdHRhY2hlZCBiZWZvcmUgcXVldWluZy4KKworICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dElnYnAgPSBtT3V0cHV0SWdicDsKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1PdXRwdXRHZW5lcmF0aW9uOworICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSAhYXR0YWNoVG9CdWZmZXJRdWV1ZShibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJxU2xvdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBhdHRhY2hpbmcgZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgIm9uIG5vbi1idWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkLiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBvdXRwdXRHZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoIW91dHB1dElnYnApIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIG91dHB1dCBzdXJmYWNlIGlzIG51bGwuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChicUlkICE9IG91dHB1dEJxSWQpIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGJ1ZmZlcnF1ZXVlIGlkcyBtaXNtYXRjaC4iKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGlmIChnZW5lcmF0aW9uICE9IG91dHB1dEdlbmVyYXRpb24pIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGdlbmVyYXRpb24gbnVtYmVycyBtaXNtYXRjaC4iKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dElnYnAtPnF1ZXVlQnVmZmVyKHN0YXRpY19jYXN0PGludD4oYnFTbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJxdWV1ZVRvT3V0cHV0U3VyZmFjZSAtLSBxdWV1ZUJ1ZmZlcigpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgIm9uIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrLiAiCisgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZC4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICgheWllbGRCdWZmZXJRdWV1ZUJsb2NrKGJsb2NrKSkgeworICAgICAgICBBTE9HRCgicXVldWVUb091dHB1dFN1cmZhY2UgLS0gY2Fubm90IHlpZWxkIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrICIKKyAgICAgICAgICAgICAgICAidG8gdGhlIGJ1ZmZlcnF1ZXVlLiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBiYXNlKCktPmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHByb2R1Y2VyLCBzb3VyY2UpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZSA9ICVkIiwgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJkaXNjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlID0gJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c2V0RGVhdGhMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKworICAgIHN0cnVjdCBIaWRsRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gYmFzZTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbkRlYXRoKGNvbXBvbmVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJvbkRlYXRoIC0tIGxpc3RlbmVyIGRpZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8SGlkbERlYXRoUmVjaXBpZW50PiBkZWF0aFJlY2lwaWVudCA9IG5ldyBIaWRsRGVhdGhSZWNpcGllbnQoKTsKKyAgICBkZWF0aFJlY2lwaWVudC0+YmFzZSA9IGxpc3RlbmVyOworICAgIGRlYXRoUmVjaXBpZW50LT5jb21wb25lbnQgPSBjb21wb25lbnQ7CisKKyAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCA9IGRlYXRoUmVjaXBpZW50OworICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IGNvbXBvbmVudC0+YmFzZSgpLT5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbXBvbmVudC0+bURlYXRoUmVjaXBpZW50LCAwKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgic2V0RGVhdGhMaXN0ZW5lciAtLSBmYWlsZWQgdHJhbnNhY3Rpb246IGxpbmtUb0RlYXRoLiIpOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHRyYW5zUmVzdWx0KSkgeworICAgICAgICBBTE9HRSgic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCBjYWxsIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZQorCitDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZTo6QmFzZSogQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJhc2UqPihtQmFzZS5nZXQoKSk7Cit9CisKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGJhc2UpIDoKKyAgICBtQmFzZShiYXNlKSwKKyAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyKG5ldworICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6CisgICAgICAgICAgICBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoYmFzZSkpIHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZSgpLT5jb25uZWN0VG9Db21wb25lbnQoCisgICAgICAgIGNvbXBvbmVudC0+YmFzZSgpLAorICAgICAgICBbJnN0YXR1cywgY29ubmVjdGlvbl0oCisgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNvbm5lY3RUb0NvbXBvbmVudCAtLSBjYWxsIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGUgPSAlZCIsIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbm5lY3Rpb24+KGMpOworICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiY29ubmVjdCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIik7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldENvbmZpZ3VyYWJsZSgpIGNvbnN0IHsKKyAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0gYmFzZSgpLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HVygiZ2V0Q29uZmlndXJhYmxlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmICghc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSkgeworICAgICAgICBBTE9HVygiZ2V0Q29uZmlndXJhYmxlIC0tIG51bGwgcG9pbnRlci4iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPENvbmZpZ3VyYWJsZT4odHJhbnNSZXN1bHQpOworfQorCitjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYKKyAgICAgICAgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30KKworY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpnZXRIYWxJbnRlcmZhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CYXNlOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24KKworQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpCYXNlKgorICAgICAgICBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb246OmJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJhc2UqPihtQmFzZS5nZXQoKSk7Cit9CisKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3Qgc3A8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpCYXNlPiYgYmFzZSkgOgorICAgIG1CYXNlKGJhc2UpIHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gYmFzZSgpLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4YmYwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oCkBAIC0wLDAgKzEsNDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9DTElFTlRfSF8KKyNkZWZpbmUgQ09ERUMyX0hJRExfQ0xJRU5UX0hfCisKKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtaW5pbWFsIGludGVyZmFjZXMgZm9yIHRoZSBmcmFtZXdvcmsgdG8gYWNjZXNzIENvZGVjMi4wLgorICoKKyAqIENvZGVjMkNsaWVudCBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5uZXIgY2xhc3NlczoKKyAqIC0gTGlzdGVuZXIKKyAqIC0gQ29uZmlndXJhYmxlCisgKiAtIEludGVyZmFjZQorICogLSBDb21wb25lbnQKKyAqCisgKiBDbGFzc2VzIGluIENvZGVjMkNsaWVudCwgaW50ZXJmYWNlcyBpbiBDb2RlYzIuMCwgYW5kICBISURMIGludGVyZmFjZXMgYXJlCisgKiByZWxhdGVkIGFzIGZvbGxvd3M6CisgKiAtIENvZGVjMkNsaWVudCA8PT0+IEMyQ29tcG9uZW50U3RvcmUgPD09PiBJQ29tcG9uZW50U3RvcmUKKyAqIC0gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciA8PT0+IEMyQ29tcG9uZW50OjpMaXN0ZW5lciA8PT0+IElDb21wb25lbnRMaXN0ZW5lcgorICogLSBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSA8PT0+IFtObyBlcXVpdmFsZW50XSA8PT0+IElDb25maWd1cmFibGUKKyAqIC0gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgPD09PiBDMkNvbXBvbmVudEludGVyZmFjZSA8PT0+IElDb21wb25lbnRJbnRlcmZhY2UKKyAqIC0gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgPD09PiBDMkNvbXBvbmVudCA8PT0+IElDb21wb25lbnQKKyAqCisgKiBUaGUgZW50cnkgcG9pbnQgaXMgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgpLCB3aGljaCBjcmVhdGVzIGEKKyAqIENvZGVjMkNsaWVudCBvYmplY3QuIEZyb20gQ29kZWMyQ2xpZW50LCBJbnRlcmZhY2UgYW5kIENvbXBvbmVudCBvYmplY3RzIGNhbgorICogYmUgY3JlYXRlZCBieSBjYWxsaW5nIGNyZWF0ZUNvbXBvbmVudCgpIGFuZCBjcmVhdGVJbnRlcmZhY2UoKS4KKyAqCisgKiBjcmVhdGVDb21wb25lbnQoKSB0YWtlcyBhIExpc3RlbmVyIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHVzZXIuCisgKgorICogQXQgdGhlIHByZXNlbnQsIGNyZWF0ZUJsb2NrUG9vbCgpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IHlpZWxkcyBhCisgKiBDb25maWd1cmFibGUgb2JqZWN0LiBOb3RlLCBob3dldmVyLCB0aGF0IEludGVyZmFjZSwgQ29tcG9uZW50IGFuZAorICogQ29kZWMyQ2xpZW50IGFyZSBhbGwgc3ViY2xhc3NlcyBvZiBDb25maWd1cmFibGUuCisgKi8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBDb2RlYzIuMCBISURMIGludGVyZmFjZXMKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJQ29uZmlndXJhYmxlOworc3RydWN0IElDb21wb25lbnRJbnRlcmZhY2U7CitzdHJ1Y3QgSUNvbXBvbmVudDsKK3N0cnVjdCBJQ29tcG9uZW50U3RvcmU7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGMyCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CitzdHJ1Y3QgSUNsaWVudE1hbmFnZXI7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygb3RoZXIgY2xhc3NlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9IC8vIG5hbWVzcGFjZSBWMV8wCit9IC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAvLyBuYW1lc3BhY2UgZ3JhcGhpY3MKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2Ugb214IHsKK25hbWVzcGFjZSBWMV8wIHsKK3N0cnVjdCBJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIG9teAorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBjbGFzcyBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUsIGJ1dCBmb3J3YXJkCisvLyBkZWNsYXJhdGlvbiBvZiBhbiBpbm5lciBjbGFzcyBpcyBub3QgcG9zc2libGUuCitzdHJ1Y3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlIEJhc2U7CisKKyAgICBjb25zdCBDMlN0cmluZyYgZ2V0TmFtZSgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDb25maWd1cmFibGVDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJTdHJpbmcgbU5hbWU7CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQgOiBwdWJsaWMgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUgQmFzZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKKworICAgIHR5cGVkZWYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50IENvbmZpZ3VyYWJsZTsKKworICAgIHR5cGVkZWYgQ29uZmlndXJhYmxlIEludGVyZmFjZTsgLy8gVGhlc2UgdHdvIHR5cGVzIG1heSBkaXZlcmdlIGluIHRoZSBmdXR1cmUuCisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50OworCisgICAgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQgU3RvcmU7CisKKyAgICBzdGQ6OnN0cmluZyBnZXRJbnN0YW5jZU5hbWUoKSBjb25zdCB7IHJldHVybiBtSW5zdGFuY2VOYW1lOyB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCk7CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UpOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4qIGNvbnN0IGlucHV0U3VyZmFjZSk7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgbGlzdENvbXBvbmVudHMoKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzcmMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCk7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpbnN0YW5jZU5hbWUsCisgICAgICAgICAgICBib29sIHdhaXRGb3JTZXJ2aWNlID0gdHJ1ZSk7CisKKyAgICAvLyBUcnkgdG8gY3JlYXRlIGEgY29tcG9uZW50IHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGggYSBnaXZlbiBuYW1lIGZyb20gYWxsIGtub3duCisgICAgLy8gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0cik7CisKKyAgICAvLyBMaXN0IHRyYWl0cyBmcm9tIGFsbCBrbm93biBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+IENyZWF0ZUlucHV0U3VyZmFjZSgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDbGllbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UsIHN0ZDo6c3RyaW5nIGluc3RhbmNlTmFtZSk7CisKK3Byb3RlY3RlZDoKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisKKyAgICAvLyBGaW5kcyB0aGUgZmlyc3Qgc3RvcmUgd2hlcmUgdGhlIHByZWRpY2F0ZSByZXR1cm5zIE9LLCBhbmQgcmV0dXJucyB0aGUgbGFzdAorICAgIC8vIHByZWRpY2F0ZSByZXN1bHQuIFVzZXMga2V5IHRvIHJlbWVtYmVyIHRoZSBsYXN0IHN0b3JlIGZvdW5kLCBhbmQgaWYgY2FjaGVkLAorICAgIC8vIGl0IHRyaWVzIHRoYXQgc3RvcmUgYmVmb3JlIHRyeWluZyBhbGwgc3RvcmVzIChvbmUgcmV0cnkpLgorICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPiBwcmVkaWNhdGUpOworCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBtdXRhYmxlIGJvb2wgbUxpc3RlZDsKKyAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0c0xpc3Q7CisgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Pj4KKyAgICAgICAgICAgIG1BbGlhc2VzQnVmZmVyOworCisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyPgorICAgICAgICAgICAgbUhvc3RQb29sTWFuYWdlcjsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBwcm9kdWNlcyBzb21lIG91dHB1dC4KKyAgICAvLworICAgIC8vIG51bURpc2NhcmRlZElucHV0QnVmZmVycyBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IGJ1ZmZlcnMgY29udGFpbmVkIGluCisgICAgLy8gd29ya0l0ZW1zIHRoYXQgaGF2ZSBqdXN0IGJlY29tZSB1bnVzZWQuIE5vdGUgdGhhdCB3b3JrSXRlbXMgbWF5IGNvbnRhaW4KKyAgICAvLyBtb3JlIGlucHV0IGJ1ZmZlcnMgdGhhbiBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgYmVjYXVzZSBidWZmZXJzIHRoYXQKKyAgICAvLyBoYXZlIGJlZW4gcHJldmlvdXNseSByZXBvcnRlZCBieSBvbklucHV0QnVmZmVyRG9uZSgpIGFyZSBub3QgY291bnRlZAorICAgIC8vIHRvd2FyZHMgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzLCBidXQgbWF5IHN0aWxsIHNob3cgdXAgaW4gd29ya0l0ZW1zLgorICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zLAorICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycykgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGdvZXMgaW50byBhIHRyaXBwZWQgc3RhdGUuCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdHMKKyAgICAgICAgICAgICkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGVuY291bnRlcnMgYW4gZXJyb3IuCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHByb2Nlc3MgdGhhdCBob3N0cyB0aGUgY29tcG9uZW50IHNodXRzIGRvd24KKyAgICAvLyB1bmV4cGVjdGVkbHkuCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGlzIG5vIGxvbmdlciBpbiB1c2UgYnkgdGhlIGNvZGVjLgorICAgIC8vIElucHV0IGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgb25Xb3JrRG9uZSgpIG9yIGZsdXNoKCkgd2lsbCBub3QKKyAgICAvLyB0cmlnZ2VyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgPSAwOworCisgICAgLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdHJhbnNwb3J0aW5nIG9uRnJhbWVzUmVuZGVyZWQoKSBldmVudCB0byB0aGUKKyAgICAvLyBjbGllbnQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBvYnRhaW5lZCBmcm9tIGEKKyAgICAvLyBidWZmZXJxdWV1ZS4KKyAgICBzdHJ1Y3QgUmVuZGVyZWRGcmFtZSB7CisgICAgICAgIC8vIFRoZSBpZCBvZiB0aGUgYnVmZmVycXVldWUuCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgIC8vIFRoZSBzbG90IG9mIHRoZSBidWZmZXIgaW5zaWRlIHRoZSBidWZmZXJxdWV1ZS4KKyAgICAgICAgaW50MzJfdCBzbG90SWQ7CisgICAgICAgIC8vIFRoZSB0aW1lc3RhbXAuCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnM7CisKKyAgICAgICAgUmVuZGVyZWRGcmFtZSh1aW50NjRfdCBidWZmZXJRdWV1ZUlkLCBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKQorICAgICAgICAgICAgICA6IGJ1ZmZlclF1ZXVlSWQoYnVmZmVyUXVldWVJZCksCisgICAgICAgICAgICAgICAgc2xvdElkKHNsb3RJZCksCisgICAgICAgICAgICAgICAgdGltZXN0YW1wTnModGltZXN0YW1wTnMpIHt9CisgICAgICAgIFJlbmRlcmVkRnJhbWUoY29uc3QgUmVuZGVyZWRGcmFtZSYpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGJlY29tZXMgYXdhcmUgb2YgZnJhbWVzIGJlaW5nIHJlbmRlcmVkLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQgQmFzZTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZSgKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKTsKKworICAgIGMyX3N0YXR1c190IGZsdXNoKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCk7CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpOworCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6CisgICAgICAgICAgICBRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gYmUgdXNlZCB3aXRoIGEgYmxvY2twb29sIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICAgIC8vIGNyZWF0ZUJsb2NrUG9vbCgpLgorICAgIGMyX3N0YXR1c190IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKyAgICAvLyBFeHRyYWN0IGEgc2xvdCBudW1iZXIgZnJvbSBvZiB0aGUgYmxvY2ssIHRoZW4gY2FsbAorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyKCkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgb3V0cHV0IHN1cmZhY2UgaGFzIG5vdCBiZWVuIHNldCwgTk9fSU5JVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwKKyAgICAvLyBhdHRhY2hCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZCwgZm9sbG93ZWQgYnkgcXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBibG9jayBoYXMgYSBicUlkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGlkIG9mIHRoZSBvdXRwdXQgc3VyZmFjZSwKKyAgICAvLyBERUFEX09CSkVDVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGNhbGwgdG8gcXVldWVCdWZmZXIoKSBpcyBzdWNjZXNzZnVsIGJ1dCB0aGUgYmxvY2sgY2Fubm90IGJlCisgICAgLy8gYXNzb2NpYXRlZCB0byB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gdXBvbgorICAgIC8vIGRlc3RydWN0aW9uLCBVTktOT1dOX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBxdWV1ZUJ1ZmZlcigpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgcXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICBjMl9zdGF0dXNfdCBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb21wb25lbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCisgICAgfkNvbXBvbmVudCgpOworCitwcm90ZWN0ZWQ6CisgICAgQmFzZSogYmFzZSgpIGNvbnN0OworCisgICAgLy8gTXV0ZXggZm9yIG1JbnB1dEJ1ZmZlcnMgYW5kIG1JbnB1dEJ1ZmZlckNvdW50LgorICAgIG11dGFibGUgc3RkOjptdXRleCBtSW5wdXRCdWZmZXJzTXV0ZXg7CisKKyAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gdmVjdG9yIG9mIGJ1ZmZlckluZGljZXMKKyAgICAvLworICAgIC8vIG1JbnB1dEJ1ZmZlcnNbZnJhbWVJbmRleF1bYnVmZmVySW5kZXhdIG1heSBiZSBudWxsIGlmIHRoZSBidWZmZXIgaW4gdGhhdAorICAgIC8vIHNsb3QgaGFzIGJlZW4gZnJlZWQuCisgICAgbXV0YWJsZSBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4+CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJzOworCisgICAgLy8gTWFwOiBmcmFtZUluZGV4IC0+IG51bWJlciBvZiBidWZmZXJJbmRpY2VzIHRoYXQgaGF2ZSBub3QgYmVlbiBmcmVlZAorICAgIC8vCisgICAgLy8gbUlucHV0QnVmZmVyQ291bnRbZnJhbWVJbmRleF0ga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBub24tbnVsbAorICAgIC8vIGVsZW1lbnRzIGluIG1JbnB1dEJ1ZmZlcnNbZnJhbWVJbmRleF0uIFdoZW4gbUlucHV0QnVmZmVyQ291bnRbZnJhbWVJbmRleF0KKyAgICAvLyBkZWNyZWFzZXMgdG8gMCwgZnJhbWVJbmRleCBjYW4gYmUgcmVtb3ZlZCBmcm9tIGJvdGggbUlucHV0QnVmZmVycyBhbmQKKyAgICAvLyBtSW5wdXRCdWZmZXJDb3VudC4KKyAgICBtdXRhYmxlIHN0ZDo6bWFwPHVpbnQ2NF90LCBzaXplX3Q+IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RkOjptdXRleCBtT3V0cHV0QnVmZmVyUXVldWVNdXRleDsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtT3V0cHV0SWdicDsKKyAgICB1aW50NjRfdCBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBtT3V0cHV0R2VuZXJhdGlvbjsKKworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBzZXREZWF0aExpc3RlbmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworCisgICAgZnJpZW5kIHN0cnVjdCBDb2RlYzJDbGllbnQ7CisKKyAgICBzdHJ1Y3QgSGlkbExpc3RlbmVyOworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGlucHV0IGJ1ZmZlcnMgdGhhdCBzaG91bGQgYmUgZGlzY2FyZGVkLgorICAgIHNpemVfdCBoYW5kbGVPbldvcmtEb25lKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcyk7CisgICAgLy8gUmVtb3ZlIGFuIGlucHV0IGJ1ZmZlciBmcm9tIG1JbnB1dEJ1ZmZlcnMgYW5kIHJldHVybiBpdC4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGZyZWVJbnB1dEJ1ZmZlcih1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYnVmZmVySW5kZXgpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UgeworcHVibGljOgorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlIEJhc2U7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICAgICAgICAgIENvbm5lY3Rpb25CYXNlOworCisgICAgdHlwZWRlZiBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24gQ29ubmVjdGlvbjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICBjMl9zdGF0dXNfdCBjb25uZWN0VG9Db21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb24+KiBjb25uZWN0aW9uKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb25maWd1cmFibGU+IGdldENvbmZpZ3VyYWJsZSgpIGNvbnN0OworCisgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0OworCisgICAgLy8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIElJbnB1dFN1cmZhY2UuCisgICAgY29uc3Qgc3A8QmFzZT4mIGdldEhhbEludGVyZmFjZSgpIGNvbnN0OworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBJbnB1dFN1cmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgQmFzZSogYmFzZSgpIGNvbnN0OworICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbiB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24gQmFzZTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3QoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBCYXNlKiBiYXNlKCkgY29uc3Q7CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9DTElFTlRfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIsCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorICAgIHNvY19zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgc3JjczogWworICAgICAgICAidmVuZG9yLmNwcCIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgICAgICB4ODY6IHsKKyAgICAgICAgICAgIHJlcXVpcmVkOiBbImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliMjhlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIHZlbmRvciBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CitpZmVxICgkKFRBUkdFVF9BUkNIKSwkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvc2VjY29tcF9wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorICAgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCisgICAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICAgIGVsc2UKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKKyAgICBlbmRpZgorZWxzZQorICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfQVJDSCkucG9saWN5CitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorZW5kaWYKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwgJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwNmJkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBhbmRyb2lkLWhhcmR3YXJlLW1lZGlhLWMyLWhhbC0xLTAgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMmY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1pbmlqYWlsLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisvLyBPbXhTdG9yZSBpcyBhZGRlZCBmb3IgdmlzaWJpbGl0eSBieSBkdW1wc3RhdGUuCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgorCisvLyBUaGlzIGlzIGNyZWF0ZWQgYnkgbW9kdWxlICJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Ii4gVGhpcyBjYW4gYmUgbW9kaWZpZWQuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0Jhc2VTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiOworCisvLyBBZGRpdGlvbmFsIGRldmljZS1zcGVjaWZpYyBzZWNjb21wIHBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCBpbiB0aGlzIGZpbGUuCitzdGF0aWMgY29uc3RleHByIGNoYXIga0V4dFNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5leHQucG9saWN5IjsKKworY2xhc3MgRHVtbXlDMlN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIER1bW15QzJTdG9yZSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkR1bW15QzJTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qbmFtZSovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgLypjb21wb25lbnQqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgLyogbmFtZSAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IC8qIGludGVyZmFjZSAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PgorICAgICAgICAgICAgbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBzcmMgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBkc3QgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBzdGFja1BhcmFtcyAqLywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiAvKiBoZWFwUGFyYW1JbmRpY2VzICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCAvKiBoZWFwUGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiAvKiBwYXJhbXMgKi8sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IC8qIGZhaWx1cmVzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IC8qIHBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgLyogZmllbGRzICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KK307CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIHN0YXJ0aW5nLi4uIik7CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgYW5kcm9pZDo6U2V0VXBNaW5pamFpbChrQmFzZVNlY2NvbXBQb2xpY3lQYXRoLCBrRXh0U2VjY29tcFBvbGljeVBhdGgpOworCisgICAgLy8gdm5kYmluZGVyIGlzIG5lZWRlZCBieSBCdWZmZXJRdWV1ZS4KKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIC8vIEV4dHJhIHRocmVhZHMgbWF5IGJlIG5lZWRlZCB0byBoYW5kbGUgYSBzdGFja2VkIElQQyBzZXF1ZW5jZSB0aGF0CisgICAgLy8gY29udGFpbnMgYWx0ZXJuYXRpbmcgYmluZGVyIGFuZCBod2JpbmRlciBjYWxscy4gKFNlZSBiLzM1MjgzNDgwLikKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIENyZWF0ZSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmU7CisKKyAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogUmVwbGFjZSB0aGlzIHdpdGgKKyAgICAgICAgLy8gc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAvLyAgICAgICAgIC8qIGltcGxlbWVudGF0aW9uIG9mIEMyQ29tcG9uZW50U3RvcmUgKi8pOworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBDb2RlYzIncyBkdW1teSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4uLiIpOworICAgICAgICBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxEdW1teUMyU3RvcmU+KCkpOworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoImRlZmF1bHQiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgQ29kZWMyJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIElPbXhTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzBkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDU4IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIiwKKyAgICAgICAgIlNraXBDdXRCdWZmZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5ZmQ3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMk9NWE5vZGUiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKworI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDMk9NWE5vZGU6OkMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKQorICAgIDogbUNvbXAoY29tcCksIG1GcmFtZUluZGV4KDApLCBtV2lkdGgoMCksIG1IZWlnaHQoMCksCisgICAgICBtQWRqdXN0VGltZXN0YW1wR2FwVXMoMCksIG1GaXJzdElucHV0RnJhbWUodHJ1ZSkgeworICAgIC8vIFRPRE86IHJlYWQgZnJvbSBpbnRmKCkKKyAgICBpZiAoIXN0cm5jbXAoY29tcC0+Z2V0TmFtZSgpLmNfc3RyKCksICJjMi5hbmRyb2lkLiIsIDExKSkgeworICAgICAgICBtVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVVzYWdlID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworICAgIH0KK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmcmVlTm9kZSgpIHsKKyAgICBtQ29tcC5yZXNldCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZW5kQ29tbWFuZChPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfUzMyIHBhcmFtKSB7CisgICAgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZFN0YXRlU2V0ICYmIHBhcmFtID09IE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgICAvLyBSZXNldCBmaXJzdCBpbnB1dCBmcmFtZSBzbyBpZiBDMk9NWE5vZGUgaXMgcmVjeWNsZWQsIHRoZSB0aW1lc3RhbXAgZG9lcyBub3QgYmVjb21lCisgICAgICAgIC8vIG5lZ2F0aXZlLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgSFcgY29kZWNzIHRoYXQgZG8gbm90IGhhbmRsZSB0aW1lc3RhbXAgcm9sbG92ZXIuCisgICAgICAgIG1GaXJzdElucHV0RnJhbWUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICBzd2l0Y2ggKCh1aW50MzJfdClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHM6IHsKKyAgICAgICAgICAgIE9NWF9VMzIgKnVzYWdlID0gKE9NWF9VMzIgKilwYXJhbXM7CisgICAgICAgICAgICAqdXNhZ2UgPSBtVXNhZ2U7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjogeworICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcERlZiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcGFyYW1zOworICAgICAgICAgICAgLy8gVE9ETzogcmVhZCB0aGVzZSBmcm9tIGludGYoKQorICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gMTY7CisgICAgICAgICAgICBwRGVmLT5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICAgICAgICAgIHBEZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgICAgIHBEZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBoYW5kbGUgbWF4L2ZpeGVkIGZyYW1lIGR1cmF0aW9uIGNvbnRyb2wKKyAgICBpZiAoaW5kZXggPT0gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1NYXhGcmFtZUR1cmF0aW9uRm9yQml0cmF0ZUNvbnRyb2wKKyAgICAgICAgICAgICYmIHBhcmFtcyAhPSBOVUxMCisgICAgICAgICAgICAmJiBzaXplID09IHNpemVvZihPTVhfUEFSQU1fVTMyVFlQRSkpIHsKKyAgICAgICAgLy8gVGhlIGluY29taW5nIG51bWJlciBpcyBhbiBpbnQzMl90IGNvbnRhaW5lZCBpbiBPTVhfVTMyLgorICAgICAgICBtQWRqdXN0VGltZXN0YW1wR2FwVXMgPSAoaW50MzJfdCkoKE9NWF9QQVJBTV9VMzJUWVBFKilwYXJhbXMpLT5uVTMyOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqY29uZmlnLCBzaXplX3Qgc2l6ZSkgeworICAgICh2b2lkKWluZGV4OworICAgICh2b2lkKWNvbmZpZzsKKyAgICAodm9pZClzaXplOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRDb25maWcoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqY29uZmlnLCBzaXplX3Qgc2l6ZSkgeworICAgICh2b2lkKWluZGV4OworICAgICh2b2lkKWNvbmZpZzsKKyAgICAodm9pZClzaXplOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQb3J0TW9kZShPTVhfVTMyIHBvcnRJbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCltb2RlOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKWVuYWJsZTsKKyAgICAodm9pZCltYXhGcmFtZVdpZHRoOworICAgICh2b2lkKW1heEZyYW1lSGVpZ2h0OworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpdHVubmVsZWQ7CisgICAgKHZvaWQpYXVkaW9Id1N5bmM7CisgICAgKnNpZGViYW5kSGFuZGxlID0gbnVsbHB0cjsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0R3JhcGhpY0J1ZmZlclVzYWdlKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfVTMyKiB1c2FnZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAqdXNhZ2UgPSAwOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgeworICAgIGMyX3N0YXR1c190IGVyciA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MsCisgICAgICAgICAgICAmbUFsbG9jYXRvcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclNvdXJjZSA9IGJ1ZmZlclNvdXJjZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6YWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSwgYnVmZmVyX2lkICpidWZmZXIsCisgICAgICAgIHZvaWQgKipidWZmZXJEYXRhLCBzcDxOYXRpdmVIYW5kbGU+ICpuYXRpdmVIYW5kbGUpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpc2l6ZTsKKyAgICAodm9pZCluYXRpdmVIYW5kbGU7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgKmJ1ZmZlckRhdGEgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjp1c2VCdWZmZXIoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpb214QnVmOworICAgICpidWZmZXIgPSAwOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmcmVlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBidWZmZXJfaWQgYnVmZmVyKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKWJ1ZmZlcjsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZmlsbEJ1ZmZlcigKKyAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsIGludCBmZW5jZUZkKSB7CisgICAgKHZvaWQpYnVmZmVyOworICAgICh2b2lkKW9teEJ1ZjsKKyAgICAodm9pZClmZW5jZUZkOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjplbXB0eUJ1ZmZlcigKKyAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSB7CisgICAgLy8gVE9ETzogYmV0dGVyIGZlbmNlIGhhbmRsaW5nCisgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICBzcDxGZW5jZT4gZmVuY2UgPSBuZXcgRmVuY2UoZmVuY2VGZCk7CisgICAgICAgIGZlbmNlLT53YWl0Rm9yZXZlcihMT0dfVEFHKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gbUNvbXAubG9jaygpOworICAgIGlmICghY29tcCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjMkZsYWdzID0gKGZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworCisgICAgQzJIYW5kbGUgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgaWYgKG9teEJ1Zi5tQnVmZmVyVHlwZSA9PSBPTVhCdWZmZXI6OmtCdWZmZXJUeXBlQU5XQnVmZmVyCisgICAgICAgICAgICAmJiBvbXhCdWYubUdyYXBoaWNCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIGhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUob214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnN0cmlkZSk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKyAgICB9IGVsc2UgaWYgKCEoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCljMkZsYWdzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworCisgICAgLy8gV09SS0FST1VORDogYWRqdXN0IHRpbWVzdGFtcCBiYXNlZCBvbiBnYXBVcworICAgIHsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZXN0YW1wOyAvLyBzYXZlIGlucHV0IHRpbWVzdGFtcAorICAgICAgICBpZiAobUZpcnN0SW5wdXRGcmFtZSkgeworICAgICAgICAgICAgLy8gZ3JhYiB0aW1lc3RhbXBzIG9uIGZpcnN0IGZyYW1lCisgICAgICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbVByZXZDb2RlY1RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIG1GaXJzdElucHV0RnJhbWUgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRqdXN0VGltZXN0YW1wR2FwVXMgPiAwKSB7CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9CisgICAgICAgICAgICAgICAgbVByZXZDb2RlY1RpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKyBjMl9taW4oKHRpbWVzdGFtcCAtIG1QcmV2SW5wdXRUaW1lc3RhbXApLnBlZWsoKSwgbUFkanVzdFRpbWVzdGFtcEdhcFVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRqdXN0VGltZXN0YW1wR2FwVXMgPCAwKSB7CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1QcmV2Q29kZWNUaW1lc3RhbXAgLSBtQWRqdXN0VGltZXN0YW1wR2FwVXM7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZJbnB1dFRpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbDsKKyAgICAgICAgbVByZXZDb2RlY1RpbWVzdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworICAgICAgICBBTE9HVigiYWRqdXN0aW5nICVsbGQgdG8gJWxsZCAoZ2FwPSVsbGQpIiwKKyAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsLnBlZWtsbCgpLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgIH0KKworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIGlmIChibG9jaykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyKAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSwKKyAgICAgICAgICAgICAgICBbYnVmZmVyLCBzb3VyY2UgPSBnZXRTb3VyY2UoKV0oQzJCdWZmZXIgKnB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAodm9pZClzb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlciwgLTEpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayhjMkJ1ZmZlcik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5xdWV1ZSgmaXRlbXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJOYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgICh2b2lkKXBhcmFtZXRlck5hbWU7CisgICAgKmluZGV4ID0gT01YX0luZGV4TWF4OworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UmIG1zZykgeworICAgIGlmIChtc2cudHlwZSAhPSBvbXhfbWVzc2FnZTo6RVZFTlQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBpZiAobXNnLnUuZXZlbnRfZGF0YS5ldmVudCAhPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKW1zZy51LmV2ZW50X2RhdGEuZGF0YTE7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBtc2cudS5ldmVudF9kYXRhLmRhdGEzOworCisgICAgLy8gVE9ETzogc2V0IGRhdGFzcGFjZSBvbiBjb21wb25lbnQgdG8gc2VlIGlmIGl0IGltcGFjdHMgY29sb3IgYXNwZWN0cworICAgIEFMT0dEKCJkYXRhc3BhY2UgY2hhbmdlZCB0byAlI3ggcGl4ZWwgZm9ybWF0OiAlI3giLCBkYXRhU3BhY2UsIHBpeGVsRm9ybWF0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElPTVhCdWZmZXJTb3VyY2U+IEMyT01YTm9kZTo6Z2V0U291cmNlKCkgeworICAgIHJldHVybiBtQnVmZmVyU291cmNlOworfQorCit2b2lkIEMyT01YTm9kZTo6c2V0RnJhbWVTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTgxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX09NWF9OT0RFX0hfCisjZGVmaW5lIEMyX09NWF9OT0RFX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBJT214Tm9kZSBpbXBsZW1lbnRhdGlvbiBhcm91bmQgY29kZWMgMi4wIGNvbXBvbmVudCwgb25seSB0byBiZSB1c2VkIGluCisgKiBJR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlLiBPbmx5IHN1YnNldCBvZiBJT214Tm9kZSBBUEkgaXMgaW1wbGVtZW50ZWQKKyAqIGFuZCBvdGhlcnMgYXJlIGxlZnQgYXMgc3R1Yi4gQXMgYSByZXN1bHQsIG9uZSBjYW5ub3QgZXhwZWN0IHRoaXMgSU9teE5vZGUKKyAqIHRvIHdvcmsgaW4gYW55IG90aGVyIHVzYWdlIHRoYW4gSUdyYXBoaWNCdWZmZXJTb3VyY2UuCisgKi8KK3N0cnVjdCBDMk9NWE5vZGUgOiBwdWJsaWMgQm5PTVhOb2RlIHsKKyAgICBleHBsaWNpdCBDMk9NWE5vZGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCk7CisgICAgfkMyT01YTm9kZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vIElPTVhOb2RlCisgICAgc3RhdHVzX3QgZnJlZU5vZGUoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZChPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfUzMyIHBhcmFtKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRQb3J0TW9kZShPTVhfVTMyIHBvcnRfaW5kZXgsIElPTVg6OlBvcnRNb2RlIG1vZGUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldEdyYXBoaWNCdWZmZXJVc2FnZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX1UzMiogdXNhZ2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPTVhCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGFsbG9jYXRlU2VjdXJlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwgYnVmZmVyX2lkICpidWZmZXIsCisgICAgICAgICAgICB2b2lkICoqYnVmZmVyX2RhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZV9oYW5kbGUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHVzZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsIGJ1ZmZlcl9pZCAqYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBmcmVlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBidWZmZXJfaWQgYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBmaWxsQnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsIGludCBmZW5jZUZkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLAorICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyX25hbWUsCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICppbmRleCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZGlzcGF0Y2hNZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIG92ZXJyaWRlOworCisgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gZ2V0U291cmNlKCk7CisgICAgdm9pZCBzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXA7CisgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gbUJ1ZmZlclNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZyYW1lSW5kZXg7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDY0X3QgbVVzYWdlOworCisgICAgLy8gV09SS0FST1VORDogdGltZXN0YW1wIGFkanVzdG1lbnQKKworICAgIC8vIGlmID4wOiB0aGlzIGlzIHRoZSBtYXggdGltZXN0YW1wIGdhcCwgaWYgPDA6IHRoaXMgaXMgLTEgdGltZXMgdGhlIGZpeGVkIHRpbWVzdGFtcCBnYXAKKyAgICAvLyBpZiAwOiBubyB0aW1lc3RhbXAgYWRqdXN0bWVudCBpcyBtYWRlCisgICAgLy8gbm90ZSB0aGF0IEMyT01YTm9kZSBjYW4gYmUgcmVjeWNsZWQgYmV0d2VlbiBlbmNvZGluZyBzZXNzaW9ucy4KKyAgICBpbnQzMl90IG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICBib29sIG1GaXJzdElucHV0RnJhbWU7IC8vIHRydWUgZm9yIGZpcnN0IGlucHV0CisgICAgYzJfY250cjY0X3QgbVByZXZJbnB1dFRpbWVzdGFtcDsgLy8gaW5wdXQgdGltZXN0YW1wIGZvciBwcmV2aW91cyBmcmFtZQorICAgIGMyX2NudHI2NF90IG1QcmV2Q29kZWNUaW1lc3RhbXA7IC8vIGFkanVzdGVkIChjb2RlYykgdGltZXN0YW1wIGZvciBwcmV2aW91cyBmcmFtZQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9PTVhfTk9ERV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJkNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTAsMCArMSwxNzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisjaW5jbHVkZSAiQ0NvZGVjLmgiCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSAqQ3JlYXRlSW5wdXRTdXJmYWNlKCk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgQkdyYXBoaWNCdWZmZXJTb3VyY2UgPSA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlOworCituYW1lc3BhY2UgeworCitjbGFzcyBDQ29kZWNXYXRjaGRvZyA6IHB1YmxpYyBBSGFuZGxlciB7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFdhdGNoLAorICAgIH07CisgICAgY29uc3RleHByIHN0YXRpYyBpbnQ2NF90IGtXYXRjaEludGVydmFsVXMgPSAzMzAwMDAwOyAgLy8gMy4zIHNlY3MKKworcHVibGljOgorICAgIHN0YXRpYyBzcDxDQ29kZWNXYXRjaGRvZz4gZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHN0YXRpYyBzcDxDQ29kZWNXYXRjaGRvZz4gaW5zdGFuY2UobmV3IENDb2RlY1dhdGNoZG9nKTsKKyAgICAgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWc7CisgICAgICAgIC8vIENhbGwgSW5pdCgpIG9ubHkgb25jZS4KKyAgICAgICAgc3RkOjpjYWxsX29uY2UoZmxhZywgSW5pdCwgaW5zdGFuY2UpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgfkNDb2RlY1dhdGNoZG9nKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCB3YXRjaChzcDxDQ29kZWM+IGNvZGVjKSB7CisgICAgICAgIGJvb2wgc2hvdWxkUG9zdCA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+Pjo6TG9ja2VkIGNvZGVjcyhtQ29kZWNzVG9XYXRjaCk7CisgICAgICAgICAgICAvLyBJZiBhIHdhdGNoIG1lc3NhZ2UgaXMgaW4gZmxpZ2h0LCBwaWdneS1iYWNrIHRoaXMgaW5zdGFuY2UgYXMgd2VsbC4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcG9zdCBhIG5ldyB3YXRjaCBtZXNzYWdlLgorICAgICAgICAgICAgc2hvdWxkUG9zdCA9IGNvZGVjcy0+ZW1wdHkoKTsKKyAgICAgICAgICAgIGNvZGVjcy0+ZW1wbGFjZShjb2RlYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZFBvc3QpIHsKKyAgICAgICAgICAgIEFMT0dWKCJwb3N0aW5nIHdhdGNoIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXYXRjaCwgdGhpcykpLT5wb3N0KGtXYXRjaEludGVydmFsVXMpOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICBjYXNlIGtXaGF0V2F0Y2g6IHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+Pjo6TG9ja2VkIGNvZGVjcyhtQ29kZWNzVG9XYXRjaCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIndhdGNoIGZvciAlenUgY29kZWNzIiwgY29kZWNzLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGNvZGVjcy0+YmVnaW4oKTsgaXQgIT0gY29kZWNzLT5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDQ29kZWM+IGNvZGVjID0gaXQtPnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5pbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGVjcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFRSRVNQQVNTKCJDQ29kZWNXYXRjaGRvZzogdW5yZWNvZ25pemVkIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBDQ29kZWNXYXRjaGRvZygpIDogbUxvb3BlcihuZXcgQUxvb3Blcikge30KKworICAgIHN0YXRpYyB2b2lkIEluaXQoY29uc3Qgc3A8Q0NvZGVjV2F0Y2hkb2c+ICZ0aGl6KSB7CisgICAgICAgIEFMT0dWKCJJbml0Iik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnNldE5hbWUoIkNDb2RlY1dhdGNoZG9nIik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGl6KTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj4gbUNvZGVjc1RvV2F0Y2g7Cit9OworCitjbGFzcyBDMklucHV0U3VyZmFjZVdyYXBwZXIgOiBwdWJsaWMgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJJbnB1dFN1cmZhY2VXcmFwcGVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiAmc3VyZmFjZSkgOgorICAgICAgICBtU3VyZmFjZShzdXJmYWNlKSB7CisgICAgfQorCisgICAgfkMySW5wdXRTdXJmYWNlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b1N0YXR1c1QobVN1cmZhY2UtPmNvbm5lY3RUb0NvbXBvbmVudChjb21wLCAmbUNvbm5lY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VfY29ubmVjdFRvQ29tcG9uZW50KTsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIElucHV0U3VyZmFjZSBkb2VzIG5vdCBkaXN0aW5ndWlzaCBzdGFydGVkIHN0YXRlCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGUgeworICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZyBlb3ModHJ1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN1cmZhY2UtPmdldENvbmZpZ3VyYWJsZSgpLT5jb25maWcoeyZlb3N9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcgX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gbUNvbm5lY3Rpb247Cit9OworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKy8vICAgIGV4cGxpY2l0IEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKSB7fQorICAgIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCkKKyAgICAgICAgOiBtU291cmNlKHNvdXJjZSksIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSB7CisgICAgICAgIG1EYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX0JUNzA5OworICAgIH0KKyAgICB+R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgbU5vZGUgPSBuZXcgQzJPTVhOb2RlKGNvbXApOworICAgICAgICBtTm9kZS0+c2V0RnJhbWVTaXplKG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgLy8gTk9URTogd2UgZG8gbm90IHVzZS9wYXNzIHRocm91Z2ggY29sb3IgYXNwZWN0cyBmcm9tIEdyYXBoaWNCdWZmZXJTb3VyY2UgYXMgd2UKKyAgICAgICAgLy8gY29tbXVuaWNhdGUgdGhhdCBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50LgorICAgICAgICBtU291cmNlLT5jb25maWd1cmUobU5vZGUsIG1EYXRhU3BhY2UpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU5vZGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Ob2RlLT5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiR0JTV3JhcHBlcjo6ZGlzY29ubmVjdDogbm9kZSBpcyBub3QgY29uZmlndXJlZCB3aXRoIE9NWEJ1ZmZlclNvdXJjZS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzb3VyY2UtPm9uT214SWRsZSgpOworICAgICAgICBzb3VyY2UtPm9uT214TG9hZGVkKCk7CisgICAgICAgIG1Ob2RlLmNsZWFyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgR2V0U3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZzdGF0dXMpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBiaW5kZXIgc3RhdHVzIGZhaWxlZCwgYnV0IHRoZXJlIGlzIG5vIHNlcnZpZSBvciB0cmFuc2FjdGlvbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtTm9kZS0+Z2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3RleHByIHNpemVfdCBrTnVtU2xvdHMgPSAxNjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU2xvdHM7ICsraSkgeworICAgICAgICAgICAgc291cmNlLT5vbklucHV0QnVmZmVyQWRkZWQoaSk7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2UtPm9uT214RXhlY3V0aW5nKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gR2V0U3RhdHVzKG1Tb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0YXR1czsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAgICAgLy8gaGFuZGxlIGVhY2ggY29uZmlndXJhdGlvbiBncmFudWFsbHksIGluIGNhc2Ugd2UgbmVlZCB0byBoYW5kbGUgcGFydCBvZiB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICAvLyBlbHNld2hlcmUKKworICAgICAgICAvLyBUUklDS1k6IHdlIGRvIG5vdCB1bnNldCBmcmFtZSBkZWxheSByZXBlYXRpbmcKKyAgICAgICAgaWYgKGNvbmZpZy5tTWluRnBzID4gMCAmJiBjb25maWcubU1pbkZwcyAhPSBtQ29uZmlnLm1NaW5GcHMpIHsKKyAgICAgICAgICAgIGludDY0X3QgdXMgPSAxZTYgLyBjb25maWcubU1pbkZwcyArIDAuNTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyh1cykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgbWluRnBzPSIgPDwgY29uZmlnLm1NaW5GcHMgPDwgIiA9PiByZXBlYXREZWxheVVzPSIgPDwgdXM7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tTWluRnBzID0gY29uZmlnLm1NaW5GcHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdHMgZ2FwCisgICAgICAgIGlmIChjb25maWcubU1pbkFkanVzdGVkRnBzID4gMCB8fCBjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgPiAwKSB7CisgICAgICAgICAgICBpZiAobU5vZGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFIHB0ckdhcFBhcmFtID0ge307CisgICAgICAgICAgICAgICAgcHRyR2FwUGFyYW0ublNpemUgPSBzaXplb2YoT01YX1BBUkFNX1UzMlRZUEUpOworICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5VMzIgPSAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICA/IGMyX21pbihJTlQzMl9NQVggKyAwLiwgMWU2IC8gY29uZmlnLm1NaW5BZGp1c3RlZEZwcyArIDAuNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogYzJfbWF4KDAuIC0gSU5UMzJfTUFYLCAtMWU2IC8gY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzIC0gMC41KTsKKyAgICAgICAgICAgICAgICAodm9pZCltTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1NYXhGcmFtZUR1cmF0aW9uRm9yQml0cmF0ZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHRyR2FwUGFyYW0sIHNpemVvZihwdHJHYXBQYXJhbSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWF4IGZwcworICAgICAgICAvLyBUUklDS1k6IHdlIGRvIG5vdCB1bnNldCBtYXggZnBzIHRvIDAgdW5sZXNzIHVzaW5nIGZpeGVkIGZwcworICAgICAgICBpZiAoKGNvbmZpZy5tTWF4RnBzID4gMCB8fCAoY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzID4gMCAmJiBjb25maWcubU1heEZwcyA9PSAwKSkKKyAgICAgICAgICAgICAgICAmJiBjb25maWcubU1heEZwcyAhPSBtQ29uZmlnLm1NYXhGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRNYXhGcHMoY29uZmlnLm1NYXhGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1heEZwcz0iIDw8IGNvbmZpZy5tTWF4RnBzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1heEZwcyA9IGNvbmZpZy5tTWF4RnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tVGltZU9mZnNldFVzICE9IG1Db25maWcubVRpbWVPZmZzZXRVcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVPZmZzZXRVcyhjb25maWcubVRpbWVPZmZzZXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZU9mZnNldCAiIDw8IGNvbmZpZy5tVGltZU9mZnNldFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tVGltZU9mZnNldFVzID0gY29uZmlnLm1UaW1lT2Zmc2V0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1DYXB0dXJlRnBzICE9IG1Db25maWcubUNhcHR1cmVGcHMgfHwgY29uZmlnLm1Db2RlZEZwcyAhPSBtQ29uZmlnLm1Db2RlZEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZUxhcHNlQ29uZmlnKGNvbmZpZy5tQ29kZWRGcHMsIGNvbmZpZy5tQ2FwdHVyZUZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZUxhcHNlICIgPDwgY29uZmlnLm1DYXB0dXJlRnBzIDw8ICJmcHMgYXMgIiA8PCBjb25maWcubUNvZGVkRnBzIDw8ICJmcHMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubUNhcHR1cmVGcHMgPSBjb25maWcubUNhcHR1cmVGcHM7CisgICAgICAgICAgICBtQ29uZmlnLm1Db2RlZEZwcyA9IGNvbmZpZy5tQ29kZWRGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdGFydEF0VXMgIT0gbUNvbmZpZy5tU3RhcnRBdFVzCisgICAgICAgICAgICAgICAgfHwgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmICFjb25maWcubVN0b3BwZWQpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RhcnRUaW1lVXMoY29uZmlnLm1TdGFydEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0YXJ0IGF0ICIgPDwgY29uZmlnLm1TdGFydEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdGFydEF0VXMgPSBjb25maWcubVN0YXJ0QXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdXNwZW5kLXJlc3VtZQorICAgICAgICBpZiAoY29uZmlnLm1TdXNwZW5kZWQgIT0gbUNvbmZpZy5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3VzcGVuZChjb25maWcubVN1c3BlbmRlZCwgY29uZmlnLm1TdXNwZW5kQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgIiA8PCAoY29uZmlnLm1TdXNwZW5kZWQgPyAic3VzcGVuZCIgOiAicmVzdW1lIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCAiIDw8IGNvbmZpZy5tU3VzcGVuZEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kZWQgPSBjb25maWcubVN1c3BlbmRlZDsKKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRBdFVzID0gY29uZmlnLm1TdXNwZW5kQXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiBjb25maWcubVN0b3BwZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdG9wVGltZVVzKGNvbmZpZy5tU3RvcEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0b3AgYXQgIiA8PCBjb25maWcubVN0b3BBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiBkZWxheVVzIjsKKyAgICAgICAgICAgICAgICByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+Z2V0U3RvcFRpbWVPZmZzZXRVcygmY29uZmlnLm1JbnB1dERlbGF5VXMpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiPSIgPDwgY29uZmlnLm1JbnB1dERlbGF5VXMgPDwgInVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbmZpZy5tSW5wdXREZWxheVVzID0gY29uZmlnLm1JbnB1dERlbGF5VXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wQXRVcyA9IGNvbmZpZy5tU3RvcEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29sb3IgYXNwZWN0cyAoYW5kcm9pZC5fY29sb3ItYXNwZWN0cykKKworICAgICAgICAvLyBjb25zdW1lciB1c2FnZQorICAgICAgICBBTE9HRCgiSVNDb25maWclcyIsIHN0YXR1cy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8QzJPTVhOb2RlPiBtTm9kZTsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBDb25maWcgbUNvbmZpZzsKK307CisKK2NsYXNzIENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXIgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gbUNsaWVudDsKKworcHVibGljOgorICAgIENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXIoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50KQorICAgICAgICA6IG1DbGllbnQoY2xpZW50KSB7IH0KKworICAgIHZpcnR1YWwgfkNvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+KSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCkgeworICAgICAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgeworICAgICAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBDMl9NQVlfQkxPQ0ssIGhlYXBQYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgQzJfTUFZX0JMT0NLKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5nZXRQYXJhbVJlZmxlY3RvcigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4oKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ0NvZGVjOjpDbGllbnRMaXN0ZW5lcgorCitzdHJ1Y3QgQ0NvZGVjOjpDbGllbnRMaXN0ZW5lciA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKworICAgIGV4cGxpY2l0IENsaWVudExpc3RlbmVyKGNvbnN0IHdwPENDb2RlYz4gJmNvZGVjKSA6IG1Db2RlYyhjb2RlYykge30KKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcywKKyAgICAgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm9uV29ya0RvbmUod29ya0l0ZW1zLCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+JiBzZXR0aW5nUmVzdWx0CisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgICh2b2lkKXNldHRpbmdSZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICAodm9pZCllcnJvckNvZGU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgIHsgLy8gTG9nIHRoZSBkZWF0aCBvZiB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYzIgY29tcG9uZW50IGRpZWQuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYzIgY29tcG9uZW50IFwiJXNcIiBkaWVkLiIsIGNvbXAtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0byBNZWRpYUNvZGVjLgorICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjIHx8ICFjb2RlYy0+bUNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm1DYWxsYmFjay0+b25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpcmVuZGVyZWRGcmFtZXM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmIChjb2RlYykgeworICAgICAgICAgICAgY29kZWMtPm9uSW5wdXRCdWZmZXJEb25lKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8Q0NvZGVjPiBtQ29kZWM7Cit9OworCisvLyBDQ29kZWNDYWxsYmFja0ltcGwKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsIDogcHVibGljIENDb2RlY0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNDYWxsYmFja0ltcGwoQ0NvZGVjICpjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisgICAgfkNDb2RlY0NhbGxiYWNrSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGVudW0gQWN0aW9uQ29kZSBhY3Rpb25Db2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgICAgIHtSZW5kZXJlZEZyYW1lSW5mbyhtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zKX0pOworICAgIH0KKworICAgIHZvaWQgb25Xb3JrUXVldWVkKGJvb2wgZW9zKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+b25Xb3JrUXVldWVkKGVvcyk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDQ29kZWMgKm1Db2RlYzsKK307CisKKy8vIENDb2RlYworCitDQ29kZWM6OkNDb2RlYygpCisgICAgOiBtQ2hhbm5lbChuZXcgQ0NvZGVjQnVmZmVyQ2hhbm5lbChzdGQ6Om1ha2Vfc2hhcmVkPENDb2RlY0NhbGxiYWNrSW1wbD4odGhpcykpKSwKKyAgICAgIG1RdWV1ZWRXb3JrQ291bnQoMCkgeworfQorCitDQ29kZWM6On5DQ29kZWMoKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gQ0NvZGVjOjpnZXRCdWZmZXJDaGFubmVsKCkgeworICAgIHJldHVybiBtQ2hhbm5lbDsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjp0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKSB7CisgICAgc3RhdHVzX3QgZXJyID0gam9iKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgYXV0byBzZXRBbGxvY2F0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IGNvZGVjSW5mbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZjb2RlY0luZm8pKTsKKyAgICAvLyBGb3IgQ29kZWMgMi4wIGNvbXBvbmVudHMsIGNvbXBvbmVudE5hbWUgPT0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKS4KKworICAgIHNwPEFNZXNzYWdlPiBhbGxvY01zZyhuZXcgQU1lc3NhZ2Uoa1doYXRBbGxvY2F0ZSwgdGhpcykpOworICAgIGFsbG9jTXNnLT5zZXRPYmplY3QoImNvZGVjSW5mbyIsIGNvZGVjSW5mbyk7CisgICAgYWxsb2NNc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKSB7CisgICAgaWYgKGNvZGVjSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0QoImFsbG9jYXRlKCVzKSIsIGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgIG1DbGllbnRMaXN0ZW5lci5yZXNldChuZXcgQ2xpZW50TGlzdGVuZXIodGhpcykpOworCisgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQ7CisKKyAgICAvLyBzZXQgdXAgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSB0byBhY2Nlc3MgdmVuZG9yIHN0b3JlIHBhcmFtZXRlcnMKKyAgICBjbGllbnQgPSBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0IiwgZmFsc2UpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgQUxPR0koInNldHRpbmcgdXAgJyVzJyBhcyBkZWZhdWx0ICh2ZW5kb3IpIHN0b3JlIiwgY2xpZW50LT5nZXRJbnN0YW5jZU5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyPihjbGllbnQpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPQorICAgICAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtQ2xpZW50TGlzdGVuZXIsCisgICAgICAgICAgICAmY2xpZW50KTsKKyAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCBDcmVhdGUgY29tcG9uZW50OiAlcyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0koIkNyZWF0ZWQgY29tcG9uZW50IFslc10iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgIG1DaGFubmVsLT5zZXRDb21wb25lbnQoY29tcCk7CisgICAgYXV0byBzZXRBbGxvY2F0ZWQgPSBbdGhpcywgY29tcCwgY2xpZW50XSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FUSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVEVEKTsKKyAgICAgICAgc3RhdGUtPmNvbXAgPSBjb21wOworICAgICAgICBtQ2xpZW50ID0gY2xpZW50OworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRBbGxvY2F0ZWQpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGNvbmZpZyBoZXJlIGluIGNhc2Ugc2V0UGFyYW1ldGVycyBpcyBjYWxsZWQgcHJpb3IgdG8gY29uZmlndXJlCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZy0+aW5pdGlhbGl6ZShtQ2xpZW50LCBjb21wKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHN1cHBvcnQiKTsKKyAgICAgICAgLy8gVE9ETzogcmVwb3J0IGVycm9yIG9uY2Ugd2UgY29tcGxldGUgaW1wbGVtZW50YXRpb24uCisgICAgfQorICAgIGNvbmZpZy0+cXVlcnlDb25maWd1cmF0aW9uKGNvbXApOworCisgICAgbUNhbGxiYWNrLT5vbkNvbXBvbmVudEFsbG9jYXRlZChjb21wb25lbnROYW1lLmNfc3RyKCkpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBhdXRvIGNoZWNrQWxsb2NhdGVkID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICByZXR1cm4gKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpID8gVU5LTk9XTl9FUlJPUiA6IE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tBbGxvY2F0ZWQpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnKG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgdGhpcykpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrQWxsb2NhdGVkID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZG9Db25maWcgPSBbbXNnLCBjb21wLCB0aGlzXSgpIC0+IHN0YXR1c190IHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZW5jb2RlcjsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZW5jb2RlciIsICZlbmNvZGVyKSkgeworICAgICAgICAgICAgZW5jb2RlciA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogcmVhZCBmcm9tIGludGYoKQorICAgICAgICBpZiAoKCFlbmNvZGVyKSAhPSAoY29tcC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBzdG9yZU1ldGE7CisgICAgICAgIGlmIChlbmNvZGVyCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKKyAgICAgICAgICAgICAgICAmJiBzdG9yZU1ldGEgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChzdG9yZU1ldGEgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJPbmx5IEFOVyBidWZmZXJzIGFyZSBzdXBwb3J0ZWQgZm9yIGxlZ2FjeSBtZXRhZGF0YSBtb2RlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DaGFubmVsLT5zZXRNZXRhTW9kZShDQ29kZWNCdWZmZXJDaGFubmVsOjpNT0RFX0FOVyk7CisgICAgICAgIH0KKworICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKSkgeworICAgICAgICAgICAgc3VyZmFjZSA9IHN0YXRpY19jYXN0PFN1cmZhY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIHNldFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IHN1cmZhY2UgIT0gbnVsbHB0cjsKKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLnJlc2V0KG5ldyBJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWd7fSk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NaW5GcHMgPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiLCAmdmFsdWUpICYmIHZhbHVlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRGbG9hdCgibWF4LWZwcy10by1lbmNvZGVyIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tTWF4RnBzKTsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMDsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgibWF4LXB0cy1nYXAtdG8tZW5jb2RlciIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCAmJiB2YWx1ZSA+PSBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tRml4ZWRBZGp1c3RlZEZwcyA9IC0xZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDAgJiYgdmFsdWUgPD0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZERvdWJsZSgidGltZS1sYXBzZS1mcHMiLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tQ2FwdHVyZUZwcyA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmY29uZmlnLT5tSVNDb25maWctPm1Db2RlZEZwcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzID0gLTE7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsICZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBkZXNpcmVkIGNvbG9yIGZvcm1hdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gLTE7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbHNvIGhhbmRsZSBkZWZhdWx0IGNvbG9yIGZvcm1hdCAoZW5jb2RlcnMgcmVxdWlyZSBjb2xvciBmb3JtYXQsIHNvIHRoaXMgaXMgb25seQorICAgICAgICAgICAgICAgICAqIG5lZWRlZCBmb3IgZGVjb2RlcnMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAoc3VyZmFjZSA9PSBudWxscHRyKSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0ID49IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgICAgICBjb21wLCBtc2csIENvbmZpZzo6SVNfQ09ORklHLCBDMl9ET05UX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb252ZXJ0IGNvbmZpZ3VyYXRpb24gdG8gYzIgcGFyYW1zIik7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfRE9OVF9CTE9DSyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29uZmlndXJlIGMyIHBhcmFtcyIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZSgwdSwgMHUpOworICAgICAgICBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCBtYXhJbnB1dFNpemUoMHUsIDB1KTsKKworICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMgeworICAgICAgICB9OworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgIHsgJnVzYWdlLCAmbWF4SW5wdXRTaXplIH0sCisgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgYzJlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGNvbXBvbmVudCBpbnRlcmZhY2U6ICVkIiwgYzJlcnIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gaW5kaWNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wb25lbnQgcmV0dXJucyB3cm9uZyBudW1iZXIgb2YgcGFyYW1zOiBleHBlY3RlZCAlenUgYWN0dWFsICV6dSIsCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMuc2l6ZSgpLCBwYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICh1c2FnZSAmJiAodXNhZ2UudmFsdWUgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigidXNpbmctc3ctcmVhZC1vZnRlbiIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTk9URTogd2UgZG9uJ3QgYmxpbmRseSB1c2UgY2xpZW50IHNwZWNpZmllZCBpbnB1dCBzaXplIGlmIHNwZWNpZmllZCBhcyBjbGllbnRzCisgICAgICAgIC8vIGF0IHRpbWVzIHNwZWNpZnkgdG9vIHNtYWxsIHNpemUuIEluc3RlYWQsIG1pbWljIHRoZSBiZWhhdmlvciBmcm9tIE9NWCwgd2hlcmUgdGhlCisgICAgICAgIC8vIGNsaWVudCBzcGVjaWZpZWQgc2l6ZSBpcyBvbmx5IHVzZWQgdG8gYXNrIGZvciBiaWdnZXIgYnVmZmVycyB0aGFuIGNvbXBvbmVudCBzdWdnZXN0ZWQKKyAgICAgICAgLy8gc2l6ZS4KKyAgICAgICAgaW50MzJfdCBjbGllbnRJbnB1dFNpemUgPSAwOworICAgICAgICBib29sIGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSA9CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjbGllbnRJbnB1dFNpemUpICYmIGNsaWVudElucHV0U2l6ZSA+IDA7CisgICAgICAgIC8vIFRFTVA6IGVuZm9yY2UgbWluaW11bSBidWZmZXIgc2l6ZSBvZiAxTUIgZm9yIHZpZGVvIGRlY29kZXJzCisgICAgICAgIC8vIGFuZCAxNksgLyA0SyBmb3IgYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMKKyAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGVuY29kZXIgPyAxNjM4NCA6IDQwOTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gMTA0ODU3NnU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCBDU0QgZml0cyBpbnRvIHRoaXMgc2l6ZSAoaWYgZGVmaW5lZCkKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIG1heElucHV0U2l6ZS52YWx1ZSA+IDApIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgbXNnLT5maW5kQnVmZmVyKFN0cmluZ1ByaW50ZigiY3NkLSV6dSIsIGl4KS5jX3N0cigpLCAmY3NkKTsgKytpeCkgeworICAgICAgICAgICAgICAgIGlmIChjc2QgJiYgY3NkLT5zaXplKCkgPiBtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY3NkLT5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZG8gdGhpcyBiYXNlZCBvbiBjb21wb25lbnQgcmVxdWlyaW5nIGxpbmVhciBhbGxvY2F0b3IgZm9yIGlucHV0CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSB8fCAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnRTcGVjaWZpZWRJbnB1dFNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBXYXJuIHRoYXQgd2UncmUgb3ZlcnJpZGluZyBjbGllbnQncyBtYXggaW5wdXQgc2l6ZSBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgaWYgKCh1aW50MzJfdCljbGllbnRJbnB1dFNpemUgPCBtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgbWF4IGlucHV0IHNpemUgJWQsIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IGNvbXBvbmVudCByZWNvbW1lbmRlZCAoJXUpOyBvdmVycmlkaW5nIHdpdGggY29tcG9uZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29tbWVuZGF0aW9uLiIsIGNsaWVudElucHV0U2l6ZSwgbWF4SW5wdXRTaXplLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlRoaXMgYmVoYXZpb3IgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwIGRldmVsb3BlcnMgZG91YmxlIGNoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5wdXQgc2l6ZSBpcyBpbiByZWFzb25hYmxlIHJhbmdlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGNsaWVudElucHV0U2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBQYXNzIG1heCBpbnB1dCBzaXplIG9uIGlucHV0IGZvcm1hdCB0byB0aGUgYnVmZmVyIGNoYW5uZWwgKGlmIHN1cHBsaWVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gY29tcG9uZW50IG9yIGJ5IGEgZGVmYXVsdCkKKyAgICAgICAgICAgIGlmIChtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfTUFYX0lOUFVUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoYzJfbWluKG1heElucHV0U2l6ZS52YWx1ZSwgdWludDMyX3QoSU5UMzJfTUFYKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKKyAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSBIRFIgc3RhdGljIGluZm8gdG8gb3V0cHV0IGZvcm1hdCBmb3IgYm90aCBlbmNvZGVycyBhbmQgZGVjb2RlcnMKKyAgICAgICAgICAgIC8vIGlmIGNvbXBvbmVudCBzdXBwb3J0cyB0aGlzIGluZm8sIHdlIHdpbGwgdXBkYXRlIGZyb20gY29tcG9uZW50LCBidXQgb25seSB0aGUgcmF3IHBvcnQsCisgICAgICAgICAgICAvLyBzbyBkb24ndCBwcm9wYWdhdGUgaWYgY29tcG9uZW50IGFscmVhZHkgZmlsbGVkIGl0IGluLgorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRySW5mbzsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkckluZm8pCisgICAgICAgICAgICAgICAgICAgICYmICFjb25maWctPm1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkckluZm8pKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaGRySW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCBkZXNpcmVkIGNvbG9yIGZvcm1hdCBmcm9tIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9wYWdhdGUgZW5jb2RlciBkZWxheSBhbmQgcGFkZGluZyB0byBvdXRwdXQgZm9ybWF0CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykpIHsKKyAgICAgICAgICAgIGludCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVuY29kZXItZGVsYXkiLCAmZGVsYXkpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZW5jb2Rlci1kZWxheSIsIGRlbGF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgcGFkZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICBpbnQzMl90IG1hc2s7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfTUFTSywgJm1hc2spKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HRCgic2V0dXAgZm9ybWF0cyBpbnB1dDogJXMgYW5kIG91dHB1dDogJXMiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihkb0NvbmZpZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKworICAgIG1DYWxsYmFjay0+b25Db21wb25lbnRDb25maWd1cmVkKGNvbmZpZy0+bUlucHV0Rm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogcmVhZCBpdCBmcm9tIGludGYoKSBwcm9wZXJseS4KKyAgICAgICAgaWYgKHN0YXRlLT5jb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0oKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpjcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOworCisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGVyc2lzdGVudFN1cmZhY2U+IHBlcnNpc3RlbnRTdXJmYWNlKENyZWF0ZUlucHV0U3VyZmFjZSgpKTsKKworICAgIGlmIChwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpKSB7CisgICAgICAgIHNwPElJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9IElJbnB1dFN1cmZhY2U6OmNhc3RGcm9tKAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpOworICAgICAgICBpZiAoIWlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgQUxPR0UoIkNvcnJ1cHRlZCBpbnB1dCBzdXJmYWNlIik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxDMklucHV0U3VyZmFjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+KGlucHV0U3VyZmFjZSkpKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGlucHV0U3VyZmFjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRlZCgKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcihidWZmZXJQcm9kdWNlcikpOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSkgeworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSB0cnVlOworCisgICAgLy8gd2UgYXJlIG5vdyB1c2luZyBzdXJmYWNlIC0gYXBwbHkgZGVmYXVsdCBjb2xvciBhc3BlY3RzIHRvIGlucHV0IGZvcm1hdCAtIGFzIHdlbGwgYXMKKyAgICAvLyBnZXQgZGF0YXNwYWNlCisgICAgYm9vbCBpbnB1dEZvcm1hdENoYW5nZWQgPSBjb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgQUxPR0QoImlucHV0IGZvcm1hdCAlcyB0byAlcyIsCisgICAgICAgICAgICBpbnB1dEZvcm1hdENoYW5nZWQgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIiwKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgLy8gY29uZmlndXJlIGRhdGFzcGFjZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludDMyX3QpID09IHNpemVvZihhbmRyb2lkX2RhdGFzcGFjZSksICJkYXRhc3BhY2Ugc2l6ZSBtaXNtYXRjaCIpOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAodm9pZCljb25maWctPm1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFTcGFjZSk7CisgICAgc3VyZmFjZS0+c2V0RGF0YVNwYWNlKGRhdGFTcGFjZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2hhbm5lbC0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgLy8gdW5kbyBpbnB1dCBmb3JtYXQgdXBkYXRlCisgICAgICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IGZhbHNlOworICAgICAgICAodm9pZCljb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisKKyAgICBpZiAoY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgc3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnOiBubyBjb25maWd1cmF0aW9uIik7CisgICAgfQorCisgICAgcmV0dXJuIHN1cmZhY2UtPnN0YXJ0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0SW5wdXRTdXJmYWNlLCB0aGlzKTsKKyAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIHN1cmZhY2UpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgfQorICAgIGF1dG8gaGlkbFRhcmdldCA9IHN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKTsKKyAgICBpZiAoaGlkbFRhcmdldCkgeworICAgICAgICBzcDxJSW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgICAgIElJbnB1dFN1cmZhY2U6OmNhc3RGcm9tKGhpZGxUYXJnZXQpOworICAgICAgICBpZiAoIWlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW5wdXQgc3VyZmFjZTogQ29ycnVwdGVkIHN1cmZhY2UuIik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxDMklucHV0U3VyZmFjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+KGlucHV0U3VyZmFjZSkpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHN1cmZhY2UtPmdldEJ1ZmZlclNvdXJjZSgpLCB3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VBY2NlcHRlZChpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU3RhcnQoKSB7CisgICAgYXV0byBzZXRTdGFydGluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoU1RBUlRJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRTdGFydGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdGFydCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja1N0YXJ0aW5nID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcih0b1N0YXR1c1QoZXJyLCBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIyID0gbUNoYW5uZWwtPnN0YXJ0KGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIHNldFJ1bm5pbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RBUlRJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFJ1bm5pbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNhbGxiYWNrLT5vblN0YXJ0Q29tcGxldGVkKCk7CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgaWYgKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICAgICAgaW5pdGlhdGVTdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdGlhdGVSZWxlYXNlKCk7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdG9wKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEFMTE9DQVRFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSAgPT0gUkVMRUFTRUQKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQsIHJlbGVhc2VkLCBvciBkb2luZyBpdCByaWdodCBub3cuCisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVE9QUElORyk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdG9wKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBzdG9wcGVkIG9yIHJlbGVhc2UgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVE9QUElORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gY29tcC0+c3RvcCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogY29udmVydCBlcnIgaW50byBzdGF0dXNfdAorICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRFRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZShib29sIHNlbmRDYWxsYmFjayAvKiA9IHRydWUgKi8pIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCB8fCBzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHJlbGVhc2VkIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIC8vIFdpdGggdGhlIGFsdGVyZWQgc3RhdGUgYWxsb2NhdGUoKSB3b3VsZCBmYWlsIGFuZCBjbGVhbiB1cC4KKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0lORyk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAvLyB0aGl6IGhvbGRzIHN0cm9uZyByZWYgdG8gdGhpcyB3aGlsZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCisgICAgc3A8Q0NvZGVjPiB0aGl6KHRoaXMpOworICAgIHN0ZDo6dGhyZWFkKFt0aGl6LCBzZW5kQ2FsbGJhY2tdIHsgdGhpei0+cmVsZWFzZShzZW5kQ2FsbGJhY2spOyB9KS5kZXRhY2goKTsKK30KKwordm9pZCBDQ29kZWM6OnJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIGNvbXAtPnJlbGVhc2UoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUtPmNvbXAucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgcmV0dXJuIG1DaGFubmVsLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsRmx1c2goKSB7CisgICAgc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoRkxVU0hJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgQUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVyciwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmZsdXNoKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrRmx1c2hpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNISU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrRmx1c2hpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICBmbHVzaGVkV29yay5zcGxpY2UoZmx1c2hlZFdvcmsuZW5kKCksICpxdWV1ZSk7CisgICAgfQorICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogY29udmVydCBlcnIgaW50byBzdGF0dXNfdAorICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIG1DaGFubmVsLT5mbHVzaChmbHVzaGVkV29yayk7CisgICAgc3ViUXVldWVkV29ya0NvdW50KGZsdXNoZWRXb3JrLnNpemUoKSk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgc3RhdGUtPnNldChGTFVTSEVEKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbkZsdXNoQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxSZXN1bWUoKSB7CisgICAgYXV0byBzZXRSZXN1bWluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBGTFVTSEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJFU1VNSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UmVzdW1pbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+c3RhcnQobnVsbHB0ciwgbnVsbHB0cik7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSRVNVTUlORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CisgICAgfQorCisgICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgc2V0UGFyYW1ldGVycyhwYXJhbXMpOworfQorCit2b2lkIENDb2RlYzo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhdGUgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXRlKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgLyoqCisgICAgICogSGFuZGxlIGlucHV0IHN1cmZhY2UgcGFyYW1ldGVycworICAgICAqLworICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpICYmIGNvbmZpZy0+bUlucHV0U3VyZmFjZSAmJiBjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICAodm9pZClwYXJhbXMtPmZpbmRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCAmY29uZmlnLT5tSVNDb25maWctPm1UaW1lT2Zmc2V0VXMpOworCisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RhcnRBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zLT5maW5kSW50NjQoInN0b3AtdGltZS11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVN0b3BBdFVzKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHZhbHVlOworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyA9IC0xOworICAgICAgICAgICAgKHZvaWQpcGFyYW1zLT5maW5kSW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsICZjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzKTsKKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKWNvbmZpZy0+bUlucHV0U3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuX3N0b3AtdGltZS1vZmZzZXQtdXMiLCBjb25maWctPm1JU0NvbmZpZy0+bUlucHV0RGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAodm9pZCljb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICBjb21wLCBwYXJhbXMsIENvbmZpZzo6SVNfUEFSQU0sIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgLy8gUHJlZmVyIHRvIHBhc3MgcGFyYW1ldGVycyB0byB0aGUgYnVmZmVyIGNoYW5uZWwsIHNvIHRoZXkgY2FuIGJlIHN5bmNocm9uaXplZCB3aXRoIHRoZSBmcmFtZXMuCisgICAgLy8gUGFyYW1ldGVyIHN5bmNocm9uaXphdGlvbiBpcyBub3QgZGVmaW5lZCB3aGVuIHVzaW5nIGlucHV0IHN1cmZhY2UuIEZvciBub3csIHJvdXRlCisgICAgLy8gdGhlc2UgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlID09IG51bGxwdHIKKyAgICAgICAgICAgICYmIChwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX2RlbGF5ZWRfcGFyYW1zIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHx8IGNvbXAtPmdldE5hbWUoKS5maW5kKCJjMi5hbmRyb2lkLiIpID09IDApKSB7CisgICAgICAgIG1DaGFubmVsLT5zZXRQYXJhbWV0ZXJzKGNvbmZpZ1VwZGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKHZvaWQpY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfTUFZX0JMT0NLKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIG1DYWxsYmFjay0+b25TaWduYWxlZElucHV0RU9TKG1DaGFubmVsLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgQUxPR0QoIm5vIElEUiByZXF1ZXN0IHNlbnQgc2luY2UgY29tcG9uZW50IGlzIHJlbGVhc2VkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBBTE9HVigicmVxdWVzdCBJRFIiKTsKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+KDB1LCB0cnVlKSk7CisgICAgY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIHBhcmFtcywgQzJfTUFZX0JMT0NLKTsKK30KKwordm9pZCBDQ29kZWM6Om9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycykgeworICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c2l6ZV90Pj46OkxvY2tlZCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgbU51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlKTsKKyAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgd29ya0l0ZW1zLnNpemUoKSAtIDEsIDApOworICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUtPmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICAgICAgcXVldWUtPnNwbGljZShxdWV1ZS0+ZW5kKCksIHdvcmtJdGVtcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6Om9uSW5wdXRCdWZmZXJEb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIG1DaGFubmVsLT5vbklucHV0QnVmZmVyRG9uZShidWZmZXIpOworfQorCit2b2lkIENDb2RlYzo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBUaW1lUG9pbnQgbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgQ0NvZGVjV2F0Y2hkb2c6OmdldEluc3RhbmNlKCktPndhdGNoKHRoaXMpOworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEFsbG9jYXRlOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudFN0b3JlOjpjcmVhdGVDb21wb25lbnQoKSBzaG91bGQgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTUwbXMsICJhbGxvY2F0ZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmb2JqKSk7CisgICAgICAgICAgICBhbGxvY2F0ZSgoTWVkaWFDb2RlY0luZm8gKilvYmouZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmNvbW1pdF9zbSgpIHNob3VsZCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMjUwbXMsICJjb25maWd1cmUiKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBjb25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OnN0YXJ0KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDU1MG1zLCAic3RhcnQiKTsKKyAgICAgICAgICAgIG1RdWV1ZWRXb3JrQ291bnQgPSAwOworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RvcCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0b3AiKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKworICAgICAgICAgICAgbVF1ZXVlZFdvcmtDb3VudCA9IDA7CisgICAgICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1RdWV1ZURlYWRsaW5lKTsKKyAgICAgICAgICAgIGRlYWRsaW5lLT5zZXQoVGltZVBvaW50OjptYXgoKSwgIm5vbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRGbHVzaDogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmZsdXNoX3NtKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1MG1zLCAiZmx1c2giKTsKKyAgICAgICAgICAgIGZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOiB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG9wZXJhdGlvbnMgbWF5IGJlIGJyaWVmbHkgYmxvY2tpbmcuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDEwMG1zLCAiY3JlYXRlSW5wdXRTdXJmYWNlIik7CisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJzZXRJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKHN0YXRpY19jYXN0PFBlcnNpc3RlbnRTdXJmYWNlICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgc2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFdvcmtEb25lOiB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVyczsKKyAgICAgICAgICAgIGJvb2wgc2hvdWxkUG9zdCA9IGZhbHNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAocXVldWUtPmZyb250KCkpOworICAgICAgICAgICAgICAgIHF1ZXVlLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBzaG91bGRQb3N0ID0gIXF1ZXVlLT5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNpemVfdD4+OjpMb2NrZWQgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUoCisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzUXVldWUpOworICAgICAgICAgICAgICAgIGlmIChudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG51bURpc2NhcmRlZElucHV0QnVmZmVycyA9IG51bURpc2NhcmRlZElucHV0QnVmZmVyc1F1ZXVlLT5mcm9udCgpOworICAgICAgICAgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZFBvc3QpIHsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V29ya0RvbmUsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSB7CisgICAgICAgICAgICAgICAgc3ViUXVldWVkV29ya0NvdW50KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQ29uZmlnOjpXYXRjaGVyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGluaXREYXRhID0KKyAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQzJGcmFtZURhdGE6OkZMQUdfRElTQ0FSRF9GUkFNRSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrIDogYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLmxlZnQsIGJsb2NrLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQoc3RyZWFtLCBibG9jay5jcm9wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjb25maWctPnVwZGF0ZUNvbmZpZ3VyYXRpb24odXBkYXRlcywgY29uZmlnLT5tT3V0cHV0RG9tYWluKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgc3RhbmRhcmQgaW5mb3MgdG8gZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKG90aGVyd2lzZSwgd2UKKyAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3RkR2Z4SW5mb3MgPSB7CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBzdGRHZnhJbmZvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnVmLT5oYXNJbmZvKGl4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKGl4LndpdGhTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGluZm8oQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihpbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPm9uV29ya0RvbmUoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrKSwgY2hhbmdlZCA/IGNvbmZpZy0+bU91dHB1dEZvcm1hdCA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIGluaXREYXRhLmhhc0NoYW5nZWQoKSA/IGluaXREYXRhLnVwZGF0ZSgpLmdldCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgLy8gd2F0Y2ggbWVzc2FnZSBhbHJlYWR5IHBvc3RlZDsgbm8tb3AuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBBTE9HRSgidW5yZWNvZ25pemVkIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNldERlYWRsaW5lKFRpbWVQb2ludDo6bWF4KCksIDBtcywgIm5vbmUiKTsKK30KKwordm9pZCBDQ29kZWM6OnNldERlYWRsaW5lKAorICAgICAgICBjb25zdCBUaW1lUG9pbnQgJm5vdywKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICAgIGludDMyX3QgbXVsdCA9IHN0ZDo6bWF4KDEsIHByb3BlcnR5X2dldF9pbnQzMigiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX3RpbWVvdXRfbXVsdCIsIDEpKTsKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1EZWFkbGluZSk7CisgICAgZGVhZGxpbmUtPnNldChub3cgKyAodGltZW91dCAqIG11bHQpLCBuYW1lKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBib29sIHBlbmRpbmdEZWFkbGluZSA9IGZhbHNlOworICAgIGZvciAoTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gKmRlYWRsaW5lUHRyIDogeyAmbURlYWRsaW5lLCAmbVF1ZXVlRGVhZGxpbmUsICZtRW9zRGVhZGxpbmUgfSkgeworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKCpkZWFkbGluZVB0cik7CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgPCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSkgeworICAgICAgICAgICAgbmFtZSA9IGRlYWRsaW5lLT5nZXROYW1lKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVhZGxpbmUtPmdldCgpICE9IFRpbWVQb2ludDo6bWF4KCkpIHsKKyAgICAgICAgICAgIHBlbmRpbmdEZWFkbGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICAvLyBXZSdyZSBub3Qgc3R1Y2suCisgICAgICAgIGlmIChwZW5kaW5nRGVhZGxpbmUpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBub3Qgc3R1Y2sgeWV0IGJ1dCBzdGlsbCBoYXMgZGVhZGxpbmUgY29taW5nIHVwLAorICAgICAgICAgICAgLy8gcG9zdCB3YXRjaCBtZXNzYWdlIHRvIGNoZWNrIGJhY2sgbGF0ZXIuCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygicHJldmlvdXMgY2FsbCB0byAlcyBleGNlZWRlZCB0aW1lb3V0IiwgbmFtZS5jX3N0cigpKTsKKyAgICBpbml0aWF0ZVJlbGVhc2UoZmFsc2UpOworICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbldvcmtRdWV1ZWQoYm9vbCBlb3MpIHsKKyAgICBBTE9HVigicXVldWVkIHdvcmsgY291bnQgKzEgZnJvbSAlZCIsIG1RdWV1ZWRXb3JrQ291bnQubG9hZCgpKTsKKyAgICBpbnQzMl90IGNvdW50ID0gKyttUXVldWVkV29ya0NvdW50OworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQ0NvZGVjV2F0Y2hkb2c6OmdldEluc3RhbmNlKCktPndhdGNoKHRoaXMpOworICAgICAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1Fb3NEZWFkbGluZSk7CisgICAgICAgIGRlYWRsaW5lLT5zZXQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyAzcywgImVvcyIpOworICAgIH0KKyAgICAvLyBUT0RPOiBxdWVyeSBhbmQgdXNlIGlucHV0L3BpcGVsaW5lL291dHB1dCBkZWxheSBjb21iaW5lZAorICAgIGlmIChjb3VudCA+PSA0KSB7CisgICAgICAgIENDb2RlY1dhdGNoZG9nOjpnZXRJbnN0YW5jZSgpLT53YXRjaCh0aGlzKTsKKyAgICAgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtUXVldWVEZWFkbGluZSk7CisgICAgICAgIGRlYWRsaW5lLT5zZXQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyAzcywgInF1ZXVlIik7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6c3ViUXVldWVkV29ya0NvdW50KHVpbnQzMl90IGNvdW50KSB7CisgICAgQUxPR1YoInF1ZXVlZCB3b3JrIGNvdW50IC0ldSBmcm9tICVkIiwgY291bnQsIG1RdWV1ZWRXb3JrQ291bnQubG9hZCgpKTsKKyAgICBpbnQzMl90IGN1cnJlbnRDb3VudCA9IChtUXVldWVkV29ya0NvdW50IC09IGNvdW50KTsKKyAgICBpZiAoY3VycmVudENvdW50ID09IDApIHsKKyAgICAgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRW9zRGVhZGxpbmUpOworICAgICAgICBkZWFkbGluZS0+c2V0KFRpbWVQb2ludDo6bWF4KCksICJub25lIik7CisgICAgfQorICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobVF1ZXVlRGVhZGxpbmUpOworICAgIGRlYWRsaW5lLT5zZXQoVGltZVBvaW50OjptYXgoKSwgIm5vbmUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpDb2RlY0Jhc2UgKkNyZWF0ZUNvZGVjKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6Q0NvZGVjOworfQorCitleHRlcm4gIkMiIGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlICpDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgLy8gQXR0ZW1wdCB0byBjcmVhdGUgYSBDb2RlYzIncyBpbnB1dCBzdXJmYWNlLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKGlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZDo6c3A8YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+PigKKyAgICAgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPmdldEhhbEludGVyZmFjZSgpKSk7CisgICAgfQorCisgICAgLy8gRmFsbCBiYWNrIHRvIE9NWC4KKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjp1dGlsczsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6U3RhdHVzIE9teFN0YXR1czsKKyAgICBhbmRyb2lkOjpzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworICAgIE9teFN0YXR1cyBzOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicDsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2JzOworICAgIGFuZHJvaWQ6OlJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG9teC0+Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgWyZzLCAmZ2JwLCAmZ2JzXSgKKyAgICAgICAgICAgICAgICAgICAgT214U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgZ2JwID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgZ2JzID0gc291cmNlOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSAmJiBzID09IE9teFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGdicCksCisgICAgICAgICAgICAgICAgc3A8OjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclNvdXJjZT4oCisgICAgICAgICAgICAgICAgICAgIG5ldyBMV0dyYXBoaWNCdWZmZXJTb3VyY2UoZ2JzKSkpOworICAgIH0KKworICAgIHJldHVybiBudWxscHRyOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiMDA5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19IXworI2RlZmluZSBDX0NPREVDX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisKKyNpbmNsdWRlICJDQ29kZWNDb25maWcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOworY2xhc3MgSW5wdXRTdXJmYWNlV3JhcHBlcjsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKKworY2xhc3MgQ0NvZGVjIDogcHVibGljIENvZGVjQmFzZSB7CitwdWJsaWM6CisgICAgQ0NvZGVjKCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gZ2V0QnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSBvdmVycmlkZTsKKworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOworICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMpOworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNDb2RlYygpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjp0aW1lX3BvaW50PHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s+IFRpbWVQb2ludDsKKworICAgIHN0YXR1c190IHRyeUFuZFJlcG9ydE9uRXJyb3Ioc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBqb2IpOworCisgICAgdm9pZCBpbml0aWF0ZVN0b3AoKTsKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZShib29sIHNlbmRDYWxsYmFjayA9IHRydWUpOworCisgICAgdm9pZCBhbGxvY2F0ZShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmNvZGVjSW5mbyk7CisgICAgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgc3RhcnQoKTsKKyAgICB2b2lkIHN0b3AoKTsKKyAgICB2b2lkIGZsdXNoKCk7CisgICAgdm9pZCByZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrKTsKKworICAgIHZvaWQgY3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgdm9pZCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworICAgIHZvaWQgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CisKKyAgICB2b2lkIHNldERlYWRsaW5lKAorICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICB2b2lkIG9uV29ya1F1ZXVlZChib29sIGVvcyk7CisgICAgdm9pZCBzdWJRdWV1ZWRXb3JrQ291bnQodWludDMyX3QgY291bnQpOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QWxsb2NhdGUsCisgICAgICAgIGtXaGF0Q29uZmlndXJlLAorICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICBrV2hhdEZsdXNoLAorICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAga1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0SW5wdXRTdXJmYWNlLAorICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMsCisKKyAgICAgICAga1doYXRXb3JrRG9uZSwKKyAgICAgICAga1doYXRXYXRjaCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFJFTEVBU0VELAorICAgICAgICBBTExPQ0FURUQsCisgICAgICAgIEZMVVNIRUQsCisgICAgICAgIFJVTk5JTkcsCisKKyAgICAgICAgQUxMT0NBVElORywgIC8vIFJFTEVBU0VEIC0+IEFMTE9DQVRFRAorICAgICAgICBTVEFSVElORywgICAgLy8gQUxMT0NBVEVEIC0+IFJVTk5JTkcKKyAgICAgICAgU1RPUFBJTkcsICAgIC8vIFJVTk5JTkcgLT4gQUxMT0NBVEVECisgICAgICAgIEZMVVNISU5HLCAgICAvLyBSVU5OSU5HIC0+IEZMVVNIRUQKKyAgICAgICAgUkVTVU1JTkcsICAgIC8vIEZMVVNIRUQgLT4gUlVOTklORworICAgICAgICBSRUxFQVNJTkcsICAgLy8ge0FOWSBFWENFUFQgUkVMRUFTRUR9IC0+IFJFTEVBU0VECisgICAgfTsKKworICAgIHN0cnVjdCBTdGF0ZSB7CisgICAgICAgIGlubGluZSBTdGF0ZSgpIDogbVN0YXRlKFJFTEVBU0VEKSB7fQorICAgICAgICBpbmxpbmUgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1TdGF0ZTsgfQorICAgICAgICBpbmxpbmUgdm9pZCBzZXQoaW50IG5ld1N0YXRlKSB7IG1TdGF0ZSA9IG5ld1N0YXRlOyB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHByaXZhdGU6CisgICAgICAgIGludCBtU3RhdGU7CisgICAgfTsKKworICAgIHN0cnVjdCBOYW1lZFRpbWVQb2ludCB7CisgICAgICAgIE5hbWVkVGltZVBvaW50KCkgOiBtVGltZVBvaW50KFRpbWVQb2ludDo6bWF4KCkpLCBtTmFtZSgiIikge30KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXQoCisgICAgICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZ0aW1lUG9pbnQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICAgICAgbVRpbWVQb2ludCA9IHRpbWVQb2ludDsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBUaW1lUG9pbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVRpbWVQb2ludDsgfQorICAgICAgICBpbmxpbmUgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgVGltZVBvaW50IG1UaW1lUG9pbnQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOworICAgIH07CisKKyAgICBNdXRleGVkPFN0YXRlPiBtU3RhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw+IG1DaGFubmVsOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUNsaWVudExpc3RlbmVyOworICAgIHN0cnVjdCBDbGllbnRMaXN0ZW5lcjsKKworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+IG1EZWFkbGluZTsKKyAgICBzdGQ6OmF0b21pY19pbnQzMl90IG1RdWV1ZWRXb3JrQ291bnQ7CisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gbVF1ZXVlRGVhZGxpbmU7CisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gbUVvc0RlYWRsaW5lOworICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnIENvbmZpZzsKKyAgICBNdXRleGVkPENvbmZpZz4gbUNvbmZpZzsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+IG1Xb3JrRG9uZVF1ZXVlOworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNpemVfdD4+IG1OdW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnNRdWV1ZTsKKworICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ29kZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhOTdkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMCwwICsxLDI4MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQnVmZmVyQ2hhbm5lbCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworI2luY2x1ZGUgIkNDb2RlY0J1ZmZlckNoYW5uZWwuaCIKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXIuaCIKKyNpbmNsdWRlICJTa2lwQ3V0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOworCit1c2luZyBDYXNTdGF0dXMgPSBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpTdGF0dXM7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgcmVwcmVzZW50YXRpb24gb2YgYnVmZmVycyBhdCBvbmUgcG9ydC4KKyAqLworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVycyB7CitwdWJsaWM6CisgICAgQnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIkJ1ZmZlcnMiKQorICAgICAgICA6IG1Db21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpLAorICAgICAgICAgIG1DaGFubmVsTmFtZShzdGQ6OnN0cmluZyhjb21wb25lbnROYW1lKSArICI6IiArIG5hbWUpLAorICAgICAgICAgIG1OYW1lKG1DaGFubmVsTmFtZS5jX3N0cigpKSB7CisgICAgfQorICAgIHZpcnR1YWwgfkJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZm9ybWF0IGZvciBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgICAqLworICAgIHZvaWQgc2V0Rm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgICAgIENIRUNLKGZvcm1hdCAhPSBudWxscHRyKTsKKyAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIGN1cnJlbnQgZm9ybWF0LgorICAgICAqLworICAgIHNwPEFNZXNzYWdlPiBkdXBGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBtRm9ybWF0ICE9IG51bGxwdHIgPyBtRm9ybWF0LT5kdXAoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXJzIGFyZSBvcGVyYXRpbmcgdW5kZXIgYXJyYXkgbW9kZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLyoqCisgICAgICogRmlsbHMgdGhlIHZlY3RvciB3aXRoIE1lZGlhQ29kZWNCdWZmZXIncyBpZiBpbiBhcnJheSBtb2RlOyBvdGhlcndpc2UsCisgICAgICogbm8tb3AuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKikgY29uc3Qge30KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IG5hbWUgb2YgY29tcG9uZW50IGZvciBkZWJ1Z2dpbmcKKyAgICBzdGQ6OnN0cmluZyBtQ2hhbm5lbE5hbWU7IC8vLzwgbmFtZSBvZiBjaGFubmVsIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNoYW5uZWwgbmFtZQorICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJ1ZmZlcnMpOworfTsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W10iKQorICAgICAgICA6IEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+SW5wdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGEgYmxvY2sgcG9vbCB0byBvYnRhaW4gaW5wdXQgbWVtb3J5IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeyBtUG9vbCA9IHBvb2w7IH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBNZWRpYUNvZGVjQnVmZmVyIGZvciBpbnB1dCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgaW5kZXguCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBubyBuZXcgYnVmZmVyIGNhbiBiZSBvYnRhaW5lZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgdGhhdCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGUgY29kZWMgcHJvY2Vzcy4gUmV0dXJuCisgICAgICogdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBpbnRlcm5hbCBzdGF0ZS4gQWZ0ZXIgdGhpcyBjYWxsLCBubyBpbmRleCBvciBidWZmZXIgcHJldmlvdXNseQorICAgICAqIHJldHVybmVkIGZyb20gcmVxdWVzdE5ld0J1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhcnJheS1iYWNrZWQgdmVyc2lvbiBvZiBpbnB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVxdWVzdE5ld0J1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpID0gMDsKKworcHJvdGVjdGVkOgorICAgIC8vIFBvb2wgdG8gb2J0YWluIGJsb2NrcyBmb3IgaW5wdXQgYnVmZmVycy4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1Qb29sOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElucHV0QnVmZmVycyk7Cit9OworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXQiKQorICAgICAgICA6IEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+T3V0cHV0QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIG91dHB1dCBDMkJ1ZmZlciBmcm9tIHRoZSBjb21wb25lbnQgYW5kIG9idGFpbiBjb3JyZXNwb25kaW5nCisgICAgICogaW5kZXggYW5kIE1lZGlhQ29kZWNCdWZmZXIgb2JqZWN0LiBSZXR1cm5zIGZhbHNlIGlmIHJlZ2lzdHJhdGlvbgorICAgICAqIGZhaWxzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgY29kZWMgc3BlY2lmaWMgZGF0YSBhcyBhIGJ1ZmZlciB0byBiZSBjb25zaXN0ZW50IHdpdGgKKyAgICAgKiBNZWRpYUNvZGVjIGJlaGF2aW9yLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUNzZEluZm86Om91dHB1dCAqIC8qIGNzZCAqLywKKyAgICAgICAgICAgIHNpemVfdCAqIC8qIGluZGV4ICovLAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKiAvKiBjbGllbnRCdWZmZXIgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgYW5kIGdldCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEMyQnVmZmVyIG9iamVjdCBiYWNrLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZQorICAgICAqIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgaXMgdmFsaWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2Ygb3V0cHV0IGJ1ZmZlcnMuIFRoZSByZXR1cm5lZCBvYmplY3QKKyAgICAgKiBzaGFsbCByZXRhaW4gdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBob25vciBpbmRleCBhbmQKKyAgICAgKiBidWZmZXIgZnJvbSBwcmV2aW91cyBjYWxscyBvZiByZWdpc3RlckJ1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIFNraXBDdXRCdWZmZXIgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgaW5pdFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBpbnQzMl90IHBhZGRpbmcsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgQ0hFQ0sobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cik7CisgICAgICAgIG1EZWxheSA9IGRlbGF5OworICAgICAgICBtUGFkZGluZyA9IHBhZGRpbmc7CisgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIFNraXBDdXRCdWZmZXIgb2JqZWN0LiBOby1vcCBpZiBpdCdzIG5ldmVyIGluaXRpYWxpemVkLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlU2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBkZWxheSA9IG1EZWxheTsKKyAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gbVBhZGRpbmc7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBkZWxheSA9ICgoaW50NjRfdClkZWxheSAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBwYWRkaW5nID0gKChpbnQ2NF90KXBhZGRpbmcgKiBzYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlOworICAgICAgICB9CisgICAgICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VibWl0IGJ1ZmZlciB0byBTa2lwQ3V0QnVmZmVyIG9iamVjdCwgaWYgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPnN1Ym1pdChidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgU2tpcEN1dEJ1ZmZlciBvYmplY3QgdG8gdGhlIG90aGVyIEJ1ZmZlcnMgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgdHJhbnNmZXJTa2lwQ3V0QnVmZmVyKGNvbnN0IHNwPFNraXBDdXRCdWZmZXI+ICZzY2IpIHsKKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBzY2I7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3A8U2tpcEN1dEJ1ZmZlcj4gbVNraXBDdXRCdWZmZXI7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBtRGVsYXk7CisgICAgaW50MzJfdCBtUGFkZGluZzsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworCisgICAgdm9pZCBzZXRTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2tpcCwgaW50MzJfdCBjdXQsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplX3QgcHJldlNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHByZXZTaXplICE9IDB1KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlenUgYnl0ZXMiLCBtTmFtZSwgcHJldlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE91dHB1dEJ1ZmZlcnMpOworfTsKKworbmFtZXNwYWNlIHsKKworLy8gVE9ETzogZ2V0IHRoaXMgaW5mbyBmcm9tIGNvbXBvbmVudAorY29uc3Qgc3RhdGljIHNpemVfdCBrTWluSW5wdXRCdWZmZXJBcnJheVNpemUgPSA0OworY29uc3Qgc3RhdGljIHNpemVfdCBrTWF4UGlwZWxpbmVDYXBhY2l0eSA9IDE4OworY29uc3Qgc3RhdGljIHNpemVfdCBrQ2hhbm5lbE91dHB1dERlbGF5ID0gMDsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga01pbk91dHB1dEJ1ZmZlckFycmF5U2l6ZSA9IGtNYXhQaXBlbGluZUNhcGFjaXR5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDaGFubmVsT3V0cHV0RGVsYXk7Citjb25zdCBzdGF0aWMgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKy8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCitjb25zdCBzdGF0aWMgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gMzg0MCAqIDIxNjAgKiA0OworCisvKioKKyAqIFNpbXBsZSBsb2NhbCBidWZmZXIgcG9vbCBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgKi8KK2NsYXNzIExvY2FsQnVmZmVyUG9vbCA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPExvY2FsQnVmZmVyUG9vbD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xDYXBhY2l0eSAgbWF4IHRvdGFsIHNpemUgb2YgYnVmZmVycyBtYW5hZ2VkIGJ5IHRoaXMgcG9vbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGEgbmV3bHkgY3JlYXRlZCBwb29sIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gQ3JlYXRlKHNpemVfdCBwb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+KG5ldyBMb2NhbEJ1ZmZlclBvb2wocG9vbENhcGFjaXR5KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEFCdWZmZXIgb2JqZWN0IHdob3NlIHNpemUgaXMgYXQgbGVhc3QgfGNhcGFjaXR5fC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGNhcGFjaXR5ICByZXF1ZXN0ZWQgY2FwYWNpdHkKKyAgICAgKiBccmV0dXJuICBudWxscHRyIGlmIHRoZSBwb29sIGNhcGFjaXR5IGlzIHJlYWNoZWQKKyAgICAgKiAgICAgICAgICBhbiBBQnVmZmVyIG9iamVjdCBvdGhlcndpc2UuCisgICAgICovCisgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Qb29sLmJlZ2luKCksIG1Qb29sLmVuZCgpLAorICAgICAgICAgICAgICAgIFtjYXBhY2l0eV0oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjLmNhcGFjaXR5KCkgPj0gY2FwYWNpdHk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCAhPSBtUG9vbC5lbmQoKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUoKml0KSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgIG1Qb29sLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Vc2VkU2l6ZSArIGNhcGFjaXR5ID4gbVBvb2xDYXBhY2l0eSkgeworICAgICAgICAgICAgd2hpbGUgKCFtUG9vbC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVVzZWRTaXplIC09IG1Qb29sLmJhY2soKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgIG1Qb29sLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm1Vc2VkU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUsIG1Qb29sQ2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVVzZWRTaXplLCBjYXBhY2l0eSwgbVBvb2xDYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjKGNhcGFjaXR5KTsKKyAgICAgICAgbVVzZWRTaXplICs9IHZlYy5jYXBhY2l0eSgpOworICAgICAgICByZXR1cm4gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUodmVjKSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQUJ1ZmZlciBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgICAgICovCisgICAgY2xhc3MgVmVjdG9yQnVmZmVyIDogcHVibGljIDo6YW5kcm9pZDo6QUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgVmVjdG9yQnVmZmVyIGJ5IHRha2luZyB0aGUgb3duZXJzaGlwIG9mIHN1cHBsaWVkIHZlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZlYyAgIGJhY2tpbmcgdmVjdG9yIG9mIHRoZSBidWZmZXIuIHRoaXMgb2JqZWN0IHRha2VzCisgICAgICAgICAqICAgICAgICAgICAgICBvd25lcnNoaXAgYXQgY29uc3RydWN0aW9uLgorICAgICAgICAgKiBccGFyYW0gcG9vbCAgYSBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0IHRvIHJldHVybiB0aGUgdmVjdG9yIGF0CisgICAgICAgICAqICAgICAgICAgICAgICBkZXN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIFZlY3RvckJ1ZmZlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJnBvb2wpCisgICAgICAgICAgICA6IEFCdWZmZXIodmVjLmRhdGEoKSwgdmVjLmNhcGFjaXR5KCkpLAorICAgICAgICAgICAgICBtVmVjKHN0ZDo6bW92ZSh2ZWMpKSwKKyAgICAgICAgICAgICAgbVBvb2wocG9vbCkgeworICAgICAgICB9CisKKyAgICAgICAgflZlY3RvckJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IHBvb2wgPSBtUG9vbC5sb2NrKCk7CisgICAgICAgICAgICBpZiAocG9vbCkgeworICAgICAgICAgICAgICAgIC8vIElmIHBvb2wgaXMgYWxpdmUsIHJldHVybiB0aGUgdmVjdG9yIGJhY2sgdG8gdGhlIHBvb2wgc28gdGhhdAorICAgICAgICAgICAgICAgIC8vIGl0IGNhbiBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgICAgICBwb29sLT5yZXR1cm5WZWN0b3Ioc3RkOjptb3ZlKG1WZWMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVZlYzsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Qb29sOworICAgIH07CisKKyAgICBNdXRleCBtTXV0ZXg7CisgICAgc2l6ZV90IG1Qb29sQ2FwYWNpdHk7CisgICAgc2l6ZV90IG1Vc2VkU2l6ZTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp2ZWN0b3I8dWludDhfdD4+IG1Qb29sOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGNvbnN0cnVjdGluZyBub24tbWFuYWdlZCBMb2NhbEJ1ZmZlclBvb2wuCisgICAgICovCisgICAgZXhwbGljaXQgTG9jYWxCdWZmZXJQb29sKHNpemVfdCBwb29sQ2FwYWNpdHkpCisgICAgICAgIDogbVBvb2xDYXBhY2l0eShwb29sQ2FwYWNpdHkpLCBtVXNlZFNpemUoMCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYmFjayB0aGUgb3duZXJzaGlwIG9mIHZlYyBmcm9tIHRoZSBkZXN0cnVjdGVkIFZlY3RvckJ1ZmZlciBhbmQgcHV0CisgICAgICogaXQgaW4gZnJvbnQgb2YgdGhlIHBvb2wuCisgICAgICovCisgICAgdm9pZCByZXR1cm5WZWN0b3Ioc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgbVBvb2wucHVzaF9mcm9udChzdGQ6Om1vdmUodmVjKSk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9jYWxCdWZmZXJQb29sKTsKK307CisKK3NwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmbG9jYWxCdWZmZXJQb29sKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fCAhZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIEFMT0dEKCJmb3JtYXQgbGFja3Mgd2lkdGggb3IgaGVpZ2h0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmV0Y2ggZ3JhcGhpYyBibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIFtsb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJ1ZmZlclBvb2wtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICB9KTsKK30KKworY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworLyoqCisgKiBGbGV4aWJsZSBidWZmZXIgc2xvdHMgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEZsZXhCdWZmZXJzSW1wbCB7CitwdWJsaWM6CisgICAgRmxleEJ1ZmZlcnNJbXBsKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogbUltcGxOYW1lKHN0ZDo6c3RyaW5nKG5hbWUpICsgIi5JbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogQXNzaWduIGFuIGVtcHR5IHNsb3QgZm9yIGEgYnVmZmVyIGFuZCByZXR1cm4gdGhlIGluZGV4LiBJZiB0aGVyZSdzIG5vCisgICAgICogZW1wdHkgc2xvdCwganVzdCBhZGQgb25lIGF0IHRoZSBlbmQgYW5kIHJldHVybiBpdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXJbaW5dICBhIG5ldyBidWZmZXIgdG8gYXNzaWduIGEgc2xvdC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgICAgaW5kZXggb2YgdGhlIGFzc2lnbmVkIHNsb3QuCisgICAgICovCisgICAgc2l6ZV90IGFzc2lnblNsb3QoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBidWZmZXIsIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCkgfSk7CisgICAgICAgIHJldHVybiBtQnVmZmVycy5zaXplKCkgLSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIHNsb3QgZnJvbSB0aGUgY2xpZW50LCBhbmQgZ2V0IHRoZSBDMkJ1ZmZlciBvYmplY3QgYmFjayBmcm9tCisgICAgICogdGhlIHByZXZpb3VzbHkgYXNzaWduZWQgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIHNsb3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlZQorICAgICAqIHVudGlsIHRoZSByZXR1cm5lZCBDMkJ1ZmZlciBvYmplY3QgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXJbaW5dICAgICAgICB0aGUgYnVmZmVyIHByZXZpb3VzbHkgYXNzaWduZWQgYSBzbG90LgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZWxlYXNlZCBmcm9tIGEgc2xvdAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmVsZWFzZVNsb3QoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiByZXN1bHQgPSBjbGllbnRCdWZmZXItPmFzQzJCdWZmZXIoKTsKKyAgICAgICAgbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIgPSByZXN1bHQ7CisgICAgICAgIGlmIChjMmJ1ZmZlcikgeworICAgICAgICAgICAgKmMyYnVmZmVyID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wQnVmZmVyIHx8IGNvbXBCdWZmZXIgIT0gYzJidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBhbiB1bmtub3duIGJ1ZmZlciIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgJXp1IiwgbU5hbWUsIG1CdWZmZXJzLnNpemUoKSk7CisgICAgICAgIG1CdWZmZXJzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisgICAgc3RkOjpzdHJpbmcgbUltcGxOYW1lOyAvLy88IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgbmFtZQorCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXI7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCisvKioKKyAqIFN0YXRpYyBidWZmZXIgc2xvdHMgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYSBmaXhlZC1zaXplIGFycmF5LgorICovCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsIHsKK3B1YmxpYzoKKyAgICBCdWZmZXJzQXJyYXlJbXBsKCkKKyAgICAgICAgOiBtSW1wbE5hbWUoIkJ1ZmZlcnNBcnJheUltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGJ1ZmZlciBhcnJheSBmcm9tIHRoZSBvcmlnaW5hbCB8aW1wbHwuIFRoZSBidWZmZXJzIGtub3duIGJ5CisgICAgICogdGhlIGNsaWVudCBpcyBwcmVzZXJ2ZWQsIGFuZCB0aGUgZW1wdHkgc2xvdHMgYXJlIHBvcHVsYXRlZCBzbyB0aGF0IHRoZQorICAgICAqIGFycmF5IHNpemUgaXMgYXQgbGVhc3QgfG1pblNpemV8LgorICAgICAqCisgICAgICogXHBhcmFtIGltcGxbaW5dICAgICAgRmxleEJ1ZmZlcnNJbXBsIG9iamVjdCB1c2VkIHNvIGZhci4KKyAgICAgKiBccGFyYW0gbWluU2l6ZVtpbl0gICBtaW5pbXVtIHNpemUgb2YgdGhlIGJ1ZmZlciBhcnJheS4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGVbaW5dICBmdW5jdGlvbiB0byBhbGxvY2F0ZSBhIGNsaWVudCBidWZmZXIgZm9yIGFuIGVtcHR5IHNsb3QuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGxOYW1lID0gaW1wbC5tSW1wbE5hbWUgKyAiW05dIjsKKyAgICAgICAgbU5hbWUgPSBtSW1wbE5hbWUuY19zdHIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbXBsLm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IGltcGwubUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50ID0gKGNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgICAgIGlmICghb3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IGFsbG9jYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBjbGllbnRCdWZmZXIsIGltcGwubUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlciwgb3duZWRCeUNsaWVudCB9KTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb252ZXJ0ZWQgJXp1IGJ1ZmZlcnMgdG8gYXJyYXkgbW9kZSBvZiAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpLCBtaW5TaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGltcGwubUJ1ZmZlcnMuc2l6ZSgpOyBpIDwgbWluU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvY2F0ZSgpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWIgYSBidWZmZXIgZnJvbSB0aGUgdW5kZXJseWluZyBhcnJheSB3aGljaCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleFtvdXRdICAgIGluZGV4IG9mIHRoZSBzbG90LgorICAgICAqIFxwYXJhbSBidWZmZXJbb3V0XSAgIHRoZSBtYXRjaGluZyBidWZmZXIuCisgICAgICogXHBhcmFtIG1hdGNoW2luXSAgICAgYSBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgdGhlIGJ1ZmZlciBtYXRjaGVzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhIG9yIG5vdC4KKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICBpZiBzdWNjZXNzZnVsLAorICAgICAqICAgICAgICAgV09VTERfQkxPQ0sgIGlmIHNsb3RzIGFyZSBiZWluZyB1c2VkLAorICAgICAqICAgICAgICAgTk9fTUVNT1JZICAgIGlmIG5vIHNsb3QgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGV2ZW4gdGhvdWdoIGl0J3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBncmFiQnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gKmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICYpPiBtYXRjaCA9CisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKSB7IHJldHVybiB0cnVlOyB9KSB7CisgICAgICAgIC8vIGFsbEJ1ZmZlcnNEb250TWF0Y2ggcmVtYWlucyB0cnVlIGlmIGFsbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgYnV0CisgICAgICAgIC8vIG1hdGNoKCkgcmV0dXJucyBmYWxzZSBmb3IgZXZlcnkgYnVmZmVyLgorICAgICAgICBib29sIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSB0cnVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgJiYgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2gobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+c2V0UmFuZ2UoMCwgKCpidWZmZXIpLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWxsQnVmZmVyc0RvbnRNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxCdWZmZXJzRG9udE1hdGNoID8gTk9fTUVNT1JZIDogV09VTERfQkxPQ0s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBidWZmZXIgZnJvbSB0aGUgY2xpZW50LCBhbmQgZ2V0IHRoZSBDMkJ1ZmZlciBvYmplY3QgYmFjayBmcm9tCisgICAgICogdGhlIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBzbG90IGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUgdW50aWwgdGhlIHJldHVybmVkCisgICAgICogQzJCdWZmZXIgb2JqZWN0IGlzIGZyZWVkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyW2luXSAgICAgICAgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IGdyYWJiZWQuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkCisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZXR1cm5CdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gQ2xpZW50IHJldHVybmVkIGEgYnVmZmVyIGl0IGRvZXMgbm90IG93biBhY2NvcmRpbmcgdG8gb3VyIHJlY29yZDogJXp1IiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdICVzOiBObyBtYXRjaGluZyBidWZmZXIgZm91bmQiLCBtTmFtZSwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdICVzOiBtYXRjaGluZyBidWZmZXIgZm91bmQgKGluZGV4PSV6dSkiLCBtTmFtZSwgX19mdW5jX18sIGluZGV4KTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiByZXN1bHQgPSBjbGllbnRCdWZmZXItPmFzQzJCdWZmZXIoKTsKKyAgICAgICAgbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIgPSByZXN1bHQ7CisgICAgICAgIGlmIChjMmJ1ZmZlcikgeworICAgICAgICAgICAgKmMyYnVmZmVyID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYzJidWZmZXIgPT0gY29tcEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGEgYnVmZmVyIG93bmVkIGJ5IGNsaWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoaW5kZXggJXp1KSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIgKGFycmF5IG1vZGUpIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgfGFycmF5fCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhcnJheVtvdXRdICBhbiBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICovCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgeworICAgICAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICAgICAgZm9yIChjb25zdCBFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICAgICAgYXJyYXktPnB1c2goZW50cnkuY2xpZW50QnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgYWJhbmRvbmVkIGFsbCBrbm93biBidWZmZXJzLCBzbyByZWNsYWltIHRoZSBvd25lcnNoaXAuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgZm9yIChFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICAgICAgZW50cnkub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWFsbG9jKHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgICAgICBib29sIG93bmVkQnlDbGllbnQ7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCitjbGFzcyBJbnB1dEJ1ZmZlcnNBcnJheSA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVyc0FycmF5KGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbTl0iKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+SW5wdXRCdWZmZXJzQXJyYXkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSkgeworICAgICAgICBtSW1wbC5pbml0aWFsaXplKGltcGwsIG1pblNpemUsIGFsbG9jYXRlKTsKKyAgICB9CisKKyAgICBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgZmluYWwgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgZmluYWwgeworICAgICAgICBtSW1wbC5nZXRBcnJheShhcnJheSk7CisgICAgfQorCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUltcGwuZ3JhYkJ1ZmZlcihpbmRleCwgJmMyQnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgICAgICpidWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmV0dXJuQnVmZmVyKGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUltcGwuZmx1c2goKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQnVmZmVyc0FycmF5SW1wbCBtSW1wbDsKK307CisKK2NsYXNzIExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIExpbmVhcklucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpIHsgfQorCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAodm9pZCltRm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggaW5wdXQgc2l6ZQorICAgICAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IGFsbG9jKChzaXplX3QpY2FwYWNpdHkpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICAgICAgbUltcGwuZmx1c2goKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IGlucHV0IHNpemUKKyAgICAgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjFELUlucHV0W05dIikpOworICAgICAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgICAgIG1JbXBsLAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgW3RoaXMsIGNhcGFjaXR5XSAoKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsgcmV0dXJuIGFsbG9jKGNhcGFjaXR5KTsgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiBhbGxvYyhzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhzaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIDogcHVibGljIExpbmVhcklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsCisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICZkZWFsZXIsCisgICAgICAgICAgICBjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvLAorICAgICAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtLAorICAgICAgICAgICAgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJFbmNyeXB0ZWRJbnB1dCIpCisgICAgICAgIDogTGluZWFySW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1Vc2FnZSh7MCwgMH0pLAorICAgICAgICAgIG1EZWFsZXIoZGVhbGVyKSwKKyAgICAgICAgICBtQ3J5cHRvKGNyeXB0byksCisgICAgICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBtVXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVELCAwIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZTsgKytpKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnkgPSBtRGVhbGVyLT5hbGxvY2F0ZShjYXBhY2l0eSk7CisgICAgICAgICAgICBpZiAobWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gZGVhbGVyOiBvbmx5ICV6dSBzbG90cyBhbGxvY2F0ZWQiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVtb3J5VmVjdG9yLnB1c2hfYmFjayh7c3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPigpLCBtZW1vcnl9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIH5FbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSB7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvYyhzaXplX3Qgc2l6ZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnk7CisgICAgICAgIGZvciAoY29uc3QgRW50cnkgJmVudHJ5IDogbU1lbW9yeVZlY3RvcikgeworICAgICAgICAgICAgaWYgKGVudHJ5LmJsb2NrLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIG1lbW9yeSA9IGVudHJ5Lm1lbW9yeTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhzaXplLCBtVXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcihtRm9ybWF0LCBibG9jaywgbWVtb3J5LCBtSGVhcFNlcU51bSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyTWVtb3J5VXNhZ2UgbVVzYWdlOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJQ3J5cHRvPiBtQ3J5cHRvOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1NZW1vcnlWZWN0b3I7Cit9OworCitjbGFzcyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1NZXRhSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSksCisgICAgICAgICAgbVN0b3JlKEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSkgeyB9CisgICAgfkdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzcDxHcmFwaGljTWV0YWRhdGFCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIobUZvcm1hdCwgYWxsb2MpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1NZXRhSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbZm9ybWF0ID0gbUZvcm1hdCwgYWxsb2NdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR3JhcGhpY01ldGFkYXRhQnVmZmVyKGZvcm1hdCwgYWxsb2MpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBtU3RvcmU7Cit9OworCitjbGFzcyBHcmFwaGljSW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgR3JhcGhpY0lucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELUJCLUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpLAorICAgICAgICAgIG1Mb2NhbEJ1ZmZlclBvb2woTG9jYWxCdWZmZXJQb29sOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZSkpIHsgfQorICAgIH5HcmFwaGljSW5wdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBpbnB1dCBzaXplCisgICAgICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBuZXdCdWZmZXIgPSBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgbVBvb2wsIG1Gb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIG1Mb2NhbEJ1ZmZlclBvb2wpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtQkItSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLCBmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCwgZm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBsYnApOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCitjbGFzcyBEdW1teUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIER1bW15SW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKiwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJiwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICYpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgIH0KK307CisKK2NsYXNzIE91dHB1dEJ1ZmZlcnNBcnJheSA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBPdXRwdXRCdWZmZXJzQXJyYXkoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXRbTl0iKQorICAgICAgICA6IE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgfk91dHB1dEJ1ZmZlcnNBcnJheSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgICAgIG1JbXBsLmluaXRpYWxpemUoaW1wbCwgbWluU2l6ZSwgYWxsb2NhdGUpOworICAgIH0KKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKAorICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICZjMkJ1ZmZlciwKKyAgICAgICAgICAgICAgICBbYnVmZmVyXShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudEJ1ZmZlci0+Y2FuQ29weShidWZmZXIpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBidWZmZXJzIHRlbXBvcmFyaWx5IG5vdCBhdmFpbGFibGUiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0QoIlslc10gZ3JhYkJ1ZmZlciBmYWlsZWQ6ICVkIiwgbU5hbWUsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGlmICghYzJCdWZmZXItPmNvcHkoYnVmZmVyKSkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gY29weSBidWZmZXIgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICB9CisgICAgICAgIHN1Ym1pdChjMkJ1ZmZlcik7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICAgICAgQUxPR1YoIlslc10gZ3JhYmJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtQ3NkSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKAorICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICZjMkJ1ZmZlciwKKyAgICAgICAgICAgICAgICBbY3NkXShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudEJ1ZmZlci0+YmFzZSgpICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjbGllbnRCdWZmZXItPmNhcGFjaXR5KCkgPj0gY3NkLT5mbGV4Q291bnQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYzJCdWZmZXItPmJhc2UoKSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYzJCdWZmZXItPnNldFJhbmdlKDAsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICAqY2xpZW50QnVmZmVyID0gYzJCdWZmZXI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmV0dXJuQnVmZmVyKGJ1ZmZlciwgYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZmx1c2hlZFdvcms7CisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworICAgIH0KKworICAgIHZvaWQgcmVhbGxvYyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2M7CisgICAgICAgIHN3aXRjaCAoYzJidWZmZXItPmRhdGEoKS50eXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpMSU5FQVI6IHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jayA9IGMyYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2suc2l6ZSgpIDwga01heExpbmVhckJ1ZmZlclNpemUgLyAyKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBibG9jay5zaXplKCkgKiAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwgc2l6ZV0geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoc2l6ZSkpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQzogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OklOVkFMSUQ6ICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUzogICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUzogIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgdHlwZTogJWQiLCAoaW50KWMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUltcGwucmVhbGxvYyhhbGxvYyk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7Cit9OworCitjbGFzcyBGbGV4T3V0cHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBGbGV4T3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtdIikKKyAgICAgICAgOiBPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSB7IH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSB3cmFwKGJ1ZmZlcik7CisgICAgICAgIG5ld0J1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIEFMT0dWKCJbJXNdIHJlZ2lzdGVyZWQgYnVmZmVyICV6dSIsIG1OYW1lLCAqaW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUNzZEluZm86Om91dHB1dCAqY3NkLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSkpOworICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmbHVzaGVkV29yazsKKyAgICAgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IGFycmF5KG5ldyBPdXRwdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSkpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+dHJhbnNmZXJTa2lwQ3V0QnVmZmVyKG1Ta2lwQ3V0QnVmZmVyKTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbdGhpc10oKSB7IHJldHVybiBhbGxvY2F0ZUFycmF5QnVmZmVyKCk7IH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byB3cmFwLgorICAgICAqCisgICAgICogXHJldHVybiAgYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCB0byB3cmFwIHxidWZmZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3QgZm9yIHRoZSB0eXBlIG9mIGJ1ZmZlcnMsIHRvIGJlCisgICAgICogdXNlZCBhcyBhbiBlbXB0eSBhcnJheSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHdoaWNoIGNhbiBjb3B5KCkgZnJvbSBDMkJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFyT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFyT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIEZsZXhPdXRwdXRCdWZmZXJzOjpmbHVzaChmbHVzaGVkV29yayk7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHVzaW5nIGEgZHVtbXkgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihtRm9ybWF0LCBuZXcgQUJ1ZmZlcigwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm9uLWxpbmVhciBidWZmZXIgJWQiLCBtTmFtZSwgYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBsaW5lYXIgb3V0cHV0IGJ1ZmZlcnMgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gbm8gbGluZWFyIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgICAgICAvLyBXZSBleHBlY3Qgb25lIGFuZCBvbmx5IG9uZSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBDb25zdExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShtRm9ybWF0LCBidWZmZXIpOworICAgICAgICBzdWJtaXQoY2xpZW50QnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudEJ1ZmZlcjsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggb3V0cHV0IHNpemUKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihtRm9ybWF0LCBuZXcgQUJ1ZmZlcihrTGluZWFyQnVmZmVyU2l6ZSkpOworICAgIH0KK307CisKK2NsYXNzIEdyYXBoaWNPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBuZXcgRHVtbXlDb250YWluZXJCdWZmZXIobUZvcm1hdCwgYnVmZmVyKTsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBuZXcgRHVtbXlDb250YWluZXJCdWZmZXIobUZvcm1hdCk7CisgICAgfQorfTsKKworY2xhc3MgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBrTWluT3V0cHV0QnVmZmVyQXJyYXlTaXplKSkgeyB9CisgICAgflJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJidWZmZXIgPSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjMmJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICByZXR1cm4gYzJidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvY2F0ZUFycmF5QnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVHdWFyZDo6UXVldWVHdWFyZCgKKyAgICAgICAgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jICZzeW5jKSA6IG1TeW5jKHN5bmMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtU3luYy5tR3VhcmRMb2NrKTsKKyAgICAvLyBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCB0aGF0IG1TeW5jIGlzIG5vdCB1bmRlciBzdGF0ZSB0cmFuc2l0aW9uLAorICAgIC8vIGFzIHdlIGFyZSBob2xkaW5nIGl0cyBtdXRleC4KKworICAgIE11dGV4ZWQ8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1TeW5jLm1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgICsrY291bnQtPnZhbHVlOworICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgfQorfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjp+UXVldWVHdWFyZCgpIHsKKyAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgLy8gV2UgYXJlIG5vdCBob2xkaW5nIG1HdWFyZExvY2sgYXQgdGhpcyBwb2ludCBzbyB0aGF0IFF1ZXVlU3luYzo6c3RvcCgpIGNhbgorICAgICAgICAvLyBrZWVwIGhvbGRpbmcgdGhlIGxvY2sgdW50aWwgbUNvdW50IHJlYWNoZXMgemVyby4KKyAgICAgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICAgICAgLS1jb3VudC0+dmFsdWU7CisgICAgICAgIGNvdW50LT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIC8vIElmIHN0b3BwZWQsIGl0IGdvZXMgdG8gcnVubmluZyBzdGF0ZTsgb3RoZXJ3aXNlIG5vLW9wLgorICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgY291bnQtPnZhbHVlID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1HdWFyZExvY2spOworICAgIE11dGV4ZWQ8Q291bnRlcj46OkxvY2tlZCBjb3VudChtQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBIb2xkaW5nIG1HdWFyZExvY2sgaGVyZSBibG9ja3MgY3JlYXRpb24gb2YgYWRkaXRpb25hbCBRdWV1ZUd1YXJkIG9iamVjdHMsIHNvCisgICAgLy8gbUNvdW50IGNhbiBvbmx5IGRlY3JlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRocmVhZHMgdGhhdCBhY3F1aXJlZCB0aGUgbG9jaworICAgIC8vIGFyZSBhbGxvd2VkIHRvIGZpbmlzaCBleGVjdXRpb24gYnV0IGFkZGl0aW9uYWwgdGhyZWFkcyB0cnlpbmcgdG8gYWNxdWlyZQorICAgIC8vIHRoZSBsb2NrIGF0IHRoaXMgcG9pbnQgd2lsbCBibG9jaywgYW5kIHRoZW4gZ2V0IFF1ZXVlR3VhcmQgYXQgU1RPUFBFRAorICAgIC8vIHN0YXRlLgorICAgIHdoaWxlIChjb3VudC0+dmFsdWUgIT0gMCkgeworICAgICAgICBjb3VudC53YWl0Rm9yQ29uZGl0aW9uKGNvdW50LT5jb25kKTsKKyAgICB9CisgICAgY291bnQtPnZhbHVlID0gLTE7Cit9CisKKy8vIENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHkKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UGlwZWxpbmVDYXBhY2l0eTo6UGlwZWxpbmVDYXBhY2l0eSgpCisgICAgICA6IGlucHV0KDApLCBjb21wb25lbnQoMCksCisgICAgICAgIG1OYW1lKCI8VU5LTk9XTiBDT01QT05FTlQ+IikgeworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmluaXRpYWxpemUoCisgICAgICAgIGludCBuZXdJbnB1dCwKKyAgICAgICAgaW50IG5ld0NvbXBvbmVudCwKKyAgICAgICAgY29uc3QgY2hhciogbmV3TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciogY2FsbGVyVGFnKSB7CisgICAgaW5wdXQuc3RvcmUobmV3SW5wdXQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGNvbXBvbmVudC5zdG9yZShuZXdDb21wb25lbnQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIG1OYW1lID0gbmV3TmFtZTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5Ojppbml0aWFsaXplKCk6ICIKKyAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5IGluaXRpYWxpemVkID09PiAiCisgICAgICAgICAgImlucHV0ID0gJWQsIGNvbXBvbmVudCA9ICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBjYWxsZXJUYWcgPyBjYWxsZXJUYWcgOiAiKiIsCisgICAgICAgICAgICBuZXdJbnB1dCwgbmV3Q29tcG9uZW50KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpQaXBlbGluZUNhcGFjaXR5OjphbGxvY2F0ZShjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnQgcHJldklucHV0ID0gaW5wdXQuZmV0Y2hfc3ViKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGludCBwcmV2Q29tcG9uZW50ID0gY29tcG9uZW50LmZldGNoX3N1YigxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAocHJldklucHV0ID4gMCAmJiBwcmV2Q29tcG9uZW50ID4gMCkgeworICAgICAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjphbGxvY2F0ZSgpIHJldHVybnMgdHJ1ZTogIgorICAgICAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5IC0xIGFsbCA9PT4gIgorICAgICAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBjYWxsZXJUYWcgPyBjYWxsZXJUYWcgOiAiKiIsCisgICAgICAgICAgICAgICAgcHJldklucHV0IC0gMSwKKyAgICAgICAgICAgICAgICBwcmV2Q29tcG9uZW50IC0gMSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnB1dC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgY29tcG9uZW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjphbGxvY2F0ZSgpIHJldHVybnMgZmFsc2U6ICIKKyAgICAgICAgICAicGlwZWxpbmUgYXZhaWxhYmlsaXR5IHVuY2hhbmdlZCA9PT4gIgorICAgICAgICAgICJpbnB1dCA9ICVkLCBjb21wb25lbnQgPSAlZCIsCisgICAgICAgICAgICBtTmFtZSwgY2FsbGVyVGFnID8gY2FsbGVyVGFnIDogIioiLAorICAgICAgICAgICAgcHJldklucHV0LAorICAgICAgICAgICAgcHJldkNvbXBvbmVudCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmZyZWUoY29uc3QgY2hhciogY2FsbGVyVGFnKSB7CisgICAgaW50IHByZXZJbnB1dCA9IGlucHV0LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpbnQgcHJldkNvbXBvbmVudCA9IGNvbXBvbmVudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgQUxPR1YoIlslc10gJXMgLS0gUGlwZWxpbmVDYXBhY2l0eTo6ZnJlZSgpOiAiCisgICAgICAgICAgInBpcGVsaW5lIGF2YWlsYWJpbGl0eSArMSBhbGwgPT0+ICIKKyAgICAgICAgICAiaW5wdXQgPSAlZCwgY29tcG9uZW50ID0gJWQiLAorICAgICAgICAgICAgbU5hbWUsIGNhbGxlclRhZyA/IGNhbGxlclRhZyA6ICIqIiwKKyAgICAgICAgICAgIHByZXZJbnB1dCArIDEsCisgICAgICAgICAgICBwcmV2Q29tcG9uZW50ICsgMSk7Cit9CisKK2ludCBDQ29kZWNCdWZmZXJDaGFubmVsOjpQaXBlbGluZUNhcGFjaXR5OjpmcmVlSW5wdXRTbG90cygKKyAgICAgICAgc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgY29uc3QgY2hhciogY2FsbGVyVGFnKSB7CisgICAgaW50IHByZXZJbnB1dCA9IGlucHV0LmZldGNoX2FkZChudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBBTE9HVigiWyVzXSAlcyAtLSBQaXBlbGluZUNhcGFjaXR5OjpmcmVlSW5wdXRTbG90cyglenUpOiAiCisgICAgICAgICAgInBpcGVsaW5lIGF2YWlsYWJpbGl0eSArJXp1IGlucHV0ID09PiAiCisgICAgICAgICAgImlucHV0ID0gJWQsIGNvbXBvbmVudCA9ICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBjYWxsZXJUYWcgPyBjYWxsZXJUYWcgOiAiKiIsCisgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMsCisgICAgICAgICAgICBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMsCisgICAgICAgICAgICBwcmV2SW5wdXQgKyBzdGF0aWNfY2FzdDxpbnQ+KG51bURpc2NhcmRlZElucHV0QnVmZmVycyksCisgICAgICAgICAgICBjb21wb25lbnQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSk7CisgICAgcmV0dXJuIHByZXZJbnB1dCArIHN0YXRpY19jYXN0PGludD4obnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKK30KKworaW50IENDb2RlY0J1ZmZlckNoYW5uZWw6OlBpcGVsaW5lQ2FwYWNpdHk6OmZyZWVDb21wb25lbnRTbG90KAorICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXJUYWcpIHsKKyAgICBpbnQgcHJldkNvbXBvbmVudCA9IGNvbXBvbmVudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgQUxPR1YoIlslc10gJXMgLS0gUGlwZWxpbmVDYXBhY2l0eTo6ZnJlZUNvbXBvbmVudFNsb3QoKTogIgorICAgICAgICAgICJwaXBlbGluZSBhdmFpbGFiaWxpdHkgKzEgY29tcG9uZW50ID09PiAiCisgICAgICAgICAgImlucHV0ID0gJWQsIGNvbXBvbmVudCA9ICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBjYWxsZXJUYWcgPyBjYWxsZXJUYWcgOiAiKiIsCisgICAgICAgICAgICBpbnB1dC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpLAorICAgICAgICAgICAgcHJldkNvbXBvbmVudCArIDEpOworICAgIHJldHVybiBwcmV2Q29tcG9uZW50ICsgMTsKK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6UmVvcmRlclN0YXNoKCkgeworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpjbGVhcigpIHsKKyAgICBtUGVuZGluZy5jbGVhcigpOworICAgIG1TdGFzaC5jbGVhcigpOworICAgIG1EZXB0aCA9IDA7CisgICAgbUtleSA9IEMyQ29uZmlnOjpPUkRJTkFMOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6c2V0RGVwdGgodWludDMyX3QgZGVwdGgpIHsKKyAgICBtUGVuZGluZy5zcGxpY2UobVBlbmRpbmcuZW5kKCksIG1TdGFzaCk7CisgICAgbURlcHRoID0gZGVwdGg7Cit9Cit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6c2V0S2V5KEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IGtleSkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtS2V5ID0ga2V5OworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6cG9wKEVudHJ5ICplbnRyeSkgeworICAgIGlmIChtUGVuZGluZy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZW50cnktPmJ1ZmZlciAgICAgPSBtUGVuZGluZy5mcm9udCgpLmJ1ZmZlcjsKKyAgICBlbnRyeS0+dGltZXN0YW1wICA9IG1QZW5kaW5nLmZyb250KCkudGltZXN0YW1wOworICAgIGVudHJ5LT5mbGFncyAgICAgID0gbVBlbmRpbmcuZnJvbnQoKS5mbGFnczsKKyAgICBlbnRyeS0+b3JkaW5hbCAgICA9IG1QZW5kaW5nLmZyb250KCkub3JkaW5hbDsKKyAgICBtUGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmVtcGxhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtU3Rhc2guYmVnaW4oKTsgaXQgIT0gbVN0YXNoLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChsZXNzKG9yZGluYWwsIGl0LT5vcmRpbmFsKSkgeworICAgICAgICAgICAgbVN0YXNoLmVtcGxhY2UoaXQsIGJ1ZmZlciwgdGltZXN0YW1wLCBmbGFncywgb3JkaW5hbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbVN0YXNoLmVtcGxhY2VfYmFjayhidWZmZXIsIHRpbWVzdGFtcCwgZmxhZ3MsIG9yZGluYWwpOworICAgIHdoaWxlICghbVN0YXNoLmVtcHR5KCkgJiYgbVN0YXNoLnNpemUoKSA+IG1EZXB0aCkgeworICAgICAgICBtUGVuZGluZy5wdXNoX2JhY2sobVN0YXNoLmZyb250KCkpOworICAgICAgICBtU3Rhc2gucG9wX2Zyb250KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZGVmZXIoCisgICAgICAgIGNvbnN0IENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6RW50cnkgJmVudHJ5KSB7CisgICAgbVBlbmRpbmcucHVzaF9mcm9udChlbnRyeSk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpoYXNQZW5kaW5nKCkgY29uc3QgeworICAgIHJldHVybiAhbVBlbmRpbmcuZW1wdHkoKTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omxlc3MoCisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8xLCBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMikgeworICAgIHN3aXRjaCAobUtleSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpPUkRJTkFMOiAgIHJldHVybiBvMS5mcmFtZUluZGV4IDwgbzIuZnJhbWVJbmRleDsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6VElNRVNUQU1QOiByZXR1cm4gbzEudGltZXN0YW1wIDwgbzIudGltZXN0YW1wOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpDVVNUT006ICAgIHJldHVybiBvMS5jdXN0b21PcmRpbmFsIDwgbzIuY3VzdG9tT3JkaW5hbDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQga2V5OyBkZWZhdWx0IHRvIHRpbWVzdGFtcCIpOworICAgICAgICAgICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgIH0KK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbAorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpDQ29kZWNCdWZmZXJDaGFubmVsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+ICZjYWxsYmFjaykKKyAgICA6IG1IZWFwU2VxTnVtKC0xKSwKKyAgICAgIG1DQ29kZWNDYWxsYmFjayhjYWxsYmFjayksCisgICAgICBtRnJhbWVJbmRleCgwdSksCisgICAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXgoMHUpLAorICAgICAgbU1ldGFNb2RlKE1PREVfTk9ORSksCisgICAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eSgpLAorICAgICAgbUlucHV0TWV0RW9zKGZhbHNlKSB7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycygiIikpOworfQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjp+Q0NvZGVjQnVmZmVyQ2hhbm5lbCgpIHsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyICYmIG1EZWFsZXIgIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA+PSAwKSB7CisgICAgICAgIG1DcnlwdG8tPnVuc2V0SGVhcChtSGVhcFNlcU51bSk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgbUNvbXBvbmVudCA9IGNvbXBvbmVudDsKKyAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC0+Z2V0TmFtZSgpICsgU3RyaW5nUHJpbnRmKCIjJWQiLCBpbnQodWludHB0cl90KGNvbXBvbmVudC5nZXQoKSkgJSA5OTcpKTsKKyAgICBtTmFtZSA9IG1Db21wb25lbnROYW1lLmNfc3RyKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgQUxPR1YoIlslc10gc2V0SW5wdXRTdXJmYWNlIiwgbU5hbWUpOworICAgIG1JbnB1dFN1cmZhY2UgPSBzdXJmYWNlOworICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5jb25uZWN0KG1Db21wb25lbnQpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbUlucHV0U3VyZmFjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGlmIChtSW5wdXRNZXRFb3MpIHsKKyAgICAgICAgQUxPR0QoIlslc10gYnVmZmVycyBhZnRlciBFT1MgaWdub3JlZCAoJWxsZCB1cykiLCBtTmFtZSwgKGxvbmcgbG9uZyl0aW1lVXMpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaW50MzJfdCB0bXAgPSAwOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBtSW5wdXRNZXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmdG1wKSAmJiB0bXApIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXItPnNpemUoKSA9ICV6dSIsIG1OYW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIC8vIFdPUktBUk9VTkQ6IHVudGlsIGNvZGVjcyBzdXBwb3J0IGhhbmRsaW5nIHdvcmsgYWZ0ZXIgRU9TIGFuZCBtYXggb3V0cHV0IHNpemluZywgdXNlIHRpbWVzdGFtcAorICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhY2hpZXZlIGltYWdlIGVuY29kaW5nIHZpYSB2aWRlbyBjb2RlYywgYW5kIHRvIGNvbnN0cmFpbiBlbmNvZGVkIG91dHB1dC4KKyAgICAvLyBLZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwdSkgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJidWZmZXI7CisgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5mcmVlSW5wdXRTbG90cygxLCAicXVldWVJbnB1dEJ1ZmZlckludGVybmFsIik7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgLy8gVE9ETzogZmlsbCBpbmZvJ3MKKworICAgIHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSA9IHN0ZDo6bW92ZShtUGFyYW1zVG9CZVNldCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7CisKKyAgICBpZiAoZXJyID09IEMyX09LICYmIGVvcyAmJiBidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25Xb3JrUXVldWVkKGZhbHNlKTsKKyAgICAgICAgd29yay5yZXNldChuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IGtlZXAgY2xpZW50IHRpbWVzdGFtcCBpbiBjdXN0b21PcmRpbmFsCisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgaXRlbXMuY2xlYXIoKTsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7CisgICAgfQorICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbldvcmtRdWV1ZWQoZW9zKTsKKyAgICB9CisKKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0UGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHNldFBhcmFtZXRlcnMgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgbVBhcmFtc1RvQmVTZXQuaW5zZXJ0KG1QYXJhbXNUb0JlU2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHBhcmFtcy5lbmQoKSkpOworICAgIHBhcmFtcy5jbGVhcigpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBObyBtb3JlIGJ1ZmZlcnMgc2hvdWxkIGJlIHF1ZXVlZCBhdCBjdXJyZW50IHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgYm9vbCBzZWN1cmUsIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaXYsIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKworICAgIGlmICghaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICBzcDxFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcj4gZW5jcnlwdGVkQnVmZmVyKChFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciAqKWJ1ZmZlci5nZXQoKSk7CisKKyAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyKSB7CisgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0gZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnkgPSBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgICAgICB9CisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7CisgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+ZmlsbFNvdXJjZUJ1ZmZlcigmc291cmNlKTsKKyAgICAgICAgcmVzdWx0ID0gbUNyeXB0by0+ZGVjcnlwdCgKKyAgICAgICAgICAgICAgICBrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2UsIGJ1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZGVzdGluYXRpb24sIGVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKKyAgICAgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+Y29weURlY3J5cHRlZENvbnRlbnQobURlY3J5cHREZXN0aW5hdGlvbiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQorICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgorICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IGhpZGxTdWJTYW1wbGVzOworICAgICAgICBoaWRsU3ViU2FtcGxlcy5zZXRUb0V4dGVybmFsKChTdWJTYW1wbGUgKilzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBmYWxzZSAvKm93biovKTsKKworICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXI7CisgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+ZmlsbFNvdXJjZUJ1ZmZlcigmc3JjQnVmZmVyKTsKKworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5zZWN1cmVNZW1vcnkgPSBoaWRsX2hhbmRsZShlbmNyeXB0ZWRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5ub25zZWN1cmVNZW1vcnkgPSBzcmNCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBDYXNTdGF0dXMgc3RhdHVzID0gQ2FzU3RhdHVzOjpPSzsKKyAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIHNjdHJsLAorICAgICAgICAgICAgICAgIGhpZGxTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVzdWx0LCAmZGV0YWlsZWRFcnJvcl0gKAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FzU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX3N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHNzaXplX3QpX2J5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IENhc1N0YXR1czo6T0sgfHwgcmVzdWx0IDwgMCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQsIHJlc3VsdD0lemQiLAorICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cywgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiWyVzXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgbU5hbWUsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXItPnNldFJhbmdlKGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0IC0gY29kZWNEYXRhT2Zmc2V0KTsKKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HVigiWyVzXSBXZSdyZSBub3QgcnVubmluZyAtLS0gbm8gaW5wdXQgYnVmZmVyIHJlcG9ydGVkIiwgbU5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCkgeworICAgIHdoaWxlICghbUlucHV0TWV0RW9zICYmCisgICAgICAgICAgICFtUmVvcmRlclN0YXNoLmxvY2soKS0+aGFzUGVuZGluZygpICYmCisgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmFsbG9jYXRlKCJmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSIpKSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGluQnVmZmVyOworICAgICAgICBzaXplX3QgaW5kZXg7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+cmVxdWVzdE5ld0J1ZmZlcigmaW5kZXgsICZpbkJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBuZXcgYnVmZmVyIGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5mcmVlKCJmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIG5ldyBpbnB1dCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBpbkJ1ZmZlci5nZXQoKSk7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgaW5CdWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgQUxPR1YoIlslc10gcmVuZGVyT3V0cHV0QnVmZmVyOiAlcCIsIG1OYW1lLCBidWZmZXIuZ2V0KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmICgqYnVmZmVycykgeworICAgICAgICAgICAgcmVsZWFzZWQgPSAoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBOT1RFOiBzb21lIGFwcHMgdHJ5IHRvIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoIHRpbWVzdGFtcCBhbmQvb3IgcmVuZGVyCisgICAgLy8gICAgICAgc2V0IHRvIHRydWUuCisgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICAvLyBpbnB1dCBidWZmZXIgZmVlZGluZyBtYXkgaGF2ZSBiZWVuIGdhdGVkIGJ5IHBlbmRpbmcgb3V0cHV0IGJ1ZmZlcnMKKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIGlmICghYzJCdWZmZXIpIHsKKyAgICAgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBUaGUgYXBwIGlzIGNhbGxpbmcgcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggIgorICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvciByZW5kZXI9dHJ1ZSB3aXRoIG5vbi12aWRlbyBidWZmZXJzLiBBcHBzIHNob3VsZCAiCisgICAgICAgICAgICAgICAgICAiY2FsbCByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCByZW5kZXI9ZmFsc2UgZm9yIHRob3NlLiIsCisgICAgICAgICAgICAgICAgICBtTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworI2lmIDAKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gaW5mb1BhcmFtcyA9IGMyQnVmZmVyLT5pbmZvKCk7CisgICAgQUxPR1YoIlslc10gcXVldWluZyBnZnggYnVmZmVyIHdpdGggJXp1IGluZm9zIiwgbU5hbWUsIGluZm9QYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogaW5mb1BhcmFtcykgeworICAgICAgICBBU3RyaW5nIHJlczsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCArIDMgPCBpbmZvLT5zaXplKCk7IGl4ICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChpeCkgcmVzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoKigoaW50MzJfdCopaW5mby5nZXQoKSArIChpeCAvIDQpKSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiAgWyVzXSIsIHJlcy5jX3N0cigpKTsKKyAgICB9CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dD4gcm90YXRpb24gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIGJvb2wgZmxpcCA9IHJvdGF0aW9uICYmIChyb3RhdGlvbi0+ZmxpcCAmIDEpOworICAgIHVpbnQzMl90IHF1YXJ0ZXJzID0gKChyb3RhdGlvbiA/IHJvdGF0aW9uLT52YWx1ZSA6IDApIC8gOTApICYgMzsKKyAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOworICAgIHN3aXRjaCAocXVhcnRlcnMpIHsKKyAgICAgICAgY2FzZSAwOiAvLyBubyByb3RhdGlvbgorICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IEhBTF9UUkFOU0ZPUk1fRkxJUF9IIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8vIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyAoSEFMX1RSQU5TRk9STV9GTElQX1YgfCBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvLyAxODAgZGVncmVlcworICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IEhBTF9UUkFOU0ZPUk1fRkxJUF9WIDogSEFMX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLy8gOTAgZGVncmVlcyBjbG9ja3dpc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyAoSEFMX1RSQU5TRk9STV9GTElQX0ggfCBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfVFJBTlNGT1JNX1JPVF85MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0PiBzdXJmYWNlU2NhbGluZyA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisgICAgdWludDMyX3QgdmlkZW9TY2FsaW5nTW9kZSA9IE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVzsKKyAgICBpZiAoc3VyZmFjZVNjYWxpbmcpIHsKKyAgICAgICAgdmlkZW9TY2FsaW5nTW9kZSA9IHN1cmZhY2VTY2FsaW5nLT52YWx1ZTsKKyAgICB9CisKKyAgICAvLyBVc2UgZGF0YXNwYWNlIGZyb20gZm9ybWF0IGFzIGl0IGhhcyB0aGUgZGVmYXVsdCBhc3BlY3RzIGFscmVhZHkgYXBwbGllZAorICAgIGFuZHJvaWRfZGF0YXNwYWNlX3QgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOyAvLyB0aGlzIGlzIDAKKyAgICAodm9pZClidWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90ICopJmRhdGFTcGFjZSk7CisKKyAgICAvLyBIRFIgc3RhdGljIGluZm8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+IGhkclN0YXRpY0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisKKyAgICAvLyBIRFIxMCBwbHVzIGluZm8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IGhkcjEwUGx1c0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNhbm5vdCByZW5kZXIgYnVmZmVyIHdpdGhvdXQgc3VyZmFjZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGMyQnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpOworICAgIGlmIChibG9ja3Muc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGV4cGVjdGVkIDEgZ3JhcGhpYyBibG9jaywgYnV0IGdvdCAlenUiLCBtTmFtZSwgYmxvY2tzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrcy5mcm9udCgpOworCisgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIGFmdGVyIEMyRmVuY2UgaW1wbGVtZW50YXRpb24uCisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCisgICAgICAgICAgICB0aW1lc3RhbXBOcywKKyAgICAgICAgICAgIGZhbHNlLCAvLyBkcm9wcGFibGUKKyAgICAgICAgICAgIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIFJlY3QoYmxvY2tzLmZyb250KCkuY3JvcCgpLmxlZnQsCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5yaWdodCgpLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkuYm90dG9tKCkpLAorICAgICAgICAgICAgdmlkZW9TY2FsaW5nTW9kZSwKKyAgICAgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSwgMCk7CisgICAgaWYgKGhkclN0YXRpY0luZm8gfHwgaGRyMTBQbHVzSW5mbykgeworICAgICAgICBIZHJNZXRhZGF0YSBoZHI7CisgICAgICAgIGlmIChoZHJTdGF0aWNJbmZvKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgc21wdGUyMDg2X21ldGEgPSB7CisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5UmVkID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4gPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5Qmx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLndoaXRlUG9pbnQgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy53aGl0ZS54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5tYXhMdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5taW5MdW1pbmFuY2UsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSBjdGE4NjFfbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhDbGwsCisgICAgICAgICAgICAgICAgLm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhGYWxsLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgPSBIZHJNZXRhZGF0YTo6U01QVEUyMDg2IHwgSGRyTWV0YWRhdGE6OkNUQTg2MV8zOworICAgICAgICAgICAgaGRyLnNtcHRlMjA4NiA9IHNtcHRlMjA4Nl9tZXRhOworICAgICAgICAgICAgaGRyLmN0YTg2MTMgPSBjdGE4NjFfbWV0YTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbykgeworICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgfD0gSGRyTWV0YWRhdGE6OkhEUjEwUExVUzsKKyAgICAgICAgICAgIGhkci5oZHIxMHBsdXMuYXNzaWduKAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlICsgaGRyMTBQbHVzSW5mby0+ZmxleENvdW50KCkpOworICAgICAgICB9CisgICAgICAgIHFiaS5zZXRIZHJNZXRhZGF0YShoZHIpOworICAgIH0KKyAgICAvLyB3ZSBkb24ndCBoYXZlIGRpcnR5IHJlZ2lvbnMKKyAgICBxYmkuc2V0U3VyZmFjZURhbWFnZShSZWdpb246OklOVkFMSURfUkVHSU9OKTsKKyAgICBhbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxYm87CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUNvbXBvbmVudC0+cXVldWVUb091dHB1dFN1cmZhY2UoYmxvY2ssIHFiaSwgJnFibyk7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HSSgiWyVzXSBxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVkIiwgbU5hbWUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIHF1ZXVlIGJ1ZmZlciBzdWNjZXNzZnVsIiwgbU5hbWUpOworCisgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IDA7CisgICAgKHZvaWQpYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKKyAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0RnJhbWVzUmVuZGVyZWQobWVkaWFUaW1lVXMsIHRpbWVzdGFtcE5zKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgQUxPR1YoIlslc10gZGlzY2FyZEJ1ZmZlcjogJXAiLCBtTmFtZSwgYnVmZmVyLmdldCgpKTsKKyAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgIGlmICgqYnVmZmVycyAmJiAoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgICAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5mcmVlSW5wdXRTbG90cygxLCAiZGlzY2FyZEJ1ZmZlciIpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmICgqYnVmZmVycyAmJiAoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIlslc10gTWVkaWFDb2RlYyBkaXNjYXJkZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSB7CisgICAgYXJyYXktPmNsZWFyKCk7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworCisgICAgaWYgKCEoKmJ1ZmZlcnMpLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICpidWZmZXJzID0gKCpidWZmZXJzKS0+dG9BcnJheU1vZGUoa01pbklucHV0QnVmZmVyQXJyYXlTaXplKTsKKyAgICB9CisKKyAgICAoKmJ1ZmZlcnMpLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKworICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUpOworICAgIH0KKworICAgICgqYnVmZmVycyktPmdldEFycmF5KGFycmF5KTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c3RhcnQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQgaVN0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6b3V0cHV0IHJlb3JkZXJEZXB0aDsKKyAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6b3V0cHV0IHJlb3JkZXJLZXk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJmlTdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJm9TdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJnJlb3JkZXJEZXB0aCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlcktleSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICBudWxscHRyKTsKKyAgICBpZiAoZXJyID09IEMyX0JBRF9JTkRFWCkgeworICAgICAgICBpZiAoIWlTdHJlYW1Gb3JtYXQgfHwgIW9TdHJlYW1Gb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5jbGVhcigpOworICAgICAgICBpZiAocmVvcmRlckRlcHRoKSB7CisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZW9yZGVyS2V5KSB7CisgICAgICAgICAgICByZW9yZGVyLT5zZXRLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKKyAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgaW50IHBvb2xNYXNrID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyLXBvb2xtYXNrIiwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04gfAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKTsKKworICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyRm9ybWF0VmlkZW8pOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisKKyAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IGFsbG9jYXRvciBJRC4KKyAgICAgICAgICAgIHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkID0gKGdyYXBoaWMpID8gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOworCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dCBmcm9tIGNvbXBvbmVudC4gSWYgYW4gYWxsb2NhdG9yIElEIGlzIG9idGFpbmVkCisgICAgICAgICAgICAvLyBmcm9tIGNvbXBvbmVudCwgY3JlYXRlIHRoZSBpbnB1dCBibG9jayBwb29sIHdpdGggZ2l2ZW4gSUQuIE90aGVyd2lzZSwgdXNlIGRlZmF1bHQgSURzLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBpbnB1dCBhbGxvY2F0b3JzIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW1zLnNpemUoKSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0ICppbnB1dEFsbG9jYXRvcnMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEFsbG9jYXRvcnMgJiYgaW5wdXRBbGxvY2F0b3JzLT5mbGV4Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihpbnB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgaW5wdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgQzJDb21wb25lbnQgd3JhcHBlciB0byBhc3NvY2lhdGUgdGhpcyBwb29sIHdpdGggb3Vyc2VsdmVzCisgICAgICAgICAgICBpZiAoKHBvb2xNYXNrID4+IHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkKSAmIDEpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDcmVhdGVDb2RlYzJCbG9ja1Bvb2wocG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsIG51bGxwdHIsICZwb29sKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDcmVhdGVkIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBhbGxvY2F0b3JJRCAldSA9PiBwb29sSUQgJWxsdSAtICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykocG9vbCA/IHBvb2wtPmdldExvY2FsSWQoKSA6IDExMTAwMDExMSksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaW5wdXRQb29sSWQgPQorICAgICAgICAgICAgICAgICAgICBncmFwaGljID8gQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgICAgIGVyciA9IEdldENvZGVjMkJsb2NrUG9vbChpbnB1dFBvb2xJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFVzaW5nIGJhc2ljIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBwb29sSUQgJWxsdSA9PiBnb3QgJWxsdSAtICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpaW5wdXRQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvb2xzLT5pbnB1dFBvb2wgPSBwb29sOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoZ3JhcGhpYykgeworICAgICAgICAgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgRHVtbXlJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1ldGFNb2RlID09IE1PREVfQU5XKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgR3JhcGhpY0lucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICAodm9pZClpbnB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1EZWFsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBtRGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihjYXBhY2l0eSwgTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgbURlY3J5cHREZXN0aW5hdGlvbiA9IG1EZWFsZXItPmFsbG9jYXRlKChzaXplX3QpY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNyeXB0byAhPSBudWxscHRyICYmIG1IZWFwU2VxTnVtIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IG1DcnlwdG8tPnNldEhlYXAobURlYWxlci0+Z2V0TWVtb3J5SGVhcCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLCBtRGVhbGVyLCBtQ3J5cHRvLCBtSGVhcFNlcU51bSwgKHNpemVfdCljYXBhY2l0eSwgbU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IExpbmVhcklucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChpbnB1dEZvcm1hdCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgKCpidWZmZXJzKS0+c2V0UG9vbChwb29sKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0U3VyZmFjZTsKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlID0gb3V0cHV0LT5zdXJmYWNlID8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbiA9IG91dHB1dC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyRm9ybWF0VmlkZW8pOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRfOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisKKyAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IGFsbG9jYXRvciBJRC4KKyAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IChncmFwaGljKSA/IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yIGlmCisgICAgICAgICAgICAvLyB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBvdXRwdXQgYWxsb2NhdG9ycyByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgKm91dHB1dEFsbG9jYXRvcnMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0QWxsb2NhdG9ycyAmJiBvdXRwdXRBbGxvY2F0b3JzLT5mbGV4Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBvdXRwdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXNlIGJ1ZmZlcnF1ZXVlIGlmIG91dHB1dHRpbmcgdG8gYSBzdXJmYWNlLgorICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0IGZyb20gY29tcG9uZW50LCBvciB1c2UgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgIC8vIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IHN1cmZhY2UgYWxsb2NhdG9yIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCAqc3VyZmFjZUFsbG9jYXRvciA9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1cmZhY2VBbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihzdXJmYWNlQWxsb2NhdG9yLT52YWx1ZSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgc3VyZmFjZSBvdXRwdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBzdXJmYWNlQWxsb2NhdG9yLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPT0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBlcnIgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICgocG9vbE1hc2sgPj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSkgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChwb29sTWFzayA+PiBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCwgJnBvb2xzLT5vdXRwdXRQb29sSWQsICZwb29scy0+b3V0cHV0UG9vbEludGYpOworICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIENyZWF0ZWQgb3V0cHV0IGJsb2NrIHBvb2wgd2l0aCBhbGxvY2F0b3JJRCAldSA9PiBwb29sSUQgJWxsdSAtICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xzLT5vdXRwdXRQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIC8vIHVzZSBiYXNpYyBwb29sIGluc3RlYWQKKyAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0UG9vbElkID0KKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIDogQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29uZmlndXJlIG91dHB1dCBibG9jayBwb29sIElEIGFzIHBhcmFtZXRlciBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgdG8KKyAgICAgICAgICAgIC8vIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xJZHNUdW5pbmcgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHsgcG9vbHMtPm91dHB1dFBvb2xJZCB9KTsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHsgcG9vbElkc1R1bmluZy5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25maWd1cmVkIG91dHB1dCBibG9jayBwb29sIGlkcyAlbGx1ID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkc1R1bmluZy0+bS52YWx1ZXNbMF0sIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgb3V0cHV0UG9vbElkXyA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKworICAgICAgICBpZiAoZ3JhcGhpYykgeworICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgR3JhcGhpY091dHB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgTGluZWFyT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICB9CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChvdXRwdXRGb3JtYXQtPmR1cCgpKTsKKworCisgICAgICAgIC8vIFRyeSB0byBzZXQgb3V0cHV0IHN1cmZhY2UgdG8gY3JlYXRlZCBibG9jayBwb29sIGlmIGdpdmVuLgorICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgbUNvbXBvbmVudC0+c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9vbElkXywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkxJTkVBUgorICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgLy8gV09SS0FST1VORDogaWYgd2UncmUgdXNpbmcgZWFybHkgQ1NEIHdvcmthcm91bmQgd2UgY29udmVydCB0bworICAgICAgICAgICAgLy8gICAgICAgICAgICAgYXJyYXkgbW9kZSwgdG8gYXBwZWFzZSBhcHBzIGFzc3VtaW5nIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJ1ZmZlcnMgdG8gYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAgICAgICAgICgqYnVmZmVycykgPSAoKmJ1ZmZlcnMpLT50b0FycmF5TW9kZShrTWluT3V0cHV0QnVmZmVyQXJyYXlTaXplKTsKKworICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gMDs7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZWxheSB8fCBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgd3JpdGUgYWNjZXNzIHRvIHRoZSBidWZmZXJzLCBhbmQgd2UncmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBtb2RlLgorICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlcnMpLT5pbml0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdXAgcGlwZWxpbmUgY29udHJvbC4gVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBtSW5wdXRCdWZmZXJzIGFuZAorICAgIC8vIG1PdXRwdXRCdWZmZXJzIGFyZSBpbml0aWFsaXplZCB0byBtYWtlIHN1cmUgdGhhdCBsaW5nZXJpbmcgY2FsbGJhY2tzCisgICAgLy8gYWJvdXQgYnVmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBnZW5lcmF0aW9uIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUKKyAgICAvLyBuZXdseSBpbml0aWFsaXplZCBwaXBlbGluZSBjYXBhY2l0eS4KKworICAgIC8vIFF1ZXJ5IGRlbGF5cworICAgIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCBpbnB1dERlbGF5OworICAgIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXk7CisgICAgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nIHBpcGVsaW5lRGVsYXk7CisjaWYgMAorICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KAorICAgICAgICAgICAgeyAmaW5wdXREZWxheSwgJnBpcGVsaW5lRGVsYXksICZvdXRwdXREZWxheSB9LAorICAgICAgICAgICAge30sCisgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgbnVsbHB0cik7CisgICAgbUF2YWlsYWJsZVBpcGVsaW5lQ2FwYWNpdHkuaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGlucHV0RGVsYXksCisgICAgICAgICAgICBpbnB1dERlbGF5ICsgcGlwZWxpbmVEZWxheSwKKyAgICAgICAgICAgIGlucHV0RGVsYXkgKyBwaXBlbGluZURlbGF5ICsgb3V0cHV0RGVsYXksCisgICAgICAgICAgICBtTmFtZSk7CisjZWxzZQorICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmluaXRpYWxpemUoCisgICAgICAgICAgICBrTWluSW5wdXRCdWZmZXJBcnJheVNpemUsCisgICAgICAgICAgICBrTWF4UGlwZWxpbmVDYXBhY2l0eSwKKyAgICAgICAgICAgIG1OYW1lKTsKKyNlbmRpZgorCisgICAgbUlucHV0TWV0RW9zID0gZmFsc2U7CisgICAgbVN5bmMuc3RhcnQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBDMlN0cmVhbUZvcm1hdENvbmZpZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiB0b0JlUXVldWVkOworICAgIC8vIFRPRE86IHVzZSBwcm9wZXIgYnVmZmVyIGRlcHRoIGluc3RlYWQgb2YgdGhpcyByYW5kb20gdmFsdWUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNaW5JbnB1dEJ1ZmZlckFycmF5U2l6ZTsgKytpKSB7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgICAgICBpZiAoISgqYnVmZmVycyktPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgYXQgYWxsIiwgbU5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5LCBvbmx5ICV6dSBidWZmZXJzIGFsbG9jYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICAgICAgQUxPR1YoIlslc10gaW5wdXQgYnVmZmVyICV6dSBhdmFpbGFibGUiLCBtTmFtZSwgaW5kZXgpOworICAgICAgICAgICAgYm9vbCBwb3N0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghY29uZmlncy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGNvbmZpZ3MtPmZyb250KCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBjb25maWctPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5iYXNlKCksIGNvbmZpZy0+ZGF0YSgpLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGJ1ZmZlciBjYXBhY2l0eSB0b28gc21hbGwgZm9yIHRoZSBjb25maWcgKCV6dSA8ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBidWZmZXItPmNhcGFjaXR5KCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIgJiYgaSA9PSAwCisgICAgICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IFNvbWUgYXBwcyBleHBlY3QgQ1NEIGF2YWlsYWJsZSB3aXRob3V0IHF1ZXVlaW5nCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYW55IGlucHV0LiBRdWV1ZSBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IHRoZSBDU0QuCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgIHBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5hbGxvY2F0ZSgicmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMiKSkgeworICAgICAgICAgICAgICAgIGlmIChwb3N0KSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0b0JlUXVldWVkLmVtcGxhY2VfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gcGlwZWxpbmUgaXMgZnVsbCB3aGlsZSByZXF1ZXN0aW5nICV6dS10aCBpbnB1dCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciA6IHRvQmVRdWV1ZWQpIHsKKyAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpICE9IE9LKSB7CisgICAgICAgICAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5mcmVlQ29tcG9uZW50U2xvdCgicmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c3RvcCgpIHsKKyAgICBtU3luYy5zdG9wKCk7CisgICAgbUZpcnN0VmFsaWRGcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAobUlucHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgbUlucHV0U3VyZmFjZS5yZXNldCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgIEFMT0dWKCJbJXNdIGZsdXNoIiwgbU5hbWUpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+Pjo6TG9ja2VkIGNvbmZpZ3MobUZsdXNoZWRDb25maWdzKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBpZiAoISh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyUmVhZFZpZXcgdmlldyA9CisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gZmFpbGVkIHRvIG1hcCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhOiAlZCIsIG1OYW1lLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlncy0+cHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSh2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKSk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEgKHNpemU9JXUpIiwgbU5hbWUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgICgqYnVmZmVycyktPmZsdXNoKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgICgqYnVmZmVycyktPmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25Xb3JrRG9uZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhLAorICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKSB7CisgICAgaWYgKGhhbmRsZVdvcmsoc3RkOjptb3ZlKHdvcmspLCBvdXRwdXRGb3JtYXQsIGluaXREYXRhKSkgeworICAgICAgICBtQXZhaWxhYmxlUGlwZWxpbmVDYXBhY2l0eS5mcmVlSW5wdXRTbG90cyhudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbldvcmtEb25lIik7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBib29sIG5ld0lucHV0U2xvdEF2YWlsYWJsZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtSW5wdXRCdWZmZXJzKTsKKyAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gKCpidWZmZXJzKS0+ZXhwaXJlQ29tcG9uZW50QnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIGlmIChuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVJbnB1dFNsb3RzKDEsICJvbklucHV0QnVmZmVyRG9uZSIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6aGFuZGxlV29yaygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKSB7CisgICAgaWYgKCh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggLSBtRmlyc3RWYWxpZEZyYW1lSW5kZXgubG9hZCgpKS5wZWVrKCkgPCAwKSB7CisgICAgICAgIC8vIERpc2NhcmQgZnJhbWVzIGZyb20gcHJldmlvdXMgZ2VuZXJhdGlvbi4KKyAgICAgICAgQUxPR0QoIlslc10gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUKKyAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSB7CisgICAgICAgIG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5LmZyZWVDb21wb25lbnRTbG90KCJoYW5kbGVXb3JrIik7CisgICAgfQorCisgICAgaWYgKHdvcmstPnJlc3VsdCA9PSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0QoIlslc10gZmx1c2hlZCB3b3JrOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiWyVzXSB3b3JrIGZhaWxlZCB0byBjb21wbGV0ZTogJWQiLCBtTmFtZSwgd29yay0+cmVzdWx0KTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKHdvcmstPnJlc3VsdCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgd29ya2xldAorICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiB3b3JrbGV0czogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29yay0+d29ya2xldHMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+ICZ3b3JrbGV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIC8vIE5PVEU6IE1lZGlhQ29kZWMgdXNhZ2Ugc3VwcG9zZWRseSBoYXZlIG9ubHkgb25lIG91dHB1dCBzdHJlYW0uCisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSA+IDF1KSB7CisgICAgICAgIEFMT0dJKCJbJXNdIG9uV29ya0RvbmU6IGluY29ycmVjdCBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnM6ICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSA9PSAxdSkgeworICAgICAgICBidWZmZXIgPSB3b3JrbGV0LT5vdXRwdXQuYnVmZmVyc1swXTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG51bGxwdHIgZm91bmQgaW4gYnVmZmVyczsgaWdub3JlZC4iLCBtTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoIXdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcGFyYW07CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUuYmFjaygpLnN3YXAocGFyYW0pOworICAgICAgICB3b3JrbGV0LT5vdXRwdXQuY29uZmlnVXBkYXRlLnBvcF9iYWNrKCk7CisgICAgICAgIHN3aXRjaCAocGFyYW0tPmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6b3V0cHV0IHJlb3JkZXJEZXB0aDsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlckRlcHRoLnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+c2V0RGVwdGgocmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGRlcHRoIHRvICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogZmFpbGVkIHRvIHJlYWQgcmVvcmRlciBkZXB0aCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6Om91dHB1dCByZW9yZGVyS2V5OworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyS2V5LnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIga2V5IHRvICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIga2V5IiwgbU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdW5yZWNvZ25pemVkIGNvbmZpZyB1cGRhdGUgKCUwOFgpIiwKKyAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJXMiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChvdXRwdXRGb3JtYXQpOworCisgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWVkaWFUeXBlKQorICAgICAgICAgICAgICAgICYmIG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9BVURJT19SQVcpIHsKKyAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgICgqYnVmZmVycyktPnVwZGF0ZVNraXBDdXRCdWZmZXIoc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IEVPUyIsIG1OYW1lKTsKKyAgICB9CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgLy8gV09SS0FST1VORDogYWRqdXN0IG91dHB1dCB0aW1lc3RhbXAgYmFzZWQgb24gY2xpZW50IGlucHV0IHRpbWVzdGFtcCBhbmQgY29kZWMKKyAgICAvLyBpbnB1dCB0aW1lc3RhbXAuIENvZGVjIG91dHB1dCB0aW1lc3RhbXAgKGluIHRoZSB0aW1lc3RhbXAgZmllbGQpIHNoYWxsIGNvcnJlc3BvbmQgdG8KKyAgICAvLyB0aGUgY29kZWMgaW5wdXQgdGltZXN0YW1wLCBidXQgY2xpZW50IG91dHB1dCB0aW1lc3RhbXAgc2hvdWxkIChyZXBvcnRlZCBpbiB0aW1lVXMpCisgICAgLy8gc2hhbGwgY29ycmVzcG9uZCB0byB0aGUgY2xpZW50IGlucHV0IHRpbWVzYW1wIChpbiBjdXN0b21PcmRpbmFsKS4gQnkgdXNpbmcgdGhlCisgICAgLy8gZGVsdGEgYmV0d2VlbiB0aGUgdHdvLCB0aGlzIGFsbG93cyBmb3Igc29tZSB0aW1lc3RhbXAgZGV2aWF0aW9uIC0gZS5nLiBpZiBvbmUgaW5wdXQKKyAgICAvLyBwcm9kdWNlcyBtdWx0aXBsZSBvdXRwdXQuCisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wID0KKyAgICAgICAgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wICsgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsCisgICAgICAgICAgICAgICAgLSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBpbnB1dCAlbGxkLCBjb2RlYyAlbGxkID0+IG91dHB1dCAlbGxkID0+ICVsbGQiLAorICAgICAgICAgIG1OYW1lLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKKyAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgdGltZXN0YW1wLnBlZWtsbCgpKTsKKworICAgIGlmIChpbml0RGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKCpidWZmZXJzKS0+cmVnaXN0ZXJDc2QoaW5pdERhdGEsICZpbmRleCwgJm91dEJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZXN0YW1wLnBlZWsoKSk7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpOworICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogY3NkIGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSk7CisKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBvdXRCdWZmZXIpOworICAgICAgICAgICAgYnVmZmVycy5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiB1bmFibGUgdG8gcmVnaXN0ZXIgY3NkIiwgbU5hbWUpOworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBidWZmZXJzLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYnVmZmVyICYmICFmbGFncykgeworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKKyAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWZmZXItPmluZm8oKSkgeworICAgICAgICAgICAgLy8gVE9ETzogcHJvcGVybHkgdHJhbnNsYXRlIHRoZXNlIHRvIG1ldGFkYXRhCisgICAgICAgICAgICBzd2l0Y2ggKGluZm8tPmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86OkNPUkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgIGlmICgoKEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbyAqKWluZm8uZ2V0KCkpLT52YWx1ZSAmIEMyUGljdHVyZVR5cGVLZXlGcmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5lbXBsYWNlKGJ1ZmZlciwgdGltZXN0YW1wLnBlZWsoKSwgZmxhZ3MsIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgICAgICAvLyBGbHVzaCByZW9yZGVyIHN0YXNoCisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZW5kT3V0cHV0QnVmZmVycygpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNlbmRPdXRwdXRCdWZmZXJzKCkgeworICAgIFJlb3JkZXJTdGFzaDo6RW50cnkgZW50cnk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0QnVmZmVyOworICAgIHNpemVfdCBpbmRleDsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgICAgICBpZiAoIXJlb3JkZXItPmhhc1BlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyZW9yZGVyLT5wb3AoJmVudHJ5KSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKmJ1ZmZlcnMpLT5yZWdpc3RlckJ1ZmZlcihlbnRyeS5idWZmZXIsICZpbmRleCwgJm91dEJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICBPdXRwdXRCdWZmZXJzQXJyYXkgKmFycmF5ID0gKE91dHB1dEJ1ZmZlcnNBcnJheSAqKWJ1ZmZlcnMtPmdldCgpOworICAgICAgICAgICAgICAgIGFycmF5LT5yZWFsbG9jKGVudHJ5LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IHVuYWJsZSB0byByZWdpc3RlciBvdXRwdXQgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPmRlZmVyKGVudHJ5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJzLnVubG9jaygpOworCisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgZW50cnkudGltZXN0YW1wKTsKKyAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJmbGFncyIsIGVudHJ5LmZsYWdzKTsKKyAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IG91dCBidWZmZXIgaW5kZXggPSAlenUgWyVwXSA9PiAlcCArICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCksIG91dEJ1ZmZlci0+ZGF0YSgpLCBvdXRCdWZmZXItPnNpemUoKSk7CisgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZuZXdTdXJmYWNlKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljX3VpbnQzMl90IHN1cmZhY2VHZW5lcmF0aW9uezB9OworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAoZ2V0cGlkKCkgPDwgMTApIHwKKyAgICAgICAgICAgICgoc3VyZmFjZUdlbmVyYXRpb24uZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpICsgMSkKKyAgICAgICAgICAgICAgICAmICgoMSA8PCAxMCkgLSAxKSk7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBpZiAobmV3U3VyZmFjZSkgeworICAgICAgICBuZXdTdXJmYWNlLT5zZXRTY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOworICAgICAgICBuZXdTdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KGtNaW5PdXRwdXRCdWZmZXJBcnJheVNpemUpOworICAgICAgICBwcm9kdWNlciA9IG5ld1N1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgcHJvZHVjZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlslc10gc2V0dGluZyBvdXRwdXQgc3VyZmFjZSB0byBudWxsIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiBvdXRwdXRQb29sSW50ZjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgeworICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworICAgICAgICBvdXRwdXRQb29sSWQgPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICBvdXRwdXRQb29sSW50ZiA9IHBvb2xzLT5vdXRwdXRQb29sSW50ZjsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0UG9vbEludGYpIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICAgICAgb3V0cHV0UG9vbElkLAorICAgICAgICAgICAgICAgIHByb2R1Y2VyLAorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24pICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBzZXRTdXJmYWNlOiBjb21wb25lbnQgc2V0T3V0cHV0U3VyZmFjZSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBvdXRwdXQtPnN1cmZhY2UgPSBuZXdTdXJmYWNlOworICAgICAgICBvdXRwdXQtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKSB7CisgICAgbU1ldGFNb2RlID0gbW9kZTsKK30KKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCkgeworICAgIC8vIEMyX09LIGlzIGFsd2F5cyB0cmFuc2xhdGVkIHRvIE9LLgorICAgIGlmIChjMnMgPT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIE9wZXJhdGlvbi1kZXBlbmRlbnQgdHJhbnNsYXRpb24KKyAgICAvLyBUT0RPOiBBZGQgYXMgbmVjZXNzYXJ5CisgICAgc3dpdGNoIChjMm9wKSB7CisgICAgY2FzZSBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0OgorICAgICAgICBzd2l0Y2ggKGMycykgeworICAgICAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEJhY2t1cCBvcGVyYXRpb24tYWdub3N0aWMgdHJhbnNsYXRpb24KKyAgICBzd2l0Y2ggKGMycykgeworICAgIGNhc2UgQzJfQkFEX0lOREVYOgorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIGNhc2UgQzJfQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgQzJfQkxPQ0tJTkc6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIEMyX0RVUExJQ0FURToKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIGNhc2UgQzJfTk9fSU5JVDoKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgY2FzZSBDMl9OT19NRU1PUlk6CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgY2FzZSBDMl9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBjYXNlIEMyX1RJTUVEX09VVDoKKyAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICBjYXNlIEMyX0JBRF9TVEFURToKKyAgICBjYXNlIEMyX0NBTkNFTEVEOgorICAgIGNhc2UgQzJfQ0FOTk9UX0RPOgorICAgIGNhc2UgQzJfQ09SUlVQVEVEOgorICAgIGNhc2UgQzJfT01JVFRFRDoKKyAgICBjYXNlIEMyX1JFRlVTRUQ6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGMycyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxYmFhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjZGVmaW5lIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2sgeworcHVibGljOgorICAgIHZpcnR1YWwgfkNDb2RlY0NhbGxiYWNrKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgZW51bSBBY3Rpb25Db2RlIGFjdGlvbkNvZGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25PdXRwdXRGcmFtZXNSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtRdWV1ZWQoYm9vbCBlb3MpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpID0gMDsKK307CisKKy8qKgorICogQnVmZmVyQ2hhbm5lbEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIENDb2RlYy4KKyAqLworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbAorICAgIDogcHVibGljIEJ1ZmZlckNoYW5uZWxCYXNlLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDQ29kZWNCdWZmZXJDaGFubmVsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ0NvZGVjQnVmZmVyQ2hhbm5lbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+ICZjYWxsYmFjayk7CisgICAgdmlydHVhbCB+Q0NvZGVjQnVmZmVyQ2hhbm5lbCgpOworCisgICAgLy8gQnVmZmVyQ2hhbm5lbEJhc2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW5kZXJPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2NhcmRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGdldElucHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRob2RzIGJlbG93IGFyZSBpbnRlcmZhY2UgZm9yIENDb2RlYyB0byB1c2UuCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXBvbmVudCBvYmplY3QgZm9yIGJ1ZmZlciBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgb3V0cHV0IGdyYXBoaWMgc3VyZmFjZSBmb3IgcmVuZGVyaW5nLgorICAgICAqLworICAgIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgLyoqCisgICAgICogU2V0IEdyYXBoaWNCdWZmZXJTb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdGhlIGNvbXBvbmVudCBleHRyYWN0cyBpbnB1dAorICAgICAqIGJ1ZmZlcnMuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWwgRU9TIHRvIGlucHV0IHN1cmZhY2UuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworCisgICAgLyoqCisgICAgICogU2V0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpOworCisgICAgLyoqCisgICAgICogU3RhcnQgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKKyAgICAgKiBidWZmZXJzIGJlZm9yZSB0aGlzIGNhbGwgaGFzIGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzdGFydChjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGluaXRpYWwgaW5wdXQgYnVmZmVycyB0byBiZSBmaWxsZWQgYnkgY2xpZW50LgorICAgICAqLworICAgIHN0YXR1c190IHJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCisgICAgICogYnVmZmVycyBhZnRlciB0aGlzIGNhbGwsIHVudGlsIHN0YXJ0KCkgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZvaWQgc3RvcCgpOworCisgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yayk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgaW5wdXQgY2xpZW50IGFib3V0IHdvcmsgZG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrSXRlbXMgICBmaW5pc2hlZCB3b3JrIGl0ZW0uCisgICAgICogQHBhcmFtIG91dHB1dEZvcm1hdCBuZXcgb3V0cHV0IGZvcm1hdCBpZiBpdCBoYXMgY2hhbmdlZCwgb3RoZXJ3aXNlIG51bGxwdHIKKyAgICAgKiBAcGFyYW0gaW5pdERhdGEgICAgbmV3IGluaXQgZGF0YSAoQ1NEKSBpZiBpdCBoYXMgY2hhbmdlZCwgb3RoZXJ3aXNlIG51bGxwdHIKKyAgICAgKiBAcGFyYW0gbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzIHRoZSBudW1iZXIgb2YgaW5wdXQgYnVmZmVycyB0aGF0IGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBmb3IgdGhlIGZpcnN0IHRpbWUgKG5vdCBwcmV2aW91c2x5IHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJEb25lKCkpLgorICAgICAqLworICAgIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEsCisgICAgICAgICAgICBzaXplX3QgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYW4gaW5wdXQgYnVmZmVyIGF2YWlsYWJsZSBmb3IgdGhlIGNsaWVudCBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkCisgICAgICogYnkgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciBUaGUgYnVmZmVyIHRoYXQgYmVjb21lcyB1bnVzZWQuCisgICAgICovCisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpOworCisgICAgZW51bSBNZXRhTW9kZSB7CisgICAgICAgIE1PREVfTk9ORSwKKyAgICAgICAgTU9ERV9BTlcsCisgICAgfTsKKworICAgIHZvaWQgc2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSk7CisKKyAgICAvLyBJbnRlcm5hbCBjbGFzc2VzCisgICAgY2xhc3MgQnVmZmVyczsKKyAgICBjbGFzcyBJbnB1dEJ1ZmZlcnM7CisgICAgY2xhc3MgT3V0cHV0QnVmZmVyczsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBRdWV1ZUd1YXJkOworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBtdXRleC1saWtlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKgorICAgICAqIC0gQXQgU1RPUFBFRCBzdGF0ZSAoaW5pdGlhbCwgb3IgYWZ0ZXIgc3RvcCgpKQorICAgICAqICAgLSBRdWV1ZUd1YXJkIG9iamVjdCBnZXRzIGNyZWF0ZWQgYXQgU1RPUFBFRCBzdGF0ZSwgYW5kIHRoZSBjbGllbnQgaXMKKyAgICAgKiAgICAgc3VwcG9zZWQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgorICAgICAqIC0gQXQgUlVOTklORyBzdGF0ZSAoYWZ0ZXIgc3RhcnQoKSkKKyAgICAgKiAgIC0gRWFjaCBRdWV1ZUd1YXJkIG9iamVjdAorICAgICAqLworICAgIGNsYXNzIFF1ZXVlU3luYyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQXQgY29uc3RydWN0aW9uIHRoZSBzeW5jIG9iamVjdCBpcyBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFF1ZXVlU3luYygpIHt9CisgICAgICAgIH5RdWV1ZVN5bmMoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zaXRpb24gdG8gUlVOTklORyBzdGF0ZSB3aGVuIHN0b3BwZWQuIE5vLW9wIGlmIGFscmVhZHkgaW4gUlVOTklORworICAgICAgICAgKiBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RhcnQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQXQgUlVOTklORyBzdGF0ZSwgd2FpdCB1bnRpbCBhbGwgUXVldWVHdWFyZCBvYmplY3QgY3JlYXRlZCBkdXJpbmcKKyAgICAgICAgICogUlVOTklORyBzdGF0ZSBhcmUgZGVzdHJveWVkLCBhbmQgdGhlbiB0cmFuc2l0aW9uIHRvIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqIE5vLW9wIGlmIGFscmVhZHkgaW4gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc3RvcCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgTXV0ZXggbUd1YXJkTG9jazsKKworICAgICAgICBzdHJ1Y3QgQ291bnRlciB7CisgICAgICAgICAgICBpbmxpbmUgQ291bnRlcigpIDogdmFsdWUoLTEpIHt9CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQ29uZGl0aW9uIGNvbmQ7CisgICAgICAgIH07CisgICAgICAgIE11dGV4ZWQ8Q291bnRlcj4gbUNvdW50OworCisgICAgICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOworICAgIH07CisKKyAgICBjbGFzcyBRdWV1ZUd1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFF1ZXVlR3VhcmQoUXVldWVTeW5jICZzeW5jKTsKKyAgICAgICAgflF1ZXVlR3VhcmQoKTsKKyAgICAgICAgaW5saW5lIGJvb2wgaXNSdW5uaW5nKCkgeyByZXR1cm4gbVJ1bm5pbmc7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFF1ZXVlU3luYyAmbVN5bmM7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB2b2lkIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBoYW5kbGVXb3JrKAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CisgICAgdm9pZCBzZW5kT3V0cHV0QnVmZmVycygpOworCisgICAgUXVldWVTeW5jIG1TeW5jOworICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgIGludDMyX3QgbUhlYXBTZXFOdW07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgY29tcG9uZW50IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY29tcG9uZW50IG5hbWUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+IG1DQ29kZWNDYWxsYmFjazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1JbnB1dEFsbG9jYXRvcjsKKyAgICBRdWV1ZVN5bmMgbVF1ZXVlU3luYzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1QYXJhbXNUb0JlU2V0OworCisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj4gbUlucHV0QnVmZmVyczsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+IG1GbHVzaGVkQ29uZmlnczsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj4gbU91dHB1dEJ1ZmZlcnM7CisKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRmlyc3RWYWxpZEZyYW1lSW5kZXg7CisKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1ha2VNZW1vcnlEZWFsZXIoc2l6ZV90IGhlYXBTaXplKTsKKworICAgIHN0cnVjdCBPdXRwdXRTdXJmYWNlIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB9OworICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT4gbU91dHB1dFN1cmZhY2U7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29scyB7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlucHV0QWxsb2NhdG9ySWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gaW5wdXRQb29sOworICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBvdXRwdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+IG91dHB1dFBvb2xJbnRmOworICAgIH07CisgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPiBtQmxvY2tQb29sczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworCisgICAgTWV0YU1vZGUgbU1ldGFNb2RlOworCisgICAgLy8gUGlwZWxpbmVDYXBhY2l0eSBpcyB1c2VkIGluIHRoZSBpbnB1dCBidWZmZXIgZ2F0aW5nIGxvZ2ljLgorICAgIC8vCisgICAgLy8gVGhlcmUgYXJlIHRocmVlIGNyaXRlcmlhIHRoYXQgbmVlZCB0byBiZSBtZXQgYmVmb3JlCisgICAgLy8gb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpIGlzIGNhbGxlZDoKKyAgICAvLyAxLiBUaGUgbnVtYmVyIG9mIGlucHV0IGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQgYnkKKyAgICAvLyAgICBDQ29kZWNCdWZmZXJDaGFubmVsIGJ1dCBub3QgcmV0dXJuZWQgdmlhIG9uV29ya0RvbmUoKSBvcgorICAgIC8vICAgIG9uSW5wdXRCdWZmZXJEb25lKCkgZG9lcyBub3QgZXhjZWVkIGEgY2VydGFpbiBsaW1pdC4gKExldCB1cyBjYWxsIHRoaXMKKyAgICAvLyAgICBudW1iZXIgdGhlICJpbnB1dCIgY2FwYWNpdHkuKQorICAgIC8vIDIuIFRoZSBudW1iZXIgb2Ygd29yayBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZWNlaXZlZCBieQorICAgIC8vICAgIENDb2RlY0J1ZmZlckNoYW5uZWwgd2hvc2Ugb3V0cHV0cyBoYXZlIG5vdCBiZWVuIHJldHVybmVkIGZyb20gdGhlCisgICAgLy8gICAgY29tcG9uZW50IChieSBjYWxsaW5nIG9uV29ya0RvbmUoKSkgZG9lcyBub3QgZXhjZWVkIGEgY2VydGFpbiBsaW1pdC4KKyAgICAvLyAgICAoTGV0IHVzIGNhbGwgdGhpcyB0aGUgImNvbXBvbmVudCIgY2FwYWNpdHkuKQorICAgIC8vCisgICAgLy8gVGhlc2UgdGhyZWUgY3JpdGVyaWEgZ3VhcmFudGVlIHRoYXQgYSBuZXcgaW5wdXQgYnVmZmVyIHRoYXQgYXJyaXZlcyBmcm9tCisgICAgLy8gdGhlIGludm9jYXRpb24gb2Ygb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpIHdpbGwgbm90CisgICAgLy8gMS4gb3ZlcmxvYWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbCdzIGlucHV0IGJ1ZmZlcnM7CisgICAgLy8gMi4gb3ZlcmxvYWQgdGhlIGNvbXBvbmVudDsgb3IKKyAgICAvLworICAgIHN0cnVjdCBQaXBlbGluZUNhcGFjaXR5IHsKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhdmFpbGFibGUgaW5wdXQgY2FwYWNpdHkuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludCBpbnB1dDsKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29tcG9uZW50IGNhcGFjaXR5LgorICAgICAgICBzdGQ6OmF0b21pY19pbnQgY29tcG9uZW50OworCisgICAgICAgIFBpcGVsaW5lQ2FwYWNpdHkoKTsKKyAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZXMgb2YgI2lucHV0IGFuZCAjY29tcG9uZW50LgorICAgICAgICB2b2lkIGluaXRpYWxpemUoaW50IG5ld0lucHV0LCBpbnQgbmV3Q29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmV3TmFtZSA9ICI8VU5LTk9XTiBDT01QT05FTlQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlclRhZyA9IG51bGxwdHIpOworCisgICAgICAgIC8vIFJldHVybiB0cnVlIGFuZCBkZWNyZWFzZSAjaW5wdXQgYW5kICNjb21wb25lbnQgYnkgb25lIGlmCisgICAgICAgIC8vIHRoZXkgYXJlIGFsbCBncmVhdGVyIHRoYW4gemVybzsgcmV0dXJuIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gY2FsbGVyVGFnIGlzIHVzZWQgZm9yIGxvZ2dpbmcgb25seS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gYWxsb2NhdGUoKSBpcyBjYWxsZWQgYnkgQ0NvZGVjQnVmZmVyQ2hhbm5lbCB0byBjaGVjayB3aGV0aGVyIGl0IGNhbgorICAgICAgICAvLyByZWNlaXZlIGFub3RoZXIgaW5wdXQgYnVmZmVyLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUsCisgICAgICAgIC8vIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKSBhbmQgb25PdXRwdXRCdWZmZXJBdmFpbGFibGUoKSBjYW4gYmUgY2FsbGVkCisgICAgICAgIC8vIGFmdGVyd2FyZHMuCisgICAgICAgIGJvb2wgYWxsb2NhdGUoY29uc3QgY2hhciogY2FsbGVyVGFnID0gbnVsbHB0cik7CisKKyAgICAgICAgLy8gSW5jcmVhc2UgI2lucHV0IGFuZCAjY29tcG9uZW50IGJ5IG9uZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gY2FsbGVyVGFnIGlzIHVzZWQgZm9yIGxvZ2dpbmcgb25seS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gZnJlZSgpIGlzIGNhbGxlZCBieSBDQ29kZWNCdWZmZXJDaGFubmVsIGFmdGVyIGFsbG9jYXRlKCkgcmV0dXJucyB0cnVlCisgICAgICAgIC8vIGJ1dCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgY2Fubm90IGJlIGNhbGxlZCBmb3IgYW55IHJlYXNvbnMuIEl0CisgICAgICAgIC8vIGVzc2VudGlhbGx5IHVuZG9lcyBhbiBhbGxvY2F0ZSgpIGNhbGwuCisgICAgICAgIHZvaWQgZnJlZShjb25zdCBjaGFyKiBjYWxsZXJUYWcgPSBudWxscHRyKTsKKworICAgICAgICAvLyBJbmNyZWFzZSAjaW5wdXQgYnkgQHAgbnVtRGlzY2FyZGVkSW5wdXRCdWZmZXJzLgorICAgICAgICAvLworICAgICAgICAvLyBjYWxsZXJUYWcgaXMgdXNlZCBmb3IgbG9nZ2luZyBvbmx5LgorICAgICAgICAvLworICAgICAgICAvLyBmcmVlSW5wdXRTbG90cygpIGlzIGNhbGxlZCBieSBDQ29kZWNCdWZmZXJDaGFubmVsIHdoZW4gb25Xb3JrRG9uZSgpCisgICAgICAgIC8vIG9yIG9uSW5wdXRCdWZmZXJEb25lKCkgaXMgY2FsbGVkLiBAcCBudW1EaXNjYXJkZWRJbnB1dEJ1ZmZlcnMgaXMKKyAgICAgICAgLy8gcHJvdmlkZWQgaW4gb25Xb3JrRG9uZSgpLCBhbmQgaXMgMSBpbiBvbklucHV0QnVmZmVyRG9uZSgpLgorICAgICAgICBpbnQgZnJlZUlucHV0U2xvdHMoc2l6ZV90IG51bURpc2NhcmRlZElucHV0QnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbGxlclRhZyA9IG51bGxwdHIpOworCisgICAgICAgIC8vIEluY3JlYXNlICNjb21wb25lbnQgYnkgb25lIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgdmFsdWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIGNhbGxlclRhZyBpcyB1c2VkIGZvciBsb2dnaW5nIG9ubHkuCisgICAgICAgIC8vCisgICAgICAgIC8vIGZyZWVDb21wb25lbnRTbG90KCkgaXMgY2FsbGVkIGJ5IENDb2RlY0J1ZmZlckNoYW5uZWwgd2hlbgorICAgICAgICAvLyBvbldvcmtEb25lKCkgaXMgY2FsbGVkLgorICAgICAgICBpbnQgZnJlZUNvbXBvbmVudFNsb3QoY29uc3QgY2hhciogY2FsbGVyVGFnID0gbnVsbHB0cik7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBDb21wb25lbnQgbmFtZS4gVXNlZCBmb3IgbG9nZ2luZy4KKyAgICAgICAgY29uc3QgY2hhciogbU5hbWU7CisgICAgfTsKKyAgICBQaXBlbGluZUNhcGFjaXR5IG1BdmFpbGFibGVQaXBlbGluZUNhcGFjaXR5OworCisgICAgY2xhc3MgUmVvcmRlclN0YXNoIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgICAgICBpbmxpbmUgRW50cnkoKSA6IGJ1ZmZlcihudWxscHRyKSwgdGltZXN0YW1wKDApLCBmbGFncygwKSwgb3JkaW5hbCh7MCwgMCwgMH0pIHt9CisgICAgICAgICAgICBpbmxpbmUgRW50cnkoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmIsCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvKQorICAgICAgICAgICAgICAgIDogYnVmZmVyKGIpLCB0aW1lc3RhbXAodCksIGZsYWdzKGYpLCBvcmRpbmFsKG8pIHt9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKyAgICAgICAgICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICAgICAgfTsKKworICAgICAgICBSZW9yZGVyU3Rhc2goKTsKKworICAgICAgICB2b2lkIGNsZWFyKCk7CisgICAgICAgIHZvaWQgc2V0RGVwdGgodWludDMyX3QgZGVwdGgpOworICAgICAgICB2b2lkIHNldEtleShDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBrZXkpOworICAgICAgICBib29sIHBvcChFbnRyeSAqZW50cnkpOworICAgICAgICB2b2lkIGVtcGxhY2UoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCk7CisgICAgICAgIHZvaWQgZGVmZXIoY29uc3QgRW50cnkgJmVudHJ5KTsKKyAgICAgICAgYm9vbCBoYXNQZW5kaW5nKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1QZW5kaW5nOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1TdGFzaDsKKyAgICAgICAgdWludDMyX3QgbURlcHRoOworICAgICAgICBDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBtS2V5OworCisgICAgICAgIGJvb2wgbGVzcyhjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMSwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzIpOworICAgIH07CisgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+IG1SZW9yZGVyU3Rhc2g7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIG1JbnB1dE1ldEVvczsKKworICAgIGlubGluZSBib29sIGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSB7CisgICAgICAgIHJldHVybiBtQ3J5cHRvICE9IG51bGxwdHIgfHwgbURlc2NyYW1ibGVyICE9IG51bGxwdHI7CisgICAgfQorfTsKKworLy8gQ29udmVyc2lvbiBvZiBhIGMyX3N0YXR1c190IHZhbHVlIHRvIGEgc3RhdHVzX3QgdmFsdWUgbWF5IGRlcGVuZCBvbiB0aGUKKy8vIG9wZXJhdGlvbiB0aGF0IHJldHVybnMgdGhlIGMyX3N0YXR1c190IHZhbHVlLgorZW51bSBjMl9vcGVyYXRpb25fdCB7CisgICAgQzJfT1BFUkFUSU9OX05PTkUsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9jcmVhdGVCbG9ja1Bvb2wsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kZXN0cm95QmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kcmFpbiwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2ZsdXNoLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcXVldWUsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9yZWxlYXNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVzZXQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zZXRPdXRwdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdG9wLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jb3B5QnVmZmVyLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVDb21wb25lbnQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlSW50ZXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfY29uZmlnLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnksCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFBhcmFtcywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5U3VwcG9ydGVkVmFsdWVzLAorICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VfY29ubmVjdFRvQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VDb25uZWN0aW9uX2Rpc2Nvbm5lY3QsCit9OworCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wID0gQzJfT1BFUkFUSU9OX05PTkUpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKQEAgLTAsMCArMSwxNjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWNDb25maWciCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQ29uZmlnLmgiCisjaW5jbHVkZSAiQ29kZWMyTWFwcGVyLmgiCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCA2NCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSAxICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKC0xKSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QgICAgICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENDb2RlY0NvbmZpZworCituYW1lc3BhY2UgeworCisvKioKKyAqIG1hcHBpbmcgYmV0d2VlbiBTREsgYW5kIENvZGVjIDIuMCBjb25maWd1cmF0aW9ucy4KKyAqLworc3RydWN0IENvbmZpZ01hcHBlciB7CisgICAgLyoqCisgICAgICogVmFsdWUgbWFwcGVyIChDMlZhbHVlID0+IEMyVmFsdWUpCisgICAgICovCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPEMyVmFsdWUoQzJWYWx1ZSk+IE1hcHBlcjsKKworICAgIC8vLyBzaG9ydGhhbmQKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZzo6RG9tYWluIERvbWFpbjsKKworICAgIENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyBtZWRpYUtleSwgQzJTdHJpbmcgYzJzdHJ1Y3QsIEMyU3RyaW5nIGMyZmllbGQpCisgICAgICAgIDogbURvbWFpbihEb21haW46OkFMTCksIG1NZWRpYUtleShtZWRpYUtleSksIG1TdHJ1Y3QoYzJzdHJ1Y3QpLCBtRmllbGQoYzJmaWVsZCkgeyB9CisKKyAgICAvLy8gTGltaXRzIHRoaXMgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBkb21haW4KKyAgICBDb25maWdNYXBwZXIgJmxpbWl0VG8odWludDMyX3QgZG9tYWluKSB7CisgICAgICAgIEMyX0NIRUNLKGRvbWFpbiAmIERvbWFpbjo6R1VBUkRfQklUKTsKKyAgICAgICAgbURvbWFpbiA9IERvbWFpbihtRG9tYWluICYgZG9tYWluKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA9PiBDb2RlYyAyLjAgbWFwcGVyIChzaG91bGQgbm90IGJlIGluIHRoZSBTREsgZm9ybWF0KQorICAgIENvbmZpZ01hcHBlciAmd2l0aE1hcHBlcihNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXJzKE1hcHBlciBtYXBwZXIsIE1hcHBlciByZXZlcnNlKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgbVJldmVyc2UgPSByZXZlcnNlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIEFkZHMgU0RLIDw9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGVycyBiYXNlZCBvbiBDMk1hcHBlcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMyVHlwZSwgdHlwZW5hbWUgU2RrVHlwZT1pbnQzMl90PgorICAgIENvbmZpZ01hcHBlciAmd2l0aEMyTWFwcGVycygpIHsKKyAgICAgICAgQzJfQ0hFQ0soIW1NYXBwZXIpOworICAgICAgICBDMl9DSEVDSyghbVJldmVyc2UpOworICAgICAgICBtTWFwcGVyID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmc2RrVmFsdWUpICYmIEMyTWFwcGVyOjptYXAoc2RrVmFsdWUsICZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMlZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVJldmVyc2UgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgU2RrVHlwZSBzZGtWYWx1ZTsKKyAgICAgICAgICAgIEMyVHlwZSBjMlZhbHVlOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxDMlR5cGU+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyVmFsdWUpICYmIEMyTWFwcGVyOjptYXAoYzJWYWx1ZSwgJnNka1ZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGtWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIFNESyB2YWx1ZXMgaW4gYW4gQU1lc3NhZ2UgdG8gYSBzdWl0YWJsZSBDMlZhbHVlLgorICAgIEMyVmFsdWUgbWFwRnJvbU1lc3NhZ2UoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZpdGVtKSBjb25zdCB7CisgICAgICAgIEMyVmFsdWUgdmFsdWU7CisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBkb3VibGUgZG91YmxlVmFsdWU7CisgICAgICAgIGlmIChpdGVtLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGludDMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQ2NFZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZmxvYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gZmxvYXRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmRvdWJsZVZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSAoZmxvYXQpZG91YmxlVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLnR5cGUoKSAhPSBDMlZhbHVlOjpOT19JTklUICYmIG1NYXBwZXIpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbU1hcHBlcih2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vLyBNYXBzIGZyb20gYSBDMlZhbHVlIHRvIGFuIFNESyB2YWx1ZSBpbiBhbiBBTWVzc2FnZS4KKyAgICBBTWVzc2FnZTo6SXRlbURhdGEgbWFwVG9NZXNzYWdlKEMyVmFsdWUgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgdWludDMyX3QgdWludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgdWludDY0X3QgdWludDY0VmFsdWU7CisgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtUmV2ZXJzZSkgeworICAgICAgICAgICAgdmFsdWUgPSBtUmV2ZXJzZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLmdldCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmdWludDMyVmFsdWUpICYmIHVpbnQzMlZhbHVlIDw9IHVpbnQzMl90KElOVDMyX01BWCkpIHsKKyAgICAgICAgICAgIC8vIFNESyBkb2VzIG5vdCBzdXBwb3J0IHVuc2lnbmVkIHZhbHVlcworICAgICAgICAgICAgaXRlbS5zZXQoKGludDMyX3QpdWludDMyVmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGludDY0VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmdWludDY0VmFsdWUpICYmIHVpbnQ2NFZhbHVlIDw9IHVpbnQ2NF90KElOVDY0X01BWCkpIHsKKyAgICAgICAgICAgIC8vIFNESyBkb2VzIG5vdCBzdXBwb3J0IHVuc2lnbmVkIHZhbHVlcworICAgICAgICAgICAgaXRlbS5zZXQoKGludDY0X3QpdWludDY0VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmZmxvYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGZsb2F0VmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIERvbWFpbiBkb21haW4oKSBjb25zdCB7IHJldHVybiBtRG9tYWluOyB9CisgICAgc3RkOjpzdHJpbmcgbWVkaWFLZXkoKSBjb25zdCB7IHJldHVybiBtTWVkaWFLZXk7IH0KKyAgICBzdGQ6OnN0cmluZyBwYXRoKCkgY29uc3QgeyByZXR1cm4gbUZpZWxkLnNpemUoKSA/IG1TdHJ1Y3QgKyAnLicgKyBtRmllbGQgOiBtU3RydWN0OyB9CisgICAgTWFwcGVyIG1hcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1NYXBwZXI7IH0KKyAgICBNYXBwZXIgcmV2ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIG1SZXZlcnNlOyB9CisKK3ByaXZhdGU6CisgICAgRG9tYWluIG1Eb21haW47ICAgICAgICAgLy8vPCBwYXJhbWV0ZXIgZG9tYWluIChtYXNrKSBjb250YWluaW5nIHBvcnQsIGtpbmQgYW5kIGNvbmZpZyBkb21haW5zCisgICAgc3RkOjpzdHJpbmcgbU1lZGlhS2V5OyAgLy8vPCBTREsga2V5CisgICAgQzJTdHJpbmcgbVN0cnVjdDsgICAgICAgLy8vPCBDb2RlYyAyLjAgc3RydWN0IG5hbWUKKyAgICBDMlN0cmluZyBtRmllbGQ7ICAgICAgICAvLy88IENvZGVjIDIuMCBmaWVsZCBuYW1lCisgICAgTWFwcGVyIG1NYXBwZXI7ICAgICAgICAgLy8vPCBvcHRpb25hbCBTREsgPT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcgorICAgIE1hcHBlciBtUmV2ZXJzZTsgICAgICAgIC8vLzwgb3B0aW9uYWwgQ29kZWMgMi4wID0+IFNESyB2YWx1ZSBtYXBwZXIKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQT1JULCB0eXBlbmFtZSBTVFJFQU0+CitBU3RyaW5nIFF1ZXJ5TWVkaWFUeXBlSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgQVN0cmluZyBtZWRpYVR5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHt9LCB7IFBPUlQ6OlBBUkFNX1RZUEUsIFNUUkVBTTo6UEFSQU1fVFlQRSB9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVzIiwgYXNTdHJpbmcoYzJlcnIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQT1JUICpwb3J0TWVkaWFUeXBlID0KKyAgICAgICAgICAgIFBPUlQ6OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgIGlmIChwb3J0TWVkaWFUeXBlKSB7CisgICAgICAgICAgICBtZWRpYVR5cGUgPSBBU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBzdHJubGVuKHBvcnRNZWRpYVR5cGUtPm0udmFsdWUsIHBvcnRNZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTVFJFQU0gKnN0cmVhbU1lZGlhVHlwZSA9IFNUUkVBTTo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1NZWRpYVR5cGUpIHsKKyAgICAgICAgICAgICAgICBtZWRpYVR5cGUgPSBBU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmxlbihzdHJlYW1NZWRpYVR5cGUtPm0udmFsdWUsIHN0cmVhbU1lZGlhVHlwZS0+ZmxleENvdW50KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgicmVhZCBtZWRpYSB0eXBlOiAlcyIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG1lZGlhVHlwZTsKK30KKworQVN0cmluZyBRdWVyeU1lZGlhVHlwZSgKKyAgICAgICAgYm9vbCBpbnB1dCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgdHlwZWRlZiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nIFA7CisgICAgdHlwZWRlZiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmcgUzsKKyAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIFF1ZXJ5TWVkaWFUeXBlSW1wbDxQOjppbnB1dCwgUzo6aW5wdXQ+KGNvbXBvbmVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFF1ZXJ5TWVkaWFUeXBlSW1wbDxQOjpvdXRwdXQsIFM6Om91dHB1dD4oY29tcG9uZW50KTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvKioKKyAqIFNldCBvZiBzdGFuZGFyZCBwYXJhbWV0ZXJzIHVzZWQgYnkgQ0NvZGVjIHRoYXQgYXJlIGV4cG9zZWQgdG8gTWVkaWFDb2RlYy4KKyAqLworc3RydWN0IFN0YW5kYXJkUGFyYW1zIHsKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZzo6RG9tYWluIERvbWFpbjsKKworICAgIC8vIHN0YW5kYXJkIChNZWRpYUNvZGVjKSBwYXJhbXMgYXJlIGtleWVkIGJ5IG1lZGlhIGZvcm1hdCBrZXkKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nIFNka0tleTsKKworICAgIC8vLyB1c2VkIHRvIHJldHVybiByZWZlcmVuY2UgdG8gbm8gY29uZmlnIG1hcHBlcnMgaW4gZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleQorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IE5PX01BUFBFUlM7CisKKyAgICAvLy8gUmV0dXJucyBDb2RlYyAyLjAgZXF1aXZhbGVudCBwYXJhbWV0ZXJzIGZvciBhbiBTREsgZm9ybWF0IGtleS4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+ICZnZXRDb25maWdNYXBwZXJzRm9yU2RrS2V5KHN0ZDo6c3RyaW5nIGtleSkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNvbmZpZ01hcHBlcnMuZmluZChrZXkpOworICAgICAgICBpZiAoaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJubyBjMiBlcXVpdmFsZW50cyBmb3IgJXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUFQUEVSUzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZm91bmQgJXp1IGVxcyBmb3IgJXMiLCBpdC0+c2Vjb25kLnNpemUoKSwga2V5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgU0RLIDw9PiBDb2RlYyAyLjAgcGFyYW1ldGVyIG1hcHBpbmcuIE11bHRpcGxlIENvZGVjIDIuMCBwYXJhbWV0ZXJzIG1heSBtYXAgdG8gYQorICAgICAqIHNpbmdsZSBTREsga2V5LCBpbiB3aGljaCBjYXNlIHRoZXkgc2hhbGwgYmUgb3JkZXJlZCBmcm9tIGxlYXN0IGF1dGhvcml0YXRpdmUgdG8gbW9zdAorICAgICAqIGF1dGhvcml0YXRpdmUuIFdoZW4gY29uc3RydWN0aW5nIFNESyBmb3JtYXRzLCB0aGUgbGFzdCBtYXBwZWQgQ29kZWMgMi4wIHBhcmFtZXRlciB0aGF0CisgICAgICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQgd2lsbCBkZXRlcm1pbmUgdGhlIGV4cG9zZWQgdmFsdWUuIChUT0RPOiBwZXJoYXBzIHJlc3RyaWN0IHRoaXMKKyAgICAgKiBieSBkb21haW4uKQorICAgICAqLworICAgIHZvaWQgYWRkKGNvbnN0IENvbmZpZ01hcHBlciAmY20pIHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoY20ubWVkaWFLZXkoKSk7CisgICAgICAgIEFMT0dWKCIlYyVjJWMlYyAlYyVjJWMgJTA0eCAlOXMgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19JTlBVVCkgPyAnSScgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19PVVRQVVQpID8gJ08nIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfQ09ERUQpID8gJ0MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkFXKSA/ICdSJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPTkZJRykgPyAnYycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19QQVJBTSkgPyAncCcgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19SRUFEKSA/ICdyJyA6ICcgJyksCisgICAgICAgICAgICAgIGNtLmRvbWFpbigpLAorICAgICAgICAgICAgICBpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSA/ICJhZGRpbmciIDogImV4dGVuZGluZyIsCisgICAgICAgICAgICAgIGNtLm1lZGlhS2V5KCkuY19zdHIoKSwgY20ucGF0aCgpLmNfc3RyKCkpOworICAgICAgICBpZiAoaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gZXFzID0geyBjbSB9OworICAgICAgICAgICAgbUNvbmZpZ01hcHBlcnMuZW1wbGFjZShjbS5tZWRpYUtleSgpLCBlcXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQtPnNlY29uZC5wdXNoX2JhY2soY20pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgcGF0aHMgZm9yIGEgc3BlY2lmaWMgZG9tYWluLgorICAgICAqCisgICAgICogXHBhcmFtIGFueSBtYXhpbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBkb21haW5zCisgICAgICogICAgICAgICAgICBpbiB0aGUgbWFzay4KKyAgICAgKiBccGFyYW0gYWxsIG1pbmltdW0gZG9tYWluIG1hc2suIFJldHVybmVkIHBhcmFtZXRlcnMgbXVzdCBtYXRjaCBhbGwgb2YgdGhlIGRvbWFpbnMgaW4gdGhlCisgICAgICogICAgICAgICAgICBtYXNrLiBUaGlzIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIGJpdHMgb2YgdGhlIG1heGltdW0gbWFzay4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0UGF0aHNGb3JEb21haW4oCisgICAgICAgICAgICBEb21haW4gYW55LCBEb21haW4gYWxsID0gRG9tYWluOjpBTEwpIGNvbnN0IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1Db25maWdNYXBwZXJzKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZmlsdGVyaW5nICVzICV4ICV4ICV4ICV4IiwgY20ucGF0aCgpLmNfc3RyKCksIGNtLmRvbWFpbigpLCBhbnksCisgICAgICAgICAgICAgICAgICAgICAgICAoY20uZG9tYWluKCkgJiBhbnkpLCAoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgYW55KSAmJiAoKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSA9PSAoYW55ICYgYWxsKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2hfYmFjayhjbS5wYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgU0RLIDw9PiBDb2RlYyAyLjAgbWFwcGluZ3MuCisgICAgICoKKyAgICAgKiBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggYmV0dGVyIG1ldGhvZHMgYXMgdGhpcyBleHBvc2VzIHRoZSBpbm5lciBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgY29uc3Qgc3RkOjptYXA8U2RrS2V5LCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiBnZXRLZXlzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbmZpZ01hcHBlcnM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gbUNvbmZpZ01hcHBlcnM7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IFN0YW5kYXJkUGFyYW1zOjpOT19NQVBQRVJTOworCisKK0NDb2RlY0NvbmZpZzo6Q0NvZGVjQ29uZmlnKCkKKyAgICA6IG1JbnB1dEZvcm1hdChuZXcgQU1lc3NhZ2UpLAorICAgICAgbU91dHB1dEZvcm1hdChuZXcgQU1lc3NhZ2UpLAorICAgICAgbVVzaW5nU3VyZmFjZShmYWxzZSkgeyB9CisKK3ZvaWQgQ0NvZGVjQ29uZmlnOjppbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKSB7CisgICAgdHlwZWRlZiBEb21haW4gRDsKKyAgICBtU3RhbmRhcmRQYXJhbXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YW5kYXJkUGFyYW1zPigpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25maWdNYXBwZXIgJik+IGFkZCA9CisgICAgICAgIFtwYXJhbXMgPSBtU3RhbmRhcmRQYXJhbXNdKGNvbnN0IENvbmZpZ01hcHBlciAmY20pIHsKKyAgICAgICAgICAgIHBhcmFtcy0+YWRkKGNtKTsKKyAgICB9OworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25maWdNYXBwZXIgJik+IGRlcHJlY2F0ZWQgPSBhZGQ7CisKKyAgICAvLyBhbGxvdyBpbnQzMiBvciBmbG9hdCBTREsgdmFsdWVzIGFuZCByZXByZXNlbnQgdGhlbSBhcyBmbG9hdAorICAgIENvbmZpZ01hcHBlcjo6TWFwcGVyIG1ha2VGbG9hdCA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBpMzIgdG8gZmxvYXQKKyAgICAgICAgaW50MzJfdCBpMzJWYWx1ZTsKKyAgICAgICAgZmxvYXQgZnBWYWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZpMzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpaTMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAodi5nZXQoJmZwVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZnBWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgIH07CisKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBuZWdhdGUgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIC12YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgIH07CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NSU1FLCAgICAgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSwgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQgJiBEOjpSRUFEKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFLCAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6Ok9VVFBVVCAmIEQ6OlJFQUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6T1VUUFVUKSk7CisgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHB1dCB0aGUgYml0cmF0ZSBpbiB0aGUgbWF4IGJpdHJhdGUgZmllbGQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfQklUX1JBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpSRUFEICYgRDo6T1VUUFVUKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6OlBBUkFNKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQklUUkFURV9NT0RFLCBDMl9QQVJBTUtFWV9CSVRSQVRFX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgbW9kZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZtb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkgYW5kIG5ldyBtb2RlcworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9CSVRSQVRFX01PREUsICJjb2RlZC5iaXRyYXRlLW1vZGUiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZSQU1FX1JBVEUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPKQorICAgICAgICAud2l0aE1hcHBlcnMobWFrZUZsb2F0LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gcmVhZCBiYWNrIGFsd2F5cyBhcyBpbnQKKyAgICAgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpJTlBVVCkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfTUFYX0lOUFVUX1NJWkUsICJjb2RlZC5tYXgtZnJhbWUtc2l6ZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpJTlBVVCkpOworCisgICAgLy8gUm90YXRpb24KKyAgICAvLyBOb3RlOiBTREsgcm90YXRpb24gaXMgY2xvY2std2lzZSwgd2hpbGUgQzIgcm90YXRpb24gaXMgY291bnRlci1jbG9jay13aXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisKKyAgICAvLyBhbmRyb2lkICd2aWRlby1zY2FsaW5nJworICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX3ZpZGVvLXNjYWxpbmciLCBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpERUNPREVSICYgRDo6UkFXKSk7CisKKyAgICAvLyBDb2xvciBBc3BlY3RzCisgICAgLy8KKyAgICAvLyBjb25maWd1cmUgZGVmYXVsdCBmb3IgZGVjb2RlcnMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisKKyAgICAvLyByZWFkIGJhY2sgZmluYWwgZm9yIGRlY29kZXIgb3V0cHV0IChhbHNvLCBjb25maWd1cmUgZmluYWwgYXNwZWN0cyBhcyB3ZWxsLiBUaGlzIHNob3VsZCBiZQorICAgIC8vIG92ZXJ3cml0dGVuIGJhc2VkIG9uIGNvZGVkL2RlZmF1bHQgdmFsdWVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBjb2xvciBhc3BlY3RzLCBidXQgaXMgdXNlZAorICAgIC8vIGFzIGZpbmFsIHZhbHVlcyBpZiBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBhc3BlY3RzIGF0IGFsbCkKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworCisgICAgLy8gY29uZmlndXJlIHNvdXJjZSBhc3BlY3RzIGZvciBlbmNvZGVycyBhbmQgcmVhZCB0aGVtIGJhY2sgb24gdGhlIGNvZGVkKCEpIHBvcnQuCisgICAgLy8gVGhpcyBpcyB0byBlbnN1cmUgbXV4aW5nIHRoZSBkZXNpcmVkIGFzcGVjdHMgaW50byB0aGUgY29udGFpbmVyLgorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKworICAgIC8vIHJlYWQgYmFjayBjb2RlZCBhc3BlY3RzIGZvciBlbmNvZGVycyAob24gdGhlIHJhdyBwb3J0KSwgYnV0IGFsc28gY29uZmlndXJlCisgICAgLy8gZGVzaXJlZCBhc3BlY3RzIGhlcmUuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBEYXRhc3BhY2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIC8vIEhEUgorICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5yZWQueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5yZWQueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5yZWQueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5yZWQueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuZ3JlZW4ueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ncmVlbi55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmJsdWUueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ibHVlLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYud2hpdGUueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy53aGl0ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWF4LWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLm1pbi1sdW1pbmFuY2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWNsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1jbGwiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWZhbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtZmFsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyhLRVlfRkVBVFVSRV8pICsgRkVBVFVSRV9TZWN1cmVQbGF5YmFjaywKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFLCAidmFsdWUiKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QUkVQRU5EX0hFQURFUl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZShDMkNvbmZpZzo6UFJFUEVORF9IRUFERVJfVE9fQUxMX1NZTkMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZShDMkNvbmZpZzo6UFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLmFkZC1jc2QtdG8tc3luYy1mcmFtZXMiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgLy8gY29udmVydCB0byB0aW1lc3RhbXAgYmFzZQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lfRlJBTUVfSU5URVJWQUwsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwsICJ2YWx1ZSIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgICAgICBpbnQzMl90IGkzMlZhbHVlOworICAgICAgICAgICAgZmxvYXQgZnBWYWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludDY0X3QoMTAwMDAwMCkgKiBpMzJWYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodi5nZXQoJmZwVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludDY0X3QoYzJfbWluKDEwMDAwMDAgKiBmcFZhbHVlICsgMC41LCAoZG91YmxlKUlOVDY0X01BWCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gcHJvcGVyIGNvZGluZy5nb3AgKGFkZCBzdXBwb3J0IGZvciBjYWxjdWxhdGluZyBnb3ApCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoImktZnJhbWUtcGVyaW9kIiwgImNvZGluZy5nb3AiLCAiaW50cmEtcGVyaW9kIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9ELCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNILCAicGVyaW9kIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcnMobWFrZUZsb2F0LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gcmVhZCBiYWNrIGFsd2F5cyBhcyBpbnQKKyAgICAgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUVVBTElUWSwgQzJfUEFSQU1LRVlfUVVBTElUWSwgInZhbHVlIikpOworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgImNvZGluZy5yZXF1ZXN0LXN5bmMiLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUpIC0+IEMyVmFsdWUgeyByZXR1cm4gdWludDMyX3QoMSk7IH0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUpIC0+IEMyVmFsdWUgeyByZXR1cm4gdWludDMyX3QoMSk7IH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFLCAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gfCBEOjpDT05GSUcpIC8vIHdyaXRlLW9ubHkKKyAgICAgICAgLndpdGhNYXBwZXIobWFrZUZsb2F0KSk7CisgICAgLy8gQzIgcHJpb3JpdGllcyBhcmUgaW52ZXJ0ZWQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QUklPUklUWSwgICAgICAgICBDMl9QQVJBTUtFWV9QUklPUklUWSwgICAgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfT1BFUkFUSU5HX1JBVEUsICAgImN0cmwub3BlcmF0aW5nLXJhdGUiLCAgICAgInZhbHVlIikKKyAgICAgICAgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9QUklPUklUWSwgICAgICAgICAiY3RybC5wcmlvcml0eSIsICAgICAgICAgICAidmFsdWUiKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9XSURUSCwgICAgICAgICBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUsICAgICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRUlHSFQsICAgICAgICBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUsICAgICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLWxlZnQiLCAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJsZWZ0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtdG9wIiwgICAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgInRvcCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXdpZHRoIiwgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLWhlaWdodCIsICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfV0lEVEgsICAgICBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFLCAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSEVJR0hULCAgICBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFLCAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjc2QtMCIsICAgICAgICAgICBDMl9QQVJBTUtFWV9JTklUX0RBVEEsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6Ok9VVFBVVCAmIEQ6OlJFQUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlBBUkFNICYgRDo6SU5QVVQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpPVVRQVVQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAiIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICAvLyBQaXhlbCBGb3JtYXQgKHVzZSBsb2NhbCBrZXkgZm9yIGFjdHVhbCBwaXhlbCBmb3JtYXQgYXMgd2UgZG9uJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgIC8vIFNESyBsYXlvdXRzIGZvciBmbGV4aWJsZSBmb3JtYXQgYW5kIHdlIG5lZWQgdGhlIGFjdHVhbCBTREsgY29sb3IgZm9ybWF0IGluIHRoZSBtZWRpYSBmb3JtYXQpCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKQorICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRTdXJmYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNvbWUgc29ydCBvZiBwYXNzdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCwgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsgLy8gcmVhZCBiYWNrIHRvIGJvdGggZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NPREVEX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFLCAgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsgLy8gcmVhZCBiYWNrIHRvIGJvdGggcG9ydCBmb3JtYXRzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfU0FNUExFX1JBVEUsICAgQzJfUEFSQU1LRVlfQ09ERURfU0FNUExFX1JBVEUsICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QQ01fRU5DT0RJTkcsICBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKQorICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdG87CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB2YWx1ZTsKKyAgICAgICAgICAgIGludDMyX3QgdG87CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKHZhbHVlKT46OnR5cGU7CisgICAgICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JU19BRFRTLCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUgPT0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUykgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCkxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+IG1hcHBlciA9CisgICAgICAgIEMyTWFwcGVyOjpHZXRQcm9maWxlTGV2ZWxNYXBwZXIobUNvZGluZ01lZGlhVHlwZSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QUk9GSUxFLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMLCAicHJvZmlsZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzIgPSBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgmc2RrKSAmJiBtYXBwZXItPm1hcFByb2ZpbGUoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFBST0ZJTEVfVU5VU0VEOworICAgICAgICB9LCBbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMjsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZShjMik+Ojp0eXBlOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgbWFwcGVyLT5tYXBQcm9maWxlKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9MRVZFTCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgImxldmVsIikKKyAgICAgICAgLmxpbWl0VG8oRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzIgPSBMRVZFTF9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBMZXZlbChzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTEVWRUxfVU5VU0VEOworICAgICAgICB9LCBbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwTGV2ZWwoYzIsICZzZGspKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZEJGUyBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQ1VULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoYzJfbWluKHZhbHVlLCAxMjcpIC8gMTI3Lik7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gMC0xICglKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9CT09TVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoYzJfbWluKHZhbHVlLCAxMjcpIC8gMTI3Lik7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gY29tcHJlc3Npb24gdHlwZSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9IRUFWWSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gMSA/IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgOiBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hUOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgtMC4yNSAqIGMyX21pbih2YWx1ZSwgMTI3KSk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZWZmZWN0IHR5cGUgKHRoZXNlIG1hcCB0byBTREsgdmFsdWVzKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0VGRkVDVF9UWVBFLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDgpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUKTsKKyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdmFsdWUgaXMgd2l0aGluIHJhbmdlCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9NQVhfQ0hBTk5FTF9DT1VOVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19TQlJfTU9ERSwgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX09GRjsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9TSU5HTEVfUkFURTsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9EVUFMX1JBVEU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0FVVE8gKyAxOyAvLyBpbnZhbGlkIHZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1FVQUxJVFksIEMyX1BBUkFNS0VZX1FVQUxJVFksICJ2YWx1ZSIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb21wbGV4aXR5IiwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfR1JJRF9DT0xVTU5TLCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgImNvbHVtbnMiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfUk9XUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJyb3dzIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX1dJRFRILCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUud2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1RJTEVfSEVJR0hULCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUuaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xBVEVOQ1ksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgInZhbHVlIikpOworCisgICAgLyogc3RpbGwgdG8gZG8KKyAgICBjb25zdGV4cHIgY2hhciBLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1BbXSA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOworCisgICAgICAgbm90IHlldCB1c2VkIGJ5IE1lZGlhQ29kZWMsIGJ1dCBkZWZpbmVkIGFzIE1lZGlhRm9ybWF0CisgICAgS0VZX0FVRElPX1NFU1NJT05fSUQgLy8gd2UgdXNlICJhdWRpby1ody1zeW5jIgorICAgIEtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSAorICAgICovCit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbihDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKyAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQoQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcG9uZW50LT5xdWVyeSh7ICZkb21haW4sICZraW5kIH0sIHt9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBkb21haW4gJiBraW5kIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIC8vIFRFTVA6IGRldGVybWluZSBraW5kIGZyb20gY29tcG9uZW50IG5hbWUKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBraW5kLnZhbHVlID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUgZG9tYWluIGZyb20gbWVkaWEgdHlwZSAocG9ydCAocHJlZmVycmVkKSBvciBzdHJlYW0gIzApCisgICAgICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUikgeworICAgICAgICAgICAgQVN0cmluZyBtZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpOworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRG9tYWluID0gKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPID8gRG9tYWluOjpJU19WSURFTyA6CisgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSA/IERvbWFpbjo6SVNfSU1BR0UgOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8gPyBEb21haW46OklTX0FVRElPIDogRG9tYWluOjpPVEhFUl9ET01BSU4pCisgICAgICAgICAgICB8IChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgPyBEb21haW46OklTX0RFQ09ERVIgOgorICAgICAgICAgICAgICAga2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gRG9tYWluOjpJU19FTkNPREVSIDogRG9tYWluOjpPVEhFUl9LSU5EKTsKKworICAgIG1JbnB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19ERUNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX0lOUFVUKTsKKyAgICBtT3V0cHV0RG9tYWluID0gRG9tYWluKCgobURvbWFpbiAmIElTX0VOQ09ERVIpID8gSVNfQ09ERUQgOiBJU19SQVcpIHwgSVNfT1VUUFVUKTsKKworICAgIEFMT0dWKCJkb21haW4gaXMgJSN4ICgldSAldSkiLCBtRG9tYWluLCBkb21haW4udmFsdWUsIGtpbmQudmFsdWUpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHBhcmFtSW5kaWNlczsKKyAgICBzd2l0Y2ggKGtpbmQudmFsdWUpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKGZhbHNlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSAiIjsKKyAgICB9CisKKyAgICBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJm1QYXJhbURlc2NzKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICBtUGFyYW1EZXNjcy5zaXplKCksIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBtUGFyYW1EZXNjcykgeworICAgICAgICBtU3VwcG9ydGVkSW5kaWNlcy5lbXBsYWNlKGRlc2MtPmluZGV4KCkpOworICAgIH0KKworICAgIG1SZWZsZWN0b3IgPSBjbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgaWYgKG1SZWZsZWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwYXJhbSByZWZsZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gZW51bWVyYXRlIGFsbCBmaWVsZHMKKyAgICBtUGFyYW1VcGRhdGVyID0gc3RkOjptYWtlX3NoYXJlZDxSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI+KCk7CisgICAgbVBhcmFtVXBkYXRlci0+Y2xlYXIoKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5zdXBwb3J0V2hvbGVQYXJhbSgKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkNPUkVfSU5ERVgpOworICAgIG1QYXJhbVVwZGF0ZXItPmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtUGFyYW1EZXNjcyk7CisKKyAgICAvLyBURU1QOiBhZGQgc29tZSBzdGFuZGFyZCBmaWVsZHMgZXZlbiBpZiBub3QgcmVmbGVjdGVkCisgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT5hZGRTdGFuZGFyZFBhcmFtPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0lOSVRfREFUQSk7CisgICAgfQorICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSB8fCBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTykgeworICAgICAgICBpZiAoa2luZC52YWx1ZSAhPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKSB7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0NST1BfUkVDVCk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0KDB1LCAxdSwgMXUpLAorICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dCgwdSwgMCksIEMyX1BBUkFNS0VZX1JPVEFUSU9OKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9EQVRBX1NQQUNFKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0KDB1LCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLyBzdWJzY3JpYmUgdG8gYWxsIHN1cHBvcnRlZCBzdGFuZGFyZCAoZXhwb3NlZCkgcGFyYW1zCisgICAgLy8gVE9ETzogbGltaXQgdGhpcyB0byBwYXJhbXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdGhlIGRvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmb3JtYXRLZXlzID0gbVN0YW5kYXJkUGFyYW1zLT5nZXRQYXRoc0ZvckRvbWFpbihEb21haW4oMSA8PCAzMCkpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtSW5kaWNlc0ZvcktleXMoZm9ybWF0S2V5cywgJmluZGljZXMpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKworICAgIC8vIGFsc28gc3Vic2NyaWJlIHRvIHNvbWUgbm9uLVNESyBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgLy8gZm9yIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgYnVmZmVycworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGZvciBvdXRwdXQgYnVmZmVyIGFycmF5IGFsbG9jYXRpb24KKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGluaXQgZGF0YSAoQ1NEKQorICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKyAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyB3aGVuIGNvbXBvbmVudHMgbm8gbG9uZ2VyIGNyYXNoIG9uIHRoaXMgY29uZmlnCisgICAgaWYgKG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkgIT0gbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSAmJiBmYWxzZSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNlczsKKyAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IG1TdWJzY3JpYmVkSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IHN1YnNjcmliZVR1bmluZyA9CisgICAgICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jVW5pcXVlKGluZGljZXMpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0czsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPmNvbmZpZyh7IHN1YnNjcmliZVR1bmluZy5nZXQoKSB9LCBibG9ja2luZywgJnJlc3VsdHMpOworICAgICAgICBpZiAoYzJFcnIgIT0gQzJfT0sgJiYgYzJFcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHN1YnNjcmliZSB0byBwYXJhbWV0ZXJzID0+ICVzIiwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1YnNjcmliZWQgdG8gJXp1IHBhcmFtcyIsIG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkpOworICAgICAgICBtU3Vic2NyaWJlZEluZGljZXNTaXplID0gbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgLy8gcXVlcnkgYWxsIHN1YnNjcmliZWQgcGFyYW1ldGVycworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzKG1TdWJzY3JpYmVkSW5kaWNlcy5iZWdpbigpLCBtU3Vic2NyaWJlZEluZGljZXMuZW5kKCkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX01BWV9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMkVyciAhPSBPSykgeworICAgICAgICBBTE9HSSgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzICglcykiLCBxdWVyaWVkLnNpemUoKSwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICB9CisKKyAgICB1cGRhdGVDb25maWd1cmF0aW9uKHF1ZXJpZWQsIEFMTCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLCBEb21haW4gZG9tYWluKSB7CisgICAgQUxPR1YoInVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCAlenUgcGFyYW1zIiwgY29uZmlnVXBkYXRlLnNpemUoKSk7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnAgOiBjb25maWdVcGRhdGUpIHsKKyAgICAgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgICAgIGF1dG8gaW5zZXJ0aW9uID0gbUN1cnJlbnRDb25maWcuZW1wbGFjZShwLT5pbmRleCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRpb24uc2Vjb25kIHx8ICppbnNlcnRpb24uZmlyc3QtPnNlY29uZCAhPSAqcCkgeworICAgICAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwLT5pbmRleCgpKSB8fCBtTG9jYWxQYXJhbXMuY291bnQocC0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmFjayBjaGFuZ2VzIGluIHN1cHBvcnRlZCAocmVmbGVjdGVkIG9yIGxvY2FsKSBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbiB1bmxpc3RlZCBjb25maWcgd2FzICVzOiAlI3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvbi5zZWNvbmQgPyAiYWRkZWQiIDogInVwZGF0ZWQiLCBwLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNlcnRpb24uZmlyc3QtPnNlY29uZCA9IHN0ZDo6bW92ZShwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJ1cGRhdGVkIGNvbmZpZ3VyYXRpb24gaGFzICV6dSBwYXJhbXMgKCVzKSIsIG1DdXJyZW50Q29uZmlnLnNpemUoKSwKKyAgICAgICAgICAgIGNoYW5nZWQgPyAiQ0hBTkdFRCIgOiAibm8gY2hhbmdlIik7CisgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcm1hdHMoZG9tYWluKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKSB7CisgICAgLy8gZ2V0IGFkZHJlc3NlcyBvZiBwYXJhbXMgaW4gdGhlIGN1cnJlbnQgY29uZmlnCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1DdXJyZW50Q29uZmlnKSB7CisgICAgICAgIHBhcmFtUG9pbnRlcnMucHVzaF9iYWNrKGl0LnNlY29uZC5nZXQoKSk7CisgICAgfQorCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHJlZmxlY3RlZCA9IG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtcyhwYXJhbVBvaW50ZXJzKTsKKyAgICBBTE9HRCgiYzIgY29uZmlnIGlzICVzIiwgcmVmbGVjdGVkLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZG9tYWluICYgbUlucHV0RG9tYWluKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtSW5wdXRGb3JtYXQ7CisgICAgICAgIG1JbnB1dEZvcm1hdCA9IG1JbnB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgZm9ybWF0IGNoYW5nZWQKKyAgICAgICAgbUlucHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbUlucHV0RG9tYWluKSk7CisgICAgICAgIGlmIChtSW5wdXRGb3JtYXQtPmNvdW50RW50cmllcygpICE9IG9sZEZvcm1hdC0+Y291bnRFbnRyaWVzKCkKKyAgICAgICAgICAgICAgICB8fCBtSW5wdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPSBvbGRGb3JtYXQ7IC8vIG5vIGNoYW5nZQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkb21haW4gJiBtT3V0cHV0RG9tYWluKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0OworICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1PdXRwdXRGb3JtYXQtPmV4dGVuZChnZXRTZGtGb3JtYXRGb3JEb21haW4ocmVmbGVjdGVkLCBtT3V0cHV0RG9tYWluKSk7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbU91dHB1dEZvcm1hdC0+Y2hhbmdlc0Zyb20ob2xkRm9ybWF0KS0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBvbGRGb3JtYXQ7IC8vIG5vIGNoYW5nZQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWX0lGKGNoYW5nZWQsICJmb3JtYXQocykgY2hhbmdlZCIpOworICAgIHJldHVybiBjaGFuZ2VkOworfQorCitzcDxBTWVzc2FnZT4gQ0NvZGVjQ29uZmlnOjpnZXRTZGtGb3JtYXRGb3JEb21haW4oCisgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gcG9ydERvbWFpbikgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0S2V5cygpKSB7CisgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIHBvcnREb21haW4pID09IDAgLy8gaW5wdXQtb3V0cHV0LWNvZGVkLXJhdworICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIG1Eb21haW4pICE9IG1Eb21haW4gLy8gY29tcG9uZW50IGRvbWFpbiArIGtpbmQgKHRoZXNlIG11c3QgbWF0Y2gpCisgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgSVNfUkVBRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IHJlZmxlY3RlZC5maW5kKGNtLnBhdGgoKSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gcmVmbGVjdGVkLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICAgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IGNtLm1hcFRvTWVzc2FnZShjMlZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNlY29uZC5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldChidWZWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoc3RyVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCB1bnR5cGVkIHF1ZXJ5IHZhbHVlIGZvciBrZXk6ICVzIiwgY20ucGF0aCgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRJdGVtKGVsLmZpcnN0LmNfc3RyKCksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGZyb20gQ29kZWMgMi4wIHJlY3QgdG8gTWVkaWFGb3JtYXQgcmVjdCBhbmQgYWRkIGNyb3AgcmVjdCBpZiBub3QgcHJlc2VudAorICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmbGVmdCkgJiYgbXNnLT5maW5kSW50MzIoImNyb3Atd2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImNyb3AtdG9wIiwgJnRvcCkgJiYgbXNnLT5maW5kSW50MzIoImNyb3AtaGVpZ2h0IiwgJmhlaWdodCkKKyAgICAgICAgICAgICAgICAmJiBsZWZ0ID49IDAgJiYgd2lkdGggPj0wICYmIHdpZHRoIDw9IElOVDMyX01BWCAtIGxlZnQKKyAgICAgICAgICAgICAgICAmJiB0b3AgPj0gMCAmJiBoZWlnaHQgPj0wICYmIGhlaWdodCA8PSBJTlQzMl9NQVggLSB0b3ApIHsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1sZWZ0IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXRvcCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC13aWR0aCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1oZWlnaHQiKSk7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCBsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCAtIDEsIHRvcCArIGhlaWdodCAtIDEpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCAwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IHRlbXBvcmFsIGxheWVyaW5nIHRvIHNjaGVtYQorICAgICAgICBzcDxBQnVmZmVyPiB0bXA7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZ0bXApICYmIHRtcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmcgKmxheWVyaW5nID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkZyb20oQzJQYXJhbTo6RnJvbSh0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpKTsKKyAgICAgICAgICAgIGlmIChsYXllcmluZyAmJiBsYXllcmluZy0+bS5sYXllckNvdW50ID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA8IGxheWVyaW5nLT5tLmxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHdlYnJ0YyBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtaW1lKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbWltZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmJMYXllckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuNmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1sxXSA9PSAuNmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjI1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1syXSA9PSAuNmYpKSkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYnJ0Yy52cDguJXUtbGF5ZXIiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuZ2VuZXJpYy4ldSsldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCAtIGxheWVyaW5nLT5tLmJMYXllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmJMYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuZ2VuZXJpYy4ldSIsIGxheWVyaW5nLT5tLmxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBjb2xvciBpbmZvCisgICAgICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLXByaW1hcmllcyIsIChpbnQzMl90KikmcHJpbWFyaWVzKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjb2xvci1tYXRyaXgiLCAoaW50MzJfdCopJm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQ7CisKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHByaW1hcmllcywgbWF0cml4LCAmc3RhbmRhcmQpKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1wcmltYXJpZXMiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNvbG9yLW1hdHJpeCIpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRhdGFzcGFjZSBmb3IgcmF3IGdyYXBoaWMgYnVmZmVycyBpZiBub3Qgc3BlY2lmaWVkIGJ5IGNvbXBvbmVudCwgb3IgaWYKKyAgICAgICAgLy8gdXNpbmcgc3VyZmFjZSB3aXRoIHVuc3BlY2lmaWVkIGFzcGVjdHMgKGFzIHRob3NlIG11c3QgYmUgZGVmYXVsdGVkIHdoaWNoIG1heSBjaGFuZ2UKKyAgICAgICAgLy8gdGhlIGRhdGFzcGFjZSkKKyAgICAgICAgaWYgKChwb3J0RG9tYWluICYgSVNfUkFXKSAmJiAobURvbWFpbiAmIChJU19JTUFHRSB8IElTX1ZJREVPKSkpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZTsKKyAgICAgICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzID0geworICAgICAgICAgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KG1zZywgYXNwZWN0cyk7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgb3JpZ0FzcGVjdHMgPSBhc3BlY3RzOworICAgICAgICAgICAgaWYgKG1Vc2luZ1N1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgaW1hZ2Ugc2l6ZSAoZGVmYXVsdCB0byBIRCkKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gMTI4MDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IDcyMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcmlnaHQgLSBsZWZ0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfV0lEVEgsICZ3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEludDMyKEtFWV9IRUlHSFQsICZoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIG1zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YXNwYWNlKQorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1SYW5nZSAhPSBvcmlnQXNwZWN0cy5tUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUHJpbWFyaWVzICE9IG9yaWdBc3BlY3RzLm1QcmltYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tVHJhbnNmZXIgIT0gb3JpZ0FzcGVjdHMubVRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubU1hdHJpeENvZWZmcyAhPSBvcmlnQXNwZWN0cy5tTWF0cml4Q29lZmZzKSB7CisgICAgICAgICAgICAgICAgZGF0YXNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBkYXRhc3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSERSIHN0YXRpYyBpbmZvCisKKyAgICAgICAgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCBoZHI7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LnJlZC54IiwgJmhkci5tYXN0ZXJpbmcucmVkLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsICZoZHIubWFzdGVyaW5nLnJlZC55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueCIsICZoZHIubWFzdGVyaW5nLmdyZWVuLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgJmhkci5tYXN0ZXJpbmcuZ3JlZW4ueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmJsdWUueCIsICZoZHIubWFzdGVyaW5nLmJsdWUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmJsdWUueSIsICZoZHIubWFzdGVyaW5nLmJsdWUueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLngiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueSIsICZoZHIubWFzdGVyaW5nLndoaXRlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgJmhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCAmaGRyLm1heENsbCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgiY3RhODYxLm1heC1mYWxsIiwgJmhkci5tYXhGYWxsKSkgeworICAgICAgICAgICAgaWYgKGhkci5tYXN0ZXJpbmcucmVkLnggPj0gMCAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueSA+PSAwICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS54ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnkgPj0gMCAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSA+PSAwICAmJiBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSA8PSA2NTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSA+PSAwICAmJiBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSA8PSA2LjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heENsbCA+PSAwICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heENsbCA8PSA2NTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4RmFsbCA+PSAwICAgICAgICAgICAgICAgICAmJiBoZHIubWF4RmFsbCA8PSA2NTUzNSkgeworICAgICAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gbWV0YTsKKyAgICAgICAgICAgICAgICBtZXRhLm1JRCA9IG1ldGEua1R5cGUxOworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1SLnggPSBoZHIubWFzdGVyaW5nLnJlZC54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi55ID0gaGRyLm1hc3RlcmluZy5yZWQueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUcueCA9IGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUcueSA9IGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueCA9IGhkci5tYXN0ZXJpbmcuYmx1ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tQi55ID0gaGRyLm1hc3RlcmluZy5ibHVlLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1XLnggPSBoZHIubWFzdGVyaW5nLndoaXRlLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1XLnkgPSBoZHIubWFzdGVyaW5nLndoaXRlLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSAvIDAuMDAwMSArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHIubWF4Q2xsICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyLm1heEZhbGwgKyAwLjU7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtY2xsIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3RhODYxLm1heC1mYWxsIikpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgmbWV0YSwgc2l6ZW9mKG1ldGEpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBpbnZhbGlkIEhEUiBzdGF0aWMgbWV0YWRhdGEgJXMiLCBtc2ctPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImNvbnZlcnRlZCB0byBTREsgdmFsdWVzIGFzICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgIHJldHVybiBtc2c7Cit9CisKKy8vLyBjb252ZXJ0cyBhbiBBTWVzc2FnZSB2YWx1ZSB0byBhIFBhcmFtVXBkYXRlciB2YWx1ZQorc3RhdGljIHZvaWQgY29udmVydChjb25zdCBBTWVzc2FnZTo6SXRlbURhdGEgJmZyb20sIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgKnRvKSB7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICBBU3RyaW5nIHN0clZhbHVlOworICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgZG91YmxlIGRvdWJsZVZhbHVlOworCisgICAgaWYgKGZyb20uZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChpbnQzMlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChpbnQ2NFZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoYnVmVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZzdHJWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChzdHJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoQzJWYWx1ZShmbG9hdFZhbHVlKSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmRvdWJsZVZhbHVlKSkgeworICAgICAgICAvLyBjb252ZXJ0IGRvdWJsZSB0byBmbG9hdAorICAgICAgICB0by0+c2V0KEMyVmFsdWUoKGZsb2F0KWRvdWJsZVZhbHVlKSk7CisgICAgfQorICAgIC8vIGlnbm9yZSBhbGwgb3RoZXIgQU1lc3NhZ2UgdHlwZXMKK30KKworLy8vIHJlbGF4ZXMgQ29kZWMgMi4wIHNwZWNpZmljIHZhbHVlIHR5cGVzIHRvIFNESyB0eXBlcyAobWFpbmx5IHJlbW92ZXMgc2lnbmVkbmVzcyBhbmQgY291bnRlcm5lc3MKKy8vLyBmcm9tIDMyLzY0LWJpdCB2YWx1ZXMuKQorc3RhdGljIHZvaWQgcmVsYXhWYWx1ZXMoUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSAmaXRlbSkgeworICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICh2b2lkKWl0ZW0uZmluZCgmYzJWYWx1ZSk7CisgICAgaWYgKGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSB8fCBjMlZhbHVlLmdldCgodWludDMyX3QqKSZpbnQzMlZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KCh1aW50NjRfdCopJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZpbnQ2NFZhbHVlKSkgeworICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICB9Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBDQ29kZWNDb25maWc6OmdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXNfLCBEb21haW4gY29uZmlnRG9tYWluKSBjb25zdCB7CisgICAgLy8gY3JlYXRlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHBhcmFtcworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBwYXJhbXNfLT5kdXAoKTsKKyAgICBBTE9HVigiZmlsdGVyaW5nIHdpdGggY29uZmlnIGRvbWFpbiAleCIsIGNvbmZpZ0RvbWFpbik7CisKKyAgICAvLyBjb252ZXJ0IHNvbWUgbWFjcm8gcGFyYW1ldGVycyB0byBDb2RlYyAyLjAgc3BlY2lmaWMgZXhwcmVzc2lvbnMKKworICAgIHsgLy8gbWFrZSBpLWZyYW1lLWludGVydmFsIGZyYW1lIGJhc2VkCisgICAgICAgIGZsb2F0IGlGcmFtZUludGVydmFsOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmlGcmFtZUludGVydmFsKSkgeworICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlOworICAgICAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiaS1mcmFtZS1wZXJpb2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lUmF0ZSA8PSAwIHx8IGlGcmFtZUludGVydmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTEgLyogbm8gc3luYyBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludDMyX3QpYzJfbWluKGlGcmFtZUludGVydmFsICogZnJhbWVSYXRlICsgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KUlOVDMyX01BWCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Eb21haW4gPT0gKElTX1ZJREVPIHwgSVNfRU5DT0RFUikpIHsKKyAgICAgICAgLy8gY29udmVydCBjYXB0dXJlLXJhdGUgaW50byBpbnB1dC10aW1lLXN0cmV0Y2gKKyAgICAgICAgZmxvYXQgZnJhbWVSYXRlLCBjYXB0dXJlUmF0ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIXBhcmFtcy0+ZmluZEFzRmxvYXQoInRpbWUtbGFwc2UtZnBzIiwgJmNhcHR1cmVSYXRlKQorICAgICAgICAgICAgICAgICAgICAmJiAhcGFyYW1zLT5maW5kQXNGbG9hdChLRVlfQ0FQVFVSRV9SQVRFLCAmY2FwdHVyZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJhdGUgPSBmcmFtZVJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FwdHVyZVJhdGUgPiAwICYmIGZyYW1lUmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgY2FwdHVyZVJhdGUgLyBmcmFtZVJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeyAgIC8vIHJlZmxlY3QgdGVtcG9yYWwgbGF5ZXJpbmcgaW50byBhIGJpbmFyeSBibG9iCisgICAgICAgIEFTdHJpbmcgc2NoZW1hOworICAgICAgICBpZiAocGFyYW1zLT5maW5kU3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgJnNjaGVtYSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOworICAgICAgICAgICAgaW50IHRhZ3M7CisgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBsYXllcmluZzsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChudW1MYXllcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAwdSwgMXUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuNmYgfSwgMHUsIDJ1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjRmLCAuNmYgfSwgMHUsIDN1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC4yNWYsIC40ZiwgLjZmIH0sIDB1LCA0dSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgodGFncyA9IHNzY2FuZihzY2hlbWEuY19zdHIoKSwgImFuZHJvaWQuZ2VuZXJpYy4ldSVjJXUlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmZHVtbXksICZudW1CTGF5ZXJzLCAmZHVtbXkpKQorICAgICAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiBkdW1teSA9PSAnKycpKQorICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKKyAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAwdSwgbnVtTGF5ZXJzICsgbnVtQkxheWVycywgbnVtQkxheWVycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJJZ25vcmluZyB1bnN1cHBvcnRlZCB0cy1zY2hlbWEgWyVzXSIsIHNjaGVtYS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXllcmluZykgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0QnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShsYXllcmluZy5nZXQoKSwgbGF5ZXJpbmctPnNpemUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGZyb20gTWVkaWFGb3JtYXQgcmVjdCB0byBDb2RlYyAyLjAgcmVjdAorICAgICAgICBpbnQzMl90IG9mZnNldDsKKyAgICAgICAgaW50MzJfdCBlbmQ7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImNyb3AtbGVmdCIsICZvZmZzZXQpICYmIHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLXJpZ2h0IiwgJmVuZCkKKyAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPj0gMCAmJiBlbmQgPj0gb2Zmc2V0IC0gMSkgeworICAgICAgICAgICAgc2l6ZV90IGl4ID0gcGFyYW1zLT5maW5kRW50cnlCeU5hbWUoImNyb3AtcmlnaHQiKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLXdpZHRoIik7CisgICAgICAgICAgICBpdGVtLnNldChlbmQgLSBvZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlBdChpeCwgaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZvZmZzZXQpICYmIHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWJvdHRvbSIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWJvdHRvbSIpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeU5hbWVBdChpeCwgImNyb3AtaGVpZ2h0Iik7CisgICAgICAgICAgICBpdGVtLnNldChlbmQgLSBvZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlBdChpeCwgaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpKSB7CisgICAgICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXg7CisKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHN0YW5kYXJkLCAmcHJpbWFyaWVzLCAmbWF0cml4KSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLXByaW1hcmllcyIsIHByaW1hcmllcyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiY29sb3ItbWF0cml4IiwgbWF0cml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IGhkck1ldGE7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkck1ldGEpCisgICAgICAgICAgICAgICAgJiYgaGRyTWV0YS0+c2l6ZSgpID09IHNpemVvZihIRFJTdGF0aWNJbmZvKSkgeworICAgICAgICAgICAgSERSU3RhdGljSW5mbyAqbWV0YSA9IChIRFJTdGF0aWNJbmZvKiloZHJNZXRhLT5kYXRhKCk7CisgICAgICAgICAgICBpZiAobWV0YS0+bUlEID09IG1ldGEtPmtUeXBlMSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsIG1ldGEtPnNUeXBlMS5tUi54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LnJlZC55IiwgbWV0YS0+c1R5cGUxLm1SLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueCIsIG1ldGEtPnNUeXBlMS5tRy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLnkiLCBtZXRhLT5zVHlwZTEubUcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCBtZXRhLT5zVHlwZTEubUIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCBtZXRhLT5zVHlwZTEubUIueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgbWV0YS0+c1R5cGUxLm1XLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueSIsIG1ldGEtPnNUeXBlMS5tVy55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCBtZXRhLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICogMC4wMDAxKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWNsbCIsIG1ldGEtPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsIG1ldGEtPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0aGlzIGlzIHRvIHZlcmlmeSB0aGF0IHdlIHNldCBwcm9wZXIgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5U3RyaWN0ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19zdHJpY3RfdHlwZSIsIGZhbHNlKTsKKyAgICAvLyB0aGlzIGlzIHRvIGFsbG93IHZlbmRvcnMgdG8gdXNlIHRoZSB3cm9uZyBzaWduZWRuZXNzIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgYm9vbCBiZVZlcnlMYXggPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX2xheF90eXBlIiwgZmFsc2UpOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGZpbHRlcmVkOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwYXJhbXMtPmNvdW50RW50cmllcygpOyArK2l4KSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIEFTdHJpbmcgbmFtZSA9IHBhcmFtcy0+Z2V0RW50cnlOYW1lQXQoaXgsICZ0eXBlKTsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1zZ0l0ZW0gPSBwYXJhbXMtPmdldEVudHJ5QXQoaXgpOworICAgICAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlIGl0ZW07CisgICAgICAgIGNvbnZlcnQobXNnSXRlbSwgJml0ZW0pOyAvLyBjb252ZXJ0IGl0ZW0gdG8gcGFyYW0gdXBkYXRlciBpdGVtCisKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgidmVuZG9yLiIpKSB7CisgICAgICAgICAgICAvLyB2ZW5kb3IgcGFyYW1zIHBhc3MgdGhyb3VnaCBhcyBpcworICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShuYW1lLmNfc3RyKCksIGl0ZW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RhbmRhcmQgcGFyYW1ldGVycyBtYXkgZ2V0IG1vZGlmaWVkLCBmaWx0ZXJlZCBvciBkdXBsaWNhdGVkCisgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShuYW1lLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAvLyBub3RlOiB3ZSBpZ25vcmUgcG9ydCBkb21haW4gZm9yIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBjb25maWdEb21haW4pCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgICAgICAmJiAoY20uZG9tYWluKCkgJiBtRG9tYWluKSA9PSBtRG9tYWluKSB7CisgICAgICAgICAgICAgICAgLy8gbWFwIGFyaXRobWV0aWMgdmFsdWVzLCBwYXNzIHRocm91Z2ggc3RyaW5nIG9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IG9ubHkgbWFwIHNldHRpbmdzIHdpdGggbWFwcGVycyBhcyB3ZSBhcmUgbm90IGNyZWF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgPD0+IHVuc2lnbmVkIG1hcHBlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGJlIHByZWNpc2UgYWJvdXQgc2lnbmVkIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVWZXJ5U3RyaWN0IHx8IGNtLm1hcHBlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoY20ubWFwRnJvbU1lc3NhZ2UocGFyYW1zLT5nZXRFbnRyeUF0KGl4KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gYWxsb3cgdG8gcmVsYXggdHlwZSBzdHJpY3RuZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeUxheCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxheFZhbHVlcyhpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5lbXBsYWNlKGNtLnBhdGgoKSwgaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImZpbHRlcmVkICVzIHRvICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLAorICAgICAgICAgICAgZmlsdGVyZWQuZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisgICAgcmV0dXJuIGZpbHRlcmVkOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnNka1BhcmFtcywgRG9tYWluIGNvbmZpZ0RvbWFpbiwKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdCB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHBhcmFtcyA9IGdldFJlZmxlY3RlZEZvcm1hdChzZGtQYXJhbXMsIGNvbmZpZ0RvbWFpbik7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShwYXJhbXMsICZpbmRpY2VzKTsKKyAgICBpZiAoaW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJubyByZWNvZ25pemVkIHBhcmFtcyBpbjogJXMiLCBwYXJhbXMuZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbmZpZ1VwZGF0ZS0+Y2xlYXIoKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3VwcG9ydGVkSW5kaWNlczsKKyAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogaW5kaWNlcykgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaXgpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRJbmRpY2VzLnB1c2hfYmFjayhpeCk7CisgICAgICAgIH0gZWxzZSBpZiAobUxvY2FsUGFyYW1zLmNvdW50KGl4KSkgeworICAgICAgICAgICAgLy8gcXVlcnkgbG9jYWwgcGFyYW1ldGVyIGhlcmUKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGl4KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQ3VycmVudENvbmZpZy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZS0+ZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKml0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyB9LCBzdXBwb3J0ZWRJbmRpY2VzLCBibG9ja2luZywgY29uZmlnVXBkYXRlKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSBwYXJhbXMgPT4gJXMiLCBjb25maWdVcGRhdGUtPnNpemUoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgfQorCisgICAgaWYgKGNvbmZpZ1VwZGF0ZS0+c2l6ZSgpKSB7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKHBhcmFtcywgY29uZmlnVXBkYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnNldFBhcmFtZXRlcnMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKKyAgICBpZiAoY29uZmlnVXBkYXRlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gcGFyYW1WZWN0b3I7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHBhcmFtVmVjdG9yLnB1c2hfYmFjayhwYXJhbS5nZXQoKSk7CisgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhwYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxvY2FsUGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBMb2NhbFBhcmFtVmFsaWRhdG9yIHZhbGlkYXRvciA9IG1Mb2NhbFBhcmFtcy5maW5kKHBhcmFtLT5pbmRleCgpKS0+c2Vjb25kOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IEMyUGFyYW06OkNvcHkoKnBhcmFtKTsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSB2YWxpZGF0b3IoY29weSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInVwZGF0ZWQgbG9jYWwgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbcGFyYW0tPmluZGV4KCldID0gc3RkOjptb3ZlKGNvcHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgdmFsdWUgZm9yICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtTmFtZShwYXJhbS0+aW5kZXgoKSkuY19zdHIoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIHVwZGF0ZSBzdWJzY3JpYmVkIHBhcmFtIGluZGljZXMKKyAgICBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb21wb25lbnQsIGluZGljZXMsIGJsb2NraW5nKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPmNvbmZpZyhwYXJhbVZlY3RvciwgYmxvY2tpbmcsICZmYWlsdXJlcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiY29uZmlnIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGVycikpOworICAgICAgICAvLyBUaGlzIGlzIG5vbi1mYXRhbC4KKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisgICAgICAgIHN3aXRjaCAoZmFpbHVyZS0+ZmFpbHVyZSkgeworICAgICAgICAgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRToKKyAgICAgICAgICAgICAgICBBTE9HRCgiQmFkIHBhcmFtZXRlciB2YWx1ZSIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWx1cmUgPSAlZCIsIGludChmYWlsdXJlLT5mYWlsdXJlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZS1xdWVyeSBwYXJhbWV0ZXIgdmFsdWVzIGluIGNhc2UgY29uZmlnIGNvdWxkIG5vdCB1cGRhdGUgdGhlbSBhbmQgdXBkYXRlIHRoZSBjdXJyZW50CisgICAgLy8gY29uZmlndXJhdGlvbi4KKyAgICBjb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBibG9ja2luZywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLnNpemUoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgfQorICAgICh2b2lkKXVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnVXBkYXRlLCBBTEwpOworCisgICAgLy8gVE9ETzogZXJyb3IgdmFsdWUKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBDMlBhcmFtICpDQ29kZWNDb25maWc6OmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgYXV0byBpdCA9IG1DdXJyZW50Q29uZmlnLmZpbmQoaW5kZXgpOworICAgIGlmIChpdCA9PSBtQ3VycmVudENvbmZpZy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZmUzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19DT05GSUdfSF8KKyNkZWZpbmUgQ19DT0RFQ19DT05GSUdfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFN0YW5kYXJkUGFyYW1zOworCisvKioKKyAqIFN0cnVjdCBtYW5hZ2luZyB0aGUgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgQ0NvZGVjLgorICovCitzdHJ1Y3QgQ0NvZGVjQ29uZmlnIHsKKworICAgIC8qKgorICAgICAqIERvbWFpbiBjb25zaXN0cyBvZiBhIGJpdG1hc2sgZGl2aWRlZCBpbnRvIGZpZWxkcywgYW5kIHNwZWNpZmllcnMgd29yayBieSBleGNsdWRpbmcgb3RoZXIKKyAgICAgKiB2YWx1ZXMgaW4gdGhvc2UgZG9tYWlucy4KKyAgICAgKgorICAgICAqIENvbXBvbmVudCBkb21haW5zIGFyZSBjb21wb3NlZCBieSBvci1pbmcgdGhlIGluZGl2aWR1YWwgSVNfIGNvbnN0YW50cywgZS5nLgorICAgICAqIElTX0RFQ09ERVIgfCBJU19BVURJTy4KKyAgICAgKgorICAgICAqIENvbmZpZyBzcGVjaWZpZXJzIGFyZSBjb21wb3NlZCBieSBvci1pbmcgdGhlIGluZGl2aWR1YWwgbWFzayBjb25zdGFudHMsIGFuZAorICAgICAqIGFuZC1pbmcgdGhlc2UgZ3JvdXBzOiBlLmcuIChERUNPREVSIHwgRU5DT0RFUikgJiBBVURJTy4KKyAgICAgKgorICAgICAqIFRoZSBuYW1pbmcgb2YgdGhlc2UgY29uc3RhbnRzIHdhcyB0byBsaW1pdCB0aGUgbGVuZ3RoIG9mIG1hc2sgbmFtZXMgYXMgdGhlc2UgYXJlIHVzZWQgbW9yZQorICAgICAqIGNvbW1vbmx5IGFzIG1hc2tzLgorICAgICAqLworICAgIGVudW0gRG9tYWluIDogdWludDMyX3QgeworICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluIChkb21haW4gJiBraW5kKQorICAgICAgICBHVUFSRF9CSVQgICA9ICgxIDw8IDEpLCAgIC8vLzwgdGhpcyBpcyB0byBwcmV2ZW50IGFnYWluc3QgYWNjaWRlbnRhbCAmJiBvciB8fCB1c2FnZQorICAgICAgICBJU19BVURJTyAgICA9ICgxIDw8IDIpLCAgIC8vLzwgZm9yIGF1ZGlvIGNvZGVjcworICAgICAgICBJU19WSURFTyAgICA9ICgxIDw8IDMpLCAgIC8vLzwgZm9yIHZpZGVvIGNvZGVjcworICAgICAgICBJU19JTUFHRSAgICA9ICgxIDw8IDQpLCAgIC8vLzwgZm9yIGltYWdlIGNvZGVjcworICAgICAgICBPVEhFUl9ET01BSU4gPSAoMSA8PCA1KSwgIC8vLzwgZm9yIG90aGVyIGRvbWFpbnMKKworICAgICAgICBJU19FTkNPREVSICA9ICgxIDw8IDYpLCAgIC8vLzwgZm9yIGVuY29kZXJzCisgICAgICAgIElTX0RFQ09ERVIgID0gKDEgPDwgNyksICAgLy8vPCBmb3IgZGVjb2RlcnMKKyAgICAgICAgT1RIRVJfS0lORCAgPSAoMSA8PCA4KSwgICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgLy8gY29uZmlnIGRvbWFpbgorICAgICAgICBJU19QQVJBTSAgICA9ICgxIDw8IDkpLCAgIC8vLzwgZm9yIHNldFBhcmFtZXRlcgorICAgICAgICBJU19DT05GSUcgICA9ICgxIDw8IDEwKSwgIC8vLzwgZm9yIGNvbmZpZ3VyZQorICAgICAgICBJU19SRUFEICAgICA9ICgxIDw8IDExKSwgIC8vLzwgZm9yIGdldEZvcm1hdAorCisgICAgICAgIC8vIHBvcnQgZG9tYWluCisgICAgICAgIElTX0lOUFVUICAgID0gKDEgPDwgMTIpLCAgLy8vPCBmb3IgaW5wdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19PVVRQVVQgICA9ICgxIDw8IDEzKSwgIC8vLzwgZm9yIG91dHB1dCBwb3J0IChnZXRGb3JtYXQpCisgICAgICAgIElTX1JBVyAgICAgID0gKDEgPDwgMTQpLCAgLy8vPCBmb3IgcmF3IHBvcnQgKGlucHV0LWVuY29kZXIsIG91dHB1dC1kZWNvZGVyKQorICAgICAgICBJU19DT0RFRCAgICA9ICgxIDw8IDE1KSwgIC8vLzwgZm9yIGNvZGVkIHBvcnQgKGlucHV0LWRlY29kZXIsIG91dHB1dC1lbmNvZGVyKQorCisgICAgICAgIEFMTCAgICAgPSB+MFUsCisgICAgICAgIE5PTkUgICAgPSAwLAorCisgICAgICAgIEFVRElPICAgPSB+KElTX0lNQUdFIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorICAgICAgICBWSURFTyAgID0gfihJU19BVURJTyB8IElTX0lNQUdFIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgSU1BR0UgICA9IH4oSVNfQVVESU8gfCBJU19WSURFTyB8IE9USEVSX0RPTUFJTiksCisKKyAgICAgICAgREVDT0RFUiA9IH4oSVNfRU5DT0RFUiB8IE9USEVSX0tJTkQpLAorICAgICAgICBFTkNPREVSID0gfihJU19ERUNPREVSIHwgT1RIRVJfS0lORCksCisKKyAgICAgICAgUEFSQU0gICA9IH4oSVNfQ09ORklHIHwgSVNfUkVBRCksCisgICAgICAgIENPTkZJRyAgPSB+KElTX1BBUkFNICB8IElTX1JFQUQpLAorICAgICAgICBSRUFEICAgID0gfihJU19DT05GSUcgfCBJU19QQVJBTSksCisKKyAgICAgICAgSU5QVVQgICA9IH4oSVNfT1VUUFVUIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBPVVRQVVQgID0gfihJU19JTlBVVCAgfCBJU19SQVcgICAgfCBJU19DT0RFRCksCisgICAgICAgIFJBVyAgICAgPSB+KElTX0lOUFVUICB8IElTX09VVFBVVCB8IElTX0NPREVEKSwKKyAgICAgICAgQ09ERUQgICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfT1VUUFVUKSwKKyAgICB9OworCisgICAgLy8gdGhpbmdzIHJlcXVpcmVkIHRvIG1hbmFnZSBmb3JtYXRzCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVBhcmFtRGVzY3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPiBtUGFyYW1VcGRhdGVyOworCisgICAgRG9tYWluIG1Eb21haW47IC8vIGNvbXBvbmVudCBkb21haW4KKyAgICBEb21haW4gbUlucHV0RG9tYWluOyAvLyBpbnB1dCBwb3J0IGRvbWFpbgorICAgIERvbWFpbiBtT3V0cHV0RG9tYWluOyAvLyBvdXRwdXQgcG9ydCBkb21haW4KKyAgICBzdGQ6OnN0cmluZyBtQ29kaW5nTWVkaWFUeXBlOyAgLy8gbWVkaWEgdHlwZSBvZiB0aGUgY29kZWQgc3RyZWFtCisKKyAgICAvLyBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGFuZGFyZFBhcmFtcz4gbVN0YW5kYXJkUGFyYW1zOworCisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdXBwb3J0ZWRJbmRpY2VzOyAvLy88IGluZGljZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gbVN1YnNjcmliZWRJbmRpY2VzOyAvLy88IGluZGljZXMgdG8gc3Vic2NyaWJlIHRvCisgICAgc2l6ZV90IG1TdWJzY3JpYmVkSW5kaWNlc1NpemU7IC8vLzwgY291bnQgb2YgY3VycmVudGx5IHN1YnNjcmliZWQgaW5kaWNlcworCisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKworICAgIGJvb2wgbVVzaW5nU3VyZmFjZTsgLy8vPCB1c2luZyBpbnB1dCBvciBvdXRwdXQgc3VyZmFjZQorCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZz4gbUlTQ29uZmlnOworCisgICAgLy8vIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFVwZGF0ZWQgYWZ0ZXIgY29uZmlndXJlKCkgYW5kIGJhc2VkIG9uIGNvbmZpZ1VwZGF0ZSBpbgorICAgIC8vLyBvbldvcmtEb25lCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gbUN1cnJlbnRDb25maWc7CisKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+Jik+IExvY2FsUGFyYW1WYWxpZGF0b3I7CisKKyAgICAvLy8gUGFyYW1ldGVyIGluZGljZXMgdHJhY2tlZCBpbiBjdXJyZW50IGNvbmZpZyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgLy8vIHRoZXNlIGFyZSBwcm92aWRlZCBzbyB0aGF0IG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIHJlbWFpbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgIC8vLyBhcyBzdWNoLCB0aGVzZSBwYXJhbWV0ZXJzIGhhdmUgbm8gZGVwZW5kZW5jaWVzLiBUT0RPOiB1c2UgQzJJbnRlcmZhY2VIZWxwZXIgZm9yIHRoaXMuCisgICAgLy8vIEZvciBub3cgc3VwcG9ydCBhIHZhbGlkYXRpb24gZnVuY3Rpb24uCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIExvY2FsUGFyYW1WYWxpZGF0b3I+IG1Mb2NhbFBhcmFtczsKKworICAgIENDb2RlY0NvbmZpZygpOworCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLAorICAgIC8vLyByZWZsZWN0ZWQgcGFyYW0gaGVscGVyLCBkb21haW4sIHN0YW5kYXJkIHBhcmFtcywgYW5kIHN1YnNjcmliZXMgdG8gc3RhbmRhcmQKKyAgICAvLy8gaW5kaWNlcy4KKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb2NhbGx5IG1haW50YWluZWQgcGFyYW1ldGVyLiBUaGlzIGlzIHVzZWQgZm9yIG91dHB1dCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlCisgICAgICogYXBwZW5kZWQgdG8gdGhlIG91dHB1dCBidWZmZXJzIGluIGNhc2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFOworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpIHx8IG1Mb2NhbFBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgiaWdub3JpbmcgbG9jYWwgcGFyYW0gJXMgKCUjeCkgYXMgaXQgaXMgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgKHVpbnQzMl90KWluZGV4LCBtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkgPyAic3VwcG9ydGVkIiA6ICJsb2NhbCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhbHJlYWR5IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IG9yIGFscmVhZHkgYWRkZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyYXAgdHlwZWQgdmFsaWRhdG9yIGludG8gdW50eXBlZCB2YWxpZGF0b3IKKyAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3I7CisgICAgICAgIGlmICh2YWxpZGF0b3JfKSB7CisgICAgICAgICAgICB2YWxpZGF0b3IgPSBbdmFsaWRhdG9yX10oc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+JiBwKXsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHR5cGVkKHN0YXRpY19jYXN0PFQqPihwLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIC8vIGlmIHBhcmFtZXRlciBpcyBjb3JyZWN0bHkgdHlwZWQKKyAgICAgICAgICAgICAgICBpZiAoVDo6RnJvbSh0eXBlZC5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdG9yXyh0eXBlZCk7CisgICAgICAgICAgICAgICAgICAgIHAucmVzZXQodHlwZWQucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBtTG9jYWxQYXJhbXMuZW1wbGFjZShpbmRleCwgdmFsaWRhdG9yKTsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxUPihuYW1lLCBhdHRyaWIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBkZWZhdWx0XywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIGlmIChhZGRMb2NhbFBhcmFtPFQ+KG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXykpIHsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3JfKSB7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gdmFsaWRhdG9yXyhkZWZhdWx0Xyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZGVmYXVsdCB2YWx1ZSBmb3IgJXMgaXMgaW52YWxpZCA9PiAlcyIsIG5hbWUuY19zdHIoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudENvbmZpZ1tUOjpQQVJBTV9UWVBFXSA9IHN0ZDo6bW92ZShkZWZhdWx0Xyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBUICpkZWZhdWx0XywgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgcmV0dXJuIGFkZExvY2FsUGFyYW0oc3RkOjp1bmlxdWVfcHRyPFQ+KGRlZmF1bHRfKSwgbmFtZSwgYXR0cmliLCB2YWxpZGF0b3JfKTsKKyAgICB9CisKKyAgICAvLy8gQXBwbGllcyBjb25maWd1cmF0aW9uIHVwZGF0ZXMsIGFuZCB1cGRhdGVzIGZvcm1hdCBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgZm9ybWF0cyB3ZXJlIHVwZGF0ZWQKKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbik7CisKKyAgICAvLy8gVXBkYXRlcyBmb3JtYXRzIGluIHRoZSBzcGVjaWZpYyBkb21haW4uIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGZvcm1hdHMgaGF2ZSBjaGFuZ2VkLgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgYm9vbCB1cGRhdGVGb3JtYXRzKERvbWFpbiBkb21haW4pOworCisgICAgLyoqCisgICAgICogQXBwbGllcyBTREsgY29uZmlndXJhdGlvbnMgaW4gYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRvbWFpbi4KKyAgICAgKiBVcGRhdGVzIHJlbGV2YW50IGlucHV0L291dHB1dCBmb3JtYXRzIGFuZCBzdWJzY3JpYmVzIHRvIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICogXHBhcmFtIGRvbWFpbiBjb25maWcvc2V0UGFyYW0gYml0bWFzaworICAgICAqIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnNka1BhcmFtcywgRG9tYWluIGRvbWFpbiwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25maWdVcGRhdGUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIHRvIHRoZSBjb21wb25lbnQuCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKTsKKworICAgIC8vLyBRdWVyaWVzIHN1YnNjcmliZWQgaW5kaWNlcyAod2hpY2ggY29udGFpbnMgYWxsIFNESy1leHBvc2VkIHZhbHVlcykgYW5kIHVwZGF0ZXMKKyAgICAvLy8gaW5wdXQvb3V0cHV0IGZvcm1hdHMuCisgICAgc3RhdHVzX3QgcXVlcnlDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8vLyBRdWVyaWVzIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdmFsdWUuIFJldHVybnMgbnVsbHB0ciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdAorICAgIC8vLyBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKyAgICBjb25zdCBDMlBhcmFtICpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFuZCBpZiB0aGV5IGNoYW5nZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBXYXRjaGVyIHsKKyAgICAgICAgfldhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkCisgICAgICAgIGJvb2wgaGFzQ2hhbmdlZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBtVmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnZhbHVlICE9ICptVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBtVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gdXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBhbmQgcmV0dXJucyBpdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4gdXBkYXRlKCkgeworICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUgPSBtUGFyZW50LT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShtSW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgV2F0Y2hlcihDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3QgQ0NvZGVjQ29uZmlnICpwYXJlbnQpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KSwgbUluZGV4KGluZGV4KSB7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQ0NvZGVjQ29uZmlnOworCisgICAgICAgIGNvbnN0IENDb2RlY0NvbmZpZyAqbVBhcmVudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IG1WYWx1ZTsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgd2F0Y2hlciBvYmplY3QgZm9yIGEgcGFyYW1ldGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgV2F0Y2hlcjxUPiB3YXRjaChDMlBhcmFtOjpJbmRleCBpbmRleCA9IFQ6OlBBUkFNX1RZUEUpIGNvbnN0IHsKKyAgICAgICAgaWYgKGluZGV4LnR5cGUoKSAhPSBUOjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBXYXRjaGVyPFQ+KGluZGV4LCB0aGlzKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCisgICAgdm9pZCBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKKworICAgIC8vLyBBZGRzIGluZGljZXMgdG8gdGhlIHN1YnNjcmliZWQgaW5kaWNlcywgYW5kIHVwZGF0ZWQgc3Vic2NyaXB0aW9uIHRvIGNvbXBvbmVudAorICAgIC8vLyBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nID0gQzJfRE9OVF9CTE9DSyk7CisKKyAgICAvLy8gR2V0cyBTREsgZm9ybWF0IGZyb20gY29kZWMgMi4wIHJlZmxlY3RlZCBjb25maWd1cmF0aW9uCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBzcDxBTWVzc2FnZT4gZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICAgICAgY29uc3QgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0ICZyZWZsZWN0ZWQsIERvbWFpbiBkb21haW4pIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluIGFuIEFNZXNzYWdlIHRvIGEgbGlzdCBvZiBwYXRoLWJhc2VkIENvZGVjCisgICAgICogMi4wIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKi8KKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgZ2V0UmVmbGVjdGVkRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZjb25maWcsIERvbWFpbiBkb21haW4pIGNvbnN0OworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKENDb2RlY0NvbmZpZzo6RG9tYWluKQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENfQ09ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTEzYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKQEAgLTAsMCArMSw4MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ29kZWMyQnVmZmVyCisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjYW5Db3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChjb25zdF9jYXN0PENvZGVjMkJ1ZmZlciAqPih0aGlzKS0+YmFzZSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA9PSAwdSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gY29weSBtb3JlIHRoYW4gb25lIGJsb2Nrcy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICAvLyBJdCB3b24ndCBmaXQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCBjYW5Db3B5TGluZWFyKCkgY2hlY2tzIHBhc3NlZC4KKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA9PSAwdSkgeworICAgICAgICBzZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEMyUmVhZFZpZXcgdmlldyA9IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkVycm9yIHdoaWxlIG1hcHBpbmc6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmlldy5jYXBhY2l0eSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRCgiQzJDb25zdExpbmVhckJsb2NrIGxpZWQgLS0tIGl0IGFjdHVhbGx5IGRvZXNuJ3QgZml0OiB2aWV3KCV1KSA+IHRoaXMoJXp1KSIsCisgICAgICAgICAgICAgICAgdmlldy5jYXBhY2l0eSgpLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoYmFzZSgpLCB2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICBzZXRSYW5nZSgwLCB2aWV3LmNhcGFjaXR5KCkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjMkJ1ZmZlcjo6c2V0SW1hZ2VEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEpIHsKKyAgICBtZXRhKCktPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YSk7CisgICAgZm9ybWF0KCktPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YSk7CisgICAgTWVkaWFJbWFnZTIgKmltZyA9IChNZWRpYUltYWdlMiopaW1hZ2VEYXRhLT5kYXRhKCk7CisgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDAgJiYgaW1nLT5tVHlwZSAhPSBpbWctPk1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTikgeworICAgICAgICBpbnQzMl90IHN0cmlkZSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgIGZvcm1hdCgpLT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOworICAgICAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMSAmJiBzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSAoaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpIC8gc3RyaWRlOworICAgICAgICAgICAgZm9ybWF0KCktPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBMb2NhbExpbmVhckJ1ZmZlcgorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTG9jYWxMaW5lYXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworLy8gRHVtbXlDb250YWluZXJCdWZmZXIKKworc3RhdGljIHVpbnQ4X3Qgc0R1bW15Qnl0ZVsxXSA9IHsgMCB9OworCitEdW1teUNvbnRhaW5lckJ1ZmZlcjo6RHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzRHVtbXlCeXRlLCAxKSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworICAgIHNldFJhbmdlKDAsIGJ1ZmZlciA/IDEgOiAwKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIER1bW15Q29udGFpbmVyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgY29uc3QgeworICAgIHJldHVybiAhbUJ1ZmZlclJlZjsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBtQnVmZmVyUmVmID0gYnVmZmVyOworICAgIHNldFJhbmdlKDAsIG1CdWZmZXJSZWYgPyAxIDogMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8TGluZWFyQmxvY2tCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spIHsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAod3JpdGVWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgTGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUod3JpdGVWaWV3KSwgYmxvY2spOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworYm9vbCBMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gY29weUxpbmVhcihidWZmZXIpOworfQorCitMaW5lYXJCbG9ja0J1ZmZlcjo6TGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBDMldyaXRlVmlldyYmIHdyaXRlVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHdyaXRlVmlldy5kYXRhKCksIHdyaXRlVmlldy5zaXplKCkpKSwKKyAgICAgIG1Xcml0ZVZpZXcod3JpdGVWaWV3KSwKKyAgICAgIG1CbG9jayhibG9jaykgeworfQorCisvLyBDb25zdExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIEMyUmVhZFZpZXcgcmVhZFZpZXcoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCkpOworICAgIGlmIChyZWFkVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUocmVhZFZpZXcpLCBidWZmZXIpOworfQorCitDb25zdExpbmVhckJsb2NrQnVmZmVyOjpDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJSZWFkVmlldyYmIHJlYWRWaWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcigKKyAgICAgICAgICAgIC8vIE5PVEU6IEFCdWZmZXIgb25seSB0YWtlcyBub24tY29uc3QgcG9pbnRlciBidXQgdGhpcyBkYXRhIGlzCisgICAgICAgICAgICAvLyAgICAgICBzdXBwb3NlZCB0byBiZSByZWFkLW9ubHkuCisgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVhZFZpZXcuZGF0YSgpKSwgcmVhZFZpZXcuY2FwYWNpdHkoKSkpLAorICAgICAgbVJlYWRWaWV3KHJlYWRWaWV3KSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCisvLyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBDMkdyYXBoaWNWaWV3IDw9PiBNZWRpYUltYWdlIGNvbnZlcnRlcgorICAgICAqCisgICAgICogXHBhcmFtIHZpZXcgQzJHcmFwaGljVmlldyBvYmplY3QKKyAgICAgKiBccGFyYW0gY29sb3JGb3JtYXQgZGVzaXJlZCBTREsgY29sb3IgZm9ybWF0IGZvciB0aGUgTWVkaWFJbWFnZSAoaWYgdGhpcyBpcyBhIGZsZXhpYmxlIGZvcm1hdCwKKyAgICAgKiAgICAgICAgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNpbXBseSByZXByZXNlbnQgdGhlIGdyYXBoaWMgdmlldyBhcyBhIGZsZXhpYmxlIFNESyBmb3JtYXQKKyAgICAgKiAgICAgICAgd2l0aG91dCBhIG1lbWNweSkKKyAgICAgKi8KKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyKAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgaW50MzJfdCBjb2xvckZvcm1hdCkKKyAgICAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgICAgIG1WaWV3KHZpZXcpLAorICAgICAgICAgIG1XaWR0aCh2aWV3LndpZHRoKCkpLAorICAgICAgICAgIG1IZWlnaHQodmlldy5oZWlnaHQoKSksCisgICAgICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKKyAgICAgICAgICBtQWxsb2NhdGVkRGVwdGgoMCksCisgICAgICAgICAgbUJhY2tCdWZmZXJTaXplKDApLAorICAgICAgICAgIG1NZWRpYUltYWdlKG5ldyBBQnVmZmVyKHNpemVvZihNZWRpYUltYWdlMikpKSB7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IHZpZXcuZXJyb3IoKSA9ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFJbWFnZTIgKm1lZGlhSW1hZ2UgPSAoTWVkaWFJbWFnZTIgKiltTWVkaWFJbWFnZS0+YmFzZSgpOworICAgICAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgPT0gMCkgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogMCBwbGFuZXMiKTsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUFsbG9jYXRlZERlcHRoID0gbGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aDsKKyAgICAgICAgdWludDMyX3QgYml0RGVwdGggPSBsYXlvdXQucGxhbmVzWzBdLmJpdERlcHRoOworCisgICAgICAgIC8vIGFsaWduIHdpZHRoIGFuZCBoZWlnaHQgdG8gc3VwcG9ydCBzdWJzYW1wbGluZyBjbGVhbmx5CisgICAgICAgIHVpbnQzMl90IG1TdHJpZGUgPSBhbGlnbihtV2lkdGgsIDIpICogZGl2VXAobGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICB1aW50MzJfdCBtVlN0cmlkZSA9IGFsaWduKG1IZWlnaHQsIDIpOworCisgICAgICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgeyAgLy8gdHJ5IHRvIG1hcCBkaXJlY3RseS4gY2hlY2sgaWYgdGhlIHBsYW5lcyBhcmUgbmVhciBvbmUgYW5vdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluUHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWF4UHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZVNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBtaW5PZmZzZXQgPSBwbGFuZS5taW5PZmZzZXQobVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1heE9mZnNldCA9IHBsYW5lLm1heE9mZnNldChtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5QdHIgPiBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWluT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UHRyIDwgbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciA9IG1WaWV3LmRhdGEoKVtpXSArIG1heE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVTaXplICs9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYykgKiBhbGlnbihtSGVpZ2h0LCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZyAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGFuIHVuZGVmaW5lZCBiZWhhdmlvciwgYnV0IGdyYWxsb2MgZG9lcyBhc3N1bWUgYSBjb250aWd1b3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Sb3dJbmMgPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLCBtYXhQdHIgLSBtaW5QdHIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGUgKiA1IC8gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IG1TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gbVN0cmlkZSAqIG1WU3RyaWRlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tQ29sSW5jID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQkE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtZWRpYSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBSR0JBIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047CisgICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1CaXREZXB0aCA9IGJpdERlcHRoOworICAgICAgICBtZWRpYUltYWdlLT5tQml0RGVwdGhBbGxvY2F0ZWQgPSBtQWxsb2NhdGVkRGVwdGg7CisKKyAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgicmlnaHRTaGlmdCB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLnJpZ2h0U2hpZnQpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoID4gOCAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IEMyUGxhbmVJbmZvOjpOQVRJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZW5kaWFubmVzcyB2YWx1ZSBvZiAldSB1bnN1cHBvcnRlZCIsIHBsYW5lLmVuZGlhbm5lc3MpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IG1BbGxvY2F0ZWREZXB0aCB8fCBwbGFuZS5iaXREZXB0aCAhPSBiaXREZXB0aCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkaWZmZXJlbnQgYWxsb2NhdGVkRGVwdGgvYml0RGVwdGggcGVyIHBsYW5lIHVuc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJTaXplICs9IG1TdHJpZGUgKiBtVlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgIH0KKworICAgICAgICBtQmFja0J1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbUluaXRDaGVjazsgfQorCisgICAgdWludDMyX3QgYmFja0J1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQmFja0J1ZmZlclNpemU7IH0KKworICAgIC8qKgorICAgICAqIFdyYXAgQzJHcmFwaGljVmlldyB1c2luZyBhIE1lZGlhSW1hZ2UyLiBOb3RlIHRoYXQgaWYgbm90IHdyYXBwZWQsIHRoZSBjb250ZW50IGlzIG5vdCBtYXBwZWQKKyAgICAgKiBpbiB0aGlzIGZ1bmN0aW9uIC0tLSB0aGUgY2FsbGVyIHNob3VsZCB1c2UgQ29weUdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2UoKSBmdW5jdGlvbiB0byBjb3B5IHRoZQorICAgICAqIGRhdGEgaW50byBhIGJhY2tpbmcgYnVmZmVyIGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIG1lZGlhIGJ1ZmZlci4gVGhpcyBpcyBudWxsIGlmIHdyYXBwaW5nIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiB3cmFwKCkgY29uc3QgeworICAgICAgICBpZiAobUJhY2tCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgc2V0QmFja0J1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYmFja0J1ZmZlcikgeworICAgICAgICBpZiAoYmFja0J1ZmZlci0+Y2FwYWNpdHkoKSA8IG1CYWNrQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJhY2tCdWZmZXItPnNldFJhbmdlKDAsIG1CYWNrQnVmZmVyU2l6ZSk7CisgICAgICAgIG1CYWNrQnVmZmVyID0gYmFja0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBDMkdyYXBoaWNWaWV3IHRvIE1lZGlhSW1hZ2UyLgorICAgICAqLworICAgIHN0YXR1c190IGNvcHlUb01lZGlhSW1hZ2UoKSB7CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1hZ2VDb3B5KG1CYWNrQnVmZmVyLT5iYXNlKCksIGdldE1lZGlhSW1hZ2UoKSwgbVZpZXcpOworICAgIH0KKworICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtTWVkaWFJbWFnZTsgfQorCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbUNvbG9yRm9ybWF0OyAgLy8vPCBTREsgY29sb3IgZm9ybWF0IGZvciBNZWRpYUltYWdlCisgICAgc3A8QUJ1ZmZlcj4gbVdyYXBwZWQ7ICAvLy88IHdyYXBwZWQgYnVmZmVyIChpZiB3ZSBjYW4gbWFwIEMyQnVmZmVyIHRvIGFuIEFCdWZmZXIpCisgICAgdWludDMyX3QgbUFsbG9jYXRlZERlcHRoOworICAgIHVpbnQzMl90IG1CYWNrQnVmZmVyU2l6ZTsKKyAgICBzcDxBQnVmZmVyPiBtTWVkaWFJbWFnZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IG1BbGxvYzsKKworICAgIHNwPEFCdWZmZXI+IG1CYWNrQnVmZmVyOyAgICAvLy88IGJhY2tpbmcgYnVmZmVyIGlmIHdlIGhhdmUgdG8gY29weSBDMkJ1ZmZlciA8PT4gQUJ1ZmZlcgorCisgICAgTWVkaWFJbWFnZTIgKmdldE1lZGlhSW1hZ2UoKSB7CisgICAgICAgIHJldHVybiAoTWVkaWFJbWFnZTIgKiltTWVkaWFJbWFnZS0+YmFzZSgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIEMyR3JhcGhpY1ZpZXcgdmlldyhibG9jay0+bWFwKCkuZ2V0KCkpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkMyR3JhcGhpY0Jsb2NrOjptYXAgZmFpbGVkOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKHZpZXcsIGNvbG9yRm9ybWF0KTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgd3JhcHBlZCA9IHRydWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyID0gYWxsb2MoY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCkpOworICAgICAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbmV3IEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6bW92ZSh2aWV3KSwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKK0dyYXBoaWNCbG9ja0J1ZmZlcjo6R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBidWZmZXIpLAorICAgICAgbVZpZXcodmlldyksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbUltYWdlRGF0YShpbWFnZURhdGEpLAorICAgICAgbVdyYXBwZWQod3JhcHBlZCkgeworICAgIHNldEltYWdlRGF0YShpbWFnZURhdGEpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1WaWV3LndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVZpZXcuaGVpZ2h0KCk7CisgICAgaWYgKCFtV3JhcHBlZCkgeworICAgICAgICAodm9pZClJbWFnZUNvcHkobVZpZXcsIGJhc2UoKSwgaW1hZ2VEYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBtQmxvY2stPnNoYXJlKEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSwgQzJGZW5jZSgpKSk7Cit9CisKKy8vIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcgorR3JhcGhpY01ldGFkYXRhQnVmZmVyOjpHcmFwaGljTWV0YWRhdGFCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkpLAorICAgICAgbUFsbG9jKGFsbG9jKSB7CisgICAgKChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFzZSgpKS0+cEJ1ZmZlciA9IG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY01ldGFkYXRhQnVmZmVyOjphc0MyQnVmZmVyKCkgeworI2lmbmRlZiBfX0xQNjRfXworICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKm1ldGEgPSAoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqKW1ldGEtPnBCdWZmZXI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJWaWRlb05hdGl2ZU1ldGFkYXRhIGNvbnRhaW5zIG51bGwgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEFMT0dWKCJWaWRlb05hdGl2ZU1ldGFkYXRhOiAlZHglZCIsIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KTsKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKGJ1ZmZlci0+aGFuZGxlKSwKKyAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgYnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+c3RyaWRlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gd3JhcCBWaWRlb05hdGl2ZU1ldGFkYXRhIGludG8gQzJHcmFwaGljQWxsb2NhdGlvbiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIG1ldGEtPnBCdWZmZXIgPSAwOworICAgIC8vIFRPRE86IGZlbmNlCisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgYmxvY2stPnNoYXJlKEMyUmVjdChidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCksIEMyRmVuY2UoKSkpOworI2Vsc2UKKyAgICBBTE9HRSgiR3JhcGhpY01ldGFkYXRhQnVmZmVyIGRvZXMgbm90IHdvcmsgb24gNjQtYml0IGFyY2giKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyNlbmRpZgorfQorCisvLyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiQzJCdWZmZXIgcHJlY29uZCBmYWlsIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldyhzdGQ6Om1ha2VfdW5pcXVlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IGhvbGRlcjsKKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKCp2aWV3LCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBib29sIHdyYXBwZWQgPSB0cnVlOworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBjb252ZXJ0ZXIud3JhcCgpOworICAgIGlmIChhQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYUJ1ZmZlciA9IGFsbG9jKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihhQnVmZmVyKSkgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBmYWlsZWQgdG8gc2V0IGJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB3cmFwcGVkID0gZmFsc2U7CisgICAgICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIHZpZXcuCisgICAgICAgIGhvbGRlciA9IHN0ZDo6bW92ZSh2aWV3KTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBzdGQ6Om1vdmUodmlldyksCisgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICBjb252ZXJ0ZXIuaW1hZ2VEYXRhKCksCisgICAgICAgICAgICB3cmFwcGVkKTsKK30KKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgfHwgIWZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBBTE9HRCgiZm9ybWF0IGhhZCBubyB3aWR0aCAvIGhlaWdodCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlcihhbGxvYyh3aWR0aCAqIGhlaWdodCAqIDQpKTsKKyAgICByZXR1cm4gbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgYUJ1ZmZlciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIGZhbHNlKTsKK30KKworQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFCdWZmZXIsCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiAmJnZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgYm9vbCB3cmFwcGVkKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgYUJ1ZmZlciksCisgICAgICBtVmlldyhzdGQ6Om1vdmUodmlldykpLAorICAgICAgbUJ1ZmZlclJlZihidWZmZXIpLAorICAgICAgbVdyYXBwZWQod3JhcHBlZCkgeworICAgIGlmIChpbWFnZURhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgbVZpZXcucmVzZXQoKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChtV3JhcHBlZCB8fCBtQnVmZmVyUmVmKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogJXN3cmFwcGVkIDsgYnVmZmVyIHJlZiAlcyIsCisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPyAiIiA6ICJub3QgIiwgbUJ1ZmZlclJlZiA/ICJleGlzdHMiIDogImRvZXNuJ3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGJ1ZmZlciBwcmVjb25kaXRpb24gdW5zYXRpc2ZpZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IHRvbyBtYW55IGJsb2NrcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIC8vIEZJWE1FOiBmb3JtYXQoKSBpcyBub3QgY29uc3QsIGJ1dCB3ZSBjYW5ub3QgY2hhbmdlIGl0LCBzbyBkbyBhIGNvbnN0IGNhc3QgaGVyZQorICAgIGNvbnN0X2Nhc3Q8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIgKj4odGhpcyktPmZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQpOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCkgPiBjYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogaW5zdWZmaWNpZW50IGNhcGFjaXR5OiByZXEgJXUgaGFzICV6dSIsCisgICAgICAgICAgICAgICAgY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCksIGNhcGFjaXR5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgPT0gMCkgeworICAgICAgICBzZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICBmb3JtYXQoKS0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpOworCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoCisgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCksIGNvbG9yRm9ybWF0KTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogY29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGJhc2UoKSwgY2FwYWNpdHkoKSk7CisgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihhQnVmZmVyKSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHk6IHNldCBiYWNrIGJ1ZmZlciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb252ZXJ0ZXIuY29weVRvTWVkaWFJbWFnZSgpOworICAgIHNldEltYWdlRGF0YShjb252ZXJ0ZXIuaW1hZ2VEYXRhKCkpOworICAgIG1CdWZmZXJSZWYgPSBidWZmZXI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyCisKK0VuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnksCisgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSkKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKG1lbW9yeS0+cG9pbnRlcigpLCBtZW1vcnktPnNpemUoKSkpLAorICAgICAgbUJsb2NrKGJsb2NrKSwKKyAgICAgIG1NZW1vcnkobWVtb3J5KSwKKyAgICAgIG1IZWFwU2VxTnVtKGhlYXBTZXFOdW0pIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihtQmxvY2stPnNoYXJlKG9mZnNldCgpLCBzaXplKCksIEMyRmVuY2UoKSkpOworfQorCit2b2lkIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpmaWxsU291cmNlQnVmZmVyKAorICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgKnNvdXJjZSkgeworICAgIHNvdXJjZS0+bVNoYXJlZE1lbW9yeSA9IG1NZW1vcnk7CisgICAgc291cmNlLT5tSGVhcFNlcU51bSA9IG1IZWFwU2VxTnVtOworfQorCit2b2lkIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpmaWxsU291cmNlQnVmZmVyKAorICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciAqc291cmNlKSB7CisgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisKKyAgICBtSGlkbE1lbW9yeSA9IGhhcmR3YXJlOjpmcm9tSGVhcChtTWVtb3J5LT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpKTsKKyAgICBzb3VyY2UtPmhlYXBCYXNlID0gKm1IaWRsTWVtb3J5OworICAgIHNvdXJjZS0+b2Zmc2V0ID0gb2Zmc2V0OworICAgIHNvdXJjZS0+c2l6ZSA9IHNpemU7Cit9CisKK2Jvb2wgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmNvcHlEZWNyeXB0ZWRDb250ZW50KAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGVjcnlwdGVkLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgQzJXcml0ZVZpZXcgdmlldyA9IG1CbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2aWV3LnNpemUoKSA8IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSh2aWV3LmRhdGEoKSwgZGVjcnlwdGVkLT5wb2ludGVyKCksIGxlbmd0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShzaXplX3QgbGVuZ3RoKSB7CisgICAgcmV0dXJuIGNvcHlEZWNyeXB0ZWRDb250ZW50KG1NZW1vcnksIGxlbmd0aCk7Cit9CisKK25hdGl2ZV9oYW5kbGVfdCAqRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJsb2NrLT5oYW5kbGUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxOTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0JVRkZFUl9IXworCisjZGVmaW5lIENPREVDMl9CVUZGRVJfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDb3BpZXMgYSBncmFwaGljIHZpZXcgaW50byBhIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogQ29waWVzIGEgbWVkaWEgaW1hZ2UgaW50byBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCitjbGFzcyBDb2RlYzJCdWZmZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0J1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgTWVkaWFDb2RlY0J1ZmZlcjo6TWVkaWFDb2RlY0J1ZmZlcjsKKyAgICB+Q29kZWMyQnVmZmVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogXHJldHVybiAgQzJCdWZmZXIgb2JqZWN0IHJlcHJlc2VudHMgdGhpcyBidWZmZXIuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIHdlIGNhbiBjb3B5IHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IGludG8gdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byBjb3B5LgorICAgICAqIFxyZXR1cm4gIHRydWUgICAgaWYgdGhlIGNvbnRlbnQgb2YgYnVmZmVyIGNhbiBiZSBjb3BpZWQgb3ZlciB0byB0aGlzIGJ1ZmZlcgorICAgICAqICAgICAgICAgIGZhbHNlICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgICAgICAodm9pZClidWZmZXI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IGludG8gdGhpcyBvYmplY3QuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdAorICAgICAqIGNhbkNvcHkoKSBjaGVjayBhbHJlYWR5IHBhc3NlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIGNhbkNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjYW5Db3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBjb3B5KCkgaW1wbGVtZW50YXRpb24gZm9yIGxpbmVhciBidWZmZXJzLgorICAgICAqLworICAgIGJvb2wgY29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpOworCisgICAgLyoqCisgICAgICogc2V0cyBNZWRpYUltYWdlIGRhdGEgZm9yIGZsZXhpYmxlIGdyYXBoaWMgYnVmZmVycworICAgICAqLworICAgIHZvaWQgc2V0SW1hZ2VEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEpOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiBsb2NhbCBsaW5lYXIgYnVmZmVyLiBUaGlzIGNhbm5vdAorICogY3Jvc3MgcHJvY2VzcyBib3VuZGFyeSBzbyBhc0MyQnVmZmVyKCkgcmV0dXJucyBvbmx5IG51bGxwdHIuCisgKi8KK2NsYXNzIExvY2FsTGluZWFyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQ29kZWMyQnVmZmVyOjpDb2RlYzJCdWZmZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBvbmx5IGFzIGEgZHVtbXkgd3JhcHBlciBhcm91bmQgYQorICogQzJCdWZmZXIgb2JqZWN0LgorICovCitjbGFzcyBEdW1teUNvbnRhaW5lckJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIER1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jayBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgdmlydHVhbCB+TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJXcml0ZVZpZXcgJiZ3cml0ZVZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgQzJXcml0ZVZpZXcgbVdyaXRlVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkNvbnN0TGluZWFyQmxvY2suCisgKi8KK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBsaW5lYXIgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIH5Db25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJSZWFkVmlldyAmJnJlYWRWaWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMlJlYWRWaWV3IG1SZWFkVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrLgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgR3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkdyYXBoaWNCbG9jayBvYmplY3QuCisgICAgICogSWYgfGJsb2NrfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG92ZXIgYXQgYXNDMkJ1ZmZlcigpLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgQzJHcmFwaGljQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgR3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIGlubGluZSBNZWRpYUltYWdlMiAqaW1hZ2VEYXRhKCkgeyByZXR1cm4gKE1lZGlhSW1hZ2UyICopbUltYWdlRGF0YS0+ZGF0YSgpOyB9CisKKyAgICBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbUJsb2NrOworICAgIHNwPEFCdWZmZXI+IG1JbWFnZURhdGE7CisgICAgY29uc3QgYm9vbCBtV3JhcHBlZDsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgVmlkZW9OYXRpdmVNZXRhZGF0YS4KKyAqLworY2xhc3MgR3JhcGhpY01ldGFkYXRhQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciB3aXRoIGxvY2FsIGxpbmVhciBidWZmZXIgZm9yCisgICAgICogVmlkZW9OYXRpdmVNZXRhZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICovCisgICAgR3JhcGhpY01ldGFkYXRhQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+R3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigpID0gZGVsZXRlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2M7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIGdyYXBoaWMgQzJCdWZmZXIgb2JqZWN0LgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciB3cmFwcGluZyBhcm91bmQgQzJCdWZmZXIgb2JqZWN0LgorICAgICAqIElmIHxidWZmZXJ8IGlzIG5vdCBpbiBnb29kIGNvbG9yIGZvcm1hdHMsIGl0IGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgb3ZlciB0byBleHBvc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBncmFwaGljIEMyQnVmZmVyIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccGFyYW0gICBhbGxvYyAgIGEgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYmFja2luZyBBQnVmZmVyIGlmIG5lZWRlZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHJlYWRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIHdoaWNoIGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgb3ZlciB0byBleHBvc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCBubyB3cmFwcGluZyBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUVtcHR5KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+ICYmdmlldywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgICAgICBib29sIHdyYXBwZWQpOworICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBtVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7CisgICAgY29uc3QgYm9vbCBtV3JhcHBlZDsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jayBmb3IgY29tcG9uZW50CisgKiBhbmQgSU1lbW9yeSBmb3IgY2xpZW50LiBVbmRlcmx5aW5nIEMyTGluZWFyQmxvY2sgd29uJ3QgYmUgbWFwcGVkIGZvciBzZWN1cmUKKyAqIHVzZWNhc2VzLi4KKyAqLworY2xhc3MgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRW5jcnlwdGVkTGluZWFyQnVmZmVyQmxvY2sgd3JhcHBpbmcgYXJvdW5kIEMyTGluZWFyQmxvY2sKKyAgICAgKiBvYmplY3QgYW5kIHdyaXRhYmxlIElNZW1vcnkgcmVnaW9uLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICAgICAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBibG9jayAgICAgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccGFyYW0gICBtZW1vcnkgICAgICBJTWVtb3J5IG9iamVjdCB0byBzdG9yZSBlbmNyeXB0ZWQgY29udGVudC4KKyAgICAgKiBccGFyYW0gICBoZWFwU2VxTnVtICBIZWFwIHNlcXVlbmNlIG51bWJlciBmcm9tIElDcnlwdG87IC0xIGlmIE4vQQorICAgICAqLworICAgIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSA9IC0xKTsKKyAgICBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgdmlydHVhbCB+RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEZpbGwgdGhlIHNvdXJjZSBidWZmZXIgc3RydWN0dXJlIHdpdGggYXBwcm9wcmlhdGUgdmFsdWUgYmFzZWQgb24KKyAgICAgKiBpbnRlcm5hbCBJTWVtb3J5IG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzb3VyY2UgIHNvdXJjZSBidWZmZXIgc3RydWN0dXJlIHRvIGZpbGwuCisgICAgICovCisgICAgdm9pZCBmaWxsU291cmNlQnVmZmVyKElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKTsKKyAgICB2b2lkIGZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciAqc291cmNlKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGRlY3J5cHRlZHwgaW50byBDMkxpbmVhckJsb2NrIGluc2lkZS4gVGhpcyBzaGFsbAorICAgICAqIG9ubHkgYmUgY2FsbGVkIGluIG5vbi1zZWN1cmUgdXNlY2FzZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBkZWNyeXB0ZWQgICBkZWNyeXB0ZWQgY29udGVudCB0byBjb3B5IGZyb20uCisgICAgICogXHBhcmFtICAgbGVuZ3RoICAgICAgbGVuZ3RoIG9mIHRoZSBjb250ZW50CisgICAgICogXHJldHVybiAgdHJ1ZSAgICAgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGNvcHlEZWNyeXB0ZWRDb250ZW50KGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiBpbnRlcm5hbCBJTWVtb3J5IG9iamVjdCBpbnRvIEMyTGluZWFyQmxvY2sgaW5zaWRlLgorICAgICAqIFRoaXMgc2hhbGwgb25seSBiZSBjYWxsZWQgaW4gbm9uLXNlY3VyZSB1c2VjYXNlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGxlbmd0aCAgICAgIGxlbmd0aCBvZiB0aGUgY29udGVudAorICAgICAqIFxyZXR1cm4gIHRydWUgICAgICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb3B5RGVjcnlwdGVkQ29udGVudEZyb21NZW1vcnkoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbmF0aXZlIGhhbmRsZSBvZiBzZWN1cmUgYnVmZmVyIHVuZGVyc3Rvb2QgYnkgSUNyeXB0by4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2VjdXJlIGJ1ZmZlciBoYW5kbGUKKyAgICAgKi8KKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIGNvbnN0OworCitwcml2YXRlOgorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1CbG9jazsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIHNwPGhhcmR3YXJlOjpIaWRsTWVtb3J5PiBtSGlkbE1lbW9yeTsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYwMjdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcApAQCAtMCwwICsxLDU5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMySW5mb0J1aWxkZXIiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorCisjaW5jbHVkZSA8T01YX0F1ZGlvLmg+CisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8T01YX1R5cGVzLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0FzU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214T2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE5vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNpbmNsdWRlICJDb2RlYzJJbmZvQnVpbGRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIFRyYWl0cyA9IEMyQ29tcG9uZW50OjpUcmFpdHM7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworYm9vbCBoYXNQcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHByZWZpeCkgeworICAgIHNpemVfdCBwcmVmaXhMZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICByZXR1cm4gcy5jb21wYXJlKDAsIHByZWZpeExlbiwgcHJlZml4KSA9PSAwOworfQorCitib29sIGhhc1N1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgY2hhciogc3VmZml4KSB7CisgICAgc2l6ZV90IHN1ZmZpeExlbiA9IHN0cmxlbihzdWZmaXgpOworICAgIHJldHVybiBzdWZmaXhMZW4gPiBzLnNpemUoKSA/IGZhbHNlIDoKKyAgICAgICAgICAgIHMuY29tcGFyZShzLnNpemUoKSAtIHN1ZmZpeExlbiwgc3VmZml4TGVuLCBzdWZmaXgpID09IDA7Cit9CisKKy8vIENvbnN0YW50cyBmcm9tIEFDb2RlYworY29uc3RleHByIE9NWF9VMzIga1BvcnRJbmRleElucHV0ID0gMDsKK2NvbnN0ZXhwciBPTVhfVTMyIGtQb3J0SW5kZXhPdXRwdXQgPSAxOworY29uc3RleHByIE9NWF9VMzIga01heEluZGljZXNUb0NoZWNrID0gMzI7CisKK3N0YXR1c190IHF1ZXJ5T214Q2FwYWJpbGl0aWVzKAorICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2FwcykgeworCisgICAgY29uc3QgY2hhciAqcm9sZSA9IEdldENvbXBvbmVudFJvbGUoaXNFbmNvZGVyLCBtaW1lKTsKKyAgICBpZiAocm9sZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM6OkxXT214Tm9kZTsKKworICAgIHNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAoIW9teCkgeworICAgICAgICBBTE9HVygiQ291bGQgbm90IG9idGFpbiBJT214IHNlcnZpY2UuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0cnVjdCBPYnNlcnZlciA6IElPbXhPYnNlcnZlciB7CisgICAgICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uTWVzc2FnZXMoY29uc3QgaGlkbF92ZWM8TWVzc2FnZT4mKSBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHNwPE9ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBPYnNlcnZlcigpOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SU9teE5vZGU+IHRPbXhOb2RlOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG9teC0+YWxsb2NhdGVOb2RlKAorICAgICAgICAgICAgbmFtZSwgb2JzZXJ2ZXIsCisgICAgICAgICAgICBbJnN0YXR1cywgJnRPbXhOb2RlXShTdGF0dXMgcywgY29uc3Qgc3A8SU9teE5vZGU+JiBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICB0T214Tm9kZSA9IG47CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HVygiSU9teDo6YWxsb2NhdGVOb2RlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HVygiSU9teDo6YWxsb2NhdGVOb2RlIC0tIGVycm9yIHJldHVybmVkOiAlZC4iLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPExXT214Tm9kZT4gb214Tm9kZSA9IG5ldyBMV09teE5vZGUodE9teE5vZGUpOworCisgICAgc3RhdHVzX3QgZXJyID0gU2V0Q29tcG9uZW50Um9sZShvbXhOb2RlLCByb2xlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG9teE5vZGUtPmZyZWVOb2RlKCk7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gU2V0Q29tcG9uZW50Um9sZTogY29tcG9uZW50ID0gJXMsIHJvbGUgPSAlcy4iLAorICAgICAgICAgICAgICAgIG5hbWUsIHJvbGUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJvb2wgaXNWaWRlbyA9IGhhc1ByZWZpeChtaW1lLCAidmlkZW8vIikgPT0gMDsKKyAgICBib29sIGlzSW1hZ2UgPSBoYXNQcmVmaXgobWltZSwgImltYWdlLyIpID09IDA7CisKKyAgICBpZiAoaXNWaWRlbyB8fCBpc0ltYWdlKSB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHBhcmFtOworICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbSk7CisgICAgICAgIHBhcmFtLm5Qb3J0SW5kZXggPSBpc0VuY29kZXIgPyBrUG9ydEluZGV4T3V0cHV0IDoga1BvcnRJbmRleElucHV0OworCisgICAgICAgIGZvciAoT01YX1UzMiBpbmRleCA9IDA7IGluZGV4IDw9IGtNYXhJbmRpY2VzVG9DaGVjazsgKytpbmRleCkgeworICAgICAgICAgICAgcGFyYW0ublByb2ZpbGVJbmRleCA9IGluZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwocGFyYW0uZVByb2ZpbGUsIHBhcmFtLmVMZXZlbCk7CisKKyAgICAgICAgICAgIC8vIEFWQyBjb21wb25lbnRzIG1heSBub3QgbGlzdCB0aGUgY29uc3RyYWluZWQgcHJvZmlsZXMgZXhwbGljaXRseSwgYnV0CisgICAgICAgICAgICAvLyBkZWNvZGVycyB0aGF0IHN1cHBvcnQgYSBwcm9maWxlIGFsc28gc3VwcG9ydCBpdHMgY29uc3RyYWluZWQgdmVyc2lvbi4KKyAgICAgICAgICAgIC8vIEVuY29kZXJzIG11c3QgZXhwbGljaXRseSBzdXBwb3J0IGNvbnN0cmFpbmVkIHByb2ZpbGVzLgorICAgICAgICAgICAgaWYgKCFpc0VuY29kZXIgJiYgc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChPTVhfVklERU9fQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCwgcGFyYW0uZUxldmVsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmVQcm9maWxlID09IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE9NWF9WSURFT19BVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSwgcGFyYW0uZUxldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBrTWF4SW5kaWNlc1RvQ2hlY2spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdG9wcGluZyBjaGVja2luZyBwcm9maWxlcyBhZnRlciAldTogJXgvJXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lUHJvZmlsZSwgcGFyYW0uZUxldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbG9yIGZvcm1hdCBxdWVyeQorICAgICAgICAvLyByZXR1cm4gY29sb3JzIGluIHRoZSBvcmRlciByZXBvcnRlZCBieSB0aGUgT01YIGNvbXBvbmVudAorICAgICAgICAvLyBwcmVmaXggImZsZXhpYmxlIiBzdGFuZGFyZCBvbmVzIHdpdGggdGhlIGZsZXhpYmxlIGVxdWl2YWxlbnQKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHBvcnRGb3JtYXQ7CisgICAgICAgIEluaXRPTVhQYXJhbXMoJnBvcnRGb3JtYXQpOworICAgICAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSBpc0VuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICBmb3IgKE9NWF9VMzIgaW5kZXggPSAwOyBpbmRleCA8PSBrTWF4SW5kaWNlc1RvQ2hlY2s7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIHBvcnRGb3JtYXQubkluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAmcG9ydEZvcm1hdCwgc2l6ZW9mKHBvcnRGb3JtYXQpKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT01YX1UzMiBmbGV4aWJsZUVxdWl2YWxlbnQ7CisgICAgICAgICAgICBpZiAoSXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBvbXhOb2RlLCBwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCwgZmFsc2UgLyogdXNpbmdOYXRpdmVXaW5kb3cgKi8sCisgICAgICAgICAgICAgICAgICAgICZmbGV4aWJsZUVxdWl2YWxlbnQpKSB7CisgICAgICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoZmxleGlibGVFcXVpdmFsZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KTsKKworICAgICAgICAgICAgaWYgKGluZGV4ID09IGtNYXhJbmRpY2VzVG9DaGVjaykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0b3BwaW5nIGNoZWNraW5nIGZvcm1hdHMgYWZ0ZXIgJXU6ICVzKCV4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykgPT0gMCkgeworICAgICAgICAvLyBNb3JlIGF1ZGlvIGNvZGVjcyBpZiB0aGV5IGhhdmUgcHJvZmlsZXMuCisgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX1BST0ZJTEVUWVBFIHBhcmFtOworICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbSk7CisgICAgICAgIHBhcmFtLm5Qb3J0SW5kZXggPSBpc0VuY29kZXIgPyBrUG9ydEluZGV4T3V0cHV0IDoga1BvcnRJbmRleElucHV0OworICAgICAgICBmb3IgKE9NWF9VMzIgaW5kZXggPSAwOyBpbmRleCA8PSBrTWF4SW5kaWNlc1RvQ2hlY2s7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIHBhcmFtLm5Qcm9maWxlSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9teE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb1Byb2ZpbGVRdWVyeVN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgJnBhcmFtLCBzaXplb2YocGFyYW0pKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZvciBhdWRpbywgbGV2ZWwgaXMgaWdub3JlZC4KKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwYXJhbS5lUHJvZmlsZSwgMCAvKiBsZXZlbCAqLyk7CisKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBrTWF4SW5kaWNlc1RvQ2hlY2spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBzdG9wcGluZyBjaGVja2luZyBwcm9maWxlcyBhZnRlciAldTogJXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lUHJvZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiBXaXRob3V0IEFuZHJvaWQgZXh0ZW5zaW9ucywgT01YIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVlcnkKKyAgICAgICAgLy8gQUFDIHByb2ZpbGUgc3VwcG9ydAorICAgICAgICBpZiAocGFyYW0ublByb2ZpbGVJbmRleCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiY29tcG9uZW50ICVzIGRvZXNuJ3Qgc3VwcG9ydCBwcm9maWxlIHF1ZXJ5LiIsIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzVmlkZW8gJiYgIWlzRW5jb2RlcikgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnNpZGViYW5kSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG9teE5vZGUtPmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgMCwgJnNpZGViYW5kSGFuZGxlKSA9PSBPSykgeworICAgICAgICAgICAgLy8gdHVubmVsZWQgcGxheWJhY2sgaW5jbHVkZXMgYWRhcHRpdmUgcGxheWJhY2sKKyAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNBZGFwdGl2ZVBsYXliYWNrCisgICAgICAgICAgICAgICAgICAgIHwgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c1R1bm5lbGVkUGxheWJhY2spOworICAgICAgICB9IGVsc2UgaWYgKG9teE5vZGUtPnNldFBvcnRNb2RlKAorICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXIpID09IE9LIHx8CisgICAgICAgICAgICAgICAgb214Tm9kZS0+cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsCisgICAgICAgICAgICAgICAgMTI4MCAvKiB3aWR0aCAqLywgNzIwIC8qIGhlaWdodCAqLykgPT0gT0spIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNBZGFwdGl2ZVBsYXliYWNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc1ZpZGVvICYmIGlzRW5jb2RlcikgeworICAgICAgICBPTVhfVklERU9fQ09ORklHX0FORFJPSURfSU5UUkFSRUZSRVNIVFlQRSBwYXJhbXM7CisgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIHZlcmlmeSBpZiBmYWxsYmFjayBpcyBzdXBwb3J0ZWQ/CisgICAgICAgIGlmIChvbXhOb2RlLT5nZXRDb25maWcoCisgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZEludHJhUmVmcmVzaCwKKyAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgPT0gT0spIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZEZsYWdzKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2gpOworICAgICAgICB9CisgICAgfQorCisgICAgb214Tm9kZS0+ZnJlZU5vZGUoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgYnVpbGRPbXhJbmZvKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJiBwYXJzZXIsCisgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CisgICAgdWludDMyX3Qgb214UmFuayA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCB1aW50MzJfdCgweDEwMCkpOworICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjJiBjb2RlYyA6IHBhcnNlci5nZXRDb2RlY01hcCgpKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0gY29kZWMuZmlyc3Q7CisgICAgICAgIGlmICghaGFzUHJlZml4KGNvZGVjLmZpcnN0LCAiT01YLiIpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gY29kZWMuc2Vjb25kOworICAgICAgICBib29sIGVuY29kZXIgPSBwcm9wZXJ0aWVzLmlzRW5jb2RlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBpbmZvID0KKyAgICAgICAgICAgICAgICB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgICAgIGluZm8tPnNldE5hbWUobmFtZS5jX3N0cigpKTsKKyAgICAgICAgaW5mby0+c2V0T3duZXIoImRlZmF1bHQiKTsKKyAgICAgICAgaW5mby0+c2V0RW5jb2RlcihlbmNvZGVyKTsKKyAgICAgICAgaW5mby0+c2V0UmFuayhvbXhSYW5rKTsKKyAgICAgICAgZm9yIChjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6VHlwZSYgdHlwZSA6IHByb3BlcnRpZXMudHlwZU1hcCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm1pbWUgPSB0eXBlLmZpcnN0OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGNhcHMgPQorICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZhdHRyTWFwID0gdHlwZS5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGUmIGF0dHIgOiBhdHRyTWFwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmtleSA9IGF0dHIuZmlyc3Q7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnZhbHVlID0gYXR0ci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChrZXksICJmZWF0dXJlLSIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhaGFzUHJlZml4KGtleSwgImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgaGFzUHJlZml4KHZhbHVlLCAiMSIpID8gMSA6IDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZERldGFpbChrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcXVlcnlPbXhDYXBhYmlsaXRpZXMoCisgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBjYXBzLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGNhcGFiaWxpdGllcyBmb3IgJXMgKG1pbWU6ICVzKS4gRXJyb3I6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZXJyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworc3RhdHVzX3QgQ29kZWMySW5mb0J1aWxkZXI6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgeworICAgIC8vIFRPRE86IFJlbW92ZSBydW4tdGltZSBjb25maWd1cmF0aW9ucyBvbmNlIGFsbCBjb2RlY3MgYXJlIHdvcmtpbmcKKyAgICAvLyBwcm9wZXJseS4gKEFzc3VtZSAiZnVsbCIgYmVoYXZpb3IgZXZlbnR1YWxseS4pCisgICAgLy8KKyAgICAvLyBkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWMgc3VwcG9ydHMgNSB2YWx1ZXMuCisgICAgLy8gICAwIC0gT25seSBPTVggY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlLgorICAgIC8vICAgMSAtIEF1ZGlvIGRlY29kZXJzIGFuZCBlbmNvZGVycyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUKKyAgICAvLyAgICAgICBhbmQgcmFua2VkIGZpcnN0LgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSB3aXRoCisgICAgLy8gICAgICAgdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMiAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi52ZGEuIiBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsCisgICAgLy8gICAgICAgcmFua3MuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBzdWZmaXggIi5hdmMuZGVjb2RlciIgb3IgIi5hdmMuZW5jb2RlciIKKyAgICAvLyAgICAgICBhcmUgYXZhaWxhYmxlIGJ1dCByYW5rZWQgbGFzdC4KKyAgICAvLyAgIDMgLSBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSBhbmQgcmFua2VkCisgICAgLy8gICAgICAgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLyAgIDQgLSBBbGwgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vCisgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgKGJvb3QgdGltZSkgaXMgMS4KKyAgICAvLworICAgIC8vIE5vdGU6IEN1cnJlbnRseSwgT01YIGNvbXBvbmVudHMgaGF2ZSBkZWZhdWx0IHJhbmsgMHgxMDAsIHdoaWxlIGFsbAorICAgIC8vIENvZGVjMi4wIHNvZnR3YXJlIGNvbXBvbmVudHMgaGF2ZSBkZWZhdWx0IHJhbmsgMHgyMDAuCisgICAgaW50IG9wdGlvbiA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIDEpOworCisgICAgLy8gT2J0YWluIENvZGVjMkNsaWVudAorICAgIHN0ZDo6dmVjdG9yPFRyYWl0cz4gdHJhaXRzID0gQ29kZWMyQ2xpZW50OjpMaXN0Q29tcG9uZW50cygpOworCisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyKAorICAgICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRTZWFyY2hEaXJzLAorICAgICAgICAgICAgb3B0aW9uID09IDAgPyAibWVkaWFfY29kZWNzLnhtbCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWFfY29kZWNzX2MyLnhtbCIsCisgICAgICAgICAgICBvcHRpb24gPT0gMCA/ICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2VfYzIueG1sIik7CisgICAgaWYgKHBhcnNlci5nZXRQYXJzaW5nU3RhdHVzKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIlhNTCBwYXJzZXIgbm8gZ29vZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYm9vbCBzdXJmYWNlVGVzdChDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgpKTsKKyAgICBpZiAob3B0aW9uID09IDAgfHwgIXN1cmZhY2VUZXN0KSB7CisgICAgICAgIGJ1aWxkT214SW5mbyhwYXJzZXIsIHdyaXRlcik7CisgICAgfQorCisgICAgZm9yIChjb25zdCBUcmFpdHMmIHRyYWl0IDogdHJhaXRzKSB7CisgICAgICAgIEMyQ29tcG9uZW50OjpyYW5rX3QgcmFuayA9IHRyYWl0LnJhbms7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmID0KKyAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgIGlmICghaW50ZiB8fCBwYXJzZXIuZ2V0Q29kZWNNYXAoKS5jb3VudChpbnRmLT5nZXROYW1lKCkpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyBub3QgZm91bmQgaW4geG1sIiwgdHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhbm9uTmFtZSA9IGludGYtPmdldE5hbWUoKTsKKworICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBvbmNlIGFsbCBjb2RlY3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIudmRhLiIpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLmFuZHJvaWQuIikpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhaXQuZG9tYWluID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZW5jb2RlciIpKSB7CisgICAgICAgICAgICAgICAgcmFuayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZGVjbHR5cGUocmFuayk+OjptYXgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoaGFzUHJlZml4KGNhbm9uTmFtZSwgImMyLnZkYS4iKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzU3VmZml4KGNhbm9uTmFtZSwgIi5hdmMuZGVjb2RlciIpIHx8CisgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgIHJhbmsgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRlY2x0eXBlKHJhbmspPjo6bWF4KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgcmFuayA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gY29kZWNJbmZvID0gd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpOworICAgICAgICBjb2RlY0luZm8tPnNldE5hbWUodHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgY29kZWNJbmZvLT5zZXRPd25lcigiY29kZWMyIik7CisgICAgICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgY29kZWNJbmZvLT5zZXRFbmNvZGVyKGVuY29kZXIpOworICAgICAgICBjb2RlY0luZm8tPnNldFJhbmsocmFuayk7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJmNvZGVjID0KKyAgICAgICAgICAgIHBhcnNlci5nZXRDb2RlY01hcCgpLmF0KGNhbm9uTmFtZSk7CisKKyAgICAgICAgZm9yIChhdXRvIHR5cGVJdCA9IGNvZGVjLnR5cGVNYXAuYmVnaW4oKTsgdHlwZUl0ICE9IGNvZGVjLnR5cGVNYXAuZW5kKCk7ICsrdHlwZUl0KSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlID0gdHlwZUl0LT5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgJmF0dHJNYXAgPSB0eXBlSXQtPnNlY29uZDsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KKyAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZE1pbWUobWVkaWFUeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgZm9yIChhdXRvIGF0dHJJdCA9IGF0dHJNYXAuYmVnaW4oKTsgYXR0ckl0ICE9IGF0dHJNYXAuZW5kKCk7ICsrYXR0ckl0KSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnRpZShrZXksIHZhbHVlKSA9ICphdHRySXQ7CisgICAgICAgICAgICAgICAgaWYgKGtleS5maW5kKCJmZWF0dXJlLSIpID09IDAgJiYga2V5LmZpbmQoImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCBzdGQ6OnN0b2kodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBnb3RQcm9maWxlTGV2ZWxzID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoaW50ZikgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICAgICAgICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgbWVkaWEgdHlwZSwgcGFzcyB0aHJvdWdoIGFsbCB2YWx1ZXMgdW5tYXBwZWQKKworICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIGNhbm5vdCBmaW5kIGxldmVscyB0aGF0IGFyZSBsb2NhbCAnbWF4aW1hJyB3aXRob3V0IGtub3dpbmcgdGhlIGNvZGluZworICAgICAgICAgICAgICAgIC8vIGUuZy4gSC4yNjMgbGV2ZWwgNDUgYW5kIGxldmVsIDMwIGNvdWxkIGJlIHR3byB2YWx1ZXMgZm9yIGhpZ2hlc3QgbGV2ZWwgYXMKKyAgICAgICAgICAgICAgICAvLyB0aGV5IGRvbid0IGluY2x1ZGUgb25lIGFub3RoZXIuIEZvciBub3cgd2UgdXNlIHRoZSBsYXN0IHN1cHBvcnRlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm8gcGwoZW5jb2RlciAvKiBvdXRwdXQgKi8sIDB1KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHByb2ZpbGVRdWVyeSA9IHsKKyAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQoJnBsLCAmcGwucHJvZmlsZSkpCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKHByb2ZpbGVRdWVyeSwgQzJfRE9OVF9CTE9DSyk7CisgICAgICAgICAgICAgICAgQUxPR1YoInF1ZXJ5IHN1cHBvcnRlZCBwcm9maWxlcyAtPiAlcyB8ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKHByb2ZpbGVRdWVyeVswXS5zdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHByb2ZpbGVRdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHByb2ZpbGUgOiBwcm9maWxlUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLnByb2ZpbGUgPSAoQzJDb25maWc6OnByb2ZpbGVfdClwcm9maWxlLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW50Zi0+Y29uZmlnKHsmcGx9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgcHJvZmlsZSB0byAldSAtPiAlcyIsIHBsLnByb2ZpbGUsIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gbGV2ZWxRdWVyeSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KEMyUGFyYW1GaWVsZCgmcGwsICZwbC5sZXZlbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhsZXZlbFF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicXVlcnkgc3VwcG9ydGVkIGxldmVscyAtPiAlcyB8ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKGxldmVsUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSyAmJiBsZXZlbFF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxRdWVyeVswXS52YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlIGxldmVsID0gbGV2ZWxRdWVyeVswXS52YWx1ZXMudmFsdWVzLmJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLmxldmVsID0gKEMyQ29uZmlnOjpsZXZlbF90KWxldmVsLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwb3J0aW5nIGxldmVsOiAldSIsIHBsLmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2RrUHJvZmlsZSwgc2RrTGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVyICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChwbC5sZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdFByb2ZpbGVMZXZlbHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbWFwcGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBsLnByb2ZpbGUsIHBsLmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RQcm9maWxlTGV2ZWxzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIEguMjYzIGFsc28gYWR2ZXJ0aXNlIHRoZSBzZWNvbmQgaGlnaGVzdCBsZXZlbCBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVjIHN1cHBvcnRzIGxldmVsIDQ1LCBhcyBsZXZlbCA0NSBvbmx5IGNvdmVycyBsZXZlbCAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIHNvbWUgZm9ybSBvZiBhIHNldHRpbmcgc28gaXQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gYmUgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbmV4dExldmVsID0gQzJDb25maWc6OkxFVkVMX1VOVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2IDogbGV2ZWxRdWVyeVswXS52YWx1ZXMudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDMkNvbmZpZzo6bGV2ZWxfdCl2LnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsZXZlbCA+IG5leHRMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMZXZlbCAhPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuZXh0TGV2ZWwgIT0gcGwubGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChuZXh0TGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFnb3RQcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChWUDlQcm9maWxlMCwgICAgVlA5TGV2ZWw0MSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA5UHJvZmlsZTAsICAgIFZQOUxldmVsNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA5UHJvZmlsZTIsICAgIFZQOUxldmVsNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA5UHJvZmlsZTJIRFIsIFZQOUxldmVsNSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IRVZDICYmICFlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIRVZDUHJvZmlsZU1haW4sICAgICAgSEVWQ01haW5UaWVyTGV2ZWw1MSk7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIRVZDUHJvZmlsZU1haW5TdGlsbCwgSEVWQ01haW5UaWVyTGV2ZWw1MSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA4UHJvZmlsZU1haW4sIFZQOExldmVsX1ZlcnNpb24wKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChWUDhQcm9maWxlTWFpbiwgVlA4TGV2ZWxfVmVyc2lvbjApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVZDUHJvZmlsZUJhc2VsaW5lLCAgICAgICAgICAgIEFWQ0xldmVsNDEpOworLy8gICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBBVkNMZXZlbDQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChBVkNQcm9maWxlTWFpbiwgICAgICAgICAgICAgICAgQVZDTGV2ZWw0MSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVZDUHJvZmlsZUJhc2VsaW5lLCAgICAgICAgICAgIEFWQ0xldmVsNTIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lLCBBVkNMZXZlbDUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChBVkNQcm9maWxlTWFpbiwgICAgICAgICAgICAgICAgQVZDTGV2ZWw1Mik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCwgICAgIEFWQ0xldmVsNTIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEFWQ1Byb2ZpbGVIaWdoLCAgICAgICAgICAgICAgICBBVkNMZXZlbDUyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoTVBFRzRQcm9maWxlU2ltcGxlLCAgTVBFRzRMZXZlbDIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE1QRUc0UHJvZmlsZVNpbXBsZSwgIE1QRUc0TGV2ZWwzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0gyNjMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIMjYzUHJvZmlsZUJhc2VsaW5lLCBIMjYzTGV2ZWw0NSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoSDI2M1Byb2ZpbGVCYXNlbGluZSwgSDI2M0xldmVsMzApOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKEgyNjNQcm9maWxlQmFzZWxpbmUsIEgyNjNMZXZlbDQ1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChIMjYzUHJvZmlsZUlTV1YyLCAgICBIMjYzTGV2ZWwzMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoSDI2M1Byb2ZpbGVJU1dWMiwgICAgSDI2M0xldmVsNDUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fTVBFRzIgJiYgIWVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE1QRUcyUHJvZmlsZVNpbXBsZSwgTVBFRzJMZXZlbEhMKTsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKE1QRUcyUHJvZmlsZU1haW4sICAgTVBFRzJMZXZlbEhMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gaW50ZigpIGFzIHdlbGwsIGJ1dCBob3cgZG8gd2UgbWFwIHRoZW0gdG8KKyAgICAgICAgICAgIC8vIE1lZGlhQ29kZWMgY29sb3IgZm9ybWF0cz8KKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUuZmluZCgidmlkZW8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIC8vIHZlbmRvciB2aWRlbyBjb2RlY3MgcHJlZmVyIG9wYXF1ZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgLy8gZnJhbWV3b3JrIHZpZGVvIGVuY29kZXJzIG11c3Qgc3VwcG9ydCBzdXJmYWNlIGZvcm1hdCwgdGhvdWdoIGl0IGlzIHVuY2xlYXIKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlciAmJiB0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6Ok1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKkNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDb2RlYzJJbmZvQnVpbGRlcjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMxODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0lORk9fQlVJTERFUl9IXworI2RlZmluZSBDT0RFQzJfSU5GT19CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENvZGVjMkluZm9CdWlsZGVyIDogcHVibGljIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworcHVibGljOgorICAgIENvZGVjMkluZm9CdWlsZGVyKCkgPSBkZWZhdWx0OworICAgIH5Db2RlYzJJbmZvQnVpbGRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgICBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSU5GT19CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWM0ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCisjZGVmaW5lIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXcmFwcGVyIGludGVyZmFjZSBhcm91bmQgSW5wdXRTdXJmYWNlLgorICovCitjbGFzcyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBJbnB1dFN1cmZhY2VXcmFwcGVyKCkKKyAgICAgICAgOiBtRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgIH0KKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRoZSBzdXJmYWNlIHdpdGggfGNvbXB8LiBBIHN1cmZhY2UgY2FuCisgICAgICogY29ubmVjdCB0byBhdCBtb3N0IG9uZSBjb21wb25lbnQgYXQgYSB0aW1lLgorICAgICAqCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gfGNvbXB8CisgICAgICogXHJldHVybiBBTFJFQURZX0VYSVNUUyAgIGFscmVhZHkgY29ubmVjdGVkIHRvIGFub3RoZXIgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApID0gMDsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgdGhlIHN1cmZhY2UgZnJvbSB0aGUgY29tcG9uZW50IGlmIGFueS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHB1c2hpbmcgYnVmZmVycyB0byB0aGUgc3VyZmFjZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVmOiBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpID0gMDsKKworICAgIC8vLyBJbnB1dCBTdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICBzdHJ1Y3QgQ29uZmlnIHsKKyAgICAgICAgLy8gSU4gUEFSQU1TIChHQlMpCisgICAgICAgIGZsb2F0IG1NaW5GcHM7IC8vIG1pbmltdW0gZnBzIChyZXBlYXQgZnJhbWUgdG8gYWNoaWV2ZSB0aGlzKQorICAgICAgICBmbG9hdCBtTWF4RnBzOyAvLyBtYXggZnBzICh2aWEgZnJhbWUgZHJvcCkKKyAgICAgICAgZmxvYXQgbUNhcHR1cmVGcHM7IC8vIGNhcHR1cmUgZnBzCisgICAgICAgIGZsb2F0IG1Db2RlZEZwczsgICAvLyBjb2RlZCBmcHMKKyAgICAgICAgYm9vbCBtU3VzcGVuZGVkOyAvLyBzdXNwZW5kZWQKKyAgICAgICAgaW50NjRfdCBtVGltZU9mZnNldFVzOyAvLyB0aW1lIG9mZnNldCAoaW5wdXQgPT4gY29kZWMpCisgICAgICAgIGludDY0X3QgbVN1c3BlbmRBdFVzOyAvLyBzdXNwZW5kL3Jlc3VtZSB0aW1lCisgICAgICAgIGludDY0X3QgbVN0YXJ0QXRVczsgLy8gc3RhcnQgdGltZQorICAgICAgICBib29sIG1TdG9wcGVkOyAvLyBzdG9wcGVkCisgICAgICAgIGludDY0X3QgbVN0b3BBdFVzOyAvLyBzdG9wIHRpbWUKKworICAgICAgICAvLyBPVVQgUEFSQU1TIChHQlMpCisgICAgICAgIGludDY0X3QgbUlucHV0RGVsYXlVczsgLy8gZGVsYXkgYmV0d2VlbiBlbmNvZGVyIGlucHV0IGFuZCBzdXJmYWNlIGlucHV0CisKKyAgICAgICAgLy8gSU4gUEFSQU1TIChDT0RFQyBXUkFQUEVSKQorICAgICAgICBmbG9hdCBtRml4ZWRBZGp1c3RlZEZwczsgLy8gZml4ZWQgZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgICAgIGZsb2F0IG1NaW5BZGp1c3RlZEZwczsgLy8gbWluaW11bSBmcHMgdmlhIFBUUyBtYW5pcHVsYXRpb24KKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBpbnB1dCBzdXJmYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGNvbmZpZyBjb25maWd1cmF0aW9uLiBUaGlzIGNhbiBiZSB1cGRhdGVkIGR1cmluZyB0aGlzIGNhbGwgdG8gcHJvdmlkZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIGJ1dCBub3QgdG8gcHJvdmlkZSBjb25maWd1cmVkIHBhcmFtZXRlcnMgKHRvIGF2b2lkIGNvbnRpbnVhbGx5CisgICAgICogICAgICAgICAgICAgICByZWNvbmZpZ3VyaW5nKQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGRlc2lyZWQgZGF0YSBzcGFjZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhU3BhY2UgZGVzaXJlZCBkYXRhIHNwYWNlCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0RGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBkNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlZmxlY3RlZFBhcmFtVXBkYXRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6c3RyaW5nIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdDo6ZGVidWdTdHJpbmcoc2l6ZV90IGluZGVudF8pIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBpbmRlbnQoaW5kZW50XywgJyAnKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgIkRpY3QgeyIgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6ICp0aGlzKSB7CisgICAgICAgIHMgPDwgaW5kZW50IDw8ICIgICI7CisKKyAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICAgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgc3dpdGNoIChjMlZhbHVlLnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UMzI6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmkzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6VUlOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmdWludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dTMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6Q05UUjMyOgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIGNvdW50ZXIgdmFsdWUgYXMgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmdWludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6YzMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UNjQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6Omk2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6VUlOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmdWludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dTY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6Q05UUjY0OgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIGNvdW50ZXIgdmFsdWUgYXMgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmdWludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6YzY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6RkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZmbG9hdFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmZsb2F0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgZmxvYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCB1bnN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlYnVnZ2luZywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjp1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50MzJfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJpbnQ2NF90ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJzdHJpbmcgIiA8PCBpdC5maXJzdCA8PCAiID0gXCIiIDw8IHN0clZhbHVlLmNfc3RyKCkgPDwgIlwiIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJCdWZmZXIgIiA8PCBpdC5maXJzdCA8PCAiID0gIjsKKyAgICAgICAgICAgIGlmIChidWZWYWx1ZSAhPSBudWxscHRyICYmIGJ1ZlZhbHVlLT5kYXRhKCkgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+c2l6ZSgpIDw9IDY0KSB7CisgICAgICAgICAgICAgICAgcyA8PCAieyIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIEFTdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGhleGR1bXAoYnVmVmFsdWUtPmRhdGEoKSwgYnVmVmFsdWUtPnNpemUoKSwgaW5kZW50XyArIDQsICZ0bXApOworICAgICAgICAgICAgICAgIHMgPDwgdG1wLmNfc3RyKCkgPDwgaW5kZW50IDw8ICIgIH0iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzIDw8ICh2b2lkKilidWZWYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICAgIHMgPDwgInVuc3VwcG9ydGVkICIgPDwgaXQuZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHMgPDwgaW5kZW50IDw8ICJ9IjsKKworICAgIHJldHVybiBzLnN0cigpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnBhcmFtRGVzY3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgIGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpOworICAgICAgICBpZiAoc3RydWN0RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlICVzIiwgZGVzYy0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1EZXNjKGRlc2MsICpzdHJ1Y3REZXNjLCByZWZsZWN0b3IsIHRydWUgLyogbWFya1ZlbmRvciAqLyk7CisgICAgfQorCisgICAgLy8gVEVNUDogYWxzbyBhZGQgdmVuZG9yIHBhcmFtZXRlcnMgYXMgbm9uLXZlbmRvcgorICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgaWYgKCFkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgIGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpOworICAgICAgICBpZiAoc3RydWN0RGVzYykgeworICAgICAgICAgICAgYWRkUGFyYW1EZXNjKGRlc2MsICpzdHJ1Y3REZXNjLCByZWZsZWN0b3IsIGZhbHNlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1TdHJ1Y3REZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsCisgICAgICAgIEMyU3RyaW5nIHBhdGgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3REZXNjLmJlZ2luKCk7IGl0ICE9IHN0cnVjdERlc2MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQzJTdHJpbmcgZmllbGROYW1lID0gcGF0aCArICIuIiArIGl0LT5uYW1lKCk7CisgICAgICAgIGlmIChpdC0+dHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBpZiAocmVmbGVjdG9yID09IG51bGxwdHIgfHwgaXQtPmV4dGVudCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaWdub3JlZCBzdHJ1Y3QgZmllbGQgJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjXyA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleChpdC0+dHlwZSgpKS5jb3JlSW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoc3RydWN0RGVzY18gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3QgZGVzY3JpYmUgc3RydWN0dXJlIG9mICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkUGFyYW1TdHJ1Y3REZXNjKGRlc2MsIGZpZWxkTmFtZSwgb2Zmc2V0ICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3REZXNjXywgcmVmbGVjdG9yKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IGV4dGVudCBhbmQgdHlwZQorICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoaXQtPmV4dGVudCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImV4dGVudCgpICE9IDEgZm9yIHNpbmdsZSB2YWx1ZSB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHR5cGU6ICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiVzIHJlZ2lzdGVyZWQiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFRPRE86IGdldCB0aGUgcHJvcGVyIHNpemUgYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGZpZWxkcy4KKyAgICAgICAgLy8gb25seSBpbnNlcnQgZmllbGRzIHRoZSB2ZXJ5IGZpcnN0IHRpbWUKKyAgICAgICAgbU1hcC5lbXBsYWNlKGZpZWxkTmFtZSwgRmllbGREZXNjIHsKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGREZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICAgICAgaXQtPnR5cGUoKSwgaXQtPmV4dGVudCgpLCBpdC0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCppdCksCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKCppdCkpLAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICB9KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjphZGRQYXJhbURlc2MoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gZGVzYywgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwgYm9vbCBtYXJrVmVuZG9yKSB7CisgICAgQzJTdHJpbmcgcGFyYW1OYW1lID0gZGVzYy0+bmFtZSgpOworCisgICAgLy8gcHJlZml4IHZlbmRvciBwYXJhbWV0ZXJzCisgICAgaWYgKGRlc2MtPmluZGV4KCkuaXNWZW5kb3IoKSAmJiBtYXJrVmVuZG9yKSB7CisgICAgICAgIHBhcmFtTmFtZSA9ICJ2ZW5kb3IuIiArIHBhcmFtTmFtZTsKKyAgICB9CisgICAgbVBhcmFtTmFtZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpLCBwYXJhbU5hbWUpOworCisgICAgLy8gYWxzbyBhbGxvdyBzZXR0aW5nIHdob2xlIHBhcmFtZXRlcnMgaW4gYSBiaW5hcnkgZmFzaGlvbiB2aWEgQnl0ZUJ1ZmZlcgorICAgIC8vIHRoaXMgaXMgb3B0LWluIGZvciBub3cKKyAgICBhdXRvIGl0ID0gbVdob2xlUGFyYW1zLmZpbmQocGFyYW1OYW1lKTsKKyAgICBpZiAoaXQgIT0gbVdob2xlUGFyYW1zLmVuZCgpICYmIGl0LT5zZWNvbmQuY29yZUluZGV4KCkgPT0gZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICBtTWFwLmVtcGxhY2UocGFyYW1OYW1lLCBGaWVsZERlc2N7IGRlc2MsIG51bGxwdHIsIDAgLyogb2Zmc2V0ICovIH0pOworICAgICAgICAvLyBkb24ndCBhZGQgZmllbGRzIG9mIHdob2xlIHBhcmFtZXRlcnMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhZGRQYXJhbVN0cnVjdERlc2MoZGVzYywgcGFyYW1OYW1lLCAwIC8qIG9mZnNldCAqLywgc3RydWN0RGVzYywgcmVmbGVjdG9yKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnN1cHBvcnRXaG9sZVBhcmFtKHN0ZDo6c3RyaW5nIG5hbWUsIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgIG1XaG9sZVBhcmFtcy5lbXBsYWNlKG5hbWUsIGluZGV4KTsKK30KKworc3RkOjpzdHJpbmcgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbU5hbWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbVBhcmFtTmFtZXMuZmluZChpbmRleCk7CisgICAgaWYgKGl0ICE9IG1QYXJhbU5hbWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJldDsKKyAgICByZXQgPDwgIjx1bmtub3duICIgPDwgaW5kZXggPDwgIj4iOworICAgIHJldHVybiByZXQuc3RyKCk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZSgKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdCB7CisgICAgQ0hFQ0sodmVjICE9IG51bGxwdHIpOworICAgIHZlYy0+Y2xlYXIoKTsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBwYXJhbXMsCisgICAgICAgICAgICBbJmluZGljZXNdKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmZGVzYywgY29uc3Qgdm9pZCAqLCBzaXplX3QpIHsKKyAgICAgICAgICAgICAgICBpbmRpY2VzLmluc2VydChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICB9KTsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4ICZpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soaW5kZXgpOworICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtSW5kaWNlc0ZvcktleXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAma2V5cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKyAgICB2ZWMtPmNsZWFyKCk7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5TWFwKGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSk7CisKKyAgICBBTE9HVigiaW4gZ2V0UGFyYW1JbmRpY2VzRm9yS2V5cyB3aXRoICV6dSBrZXlzIGFuZCBtYXAgb2YgJXp1IGVudHJpZXMiLAorICAgICAgICAgICAga2V5TWFwLnNpemUoKSwgbU1hcC5zaXplKCkpOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBBTE9HVigiY291bnQgb2YgJXMgaXMgJXp1IiwgbmFtZS5jX3N0cigpLCBrZXlNYXAuY291bnQobmFtZSkpOworICAgICAgICBpZiAoa2V5TWFwLmNvdW50KG5hbWUpID4gMCkgeworICAgICAgICAgICAgaW5kaWNlcy5pbnNlcnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCAmaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHZlYy0+cHVzaF9iYWNrKGluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjp1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4qPiBwYXJhbXNNYXA7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogKnZlYykgeworICAgICAgICBpZiAocGFyYW0gJiYgKnBhcmFtKSB7CisgICAgICAgICAgICBwYXJhbXNNYXBbcGFyYW0tPmluZGV4KCldID0gJnBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgWyZwYXJhbXNNYXBdKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBGaWVsZERlc2MgJmRlc2MsIGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gKnBhcmFtID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBhdXRvIHBhcmFtSXQgPSBwYXJhbXNNYXAuZmluZChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtSXQgPT0gcGFyYW1zTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyBmb3VuZCwgYnV0IHBhcmFtICMlZCBpc24ndCBwcmVzZW50IHRvIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCAoaW50MzJfdClkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbUl0LT5zZWNvbmQ7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgX0MyUGFyYW0gOiBwdWJsaWMgQzJQYXJhbSB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIEMyUGFyYW06OkMyUGFyYW07CisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtKHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGluZGV4KSA6IEMyUGFyYW0oc2l6ZSwgaW5kZXgpIHsgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGhhbmRsZSB3aG9sZSBwYXJhbSB1cGRhdGVzIGFzIHBhcnQgb2YgYSBmbGV4aWJsZSBwYXJhbSB1cGRhdGUgdXNpbmcKKyAgICAgICAgICAgICAgICAvLyBhIHplcm8gb2Zmc2V0LgorICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBtaW5PZmZzZXQgPSAwOworCisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBkZXNjcmlwdG9yIGhhcyBhIGZpZWxkLCB1c2UgdGhlIG9mZnNldCBhbmQgc2l6ZSBhbmQgZW5zdXJlIHRoYXQgb2Zmc2V0CisgICAgICAgICAgICAgICAgLy8gaXMgbm90IHBhcnQgb2YgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIGlmIChkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgICAgICAgICBtaW5PZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZihDMlBhcmFtKSArIGRlc2Mub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCpkZXNjLmZpZWxkRGVzYyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBvciB0cmltIGZsZXhpYmxlIHBhcmFtIChvciB3aG9sZSBwYXJhbSkgYXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYyAvKiB3aG9sZSBwYXJhbSAqLyB8fCBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIHBhcmFtIGlmIG1vcmUgc3BhY2UgaXMgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+Z2V0KCktPnNpemUoKSA8IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC0gb2Zmc2V0IHx8IG9mZnNldCA8IG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgdG9vIGxvbmcgb3Igb2Zmc2V0IHRvbyBlYXJseSAtIGFiYW5kb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtICpuZXdQYXJhbSA9IChDMlBhcmFtICopOjpvcGVyYXRvciBuZXcob2Zmc2V0ICsgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgKG5ld1BhcmFtKSBfQzJQYXJhbShvZmZzZXQgKyBzaXplLCBwYXJhbS0+Z2V0KCktPmluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShuZXdQYXJhbSArIDEsIHBhcmFtLT5nZXQoKSArIDEsIG9mZnNldCAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+cmVzZXQobmV3UGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLT5nZXQoKS0+c2l6ZSgpID4gb2Zmc2V0ICsgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpbSBwYXJhbWV0ZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OlRyaW1QYXJhbShwYXJhbS0+Z2V0KCksIG9mZnNldCArIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjLmZpZWxkRGVzYy0+dHlwZSgpID09IEMyRmllbGREZXNjcmlwdG9yOjpCTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gZmlsbCBibG9icyBpZiB1cGRhdGluZyB3aXRoIHNtYWxsZXIgYmxvYgorICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5maWVsZERlc2MtPmV4dGVudCgpID4gc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopKHBhcmFtLT5nZXQoKSkgKyBvZmZzZXQgKyBzaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSAtIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopKHBhcmFtLT5nZXQoKSkgKyBvZmZzZXQsIHB0ciwgc2l6ZSk7CisgICAgICAgICAgICB9KTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICYsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gd29yaykgY29uc3QgeworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBhdXRvIHBhcmFtID0gcGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChwYXJhbSA9PSBwYXJhbXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIHdob2xlIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICAgICAgaWYgKHBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEMyUGFyYW0gKnRtcEFzUGFyYW0gPSBDMlBhcmFtOjpGcm9tKHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcEFzUGFyYW0gJiYgdG1wQXNQYXJhbS0+dHlwZSgpLnR5cGUoKSA9PSBkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJQYXJhbSBibG9iIGRvZXMgbm90IG1hdGNoIHBhcmFtIGZvciAnJXMnICglcCwgJXggdnMgJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHRtcEFzUGFyYW0sIHRtcEFzUGFyYW0gPyB0bXBBc1BhcmFtLT50eXBlKCkudHlwZSgpIDogMHhERUFEdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGZpZWxkVHlwZSA9IGRlc2MuZmllbGREZXNjLT50eXBlKCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgodWludDMyX3QqKSZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiB7CisgICAgICAgICAgICAgICAgZmxvYXQgdG1wOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogeworICAgICAgICAgICAgICAgIEFTdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGlmICghcGFyYW0tPnNlY29uZC5maW5kKCZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRFeHRlbnQgPiAwICYmIHRtcC5zaXplKCkgPj0gZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB0cnVuY2F0ZWQodG1wLCAwLCBmaWVsZEV4dGVudCAtIDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiU3RyaW5nIHZhbHVlIHRvbyBsb25nIHRvIGZpdDogb3JpZ2luYWwgXCIlc1wiIHRydW5jYXRlZCB0byBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5jX3N0cigpLCB0cnVuY2F0ZWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRydW5jYXRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAuY19zdHIoKSwgdG1wLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICAgICAgICAgIGlmICghcGFyYW0tPnNlY29uZC5maW5kKCZ0bXApIHx8IHRtcCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaWVsZEV4dGVudCA+IDAgJiYgdG1wLT5zaXplKCkgPiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQmxvYiB2YWx1ZSB0b28gbG9uZyB0byBmaXQuIFRydW5jYXRpbmcuIik7CisgICAgICAgICAgICAgICAgICAgIHRtcC0+c2V0UmFuZ2UodG1wLT5vZmZzZXQoKSwgZmllbGRFeHRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsIHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSBmb3IgJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtc18pIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHBhcmFtcy5yZXNpemUocGFyYW1zXy5zaXplKCkpOworICAgIHN0ZDo6dHJhbnNmb3JtKHBhcmFtc18uYmVnaW4oKSwgcGFyYW1zXy5lbmQoKSwgcGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+JiBwKSAtPiBDMlBhcmFtKiB7IHJldHVybiBwLmdldCgpOyB9KTsKKyAgICByZXR1cm4gZ2V0UGFyYW1zKHBhcmFtcyk7Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdAorUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIGNvbnN0IHsKKyAgICBEaWN0IHJldDsKKworICAgIC8vIGNvbnZlcnQgdmVjdG9yIHRvIG1hcAorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBDMlBhcmFtICo+IHBhcmFtc01hcDsKKyAgICBmb3IgKEMyUGFyYW0gKnBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbSAhPSBudWxscHRyICYmICpwYXJhbSkgeworICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtLT5pbmRleCgpXSA9IHBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8Y29uc3Qgc3RkOjpzdHJpbmcsIEZpZWxkRGVzYz4gJmt2IDogbU1hcCkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA9IGt2LmZpcnN0OworICAgICAgICBjb25zdCBGaWVsZERlc2MgJmRlc2MgPSBrdi5zZWNvbmQ7CisgICAgICAgIGlmIChwYXJhbXNNYXAuY291bnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gcGFyYW1zTWFwW2Rlc2MucGFyYW1EZXNjLT5pbmRleCgpXTsKKyAgICAgICAgVmFsdWUgdmFsdWU7CisKKyAgICAgICAgLy8gaGFuZGxlIHdob2xlIHBhcmFtcyBmaXJzdAorICAgICAgICBpZiAoIWRlc2MuZmllbGREZXNjKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkocGFyYW0sIHBhcmFtLT5zaXplKCkpOworICAgICAgICAgICAgdmFsdWUuc2V0KGJ1Zik7CisgICAgICAgICAgICByZXQuZW1wbGFjZShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSkgKyBkZXNjLm9mZnNldAorICAgICAgICAgICAgICAgICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqZGVzYy5maWVsZERlc2MpOworICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilwYXJhbSArIG9mZnNldDsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBmaWVsZFR5cGUgPSBkZXNjLmZpZWxkRGVzYy0+dHlwZSgpOworICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW0tPnNpemUoKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IGxlbmd0aCB8fCBwYXJhbS0+c2l6ZSgpIC0gbGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIHN0cmluZzogbGVuZ3RoICV6dSBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoQVN0cmluZygoY2hhciAqKWRhdGEsIHN0cm5sZW4oKGNoYXIgKilkYXRhLCBsZW5ndGgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gZGVzYy5maWVsZERlc2MtPmV4dGVudCgpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwYXJhbS0+c2l6ZSgpIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgbGVuZ3RoIHx8IHBhcmFtLT5zaXplKCkgLSBsZW5ndGggPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3IgYmxvYjogbGVuZ3RoICV6dSBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHZhbHVlLnNldChidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSA9IEMyVmFsdWU6OlNpemVGb3IoKEMyVmFsdWU6OnR5cGVfdClmaWVsZFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgdmFsdWVTaXplIHx8IHBhcmFtLT5zaXplKCkgLSB2YWx1ZVNpemUgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3IgYzJ2YWx1ZTogc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnNpemUoKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgYzJWYWx1ZSA9ICooKGludDMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogYzJWYWx1ZSA9ICooKHVpbnQzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IGMyVmFsdWUgPSAqKChjMl9jbnRyMzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBjMlZhbHVlID0gKigoaW50NjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjMlZhbHVlID0gKigodWludDY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDogYzJWYWx1ZSA9ICooKGMyX2NudHI2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogIGMyVmFsdWUgPSAqKChmbG9hdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgZm9yICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoYzJWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0LmVtcGxhY2UobmFtZSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Y2xlYXIoKSB7CisgICAgbU1hcC5jbGVhcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCisjZGVmaW5lIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBxdWVyeSBhbmQgdXBkYXRlIENvZGVjIDIuMCBjb25maWd1cmF0aW9uIHZhbHVlcy4gVXNlIGN1c3RvbSBkaWN0aW9uYXJ5IGFzCisgKiBBTWVzc2FnZSBjYW5ub3QgcmVwcmVzZW50IGFsbCB0eXBlcyBvZiBDb2RlYyAyLjAgcGFyYW1ldGVycyBhbmQgQzJWYWx1ZSBjYW5ub3QgcmVwcmVzZW50CisgKiBhbGwgdHlwZXMgb2YgU0RLIHZhbHVlcy4gV2Ugd2FudCB0byBiZSBwcmVjaXNlIHdoZW4gc2V0dGluZyBzdGFuZGFyZCBwYXJhbWV0ZXJzICh1c2UgQzJWYWx1ZQorICogZm9yIGFyaXRobWV0aWMgdmFsdWVzKSwgYnV0IGFsc28gc3VwcG9ydCBpbnQzMiBhbmQgaW50NjQgZm9yIFNESyB2YWx1ZXMgc3BlY2lmaWNhbGx5IGZvcgorICogdmVuZG9yIHBhcmFtZXRlcnMgKGFzIFNESyBBUEkgZG9lcyBub3QgYWxsb3cgc3BlY2lmeWluZyBwcm9wZXIgdHlwZS4pIFdoZW4gcXVlcnlpbmcgZmllbGRzLAorICogd2UgY2FuIHVzZSBDMlZhbHVlcyBhcyB0aGV5IGFyZSBkZWZpbmVkLgorICoKKyAqICAgICAgSXRlbSA9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGluZ3M6CisgKiAgICAgQ1ZhbHVlOjp0eXBlID0+IHR5cGUKKyAqICAgICBpbnQzMiA9PiBpbnQzMiwgY3RyMzIgb3IgdWludDMyCisgKiAgICAgaW50NjQgPT4gaW50NjQsIGN0cjY0IG9yIHVpbnQ2NAorICogICAgIEFTdHJpbmcgPT4gc3RyaW5nCisgKiAgICAgQUJ1ZmZlciA9PiBibG9iCisgKiAgICAgJ1JlY3QnID0+IEMyUmVjdFN0cnVjdCAobm90IGV4cG9zZWQgaW4gU0RLIGFzIGEgcmVjdGFuZ2xlKQorICovCitjbGFzcyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcigpID0gZGVmYXVsdDsKKyAgICB+UmVmbGVjdGVkUGFyYW1VcGRhdGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRWxlbWVudCBmb3IgdmFsdWVzCisgICAgICovCisgICAgc3RydWN0IFZhbHVlIDogcHVibGljIEFEYXRhPEMyVmFsdWUsIGludDMyX3QsIGludDY0X3QsIEFTdHJpbmcsIHNwPEFCdWZmZXI+Pjo6QmFzaWMgeworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBiYXNlIHR5cGVzCisgICAgICAgIFZhbHVlKCkgPSBkZWZhdWx0OworICAgICAgICBleHBsaWNpdCBWYWx1ZShDMlZhbHVlIGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoaW50MzJfdCBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGludDY0X3QgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShjb25zdCBBU3RyaW5nICZpKSAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmkpIHsgc2V0KGkpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBEaWN0IDogcHVibGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWYWx1ZT4geworICAgICAgICBEaWN0KCkgPSBkZWZhdWx0OworICAgICAgICBzdGQ6OnN0cmluZyBkZWJ1Z1N0cmluZyhzaXplX3QgaW5kZW50ID0gMCkgY29uc3Q7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGZpZWxkcyBvZiB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIHN1cHBsaWVkLCBzbyB0aGF0IHRoaXMgb3BiamVjdCBjYW4gbGF0ZXIKKyAgICAgKiBxdWVyeSBhbmQgdXBkYXRlIHRoZXNlLgorICAgICAqCisgICAgICogRm9yIG5vdyBvbmx5IGZpcnN0LWxldmVsIGZpZWxkcyBhcmUgc3VwcG9ydGVkLiBBbHNvLCBhcnJheSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbi4KKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjcyAgdmVjdG9yIG9mIEMyUGFyYW1EZXNjcmlwdG9yIG9iamVjdHMgdGhhdCB0aGlzIG9iamVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICB3b3VsZCByZWNvZ25pemUgd2hlbiBidWlsZGluZyBwYXJhbXMuCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbURlc2MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgc3RhbmRhcmQgcGFyYW1ldGVyICh0aGF0IG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yCisgICAgICogb3IgbWF5IG5vdCBiZSBsaXN0ZWQgYXMgYSBzdXBwb3J0ZWQgdmFsdWUgYnkgdGhlIGNvbXBvbmVudCkuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpcworICAgICAqIHVzZWQgZm9yIGFub3RoZXIgcGFyYW1ldGVyLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLiAoVGVjaG5pY2FsbHksIHRoaXMgaXMgYnkgZmllbGRzKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHN0YW5kYXJkIHBhcmFtZXRlciB0eXBlCisgICAgICogXHBhcmFtIG5hbWUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgYWRkU3RhbmRhcmRQYXJhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFkpIHsKKyAgICAgICAgYWRkUGFyYW1EZXNjKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkluZGV4KFQ6OlBBUkFNX1RZUEUpLCBhdHRyaWIsIG5hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yKChUKiludWxscHRyKSwgbnVsbHB0ciAvKiBkZXNjcmlwdG9yICovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHN0cnVjdHVyZSAob3IgYSBwYXJhbWVhdGVyKSBkZXNjcmliZWQgYnkgdGhlIHN0cnVjdCBkZXNjcmlwdG9yLiBJZgorICAgICAqIHJlZmxlY3RvciBpcyBwcm92aWRlZCwgZmllbGRzIG9mIHN1Yi1zdHJ1Y3R1cmVzIGFyZSBhbHNvIGFkZGVkLiBPdGhlcndpc2UsIG9ubHkgdG9wLWxldmVsCisgICAgICogZnVuZGFtZW50YWwgdHlwZWQgZmllbGRzIChhcml0aG1ldGljLCBzdHJpbmcgYW5kIGJsb2IpIGFyZSBhZGRlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbURlc2MgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gZmllbGREZXNjIGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gcGF0aCBwYXRoL25hbWUgb2YgdGhlIHN0cnVjdHVyZSAoZmllbGQgb3IgcGFyZW50IHBhcmFtZXRlcikKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG9mZnNldCBvZiB0aGUgc3RydWN0dXJlIGluIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICBDMlBhcmFtUmVmbGVjdG9yIG9iamVjdCBmb3IgQzJQYXJhbSByZWZsZWN0aW9uIChtYXkgYmUgbnVsbCkKKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjLCBDMlN0cmluZyBwYXRoLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBwYXJhbWV0ZXIgZGVzY3JpYmVkIGJ5IHRoZSBzdHJ1Y3QgZGVzY3JpcHRvci4gSWYgcmVmbGVjdG9yIGlzIHByb3ZpZGVkLAorICAgICAqIGZpZWxkcyBvZiBzdWItc3RydWN0dXJlcyBhcmUgYWxzbyBhZGRlZC4gT3RoZXJ3aXNlLCBvbmx5IHRvcC1sZXZlbCBmdW5kYW1lbnRhbCB0eXBlZCBmaWVsZHMKKyAgICAgKiAoYXJpdGhtZXRpYywgc3RyaW5nIGFuZCBibG9iKSBhcmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIGZpZWxkRGVzYyBmaWVsZCBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbiAobWF5IGJlIG51bGwpCisgICAgICogXHBhcmFtIG1hcmtWZW5kb3IgVEVNUCBpZiB0cnVlLCBwcmVmaXggdmVuZG9yIHBhcmFtZXRlciBuYW1lcyB3aXRoICJ2ZW5kb3IuIgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1EZXNjKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwYXJhbURlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgYm9vbCBtYXJrVmVuZG9yID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBhIHBhcmFtZXRlciBhcyBhIGJpbmFyeSBibG9iLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogXHBhcmFtIGNvcmVJbmRleCBwYXJhbWV0ZXIgKGNvcmUpIGluZGV4CisgICAgICovCisgICAgdm9pZCBzdXBwb3J0V2hvbGVQYXJhbShzdGQ6OnN0cmluZyBuYW1lLCBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBmb3IgYW4gaW5kZXguCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZ2V0UGFyYW1OYW1lKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHBhcmFtIGluZGljZXMgZnJvbSBmaWVsZCBuYW1lcyBhbmQgdmFsdWVzIGluIEFNZXNzYWdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIGJlIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gIERpY3Qgb2JqZWN0IHdpdGggZmllbGQgbmFtZSB0byB2YWx1ZSBwYWlycy4KKyAgICAgKiBccGFyYW0gdmVjW291dF0gICAgdmVjdG9yIHRvIHN0b3JlIHRoZSBpbmRpY2VzIGZyb20gfHBhcmFtc3wuCisgICAgICovCisgICAgdm9pZCBnZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZSgKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGxpc3Qgb2YgcGFyYW0gaW5kaWNlcyBmcm9tIGZpZWxkIG5hbWVzIChvbmx5KSBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgVmVjdG9yIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzLgorICAgICAqIFxwYXJhbSB2ZWNbb3V0XSAgICB2ZWN0b3IgdG8gc3RvcmUgdGhlIGluZGljZXMgZnJvbSB8cGFyYW1zfC4KKyAgICAgKi8KKyAgICB2b2lkIGdldFBhcmFtSW5kaWNlc0ZvcktleXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmtleXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBDMlBhcmFtIG9iamVjdHMgZnJvbSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCisgICAgICogXHBhcmFtIHZlY1tpbixvdXRdICAgdmVjdG9yIG9mIHRoZSBDMlBhcmFtIG9iamVjdHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKAorICAgICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGZpZWxkcyBmcm9tIEMyUGFyYW0gb2JqZWN0cyBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICB2ZWN0b3Igb2YgdGhlIEMyUGFyYW0gb2JqZWN0cyB0byBiZSBxdWVyaWVkCisgICAgICogXHJldHVybiBhIERpY3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtub3duIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBEaWN0IGdldFBhcmFtcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgRGljdCBnZXRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBwYXJhbSBkZXNjcmlwdG9ycyBpbiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEZpZWxkRGVzYyB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkRGVzYzsKKyAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+IG1NYXA7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c3RyaW5nPiBtUGFyYW1OYW1lczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQzJQYXJhbTo6Q29yZUluZGV4PiBtV2hvbGVQYXJhbXM7CisKKyAgICB2b2lkIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpPiB3b3JrKSBjb25zdDsKKworICAgIEMyX0RPX05PVF9DT1BZKFJlZmxlY3RlZFBhcmFtVXBkYXRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2MjQ0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmNwcApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2tpcEN1dEJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU2tpcEN1dEJ1ZmZlcjo6U2tpcEN1dEJ1ZmZlcihzaXplX3Qgc2tpcCwgc2l6ZV90IGN1dCwgc2l6ZV90IG51bTE2Qml0Q2hhbm5lbHMpIHsKKworICAgIG1Xcml0ZUhlYWQgPSAwOworICAgIG1SZWFkSGVhZCA9IDA7CisgICAgbUNhcGFjaXR5ID0gMDsKKyAgICBtQ3V0QnVmZmVyID0gbnVsbHB0cjsKKworICAgIGlmIChudW0xNkJpdENoYW5uZWxzID09IDAgfHwgbnVtMTZCaXRDaGFubmVscyA+IElOVDMyX01BWCAvIDIpIHsKKyAgICAgICAgQUxPR1coIiMgY2hhbm5lbHMgb3V0IG9mIHJhbmdlOiAlenUsIHVzaW5nIHBhc3N0aHJvdWdoIGluc3RlYWQiLCBudW0xNkJpdENoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgZnJhbWVTaXplID0gbnVtMTZCaXRDaGFubmVscyAqIDI7CisgICAgaWYgKHNraXAgPiBJTlQzMl9NQVggLyBmcmFtZVNpemUgfHwgY3V0ID4gSU5UMzJfTUFYIC8gZnJhbWVTaXplCisgICAgICAgICAgICB8fCBjdXQgKiBmcmFtZVNpemUgPiBJTlQzMl9NQVggLSA0MDk2KSB7CisgICAgICAgIEFMT0dXKCJvdXQgb2YgcmFuZ2Ugc2tpcC9jdXQ6ICV6dS8lenUsIHVzaW5nIHBhc3N0aHJvdWdoIGluc3RlYWQiLAorICAgICAgICAgICAgICAgIHNraXAsIGN1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tpcCAqPSBmcmFtZVNpemU7CisgICAgY3V0ICo9IGZyYW1lU2l6ZTsKKworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CisgICAgbUJhY2tQYWRkaW5nID0gY3V0OworICAgIG1DYXBhY2l0eSA9IGN1dCArIDQwOTY7CisgICAgbUN1dEJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW21DYXBhY2l0eV07CisgICAgQUxPR1YoInNraXBjdXRidWZmZXIgJXp1ICV6dSAlZCIsIHNraXAsIGN1dCwgbUNhcGFjaXR5KTsKK30KKworU2tpcEN1dEJ1ZmZlcjo6flNraXBDdXRCdWZmZXIoKSB7CisgICAgZGVsZXRlW10gbUN1dEJ1ZmZlcjsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGlmIChtQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQgPSBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgIGludDMyX3QgYnVmbGVuID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIC8vIGRyb3AgdGhlIGluaXRpYWwgZGF0YSBmcm9tIHRoZSBidWZmZXIgaWYgbmVlZGVkCisgICAgaWYgKG1Gcm9udFBhZGRpbmcgPiAwKSB7CisgICAgICAgIC8vIHN0aWxsIGRhdGEgbGVmdCB0byBkcm9wCisgICAgICAgIGludDMyX3QgdG9fZHJvcCA9IChidWZsZW4gPCBtRnJvbnRQYWRkaW5nKSA/IGJ1ZmxlbiA6IG1Gcm9udFBhZGRpbmc7CisgICAgICAgIG9mZnNldCArPSB0b19kcm9wOworICAgICAgICBidWZsZW4gLT0gdG9fZHJvcDsKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2Uob2Zmc2V0LCBidWZsZW4pOworICAgICAgICBtRnJvbnRQYWRkaW5nIC09IHRvX2Ryb3A7CisgICAgfQorCisKKyAgICAvLyBhcHBlbmQgZGF0YSB0byBjdXRidWZmZXIKKyAgICBjaGFyICpzcmMgPSAoKGNoYXIqKSBidWZmZXItPmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgd3JpdGUoc3JjLCBidWZsZW4pOworCisKKyAgICAvLyB0aGUgbWVkaWFidWZmZXIgaXMgbm93IGVtcHR5LiBGaWxsIGl0IGZyb20gY3V0YnVmZmVyLCBhbHdheXMgbGVhdmluZworICAgIC8vIGF0IGxlYXN0IG1CYWNrUGFkZGluZyBieXRlcyBpbiB0aGUgY3V0YnVmZmVyCisgICAgY2hhciAqZHN0ID0gKGNoYXIqKSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3QgY29waWVkID0gcmVhZChkc3QsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBjb3BpZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0SW50ZXJuYWwoY29uc3Qgc3A8VD4mIGJ1ZmZlcikgeworICAgIGlmIChtQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQgPSBidWZmZXItPm9mZnNldCgpOworICAgIGludDMyX3QgYnVmbGVuID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGlmIG5lZWRlZAorICAgIGlmIChtRnJvbnRQYWRkaW5nID4gMCkgeworICAgICAgICAvLyBzdGlsbCBkYXRhIGxlZnQgdG8gZHJvcAorICAgICAgICBpbnQzMl90IHRvX2Ryb3AgPSAoYnVmbGVuIDwgbUZyb250UGFkZGluZykgPyBidWZsZW4gOiBtRnJvbnRQYWRkaW5nOworICAgICAgICBvZmZzZXQgKz0gdG9fZHJvcDsKKyAgICAgICAgYnVmbGVuIC09IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBidWZsZW4pOworICAgICAgICBtRnJvbnRQYWRkaW5nIC09IHRvX2Ryb3A7CisgICAgfQorCisKKyAgICAvLyBhcHBlbmQgZGF0YSB0byBjdXRidWZmZXIKKyAgICBjaGFyICpzcmMgPSAoY2hhciopIGJ1ZmZlci0+ZGF0YSgpOworICAgIHdyaXRlKHNyYywgYnVmbGVuKTsKKworCisgICAgLy8gdGhlIG1lZGlhYnVmZmVyIGlzIG5vdyBlbXB0eS4gRmlsbCBpdCBmcm9tIGN1dGJ1ZmZlciwgYWx3YXlzIGxlYXZpbmcKKyAgICAvLyBhdCBsZWFzdCBtQmFja1BhZGRpbmcgYnl0ZXMgaW4gdGhlIGN1dGJ1ZmZlcgorICAgIGNoYXIgKmRzdCA9IChjaGFyKikgYnVmZmVyLT5iYXNlKCk7CisgICAgc2l6ZV90IGNvcGllZCA9IHJlYWQoZHN0LCBidWZmZXItPmNhcGFjaXR5KCkpOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29waWVkKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIHN1Ym1pdEludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdWJtaXRJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OmNsZWFyKCkgeworICAgIG1Xcml0ZUhlYWQgPSBtUmVhZEhlYWQgPSAwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcDsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjp3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pIHsKKyAgICBpbnQzMl90IHNpemV1c2VkID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChzaXpldXNlZCA8IDApIHNpemV1c2VkICs9IG1DYXBhY2l0eTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgbXVzdCBmaXQuIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGEgbGl0dGxlIGxhcmdlciB0aGFuIG5lZWRlZCwKKyAgICAvLyBzbyB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgYXMgdG8gd2hldGhlciBtV3JpdGVIZWFkID09IG1SZWFkSGVhZCBtZWFucyBidWZmZXIKKyAgICAvLyBmdWxsIG9yIGVtcHR5CisgICAgc2l6ZV90IGF2YWlsYWJsZSA9IG1DYXBhY2l0eSAtIHNpemV1c2VkIC0gMzI7CisgICAgaWYgKGF2YWlsYWJsZSA8IG51bSkgeworICAgICAgICBpbnQzMl90IG5ld2NhcGFjaXR5ID0gbUNhcGFjaXR5ICsgKG51bSAtIGF2YWlsYWJsZSk7CisgICAgICAgIGNoYXIgKiBuZXdidWZmZXIgPSBuZXcgY2hhcltuZXdjYXBhY2l0eV07CisgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIsIG1DYXBhY2l0eSk7CisgICAgICAgIGRlbGV0ZSBbXSBtQ3V0QnVmZmVyOworICAgICAgICBtQ2FwYWNpdHkgPSBuZXdjYXBhY2l0eTsKKyAgICAgICAgbUN1dEJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICAgICAgQUxPR1YoInJlYWxsb2NhdGVkIGJ1ZmZlciBhdCBzaXplICVkIiwgbmV3Y2FwYWNpdHkpOworICAgIH0KKworICAgIHNpemVfdCBjb3B5Zmlyc3QgPSAobUNhcGFjaXR5IC0gbVdyaXRlSGVhZCk7CisgICAgaWYgKGNvcHlmaXJzdCA+IG51bSkgY29weWZpcnN0ID0gbnVtOworICAgIGlmIChjb3B5Zmlyc3QpIHsKKyAgICAgICAgbWVtY3B5KG1DdXRCdWZmZXIgKyBtV3JpdGVIZWFkLCBzcmMsIGNvcHlmaXJzdCk7CisgICAgICAgIG51bSAtPSBjb3B5Zmlyc3Q7CisgICAgICAgIHNyYyArPSBjb3B5Zmlyc3Q7CisgICAgICAgIG1Xcml0ZUhlYWQgKz0gY29weWZpcnN0OworICAgICAgICBDSEVDS19MRShtV3JpdGVIZWFkLCBtQ2FwYWNpdHkpOworICAgICAgICBpZiAobVdyaXRlSGVhZCA9PSBtQ2FwYWNpdHkpIG1Xcml0ZUhlYWQgPSAwOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBtZW1jcHkobUN1dEJ1ZmZlciwgc3JjLCBudW0pOworICAgICAgICAgICAgbVdyaXRlSGVhZCArPSBudW07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NpemVfdCBTa2lwQ3V0QnVmZmVyOjpyZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSkgeworICAgIGludDMyX3QgYXZhaWxhYmxlID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChhdmFpbGFibGUgPCAwKSBhdmFpbGFibGUgKz0gbUNhcGFjaXR5OworCisgICAgYXZhaWxhYmxlIC09IG1CYWNrUGFkZGluZzsKKyAgICBpZiAoYXZhaWxhYmxlIDw9MCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGF2YWlsYWJsZSA8IGludDMyX3QobnVtKSkgeworICAgICAgICBudW0gPSBhdmFpbGFibGU7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHlmaXJzdCA9IChtQ2FwYWNpdHkgLSBtUmVhZEhlYWQpOworICAgIGlmIChjb3B5Zmlyc3QgPiBudW0pIGNvcHlmaXJzdCA9IG51bTsKKyAgICBpZiAoY29weWZpcnN0KSB7CisgICAgICAgIG1lbWNweShkc3QsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIGNvcHlmaXJzdCk7CisgICAgICAgIG51bSAtPSBjb3B5Zmlyc3Q7CisgICAgICAgIGRzdCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIG1SZWFkSGVhZCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIENIRUNLX0xFKG1SZWFkSGVhZCwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1SZWFkSGVhZCA9PSBtQ2FwYWNpdHkpIG1SZWFkSGVhZCA9IDA7CisgICAgICAgIGlmIChudW0pIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIG1DdXRCdWZmZXIsIG51bSk7CisgICAgICAgICAgICBtUmVhZEhlYWQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK3NpemVfdCBTa2lwQ3V0QnVmZmVyOjpzaXplKCkgeworICAgIGludDMyX3QgYXZhaWxhYmxlID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChhdmFpbGFibGUgPCAwKSBhdmFpbGFibGUgKz0gbUNhcGFjaXR5OworICAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI1NjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTS0lQX0NVVF9CVUZGRVJfSF8KKworI2RlZmluZSBTS0lQX0NVVF9CVUZGRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogdXRpbGl0eSBjbGFzcyB0byBjdXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2ZmIGEgc3RyZWFtIG9mIGRhdGEgaW4gTWVkaWFCdWZmZXJzCisgKgorICovCitjbGFzcyBTa2lwQ3V0QnVmZmVyOiBwdWJsaWMgUmVmQmFzZSB7CisgcHVibGljOgorICAgIC8vICdza2lwJyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBza2lwIGZyb20gdGhlIGJlZ2lubmluZworICAgIC8vICdjdXQnIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGN1dCBmcm9tIHRoZSBlbmQKKyAgICAvLyAnbnVtMTZCaXRDaGFubmVscycgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscywgd2hpY2ggYXJlIGFzc3VtZWQgdG8gYmUgMTYgYml0IHdpZGUgZWFjaAorICAgIFNraXBDdXRCdWZmZXIoc2l6ZV90IHNraXAsIHNpemVfdCBjdXQsIHNpemVfdCBudW0xNkNoYW5uZWxzKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgTWVkaWFCdWZmZXIgZm9yIHNraXBwaW5nIGFuZCBjdXR0aW5nLiBUaGlzIG1heSBjb25zdW1lIGFsbCBvcgorICAgIC8vIHNvbWUgb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwgb3IgaXQgbWF5IGFkZCBkYXRhIHRvIGl0LgorICAgIC8vIEFmdGVyIHRoaXMsIHRoZSBjYWxsZXIgc2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlciBhcyB1c3VhbC4KKyAgICB2b2lkIHN1Ym1pdChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW4gQUJ1ZmZlcgorICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBidWZmZXIpOyAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbiBBQnVmZmVyCisgICAgdm9pZCBjbGVhcigpOworICAgIHNpemVfdCBzaXplKCk7IC8vIGhvdyBtYW55IGJ5dGVzIGFyZSBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBidWZmZXIKKworIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ta2lwQ3V0QnVmZmVyKCk7CisKKyBwcml2YXRlOgorICAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKTsKKyAgICBzaXplX3QgcmVhZChjaGFyICpkc3QsIHNpemVfdCBudW0pOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc3VibWl0SW50ZXJuYWwoY29uc3Qgc3A8VD4mIGJ1ZmZlcik7CisgICAgaW50MzJfdCBtU2tpcDsKKyAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CisgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CisgICAgaW50MzJfdCBtV3JpdGVIZWFkOworICAgIGludDMyX3QgbVJlYWRIZWFkOworICAgIGludDMyX3QgbUNhcGFjaXR5OworICAgIGNoYXIqIG1DdXRCdWZmZXI7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2tpcEN1dEJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9NWF9DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdmNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MiBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNjb2RlY191bml0X3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9zZnBsdWdpbiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtY19zYW5pdHlfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzY4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQ29kZWNTYW5pdHlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFDb2RlY1Nhbml0eVRlc3QoKQorICAgICAgICA6IGxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICAgICAgY2ZnKG5ldyBBTWVzc2FnZSksCisgICAgICAgICAgaWZtdChuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIG9mbXQobmV3IEFNZXNzYWdlKSB7CisgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICAgICAgbG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIH5NZWRpYUNvZGVjU2FuaXR5VGVzdCgpIHsKKyAgICAgICAgaWYgKGNvZGVjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9vcGVyLT5zdG9wKCk7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyOworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjOworICAgIHNwPEFNZXNzYWdlPiBjZmc7CisgICAgc3A8QU1lc3NhZ2U+IGlmbXQ7CisgICAgc3A8QU1lc3NhZ2U+IG9mbXQ7Cit9OworCitjb25zdCBzdGF0aWMgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKworLy8gZGF0YSBmb3IgYSBjb2RlYyBpbnB1dCBmcmFtZQorc3RydWN0IEZyYW1lRGF0YSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICB0ZW1wbGF0ZTxzaXplX3QgTj4KKyAgICBjb25zdGV4cHIgRnJhbWVEYXRhKGNvbnN0IHVpbnQ4X3QoJmRhdGFfKVtOXSkgOiBkYXRhKGRhdGFfKSwgc2l6ZShOKSB7IH0KK307CisKKy8vIG9uZSB5ZWxsb3cgZnJhbWUgb2YgMjQweDE4MCAoYWxiZWl0IDQ6NDo0KQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQTFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwZCwgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDIwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MmIsIDB4ZmYsIDB4ZmUsIDB4ZDgsIDB4ZTcsIDB4ZjMsIDB4MmMsIDB4YTUsIDB4NjAsCisgICAgMHhjYSwgMHhiYiwgMHhmMSwgMHg1YywgMHg0NCwgMHg3YywgMHg5YSwgMHhhNSwgMHhjMywgMHhhYiwgMHgyZiwgMHg3NywgMHgwYSwgMHg5NCwgMHgwZCwgMHgxOSwKKyAgICAweDQzLCAweDNiLCAweDRmLCAweDI1LCAweGVhLCAweDY2LCAweDAwLCAweDAxLCAweDI0LCAweGNkLCAweDM1LCAweDVmLCAweGMyLCAweDM0LCAweDg5LCAweGQxLAorICAgIDB4YTUsIDB4NjAsIDB4MDksIDB4OTgsIDB4MDAsIDB4MDEsIDB4MWIsIDB4MGUsIDB4Y2IsIDB4MGQsIDB4MDQsIDB4ODYsIDB4OTQsIDB4ZTIsIDB4MzIsIDB4M2MsCisgICAgMHhkZCwgMHgwZiwKK307CisKK0ZyYW1lRGF0YSBhdmNTdHJlYW1fQVtdIF9fdW51c2VkID0geyBhdmNTdHJlYW1fQTEgfTsKKworLy8gQVZDIHN0cmVhbSBvZiAyIHllbGxvdyBmcmFtZXMgKDI0MHgxODApCitjb25zdCB1aW50OF90IGF2Y1N0cmVhbV9CMVtdID0geyAvLyBJRFIgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDY0LCAweDAwLCAweDBjLCAweGFjLCAweGQ5LCAweDQxLCAweDQxLCAweGZhLCAweDEwLCAweDAwLCAweDAwLAorICAgIDB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDIsIDB4ODAsIDB4ZjEsIDB4NDIsIDB4OTksIDB4NjAsCisKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweGViLCAweGUzLCAweGNiLCAweDIyLCAweGMwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NSwgMHg4OCwgMHg4NCwgMHgwMCwgMHgzMywgMHhmZiwgMHhmZSwgMHhkZiwgMHgzMiwgMHhmOCwgMHgxNCwgMHhkNiwgMHgyNSwKKyAgICAweGQwLCAweDc0LCAweDQyLCAweDUwLCAweDg0LCAweDZmLCAweGY0LCAweGMyLCAweDVjLCAweDc2LCAweDM3LCAweDE3LCAweDcyLCAweGFjLCAweDUyLCAweGZjLAorICAgIDB4ZDYsIDB4MWYsIDB4ZDIsIDB4ZDAsIDB4NjAsIDB4YjIsIDB4MjAsIDB4MDAsIDB4MTAsIDB4M2QsIDB4MmEsIDB4YzAsIDB4ZTQsIDB4MjcsIDB4Y2IsIDB4Y2UsCisgICAgMHhlYSwgMHgyNSwgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwZiwgMHg0MCwgMHhiYywgMHg4MSwgMHgxNSwgMHhjMSwgMHg2NSwgMHgyMCwgMHg4MCwgMHg4MSwKKyAgICAweDdhLCAweDU3LCAweDUxLAorfTsKKworY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjJbXSA9IHsgLy8gUCBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsIDB4OWEsIDB4MjEsIDB4NmMsIDB4NDIsIDB4YmYsIDB4ZmUsIDB4MzgsIDB4NDAsIDB4MDAsIDB4MGQsIDB4NDgsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0JbXSA9IHsgYXZjU3RyZWFtX0IxLCBhdmNTdHJlYW1fQjIgfTsKKworY2xhc3MgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QgOiBwdWJsaWMgTWVkaWFDb2RlY1Nhbml0eVRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQzMl90PiB7Cit9OworCitURVNUX1AoTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIFRlc3RBdmNEZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIGNvbnN0IGludDMyX3QgSW5wdXRTaXplID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoSW5wdXRTaXplID49IDApIHsKKyAgICAgICAgY2ZnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBJbnB1dFNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0Rm9ybWF0KCZpZm10KSwgT0spOworICAgIGludDMyX3QgbWF4SW5wdXRTaXplOworICAgIEFTU0VSVF9UUlVFKGlmbXQtPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSk7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfR0UobWF4SW5wdXRTaXplLCAxIDw8IDIwKTsgLy8gMSBNQgorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0VmlkZW9EZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC52cDguZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fVlA4KTsKKworICAgIGNvbnN0IGludDMyX3QgSW5wdXRTaXplID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoSW5wdXRTaXplID49IDApIHsKKyAgICAgICAgY2ZnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBJbnB1dFNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0Rm9ybWF0KCZpZm10KSwgT0spOworICAgIGludDMyX3QgbWF4SW5wdXRTaXplOworICAgIEFTU0VSVF9UUlVFKGlmbXQtPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSk7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfR0UobWF4SW5wdXRTaXplLCAxIDw8IDIwKTsgLy8gMSBNQgorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXVkaW9EZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgNDQxMDApOworICAgIGNmZy0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAyKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBpZiAoSW5wdXRTaXplID4gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCBJbnB1dFNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIDEgPDwgMTkpOyAvLyA1MTIgS0IKKyAgICAgICAgfQorICAgICAgICBtYXhJbnB1dFNpemUgPSBrTGluZWFyQnVmZmVyU2l6ZTsgLy8gaW5wdXQgc2l6ZSBpcyBzZXQgYnkgY2hhbm5lbAorICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICBzaXplX3QgaXg7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICBFWFBFQ1RfR0UoYnVmLT5zaXplKCksIChzaXplX3QpbWF4SW5wdXRTaXplKTsKKyAgICBFWFBFQ1RfTEUoYnVmLT5zaXplKCksIChzaXplX3QpbWF4SW5wdXRTaXplICsgNDA5NnUpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoLTEsIDEyMzQsIDEyMzQ1Njc4KSk7CisKK1RFU1RfRihNZWRpYUNvZGVjU2FuaXR5VGVzdCwgVGVzdEF2Y0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBIRFJTdGF0aWNJbmZvIGluZm8gPSB7IC5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEsIC5zVHlwZTEgPSB7CisgICAgICAgIC5tUiA9IHsgLnggPSAzNTQwMCwgLnkgPSAxNDYwMCB9LCAubUcgPSB7IC54ID0gODUwMCwgIC55ID0gMzk4NTAgfSwKKyAgICAgICAgLm1CID0geyAueCA9IDY1NTAsICAueSA9ICAyMzAwIH0sIC5tVyA9IHsgLnggPSAxNTYzNSwgLnkgPSAxNjQ1MCB9LAorICAgICAgICAubU1heERpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLCAubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAubU1heENvbnRlbnRMaWdodExldmVsID0gMTAwMCwgLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gMTIwIH0KKyAgICB9OworICAgIGNmZy0+c2V0QnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJmluZm8sIHNpemVvZihpbmZvKSkpOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIHNwPEFCdWZmZXI+IG9pbmZvOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImhkci1zdGF0aWMtaW5mbyIsICZvaW5mbykpOworICAgIEFTU0VSVF9FUShvaW5mby0+c2l6ZSgpLCBzaXplb2YoaW5mbykpOworICAgIEVYUEVDVF9FUShtZW1jbXAob2luZm8tPmRhdGEoKSwgJmluZm8sIHNpemVvZihpbmZvKSksICAwKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICAvLyBhc3N1bWUgd2UgY2FuIHN1Ym1pdCBhbGwgaW5wdXQgYmVmb3JlIGRlcXVldWluZyBvdXRwdXQKKyAgICBzaXplX3QgZnJhbWVJeCA9IDA7CisgICAgc2l6ZV90IGl4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBmb3IgKGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgOiBhdmNTdHJlYW1fQikgeworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgICAgICBBU1NFUlRfR0UoYnVmLT5jYXBhY2l0eSgpLCBmcmFtZS5zaXplKTsKKyAgICAgICAgbWVtY3B5KGJ1Zi0+YmFzZSgpLCBmcmFtZS5kYXRhLCBmcmFtZS5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGJ1Zi0+c2V0UmFuZ2UoMCwgZnJhbWUuc2l6ZSksIE9LKTsKKyAgICAgICAgYm9vbCBlb3MgPSArK2ZyYW1lSXggPT0gTkVMRU0oYXZjU3RyZWFtX0IpOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaXgsIDAsIGZyYW1lLnNpemUsIGZyYW1lSXggKiAzMzMzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvcyA/IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwgIE9LKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdHM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgYm9vbCBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IHRydWU7CisgICAgYm9vbCBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpeCwgJm9mZnNldCwgJnNpemUsICZ0cywgJmZsYWdzLCAxMDAwMDAwKTsKKyAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEICYmIG1JbmZvRm9ybWF0Q2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgJiYgbUluZm9CdWZmZXJzQ2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl4LCAmYnVmKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KGl4LCAmb2ZtdCksIE9LKTsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK1RFU1RfRihNZWRpYUNvZGVjU2FuaXR5VGVzdCwgVGVzdFZpZGVvRGVjb2RlckhkclN0YXRpY0luZm8pIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICBIRFJTdGF0aWNJbmZvIGluZm8gPSB7IC5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEsIC5zVHlwZTEgPSB7CisgICAgICAgIC5tUiA9IHsgLnggPSAzNTQwMCwgLnkgPSAxNDYwMCB9LCAubUcgPSB7IC54ID0gODUwMCwgIC55ID0gMzk4NTAgfSwKKyAgICAgICAgLm1CID0geyAueCA9IDY1NTAsICAueSA9ICAyMzAwIH0sIC5tVyA9IHsgLnggPSAxNTYzNSwgLnkgPSAxNjQ1MCB9LAorICAgICAgICAubU1heERpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLCAubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAubU1heENvbnRlbnRMaWdodExldmVsID0gMTAwMCwgLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gMTIwIH0KKyAgICB9OworICAgIGNmZy0+c2V0QnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJmluZm8sIHNpemVvZihpbmZvKSkpOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIHNwPEFCdWZmZXI+IG9pbmZvOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImhkci1zdGF0aWMtaW5mbyIsICZvaW5mbykpOworICAgIEFTU0VSVF9FUShvaW5mby0+c2l6ZSgpLCBzaXplb2YoaW5mbykpOworICAgIEVYUEVDVF9FUShtZW1jbXAob2luZm8tPmRhdGEoKSwgJmluZm8sIHNpemVvZihpbmZvKSksICAwKTsKK30KKworY2xhc3MgTWVkaWFDb2RlY0J5dGVCdWZmZXJUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCwgVGVzdFZpZGVvRGVjb2RlcjQyMFBsYW5hcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKy8vICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19BVkMpOworICAgIGNvbnN0IGludDMyX3QgQ29sb3IgPSBHZXRQYXJhbSgpOworICAgIGlmIChDb2xvciA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIENvbG9yKTsKKyAgICB9CisgICAgaW50MzJfdCB4Y29sb3IgPSBDb2xvciA9PSAtMSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENvbG9yOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIGludDMyX3Qgb2NvbG9yID0gLTE7CisgICAgRVhQRUNUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICAvLyBhc3N1bWUgd2UgY2FuIHN1Ym1pdCBhbGwgaW5wdXQgYmVmb3JlIGRlcXVldWluZyBvdXRwdXQKKyAgICBzaXplX3QgZnJhbWVJeCA9IDA7CisgICAgc2l6ZV90IGl4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBmb3IgKGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgOiBhdmNTdHJlYW1fQSkgeworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgICAgICBBU1NFUlRfR0UoYnVmLT5jYXBhY2l0eSgpLCBmcmFtZS5zaXplKTsKKyAgICAgICAgbWVtY3B5KGJ1Zi0+YmFzZSgpLCBmcmFtZS5kYXRhLCBmcmFtZS5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGJ1Zi0+c2V0UmFuZ2UoMCwgZnJhbWUuc2l6ZSksIE9LKTsKKyAgICAgICAgYm9vbCBlb3MgPSArK2ZyYW1lSXggPT0gTkVMRU0oYXZjU3RyZWFtX0EpOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaXgsIDAsIGZyYW1lLnNpemUsIGZyYW1lSXggKiAzMzMzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvcyA/IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwgIE9LKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdHM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgYm9vbCBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IHRydWU7CisgICAgYm9vbCBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpeCwgJm9mZnNldCwgJnNpemUsICZ0cywgJmZsYWdzLCAxMDAwMDAwKTsKKyAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEICYmIG1JbmZvRm9ybWF0Q2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgJiYgbUluZm9CdWZmZXJzQ2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl4LCAmYnVmKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KGl4LCAmb2ZtdCksIE9LKTsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZvY29sb3IpKTsKKyAgICBFWFBFQ1RfRVEob2NvbG9yLCB4Y29sb3IpIDw8IG9mbXQtPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCkgPDwgYnVmLT5tZXRhKCktPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCk7CisgICAgLy8gZXhwZWN0IGFuIGltYWdlLWRhdGEgaW4gYm90aCBmb3JtYXQgYW5kIG1ldGEKKyAgICBzcDxBQnVmZmVyPiBpbWdCdWYsIGltZ0J1ZjI7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWdCdWYpKTsKKyAgICBBU1NFUlRfVFJVRShidWYtPm1ldGEoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWdCdWYyKSk7CisgICAgRVhQRUNUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBzaXplb2YoTWVkaWFJbWFnZTIpKTsKKyAgICBBU1NFUlRfRVEoaW1nQnVmLT5zaXplKCksIGltZ0J1ZjItPnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChpbWdCdWYtPmRhdGEoKSwgaW1nQnVmMi0+ZGF0YSgpLCBpbWdCdWYtPnNpemUoKSkpOworICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIqKWltZ0J1Zi0+ZGF0YSgpOworICAgIEVYUEVDVF9FUShpbWctPm1UeXBlLCBpbWctPk1FRElBX0lNQUdFX1RZUEVfWVVWKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tTnVtUGxhbmVzLCAzdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVdpZHRoLCAzMjB1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tSGVpZ2h0LCAyNDB1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tQml0RGVwdGgsIDh1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQsIDh1KTsKKworICAgIC8vIHJlYWQgc3RyaWRlcyBmcm9tIGZvcm1hdAorICAgIGludDMyX3Qgc3RyaWRlLCB2c3RyaWRlOworICAgIG9mbXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgICAgICAgICAgfHwgb2ZtdC0+ZmluZEludDMyKCJ3aWR0aCIsICZzdHJpZGUpOworICAgIG9mbXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJnZzdHJpZGUpICAgfHwgb2ZtdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmdnN0cmlkZSk7CisKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tSG9yaXpTdWJzYW1wbGluZywgMXUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1WZXJ0U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tSG9yaXpTdWJzYW1wbGluZywgMnUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1WZXJ0U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tSG9yaXpTdWJzYW1wbGluZywgMnUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1WZXJ0U3Vic2FtcGxpbmcsIDJ1KTsKKworICAgIHN3aXRjaCAoeGNvbG9yKSB7CisgICAgICAgIC8vIGRlZmluZWQgZm9ybWF0cworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUgLyAyKTsKKworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCwgKHVpbnQzMl90KShzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQgKyBzdHJpZGUgLyAyICogMTE5ICsgMTYwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1PZmZzZXQsIDB1KTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCwgKHVpbnQzMl90KShzdHJpZGUgKiB2c3RyaWRlKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSArIDEpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMsIDIpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyBzdHJpZGUgKiAxMTkgKyAzMjApKTsKKyAgICAgICAgICAgIEVYUEVDVF9MRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CisgICAgICAgICAgICAvLyBhbnl0aGluZyBnb2VzLCBidXQgc3RyaWRlIHNob3VsZCBtYXRjaCBZIHBsYW5lCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0ICsgMjM5ICogaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDMxOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0ICsgMTE5ICogaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE1OSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0ICsgMTE5ICogaW1nLT5tUGxhbmVbaW1nLT5WXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE1OSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubUNvbEluYyArIDEgfSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHZhbGlkYXRlIGFsbCBwaXhlbHMKKyNpZiAwCisgICAgZnByaW50ZihzdGRlcnIsICJNZWRpYUltYWdlIHsgRigldXgldSkgQCV1KyVkKyVkIEAldSslZCslZCBAJXUrJWQrJWQgfVxuIiwKKyAgICAgICAgICAgIGltZy0+bVdpZHRoLCBpbWctPm1IZWlnaHQsCisgICAgICAgICAgICBpbWctPm1QbGFuZVswXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVswXS5tQ29sSW5jLCBpbWctPm1QbGFuZVswXS5tUm93SW5jLAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMV0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMV0ubUNvbEluYywgaW1nLT5tUGxhbmVbMV0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzJdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzJdLm1Sb3dJbmMpOworI2VuZGlmCisgICAgZm9yIChpeCA9IDA7IGl4IDwgMzsgKytpeCkgeworICAgICAgICBjb25zdCBzdGF0aWMgdWludDhfdCBleHBlY3RlZFtdID0geyAyMTAsIDE2LCAxNDYgfTsKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGltZy0+bUhlaWdodCAvIGltZy0+bVBsYW5lW2l4XS5tVmVydFN1YnNhbXBsaW5nIDsgKyt5KSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgaW1nLT5tV2lkdGggLyBpbWctPm1QbGFuZVtpeF0ubUhvcml6U3Vic2FtcGxpbmc7ICsreCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsID0gYnVmLT5kYXRhKClbaW1nLT5tUGxhbmVbaXhdLm1PZmZzZXQgKyBpbWctPm1QbGFuZVtpeF0ubUNvbEluYyAqIHgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW1nLT5tUGxhbmVbaXhdLm1Sb3dJbmMgKiB5XTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEodmFsLCBleHBlY3RlZFtpeF0pIDw8ICJpbmNvcnJlY3QgdmFsdWUgZm9yIHBsYW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgYXQgeD0iIDw8IHggPDwgIiwgeT0iIDw8IHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKElucHV0U2l6ZXMsIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIC0xLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL1JlZmxlY3RlZFBhcmFtVXBkYXRlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkYjBlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8UmVmbGVjdGVkUGFyYW1VcGRhdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhUZXN0U3RhcnQgPSAweDEwMDAsCisgICAga1BhcmFtSW5kZXhJbnQsCisgICAga1BhcmFtSW5kZXhTdHJpbmcsCisgICAga1BhcmFtSW5kZXhDb21wb3NpdGUsCisgICAga1BhcmFtSW5kZXhGbGV4U3RyaW5nLAorCisgICAga1BhcmFtSW5kZXhMb25nID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4SW50PiBDMkludEluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4TG9uZz4gQzJMb25nSW5mbzsKKworc3RydWN0IEMyRml4ZWRTaXplU3RyaW5nU3RydWN0IHsKKyAgICBjaGFyIHZhbHVlWzEyXTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChGaXhlZFNpemVTdHJpbmcpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCwga1BhcmFtSW5kZXhTdHJpbmc+IEMyU3RyaW5nSW5mbzsKKworc3RydWN0IEMyQ29tcG9zaXRlU3RydWN0IHsKKyAgICBpbnQzMl90IGkzMjsKKyAgICB1aW50NjRfdCB1NjQ7CisgICAgY2hhciBzdHJbMTJdOworICAgIHVpbnQ4X3QgYmxvYls4XTsKKyAgICB1aW50OF90IGZsZXhCbG9iW107CisKKyAgICBDMkNvbXBvc2l0ZVN0cnVjdCgpID0gZGVmYXVsdDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKENvbXBvc2l0ZSwgZmxleEJsb2IpCisgICAgQzJGSUVMRChpMzIsICJpMzIiKQorICAgIEMyRklFTEQodTY0LCAidTY0IikKKyAgICBDMkZJRUxEKHN0ciwgInN0ciIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChmbGV4QmxvYiwgImZsZXgtYmxvYiIpCit9Oworc3RhdGljX2Fzc2VydChDMkNvbXBvc2l0ZVN0cnVjdDo6RkxFWF9TSVpFID09IDEsICIiKTsKK3N0YXRpY19hc3NlcnQoX0MyRmxleEhlbHBlcjxDMkNvbXBvc2l0ZVN0cnVjdD46OkZMRVhfU0laRSA9PSAxLCAiIik7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkNvbXBvc2l0ZVN0cnVjdCwga1BhcmFtSW5kZXhDb21wb3NpdGU+IEMyQ29tcG9zaXRlSW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhGbGV4U3RyaW5nPiBDMkZsZXhTdHJpbmdJbmZvOworCisjZGVmaW5lIFNVUFBPUlRFRF9UWVBFUyAgIFwKKyAgICBDMkludEluZm8sICAgICAgICAgICAgXAorICAgIEMyTG9uZ0luZm8sICAgICAgICAgICBcCisgICAgQzJTdHJpbmdJbmZvLCAgICAgICAgIFwKKyAgICBDMkNvbXBvc2l0ZUluZm8sICAgICAgXAorICAgIEMyRmxleFN0cmluZ0luZm8KKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBkZXNjcmliZV9pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBkZXNjcmliZV9pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPT0gVDo6Q09SRV9JTkRFWCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJ1Y3REZXNjcmlwdG9yPihUOjpDT1JFX0lOREVYLCBUOjpGaWVsZExpc3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxUWVBFUy4uLj46OmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGRlc2NyaWJlX2ltcGw8PiB7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBjaGFyICpHZXROYW1lKCkgICAgICAgIHsgcmV0dXJuIG51bGxwdHI7IH0KK3RlbXBsYXRlPD4gY29uc3QgY2hhciAqR2V0TmFtZTxDMkludEluZm8+KCkgICAgICAgeyByZXR1cm4gImludCI7IH0KK3RlbXBsYXRlPD4gY29uc3QgY2hhciAqR2V0TmFtZTxDMkxvbmdJbmZvPigpICAgICAgeyByZXR1cm4gImxvbmciOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJTdHJpbmdJbmZvPigpICAgIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJDb21wb3NpdGVJbmZvPigpIHsgcmV0dXJuICJjb21wb3NpdGUiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJGbGV4U3RyaW5nSW5mbz4oKSB7IHJldHVybiAiZmxleC1zdHJpbmciOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBmaWxsX2Rlc2NyaXB0b3JzX2ltcGw8VCwgVFlQRVMuLi4+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICp2ZWMpIHsKKyAgICAgICAgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFRZUEVTLi4uPjo6ZmlsbCh2ZWMpOworICAgICAgICB2ZWMtPnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBUOjpQQVJBTV9UWVBFLCBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUEVSU0lTVEVOVCwgR2V0TmFtZTxUPigpKSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPD4geworICAgIHN0YXRpYyB2b2lkIGZpbGwoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgKkNhc3RQYXJhbShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtKSB7CisgICAgcmV0dXJuIChUICopcGFyYW0uZ2V0KCk7Cit9CisKK2NsYXNzIFBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIFBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworICAgIH5QYXJhbVJlZmxlY3RvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBkZXNjcmliZV9pbXBsPFNVUFBPUlRFRF9UWVBFUz46OmRlc2NyaWJlKHBhcmFtSW5kZXgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCgpIDogbVJlZmxlY3RvcihuZXcgUGFyYW1SZWZsZWN0b3IpIHsKKyAgICAgICAgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFNVUFBPUlRFRF9UWVBFUz46OmZpbGwoJm1EZXNjcmlwdG9ycyk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbURlc2NyaXB0b3JzOworfTsKKworVEVTVF9GKFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QsIFNpbmdsZVZhbHVlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiaW50LnZhbHVlIiwgaW50MzJfdCgxMikpOworICAgIG1zZy5lbXBsYWNlKCJ2ZW5kb3IubG9uZy52YWx1ZSIsIGludDY0X3QoMzQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJGbGV4U3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJJbnRJbmZvKTsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMkxvbmdJbmZvKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMySW50SW5mbz4ocGFyYW1zWzBdKS0+dmFsdWUpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJMb25nSW5mbz4ocGFyYW1zWzFdKS0+dmFsdWUpOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgxMiwgQ2FzdFBhcmFtPEMySW50SW5mbz4ocGFyYW1zWzBdKS0+dmFsdWUpOworICAgIEVYUEVDVF9FUSgzNCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICBpbnQzMl90IGludDMyVmFsdWUgPSAwOworICAgIGludDY0X3QgaW50NjRWYWx1ZSA9IDA7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgiaW50LnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImludC52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMTIsIGludDMyVmFsdWUpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoInZlbmRvci5sb25nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInZlbmRvci5sb25nLnZhbHVlIl0uZmluZCgmYzJWYWx1ZSkpOworICAgIEVYUEVDVF9FUSh0cnVlLCBjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkpOworICAgIEVYUEVDVF9FUSgzNCwgaW50NjRWYWx1ZSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTdHJpbmdUZXN0KSB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHVwZGF0ZXI7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgbXNnOworICAgIG1zZy5lbXBsYWNlKCJzdHJpbmcudmFsdWUiLCBBU3RyaW5nKCI1NiIpKTsKKyAgICBtc2cuZW1wbGFjZSgiZmxleC1zdHJpbmcudmFsdWUiLCBBU3RyaW5nKCJTb21lIHN0cmluZyIpKTsKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyaW5nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlWzBdKTsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKEMyRmxleFN0cmluZ0luZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5mbGV4Q291bnQoKSk7CisgICAgY2hhciAqZmxleFN0cmluZ0RhdGEgPSAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF07CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX1NUUkVRKCI1NiIsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMTJ1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiU29tZSBzdHJpbmciLCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZSk7CisgICAgRVhQRUNUX05FKGZsZXhTdHJpbmdEYXRhLCAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF0pOworICAgIGZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgLy8gdmVyaWZ5IHRydW5jYXRpb24gYW5kIGluLXBsYWNlIHVwZGF0ZQorICAgIG1zZ1sic3RyaW5nLnZhbHVlIl0gPSBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlKEFTdHJpbmcoIjEyMzQ1Njc4OTBBQkNERSIpKTsKKyAgICBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0gPSBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlKEFTdHJpbmcoImFiYyIpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoNHUsIENhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhYmMiLCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZSk7CisgICAgRVhQRUNUX0VRKGZsZXhTdHJpbmdEYXRhLCAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF0pOworCisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBtc2cgPSB1cGRhdGVyLmdldFBhcmFtcyhwYXJhbXMpOworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJzdHJpbmcudmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1zZ1sic3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEyMzQ1Njc4OTBBIiwgc3RyVmFsdWUuY19zdHIoKSk7CisKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgiZmxleC1zdHJpbmcudmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1zZ1siZmxleC1zdHJpbmcudmFsdWUiXS5maW5kKCZzdHJWYWx1ZSkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgc3RyVmFsdWUuY19zdHIoKSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBDb21wb3NpdGVUZXN0KSB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHVwZGF0ZXI7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgbXNnOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuaTMyIiwgaW50MzJfdCg3OCkpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUudTY0IiwgaW50NjRfdCg5MTApKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjExMTIiKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWZmZXIwOCIsIDgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmZsZXgtYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiZmxleC1idWZmZXItMTQiLCAxNCkpOworCisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKEMyQ29tcG9zaXRlSW5mbzo6QWxsb2NVbmlxdWUoMCkpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJcMFwwXDBcMFwwXDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgdWludDhfdCAqZmxleEJsb2JEYXRhID0gJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF07CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDc4LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDkxMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjExMTIiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmZmVyMDgiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU3RyaW5nIGhleDsKKyAgICBoZXhkdW1wKENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCwgMCwgJmhleCk7CisgICAgcHJpbnRmKCIlc1xuIiwgaGV4LmNfc3RyKCkpOworICAgIEFTU0VSVF9FUSgxNHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJmbGV4LWJ1ZmZlci0xNCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2IsIDE0KSk7CisgICAgRVhQRUNUX05FKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworICAgIGZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgLy8gdGVzdCBzZXR0aW5nIGFuZCB6ZXJvIGV4dGVuZGluZyBzaG9ydGVyIGJsb2IgdGhhbiBhbGxvd2VkCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDVcMFwwXDAiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9FUShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgdHJpbW1pbmcgbGFyZ2VyIGJsb2IgdGhhbiBhbGxvd2VkCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJSZWFsbHlMb25nQnVmZmVyIiwgMTYpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiUmVhbGx5TG8iLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9FUShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKworICAgIC8vIHRlc3QgdHJpbW1pbmcgZmxleCBibG9iIGluLXBsYWNlCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImJ1ZjA1IiwgNSkpOworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoNXUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJidWYwNSIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2IsIDUpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBDb21wb3NpdGVQYXJ0aWFsVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIEMyVmFsdWUoMTMxNCkpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuc3RyIiwgQVN0cmluZygiMTUxNiIpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDEydSkpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyWzBdKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTMxNCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9TVFJFUSgiMTUxNiIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjZjM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlYzJCdWZmZXJVdGlscy5jcHAiLAorICAgICAgICAiQ29kZWMyTWFwcGVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkMjJhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisvKioKKyAqIEEgZmxpcHBhYmxlLCBvcHRpbWl6YWJsZSBtZW1jcHkuIENvbnN0cnVjdHMgc3VjaCBhcyAoZnJvbSA/IHNyYyA6IGRzdCkgZG8gbm90IHdvcmsgYXMgdGhlIHJlc3VsdHMgYXJlCisgKiBhbHdheXMgY29uc3QuCisgKi8KK3RlbXBsYXRlPGJvb2wgVG9BLCBzaXplX3QgUz4KK3N0cnVjdCBNZW1Db3BpZXIgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoQSAqYSwgY29uc3QgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgX19idWlsdGluX21lbWNweShhLCBiLCBzaXplKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxzaXplX3QgUz4KK3N0cnVjdCBNZW1Db3BpZXI8ZmFsc2UsIFM+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICAgIGlubGluZSBzdGF0aWMgdm9pZCBjb3B5KGNvbnN0IEEgKmEsIEIgKmIsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE1lbUNvcGllcjx0cnVlLCBTPjo6Y29weShiLCBhLCBzaXplKTsKKyAgICB9Cit9OworCisvKioKKyAqIENvcGllcyBiZXR3ZWVuIGEgTWVkaWFJbWFnZSBhbmQgYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIFRvTWVkaWFJbWFnZSB3aGV0aGVyIHRvIGNvcHkgdG8gKG9yIGZyb20pIHRoZSBNZWRpYUltYWdlCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcgKGNvdWxkIGJlIENvbnN0R3JhcGhpY1ZpZXcgb3IgR3JhcGhpY1ZpZXcgZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UgKGNvdWxkIGJlIGNvbnN0IHVpbnQ4X3QqIG9yIHVpbnQ4X3QqIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24pCisgKi8KK3RlbXBsYXRlPGJvb2wgVG9NZWRpYUltYWdlLCB0eXBlbmFtZSBWaWV3LCB0eXBlbmFtZSBJbWFnZVBpeGVsPgorc3RhdGljIHN0YXR1c190IF9JbWFnZUNvcHkoVmlldyAmdmlldywgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgSW1hZ2VQaXhlbCAqaW1nQmFzZSkgeworICAgIC8vIFRPRE86IG1vcmUgZWZmaWNpZW50IGNvcHlpbmcgLS0tIGUuZy4gb25lIHJvdyBhdCBhIHRpbWUsIGNvcHlpbmcKKyAgICAvLyAgICAgICBpbnRlcmxlYXZlZCBwbGFuZXMgdG9nZXRoZXIsIGV0Yy4KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICBjb25zdCBzaXplX3QgYnBwID0gZGl2VXAoaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQsIDh1KTsKKyAgICBpZiAodmlldy53aWR0aCgpICE9IGltZy0+bVdpZHRoCisgICAgICAgICAgICB8fCB2aWV3LmhlaWdodCgpICE9IGltZy0+bUhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8VG9NZWRpYUltYWdlLCB1aW50OF90LCBjb25zdCB1aW50OF90Pjo6dHlwZSAqaW1nUm93ID0KKyAgICAgICAgICAgIGltZ0Jhc2UgKyBpbWctPm1QbGFuZVtpXS5tT2Zmc2V0OworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgY29uc3QgdWludDhfdCwgdWludDhfdD46OnR5cGUgKnZpZXdSb3cgPQorICAgICAgICAgICAgdmlld1JvdyA9IHZpZXcuZGF0YSgpW2ldOworICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICBpZiAocGxhbmUuY29sU2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubUhvcml6U3Vic2FtcGxpbmcKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5yb3dTYW1wbGluZyAhPSBpbWctPm1QbGFuZVtpXS5tVmVydFN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggIT0gaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5hbGxvY2F0ZWREZXB0aCA8IHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgLy8gTWVkaWFJbWFnZSBvbmx5IHN1cHBvcnRzIE1TQiB2YWx1ZXMKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgKKyAgICAgICAgICAgICAgICB8fCAoYnBwID4gMSAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IHBsYW5lLk5BVElWRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBwbGFuZVcgPSBpbWctPm1XaWR0aCAvIHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICB1aW50MzJfdCBwbGFuZUggPSBpbWctPm1IZWlnaHQgLyBwbGFuZS5yb3dTYW1wbGluZzsKKworICAgICAgICBib29sIGNhbkNvcHlCeVJvdyA9IChwbGFuZS5jb2xJbmMgPT0gMSkgJiYgKGltZy0+bVBsYW5lW2ldLm1Db2xJbmMgPT0gMSk7CisgICAgICAgIGJvb2wgY2FuQ29weUJ5UGxhbmUgPSBjYW5Db3B5QnlSb3cgJiYgKHBsYW5lLnJvd0luYyA9PSBpbWctPm1QbGFuZVtpXS5tUm93SW5jKTsKKyAgICAgICAgaWYgKGNhbkNvcHlCeVBsYW5lKSB7CisgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weShpbWdSb3csIHZpZXdSb3csIHBsYW5lLnJvd0luYyAqIHBsYW5lSCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQ29weUJ5Um93KSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jvdywgdmlld1Jvdywgc3RkOjptaW4ocGxhbmUucm93SW5jLCBpbWctPm1QbGFuZVtpXS5tUm93SW5jKSk7CisgICAgICAgICAgICAgICAgaW1nUm93ICs9IGltZy0+bVBsYW5lW2ldLm1Sb3dJbmM7CisgICAgICAgICAgICAgICAgdmlld1JvdyArPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICBkZWNsdHlwZShpbWdSb3cpIGltZ1B0ciA9IGltZ1JvdzsKKyAgICAgICAgICAgICAgICBkZWNsdHlwZSh2aWV3Um93KSB2aWV3UHRyID0gdmlld1JvdzsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBsYW5lVzsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUHRyLCB2aWV3UHRyLCBicHApOworICAgICAgICAgICAgICAgICAgICBpbWdQdHIgKz0gaW1nLT5tUGxhbmVbaV0ubUNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgdmlld1B0ciArPSBwbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICByZXR1cm4gX0ltYWdlQ29weTxmYWxzZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQubnVtUGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC50eXBlID09IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbFNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd1NhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sU2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93U2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dTYW1wbGluZyA9PSAyKTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSkgeworICAgIHJldHVybiBNZWRpYUltYWdlMiB7CisgICAgICAgIC5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwKKyAgICAgICAgLm1OdW1QbGFuZXMgPSAzLAorICAgICAgICAubVdpZHRoID0gd2lkdGgsCisgICAgICAgIC5tSGVpZ2h0ID0gaGVpZ2h0LAorICAgICAgICAubUJpdERlcHRoID0gOCwKKyAgICAgICAgLm1CaXREZXB0aEFsbG9jYXRlZCA9IDgsCisgICAgICAgIC5tUGxhbmUgPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0LAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgfTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwU2VtaVBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDIsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSArIDEsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpIHsKKyAgICBDSEVDSyhkc3RZICE9IG51bGxwdHIpOworICAgIENIRUNLKChzcmMud2lkdGgoKSAmIDEpID09IDApOworICAgIENIRUNLKChzcmMuaGVpZ2h0KCkgJiAxKSA9PSAwKTsKKworICAgIGlmIChkc3RTdHJpZGUgKiBkc3RWU3RyaWRlICogMyAvIDIgPiBidWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dEKCJjb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFN0cmlkZSA+PiAxKSAqIChkc3RWU3RyaWRlID4+IDEpOworCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHNyYy5sYXlvdXQoKTsKKyAgICBjb25zdCB1aW50OF90ICpwUmVkICAgPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXTsKKyAgICBjb25zdCB1aW50OF90ICpwR3JlZW4gPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXTsKKyAgICBjb25zdCB1aW50OF90ICpwQmx1ZSAgPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXTsKKworI2RlZmluZSBDTElQMyh4LHkseikgKCgoeikgPCAoeCkpID8gKHgpIDogKCgoeikgPiAoeSkpID8gKHkpIDogKHopKSkKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5oZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgdWludDhfdCByZWQgPSAqcFJlZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JlZW4gPSAqcEdyZWVuOworICAgICAgICAgICAgdWludDhfdCBibHVlID0gKnBCbHVlOworCisgICAgICAgICAgICAvLyB1c2luZyBJVFUtUiBCVC42MDEgY29udmVyc2lvbiBtYXRyaXgKKyAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQorICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKHJlZCAqIDY2ICsgZ3JlZW4gKiAxMjkgKyBibHVlICogMjUpID4+IDgpICsgMTYpLCAyNTUpOworCisgICAgICAgICAgICBkc3RZW3hdID0gbHVtYTsKKworICAgICAgICAgICAgaWYgKCh4ICYgMSkgPT0gMCAmJiAoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0KKyAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4KSwgMjU1KTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQorICAgICAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiAxMTIgLSBncmVlbiAqIDk0IC0gYmx1ZSAqIDE4KSA+PiA4KSArIDEyOCksIDI1NSk7CisKKyAgICAgICAgICAgICAgICBkc3RVW3ggPj4gMV0gPSBVOworICAgICAgICAgICAgICAgIGRzdFZbeCA+PiAxXSA9IFY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmVkICAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0uY29sSW5jOworICAgICAgICAgICAgcEdyZWVuICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLmNvbEluYzsKKyAgICAgICAgICAgIHBCbHVlICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5jb2xJbmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICBkc3RVICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgZHN0ViArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHBSZWQgICAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcEdyZWVuIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwQmx1ZSAgLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBSZWQgICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5yb3dJbmM7CisgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5yb3dJbmM7CisgICAgICAgIHBCbHVlICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5yb3dJbmM7CisKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBBIGJsb2NrIG9mIHJhdyBhbGxvY2F0ZWQgbWVtb3J5LgorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sQmxvY2sgeworICAgIE1lbW9yeUJsb2NrUG9vbEJsb2NrKHNpemVfdCBzaXplKQorICAgICAgICA6IG1EYXRhKG5ldyB1aW50OF90W3NpemVdKSwgbVNpemUobURhdGEgPyBzaXplIDogMCkgeyB9CisKKyAgICB+TWVtb3J5QmxvY2tQb29sQmxvY2soKSB7CisgICAgICAgIGRlbGV0ZVtdIG1EYXRhOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKE1lbW9yeUJsb2NrUG9vbEJsb2NrKTsKKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBzaXplX3QgbVNpemU7Cit9OworCisvKioKKyAqIEEgc2ltcGxlIHJhdyBtZW1vcnkgYmxvY2sgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbEltcGwgeworICAgIHZvaWQgcmVsZWFzZShzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBibG9jaykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAvLyByZXR1cm4gYmxvY2sgdG8gZnJlZSBibG9ja3MgaWYgaXQgaXMgdGhlIGN1cnJlbnQgc2l6ZTsgb3RoZXJ3aXNlLCBkaXNjYXJkCisgICAgICAgIGlmIChibG9jay0+c2l6ZSgpID09IG1DdXJyZW50U2l6ZSkgeworICAgICAgICAgICAgbUZyZWVCbG9ja3Muc3BsaWNlKG1GcmVlQmxvY2tzLmJlZ2luKCksIG1CbG9ja3NJblVzZSwgYmxvY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLmVyYXNlKGJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGZldGNoKHNpemVfdCBzaXplKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GcmVlQmxvY2tzLnJlbW92ZV9pZihbc2l6ZV0oY29uc3QgTWVtb3J5QmxvY2tQb29sQmxvY2sgJmJsb2NrKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay5zaXplKCkgIT0gc2l6ZTsKKyAgICAgICAgfSk7CisgICAgICAgIG1DdXJyZW50U2l6ZSA9IHNpemU7CisgICAgICAgIGlmIChtRnJlZUJsb2Nrcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2UuZW1wbGFjZV9mcm9udChzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5zcGxpY2UobUJsb2Nrc0luVXNlLmJlZ2luKCksIG1GcmVlQmxvY2tzLCBtRnJlZUJsb2Nrcy5iZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJsb2Nrc0luVXNlLmJlZ2luKCk7CisgICAgfQorCisgICAgTWVtb3J5QmxvY2tQb29sSW1wbCgpID0gZGVmYXVsdDsKKworICAgIEMyX0RPX05PVF9DT1BZKE1lbW9yeUJsb2NrUG9vbEltcGwpOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz4gbUZyZWVCbG9ja3M7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPiBtQmxvY2tzSW5Vc2U7CisgICAgc2l6ZV90IG1DdXJyZW50U2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2w6OkltcGwgOiBNZW1vcnlCbG9ja1Bvb2xJbXBsIHsKK307CisKK3N0cnVjdCBNZW1vcnlCbG9jazo6SW1wbCB7CisgICAgSW1wbChzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBibG9jaywKKyAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9ja1Bvb2xJbXBsPiBwb29sKQorICAgICAgICA6IG1CbG9jayhibG9jayksIG1Qb29sKHBvb2wpIHsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgbVBvb2wtPnJlbGVhc2UobUJsb2NrKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsb2NrLT5kYXRhKCk7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxvY2stPnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgbUJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9ja1Bvb2xJbXBsPiBtUG9vbDsKK307CisKK01lbW9yeUJsb2NrIE1lbW9yeUJsb2NrUG9vbDo6ZmV0Y2goc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBwb29sQmxvY2sgPSBtSW1wbC0+ZmV0Y2goc2l6ZSk7CisgICAgcmV0dXJuIE1lbW9yeUJsb2NrKHN0ZDo6bWFrZV9zaGFyZWQ8TWVtb3J5QmxvY2s6OkltcGw+KAorICAgICAgICAgICAgcG9vbEJsb2NrLCBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8TWVtb3J5QmxvY2tQb29sSW1wbD4obUltcGwpKSk7Cit9CisKK01lbW9yeUJsb2NrUG9vbDo6TWVtb3J5QmxvY2tQb29sKCkKKyAgICA6IG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8TWVtb3J5QmxvY2tQb29sOjpJbXBsPigpKSB7Cit9CisKK01lbW9yeUJsb2NrOjpNZW1vcnlCbG9jayhzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2s6OkltcGw+IGltcGwpCisgICAgOiBtSW1wbChpbXBsKSB7Cit9CisKK01lbW9yeUJsb2NrOjpNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKworTWVtb3J5QmxvY2s6On5NZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKworY29uc3QgdWludDhfdCogTWVtb3J5QmxvY2s6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsID8gbUltcGwtPmRhdGEoKSA6IG51bGxwdHI7Cit9CisKK3NpemVfdCBNZW1vcnlCbG9jazo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwgPyBtSW1wbC0+c2l6ZSgpIDogMDsKK30KKworTWVtb3J5QmxvY2sgTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIE1lbW9yeUJsb2NrUG9vbCgpLmZldGNoKHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY2Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9VVElMU19IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29udmVydHMgYW4gUkdCIHZpZXcgdG8gcGxhbmFyIFlVViA0MjAgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGRzdFkgICAgICAgcG9pbnRlciB0byBtZWRpYSBpbWFnZSBidWZmZXIKKyAqIFxwYXJhbSBkc3RTdHJpZGUgIHN0cmlkZSBpbiBieXRlcworICogXHBhcmFtIGRzdFZTdHJpZGUgdmVydGljYWwgc3RyaWRlIGluIHBpeGVscworICogXHBhcmFtIGJ1ZmZlclNpemUgbWVkaWEgaW1hZ2UgYnVmZmVyIHNpemUKKyAqIFxwYXJhbSBzcmMgc291cmNlIGltYWdlCisgKgorICogXHJldHZhbCBOT19NRU1PUlkgbWVkaWEgaW1hZ2UgaXMgdG9vIHNtYWxsCisgKiBccmV0dmFsIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgQ29udmVydFJHQlRvUGxhbmFyWVVWKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnNyYyk7CisKKy8qKgorICogUmV0dXJucyBhIHBsYW5hciBZVVYgNDIwIDgtYml0IG1lZGlhIGltYWdlIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtIHdpZHRoIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gc3RyaWRlIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSB2c3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqLworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSk7CisKKy8qKgorICogUmV0dXJucyBhIHNlbWlwbGFuYXIgWVVWIDQyMCA4LWJpdCBtZWRpYSBpbWFnZSBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSB3aWR0aCB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gdnN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKi8KK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFNlbWlQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKTsKKworLyoqCisgKiBDb3BpZXMgYSBncmFwaGljIHZpZXcgaW50byBhIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogQ29waWVzIGEgbWVkaWEgaW1hZ2UgaW50byBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIFlVViA0MjAgODg4IGxheW91dC4KKyAqLworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBBIHJhdyBtZW1vcnkgYmxvY2sgdG8gdXNlIGZvciBpbnRlcm5hbCBidWZmZXJzLgorICoKKyAqIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIEMyTGluZWFyQmxvY2tzIGZyb20gYSBwcml2YXRlIEMyQmxvY2tQb29sCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPHVpbnQ4X3Q+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGRhdGEoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBpbmxpbmUgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y29uc3QgTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZXMgYW4gdW5tYW5hZ2VkIGJsb2NrIChub3QgaW4gYSBwb29sKQorICAgIHN0YXRpYyBNZW1vcnlCbG9jayBBbGxvY2F0ZShzaXplX3QpOworCisgICAgLy8gbWVtb3J5IGJsb2NrIHdpdGggbm8gYWN0dWFsIG1lbW9yeSAoc2l6ZSBpcyAwLCBkYXRhIGlzIG51bGwpCisgICAgTWVtb3J5QmxvY2soKTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIE1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlCbG9jaygpOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSByYXcgbWVtb3J5IG1pbmktcG9vbC4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbCB7CisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJsb2NrIHdpdGggYSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgc2l6ZSBpbiBieXRlcworICAgICAqLworICAgIE1lbW9yeUJsb2NrIGZldGNoKHNpemVfdCBzaXplKTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCgpOworICAgIH5NZW1vcnlCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlMTdlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCkBAIC0wLDAgKzEsODE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyTWFwcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gIC8vIGZvciBJTlQzMl9NQVgKKworI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQWFjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsICAgICAgICAgQUFDT2JqZWN0TEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19NQUlOLCAgICAgICBBQUNPYmplY3RNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU1NSLCAgICAgICAgQUFDT2JqZWN0U1NSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTFRQLCAgICAgICAgQUFDT2JqZWN0TFRQIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsICAgICAgICAgQUFDT2JqZWN0SEUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSwgICBBQUNPYmplY3RTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX0xDLCAgICAgIEFBQ09iamVjdEVSTEMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwgQUFDT2JqZWN0RVJTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELCAgICAgICAgIEFBQ09iamVjdExEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsICAgICAgQUFDT2JqZWN0SEVfUFMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsICAgICAgICBBQUNPYmplY3RFTEQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUsICAgICAgICBBQUNPYmplY3RYSEUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsICAgIEFWQ0xldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xQiwgICBBVkNMZXZlbDFiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMSwgIEFWQ0xldmVsMTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCAgQVZDTGV2ZWwxMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzMsICBBVkNMZXZlbDEzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsICAgIEFWQ0xldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEsICBBVkNMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwgIEFWQ0xldmVsMjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMywgICAgQVZDTGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSwgIEFWQ0xldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLCAgQVZDTGV2ZWwzMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180LCAgICBBVkNMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCAgQVZDTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180XzIsICBBVkNMZXZlbDQyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsICAgIEFWQ0xldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzEsICBBVkNMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMiwgIEFWQ0xldmVsNTIgfSwKKworfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXZjUHJvZmlsZXMgPSB7CisgICAgLy8gdHJlYXQgcmVzdHJpY3RlZCBwcm9maWxlcyBhcyBmdWxsIHByb2ZpbGUgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudCAtIHdoaWNoIHdvcmtzIGZvcgorICAgIC8vIGRlY29kZXJzLCBidXQgbm90IGZvciBlbmNvZGVycworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICBBVkNQcm9maWxlRXh0ZW5kZWQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTAsICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQyMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90PiBzQml0cmF0ZU1vZGVzID0geworICAgIHsgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsICAgICAgQklUUkFURV9NT0RFX0NCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUsICAgQklUUkFURV9NT0RFX1ZCUiB9LAorICAgIHsgQzJDb25maWc6OkJJVFJBVEVfSUdOT1JFLCAgICAgQklUUkFURV9NT0RFX0NRIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcz4gc0NvbG9yTWF0cmljZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUNjAxLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDYwMV82IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfU01QVEUyNDBNLCAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeFNNUFRFMjQwTSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUMjAyMCwgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDIwMjAgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjBfQ09OU1RBTlQsIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwQ29uc3RhbnQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUiwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4T3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cHJpbWFyaWVzX3QsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzPiBzQ29sb3JQcmltYXJpZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDcwOSwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX00sICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNSwgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzYyNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzUyNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNHZW5lcmljRmlsbSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCwgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDIwMjAgfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX1JQNDMxLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0VHNDMyLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0VCVTMyMTMsICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cmFuZ2VfdCwgaW50MzJfdD4gc0NvbG9yUmFuZ2VzID0geworICAgIHsgQzJDb2xvcjo6UkFOR0VfRlVMTCwgICAgQ09MT1JfUkFOR0VfRlVMTCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQ09MT1JfUkFOR0VfTElNSVRFRCB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlPiBzQ29sb3JSYW5nZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0ZVTEwsICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9PVEhFUiwgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZU90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3Q+IHNDb2xvclRyYW5zZmVycyA9IHsKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUiwgQ09MT1JfVFJBTlNGRVJfTElORUFSIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNLCAgIENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0LCBDT0xPUl9UUkFOU0ZFUl9TVDIwODQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0hMRywgICAgQ09MT1JfVFJBTlNGRVJfSExHIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXI+IHNDb2xvclRyYW5zZmVyc1NmID0geworICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfTElORUFSLCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJMaW5lYXIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NSR0IsICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1JHQiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTSwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTE3ME0gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjIsICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyR2FtbWEyMiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyOCwgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTI4IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNUMjA4NCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfSExHLCAgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJITEcgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzI0ME0sICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUyNDBNIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9YVllDQywgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlclh2WUNDIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9CVDEzNjEsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckJUMTM2MSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1Q0MjgsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTVDQyOCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fSERfMzAsICBEb2xieVZpc2lvbkxldmVsSGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzI0LCBEb2xieVZpc2lvbkxldmVsRmhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzI0LCBEb2xieVZpc2lvbkxldmVsVWhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKKworICAgIC8vIGhpZ2ggdGllcnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIGFuZHJvaWQsIGZvciBub3cgbWFwIHRoZW0gdG8gbWFpbiB0aWVyCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8yNCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8zMCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzMwLCBEb2xieVZpc2lvbkxldmVsRmhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF82MCwgRG9sYnlWaXNpb25MZXZlbEZoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxVaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzRG9sYnlWaXNpb25Qcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWX1BFUiwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfUEVOLCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9ERVIsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RFTiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDQsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA1LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9EVEgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA3LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wOCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl8wOSwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzSDI2M0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLCBIMjYzTGV2ZWwxMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsIEgyNjNMZXZlbDIwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwgSDI2M0xldmVsMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLCBIMjYzTGV2ZWw0MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUsIEgyNjNMZXZlbDQ1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCwgSDI2M0xldmVsNTAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzYwLCBIMjYzTGV2ZWw2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNzAsIEgyNjNMZXZlbDcwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIMjYzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCAgICAgICAgICBIMjYzUHJvZmlsZUJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0gzMjAsICAgICAgICAgICAgICBIMjYzUHJvZmlsZUgzMjBDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgIEgyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyLCAgICAgICAgICAgICBIMjYzUHJvZmlsZUlTV1YyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YzLCAgICAgICAgICAgICBIMjYzUHJvZmlsZUlTV1YzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04sICBIMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgSDI2M1Byb2ZpbGVJbnRlcm5ldCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgSDI2M1Byb2ZpbGVJbnRlcmxhY2UgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgIEgyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNIZXZjTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLCAgICAgIEhFVkNNYWluVGllckxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgICAgIEhFVkNNYWluVGllckxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsICAgIEhFVkNNYWluVGllckxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgICAgICBIRVZDTWFpblRpZXJMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLCAgICBIRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCAgICAgIEhFVkNNYWluVGllckxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEsICAgIEhFVkNNYWluVGllckxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yLCAgICBIRVZDTWFpblRpZXJMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzYsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzIsICAgIEhFVkNNYWluVGllckxldmVsNjIgfSwKKworICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LCAgICAgIEhFVkNIaWdoVGllckxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEsICAgIEhFVkNIaWdoVGllckxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMiwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82LCAgICAgIEhFVkNIaWdoVGllckxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzEsICAgIEhFVkNIaWdoVGllckxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8yLCAgICBIRVZDSGlnaFRpZXJMZXZlbDYyIH0sCisKKyAgICAvLyBtYXAgaGlnaCB0aWVyIGxldmVscyBiZWxvdyA0IHRvIG1haW4gdGllcgorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLCAgICAgIEhFVkNIaWdoVGllckxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgICAgIEhFVkNIaWdoVGllckxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsICAgIEhFVkNIaWdoVGllckxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgICAgICBIRVZDSGlnaFRpZXJMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDMxIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEhFVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMLCBIRVZDUHJvZmlsZU1haW5TdGlsbCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnMkxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywgICAgICAgICBNUEVHMkxldmVsTEwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sICAgICAgICBNUEVHMkxldmVsTUwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICBNUEVHMkxldmVsSDE0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdILCAgICAgICAgTVBFRzJMZXZlbEhMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCwgICAgICAgTVBFRzJMZXZlbEhQIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNNcGVnMlByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU05SX1NDQUxBQkxFLCAgICAgICAgICBNUEVHMlByb2ZpbGVTTlIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICBNUEVHMlByb2ZpbGVTcGF0aWFsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZTQyMiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWc0TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMCwgICBNUEVHNExldmVsMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsICBNUEVHNExldmVsMGIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsICAgTVBFRzRMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzIsICAgTVBFRzRMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsICAgTVBFRzRMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLCAgTVBFRzRMZXZlbDNiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80LCAgIE1QRUc0TGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwgIE1QRUc0TGV2ZWw0YSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNSwgICBNUEVHNExldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNiwgICBNUEVHNExldmVsNiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzRQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUNvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZU5iaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQVJUUywgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgIE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UsICAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfQ09SRSwgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90PiBzUGNtRW5jb2RpbmdzID0geworICAgIHsgQzJDb25maWc6OlBDTV84LCBrQXVkaW9FbmNvZGluZ1BjbThiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMTYsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fRkxPQVQsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNWcDlMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzEsICAgIFZQOUxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xXzEsICBWUDlMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsICAgIFZQOUxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsICBWUDlMZXZlbDIxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzMsICAgIFZQOUxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEsICBWUDlMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzQsICAgIFZQOUxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80XzEsICBWUDlMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsICAgIFZQOUxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEsICBWUDlMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMiwgIFZQOUxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNiwgICAgVlA5TGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSwgIFZQOUxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8yLCAgVlA5TGV2ZWw2MiB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzVnA5UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwgVlA5UHJvZmlsZTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xLCBWUDlQcm9maWxlMSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTMgfSwKK307CisKKy8qKgorICogQSBoZWxwZXIgdGhhdCBwYXNzZXMgdGhyb3VnaCB2ZW5kb3IgZXh0ZW5zaW9uIHByb2ZpbGUgYW5kIGxldmVsIHZhbHVlcy4KKyAqLworc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciA6IEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSA9IDA7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGJvb2wgcGFzc1Rocm91Z2hNYXAoVCBmcm9tLCBVICp0bykgeworICAgICAgICAvLyBhbGxvdyAoYW5kIHBhc3MgdGhyb3VnaCkgdmVuZG9yIGV4dGVuc2lvbnMKKyAgICAgICAgaWYgKGZyb20gPj0gKFQpQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgJiYgZnJvbSA8IChUKUlOVDMyX01BWCkgeworICAgICAgICAgICAgKnRvID0gKFUpZnJvbTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaW1wbGVNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gQUFDIG9ubHkgdXNlcyBwcm9maWxlcywgbWFwIGFsbCBsZXZlbHMgdG8gdW51c2VkIG9yIDAKK3N0cnVjdCBBYWNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQWFjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgQXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXZjUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25MZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzRG9sYnlWaXNpb25Qcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworc3RydWN0IEgyNjNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNIMjYzUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSGV2Y1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBNcGVnMlByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTXBlZzRQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNExldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNFByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gVlA4IGhhcyBubyBwcm9maWxlcyBhbmQgbGV2ZWxzIGluIENvZGVjIDIuMCwgYnV0IHdlIHVzZSBtYWluIHByb2ZpbGUgYW5kIGxldmVsIDAgaW4gTWVkaWFDb2RlYworLy8gbWFwIGFsbCBwcm9maWxlcyBhbmQgbGV2ZWxzIHRvIHRoYXQuCitzdHJ1Y3QgVnA4UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhMZXZlbF9WZXJzaW9uMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IFZQOFByb2ZpbGVNYWluOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBWcDlQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNWcDlQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSkgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEFhY1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEgyNjNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUcyKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWcyUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPE1wZWc0UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDhQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIHJldHVybiBzQml0cmF0ZU1vZGVzLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90ICp0bykgeworICAgIHJldHVybiBzQml0cmF0ZU1vZGVzLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIHJldHVybiBzUGNtRW5jb2RpbmdzLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnBjbV9lbmNvZGluZ190ICp0bykgeworICAgIHJldHVybiBzUGNtRW5jb2RpbmdzLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnJhbmdlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclJhbmdlcy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2Ugc2ZSYW5nZTsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChmcm9tLCAmc2ZSYW5nZSkpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgIGlmIChmcm9tIDwgQzJDb2xvcjo6UkFOR0VfVkVORE9SX1NUQVJUIHx8IGZyb20gPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIHNmUmFuZ2UgPSBDb2xvckFzcGVjdHM6OlJhbmdlT3RoZXI7CisgICAgICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqdG8gPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yUmFuZ2Uoc2ZSYW5nZSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3QgZnJvbSwgQzJDb2xvcjo6cmFuZ2VfdCAqdG8pIHsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yUmFuZ2VzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZSBzZlJhbmdlOworICAgICAgICAodm9pZClDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JSYW5nZShmcm9tLCAmc2ZSYW5nZSk7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAoc2ZSYW5nZSwgdG8pKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICAqdG8gPSAoQzJDb2xvcjo6cmFuZ2VfdClzZlJhbmdlOworICAgICAgICAgICAgaWYgKCp0byA8IEMyQ29sb3I6OlJBTkdFX1ZFTkRPUl9TVEFSVCB8fCAqdG8gPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgICp0byA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpyYW5nZV90IGZyb20sIENvbG9yQXNwZWN0czo6UmFuZ2UgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclJhbmdlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6UmFuZ2UgZnJvbSwgQzJDb2xvcjo6cmFuZ2VfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzLCBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXgsIGludDMyX3QgKnN0YW5kYXJkKSB7CisgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgc2ZQcmltYXJpZXM7CisgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgc2ZNYXRyaXg7CisgICAgYm9vbCByZXMgPSB0cnVlOworCisgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICBpZiAoIXNDb2xvclByaW1hcmllc1NmLm1hcChwcmltYXJpZXMsICZzZlByaW1hcmllcykpIHsKKyAgICAgICAgLy8gZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UgYW5kIHVzZSBzdGF0aWMgY2FzdAorICAgICAgICBpZiAocHJpbWFyaWVzIDwgQzJDb2xvcjo6UFJJTUFSSUVTX1ZFTkRPUl9TVEFSVCB8fCBwcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBub24tZXh0ZW5zaW9uIHZhbHVlcyBtYXAgdG8gJ090aGVyJworICAgICAgICAgICAgc2ZQcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc090aGVyOworICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZlByaW1hcmllcyA9IChDb2xvckFzcGVjdHM6OlByaW1hcmllcylwcmltYXJpZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNDb2xvck1hdHJpY2VzU2YubWFwKG1hdHJpeCwgJnNmTWF0cml4KSkgeworICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgIGlmIChtYXRyaXggPCBDMkNvbG9yOjpNQVRSSVhfVkVORE9SX1NUQVJUIHx8IG1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG5vbi1leHRlbnNpb24gdmFsdWVzIG1hcCB0byAnT3RoZXInCisgICAgICAgICAgICBzZk1hdHJpeCA9IENvbG9yQXNwZWN0czo6TWF0cml4T3RoZXI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNmTWF0cml4ID0gKENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzKW1hdHJpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpzdGFuZGFyZCA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChzZlByaW1hcmllcywgc2ZNYXRyaXgpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBzdGFuZGFyZCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QgKnByaW1hcmllcywgQzJDb2xvcjo6bWF0cml4X3QgKm1hdHJpeCkgeworICAgIC8vIGZpcnN0IG1hcCB0byBzdGFnZWZyaWdodCBmb3VuZGF0aW9uIGFzcGVjdHMgPT4gdGhlc2UgYWN0dWFsbHkgbWFwIG5lYXJseSAxOjEgdG8KKyAgICAvLyBDb2RlYyAyLjAgYXNwZWN0cworICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIHNmUHJpbWFyaWVzOworICAgIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzIHNmTWF0cml4OworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICAodm9pZClDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChzdGFuZGFyZCwgJnNmUHJpbWFyaWVzLCAmc2ZNYXRyaXgpOworCisgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICBpZiAoIXNDb2xvclByaW1hcmllc1NmLm1hcChzZlByaW1hcmllcywgcHJpbWFyaWVzKSkgeworICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICpwcmltYXJpZXMgPSAoQzJDb2xvcjo6cHJpbWFyaWVzX3Qpc2ZQcmltYXJpZXM7CisgICAgICAgIGlmICgqcHJpbWFyaWVzIDwgQzJDb2xvcjo6UFJJTUFSSUVTX1ZFTkRPUl9TVEFSVCB8fCAqcHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAqcHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNDb2xvck1hdHJpY2VzU2YubWFwKHNmTWF0cml4LCBtYXRyaXgpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgKm1hdHJpeCA9IChDMkNvbG9yOjptYXRyaXhfdClzZk1hdHJpeDsKKyAgICAgICAgaWYgKCptYXRyaXggPCBDMkNvbG9yOjpNQVRSSVhfVkVORE9SX1NUQVJUIHx8ICptYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICptYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnByaW1hcmllc190IGZyb20sIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzICp0bykgeworICAgIHJldHVybiBzQ29sb3JQcmltYXJpZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6OlByaW1hcmllcyBmcm9tLCBDMkNvbG9yOjpwcmltYXJpZXNfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUHJpbWFyaWVzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6bWF0cml4X3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvck1hdHJpY2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgZnJvbSwgQzJDb2xvcjo6bWF0cml4X3QgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvck1hdHJpY2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6dHJhbnNmZXJfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciBzZlRyYW5zZmVyOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sICZzZlRyYW5zZmVyKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgaWYgKGZyb20gPCBDMkNvbG9yOjpUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgfHwgZnJvbSA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgc2ZUcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJPdGhlcjsKKyAgICAgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICp0byA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JUcmFuc2ZlcihzZlRyYW5zZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbG9yOjp0cmFuc2Zlcl90ICp0bykgeworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyIHNmVHJhbnNmZXI7CisgICAgICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclRyYW5zZmVyKGZyb20sICZzZlRyYW5zZmVyKTsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclRyYW5zZmVyc1NmLm1hcChzZlRyYW5zZmVyLCB0bykpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgICp0byA9IChDMkNvbG9yOjp0cmFuc2Zlcl90KXNmVHJhbnNmZXI7CisgICAgICAgICAgICBpZiAoKnRvIDwgQzJDb2xvcjo6VFJBTlNGRVJfVkVORE9SX1NUQVJUIHx8ICp0byA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgKnRvID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKAorICAgICAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlLCBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXMsCisgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeCwgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2ZlciwgdWludDMyX3QgKmRhdGFTcGFjZSkgeworI2lmIDAKKyAgICAvLyBwdXJlIHJlaW1wbGVtZW50YXRpb24KKyAgICAqZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOyAvLyB0aGlzIGlzIDAKKworICAgIHN3aXRjaCAocmFuZ2UpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpSQU5HRV9GVUxMOiAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfUkFOR0VfRlVMTDsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UkFOR0VfTElNSVRFRDogKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1JBTkdFX0xJTUlURUQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRyYW5zZmVyKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfTElORUFSOiAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0xJTkVBUjsgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX1NSR0I6ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TUkdCOyAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNOiAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU01QVEVfMTcwTTsgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyMjogKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0dBTU1BMl8yOyAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjg6ICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9HQU1NQTJfODsgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQ6ICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU1QyMDg0OyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfSExHOiAgICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0hMRzsgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHByaW1hcmllcykgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlBSSU1BUklFU19CVDYwMV81MjU6CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IChtYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX1NNUFRFMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV81MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNTI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfU01QVEUyNDBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSkKKyAgICAgICAgICAgICAgICAgICAgPyBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNjAxXzYyNV9VTkFESlVTVEVECisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwOgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSAobWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjBDT05TVEFOVAorICAgICAgICAgICAgICAgICAgICA/IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQyMDIwX0NPTlNUQU5UX0xVTUlOQU5DRQorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQyMDIwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlBSSU1BUklFU19CVDQ3MF9NOgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNDcwTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlBSSU1BUklFU19CVDcwOToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDcwOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisjZWxzZQorICAgIC8vIGZvciBub3cgdXNlIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbgorICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOworICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKHJhbmdlLCAmYXNwZWN0cy5tUmFuZ2UpKSB7CisgICAgICAgIGFzcGVjdHMubVJhbmdlID0gQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkOworICAgIH0KKyAgICBpZiAoIXNDb2xvclByaW1hcmllc1NmLm1hcChwcmltYXJpZXMsICZhc3BlY3RzLm1QcmltYXJpZXMpKSB7CisgICAgICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAobWF0cml4LCAmYXNwZWN0cy5tTWF0cml4Q29lZmZzKSkgeworICAgICAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIH0KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVyc1NmLm1hcCh0cmFuc2ZlciwgJmFzcGVjdHMubVRyYW5zZmVyKSkgeworICAgICAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZDsKKyAgICB9CisgICAgKmRhdGFTcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heUV4cGFuZCAqLyk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6dHJhbnNmZXJfdCBmcm9tLCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyICp0bykgeworICAgIHJldHVybiBzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6OlRyYW5zZmVyIGZyb20sIEMyQ29sb3I6OnRyYW5zZmVyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCB0byk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlYjkyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCisjZGVmaW5lIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXworCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGNsYXNzIHRvIG1hcCBDb2RlYyAyLjAgdmFsdWVzIHRvIGFuZHJvaWQgdmFsdWVzLgorICAgICAqLworICAgIHN0cnVjdCBDMk1hcHBlciB7CisgICAgICAgIHN0cnVjdCBQcm9maWxlTGV2ZWxNYXBwZXIgeworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoQzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKGludDMyX3QsIEMyQ29uZmlnOjpwcm9maWxlX3QqKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwTGV2ZWwoQzJDb25maWc6OmxldmVsX3QsIGludDMyX3QqKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwTGV2ZWwoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QqKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIH5Qcm9maWxlTGV2ZWxNYXBwZXIoKSA9IGRlZmF1bHQ7CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUpOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBiaXRyYXRlcworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QqKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gcGNtIGVuY29kaW5ncworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QqKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gcGljdHVyZSB0eXBlcworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QqKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gY29sb3IgYXNwZWN0cworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cmFuZ2VfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb2xvcjo6cmFuZ2VfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QsIEMyQ29sb3I6Om1hdHJpeF90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjpwcmltYXJpZXNfdCosIEMyQ29sb3I6Om1hdHJpeF90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjp0cmFuc2Zlcl90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjp0cmFuc2Zlcl90Kik7CisKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKAorICAgICAgICAgICAgICAgIEMyQ29sb3I6OnJhbmdlX3QsIEMyQ29sb3I6OnByaW1hcmllc190LCBDMkNvbG9yOjptYXRyaXhfdCwgQzJDb2xvcjo6dHJhbnNmZXJfdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGF0YVNwYWNlKTsKKworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cmFuZ2VfdCwgQ29sb3JBc3BlY3RzOjpSYW5nZSopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpSYW5nZSwgQzJDb2xvcjo6cmFuZ2VfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlByaW1hcmllcywgQzJDb2xvcjo6cHJpbWFyaWVzX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6Om1hdHJpeF90LCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMsIEMyQ29sb3I6Om1hdHJpeF90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjp0cmFuc2Zlcl90LCBDb2xvckFzcGVjdHM6OlRyYW5zZmVyKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlRyYW5zZmVyLCBDMkNvbG9yOjp0cmFuc2Zlcl90Kik7CisgICAgfTsKK30KKworI2VuZGlmICAvLyBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlNmUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzkgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjb2RlYzJfY29yZV9wYXJhbV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyUGFyYW1fdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgXSwKKworICAgIC8vIHBhcmFtIHRlc3RzIG11c3Qgbm90IGRlcGVuZCBvbiBhbnkgY29kZWMyIGxpYnJhcmllcyBhcyBhbGwgcGFyYW1zIHNob3VsZCBiZSB0ZW1wbGF0ZWQKKyAgICBzaGFyZWRfbGliczogWworICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjb2RlYzJfdm5ka190ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyX3Rlc3QuY3BwIiwKKyAgICAgICAgIkMyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwIiwKKyAgICAgICAgIkMyVXRpbFRlc3QuY3BwIiwKKyAgICAgICAgInZuZGsvQzJCdWZmZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJjb2RlYzJfdm5ka19pbnRlcmZhY2VfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA3OTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNzA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkMyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKyNpZiAhZGVmaW5lZChVTlVTRUQpCisjZGVmaW5lIFVOVVNFRChleHByKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICh2b2lkKShleHByKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNlbmRpZiAvLyFkZWZpbmVkKFVOVVNFRCkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RkOjp1bmlxdWVfcHRyPFQ+IGFsbG9jX3VuaXF1ZV9jc3RyKGNvbnN0IGNoYXIgKmNzdHIpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKGNzdHIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwdHIgPSBUOjpBbGxvY1VuaXF1ZShsZW4pOworICAgIG1lbWNweShwdHItPm0udmFsdWUsIGNzdHIsIGxlbik7CisgICAgcmV0dXJuIHB0cjsKK30KKworY2xhc3MgQzJDb21wSW50ZlRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICBDMkNvbXBJbnRmVGVzdCgpIHt9CisgICAgfkMyQ29tcEludGZUZXN0KCkgb3ZlcnJpZGUge30KKworICAgIHZvaWQgc2V0Q29tcG9uZW50KHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZikgeworICAgICAgICBtSW50ZiA9IGludGY7CisgICAgfQorCisgICAgdm9pZCByZXNldFJlc3VsdHMoKSB7CisgICAgICAgIG1JbnRmID0gbnVsbHB0cjsKKyAgICAgICAgbVBhcmFtUmVzdWx0cy5jbGVhcigpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHRlc3RVbnN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0U3VwcG9ydGVkUGFyYW0oKTsKKworICAgIC8vIHRlc3RSZWFkT25seVBhcmFtKCkgYW5kIHRlc3RXcml0YWJsZVBhcmFtKCkgYXJlIHRoZSBtYWluIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyBhIHBhcmFtZXRlci4KKyAgICAvLyBBIGNhbGxlciBzaG91bGQgZmluZCBvdXQgaWYgYSB0ZXN0ZWQgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBvciB3cml0YWJsZSBiZWZvcmUgY2FsbGluZyB0aGVtCisgICAgLy8gYW5kIGl0IG11c3QgY2FsbCBvbmUgb2YgdGhlIGNvcnJlc3BvbmRlZCB0aGVtLgorCisgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IHRoaXMgaXMgY2FsbGVkLgorICAgIC8vIFRlc3QgcmVhZC1vbmx5IHBhcmFtZXRlciB8cHJlUGFyYW18LiBUaGUgdGVzdCBleHBlY3RzIGZhaWx1cmUgd2hpbGUgY29uZmlnKCkgd2l0aCB8bmV3UGFyYW18LAorICAgIC8vIGFuZCBtYWtlIHN1cmUgfHByZVBhcmFtfCBzdGF5IHVuY2hhbmdlZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHRlc3RSZWFkT25seVBhcmFtKGNvbnN0IFQgJnByZVBhcmFtLCBjb25zdCBUICZuZXdQYXJhbSk7CisKKyAgICAvLyBJZiBhIHBhcmFtZXRlciBpcyB3cml0YWJsZSB0aGlzIGlzIGNhbGxlZC4KKyAgICAvLyBUZXN0IG9uZSBmaWxlZCB8d3JpdGFibGVGaWVsZHwgZm9yIGdpdmVuIHdyaXRhYmxlIHBhcmFtZXRlciB8cGFyYW18LgorICAgIC8vIHx2YWxpZFZhbHVlc3wgY29udGFpbnMgYWxsIHZhbHVlcyBvYnRhaW5lZCBmcm9tIHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKCkgZm9yIHx3cml0YWJsZUZpZWxkfC4KKyAgICAvLyBUaGUgdGVzdCBjaGVja3MgdmFsaWRpdHkgZm9yIGNvbmZpZygpIHdpdGggZWFjaCB2YWx1ZSwgYW5kIG1ha2Ugc3VyZSB2YWx1ZXMgYXJlIGNvbmZpZy1lZAorICAgIC8vIGJ5IHF1ZXJ5KCkgdGhlbSBvdXQuIHxpbnZhbGlkVmFsdWVzfCBjb250YWlucyBzb21lIHZhbHVlcyB3aGljaCBhcmUgbm90IGluIHx2YWxpZFZhbHVlc3wuCisgICAgLy8gVGhlIHRlc3QgZXhwZWN0cyBDMl9CQURfVkFMVUUgd2hpbGUgY29uZmlnKCkgd2l0aCB0aGVzZSB2YWx1ZXMsCisgICAgLy8gYW5kIHxwYXJhbXwgc2hvdWxkIHN0YXkgdW5jaGFuZ2VkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUUGFyYW0sIHR5cGVuYW1lIFRSZWFsRmllbGQsIHR5cGVuYW1lIFRGaWVsZD4KKyAgICB2b2lkIHRlc3RXcml0YWJsZVBhcmFtKFRQYXJhbSAqY29uc3QgcGFyYW0sIFRSZWFsRmllbGQgKmNvbnN0IHdyaXRhYmxlRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZ2YWxpZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJmludmFsaWRWYWx1ZXMpOworCisgICAgLy8gVGVzdCBhbGwgdGhlIGRlZmluZWQgcGFyYW1ldGVycyBpbiBDMlBhcmFtLmguCisgICAgdm9pZCB0ZXN0TWFpbihzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29tcG9uZW50TmFtZSk7CisKKyAgICAvLyBDaGVjayBwZXJtaXNzaW9uIG9mIHBhcmFtZXRlciB0eXBlIHxUfCBmb3IgdGVzdGluZyBpbnRlcmZhY2UuCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpcnN0IG9mIHRoZSB0ZXN0aW5nIHBlciBwYXJhbWV0ZXIgdHlwZSwKKyAgICAvLyB0aGVyZWZvcmUgZGlmZmVyZW50IHRlc3RpbmcgcHJvY2VzcyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgcGVybWlzc2lvbiB0eXBlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgY2hlY2tQYXJhbVBlcm1pc3Npb24oCisgICAgICAgICAgICBpbnQgKmNvbnN0IHdyaXRhYmxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnN1cHBvcnRlZFBhcmFtcyk7CisKK3ByaXZhdGU6CisgICAgZW51bSBQYXJhbVBlcm1pc3Npb24gOiBpbnQgeworICAgICAgICBXUklUQUJMRSwKKyAgICAgICAgUkVBRE9OTFksCisgICAgICAgIFVOU1VQUE9SVEVELAorICAgIH07CisKKyAgICBzdHJ1Y3QgcGFyYW1UZXN0SW5mbyB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIHBhcmFtVGVzdEluZm8oY29uc3QgY2hhciAqbmFtZV8sIGludCByZXN1bHRfKQorICAgICAgICAgICAgOiBuYW1lKG5hbWVfKSwgcmVzdWx0KHJlc3VsdF8pIHt9CisgICAgfTsKKworICAgIC8vIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeW9uSGVhcCgpIGJvdGggY2FsbCBhbiBpbnRlcmZhY2UncyBxdWVyeV92YigpIGFuZAorICAgIC8vIGNoZWNrIGlmIGEgY29tcG9uZW50IGhhcyBhIHBhcmFtZXRlciB3aG9zZSB0eXBlIGlzIHxUfC4KKyAgICAvLyBJZiBhIGNvbXBvbmVudCBoYXMsIHRoZSB2YWx1ZSBzaG91bGQgYmUgY29waWVkIGludG8gYW4gYXJndW1lbnQsIHRoYXQgaXMKKyAgICAvLyB8cHwgaW4gcXVlcnlPblN0YWNrKCkgYW5kIHxoZWFwUGFyYW1zfCBpbiBxdWVyeU9uSGVhcCgpLgorICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgYzJfc3RhdHVzX3QgKGUuZy4gQzJfT0spLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjMl9zdGF0dXNfdCBxdWVyeU9uU3RhY2soVCAqY29uc3QgcCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjMl9zdGF0dXNfdCBxdWVyeU9uSGVhcChjb25zdCBUICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpOworCisgICAgLy8gR2V0IGEgdmFsdWUgd2hvc2UgdHlwZSBpcyB8VHwgaW4gYSBjb21wb25lbnQuIFRoZSB2YWx1ZSBpcyBjb3BpZWQgdG8gfHBhcmFtfC4KKyAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiBhIGNvbXBvbmVudCBoYXMgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBnZXRWYWx1ZShUICpjb25zdCBwYXJhbSk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgaW4gY29tcG9uZW50IGlzIGVxdWFsIHRvIHxleHBlY3RlZHwgYW5kCisgICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5T25IZWFwKCkgYXJlIHN1Y2NlZWRlZC4gV2hlbiB0aGlzIGZ1bmN0aW9uIGNhbGxlZCwKKyAgICAvLyBpdCBzaG91bGQgYmUgZ3VhcmFudGVlZCBhIGNvbXBvbmVudCBoYXMgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVBhcmFtQXNFeHBlY3RlZChjb25zdCBUICZleHBlY3RlZCk7CisKKyAgICAvLyBUZXN0IGlmIHF1ZXJ5IGZ1bmN0aW9ucyB3b3JrcyBjb3JyZWN0bHkgZm9yIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIC8vICJTdXBwb3J0IiBtZWFucyBoZXJlIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5U3VwcG9ydGVkUGFyYW0oKTsKKworICAgIC8vIFRlc3QgcXVlcnkgZnVuY3Rpb25zIHdvcmtzIGNvcnJlY3RseSBmb3IgdW5zdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAvLyAiVW5zdXBwb3J0IiBtZWFucyBoZXJlIGEgY29tcG9uZW50IGRvZXNuJ3QgaGF2ZSB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5VW5zdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gRXhlY3V0ZSBhbiBpbnRlcmZhY2UncyBjb25maWdfdmIoKS4gfFR8IGlzIGEgc2luZ2xlIHBhcmFtZXRlciB0eXBlLCBub3Qgc3RkOjp2ZWN0b3IuCisgICAgLy8gY29uZmlnKCkgY3JlYXRlcyBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHtwfSBhbmQgcGFzc2VzIGl0IHRvIGNvbmZpZ192YigpLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGMyX3N0YXR1c190CisgICAgY29uZmlnKFQgKmNvbnN0IHAsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGZvciByZWFkLW9ubHkgcGFyYW1ldGVycy4KKyAgICAvLyBCZWNhdXNlIHRoZSBmYWlsdXJlIG9mIGNvbmZpZygpIGlzIGFzc3VtZWQsIHxuZXdQYXJhbXwgZG9lc24ndCBtYXR0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgY29uZmlnUmVhZE9ubHlQYXJhbShjb25zdCBUICZuZXdQYXJhbSk7CisKKyAgICAvLyBUZXN0IGlmIGNvbmZpZyB3b3JrcyBjb3JyZWN0bHkgZm9yIHdyaXRhYmxlIHBhcmFtZXRlcnMuCisgICAgLy8gVGhpcyBjaGFuZ2VzIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSB0byB8bmV3UGFyYW18LgorICAgIC8vIHxzdENvbmZpZ3wgaXMgYSByZXR1cm4gdmFsdWUgb2YgY29uZmlnKCkuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0sIGMyX3N0YXR1c190ICpzdENvbmZpZyk7CisKKyAgICAvLyBUZXN0IGlmIGNvbmZpZyB3b3JrcyBjb3JyZWN0bHkgaW4gdGhlIGNhc2UgYW4gaW52YWxpZCB2YWx1ZSB8bmV3UGFyYW18IGlzIHRyaWVkIHRvIHdyaXRlCisgICAgLy8gdG8gYW4gd3JpdGFibGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1dyaXRhYmxlUGFyYW1JbnZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gQ3JlYXRlIHZhbHVlcyBmb3IgdGVzdGluZyBmcm9tIHx2YWxpZFZhbHVlSW5mb3N8LiBUaGUgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyBhcmd1bWVudHMuCisgICAgLy8gfHZhbGlkVmFsdWVzfCA6IHZhbGlkIHZhbHVlcywgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgLy8gfEludmFsaWRWYWx1ZXN8IDogaW52YWxpZCB2YWx1ZXMsIHdoaWNoIGNhbm5vdCBiZSB3cml0dGVuIGZvciB0aGUgcGFyYW1ldGVyLgorICAgIC8vICAgICAgICAgICAgICAgICAgIGNvbmZpZygpIHNob3VsZCBiZSBmYWlsZWQgaWYgdGhlc2UgdmFsdWVzIGFyZSB1c2VkIGFzIG5ldyB2YWx1ZXMuCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZm9yIHdyaXRhYmxlIGFuZCBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZpZWxkPgorICAgIHZvaWQgZ2V0VGVzdFZhbHVlcyhjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWxpZFZhbHVlSW5mb3MsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IHZhbGlkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCBpbnZhbGlkVmFsdWVzKTsKKworICAgIC8vIE91dHB1dCB0aGUgc3VtbWFyeSBvZiB0ZXN0IHJlc3VsdHMuIENhdGVnb3JpemVzIHBhcmFtZXRlcnMgd2l0aCB0aGVpciBjb25maWd1cmF0aW9uLgorICAgIHZvaWQgb3V0cHV0UmVzdWx0cyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworICAgIHN0ZDo6dmVjdG9yPHBhcmFtVGVzdEluZm8+IG1QYXJhbVJlc3VsdHM7CisgICAgc3RkOjpzdHJpbmcgbUN1cnJlbnRQYXJhbU5hbWU7Cit9OworCisvLyBmYWN0b3J5IGZ1bmN0aW9uCisvLyBUT0RPKGhpcm9oKTogQWRkIGZhY3RvcnkgZnVuY3Rpb25zIGZvciBvdGhlciB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZVBhcmFtKCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPFQ+KCk7Cit9CisKK3RlbXBsYXRlIDw+IHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRNaW1lQ29uZmlnOjppbnB1dD4gbWFrZVBhcmFtKCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBTZXQgbW9yZSBwcmVjaXNlIGxlbmd0aC4KKyAgICByZXR1cm4gQzJQb3J0TWltZUNvbmZpZzo6aW5wdXQ6OkFsbG9jVW5pcXVlKDEwMCk7Cit9CisKKyNkZWZpbmUgVFJBQ0VEX0ZBSUxVUkUoZnVuYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNDT1BFRF9UUkFDRShtQ3VycmVudFBhcmFtTmFtZSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgZnVuYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgeyAgICAgICBcCisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKGZhbHNlKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5T25TdGFjayhUICpjb25zdCBwKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHN0YWNrUGFyYW1ze3B9OworICAgIHJldHVybiBtSW50Zi0+cXVlcnlfdmIoc3RhY2tQYXJhbXMsIHt9LCBDMl9ET05UX0JMT0NLLCBudWxscHRyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlPbkhlYXAoCisgICAgICAgIGNvbnN0IFQgJnAsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIHsKKyAgICB1aW50MzJfdCBpbmRleCA9IHAuaW5kZXgoKSAmIH4weDAzRkUwMDAwOworICAgIGlmIChwLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGluZGV4IHw9ICgocC5zdHJlYW0oKSA8PCAxNykgJiAweDAxRkUwMDAwKSB8IDB4MDIwMDAwMDA7CisgICAgfQorICAgIHJldHVybiBtSW50Zi0+cXVlcnlfdmIoe30sIHtpbmRleH0sIEMyX0RPTlRfQkxPQ0ssIGhlYXBQYXJhbXMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VmFsdWUoVCAqY29uc3QgcGFyYW0pIHsKKyAgICAvLyBXaGVuIGdldFZhbHVlKCkgaXMgY2FsbGVkLCBhIGNvbXBvbmVudCBoYXMgdG8gaGF2ZSB0aGUgcGFyYW1ldGVyLgorICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPblN0YWNrKHBhcmFtKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlQYXJhbUFzRXhwZWN0ZWQoY29uc3QgVCAmZXhwZWN0ZWQpIHsKKyAgICAvLyBUT0RPKGhpcm9oKTogRG9uJ3QgY3JlYXRlIHBhcmFtIG9uIHN0YWNrIGFuZCBjYWxsIHF1ZXJ5T25TdGFjayBmb3IgZmxleCBwYXJhbXMuCisgICAgLy8gTm90ZSB0aGF0IGFsbCB0aGUgY3VycmVudCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgbm9uLWZsZXggcGFyYW1zLgorICAgIFQgc3RhY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHBIZWFwID0gbWFrZVBhcmFtPFQ+KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBoZWFwUGFyYW1zOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBxdWVyeU9uU3RhY2soJnN0YWNrKSk7CisKKyAgICAvLyB8c3RhY2t8IGlzIGEgcGFyYW1ldGVyIHZhbHVlLiBUaGUgcGFyYW1ldGVyIHNpemUgc2hvdWxkbid0IGJlIDAuCisgICAgRVhQRUNUX05FKDB1LCBzdGFjay5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGFjaywgZXhwZWN0ZWQpOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBxdWVyeU9uSGVhcCgqcEhlYXAsICZoZWFwUGFyYW1zKSk7CisKKyAgICAvLyB8KmhlYXBQYXJhbXNbMF18IGlzIGEgcGFyYW1ldGVyIHZhbHVlLiBUaGUgc2l6ZSBvZiB8aGVhcFBhcmFtc3wgaGFzIHRvIGJlIG9uZS4KKyAgICBBU1NFUlRfRVEoMXUsIGhlYXBQYXJhbXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShoZWFwUGFyYW1zWzBdKTsKKyAgICBFWFBFQ1RfRVEoKmhlYXBQYXJhbXNbMF0sIGV4cGVjdGVkKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5U3VwcG9ydGVkUGFyYW0oKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHBhcmFtID0gbWFrZVBhcmFtPFQ+KCk7CisgICAgLy8gVGhlIGN1cnJlbnQgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgYWNxdWlyZWQgYnkgZ2V0VmFsdWUoKSwgd2hpY2ggc2hvdWxkIGJlIHN1Y2NlZWRlZC4KKyAgICBnZXRWYWx1ZShwYXJhbS5nZXQoKSk7CisgICAgcXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnBhcmFtKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5VW5zdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICAvLyBUT0RPKGhpcm9oKTogRG9uJ3QgY3JlYXRlIHBhcmFtIG9uIHN0YWNrIGFuZCBjYWxsIHF1ZXJ5T25TdGFjayBmb3IgZmxleCBwYXJhbXMuCisgICAgLy8gTm90ZSB0aGF0IGFsbCB0aGUgY3VycmVudCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcmUgbm9uLWZsZXggcGFyYW1zLgorICAgIFQgc3RhY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHBIZWFwID0gbWFrZVBhcmFtPFQ+KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBoZWFwUGFyYW1zOworICAgIC8vIElmIGEgY29tcG9uZW50IGRvZXNuJ3QgaGF2ZSB0aGUgcGFyYW1ldGVyLCBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlPbkhlYXAoKQorICAgIC8vIHNob3VsZCByZXR1cm4gQzJfQkFEX0lOREVYLgorICAgIEFTU0VSVF9FUShDMl9CQURfSU5ERVgsIHF1ZXJ5T25TdGFjaygmc3RhY2spKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhY2spOworICAgIEFTU0VSVF9FUShDMl9CQURfSU5ERVgsIHF1ZXJ5T25IZWFwKCpwSGVhcCwgJmhlYXBQYXJhbXMpKTsKKyAgICBFWFBFQ1RfRVEoMHUsIGhlYXBQYXJhbXMuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnKAorICAgICAgICBUICpjb25zdCBwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twfTsKKyAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssIGZhaWx1cmVzKTsKK30KKworLy8gQ3JlYXRlIGEgbmV3IHBhcmFtZXRlciBjb3BpZWQgZnJvbSB8cHwuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RkOjp1bmlxdWVfcHRyPFQ+IG1ha2VQYXJhbUZyb20oY29uc3QgVCAmcCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiByZXRQID0gbWFrZVBhcmFtPFQ+KCk7CisgICAgRVhQRUNUX1RSVUUocmV0UC0+dXBkYXRlRnJvbShwKSk7CisgICAgRVhQRUNUX1RSVUUobWVtY21wKHJldFAuZ2V0KCksICZwLCBzaXplb2YoVCkpID09IDApOworICAgIHJldHVybiByZXRQOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZ1JlYWRPbmx5UGFyYW0oY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisKKyAgICAvLyBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCBiZWNhdXNlIGEgcGFyYW1ldGVyIGlzIHJlYWQtb25seS4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CisgICAgQVNTRVJUX0VRKDF1LCBmYWlsdXJlcy5zaXplKCkpOworICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWSwgZmFpbHVyZXNbMF0tPmZhaWx1cmUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtLCBjMl9zdGF0dXNfdCAqY29uZmlnUmVzdWx0KSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIEluIG1vc3QgY2FzZXMsIGNvbmZpZ192YiByZXR1cm4gQzJfT0sgYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBzaG91bGQgYmUgY2hhbmdlZAorICAgIC8vIHRvIHxuZXdQYXJhbXwsIHdoaWNoIGlzIGNvbmZpcm1lZCBpbiBhIGNhbGxlciBvZiBjb25maWdXcml0YWJsZVBhcmFtVmFsdWVWYWx1ZSgpLgorICAgIC8vIEhvd2V2ZXIsIHRoaXMgY2FuIHJldHVybiB+fn5+IGFuZCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWVzIGlzIG5vdCBjaGFuZ2VkLAorICAgIC8vIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGRlcGVuZGVudCBsaW1pdGF0aW9ucyBiZXR3ZWVuIGZpZWxkcyBvciBiZXR3ZWVuIHBhcmFtZXRlcnMuCisgICAgLy8gVE9ETyhoaXJvaCk6IEkgaGF2ZSB0byBmaWxsIHRoZSByZXR1cm4gdmFsdWUuIENvbW1lbnRzIGluIEMyQ29tcG9uZW50LmggZG9lc24ndCBtZW50aW9uCisgICAgLy8gYWJvdXQgdGhlIHJldHVybiB2YWx1ZSB3aGVuIGNvbmZsaWN0IGhhcHBlbnMuIEkgc2V0IEMyX0JBRF9WQUxVRSB0byBpdCB0ZW1wb3JhcmlseSBub3cuCisgICAgYzJfc3RhdHVzX3Qgc3RDb25maWcgPSBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RDb25maWcgPT0gQzJfT0spIHsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmYWlsdXJlcy5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIHN0Q29uZmlnKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmYWlsdXJlcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVCwgZmFpbHVyZXNbMF0tPmZhaWx1cmUpOworICAgIH0KKyAgICAqY29uZmlnUmVzdWx0ID0gc3RDb25maWc7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBBbHRob3VnaCBhIHBhcmFtZXRlciBpcyB3cml0YWJsZSwgY29uZmlnX3ZiIHNob3VsZCBiZSBmYWlsZWQsCisgICAgLy8gYmVjYXVzZSBhIG5ldyB2YWx1ZSBpcyBpbnZhbGlkLgorICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFLCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7Cit9CisKKy8vIFRoZXJlIGlzIG9ubHkgdXNlZCBlbnVtIHR5cGUgZm9yIHRoZSBmaWVsZCB0eXBlLCB0aGF0IGlzIEMyRG9tYWluS2luZC4KKy8vIElmIGFub3RoZXIgZmllbGQgdHlwZSBpcyBhZGRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBmdW5jdGlvbiBmb3IgdGhhdC4KK3RlbXBsYXRlIDw+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRUZXN0VmFsdWVzKAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWxpZFZhbHVlSW5mb3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRG9tYWluS2luZD4gKmNvbnN0IHZhbGlkVmFsdWVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkRvbWFpbktpbmQ+ICpjb25zdCBpbnZhbGlkVmFsdWVzKSB7CisgICAgVU5VU0VEKHZhbGlkVmFsdWVJbmZvcyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkRvbWFpblZpZGVvKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyRG9tYWluQXVkaW8pOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJEb21haW5PdGhlcik7CisKKyAgICAvLyBUaGVyZSBpcyBubyBpbnZhbGlkIHZhbHVlLgorICAgIFVOVVNFRChpbnZhbGlkVmFsdWVzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRGaWVsZD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFRlc3RWYWx1ZXMoCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpIHsKKyAgICB1c2luZyBUU3RvcmFnZSA9IHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8VEZpZWxkPjo6dHlwZTsKKworICAgIC8vIFRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBDMlZhbHVlcy4gQzJWYWx1ZTo6UHJpbWl0aXZlIG5lZWRzIHRvCisgICAgLy8gYmUgdHJhbnNmb3JtZWQgdG8gYSBwcmltaXRpdmUgdmFsdWUuIFRoaXMgZnVuY3Rpb24gaXMgb25lIHRvIGRvIHRoYXQuCisgICAgYXV0byBwcmltMlZhbHVlID0gW10oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwcmltKSAtPiBURmllbGQgeworICAgICAgICByZXR1cm4gKFRGaWVsZClwcmltLnJlZjxUU3RvcmFnZT4oKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGludDMyX3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgdWludDMyX3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgaW50NjRfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCB1aW50NjRfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCBmbG9hdD46OnZhbHVlLCAiSW52YWxpZCBURmllbGQgdHlwZS4iKTsKKyAgICB9OworCisgICAgLy8gVGhlIHNpemUgb2YgdmFsaWRWYWx1ZUluZm9zIGlzIG9uZS4KKyAgICBjb25zdCBhdXRvICZjMkZTViA9IHZhbGlkVmFsdWVJbmZvczsKKworICAgIHN3aXRjaCAoYzJGU1YudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpFTVBUWTogeworICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKDApKTsKKyAgICAgICAgLy8gVE9ETyhoaXJvaCkgOiBTaG91bGQgb3RoZXIgaW52YWxpZCB2YWx1ZXMgYmUgdGVzdGVkPworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OlJBTkdFOiB7CisgICAgICAgIGNvbnN0IGF1dG8gJnJhbmdlID0gYzJGU1YucmFuZ2U7CisgICAgICAgIGF1dG8gcm1pbiA9IHByaW0yVmFsdWUocmFuZ2UubWluKTsKKyAgICAgICAgYXV0byBybWF4ID0gcHJpbTJWYWx1ZShyYW5nZS5tYXgpOworICAgICAgICBhdXRvIHJzdGVwID0gcHJpbTJWYWx1ZShyYW5nZS5zdGVwKTsKKworICAgICAgICBBU1NFUlRfTEUocm1pbiwgcm1heCk7CisKKyAgICAgICAgaWYgKHJzdGVwICE9IDApIHsKKyAgICAgICAgICAgIC8vIEluY3JlYXNlIGxpbmVhcgorICAgICAgICAgICAgZm9yIChhdXRvIHYgPSBybWluOyB2IDw9IHJtYXg7IHYgPSBURmllbGQodiArIHJzdGVwKSkgeworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2sodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm1pbiA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtaW4gLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm1heCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtYXggKyAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgTiA9IHZhbGlkVmFsdWVzLT5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+PSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6aXNfc2FtZTxURmllbGQsIGZsb2F0Pjo6dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgodmFsaWRWYWx1ZXMtPmF0KDApICsgdmFsaWRWYWx1ZXMtPmF0KDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgodmFsaWRWYWx1ZXMtPmF0KE4gLSAyKSArIHZhbGlkVmFsdWVzLT5hdChOIC0gMSkpIC8gMikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyc3RlcCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KDApICsgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIHR3byBjYXNlcywgZXhjZXB0IGxpbmVhciBjYXNlLgorICAgICAgICAgICAgLy8gMS4gaW50ZWdlciBnZW9tZXRyaWMgY2FzZQorICAgICAgICAgICAgLy8gMi4gZmxvYXQgZ2VvbWV0cmljIGNhc2UKKworICAgICAgICAgICAgYXV0byBudW0gPSBwcmltMlZhbHVlKHJhbmdlLm51bSk7CisgICAgICAgICAgICBhdXRvIGRlbm9tID0gcHJpbTJWYWx1ZShyYW5nZS5kZW5vbSk7CisKKyAgICAgICAgICAgIC8vIElmIGJvdGggcmFuZ2UubnVtIGFuZCByYW5nZS5kZW5vbSBhcmUgMSBhbmQgc3RlcCBpcyAwLCB3ZSBzaG91bGQgdXNlCisgICAgICAgICAgICAvLyBWQUxVRVMsIHNob3VsZG4ndCB3ZT8KKyAgICAgICAgICAgIEFTU0VSVF9GQUxTRShudW0gPT0gMSAmJiBkZW5vbSA9PSAxKTsKKworICAgICAgICAgICAgLy8gKG51bSAvIGRlbm9tKSBpcyBub3QgbGVzcyB0aGFuIDEuCisgICAgICAgICAgICBBU1NFUlRfRkFMU0UoZGVub20gPT0gMCk7CisgICAgICAgICAgICBBU1NFUlRfTEUoZGVub20sIG51bSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gdiA9IHJtaW47IHYgPD0gcm1heDsgdiA9IFRGaWVsZCh2ICogbnVtIC8gZGVub20pKSB7CisgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayh2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJtaW4gPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1pbigpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWluIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtYXggPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWF4ICsgMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgTiA9IHZhbGlkVmFsdWVzLT5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+PSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6aXNfc2FtZTxURmllbGQsIGZsb2F0Pjo6dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgodmFsaWRWYWx1ZXMtPmF0KDApICsgdmFsaWRWYWx1ZXMtPmF0KDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgodmFsaWRWYWx1ZXMtPmF0KE4gLSAyKSArIHZhbGlkVmFsdWVzLT5hdChOIC0gMSkpIC8gMikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFZhbHVlcy0+YXQoMSkgLSB2YWxpZFZhbHVlcy0+YXQoMCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdCgwKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIHZhbGlkVmFsdWVzLT5hdChOIC0gMikgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpWQUxVRVM6IHsKKyAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnByaW0gOiBjMkZTVi52YWx1ZXMpIHsKKyAgICAgICAgICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2socHJpbTJWYWx1ZShwcmltKSk7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBtaW52ID0gKnN0ZDo6bWluX2VsZW1lbnQodmFsaWRWYWx1ZXMtPmJlZ2luKCksIHZhbGlkVmFsdWVzLT5lbmQoKSk7CisgICAgICAgIGF1dG8gbWF4diA9ICpzdGQ6Om1heF9lbGVtZW50KHZhbGlkVmFsdWVzLT5iZWdpbigpLCB2YWxpZFZhbHVlcy0+ZW5kKCkpOworICAgICAgICBpZiAobWludiAtIDEgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1pbigpKSB7CisgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKG1pbnYgLSAxKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heHYgKyAxIDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChtYXh2ICsgMSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6RkxBR1M6IHsKKyAgICAgICAgLy8gVE9ETyhoaXJvaCkgOiBJbXBsZW1lbnQgdGhlIGNhc2UgdGhhdCBwYXJhbS50eXBlIGlzIEZMQUdTLgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RSZWFkT25seVBhcmFtKGNvbnN0IFQgJnByZVBhcmFtLCBjb25zdCBUICZuZXdQYXJhbSkgeworICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1JlYWRPbmx5UGFyYW0obmV3UGFyYW0pKTsKKyAgICAvLyBQYXJhbWV0ZXIgdmFsdWUgbXVzdCBub3QgYmUgY2hhbmdlZAorICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKHByZVBhcmFtKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUUGFyYW0sIHR5cGVuYW1lIFRSZWFsRmllbGQsIHR5cGVuYW1lIFRGaWVsZD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RXcml0YWJsZVBhcmFtKAorICAgICAgICBUUGFyYW0gKmNvbnN0IHBhcmFtLCBUUmVhbEZpZWxkICpjb25zdCB3cml0YWJsZUZpZWxkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZ2YWxpZFZhbHVlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmaW52YWxpZFZhbHVlcykgeworICAgIGMyX3N0YXR1c190IHN0Q29uZmlnOworCisgICAgLy8gR2V0IHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpbiB0aGUgYmVnaW5uaW5nIGluIG9yZGVyIHRvIHJlc2V0IHRoZSB2YWx1ZSBhdCB0aGUgZW5kLgorICAgIFRSQUNFRF9GQUlMVVJFKGdldFZhbHVlKHBhcmFtKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbT4gZGVmYXVsdFBhcmFtID0gbWFrZVBhcmFtRnJvbSgqcGFyYW0pOworCisgICAgLy8gVGVzdCB2YWxpZCB2YWx1ZXMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbCA6IHZhbGlkVmFsdWVzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IHByZVBhcmFtID0gbWFrZVBhcmFtRnJvbSgqcGFyYW0pOworCisgICAgICAgIC8vIFBhcmFtIGlzIHRyeSB0byBiZSBjaGFuZ2VkCisgICAgICAgICp3cml0YWJsZUZpZWxkID0gdmFsOworICAgICAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZSgqcGFyYW0sICZzdENvbmZpZykpOworICAgICAgICBpZiAoc3RDb25maWcgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwYXJhbSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUGFyYW0gaXMgdW5jaGFuZ2VkIGJlY2F1c2UgYSBmaWVsZCB2YWx1ZSBjb25mbGljdHMgd2l0aCBvdGhlciBmaWVsZCBvciBwYXJhbWV0ZXIuCisgICAgICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcHJlUGFyYW0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IHBhcmFtZXRlciBpbiBvcmRlciB0byB0ZXN0IHxwYXJhbXwgaXMgdW5jaGFuZ2VkCisgICAgLy8gYWZ0ZXIgdHJ5aW5nIHRvIHdyaXRlIGFuIGludmFsaWQgdmFsdWUuCisgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbT4gbGFzdFZhbGlkUGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAvLyBUZXN0IGludmFsaWQgdmFsdWVzCisgICAgZm9yIChjb25zdCBhdXRvICZ2YWwgOiBpbnZhbGlkVmFsdWVzKSB7CisgICAgICAgIC8vIFBhcmFtIGlzIGNoYW5nZWQKKyAgICAgICAgKndyaXRhYmxlRmllbGQgPSB2YWw7CisgICAgICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1dyaXRhYmxlUGFyYW1JbnZhbGlkVmFsdWUoKnBhcmFtKSk7CisgICAgICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpsYXN0VmFsaWRQYXJhbSkpOworICAgIH0KKyAgICAvLyBSZXNldCB0aGUgcGFyYW1ldGVyIGJ5IGNvbmZpZygpLgorICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKCpkZWZhdWx0UGFyYW0sICZzdENvbmZpZykpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFVuc3VwcG9ydGVkUGFyYW0oKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlVbnN1cHBvcnRlZFBhcmFtPFQ+KCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFN1cHBvcnRlZFBhcmFtKCkgeworICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5U3VwcG9ydGVkUGFyYW08VD4oKSk7Cit9CisKK2Jvb2wgaXNTdXBwb3J0ZWRQYXJhbSgKKyAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzUGFyYW1zKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZwZCA6IHNQYXJhbXMpIHsKKyAgICAgICAgaWYgKHBhcmFtLnR5cGUoKSA9PSBwZC0+aW5kZXgoKS50eXBlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpjaGVja1BhcmFtUGVybWlzc2lvbigKKyAgICBpbnQgKmNvbnN0IHJlc3VsdCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc3VwcG9ydGVkUGFyYW1zKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHBhcmFtID0gbWFrZVBhcmFtPFQ+KCk7CisKKyAgICBpZiAoIWlzU3VwcG9ydGVkUGFyYW0oKnBhcmFtLCBzdXBwb3J0ZWRQYXJhbXMpKSB7CisgICAgICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzbid0IHN1cHBvcnRlZCwgaXQganVzdCBmaW5pc2ggYWZ0ZXIgY2FsbGluZyB0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpLgorICAgICAgICB0ZXN0VW5zdXBwb3J0ZWRQYXJhbTxUPigpOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRlc3RTdXBwb3J0ZWRQYXJhbTxUPigpOworCisgICAgVFJBQ0VEX0ZBSUxVUkUoZ2V0VmFsdWUocGFyYW0uZ2V0KCkpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gQ29uZmlnIGRvZXMgbm90IGNoYW5nZSB0aGUgcGFyYW1ldGVyLCBiZWNhdXNlIHBhcmFtIGlzIHRoZSBwcmVzZW50IHBhcmFtLgorICAgIC8vIFRoaXMgY29uZmlnIGlzIGV4ZWN1dGVkIHRvIGZpbmQgb3V0IGlmIGEgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBvciB3cml0YWJsZS4KKyAgICBjMl9zdGF0dXNfdCBzdFN0YWNrID0gY29uZmlnKHBhcmFtLmdldCgpLCAmZmFpbHVyZXMpOworICAgIGlmIChzdFN0YWNrID09IEMyX0JBRF9WQUxVRSkgeworICAgICAgICAvLyBSZWFkLW9ubHkKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IG5ld1BhcmFtID0gbWFrZVBhcmFtPFQ+KCk7CisgICAgICAgIHRlc3RSZWFkT25seVBhcmFtKCpwYXJhbSwgKm5ld1BhcmFtKTsKKyAgICAgICAgKnJlc3VsdCA9IFBhcmFtUGVybWlzc2lvbjo6UkVBRE9OTFk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV3JpdGFibGUKKyAgICAgICAgRVhQRUNUX0VRKHN0U3RhY2ssIEMyX09LKTsKKyAgICAgICAgKnJlc3VsdCA9IFBhcmFtUGVybWlzc2lvbjo6V1JJVEFCTEU7CisgICAgfQorfQorCit2b2lkIEMyQ29tcEludGZUZXN0OjpvdXRwdXRSZXN1bHRzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcmFtc1szXTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnRlc3RJbmZvIDogbVBhcmFtUmVzdWx0cykgeworICAgICAgICBpbnQgcmVzdWx0ID0gdGVzdEluZm8ucmVzdWx0OworICAgICAgICBBU1NFUlRfVFJVRSgwIDw9IHJlc3VsdCAmJiByZXN1bHQgPD0gMik7CisgICAgICAgIHBhcmFtc1tyZXN1bHRdLmVtcGxhY2VfYmFjayh0ZXN0SW5mby5uYW1lKTsKKyAgICB9CisgICAgY29uc3QgY2hhciAqcmVzdWx0U3RyaW5nW10gPSB7IldyaXRhYmxlIiwgIlJlYWQtT25seSIsICJVbnN1cHBvcnRlZCJ9OworICAgIHByaW50ZigiXG4tLS0tVEVTVCBSRVNVTFRTICglcyktLS0tXG5cbiIsIG5hbWUuY19zdHIoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCJbICVzIF1cbiIsIHJlc3VsdFN0cmluZ1tpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmdCA6IHBhcmFtc1tpXSkgeworICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgdC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorfQorCisjZGVmaW5lIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCBmaWVsZF9uYW1lXykgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtXz4gcGFyYW0gPSBtYWtlUGFyYW08VFBhcmFtXz4oKTsgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHZhbGlkVmFsdWVJbmZvcyA9IHsgICAgXAorICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQocGFyYW0uZ2V0KCksICZmaWVsZF90eXBlX25hbWVfOjpmaWVsZF9uYW1lXykpIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192Yih2YWxpZFZhbHVlSW5mb3MsIEMyX0RPTlRfQkxPQ0spKTsgICAgIFwKKyAgICAgICAgQVNTRVJUX0VRKDF1LCB2YWxpZFZhbHVlSW5mb3Muc2l6ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZGVjbHR5cGUocGFyYW0tPmZpZWxkX25hbWVfKT4gdmFsaWRWYWx1ZXM7ICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZGVjbHR5cGUocGFyYW0tPmZpZWxkX25hbWVfKT4gaW52YWxpZFZhbHVlczsgICAgICAgIFwKKyAgICAgICAgZ2V0VGVzdFZhbHVlcyh2YWxpZFZhbHVlSW5mb3NbMF0udmFsdWVzLCAmdmFsaWRWYWx1ZXMsICZpbnZhbGlkVmFsdWVzKTsgICBcCisgICAgICAgIHRlc3RXcml0YWJsZVBhcmFtKHBhcmFtLmdldCgpLCAmcGFyYW0tPmZpZWxkX25hbWVfLCB2YWxpZFZhbHVlcyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgd2lkdGgpOyAgXAorICAgICAgICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgaGVpZ2h0KTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICAgICAgIFwKKyAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlKQorCisjZGVmaW5lIFRFU1RfRU5VTV9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgICAgICBcCisgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB2YWx1ZSkKKworLy8gVE9ETyhoaXJvaCk6IFN1cHBvcnQgcGFyYW1ldGVycyBiYXNlZCBvbiBjaGFyW10gYW5kIHVpbnQzMl90W10uCisvLyNkZWZpbmUgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykKKy8vIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCBtLnZhbHVlKQorLy8jZGVmaW5lIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQoVHBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykKKy8vIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUcGFyYW1fLCB1aW50MzJfdFtdLCBmaWVsZF90eXBlX25hbWVfLCB2YWx1ZXMpCisKKyNkZWZpbmUgRUFDSF9URVNUKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHRlc3RfbmFtZSkgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCByZXN1bHQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRoaXMtPm1DdXJyZW50UGFyYW1OYW1lID0gI1RQYXJhbV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNoZWNrUGFyYW1QZXJtaXNzaW9uPFRQYXJhbV8+KCZyZXN1bHQsIHN1cHBvcnRlZFBhcmFtcyk7ICAgICAgICAgIFwKKyAgICAgIGlmIChyZXN1bHQgPT0gUGFyYW1QZXJtaXNzaW9uOjpXUklUQUJMRSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB0ZXN0X25hbWUoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1QYXJhbVJlc3VsdHMuZW1wbGFjZV9iYWNrKCNUUGFyYW1fLCByZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRUFDSF9URVNUX1NFTEYodHlwZV8sIHRlc3RfbmFtZSkgRUFDSF9URVNUKHR5cGVfLCB0eXBlXywgdGVzdF9uYW1lKQorI2RlZmluZSBFQUNIX1RFU1RfSU5QVVQodHlwZV8sIHRlc3RfbmFtZSkgRUFDSF9URVNUKHR5cGVfOjppbnB1dCwgdHlwZV8sIHRlc3RfbmFtZSkKKyNkZWZpbmUgRUFDSF9URVNUX09VVFBVVCh0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV86Om91dHB1dCwgdHlwZV8sIHRlc3RfbmFtZSkKK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RNYWluKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb21wb25lbnROYW1lKSB7CisgICAgc2V0Q29tcG9uZW50KGludGYpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gc3VwcG9ydGVkUGFyYW1zOworICAgIEFTU0VSVF9FUShDMl9PSywgbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKCZzdXBwb3J0ZWRQYXJhbXMpKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50TGF0ZW5jeUluZm8sIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfU0VMRihDMkNvbXBvbmVudFRlbXBvcmFsSW5mbywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRMYXRlbmN5SW5mbywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0TGF0ZW5jeUluZm8sIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1Gb3JtYXRDb25maWcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyU3RyZWFtRm9ybWF0Q29uZmlnLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyUG9ydFN0cmVhbUNvdW50Q29uZmlnLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlBvcnRTdHJlYW1Db3VudENvbmZpZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnREb21haW5JbmZvLCBURVNUX0VOVU1fV1JJVEFCTEVfRklFTEQpOworCisgICAgLy8gVE9ETyhoaXJvaCk6IFN1cHBvcnQgcGFyYW1ldGVycyBiYXNlZCBvbiB1aW50MzJfdFtdIGFuZCBjaGFyW10uCisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyUG9ydE1pbWVDb25maWcsIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfT1VUUFVUKEMyUG9ydE1pbWVDb25maWcsIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlN0cmVhbU1pbWVDb25maWcsIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyU3VwcG9ydGVkUGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1aXJlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVhZE9ubHlQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlcXVlc3RlZEluZm9zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJWaWRlb1NpemVTdHJlYW1JbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyVmlkZW9TaXplU3RyZWFtSW5mbywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyVmlkZW9TaXplU3RyZWFtVHVuaW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJNYXhWaWRlb1NpemVIaW50UG9ydFNldHRpbmcsIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJNYXhWaWRlb1NpemVIaW50UG9ydFNldHRpbmcsIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworCisgICAgb3V0cHV0UmVzdWx0cyhjb21wb25lbnROYW1lKTsKKyAgICByZXNldFJlc3VsdHMoKTsKK30KKworVEVTVF9GKEMyQ29tcEludGZUZXN0LCBDMlY0TDJDb2RlY0ludGYpIHsKKworICAgIC8vIFJlYWQgYSBzaGFyZWQgb2JqZWN0IGxpYnJhcnkuCisgICAgdm9pZCogY29tcExpYiA9IGRsb3Blbigic3lzdGVtL2xpYi9saWJ2NGwyX2NvZGVjMi5zbyIsIFJUTERfTk9XKTsKKworICAgIGlmICghY29tcExpYikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuIGxpYnJhcnk6ICVzLlxuIiwgZGxlcnJvcigpKTsKKyAgICAgICAgRkFJTCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZWRlZiBDMkNvbXBvbmVudFN0b3JlKiBjcmVhdGVfdCgpOworICAgIGNyZWF0ZV90KiBjcmVhdGVfc3RvcmU9IChjcmVhdGVfdCopIGRsc3ltKGNvbXBMaWIsICJjcmVhdGVfc3RvcmUiKTsKKyAgICBjb25zdCBjaGFyKiBkbHN5bV9lcnJvciA9IGRsZXJyb3IoKTsKKyAgICBpZiAoZGxzeW1fZXJyb3IpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgbG9hZCBzeW1ib2wgY3JlYXRlOiAlcy5cbiIsIGRsc3ltX2Vycm9yKTsKKyAgICAgICAgRkFJTCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZWRlZiB2b2lkIGRlc3Ryb3lfdChDMkNvbXBvbmVudFN0b3JlKik7CisgICAgZGVzdHJveV90KiBkZXN0cm95X3N0b3JlID0gKGRlc3Ryb3lfdCopIGRsc3ltKGNvbXBMaWIsICJkZXN0cm95X3N0b3JlIik7CisgICAgZGxzeW1fZXJyb3IgPSBkbGVycm9yKCk7CisgICAgaWYgKGRsc3ltX2Vycm9yKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGxvYWQgc3ltYm9sIGRlc3Ryb3k6ICVzLlxuIiwgZGxzeW1fZXJyb3IpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmUoY3JlYXRlX3N0b3JlKCksIGRlc3Ryb3lfc3RvcmUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gY29tcG9uZW50SW50ZjsKKyAgICBjb21wb25lbnRTdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKCJ2NGwyLmRlY29kZXIiLCAmY29tcG9uZW50SW50Zik7CisgICAgYXV0byBjb21wb25lbnROYW1lID0gIkMyVjRMMkNvZGVjIjsKKyAgICB0ZXN0TWFpbihjb21wb25lbnRJbnRmLCBjb21wb25lbnROYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjRkNGQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKQEAgLTAsMCArMSwyNTE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyUGFyYW1fdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bGlzdD4KKwordm9pZCBQcmludFRvKGNvbnN0IF9DMkZpZWxkSWQgJmlkLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIkAiIDw8IGlkLl9tT2Zmc2V0IDw8ICIrIiA8PCBpZC5fbVNpemU7Cit9CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIDo6c3RkOjpvc3RyZWFtICpvcykgeworICAgIHVzaW5nIEZEPUMyRmllbGREZXNjcmlwdG9yOworICAgIHN3aXRjaCAoZmQudHlwZSgpKSB7CisgICAgY2FzZSBGRDo6SU5UMzI6ICpvcyA8PCAiaTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6SU5UNjQ6ICpvcyA8PCAiaTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDMyOiAqb3MgPDwgInUzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQ2NDogKm9zIDw8ICJ1NjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpGTE9BVDogKm9zIDw8ICJmbG9hdCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlNUUklORzogKm9zIDw8ICJjaGFyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6QkxPQjogKm9zIDw8ICJ1OCI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBGRDo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICpvcyA8PCAic3RydWN0LSIgPDwgKGZkLnR5cGUoKSAmIH5GRDo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm9zIDw8ICJ0eXBlLSIgPDwgZmQudHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgICpvcyA8PCAiICIgPDwgZmQubmFtZSgpOworICAgIGlmIChmZC5leHRlbnQoKSA+IDEpIHsKKyAgICAgICAgKm9zIDw8ICJbIiA8PCBmZC5leHRlbnQoKSA8PCAiXSI7CisgICAgfSBlbHNlIGlmIChmZC5leHRlbnQoKSA9PSAwKSB7CisgICAgICAgICpvcyA8PCAiW10iOworICAgIH0KKyAgICAqb3MgPDwgIiAoIjsKKyAgICBQcmludFRvKGZkLl9tRmllbGRJZCwgb3MpOworICAgICpvcyA8PCAiKiIgPDwgZmQuZXh0ZW50KCkgPDwgIikiOworfQorCitlbnVtIEMyUGFyYW1JbmRleFR5cGUgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIGtQYXJhbUluZGV4TnVtYmVyLAorICAgIGtQYXJhbUluZGV4TnVtYmVycywKKyAgICBrUGFyYW1JbmRleE51bWJlcjIsCisgICAga1BhcmFtSW5kZXhWZW5kb3JTdGFydCA9IEMyUGFyYW06OlRZUEVfSU5ERVhfVkVORE9SX1NUQVJULAorICAgIGtQYXJhbUluZGV4VmVuZG9yTnVtYmVycywKK307CisKK3ZvaWQgZmZmZihpbnQoKikoaW50KSkge30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RSVUNUIERFQ0xBUkFUSU9OIEFORCBERVNDUklQVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yIEZEOworCitjbGFzcyBDMlBhcmFtVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKworY2xhc3MgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QKKyAgICAgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4geworfTsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhTaXplLAorICAgIGtQYXJhbUluZGV4VGVzdEEsCisgICAga1BhcmFtSW5kZXhUZXN0QiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4UzMyLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTMzIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFM2NCwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kUzY0LAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTaXplLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplLAorfTsKKworc3RydWN0IEMyU2l6ZVN0cnVjdCB7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhTaXplIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgorICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsgIC8vIDw9IG5lZWRlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IKKyAgICBjb25zdCBzdGF0aWMgRkQ6OnR5cGVfdCBUWVBFID0gKEZEOjp0eXBlX3QpKENPUkVfSU5ERVggfCBGRDo6U1RSVUNUX0ZMQUcpOworfTsKKworREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoQzJTaXplU3RydWN0KQorCisvLyBUZXN0IDEuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRob3V0IGFueSBoZWxwZXIgbWV0aG9kcworCitib29sIG9wZXJhdG9yPT0oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmEsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZiKSB7CisgICAgcmV0dXJuIGEudHlwZSgpID09IGIudHlwZSgpCisgICAgICAgICAgICAmJiBhLmV4dGVudCgpID09IGIuZXh0ZW50KCkKKyAgICAgICAgICAgICYmIGEubmFtZSgpID09IGIubmFtZSgpCisgICAgICAgICAgICAmJiBhLl9tRmllbGRJZCA9PSBiLl9tRmllbGRJZDsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9BIHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3QgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9BIF90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVCA9CisgICAgeyB7IEZEOjpJTlQzMiwgICAgMSwgInMzMiIsICAgMCwgNCB9LAorICAgICAgeyBGRDo6SU5UNjQsICAgIDIsICJzNjQiLCAgIDQsIDggfSwKKyAgICAgIHsgRkQ6OlVJTlQzMiwgICAxLCAidTMyIiwgIDIwLCA0IH0sCisgICAgICB7IEZEOjpVSU5UNjQsICAgMSwgInU2NCIsICAyNCwgOCB9LAorICAgICAgeyBGRDo6RkxPQVQsICAgIDEsICJmcCIsICAgMzIsIDQgfSwKKyAgICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAzLCAic2l6ZSIsIDM2LCA4IH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgImJsb2IiLCA2MCwgMSB9LAorICAgICAgeyBGRDo6U1RSSU5HLCAxMDAsICJzdHIiLCAxNjAsIDEgfSwKKyAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAieS1uIiwgMjYwLCAxIH0gfTsKKworVEVTVF9QKEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gR2V0UGFyYW0oKSwgZXhwZWN0ZWQgPSBDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1Q7CisKKyAgICAvLyB2ZXJpZnkgZmlyc3QgZmllbGQgZGVzY3JpcHRvcgorICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkc1swXS50eXBlKCkpOworICAgIEVYUEVDVF9TVFJFUSgiczMyIiwgZmllbGRzWzBdLm5hbWUoKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkc1swXS5leHRlbnQoKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIGZpZWxkc1swXS5fbUZpZWxkSWQpOworCisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzBdLCBmaWVsZHNbMF0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFsxXSwgZmllbGRzWzFdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMl0sIGZpZWxkc1syXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzNdLCBmaWVsZHNbM10pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs0XSwgZmllbGRzWzRdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNV0sIGZpZWxkc1s1XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzZdLCBmaWVsZHNbNl0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs3XSwgZmllbGRzWzddKTsKKyAgICBmb3IgKHNpemVfdCBpID0gODsgaSA8IGZpZWxkcy5zaXplKCkgJiYgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZmllbGRzW2ldKTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEluaXRpYWxpemVyTGlzdCwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVCkpOworCisvLyBkZWZpbmUgZmllbGRzIHVzaW5nIEMyRmllbGREZXNjcmlwdG9yIHBvaW50ZXIgY29uc3RydWN0b3IKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQV9GRF9QVFJfZmllbGRMaXN0ID0KKyAgICB7IEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zaWduZWQzMiwgICAiczMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c2lnbmVkNjQsICAgInM2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnVuc2lnbmVkMzIsICJ1MzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT51bnNpZ25lZDY0LCAidTY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+ZnAzMiwgICAgICAiZnAiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zeiwgICAgICAgInNpemUiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5ibG9iLCAgICAgICAiYmxvYiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnN0cmluZywgICAgICJzdHIiKSwKKyAgICAvLyAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnllc05vLCAgICAgICJ5LW4iKQorICAgIH07CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFBvaW50ZXJDb25zdHJ1Y3RvciwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QpKTsKKworLy8gZGVmaW5lIGZpZWxkcyB1c2luZyBDMkZpZWxkRGVzY3JpcHRvciBtZW1iZXItcG9pbnRlciBjb25zdHJ1Y3RvcgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX01FTV9QVFJfZmllbGRMaXN0ID0KKyAgICB7IEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMiwgICAiczMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQsICAgInM2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIsICJ1MzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0LCAidTY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMiwgICAgICAiZnAiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzeiwgICAgICAgInNpemUiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iLCAgICAgICAiYmxvYiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN0cmluZywgICAgICJzdHIiKSwKKyAgICAvLyAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Onllc05vLCAgICAgICJ5LW4iKQorICAgIH07CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE1lbWJlclBvaW50ZXJDb25zdHJ1Y3RvciwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdFN0cnVjdF9BX0ZEX01FTV9QVFJfZmllbGRMaXN0KSk7CisKKy8vIFRlc3QgMi4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGggdHdvLXN0ZXAgaGVscGVyIG1ldGhvZHMKKworc3RydWN0IEMyVGVzdEFTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgREVGSU5FX0MyU1RSVUNUKFRlc3RBKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0QSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQoc2lnbmVkNjQsICJzNjQiKQorICAgIEMyRklFTEQodW5zaWduZWQzMiwgInUzMiIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDY0LCAidTY0IikKKyAgICBDMkZJRUxEKGZwMzIsICJmcCIpCisgICAgQzJGSUVMRChzeiwgInNpemUiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoc3RyaW5nLCAic3RyIikKKyAgICAvLyBDMkZJRUxEKHllc05vLCAieS1uIikKK30pIC8vIDsgb3B0aW9uYWwKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRGVzY3JpYmVTdHJ1Y3QyU3RlcCwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdEFTdHJ1Y3Q6OkZpZWxkTGlzdCgpKSk7CisKKy8vIFRlc3QgMy4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGggb25lLXN0ZXAgaGVscGVyIG1ldGhvZAorCitzdHJ1Y3QgQzJUZXN0QlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RCKQorCisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChzaWduZWQ2NCwgInM2NCIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDMyLCAidTMyIikKKyAgICBDMkZJRUxEKHVuc2lnbmVkNjQsICJ1NjQiKQorICAgIEMyRklFTEQoZnAzMiwgImZwIikKKyAgICBDMkZJRUxEKHN6LCAic2l6ZSIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChzdHJpbmcsICJzdHIiKQorICAgIC8vIEMyRklFTEQoeWVzTm8sICJ5LW4iKQorfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRGVzY3JpYmVTdHJ1Y3QxU3RlcCwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdEJTdHJ1Y3Q6OkZpZWxkTGlzdCgpKSk7CisKKy8vIFRlc3QgNC4gZmxleGlibGUgbWVtYmVycworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisgICAgdXNpbmcgdHlwZV90PUZEOjp0eXBlX3Q7CisKKyAgICAvLyBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisgICAgICAgICAgICBHZXRMaXN0cygpOworCisgICAgY29uc3RleHByIHN0YXRpYyB0eXBlX3QgRmxleFR5cGUgPQorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGludDMyX3Q+Ojp2YWx1ZSA/IEZEOjpJTlQzMiA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgaW50NjRfdD46OnZhbHVlID8gRkQ6OklOVDY0IDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50MzJfdD46OnZhbHVlID8gRkQ6OlVJTlQzMiA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDY0X3Q+Ojp2YWx1ZSA/IEZEOjpVSU5UNjQgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGZsb2F0Pjo6dmFsdWUgPyBGRDo6RkxPQVQgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSA/IEZEOjpCTE9CIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUgPyBGRDo6U1RSSU5HIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBDMlNpemVTdHJ1Y3Q+Ojp2YWx1ZSA/IEMyU2l6ZVN0cnVjdDo6VFlQRSA6ICh0eXBlX3QpMDsKKyAgICBjb25zdGV4cHIgc3RhdGljIHNpemVfdCBGTEVYX1NJWkUgPSBzaXplb2YoVCk7Cit9OworCit0eXBlZGVmIDo6dGVzdGluZzo6VHlwZXM8aW50MzJfdCwgaW50NjRfdCwgQzJTaXplU3RydWN0PiBGbGV4VHlwZXM7CitUWVBFRF9URVNUX0NBU0UoQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0LCBGbGV4VHlwZXMpOworCitUWVBFRF9URVNUKEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7CisgICAgZm9yIChhdXRvIGEgOiB0aGlzLT5HZXRMaXN0cygpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBhOworICAgICAgICBpZiAoZmllbGRzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IoRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCksIGZpZWxkc1swXSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+RmxleFR5cGUsIDAsICJmbGV4IiwgNCwgdGhpcy0+RkxFWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbMV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCAwLCB0aGlzLT5GTEVYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1swXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleFMzMiB7CisgICAgaW50MzJfdCBtRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4LCBGTEVYX1NJWkUgPSA0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFMzMiBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDMyX3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTMzI6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTMzI6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAwLCAiZmxleCIsIDAsIDQgfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyIHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDMyX3QgbUZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleEVuZCwgRkxFWF9TSVpFID0gNCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQzMl90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEZEOjpJTlQzMiwgMCwgImZsZXgiLCA0LCA0IH0sCit9OworCitjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyX3B0cl9maWVsZExpc3QgPSB7CisgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIqKTApLT5zaWduZWQzMiwgInMzMiIpLAorICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyKikwKS0+bUZsZXgsICJmbGV4IiksCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFMzMlN0cnVjdCB7CisgICAgaW50MzJfdCBtRmxleFNpZ25lZDMyW107Citwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIEMyVGVzdEZsZXhTMzJTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzMyLCBtRmxleFNpZ25lZDMyKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQzMiwgImZsZXgiKQorfTsKKworc3RydWN0IEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50MzJfdCBtRmxleFNpZ25lZDMyW107Citwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTMzIsIG1GbGV4U2lnbmVkMzIpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzMyLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDMyLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3RlbXBsYXRlPD4KK3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKy8vc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PGludDMyX3Q+OjpHZXRMaXN0cygpIHsKKyAgICByZXR1cm4geworICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCwKKyAgICAgICAgQzJUZXN0RmxleFMzMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgIH07Cit9CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleFM2NCB7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhTNjQsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4UzY0IF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50NjRfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFM2NDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFM2NDo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgMCwgOCB9Cit9OworCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBtU2lnbmVkNjRGbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0LCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDY0X3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDQsIDggfSwKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4UzY0U3RydWN0IHsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKyAgICBDMlRlc3RGbGV4UzY0U3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFM2NCwgbUZsZXhTaWduZWQ2NCkKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kUzY0U3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworICAgIEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTNjQsIG1GbGV4U2lnbmVkNjQpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzY0LCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDY0LCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3RlbXBsYXRlPD4KK3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKy8vc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PGludDY0X3Q+OjpHZXRMaXN0cygpIHsKKyAgICByZXR1cm4geworICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFM2NDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleFM2NFN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgIH07Cit9CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleFNpemUgeworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTaXplOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMCwgImZsZXgiLCAwLCBzaXplb2YoQzJTaXplU3RydWN0KSB9Cit9OworCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplIHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtU2l6ZUZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplLCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBDMlNpemVTdHJ1Y3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDAsICJmbGV4IiwgNCwgc2l6ZW9mKEMyU2l6ZVN0cnVjdCkgfSwKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4U2l6ZVN0cnVjdCB7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEZsZXhTaXplU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFNpemUsIG1GbGV4U2l6ZSkKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfTsKKworc3RydWN0IEMyVGVzdEZsZXhFbmRTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFNpemUsIG1GbGV4U2l6ZSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTaXplLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKworc3RydWN0IEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KCkge30KKworICAgIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QoVGVzdEJhc2VGbGV4RW5kU2l6ZSwgbUZsZXhTaXplKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKworc3RydWN0IEMyVGVzdEJhc2VGbGV4RW5kU2l6ZTJTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZTJTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0ZMRVhfQzJTVFJVQ1QoVGVzdEJhc2VGbGV4RW5kU2l6ZTIsIG1GbGV4U2l6ZSkKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfTsKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8QzJTaXplU3RydWN0Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTaXplOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZTJTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgIH07Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgRmllbGRJZCkgeworICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTApLT5tRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIGNvbnN0cnVjdG9yCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgLy8gbWVtYmVyIHBvaW50ZXIgc2FucyB0eXBlIHBvaW50ZXIKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0PiBDMlRlc3RGbGV4RW5kU2l6ZUluZm87CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0LCBrUGFyYW1JbmRleFRlc3RGbGV4RW5kU2l6ZT4gQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U7CisKKyAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yIGluIEMyUGFyYW0KKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0NCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0ubUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSopMCktPm0uc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UqKTApLT5tLm1GbGV4U2l6ZSkpOworCisgICAgLy8gbWVtYmVyIHBvaW50ZXIgaW4gQzJQYXJhbQorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0NCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6eWVzTm8pKTsKKworICAgIC8vIE5PVEU6IGNhbm5vdCB1c2UgYSBtZW1iZXIgcG9pbnRlciBmb3IgZmxleCBwYXJhbXMgZHVlIHRvIGludHJvZHVjdGlvbiBvZiAnbScKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvOjptLnNpZ25lZDMyKSk7CisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0ubUZsZXhTaXplKSk7CisKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U6Om0uc2lnbmVkMzIpKTsKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOjptLm1GbGV4U2l6ZSkpOworCisKK30KKworc3RydWN0IFMzMiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIFMzMihjb25zdCBUKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgYW4gYXJyYXkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8QiwgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRkxYIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgRkxYKGNvbnN0IFQqLCBjb25zdCBVKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCAic2hvdWxkIGJlIGFuIGFycmF5Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjpleHRlbnQ8VD46OnZhbHVlID09IDAsICJzaG91bGQgYmUgYW4gYXJyYXkgb2YgMCBleHRlbnQiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8QiwgVT46OnZhbHVlLCAic2hvdWxkIGJlIHR5cGUgVSIpOworICAgIH0KK307CisKK3N0cnVjdCBNUCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRXhwZWN0ZWRVLCB0eXBlbmFtZSBVbmV4cGVjdGVkVT4KKyAgICBpbmxpbmUgTVAoVCBVOjoqLCBjb25zdCBFeHBlY3RlZFUqLCBjb25zdCBVbmV4cGVjdGVkVSopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFUsIFVuZXhwZWN0ZWRVPjo6dmFsdWUsICJzaG91bGQgbm90IGJlIG1lbWJlciBwb2ludGVyIG9mIHRoZSBiYXNlIHR5cGUiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VSwgRXhwZWN0ZWRVPjo6dmFsdWUsICJzaG91bGQgYmUgbWVtYmVyIHBvaW50ZXIgb2YgdGhlIGRlcml2ZWQgdHlwZSIpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEIsIHR5cGVuYW1lIEQ+CisgICAgaW5saW5lIE1QKFQgRDo6KiwgY29uc3QgRCopIHsgfQorfTsKKwordm9pZCBjb21waWxlZFN0YXRpY19hcnJheVR5cGVQcm9wYWdhdGlvblRlc3QoKSB7CisgICAgKHZvaWQpUzMyKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+c2lnbmVkMzIpOworICAgICh2b2lkKUZMWCgmKChDMlRlc3RGbGV4RW5kUzMyU3RydWN0ICopMCktPm1GbGV4U2lnbmVkMzIsIChpbnQzMl90KikwKTsKKyAgICAodm9pZClGTFgoJigoQzJUZXN0RmxleFMzMlN0cnVjdCAqKTApLT5tRmxleFNpZ25lZDMyLCAoaW50MzJfdCopMCk7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKworICAgIC8vIFRSSUNLWTogJmRlcml2ZWRDbGFzczo6YmFzZU1lbWJlciBoYXMgdHlwZSBvZiBiYXNlQ2xhc3M6OioKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSgmQzJUZXN0QUluZm86OnNpZ25lZDMyKSwgaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiYmFzZSBtZW1iZXIgcG9pbnRlciBzaG91bGQgaGF2ZSBiYXNlIGNsYXNzIGluIHR5cGUiKTsKKworICAgIC8vIHRoZXJlZm9yZSwgbWVtYmVyIHBvaW50ZXIgZXhwYW5kcyB0byBiYXNlQ2xhc3M6OiogaW4gdGVtcGxhdGVzCisgICAgKHZvaWQpTVAoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwKKyAgICAgICAgICAgICAoQzJUZXN0QVN0cnVjdCopMCAvKiBleHBlY3RlZCAqLywgKEMyVGVzdEFJbmZvKikwIC8qIHVuZXhwZWN0ZWQgKi8pOworICAgIC8vIGJ1dCBjYW4gYmUgY2FzdCB0byBkZXJpdmVkQ2xhc3M6OioKKyAgICAodm9pZClNUCgoaW50MzJfdCBDMlRlc3RBSW5mbzo6KikmQzJUZXN0QUluZm86OnNpZ25lZDMyLAorICAgICAgICAgICAgIChDMlRlc3RBSW5mbyopMCAvKiBleHBlY3RlZCAqLywgKEMyVGVzdEFTdHJ1Y3QqKTAgLyogdW5leHBlY3RlZCAqLyk7CisKKyAgICAvLyBUUklDS1k6IGJhc2VDbGFzczo6KiBkb2VzIG5vdCBhdXRvY29udmVydCB0byBkZXJpdmVkQ2xhc3M6OiogZXZlbiBpbiB0ZW1wbGF0ZXMKKyAgICAvLyAodm9pZClNUCgmQzJUZXN0QUluZm86OnNpZ25lZDMyLCAoQzJUZXN0QUluZm8qKTApOworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIE1lbWJlclBvaW50ZXJDYXN0KSB7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEFJbmZvLCBzaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6OiogczMycHRyID0gJkMyVGVzdEFJbmZvOjpzaWduZWQzMjsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBSW5mbzo6KiBzMzJwdHJfZGVyaXZlZCA9IChpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6OiopJkMyVGVzdEFJbmZvOjpzaWduZWQzMjsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBSW5mbzo6KiBzMzJwdHJfY2FzdDJkZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QUluZm86OiopczMycHRyOworICAgIEMyVGVzdEFJbmZvICppbmZvID0gKEMyVGVzdEFJbmZvICopMjU2OworICAgIEMyVGVzdEFTdHJ1Y3QgKnN0cnVrdCA9IChDMlRlc3RBU3RydWN0ICopaW5mbzsKKyAgICBpbnQzMl90ICppbmZvX3MzMl9kZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Rlcml2ZWQpOworICAgIGludDMyX3QgKmluZm9fczMyX2Nhc3QyZGVyaXZlZCA9ICYoaW5mby0+KnMzMnB0cl9jYXN0MmRlcml2ZWQpOworICAgIGludDMyX3QgKmluZm9fczMyID0gJihpbmZvLT4qczMycHRyKTsKKyAgICBpbnQzMl90ICpzdHJ1a3RfczMyID0gJihzdHJ1a3QtPipzMzJwdHIpOworCisgICAgRVhQRUNUX0VRKDI1NnUsICh1aW50cHRyX3QpaW5mbyk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3Qpc3RydWt0KTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMl9kZXJpdmVkKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMl9jYXN0MmRlcml2ZWQpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3RfczMyKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0PiBDMlRlc3RGbGV4RW5kU2l6ZUluZm87CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm8sIG0uc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5tRmxleFNpemUpID09IDEyLCAib2Zmc2V0IHNob3VsZCBiZSAxMiIpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0LCBrUGFyYW1JbmRleFRlc3RGbGV4RW5kU2l6ZT4gQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSwgbS5zaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UsIG0ubUZsZXhTaXplKSA9PSAxMiwgIm9mZnNldCBzaG91bGQgYmUgMTIiKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQQVJBTSBVU0FHRSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0cnVjdCBDMk51bWJlclN0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyOworICAgIEMyTnVtYmVyU3RydWN0KCkge30KKyAgICBDMk51bWJlclN0cnVjdChpbnQzMl90IF9udW1iZXIpIDogbU51bWJlcihfbnVtYmVyKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChOdW1iZXIpCisgICAgQzJGSUVMRChtTnVtYmVyLCAibnVtYmVyIikKK307CisKK3N0cnVjdCBDMk51bWJlckJhc2VTdHJ1Y3QgeworICAgIGludDMyX3QgbU51bWJlcjsKKyAgICBDMk51bWJlckJhc2VTdHJ1Y3QoKSB7fQorICAgIEMyTnVtYmVyQmFzZVN0cnVjdChpbnQzMl90IF9udW1iZXIpIDogbU51bWJlcihfbnVtYmVyKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKE51bWJlckJhc2UpCisgICAgQzJGSUVMRChtTnVtYmVyLCAibnVtYmVyIikKK307CisKK3N0cnVjdCBDMk51bWJlcnNTdHJ1Y3QgeworICAgIGludDMyX3QgbU51bWJlcnNbXTsKKyAgICBDMk51bWJlcnNTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKE51bWJlcnMsIG1OdW1iZXJzKQorICAgIEMyRklFTEQobU51bWJlcnMsICJudW1iZXJzIikKK307CitzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJDMk51bWJlcnNTdHJ1Y3QgaGFzIGluY29ycmVjdCBzaXplIik7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlckluZm87CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyVHVuaW5nOwordHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJQb3J0VHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJTdHJlYW1UdW5pbmc7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNUdW5pbmc7Cit0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzUG9ydFR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNTdHJlYW1UdW5pbmc7CisKKy8vCisjaWYgMAorCit2b2lkIHRlc3QoKSB7CisgICAgQzJOdW1iZXJTdHJ1Y3QgcygxMCk7CisgICAgKHZvaWQpQzJOdW1iZXJTdHJ1Y3Q6OkZpZWxkTGlzdCgpOworfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyQj4gQzJOdW1iZXJDb25maWc0OwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcj4gQzJOdW1iZXJDb25maWczOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE51bWJlcj4gQzJWaWRlb05hbWVDb25maWc7CisKK3ZvaWQgdGVzdDMoKSB7CisgICAgQzJOdW1iZXJDb25maWczIHMoMTApOworICAgIHMudmFsdWUgPSAxMTsKKyAgICBzID0gMTI7CisgICAgKHZvaWQpQzJOdW1iZXJDb25maWczOjpGaWVsZExpc3QoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJWaWRlb05hbWVDb25maWc+IG4gPSBDMlZpZGVvTmFtZUNvbmZpZzo6QWxsb2NTaGFyZWQoMjUpOworICAgIHN0cmNweShuLT5tLnZhbHVlLCAibGFqb3MiKTsKKyAgICBDMk51bWJlckNvbmZpZzQgdChmYWxzZSwgMCwgMTEpOworICAgIHQudmFsdWUgPSAxNTsKK307CisKK3N0cnVjdCBDMk51bWJlcnNTdHJ1Y3QgeworICAgIGludDMyX3QgbU51bWJlcnNbXTsKKyAgICBlbnVtIHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4TnVtYmVyIH07CisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIEMyTnVtYmVyc1N0cnVjdCgpIHt9CisKKyAgICBGTEVYKEMyTnVtYmVyc1N0cnVjdCwgbU51bWJlcnMpOworfTsKKworc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAieWVzIik7CisKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNJbmZvOworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJOdW1iZXJzU3RydWN0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyTnVtYmVyc1N0cnVjdDo6X0ZJRUxEX0xJU1QgPQorLy8gICAgeyB7IEZEOjpJTlQzMiwgMCwgIndpZHRocyIgfSB9OworICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJOdW1iZXJzU3RydWN0KikobnVsbHB0cikpLT5tTnVtYmVycywgIm51bWJlciIpIH07CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlckNvbmZpZzsKKworc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IG15TGlzdCA9IEMyTnVtYmVyQ29uZmlnOjpGaWVsZExpc3QoKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gX190ZXN0X2Rlc2NyaWJlKHVpbnQzMl90IHBhcmFtVHlwZSkgeworICAgICAgICBzdGQ6Omxpc3Q8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGRlc2NyaWJlQzJQYXJhbXM8QzJOdW1iZXJDb25maWc+KCk7CisKKyAgICAgICAgYXV0byB3aWR0aHMgPSBDMk51bWJlcnNJbmZvOjpBbGxvY1NoYXJlZCg1KTsKKyAgICAgICAgd2lkdGhzLT5mbGV4Q291bnQoKTsKKyAgICAgICAgd2lkdGhzLT5tLm1OdW1iZXJzWzRdID0gMTsKKworICAgICAgICB0ZXN0KCk7CisgICAgICAgIHRlc3QzKCk7CisKKyAgICAgICAgQzJOdW1iZXJDb25maWcgb3V0cHV0V2lkdGgoZmFsc2UsIDEyMyk7CisKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgocGFyYW1UeXBlKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbVR5cGUpIHsKKyAgICAgICAgY2FzZSBDMk51bWJlckNvbmZpZzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbURlc2NyaXB0b3I+KG5ldyBDMlBhcmFtRGVzY3JpcHRvcnsKKyAgICAgICAgICAgICAgICB0cnVlIC8qIGlzUmVxdWlyZWQgKi8sCisgICAgICAgICAgICAgICAgIm51bWJlciIsCisgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKKy8vCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIGNhblNldFBvcnQoVCAmbywgYm9vbCBvdXRwdXQpIHsgcmV0dXJuIG8uc2V0UG9ydChvdXRwdXQpOyB9Citib29sIGNhblNldFBvcnQoLi4uKSB7IHJldHVybiBmYWxzZTsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZSgoKFMqKTApLT5zZXRQb3J0KHRydWUpKT4KK3N0YXRpYyBzdGQ6OnRydWVfdHlwZSBfY2FuQ2FsbFNldFBvcnQoaW50KTsKK3RlbXBsYXRlPHR5cGVuYW1lPgorc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBfY2FuQ2FsbFNldFBvcnQoLi4uKTsKKyNkZWZpbmUgY2FuQ2FsbFNldFBvcnQoeCkgZGVjbHR5cGUoX2NhbkNhbGxTZXRQb3J0PHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxkZWNsdHlwZSh4KT46OnR5cGU+KDApKTo6dmFsdWUKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUQVRJQyBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPGludD46OnZhbHVlLCAiaW50IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KCFfQzJDb21wYXJhYmxlPHZvaWQ+Ojp2YWx1ZSwgInZvaWQgaXMgY29tcGFyYWJsZSIpOworCitzdHJ1Y3QgQzJfSElERSBfdGVzdDAgeworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdGVzdDAmKTsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX3Rlc3QwJik7Cit9Oworc3RydWN0IEMyX0hJREUgX3Rlc3QxIHsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX3Rlc3QxJik7Cit9Oworc3RydWN0IEMyX0hJREUgX3Rlc3QyIHsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgX3Rlc3QyJik7Cit9Oworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0MD46OnZhbHVlLCAiY2xhc3Mgd2l0aCA9PSBhbmQgIT0gaXMgbm90IGNvbXBhcmFibGUiKTsKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxfdGVzdDE+Ojp2YWx1ZSwgImNsYXNzIHdpdGggPT0gaXMgbm90IGNvbXBhcmFibGUiKTsKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxfdGVzdDI+Ojp2YWx1ZSwgImNsYXNzIHdpdGggIT0gaXMgbm90IGNvbXBhcmFibGUiKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEMyUEFSQU0gVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0cnVjdCBfQzJQYXJhbUluc3BlY3RvciB7CisgICAgc3RhdGljIHZvaWQgU3RhdGljVGVzdCgpOworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0Zyb21CYXNlVGVzdCgpOworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0ZsZXhUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRmxleEZyb21CYXNlVGVzdCgpOworfTsKKworLy8gVEVTVF9GKF9DMlBhcmFtSW5zcGVjdG9yLCBTdGF0aWNUZXN0KSB7Cit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNUZXN0KCkgeworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTnVtYmVyU3RydWN0OiBDT1JFX0lOREVYID0ga0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJ1Y3QpID09IDQsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJOdW1iZXJUdW5pbmc6ICAgICAgICAgICAgIGtJbmRleCB8IHR1biB8IGdsb2JhbCAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclR1bmluZzo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEUgPT0gKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyVHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJTdHJlYW1UdW5pbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmcpID09IDEydSwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGcm9tQmFzZVRlc3QoKSB7CisgICAgZW51bSB7IGtQYXJhbUluZGV4TXkgPSAzMTAyIH07CisgICAgdHlwZWRlZiBDMk51bWJlckJhc2VTdHJ1Y3QgQzJNeVN0cnVjdDsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U2V0dGluZzsKKyAgICB0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15UG9ydFNldHRpbmc7CisgICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVN0cmVhbVNldHRpbmc7CisKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk15U3RydWN0IGhhcyBubyBDT1JFX0lOREVYCisgICAgLy9zdGF0aWNfYXNzZXJ0KEMyTXlTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJ1Y3QpID09IDQsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJNeVNldHRpbmc6ICAgICAgICAgICAgIGtJbmRleCB8IHR1biB8IGdsb2JhbCAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15U2V0dGluZzo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U2V0dGluZzo6UEFSQU1fVFlQRSA9PSAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVNldHRpbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJNeVBvcnRTZXR0aW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVBvcnRTZXR0aW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydFNldHRpbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydFNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydFNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfT1VUUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJNeVN0cmVhbVNldHRpbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbVNldHRpbmcpID09IDEydSwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRmxleFRlc3QoKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJOdW1iZXJzU3RydWN0OiBDT1JFX0lOREVYID0ga0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk51bWJlcnNUdW5pbmc6ICAgICAgICAgICAgIGtJbmRleCB8IHR1biB8IGdsb2JhbCAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNUdW5pbmc6OkNPUkVfSU5ERVggPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRSA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1R1bmluZykgPT0gOCwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1R1bmluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1R1bmluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1R1bmluZywgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNQb3J0VHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0LCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZykgPT0gOCwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCit0ZW1wbGF0ZTxib29sLCB1bnNpZ25lZCAuLi5OPgorc3RydWN0IF9wcmludF9hc193YXJuaW5nIHsgfTsKKwordGVtcGxhdGU8dW5zaWduZWQgLi4uTj4KK3N0cnVjdCBfcHJpbnRfYXNfd2FybmluZzx0cnVlLCBOLi4uPiA6IHN0ZDo6dHJ1ZV90eXBlIHsgfTsKKworI2RlZmluZSBzdGF0aWNfYXNzZXJ0X2VxdWFscyhhLCBiLCBtc2cpIFwKK3N0YXRpY19hc3NlcnQoX3ByaW50X2FzX3dhcm5pbmc8KGEpID09IChiKSwgYSwgYj46OnZhbHVlLCBtc2cpCisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0ZsZXhGcm9tQmFzZVRlc3QoKSB7CisgICAgZW51bSB7IGtQYXJhbUluZGV4TXkgPSAxMjAzIH07CisgICAgdHlwZWRlZiBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QgQzJNeVN0cnVjdDsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15SW5mbzsKKyAgICB0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJJbmZvLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15UG9ydEluZm87CisgICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVN0cmVhbUluZm87CisKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk15U3RydWN0IGhhcyBubyBDT1JFX0lOREVYCisgICAgLy9zdGF0aWNfYXNzZXJ0KEMyTXlTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk15SW5mbzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0X2VxdWFscyhDMk15SW5mbzo6Q09SRV9JTkRFWCwgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydF9lcXVhbHMoQzJNeUluZm86OlBBUkFNX1RZUEUsIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15SW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15UG9ydEluZm86ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydEluZm8pID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15UG9ydEluZm86OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk15UG9ydEluZm86Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfT1VUUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbzo6aW5wdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydEluZm86Om91dHB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJNeVN0cmVhbUluZm86ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm8pID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15U3RyZWFtSW5mbzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtSW5mbzo6aW5wdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6aW5wdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgUGFyYW1PcHNUZXN0KSB7CisgICAgY29uc3QgQzJOdW1iZXJTdHJ1Y3Qgc3RyKDEwMCk7CisgICAgQzJOdW1iZXJTdHJ1Y3QgYnN0cjsKKworICAgIHsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgc3RyLm1OdW1iZXIpOworICAgICAgICBic3RyLm1OdW1iZXIgPSAxMDA7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclR1bmluZyB0dW4oMTAwKTsKKyAgICBDMk51bWJlclR1bmluZyBidHVuOworCisgICAgeworICAgICAgQzJOdW1iZXJJbmZvIGluZigxMDApOworICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1R1bmluZz4gdHVuXyA9IEMyTnVtYmVyc1R1bmluZzo6QWxsb2NVbmlxdWUoMSk7CisKKyAgICAgIEVYUEVDVF9FUSh0dW4uY29yZUluZGV4KCksIGluZi5jb3JlSW5kZXgoKSk7CisgICAgICBFWFBFQ1RfTkUodHVuLmNvcmVJbmRleCgpLCB0dW5fLT5jb3JlSW5kZXgoKSk7CisgICAgICBFWFBFQ1RfTkUodHVuLnR5cGUoKSwgaW5mLnR5cGUoKSk7CisgICAgICBFWFBFQ1RfTkUodHVuLnR5cGUoKSwgdHVuXy0+dHlwZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyB0dW4sIGJ0dW4gfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgdHVuLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYnR1bi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR1biA9PSBidHVuKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR1bi5vcGVyYXRvcj09KGJ0dW4pKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHVuICE9IGJ0dW4pOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4ub3BlcmF0b3IhPShidHVuKSk7CisgICAgICAgIGJ0dW4ubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX0VRKHR1biwgYnR1bik7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi50eXBlKCksIEMyTnVtYmVyVHVuaW5nOjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclR1bmluZzo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyVHVuaW5nOjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmdHVuKSwgJnR1bik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShidHVuKSksIGJ0dW4pOworICAgICAgICBidHVuLmludmFsaWRhdGUoKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKEMyUGFyYW06OkNvcHkoYnR1bikpOworICAgIH0KKworICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZyBvdXRwMSh0cnVlLCAxMDApLCBpbnAxKGZhbHNlLCAxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZyBib3V0cDEsIGJpbnAxLCBiaW5wMyhmYWxzZSwgMTAwKTsKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0IGlucDIoMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0IGJpbnAyOworICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0IG91dHAyKDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQgYm91dHAyOworCisgICAgRVhQRUNUX0VRKGlucDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShiaW5wMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYm91dHAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShpbnAyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRwMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKworICAgIEVYUEVDVF9FUShpbnAxLnR5cGUoKSwgaW5wMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShvdXRwMS50eXBlKCksIG91dHAyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDEudHlwZSgpLCBvdXRwMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAyLnR5cGUoKSwgb3V0cDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIGJpbnAxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKG91dHAxLnR5cGUoKSwgYm91dHAxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDEudHlwZSgpLCB0dW4udHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMi50eXBlKCksIHR1bi50eXBlKCkpOworCisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmlucDEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5wMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChiaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAxLCBpbnAxLCBib3V0cDEgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnAyLCBiaW5wMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAyLCBib3V0cDIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHAxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGlucDEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDEsIGlucDEgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAyLCBib3V0cDIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5wMiwgYmlucDIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgYm91dHAxIH0gKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0cDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAyLm1OdW1iZXIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gb3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGlucDIpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBvdXRwMik7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnAxID09IGJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnAyICE9IGJvdXRwMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBiaW5wMSk7CisgICAgICAgIGJpbnAxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gYmlucDEpOworICAgICAgICBiaW5wMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKWJpbnAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCFiaW5wMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gYmlucDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDIgIT0gYmlucDIpOworICAgICAgICBiaW5wMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAyID09IGJpbnAyKTsKKworICAgICAgICBiaW5wMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gYmlucDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxICE9IGJvdXRwMSk7CisgICAgICAgIGJvdXRwMS5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSAhPSBib3V0cDEpOworICAgICAgICBib3V0cDEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKWJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gYm91dHAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMiAhPSBib3V0cDIpOworICAgICAgICBib3V0cDIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDIgPT0gYm91dHAyKTsKKworICAgICAgICBib3V0cDEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGJvdXRwMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMS5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDIuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5wMSksICZpbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5wMiksIChDMk51bWJlclBvcnRUdW5pbmcqKSZpbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0cDEpLCAmb3V0cDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRwMiksIChDMk51bWJlclBvcnRUdW5pbmcqKSZvdXRwMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAxKSwgKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQqKSZpbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDIpLCAmaW5wMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAxKSwgKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0Kikmb3V0cDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAyKSwgJm91dHAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGlucDEpKSwgaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5wMikpLCBpbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRwMSkpLCBvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0cDIpKSwgb3V0cDIpOworICAgIH0KKworICAgIGNvbnN0IEMyTnVtYmVyU3RyZWFtVHVuaW5nIG91dHMxKHRydWUsIDF1LCAxMDApLCBpbnMxKGZhbHNlLCAxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZyBib3V0czEsIGJpbnMxLCBiaW5zMyhmYWxzZSwgMXUsIDEwMCk7CisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0IGluczIoMXUsIDEwMCk7CisgICAgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0IGJpbnMyOworICAgIGNvbnN0IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQgb3V0czIoMXUsIDEwMCk7CisgICAgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBib3V0czI7CisKKyAgICBFWFBFQ1RfRVEoaW5zMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJpbnMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShib3V0czEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGluczIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHMyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworCisgICAgRVhQRUNUX0VRKGluczEudHlwZSgpLCBpbnMyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGluczEudHlwZSgpLCBiaW5zMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShvdXRzMS50eXBlKCksIG91dHMyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgYm91dHMyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczEudHlwZSgpLCBvdXRzMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMyLnR5cGUoKSwgb3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIGJpbnMxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKG91dHMxLnR5cGUoKSwgYm91dHMxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczEudHlwZSgpLCB0dW4udHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMi50eXBlKCksIHR1bi50eXBlKCkpOworCisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnMzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5zMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMxLCBpbnMxLCBib3V0czEgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnMyLCBiaW5zMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMyLCBib3V0czIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHMxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluczEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czEsIGluczEgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC5zdHJlYW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMiwgYm91dHMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGluczIsIGJpbnMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGJvdXRzMSB9ICkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGluczIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi5tTnVtYmVyKTsKKworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluczIuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIG91dHMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczIuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMS5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLnN0cmVhbSgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IG91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBpbnMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gb3V0czIpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5zMSA9PSBib3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5zMiAhPSBib3V0czIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKKyAgICAgICAgYmluczEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKKyAgICAgICAgYmluczEuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiAhPSBiaW5zMik7CisgICAgICAgIGJpbnMyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgIT0gYmluczIpOworICAgICAgICBiaW5zMi5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyID09IGJpbnMyKTsKKworICAgICAgICBiaW5zMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7CisgICAgICAgIGJvdXRzMS5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7CisgICAgICAgIGJvdXRzMS5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBib3V0czEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyICE9IGJvdXRzMik7CisgICAgICAgIGJvdXRzMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiAhPSBib3V0czIpOworICAgICAgICBib3V0czIuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgPT0gYm91dHMyKTsKKworICAgICAgICBib3V0czEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGJvdXRzMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5zMi50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMS50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0czIudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5zMSksICZpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnMyKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nKikmaW5zMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0czEpLCAmb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHMyKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nKikmb3V0czIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMxKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCopJmluczEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMyKSwgJmluczIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czEpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCopJm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMyKSwgJm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGluczEpKSwgaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5zMikpLCBpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRzMSkpLCBvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0czIpKSwgb3V0czIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUsIDEwMCB9OworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKHAxLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKDEydSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpICsgMik7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSAtIDIpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAzKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMCk7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisgICAgfQorfQorCit2b2lkIFN0YXRpY1Rlc3RBZGRDb3JlSW5kZXgoKSB7CisgICAgc3RydWN0IG5vYmFzZSB7fTsKKyAgICBzdHJ1Y3QgYmFzZSB7IGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSAxIH07IH07CisgICAgc3RhdGljX2Fzc2VydChfQzJBZGRDb3JlSW5kZXg8bm9iYXNlLCAyPjo6Q09SRV9JTkRFWCA9PSAyLCAic2hvdWxkIGJlIDIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9DMkFkZENvcmVJbmRleDxiYXNlLCAxPjo6Q09SRV9JTkRFWCA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK30KKworY2xhc3MgVGVzdEZsZXhIZWxwZXIgeworICAgIHN0cnVjdCBfRmxleCB7CisgICAgICAgIGludDMyX3QgYTsKKyAgICAgICAgY2hhciBiW107CisgICAgICAgIF9GbGV4KCkge30KKyAgICAgICAgRkxFWChfRmxleCwgYik7CisgICAgfTsKKworICAgIHN0cnVjdCBfQm9GbGV4IHsKKyAgICAgICAgX0ZsZXggYTsKKyAgICAgICAgX0JvRmxleCgpIHt9CisgICAgICAgIEZMRVgoX0JvRmxleCwgYSk7CisgICAgfTsKKworICAgIHN0cnVjdCBfTm9uRmxleCB7CisgICAgfTsKKworCisgICAgc3RhdGljIHZvaWQgU3RhdGljVGVzdCgpIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyPjo6RmxleFR5cGUsIHZvaWQ+Ojp2YWx1ZSwgInNob3VsZCBiZSB2b2lkIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8Y2hhcltdPjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0ZsZXg+OjpGbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPF9Cb0ZsZXg+OjpGbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KF9DMkZsZXhpYmxlPF9GbGV4Pjo6dmFsdWUsICJzaG91bGQgYmUgZmxleGlibGUiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghX0MyRmxleGlibGU8X05vbkZsZXg+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgZmxleGlibGUiKTsKKyAgICB9Cit9OworCitURVNUX0YoQzJQYXJhbVRlc3QsIEZsZXhQYXJhbU9wc1Rlc3QpIHsKKy8vICAgIGNvbnN0IEMyTnVtYmVyc1N0cnVjdCBzdHJ7MTAwfTsKKyAgICBDMk51bWJlcnNTdHJ1Y3QgYnN0cjsKKyAgICB7CisvLyAgICAgICAgRVhQRUNUX0VRKDEwMCwgc3RyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgKHZvaWQpJmJzdHIubU51bWJlcnNbMF07CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1R1bmluZz4gdHVuXyA9IEMyTnVtYmVyc1R1bmluZzo6QWxsb2NVbmlxdWUoMSk7CisgICAgdHVuXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzVHVuaW5nPiB0dW4gPSBzdGQ6Om1vdmUodHVuXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1R1bmluZz4gYnR1biA9IEMyTnVtYmVyc1R1bmluZzo6QWxsb2NTaGFyZWQoMSk7CisKKyAgICB7CisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzVHVuaW5nICpUW10gPSB7IHR1bi5nZXQoKSwgYnR1bi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZQorICAgICAgICBFWFBFQ1RfRVEoMTAwLCB0dW4tPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYnR1bi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSgqdHVuID09ICpidHVuKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR1bi0+b3BlcmF0b3I9PSgqYnR1bikpOworICAgICAgICBFWFBFQ1RfVFJVRSgqdHVuICE9ICpidHVuKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHVuLT5vcGVyYXRvciE9KCpidHVuKSk7CisgICAgICAgIGJ0dW4tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9FUSgqdHVuLCAqYnR1bik7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4tPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4tPnR5cGUoKSwgQzJOdW1iZXJzVHVuaW5nOjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzVHVuaW5nOjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzVHVuaW5nOjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20odHVuLmdldCgpKSwgdHVuLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCp0dW4pKSwgKnR1bik7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IG91dHAxXyhDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCB0cnVlKSksCisgICAgICAgICAgICBpbnAxXyA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jVW5pcXVlKDEsIGZhbHNlKTsKKyAgICBvdXRwMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgaW5wMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc+IG91dHAxID0gc3RkOjptb3ZlKG91dHAxXyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc+IGlucDEgPSBzdGQ6Om1vdmUoaW5wMV8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nPiBib3V0cDEoQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NTaGFyZWQoMSkpLAorICAgICAgICAgICAgYmlucDEgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxKSwKKyAgICAgICAgICAgIGJpbnAzID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NTaGFyZWQoMSwgZmFsc2UpOworICAgIGJpbnAzLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gaW5wMl8oQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkFsbG9jVW5pcXVlKDEpKTsKKyAgICBpbnAyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGlucDIgPSBzdGQ6Om1vdmUoaW5wMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gYmlucDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBvdXRwMl8oQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgxKSk7CisgICAgb3V0cDJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IG91dHAyID0gc3RkOjptb3ZlKG91dHAyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gYm91dHAyKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMSkpOworCisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5wMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5wMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5wMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmJpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlBbXSA9IHsgb3V0cDEuZ2V0KCksIGlucDEuZ2V0KCksIGJvdXRwMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFApIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKlBJW10gPSB7IGlucDIuZ2V0KCksIGJpbnAyLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0ICpQT1tdID0geyBvdXRwMi5nZXQoKSwgYm91dHAyLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHAxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGlucDEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQMltdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAyKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBPKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBJKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQM1tdID0geyBib3V0cDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQMykgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGlucDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRwMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAyLT5tLm1OdW1iZXJzWzBdKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqb3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSA9PSAqaW5wMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqb3V0cDIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmlucDEgPT0gKmJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMiAhPSAqYm91dHAyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOworICAgICAgICBiaW5wMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKmJpbnAxKTsKKyAgICAgICAgYmlucDEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKmJpbnAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYmlucDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSA9PSAqYmlucDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAyICE9ICpiaW5wMik7CisgICAgICAgIGJpbnAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMiA9PSAqYmlucDIpOworCisgICAgICAgIGJpbnAxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOworICAgICAgICBib3V0cDEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSAhPSAqYm91dHAxKTsKKyAgICAgICAgYm91dHAxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKmJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghKmJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqYm91dHAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgIT0gKmJvdXRwMik7CisgICAgICAgIGJvdXRwMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAyID09ICpib3V0cDIpOworCisgICAgICAgIGJvdXRwMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSA9PSAqYm91dHAxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEtPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBpbmRleCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgaW5wMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZyopaW5wMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgb3V0cDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nKilvdXRwMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnAxLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0KilpbnAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBpbnAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0KilvdXRwMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBvdXRwMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5wMSkpLCAqaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmlucDIpKSwgKmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRwMSkpLCAqb3V0cDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRwMikpLCAqb3V0cDIpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IG91dHMxXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jVW5pcXVlKDEsIHRydWUsIDF1KSk7CisgICAgb3V0czFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc+IG91dHMxID0gc3RkOjptb3ZlKG91dHMxXyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gaW5zMV8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCBmYWxzZSwgMXUpKTsKKyAgICBpbnMxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxID0gc3RkOjptb3ZlKGluczFfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBib3V0czEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYmluczEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYmluczMoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1NoYXJlZCgxLCBmYWxzZSwgMXUpKTsKKyAgICBiaW5zMy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gaW5zMl8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMSwgMXUpKTsKKyAgICBpbnMyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gaW5zMiA9IHN0ZDo6bW92ZShpbnMyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGJpbnMyKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IG91dHMyXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoMSwgMXUpKTsKKyAgICBvdXRzMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBvdXRzMiA9IHN0ZDo6bW92ZShvdXRzMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gYm91dHMyKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnMzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnMxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnMxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqYmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTW10gPSB7IG91dHMxLmdldCgpLCBpbnMxLmdldCgpLCBib3V0czEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQgKlNJW10gPSB7IGluczIuZ2V0KCksIGJpbnMyLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU0kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQgKlNPW10gPSB7IG91dHMyLmdldCgpLCBib3V0czIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTTykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0czEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5zMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqUzJbXSA9IHsgb3V0czEuZ2V0KCksIGluczEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTMikgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHAtPnN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNPKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNJKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlMzW10gPSB7IGJvdXRzMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMzKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5zMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHMyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czItPm0ubU51bWJlcnNbMF0pOworCisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5zMi0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIG91dHMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczEtPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMi0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMS0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMi0+c3RyZWFtKCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICppbnMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxID09ICpvdXRzMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5zMSA9PSAqYm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnMyICE9ICpib3V0czIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqYmluczEpOworICAgICAgICBiaW5zMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqYmluczEpOworICAgICAgICBiaW5zMS0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiAhPSAqYmluczIpOworICAgICAgICBiaW5zMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgIT0gKmJpbnMyKTsKKyAgICAgICAgYmluczItPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyID09ICpiaW5zMik7CisKKyAgICAgICAgYmluczEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKmJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7CisgICAgICAgIGJvdXRzMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7CisgICAgICAgIGJvdXRzMS0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxID09ICpib3V0czEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiAhPSAqYm91dHMyKTsKKyAgICAgICAgYm91dHMyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgIT0gKmJvdXRzMik7CisgICAgICAgIGJvdXRzMi0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyID09ICpib3V0czIpOworCisgICAgICAgIGJvdXRzMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqYm91dHMxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEoaW5zMS0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEoaW5zMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMS0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0czItPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBpbmRleCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBpbnMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZyopaW5zMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0czEuZ2V0KCkpLCBvdXRzMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilvdXRzMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGluczEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCopaW5zMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGluczIuZ2V0KCkpLCBpbnMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMxLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0KilvdXRzMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG91dHMyLmdldCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnMxKSksICppbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5zMikpLCAqaW5zMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHMxKSksICpvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHMyKSksICpvdXRzMik7CisgICAgfQorCisgICAgeworICAgICAgICBDMkludDMyVmFsdWUgaW50MzJWYWx1ZShJTlQzMl9NSU4pOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShpbnQzMlZhbHVlLnZhbHVlKSwgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKElOVDMyX01JTiwgaW50MzJWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBpbnQzMlZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OklOVDMyLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJVaW50MzJWYWx1ZSB1aW50MzJWYWx1ZShVSU5UMzJfTUFYKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUodWludDMyVmFsdWUudmFsdWUpLCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7CisgICAgICAgIEVYUEVDVF9FUShVSU5UMzJfTUFYLCB1aW50MzJWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSB1aW50MzJWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpVSU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMkludDY0VmFsdWUgaW50NjRWYWx1ZShJTlQ2NF9NSU4pOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShpbnQ2NFZhbHVlLnZhbHVlKSwgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKElOVDY0X01JTiwgaW50NjRWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBpbnQ2NFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OklOVDY0LCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJVaW50NjRWYWx1ZSB1aW50NjRWYWx1ZShVSU5UNjRfTUFYKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUodWludDY0VmFsdWUudmFsdWUpLCB1aW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ2NF90Iik7CisgICAgICAgIEVYUEVDVF9FUShVSU5UNjRfTUFYLCB1aW50NjRWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSB1aW50NjRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpVSU5UNjQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMkZsb2F0VmFsdWUgZmxvYXRWYWx1ZSgxMjMuNGYpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShmbG9hdFZhbHVlLnZhbHVlKSwgZmxvYXQ+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbG9hdCIpOworICAgICAgICBFWFBFQ1RfRVEoMTIzLjRmLCBmbG9hdFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGZsb2F0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6RkxPQVQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50OF90IGluaXRWYWx1ZVtdID0gIkFCQ0QiOworICAgICAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMkJsb2JWYWx1ZSwgMD4gQmxvYlNldHRpbmc7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbG9iU2V0dGluZz4gYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OkFsbG9jVW5pcXVlKDYsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYmxvYlZhbHVlLT5tLnZhbHVlKSwgdWludDhfdFtdPjo6dmFsdWUsICJzaG91bGQgYmUgdWludDhfdFtdIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoYmxvYlZhbHVlLT5tLnZhbHVlLCAiQUJDRFwwIiwgNikpOworICAgICAgICBFWFBFQ1RfRVEoNnUsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYmxvYlZhbHVlLT5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpCTE9CLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworCisgICAgICAgIGJsb2JWYWx1ZSA9IEJsb2JTZXR0aW5nOjpBbGxvY1VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8dWludDhfdD4oaW5pdFZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoYmxvYlZhbHVlLT5tLnZhbHVlLCAiQUJDIiwgMykpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgY29uc3RleHByIGNoYXIgaW5pdFZhbHVlW10gPSAiQUJDRCI7CisgICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIDA+IFN0cmluZ1NldHRpbmc7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmdTZXR0aW5nPiBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDYsIEMyQ29uc3RNZW1vcnlCbG9jazxjaGFyPihpbml0VmFsdWUpKTsKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBpbml0VmFsdWUpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShzdHJpbmdWYWx1ZS0+bS52YWx1ZSksIGNoYXJbXT46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXJbXSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiQUJDRFwwIiwgNikpOworICAgICAgICBFWFBFQ1RfRVEoNnUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBzdHJpbmdWYWx1ZS0+RmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6U1RSSU5HLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoMywgQzJDb25zdE1lbW9yeUJsb2NrPGNoYXI+KGluaXRWYWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiQUIiLCAzKSk7CisgICAgICAgIEVYUEVDVF9FUSgzdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDExLCAiaW5pdFZhbHVlIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJpbml0VmFsdWVcMCIsIDExKSk7CisgICAgICAgIEVYUEVDVF9FUSgxMXUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZShpbml0VmFsdWUpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiQUJDRCIsIDUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDV1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoeyAnQScsICdCJywgJ0MnLCAnRCcgfSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkMiLCA0KSk7CisgICAgICAgIEVYUEVDVF9FUSg0dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTJ1LCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSwgMTAwIH07CisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcDEpOworICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqdnN0ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ocDEpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdnN0KTsKKyAgICAgICAgaWYgKHZzdCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCB2c3QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHZzdC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpICsgMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSAtIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAzKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMCk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDE2dSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUsIDEwMSwgMTAyIH07CisKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7CisgICAgICAgIEVYUEVDVF9FUSgxNnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0ICp2cHQgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShwMSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCB2cHQpOworICAgICAgICBpZiAodnB0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMnUsIHZwdC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMSwgdnB0LT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDIsIHZwdC0+bS5tTnVtYmVyc1sxXSk7CisgICAgICAgIH0KKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpICsgMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSAtIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAzKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMCk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisgICAgfQorfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIEMyVmFsdWVUZXN0KSB7CisgICAgQzJWYWx1ZSB2YWw7CisgICAgaW50MzJfdCBpMzIgPSAtMzI7CisgICAgaW50NjRfdCBpNjQgPSAtNjQ7CisgICAgdWludDMyX3QgdTMyID0gMzI7CisgICAgdWludDY0X3QgdTY0ID0gNjQ7CisgICAgZmxvYXQgZnAgPSAxLjVmOworCisgICAgRVhQRUNUX0VRKEMyVmFsdWU6Ok5PX0lOSVQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzJ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IGludDMyX3QoLTMyMTYpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpJTlQzMiwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzJ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IHVpbnQzMl90KDMyMTYpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpVSU5UMzIsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IGludDY0X3QoLTY0MzIpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpJTlQ2NCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSB1aW50NjRfdCg2NDMyKTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6VUlOVDY0LCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0MzJ1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gMTUuMjVmOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpGTE9BVCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjQzMnUsIHU2NCk7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDE1LjI1ZiwgZnApOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzNTRhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcApAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNhbXBsZUNvbXBvbmVudF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworY2xhc3MgQzJTYW1wbGVDb21wb25lbnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCit2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCA6OnN0ZDo6b3N0cmVhbSAqb3MpIHsKKyAgICB1c2luZyBGRD1DMkZpZWxkRGVzY3JpcHRvcjsKKyAgICBzd2l0Y2ggKGZkLnR5cGUoKSkgeworICAgIGNhc2UgRkQ6OklOVDMyOiAqb3MgPDwgImkzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OklOVDY0OiAqb3MgPDwgImk2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQzMjogKm9zIDw8ICJ1MzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UNjQ6ICpvcyA8PCAidTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6RkxPQVQ6ICpvcyA8PCAiZmxvYXQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpTVFJJTkc6ICpvcyA8PCAiY2hhciI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkJMT0I6ICpvcyA8PCAidTgiOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoZmQudHlwZSgpICYgRkQ6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICAqb3MgPDwgInN0cnVjdC0iIDw8IChmZC50eXBlKCkgJiB+RkQ6OlNUUlVDVF9GTEFHKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvcyA8PCAidHlwZS0iIDw8IGZkLnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3MgPDwgIiAiIDw8IGZkLm5hbWUoKTsKKyAgICBpZiAoZmQuZXh0ZW50KCkgPiAxKSB7CisgICAgICAgICpvcyA8PCAiWyIgPDwgZmQuZXh0ZW50KCkgPDwgIl0iOworICAgIH0gZWxzZSBpZiAoZmQuZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAqb3MgPDwgIltdIjsKKyAgICB9CisgICAgKm9zIDw8ICIgKCIgPDwgZmQuX21GaWVsZElkIDw8ICIqIiA8PCBmZC5leHRlbnQoKSA8PCAiKSI7Cit9CisKK0MyRU5VTSgKKyAgICBNZXRhZGF0YVR5cGUsIGludDMyX3QsCisgICAga0ludmFsaWQgPSAtMSwKKyAgICBrTm9uZSA9IDAsCisgICAga0dyYWxsb2MsCisgICAga05hdGl2ZUhhbmRsZSwKKyAgICBrQU5hdGl2ZVdpbmRvdywKKyAgICBrQ2FtZXJhLAorKQorCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFZpZGVvQ29uZmlnID0gMHgxMjM0LAorfTsKKworc3RydWN0IEMyVmlkZW9Db25maWdTdHJ1Y3QgeworICAgIGludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIE1ldGFkYXRhVHlwZSBtZXRhZGF0YVR5cGU7CisgICAgaW50MzJfdCBzdXBwb3J0ZWRGb3JtYXRzW107CisKKyAgICBDMlZpZGVvQ29uZmlnU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChWaWRlb0NvbmZpZywgc3VwcG9ydGVkRm9ybWF0cykKKyAgICBDMkZJRUxEKHdpZHRoLCAid2lkdGgiKQorICAgIEMyRklFTEQoaGVpZ2h0LCAiaGVpZ2h0IikKKyAgICBDMkZJRUxEKG1ldGFkYXRhVHlwZSwgIm1ldGFkYXRhLXR5cGUiKQorICAgIEMyRklFTEQoc3VwcG9ydGVkRm9ybWF0cywgImZvcm1hdHMiKQorfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJWaWRlb0NvbmZpZ1N0cnVjdD4gQzJWaWRlb0NvbmZpZ1BvcnRUdW5pbmc7CisKK2NsYXNzIE15Q29tcG9uZW50SW5zdGFuY2UgOiBwdWJsaWMgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8vIFx0b2RvIHRoaXMgc2VlbXMgdG9vIHNwZWNpZmljCisgICAgICAgIHJldHVybiAic2FtcGxlLmludGVyZmFjZSI7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLy8gXHRvZG8gaG93IGFyZSB0aGVzZSBzaGFyZWQ/CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgICh2b2lkKWZhaWx1cmVzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCl0YXJnZXRDb21wb25lbnQ7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgZm9yIChDMlBhcmFtKiBjb25zdCBwYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgICAgIGlmICghKnBhcmFtKSB7IC8vIHBhcmFtIGlzIGFscmVhZHkgaW52YWxpZCAtIHJlbWVtYmVyIGl0CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vdGU6IHRoaXMgZG9lcyBub3QgaGFuZGxlIHN0cmVhbSBwYXJhbXMgKHNob3VsZCB1c2UgaW5kZXguLi4pCisgICAgICAgICAgICBpZiAoIW1NeVBhcmFtcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbm90IG15IHBhcmFtCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEMyUGFyYW0gJiBteVBhcmFtID0gbU15UGFyYW1zLmZpbmQocGFyYW0tPmluZGV4KCkpLT5zZWNvbmQ7CisgICAgICAgICAgICBpZiAobXlQYXJhbS5zaXplKCkgIT0gcGFyYW0tPnNpemUoKSkgeyAvLyBpbmNvcnJlY3Qgc2l6ZQorICAgICAgICAgICAgICAgIHBhcmFtLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcmFtLT51cGRhdGVGcm9tKG15UGFyYW0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgICAgIGlmIChtTXlQYXJhbXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgQzJQYXJhbSAmIG15UGFyYW0gPSBtTXlQYXJhbXMuZmluZChpbmRleCktPnNlY29uZDsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcGFyYW1Db3B5KEMyUGFyYW06OkNvcHkobXlQYXJhbSkpOworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocGFyYW1Db3B5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBDMlBhcmFtICY+IG1NeVBhcmFtczsKKworICAgIEMyQ29tcG9uZW50RG9tYWluSW5mbyBtRG9tYWluSW5mbzsKKworICAgIE15Q29tcG9uZW50SW5zdGFuY2UoKSB7CisgICAgICAgIG1NeVBhcmFtcy5pbnNlcnQoe21Eb21haW5JbmZvLmluZGV4KCksIG1Eb21haW5JbmZvfSk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpdGFyZ2V0Q29tcG9uZW50OworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBjbGFzcyBNeVBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworICAgICAgICBjb25zdCBNeUNvbXBvbmVudEluc3RhbmNlICppbnN0YW5jZTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgTXlQYXJhbVJlZmxlY3Rvcihjb25zdCBNeUNvbXBvbmVudEluc3RhbmNlICppKSA6IGluc3RhbmNlKGkpIHsgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHN3aXRjaCAocGFyYW1JbmRleC50eXBlSW5kZXgoKSkgeworICAgICAgICAgICAgY2FzZSBkZWNsdHlwZShpbnN0YW5jZS0+bURvbWFpbkluZm8pOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4obmV3IEMyU3RydWN0RGVzY3JpcHRvcnsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPm1Eb21haW5JbmZvLnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW5zdGFuY2UtPm1Eb21haW5JbmZvKTo6RmllbGRMaXN0KCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgZm9yIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogZmllbGRzKSB7CisgICAgICAgICAgICBpZiAocXVlcnkuZmllbGQoKSA9PSBDMlBhcmFtRmllbGQoJm1Eb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5JbmZvOjp2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBxdWVyeS52YWx1ZXMgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmbGFnICovLAorICAgICAgICAgICAgICAgICAgICAmbURvbWFpbkluZm8udmFsdWUKKyAgICAgICAgICAgICAgICAgICAgLy8sCisgICAgICAgICAgICAgICAgICAgIC8veyhpbnQzMl90KUMyRG9tYWluVmlkZW99CisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQkFEX0lOREVYOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4obmV3IE15UGFyYW1SZWZsZWN0b3IodGhpcykpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBwYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICB0cnVlIC8qIHJlcXVpcmVkICovLCAiX2RvbWFpbiIsICZtRG9tYWluSW5mbykpOworICAgICAgICBwYXJhbXMtPnB1c2hfYmFjayhzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIG5ldyBDMlBhcmFtRGVzY3JpcHRvcih0cnVlIC8qIHJlcXVpcmVkICovLCAiX2RvbWFpbiIsICZtRG9tYWluSW5mbykpKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfk15Q29tcG9uZW50SW5zdGFuY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCBib29sIFM9c3RkOjppc19lbnVtPEU+Ojp2YWx1ZT4KK3N0cnVjdCBnZXR0ZXIgeworICAgIGludDMyX3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgaW50MzJfdCopIHsKKyAgICAgICAgcmV0dXJuIHAuaTMyOworICAgIH0KKyAgICBpbnQ2NF90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGludDY0X3QqKSB7CisgICAgICAgIHJldHVybiBwLmk2NDsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgdWludDMyX3QqKSB7CisgICAgICAgIHJldHVybiBwLnUzMjsKKyAgICB9CisgICAgdWludDY0X3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgdWludDY0X3QqKSB7CisgICAgICAgIHJldHVybiBwLnU2NDsKKyAgICB9CisgICAgZmxvYXQgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgZmxvYXQqKSB7CisgICAgICAgIHJldHVybiBwLmZwOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEU+CitzdHJ1Y3QgZ2V0dGVyPEUsIHRydWU+IHsKKyAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgRSopIHsKKyAgICAgICAgIHVzaW5nIHU9dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU7CisgICAgICAgICByZXR1cm4gZ2V0dGVyPHU+KCkuZ2V0KHAsICh1KikwKTsKKyAgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBFPXN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CitzdHJ1Y3QgbGF4X3VuZGVybHlpbmdfdHlwZSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBsYXhfdW5kZXJseWluZ190eXBlPFQsIGZhbHNlPiB7CisgICAgdHlwZWRlZiBUIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFPgordHlwZW5hbWUgbGF4X3VuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBnZXQoCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgRSopIHsKKyAgICByZXR1cm4gZ2V0dGVyPEU+KCkuZ2V0KHAsIChFKikwKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgZHVtcEZTVihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzdiwgVCp0KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8IChzdGQ6OmlzX2VudW08VD46OnZhbHVlID8gKHN0ZDo6aXNfc2lnbmVkPHR5cGVuYW1lIGxheF91bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU+Ojp2YWx1ZSA/ICJpIiA6ICJ1IikKKyAgICAgICAgICAgICA6IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlID8gc3RkOjppc19zaWduZWQ8VD46OnZhbHVlID8gImkiIDogInUiIDogImYiKQorICAgICAgICAgPDwgKDggKiBzaXplb2YoVCkpOworICAgIGlmIChzdi50eXBlID09IHN2LlJBTkdFKSB7CisgICAgICAgIGNvdXQgPDwgIi5yYW5nZSgiIDw8IGdldChzdi5yYW5nZS5taW4sIHQpOworICAgICAgICBpZiAoZ2V0KHN2LnJhbmdlLnN0ZXAsIHQpICE9IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlKSB7CisgICAgICAgICAgICBjb3V0IDw8ICI6IiA8PCBnZXQoc3YucmFuZ2Uuc3RlcCwgdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldChzdi5yYW5nZS5udW0sIHQpICE9IDEgfHwgZ2V0KHN2LnJhbmdlLmRlbm9tLCB0KSAhPSAxKSB7CisgICAgICAgICAgICBjb3V0IDw8ICI6IiA8PCBnZXQoc3YucmFuZ2UubnVtLCB0KSA8PCAiLyIgPDwgZ2V0KHN2LnJhbmdlLmRlbm9tLCB0KTsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8IGdldChzdi5yYW5nZS5tYXgsIHQpIDw8ICIpIjsKKyAgICB9CisgICAgaWYgKHN2LnZhbHVlcy5zaXplKCkpIHsKKyAgICAgICAgY291dCA8PCAoc3YudHlwZSA9PSBzdi5GTEFHUyA/ICIuZmxhZ3MoIiA6ICIubGlzdCgiKTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VwID0gIiI7CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwIDogc3YudmFsdWVzKSB7CisgICAgICAgICAgICBjb3V0IDw8IHNlcCA8PCBnZXQocCwgdCk7CisgICAgICAgICAgICBzZXAgPSAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAiKSI7CisgICAgfQorICAgIGNvdXQgPDwgZW5kbDsKK30KKwordm9pZCBkdW1wVHlwZShDMlBhcmFtOjpUeXBlIHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHR5cGUuaXNWZW5kb3IoKSA/ICJWZW5kb3IiIDogIkMyIik7CisgICAgaWYgKHR5cGUuZm9ySW5wdXQoKSkgeworICAgICAgICBjb3V0IDw8ICJJbnB1dCI7CisgICAgfSBlbHNlIGlmICh0eXBlLmZvck91dHB1dCgpKSB7CisgICAgICAgIGNvdXQgPDwgIk91dHB1dCI7CisgICAgfSBlbHNlIGlmICh0eXBlLmZvclBvcnQoKSAmJiAhdHlwZS5mb3JTdHJlYW0oKSkgeworICAgICAgICBjb3V0IDw8ICJQb3J0IjsKKyAgICB9CisgICAgaWYgKHR5cGUuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgY291dCA8PCAiU3RyZWFtIjsKKyAgICB9CisKKyAgICBpZiAodHlwZS5pc0ZsZXhpYmxlKCkpIHsKKyAgICAgICAgY291dCA8PCAiRmxleCI7CisgICAgfQorCisgICAgY291dCA8PCB0eXBlLnR5cGVJbmRleCgpOworCisgICAgc3dpdGNoICh0eXBlLmtpbmQoKSkgeworICAgIGNhc2UgQzJQYXJhbTo6SU5GTzogY291dCA8PCAiSW5mbyI7IGJyZWFrOworICAgIGNhc2UgQzJQYXJhbTo6U0VUVElORzogY291dCA8PCAiU2V0dGluZyI7IGJyZWFrOworICAgIGNhc2UgQzJQYXJhbTo6VFVOSU5HOiBjb3V0IDw8ICJUdW5pbmciOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlNUUlVDVDogY291dCA8PCAiU3RydWN0IjsgYnJlYWs7CisgICAgZGVmYXVsdDogY291dCA8PCAiS2luZCIgPDwgKGludDMyX3QpdHlwZS5raW5kKCk7IGJyZWFrOworICAgIH0KK30KKwordm9pZCBkdW1wVHlwZShDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKKyAgICBpZiAodHlwZS5pc0ZsZXhpYmxlKCkpIHsKKyAgICAgICAgY291dCA8PCAiRmxleCI7CisgICAgfQorCisgICAgY291dCA8PCB0eXBlLnR5cGVJbmRleCgpIDw8ICJTdHJ1Y3QiOworfQorCit2b2lkIGR1bXBUeXBlKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogY291dCA8PCAiYmxvYiAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogY291dCA8PCAiZmxvYXQgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6IGNvdXQgPDwgImludDMyX3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6IGNvdXQgPDwgImludDY0X3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBjb3V0IDw8ICJ1aW50MzJfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGNvdXQgPDwgInVpbnQ2NF90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogY291dCA8PCAiY2hhciAiOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICAgICAgZHVtcFR5cGUoKEMyUGFyYW06OlR5cGUpdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBkdW1wU3RydWN0KGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc2QpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgInN0cnVjdCAiOworICAgIGR1bXBUeXBlKHNkLmNvcmVJbmRleCgpKTsKKyAgICBjb3V0IDw8ICIgeyIgPDwgZW5kbDsKKyAgICAvL0MyRmllbGREZXNjcmlwdG9yICZmOworICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmYgOiBzZCkgeworICAgICAgICBQcmludFRvKGYsICZjb3V0KTsKKyAgICAgICAgY291dCA8PCBlbmRsOworCisgICAgICAgIGlmIChmLm5hbWVkVmFsdWVzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICBjb3V0IDw8ICIubmFtZWQoIjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOworICAgICAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZVR5cGUgJnAgOiBmLm5hbWVkVmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBjb3V0IDw8IHNlcCA8PCBwLmZpcnN0IDw8ICI9IjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoaW50MzJfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogY291dCA8PCBnZXQocC5zZWNvbmQsIChpbnQ2NF90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50MzJfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAodWludDY0X3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoZmxvYXQgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogY291dCA8PCAiPz8/IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlcCA9ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdXQgPDwgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgY291dCA8PCAifTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgZHVtcERlc2MoY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnBkKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBpZiAocGQuaXNSZXF1aXJlZCgpKSB7CisgICAgICAgIGNvdXQgPDwgInJlcXVpcmVkICI7CisgICAgfQorICAgIGlmIChwZC5pc1BlcnNpc3RlbnQoKSkgeworICAgICAgICBjb3V0IDw8ICJwZXJzaXN0ZW50ICI7CisgICAgfQorICAgIGNvdXQgPDwgInN0cnVjdCAiOworICAgIGR1bXBUeXBlKEMyUGFyYW06OlR5cGUocGQuaW5kZXgoKS50eXBlKCkpKTsKKyAgICBjb3V0IDw8ICIgIiA8PCBwZC5uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Cit9CisKK1RFU1RfRihDMlNhbXBsZUNvbXBvbmVudFRlc3QsIFJlZmxlY3RvclRlc3QpIHsKKyAgICBDMkNvbXBvbmVudERvbWFpbkluZm8gZG9tYWluSW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TXlDb21wb25lbnRJbnN0YW5jZT4gbXlDb21wKG5ldyBNeUNvbXBvbmVudEluc3RhbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGNvbXAgPSBteUNvbXA7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjeworICAgICAgICBteUNvbXAtPmdldFBhcmFtUmVmbGVjdG9yKCktPmRlc2NyaWJlKEMyQ29tcG9uZW50RG9tYWluSW5mbzo6Q09SRV9JTkRFWCl9OworICAgIGR1bXBTdHJ1Y3QoKmRlc2MpOworCisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeSA9IHsKKyAgICAgICAgeyBDMlBhcmFtRmllbGQoJmRvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpbkluZm86OnZhbHVlKSwKKyAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQgfSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluSW5mbzo6dmFsdWUpLAorICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCksCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudChDMlBhcmFtRmllbGQoJmRvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpbkluZm86OnZhbHVlKSksCisgICAgfTsKKworICAgIEVYUEVDVF9FUShDMl9PSywgY29tcC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIocXVlcnksIEMyX0RPTlRfQkxPQ0spKTsKKworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxIDogcXVlcnkpIHsKKyAgICAgICAgZHVtcEZTVihxLnZhbHVlcywgJmRvbWFpbkluZm8udmFsdWUpOworICAgIH0KK30KKworVEVTVF9GKEMyU2FtcGxlQ29tcG9uZW50VGVzdCwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNUZXN0KSB7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwgMD4gVWludDMyVGVzdEluZm87CisgICAgVWludDMyVGVzdEluZm8gdDsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiB2YWx1ZXM7CisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKDAsIDEwLCAxKSk7ICAvLyBtaW4sIG1heCwgc3RlcAorICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygxLCA2NCwgMiwgMSkpOyAgLy8gbWluLCBtYXgsIG51bSwgZGVuCisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlLCB7MSwgMiwgM30pKTsgIC8vIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3QKKyAgICB1aW50MzJfdCB2YWxbXSA9IHsxLCAzLCA1LCA3fTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdihzdGQ6OmJlZ2luKHZhbCksIHN0ZDo6ZW5kKHZhbCkpOworICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSwgdikpOyAgLy8gZmxhZ3MsIHN0ZDo6dmVjdG9yCisKKyAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2IDogdmFsdWVzKSB7CisgICAgICAgIGR1bXBGU1Yoc3YsICZ0LnZhbHVlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNkMzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlV0aWxUZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxfQzJNYWNyb1V0aWxzLmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisKKy8qKiBcZmlsZQorICogVGVzdHMgZm9yIHZuZGsvdXRpbC4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyTWFjcm9VdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljX2Fzc2VydCgwID09IF9DMl9BUkdDKCksICJzaG91bGQgYmUgMCIpOworc3RhdGljX2Fzc2VydCgxID09IF9DMl9BUkdDKDEpLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoMiA9PSBfQzJfQVJHQygxLCAyKSwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KDY0ID09IF9DMl9BUkdDKAorICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgICAgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LAorICAgICAgICA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCksICJzaG91bGQgYmUgNjQiKTsKKworc3RhdGljX2Fzc2VydCgwID09IF9DMl9BUkdDKCwpLCAic2hvdWxkIGJlIDAiKTsKK3N0YXRpY19hc3NlcnQoMSA9PSBfQzJfQVJHQygxLCksICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydCgyID09IF9DMl9BUkdDKDEsIDIsKSwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KDY0ID09IF9DMl9BUkdDKAorICAgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgICAgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LAorICAgICAgICA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwpLCAic2hvdWxkIGJlIDY0Iik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyRW51bVV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQzJVdGlsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKworQzJFTlVNKEVudW0xLCB1aW50MzJfdCwKKyAgICBFbnVtMVZhbHVlMSwKKyAgICBFbnVtMVZhbHVlMiwKKyAgICBFbnVtMVZhbHVlNCA9IEVudW0xVmFsdWUyICsgMiwKKyk7CisKK0MyRU5VTV9DVVNUT01fUFJFRklYKEVudW0yLCB1aW50MzJfdCwgIkVudW0iLAorICAgIEVudW0yVmFsdWUxLAorICAgIEVudW0yVmFsdWUyLAorICAgIEVudW0yVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAorKTsKKworQzJFTlVNX0NVU1RPTV9OQU1FUyhFbnVtMywgdWludDhfdCwKKyAgICAoeyB7ICJ2YWx1ZTEiLCBFbnVtM1ZhbHVlMSB9LAorICAgICAgIHsgInZhbHVlMiIsIEVudW0zVmFsdWUyIH0sCisgICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKKyAgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pLAorICAgIEVudW0zVmFsdWUxLAorICAgIEVudW0zVmFsdWUyLAorICAgIEVudW0zVmFsdWU0ID0gRW51bTNWYWx1ZTIgKyAyLAorICAgIEludmFsaWQsCispOworCitURVNUX0YoQzJVdGlsVGVzdCwgRW51bVV0aWxzVGVzdCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZywgRW51bTM+PiBwYWlycyAoIHsgeyAidmFsdWUxIiwgRW51bTNWYWx1ZTEgfSwKKyAgICAgIHsgInZhbHVlMiIsIEVudW0zVmFsdWUyIH0sCisgICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAorICAgICAgeyAiaW52YWxpZCIsIEludmFsaWQgfSB9KTsKKyAgICBFbnVtMyBlMzsKKyAgICBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoZTMpOworCisgICAgLy8gdXBwZXIgY2FzZQorICAgIEVYUEVDVF9FUSgieWVzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTIikpOworICAgIEVYUEVDVF9FUSgibm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJOTyIpKTsKKyAgICBFWFBFQ1RfRVEoInllcy1ubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFU19OTyIpKTsKKyAgICBFWFBFQ1RfRVEoInllcy1ubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFU19fTk8iKSk7CisgICAgRVhQRUNUX0VRKCJhMmRwIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQTJEUCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQkxPQ0tfMkQiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUEVHXzJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hJRERFTl9WQUxVRSIpKTsKKyAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSElEREVOX1ZBTFVFMiIpKTsKKyAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hJRERFTl9WQUxVRV8yIikpOworCisgICAgLy8gY2FtZWwgY2FzZQorICAgIEVYUEVDVF9FUSgieWVzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzIikpOworICAgIEVYUEVDVF9FUSgibm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJObyIpKTsKKyAgICBFWFBFQ1RfRVEoInllcy1ubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllc05vIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzX05vIikpOworICAgIEVYUEVDVF9FUSgibXAyLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyVHMiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrMkQiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnMnRzIikpOworICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9IaWRkZW5WYWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hpZGRlblZhbHVlMiIpKTsKKworICAgIC8vIG1peGVkIGNhc2UKKyAgICBFWFBFQ1RfRVEoIm1wMnQtcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMlRfcyIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2tfMkQiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yLWQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9jazJfRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWdfMnRzIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZ18yX1RTIikpOworICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9IaWRkZW5fX1ZBTFVFIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSGlkZGVuVmFsdWVfMiIpKTsKKyAgICBFWFBFQ1RfRVEoIl8yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiXzIiKSk7CisgICAgRVhQRUNUX0VRKCJfXzIzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX18yMyIpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMi5oPgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit0ZW1wbGF0ZTxpbnQgTj4KK3N0cnVjdCBjMl9jb25zdF9jaGVja2VyCit7CisgICAgaW5saW5lIGNvbnN0ZXhwciBzdGF0aWMgaW50IG51bSgpIHsgcmV0dXJuIE47IH0KK307CisKK2NvbnN0ZXhwciBhdXRvIG1pbl9pMzJfaTMyID0gYzJfbWluKGludDMyX3QoMSksIGludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX2kzMl9pNjQgPSBjMl9taW4oaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Citjb25zdGV4cHIgYXV0byBtaW5faThfaTMyID0gYzJfbWluKGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pMzJfaTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pNjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1pbl91MzJfdTMyID0gYzJfbWluKHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl91MzJfdTY0ID0gYzJfbWluKHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U2NCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl91MzJfdTggPSBjMl9taW4odWludDMyX3QoMHhmZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91OCksIGNvbnN0IHVpbnQ4X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90Iik7CisKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3UzMj46Om51bSgpID09IDEsICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTY0Pjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91OD46Om51bSgpID09IDB4ZmYsICJzaG91bGQgYmUgMHhmZiIpOworCitjb25zdGV4cHIgYXV0byBtYXhfaTMyX2kzMiA9IGMyX21heChpbnQzMl90KDEpLCBpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pMzJfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTY0ID0gYzJfbWF4KGludDMyX3QoMyksIGludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pNjQpLCBjb25zdCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWF4X2k4X2kzMiA9IGMyX21heChpbnQ4X3QoMHhmZiksIGludDMyX3QoMHhmZmZmZmZmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2k4X2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaTMyX2kzMj46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTY0Pjo6bnVtKCkgPT0gMywgInNob3VsZCBiZSAzIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2k4X2kzMj46Om51bSgpID09IDB4ZmZmZmZmZmYsICJzaG91bGQgYmUgMHhmZmZmZmZmZiIpOworCitjb25zdGV4cHIgYXV0byBtYXhfdTMyX3UzMiA9IGMyX21heCh1aW50MzJfdCgxKSwgdWludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91MzIpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfdTMyX3U2NCA9IGMyX21heCh1aW50MzJfdCgzKSwgdWludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91NjQpLCBjb25zdCB1aW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ2NF90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfdTMyX3U4ID0gYzJfbWF4KHVpbnQzMl90KDB4N2ZmZmZmZmYpLCB1aW50OF90KDB4ZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTgpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7CisKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3UzMj46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTY0Pjo6bnVtKCkgPT0gMywgInNob3VsZCBiZSAzIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91OD46Om51bSgpID09IDB4N2ZmZmZmZmYsICJzaG91bGQgYmUgMHg3ZmZmZmZmZiIpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ09VTlRFUiBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBjMl9jbnRyX3N0YXRpY190ZXN0KCkgeworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIGNvbnN0cnVjdGlvbi9hc3NpZ25tZW50CisgICAgY29uc3RleHByIGMyX2NudHIzMl90IGMzMl9hKDEyMyk7CisgICAgY29uc3RleHByIGMyX2NudHI2NF90IGM2NF9hKC00NTYpOworICAgIGMyX2NudHIzMl90IGMzMl9iIF9fdW51c2VkID0gYzY0X2E7CisgICAgLy8gYzMyX2IgPSA2NC47IC8vIERJU0FMTE9XRUQKKyAgICAvLyBjMl9jbnRyNjRfdCBjNjRfYiA9IGMzMl9hOyAvLyBESVNBTExPV0VECisKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBzb21lIGNvbnN0ZXhwciBvcGVyYXRvcnMKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSArIGM2NF9hKSwgZGVjbHR5cGUoYzY0X2EgKyBjMzJfYSk+Ojp2YWx1ZSwgIisgc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICsgYzY0X2EgPT0gYzJfY250cjMyX3QoLTMzMyksICIxMjMgKyAtNDU2ID0gLTMzMyIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyBjMzJfYSA9PSBjMl9jbnRyMzJfdCgyNDYpLCAiMTIzICsgMTIzID0gMjQ2Iik7CisgICAgc3RhdGljX2Fzc2VydChjNjRfYSArIGMzMl9hID09IGMyX2NudHIzMl90KC0zMzMpLCAiLTQ1NiArIDEyMyA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICsgMSksIGRlY2x0eXBlKDEgKyBjMzJfYSk+Ojp2YWx1ZSwgIisgc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICsgNDU2ID09IGMyX2NudHIzMl90KDU3OSksICIxMjMgKyA0NTYgPSA1NzkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDQ1NiArIGM2NF9hID09IGMyX2NudHI2NF90KDApLCAiNDU2ICsgLTQ1NiA9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAtIGM2NF9hKSwgZGVjbHR5cGUoYzY0X2EgLSBjMzJfYSk+Ojp2YWx1ZSwgIi0gc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hIC0gYzY0X2EgPT0gYzJfY250cjMyX3QoNTc5KSwgIjEyMyAtIC00NTYgPSA1NzkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hIC0gYzMyX2EgPT0gYzJfY250cjMyX3QoMCksICIxMjMgLSAxMjMgPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChjNjRfYSAtIGMzMl9hID09IGMyX2NudHIzMl90KC01NzkpLCAiLTQ1NiAtIDEyMyA9IC01NzkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAtIDEpLCBkZWNsdHlwZSgxIC0gYzMyX2EpPjo6dmFsdWUsICItIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIDQ1NiA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIjEyMyAtIDQ1NiA9IC0zMzMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDQ1NiAtIGM2NF9hID09IGMyX2NudHI2NF90KDkxMiksICI0NTYgLSAtNDU2ID0gOTEyIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKiBjNjRfYSksIGRlY2x0eXBlKGM2NF9hICogYzMyX2EpPjo6dmFsdWUsICIqIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAqIGM2NF9hID09IGMyX2NudHIzMl90KC01NjA4OCksICIxMjMgKiAtNDU2ID0gLTU2MDg4Iik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAqIGMzMl9hID09IGMyX2NudHIzMl90KDE1MTI5KSwgIjEyMyAqIDEyMyA9IDE1MTI5Iik7CisgICAgc3RhdGljX2Fzc2VydChjNjRfYSAqIGMzMl9hID09IGMyX2NudHIzMl90KC01NjA4OCksICItNDU2ICogMTIzID0gLTU2MDg4Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKiAxKSwgZGVjbHR5cGUoMSAqIGMzMl9hKT46OnZhbHVlLCAiKiBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiA0NTYgPT0gYzJfY250cjMyX3QoNTYwODgpLCAiMTIzICogNDU2ID0gNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KDQ1NiAqIGM2NF9hID09IGMyX2NudHI2NF90KC0yMDc5MzYpLCAiNDU2ICogLTQ1NiA9IC0yMDc5MzYiKTsKKworICAgIHN0YXRpY19hc3NlcnQoKGMzMl9hIDw8IDI2dSkgPT0gYzJfY250cjMyX3QoMHhFQzAwMDAwMCksICIxMjMgPDwgMjYgPSAweEVDMDAwMDAwIik7CisKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciB1bmFyeSBvcGVyYXRvcnMKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KDEpID09ICtjMl9jbnRyMzJfdCgxKSwgIjEgPT0gKzEiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KDEpID09IC1jMl9jbnRyMzJfdCgtMSksICIxID09IC0tMSIpOworCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgY29tcGFyaXNvbgorICAgIHVzaW5nIGM4X3QgPSBjMl9jbnRyX3Q8dWludDhfdD47CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA+IGM4X3QoMHg3ZiksICI4MCA+IDdGIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA+PSBjOF90KDB4N2YpLCAiODAgPj0gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPiBjOF90KDB4N2UpLCAiN0YgPiA3RSIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA+PSBjOF90KDB4N2UpLCAiN0YgPj0gN0UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPiBjOF90KDApKSwgIjgwICE+IDAwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4ODApID49IGM4X3QoMCkpLCAiODAgIT49IDAwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4ODApID4gYzhfdCgtMHg4MCkpLCAiODAgIT4gODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID49IGM4X3QoLTB4ODApLCAiODAgPj0gODAiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPT0gYzhfdCgweDgwKSwgIjgwID09IDgwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4ODApID09IGM4X3QoMCkpLCAiODAgIT0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgIT0gYzhfdCgweDdmKSwgIjgwICE9IDdGIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoMHg3ZikgIT0gYzhfdCgweDdmKSksICI4MCAhPSA3RiIpOworCisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpIDwgYzhfdCgtMHg4MCksICI3RiA8IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpIDw9IGM4X3QoLTB4ODApLCAiN0YgPCA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdlKSA8IGM4X3QoMHg3ZiksICI3RSA8IDdGIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2UpIDw9IGM4X3QoMHg3ZiksICI3RSA8IDdGIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4NDApIDwgYzhfdCgweDQwKSksICItNDAgITwgNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPD0gYzhfdCgweDQwKSksICItNDAgITw9IDQwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4NDApIDwgYzhfdCgtMHg0MCkpLCAiLTQwICE8IC00MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg0MCkgPD0gYzhfdCgtMHg0MCksICItNDAgPD0gLTQwIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KC0weDdmZmZmZmZmIC0gMSkgPiBjMl9jbnRyMzJfdCgweDdmZmZmZmZmKSwgIjgwID4gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzJfY250cjMyX3QoLTB4N2ZmZmZmZmYgLSAxKSA+IGMyX2NudHIzMl90KDApKSwgIjgwICE+IDAwIik7CisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSBjMl9jbnRyMzJfdChjMl9jbnRyNjRfdCgweDEwMDAwMDAwMXVsKSksICIxID09IDEiKTsKK30KKworY2xhc3MgQzJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoQzJUZXN0LCBDb3VudGVyVGVzdCkgeworICAgIGMyX2NudHIzMl90IGMzMl9hKDEyMyk7CisgICAgYzJfY250cjY0X3QgYzY0X2EoLTQ1Nik7CisgICAgRVhQRUNUX0VRKGMzMl9hICs9IDMsIGMyX2NudHIzMl90KDEyNikpOworICAgIEVYUEVDVF9FUShjMzJfYSArPSBjNjRfYSwgYzJfY250cjMyX3QoLTMzMCkpOworICAgIEVYUEVDVF9FUShjMzJfYSA8PD0gMnUsIGMyX2NudHIzMl90KC0xMzIwKSk7CisgICAgRVhQRUNUX0VRKGM2NF9hICo9IDMsIGMyX2NudHI2NF90KC0xMzY4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIC09IGM2NF9hLCBjMl9jbnRyMzJfdCg0OCkpOworICAgIEVYUEVDVF9FUShjMzJfYSAtPSA0MCwgYzJfY250cjMyX3QoOCkpOworICAgIEVYUEVDVF9FUShjMzJfYSAqPSBjMzJfYSwgYzJfY250cjMyX3QoNjQpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwOTk0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAKQEAgLTAsMCArMSw3NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyQnVmZmVyVXRpbHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgICAgc3RhdGljIHZvaWQgU3RhdGljU2VnbWVudFRlc3QoKSB7CisgICAgICAgIC8vIGNvbnN0cnVjdG9yCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLm9mZnNldCA9PSAxMjMsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuc2l6ZSA9PSA0NTYsICIiKTsKKworICAgICAgICAvLyBlbXB0eQorICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaXNFbXB0eSgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KS5pc0VtcHR5KCksICIiKTsKKworICAgICAgICAvLyB2YWxpZAorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pc1ZhbGlkKCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmlzVmFsaWQoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5pc1ZhbGlkKCksICIiKTsKKworICAgICAgICAvLyBib29sKCkKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCgoYm9vbClDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWJvb2woQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWJvb2woQzJTZWdtZW50KDEyM3UsIDApKSwgIiIpOworCisgICAgICAgIC8vICEKKyAgICAgICAgc3RhdGljX2Fzc2VydCghIUMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEhQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgMCksICIiKTsKKworICAgICAgICAvLyBjb250YWlucworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDApKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIydSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjR1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyNXUsIDJ1KSksICIiKTsKKworICAgICAgICAvLyA9PQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjJ1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTI0dSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID09IEMyU2VnbWVudCgxMjR1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkgPT0gQzJTZWdtZW50KDEyNHUsIDEgKyB+MTI0dSksICIiKTsKKworICAgICAgICAvLyAhPQorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIydSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyNHUsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KSAhPSBDMlNlZ21lbnQoMTI0dSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpICE9IEMyU2VnbWVudCgxMjN1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSAhPSBDMlNlZ21lbnQoMTI0dSwgMSArIH4xMjR1KSksICIiKTsKKworICAgICAgICAvLyA8PQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyNHUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAwdSkgPD0gQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMHUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPD0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPD0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gPAorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpIDwgQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDwgQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpIDwgQzJTZWdtZW50KDEyNHUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDwgQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDB1KSA8IEMyU2VnbWVudCgxMjN1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KSA8IEMyU2VnbWVudCgxMjJ1LCAxdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMHUpIDwgQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPCBDMlNlZ21lbnQoMTIydSwgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPCBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8PQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+PSBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTI0dSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID49IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPj0gQzJTZWdtZW50KDEyMnUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID49IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID49IEMyU2VnbWVudCgxMjJ1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID49IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpID49IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gPAorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID4gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID4gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyNHUsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID4gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA+IEMyU2VnbWVudCgxMjJ1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID4gQzJTZWdtZW50KDEyMnUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPiBDMlNlZ21lbnQoMTIydSwgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPiBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyBlbmQKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuZW5kKCkgPT0gNTc5dSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkuZW5kKCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuZW5kKCkgPT0gMHhmZmZmZmZmZnUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5lbmQoKSA9PSAwdSwgIiIpOworCisgICAgICAgIC8vIGludGVyc2VjdAorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTI0dSwgNDYwdSkpID09IEMyU2VnbWVudCgxMjR1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDU3OXUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoNTc5dSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoNTg5dSwgNDYwdSkpID09IEMyU2VnbWVudCg1ODl1LCB+OXUgLyogLTEwICovKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyM3UsIDQ1NXUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjJ1LCA0NTZ1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMHUsIDEyM3UpKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMHUsIDB1KSkgPT0gQzJTZWdtZW50KDEyM3UsIH4xMjJ1IC8qIC0xMjMgKi8pLCAiIik7CisKKyAgICAgICAgLy8gbm9ybWFsaXplIChjaGFuZ2UgaW52YWxpZCBzZWdtZW50cyB0byBlbXB0eSBzZWdtZW50cykKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworCisgICAgICAgIC8vIG5vdGU6IG5vcm1hbGl6ZSBjYW5ub3QgYmUgdXNlZCB0byBtYWtlIHRoaXMgd29yaworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIH4xNTB1KSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDE1MHUsIDQyOXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgMSArIH4xNTB1KSkubm9ybWFsaXplKCkgIT0gQzJTZWdtZW50KDE1MHUsIDQyOXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgMSArIH4xNTB1KSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDE1MHUsIDB1KSwgIiIpOworCisgICAgICAgIC8vIHNhdHVyYXRlIChjaGFuZ2UgaW52YWxpZCBzZWdtZW50cyB0byBmdWxsIHNlZ21lbnRzIHVwIHRvIG1heCkKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLnNhdHVyYXRlKCkgPT0gQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLnNhdHVyYXRlKCkgPT0gQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworCisgICAgICAgIC8vIG5vdGU6IHNhdHVyYXRlIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhpcyB3b3JrIGJ1dCBvbmx5IHBhcnRpYWxseQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDE1MHUsIDQyOXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMDAwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgIT0gQzJTZWdtZW50KDU3OXUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEwMDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTAwMHUsIDB1KSwgIiIpOworCisgICAgfQorCisgICAgc3RhdGljIHZvaWQgU3RhdGljTGluZWFyUmFuZ2VBbmRDYXBhY2l0eVRlc3QoKSB7CisgICAgICAgIGNsYXNzIFRlc3RDYXBhY2l0eSA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CisgICAgICAgICAgICB1c2luZyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdDo6X0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Q7CisgICAgICAgICAgICBmcmllbmQgY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVGVzdFJhbmdlIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKKyAgICAgICAgICAgIHVzaW5nIF9DMkxpbmVhclJhbmdlQXNwZWN0OjpfQzJMaW5lYXJSYW5nZUFzcGVjdDsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdDsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdAorICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eSgwdSkuY2FwYWNpdHkoKSA9PSAwdSwgIiIpOworICAgICAgICBjb25zdGV4cHIgVGVzdENhcGFjaXR5IGNhcCgxMjN1KTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkoJmNhcCkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KG51bGxwdHIpLmNhcGFjaXR5KCkgPT0gMHUsICIiKTsKKworICAgICAgICAvLyBfQzJMaW5lYXJDYXBhY2l0eVJhbmdlCisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwKS5vZmZzZXQoKSA9PSAwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwKS5zaXplKCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwKS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICAgICAgY29uc3RleHByIFRlc3RSYW5nZSByYW5nZSgmY2FwLCA1MHUsIDEwMHUpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2UuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2Uub2Zmc2V0KCkgPT0gNTB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2Uuc2l6ZSgpID09IDczdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLmVuZE9mZnNldCgpID09IDEyM3UsICIiKTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5vZmZzZXQoKSA9PSAyMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLnNpemUoKSA9PSAzMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLmVuZE9mZnNldCgpID09IDUwdSwgIiIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkub2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLnNpemUoKSA9PSAwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLmVuZE9mZnNldCgpID09IDEyM3UsICIiKTsKKworICAgIH0KKworfTsKKworCitjbGFzcyBDMkJ1ZmZlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBDMkJ1ZmZlclRlc3QoKQorICAgICAgICA6IG1CbG9ja1Bvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAorICAgICAgICAgIG1MaW5lYXJBbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcklvbj4oJ2knKSksCisgICAgICAgICAgbVNpemUoMHUpLAorICAgICAgICAgIG1BZGRyKG51bGxwdHIpLAorICAgICAgICAgIG1HcmFwaGljQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPignZycpKSB7CisgICAgfQorCisgICAgfkMyQnVmZmVyVGVzdCgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWxsb2NhdGVMaW5lYXIoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1MaW5lYXJBbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgbUxpbmVhckFsbG9jYXRpb24ucmVzZXQoKTsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJBbGxvY2F0b3I6Om5ld0xpbmVhckFsbG9jYXRpb24oKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBtYXBMaW5lYXIoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ4X3QgKiphZGRyKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1MaW5lYXJBbGxvY2F0aW9uKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUxpbmVhckFsbG9jYXRpb24tPm1hcCgKKyAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgJm1BZGRyKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgbUFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkxpbmVhckFsbG9jYXRpb246Om1hcCgpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX05FKG51bGxwdHIsIG1BZGRyKTsKKyAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICAqYWRkciA9ICh1aW50OF90ICopbUFkZHI7CisgICAgfQorCisgICAgdm9pZCB1bm1hcExpbmVhcigpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgbUFkZHIpOworICAgICAgICBBU1NFUlRfTkUoMHUsIG1TaXplKTsKKworICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICBBU1NFUlRfRVEoQzJfT0ssIG1MaW5lYXJBbGxvY2F0aW9uLT51bm1hcChtQWRkciwgbVNpemUsIG51bGxwdHIpKTsKKyAgICAgICAgbVNpemUgPSAwdTsKKyAgICAgICAgbUFkZHIgPSBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbWFrZUxpbmVhckJsb2NrUG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICB9CisKKyAgICB2b2lkIGFsbG9jYXRlR3JhcGhpYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1HcmFwaGljQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRpb24pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtR3JhcGhpY0FsbG9jYXRpb24ucmVzZXQoKTsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJBbGxvY2F0b3I6Om5ld0dyYXBoaWNBbGxvY2F0aW9uKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbWFwR3JhcGhpYyhDMlJlY3QgcmVjdCwgQzJQbGFuYXJMYXlvdXQgKmxheW91dCwgdWludDhfdCAqKmFkZHIpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUdyYXBoaWNBbGxvY2F0aW9uKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNBbGxvY2F0aW9uLT5tYXAoCisgICAgICAgICAgICAgICAgcmVjdCwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgICAgICAgICAgICAgIGFkZHIpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IG51bGxwdHI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IG51bGxwdHI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IG51bGxwdHI7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyR3JhcGhpY0FsbG9jYXRpb246Om1hcCgpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbU1hcHBlZFJlY3QgPSByZWN0OworICAgICAgICBtZW1jcHkobUFkZHJHcmFwaGljLCBhZGRyLCBzaXplb2YodWludDhfdCopICogQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTKTsKKyAgICB9CisKKyAgICB2b2lkIHVubWFwR3JhcGhpYygpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUdyYXBoaWNBbGxvY2F0aW9uKTsKKworICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICBBU1NFUlRfRVEoQzJfT0ssIG1HcmFwaGljQWxsb2NhdGlvbi0+dW5tYXAobUFkZHJHcmFwaGljLCBtTWFwcGVkUmVjdCwgbnVsbHB0cikpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbWFrZUdyYXBoaWNCbG9ja1Bvb2woKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNHcmFwaGljQmxvY2tQb29sPihtR3JhcGhpY0FsbG9jYXRvcik7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUxpbmVhckFsbG9jYXRpb247CisgICAgc2l6ZV90IG1TaXplOworICAgIHZvaWQgKm1BZGRyOworICAgIEMyUmVjdCBtTWFwcGVkUmVjdDsKKyAgICB1aW50OF90KiBtQWRkckdyYXBoaWNbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUdyYXBoaWNBbGxvY2F0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1HcmFwaGljQWxsb2NhdGlvbjsKK307CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIExpbmVhckFsbG9jYXRpb25UZXN0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSAxMDI0dSAqIDEwMjR1OworCisgICAgYWxsb2NhdGVMaW5lYXIoa0NhcGFjaXR5KTsKKworICAgIHVpbnQ4X3QgKmFkZHIgPSBudWxscHRyOworICAgIG1hcExpbmVhcigwdSwga0NhcGFjaXR5LCAmYWRkcik7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ2FwYWNpdHk7ICsraSkgeworICAgICAgICBhZGRyW2ldID0gaSAlIDEwMHU7CisgICAgfQorCisgICAgdW5tYXBMaW5lYXIoKTsKKyAgICBhZGRyID0gbnVsbHB0cjsKKworICAgIG1hcExpbmVhcihrQ2FwYWNpdHkgLyAzLCBrQ2FwYWNpdHkgLyAzLCAmYWRkcik7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0NhcGFjaXR5IC8gMzsgKytpKSB7CisgICAgICAgIEFTU0VSVF9FUSgoaSArIGtDYXBhY2l0eSAvIDMpICUgMTAwLCBhZGRyW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGk7CisgICAgfQorfQorCitURVNUX0YoQzJCdWZmZXJUZXN0LCBCbG9ja1Bvb2xUZXN0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSAxMDI0dSAqIDEwMjR1OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eSwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiB3cml0ZVZpZXdIb2xkZXIgPSBibG9jay0+bWFwKCk7CisgICAgQzJXcml0ZVZpZXcgd3JpdGVWaWV3ID0gd3JpdGVWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgd3JpdGVWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHksIHdyaXRlVmlldy5jYXBhY2l0eSgpKTsKKyAgICBBU1NFUlRfRVEoMHUsIHdyaXRlVmlldy5vZmZzZXQoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSwgd3JpdGVWaWV3LnNpemUoKSk7CisKKyAgICB1aW50OF90ICpkYXRhID0gd3JpdGVWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3cml0ZVZpZXcuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZGF0YVtpXSA9IGkgJSAxMDB1OworICAgIH0KKworICAgIHdyaXRlVmlldy5zZXRPZmZzZXQoa0NhcGFjaXR5IC8gMyk7CisgICAgZGF0YSA9IHdyaXRlVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd3JpdGVWaWV3LnNpemUoKTsgKytpKSB7CisgICAgICAgIEFTU0VSVF9FUSgoaSArIGtDYXBhY2l0eSAvIDMpICUgMTAwdSwgZGF0YVtpXSkgPDwgIiBhdCBpID0gIiA8PCBpCisgICAgICAgICAgICA8PCAiOyBkYXRhID0gIiA8PCBzdGF0aWNfY2FzdDx2b2lkICo+KGRhdGEpOworICAgIH0KKworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgQzJDb25zdExpbmVhckJsb2NrIGNvbnN0QmxvY2sgPSBibG9jay0+c2hhcmUoCisgICAgICAgICAgICBrQ2FwYWNpdHkgLyAzLCBrQ2FwYWNpdHkgLyAzLCBmZW5jZSk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4gcmVhZFZpZXdIb2xkZXIgPSBjb25zdEJsb2NrLm1hcCgpOworICAgIEMyUmVhZFZpZXcgcmVhZFZpZXcgPSByZWFkVmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHJlYWRWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAzLCByZWFkVmlldy5jYXBhY2l0eSgpKTsKKworICAgIC8vIFRPRE86IGZlbmNlCisgICAgY29uc3QgdWludDhfdCAqY29uc3REYXRhID0gcmVhZFZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb25zdERhdGEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZFZpZXcuY2FwYWNpdHkoKTsgKytpKSB7CisgICAgICAgIEFTU0VSVF9FUSgoaSArIGtDYXBhY2l0eSAvIDMpICUgMTAwdSwgY29uc3REYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGkKKyAgICAgICAgICAgICAgICA8PCAiOyBkYXRhID0gIiA8PCBzdGF0aWNfY2FzdDx2b2lkICo+KGRhdGEpCisgICAgICAgICAgICAgICAgPDwgIjsgY29uc3REYXRhID0gIiA8PCBzdGF0aWNfY2FzdDxjb25zdCB2b2lkICo+KGNvbnN0RGF0YSk7CisgICAgfQorCisgICAgcmVhZFZpZXcgPSByZWFkVmlldy5zdWJWaWV3KDMzM3UsIDEwMHUpOworICAgIEFTU0VSVF9FUShDMl9PSywgcmVhZFZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKDEwMHUsIHJlYWRWaWV3LmNhcGFjaXR5KCkpOworCisgICAgY29uc3REYXRhID0gcmVhZFZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb25zdERhdGEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZFZpZXcuY2FwYWNpdHkoKTsgKytpKSB7CisgICAgICAgIEFTU0VSVF9FUSgoaSArIDMzM3UgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGNvbnN0RGF0YVtpXSkgPDwgIiBhdCBpID0gIiA8PCBpOworICAgIH0KK30KKwordm9pZCBmaWxsUGxhbmUoY29uc3QgQzJSZWN0IHJlY3QsIGNvbnN0IEMyUGxhbmVJbmZvIGluZm8sIHVpbnQ4X3QgKmFkZHIsIHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHJlY3QuaGVpZ2h0IC8gaW5mby5yb3dTYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgaW50MzJfdCByb3dPZmZzZXQgPSAocm93ICsgcmVjdC50b3AgLyBpbmZvLnJvd1NhbXBsaW5nKSAqIGluZm8ucm93SW5jOworICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHJlY3Qud2lkdGggLyBpbmZvLmNvbFNhbXBsaW5nOyArK2NvbCkgeworICAgICAgICAgICAgaW50MzJfdCBjb2xPZmZzZXQgPSAoY29sICsgcmVjdC5sZWZ0IC8gaW5mby5jb2xTYW1wbGluZykgKiBpbmZvLmNvbEluYzsKKyAgICAgICAgICAgIGFkZHJbcm93T2Zmc2V0ICsgY29sT2Zmc2V0XSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCitib29sIHZlcmlmeVBsYW5lKGNvbnN0IEMyUmVjdCByZWN0LCBjb25zdCBDMlBsYW5lSW5mbyBpbmZvLCBjb25zdCB1aW50OF90ICphZGRyLCB1aW50OF90IHZhbHVlKSB7CisgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCByZWN0LmhlaWdodCAvIGluZm8ucm93U2FtcGxpbmc7ICsrcm93KSB7CisgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0ID0gKHJvdyArIHJlY3QudG9wIC8gaW5mby5yb3dTYW1wbGluZykgKiBpbmZvLnJvd0luYzsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCByZWN0LndpZHRoIC8gaW5mby5jb2xTYW1wbGluZzsgKytjb2wpIHsKKyAgICAgICAgICAgIGludDMyX3QgY29sT2Zmc2V0ID0gKGNvbCArIHJlY3QubGVmdCAvIGluZm8uY29sU2FtcGxpbmcpICogaW5mby5jb2xJbmM7CisgICAgICAgICAgICBpZiAoYWRkcltyb3dPZmZzZXQgKyBjb2xPZmZzZXRdICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitURVNUX0YoQzJCdWZmZXJUZXN0LCBHcmFwaGljQWxsb2NhdGlvblRlc3QpIHsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0ID0gMjQwOworCisgICAgYWxsb2NhdGVHcmFwaGljKGtXaWR0aCwga0hlaWdodCk7CisKKyAgICB1aW50OF90ICphZGRyW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgQzJSZWN0IHJlY3Qoa1dpZHRoLCBrSGVpZ2h0KTsKKyAgICBDMlBsYW5hckxheW91dCBsYXlvdXQ7CisgICAgbWFwR3JhcGhpYyhyZWN0LCAmbGF5b3V0LCBhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKworICAgIHVpbnQ4X3QgKnkgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBDMlBsYW5lSW5mbyB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHVpbnQ4X3QgKnUgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBDMlBsYW5lSW5mbyB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVpbnQ4X3QgKnYgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICBDMlBsYW5lSW5mbyB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgZmlsbFBsYW5lKHJlY3QsIHlJbmZvLCB5LCAwKTsKKyAgICBmaWxsUGxhbmUocmVjdCwgdUluZm8sIHUsIDApOworICAgIGZpbGxQbGFuZShyZWN0LCB2SW5mbywgdiwgMCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgeSwgMHgxMik7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgdSwgMHgzNCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgdiwgMHg1Nik7CisKKyAgICB1bm1hcEdyYXBoaWMoKTsKKworICAgIG1hcEdyYXBoaWMocmVjdCwgJmxheW91dCwgYWRkcik7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisKKyAgICB5ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgeUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB1ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB2ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgeSwgMHgxMikpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgdSwgMHgzNCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgdiwgMHg1NikpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB5SW5mbywgeSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB1SW5mbywgdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB2SW5mbywgdiwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB5SW5mbywgeSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB1SW5mbywgdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB2SW5mbywgdiwgMCkpOworfQorCitURVNUX0YoQzJCdWZmZXJUZXN0LCBHcmFwaGljQmxvY2tQb29sVGVzdCkgeworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbChtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgQVNTRVJUX0VRKEMyX09LLCBibG9ja1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoLAorICAgICAgICAgICAga0hlaWdodCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IGdyYXBoaWNWaWV3SG9sZGVyID0gYmxvY2stPm1hcCgpOworICAgIEMyR3JhcGhpY1ZpZXcgZ3JhcGhpY1ZpZXcgPSBncmFwaGljVmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGdyYXBoaWNWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrV2lkdGgsIGdyYXBoaWNWaWV3LndpZHRoKCkpOworICAgIEFTU0VSVF9FUShrSGVpZ2h0LCBncmFwaGljVmlldy5oZWlnaHQoKSk7CisKKyAgICB1aW50OF90ICpjb25zdCAqZGF0YSA9IGdyYXBoaWNWaWV3LmRhdGEoKTsKKyAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSBncmFwaGljVmlldy5sYXlvdXQoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisKKyAgICB1aW50OF90ICp5ID0gZGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgQzJQbGFuZUluZm8geUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB1aW50OF90ICp1ID0gZGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgQzJQbGFuZUluZm8gdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1aW50OF90ICp2ID0gZGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgQzJQbGFuZUluZm8gdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB5SW5mbywgeSwgMCk7CisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHVJbmZvLCB1LCAwKTsKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgdkluZm8sIHYsIDApOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpOworCisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIGNvbnN0QmxvY2sgPSBibG9jay0+c2hhcmUoQzJSZWN0KGtXaWR0aCwga0hlaWdodCksIGZlbmNlKTsKKyAgICBibG9jay5yZXNldCgpOworCisgICAgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IGNvbnN0Vmlld0hvbGRlciA9IGNvbnN0QmxvY2subWFwKCk7CisgICAgY29uc3QgQzJHcmFwaGljVmlldyBjb25zdEdyYXBoaWNWaWV3ID0gY29uc3RWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgY29uc3RHcmFwaGljVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa1dpZHRoLCBjb25zdEdyYXBoaWNWaWV3LndpZHRoKCkpOworICAgIEFTU0VSVF9FUShrSGVpZ2h0LCBjb25zdEdyYXBoaWNWaWV3LmhlaWdodCgpKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0ICpjb25zdERhdGEgPSBjb25zdEdyYXBoaWNWaWV3LmRhdGEoKTsKKyAgICBsYXlvdXQgPSBncmFwaGljVmlldy5sYXlvdXQoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmN5ID0gY29uc3REYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIGNvbnN0IHVpbnQ4X3QgKmN1ID0gY29uc3REYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIGNvbnN0IHVpbnQ4X3QgKmN2ID0gY29uc3REYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCBjeSwgMHgxMikpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgY3UsIDB4MzQpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIGN2LCAweDU2KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHlJbmZvLCBjeSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB1SW5mbywgY3UsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdkluZm8sIGN2LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHlJbmZvLCBjeSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB1SW5mbywgY3UsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdkluZm8sIGN2LCAwKSk7Cit9CisKK2NsYXNzIEJ1ZmZlckRhdGEgOiBwdWJsaWMgQzJCdWZmZXJEYXRhIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBDMkJ1ZmZlckRhdGEoYmxvY2tzKSB7fQorICAgIGV4cGxpY2l0IEJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykgOiBDMkJ1ZmZlckRhdGEoYmxvY2tzKSB7fQorfTsKKworY2xhc3MgQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyKGJsb2Nrcykge30KKyAgICBleHBsaWNpdCBCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykgOiBDMkJ1ZmZlcihibG9ja3MpIHt9Cit9OworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBCdWZmZXJEYXRhVGVzdCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbGluZWFyQmxvY2tQb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBncmFwaGljQmxvY2tQb29sKG1ha2VHcmFwaGljQmxvY2tQb29sKCkpOworCisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aDEgPSAzMjA7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQxID0gMjQwOworICAgIGNvbnN0ZXhwciBDMlJlY3Qga0Nyb3AxKGtXaWR0aDEsIGtIZWlnaHQxKTsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoMiA9IDE3NjsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodDIgPSAxNDQ7CisgICAgY29uc3RleHByIEMyUmVjdCBrQ3JvcDIoa1dpZHRoMiwga0hlaWdodDIpOworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5MSA9IDEwMjR1OworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5MiA9IDIwNDh1OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhckJsb2NrMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2syOworICAgIEFTU0VSVF9FUShDMl9PSywgbGluZWFyQmxvY2tQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5MSwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmxpbmVhckJsb2NrMSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgbGluZWFyQmxvY2tQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5MiwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmxpbmVhckJsb2NrMikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWNCbG9jazI7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljQmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aDEsCisgICAgICAgICAgICBrSGVpZ2h0MSwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmdyYXBoaWNCbG9jazEpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGdyYXBoaWNCbG9ja1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoMiwKKyAgICAgICAgICAgIGtIZWlnaHQyLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmZ3JhcGhpY0Jsb2NrMikpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyRGF0YT4gZGF0YShuZXcgQnVmZmVyRGF0YSh7IGxpbmVhckJsb2NrMS0+c2hhcmUoMCwga0NhcGFjaXR5MSwgQzJGZW5jZSgpKSB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6TElORUFSLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxdSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEobGluZWFyQmxvY2sxLT5oYW5kbGUoKSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLmVtcHR5KCkpOworCisgICAgZGF0YS5yZXNldChuZXcgQnVmZmVyRGF0YSh7CisgICAgICAgIGxpbmVhckJsb2NrMS0+c2hhcmUoMCwga0NhcGFjaXR5MSwgQzJGZW5jZSgpKSwKKyAgICAgICAgbGluZWFyQmxvY2syLT5zaGFyZSgwLCBrQ2FwYWNpdHkyLCBDMkZlbmNlKCkpLAorICAgIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVJfQ0hVTktTLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgydSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEobGluZWFyQmxvY2sxLT5oYW5kbGUoKSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMi0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmJhY2soKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLmVtcHR5KCkpOworCisgICAgZGF0YS5yZXNldChuZXcgQnVmZmVyRGF0YSh7IGdyYXBoaWNCbG9jazEtPnNoYXJlKGtDcm9wMSwgQzJGZW5jZSgpKSB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6R1JBUEhJQywgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShncmFwaGljQmxvY2sxLT5oYW5kbGUoKSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmxpbmVhckJsb2NrcygpLmVtcHR5KCkpOworCisgICAgZGF0YS5yZXNldChuZXcgQnVmZmVyRGF0YSh7CisgICAgICAgIGdyYXBoaWNCbG9jazEtPnNoYXJlKGtDcm9wMSwgQzJGZW5jZSgpKSwKKyAgICAgICAgZ3JhcGhpY0Jsb2NrMi0+c2hhcmUoa0Nyb3AyLCBDMkZlbmNlKCkpLAorICAgIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUywgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMnUsIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShncmFwaGljQmxvY2sxLT5oYW5kbGUoKSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9FUShncmFwaGljQmxvY2syLT5oYW5kbGUoKSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLmJhY2soKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+bGluZWFyQmxvY2tzKCkuZW1wdHkoKSk7Cit9CisKK3ZvaWQgRGVzdHJveUNhbGxiYWNrKGNvbnN0IEMyQnVmZmVyICogLyogYnVmICovLCB2b2lkICphcmcpIHsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+ICpjYiA9IChzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+ICopYXJnOworICAgICgqY2IpKCk7Cit9CisKK2VudW0gOiB1aW50MzJfdCB7CisgICAga1BhcmFtSW5kZXhOdW1iZXIxLAorICAgIGtQYXJhbUluZGV4TnVtYmVyMiwKK307CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXIxPiBDMk51bWJlcjFJbmZvOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcjI+IEMyTnVtYmVyMkluZm87CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJ1ZmZlclRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGFsbG9jKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSAxMDI0dTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGFsbG9jLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgZGVzdHJveWVkKGZhbHNlKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IGFyZyA9IFsmZGVzdHJveWVkXSgpeyBkZXN0cm95ZWQgPSB0cnVlOyB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIobmV3IEJ1ZmZlciggeyBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5LCBDMkZlbmNlKCkpIH0pKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworICAgIEFTU0VSVF9FUShDMl9EVVBMSUNBVEUsIGJ1ZmZlci0+cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIGJ1ZmZlci5yZXNldCgpOworICAgIEVYUEVDVF9UUlVFKGRlc3Ryb3llZCk7CisKKyAgICBidWZmZXIucmVzZXQobmV3IEJ1ZmZlciggeyBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5LCBDMkZlbmNlKCkpIH0pKTsKKyAgICBkZXN0cm95ZWQgPSBmYWxzZTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+cmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworICAgIEFTU0VSVF9FUShDMl9OT1RfRk9VTkQsIGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCBudWxscHRyKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworICAgIEFTU0VSVF9FUShDMl9OT1RfRk9VTkQsIGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMShuZXcgQzJOdW1iZXIxSW5mbygxKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzIobmV3IEMyTnVtYmVyMkluZm8oMikpOworICAgIGJ1ZmZlci5yZXNldChuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aW5mbygpLmVtcHR5KCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzEpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKCppbmZvMSwgKmJ1ZmZlci0+aW5mbygpLmZyb250KCkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+c2V0SW5mbyhpbmZvMikpOworICAgIEVYUEVDVF9FUSgydSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiByZW1vdmVkID0gYnVmZmVyLT5yZW1vdmVJbmZvKGluZm8xLT50eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgqcmVtb3ZlZCwgKmluZm8xKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKCppbmZvMiwgKmJ1ZmZlci0+aW5mbygpLmZyb250KCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICByZW1vdmVkID0gYnVmZmVyLT5yZW1vdmVJbmZvKGluZm8xLT50eXBlKCkpOworICAgIEFTU0VSVF9GQUxTRShyZW1vdmVkKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8zKG5ldyBDMk51bWJlcjJJbmZvKDMpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+c2V0SW5mbyhpbmZvMykpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMi0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShyZW1vdmVkKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8zLCAqcmVtb3ZlZCk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5pbmZvKCkuZW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIE11bHRpcGxlTGluZWFyTWFwVGVzdCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gNTI0Mjg4dTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyV3JpdGVWaWV3PiB3Vmlld3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUmVhZFZpZXc+IHJWaWV3czsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssIHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGtDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICAgICAgd1ZpZXdzLnB1c2hfYmFjayhibG9jay0+bWFwKCkuZ2V0KCkpOworICAgICAgICAgICAgQzJDb25zdExpbmVhckJsb2NrIGNCbG9jayA9IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHkgLyAyLCBDMkZlbmNlKCkpOworICAgICAgICAgICAgclZpZXdzLnB1c2hfYmFjayhjQmxvY2subWFwKCkuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGIxMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMiBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2ludGVybmFsIiwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImludGVybmFsIiwKKyAgICBdLAorCisgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiB0aGlzIG1vZHVsZSBpcyBtb3ZlZCBiYWNrIHRvIGZyYW1ld29ya3MvYXYuCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKworLy8gISEhRE8gTk9UIERFUEVORCBPTiBUSElTIFNIQVJFRCBMSUJSQVJZIERJUkVDVExZISEhCisvLyB1c2UgbGliY29kZWMyLWltcGwtZGVmYXVsdHMgaW5zdGVhZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfdm5kayIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQWxsb2NhdG9ySW9uLmNwcCIsCisgICAgICAgICJDMkFsbG9jYXRvckdyYWxsb2MuY3BwIiwKKyAgICAgICAgIkMyQnVmZmVyLmNwcCIsCisgICAgICAgICJDMkNvbmZpZy5jcHAiLAorICAgICAgICAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcCIsCisgICAgICAgICJDMlN0b3JlLmNwcCIsCisgICAgICAgICJwbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCIsCisgICAgICAgICJ1dGlsL0MyRGVidWcuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAiLAorICAgICAgICAidXRpbC9DMlBhcmFtVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGNvbXBvbmVudHMKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWltcGwtZGVmYXVsdHMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLCAvLyBmb3IgQzJfTE9HCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgZnJhbWV3b3JrIHV0aWxpdGllcworLy8gVEhJUyBJUyBPTkxZIEZPUiBGUkFNRVdPUksgVVNFIE9OTFkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWludGVybmFsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgXSwKKworICAgIC8vIFRPRE86IHNlcGFyYXRlIGludGVybmFsIGhlYWRlcnMgc28gdGhleSBjYW4gYmUgZXhwb3NlZCBoZXJlCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Nzg5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCkBAIC0wLDAgKzEsODE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvckdyYWxsb2MiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2FsbG9jYXRvci8yLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvbWFwcGVyLzIuMC9JTWFwcGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBlbnVtIDogdWludDY0X3QgeworICAgICAgICAvKioKKyAgICAgICAgICogVXNhZ2UgbWFzayB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIGZyb20gZ3JhbGxvYyB0byBDb2RlYyAyLjAgdXNhZ2UuCisgICAgICAgICAqLworICAgICAgICBQQVNTVEhST1VHSF9VU0FHRV9NQVNLID0KKyAgICAgICAgICAgIH4oR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0sgfCBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkKKyAgICB9OworCisgICAgLy8gdmVyaWZ5IHRoYXQgcGFzc3Rocm91Z2ggbWFzayBpcyB3aXRoaW4gdGhlIHBsYXRmb3JtIG1hc2sKKyAgICBzdGF0aWNfYXNzZXJ0KCh+QzJNZW1vcnlVc2FnZTo6UExBVEZPUk1fTUFTSyAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spID09IDAsICIiKTsKK30KKworQzJNZW1vcnlVc2FnZSBDMkFuZHJvaWRNZW1vcnlVc2FnZTo6RnJvbUdyYWxsb2NVc2FnZSh1aW50NjRfdCB1c2FnZSkgeworICAgIC8vIGdyYWxsb2MgZG9lcyBub3Qgc3VwcG9ydCBXUklURV9QUk9URUNURUQKKyAgICByZXR1cm4gQzJNZW1vcnlVc2FnZSgKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgPyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCA6IDApIHwKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0spID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIDogMCkgfAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKSA/IEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVEIDogMCkgfAorICAgICAgICAgICAgKHVzYWdlICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykpOworfQorCit1aW50NjRfdCBDMkFuZHJvaWRNZW1vcnlVc2FnZTo6YXNHcmFsbG9jVXNhZ2UoKSBjb25zdCB7CisgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBzdXBwb3J0IFdSSVRFX1BST1RFQ1RFRAorICAgIHJldHVybiAoKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSA/IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6IDApIHwKKyAgICAgICAgICAgICgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpID8gR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiA6IDApIHwKKyAgICAgICAgICAgICgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCkgPyBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCA6IDApIHwKKyAgICAgICAgICAgIChleHBlY3RlZCAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spKTsKK30KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmFsbG9jYXRvcjo6VjJfMDo6SUFsbG9jYXRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkJ1ZmZlclVzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpCdWZmZXJEZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6RXJyb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpJTWFwcGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6WUNiQ3JMYXlvdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQnVmZmVyRGVzY3JpcHRvckluZm8geworICAgIElNYXBwZXI6OkJ1ZmZlckRlc2NyaXB0b3JJbmZvIG1hcHBlckluZm87CisgICAgdWludDMyX3Qgc3RyaWRlOworfTsKKworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdSQUxMT0MgQUxMT0NBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBjMl9zdGF0dXNfdCBtYXBlcnIyZXJyb3IoRXJyb3IgbWFwZXJyKSB7CisgICAgc3dpdGNoIChtYXBlcnIpIHsKKyAgICAgICAgY2FzZSBFcnJvcjo6Tk9ORTogICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX0RFU0NSSVBUT1I6IHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9CVUZGRVI6ICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpCQURfVkFMVUU6ICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6Tk9fUkVTT1VSQ0VTOiAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIGNhc2UgRXJyb3I6OlVOU1VQUE9SVEVEOiAgICByZXR1cm4gQzJfQ0FOTk9UX0RPOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitzdGF0aWMKK2Jvb2wgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlKSB7CisgICAgLy8gcGVyZm9ybSBiYXNpYyB2YWxpZGF0aW9uIG9mIGEgbmF0aXZlIGhhbmRsZQorICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBudWxsIGhhbmRsZSBpcyBjb25zaWRlcmVkIHZhbGlkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICgoc2l6ZV90KWhhbmRsZS0+dmVyc2lvbiAhPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KSB8fAorICAgICAgICAgICAgaGFuZGxlLT5udW1GZHMgPCAwIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUludHMgPCAwIHx8CisgICAgICAgICAgICAvLyBmb3Igc2FuaXR5IGFzc3VtZSBoYW5kbGVzIG11c3Qgb2NjdXB5IGxlc3MgbWVtb3J5IHRoYW4gSU5UX01BWCBieXRlcworICAgICAgICAgICAgaGFuZGxlLT5udW1GZHMgPiBpbnQoKElOVF9NQVggLSBoYW5kbGUtPnZlcnNpb24pIC8gc2l6ZW9mKGludCkpIC0gaGFuZGxlLT5udW1JbnRzKTsKK30KKworY2xhc3MgQzJIYW5kbGVHcmFsbG9jIDogcHVibGljIEMySGFuZGxlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IEV4dHJhRGF0YSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfbG87CisgICAgICAgIHVpbnQzMl90IHVzYWdlX2hpOworICAgICAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQzMl90IGlnYnBfaWRfbG87CisgICAgICAgIHVpbnQzMl90IGlnYnBfaWRfaGk7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICAgICAgdWludDMyX3QgbWFnaWM7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBOVU1fSU5UUyA9IHNpemVvZihFeHRyYURhdGEpIC8gc2l6ZW9mKGludCksCisgICAgfTsKKyAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFHSUMgPSAnXHhjMmdyXHgwMCc7CisKKyAgICBzdGF0aWMKKyAgICBjb25zdCBFeHRyYURhdGEqIGdldEV4dHJhRGF0YShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgIHx8IG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChoYW5kbGUpCisgICAgICAgICAgICAgICAgfHwgaGFuZGxlLT5udW1JbnRzIDwgTlVNX0lOVFMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEV4dHJhRGF0YSo+KAorICAgICAgICAgICAgICAgICZoYW5kbGUtPmRhdGFbaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UU10pOworICAgIH0KKworICAgIHN0YXRpYworICAgIEV4dHJhRGF0YSAqZ2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KGdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOworICAgIH0KKworcHVibGljOgorICAgIHZvaWQgZ2V0SWdicERhdGEodWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSBjb25zdCB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEodGhpcyk7CisgICAgICAgICpnZW5lcmF0aW9uID0gZWQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoZWQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoZWQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKKyAgICAgICAgKmlnYnBfc2xvdCA9IGVkLT5pZ2JwX3Nsb3Q7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqY29uc3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxscHRyKSB7IC8vIG51bGwgaGFuZGxlIGlzIGFsd2F5cyB2YWxpZAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShvKTsKKyAgICAgICAgLy8gd2UgY2Fubm90IHZhbGlkYXRlIHdpZHRoL2hlaWdodC9mb3JtYXQvdXNhZ2Ugd2l0aG91dCBhY2Nlc3NpbmcgZ3JhbGxvYyBkcml2ZXIKKyAgICAgICAgcmV0dXJuIHhkICE9IG51bGxwdHIgJiYgeGQtPm1hZ2ljID09IE1BR0lDOworICAgIH0KKworICAgIHN0YXRpYyBDMkhhbmRsZUdyYWxsb2MqIFdyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIC8vQ0hFQ0soaGFuZGxlICE9IG51bGxwdHIpOworICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBOVU1fSU5UUyAtIGhhbmRsZS0+bnVtRmRzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBFeHRyYURhdGEgeGQgPSB7CisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVpbnQzMl90KHVzYWdlICYgMHhGRkZGRkZGRiksIHVpbnQzMl90KHVzYWdlID4+IDMyKSwKKyAgICAgICAgICAgIHN0cmlkZSwgZ2VuZXJhdGlvbiwgdWludDMyX3QoaWdicF9pZCAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdChpZ2JwX2lkID4+IDMyKSwKKyAgICAgICAgICAgIGlnYnBfc2xvdCwgTUFHSUMKKyAgICAgICAgfTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOworICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIYW5kbGVHcmFsbG9jICo+KHJlcyk7CisgICAgfQorCisgICAgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCogVW53cmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChyZXMtPm51bUZkcyArIHJlcy0+bnVtSW50cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCogVW53cmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgKmdlbmVyYXRpb24gPSB4ZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB1bnNpZ25lZCh4ZC0+aWdicF9pZF9sbykgfCB1aW50NjRfdCh1bnNpZ25lZCh4ZC0+aWdicF9pZF9oaSkpIDw8IDMyOworICAgICAgICAqaWdicF9zbG90ID0geGQtPmlnYnBfc2xvdDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChyZXMtPm51bUZkcyArIHJlcy0+bnVtSW50cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IEMySGFuZGxlR3JhbGxvYyogSW1wb3J0KAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAqd2lkdGggPSB4ZC0+d2lkdGg7CisgICAgICAgICpoZWlnaHQgPSB4ZC0+aGVpZ2h0OworICAgICAgICAqZm9ybWF0ID0geGQtPmZvcm1hdDsKKyAgICAgICAgKnVzYWdlID0geGQtPnVzYWdlX2xvIHwgKHVpbnQ2NF90KHhkLT51c2FnZV9oaSkgPDwgMzIpOworICAgICAgICAqc3RyaWRlID0geGQtPnN0cmlkZTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSB4ZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB4ZC0+aWdicF9pZF9sbyB8ICh1aW50NjRfdCh4ZC0+aWdicF9pZF9oaSkgPDwgMzIpOworICAgICAgICAqaWdicF9zbG90ID0geGQtPmlnYnBfc2xvdDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGVHcmFsbG9jICo+KGhhbmRsZSk7CisgICAgfQorfTsKKworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoaGFuZGxlKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoaGFuZGxlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQsIHVpbnQzMl90IGlnYnBfc2xvdCkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OldyYXBOYXRpdmVIYW5kbGUoaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitjbGFzcyBDMkFsbG9jYXRpb25HcmFsbG9jIDogcHVibGljIEMyR3JhcGhpY0FsbG9jYXRpb24geworcHVibGljOgorICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbkdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUFsbG9jYXRvcklkOyB9CisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUxvY2tlZEhhbmRsZSA/IDogbUhhbmRsZTsgfQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisgICAgLy8gfGhhbmRsZXwgd2lsbCBiZSBtb3ZlZC4KKyAgICBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyAmaW5mbywKKyAgICAgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcj4gJm1hcHBlciwKKyAgICAgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCk7CisgICAgaW50IGR1cCgpIGNvbnN0OworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvIG1JbmZvOworICAgIGNvbnN0IHNwPElNYXBwZXI+IG1NYXBwZXI7CisgICAgY29uc3QgaGlkbF9oYW5kbGUgbUhpZGxIYW5kbGU7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICptSGFuZGxlOworICAgIGJ1ZmZlcl9oYW5kbGVfdCBtQnVmZmVyOworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqbUxvY2tlZEhhbmRsZTsKKyAgICBib29sIG1Mb2NrZWQ7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgbUFsbG9jYXRvcklkOworICAgIHN0ZDo6bXV0ZXggbU1hcHBlZExvY2s7Cit9OworCitDMkFsbG9jYXRpb25HcmFsbG9jOjpDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvICZpbmZvLAorICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXI+ICZtYXBwZXIsCisgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpCisgICAgOiBDMkdyYXBoaWNBbGxvY2F0aW9uKGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCksCisgICAgICBtSW5mbyhpbmZvKSwKKyAgICAgIG1NYXBwZXIobWFwcGVyKSwKKyAgICAgIG1IaWRsSGFuZGxlKHN0ZDo6bW92ZShoaWRsSGFuZGxlKSksCisgICAgICBtSGFuZGxlKGhhbmRsZSksCisgICAgICBtQnVmZmVyKG51bGxwdHIpLAorICAgICAgbUxvY2tlZEhhbmRsZShudWxscHRyKSwKKyAgICAgIG1Mb2NrZWQoZmFsc2UpLAorICAgICAgbUFsbG9jYXRvcklkKGFsbG9jYXRvcklkKSB7Cit9CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6On5DMkFsbG9jYXRpb25HcmFsbG9jKCkgeworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtTG9ja2VkKSB7CisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgYWRkcmVzc3MgYW5kIHJlY3QKKyAgICAgICAgdWludDhfdCogYWRkcltDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdID0ge307CisgICAgICAgIHVubWFwKGFkZHIsIEMyUmVjdCgpLCBudWxscHRyKTsKKyAgICB9CisgICAgbU1hcHBlci0+ZnJlZUJ1ZmZlcihjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4obUhhbmRsZSkpKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6bWFwKAorICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigibWFwcGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgLy8gVE9ETworICAgICh2b2lkKSBmZW5jZTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICBpZiAobUJ1ZmZlciAmJiBtTG9ja2VkKSB7CisgICAgICAgIEFMT0dEKCJhbHJlYWR5IG1hcHBlZCIpOworICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIH0KKyAgICBpZiAoIWxheW91dCB8fCAhYWRkcikgeworICAgICAgICBBTE9HRCgid3JvbmcgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgbU1hcHBlci0+aW1wb3J0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1IaWRsSGFuZGxlLCBbJmVyciwgdGhpc10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBzdGF0aWNfY2FzdDxidWZmZXJfaGFuZGxlX3Q+KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImltcG9ydEJ1ZmZlciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImltcG9ydEJ1ZmZlciByZXR1cm5lZCBudWxsIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgdWludDY0X3QgaWdicF9pZCA9IDA7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdCA9IDA7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBtSGFuZGxlLT5nZXRJZ2JwRGF0YSgmZ2VuZXJhdGlvbiwgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgICAgICB9CisgICAgICAgIG1Mb2NrZWRIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OldyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgbUJ1ZmZlciwgbUluZm8ubWFwcGVySW5mby53aWR0aCwgbUluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KW1JbmZvLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mby5tYXBwZXJJbmZvLnVzYWdlLCBtSW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JbmZvLm1hcHBlckluZm8uZm9ybWF0KSB7CisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQkFfMTAxMDEwMjogeworICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIGlzIHVzZWQgZm9yIG1lZGlhIGFzIFlVVjQ0NCBpbiB0aGUgY2FzZSB3aGVuIGl0IGlzIHF1ZXVlZCBkaXJlY3RseSB0byBhCisgICAgICAgICAgICAvLyBTdXJmYWNlLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXQgaXMgUkdCQS4gV2UgZG9uJ3Qga25vdyB3aGljaCBjYXNlIGl0IGlzIGhlcmUsIHNvCisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFlVViBmb3Igbm93LgorICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRyZWF0IGFzIDMyLWJpdCB2YWx1ZXMKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQTsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gNDsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9BLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCQV84ODg4OgorICAgICAgICAgICAgLy8gVE9ETzogYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQlhfODg4ODogeworICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmcG9pbnRlcl0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2sgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSAodWludDhfdCAqKXBvaW50ZXIgKyAxOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSAodWludDhfdCAqKXBvaW50ZXIgKyAyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9SLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9HLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9CLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1IsICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6WUNCQ1JfNDIwXzg4ODoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpZVjEyOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIFlDYkNyTGF5b3V0IHljYmNyTGF5b3V0OworICAgICAgICAgICAgbU1hcHBlci0+bG9ja1lDYkNyKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IG1hcExheW91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxvY2tZQ2JDciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0Lnk7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY2I7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQuY3I7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQueVN0cmlkZSwgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfVSwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgICAgICAgICAgaW50cHRyX3QgdXZPZmZzZXQgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSAtIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICAgICAgaWYgKHV2T2Zmc2V0ID4gMCAmJiB1dk9mZnNldCA8IChpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAgICAgfSBlbHNlIGlmICh1dk9mZnNldCA8IDAgJiYgdXZPZmZzZXQgPiAtKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ub2Zmc2V0ID0gLXV2T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUxvY2tlZCA9IHRydWU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6OnVubWFwKAorICAgICAgICB1aW50OF90ICoqYWRkciwgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSB7CisgICAgLy8gVE9ETzogY2hlY2sgYWRkciBhbmQgc2l6ZSwgdXNlIGZlbmNlCisgICAgKHZvaWQpYWRkcjsKKyAgICAodm9pZClyZWN0OworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIG1NYXBwZXItPnVubG9jaygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgWyZlcnIsICZmZW5jZV0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZyZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgKHZvaWQpIGZlbmNlOworICAgICAgICAgICAgICAgICh2b2lkKSByZWxlYXNlRmVuY2U7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgbUxvY2tlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEMyQWxsb2NhdGlvbkdyYWxsb2M6OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG90aGVyICYmIG90aGVyLT5oYW5kbGUoKSA9PSBoYW5kbGUoKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKTsKKworICAgIGlkX3QgZ2V0SWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5pZDsKKyAgICB9CisKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0czsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I6OlRyYWl0cz4gbVRyYWl0czsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzcDxJQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHNwPElNYXBwZXI+IG1NYXBwZXI7CisgICAgY29uc3QgYm9vbCBtQnVmZmVyUXVldWU7Cit9OworCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCx1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICh2b2lkKUMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6SW1wbChpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKQorICAgIDogbUluaXQoQzJfT0spLCBtQnVmZmVyUXVldWUoYnVmZmVyUXVldWUpIHsKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGFsbG9jYXRvcgorICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7IDAsIDAgfSwgbWF4VXNhZ2UgPSB7IH4odWludDY0X3QpMCwgfih1aW50NjRfdCkwIH07CisgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmdyYWxsb2MiLCBpZCwgQzJBbGxvY2F0b3I6OkdSQVBISUMsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yOjpUcmFpdHM+KHRyYWl0cyk7CisKKyAgICAvLyBncmFsbG9jIGFsbG9jYXRvciBpcyBhIHNpbmdsZXRvbiwgc28gYWxsIG9iamVjdHMgc2hhcmUgYSBnbG9iYWwgc2VydmljZQorICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCk7CisgICAgbU1hcHBlciA9IElNYXBwZXI6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobUFsbG9jYXRvciA9PSBudWxscHRyIHx8IG1NYXBwZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigiYWxsb2NhdGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgQnVmZmVyRGVzY3JpcHRvckluZm8gaW5mbyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAxdSwgIC8vIGxheWVyQ291bnQKKyAgICAgICAgICAgIChQaXhlbEZvcm1hdClmb3JtYXQsCisgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgIH0sCisgICAgICAgIDB1LCAgLy8gc3RyaWRlIHBsYWNlaG9sZGVyCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBCdWZmZXJEZXNjcmlwdG9yIGRlc2M7CisgICAgbU1hcHBlci0+Y3JlYXRlRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGluZm8ubWFwcGVySW5mbywgWyZlcnIsICZkZXNjXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJmRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBkZXNjcmlwdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyBJQWxsb2NhdG9yIHNoYXJlcyBJTWFwcGVyIGVycm9yIGNvZGVzLgorICAgIGhpZGxfaGFuZGxlIGJ1ZmZlcjsKKyAgICBtQWxsb2NhdG9yLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAxdSwKKyAgICAgICAgICAgIFsmZXJyLCAmYnVmZmVyLCAmaW5mb10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZzdHJpZGUsIGF1dG8gJmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBzdGQ6Om1vdmUoYnVmZmVyc1swXSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisKKyAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgIGluZm8sIG1NYXBwZXIsIGJ1ZmZlciwKKyAgICAgICAgICAgIEMySGFuZGxlR3JhbGxvYzo6V3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBpbmZvLm1hcHBlckluZm8ud2lkdGgsIGluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClpbmZvLm1hcHBlckluZm8uZm9ybWF0LCBpbmZvLm1hcHBlckluZm8udXNhZ2UsIGluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAwLCAwLCBtQnVmZmVyUXVldWUgPyB+MCA6IDApLAorICAgICAgICAgICAgbVRyYWl0cy0+aWQpKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgQnVmZmVyRGVzY3JpcHRvckluZm8gaW5mbzsKKyAgICBpbmZvLm1hcHBlckluZm8ubGF5ZXJDb3VudCA9IDF1OworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgaWdicF9pZDsKKyAgICB1aW50MzJfdCBpZ2JwX3Nsb3Q7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpncmFsbG9jSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAmaW5mby5tYXBwZXJJbmZvLndpZHRoLCAmaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICh1aW50MzJfdCAqKSZpbmZvLm1hcHBlckluZm8uZm9ybWF0LCAodWludDY0X3QgKikmaW5mby5tYXBwZXJJbmZvLnVzYWdlLCAmaW5mby5zdHJpZGUsCisgICAgICAgICAgICAmZ2VuZXJhdGlvbiwgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgIGlmIChncmFsbG9jSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBoaWRsX2hhbmRsZSBoaWRsSGFuZGxlOworICAgIGhpZGxIYW5kbGUuc2V0VG8oQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoZ3JhbGxvY0hhbmRsZSksIHRydWUpOworCisgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoaW5mbywgbU1hcHBlciwgaGlkbEhhbmRsZSwgZ3JhbGxvY0hhbmRsZSwgbVRyYWl0cy0+aWQpKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6QzJBbGxvY2F0b3JHcmFsbG9jKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpCisgICAgICAgIDogbUltcGwobmV3IEltcGwoaWQsIGJ1ZmZlclF1ZXVlKSkge30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjp+QzJBbGxvY2F0b3JHcmFsbG9jKCkgeyBkZWxldGUgbUltcGw7IH0KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldElkKCk7Cit9CisKK0MyU3RyaW5nIEMyQWxsb2NhdG9yR3JhbGxvYzo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldE5hbWUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IEMyQWxsb2NhdG9yR3JhbGxvYzo6Z2V0VHJhaXRzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0VHJhaXRzKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1JbXBsLT5uZXdHcmFwaGljQWxsb2NhdGlvbih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBhbGxvY2F0aW9uKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCBhbGxvY2F0aW9uKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5zdGF0dXMoKTsKK30KKworYm9vbCBDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjppc1ZhbGlkKG8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2YWFjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApAQCAtMCwwICsxLDU2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJBbGxvY2F0b3JJb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8aW9uL2lvbi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIGdldHBhZ2VzaXplLCBzaXplX3QsIGNsb3NlLCBkdXAKKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJFcnJub1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IFVTQUdFX0xSVV9DQUNIRV9TSVpFID0gMTAyNDsKK30KKworLyogc2l6ZV90IDw9PiBpbnQobG8pLCBpbnQoaGkpIGNvbnZlcnNpb25zICovCitjb25zdGV4cHIgaW5saW5lIGludCBzaXplMmludExvKHNpemVfdCBzKSB7CisgICAgcmV0dXJuIGludChzICYgMHhGRkZGRkZGRik7Cit9CisKK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50SGkoc2l6ZV90IHMpIHsKKyAgICAvLyBjYXN0IHRvIHVpbnQ2NF90IGFzIHNpemVfdCBtYXkgYmUgMzIgYml0cyB3aWRlCisgICAgcmV0dXJuIGludCgodWludDY0X3QocykgPj4gMzIpICYgMHhGRkZGRkZGRik7Cit9CisKK2NvbnN0ZXhwciBpbmxpbmUgc2l6ZV90IGludHMyc2l6ZShpbnQgaW50TG8sIGludCBpbnRIaSkgeworICAgIC8vIGNvbnZlcnQgaW4gMiBzdGFnZXMgdG8gNjQgYml0cyBhcyBpbnRIaSBtYXkgYmUgbmVnYXRpdmUKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKGludExvKSkgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQoaW50SGkpKSA8PCAzMik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBIQU5ETEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqCisgKiBJT04gaGFuZGxlCisgKgorICogVGhlcmUgY2FuIGJlIG9ubHkgYSBzb2xlIGlvbiBjbGllbnQgcGVyIHByb2Nlc3MsIHRoaXMgaXMgY2FwdHVyZWQgaW4gdGhlIGlvbiBmZCB0aGF0IGlzIHBhc3NlZAorICogdG8gdGhlIGNvbnN0cnVjdG9yLCBidXQgdGhpcyBzaG91bGQgYmUgbWFuYWdlZCBieSB0aGUgaW9uIGJ1ZmZlciBhbGxvY2F0b3IvbWFwcGVyLgorICoKKyAqIGlvbiB1c2VzIGlvbl91c2VyX2hhbmRsZV90IGZvciBidWZmZXJzLiBXZSBkb24ndCBzdG9yZSB0aGlzIGluIHRoZSBuYXRpdmUgaGFuZGxlIGFzCisgKiBpdCByZXF1aXJlcyBhbiBpb25fZnJlZSB0byBkZWNyZWYuIEluc3RlYWQsIHdlIHNoYXJlIHRoZSBidWZmZXIgdG8gZ2V0IGFuIGZkIHRoYXQgYWxzbyBob2xkcworICogYSByZWZjb3VudC4KKyAqCisgKiBUaGlzIGhhbmRsZSB3aWxsIG5vdCBjYXB0dXJlIG1hcHBlZCBmZC1zIGFzIHVwZGF0aW5nIHRoYXQgd291bGQgcmVxdWlyZSBhIGdsb2JhbCBtdXRleC4KKyAqLworCitzdHJ1Y3QgQzJIYW5kbGVJb24gOiBwdWJsaWMgQzJIYW5kbGUgeworICAgIC8vIGlvbiBoYW5kbGUgb3ducyBpb25GZCghKSBhbmQgYnVmZmVyRmQKKyAgICBDMkhhbmRsZUlvbihpbnQgYnVmZmVyRmQsIHNpemVfdCBzaXplKQorICAgICAgICA6IEMySGFuZGxlKGNIZWFkZXIpLAorICAgICAgICAgIG1GZHN7IGJ1ZmZlckZkIH0sCisgICAgICAgICAgbUludHN7IGludChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHsgfQorCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pOworCisgICAgaW50IGJ1ZmZlckZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQnVmZmVyOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgICAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbUJ1ZmZlcjsgLy8gc2hhcmVkIGlvbiBidWZmZXIKKyAgICB9IG1GZHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1TaXplTG87IC8vIGxvdyAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1TaXplSGk7IC8vIGhpZ2ggMzItYml0cyBvZiBzaXplCisgICAgICAgIGludCBtTWFnaWM7CisgICAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMySGFuZGxlSW9uIF90eXBlOworICAgIGVudW0geworICAgICAgICBrTWFnaWMgPSAnXHhjMmlvXHgwMCcsCisgICAgICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgICAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgICAgICB2ZXJzaW9uID0gc2l6ZW9mKEMySGFuZGxlKQorICAgIH07CisgICAgLy9jb25zdGV4cHIgc3RhdGljIEMySGFuZGxlIGNIZWFkZXIgPSB7IHZlcnNpb24sIG51bUZkcywgbnVtSW50cywge30gfTsKKyAgICBjb25zdCBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlcjsKK307CisKK2NvbnN0IEMySGFuZGxlIEMySGFuZGxlSW9uOjpjSGVhZGVyID0geworICAgIEMySGFuZGxlSW9uOjp2ZXJzaW9uLAorICAgIEMySGFuZGxlSW9uOjpudW1GZHMsCisgICAgQzJIYW5kbGVJb246Om51bUludHMsCisgICAge30KK307CisKKy8vIHN0YXRpYworYm9vbCBDMkhhbmRsZUlvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pIHsKKyAgICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJIYW5kbGVJb24gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVJb24qPihvKTsKKyAgICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKKy8vIFRPRE86IGlzIHRoZSBkdXAgb2YgYW4gaW9uIGZkIGlkZW50aWNhbCB0byBpb25fc2hhcmU/CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJT04gQUxMT0NBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworY2xhc3MgQzJBbGxvY2F0aW9uSW9uIDogcHVibGljIEMyTGluZWFyQWxsb2NhdGlvbiB7CitwdWJsaWM6CisgICAgLyogSW50ZXJmYWNlIG1ldGhvZHMgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICB2b2lkICoqYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZUZkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRpb25Jb24oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisgICAgQzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisgICAgQzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7CisKKyAgICAvLyBUT0RPOiB3ZSBjb3VsZCBtYWtlIHRoaXMgZW5jYXBzdWxhdGUgc2hhcmVkX3B0ciBhbmQgY29waWFibGUKKyAgICBDMl9ET19OT1RfQ09QWShDMkFsbG9jYXRpb25Jb24pOworfTsKKworY2xhc3MgQzJBbGxvY2F0aW9uSW9uOjpJbXBsIHsKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFxub3RlIFdlIGFsd2F5cyBjcmVhdGUgYW4gaW9uIGFsbG9jYXRpb24sIGV2ZW4gaWYgdGhlIGFsbG9jYXRpb24gb3IgaW1wb3J0IGZhaWxzCisgICAgICogc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGUgZXJyb3IuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGJ1ZmZlciAgICBpb24gYnVmZmVyIHVzZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm5vIGR1cmluZyBidWZmZXIgYWxsb2NhdGlvbiBvciBpbXBvcnQKKyAgICAgKi8KKyAgICBJbXBsKGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciwgQzJBbGxvY2F0b3I6OmlkX3QgaWQsIGludCBlcnIpCisgICAgICAgIDogbUlvbkZkKGlvbkZkKSwKKyAgICAgICAgICBtSGFuZGxlKGJ1ZmZlckZkLCBjYXBhY2l0eSksCisgICAgICAgICAgbUJ1ZmZlcihidWZmZXIpLAorICAgICAgICAgIG1JZChpZCksCisgICAgICAgICAgbUluaXQoYzJfbWFwX2Vycm5vPEVOT01FTSwgRUFDQ0VTLCBFSU5WQUw+KGVycikpLAorICAgICAgICAgIG1NYXBGZCgtMSkgeworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIC8vIGNsb3NlIGlvbkZkIG5vdyBvbiBlcnJvcgorICAgICAgICAgICAgaWYgKG1Jb25GZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgY2xvc2UobUlvbkZkKTsKKyAgICAgICAgICAgICAgICBtSW9uRmQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlckZkIDwgMCk7CisgICAgICAgICAgICAvLyBDMl9DSEVDSyhidWZmZXIgPCAwKTsKKyAgICAgICAgfQorICAgIH0KKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24gYnkgaW1wb3J0aW5nIGEgc2hhcmVkIGJ1ZmZlciBmZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICoKKyAgICAgKiBccmV0dXJuIGNyZWF0ZWQgaW9uIGFsbG9jYXRpb24gKGltcGxlbWVudGF0aW9uKSB3aGljaCBtYXkgYmUgaW52YWxpZCBpZiB0aGUKKyAgICAgKiBpbXBvcnQgZmFpbGVkLgorICAgICAqLworICAgIHN0YXRpYyBJbXBsICpJbXBvcnQoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpIHsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgICAgIGludCByZXQgPSBpb25faW1wb3J0KGlvbkZkLCBidWZmZXJGZCwgJmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgY2FwYWNpdHksIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24gYnkgYWxsb2NhdGluZyBhbiBpb24gYnVmZmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIHNpemUgICAgICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYWxpZ24gICAgIGRlc2lyZWQgYWxpZ25tZW50IG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gaGVhcE1hc2sgIG1hc2sgb2YgaGVhcHMgY29uc2lkZXJlZAorICAgICAqIFxwYXJhbSBmbGFncyAgICAgaW9uIGFsbG9jYXRpb24gZmxhZ3MKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGFsbG9jYXRpb24gZmFpbGVkLgorICAgICAqLworICAgIHN0YXRpYyBJbXBsICpBbGxvYyhpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpIHsKKyAgICAgICAgaW50IGJ1ZmZlckZkID0gLTE7CisgICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciA9IC0xOworICAgICAgICBzaXplX3QgYWxpZ25lZFNpemUgPSBhbGlnbiA9PSAwID8gc2l6ZSA6IChzaXplICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKKyAgICAgICAgaW50IHJldCA9IGlvbl9hbGxvYyhpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsICZidWZmZXIpOworICAgICAgICBBTE9HVigiaW9uX2FsbG9jKGlvbkZkID0gJWQsIHNpemUgPSAlenUsIGFsaWduID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkgOyBidWZmZXIgPSAlZCIsCisgICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXIpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIC8vIGdldCBidWZmZXIgZmQgZm9yIG5hdGl2ZSBoYW5kbGUgY29uc3RydWN0b3IKKyAgICAgICAgICAgIHJldCA9IGlvbl9zaGFyZShpb25GZCwgYnVmZmVyLCAmYnVmZmVyRmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW9uX2ZyZWUoaW9uRmQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbWFwKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwgdm9pZCAqKmFkZHIpIHsKKyAgICAgICAgKHZvaWQpZmVuY2U7IC8vIFRPRE86IHdhaXQgZm9yIGZlbmNlCisgICAgICAgICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1YoIm11bHRpcGxlIG1hcCIpOworICAgICAgICAgICAgLy8gVE9ETzogdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIHJldHVybiBEVVBMSUNBVEUgaGVyZSwgYnV0IG91ciBibG9jayB2aWV3cyBkb24ndAorICAgICAgICAgICAgLy8gYWN0dWFsbHkgdW5tYXAsIHNvIHdlIGVuZCB1cCByZW1hcHBpbmcgYW4gaW9uIGJ1ZmZlciBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gQzJfRFVQTElDQVRFOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcHJvdCA9IFBST1RfTk9ORTsKKyAgICAgICAgaW50IGZsYWdzID0gTUFQX1NIQVJFRDsKKyAgICAgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpIHsKKyAgICAgICAgICAgIHByb3QgfD0gUFJPVF9SRUFEOworICAgICAgICB9CisgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgeworICAgICAgICAgICAgcHJvdCB8PSBQUk9UX1dSSVRFOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudEJ5dGVzID0gb2Zmc2V0ICUgUEFHRV9TSVpFOworICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gb2Zmc2V0IC0gYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBtYXBTaXplID0gc2l6ZSArIGFsaWdubWVudEJ5dGVzOworICAgICAgICBNYXBwaW5nIG1hcCA9IHsgbnVsbHB0ciwgYWxpZ25tZW50Qnl0ZXMsIG1hcFNpemUgfTsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgaWYgKG1NYXBGZCA9PSAtMSkgeworICAgICAgICAgICAgaW50IHJldCA9IGlvbl9tYXAobUlvbkZkLCBtQnVmZmVyLCBtYXBTaXplLCBwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG1hcE9mZnNldCwgKHVuc2lnbmVkIGNoYXIqKikmbWFwLmFkZHIsICZtTWFwRmQpOworICAgICAgICAgICAgQUxPR1YoImlvbl9tYXAoaW9uRmQgPSAlZCwgaGFuZGxlID0gJWQsIHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgIm9mZnNldCA9ICV6dSkgcmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtSW9uRmQsIG1CdWZmZXIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtYXBPZmZzZXQsIHJldCk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgbU1hcEZkID0gLTE7CisgICAgICAgICAgICAgICAgbWFwLmFkZHIgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oLXJldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKiltYXAuYWRkciArIGFsaWdubWVudEJ5dGVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFwLmFkZHIgPSBtbWFwKG51bGxwdHIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtTWFwRmQsIG1hcE9mZnNldCk7CisgICAgICAgICAgICBBTE9HVigibW1hcChzaXplID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQsIG1hcEZkID0gJWQsIG9mZnNldCA9ICV6dSkgIgorICAgICAgICAgICAgICAgICAgInJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICAgICAgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0LCBlcnJubyk7CisgICAgICAgICAgICBpZiAobWFwLmFkZHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgICAgIG1hcC5hZGRyID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGVyciA9IGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKW1hcC5hZGRyICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcC5hZGRyKSB7CisgICAgICAgICAgICBtTWFwcGluZ3MucHVzaF9iYWNrKG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgaWYgKG1NYXBGZCA8IDAgfHwgbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ0cmllZCB0byB1bm1hcCB1bm1hcHBlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbU1hcHBpbmdzLmJlZ2luKCk7IGl0ICE9IG1NYXBwaW5ncy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGFkZHIgIT0gKHVpbnQ4X3QgKilpdC0+YWRkciArIGl0LT5hbGlnbm1lbnRCeXRlcyB8fAorICAgICAgICAgICAgICAgICAgICBzaXplICsgaXQtPmFsaWdubWVudEJ5dGVzICE9IGl0LT5zaXplKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyID0gbXVubWFwKGl0LT5hZGRyLCBpdC0+c2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibXVubWFwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgICAgICAqZmVuY2UgPSBDMkZlbmNlKCk7IC8vIG5vdCB1c2luZyBmZW5jZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKW1NYXBwaW5ncy5lcmFzZShpdCk7CisgICAgICAgICAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IHVubWFwcGVkOiAlZCIsIG1CdWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCJ1bm1hcCBmYWlsZWQgdG8gZmluZCBzcGVjaWZpZWQgbWFwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJEYW5nbGluZyBtYXBwaW5ncyEiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgTWFwcGluZyAmbWFwIDogbU1hcHBpbmdzKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpbXVubWFwKG1hcC5hZGRyLCBtYXAuc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NYXBGZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShtTWFwRmQpOworICAgICAgICAgICAgbU1hcEZkID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgICAgICAodm9pZClpb25fZnJlZShtSW9uRmQsIG1CdWZmZXIpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jb25GZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtSGFuZGxlOworICAgIH0KKworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIGlvbl91c2VyX2hhbmRsZV90IGlvbkhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXI7CisgICAgfQorCitwcml2YXRlOgorICAgIGludCBtSW9uRmQ7CisgICAgQzJIYW5kbGVJb24gbUhhbmRsZTsKKyAgICBpb25fdXNlcl9oYW5kbGVfdCBtQnVmZmVyOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1JZDsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbU1hcEZkOyAvLyBvbmx5IG9uZSBmb3Igbm93CisgICAgc3RydWN0IE1hcHBpbmcgeworICAgICAgICB2b2lkICphZGRyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBzaXplOworICAgIH07CisgICAgc3RkOjpsaXN0PE1hcHBpbmc+IG1NYXBwaW5nczsKK307CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbklvbjo6bWFwKAorICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwgdm9pZCAqKmFkZHIpIHsKKyAgICByZXR1cm4gbUltcGwtPm1hcChvZmZzZXQsIHNpemUsIHVzYWdlLCBmZW5jZSwgYWRkcik7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbklvbjo6dW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgcmV0dXJuIG1JbXBsLT51bm1hcChhZGRyLCBzaXplLCBmZW5jZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbklvbjo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+c3RhdHVzKCk7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdGlvbklvbjo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfQorCitib29sIEMyQWxsb2NhdGlvbklvbjo6ZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgeworICAgIGlmICghb3RoZXIgfHwgb3RoZXItPmdldEFsbG9jYXRvcklkKCkgIT0gZ2V0QWxsb2NhdG9ySWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIGdldCB1c2VyIGhhbmRsZSB0byBjb21wYXJlIG9iamVjdHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBvdGhlckFzSW9uID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQWxsb2NhdGlvbklvbj4ob3RoZXIpOworICAgIHJldHVybiBtSW1wbC0+aW9uSGFuZGxlKCkgPT0gb3RoZXJBc0lvbi0+bUltcGwtPmlvbkhhbmRsZSgpOworfQorCitjb25zdCBDMkhhbmRsZSAqQzJBbGxvY2F0aW9uSW9uOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK30KKworQzJBbGxvY2F0aW9uSW9uOjp+QzJBbGxvY2F0aW9uSW9uKCkgeworICAgIGRlbGV0ZSBtSW1wbDsKK30KKworQzJBbGxvY2F0aW9uSW9uOjpDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwKKyAgICAgIG1JbXBsKEltcGw6OkFsbG9jKGlvbkZkLCBzaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCBpZCkpIHsgfQorCitDMkFsbG9jYXRpb25Jb246OkMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBpbnQgc2hhcmVGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksCisgICAgICBtSW1wbChJbXBsOjpJbXBvcnQoaW9uRmQsIHNpemUsIHNoYXJlRmQsIGlkKSkgeyB9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJT04gQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitDMkFsbG9jYXRvcklvbjo6QzJBbGxvY2F0b3JJb24oaWRfdCBpZCkKKyAgICA6IG1Jbml0KEMyX09LKSwKKyAgICAgIG1Jb25GZChpb25fb3BlbigpKSB7CisgICAgaWYgKG1Jb25GZCA8IDApIHsKKyAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICBjYXNlIEVOT0VOVDogICAgbUluaXQgPSBDMl9PTUlUVEVEOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgIG1Jbml0ID0gYzJfbWFwX2Vycm5vPEVBQ0NFUz4oZXJybm8pOyBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7IDAsIDAgfTsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtYXhVc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBUcmFpdHMgdHJhaXRzID0geyAiYW5kcm9pZC5hbGxvY2F0b3IuaW9uIiwgaWQsIExJTkVBUiwgbWluVXNhZ2UsIG1heFVzYWdlIH07CisgICAgICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICAgICAgbUJsb2NrU2l6ZSA9IDo6Z2V0cGFnZXNpemUoKTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9ySW9uOjp+QzJBbGxvY2F0b3JJb24oKSB7CisgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgIGlvbl9jbG9zZShtSW9uRmQpOworICAgIH0KK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0b3JJb246OmdldElkKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5pZDsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JJb246OmdldE5hbWUoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPm5hbWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBDMkFsbG9jYXRvcklvbjo6Z2V0VHJhaXRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzOworfQorCit2b2lkIEMyQWxsb2NhdG9ySW9uOjpzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgY29uc3QgVXNhZ2VNYXBwZXJGbiAmbWFwcGVyLCB1aW50NjRfdCBtaW5Vc2FnZSwgdWludDY0X3QgbWF4VXNhZ2UsIHVpbnQ2NF90IGJsb2NrU2l6ZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIG1Vc2FnZU1hcHBlckNhY2hlLmNsZWFyKCk7CisgICAgbVVzYWdlTWFwcGVyTHJ1LmNsZWFyKCk7CisgICAgbVVzYWdlTWFwcGVyID0gbWFwcGVyOworICAgIFRyYWl0cyB0cmFpdHMgPSB7CisgICAgICAgIG1UcmFpdHMtPm5hbWUsIG1UcmFpdHMtPmlkLCBMSU5FQVIsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UobWluVXNhZ2UpLCBDMk1lbW9yeVVzYWdlKG1heFVzYWdlKQorICAgIH07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworICAgIG1CbG9ja1NpemUgPSBibG9ja1NpemU7Cit9CisKK3N0ZDo6c2l6ZV90IEMyQWxsb2NhdG9ySW9uOjpNYXBwZXJLZXlIYXNoOjpvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmaykgY29uc3QgeworICAgIHJldHVybiBzdGQ6Omhhc2g8dWludDY0X3Q+e30oay5maXJzdCkgXiBzdGQ6Omhhc2g8c2l6ZV90Pnt9KGsuc2Vjb25kKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246Om1hcFVzYWdlKAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisgICAgLy8gYWxpZ24gY2FwYWNpdHkKKyAgICBjYXBhY2l0eSA9IChjYXBhY2l0eSArIG1CbG9ja1NpemUgLSAxKSAmIH4obUJsb2NrU2l6ZSAtIDEpOworICAgIE1hcHBlcktleSBrZXkgPSBzdGQ6Om1ha2VfcGFpcih1c2FnZS5leHBlY3RlZCwgY2FwYWNpdHkpOworICAgIGF1dG8gZW50cnkgPSBtVXNhZ2VNYXBwZXJDYWNoZS5maW5kKGtleSk7CisgICAgaWYgKGVudHJ5ID09IG1Vc2FnZU1hcHBlckNhY2hlLmVuZCgpKSB7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXIpIHsKKyAgICAgICAgICAgIHJlcyA9IG1Vc2FnZU1hcHBlcih1c2FnZSwgY2FwYWNpdHksIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFsaWduID0gMDsgLy8gVE9ETyBtYWtlIHRoaXMgMQorICAgICAgICAgICAgKmhlYXBNYXNrID0gfjA7IC8vIGRlZmF1bHQgbWFzaworICAgICAgICAgICAgKmZsYWdzID0gMDsgLy8gZGVmYXVsdCBmbGFncworICAgICAgICAgICAgcmVzID0gQzJfTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgdXNhZ2UgdG8gY2FjaGUKKyAgICAgICAgTWFwcGVyVmFsdWUgdmFsdWUgPSBzdGQ6Om1ha2VfdHVwbGUoKmFsaWduLCAqaGVhcE1hc2ssICpmbGFncywgcmVzKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LmVtcGxhY2VfZnJvbnQoa2V5LCB2YWx1ZSk7CisgICAgICAgIG1Vc2FnZU1hcHBlckNhY2hlLmVtcGxhY2Uoc3RkOjptYWtlX3BhaXIoa2V5LCBtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSkpOworICAgICAgICBpZiAobVVzYWdlTWFwcGVyQ2FjaGUuc2l6ZSgpID4gVVNBR0VfTFJVX0NBQ0hFX1NJWkUpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBMUlUgZW50cnkKKyAgICAgICAgICAgIE1hcHBlcktleSBscnVLZXkgPSBtVXNhZ2VNYXBwZXJMcnUuZnJvbnQoKS5maXJzdDsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckNhY2hlLmVyYXNlKGxydUtleSk7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJMcnUucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1vdmUgZW50cnkgdG8gTVJVCisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5zcGxpY2UobVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCksIG1Vc2FnZU1hcHBlckxydSwgZW50cnktPnNlY29uZCk7CisgICAgICAgIGNvbnN0IE1hcHBlclZhbHVlICZ2YWx1ZSA9IGVudHJ5LT5zZWNvbmQtPnNlY29uZDsKKyAgICAgICAgc3RkOjp0aWUoKmFsaWduLCAqaGVhcE1hc2ssICpmbGFncywgcmVzKSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgaWYgKGFsbG9jYXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGFsbG9jYXRpb24tPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzaXplX3QgYWxpZ24gPSAwOworICAgIHVuc2lnbmVkIGhlYXBNYXNrID0gfjA7CisgICAgdW5zaWduZWQgZmxhZ3MgPSAwOworICAgIGMyX3N0YXR1c190IHJldCA9IG1hcFVzYWdlKHVzYWdlLCBjYXBhY2l0eSwgJmFsaWduLCAmaGVhcE1hc2ssICZmbGFncyk7CisgICAgaWYgKHJldCAmJiByZXQgIT0gQzJfTk9fSU5JVCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IGFsbG9jCisgICAgICAgID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRpb25Jb24+KGR1cChtSW9uRmQpLCBjYXBhY2l0eSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgbVRyYWl0cy0+aWQpOworICAgIHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjpwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgaWYgKCFDMkhhbmRsZUlvbjo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVE9ETzogZ2V0IGNhcGFjaXR5IGFuZCB2YWxpZGF0ZSBpdAorICAgIGNvbnN0IEMySGFuZGxlSW9uICpoID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVJb24qPihoYW5kbGUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IGFsbG9jCisgICAgICAgID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRpb25Jb24+KGR1cChtSW9uRmQpLCBoLT5zaXplKCksIGgtPmJ1ZmZlckZkKCksIG1UcmFpdHMtPmlkKTsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKSkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlSW9uOjppc1ZhbGlkKG8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJQb29sQWxsb2NhdG9yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OklOVkFMSURfQ09OTkVDVElPTklEOworCisvLyBUaGlzIGFub255bW91cyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGhlbHBlciBjbGFzc2VzIHRoYXQgYWxsb3cgb3VyIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZQorLy8gYmxvY2svYnVmZmVyIG9iamVjdHMuCisvLworLy8gSW5oZXJpdCBmcm9tIHRoZSBwYXJlbnQsIHNoYXJlIHdpdGggdGhlIGZyaWVuZC4KK2NsYXNzIFJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgdXNpbmcgQzJSZWFkVmlldzo6QzJSZWFkVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMldyaXRlVmlldyB7CisgICAgdXNpbmcgQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBDb25zdExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJDb25zdExpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgTGluZWFyQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkxpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNWaWV3IHsKKyAgICB1c2luZyBDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdEdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNCbG9jayB7CisgICAgdXNpbmcgQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sOworfTsKKworY2xhc3MgQnVmZmVyRGF0YUJ1ZGR5IDogcHVibGljIEMyQnVmZmVyRGF0YSB7CisgICAgdXNpbmcgQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGE7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDFEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIDFEIGJsb2NrIGFuZCB2aWV3IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHRoZSB1bmRlcmx5aW5nIDFEIGFsbG9jYXRpb24gYW5kIHRoZSByYW5nZSBvZiB0aGUKKyAqIGFsbG90ZWQgcG9ydGlvbiB0byB0aGlzIGJsb2NrLiBUaGVyZSBpcyBhbHNvIGEgcGxhY2Vob2xkZXIgZm9yIGEgYmxvY2twb29sIGRhdGEuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChhbGxvYy5nZXQoKSwgb2Zmc2V0LCBzaXplKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZvdGhlciwgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmb3RoZXIsIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24ob3RoZXIubUFsbG9jYXRpb24pLAorICAgICAgICAgIG1Qb29sRGF0YShvdGhlci5tUG9vbERhdGEpIHsgfQorCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAqCisgKiByYW5nZSBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGFsbG90dGVkCisgKiByYW5nZSkuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZibG9jaywgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKGJsb2NrLCBvZmZzZXQsIHNpemUpLCBtRGF0YShkYXRhKSwgbUVycm9yKEMyX09LKSB7IH0KKworICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKG51bGxwdHIpLCBtRGF0YShudWxscHRyKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBjMl9zdGF0dXNfdCBtRXJyb3I7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMUQ6OkltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMkJsb2NrMURJbXBsOjpfQzJCbG9jazFESW1wbDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMUQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfTsKKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazFEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9OworCitDMkJsb2NrMUQ6OkMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJyYW5nZSB0byBwYXJlbnQgKGltcGwpIHJhbmdlIGZvciBzYWZldHkKKyAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KGltcGwuZ2V0KCksIHJhbmdlLm9mZnNldCgpLCByYW5nZS5zaXplKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogUmVhZCB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLiByYW5nZSBvZiBWaWV3IGlzIDAgdG8gY2FwYWNpdHkoKSAobm90IHJlcHJlc2VudGVkIGFzIGFuIGFjdHVhbCByYW5nZSkuIFRoaXMgbWFwcyB0byBhCisgKiBzdWJyYW5nZSBvZiBJbXBsIHJhbmdlIHN0YXJ0aW5nIGF0IG1JbXBsLT5vZmZzZXQoKSArIF9tT2Zmc2V0LgorICovCitjbGFzcyBDMlJlYWRWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMlJlYWRWaWV3OjpDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5zaXplKCkpLAorICAgICAgbUltcGwoaW1wbCksCisgICAgICBtT2Zmc2V0KEMyTGluZWFyQ2FwYWNpdHkoaW1wbC0+c2l6ZSgpKS5yYW5nZShvZmZzZXQsIHNpemUpLm9mZnNldCgpKSB7IH0KKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KDB1KSwgbUltcGwoc3RkOjptYWtlX3NoYXJlZDxJbXBsPihlcnJvcikpLCBtT2Zmc2V0KDB1KSB7CisgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworfQorCitjb25zdCB1aW50OF90ICpDMlJlYWRWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKSA/IG51bGxwdHIgOiBtSW1wbC0+ZGF0YSgpICsgbU9mZnNldDsKK30KKworYzJfc3RhdHVzX3QgQzJSZWFkVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcnJvcigpOworfQorCitDMlJlYWRWaWV3IEMyUmVhZFZpZXc6OnN1YlZpZXcoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICBDMkxpbmVhclJhbmdlIHN1YlJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBDMlJlYWRWaWV3KG1JbXBsLCBtT2Zmc2V0ICsgc3ViUmFuZ2Uub2Zmc2V0KCksIHN1YlJhbmdlLnNpemUoKSk7Cit9CisKKy8qKgorICogV3JpdGUgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJXcml0ZVZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMURJbXBsOjpfQzJNYXBwZWRCbG9jazFESW1wbDsKK307CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKy8vIFVHTFk6IF9DMkxpbmVhclJhbmdlQXNwZWN0IHJlcXVpcmVzIGEgYm9uYS1maWRlIG9iamVjdCBmb3IgY2FwYWNpdHkgdG8gcHJldmVudCBzcG9vZmluZywgc28KKy8vIHRoaXMgaXMgd2hhdCB3ZSBoYXZlIHRvIGRvLgorLy8gVE9ETzogdXNlIGNoaWxkUmFuZ2UKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3Qoc3RkOjptYWtlX3VuaXF1ZTxDMkxpbmVhckNhcGFjaXR5PihpbXBsLT5zaXplKCkpLmdldCgpKSwgbUltcGwoaW1wbCkgeyB9CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QobnVsbHB0ciksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSB7fQorCit1aW50OF90ICpDMldyaXRlVmlldzo6YmFzZSgpIHsgcmV0dXJuIG1JbXBsLT5kYXRhKCk7IH0KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmRhdGEoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpICsgb2Zmc2V0KCk7IH0KKworYzJfc3RhdHVzX3QgQzJXcml0ZVZpZXc6OmVycm9yKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmVycm9yKCk7IH0KKworLyoqCisgKiBDb25zdCBsaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RMaW5lYXJCbG9jazo6QzJDb25zdExpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UsIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4gQzJDb25zdExpbmVhckJsb2NrOjptYXAoKSBjb25zdCB7CisgICAgdm9pZCAqYmFzZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbGVuID0gc2l6ZSgpOworICAgIGMyX3N0YXR1c190IGVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgb2Zmc2V0KCksIGxlbiwgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgMCB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVhZFZpZXdCdWRkeTo6SW1wbD4gcnZpID0gc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBSZWFkVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCBvZmZzZXQoKSwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShSZWFkVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShydmksIDAsIGxlbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBSZWFkVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJDb25zdExpbmVhckJsb2NrOjpzdWJCbG9jayhzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqbUltcGwsIG9mZnNldF8sIHNpemVfKTsKKyAgICByZXR1cm4gQzJDb25zdExpbmVhckJsb2NrKG1JbXBsLCBzdWJSYW5nZSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyTGluZWFyQmxvY2s6OkMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICA6IEMyQmxvY2sxRChpbXBsLCByYW5nZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gQzJMaW5lYXJCbG9jazo6bWFwKCkgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxXcml0ZVZpZXdCdWRkeTo6SW1wbD4oCisgICAgICAgICAgICAgICAgbmV3IFdyaXRlVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCAwLCBsZW4pLAorICAgICAgICAgICAgICAgIFtiYXNlLCBsZW5dKFdyaXRlVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KHJ2aSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgV3JpdGVWaWV3QnVkZHkoZXJyb3IpKTsKKyAgICB9Cit9CisKK0MyQ29uc3RMaW5lYXJCbG9jayBDMkxpbmVhckJsb2NrOjpzaGFyZShzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0TGluZWFyQmxvY2tCdWRkeShtSW1wbCwgQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0Xywgc2l6ZV8pLCBmZW5jZSk7Cit9CisKK0MyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeyB9CisKK2MyX3N0YXR1c190IEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oY2FwYWNpdHksIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RydWN0IEMyX0hJREUgQzJQb29sZWRCbG9ja1Bvb2xEYXRhIDogX0MyQmxvY2tQb29sRGF0YSB7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJQT09MOworICAgIH0KKworICAgIHZvaWQgZ2V0QnVmZmVyUG9vbERhdGEoc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqZGF0YSkgY29uc3QgeworICAgICAgICAqZGF0YSA9IG1EYXRhOworICAgIH0KKworICAgIEMyUG9vbGVkQmxvY2tQb29sRGF0YShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSA6IG1EYXRhKGRhdGEpIHt9CisKKyAgICB2aXJ0dWFsIH5DMlBvb2xlZEJsb2NrUG9vbERhdGEoKSBvdmVycmlkZSB7fQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gbURhdGE7Cit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJQT09MKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmdldEJ1ZmZlclBvb2xEYXRhKGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMUQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2sxRDo6SW1wbD4oYWxsb2MsIGRhdGEsIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPihuZXcgQzJMaW5lYXJCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMUQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnIHBhcmFtcz8KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKy8qKgorICogV3JhcHBlZCBDMkFsbG9jYXRvciB3aGljaCBpcyBpbmplY3RlZCB0byBidWZmZXIgcG9vbCBvbiBiZWhhbGYgb2YKKyAqIEMyQmxvY2tQb29sLgorICovCitjbGFzcyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorICAgIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCisgICAgfl9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRob2RzIGZvciBjb2RlYzIgY29tcG9uZW50IChDMkJsb2NrUG9vbCkuCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBsaW5lYXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNhcGFjaXR5ICAgICAgc2l6ZSBvZiBsaW5lYXIgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSB1c2FnZSAgICAgICAgIG1lbW9yeSB1c2FnZSBwYXR0ZXJuIGZvciBsaW5lYXIgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldExpbmVhclBhcmFtcyh1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgZ3JhcGhpYyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIEMyQWxsb2NhdG9yIHRvIHBhcmFtZXRlcnMKKyAgICAgKiBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggICAgICAgICB3aWR0aCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gaGVpZ2h0ICAgICAgICBoZWlnaHQgb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGZvcm1hdCAgICAgICAgY29sb3IgZm9ybWF0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIGFsbG9jYXRpb24gcGFyYW1ldGVyIGZvciBidWZmZXIgcG9vbAorICAgICAqLworICAgIHZvaWQgZ2V0R3JhcGhpY1BhcmFtcyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlIHRvIGFuIEMyTGluZWFyQWxsY2F0aW9uLgorICAgICAqIFdyYXBwZXIgdG8gQzJBbGxvY2F0b3IjcHJpb3JMaW5lYXJBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlIHRvIGFuIEMyR3JhcGhpY0FsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yR3JhcGhpY0FsbG9jYXRpb24KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4SW50UGFyYW1zID0gNTsgLy8gbGFyZ2UgZW5vdWdoIG51bWJlcjsKKworICAgIGVudW0gQWxsb2NUeXBlIDogdWludDhfdCB7CisgICAgICAgIEFMTE9DX05PTkUgPSAwLAorCisgICAgICAgIEFMTE9DX0xJTkVBUiwKKyAgICAgICAgQUxMT0NfR1JBUEhJQywKKyAgICB9OworCisgICAgdW5pb24gQWxsb2NQYXJhbXMgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgQWxsb2NUeXBlIGFsbG9jVHlwZTsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2U7CisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXNba01heEludFBhcmFtc107CisgICAgICAgIH0gZGF0YTsKKyAgICAgICAgdWludDhfdCBhcnJheVswXTsKKworICAgICAgICBBbGxvY1BhcmFtcygpIDogZGF0YXtBTExPQ19OT05FLCB7MCwgMH0sIHswfX0ge30KKyAgICAgICAgQWxsb2NQYXJhbXMoQzJNZW1vcnlVc2FnZSB1c2FnZSwgdWludDMyX3QgY2FwYWNpdHkpCisgICAgICAgICAgICA6IGRhdGF7QUxMT0NfTElORUFSLCB1c2FnZSwge1swXSA9IGNhcGFjaXR5fX0ge30KKyAgICAgICAgQWxsb2NQYXJhbXMoCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQpCisgICAgICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0dSQVBISUMsIHVzYWdlLCB7d2lkdGgsIGhlaWdodCwgZm9ybWF0fX0ge30KKyAgICB9OworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworc3RydWN0IExpbmVhckFsbG9jYXRpb25EdG9yIHsKKyAgICBMaW5lYXJBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MpCisgICAgICAgIDogbUFsbG9jYXRpb24oYWxsb2MpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK3N0cnVjdCBHcmFwaGljQWxsb2NhdGlvbkR0b3IgeworICAgIEdyYXBoaWNBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworfTsKKworUmVzdWx0U3RhdHVzIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJnBhcmFtcywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXM7CisgICAgbWVtY3B5KCZjMlBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICBzd2l0Y2goYzJQYXJhbXMuZGF0YS5hbGxvY1R5cGUpIHsKKyAgICAgICAgY2FzZSBBTExPQ19OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTElORUFSOiB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBjMkxpbmVhcjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdLCBjMlBhcmFtcy5kYXRhLnVzYWdlLCAmYzJMaW5lYXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBjMkxpbmVhcikgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJMaW5lYXItPmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBMaW5lYXJBbGxvY2F0aW9uRHRvcihjMkxpbmVhcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gKHNpemVfdCljMlBhcmFtcy5kYXRhLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQUxMT0NfR1JBUEhJQzogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGMyR3JhcGhpYzsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMV0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzJdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnVzYWdlLCAmYzJHcmFwaGljKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJHcmFwaGljKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihjMkdyYXBoaWMtPmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBHcmFwaGljQWxsb2NhdGlvbkR0b3IoYzJHcmFwaGljKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY1NpemUgPSBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSAqIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJm5ld1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZvbGRQYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBuZXdBbGxvYzsKKyAgICBBbGxvY1BhcmFtcyBvbGRBbGxvYzsKKyAgICBtZW1jcHkoJm5ld0FsbG9jLCBuZXdQYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBuZXdQYXJhbXMuc2l6ZSgpKSk7CisgICAgbWVtY3B5KCZvbGRBbGxvYywgb2xkUGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgb2xkUGFyYW1zLnNpemUoKSkpOworCisgICAgLy8gVE9ETzogc3VwcG9ydCBub3QgZXhhY3QgbWF0Y2hpbmcuIGUuZykgbmV3Q2FwYWNpdHkgPCBvbGRDYXBhY2l0eQorICAgIGlmIChuZXdBbGxvYy5kYXRhLmFsbG9jVHlwZSA9PSBvbGRBbGxvYy5kYXRhLmFsbG9jVHlwZSAmJgorICAgICAgICAgICAgbmV3QWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCA9PSBvbGRBbGxvYy5kYXRhLnVzYWdlLmV4cGVjdGVkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heEludFBhcmFtczsgKytpKSB7CisgICAgICAgICAgICBpZiAobmV3QWxsb2MuZGF0YS5wYXJhbXNbaV0gIT0gb2xkQWxsb2MuZGF0YS5wYXJhbXNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpnZXRMaW5lYXJQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIGNhcGFjaXR5KTsKKyAgICBwYXJhbXMtPmFzc2lnbihjMlBhcmFtcy5hcnJheSwgYzJQYXJhbXMuYXJyYXkgKyBzaXplb2YoQWxsb2NQYXJhbXMpKTsKK30KKwordm9pZCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpnZXRHcmFwaGljUGFyYW1zKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtcyh1c2FnZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICBwYXJhbXMtPmFzc2lnbihjMlBhcmFtcy5hcnJheSwgYzJQYXJhbXMuYXJyYXkgKyBzaXplb2YoQWxsb2NQYXJhbXMpKTsKK30KKworYzJfc3RhdHVzX3QgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsIGMyQWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbDo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgICAgICA6IG1Jbml0KEMyX09LKSwKKyAgICAgICAgICAgICAgbUJ1ZmZlclBvb2xNYW5hZ2VyKENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkpLAorICAgICAgICAgICAgICBtQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8X0MyQnVmZmVyUG9vbEFsbG9jYXRvcj4oYWxsb2NhdG9yKSkgeworICAgICAgICBpZiAobUFsbG9jYXRvciAmJiBtQnVmZmVyUG9vbE1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyUG9vbE1hbmFnZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgbUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUluaXQgPSBDMl9OT19JTklUOworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICAgICAgbUFsbG9jYXRvci0+Z2V0TGluZWFyUGFyYW1zKGNhcGFjaXR5LCB1c2FnZSwgJnBhcmFtcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyUG9vbERhdGE7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtQnVmZmVyUG9vbE1hbmFnZXItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHBhcmFtcywgJmNIYW5kbGUsICZidWZmZXJQb29sRGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihidWZmZXJQb29sRGF0YSk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MsIHBvb2xEYXRhLCAwLCBjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldEdyYXBoaWNQYXJhbXMod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJnBhcmFtcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyUG9vbERhdGE7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtQnVmZmVyUG9vbE1hbmFnZXItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHBhcmFtcywgJmNIYW5kbGUsICZidWZmZXJQb29sRGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihidWZmZXJQb29sRGF0YSk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jLCBwb29sRGF0YSwgQzJSZWN0KHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0ICE9IEMyX09LID8gSU5WQUxJRF9DT05ORUNUSU9OSUQgOiBtQ29ubmVjdGlvbklkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtQnVmZmVyUG9vbE1hbmFnZXI7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7IC8vIGxvY2FsbHkKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK0MyUG9vbGVkQmxvY2tQb29sOjpDMlBvb2xlZEJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJQb29sZWRCbG9ja1Bvb2w6On5DMlBvb2xlZEJsb2NrUG9vbCgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJQb29sZWRCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlBvb2xlZEJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2ludDY0X3QgQzJQb29sZWRCbG9ja1Bvb2w6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAyRCBCTE9DSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIDJEIGJsb2NrcyBhbmQgdmlld3MuCisgKgorICogRm9yIGJsb2NrcycgSW1wbCdzIGNyb3AgaXMgYWx3YXlzIHRoZSBhbGxvdHRlZCBjcm9wLCBldmVuIGlmIGl0IGlzIGEgc3ViIGJsb2NrLgorICoKKyAqIEZvciB2aWV3cycgSW1wbCdzIGNyb3AgaXMgdGhlIG1hcHBlZCBwb3J0aW9uIC0gd2hpY2ggZm9yIG5vdyBpcyBhbHdheXMgdGhlCisgKiBhbGxvdHRlZCBjcm9wLgorICovCitjbGFzcyBDMl9ISURFIF9DMkJsb2NrMkRJbXBsIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEltcGwncyBjcm9wIGlzIGFsd2F5cyB0aGUgb3IgcGFydCBvZiB0aGUgYWxsb3R0ZWQgY3JvcCBvZiB0aGUgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBfQzJCbG9jazJESW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCA9IEMyUmVjdCh+MHUsIH4wdSkpCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChhbGxvYy5nZXQoKSwgYWxsb3R0ZWRDcm9wKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIHZpcnR1YWwgfl9DMkJsb2NrMkRJbXBsKCkgPSBkZWZhdWx0OworCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGdldEFsbG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGE7Cit9OworCitjbGFzcyBDMl9ISURFIF9DMk1hcHBpbmdCbG9jazJESW1wbAorICAgIDogcHVibGljIF9DMkJsb2NrMkRJbXBsLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfQzJNYXBwaW5nQmxvY2syREltcGw+IHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJCbG9jazJESW1wbDo6X0MyQmxvY2syREltcGw7CisKKyAgICB2aXJ0dWFsIH5fQzJNYXBwaW5nQmxvY2syREltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgTWFwcGVkIHsKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsOworCisgICAgICAgIE1hcHBlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2syREltcGw+ICZpbXBsLCBib29sIHdyaXRhYmxlLCBDMkZlbmNlICpmZW5jZSBfX3VudXNlZCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCksIG1Xcml0YWJsZSh3cml0YWJsZSkgeworICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCBjcm9wID0gbUltcGwtPmNyb3AoKTsKKyAgICAgICAgICAgIC8vIGdyYWxsb2MgcmVxdWlyZXMgbWFwcGluZyB0aGUgd2hvbGUgcmVnaW9uIG9mIGludGVyZXN0IGFzIHdlIGNhbm5vdAorICAgICAgICAgICAgLy8gbWFwIG11bHRpcGxlIHJlZ2lvbnMKKyAgICAgICAgICAgIG1FcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgICAgICAgICAgY3JvcCwKKyAgICAgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgd3JpdGFibGUgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICZtTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICBtRGF0YSk7CisgICAgICAgICAgICBpZiAobUVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgcGxhbmUgbGF5b3V0IGFuZAorICAgICAgICAgICAgICAgIC8vIGFkanVzdCBkYXRhIHBvaW50ZXJzIHRvIHRoZSBjcm9wIHJlZ2lvbidzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgICAgICAgICAgICAvLyBmYWlsIGlmIGl0IGlzIG5vdCBvbiBhIHN1YnNhbXBsaW5nIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgcGxhbmVJeCA9IDA7IHBsYW5lSXggPCBtTGF5b3V0Lm51bVBsYW5lczsgKytwbGFuZUl4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNvbFNhbXBsaW5nID0gbUxheW91dC5wbGFuZXNbcGxhbmVJeF0uY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJvd1NhbXBsaW5nID0gbUxheW91dC5wbGFuZXNbcGxhbmVJeF0ucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wLmxlZnQgJSBjb2xTYW1wbGluZyB8fCBjcm9wLnJpZ2h0KCkgJSBjb2xTYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNyb3AudG9wICUgcm93U2FtcGxpbmcgfHwgY3JvcC5ib3R0b20oKSAlIHJvd1NhbXBsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY2FsY3VsYXRlIGRhdGEgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwtPmdldEFsbG9jYXRpb24oKS0+dW5tYXAobURhdGEsIGNyb3AsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRXJyb3IgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldERhdGFbcGxhbmVJeF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFbcGxhbmVJeF0gKyAoc3NpemVfdCljcm9wLmxlZnQgKiBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5jb2xJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc3NpemVfdCljcm9wLnRvcCAqIG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLnJvd0luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHBsaWNpdCBNYXBwZWQoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgICAgICAgICA6IG1JbXBsKG51bGxwdHIpLCBtV3JpdGFibGUoZmFsc2UpLCBtRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIH5NYXBwZWQoKSB7CisgICAgICAgICAgICBpZiAobURhdGFbMF0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKG1EYXRhLCBtSW1wbC0+Y3JvcCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiByZXR1cm5zIG1hcHBpbmcgc3RhdHVzICovCisgICAgICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgZGF0YSBwb2ludGVyICovCisgICAgICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbU9mZnNldERhdGE7IH0KKworICAgICAgICAvKiogcmV0dXJucyB0aGUgcGxhbmUgbGF5b3V0ICovCisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCgpIGNvbnN0IHsgcmV0dXJuIG1MYXlvdXQ7IH0KKworICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSBtYXBwaW5nIGlzIHdyaXRhYmxlICovCisgICAgICAgIGJvb2wgd3JpdGFibGUoKSBjb25zdCB7IHJldHVybiBtV3JpdGFibGU7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9jazJESW1wbD4gbUltcGw7CisgICAgICAgIGJvb2wgbVdyaXRhYmxlOworICAgICAgICBjMl9zdGF0dXNfdCBtRXJyb3I7CisgICAgICAgIHVpbnQ4X3QgKm1EYXRhW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgICAgIHVpbnQ4X3QgKm1PZmZzZXREYXRhW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IG1MYXlvdXQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhlIGFsbG90dGVkIHJlZ2lvbi4KKyAgICAgKgorICAgICAqIElmIGFscmVhZHkgbWFwcGVkIGFuZCBpdCBpcyBjdXJyZW50bHkgaW4gdXNlLCByZXR1cm5zIHRoZSBleGlzdGluZyBtYXBwaW5nLgorICAgICAqIElmIGZlbmNlIGlzIHByb3ZpZGVkLCBhbiBhY3F1aXJlIGZlbmNlIGlzIHN0b3JlZCB0aGVyZS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPiBtYXAoYm9vbCB3cml0YWJsZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPiBleGlzdGluZyA9IG1NYXBwZWQubG9jaygpOworICAgICAgICBpZiAoIWV4aXN0aW5nKSB7CisgICAgICAgICAgICBleGlzdGluZyA9IHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+KG5ldyBNYXBwZWQoc2hhcmVkX2Zyb21fdGhpcygpLCB3cml0YWJsZSwgZmVuY2UpKTsKKyAgICAgICAgICAgIG1NYXBwZWQgPSBleGlzdGluZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIG1hcHBlZCB0aGUgcmVnaW9uIHJlYWQtb25seSwgd2UgY2Fubm90IHJlbWFwIGl0IHJlYWQtd3JpdGUKKyAgICAgICAgICAgIGlmICh3cml0YWJsZSAmJiAhZXhpc3RpbmctPndyaXRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZyA9IHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+KG5ldyBNYXBwZWQoQzJfQ0FOTk9UX0RPKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmVuY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6d2Vha19wdHI8TWFwcGVkPiBtTWFwcGVkOworICAgIHN0ZDo6bXV0ZXggbU1hcHBlZExvY2s7Cit9OworCitjbGFzcyBDMl9ISURFIF9DMk1hcHBlZEJsb2NrMkRJbXBsIDogcHVibGljIF9DMkJsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICBfQzJNYXBwZWRCbG9jazJESW1wbChjb25zdCBfQzJCbG9jazJESW1wbCAmaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcpCisgICAgICAgIDogX0MyQmxvY2syREltcGwoaW1wbCksIG1NYXBwaW5nKG1hcHBpbmcpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5fQzJNYXBwZWRCbG9jazJESW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZygpIGNvbnN0IHsgcmV0dXJuIG1NYXBwaW5nOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtTWFwcGluZzsKK307CisKKy8qKgorICogQmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyQmxvY2syRDo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwaW5nQmxvY2syREltcGwgeworcHVibGljOgorICAgIHVzaW5nIF9DMk1hcHBpbmdCbG9jazJESW1wbDo6X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOworICAgIHZpcnR1YWwgfkltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCitjb25zdCBDMkhhbmRsZSAqQzJCbG9jazJEOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazJEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9CisKK0MyQmxvY2syRDo6QzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJzZWN0aW9uIHRvIHBhcmVudCAoaW1wbCkgY3JvcCBmb3Igc2FmZXR5CisgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGltcGwuZ2V0KCksIHNlY3Rpb24uY3JvcCgpKSwgbUltcGwoaW1wbCkgeworfQorCisvKioKKyAqIEdyYXBoaWMgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiByYW5nZSBvZiBJbXBsIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbi4gcmFuZ2Ugb2YgVmlldyBpcyB0aGUgY3VycmVudAorICogY3JvcC4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2syREltcGw6Ol9DMk1hcHBlZEJsb2NrMkRJbXBsOworICAgIHZpcnR1YWwgfkltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCitDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIDogX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0KGltcGwuZ2V0KCksIHNlY3Rpb24uY3JvcCgpKSwgbUltcGwoaW1wbCkgeworfQorCitjb25zdCB1aW50OF90ICpjb25zdCAqQzJHcmFwaGljVmlldzo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZGF0YSgpOworfQorCit1aW50OF90ICpjb25zdCAqQzJHcmFwaGljVmlldzo6ZGF0YSgpIHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZGF0YSgpOworfQorCitjb25zdCBDMlBsYW5hckxheW91dCBDMkdyYXBoaWNWaWV3OjpsYXlvdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmxheW91dCgpOworfQorCitjb25zdCBDMkdyYXBoaWNWaWV3IEMyR3JhcGhpY1ZpZXc6OnN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEMyR3JhcGhpY1ZpZXcobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIHJlY3QpKTsKK30KKworQzJHcmFwaGljVmlldyBDMkdyYXBoaWNWaWV3OjpzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgeworICAgIHJldHVybiBDMkdyYXBoaWNWaWV3KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCByZWN0KSk7Cit9CisKK2MyX3N0YXR1c190IEMyR3JhcGhpY1ZpZXc6OmVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5lcnJvcigpOworfQorCisvKioKKyAqIENvbnN0IGdyYXBoaWMgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKQorICAgIDogQzJCbG9jazJEKGltcGwsIHNlY3Rpb24pLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gQzJDb25zdEdyYXBoaWNCbG9jazo6bWFwKCkgY29uc3QgeworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nID0KKyAgICAgICAgbUltcGwtPm1hcChmYWxzZSAvKiB3cml0YWJsZSAqLywgJmZlbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4gZ3ZpID0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+KG5ldyBHcmFwaGljVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgbWFwcGluZykpOworICAgIHJldHVybiBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5KAorICAgICAgICAgICAgbWFwcGluZy0+ZXJyb3IoKSwgZmVuY2UsIEdyYXBoaWNWaWV3QnVkZHkoZ3ZpLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkpKSk7Cit9CisKK0MyQ29uc3RHcmFwaGljQmxvY2sgQzJDb25zdEdyYXBoaWNCbG9jazo6c3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEMyQ29uc3RHcmFwaGljQmxvY2sobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKS5pbnRlcnNlY3QocmVjdCkpLCBtRmVuY2UpOworfQorCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyR3JhcGhpY0Jsb2NrOjpDMkdyYXBoaWNCbG9jaygKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICA6IEMyQmxvY2syRChpbXBsLCBzZWN0aW9uKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IEMyR3JhcGhpY0Jsb2NrOjptYXAoKSB7CisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcgPQorICAgICAgICBtSW1wbC0+bWFwKHRydWUgLyogd3JpdGFibGUgKi8sICZmZW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+IGd2aSA9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPihuZXcgR3JhcGhpY1ZpZXdCdWRkeTo6SW1wbCgqbUltcGwsIG1hcHBpbmcpKTsKKyAgICByZXR1cm4gQWNxdWlyYWJsZUdyYXBoaWNWaWV3QnVkZHkoCisgICAgICAgICAgICBtYXBwaW5nLT5lcnJvcigpLCBmZW5jZSwgR3JhcGhpY1ZpZXdCdWRkeShndmksIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKSkpKTsKK30KKworQzJDb25zdEdyYXBoaWNCbG9jayBDMkdyYXBoaWNCbG9jazo6c2hhcmUoY29uc3QgQzJSZWN0ICZjcm9wLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0R3JhcGhpY0Jsb2NrQnVkZHkobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3ApLCBmZW5jZSk7Cit9CisKKy8qKgorICogQmFzaWMgYmxvY2sgcG9vbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK0MyQmFzaWNHcmFwaGljQmxvY2tQb29sOjpDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitjMl9zdGF0dXNfdCBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGJsb2NrLT5yZXNldCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMkQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2syRDo6SW1wbD4oYWxsb2MsIGRhdGEsIGFsbG90dGVkQ3JvcCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4obmV3IEMyR3JhcGhpY0Jsb2NrKGltcGwsICppbXBsKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMkQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWcgc2V0dXA/CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9CisgICAgICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJVRkZFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBDMkJ1ZmZlckRhdGE6OkltcGwgeworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IExJTkVBUiA6IExJTkVBUl9DSFVOS1MpLAorICAgICAgICAgIG1MaW5lYXJCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IEdSQVBISUMgOiBHUkFQSElDX0NIVU5LUyksCisgICAgICAgICAgbUdyYXBoaWNCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmxpbmVhckJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1MaW5lYXJCbG9ja3M7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmZ3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1HcmFwaGljQmxvY2tzOyB9CisKK3ByaXZhdGU6CisgICAgdHlwZV90IG1UeXBlOworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbUxpbmVhckJsb2NrczsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBtR3JhcGhpY0Jsb2NrczsKK307CisKK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorCitDMkJ1ZmZlckRhdGE6OnR5cGVfdCBDMkJ1ZmZlckRhdGE6OnR5cGUoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+dHlwZSgpOyB9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5saW5lYXJCbG9ja3MoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gQzJCdWZmZXJEYXRhOjpncmFwaGljQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z3JhcGhpY0Jsb2NrcygpOworfQorCitjbGFzcyBDMkJ1ZmZlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UaGlzKHRoaXopLCBtRGF0YShibG9ja3MpIHt9CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Ob3RpZnkpIHsKKyAgICAgICAgICAgIHBhaXIuZmlyc3QobVRoaXMsIHBhaXIuc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9CisKKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgIT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVtcGxhY2VfYmFjayhvbkRlc3Ryb3lOb3RpZnksIGFyZyk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Ob3RpZnkuYmVnaW4oKSwgbU5vdGlmeS5lbmQoKSwKKyAgICAgICAgICAgICAgICBbb25EZXN0cm95Tm90aWZ5LCBhcmddIChjb25zdCBhdXRvICZwYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IG9uRGVzdHJveU5vdGlmeSAmJiBwYWlyLnNlY29uZCA9PSBhcmc7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCA9PSBtTm90aWZ5LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZnkuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiByZXN1bHQobUluZm9zLnNpemUoKSk7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIG1JbmZvcy5iZWdpbigpLCBtSW5mb3MuZW5kKCksIHJlc3VsdC5iZWdpbigpLAorICAgICAgICAgICAgICAgIFtdIChjb25zdCBhdXRvICZlbGVtKSB7IHJldHVybiBlbGVtLnNlY29uZDsgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgICAgICAvLyBUbyAidXBkYXRlIiB5b3UgbmVlZCB0byBlcmFzZSB0aGUgZXhpc3Rpbmcgb25lIGlmIGFueSwgYW5kIHRoZW4gaW5zZXJ0LgorICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGluZm8tPmNvcmVJbmRleCgpKTsKKyAgICAgICAgKHZvaWQpIG1JbmZvcy5pbnNlcnQoeyBpbmZvLT5jb3JlSW5kZXgoKSwgaW5mbyB9KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5mb3MuY291bnQoaW5kZXguY29yZUluZGV4KCkpID4gMDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiBnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1JbmZvcy5maW5kKGluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1JbmZvcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PGNvbnN0IEMySW5mbz4oaXQtPnNlY29uZCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJldCA9IGl0LT5zZWNvbmQ7CisgICAgICAgICh2b2lkKSBtSW5mb3MuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJ1ZmZlciAqIGNvbnN0IG1UaGlzOworICAgIEJ1ZmZlckRhdGFCdWRkeSBtRGF0YTsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+PiBtSW5mb3M7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxPbkRlc3Ryb3lOb3RpZnksIHZvaWQgKj4+IG1Ob3RpZnk7Cit9OworCitDMkJ1ZmZlcjo6QzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW1wbChuZXcgSW1wbCh0aGlzLCBibG9ja3MpKSB7fQorCitjb25zdCBDMkJ1ZmZlckRhdGEgQzJCdWZmZXI6OmRhdGEoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjpyZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IEMyQnVmZmVyOjppbmZvKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aW5mbygpOworfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6c2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgIHJldHVybiBtSW1wbC0+c2V0SW5mbyhpbmZvKTsKK30KKworYm9vbCBDMkJ1ZmZlcjo6aGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYXNJbmZvKGluZGV4KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gQzJCdWZmZXI6OmdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IEMyQnVmZmVyOjpyZW1vdmVJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlbW92ZUluZm8oaW5kZXgpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTEyOTAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkNvbmZpZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLyoqCisgKiBEZWZpbmUgYW5kIGluaXRpYWxpemUgZ2xvYmFsIGNvbmZpZyBmaWVsZCBkZXNjcmlwdG9ycyBpbiB0aGlzIGNwcCBmaWxlCisgKi8KKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6cHJvZmlsZV90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQgfSwKKyAgICAgICAgeyAiYWFjLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDIH0sCisgICAgICAgIHsgImFhYy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX01BSU4gfSwKKyAgICAgICAgeyAiYWFjLXNzciIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TU1IgfSwKKyAgICAgICAgeyAiYWFjLWx0cCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MVFAgfSwKKyAgICAgICAgeyAiYWFjLWhlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFIH0sCisgICAgICAgIHsgImFhYy1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtZXItbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfTEMgfSwKKyAgICAgICAgeyAiYWFjLWVyLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFIH0sCisgICAgICAgIHsgImFhYy1sZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCB9LAorICAgICAgICB7ICJhYWMtaGUtcHMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMgfSwKKyAgICAgICAgeyAiYWFjLWVsZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQgfSwKKyAgICAgICAgeyAiYWFjLXhoZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUgfSwKKyAgICAgICAgeyAibXAydi1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDJ2LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1zbnItc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LXNwYXRpYWxseS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfNDIyIH0sCisgICAgICAgIHsgIm1wMnYtbXVsdGl2aWV3IiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NVUxUSVZJRVcgfSwKKyAgICAgICAgeyAiaDI2My1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiaDI2My1oMzIwIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwIH0sCisgICAgICAgIHsgImgyNjMtdjFiYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQyB9LAorICAgICAgICB7ICJoMjYzLWlzd3YyIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiB9LAorICAgICAgICB7ICJoMjYzLWlzd3YzIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMyB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtY29tcHJlc3Npb24iLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04gfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcm5ldCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQgfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcmxhY2UiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTEFDRSB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtbGF0ZW5jeSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWNvcmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkUgfSwKKyAgICAgICAgeyAibXA0di1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9NQUlOIH0sCisgICAgICAgIHsgIm1wNHYtbmJpdCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCB9LAorICAgICAgICB7ICJtcDR2LWFydHMiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FSVFMgfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wNHYtYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UgfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWNvcmUtc3R1ZGlvIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWFkdmFuY2VkLXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtZmdzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9GR1MgfSwKKyAgICAgICAgeyAiYXZjLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NQUlOIH0sCisgICAgICAgIHsgImF2Yy1leHRlbmRlZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCB9LAorICAgICAgICB7ICJhdmMtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1wcmVkaWN0aXZlIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X1BSRURJQ1RJVkUgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtaGlnaC00MjItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1jYXZsYy00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zdGVyZW8taGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tZmMtZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NRkNfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtZW5oYW5jZWQtbXVsdGl2aWV3LWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRU5IQU5DRURfTVVMVElWSUVXX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PIH0sCisgICAgICAgIHsgImhldmMtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xNCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTQgfSwKKyAgICAgICAgeyAiaGV2Yy1tdWx0aXZpZXctbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTVVMVElWSUVXX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzEyIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xNiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xNiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLTNkLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDXzNEX01BSU4gfSwKKyAgICAgICAgeyAidnA5LTAiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCB9LAorICAgICAgICB7ICJ2cDktMSIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMyB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OmxldmVsX3QsICh7CisgICAgICAgIHsgInVudXNlZCIsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQgfSwKKyAgICAgICAgeyAibXAydi1sb3ciLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1cgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2gtMTQ0MCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaHAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCB9LAorICAgICAgICB7ICJoMjYzLTEwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAgfSwKKyAgICAgICAgeyAiaDI2My0yMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwIH0sCisgICAgICAgIHsgImgyNjMtMzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCB9LAorICAgICAgICB7ICJoMjYzLTQwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAgfSwKKyAgICAgICAgeyAiaDI2My00NSIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1IH0sCisgICAgICAgIHsgImgyNjMtNTAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCB9LAorICAgICAgICB7ICJoMjYzLTYwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNjAgfSwKKyAgICAgICAgeyAiaDI2My03MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwIH0sCisgICAgICAgIHsgIm1wNHYtMCIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAgfSwKKyAgICAgICAgeyAibXA0di0wYiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCIH0sCisgICAgICAgIHsgIm1wNHYtMSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEgfSwKKyAgICAgICAgeyAibXA0di0yIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMiB9LAorICAgICAgICB7ICJtcDR2LTMiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zIH0sCisgICAgICAgIHsgIm1wNHYtM2IiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiB9LAorICAgICAgICB7ICJtcDR2LTQiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80IH0sCisgICAgICAgIHsgIm1wNHYtNGEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSB9LAorICAgICAgICB7ICJtcDR2LTUiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81IH0sCisgICAgICAgIHsgIm1wNHYtNiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzYgfSwKKyAgICAgICAgeyAiYXZjLTEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzEgfSwKKyAgICAgICAgeyAiYXZjLTFiIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xQiB9LAorICAgICAgICB7ICJhdmMtMS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEgfSwKKyAgICAgICAgeyAiYXZjLTEuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yIH0sCisgICAgICAgIHsgImF2Yy0xLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMyB9LAorICAgICAgICB7ICJhdmMtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMiB9LAorICAgICAgICB7ICJhdmMtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEgfSwKKyAgICAgICAgeyAiYXZjLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8yIH0sCisgICAgICAgIHsgImF2Yy0zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zIH0sCisgICAgICAgIHsgImF2Yy0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSB9LAorICAgICAgICB7ICJhdmMtMy4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIgfSwKKyAgICAgICAgeyAiYXZjLTQiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzQgfSwKKyAgICAgICAgeyAiYXZjLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xIH0sCisgICAgICAgIHsgImF2Yy00LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiB9LAorICAgICAgICB7ICJhdmMtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNSB9LAorICAgICAgICB7ICJhdmMtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ181XzEgfSwKKyAgICAgICAgeyAiYXZjLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMyIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMyB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMy4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81IH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNS4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi02LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xIH0sCisgICAgICAgIHsgImhldmMtaGlnaC01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNiB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8yIH0sCisgICAgICAgIHsgInZwOS0xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0xLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSB9LAorICAgICAgICB7ICJ2cDktMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMiB9LAorICAgICAgICB7ICJ2cDktMi4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzMgfSwKKyAgICAgICAgeyAidnA5LTMuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xIH0sCisgICAgICAgIHsgInZwOS00IiwgQzJDb25maWc6OkxFVkVMX1ZQOV80IH0sCisgICAgICAgIHsgInZwOS00LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSB9LAorICAgICAgICB7ICJ2cDktNSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSB9LAorICAgICAgICB7ICJ2cDktNS4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzEgfSwKKyAgICAgICAgeyAidnA5LTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8yIH0sCisgICAgICAgIHsgInZwOS02IiwgQzJDb25maWc6OkxFVkVMX1ZQOV82IH0sCisgICAgICAgIHsgInZwOS02LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMSB9LAorICAgICAgICB7ICJ2cDktNi4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV82XzIgfSwKK30pKQorCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQnVmZmVyRGF0YTo6dHlwZV90LCAoeworICAgICAgICB7ICJpbnZhbGlkIiwgICAgICAgIEMyQnVmZmVyRGF0YTo6SU5WQUxJRCB9LAorICAgICAgICB7ICJsaW5lYXIiLCAgICAgICAgIEMyQnVmZmVyRGF0YTo6TElORUFSIH0sCisgICAgICAgIHsgImxpbmVhci1jaHVua3MiLCAgQzJCdWZmZXJEYXRhOjpMSU5FQVJfQ0hVTktTIH0sCisgICAgICAgIHsgImdyYXBoaWMiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpHUkFQSElDIH0sCisgICAgICAgIHsgImdyYXBoaWMtY2h1bmtzIiwgQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUyB9LAorfSkpCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMzBlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmgiCisKKy8qIHN0YXRpYyAqLyBhbmRyb2lkOjpNdXRleCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OnNNdXRleDsKKy8qIHN0YXRpYyAqLyBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitjb25zdGV4cHIgY29uc3QgY2hhciBrU3RvcmVQbHVnaW5QYXRoW10gPSAibGliYzJwbHVnaW5fc3RvcmUuc28iOworCit9ICAvLyB1bm5hbWVkCisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCisgICAgOiBtQ3JlYXRlQmxvY2tQb29sKG51bGxwdHIpIHsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNyZWF0ZUJsb2NrUG9vbCA9IChDcmVhdGVCbG9ja1Bvb2xGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVCbG9ja1Bvb2wiKTsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUJsb2NrUG9vbCAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9CisgICAgbUNyZWF0ZUFsbG9jYXRvciA9IChDcmVhdGVBbGxvY2F0b3JGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVBbGxvY2F0b3IiKTsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gZmluZCBzeW1ib2w6IENyZWF0ZUFsbG9jYXRvciAoJXMpIiwgZGxlcnJvcigpKTsKKyAgICB9Cit9CisKK0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6fkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJDbG9zaW5nIGhhbmRsZSIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIDo6QzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4qIHBvb2wpIHsKKyAgICBpZiAobUNyZWF0ZUJsb2NrUG9vbCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQmxvY2tQb29sIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPDo6QzJCbG9ja1Bvb2w+IHB0cihtQ3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBibG9ja1Bvb2xJZCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVCbG9ja1Bvb2wgYnkgYWxsb2NhdG9yIGlkOiAldSIsIGFsbG9jYXRvcklkKTsKKyAgICByZXR1cm4gQzJfQkFEX0lOREVYOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUFsbG9jYXRvcigKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKSB7CisgICAgaWYgKG1DcmVhdGVBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUFsbG9jYXRvciBzeW1ib2wgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX0NPUlJVUFRFRDsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KG1DcmVhdGVBbGxvY2F0b3IoYWxsb2NhdG9ySWQsICZyZXMpKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gQ3JlYXRlQWxsb2NhdG9yIGJ5IGlkOiAldSwgcmVzOiAlZCIsIGFsbG9jYXRvcklkLCByZXMpOworICAgICAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gc3RhdGljCitjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiYgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpIHsKKyAgICBhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgX2woc011dGV4KTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBBTE9HVigiTG9hZGluZyBsaWJyYXJ5Iik7CisgICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKGtTdG9yZVBsdWdpblBhdGgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZTE5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyU3RvcmUuY3BwCkBAIC0wLDAgKzEsOTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMlN0b3JlIgorI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyBnZXRwYWdlc2l6ZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgaW4gdGhpcyBwcm9jZXNzIHRvIGFjY2VzcyBpdHMgaW50ZXJmYWNlLgorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKTsKKworLyoqCisgKiBUaGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIHByb3ZpZGVzIGJhc2ljIGFsbG9jYXRvci10eXBlcyBmb3IgdGhlIGZyYW1ld29yayBiYXNlZCBvbiBpb24gYW5kCisgKiBncmFsbG9jLiBBbGxvY2F0b3JzIGFyZSBub3QgbWVhbnQgdG8gYmUgdXBkYXRhYmxlLgorICoKKyAqIFx0b2RvIFByb3ZpZGUgYWxsb2NhdG9yIGJhc2VkIG9uIGFzaG1lbQorICogXHRvZG8gTW92ZSBpb24gYWxsb2NhdGlvbiBpbnRvIGl0cyBISURMIG9yIHByb3ZpZGUgc29tZSBtYXBwaW5nIGZyb20gbWVtb3J5IHVzYWdlIHRvIGlvbiBmbGFncworICogXHRvZG8gTWFrZSB0aGlzIGFsbG9jYXRvciBzdG9yZSBleHRlbmRhYmxlCisgKi8KK2NsYXNzIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwgOiBwdWJsaWMgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlIHsKK3B1YmxpYzoKKyAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAqY29uc3QgYWxsb2NhdG9yKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PiBsaXN0QWxsb2NhdG9yc19uYigpCisgICAgICAgICAgICBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+KCk7IC8vLyBcdG9kbworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJhbmRyb2lkLmFsbG9jYXRvci1zdG9yZSI7CisgICAgfQorCisgICAgdm9pZCBzZXRDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCisgICAgfkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGlvbiBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoSW9uQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gZ3JhbGxvYyBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOworCisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGJ1ZmZlcnF1ZXVlIHN1cHBvcnRpbmcgZ3JhbGxvYyBhbGxvY2F0b3IKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKTsKKworICAgIC8vLyBjb21wb25lbnQgc3RvcmUgdG8gdXNlCisgICAgc3RkOjptdXRleCBfbUNvbXBvbmVudFN0b3JlU2V0TG9jazsgLy8gcHJvdGVjdHMgdGhlIGVudGlyZSB1cGRhdGluZyBfbUNvbXBvbmVudFN0b3JlIGFuZCBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICBzdGQ6Om11dGV4IF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jazsgLy8gbXVzdCBwcm90ZWN0IG9ubHkgcmVhZC93cml0ZSBvZiBfbUNvbXBvbmVudFN0b3JlCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IF9tQ29tcG9uZW50U3RvcmU7Cit9OworCitDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEFsbG9jYXRvcigKKyAgICAgICAgaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAqY29uc3QgYWxsb2NhdG9yKSB7CisgICAgYWxsb2NhdG9yLT5yZXNldCgpOworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAvLyBUT0RPOiBzaG91bGQgd2UgaW1wbGVtZW50IGEgZ2VuZXJpYyByZWdpc3RyeSBmb3IgYWxsLCBhbmQgdXNlIHRoYXQ/CisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKKyAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzoKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIHBsdWdpbnMuCisgICAgICAgIGMyX3N0YXR1c190IHJlcyA9CisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpLT5jcmVhdGVBbGxvY2F0b3IoaWQsIGFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Om11dGV4IGdJb25BbGxvY2F0b3JNdXRleDsKK3N0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3JJb24+IGdJb25BbGxvY2F0b3I7CisKK3ZvaWQgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpIHsKKyAgICBDMkFsbG9jYXRvcklvbjo6VXNhZ2VNYXBwZXJGbiBtYXBwZXI7CisgICAgdWludDY0X3QgbWluVXNhZ2UgPSAwOworICAgIHVpbnQ2NF90IG1heFVzYWdlID0gQzJNZW1vcnlVc2FnZShDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKS5leHBlY3RlZDsKKyAgICBzaXplX3QgYmxvY2tTaXplID0gZ2V0cGFnZXNpemUoKTsKKworICAgIC8vIHF1ZXJ5IG1pbiBhbmQgbWF4IHVzYWdlIGFzIHdlbGwgYXMgYmxvY2sgc2l6ZSB2aWEgc3VwcG9ydGVkIHZhbHVlcworICAgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLnVzYWdlKSksCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkOjpNYWtlKHVzYWdlSW5mbywgdXNhZ2VJbmZvLmNhcGFjaXR5KSksCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20ocXVlcnkpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgaWYgKHF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmZnN2ID0gcXVlcnlbMF0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTICYmICFmc3YudmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtaW5Vc2FnZSA9IGZzdi52YWx1ZXNbMF0udTY0OworICAgICAgICAgICAgICAgIG1heFVzYWdlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2IDogZnN2LnZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBtYXhVc2FnZSB8PSB2LnU2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5WzFdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmZnN2ID0gcXVlcnlbMV0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFICYmIGZzdi5yYW5nZS5zdGVwLnUzMiA+IDApIHsKKyAgICAgICAgICAgICAgICBibG9ja1NpemUgPSBmc3YucmFuZ2Uuc3RlcC51MzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYXBwZXIgPSBbc3RvcmVdKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgaWYgKGNhcGFjaXR5ID4gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvIHVzYWdlSW5mbyA9IHsgdXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5IH07CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7IC8vIFRPRE86IHJlbW92ZQorICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPmNvbmZpZ19zbSh7JnVzYWdlSW5mb30sICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgKmFsaWduID0gdXNhZ2VJbmZvLm1pbkFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAqaGVhcE1hc2sgPSB1c2FnZUluZm8uaGVhcE1hc2s7CisgICAgICAgICAgICAgICAgKmZsYWdzID0gdXNhZ2VJbmZvLmFsbG9jRmxhZ3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9OworICAgIH0KKworICAgIGFsbG9jYXRvci0+c2V0VXNhZ2VNYXBwZXIobWFwcGVyLCBtaW5Vc2FnZSwgbWF4VXNhZ2UsIGJsb2NrU2l6ZSk7Cit9CisKK30KKwordm9pZCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpzZXRDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpIHsKKyAgICAvLyB0ZWNobmljYWxseSB0aGlzIHNldCBsb2NrIGlzIG5vdCBuZWVkZWQsIGJ1dCBpcyBoZXJlIGZvciBzYWZldHkgaW4gY2FzZSB3ZSBhZGQgbW9yZQorICAgIC8vIGdldHRlciBvcmRlcnMKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlU2V0TG9jayk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlUmVhZExvY2spOworICAgICAgICBfbUNvbXBvbmVudFN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lvbkFsbG9jYXRvck11dGV4KTsKKyAgICAgICAgYWxsb2NhdG9yID0gZ0lvbkFsbG9jYXRvci5sb2NrKCk7CisgICAgfQorICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoYWxsb2NhdG9yLCBzdG9yZSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoSW9uQWxsb2NhdG9yKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdJb25BbGxvY2F0b3JNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IgPSBnSW9uQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbUNvbXBvbmVudFN0b3JlUmVhZExvY2spOworICAgICAgICAgICAgY29tcG9uZW50U3RvcmUgPSBfbUNvbXBvbmVudFN0b3JlOworICAgICAgICB9CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OKTsKKyAgICAgICAgVXNlQ29tcG9uZW50U3RvcmVGb3JJb25BbGxvY2F0b3IoYWxsb2NhdG9yLCBjb21wb25lbnRTdG9yZSk7CisgICAgICAgIGdJb25BbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBncmFsbG9jQWxsb2NhdG9yOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdyYWxsb2NBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DKTsKKyAgICAgICAgZ3JhbGxvY0FsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9yPiBncmFsbG9jQWxsb2NhdG9yOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvciA9IGdyYWxsb2NBbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oCisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgdHJ1ZSk7CisgICAgICAgIGdyYWxsb2NBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK25hbWVzcGFjZSB7CisgICAgc3RkOjptdXRleCBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlOworCisgICAgc3RkOjptdXRleCBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4OworICAgIHN0ZDo6d2Vha19wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBzdG9yZSA9IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlLmxvY2soKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBzdG9yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4oKTsKKyAgICAgICAgc3RvcmUtPnNldENvbXBvbmVudFN0b3JlKEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCkpOworICAgICAgICBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICByZXR1cm4gc3RvcmU7Cit9CisKK3ZvaWQgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOyAvLyBkb24ndCBpbnRlcmxldmUgc2V0LXMKKworICAgIC8vIHVwZGF0ZSBwcmVmZXJyZWQgc3RvcmUKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4KTsKKyAgICAgICAgZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlID0gY29tcG9uZW50U3RvcmU7CisgICAgfQorCisgICAgLy8gdXBkYXRlIHBsYXRmb3JtIGFsbG9jYXRvcidzIHN0b3JlIGFzIHdlbGwgaWYgaXQgaXMgYWxpdmUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gYWxsb2NhdG9yU3RvcmU7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4KTsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUgPSBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZS5sb2NrKCk7CisgICAgfQorICAgIGlmIChhbGxvY2F0b3JTdG9yZSkgeworICAgICAgICBhbGxvY2F0b3JTdG9yZS0+c2V0Q29tcG9uZW50U3RvcmUoY29tcG9uZW50U3RvcmUpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4KTsKKyAgICByZXR1cm4gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlID8gZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlIDogR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworfQorCituYW1lc3BhY2UgeworCitjbGFzcyBfQzJCbG9ja1Bvb2xDYWNoZSB7CitwdWJsaWM6CisgICAgX0MyQmxvY2tQb29sQ2FjaGUoKSA6IG1CbG9ja1Bvb2xTZXFJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQgKyAxKSB7fQorCisgICAgYzJfc3RhdHVzX3QgX2NyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPQorICAgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX05PVF9GT1VORDsKKworICAgICAgICBzd2l0Y2goYWxsb2NhdG9ySWQpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046CisgICAgICAgICAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CisgICAgICAgICAgICBjYXNlIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzoKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGJsb2NrIHBvb2wgZnJvbSBwbGF0Zm9ybSBzdG9yZSBwbHVnaW5zLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyOworICAgICAgICAgICAgICAgIHJlcyA9IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9ySWQsIHBvb2xJZCwgJnB0cik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgcmV0dXJuIF9jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgbUJsb2NrUG9vbFNlcUlkKyssIHBvb2wpOworICAgIH0KKworICAgIGJvb2wgZ2V0QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9uZSBpdGVyYXRvciBmb3IgbXVsdGlwbGUgYmxvY2twb29sIHR5cGUgc2NhbGFiaWxpdHkuCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyOworICAgICAgICBhdXRvIGl0ID0gbUJsb2NrUG9vbHMuZmluZChibG9ja1Bvb2xJZCk7CisgICAgICAgIGlmIChpdCAhPSBtQmxvY2tQb29scy5lbmQoKSkgeworICAgICAgICAgICAgcHRyID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIXB0cikgeworICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50cy5lcmFzZShibG9ja1Bvb2xJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBtQ29tcG9uZW50cy5maW5kKGJsb2NrUG9vbElkKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09IGZvdW5kLT5zZWNvbmQubG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sU2VxSWQ7CisKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gbUNvbXBvbmVudHM7Cit9OworCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPF9DMkJsb2NrUG9vbENhY2hlPiBzQmxvY2tQb29sQ2FjaGUgPQorICAgIHN0ZDo6bWFrZV91bmlxdWU8X0MyQmxvY2tQb29sQ2FjaGU+KCk7CitzdGF0aWMgc3RkOjptdXRleCBzQmxvY2tQb29sQ2FjaGVNdXRleDsKKworfSAvLyBhbnlueW1vdXMgbmFtZXNwYWNlCisKK2MyX3N0YXR1c190IEdldENvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX05PVF9GT1VORDsKKworICAgIGlmIChpZCA+PSBDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpIHsKKyAgICAgICAgaWYgKHNCbG9ja1Bvb2xDYWNoZS0+Z2V0QmxvY2tQb29sKGlkLCBjb21wb25lbnQsIHBvb2wpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOgorICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAqcG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0xpbmVhckJsb2NrUG9vbD4oYWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOgorICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgKnBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNHcmFwaGljQmxvY2tQb29sPihhbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzLiB0aGlzIGlzIHRlbXBvcmFyeQorICAgIGNhc2UgQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUOgorICAgICAgICByZXMgPSBzQmxvY2tQb29sQ2FjaGUtPl9jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgY29tcG9uZW50LCBpZCwgcG9vbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHJldHVybiBzQmxvY2tQb29sQ2FjaGUtPmNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKK30KKworY2xhc3MgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworcHVibGljOgorICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBzcmMsIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGRzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlOworICAgIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworCisgICAgdmlydHVhbCB+QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBsb2FkZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHByb3ZpZGUgYSB3YXkgdG8gYWRkIHRyYWl0cyB0byBrbm93biBjb21wb25lbnRzIGhlcmUgdG8gYXZvaWQgbG9hZGluZyB0aGUgLnNvLXMKKyAgICAgKiBmb3IgbGlzdENvbXBvbmVudHMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29tcG9uZW50TW9kdWxlIDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSwKKyAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENvbXBvbmVudE1vZHVsZT4geworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICBDb21wb25lbnREZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50PigpKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICppbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudEludGVyZmFjZT4oKSkgb3ZlcnJpZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFxyZXR1cm5zIHRoZSB0cmFpdHMgb2YgdGhlIGNvbXBvbmVudCBpbiB0aGlzIG1vZHVsZS4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBnZXRUcmFpdHMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBuYW1lW2luXSAgY29tcG9uZW50IG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBDb21wb25lbnRNb2R1bGUoKQorICAgICAgICAgICAgOiBtSW5pdChDMl9OT19JTklUKSwKKyAgICAgICAgICAgICAgbUxpYkhhbmRsZShudWxscHRyKSwKKyAgICAgICAgICAgICAgY3JlYXRlRmFjdG9yeShudWxscHRyKSwKKyAgICAgICAgICAgICAgZGVzdHJveUZhY3RvcnkobnVsbHB0ciksCisgICAgICAgICAgICAgIG1Db21wb25lbnRGYWN0b3J5KG51bGxwdHIpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplcyBhIGNvbXBvbmVudCBtb2R1bGUgd2l0aCBhIGdpdmVuIGxpYnJhcnkgcGF0aC4gTXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gYWxpYXNbaW5dICAgbW9kdWxlIGFsaWFzCisgICAgICAgICAqIFxwYXJhbSBsaWJQYXRoW2luXSBsaWJyYXJ5IHBhdGgKKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkaW5nIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZCAodW5leHBlY3RlZCkKKyAgICAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gbG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZSAodW5leHBlY3RlZCkKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGxvYWQgdGhlIG1vZHVsZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCBpbml0KHN0ZDo6c3RyaW5nIGFsaWFzLCBzdGQ6OnN0cmluZyBsaWJQYXRoKTsKKworICAgICAgICB2aXJ0dWFsIH5Db21wb25lbnRNb2R1bGUoKSBvdmVycmlkZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpyZWN1cnNpdmVfbXV0ZXggbUxvY2s7IC8vLzwgbG9jayBwcm90ZWN0aW5nIG1UcmFpdHMKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpUcmFpdHM+IG1UcmFpdHM7IC8vLzwgY2FjaGVkIGNvbXBvbmVudCB0cmFpdHMKKworICAgICAgICBjMl9zdGF0dXNfdCBtSW5pdDsgLy8vPCBpbml0aWFsaXphdGlvbiByZXN1bHQKKworICAgICAgICB2b2lkICptTGliSGFuZGxlOyAvLy88IGxvYWRlZCBsaWJyYXJ5IGhhbmRsZQorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jIGNyZWF0ZUZhY3Rvcnk7IC8vLzwgbG9hZGVkIGNyZWF0ZSBmdW5jdGlvbgorICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYyBkZXN0cm95RmFjdG9yeTsgLy8vPCBsb2FkZWQgZGVzdHJveSBmdW5jdGlvbgorICAgICAgICBDMkNvbXBvbmVudEZhY3RvcnkgKm1Db21wb25lbnRGYWN0b3J5OyAvLy88IGxvYWRlZC9jcmVhdGVkIGNvbXBvbmVudCBmYWN0b3J5CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBlbmNhcHN1bGF0aW5nIGEgbG9hZGFibGUgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgKgorICAgICAqIFx0b2RvIG1ha2UgdGhpcyBhbHNvIHdvcmsgZm9yIGVudW1lcmF0aW9ucworICAgICAqLworICAgIHN0cnVjdCBDb21wb25lbnRMb2FkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIGNvbXBvbmVudCBtb2R1bGUgaWYgaXQgaXMgYWxyZWFkeSBjdXJyZW50bHkgbG9hZGVkLCBvcgorICAgICAgICAgKiBhdHRlbXB0cyB0byBsb2FkIGl0IGlmIGl0IGlzIG5vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG1vZHVsZVtvdXRdIHBvaW50ZXIgdG8gdGhlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBsb2FkZWQgbW9kdWxlIHNoYWxsIGJlIHN0b3JlZC4KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBiZSBudWxscHRyIG9uIGVycm9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWRpbmcgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIHBlcm1pc3Npb24gZGVuaWVkIHRvIGxvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IGZldGNoTW9kdWxlKHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+ICptb2R1bGUpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IGxvY2FsTW9kdWxlID0gbU1vZHVsZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAobG9jYWxNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gc3RkOjptYWtlX3NoYXJlZDxDb21wb25lbnRNb2R1bGU+KCk7CisgICAgICAgICAgICAgICAgcmVzID0gbG9jYWxNb2R1bGUtPmluaXQobUFsaWFzLCBtTGliUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBtTW9kdWxlID0gbG9jYWxNb2R1bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm1vZHVsZSA9IGxvY2FsTW9kdWxlOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGxvYWRlciBmb3IgYSBzcGVjaWZpYyBsaWJyYXJ5IHBhdGggKG9yIG5hbWUpLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TG9hZGVyKHN0ZDo6c3RyaW5nIGFsaWFzLCBzdGQ6OnN0cmluZyBsaWJQYXRoKQorICAgICAgICAgICAgOiBtQWxpYXMoYWxpYXMpLCBtTGliUGF0aChsaWJQYXRoKSB7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIG1vZHVsZQorICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudE1vZHVsZT4gbU1vZHVsZTsgLy8vPCB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgbG9hZGVkIG1vZHVsZQorICAgICAgICBzdGQ6OnN0cmluZyBtQWxpYXM7IC8vLzwgY29tcG9uZW50IGFsaWFzCisgICAgICAgIHN0ZDo6c3RyaW5nIG1MaWJQYXRoOyAvLy88IGxpYnJhcnkgcGF0aAorICAgIH07CisKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVJb25Vc2FnZUluZm8+IG1Jb25Vc2FnZUluZm87CisKKyAgICAgICAgSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICAgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICAgICAgc3RydWN0IFNldHRlciB7CisgICAgICAgICAgICAgICAgc3RhdGljIEMyUiBzZXRJb25Vc2FnZShib29sIC8qIG1heUJsb2NrICovLCBDMlA8QzJTdG9yZUlvblVzYWdlSW5mbz4gJm1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmhlYXBNYXNrID0gfjA7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmFsbG9jRmxhZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5taW5BbGlnbm1lbnQgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW9uVXNhZ2VJbmZvLCAiaW9uLXVzYWdlIikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RvcmVJb25Vc2FnZUluZm8oKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCB1c2FnZSkuZmxhZ3Moe0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBjYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGhlYXBNYXNrKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGFsbG9jRmxhZ3MpLmZsYWdzKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIG1pbkFsaWdubWVudCkuZXF1YWxUbygwKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyOjpzZXRJb25Vc2FnZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgbG9hZGVyIGZvciBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBub24tcmVmLWhvbGRpbmcgcG9pbnRlciB0byB0aGUgY29tcG9uZW50IGxvYWRlci4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbG9hZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2NhdGUgdGhlIGNvbXBvbmVudCBsb2FkZXIKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgdG8gYmUgbG9hZGVkCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBsb2FkZXIgY291bGQgbm90IGJlIGlkZW50aWZpZWQgZHVlIHRvIHNvbWUgbW9kdWxlcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRlZCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGFuIGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVkIGNvbXBvbmVudCBidXQgc29tZSBjb21wb25lbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYmFkIGxpYnJhcnkpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gZmluZCB0aGUgY29tcG9uZW50IGxvYWRlciBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeSBpZGVudGlmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gbGFjayBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGZpbmRDb21wb25lbnQoQzJTdHJpbmcgbmFtZSwgQ29tcG9uZW50TG9hZGVyICoqbG9hZGVyKTsKKworICAgIHN0ZDo6bWFwPEMyU3RyaW5nLCBDb21wb25lbnRMb2FkZXI+IG1Db21wb25lbnRzOyAvLy88IG1hcCBvZiBuYW1lIC0+IGNvbXBvbmVudHMKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gbUNvbXBvbmVudHNMaXN0OyAvLy88IGxpc3Qgb2YgY29tcG9uZW50cworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBJbnRlcmZhY2UgbUludGVyZmFjZTsKK307CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjppbml0KAorICAgICAgICBzdGQ6OnN0cmluZyBhbGlhcywgc3RkOjpzdHJpbmcgbGliUGF0aCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigibG9hZGluZyBkbGwiKTsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBjb3VsZCBiZSBhY2Nlc3Mvc3ltYm9sIG9yIHNpbXBseSBub3QgYmVpbmcgdGhlcmUKKyAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBkbG9wZW4gJXM6ICVzIiwgbGliUGF0aC5jX3N0cigpLCBkbGVycm9yKCkpOworICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBjcmVhdGVGYWN0b3J5ID0KKyAgICAgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVDb2RlYzJGYWN0b3J5Iik7CisgICAgICAgIGRlc3Ryb3lGYWN0b3J5ID0KKyAgICAgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiRGVzdHJveUNvZGVjMkZhY3RvcnkiKTsKKworICAgICAgICBtQ29tcG9uZW50RmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKTsKKyAgICAgICAgaWYgKG1Db21wb25lbnRGYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGZhY3RvcnkgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgbUluaXQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5pdCA9IEMyX09LOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmOworICAgIGMyX3N0YXR1c190IHJlcyA9IGNyZWF0ZUludGVyZmFjZSgwLCAmaW50Zik7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2U6ICVkIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMobmV3IChzdGQ6Om5vdGhyb3cpIEMyQ29tcG9uZW50OjpUcmFpdHMpOworICAgIGlmICh0cmFpdHMpIHsKKyAgICAgICAgaWYgKGFsaWFzICE9IGludGYtPmdldE5hbWUoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIGlzIGFsaWFzIHRvICVzIiwgYWxpYXMuY19zdHIoKSwgaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHRyYWl0cy0+bmFtZSA9IGFsaWFzOworICAgICAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGVyZmFjZSBwcm9wZXJseS4KKyAgICAgICAgYm9vbCBlbmNvZGVyID0gKHRyYWl0cy0+bmFtZS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpOworICAgICAgICB1aW50MzJfdCBtZWRpYVR5cGVJbmRleCA9IGVuY29kZXIgPyBDMlBvcnRNaW1lQ29uZmlnOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICA6IEMyUG9ydE1pbWVDb25maWc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgbWVkaWFUeXBlSW5kZXggfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6ICVkIiwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6IHVuZXhwZWN0ZWQgdmVjdG9yIHNpemU6ICV6dSIsIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIEMyUG9ydE1pbWVDb25maWcgKm1lZGlhVHlwZUNvbmZpZyA9IChDMlBvcnRNaW1lQ29uZmlnICopKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgIGlmIChtZWRpYVR5cGVDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBtZWRpYSB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzLT5tZWRpYVR5cGUgPSBtZWRpYVR5cGVDb25maWctPm0udmFsdWU7CisgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIHByb3Blcmx5LgorICAgICAgICB0cmFpdHMtPnJhbmsgPSAweDIwMDsKKworICAgICAgICAvLyBUT0RPOiBkZWZpbmUgdGhlc2UgdmFsdWVzIHByb3Blcmx5CisgICAgICAgIGJvb2wgZGVjb2RlciA9ICh0cmFpdHMtPm5hbWUuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICAgICAgdHJhaXRzLT5raW5kID0KKyAgICAgICAgICAgICAgICBkZWNvZGVyID8gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiA6CisgICAgICAgICAgICAgICAgZW5jb2RlciA/IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgOgorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOworICAgICAgICBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiYXVkaW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJpbWFnZS8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVI7CisgICAgICAgIH0KKyAgICB9CisgICAgbVRyYWl0cyA9IHRyYWl0czsKKworICAgIHJldHVybiBtSW5pdDsKK30KKworQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6On5Db21wb25lbnRNb2R1bGUoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGlmIChkZXN0cm95RmFjdG9yeSAmJiBtQ29tcG9uZW50RmFjdG9yeSkgeworICAgICAgICBkZXN0cm95RmFjdG9yeShtQ29tcG9uZW50RmFjdG9yeSk7CisgICAgfQorICAgIGlmIChtTGliSGFuZGxlKSB7CisgICAgICAgIEFMT0dWKCJ1bmxvYWRpbmcgZGxsIik7CisgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgeworICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGUgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudEZhY3RvcnktPmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGlkLCBpbnRlcmZhY2UsIFttb2R1bGUsIGRlbGV0ZXJdKEMyQ29tcG9uZW50SW50ZXJmYWNlICpwKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG1vZHVsZSBzbyB0aGF0IHdlIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGl0IHdoaWxlIGRlbGV0aW5nIGludGVyZmFjZQorICAgICAgICAgICAgICAgIGRlbGV0ZXIocCk7IC8vIGRlbGV0ZSBpbnRlcmZhY2UgZmlyc3QKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVzZXQoKTsgLy8gcmVtb3ZlIG1vZHVsZSByZWYgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQpCisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIHsKKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnRGYWN0b3J5LT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBpZCwgY29tcG9uZW50LCBbbW9kdWxlLCBkZWxldGVyXShDMkNvbXBvbmVudCAqcCkgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBtb2R1bGUgc28gdGhhdCB3ZSBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBpdCB3aGlsZSBkZWxldGluZyBjb21wb25lbnQKKyAgICAgICAgICAgICAgICBkZWxldGVyKHApOyAvLyBkZWxldGUgY29tcG9uZW50IGZpcnN0CisgICAgICAgICAgICAgICAgbW9kdWxlLnJlc2V0KCk7IC8vIHJlbW92ZSBtb2R1bGUgcmVmIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkKQorICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Z2V0VHJhaXRzKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtVHJhaXRzOworfQorCitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpCisgICAgOiBtUmVmbGVjdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCkpLAorICAgICAgbUludGVyZmFjZShtUmVmbGVjdG9yKSB7CisKKyAgICBhdXRvIGVtcGxhY2UgPSBbdGhpc10oY29uc3QgY2hhciAqYWxpYXMsIGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICAgICAgLy8gQ29tcG9uZW50TG9hZGVyIGlzIG5laXRoZXIgY29waWFibGUgbm9yIG1vdmFibGUsIHNvIGl0IG11c3QgYmUKKyAgICAgICAgLy8gY29uc3RydWN0ZWQgaW4tcGxhY2UuIE5vdyBDb21wb25lbnRMb2FkZXIgdGFrZXMgdHdvIGFyZ3VtZW50cyBpbgorICAgICAgICAvLyBjb25zdHJ1Y3Rvciwgc28gd2UgbmVlZCB0byB1c2UgcGllY2V3aXNlX2NvbnN0cnVjdCB0byBhY2hpZXZlIHRoaXMKKyAgICAgICAgLy8gYmVoYXZpb3IuCisgICAgICAgIG1Db21wb25lbnRzLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LAorICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShhbGlhcyksCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKGFsaWFzLCBsaWJQYXRoKSk7CisgICAgICAgIG1Db21wb25lbnRzTGlzdC5lbXBsYWNlX2JhY2soYWxpYXMpOworICAgIH07CisgICAgLy8gVE9ETzogbW92ZSB0aGlzIGFsc28gaW50byBhIC5zbyBzbyBpdCBjYW4gYmUgdXBkYXRlZAorICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9hdmNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2FhY2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfYWFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5hbXJ3Yi5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfaGV2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfaDI2M2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X21wM2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfb3B1c2RlYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA4LmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfdnA4ZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC52cDkuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF92cDlkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQudnA5LmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfdnA5ZW5jLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5yYXcuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9yYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfZmxhY2VuYy5zbyIpOworICAgIGVtcGxhY2UoImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfZ3NtZGVjLnNvIik7CisgICAgZW1wbGFjZSgiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfeGFhY2RlYy5zbyIpOworCisgICAgLy8gIkFsaWFzZXMiCisgICAgLy8gVE9ETzogdXNlIGFsaWFzZXMgcHJvcGVyIGZyb20gQzJDb21wb25lbnQ6OlRyYWl0cworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYWFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5hYWMuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9hYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9oZXZjZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLm1wZWcyLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfaDI2M2VuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUubXAzLmRlY29kZXIiLCAibGliY29kZWMyX3NvZnRfbXAzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS52cDguZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF92cDhkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUudnA4LmVuY29kZXIiLCAibGliY29kZWMyX3NvZnRfdnA4ZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS52cDkuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF92cDllbmMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoIk9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiwgImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLmZsYWMuZW5jb2RlciIsICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgiT01YLmdvb2dsZS5nc20uZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF9nc21kZWMuc28iKTsKKyAgICBlbXBsYWNlKCJPTVguZ29vZ2xlLnhhYWMuZGVjb2RlciIsICJsaWJjb2RlYzJfc29mdF94YWFjZGVjLnNvIik7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpIHsKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjb25maWdfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UuY29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpsaXN0Q29tcG9uZW50cygpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdDsKKyAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IG1Db21wb25lbnRzTGlzdCkgeworICAgICAgICBDb21wb25lbnRMb2FkZXIgJmxvYWRlciA9IG1Db21wb25lbnRzLmF0KGFsaWFzKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBsb2FkZXIuZmV0Y2hNb2R1bGUoJm1vZHVsZSk7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMgPSBtb2R1bGUtPmdldFRyYWl0cygpOworICAgICAgICAgICAgaWYgKHRyYWl0cykgeworICAgICAgICAgICAgICAgIGxpc3QucHVzaF9iYWNrKHRyYWl0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6ZmluZENvbXBvbmVudChDMlN0cmluZyBuYW1lLCBDb21wb25lbnRMb2FkZXIgKipsb2FkZXIpIHsKKyAgICAqbG9hZGVyID0gbnVsbHB0cjsKKyAgICBhdXRvIHBvcyA9IG1Db21wb25lbnRzLmZpbmQobmFtZSk7CisgICAgLy8gVE9ETzogY2hlY2sgYWxpYXNlcworICAgIGlmIChwb3MgPT0gbUNvbXBvbmVudHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisgICAgKmxvYWRlciA9ICZwb3MtPnNlY29uZDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBDb21wb25lbnRMb2FkZXIgKmxvYWRlcjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBmaW5kQ29tcG9uZW50KG5hbWUsICZsb2FkZXIpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgICAgICByZXMgPSBsb2FkZXItPmZldGNoTW9kdWxlKCZtb2R1bGUpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICAgICAgcmVzID0gbW9kdWxlLT5jcmVhdGVDb21wb25lbnQoMCwgY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgQ29tcG9uZW50TG9hZGVyICpsb2FkZXI7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gZmluZENvbXBvbmVudChuYW1lLCAmbG9hZGVyKTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgcmVzID0gbG9hZGVyLT5mZXRjaE1vZHVsZSgmbW9kdWxlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgLy8gVE9ETzogZ2V0IGEgdW5pcXVlIG5vZGUgSUQKKyAgICAgICAgICAgIHJlcyA9IG1vZHVsZS0+Y3JlYXRlSW50ZXJmYWNlKDAsIGludGVyZmFjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgQzJfTUFZX0JMT0NLKTsKK30KKworQzJTdHJpbmcgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiYW5kcm9pZC5jb21wb25lbnRTdG9yZS5wbGF0Zm9ybSI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtUmVmbGVjdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBwbGF0Zm9ybVN0b3JlOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUgPSBwbGF0Zm9ybVN0b3JlLmxvY2soKTsKKyAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBzdG9yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlPigpOworICAgICAgICBwbGF0Zm9ybVN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHJldHVybiBzdG9yZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBVbndyYXAgdGhlIG5hdGl2ZSBoYW5kbGUgZnJvbSBhIENvZGVjMiBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4KKyAqCisgKiBAcGFyYW0gaGFuZGxlIGEgaGFuZGxlIGFsbG9jYXRlZCBieSBDMkFsbG9jYXRvckdyYWxsb2MuIFRoaXMgaW5jbHVkZXMgaGFuZGxlcyByZXR1cm5lZCBmb3IgYQorICogZ3JhcGhpYyBibG9jayBhbGxvY2F0aW9uIGhhbmRsZSByZXR1cm5lZC4KKyAqCisgKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgbmF0aXZlIGhhbmRsZSB0aGF0IG11c3QgYmUgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2RlbGV0ZS4KKyAqLworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpOworCisvKioKKyAqIFdyYXAgdGhlIGdyYWxsb2MgaGFuZGxlIGFuZCBtZXRhZGF0YSBpbnRvIENvZGVjMiBoYW5kbGUgcmVjb2duaXplZCBieQorICogQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBDMkhhbmRsZSB0aGF0IG11c3QgYmUgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2RlbGV0ZS4KKyAqLworQzJIYW5kbGUgKldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gMCwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApOworCisvKioKKyAqIFx0b2RvIEdldCB0aGlzIGZyb20gdGhlIGJ1ZmZlcgorICovCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpOworCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2MgOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlID0gZmFsc2UpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvckdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwNTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyQWxsb2NhdG9ySW9uIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoYWxpZ24sIGhlYXBNYXNrLCBmbGFncykKKyAgICAvLworICAgIC8vIGNhcGFjaXR5IGlzIGFsaWduZWQgdG8gdGhlIGRlZmF1bHQgYmxvY2stc2l6ZSAoZGVmYXVsdHMgdG8gcGFnZSBzaXplKSB0byByZWR1Y2UgY2FjaGluZworICAgIC8vIG92ZXJoZWFkCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KEMyTWVtb3J5VXNhZ2UsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QqLCB1bnNpZ25lZCosIHVuc2lnbmVkKik+IFVzYWdlTWFwcGVyRm47CisKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JJb24oaWRfdCBpZCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcklvbigpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSB1c2FnZSBtYXBwZXIgZm9yIHN1YnNlcXVlbnQgbmV3IGFsbG9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdXBwb3J0ZWQKKyAgICAgKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHVzYWdlIG1hc2tzIGFuZCBkZWZhdWx0IGJsb2NrLXNpemUgdG8gdXNlIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UgdG8gaW9uIGZsYWdzCisgICAgICogICAgICAgIHJlcXVpcmVkIGJ5IHRoZSBpb24gZGV2aWNlCisgICAgICogXHBhcmFtIG1pblVzYWdlIG1pbmltdW0gYnVmZmVyIHVzYWdlIHJlcXVpcmVkIGZvciBzdXBwb3J0ZWQgYWxsb2NhdGlvbnMgKGRlZmF1bHRzIHRvIDApCisgICAgICogXHBhcmFtIG1heFVzYWdlIG1heGltdW0gYnVmZmVyIHVzYWdlIHN1cHBvcnRlZCBieSB0aGUgaW9uIGFsbG9jYXRvciAoZGVmYXVsdHMgdG8gU1dfUkVBRAorICAgICAqICAgICAgICB8IFNXX1dSSVRFKQorICAgICAqIFxwYXJhbSBibG9ja1NpemUgYWxpZ25tZW50IHVzZWQgcHJpb3IgdG8gY2FsbGluZyB8bWFwcGVyfCBmb3IgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKiAgICAgICAgVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZiBjYWNoZSByZXF1aXJlZCBmb3IgY2FjaGluZyBtYXBwZXIgcmVzdWx0cy4KKyAgICAgKiAgICAgICAgKGRlZmF1bHRzIHRvIHRoZSBwYWdlIHNpemUpCisgICAgICovCisgICAgdm9pZCBzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpOworCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOworCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1Jb25GZDsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kIG1Vc2FnZU1hcHBlckNhY2hlCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Vc2FnZU1hcHBlckxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKKyAgICBzaXplX3QgbUJsb2NrU2l6ZTsKKyAgICBVc2FnZU1hcHBlckZuIG1Vc2FnZU1hcHBlcjsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc2l6ZV90PiBNYXBwZXJLZXk7CisgICAgc3RydWN0IE1hcHBlcktleUhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmKSBjb25zdDsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp0dXBsZTxzaXplX3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgYzJfc3RhdHVzX3Q+IE1hcHBlclZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPE1hcHBlcktleSwgTWFwcGVyVmFsdWU+IE1hcHBlcktleVZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPjo6aXRlcmF0b3IgTWFwcGVyS2V5VmFsdWVQb2ludGVyOworICAgIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT4gbVVzYWdlTWFwcGVyTHJ1OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxNYXBwZXJLZXksIE1hcHBlcktleVZhbHVlUG9pbnRlciwgTWFwcGVyS2V5SGFzaD4gbVVzYWdlTWFwcGVyQ2FjaGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzFhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCitjbGFzcyBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sIDogcHVibGljIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH07CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbElkOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKT4gT25SZW5kZXJDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFNldHMgcmVuZGVyIGNhbGxiYWNrLgorICAgICAqCisgICAgICogXHBhcmFtIHJlbmRlckNhbGxiYWsgY2FsbGJhY2sgdG8gY2FsbCBmb3IgYWxsIGRlcXVldWUgYnVmZmVyLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjayA9IE9uUmVuZGVyQ2FsbGJhY2soKSk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGFuIElHQlAgaW4gb3JkZXIgdG8gY3JlYXRlIGJsb2Nrcy4gQSBuZXdseSBjcmVhdGVkIGJsb2NrIGlzCisgICAgICogZGVxdWV1ZWQgZnJvbSB0aGUgY29uZmlndXJlZCBJR0JQLiBVbmlxdWUgSWQgb2YgSUdCUCBhbmQgdGhlIHNsb3QgbnVtYmVyIG9mCisgICAgICogYmxvY2tzIGFyZSBwYXNzZWQgdmlhIG5hdGl2ZV9oYW5kbGUuIE1hbmFnaW5nIElHQlAgaXMgcmVzcG9uc2liaWxpdHkgb2YgY2FsbGVyLgorICAgICAqIFdoZW4gSUdCUCBpcyBub3QgY29uZmlndXJlZCwgYmxvY2sgd2lsbCBiZSBjcmVhdGVkIHZpYSBhbGxvY2F0b3IuCisgICAgICogU2luY2UgemVybyBpcyBub3QgdXNlZCBmb3IgVW5pcXVlIElkIG9mIElHQlAsIGlmIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQgb3IgcHJvZHVjZXIKKyAgICAgKiBpcyBjb25maWd1cmVkIGFzIG51bGxwdHIsIHVuaXF1ZSBpZCB3aGljaCBpcyBidW5kbGVkIGluIG5hdGl2ZV9oYW5kbGUgaXMgemVyby4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwcm9kdWNlciAgICAgIHRoZSBJR0JQLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggYmxvY2tzCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKworY2xhc3MgQzJCYXNpY0xpbmVhckJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0xpbmVhckJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfTElORUFSOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICAvLyBUT0RPOiBmZXRjaENpcmN1bGFyQmxvY2sKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19HUkFQSElDOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJQb29sZWRCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpb24gSWQgZm9yIHVuZGVybHlpbmcgYnVmZmVycG9vbAorICAgICAqLworICAgIGludDY0X3QgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2Vzc29yIHdoaWNoIGlzIHVzZWQgYnkgdW5kZXJseWluZyBidWZmZXJwb29sLiAoSXQgY2FuIGJlCisgICAgICogcGFzc2VkIHRvIHJlY2VpdmluZyBwcm9jZXNzLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBhY2Nlc3NvciAgICAgICAgICBJQWNjZXNzb3Igd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgb3V0IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSAgICAgICAgICAgICBJQWNlc3NvciBpcyB3cml0ZW4gc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR1cm4gZmFsc2UgICAgICAgICAgICBJQWNjZXNzb3IgaXMgbm90IHdyaXR0ZW4uCisgICAgICovCisgICAgYm9vbCBnZXRBY2Nlc3NvcihhbmRyb2lkOjpzcDxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENvbXBvbmVudCBmYWN0b3J5IG9iamVjdCB0aGF0IGVuYWJsZXMgdG8gY3JlYXRlIGEgY29tcG9uZW50IGFuZC9vciBpbnRlcmZhY2UgZnJvbSBhIGR5bmFtaWNhbGx5CisgKiBsaW5rZWQgbGlicmFyeS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgY29tcG9uZW50L2ludGVyZmFjZXMgYXJlIG1hbmFnZWQgb2JqZWN0cywgYnV0IHdlCisgKiBjYW5ub3Qgc2FmZWx5IGNyZWF0ZSBhIG1hbmFnZWQgb2JqZWN0IGFuZCBwYXNzIGl0IGluIEMuCisgKgorICogQ29tcG9uZW50cy9pbnRlcmZhY2VzIHR5cGljYWxseSBpbmhlcml0IGZyb20gc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpcywgYnV0IEMgcmVxdWlyZXMKKyAqIHBhc3Npbmcgc2ltcGxlIHBvaW50ZXIsIGFuZCBzaGFyZWRfcHRyIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGtub3cgdGhlIGNsYXNzIHRvIGJlIGNvbnN0cnVjdGVkCisgKiBkZXJpdmVzIGZyb20gZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgKgorICovCitjbGFzcyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gQ29tcG9uZW50RGVsZXRlcjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IEludGVyZmFjZURlbGV0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IElEIGZvciB0aGUgY3JlYXRlZCBjb21wb25lbnQKKyAgICAgKiBccGFyYW0gY29tcG9uZW50IHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgaW50ZXJmYWNlIElEIGZvciB0aGUgY3JlYXRlZCBpbnRlcmZhY2UKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICB0eXBlZGVmIDo6QzJDb21wb25lbnRGYWN0b3J5KiAoKkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKSh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpKDo6QzJDb21wb25lbnRGYWN0b3J5Kik7Cit9OworCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxY2RhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorCisvLyBUbyBhbGxvdyBhcmJpdHJhcnkgb3JkZXJpbmcgb2YgQzJEZWJ1Zy5oIGFuZCBBUEkgaGVhZGVycyBhbmQgdG8ga2VlcCBkZWJ1ZyB1dGlsaXRpZXMgc2VwYXJhdGVseQorLy8gZnJvbSB0aGUgQVBJIGRlZmluaXRpb25zLCB3ZSBwcm92aWRlIEFQSSBoZWFkZXIgc3BlY2lmaWMgZGVidWcgaGVhZGVycy4KKyNpZmRlZiBDMlBBUkFNX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8QzIuaD4KKworLy8gc3RhbmRhcmQgRVJSTk8gbWFwcGluZ3MKK3RlbXBsYXRlPGludCBOPiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsKCk7Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8MD4oKSAgICAgICB7IHJldHVybiBDMl9PSzsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVJTlZBTD4oKSAgeyByZXR1cm4gQzJfQkFEX1ZBTFVFOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUFDQ0VTPigpICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RVBFUk0+KCkgICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RU5PTUVNPigpICB7IHJldHVybiBDMl9OT19NRU1PUlk7IH0KKworLy8gbWFwIHN0YW5kYXJkIGVycm5vLXMgdG8gdGhlIGVxdWl2YWxlbnQgYzJfc3RhdHVzX3QKK3RlbXBsYXRlPGludC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsOwordGVtcGxhdGU8aW50IEUsIGludCAuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDxFLCBOLi4uPiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRSkgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9lcnJubzJzdGF0dXNfaW1wbCA8RT4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDw+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSAwID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisgICAgfQorfTsKKwordGVtcGxhdGU8aW50Li4uIE4+CitjMl9zdGF0dXNfdCBjMl9tYXBfZXJybm8oaW50IHJlc3VsdCkgeworICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworfQorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjZGVmaW5lIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgKiBccGFyZW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkJsb2NrUG9vbCwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQmxvY2tQb29sKiAoKkNyZWF0ZUJsb2NrUG9vbEZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QpOworCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgKiBccGFyYW0gc3RhdHVzICAgICAgdGhlIHJldHVybmVkIHN0YXR1cyBmcm9tIGNyZWF0aW5nIGFsbG9jYXRvci4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkFsbG9jYXRvciwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQWxsb2NhdG9yKiAoKkNyZWF0ZUFsbG9jYXRvckZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6YzJfc3RhdHVzX3QqKTsKKworY2xhc3MgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEdldEluc3RhbmNlKCk7CisgICAgfkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAgICAgKiBccGFyYW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAgICAgKiBccGFyYW0gcG9vbCAgICAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYmxvY2sgcG9vbCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCg6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgYWxsb2NhdG9yIGlzIG5vdCBjcmVhdGVkIGFzIHNoYXJlZCBzaW5nbGV0b24gYXMgQzJBbGxvY2F0b3JTdG9yZSBkb2VzLCBiZWNhdXNlCisgICAgICogQyBpbnRlcmZhY2Ugb25seSBhbGxvd3MgcmF3IHBvaW50ZXIgdHJhbnNtaXNzaW9uIGZvciBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3IgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUFsbG9jYXRvcig6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpNdXRleCBzTXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IHNJbnN0YW5jZTsKKworICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgQ3JlYXRlQmxvY2tQb29sRnVuYyBtQ3JlYXRlQmxvY2tQb29sOworICAgIENyZWF0ZUFsbG9jYXRvckZ1bmMgbUNyZWF0ZUFsbG9jYXRvcjsKK307CisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50RmFjdG9yeS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisKKy8qKgorICogUGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIElEcworICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgOiBwdWJsaWMgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgZW51bSA6IGlkX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGlvbiBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBjb25zaXN0cyBvZjoKKyAgICAgICAgICogICBmZCAgc2hhcmVkIGlvbiBidWZmZXIgaGFuZGxlCisgICAgICAgICAqICAgaW50IHNpemUgKGxvIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IHNpemUgKGhpIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IG1hZ2ljICdceGMyaW9ceDAwJworICAgICAgICAgKi8KKyAgICAgICAgSU9OID0gUExBVEZPUk1fU1RBUlQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBncmFsbG9jIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgZ3JhbGxvYyBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEdSQUxMT0MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBidWZmZXJxdWV1ZSBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEJVRkZFUlFVRVVFLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgcGxhdGZvcm0gYWxsb2NhdG9yIGRlZmluaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIGFsd2F5cyBwdXQgdGhpcyBtYWNybyBpbiB0aGUgbGFzdCBwbGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRXh0ZW5kZWQgcGxhdGZvcm0gc3RvcmUgcGx1Z2luIHNob3VsZCB1c2UgdGhpcyBtYWNybyBhcyB0aGUgc3RhcnQgSUQgb2YgaXRzIG93biBhbGxvY2F0b3IKKyAgICAgICAgICogdHlwZXMuCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9FTkQsCisgICAgfTsKK307CisKKy8qKgorICogUmV0cmlldmVzIGEgYmxvY2sgcG9vbCBmb3IgYSBjb21wb25lbnQuCisgKgorICogXHBhcmFtIGlkICAgICAgICB0aGUgbG9jYWwgSUQgb2YgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBibG9jayBwb29sIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBmZXRjaCB0aGUgYmxvY2sgcG9vbCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbiAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICovCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogQ3JlYXRlcyBhIGJsb2NrIHBvb2wuCisgKiBccGFyYW0gYWxsb2NhdG9ySWQgIHRoZSBhbGxvY2F0b3IgSUQgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBibG9ja3MKKyAqIFxwYXJhbSBjb21wb25lbnQgICAgIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmUgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdG9yIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgYSBibG9jayBwb29sCisgKi8KK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cworICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAorICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCisgKiBjb21wb25lbnQgc3RvcmUgaXMgdXNlZC4KKyAqLwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisKKy8qCisgKiBBbmRyb2lkIHByb3ZpZGVzIGxvZ2dpbmcgYW5kIGRlYnVnIG1hY3Jvcy4gUmVkZWZpbmUgdGhlbSB3aXRoIEMyIHByZWZpeCBhbmQgYWRkIHN1cHBvcnQgZm9yCisgKiBvcHRpbmcgb3V0IG9mIHZlcmJvc2UgbG9ncy4KKyAqLworCisjaWZkZWYgQzJfTE9HX1RBRworI2RlZmluZSBMT0dfVEFHIEMyX0xPR19UQUcKKyNlbmRpZgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2lmZGVmIEMyX0xPR19WRVJCT1NFCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZWxzZQorLyoqCisgKiBVc2UgYXMgZm9sbG93czoKKyAqCisgKiAjZGVmaW5lIEMyX0xPR19UQUcgInRhZyIKKyAqIC8vI2RlZmluZSBDMl9MT0dfVkVSQk9TRSAgLy8gZW5hYmxlIHZlcmJvc2UgbG9ncyBpbiB0aGlzIGZpbGUKKyAqICNpbmNsdWRlIDxDMkRlYnVnLmg+CisgKgorICogQzJfTE9HKERFQlVHKSA8PCBleHByIC4uLjsKKyAqCisgKiBMb2cgbGV2ZWxzIGFyZTogVkVSQk9TRSwgREVCVUcsIElORk8sIFdBUk5JTkcsIEVSUk9SLCBGQVRBTCAoYWJvcnRzKS4KKyAqCisgKiBObyBlbmRsIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgXAorICAgICAgICAoOjphbmRyb2lkOjpiYXNlOjpMRVZFTCAhPSA6OmFuZHJvaWQ6OmJhc2U6OlZFUkJPU0UpICYmIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2VuZGlmCisKKyNkZWZpbmUgQzJfQ0hFQ0sgICAgQ0hFQ0sKKyNkZWZpbmUgQzJfQ0hFQ0tfTFQgQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfQ0hFQ0tfTEUgQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfQ0hFQ0tfRVEgQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfQ0hFQ0tfR0UgQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfQ0hFQ0tfR1QgQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfQ0hFQ0tfTkUgQ0hFQ0tfTkUKKworI2RlZmluZSBDMl9EQ0hFQ0sgICAgRENIRUNLCisjZGVmaW5lIEMyX0RDSEVDS19MVCBEQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfRENIRUNLX0xFIERDSEVDS19MRQorI2RlZmluZSBDMl9EQ0hFQ0tfRVEgRENIRUNLX0VRCisjZGVmaW5lIEMyX0RDSEVDS19HRSBEQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfRENIRUNLX0dUIERDSEVDS19HVAorI2RlZmluZSBDMl9EQ0hFQ0tfTkUgRENIRUNLX05FCisKKyNlbmRpZiAgLy8gQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDBlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19CQVNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfQkFTRV9IXworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogRGVidWcgcHJpbnQgdXRpbGl0aWVzIGZvciBDb2RlYyAyLjAgYmFzZSBvYmplY3RzLgorICovCisKKyNkZWZpbmUgQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKHR5cGUpIFwKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKHR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/Iik7IFwKK2lubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgdHlwZSAmaSkgeyBcCisgICAgcmV0dXJuIG9zIDw8IGFzU3RyaW5nKGkpOyBcCit9CisKK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChjMl9zdGF0dXNfdCkKKworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfQkFTRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzE4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWM0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0xPR19IXworCisvLyBQbGF0Zm9ybSBzcGVjaWZpYyBkZWJ1ZyB1dGlsaXRpZXMKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQtQzJEZWJ1Zy1sb2cuaD4KKyNlbHNlCisvLyBUT0RPOiBpbXBsZW1lbnQgYmFzZSBkZWJ1ZyB1dGlscworI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzFkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19QQVJBTV9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1Zy9wcmludCBkZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgZGVmaW5lZCBpbiBDMlBhcmFtLmgKKyAqLworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QpCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjQzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaApAQCAtMCwwICsxLDc1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoqCisgKiBJbnRlcmZhY2UgSGVscGVyCisgKi8KK3VzaW5nIEMyUiA9IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxULCB0cnVlPiB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB0eXBlOworfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaW1wbGVtZW50IHBhcmFtZXRlciByZWZsZWN0b3JzLiBUaGlzIGNsYXNzIGlzIGR5bmFtaWMgYW5kIGlzIGRlc2lnbmVkIHRvIGJlCisgKiBzaGFyZWQgYnkgbXVsdGlwbGUgaW50ZXJmYWNlcy4gVGhpcyBhbGxvd3MgaW50ZXJmYWNlcyB0byBhZGQgc3RydWN0dXJlIGRlc2NyaXB0b3JzIGFzIG5lZWRlZC4KKyAqLworY2xhc3MgQzJSZWZsZWN0b3JIZWxwZXIgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CitwdWJsaWM6CisgICAgQzJSZWZsZWN0b3JIZWxwZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+QzJSZWZsZWN0b3JIZWxwZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZSgKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBQYXJhbXMgdHlwZXMgb2YgY29kZWMgMi4wIHN0cnVjdHMgKG9yIHBhcmFtZXRlcnMpIHRvIGRlc2NyaWJlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIEMyX0lOTElORSB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdHM7CisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3JzKHN0cnVjdHMsIChfVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyBhIHNwZWNpZmljIHN0cnVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdHJ1a3QgZGVzY3JpcHRvciBmb3IgdGhlIHN0cnVjdCB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0LgorICAgICAqLworICAgIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpOworCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBjbGFzcyBDMl9ISURFIF9UdXBsZSB7IH07CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGRlc2NyaXB0b3JzLgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVjdHMgTGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdG8gYWRkIHN1cHBvcnQgZm9yCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopOworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBhZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGRlc2NyaXB0b3JzIGluIGEgcmVjdXJzaXZlIG1hbm5lcgorICAgICAqIG9uZSBzdHJ1Y3R1cmUgYXQgYSB0aW1lIHVzaW5nIGEgbGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdGVtcG9yYXJ5LgorICAgICAqCisgICAgICogXHBhcmFtIFQgdGhlIHR5cGUgb2YgY29kZWMgMi4wIHN0cnVjdCB0byBkZXNjcmliZQorICAgICAqIFxwYXJhbSBQYXJhbXMgcmVzdCBvZiB0aGUgc3RydWN0cworICAgICAqIFxwYXJhbSBzdHJ1Y3RzIFRlbXBvcmFyeSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB1c2VkIHRvIG9wdGltaXplIHRoZSBvcGVyYXRpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIEMyX0lOTElORSB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPFQsIFBhcmFtcy4uLj4gKikgeworICAgICAgICBzdHJ1Y3RzLmVtcGxhY2VfYmFjaygoVCopbnVsbHB0cik7CisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3JzKHN0cnVjdHMsIChfVHVwbGU8UGFyYW1zLi4uPiAqKW51bGxwdHIpOworICAgIH0KKworICAgIG11dGFibGUgc3RkOjptdXRleCBfbU11dGV4OworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yPiBfbVN0cnVjdHM7IC8vLzwgZGVzY3JpcHRvcnMKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvZGVjIDIuMCBpbnRlcmZhY2UgQVBJLXMgZm9yIHNvbWUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIGNsYXNzIG11c3QgYmUgc3ViY2xhc3NlZC4KKyAqLworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhc2Ugb2Zmc2V0IG9mIGEgZmllbGQgYXQgfG9mZnNldHwgdGhhdCBjb3VsZCBiZSBwYXJ0IG9mIGFuIGFycmF5IG9yIHBhcnQgb2YgYQorICAgICAqIHN1Yi1zdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkbyBmaWVsZCBzaXplIHZlcmlmaWNhdGlvbiwgZS5nLiBpZiBvZmZzZXQgaWYgb2J0YWluZWQgZnJvbSBhIHN0cnVjdHVyZSwKKyAgICAgKiBpdCB3aWxsIG5vdCBzdG9wIGF0IHRoZSBzdHJ1Y3R1cmUgYm91bmRhcnkgLSB0aGlzIGlzIG9rYXksIGFzIHdlIGp1c3Qgd2FudCB0aGUgYmFzZSBvZmZzZXQKKyAgICAgKiBoZXJlLCB3aGljaCBpcyB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzaXplX3QgR2V0QmFzZU9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBzaXplX3Qgb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2UgaGVscGVyIGNsYXNzIHVzZXMgcmVmZXJlbmNlcyB0byBzdGQ6OnNoYXJlZF9wdHI8VD4gY29uZmlnIHBhcmFtZXRlcnMuCisgICAgICogSW50ZXJuYWxseSwgdGhlc2UgbmVlZCB0byBiZSBnZW5lcmFsaXplZCB0byBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gcmVmcywgYnV0IHRoZSBjYXN0IGlzCisgICAgICogbm90IGFsbG93ZWQgKGFzIHRoZXNlIGFyZSByZWZlcmVuY2VzKS4gQXMgc3VjaCwgdGhpcyBjbGFzcyBuZXZlciByZXR1cm5zIHBvaW50ZXIgdG8gdGhlCisgICAgICogc2hhcmVkX3B0cnMuCisgICAgICovCisgICAgc3RydWN0IFBhcmFtUmVmIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgZW5hYmxlPQorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8VCwgQzJQYXJhbT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaW5saW5lIEMyX0hJREUgUGFyYW1SZWYoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSkKKyAgICAgICAgICAgIDogX21SZWYocmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4qPigmcGFyYW0pKSB7IH0KKworICAgICAgICAvLyB1c2VkIGJ5IGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIGNvbnRhaW5lcnMKKyAgICAgICAgb3BlcmF0b3Igc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICooKSBjb25zdCB7IHJldHVybiBfbVJlZjsgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgc2hhcmVkIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXQoKSBjb25zdCB7IHJldHVybiAqX21SZWY7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiAqX21SZWY7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZpZWxkIGhlbHBlci4KKyAgICAgKgorICAgICAqIENvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWVsZDogcG9zc2libGUgdmFsdWVzLCBhbmQgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAqIHZhbHVlcy4KKyAgICAgKi8KKyAgICBjbGFzcyBGaWVsZEhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBoZWxwZXIgZm9yIGEgZmllbGQgd2l0aCBnaXZlbiBwb3NzaWJsZSB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgcmVmZXJlbmNlLiBUaGUgcGFyYW1ldGVyIGRvZXMgbm90IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhpcworICAgICAgICAgKiAgICAgICAgcG9pbnQuCisgICAgICAgICAqIFxwYXJhbSBmaWVsZCBmaWVsZCBpZGVudGlmaWVyCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZXMgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZmllbGQKKyAgICAgICAgICovCisgICAgICAgIEZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBwYXJhbS1maWVsZCBpZGVudGlmaWVyIGZvciB0aGlzIGZpZWxkLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlCisgICAgICAgICAqIHVuZGVybHlpbmcgcGFyYW1ldGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgICAgICAgKgorICAgICAgICAgKiBcYXJhbSBpbmRleAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEMyUGFyYW1GaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkIG1ha2VQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZXMgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgdGhhdCB3aWxsIGJlIG1vdmVkIG91dAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHBvc3NpYmxlIHZhbHVlcworICAgICAgICAgKiBpZiBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB3ZXJlIG5ldmVyIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRvIGltcGwgZm9yIHNhZmV0eQorICAgICAgICBQYXJhbVJlZiBtUGFyYW07CisgICAgICAgIF9DMkZpZWxkSWQgbUZpZWxkSWQ7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBtUG9zc2libGU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBtU3VwcG9ydGVkOyAvLy88IGlmIGRpZmZlcmVudCBmcm9tIHBvc3NpYmxlCisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEMyX0hJREUgUGFyYW07CisgICAgY2xhc3MgUGFyYW1IZWxwZXI7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IGlzIGFuIGludGVyZmFjZSB0byBnZXQgdGhlIHBhcmFtZXRlciBoZWxwZXJzIGZyb20gYSBzdGQ6OnNoYXJlZF9wdHI8VD4gJi4KKyAgICAgKi8KKyAgICBjbGFzcyBGYWN0b3J5IHsKKyAgICAgICAgLy8gXHRvZG8gdGhpcyBtYXkgYmUgYWxyZWFkeSBpbiBQYXJhbUhlbHBlcgorICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGdldFBhcmFtSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSkgY29uc3QgPSAwOworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5GYWN0b3J5KCkgPSBkZWZhdWx0OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFBhcmFtPFQ+IGdldChzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8VD4gYWx0VmFsdWUgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUGFyYW08VD4oZ2V0UGFyYW1IZWxwZXIoUGFyYW1SZWYocGFyYW0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRWYWx1ZSA9PSBudWxscHRyID8gcGFyYW0gOiBhbHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWZsZWN0b3IoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgZmllbGQgaGVscGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEZpZWxkIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gaGVscGVyIGhlbHBlciBmb3IgdGhpcyBmaWVsZAorICAgICAgICAgKiBccGFyYW0gaW5kZXggIHBhcmFtZXRlciBpbmRleCAodGhpcyBpcyBuZWVkZWQgYXMgaXQgaXMgbm90IGF2YWlsYWJsZSBkdXJpbmcgcGFyYW1ldGVyCisgICAgICAgICAqICAgICAgICBjb25zdHJ1Y3Rpb24pIFx0b2RvIHJlbW92ZQorICAgICAgICAgKi8KKyAgICAgICAgRmllbGQoc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIsIEMyUGFyYW06OkluZGV4IGluZGV4KTsKKworICAgICAgICBib29sIHN1cHBvcnRzQXRBbGwoVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRQb3NzaWJsZVZhbHVlcygpKS5zdXBwb3J0cyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBib29sIHN1cHBvcnRzTm93KFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KCpfbUhlbHBlci0+Z2V0U3VwcG9ydGVkVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29uZmxpY3QgcmVzb2x1dGlvbiBzdWdnZXN0aW9uIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IHNob3VsZEJlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBidWlsZGVyIGZvciB0aGlzIGZpZWxkLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkCisgICAgICAgICAqIGZvciBub24tY29uc3QgZmllbGRzIHRvIGRpc2FsbG93IHNldHRpbmcgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBtdXN0QmUoKTsKKworICAgICAgICBvcGVyYXRvciBDMlBhcmFtRmllbGQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gX21GaWVsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgQzJSIHZhbGlkYXRlUG9zc2libGUoY29uc3QgVCAmdmFsdWUgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vLyBUT0RPCisgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgICAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKKyAgICB9OworCisgICAgY2xhc3MgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUGFyYW1IZWxwZXIoUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiYpOworICAgICAgICBQYXJhbUhlbHBlcihQYXJhbUhlbHBlciAmJik7CisgICAgICAgIH5QYXJhbUhlbHBlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kcyBhIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciByZWYgZm9yIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIGNvbnN0IFBhcmFtUmVmIHJlZigpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGFzIG1vZGlmaWFibGUuIFRoZSBjb25zdG5lc3Mgb2YgdGhpcworICAgICAgICAvLy8gb2JqZWN0IGRldGVybWluZXMgdGhlIGNvbnN0bmVzcyBvZiB0aGUgcmV0dXJuZWQgdmFsdWUuCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGFzIGNvbnN0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIHJlcXVlc3QgZm9yIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmFsdWUgICAgdGhlIHZhbHVlIHRoYXQgaXMgYmVpbmcgYXNzaWduZWQgdG8gdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqICAgICAgICAgICAgICAgICBUaGlzIGNvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiBUaGlzIG11c3Qgbm90IGNoYW5nZS4KKyAgICAgICAgICogXHBhcmFtIG1heUJsb2NrIHdoZXRoZXIgYmxvY2tpbmcgaXMgYWxsb3dlZAorICAgICAgICAgKiBccGFyYW0gZW5kVmFsdWUgdGhlIHJlc3VsdGluZyB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZmFjdG9yeSAgcGFyYW1ldGVyIGZhY3RvcnkgKHRvIGFjY2VzcyBkZXBlbmRlbmNpZXMpCisgICAgICAgICAqIFxwYXJhbSBmYWlsdXJlcyB2ZWN0b3Igb2YgZmFpbHVyZXMgdG8gYXBwZW5kIGFueSBmYWlsdXJlcyBmcm9tIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgIG9wZXJhdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBjb25maWd1cmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHZhbHVlIGlzIGluY29ycmVjdCAoVEJEKQorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHRoZSBhc3NpZ25tZW50CisgICAgICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvbmZpZ3VyYXRpb24gdGltZWQgb3V0CisgICAgICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgYmxvY2tpbmcgdG8gYmUgYWxsb3dlZAorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBpbnRlcmZhY2UgaXMgY29ycnVwdGVkCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgYm9vbCAqY2hhbmdlZCwKKyAgICAgICAgICAgICAgICBGYWN0b3J5ICZmYWN0b3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCisgICAgICAgIC8vLyByZXR1cm5zIHBhcmFtZXRlciBpbmRpY2VzIHRoYXQgZGVwZW5kIG9uIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIGFkZHMgYSBkZXBlbmRlbnQgcGFyYW1ldGVyCisgICAgICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoYXQgcGFyYW1ldGVyIHJlZnMgZm9yIHBhcmFtZXRlcnMgdGhhdCBkZXBlbmQgb24gdGhpcworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgYW5kIG1vdmVzIG91dCBzdG9yZWQgc3RydWN0IGRlc2NyaXB0b3IKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yPiBnZXREZXNjcmlwdG9yKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlcyBwYXJhbSBoZWxwZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBub3csIHRoaXMgZmlsbHMgZmllbGQgaW5mbyBmb3IgY29uc3QgcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBhZGRlZCBhcyBzdWNoCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHR5cGVkZWYgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgICAgICBhdHRyaWJfdCYgYXR0cmliKCk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgc2V0dGVyIG1ldGhvZAorICAgICAgICB2b2lkIHNldFNldHRlcihzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZ2V0dGVyIG1ldGhvZAorICAgICAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVwZW5kZW5jaWVzCisgICAgICAgIHZvaWQgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzLCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gcmVmcyk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGZpZWxkcyBhbmQgdGhlaXIgc3VwcG9ydGVkIHZhbHVlcworICAgICAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKTsKKworICAgICAgICAvLy8gYnVpbGQgdGhpcyBpbnRvIGEgZmluYWwgUGFyYW1IZWxwZXIgb2JqZWN0CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gYnVpbGQoKTsKKworICAgICAgICBjbGFzcyBJbXBsOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGVkIHBhcmFtZXRlciBoZWxwZXIuIFRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIG1lbWJlcnMgYXMgd2VsbCBhcyBmaWVsZCBoZWxwZXJzLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEMyX0hJREUgUGFyYW0geworICAgICAgICBQYXJhbSgKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciwgc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiB2KCpwYXJhbS5nZXQoKSksCisgICAgICAgICAgICAgIF9tVHlwZWRQYXJhbShwYXJhbSksCisgICAgICAgICAgICAgIF9tSGVscGVyKGhlbHBlciksCisgICAgICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgdXNpbmcgRmllbGRUeXBlID0gRmllbGQ8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uz46OnR5cGU+Ojp0eXBlPjo6dHlwZT47CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgRmllbGRUeXBlPFM+IEYoUyAmZmllbGQpIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzID0gKHVpbnRwdHJfdCkmZmllbGQgLSAodWludHB0cl90KSZnZXQoKTsKKyAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBmYWxsIGVpdGhlciB3aXRoaW4gc2l6ZW9mKFQpICsgRkxFWF9TSVpFIG9yIHBhcmFtLT5zaXplKCkKKyAgICAgICAgICAgIC8vIHNpemVfdCBzaXplID0gc2l6ZW9mKGZpZWxkKTsKKyAgICAgICAgICAgIC8vIG1QYXJhbSBtYXkgYmUgbnVsbAorICAgICAgICAgICAgc2l6ZV90IGJhc2VTaXplID0gc2l6ZW9mKHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZSk7CisgICAgICAgICAgICBzaXplX3QgYmFzZU9mZnMgPSBHZXRCYXNlT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBfbVJlZmxlY3RvciwgVDo6Q09SRV9JTkRFWCwgb2ZmcyAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgICAgICBpZiAofmJhc2VPZmZzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBDMl9MT0coRkFUQUwpIDw8ICJ1bmtub3duIGZpZWxkIGF0IG9mZnNldCAiIDw8IG9mZnMgPDwgIiBzaXplICIgPDwgc2l6ZW9mKFMpCisgICAgICAgICAgICAgICAgLy8gICAgICAgPDwgIiBiYXNlLXNpemUgIiA8PCBiYXNlU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXNlT2ZmcyArPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyID0gX21IZWxwZXItPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZTxTPihoZWxwZXIsIF9tVHlwZWRQYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdCBQYXJhbSBoYXZlIGNvbnN0IEZpZWxkczsgaG93ZXZlciwgcmVtb3ZlIGNvbnN0IGZyb20gUworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBjb25zdCBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgRmllbGRUeXBlPFM+Pihjb25zdF9jYXN0PFBhcmFtICo+KHRoaXMpLT5GKGZpZWxkKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhIGNvbnN0IHJlZiB2YWx1ZSBvZiB0aGlzIGNvbnN0IHBhcmFtLgorICAgICAgICBjb25zdCBUICZnZXQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKl9tVHlwZWRQYXJhbS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgbW9kaWZpYWJsZSByZWYgdmFsdWUgb2YgdGhpcyBub24tY29uc3QgcGFyYW0uCisgICAgICAgIFQgJnNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIENvbnN0LXJlZmVyZW5jZSB0byB0aGUgdmFsdWUucworICAgICAgICBUIGNvbnN0ICZ2OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IF9tVHlwZWRQYXJhbTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBfbUhlbHBlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHVzaW5nIEMyUCA9IFBhcmFtPFQ+OworCisgICAgLyoqCisgICAgICogVGVtcGxhdGVkIG1vdmUgYnVpbGRlciBjbGFzcyBmb3IgYSBwYXJhbWV0ZXIgaGVscGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgQzJfSElERSBQYXJhbUJ1aWxkZXIgOiBwcml2YXRlIFBhcmFtSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDb25zdHJ1Y3QgdGhlIHBhcmFtZXRlciBidWlsZGVyIGZyb20gbWluaW1hbCBpbmZvIHJlcXVpcmVkLiAqLworICAgICAgICBQYXJhbUJ1aWxkZXIoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpCisgICAgICAgICAgICA6IFBhcmFtSGVscGVyKHBhcmFtLCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IoKFQqKW51bGxwdHIpKSwKKyAgICAgICAgICAgICAgbVR5cGVkUGFyYW0oJnBhcmFtKSB7CisgICAgICAgICAgICBhdHRyaWIoKSA9IGF0dHJpYl90OjpJU19QRVJTSVNURU5UOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHJlcXVpcmVkLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZyZXF1aXJlZCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRVFVSVJFRDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciB0cmFuc2llbnQgKG5vdCBwZXJzaXN0ZW50KS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmdHJhbnNpZW50KCkgeworICAgICAgICAgICAgYXR0cmliKCkgJj0gfmF0dHJpYl90OjpJU19QRVJTSVNURU5UOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIGhpZGRlbiAobm90IGV4cG9zZWQgaW4gSkFWQSBBUEkpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZoaWRkZW4oKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSElEREVOOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIGludGVybmFsIChub3QgZXhwb3NlZCB0byBxdWVyeS9zZXR0aW5ncykuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmludGVybmFsKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0lOVEVSTkFMOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgZGVmYXVsdCB2YWx1ZS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPiBkZWZhdWx0XykgeworICAgICAgICAgICAgLy8gQ0hFQ0soIW1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgLy8gV0FSTl9JRighZGVmYXVsdF8pOyAvLyBjb3VsZCBiZSBudWxscHRyIGlmIE9PTQorICAgICAgICAgICAgLy8gdGVjaG5pY2FsbHksIHRoaXMgY291bGQgYmUgaW4gdGhlIHBhcmVudAorICAgICAgICAgICAgKm1UeXBlZFBhcmFtID0gc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqZGVmYXVsdF8pLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0R2V0dGVyKFt0eXBlZFBhcmFtXShib29sKSAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4geworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJQYXJhbT4oKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoVCAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChzdGQ6OnNoYXJlZF9wdHI8VD4oZGVmYXVsdF8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGFsbCBmaWVsZHMgdG8gdGhpcyBwYXJhbWV0ZXIgd2l0aCB0aGVpciBwb3NzaWJsZSB2YWx1ZXMuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkc18pIHsKKyAgICAgICAgICAgIHNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzXykpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIENvbnN0IHBhcmFtZXRlcnMgYnkgZGVmaW5pdGlvbiBoYXZlIG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxUPiBkZWZhdWx0XykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICAgICAgc2V0U2V0dGVyKFtkZWZhdWx0X10oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrIF9fdW51c2VkLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICYpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqdHlwZWRWYWx1ZSAhPSAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gUmVhZE9ubHkoKmRlZmF1bHRfKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gd2l0aERlZmF1bHQoZGVmYXVsdF8pOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgY29uc3RhbnQgdmFsdWUgKGFsc28gYXMgZGVmYXVsdCkuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoQ29uc3RWYWx1ZShUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhDb25zdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSBhIHN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIHN0cmljdCBzZXR0ZXIKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIGNvbnN0IEMyUDxUPiAmLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19TVFJJQ1Q7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEMyUDxUPiBvbGRWYWx1ZSA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBwYXJhbWV0ZXIgaGVscGVyIHdpdGggdmFsdWUgcG9pbnRpbmcgdG8gcHJvcG9zZWRWYWx1ZQorICAgICAgICAgICAgICAgIEMyUDxUPiBoZWxwZXIgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSwgcHJvcG9zZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgQzJSIHJlc3VsdCA9IGZuKG1heUJsb2NrLCBvbGRWYWx1ZSwgaGVscGVyLCBmYWN0b3J5LmdldChkZXBzKS4uLik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBjaGFuZ2VkLCBjb3B5IHJlc3VsdCB0byBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXQoKSAhPSAqdHlwZWRQYXJhbS0+Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnR5cGVkUGFyYW0gPSBwcm9wb3NlZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD57IGRlcHMtPmluZGV4KCkuLi4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj57IFBhcmFtUmVmKGRlcHMpLi4uIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSBhIG5vbi1zdHJpY3Qgc2V0dGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBub24tc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRTZXR0ZXIoW3R5cGVkUGFyYW0sIGZuLCAmZGVwcy4uLl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmYWN0b3J5KSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEbyBjb3B5LW9uLWNoYW5nZSBmb3IgcGFyYW1ldGVycyBpbiB0aGlzIGhlbHBlciBzbyBjaGFuZ2UgY2FuIGJlIGRldGVjdGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gYSBjaGFuZ2Ugb2YgdGhlIHBvaW50ZXIuIERvIHRoaXMgYnkgd29ya2luZyBvbiBhIHByb3Bvc2VkIHZhbHVlLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBwcm9wb3NlZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Tm9NZW1vcnkodmFsdWUtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBHZXQgYSBwYXJhbWV0ZXIgaGVscGVyIHdpdGggdmFsdWUgcG9pbnRpbmcgdG8gcHJvcG9zZWRWYWx1ZQorICAgICAgICAgICAgICAgIEMyUDxUPiBoZWxwZXIgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSwgcHJvcG9zZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgQzJSIHJlc3VsdCA9IGZuKG1heUJsb2NrLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFya3MgdGhpcyBhIGNhbGN1bGF0ZWQgKHJlYWQtb25seSkgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyIChjYWxjdWxhdG9yKQorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmY2FsY3VsYXRlZEFzKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfUkVBRF9PTkxZOworICAgICAgICAgICAgcmV0dXJuIHdpdGhTZXR0ZXIoZm4sIHN0ZDo6Zm9yd2FyZDxkZWNsdHlwZShkZXBzKT4oZGVwcykuLi4pOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gUGFyYW1IZWxwZXI6OmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICptVHlwZWRQYXJhbTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgUGFyYW1CdWlsZGVyPFQ+IERlZmluZVBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKSB7CisgICAgICAgIHJldHVybiBQYXJhbUJ1aWxkZXI8VD4ocGFyYW0sIG5hbWUpOworICAgIH0KKworcHVibGljOgorICAgIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBpbXBsZW1lbnRpbmcgY29uZmlnIGNhbGxzIGFzIHdlbGwgYXMgb3RoZXIgY29uZmlndXJhdGlvbiB1cGRhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgdmlydHVhbCwgc28gaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIHdyYXBwZXJzIGFyb3VuZCBpdCAoYW5kIHBlcmZvcm0KKyAgICAgKiBhY3Rpb25zIGp1c3QgYmVmb3JlIGFuZCBhZnRlciBhIGNvbmZpZ3VyYXRpb24pLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtcworICAgICAqIFxwYXJhbSBtYXlCbG9jaworICAgICAqIFxwYXJhbSBmYWlsdXJlcworICAgICAqIFxwYXJhbSB1cGRhdGVQYXJhbXMgaWYgdHJ1ZSwgdGhlIHVwZGF0ZWQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgY29waWVkIGJhY2sgaW50byB0aGUgYXJndW1lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICBwYXNzZWQgaW4gfHBhcmFtc3wKKyAgICAgKiBccGFyYW0gY2hhbmdlcyAgICAgIHBvaW50ZWQgdG8gYSB2ZWN0b3IgdG8gcmVjZWl2ZSBzZXR0aW5ncyB3aXRoIHRoZWlyIHZhbHVlcyBjaGFuZ2VkLiBJZiBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG51bGwsIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQgYXJlIGFkZGVkIHRvIHRoaXMuCisgICAgICogXHJldHVybiByZXN1bHQgZnJvbSBjb25maWcKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywKKyAgICAgICAgICAgIGJvb2wgdXBkYXRlUGFyYW1zID0gdHJ1ZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgPSBudWxscHRyKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IGdldFJlZmxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1SZWZsZWN0b3I7CisgICAgfQorCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IExvY2s7CisKKyAgICAvKioKKyAgICAgKiBMb2NrcyB0aGUgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgbG9jay4gVGhpcyBsb2NrIG11c3QgYmUgdW5sb2NrZWQgb3IgcmVsZWFzZWQgd2l0aG91dAorICAgICAqIGNhbGxpbmcgYW55IG90aGVyIGJsb2NraW5nIGNhbGwuCisgICAgICovCisgICAgTG9jayBsb2NrKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKHVpbnRwdHJfdCBzdGFydCwgdWludHB0cl90IGVuZCkgeworICAgICAgICAvLyBUT0RPOiBleGNsdWRlIHRoaXMgaGVscGVyCisgICAgICAgICh2b2lkKXN0YXJ0OworICAgICAgICAodm9pZCllbmQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CisgICAgc3RydWN0IEZhY3RvcnlJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxGYWN0b3J5SW1wbD4gX21GYWN0b3J5OworCisgICAgQzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhcmFtZXRlciB0byB0aGlzIGludGVyZmFjZS4KKyAgICAgKiBcbm90ZSBUaGlzIG1ldGhvZCBDSEVDS3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlcGVuZGVuY3kgaW5kZXggZm9yIGEgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGl4IHRoZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyCisgICAgICovCisgICAgc2l6ZV90IGdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdDsKKworICAgIHZpcnR1YWwgfkMySW50ZXJmYWNlSGVscGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0cyBzdWJjbGFzcyBpbnN0YW5jZSdzIGFkZHJlc3MgYW5kIHNpemUuCisgICAgICoKKyAgICAgKiBcdG9kbyBhbGxvdyBzdWJjbGFzcyB0byBzcGVjaWZ5IHBhcmFtZXRlciBhZGRyZXNzIHJhbmdlIGRpcmVjdGx5IChlLmcuIGRvIG5vdCBhc3N1bWUgdGhhdAorICAgICAqICAgICAgIHRoZXkgYXJlIGxvY2FsIHRvIHRoZSBzdWJjbGFzcyBpbnN0YW5jZSkKKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHR5cGUgb2YgdGhlIGRlcml2ZWQgaW5zdGFuY2UKKyAgICAgKiBccGFyYW0gaW5zdGFuY2UgcG9pbnRlciB0byB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyX0hJREUgdm9pZCBzZXREZXJpdmVkSW5zdGFuY2UoVCAqaW5zdGFuY2UpIHsKKyAgICAgICAgc2V0SW50ZXJmYWNlQWRkcmVzc0JvdW5kcygodWludHB0cl90KWluc3RhbmNlLCAodWludHB0cl90KShpbnN0YW5jZSArIDEpKTsKKyAgICB9CisKKyAgICBDMl9ET19OT1RfQ09QWShDMkludGVyZmFjZUhlbHBlcik7Cit9OworCisvKioKKyAqIENyZWF0ZXMgYSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIGNsYXNzIGZvciBhIGZpZWxkIG9mIGEgcGFyYW1ldGVyCisgKgorICogXHBhcmFtIHNwUGFyYW0gYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpbiBhbiBpbnRlcmZhY2UgY2xhc3Mgc3ViY2xhc3NlZCBmcm9tIEMySW50ZXJmYWNlSGVscGVyLgorICogXHBhcmFtIGZpZWxkICAgYSBmaWVsZCBvZiBzdWNoIHBhcmFtZXRlcgorICovCisjZGVmaW5lIEMyRihzcFBhcmFtLCBmaWVsZCkgXAorICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8IFwKKyAgICAgICAgICAgIHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8IFwKKyAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShzcFBhcmFtLT5maWVsZCk+Ojp0eXBlPjo6dHlwZT46OnR5cGU+KCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChzcFBhcmFtLmdldCgpLCAmc3BQYXJhbS0+ZmllbGQpKQorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMzdlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKQEAgLTAsMCArMSwxMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXworI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBtYXAgdW5kZXJseWluZyB0eXBlcyB0byBDMlZhbHVlIHR5cGVzIGFzIHdlbGwgYXMgdG8gcHJpbnQgZmllbGQgdmFsdWVzLiBUaGlzIGlzCisgKiBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgc2ltcGx5IHRoZSB1bmRlcmx5aW5nIHR5cGUgZXhjZXB0IGZvciBjaGFyYWN0ZXJzIChTVFJJTkcpIGFuZCBieXRlcyAoQkxPQikuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyIHsKKyAgICB0eXBlZGVmIFQgVmFsdWVUeXBlOworICAgIGlubGluZSBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBwLnJlZjxUPigpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXI8dWludDhfdD4geworICAgIHR5cGVkZWYgdWludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjxjaGFyPiB7CisgICAgdHlwZWRlZiBpbnQzMl90IFZhbHVlVHlwZTsKKyAgICBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKTsKK307CisKKy8qKgorICogU3VwcG9ydGVkIHZhbHVlIHJhbmdlIHV0aWxpdHkgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICoKKyAqIFRoaXMgbWltaWNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZSBmb3IgUkFOR0UgdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkUmFuZ2UgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworLy9wcml2YXRlOgorICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNSU5fVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUFYX1ZBTFVFID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9TVEVQID0gc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgcmFuZ2Ugd2l0aCBubyBzdXBwb3J0ZWQgdmFsdWVzLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIHJhbmdlIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUFYX1ZBTFVFLCBNSU5fVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIGFsbCB2YWx1ZXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gQW55KCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYSBzaW5nbGUgc3VwcG9ydGVkIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBzb2xlIHN1cHBvcnRlZCB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gR3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1BWF9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om5leHRhZnRlcih2YWx1ZSwgTUFYX1ZBTFVFKSwgTUFYX1ZBTFVFKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlICsgTUlOX1NURVAsIE1BWF9WQUxVRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHZhbHVlLCBNQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIChha2Egbm90IGxlc3MgdGhhbikgYSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm90TGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gR3JlYXRlclRoYW5PckVxdWFsVG8odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBMZXNzVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIChha2Egbm90IGdyZWF0ZXIgdGhhbikgYSBnaXZlbgorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTm90R3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gTGVzc1RoYW5PckVxdWFsVG8odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgbGVzcyB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBNSU5fVkFMVUUgPyBOb25lKCkgOgorICAgICAgICAgICAgICAgIHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCBzdGQ6Om5leHRhZnRlcih2YWx1ZSwgTUlOX1ZBTFVFKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHZhbHVlIC0gTUlOX1NURVApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgY29udGludW91cyBvciBhcml0aG1ldGljIHJhbmdlIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJblJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwID0gTUlOX1NURVApIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgZ2VvbWV0cmljIHNlcmllcyBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJblNlcmllcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCAwLCBudW0sIGRlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIHNlcmllcy4KKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgYWNjdW11bGF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5NYWNTZXJpZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCBzdGVwLCBudW0sIGRlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2UgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHJhbmdlIGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgUkFOR0UgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRSYW5nZShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IF9tTWF4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIHZhbGlkLgorICAgICAqCisgICAgICogUmFuZ2VzIGFyZSB2YWxpZCBpZiB0aGV5IGFyZSBjb250aW51b3VzIG9yIG1vbm90b25pYy4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG92ZXJmbG93IG9yIG5lZ2F0aXZlIHNlcmllcworICAgICAgICByZXR1cm4gX21EZW5vbSA+IDAgJiYgX21OdW0gPj0gX21EZW5vbSAmJiBfbU1pbiAqIChfbURlbm9tIC0gX21OdW0pIDwgX21TdGVwICogX21EZW5vbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHJhbmdlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHJhbmdlIGFuZCBhbm90aGVyLCBpZiBpdCBpcworICAgICAqIHJlcHJlc2VudGFibGUgYXMgYSByYW5nZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHJhbmdlCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBpbmxpbmUgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoX21NaW4sIF9tTWF4LCBfbVN0ZXAsIF9tTnVtLCBfbURlbm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb3dlciBib3VuZCBhbmQgc3RhcnRpbmcgcG9pbnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtaW4oKSBjb25zdCAgIHsgcmV0dXJuIF9tTWluOyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVwcGVyIGJvdW5kIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbWF4KCkgY29uc3QgICB7IHJldHVybiBfbU1heDsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGVwIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgc3RlcCgpIGNvbnN0ICB7IHJldHVybiBfbVN0ZXA7ICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1lcmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBudW0oKSBjb25zdCAgIHsgcmV0dXJuIF9tTnVtOyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlbm9taW5hdG9yIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgZGVub20oKSBjb25zdCB7IHJldHVybiBfbURlbm9tOyB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgYWxsIHZhbHVlcyBiZXR3ZWVuIF9tTWluIGFuZCBfbU1heC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc1NpbXBsZVJhbmdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwID09IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKyBfbVN0ZXAsIHdoZXJlIF9tU3RlcCA+IDAgYW5kIF9tTWluIDw9IHhbaV0gPD0gX21NYXgKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc0FyaXRobWV0aWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPiBNSU5fU1RFUCAmJiBfbU51bSA9PSAxICYmIF9tRGVub20gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpXSA9IHhbMF0gKiAoX21OdW0gLyBfbURlbm9tKSBeIGkgKHdpdGggcm91bmRpbmcpLCB3aGVyZSBfbU51bSA+IF9tRGVub20gPiAwIGFuZCB4WzBdID4gMAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzR2VvbWV0cmljU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21NaW4gPiAwICYmIF9tU3RlcCA9PSAwICYmIF9tTnVtID4gX21EZW5vbSAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpICsgMV0gPSB4W2ldICogX21OdW0gLyBfbURlbm9tICsgX21TdGVwICh3aXRoIHJvdW5kaW5nKSwgd2hpbGUgeFtpICsgMV0gPiB4W2ldLCB3aGVyZQorICAgICAqIF9tU3RlcCAhPSAwLCBfbURlbm9tID4gMCBhbmQgX21OdW0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNNYWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgIT0gMCAmJiBfbU51bSA+IDAgJiYgX21EZW5vbSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBhcml0aG1ldGljIG9yIGNvbnRpbnVvdXMgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciB2YWx1ZQorICAgICAqIFxwYXJhbSBtYXggdGhlIGhpZ2hlciB2YWx1ZSAoaWYgdGhpcyBpcyBsb3dlciB0aGFuIHxtaW58IHRoZSByYW5nZSB3aWxsIGJlIGVtcHR5KQorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBzdGVwIG9mIHRoZSBhcml0aG1ldGljIHJhbmdlLiAoSWYgdGhpcyBpcyAwIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcyBvciAxIGZvcgorICAgICAqICAgICAgICBpbnRlZ2VyIHR5cGVzLCB0aGUgY29uc3RydWN0ZWQgcmFuZ2UgaXMgY29udGludW91cykKKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwID0gVChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxKSkKKyAgICAgICAgOiBfbU1pbihtaW4pLCBfbU1heChtYXgpLCBfbVN0ZXAoc3RlcCksIF9tTnVtKDEpLCBfbURlbm9tKDEpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXJ0aWMgc29yIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgYWNjdW11bGF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLiBUaGlzIGlzIDAgZm9yIGEgcHVyZSBnZW9tZXRyaWMKKyAgICAgKiAgICAgICAgc2VyaWVzCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgY29uc3RleHByIEMyX0hJREUgQzJTdXBwb3J0ZWRSYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVuKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0obnVtKSwgX21EZW5vbShkZW4pIHsgfQorCisgICAgVCBfbU1pbjsgLy8vPCBsb3dlciBib3VuZCBhbmQgc3RhcnRpbmcgcG9pbnQKKyAgICBUIF9tTWF4OyAvLy88IHVwcGVyIGJvdW5kCisgICAgVCBfbVN0ZXA7IC8vLzwgc3RlcCBvZiBhbiBhcml0aG1ldGljIHNlcmllcyAoMCBpZiBjb250aW51b3VzIGZsb2F0aW5nIHBvaW50IHJhbmdlKQorICAgIFQgX21OdW07IC8vLzwgbnVtZXJhdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworICAgIFQgX21EZW5vbTsgLy8vPCBkZW5vbWluYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMKK307CisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRGbGFncyB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCBmbGFncyByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjppbml0aWFsaXplcl9saXN0PEMyVmFsdWU6OlByaW1pdGl2ZT4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWdzIHNldCBvZiBnaXZlbiBmbGFncy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3MgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWdzIHNldCBvZiBnaXZlbiBmbGFncy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3MuCisgICAgICogXHBhcmFtIG1pbiBtaW5pbXVtIHNldCBvZiBmbGFncyB0byBiZSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IEZsYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKG1pbiwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogc2V0IGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgRkxBR1MgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5pbnNlcnQoX21WYWx1ZXMuZW5kKCksIHZhbHVlcy52YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnZhbHVlcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXQgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgZmxhZyBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhbm90aGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCFpc0VtcHR5KCkgLyogZmxhZ3MgKi8sIF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiBmbGFncygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWluaW11bSBzZXQgb2YgZmxhZ3MgZm9yIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIFQgbWluKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhpcyBzdXBwb3J0ZWQgdmFsdWUgc2V0LgorICAgICAqLworICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZGlyZWN0bHkgZnJvbSBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+ICYmdmFsdWVzKQorICAgICAgICA6IF9tVmFsdWVzKHZhbHVlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgc2V0IG9mIGZsYWdzIGFuZCBhIG1pbmltdW0gZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgaW5pdGlhbGl6ZXIgbGlzdCB2YWx1ZXMgYW5kIGEgbWluaW11bSBmbGFnIHNldAorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKFQgbWluLCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MpIHsKKyAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKG1pbik7CisgICAgICAgIGZvciAoVCBlbGVtIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIG1pbmltdW0gZmxhZyBzZXQgZm9sbG93ZWQgYnkgdGhlIHNldCBvZiBmbGFncworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCB2YWx1ZSBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldCB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSB2YWx1ZSBzZXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHsgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgYXMgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gT25lT2YoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgb2YgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogc2V0IGlmIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBub3Qgb2YgVkFMVUVTIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIGVtcHR5LgorICAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSB2YWx1ZSByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGEgZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIGZsYWcgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiBDMlZhbHVlOjpQcmltaXRpdmUgdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+ICYmdmFsdWVzKQorICAgICAgICA6IF9tVmFsdWVzKHZhbHVlcykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcworICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIGZvciAoVCBlbGVtIDogdmFsdWVzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IF9tVmFsdWVzOyAvLy88IHRoZSBzdXBwb3J0ZWQgc2V0IG9mIHZhbHVlcworfTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIEMyRmllbGRTdXBwb3J0ZVZhbHVlcyBvYmplY3QgZm9yIGZpZWxkcyBvZiB2YXJpb3VzIHR5cGVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjsKKworLy8gdGVtcGxhdGVkIG9wZXJhdG9yIG11c3QgYmUgcHJlZGVjbGFyZWQgZm9yIGZyaWVuZCBkZWNsYXJhdGlvbgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBoZWxwZXIgZm9yIGEgc3BlY2lmaWMgdHlwZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHN0cnVjdC4KKyAgICAgKi8KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvLyBUUklDS1k6IG5lZWRlZCBmb3Igc3RkOjp1bmlxdWVfcHRyPEltcGw+IGRlY2xhcmF0aW9uCisgICAgfkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoKTsKKworICAgIC8vIHN1cHBvcnQgY29weSBjb25zdHJ1Y3Rvci9vcGVyYXRvcgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmKTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyJiBvcGVyYXRvcj0oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmKTsKKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gdXNlIHBpbXBsIGFzIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZQorICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBfbUltcGw7CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKyAgICAvL2ZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAmaSk7Cit9OworCisvKioKKyAqIEJ1aWxkZXIgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICoKKyAqIFRoaXMgYnVpbGRlciBjYW4gYmUgdXNlZCB0byBzdWNjZXNzaXZlbHkgcmVzdHJpY3QgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQuIFVwb24KKyAqIGNyZWF0aW9uLCB0aGVyZSBhcmUgbm8gc3VwcG9ydGVkIHZhbHVlcyBzcGVjaWZpZWQgLSB3aGljaCBmb3IgdGhpcyBidWlsZGVyIG1lYW5zIHRoYXQgYWxsCisgKiB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggbm8gZGVmaW5lZCB2YWx1ZXMgLSBidXQgaW1wbGljaXRseSBhbnkgdmFsdWUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpOworCisgICAgLyoqCisgICAgICogR2V0IEMyUGFyYW1GaWVsZFZhbHVlcyBmcm9tIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMlBhcmFtRmllbGRWYWx1ZXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmFueSgpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgcmVhbGx5IHNob3VsZCBub3QgYmUgdXNlZCBmcm9tIHRoZSBidWlsZGVyIGFzIGFsbCBwYXJhbXMgbXVzdCBoYXZlIHN1cHBvcnRlZAorICAgICAqICAgICAgIHZhbHVlcywgYnV0IGlzIGhlcmUgaW4gY2FzZSB0aGlzIGlzIHJlYWxseSB0aGUgY2FzZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub25lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmVxdWFsVG8oVCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIHx2YWx1ZXwuCisgICAgICovCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6R3JlYXRlclRoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdExlc3NUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW5PckVxdWFsVG8odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm90R3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpOb3RHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Okxlc3NUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSByYW5nZSBvZiBbIHxtaW58LCB8bWF4fCBdCisgICAgICogd2l0aCBvcHRpb25hbCB8c3RlcHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5SYW5nZSgKKyAgICAgICAgICAgIFQgbWluLCBUIG1heCwgVCBzdGVwID0gc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyBUKDApIDogVCgxKSkgIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5SYW5nZShtaW4sIG1heCwgc3RlcCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgZ2VvbWV0cmljIHNlcmllcyBzdGFydGluZworICAgICAqIGZyb20gfG1pbnwgd2l0aCBmYWN0b3IgfG51bXwgLyB8ZGVub218LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5TZXJpZXMobWluLCBtYXgsIG51bSwgZGVub20pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzCisgICAgICogc3RhcnRpbmcgZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwgYW5kIHxzdGVwfCwgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6SW5NYWNTZXJpZXMobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gfHZhbHVlc3wuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb25lT2YoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gfHZhbHVlc3wuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb25lT2YoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBmbGFncyBpbiB8ZmxhZ3N8IHdpdGggYXQgbGVhc3QgfG1pbnwKKyAgICAgKiBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRGbGFnczxUPjo6RmxhZ3MoZmxhZ3MsIG1pbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHx2YWx1ZXN8IHdpdGggYXQgbGVhc3QgfG1pbnwKKyAgICAgKiBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZmxhZ3MoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRGbGFnczxUPjo6RmxhZ3MoZmxhZ3MsIG1pbikpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoKTsKKworICAgIC8vIHN1cHBvcnQgY29weSBjb25zdHJ1Y3Rvci9vcGVyYXRvcgorICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAmKTsKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyJiBvcGVyYXRvcj0oY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAmKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSByYW5nZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KTsKKworICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBfbUltcGw7Cit9OworCisvKioKKyAqIEJ1aWxkZXIgZm9yIGEgbGlzdCBvZiBzZXR0aW5nIGNvbmZsaWN0cy4KKyAqLworY2xhc3MgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsaXN0IGNvbnRhaW5pbmcgYSBzaW5nbGUgc2V0dGluZyBjb25mbGljdC4KKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjb25mbGljdCB0byB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZsaWN0cyBhbmQgcmV0dXJucyB0aGlzCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciYgd2l0aChDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIChhbmQgbW92ZXMgdGhlbSBvdXQgb2YgdGhpcyBidWlsZGVyLikKKyAgICAgKiAodGhpcyBpcyB3aHkgaXQgaXMgbm90IGNvbnN0KQorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gcmV0cmlldmVDb25mbGljdHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBsaXN0IGlzIGVtcHR5LgorICAgICAqLworICAgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX21Db25mbGljdHMuZW1wdHkoKTsgfQorCisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBlbXB0eSgpOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBfbUNvbmZsaWN0czsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHQgYnVpbGRlciBmb3IgYSBwYXJhbWV0ZXIuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHRha2UgRlNWIGFzIG9ubHkgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZpZWxkIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IFJlYWRPbmx5KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW0pOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJhZC12YWx1ZSBvciBpbmZvaW5mb3JtYXRpb25hbCBiYWQtdmFsdWUgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgdGhlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIHBvc3NpYmxlIHZhbHVlcy4gQXMgc3VjaCwgdGhlcmUgYXJlIG5vCisgICAgICogY29uZmxpY3RzIGZvciB0aGlzIGNhc2UgZWl0aGVyLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgQmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbyA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCAob3IgaW5mb3JtYXRpb25hbCBjb25mbGljdCkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgdGFrZXMgRlNWIHNvIHVzZSBwYXJhbUZpZWxkVmFsdWVzIGFuZCBvcHRpb25hbCBjb25mbGljdHMuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBDb25mbGljdCgKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywKKyAgICAgICAgICAgIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLy8gVE9ETzogcmV0cmlldmUgcmVzdWx0cworCisKK3ByaXZhdGU6CisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICBDMlNldHRpbmdSZXN1bHQgX21SZXN1bHQ7CisKKyAgICBDMlNldHRpbmdSZXN1bHRCdWlsZGVyKGNvbnN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgJikgPSBkZWxldGU7Cit9OworCisvKioKKyAqIFNldHRpbmcgcmVzdWx0cyAoUExVUkFMKSBidWlsZGVyLgorICoKKyAqIFNldHRpbmcgcmVzdWx0cyBjb250YWluIGEgZmFpbHVyZSBzdGF0dXMgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgZmFpbGluZyBmaWVsZHMgb3IgcGFyYW1zLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgeworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGNvbnN0IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJikgPSBkZWxldGU7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJikgPSBkZWZhdWx0OworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyICZvcGVyYXRvcj0oQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJikgPSBkZWZhdWx0OworCisgICAgLyoqIFxyZXR1cm5zIChkZWZhdWx0KSBzdWNjZXNzZnVsIHJlc3VsdCB3aXRoIG5vIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBPaygpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX09LKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGlzIGluIGJhZCBzdGF0ZSwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBCYWRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0JBRF9TVEFURSk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBjb25uZWN0aW9uIHRpbWVkIG91dCwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBUaW1lZE91dCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX1RJTUVEX09VVCk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBjb25uZWN0aW9uIGlzIGNvcnJ1cHRlZCwgd2l0aCBubyBmdXJ0aGVyIGRldGFpbHMuICovCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDb3JydXB0ZWQoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9DT1JSVVBURUQpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgTm9NZW1vcnkoQzJQYXJhbTo6SW5kZXggaW5kZXhfIF9fdW51c2VkKSB7CisgICAgICAgIC8vIFRPRE86IHRyeSB0byBhZGQgZmFpbHVyZSByZXN1bHQKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX05PX01FTU9SWSk7CisgICAgfQorCisgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RydWN0b3IKKyAgICAvKiogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBhIHNpbmdsZSBiYWQgdmFsdWUgc2V0dGluZyByZXN1bHQuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KTsKKworICAgIC8qKiBDb21iaW5lcyB0aGlzIHJlc3VsdHMgd2l0aCBvdGhlciByZXN1bHRzLiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIHBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKTsKKworICAgIC8qKiBSZXRyaWV2ZSAoZ2V0IGFuZCBtb3ZlIG91dCkgZmFpbHVyZXMgYW5kIHJldHVybiB0aGUgZmFpbHVyZSBzdGF0dXMuICovCisgICAgYzJfc3RhdHVzX3QgcmV0cmlldmVGYWlsdXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworcHJpdmF0ZToKKyAgICAvKiogU2V0dGluZyByZXN1bHRzIGJhc2VkIG9uIGEgc2luZ2xlIHN0YXR1cy4gVGhpcyBpcyB1c2VkIHdoZW4gYWN0dWFsIHNldHRpbmcgY291bGQgbm90IGJlCisgICAgICogIGF0dGVtcHRlZCB0byBnZXQgYSBzaW5nbGUgQzJTZXR0aW5nUmVzdWx0LCBvciB3aGVuIGEgc2V0dGluZyBzdWNjZWVkZWQgd2l0aG91dAorICAgICAqICAnY29tcGxhaW50cycuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgLy8gc3RhdHVzIG11c3QgYmUgb25lIG9mIE9LLCBCQURfU1RBVEUsIFRJTUVEX09VVCwgQ09SUlVQVEVEIG9yIE5PX01FTU9SWQorICAgICAgICAvLyBtYWlubHk6IEJMT0NLSU5HLCBCQURfSU5ERVgsIEJBRF9WQUxVRSBhbmQgTk9fTUVNT1JZIHJlcXVpcmVzIGEgc2V0dGluZyBhdHRlbXB0LCBidXQKKyAgICAgICAgLy8gTk9fTUVNT1JZIG1heSBub3QgYWxsb3cgdXMgdG8gY3JlYXRlIGEgcmVzdWx0cyBzdHJ1Y3R1cmUuCisKKyAgICAvKioKKyAgICAgKiBPbmUgb2YgT0ssIEJBRF9JTkRFWCwgQkFEX1ZBTFVFLCBCQURfU1RBVEUsIE5PX01FTU9SWSwgVElNRURfT1VULCBCTE9DS0lORyBvciBDT1JSVVBURUQuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgX21TdGF0dXMgX191bnVzZWQ7CisKKyAgICAvKioKKyAgICAgKiBWZWN0b3Igb2YgaW5kaXZpZHVhbCBzZXR0aW5nIHJlc3VsdCBkZXRhaWxzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBfbVJlc3VsdHM7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gZW51bWVyYXRlIGZpZWxkcyBvZiBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzIHsKKyAgICBzdHJ1Y3QgX0luc3BlY3RvcjsKKworICAgIC8qKgorICAgICAqIEFuIGV4dGVuZGVkIGZpZWxkIGRlc2NyaXB0b3Igb2JqZWN0IHdpdGggc3RydWN0dXJhbCBpbmZvcm1hdGlvbiAobGluZWFnZSBiYWNrIHRvIHRoZSByb290IG9mCisgICAgICogdGhlIHBhcmFtKS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5mbyB7CisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlX3Q7IC8vLzwgZmllbGQgdHlwZQorICAgICAgICB0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgTmFtZWRWYWx1ZXNUeXBlOyAvLy88IG5hbWVkIHZhbHVlcyBsaXN0IHR5cGUKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQKKyAgICAgICAgdHlwZV90IHR5cGUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmaW5lZCBuYW1lLXZhbHVlIHBhaXJpbmdzIGZvciB0aGlzIGZpZWxkLiBUaGUgcmV0dXJuZWQgcmVmZXJlbmNlIGlzCisgICAgICAgICAqIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSB2YWxpZGl0eSBvZiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgTmFtZWRWYWx1ZXNUeXBlICZuYW1lZFZhbHVlcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYW4gaW5kZXggb2YgMCwgYW5kCisgICAgICAgICAqIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSBoYXMgYW4gaW5kZXggb2YgMy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKKyAgICAgICAgLy8vIFRbXSBhcnJheXMgaWYgdGhpcyBpbmZvIGNvbWVzIGZyb20gYSBDMlBhcmFtOjpJbmRleCBvYmplY3QsIGFuZCB0aGUgY3VycmVudGx5IHVzZWQKKyAgICAgICAgLy8vIGV4dGVudCBpZiBpdCBjb21lcyBmcm9tIGEgQzJQYXJhbSBvYmplY3QuIFJldHVybnMgMSBmb3IgVFsxXSBhcnJheXMgYXMgd2VsbCBhcyBpZiB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KKyAgICAgICAgc2l6ZV90IGV4dGVudCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgKHN0cnVjdHVyYWwpIGRlcHRoIG9mIHRoaXMgZmllbGQuIEUuZy4gcGFyYW0uZmllbGQgb3IgcGFyYW0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YKKyAgICAgICAgICogIDAsIGFuZCBwYXJhbS5zdHJ1Y3QuZmllbGQgb3IgcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdIGhhcyBhIGRlcHRoIG9mIDEuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgZGVwdGgoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gdGhlIHBhcmFtZXRlciBpbiBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBvZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkJ3MgYXJyYXkuIEUuZy4gZm9yIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSB0aGlzIGlzIHRoZSBvZmZzZXQKKyAgICAgICAgICogb2YgaXRzIHNtYWxsZXN0IHNpYmxpbmc6IHBhcmFtLnN0cnVjdFsyXS5maWVsZFswXS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheU9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQncyBhcnJheS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGV4dGVudCgpICogc2l6ZSgpCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYXJyYXlTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGJhc2UgZmllbGQuIFRoZSBiYXNlIGZpZWxkIGlzIGEgY291c2luIG9mIHRoZSBjdXJyZW50IGZpZWxkIHdoZXJlCisgICAgICAgICAqIGFsbCBpbmRpY2VzIGFyZSAwLiBFLmcuIHRoZSB0aGUgYmFzZSBmaWVsZCBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGlzCisgICAgICAgICAqIHBhcmFtLnN0cnVjdFswXS5maWVsZFswXS4gQmFzZSBmaWVsZHMgYXJlIHVzZWQgdG8gc3BlY2lmeSBzdXBwb3J0ZWQgdmFsdWVzIGZvcgorICAgICAgICAgKiBhbGwgY291c2luIGZpZWxkcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBiYXNlRmllbGRPZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgaXMgYW4gYXJpdGhtZXRpYyAoaW50ZWdyYWwsIGNvdW50ZXIgb3IgZmxvYXQpIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0FyaXRobWV0aWMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmllbGQgY2FuIGhhdmUgYSBmbGV4aWJsZSBleHRlbnQuIGV4dGVudCgpIHJldHVybnMgdGhlIGN1cnJlbnQKKyAgICAgICAgICogZXh0ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIGluZm8gaXMgdmFsaWQKKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIF9tSW1wbCAhPSBudWxscHRyOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZm8gZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyBmaWVsZCwgb3IgYW4gaW52YWxpZCBJbmZvIG9iamVjdCBpZiBpdCBoYXMgbm8KKyAgICAgICAgLy8vIHBhcmVudHMKKyAgICAgICAgSW5mbyBwYXJlbnQoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKTsgfQorCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gX21JbXBsOworICAgICAgICBmcmllbmQgc3RydWN0IF9JbnNwZWN0b3I7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIChpbnB1dCkgaXRlcmF0b3Igb2JqZWN0IG92ZXIgZmllbGRzIHVzaW5nIEluZm8gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSXRlcmF0b3IgeworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgdmFsdWVfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgKiBwb2ludGVyOworICAgICAgICB0eXBlZGVmIEluZm8gY29uc3QgcmVmZXJlbmNlOworICAgICAgICB0eXBlZGVmIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAgIC8vLyByZXR1cm4gSW5mbyBhdCBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgIHZpcnR1YWwgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworCisgICAgICAgIC8vLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkCisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQorCisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFuIChpbnB1dCkgaXRlcmFibGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGxpc3Qgb2YgZmllbGRzLgorICAgICAqLworICAgIHN0cnVjdCBMaXN0IHsKKyAgICAgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgfkxpc3QoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIExpc3Qoc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCAoYmFzZSkgZmllbGRzIGF0IGluZGV4IDAgb2YgdGhlIHBhcmFtZXRlci4gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyB0aGUKKyAgICAgKiBmb2xsb3dpbmc6CisgICAgICogICBGaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgYXJlIGVudW1lcmF0ZWQgaW4gZmllbGQgb3JkZXIuIEhvd2V2ZXIsIHN1Yi1maWVsZHMgb2YgYSBzdHJ1Y3R1cmUKKyAgICAgKiAgIGFyZSBlbnVtZXJhdGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBzdHJ1Y3R1cmUgZmllbGQsIGFuZCBwcmlvciB0byBzaWJsaW5nIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEluIGVzc2VuY2UgdGhlIG9yZGVyIG9mIGVudW1lcmF0aW9uIGlzIGZpcnN0IGJ5IGluY3JlYXNpbmcgb2Zmc2V0LCB0aGVuIGJ5IGRlY3JlYXNpbmcgc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gZW51bWVyYXRlIGl0cyBmaWVsZHMKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yIHBhcmFtZXRlciByZWZsZWN0b3IgdXNlZCBmb3IgZW51bWVyYXRpb24KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIExpc3QgZW51bWVyYXRlRmllbGRzKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIGFsbCBjb3VzaW4gZmllbGRzIHVwIHRvIGRlcHRoIC0gbGV2ZWwgZm9yIGEgZmllbGQuIElmIGxldmVsIGlzIDAsIGl0IGVudW1lcmF0ZXMKKyAgICAgKiBvbmx5IHRoZSBmaWVsZC4gRm9yIGxldmVsIDEsIGl0IGVudW1lcmF0ZXMgYWxsIGZpZWxkcyBpbiBpdHMgY3VycmVudCBhcnJheSAod2hpY2ggbWF5IGJlCisgICAgICogaXRzZWxmIGlmIGV4dGVudCBpcyAxKS4gVGhlIG9yZGVyIG9mIGl0ZXJhdGlvbiBpcyBieSBpbmNyZWFzaW5nIGZpZWxkIG9mZnNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVDb3VzaW5zKAorICAgICAgICAgICAgY29uc3QgSW5mbyAmZmllbGQsCisgICAgICAgICAgICB1aW50MzJfdCBsZXZlbCA9IH4wKTsKKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgdGhlIGZpZWxkIGluIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgbGlzdCBvZiAyIGVsZW1lbnRzIC0gdGhlIG1vc3Qtc3BlY2lmaWMgZmllbGQKKyAgICAgKiBhcnJheSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgY29udGFpbnMgdGhlIGVudGlyZSBmaWVsZC4gSWYgdGhlIGZpZWxkIGlzIG5vdCBhIHZhbGlkIGZpZWxkCisgICAgICogc3BlY2lmaWVyIGZvciB0aGlzIHBhcmFtZXRlciAoZS5nLiBpdCBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIHBhcmFtZXRlciksIGl0IHJldHVybnMKKyAgICAgKiBhbiBlbXB0eSBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbmZvPiBsb2NhdGVGaWVsZCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbmZvPiBsb2NhdGVGaWVsZCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworfTsKKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKworI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWJkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19QQVJBTV9VVElMU19IXworI2RlZmluZSBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKK3N0cnVjdCBDMlBhcmFtOworCitjbGFzcyBDMlBhcmFtVXRpbHMgeworICAgIGZyaWVuZCBjbGFzcyBDMlV0aWxUZXN0X1BhcmFtVXRpbHNUZXN0X1Rlc3Q7CisKK3B1YmxpYzoKKworICAgIC8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorICAgIHN0YXRpYworICAgIEMyUGFyYW0gKlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpOworfTsKKworLy8vIFxlbmRjb25kCisKKyNlbmRpZiAgLy8gQzJVVElMU19QQVJBTV9VVElMU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmYzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisjZGVmaW5lIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YTsKKworfQorfQorfQorfQorCisvKioKKyAqIFN0b3JlcyBpbmZvcm1hdGlvbnMgZnJvbSBDMkJsb2NrUG9vbCBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggYXJlIHJlcXVpcmVkIGJ5IEMyQmxvY2suCisgKi8KK3N0cnVjdCBDMl9ISURFIF9DMkJsb2NrUG9vbERhdGEgeworICAgIGVudW0gdHlwZV90IDogaW50IHsKKyAgICAgICAgVFlQRV9CVUZGRVJQT09MID0gMCwKKyAgICAgICAgVFlQRV9CVUZGRVJRVUVVRSwKKyAgICB9OworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIF9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5fQzJCbG9ja1Bvb2xEYXRhKCkgPSBkZWZhdWx0OworfTsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworCisvKioKKyAqIEludGVybmFsIG9ubHkgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9ja3MgYnkgYmxvY2sgcG9vbC9idWZmZXIgcGFzc2luZyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogXHRvZG8gdGhpcyBtdXN0IGJlIGhpZGRlbgorICovCitzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5IHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvYyBwYXJlbnQgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBkYXRhICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBvZmZzZXQgYWxsb3R0ZWQgcmFuZ2Ugb2Zmc2V0CisgICAgICogXHBhcmFtIHNpemUgIGFsbG90dGVkIHNpemUKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gfihzaXplX3QpMCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgYW4gYWxsb3R0ZWQgc2VjdGlvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvYyBwYXJlbnQgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBkYXRhICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBjcm9wICBhbGxvdHRlZCBjcm9wIHJlZ2lvbgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCA9IEMyUmVjdCh+MHUsIH4wdSkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYmxvY2sgcG9vbCBkYXRhIGZyb20gMUQgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIDFEIGJsb2NrIHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gR2V0TGluZWFyQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2sxRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYmxvY2sgcG9vbCBkYXRhIGZyb20gMkQgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIDJEIGJsb2NrIHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gR2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBDMkJsb2NrMkQmIGJsb2NrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgbGluZWFyIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgbmF0aXZlIGhhbmRsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSB0byBhIGdyYXBoaWMgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gJmRhdGEpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBidWZmZXJwb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YSAgYnVmZmVycG9vbCBkYXRhIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYnVmZmVycG9vbCBkYXRhIGZyb20gdGhlIGJsb2NrcG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhICAgICAgICAgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGJ1ZmZlclBvb2xEYXRhICAgIHBvaW50ZXIgdG8gYnVmZmVycG9vbCBkYXRhIHdoZXJlIHRoZSBidWZmZXJwb29sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHVybiB7XGNvZGUgdHJ1ZX0gd2hlbiB0aGVyZSBpcyB2YWxpZCBidWZmZXJwb29sIGRhdGEsIHtcY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgR2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICpidWZmZXJQb29sRGF0YSk7CisKKyAgICAvKgorICAgICAqIExpZmUgQ3ljbGUgTWFuYWdlbWVudCBvZiBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9ja3MKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICoKKyAgICAgKiBBIGJsb2NrIHRoYXQgaXMgY3JlYXRlZCBieSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCByZXF1aXJlcyBzb21lCisgICAgICogc3BlY2lhbCB0cmVhdG1lbnQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBibG9jaworICAgICAqIGNvcnJlc3BvbmRzIHRvIGEgaGVsZCAoZGVxdWV1ZWQvYXR0YWNoZWQpIEdyYXBoaWNCdWZmZXIgaW4gYSBzbG90IG9mIGEKKyAgICAgKiBidWZmZXJxdWV1ZSwgaXRzIGRlc3RydWN0aW9uIHNob3VsZCB0cmlnZ2VyIGEgY2FsbCB0bworICAgICAqIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlcigpLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlCisgICAgICogR3JhcGhpY0J1ZmZlciBpcyBub3QgaGVsZCwgaS5lLiwgaWYgaXQgaGFzIGJlZW4gcXVldWVkIG9yIGRldGFjaGVkLAorICAgICAqIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBub3QgYmUgY2FsbGVkIHVwb24gdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIF9DMkJsb2NrUG9vbERhdGEgY3JlYXRlZCBieSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCBpbmNsdWRlcyB0d28KKyAgICAgKiBtYWluIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKKyAgICAgKiAgIC0gImhlbGQiIHN0YXR1czogV2hldGhlciBjYW5jZWxCdWZmZXIoKSBzaG91bGQgYmUgY2FsbGVkIHVwb24KKyAgICAgKiAgICAgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqICAgLSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50OiBUaGUgcXVhZHJ1cGxlIChpZ2JwLCBnZW5lcmF0aW9uLCBicUlkLAorICAgICAqICAgICBicVNsb3QpLCB3aGVyZSBpZ2JwIGlzIHRoZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgZ2VuZXJhdGlvbiBpcyB0aGUgbGF0ZXN0IGdlbmVyYXRpb24gbnVtYmVyLCBvZiB0aGUKKyAgICAgKiAgICAgYnVmZmVycXVldWUsIGJxSWQgaXMgdGhlIGdsb2JhbGx5IHVuaXF1ZSBpZCBvZiB0aGUgYnVmZmVycXVldWUsIGFuZAorICAgICAqICAgICBicVNsb3QgaXMgdGhlIHNsb3QgaW4gdGhlIGJ1ZmZlcnF1ZXVlLgorICAgICAqCisgICAgICogaWdicCBpcyB0aGUgaW5zdGFuY2Ugb2YgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBvbiB3aGljaCBjYW5jZWxCdWZmZXIoKQorICAgICAqIHdpbGwgYmUgY2FsbGVkIGlmICJoZWxkIiBzdGF0dXMgaXMgdHJ1ZSB3aGVuIHRoZSBibG9jayBpcyBkZXN0cm95ZWQuCisgICAgICogKGJxU2xvdCBpcyBhbiBpbnB1dCB0byBjYW5jZWxCdWZmZXIoKS4pIEhvd2V2ZXIsIG9ubHkgZ2VuZXJhdGlvbiwgYnFJZAorICAgICAqIGFuZCBicVNsb3QgYXJlIHJldGFpbmVkIHdoZW4gYSBibG9jayBpcyB0cmFuc2ZlcnJlZCBmcm9tIG9uZSBwcm9jZXNzIHRvCisgICAgICogYW5vdGhlci4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGJvdGggdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZworICAgICAqIHByb2Nlc3NlcyB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBvZiAiaGVsZCIgc3RhdHVzIGFuZCBpZ2JwLiBCZWxvdyBhcmUKKyAgICAgKiBmdW5jdGlvbnMgcHJvdmlkZWQgZm9yIHRoaXMgcHVycG9zZToKKyAgICAgKgorICAgICAqICAgLSBHZXRCdWZmZXJRdWV1ZURhdGEoKTogUmV0dXJucyBnZW5lcmF0aW9uLCBicUlkIGFuZCBicVNsb3QuCisgICAgICogICAtIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpOiBTZXRzICJoZWxkIiBzdGF0dXMgdG8gdHJ1ZS4KKyAgICAgKiAgIC0gWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKTogU2V0cyAiaGVsZCIgc3RhdHVzIHRvIGZhbHNlLgorICAgICAqICAgLSBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoKTogU2V0cyB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCBhbmQKKyAgICAgKiAgICAgImhlbGQiIHN0YXR1cy4KKyAgICAgKgorICAgICAqIEFsbCB0aGVzZSBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBfQzJCbG9ja1Bvb2xEYXRhLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkKKyAgICAgKiBjYWxsaW5nIEdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKCkuCisgICAgICoKKyAgICAgKiBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSB3aWxsIG1hcmsgdGhlIGJsb2NrIGFzIGhlbGQsIHdoaWxlCisgICAgICogWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSB3aWxsIGRvIHRoZSBvcHBvc2l0ZS4gVGhlc2UgdHdvIGZ1bmN0aW9ucyBkbworICAgICAqIG5vdCBtb2RpZnkgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQsIHNvIGl0IGlzIG5vdCB3cm9uZyB0byBjYWxsCisgICAgICogSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgYWZ0ZXIgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBpZiBpdCBjYW4gYmUKKyAgICAgKiBndWFyYW50ZWVkIHRoYXQgdGhlIGJsb2NrIGlzIG5vdCBkZXN0cm95ZWQgZHVyaW5nIHRoZSBwZXJpb2QgYmV0d2VlbiB0aGUKKyAgICAgKiB0d28gY2FsbHMuCisgICAgICoKKyAgICAgKiBBc3NpbmdCbG9ja1RvQnVmZmVyUXVldWUoKSBoYXMgYSAiaGVsZCIgc3RhdHVzIGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCisgICAgICoKKyAgICAgKiBNYWludGFpbmluZyBDb25zaXN0ZW5jeSB3aXRoIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgT3BlcmF0aW9ucworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICoKKyAgICAgKiBkZXF1ZXVlQnVmZmVyKCkKKyAgICAgKiAgIC0gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGJsb2NrcG9vbC4gSXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAgICAgKiAgICAgbWFudWFsbHkuIFRoZSBibG9ja3Bvb2wgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBjb3JyZWN0CisgICAgICogICAgIGluZm9ybWF0aW9uIGZvciBfQzJCbG9ja1Bvb2xEYXRhLCB3aXRoICJoZWxkIiBzdGF0dXMgc2V0IHRvIHRydWUuCisgICAgICoKKyAgICAgKiBxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIHF1ZXVlQnVmZmVyKCkgaXMgY2FsbGVkLCBZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQuCisgICAgICoKKyAgICAgKiBhdHRhY2hCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBhdHRhY2hCdWZmZXIoKSBpcyBjYWxsZWQsIEFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgpIHNob3VsZCBiZQorICAgICAqICAgICBjYWxsZWQgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogZGV0YWNoQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgZGV0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkLgorICAgICAqLworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnF1ZXVlIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBccCBnZW5lcmF0aW9uIHNldCB0byBudWxscHRyIHdpbGwgcmV0dXJuCisgICAgICogd2hldGhlciB0aGUgYmxvY2sgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgYnV0IHdpbGwgbm90CisgICAgICogZmlsbCBpbiB0aGUgdmFsdWVzIGZvciBccCBnZW5lcmF0aW9uLCBccCBicUlkIG9yIFxwIGJxU2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHBvb2xEYXRhICAgYmxvY2twb29sIGRhdGEuCisgICAgICogXHBhcmFtW291dF0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciBhdHRhY2hlZCB0byB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbVtvdXRdIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIG93bmluZyB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtW291dF0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50NjRfdCogYnFJZCA9IG51bGxwdHIsCisgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFNldCBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGFuZCAiaGVsZCIgc3RhdHVzIHRvIGEgYmxvY2sgY3JlYXRlZCBieSBhCisgICAgICogYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xEYXRhIGJsb2NrcG9vbCBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGJsb2NrLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICAgIFxjIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2UgZnJvbSB0aGUgZGVzaWduYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnF1ZXVlLgorICAgICAqIFxwYXJhbSBnZW5lcmF0aW9uIEdlbmVyYXRpb24gbnVtYmVyIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvLgorICAgICAqIFxwYXJhbSBicUlkICAgICAgIElkIG9mIHRoZSBidWZmZXJxdWV1ZSB0aGF0IHdpbGwgb3duIHRoZSBidWZmZXIgKGJsb2NrKS4KKyAgICAgKiBccGFyYW0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbSBoZWxkICAgICAgIFdoZXRoZXIgdGhlIGJsb2NrIGlzIGhlbGQuIFRoaXMgImhlbGQiIHN0YXR1cyBjYW4gYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIGxhdGVyIGJ5IGNhbGxpbmcgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIGlmIFxwIHBvb2xEYXRhIGlzIHZhbGlkIGJ1ZmZlcnF1ZXVlIGRhdGE7CisgICAgICogICAgICAgICBcYyBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBOb3RlOiBccCBnZW5lcmF0aW9uIHNob3VsZCBtYXRjaCB0aGUgbGF0ZXN0IGdlbmVyYXRpb24gbnVtYmVyIHNldCBvbiB0aGUKKyAgICAgKiBidWZmZXJxdWV1ZSwgYW5kIFxwIGJxSWQgc2hvdWxkIG1hdGNoIHRoZSB1bmlxdWUgaWQgZm9yIHRoZSBidWZmZXJxdWV1ZQorICAgICAqIChvYnRhaW5hYmxlIGJ5IGNhbGxpbmcgaWdicC0+Z2V0VW5pcXVlSWQoKSkuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBib29sIGhlbGQgPSB0cnVlKTsKKworICAgIC8qKgorICAgICAqIEhvbGQgYSBibG9jayBmcm9tIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gaWdicCAgICAgXGMgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSB0byBiZSBhc3NpZ25lZCB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2suIFRoaXMgaXMgbm90IG5lZWRlZCB3aGVuIHRoZSBibG9jayBpcyBsb2NhbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIFlpZWxkIGEgYmxvY2sgdG8gdGhlIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUuIFRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbgorICAgICAqIG9mIHRoZSBibG9jayBub3QgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCk7CisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhKTsKKworfTsKKworI2VuZGlmIC8vIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YThmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisjZGVmaW5lIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCitzdHJ1Y3QgQzJfSElERSBfQzJQYXJhbUluc3BlY3RvciB7CisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIFNldE9mZnNldChDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBmZC5fbUZpZWxkSWQuX21PZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRFbmRPZmZzZXQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCB1aW50MzJfdCBwYXJhbVNpemUgPSAwKSB7CisgICAgICAgIHVpbnQzMl90IGVuZE9mZnNldCA9IGZkLl9tRmllbGRJZC5fbU9mZnNldCArIGZkLl9tRXh0ZW50ICogZmQuX21GaWVsZElkLl9tU2l6ZTsKKyAgICAgICAgLy8vIGZvciBmbGV4IHBhcmFtZXRlcnMgcmV0dXJuIHBhcmFtU2l6ZSBpZiBnaXZlbgorICAgICAgICByZXR1cm4gZmQuX21FeHRlbnQgPyBlbmRPZmZzZXQgOiBzdGQ6Om1heChlbmRPZmZzZXQsIHBhcmFtU2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEluZGV4KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tSW5kZXg7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IF9DMkZpZWxkSWQgJmYpIHsKKyAgICAgICAgcmV0dXJuIGYuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IF9DMkZpZWxkSWQgJmYpIHsKKyAgICAgICAgcmV0dXJuIGYuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgX0MyRmllbGRJZCBHZXRGaWVsZChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEF0dHJpYihjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICAgICAgcmV0dXJuIHBkLl9tQXR0cmliOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgX0MyRmllbGRJZCBHZXRGaWVsZChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyUGFyYW1GaWVsZCBDcmVhdGVQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChpbmRleCwgb2Zmc2V0LCBzaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIF9DMkZpZWxkSWQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChpbmRleCwgZmllbGQuX21PZmZzZXQsIGZpZWxkLl9tU2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIHZvaWQgVHJpbVBhcmFtKEMyUGFyYW0gKnBhcmFtLCB1aW50MzJfdCBuZXdTaXplKSB7CisgICAgICAgIGlmIChwYXJhbSAmJiAqcGFyYW0gJiYgcGFyYW0tPnNpemUoKSA+IG5ld1NpemUgJiYgbmV3U2l6ZSA+PSBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIHBhcmFtLT5fbVNpemUgPSBuZXdTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB2b2lkIEFkZE5hbWVkVmFsdWVzKAorICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlICYmbmFtZWRWYWx1ZXMpIHsKKyAgICAgICAgZmQuX21OYW1lZFZhbHVlcyA9IHN0ZDo6bW92ZShuYW1lZFZhbHVlcyk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyU3RydWN0RGVzY3JpcHRvciBDcmVhdGVTdHJ1Y3REZXNjcmlwdG9yKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJiZmaWVsZHMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3RydWN0RGVzY3JpcHRvcihpbmRleCwgc3RkOjptb3ZlKGZpZWxkcykpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMkZpZWxkRGVzY3JpcHRvciBPZmZzZXRGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCBzaXplX3Qgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBDMkZpZWxkRGVzY3JpcHRvcihmZCwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLyBleHBvc2UgYXR0cmlidXRlcworICAgIHR5cGVkZWYgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYl90OworfTsKKworI2VuZGlmIC8vIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMjYwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApAQCAtMCwwICsxLDQ5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCcUJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZURlZnMuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6QW53QnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFM7Cit1c2luZyA6OmFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbmRyb2lkTWVtb3J5VXNhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OkZlbmNlOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgOjphbmRyb2lkOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjp3cDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSA6IHB1YmxpYyBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIGJvb2wgaGVsZDsKKyAgICBib29sIGxvY2FsOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiBsb2NhbFBvb2w7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJRVUVVRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSByZW1vdGUgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyID0gbnVsbHB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBsb2NhbCBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSBvdmVycmlkZTsKKworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGlmIChnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgICpnZW5lcmF0aW9uID0gcG9vbERhdGEtPmdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAoYnFJZCkgeworICAgICAgICAgICAgICAgICpicUlkID0gcG9vbERhdGEtPmJxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnFTbG90KSB7CisgICAgICAgICAgICAgICAgKmJxU2xvdCA9IHBvb2xEYXRhLT5icVNsb3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGJvb2wgaGVsZCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIHBvb2xEYXRhLT5pZ2JwID0gaWdicDsKKyAgICAgICAgcG9vbERhdGEtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICBwb29sRGF0YS0+YnFJZCA9IGJxSWQ7CisgICAgICAgIHBvb2xEYXRhLT5icVNsb3QgPSBicVNsb3Q7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gaGVsZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBpZiAoIXBvb2xEYXRhLT5sb2NhbCkgeworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgfQorICAgIGlmIChwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBpZiAoIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgeworICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgdWludDY0X3QgdXNhZ2U7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDY0X3QgYnFJZDsKKyAgICAgICAgdWludDMyX3QgYnFTbG90OworICAgICAgICBhbmRyb2lkOjpfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICAgICAgICAgIGhhbmRsZSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgaWYgKGJxSWQgfHwgYnFTbG90KSB7CisgICAgICAgICAgICAgICAgLy8gQlFCQlAKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYnFTbG90KTsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJsb2NrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitjbGFzcyBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4geworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEZyb21JZ2JwX2woCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIC8vIFdlIGhhdmUgYW4gSUdCUCBub3cuCisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBDMkFuZHJvaWRNZW1vcnlVc2FnZSBhbmRyb2lkVXNhZ2UgPSB1c2FnZTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0Pihmb3JtYXQpOworICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgQUxPR1YoInRyaWVzIHRvIGRlcXVldWUgYnVmZmVyIik7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1Qcm9kdWNlci0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCksIHRydWUsCisgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmZmVuY2VdKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0U3RhdHVzLCBpbnQzMl90IHRTbG90LCBoaWRsX2hhbmRsZSBjb25zdCYgdEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdFRzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHNsb3QgPSB0U2xvdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oZmVuY2UuZ2V0KCksIHRGZW5jZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgdFRzOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAvLyBkZXF1ZXVlQnVmZmVyIHJldHVybnMgZmxhZy4KKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkgfHwgc3RhdHVzIDwgYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJjYW5ub3QgZGVxdWV1ZSBidWZmZXIgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSAmJiBzdGF0dXMgPT0gYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgICAgLy8gVG9vIG1hbnkgYnVmZmVyIGRlcXVldWVkLiByZXRyeWluZyBhZnRlciBzb21lIHRpbWUgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgIHJldHVybiBDMl9USU1FRF9PVVQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7CisgICAgICAgIGhpZGxfaGFuZGxlIGZlbmNlSGFuZGxlOworICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmZmVuY2VIYW5kbGUsICZuaCwgKmZlbmNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGZW5jZVdhaXRUaW1lTXMgPSAxMDsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmVuY2UtPndhaXQoa0ZlbmNlV2FpdFRpbWVNcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IC1FVElNRSkgeworICAgICAgICAgICAgICAgIC8vIGZlbmNlIGlzIG5vdCBzaWduYWxsZWQgeWV0LgorICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX1RJTUVEX09VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIGZlbmNlIHdhaXQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGZlbmNlSGFuZGxlKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbmRlckNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbnNlY3NfdCBzaWduYWxUaW1lID0gZmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsVGltZSA+PSAwICYmIHNpZ25hbFRpbWUgPCBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlckNhbGxiYWNrKG1Qcm9kdWNlcklkLCBzbG90LCBzaWduYWxUaW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290IGZlbmNlIHNpZ25hbCB0aW1lIG9mICVsbGQiLCAobG9uZyBsb25nKXNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+ICZzbG90QnVmZmVyID0gbUJ1ZmZlcnNbc2xvdF07CisgICAgICAgIGlmIChzdGF0dXMgJiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OIHx8ICFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBhc3N1bWVzIHJlcXVlc3RCdWZmZXIjIHJldHVybnMgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbgorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXJdKGludDMyX3QgdFN0YXR1cywgQW53QnVmZmVyIGNvbnN0JiB0QnVmZmVyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhzbG90QnVmZmVyLmdldCgpLCB0QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoc2xvdEJ1ZmZlci0+aGFuZGxlKTsKKworICAgICAgICAgICAgaWYgKGdyYWxsb2NIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVyIHdyYXBzICVsbHUgJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgICAgICBDMkhhbmRsZSAqYzJIYW5kbGUgPSBhbmRyb2lkOjpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QpOworICAgICAgICAgICAgICAgIGlmIChjMkhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlZCBldmVyeXRoaW5nIHRvIGMySGFuZGxlLgorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGMySGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShncmFsbG9jSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJsb2NrIHdhcyBub3QgY3JlYXRlZC4gY2FsbCByZXF1ZXN0QnVmZmVyIyBhZ2FpbiBuZXh0IHRpbWUuCisgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUluaXQoQzJfT0spLCBtUHJvZHVjZXJJZCgwKSwgbUFsbG9jYXRvcihhbGxvY2F0b3IpIHsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgYm9vbCBub0luaXQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgIFJldHVybjxpbnQzMl90PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7CisgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRyYW5zUmVzdWx0KSA9PSBhbmRyb2lkOjpOT19JTklUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgaW50IGtNYXhJZ2JwUmV0cnkgPSAyMDsgLy8gVE9ETzogc21hbGwgbnVtYmVyIGNhbiBjYXVzZSBjcmFzaCBpbiByZWxlYXNpbmcuCisgICAgICAgIHN0YXRpYyBpbnQga01heElnYnBSZXRyeURlbGF5VXMgPSAxMDAwMDsKKworICAgICAgICBpbnQgY3VyVHJ5ID0gMDsKKworICAgICAgICB3aGlsZSAoY3VyVHJ5KysgPCBrTWF4SWdicFJldHJ5KSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBDMl9OT19JTklUCisgICAgICAgICAgICBpZiAobVByb2R1Y2VySWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZhbGxvYyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAodWludDY0X3QpMCwgfjAsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnPworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlZCBhIGJ1ZmZlciBzdWNjZXNzZnVsbHkiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGZldGNoRnJvbUlnYnBfbCh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX1RJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgOjp1c2xlZXAoa01heElnYnBSZXRyeURlbGF5VXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfVElNRURfT1VUOworICAgIH0KKworICAgIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJlbmRlckNhbGxiYWNrID0gcmVuZGVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBhbmRyb2lkOjpPSzsKKyAgICAgICAgdWludDY0X3QgcHJvZHVjZXJJZCA9IDA7CisgICAgICAgIGlmIChwcm9kdWNlcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gcHJvZHVjZXItPmdldFVuaXF1ZUlkKAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnByb2R1Y2VySWRdKGludDMyX3QgdFN0YXR1cywgaW50NjRfdCB0UHJvZHVjZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VySWQgPSB0UHJvZHVjZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25maWd1cmVQcm9kdWNlciAtLSBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgcHJvZHVjZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghbm9Jbml0ICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48aW50MzJfdD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9Jbml0ID0gIXRyYW5zUmVzdWx0LmlzT2soKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0cmFuc1Jlc3VsdCkgPT0gYW5kcm9pZDo6Tk9fSU5JVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9kdWNlciAmJiBzdGF0dXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IHByb2R1Y2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoaWdicF9pZCA9PSBtUHJvZHVjZXJJZCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKGlnYnBfc2xvdCwgbnVsbHB0cikuaXNPaygpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgdWludDY0X3QgbVByb2R1Y2VySWQ7CisgICAgT25SZW5kZXJDYWxsYmFjayBtUmVuZGVyQ2FsbGJhY2s7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlcikgOgorICAgICAgICBoZWxkKHByb2R1Y2VyICYmIGJxSWQgIT0gMCksIGxvY2FsKGZhbHNlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocHJvZHVjZXIpLAorICAgICAgICBsb2NhbFBvb2woKSB7Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCkgOgorICAgICAgICBoZWxkKHRydWUpLCBsb2NhbCh0cnVlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocG9vbCA/IHBvb2wtPm1Qcm9kdWNlciA6IG51bGxwdHIpLAorICAgICAgICBsb2NhbFBvb2wocG9vbCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgeworICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobG9jYWwgJiYgbG9jYWxQb29sKSB7CisgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGJxSWQsIGJxU2xvdCk7CisgICAgfSBlbHNlIGlmIChpZ2JwKSB7CisgICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIG51bGxwdHIpOworICAgIH0KK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woKSB7fQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y29uZmlndXJlUHJvZHVjZXIocHJvZHVjZXIpOworICAgIH0KK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+c2V0UmVuZGVyQ2FsbGJhY2socmVuZGVyQ2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFzU3RyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKGMyX3N0YXR1c190IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyX09LOiAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiByZXR1cm4gIkJBRF9WQUxVRSI7CisgICAgICAgIGNhc2UgQzJfQkFEX0lOREVYOiByZXR1cm4gIkJBRF9JTkRFWCI7CisgICAgICAgIGNhc2UgQzJfQ0FOTk9UX0RPOiByZXR1cm4gIkNBTk5PVF9ETyI7CisgICAgICAgIGNhc2UgQzJfRFVQTElDQVRFOiByZXR1cm4gIkRVUExJQ0FURSI7CisgICAgICAgIGNhc2UgQzJfTk9UX0ZPVU5EOiByZXR1cm4gIk5PVF9GT1VORCI7CisgICAgICAgIGNhc2UgQzJfQkFEX1NUQVRFOiByZXR1cm4gIkJBRF9TVEFURSI7CisgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICByZXR1cm4gIkJMT0NLSU5HIjsKKyAgICAgICAgY2FzZSBDMl9DQU5DRUxFRDogIHJldHVybiAiQ0FOQ0VMRUQiOworICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcmV0dXJuICJOT19NRU1PUlkiOworICAgICAgICBjYXNlIEMyX1JFRlVTRUQ6ICAgcmV0dXJuICJSRUZVU0VEIjsKKyAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHJldHVybiAiVElNRURfT1VUIjsKKyAgICAgICAgY2FzZSBDMl9PTUlUVEVEOiAgIHJldHVybiAiT01JVFRFRCI7CisgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiByZXR1cm4gIkNPUlJVUFRFRCI7CisgICAgICAgIGNhc2UgQzJfTk9fSU5JVDogICByZXR1cm4gIk5PX0lOSVQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgaSwgY29uc3QgY2hhciAqZGVmKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6ICAgcmV0dXJuICJ1OCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjogcmV0dXJuICJjMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IHJldHVybiAiYzY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICByZXR1cm4gImZwIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICByZXR1cm4gImkzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgcmV0dXJuICJpNjQiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHJldHVybiAiY2hyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiByZXR1cm4gInUzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogcmV0dXJuICJ1NjQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gKGkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpID8gInN0cnVjdCIgOiBkZWY7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJQYXJhbUZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliUGFyYW1Db3JlSW5kZXgoY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJWMlYyUwM3giLAorICAgICAgICAgICAgaS5pc0ZsZXhpYmxlKCkgPyAnRicgOiAnLScsCisgICAgICAgICAgICBpLmlzVmVuZG9yKCkgPyAnVicgOiAnLScsCisgICAgICAgICAgICBpLmNvcmVJbmRleCgpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtSW5kZXgoCisgICAgICAgIGNvbnN0IEMyUGFyYW06OlR5cGUgJmksIGJvb2wgYWRkU3RyZWFtLCB1bnNpZ25lZCBzdHJlYW1JZCkgeworICAgIHN0ZDo6c3RyaW5nIHYgPSBTdHJpbmdQcmludGYoIiVjJWMiLAorICAgICAgICAgICAgaS5mb3JJbnB1dCgpID8gJ0knIDogaS5mb3JPdXRwdXQoKSA/ICdPJyA6ICctJywKKyAgICAgICAgICAgIGkuZm9yU3RyZWFtKCkgPyAnUycgOiBpLmZvclBvcnQoKSA/ICdQJyA6ICdHJyk7CisgICAgaWYgKGFkZFN0cmVhbSkgeworICAgICAgICBpZiAoaS5mb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgdiArPSBTdHJpbmdQcmludGYoIiUwMmQiLCBzdHJlYW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ICs9ICItLSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdgorICAgICAgICAgICAgKyBTdHJpbmdQcmludGYoIiVjICIsCisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNUUlVDVCAgPyAnUycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpJTkZPICAgID8gJ2knIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6VFVOSU5HICA/ICd0JyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNFVFRJTkcgPyAncycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpOT05FICAgID8gJy0nIDogJz8nKQorICAgICAgICAgICAgKyBhdHRyaWJQYXJhbUNvcmVJbmRleChpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiUGFyYW06OkNvcmVJbmRleCgiIDw8IGF0dHJpYlBhcmFtQ29yZUluZGV4KGkpIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCJQYXJhbTo6VHlwZSglMDh4OiAiLCBpLnR5cGUoKSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgZmFsc2UsIDApIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OkluZGV4KCUwOHg6ICIsICh1aW50MzJfdClpKQorICAgICAgICAgICAgPDwgYXR0cmliUGFyYW1JbmRleChpLCB0cnVlLCBpLnN0cmVhbSgpKSA8PCAiKSI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJGaWVsZElkKGNvbnN0IF9DMkZpZWxkSWQgJmkpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCJGaWVsZChAJTAyeCslMDJ4KSIsCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoaSkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIG9zIDw8ICI8IiA8PCBhdHRyaWJGaWVsZElkKGkpIDw8ICI+IjsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpIHsKKyAgICBvcyA8PCBhdHRyaWJGaWVsZElkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChpKSkgPDwgIiAiOworICAgIGlmIChpLm5hbWVkVmFsdWVzKCkuc2l6ZSgpKSB7CisgICAgICAgIG9zIDw8ICJlbnVtICI7CisgICAgfQorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpLnR5cGUoKSkgPDwgIiAiIDw8IGkubmFtZSgpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIlslenVdIiwgaS5leHRlbnQoKSk7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSkgeworICAgIG9zIDw8ICI8IiA8PCBDMlBhcmFtOjpJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgoaSkpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjo6RmllbGQoQCUwMngrJTAyeCk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKKyAgICByZXR1cm4gb3M7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyRmllbGRWYWx1ZUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGQ6Om9zdHJlYW0mIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj46OnB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICBpZiAoaXNwcmludChwLmkzMikpIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJyVjJyIsIHAuaTMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCInXFx4JTAyeCciLCAodWludDMyX3QpcC5pMzIpOworICAgIH0KK30KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4IiwgcC51MzIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IGMyX2NudHJfdDxUPiAmdikgeworICAgIHJldHVybiBvcyA8PCAiY3RyKCIgPDwgdi5wZWVrdSgpIDw8ICIpIjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKSB7CisgICAgb3MgPDwgIlJhbmdlKCI7CisgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1pbigpKTsKKyAgICBvcyA8PCAiLi4iOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5tYXgoKSk7CisgICAgb3MgPDwgIiAqPSAiIDw8IGkubnVtKCkgPDwgIiAvPSAiIDw8IGkuZGVub20oKSA8PCAiICs9ICIgPDwgaS5zdGVwKCkgPDwgIikiOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZpKSB7CisgICAgb3MgPDwgIkZsYWdzWyI7CisgICAgaWYgKCFpLmlzRW1wdHkoKSkgeworICAgICAgICBvcyA8PCAibWluPSI7CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgfQorICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLmZsYWdzKCkpIHsKKyAgICAgICAgaWYgKGNvbW1hKSB7CisgICAgICAgICAgICBvcyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgdik7CisgICAgICAgIGNvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgb3MgPDwgIl0iOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKSB7CisgICAgb3MgPDwgIlZhbHVlc1siOworICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZEZsYWdzPFZhbHVlVHlwZT4gX21GbGFnczsKKworcHVibGljOgorLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0IHsKKyAgICBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIG9zIDw8IF9tUmFuZ2U7CisgICAgfSBlbHNlIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIG9zIDw8IF9tVmFsdWVzOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgIG9zIDw8IF9tRmxhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgIlVua25vd24gRlNWIHR5cGU6ICIgPDwgKHVpbnQzMl90KV9tVHlwZTsKKyAgICB9CisgICAgcmV0dXJuIG9zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpIHsKKyAgICByZXR1cm4gaS5fbUltcGwtPnN0cmVhbU91dChvcyk7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGZsb2F0PiAmaSk7CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0N2ZiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCkBAIC0wLDAgKzEsODQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmbGVjdG9ySGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIEMyUmVmbGVjdG9ySGVscGVyOjphZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGZvciAoQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1a3QgOiBzdHJ1Y3RzKSB7CisgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHN0cnVjdHVyZSBkZXNjcmlwdGlvbnMgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBvbmVzCisgICAgICAgIGFkZFN0cnVjdERlc2NyaXB0b3Ioc3RkOjptb3ZlKHN0cnVrdCkpOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4KK0MyUmVmbGVjdG9ySGVscGVyOjpkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBfbVN0cnVjdHMuZmluZChwYXJhbUluZGV4KTsKKyAgICBpZiAoaXQgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oaXQtPnNlY29uZCk7CisgICAgfQorfTsKKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcihDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpIHsKKyAgICBpZiAoX21TdHJ1Y3RzLmZpbmQoc3RydWt0LmNvcmVJbmRleCgpKSAhPSBfbVN0cnVjdHMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBhZGRlZAorICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IGRlc2NyaXB0b3IgbWF0Y2hlcyBzdG9yZWQgZGVzY3JpcHRvcgorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGF0IGFsbCBzdHJ1Y3QgZmllbGRzIGFyZSBrbm93biB0byB0aGlzIHJlZmxlY3RvcgorICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkIDogc3RydWt0KSB7CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBmZC50eXBlKCkgJn4gQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHOworICAgICAgICAgICAgaWYgKF9tU3RydWN0cy5maW5kKGNvcmVJbmRleCkgPT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKElORk8pIDw8ICJtaXNzaW5nIHN0cnVjdCBkZXNjcmlwdG9yICMiIDw8IGNvcmVJbmRleCA8PCAiIGZvciBmaWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBmZC5uYW1lKCkgPDwgIiBvZiBzdHJ1Y3QgIyIgPDwgc3RydWt0LmNvcmVJbmRleCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9tU3RydWN0cy5lbXBsYWNlKHN0cnVrdC5jb3JlSW5kZXgoKSwgc3RydWt0KTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmFtSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgICAgICA6IG1QYXJhbShwYXJhbSksIG1OYW1lKG5hbWUpLCBfbVN0cnVjdChzdHJ1a3QpIHsgfQorCisgICAgSW1wbChJbXBsJiYpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICAgICAgbURvd25EZXBlbmRlbmNpZXMucHVzaF9iYWNrKGluZGV4KTsKKyAgICB9CisKKyAgICBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBhdHRyaWIoKSB7CisgICAgICAgIHJldHVybiBtQXR0cmliOworICAgIH0KKworICAgIHZvaWQgYnVpbGQoKSB7CisgICAgICAgIC8vIG1vdmUgZGVwZW5kZW5jaWVzIGludG8gZGVzY3JpcHRvcgorICAgICAgICBtRGVzY3JpcHRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIGluZGV4KCksIChDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QpbUF0dHJpYiwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobU5hbWUpLCBzdGQ6Om1vdmUobURlcGVuZGVuY2llcykpOworICAgIH0KKworICAgIHZvaWQgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvICZmIDoKKyAgICAgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcygqbURlZmF1bHRWYWx1ZSwgcmVmbGVjdG9yKSkgeworICAgICAgICAgICAgaWYgKCFmLmlzQXJpdGhtZXRpYygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gZnN2UG9pbnRlcjsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgYnJlYWthYmxlIHN0cnVjdHVyZQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgZnN2OworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDhfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGJyZWFrIG91dCBvZiBkbyB7fSB3aGlsZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmc3ZQb2ludGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPihmc3YpOworICAgICAgICAgICAgfSB3aGlsZSAoZmFsc2UpOworCisgICAgICAgICAgICBtRmllbGRzLmVtcGxhY2VfaGludCgKKyAgICAgICAgICAgICAgICAgICAgbUZpZWxkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RmllbGRIZWxwZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbSwgX0MyRmllbGRJZChmLm9mZnNldCgpLCBmLnNpemUoKSksIHN0ZDo6bW92ZShmc3ZQb2ludGVyKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdCB7CisgICAgICAgIGF1dG8gaXQgPSBtRmllbGRzLmZpbmQoX0MyRmllbGRJZChiYXNlT2ZmcywgYmFzZVNpemUpKTsKKyAgICAgICAgaWYgKGl0ID09IG1GaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURvd25EZXBlbmRlbmNpZXM7CisgICAgfQorCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7CisgICAgICAgIGlmICghbURlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBtaXNzaW5nIGRlZmF1bHQgdmFsdWVcbiIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGVmYXVsdFZhbHVlLT5pbmRleCgpOworICAgIH0KKworICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW07CisgICAgfQorCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIHJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShfbVN0cnVjdCk7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKSB7CisgICAgICAgIG1EZWZhdWx0VmFsdWUgPSBkZWZhdWx0XzsKKyAgICB9CisKKyAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICAgICAgbURlcGVuZGVuY2llcyA9IGluZGljZXM7CisgICAgICAgIG1EZXBlbmRlbmNpZXNBc1JlZnMgPSByZWZzOworICAgIH0KKworICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICAgICAgLy8gZG8gbm90IGFsbG93IGFkZGluZyBmaWVsZHMgbXVsdGlwbGUgdGltZXMsIG9yIHRvIGNvbnN0IHZhbHVlcworICAgICAgICBpZiAoIW1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gcGFyYW0gIiA8PCBtTmFtZSA8PCAiIG11bHRpcGxlIHRpbWVzIjsKKyAgICAgICAgfSBlbHNlIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJUcnlpbmcgdG8gYWRkIGZpZWxkcyB0byBjb25zdCBwYXJhbSAiIDw8IG1OYW1lOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDMlBhcmFtRmllbGRWYWx1ZXMgJnBmdiA6IGZpZWxkcykgeworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIC8vIF9DMkZpZWxkSWQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmdi5wYXJhbU9yRmllbGQpLAorICAgICAgICAgICAgICAgICAgICAvLyBGaWVsZCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPihtUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBmdi52YWx1ZXMpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEdldHRlcihzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgICAgICBDMlIgcmVzdWx0ID0gbVNldHRlcih2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYpOworICAgICAgICByZXR1cm4gcmVzdWx0LnJldHJpZXZlRmFpbHVyZXMoZmFpbHVyZXMpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgICAgIGlmICghbVNldHRlciAmJiBtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhXQVJOSU5HKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBzZXR0ZXIsIG1ha2luZyBpdCBjb25zdCI7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGVtcHR5IGluIHRoaXMgY2FzZQorICAgICAgICAgICAgbUF0dHJpYiB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoIW1TZXR0ZXIpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQXR0cmliICYgYXR0cmliX3Q6OklTX0NPTlNUKSB7CisgICAgICAgICAgICBjcmVhdGVGaWVsZHNBbmRTdXBwb3J0ZWRWYWx1ZXMocmVmbGVjdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBkZWZhdWx0IGJhc2VkIG9uIHNldHRlciBhbmQgdmVyaWZ5IHRoYXQgRlNWIGNvdmVycyB0aGUgdmFsdWVzCisgICAgICAgIH0KKworICAgICAgICBpZiAobUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIGZpZWxkcyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCkgeworICAgICAgICByZXR1cm4gbVBhcmFtLmdldCgpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBfQzJQYXJhbUluc3BlY3Rvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgUGFyYW1SZWYgbVBhcmFtOworICAgIEMyU3RyaW5nIG1OYW1lOworICAgIEMyU3RydWN0RGVzY3JpcHRvciBfbVN0cnVjdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbURlZmF1bHRWYWx1ZTsKKyAgICBhdHRyaWJfdCBtQXR0cmliOworICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBtU2V0dGVyOworICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBtR2V0dGVyOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRGVwZW5kZW5jaWVzOworICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBtRGVwZW5kZW5jaWVzQXNSZWZzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBtRG93bkRlcGVuZGVuY2llczsgLy8gVE9ETzogdGhpcyBkb2VzIG5vdCB3b3JrIGZvciBzdHJlYW0gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptYXA8X0MyRmllbGRJZCwgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPj4gbUZpZWxkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IG1EZXNjcmlwdG9yOworfTsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcigKKyAgICAgICAgUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpCisgICAgOiBtSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbD4oCisgICAgICAgICAgICBwYXJhbSwgbmFtZSwgc3RkOjptb3ZlKHN0cnVrdCkpKSB7IH0KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpQYXJhbUhlbHBlcihDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXIgJiYpID0gZGVmYXVsdDsKKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp+UGFyYW1IZWxwZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCkgeworICAgIHJldHVybiBtSW1wbC0+YWRkRG93bkRlcGVuZGVuY3koaW5kZXgpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYl90JiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmF0dHJpYigpIHsKKyAgICByZXR1cm4gbUltcGwtPmF0dHJpYigpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmJ1aWxkKCkgeworICAgIG1JbXBsLT5idWlsZCgpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4oc3RkOjptb3ZlKCp0aGlzKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RGVzY3JpcHRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlc2NyaXB0b3IoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6Z2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERvd25EZXBlbmRlbmNpZXMoKTsKK30KKworQzJQYXJhbTo6SW5kZXggQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjppbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmluZGV4KCk7Cit9CisKK0MyU3RyaW5nIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm5hbWUoKTsKK30KKworY29uc3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtUmVmIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6cmVmKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+cmVmKCk7Cit9CisKK0MyU3RydWN0RGVzY3JpcHRvciBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpIHsKKyAgICByZXR1cm4gbUltcGwtPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgIG1JbXBsLT5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RGVwZW5kZW5jaWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpIHsKKyAgICBtSW1wbC0+c2V0RGVwZW5kZW5jaWVzKGluZGljZXMsIHJlZnMpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpIHsKKyAgICByZXR1cm4gbUltcGwtPnNldEZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzKSk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRHZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0R2V0dGVyKGdldHRlcik7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRTZXR0ZXIoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICBtSW1wbC0+c2V0U2V0dGVyKHNldHRlcik7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dHJ5U2V0KAorICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW1wbC0+dHJ5U2V0KHZhbHVlLCBtYXlCbG9jaywgY2hhbmdlZCwgZiwgZmFpbHVyZXMpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbGlkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBtSW1wbC0+dmFsaWRhdGUocmVmbGVjdG9yKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnZhbHVlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGRIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlBhcmFtRmllbGQgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjptYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlUGFyYW1GaWVsZChpbmRleCwgbUZpZWxkSWQpOworfQorCitDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OkZpZWxkSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpCisgICAgOiBtUGFyYW0ocGFyYW0pLAorICAgICAgbUZpZWxkSWQoZmllbGQpLAorICAgICAgbVBvc3NpYmxlKHN0ZDo6bW92ZSh2YWx1ZXMpKSB7CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJDcmVhdGluZyBmaWVsZCBoZWxwZXIgIiA8PCBmaWVsZCA8PCAiICIKKyAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+KCptUG9zc2libGUpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6c2V0U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpIHsKKyAgICBtU3VwcG9ydGVkID0gc3RkOjptb3ZlKHZhbHVlcyk7Cit9CisKK2NvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKkMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6Z2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAobVN1cHBvcnRlZCA/IG1TdXBwb3J0ZWQgOiBtUG9zc2libGUpLmdldCgpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtUG9zc2libGUuZ2V0KCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogV3JhcHBlciBhcm91bmQgZmllbGQtc3VwcG9ydGVkLXZhbHVlcyBidWlsZGVyIHRoYXQgZ2V0cyBzdG9yZWQgaW4gdGhlCisgKiBmaWVsZCBoZWxwZXIgd2hlbiB0aGUgYnVpbGRlciBnb2VzIG91dCBvZiBzY29wZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiB7CisgICAgU3VwcG9ydGVkVmFsdWVzQnVpbGRlcigKKyAgICAgICAgICAgIEMyUGFyYW1GaWVsZCAmZmllbGQsIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IGhlbHBlcikKKyAgICAgICAgOiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KGZpZWxkKSwgX21IZWxwZXIoaGVscGVyKSwgX21GaWVsZChmaWVsZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYnVpbGRlciB2YWx1ZXMgb24gZGVzdHJ1Y3Rpb24uCisgICAgICovCisgICAgdmlydHVhbCB+U3VwcG9ydGVkVmFsdWVzQnVpbGRlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgX21IZWxwZXItPnNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6Om1vdmUoQzJQYXJhbUZpZWxkVmFsdWVzKCp0aGlzKS52YWx1ZXMpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7Cit9OworCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6c2hvdWxkQmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4oX21GaWVsZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6bXVzdEJlKCkgeworICAgIHJldHVybiBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQsIF9tSGVscGVyKTsKK30KKworLyoKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6dmFsaWRhdGVQb3NzaWJsZShUICZ2YWx1ZSkKK2NvbnN0IHsKKyAgICAvLy8gVE9ETworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6T2soKTsKK30KKyovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OkZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCkKKyAgICA6IF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoaGVscGVyLT5tYWtlUGFyYW1GaWVsZChpbmRleCkpIHsgfQorCit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQ4X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjaGFyPjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50NjRfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZhY3RvcnlJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5IHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRSZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4KKyAgICBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIF9tUGFyYW1zLmZpbmQocGFyYW0pLT5zZWNvbmQ7CisgICAgfQorCitwdWJsaWM6CisgICAgRmFjdG9yeUltcGwoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgdmlydHVhbCB+RmFjdG9yeUltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFBhcmFtKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICAgICAgX21QYXJhbXMuaW5zZXJ0KHsgcGFyYW0tPnJlZigpLCBwYXJhbSB9KTsKKyAgICAgICAgX21JbmRleFRvSGVscGVyLmluc2VydCh7cGFyYW0tPmluZGV4KCksIHBhcmFtfSk7CisKKyAgICAgICAgLy8gYWRkIGRvd24tZGVwZW5kZW5jaWVzIChhbmQgdmFsaWRhdGUgZGVwZW5kZW5jaWVzIGFzIGEgcmVzdWx0KQorICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IFBhcmFtUmVmICZyZWYgOiBwYXJhbS0+Z2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkpIHsKKyAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBtdXN0IGFscmVhZHkgYmUgZGVmaW5lZAorICAgICAgICAgICAgaWYgKCFfbVBhcmFtcy5jb3VudChyZWYpKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW1ldGVyICIgPDwgcGFyYW0tPm5hbWUoKSA8PCAiIGhhcyBhIGRlcGVuZGVuY3kgYXQgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXggPDwgIiB0aGF0IGlzIG5vdCB5ZXQgZGVmaW5lZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhcmFtcy5maW5kKHJlZiktPnNlY29uZC0+YWRkRG93bkRlcGVuZGVuY3kocGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorCisgICAgICAgIF9tRGVwZW5kZW5jeUluZGV4LmVtcGxhY2UocGFyYW0tPmluZGV4KCksIF9tRGVwZW5kZW5jeUluZGV4LnNpemUoKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgc3RyZWFtcyBzZXBhcmF0ZWx5CisgICAgICAgIGNvbnN0IGF1dG8gaXQgPSBfbUluZGV4VG9IZWxwZXIuZmluZChpeCk7CisgICAgICAgIGlmIChpdCA9PSBfbUluZGV4VG9IZWxwZXIuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IHRoaXMgY291bGQgcmV0dXJuIGEgY29weSB1c2luZyBwcm9wZXIgcG9pbnRlciBjYXN0LgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBnZXRQYXJhbVZhbHVlKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyID0gZ2V0UGFyYW0oaXgpOworICAgICAgICByZXR1cm4gaGVscGVyID8gaGVscGVyLT52YWx1ZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IF9tUGFyYW1zKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgcXVlcnlTdXBwb3J0ZWRQYXJhbXMgc2lnbmF0dXJlPworICAgICAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PEMyUGFyYW1EZXNjcmlwdG9yPihpdC5zZWNvbmQtPmdldERlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBlcnJvcnMKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXgoQzJQYXJhbTo6SW5kZXggaXgpIHsKKyAgICAgICAgLy8gaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBoZWxwZXIgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzdHJlYW0gc28KKyAgICAgICAgLy8gd2UgY2FuIGxvb2sgdXAgZGlyZWN0bHkgYnkgaW5kZXgKKyAgICAgICAgYXV0byBpdCA9IF9tRGVwZW5kZW5jeUluZGV4LmZpbmQoaXgpOworICAgICAgICByZXR1cm4gaXQgPT0gX21EZXBlbmRlbmN5SW5kZXguZW5kKCkgPyBTSVpFX01BWCA6IGl0LT5zZWNvbmQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPFBhcmFtUmVmLCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+PiBfbVBhcmFtczsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21JbmRleFRvSGVscGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc2l6ZV90PiBfbURlcGVuZGVuY3lJbmRleDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhc1N0cmluZyhDMlBhcmFtICpwKSB7CisgICAgY2hhciBhZGRyWzIwXTsKKyAgICBzcHJpbnRmKGFkZHIsICIlcDpbIiwgcCk7CisgICAgc3RkOjpzdHJpbmcgdiA9IGFkZHI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwLT5zaXplKCk7ICsraSkgeworICAgICAgICBjaGFyIGRbNF07CisgICAgICAgIHNwcmludGYoZCwgIiAlMDJ4IiwgKigoKHVpbnQ4X3QgKilwKSArIGkpKTsKKyAgICAgICAgdiArPSBkICsgKGkgPT0gMCk7CisgICAgfQorICAgIHJldHVybiB2ICsgIl0iOworfQorCit9CisKK0MySW50ZXJmYWNlSGVscGVyOjpDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKKyAgICA6IG1SZWZsZWN0b3IocmVmbGVjdG9yKSwKKyAgICAgIF9tRmFjdG9yeShzdGQ6Om1ha2Vfc2hhcmVkPEZhY3RvcnlJbXBsPihyZWZsZWN0b3IpKSB7IH0KKworCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OkdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHBhcmFtID0gcmVmbGVjdG9yLT5kZXNjcmliZShpbmRleCk7CisgICAgaWYgKHBhcmFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIH4oc2l6ZV90KTA7IC8vIHBhcmFtIHN0cnVjdHVyZSBub3QgZGVzY3JpYmVkCisgICAgfQorCisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQgOiAqcGFyYW0pIHsKKyAgICAgICAgc2l6ZV90IGZpZWxkT2Zmc2V0ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZFNpemUgPSBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShmaWVsZCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpOworICAgICAgICBpZiAob2Zmc2V0IDwgZmllbGRPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID09IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICAvLyBleGFjdCBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGQuZXh0ZW50KCkgPT0gMCB8fCBvZmZzZXQgPCBmaWVsZE9mZnNldCArIGZpZWxkU2l6ZSAqIGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAvLyByZWR1Y2UgdG8gZmlyc3QgZWxlbWVudCBpbiBjYXNlIG9mIGFycmF5CisgICAgICAgICAgICBvZmZzZXQgPSBmaWVsZE9mZnNldCArIChvZmZzZXQgLSBmaWVsZE9mZnNldCkgJSBmaWVsZFNpemU7CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSgpID49IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgb2Zmc2V0IGlzIHdpdGhpbiBhIGZpZWxkCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3RvciwgZmllbGQudHlwZSgpICYgfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtIGZpZWxkT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gfm9mZnNldCA/IGZpZWxkT2Zmc2V0ICsgb2Zmc2V0IDogb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBub3QgZm91bmQKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6YWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIG1SZWZsZWN0b3ItPmFkZFN0cnVjdERlc2NyaXB0b3IocGFyYW0tPnJldHJpZXZlU3RydWN0RGVzY3JpcHRvcigpKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwYXJhbS0+dmFsaWRhdGUobVJlZmxlY3Rvcik7CisgICAgaWYgKGVyciAhPSBDMl9DT1JSVVBURUQpIHsKKyAgICAgICAgX21GYWN0b3J5LT5hZGRQYXJhbShwYXJhbSk7CisKKyAgICAgICAgLy8gcnVuIHNldHRlciB0byBlbnN1cmUgY29ycmVjdCB2YWx1ZXMKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpcGFyYW0tPnRyeVNldChwYXJhbS0+dmFsdWUoKS5nZXQoKSwgQzJfTUFZX0JMT0NLLCAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgJmZhaWx1cmVzKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpjb25maWcoCisgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcywgYm9vbCB1cGRhdGVQYXJhbXMsCisgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyBfX3VudXNlZCAvKiBUT0RPICovKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBib29sIHBhcmFtV2FzSW52YWxpZCA9IGZhbHNlOyAvLyBUT0RPIGlzIHRoaXMgdGhlIHNhbWUgYXMgYmFkIHZhbHVlPworICAgIGJvb2wgcGFyYW1Ob3RGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CYWRWYWx1ZSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob01lbW9yeSA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1CbG9ja2luZyA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1UaW1lZE91dCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Db3JydXB0ZWQgPSBmYWxzZTsKKworICAgIC8vIGRlcGVuZGVuY2llcworICAgIC8vIGRvd24gZGVwZW5kZW5jaWVzIGFyZSBtYXJrZWQgZGlydHksIGJ1dCBwYXJhbXMgc2V0IGFyZSBub3QgaW1tZWRpYXRlbHkKKyAgICAvLyBtYXJrZWQgZGlydHkgKHVubGVzcyB0aGV5IGJlY29tZSBkb3duIGRlcGVuZGVuY3kpIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gYXZvaWQgc2V0dGluZyB0aGVtIGlmIHRoZXkgZGlkIG5vdCBjaGFuZ2UKKworICAgIC8vIFRPRE86IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluZGljZXMgZm9yIHRoZSBzYW1lIGRlcGVuZGVuY3kgaW5kZXgKKyAgICAvLyB7IGRlcEl4LCBwYXJhbUl4IH0gbWF5IGJlIGEgc3VpdGFibGUga2V5CisgICAgc3RkOjptYXA8c2l6ZV90LCBzdGQ6OnBhaXI8QzJQYXJhbTo6SW5kZXgsIGJvb2w+PiBkZXBlbmRlbmNpZXM7CisKKyAgICAvLyB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBsYXN0IHZhbGlkIHBhcmFtZXRlciwgc28gYWRkIGFuIGV4dHJhCisgICAgLy8gbG9vcCBpdGVyYXRpb24gYWZ0ZXIgdGhlIGxhc3QgcGFyYW1ldGVyCisgICAgZm9yIChzaXplX3QgcF9peCA9IDA7IHBfaXggPD0gcGFyYW1zLnNpemUoKTsgKytwX2l4KSB7CisgICAgICAgIEMyUGFyYW0gKnAgPSBudWxscHRyOworICAgICAgICBDMlBhcmFtOjpJbmRleCBwYXJhbUl4ID0gMHU7CisgICAgICAgIHNpemVfdCBwYXJhbURlcEl4ID0gU0laRV9NQVg7CisgICAgICAgIGJvb2wgbGFzdCA9IHBfaXggPT0gcGFyYW1zLnNpemUoKTsKKyAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICBwID0gcGFyYW1zW3BfaXhdOworICAgICAgICAgICAgaWYgKCEqcCkgeworICAgICAgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbUl4ID0gcC0+aW5kZXgoKTsKKyAgICAgICAgICAgIHBhcmFtRGVwSXggPSBnZXREZXBlbmRlbmN5SW5kZXhfbChwYXJhbUl4KTsKKyAgICAgICAgICAgIGlmIChwYXJhbURlcEl4ID09IFNJWkVfTUFYKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBmaXJzdCBpbnNlcnQgLSBtYXJrIG5vdCBkaXJ0eQorICAgICAgICAgICAgLy8gaXQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgZGlydHkgYnkgYSBkZXBlbmRlbmN5IHVwZGF0ZQorICAgICAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBvdmVycndyaXRlKCEpCisgICAgICAgICAgICAodm9pZClkZXBlbmRlbmNpZXMuaW5zZXJ0KHsgcGFyYW1EZXBJeCwgeyBwYXJhbUl4LCBmYWxzZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQocGFyYW1EZXBJeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZGVwZW5kZW5jeSBmb3Igc2V0dGluZyBhdCAjIiA8PCBwYXJhbURlcEl4IDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgaXQtPnNlY29uZC5maXJzdCA8PCAiLCB1cGRhdGUgIgorICAgICAgICAgICAgICAgICAgICA8PCAoaXQtPnNlY29uZC5zZWNvbmQgPyAiYWx3YXlzIChkaXJ0eSkiIDogIm9ubHkgaWYgY2hhbmdlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcHJvY2VzcyBhbnkgcmVtYWluaW5nIGRlcGVuZGVuY2llcworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImhhbmRsaW5nIGRpcnR5IGRvd24gZGVwZW5kZW5jaWVzIGFmdGVyIGxhc3Qgc2V0dGluZyI7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGFueSBkaXJ0aWVkIGRvd24tZGVwZW5kZW5jaWVzIHVudGlsIHRoZSBuZXh0IHBhcmFtCisgICAgICAgIHdoaWxlIChkZXBlbmRlbmNpZXMuc2l6ZSgpICYmIGRlcGVuZGVuY2llcy5iZWdpbigpLT5maXJzdCA8PSBwYXJhbURlcEl4KSB7CisgICAgICAgICAgICBhdXRvIG1pbiA9IGRlcGVuZGVuY2llcy5iZWdpbigpOworICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXggaXggPSBtaW4tPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgIGJvb2wgZGlydHkgPSBtaW4tPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMuZXJhc2UobWluKTsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJvbGQgdmFsdWUgIiA8PCBhc1N0cmluZyhwYXJhbS0+dmFsdWUoKS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm5ldyB2YWx1ZSAiIDw8IGFzU3RyaW5nKHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsYXN0ICYmICFkaXJ0eSAmJiBpeCA9PSBwYXJhbUl4ICYmICpwYXJhbS0+dmFsdWUoKSA9PSAqcCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBpbiB2YWx1ZSAtIGFuZCBkZXBlbmRlbmNpZXMgd2VyZSBub3QgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJpZ25vcmluZyBzZXR0aW5nIHVuY2hhbmdlZCBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhcHBseSBzZXR0aW5nCisgICAgICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAic2V0dGluZyBwYXJhbSAiIDw8IGl4OworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG9sZFZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBwYXJhbS0+dHJ5U2V0KAorICAgICAgICAgICAgICAgICAgICAoIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgPyBwIDogcGFyYW0tPnZhbHVlKCkuZ2V0KCksIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAmY2hhbmdlZCwgKl9tRmFjdG9yeSwgZmFpbHVyZXMpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG5ld1ZhbHVlID0gcGFyYW0tPnZhbHVlKCk7CisgICAgICAgICAgICBDMl9DSEVDS19FUShvbGRWYWx1ZSA9PSBuZXdWYWx1ZSwgKm9sZFZhbHVlID09ICpuZXdWYWx1ZSk7CisgICAgICAgICAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICAgICAgICAgIGNhc2UgQzJfT0s6IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiBwYXJhbUJhZFZhbHVlID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHBhcmFtTm9NZW1vcnkgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX1RJTUVEX09VVDogcGFyYW1UaW1lZE91dCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICBwYXJhbUJsb2NraW5nID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9DT1JSVVBURUQ6IHBhcmFtQ29ycnVwdGVkID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogOy8vIFRPRE8gZmF0YWwKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBiYWNrIHJlc3VsdCBmb3IgY29uZmlndXJlZCB2YWx1ZXMgKG9yIGludmFsaWRhdGUgaWYgaXQgZG9lcyBub3QgZml0IG9yIG1hdGNoKQorICAgICAgICAgICAgaWYgKHVwZGF0ZVBhcmFtcyAmJiAhbGFzdCAmJiBwYXJhbUl4ID09IGl4KSB7CisgICAgICAgICAgICAgICAgaWYgKCFwLT51cGRhdGVGcm9tKCpwYXJhbS0+dmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tcGFyZSBwdHJzIGFzIHBhcmFtcyBhcmUgY29weSBvbiB3cml0ZQorICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInBhcmFtICIgPDwgaXggPDwgIiB2YWx1ZSBjaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBjaGFuZ2VkIHVwZGF0ZSBkb3duLWRlcGVuZGVuY2llcyBhbmQgbWFyayB0aGVtIGRpcnR5CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCBpeCA6IHBhcmFtLT5nZXREb3duRGVwZW5kZW5jaWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IDE7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaW5zZXJ0X3JlcyA9IGRlcGVuZGVuY2llcy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCksIHsgaXgsIHRydWUgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgICAgICAgICBpZiAoIWluc2VydF9yZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKmluc2VydF9yZXMuZmlyc3QpLnNlY29uZC5zZWNvbmQgPSB0cnVlOyAvLyBtYXJrIGRpcnR5CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gZGVwZW5kZW5jaWVzLmZpbmQoZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfQ0hFQ0soaXQtPnNlY29uZC5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm1hcmtpbmcgZG93biBkZXBlbmRlbmNpZXMgdG8gdXBkYXRlIGF0ICMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpIDw8ICI6ICIgPDwgaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHBhcmFtQ29ycnVwdGVkID8gQzJfQ09SUlVQVEVEIDoKKyAgICAgICAgICAgIHBhcmFtQmxvY2tpbmcgPyBDMl9CTE9DS0lORyA6CisgICAgICAgICAgICBwYXJhbVRpbWVkT3V0ID8gQzJfVElNRURfT1VUIDoKKyAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICAgKHBhcmFtQmFkVmFsdWUgfHwgcGFyYW1XYXNJbnZhbGlkKSA/IEMyX0JBRF9WQUxVRSA6CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDogQzJfT0spOworfQorCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+Z2V0RGVwZW5kZW5jeUluZGV4KGl4KTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQgLyogVE9ETyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtRGlkTm90Rml0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHAgOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXAtPnVwZGF0ZUZyb20oKnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUoaXgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwID0gQzJQYXJhbTo6Q29weSgqdmFsdWUpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDoKKyAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIG5vdCBtYXJrZWQgaW4gdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA/IEMyX09LIDoKKyAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID8gQzJfT0sgOiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICByZXR1cm4gX21GYWN0b3J5LT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworfQorCisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrIF9fdW51c2VkKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJxdWVyeWluZyBmaWVsZCAiIDw8IHF1ZXJ5LmZpZWxkKCk7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHF1ZXJ5LmZpZWxkKCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgIGlmICghcGFyYW0pIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiYmFkIHBhcmFtIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBvZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICBtUmVmbGVjdG9yLCBpeCwKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KHF1ZXJ5LmZpZWxkKCkpIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgaWYgKH5vZmZzID09IDApIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiZmllbGQgY291bGQgbm90IGJlIGZvdW5kIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIHJlc29sdmVkIHRvICIKKyAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIkAlMDJ6eCslMDJ4Iiwgb2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpZWxkID0KKyAgICAgICAgICAgIHBhcmFtLT5maW5kRmllbGQob2ZmcywgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUocXVlcnkuZmllbGQoKSkpOworICAgICAgICBpZiAoIWZpZWxkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBmaWVsZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKnZhbHVlcyA9IG51bGxwdHI7CisgICAgICAgIHN3aXRjaCAocXVlcnkudHlwZSgpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UOgorICAgICAgICAgICAgdmFsdWVzID0gZmllbGQtPmdldFN1cHBvcnRlZFZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRQb3NzaWJsZVZhbHVlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBxdWVyeSB0eXBlOiAiIDw8IHF1ZXJ5LnR5cGUoKTsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzKSB7CisgICAgICAgICAgICBxdWVyeS52YWx1ZXMgPSAqdmFsdWVzOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJubyB2YWx1ZXMgcHVibGlzaGVkIGJ5IGNvbXBvbmVudCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IEMySW50ZXJmYWNlSGVscGVyOjpsb2NrKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+KG1NdXRleCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjOTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcApAQCAtMCwwICsxLDEyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXBhcmFtZXRlciIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YWx1ZSIKKworI2RlZmluZSBDMl9MT0dfVkVSQk9TRQorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkUmFuZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Igc3VwcG9ydGVkIHZhbHVlcyByYW5nZSBjYWxjdWxhdGlvbnMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRlA9c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlciB7CisgICAgLyoqCisgICAgICogdHlwZSBvZiByYW5nZSBzaXplOiBhIC0gYiBpZiBhID49IGIgYW5kIGEgYW5kIGIgYXJlIG9mIHR5cGUgVAorICAgICAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlIERpZmZUeXBlOworCisgICAgLyoqCisgICAgICogY2FsY3VsYXRlIChoaWdoIC0gbG93KSBtb2Qgc3RlcAorICAgICAqLworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBEaWZmVHlwZShoaWdoIC0gbG93KSAlIERpZmZUeXBlKHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxULCB0cnVlPiB7CisgICAgdHlwZWRlZiBUIERpZmZUeXBlOworCisgICAgc3RhdGljIERpZmZUeXBlIG1vZChUIGxvdywgVCBoaWdoLCBUIHN0ZXApIHsKKyAgICAgICAgcmV0dXJuIGZtb2QoaGlnaCAtIGxvdywgc3RlcCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD46OkMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIF9tTWluID0gdmFsdWVzLnJhbmdlLm1pbi5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbU1heCA9IHZhbHVlcy5yYW5nZS5tYXgucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21TdGVwID0gdmFsdWVzLnJhbmdlLnN0ZXAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21OdW0gPSB2YWx1ZXMucmFuZ2UubnVtLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tRGVub20gPSB2YWx1ZXMucmFuZ2UuZGVub20ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfbU1pbiA9IE1BWF9WQUxVRTsKKyAgICAgICAgX21NYXggPSBNSU5fVkFMVUU7CisgICAgICAgIF9tU3RlcCA9IE1JTl9TVEVQOworICAgICAgICBfbU51bSA9IDA7CisgICAgICAgIF9tRGVub20gPSAwOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgZmFsbCBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKHZhbHVlIDwgX21NaW4gfHwgdmFsdWUgPiBfbU1heCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNpbXBsZSByYW5nZXMgY29udGFpbiBhbGwgdmFsdWVzIGJldHdlZW4gbWluIGFuZCBtYXgKKyAgICBpZiAoaXNTaW1wbGVSYW5nZSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBtaW4gaXMgYWx3YXlzIHBhcnQgb2YgdGhlIHJhbmdlCisgICAgaWYgKHZhbHVlID09IF9tTWluKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBzdGVwcGVkIHJhbmdlcyByZXF1aXJlICh2YWwgLSBtaW4pICUgc3RlcCB0byBiZSB6ZXJvCisgICAgaWYgKGlzQXJpdGhtZXRpY1NlcmllcygpKSB7CisgICAgICAgIHJldHVybiBfQzJUeXBlZFN1cHBvcnRlZFJhbmdlSGVscGVyPFQ+Ojptb2QoX21NaW4sIHZhbHVlLCBfbVN0ZXApID09IDA7CisgICAgfQorICAgIC8vIHB1cmUgZ2VvbWV0cmljIHNlcmllcyByZXF1aXJlICh2YWwgLyBtaW4pIHRvIGJlIGludGVnZXIgbXVsdGlwbGUgb2YgKG51bS9kZW5vbSkKKyAgICBpZiAoaXNHZW9tZXRyaWNTZXJpZXMoKSkgeworICAgICAgICBpZiAodmFsdWUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBsb2cyYmFzZSA9IGxvZzIoX21OdW0gLyBfbURlbm9tKTsKKyAgICAgICAgZG91YmxlIHBvd2VyID0gbGxyb3VuZChsb2cyKHZhbHVlIC8gZG91YmxlKF9tTWluKSkgLyBsb2cyYmFzZSk7CisgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHRoYXQgcmVzdWx0IGZhbGxzIHdpdGhpbiBwcmVjaXNpb24gKG90aGVyIHRoYW4gcm91bmQpCisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBUKF9tTWluICogcG93KF9tTnVtIC8gX21EZW5vbSwgcG93ZXIpICsgTUlOX1NURVAgLyAyKTsKKyAgICB9CisgICAgLy8gbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgcmVxdWlyZSB2YWxpZGF0aW5nIGJ5IHdhbGtpbmcgdGhyb3VnaCB0aGUgc2VyaWVzCisgICAgaWYgKGlzTWFjU2VyaWVzKCkpIHsKKyAgICAgICAgZG91YmxlIGxhc3RWYWx1ZSA9IF9tTWluOworICAgICAgICBkb3VibGUgYmFzZSA9IF9tTnVtIC8gX21EZW5vbTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzdCBpcyBzYWZlIGFzIF9tTWluIDw9IGxhc3RWYWx1ZSA8PSBfbU1heAorICAgICAgICAgICAgaWYgKFQobGFzdFZhbHVlICsgTUlOX1NURVAgLyAyKSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG91YmxlIG5leHRWYWx1ZSA9IGZtYShsYXN0VmFsdWUsIGJhc2UsIF9tU3RlcCk7CisgICAgICAgICAgICBpZiAobmV4dFZhbHVlIDw9IGxhc3RWYWx1ZSB8fCBuZXh0VmFsdWUgPiBfbU1heCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2VyaWVzIGlzIG5vIGxvbmdlciBtb25vdG9uaWMgb3Igd2l0aGluIHJhbmdlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0VmFsdWUgPSBuZXh0VmFsdWU7CisgICAgICAgIH07CisgICAgfQorICAgIC8vIGlmIHdlIGFyZSBoZXJlLCB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCByYW5nZQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkUmFuZ2U8VD4gQzJTdXBwb3J0ZWRSYW5nZTxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgLy8gVE9ETyAtIHRoaXMgb25seSB3b3JrcyBmb3Igc2ltcGxlIHJhbmdlcworICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bWF4KF9tTWluLCBsaW1pdC5fbU1pbiksIHN0ZDo6bWluKF9tTWF4LCBsaW1pdC5fbU1heCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChfbVN0ZXAsIGxpbWl0Ll9tU3RlcCkpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KKy8vIGZsb2F0IGZsYWdzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgZGVmaW5lIGEgZmV3IG1ldGhvZHMgdG8gc3VwcG9ydCBnZW5lcmljIHN1cHBvcnRlZCB2YWx1ZXMgY29kZQordGVtcGxhdGU8PgorYm9vbCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6Y29udGFpbnMoZmxvYXQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGZsb2F0PigpOworfQorCit0ZW1wbGF0ZTw+CitDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzOworICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8PgorZmxvYXQgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46Om1pbigpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIC8vIHZhbHVlIG11c3QgY29udGFpbiB0aGUgbWluaW1hbCBtYXNrCisgICAgVCBtaW5NYXNrID0gbWluKCk7CisgICAgaWYgKH52YWx1ZSAmIG1pbk1hc2spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWx1ZSAmPSB+bWluTWFzazsKKyAgICAvLyBvdGhlcndpc2UsIHJlbW92ZSBmbGFncyBmcm9tIHZhbHVlIGFuZCBzZWUgaWYgd2UgYXJyaXZlIGF0IDAKKyAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKH52YWx1ZSAmIHYucmVmPFZhbHVlVHlwZT4oKSkgPT0gMCkgeworICAgICAgICAgICAgdmFsdWUgJj0gfnYucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsdWUgPT0gMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkRmxhZ3M8VD46OmZsYWdzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoYzJfbWF4KF9tVmFsdWVzLnNpemUoKSwgMXUpIC0gMSk7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKF9tVmFsdWVzLmNiZWdpbigpICsgMSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCktPlQgeworICAgICAgICAgICAgcmV0dXJuIHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRGbGFnczxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIFQgbWluTWFzayA9IG1pbigpIHwgbGltaXQubWluKCk7CisgICAgLy8gbWluaW11bSBtYXNrIG11c3QgYmUgY292ZXJlZCBieSBib3RoIHRoaXMgYW5kIG90aGVyCisgICAgaWYgKGxpbWl0LmNvbnRhaW5zKG1pbk1hc2spICYmIGNvbnRhaW5zKG1pbk1hc2spKSB7CisgICAgICAgIHZhbHVlc1swXSA9IG1pbk1hc2s7CisgICAgICAgIC8vIGtlZXAgb25seSBmbGFncyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGxpbWl0CisgICAgICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXQsIG1pbk1hc2tdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBtaW5NYXNrIHx8ICFsaW1pdC5jb250YWlucyh2YWx1ZSk7IH0pOworICAgICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gZG8gaXQgdmljZSB2ZXJzYQorICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdiA6IF9tVmFsdWVzKSB7CisgICAgICAgICAgICBUIHZhbHVlID0gdi5yZWY8VmFsdWVUeXBlPigpIHwgbWluTWFzazsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBtaW5NYXNrICYmIGNvbnRhaW5zKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soKFZhbHVlVHlwZSl2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBDMlN1cHBvcnRlZEZsYWdzPFQ+OjptaW4oKSBjb25zdCB7CisgICAgaWYgKCFfbVZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5mcm9udCgpLnRlbXBsYXRlIHJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFQoMCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFZhbHVlU2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Y29udGFpbnMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwKKyAgICAgICAgICAgIFt2YWx1ZV0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gcC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICAgICAgfSkgIT0gX21WYWx1ZXMuY2VuZCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlcyA9IF9tVmFsdWVzOyAvLyBtYWtlIGEgY29weQorICAgIHN0ZDo6cmVtb3ZlX2lmKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIFsmbGltaXRdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiAhbGltaXQuY29udGFpbnModi5yZWY8VmFsdWVUeXBlPigpKTsgfSk7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6dmFsdWVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHMoX21WYWx1ZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSwgX21WYWx1ZXMuY2VuZCgpLCB2YWxzLmJlZ2luKCksIFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gVCB7CisgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSk7CisgICAgcmV0dXJuIHZhbHM7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykKKyAgICAgICAgOiBfbVR5cGUodmFsdWVzLnR5cGUpLAorICAgICAgICAgIF9tUmFuZ2UodmFsdWVzKSwKKyAgICAgICAgICBfbVZhbHVlcyh2YWx1ZXMpLAorICAgICAgICAgIF9tRmxhZ3ModmFsdWVzKSB7IH0KKworICAgIGJvb2wgc3VwcG9ydHMoVCB2YWx1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCBfbVR5cGU7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxWYWx1ZVR5cGU+IF9tUmFuZ2U7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxWYWx1ZVR5cGU+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbUZsYWdzOworCisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsICZpKTsKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSW1wbCAmaSk7CisgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW1PdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsOjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRTogcmV0dXJuIF9tUmFuZ2UuY29udGFpbnModmFsdWUpOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzogcmV0dXJuIF9tVmFsdWVzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzogcmV0dXJuIF9tRmxhZ3MuY29udGFpbnModmFsdWUpOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsPih2YWx1ZXMpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46On5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpzdXBwb3J0cyhUIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+c3VwcG9ydHModmFsdWUpOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgICAgIDogX21QYXJhbUZpZWxkKGZpZWxkKSwKKyAgICAgICAgICBfbVR5cGUodHlwZV90OjpSQU5HRSksCisgICAgICAgICAgX21EZWZpbmVkKGZhbHNlKSwKKyAgICAgICAgICBfbVJhbmdlKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkFueSgpKSwKKyAgICAgICAgICBfbVZhbHVlcyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpOb25lKCkpLAorICAgICAgICAgIF9tRmxhZ3MoQzJTdXBwb3J0ZWRGbGFnczxUPjo6Tm9uZSgpKSB7IH0KKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVZhbHVlcyk7CisgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbVJhbmdlKTsKKyAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQsIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKV9tRmxhZ3MpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVFJFU1BBU1MKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIERlZmluZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcyB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgb2YgdGhpcyBidWlsZGVyLiAqLworICAgIHZvaWQgYW55KCkgeworICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLiAqLworICAgIHZvaWQgbm9uZSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgX21UeXBlID0gdHlwZV90OjpWQUxVRVM7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuICovCisgICAgdm9pZCBlcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHt2YWx1ZX0pKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuICovCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IF9tVmFsdWVzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQubGltaXRlZFRvKF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmbGFncworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIGZsYWcgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tRmxhZ3MgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbUZsYWdzID0gX21GbGFncy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tRmxhZ3MuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6RkxBR1M7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbUZsYWdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyByYW5nZXMgdG8gZmxhZ3MgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKTsgLy8gc2hvdWxkIG5vdCBiZSBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbVJhbmdlID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJsaW1pdGluZyBmbGFncyB0byByYW5nZXMgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgICAgICAgICAgX21UeXBlID0gdHlwZV90OjpFTVBUWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisgICAgICAgICAgICAgICAgX21SYW5nZSA9IF9tUmFuZ2UubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBDMl9EQ0hFQ0soX21WYWx1ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVJhbmdlLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlJBTkdFOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgaW5zdGFudGlhdGUoKSBfX3VudXNlZCB7CisgICAgICAgICh2b2lkKV9tVmFsdWVzLnZhbHVlcygpOyAvLyBpbnN0YW50aWF0ZSBub24tY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgY29uc3QgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgY29uc3QgdmFsdWVzKCkKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCB0eXBlX3Q7CisKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIHR5cGVfdCBfbVR5cGU7CisgICAgYm9vbCBfbURlZmluZWQ7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBfbUZsYWdzOworCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6b3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiAoQzJQYXJhbUZpZWxkVmFsdWVzKSgqX21JbXBsLmdldCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCkKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KGZpZWxkKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjphbnkoKSB7CisgICAgX21JbXBsLT5hbnkoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojpub25lKCkgeworICAgIF9tSW1wbC0+bm9uZSgpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmVxdWFsVG8oVCB2YWx1ZSkgeworICAgIF9tSW1wbC0+ZXF1YWxUbyh2YWx1ZSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgeworICAgIF9tSW1wbC0+bGltaXRUbyhsaW1pdCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvdGhlcikKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yPSgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpIHsKKyAgICBfbUltcGwgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGw+KCpvdGhlci5fbUltcGwuZ2V0KCkpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46On5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoKSA6IF9tQ29uZmxpY3RzKCkgeyB9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OkMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7Cit9CisKK0MyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OndpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpIHsKKyAgICBfbUNvbmZsaWN0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGNvbmZsaWN0KSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXI6OnJldHJpZXZlQ29uZmxpY3RzKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoX21Db25mbGljdHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdC9zQnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKSB7CisgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7IEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCB7IHBhcmFtIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbUZpZWxkLCBib29sIGlzSW5mbykgeworICAgIHJldHVybiB7IGlzSW5mbyA/IEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19CQURfVkFMVUUgOiBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwKKyAgICAgICAgICAgICB7IHBhcmFtRmllbGQgfSwgeyB9IH07Cit9CisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpDb25mbGljdCgKKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLCBib29sIGlzSW5mbykgeworICAgIEMyX0NIRUNLKCFjb25mbGljdHMuZW1wdHkoKSk7CisgICAgaWYgKGlzSW5mbykgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19DT05GTElDVCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShwYXJhbUZpZWxkVmFsdWVzKSwgY29uZmxpY3RzLnJldHJpZXZlQ29uZmxpY3RzKCkKKyAgICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfQorfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJTZXR0aW5nUmVzdWx0ICYmcmVzdWx0KQorICAgICAgICA6IF9tU3RhdHVzKEMyX0JBRF9WQUxVRSkgeworICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2sobmV3IEMyU2V0dGluZ1Jlc3VsdChzdGQ6Om1vdmUocmVzdWx0KSkpOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6cGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogcmVzdWx0cy5fbVJlc3VsdHMpIHsKKyAgICAgICAgX21SZXN1bHRzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocikpOworICAgIH0KKyAgICByZXN1bHRzLl9tUmVzdWx0cy5jbGVhcigpOworICAgIC8vIFRPRE86IG1TdGF0dXMKKyAgICByZXR1cm4gc3RkOjptb3ZlKCp0aGlzKTsKK30KKworYzJfc3RhdHVzX3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnJldHJpZXZlRmFpbHVyZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZyIDogX21SZXN1bHRzKSB7CisgICAgICAgIGZhaWx1cmVzLT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgX21SZXN1bHRzLmNsZWFyKCk7CisgICAgcmV0dXJuIF9tU3RhdHVzOworfQorCitDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6QzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IF9tU3RhdHVzKHN0YXR1cykgeworICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQgb3IgQ09SUlVQVEVECisgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdAorfQorCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yIHsKKyAgICAvLy8gcmV0dXJucyB0aGUgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW5mbzo6SW1wbD4gR2V0SW1wbChjb25zdCBJbmZvICZpbmZvKSB7CisgICAgICAgIHJldHVybiBpbmZvLl9tSW1wbDsKKyAgICB9Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCB7CisgICAgQzJGaWVsZERlc2NyaXB0b3IgZmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudDsKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICB1aW50MzJfdCBkZXB0aDsKKyAgICB1aW50MzJfdCBiYXNlRmllbGRPZmZzZXQ7CisgICAgdWludDMyX3QgYXJyYXlPZmZzZXQ7CisgICAgdWludDMyX3QgdXNlZEV4dGVudDsKKworICAgIC8vLyBjcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdCBpbmNsdWRpbmcgY29waWVzIG9mIGl0cyBwYXJlbnQgY2hhaW4KKyAgICBJbXBsIGNsb25lKCkgY29uc3Q7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgYSBzaGFyZWQgcG9pbnRlciB0byBhbiBvYmplY3QKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEltcGw+IENsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmKTsKKworICAgIEltcGwoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkXywgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBhcmVudF8sCisgICAgICAgICAgICB1aW50MzJfdCBpbmRleF8sIHVpbnQzMl90IGRlcHRoXywgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0XywKKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0XywgdWludDMyX3QgdXNlZEV4dGVudF8pCisgICAgICAgIDogZmllbGQoZmllbGRfKSwgcGFyZW50KHBhcmVudF8pLCBpbmRleChpbmRleF8pLCBkZXB0aChkZXB0aF8pLAorICAgICAgICAgIGJhc2VGaWVsZE9mZnNldChiYXNlRmllbGRPZmZzZXRfKSwgYXJyYXlPZmZzZXQoYXJyYXlPZmZzZXRfKSwgdXNlZEV4dGVudCh1c2VkRXh0ZW50XykgeyB9Cit9OworCitzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OkNsb25lKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmaW5mbykgeworICAgIGlmIChpbmZvKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGluZm8tPmNsb25lKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Y2xvbmUoKSBjb25zdCB7CisgICAgSW1wbCByZXMgPSBJbXBsKCp0aGlzKTsKKyAgICByZXMucGFyZW50ID0gQ2xvbmUocmVzLnBhcmVudCk7CisgICAgcmV0dXJuIHJlczsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjpJbmZvKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogX21JbXBsKGltcGwpIHsgfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjphcnJheU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5hcnJheU9mZnNldDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBleHRlbnQoKSAqIHNpemUoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YmFzZUZpZWxkT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmJhc2VGaWVsZE9mZnNldDsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmRlcHRoKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmRlcHRoOworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpleHRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+dXNlZEV4dGVudDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+aW5kZXg7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0FyaXRobWV0aWMoKSBjb25zdCB7CisgICAgc3dpdGNoIChfbUltcGwtPmZpZWxkLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDMkZpZWxkVXRpbHM6OkluZm86OmlzRmxleGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQuZXh0ZW50KCkgPT0gMDsKK30KKworQzJTdHJpbmcgQzJGaWVsZFV0aWxzOjpJbmZvOjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWUoKTsKK30KKworY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpOYW1lZFZhbHVlc1R5cGUgJkMyRmllbGRVdGlsczo6SW5mbzo6bmFtZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQubmFtZWRWYWx1ZXMoKTsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6b2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm8gQzJGaWVsZFV0aWxzOjpJbmZvOjpwYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8oX21JbXBsLT5wYXJlbnQpOworfTsKKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoX21JbXBsLT5maWVsZCk7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6dHlwZV90IEMyRmllbGRVdGlsczo6SW5mbzo6dHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC50eXBlKCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpJdGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgOiBwdWJsaWMgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgLy8vIGltcGxlbWVudHMgb2JqZWN0IGVxdWFsaXR5CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmIG1IZWFkID09IG90aGVyLT5tSGVhZDsKKyAgICB9OworCisgICAgLy8vIHJldHVybnMgdGhlIGluZm8gcG9pbnRlZCB0byBieSB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2YWx1ZV90eXBlIGdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEluZm8obUhlYWQpOworICAgIH0KKworICAgIC8vLyBpbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IKKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgeworICAgICAgICAvLyBub3RlOiB0aGlzIGNhbm5vdCBiZSBhYnN0cmFjdCBhcyB3ZSBpbnN0YW50aWF0ZSB0aGlzIGZvciBMaXN0OjplbmQoKS4gaW5jcmVtZW50IHRvIGVuZCgpCisgICAgICAgIC8vIGluc3RlYWQuCisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgSW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBoZWFkKQorICAgICAgICA6IG1IZWFkKGhlYWQpIHsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IG1IZWFkOyAvLy88IGN1cnJlbnQgZmllbGQKK307CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6Okl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3I6OnZhbHVlX3R5cGUgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0KCk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3ImIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgbUltcGwtPmluY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXF1YWxzKG90aGVyLm1JbXBsKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6Okxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJdGVyYXRvcjo6SW1wbD4oKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworfTsKKworQzJGaWVsZFV0aWxzOjpMaXN0OjpMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKQorICAgIDogbUltcGwoaW1wbCkgeyB9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjpiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpJdGVyYXRvcihtSW1wbC0+YmVnaW4oKSk7Cit9CisKK0MyRmllbGRVdGlsczo6SXRlcmF0b3IgQzJGaWVsZFV0aWxzOjpMaXN0OjplbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmVuZCgpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgYmFzZSBjbGFzcyBoZWxwZXIgdGhhdCBhbGxvd3MgZGVzY2VuZGluZyBpbnRvIHRoZSBmaWVsZCBoaWVyYXJjaHkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICB2aXJ0dWFsIH5DMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyByZXR1cm5zIHRoZSBiYXNlLWZpZWxkJ3Mgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSBvZmZzZXQgaWYgbm8gcGFyZW50KQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gcGFyZW50KSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbHB0ciA/IHNpemVvZihDMlBhcmFtKSA6IHBhcmVudC0+YmFzZUZpZWxkT2Zmc2V0OworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCBmaWVsZCAob3IgdGhlIHBhcmFtKQorICAgIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgR2V0UGFyZW50T2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBHZXRPZmZzZXQocGFyZW50LT5maWVsZCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yLAorICAgICAgICAgICAgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCA9IG51bGxwdHIpCisgICAgICAgIDogQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbChoZWFkKSwKKyAgICAgICAgICBtUGFyYW1TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgLy8vIHJldHVybnMgYSBsZWFmIGluZm8gb2JqZWN0IGF0IGEgc3BlY2lmaWMgaW5kZXggZm9yIGEgY2hpbGQgZmllbGQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBtYWtlTGVhZigKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCwgdWludDMyX3QgaW5kZXgpIHsKKyAgICAgICAgdWludDMyX3QgcGFyZW50T2Zmc2V0ID0gR2V0UGFyZW50T2Zmc2V0KG1IZWFkKTsKKyAgICAgICAgdWludDMyX3QgYXJyYXlPZmZzZXQgPSBwYXJlbnRPZmZzZXQgKyBHZXRPZmZzZXQoZmllbGQpOworICAgICAgICB1aW50MzJfdCB1c2VkRXh0ZW50ID0gZmllbGQuZXh0ZW50KCkgPyA6CisgICAgICAgICAgICAgICAgKHN0ZDo6bWF4KGFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIGFycmF5T2Zmc2V0KSAvIEdldFNpemUoZmllbGQpOworCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4oCisgICAgICAgICAgICAgICAgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGZpZWxkLCBwYXJlbnRPZmZzZXQgKyBpbmRleCAqIEdldFNpemUoZmllbGQpKSwKKyAgICAgICAgICAgICAgICBtSGVhZCAvKiBwYXJlbnQgKi8sIGluZGV4LCBtSGVhZCA9PSBudWxscHRyID8gMCA6IG1IZWFkLT5kZXB0aCArIDEsCisgICAgICAgICAgICAgICAgR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkKSArIEdldE9mZnNldChmaWVsZCksCisgICAgICAgICAgICAgICAgYXJyYXlPZmZzZXQsIHVzZWRFeHRlbnQpOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBzdHJ1Y3QgaW5kZXggaGF2ZSBiZWVuIHRyYXZlcnNlZCB0byBnZXQgdG8gdGhpcyBmaWVsZAorICAgIGJvb2wgdmlzaXRlZChDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc2QgOiBtSGlzdG9yeSkgeworICAgICAgICAgICAgaWYgKHNkLT5jb3JlSW5kZXgoKSA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtUGFyYW1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+PiBtSGlzdG9yeTsgLy8gc3RydWN0dXJlIHR5cGVzIHZpc2l0ZWQKK307CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpIHRoYXQgdmlzaXRzIGVhY2ggYmFzZSBmaWVsZC4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgcGFyYW1ldGVyCisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbS5zaXplKCkpIHsKKyAgICAgICAgZGVzY2VuZEludG8ocGFyYW0uY29yZUluZGV4KCkpOworICAgIH0KKworICAgIC8vLyBlbnVtZXJhdGUgYmFzZSBmaWVsZHMgb2YgYSBmaWVsZAorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcj4gaW1wbCkKKyAgICAgICAgOiBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcihpbXBsLT5tUmVmbGVjdG9yLCBpbXBsLT5tUGFyYW1TaXplLCBpbXBsLT5tSGVhZCkgeworICAgICAgICBtSGlzdG9yeSA9IGltcGwtPm1IaXN0b3J5OworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgZGVzY2VuZEludG8oaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gSW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yIGJ5IHZpc2l0aW5nIGVhY2ggYmFzZSBmaWVsZC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBkb24ndCBnbyBwYXN0IGVuZAorICAgICAgICBpZiAobUhlYWQgPT0gbnVsbHB0ciB8fCBfbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXNjZW5kIGludG8gc3RydWN0dXJlcworICAgICAgICBpZiAobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0geyBtSGVhZC0+ZmllbGQudHlwZSgpICZ+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHIH07CisgICAgICAgICAgICAvLyBkbyBub3QgcmVjdXJzZSBpbnRvIHRoZSBzYW1lIHN0cnVjdHMKKyAgICAgICAgICAgIGlmICghdmlzaXRlZChpbmRleCkgJiYgZGVzY2VuZEludG8oaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXNjZW5kIGFmdGVyIHRoZSBsYXN0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICB3aGlsZSAoIW1IaXN0b3J5LmVtcHR5KCkgJiYgX21GaWVsZHMuYmFjaygpID09IG1IaXN0b3J5LmJhY2soKS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIG1IZWFkID0gbUhlYWQtPnBhcmVudDsKKyAgICAgICAgICAgIG1IaXN0b3J5LnBvcF9iYWNrKCk7CisgICAgICAgICAgICBfbUZpZWxkcy5wb3BfYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG9uZSBpZiBoaXN0b3J5IGlzIG5vdyBlbXB0eQorICAgICAgICBpZiAoX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gd2UgY291bGQgYmUgdHJhdmVyc2luZyBhIHN1Yi10cmVlIHNvIGNsZWFyIGhlYWQKKyAgICAgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtb3ZlIHRvIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBjdXJyZW50IHN0cnVjdAorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIG5leHQgPSBfbUZpZWxkcy5iYWNrKCk7CisgICAgICAgIG1IZWFkLT5maWVsZCA9IE9mZnNldEZpZWxkRGVzY3JpcHRvcigqbmV4dCwgR2V0UGFyZW50T2Zmc2V0KG1IZWFkLT5wYXJlbnQpKTsKKyAgICAgICAgbUhlYWQtPmluZGV4ID0gMDsgLy8gcmVzZXQgaW5kZXgganVzdCBpbiBjYXNlIGZvciBjb3JyZWN0bmVzcworICAgICAgICBtSGVhZC0+YmFzZUZpZWxkT2Zmc2V0ID0gR2V0UGFyZW50QmFzZUZpZWxkT2Zmc2V0KG1IZWFkLT5wYXJlbnQpICsgR2V0T2Zmc2V0KCpuZXh0KTsKKyAgICAgICAgbUhlYWQtPmFycmF5T2Zmc2V0ID0gR2V0T2Zmc2V0KG1IZWFkLT5maWVsZCk7CisgICAgICAgIG1IZWFkLT51c2VkRXh0ZW50ID0gbUhlYWQtPmZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChtSGVhZC0+YXJyYXlPZmZzZXQsIG1QYXJhbVNpemUpIC0gbUhlYWQtPmFycmF5T2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyBHZXRTaXplKG1IZWFkLT5maWVsZCk7CisgICAgICAgICsrX21GaWVsZHMuYmFjaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlLCBpdCBkb2VzIG5vdAorICAgIC8vLyBtb2RpZnkgdGhpcyBpdGVyYXRvciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGRlc2NlbmRJbnRvKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisgICAgICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yIGZpcnN0ID0gZGVzYy0+YmVnaW4oKTsKKyAgICAgICAgICAgIG1IZWFkID0gbWFrZUxlYWYoKmZpcnN0LCAwIC8qIGluZGV4ICovKTsKKyAgICAgICAgICAgIF9tRmllbGRzLmVtcGxhY2VfYmFjaygrK2ZpcnN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLy8gbmV4dCBmaWVsZCBwb2ludGVycyBmb3IgZWFjaCBkZXB0aC4KKyAgICAvLy8gbm90ZTogX21GaWVsZHMgbWF5IGJlIHNob3J0ZWQgdGhhbiBtSGlzdG9yeSwgaWYgaXRlcmF0aW5nIGF0IGEgZGVwdGgKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I6OmZpZWxkX2l0ZXJhdG9yPiBfbUZpZWxkczsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZSA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+KCpfbVBhcmFtLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUoY29uc3QgQzJQYXJhbSAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21QYXJhbSgmcGFyYW0pLCBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IEMyUGFyYW0gKl9tUGFyYW07CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlPihwYXJhbSwgcmVmbGVjdG9yKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGUgc2libGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yIDogcHVibGljIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgeworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiAmaW5mbywgc2l6ZV90IGxldmVsKQorICAgICAgICAgIC8vIGNsb25lIGluZm8gY2hhaW4gYXMgdGhpcyBpdGVyYXRvciB3aWxsIGNoYW5nZSBpdAorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShpbmZvKSkgeworICAgICAgICBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgcGFyZW50IGNoYWluICh1cCB0byBsZXZlbCkgZm9yIHF1aWNrIGFjY2VzcworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBub2RlID0gbUhlYWQ7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoOyBpeCA8IGxldmVsICYmIG5vZGU7ICsraXgpIHsKKyAgICAgICAgICAgIG5vZGUtPmluZGV4ID0gMDsKKyAgICAgICAgICAgIF9tUGF0aC5lbXBsYWNlX2JhY2sobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgICAgICB9CisgICAgICAgIHNldHVwUGF0aChpeCk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGluZGV4LgorICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIHdoaWxlIChpeCA8IF9tUGF0aC5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmICgrK19tUGF0aFtpeF0tPmluZGV4IDwgX21QYXRoW2l4XS0+dXNlZEV4dGVudCkgeworICAgICAgICAgICAgICAgIHNldHVwUGF0aChpeCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9tUGF0aFtpeCsrXS0+aW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBhZGp1c3RzIGZpZWxkIG9mZnNldHMgYWxvbmcgdGhlIHBhdGggdXAgdG8gdGhlIHNwZWNpZmljIGxldmVsIC0gMS4KKyAgICAvLy8gVGhpcyBpbi1mYWN0IGhhcyB0byBiZSBkb25lIGRvd24gdGhlIHBhdGggZnJvbSBwYXJlbnQgdG8gY2hpbGQgYXMgY2hpbGQgZmllbGRzIG11c3QKKyAgICAvLy8gZmFsbCB3aXRoaW4gcGFyZW50IGZpZWxkcy4KKyAgICB2b2lkIHNldHVwUGF0aChzaXplX3QgbGV2ZWwpIHsKKyAgICAgICAgQzJfQ0hFQ0tfTEUobGV2ZWwsIF9tUGF0aC5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBvbGRBcnJheU9mZnNldCA9IGxldmVsID8gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IDogMCAvKiB1bnVzZWQgKi87CisgICAgICAgIHdoaWxlIChsZXZlbCkgeworICAgICAgICAgICAgLS1sZXZlbDsKKyAgICAgICAgICAgIEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbCAmcGF0aCA9ICpfbVBhdGhbbGV2ZWxdOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IEdldFNpemUocGF0aC5maWVsZCk7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBwYXRoLmFycmF5T2Zmc2V0ICsgc2l6ZSAqIHBhdGguaW5kZXg7CisgICAgICAgICAgICBTZXRPZmZzZXQocGF0aC5maWVsZCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNoaWxkJ3MgYXJyYXkgb2Zmc2V0IHRvIGZhbGwgd2l0aGluIGN1cnJlbnQgaW5kZXgsIGJ1dCBob2xkIG9udG8gdGhlCisgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGFycmF5T2Zmc2V0IHNvIHRoYXQgd2UgY2FuIGFkanVzdCBzdWJzZXF1ZW50IGNoaWxkcmVuLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgbW9kdWxvIGlzIG9ubHkgZGVmaW5lZCB3aXRoaW4gdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hpbGRBcnJheU9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIChfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgLSBvbGRBcnJheU9mZnNldCkgJSBzaXplOworICAgICAgICAgICAgICAgIG9sZEFycmF5T2Zmc2V0ID0gX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0OworICAgICAgICAgICAgICAgIF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA9IGNoaWxkQXJyYXlPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPj4gX21QYXRoOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgZW51bWVyYXRlRmllbGRzKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcj4oX21IZWFkLCBfbUxldmVsKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKQorICAgICAgICA6IF9tSGVhZChDMkZpZWxkVXRpbHM6Ol9JbnNwZWN0b3I6OkdldEltcGwoZmllbGQpKSwgX21MZXZlbChsZXZlbCkgeyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21IZWFkOworICAgIHNpemVfdCBfbUxldmVsOworfTsKKworfQorCitDMkZpZWxkVXRpbHM6Okxpc3QgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVDb3VzaW5zKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZmllbGQsIHVpbnQzMl90IGxldmVsKSB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6TGlzdChzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZT4oZmllbGQsIGxldmVsKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKKy8qKgorICogSXRlcmF0b3IgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IgOiBwdWJsaWMgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgeworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIocmVmbGVjdG9yLCBwYXJhbVNpemUpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpIHsKKyAgICAgICAgd2hpbGUgKGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgaWYgKChtSGVhZC0+ZmllbGQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChtSGVhZC0+ZmllbGQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgbUhlYWQgPSBfbVRhaWw7CisgICAgICAgIF9tVGFpbCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBJZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhIGtub3duLCB2YWxpZCAodW50cmF2ZXJzZWQpIHN0cnVjdHVyZSwgaXQgbW9kaWZpZXMgdGhpcyBpdGVyYXRvcgorICAgIC8vLyB0byBwb2ludCB0byB0aGUgZmllbGQgYXQgdGhlIGJlZ2lubmluZy9lbmQgb2YgdGhlIGdpdmVuIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMKKyAgICAvLy8gdHJ1ZS4gT3RoZXJ3aXNlLCBpbmNsdWRpbmcgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMgaW4gdGhlIHN0cnVjdHVyZSwgaXQgZG9lcyBub3QgbW9kaWZ5IHRoaXMKKyAgICAvLy8gaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgYm91bmRhcmllcyBvZiB0aGUgZmllbGQgdG8gYmUgbG9jYXRlZCBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudAorICAgICAgICAvLyBmaWVsZAorICAgICAgICBpZiAobUhlYWQgIT0gX21UYWlsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjVW5pcXVlID0gbVJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgICAgICAvLyBkZXNjZW5kIGludG8ga25vd24gc3RydWN0cyAoYXMgbG9uZyBhcyB0aGV5IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkKQorICAgICAgICBpZiAoZGVzY1VuaXF1ZSAmJiBkZXNjVW5pcXVlLT5iZWdpbigpICE9IGRlc2NVbmlxdWUtPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjKHN0ZDo6bW92ZShkZXNjVW5pcXVlKSk7CisgICAgICAgICAgICBtSGlzdG9yeS5lbXBsYWNlX2JhY2soZGVzYyk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaWVsZCB1c2luZyBhIGR1bW15IGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yIGR1bW15ID0geworICAgICAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpCTE9CLCAxIC8qIGV4dGVudCAqLywgIm5hbWUiLAorICAgICAgICAgICAgICAgIEdldE9mZnNldChfbUZpZWxkKSAtIHBhcmVudE9mZnNldCwgR2V0U2l6ZShfbUZpZWxkKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gbG9jYXRlIGZpcnN0IGZpZWxkIHdoZXJlIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gZHVtbXkgb2Zmc2V0ICh3aGljaCBpcyBvbmUgcGFzdCkKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OnVwcGVyX2JvdW5kKAorICAgICAgICAgICAgICAgICAgICBkZXNjLT5jYmVnaW4oKSwgZGVzYy0+Y2VuZCgpLCBkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmEsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZiKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChhKSA8IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBkZXNjLT5iZWdpbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZmllbGQgaXMgcHJpb3IgdG8gZmlyc3QgZmllbGQKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLWl0OworICAgICAgICAgICAgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkID0gKml0OworCisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGR1bW15IGVuZC1vZmZzZXQgaXMgd2l0aGluIHRoaXMgZmllbGQKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cnVjdFNpemUgPSBzdGQ6Om1heChtUGFyYW1TaXplLCBwYXJlbnRPZmZzZXQpIC0gcGFyZW50T2Zmc2V0OworICAgICAgICAgICAgaWYgKEdldEVuZE9mZnNldChkdW1teSkgPiBHZXRFbmRPZmZzZXQoZmllbGQsIHN0cnVjdFNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4ID0gKEdldE9mZnNldChkdW1teSkgLSBHZXRPZmZzZXQoZmllbGQpKSAvIEdldFNpemUoZmllbGQpOworICAgICAgICAgICAgdWludDMyX3QgZW5kSW5kZXggPQorICAgICAgICAgICAgICAgIChHZXRFbmRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSArIEdldFNpemUoZmllbGQpIC0gMSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChlbmRJbmRleCA+IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBGaWVsZCBzaXplIGNvdWxkIGJlIHplcm8sIGluIHdoaWNoIGNhc2UgZW5kIGluZGV4IGlzIHN0aWxsIG9uIHN0YXJ0IGluZGV4LgorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBhbGwgb3RoZXIgY2FzZXMsIGVuZEluZGV4IHdhcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGluZGV4LCBzbworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBpdC4KKyAgICAgICAgICAgICAgICAtLWVuZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gc3RhcnRMZWFmID0KKyAgICAgICAgICAgICAgICBtYWtlTGVhZihmaWVsZCwgc3RhcnRJbmRleCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPT0gc3RhcnRJbmRleCkgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX21UYWlsID0gbWFrZUxlYWYoZmllbGQsIGVuZEluZGV4KTsKKyAgICAgICAgICAgICAgICBtSGVhZCA9IHN0YXJ0TGVhZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gX21UYWlsOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgbG9jYXRlRmllbGQoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24gOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvcj4oCisgICAgICAgICAgICAgICAgX21JbmRleCwgX21GaWVsZCwgX21QYXJhbVNpemUsIF9tUmVmbGVjdG9yKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChDMlBhcmFtOjpDb3JlSW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KHBmKSkpLAorICAgICAgICAgIF9tRmllbGQoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmKSksCisgICAgICAgICAgX21QYXJhbVNpemUoMCksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworCisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21JbmRleChwYXJhbS5jb3JlSW5kZXgoKSksCisgICAgICAgICAgX21GaWVsZChmaWVsZCksCisgICAgICAgICAgX21QYXJhbVNpemUocGFyYW0uc2l6ZSgpKSwKKyAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCitwcml2YXRlOgorICAgIEMyUGFyYW06OkNvcmVJbmRleCBfbUluZGV4OworICAgIF9DMkZpZWxkSWQgX21GaWVsZDsKKyAgICB1aW50MzJfdCBfbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7Cit9OworCit9CisKK3N0ZDo6dmVjdG9yPEMyRmllbGRVdGlsczo6SW5mbz4gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7IHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGYsIHJlZmxlY3RvcikgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBDMkZpZWxkVXRpbHM6Okxpc3QgbG9jYXRpb24gPSB7CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbj4ocGFyYW0sIGZpZWxkLCByZWZsZWN0b3IpCisgICAgfTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SW5mbz4obG9jYXRpb24uYmVnaW4oKSwgbG9jYXRpb24uZW5kKCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1NzNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJQYXJhbVV0aWxzLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fIC8vIHRvIGJlIGFibGUgdG8gaW1wbGVtZW50IHRoZSBtZXRob2RzIGRlZmluZWQKKyNpbmNsdWRlIDxDMkVudW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctbG9nLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc2l6ZV90IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKEMyU3RyaW5nTGl0ZXJhbCBhKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChhW2ldID09ICdfJykgeworICAgICAgICArK2k7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitzdGF0aWMgc2l6ZV90IGNvdW50TWF0Y2hpbmcoQzJTdHJpbmdMaXRlcmFsIGEsIGNvbnN0IEMyU3RyaW5nICZiKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghYVtpXSB8fCBhW2ldICE9IGJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiLnNpemUoKTsKK30KKworLy8gQUJDRGVmID0+IGFiYy1kZWYKKy8vIEFCQ0QyZWYgPT4gYWJjZDItZWYgLy8gMAorLy8gQUJDRDJFZiA9PiBhbmNkMi1lZiAvLyAtMQorLy8gQWJjRGVmID0+IGFiYy1kZWYgLy8gLTEKKy8vIEFiYzJEZWYgPT4gYWJjLTJkZWYKKy8vIEFiYzJkZWYgPT4gYWJjLTItZGVmCisvLyBfWW8gPT4gX3lvCisvLyBfeW8gPT4gX3lvCisvLyBDMl95byA9PiBjMi15bworLy8gQzJfX3lvID0+IGMyLXlvCisKKy8vc3RhdGljCitDMlN0cmluZyBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKEMyU3RyaW5nIG5hbWUpIHsKKyAgICBlbnVtIHsKKyAgICAgICAga05vbmUgPSAnLicsCisgICAgICAgIGtMb3dlciA9ICdhJywKKyAgICAgICAga1VwcGVyID0gJ0EnLAorICAgICAgICBrRGlnaXQgPSAnMScsCisgICAgICAgIGtEYXNoID0gJy0nLAorICAgICAgICBrVW5kZXJzY29yZSA9ICdfJywKKyAgICB9IHR5cGUgPSBrTm9uZTsKKyAgICBzaXplX3Qgd29yZF9zdGFydCA9IDA7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG5hbWUuc2l6ZSgpOyArK2l4KSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBuYW1lLnN1YnN0cigwLCB3b3JkX3N0YXJ0KSA8PCAifCIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cih3b3JkX3N0YXJ0LCBpeCAtIHdvcmRfc3RhcnQpIDw8ICJbIgorICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKGl4LCAxKSA8PCAiXSIgPDwgbmFtZS5zdWJzdHIoaXggKyAxKQorICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGNoYXIpdHlwZTsKKyAgICAgICAgaWYgKGlzdXBwZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrTG93ZXIpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVbaXhdID0gdG9sb3dlcihuYW1lW2l4XSk7CisgICAgICAgICAgICB0eXBlID0ga1VwcGVyOworICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGlnaXQgJiYgaXggPiAwKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1VwcGVyICYmIGl4ID4gd29yZF9zdGFydCArIDEpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrIC0gMSwgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtMb3dlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0ga0RpZ2l0OworICAgICAgICB9IGVsc2UgaWYgKG5hbWVbaXhdID09ICdfJykgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0Rhc2gpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmVyYXNlKGl4LS0sIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IGtOb25lICYmIHR5cGUgIT0ga1VuZGVyc2NvcmUpIHsKKyAgICAgICAgICAgICAgICBuYW1lW2l4XSA9ICctJzsKKyAgICAgICAgICAgICAgICB0eXBlID0ga0Rhc2g7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4ICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtVbmRlcnNjb3JlOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYW1lLnJlc2l6ZShpeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICI9PiAiIDw8IG5hbWU7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vc3RhdGljCitzdGQ6OnZlY3RvcjxDMlN0cmluZz4gX0MyRW51bVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAorICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCkgeworICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZWROYW1lczsKKyAgICBDMlN0cmluZyBwcmVmaXg7CisgICAgc2l6ZV90IGV4dHJhVW5kZXJzY29yZXMgPSAwOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGlmIChfcHJlZml4KSB7CisgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhfcHJlZml4KTsKKyAgICAgICAgcHJlZml4ID0gX3ByZWZpeCArIGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgcHJlZml4IGFuZCBtaW5pbXVtIGxlYWRpbmcgdW5kZXJzY29yZXMKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIHByZWZpeCA9IHMgKyB1bmRlcnNjb3JlczsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgbWF0Y2hpbmcgPSBjb3VudE1hdGNoaW5nKAorICAgICAgICAgICAgICAgIHMgKyB1bmRlcnNjb3JlcywKKyAgICAgICAgICAgICAgICBwcmVmaXgpOworICAgICAgICAgICAgcHJlZml4LnJlc2l6ZShtYXRjaGluZyk7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gc3RkOjptaW4odW5kZXJzY29yZXMsIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICB9CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicHJlZml4OiIgPDwgcHJlZml4IDw8ICIsIHVuZGVyc2NvcmVzOiIgPDwgZXh0cmFVbmRlcnNjb3JlczsKKyAgICAgICAgaWYgKHByZWZpeC5zaXplKCkgPT0gMCAmJiBleHRyYVVuZGVyc2NvcmVzID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2Ugc3dhbGxvdyB0aGUgZmlyc3QgdW5kZXJzY29yZSBhZnRlciB1cHBlciBjYXNlIHByZWZpeGVzCisgICAgYm9vbCB1cHBlckNhc2VQcmVmaXggPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJlZml4LnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpc2xvd2VyKHByZWZpeFtpXSkpIHsKKyAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKEMyU3RyaW5nTGl0ZXJhbCBzIDogbmFtZXMpIHsKKyAgICAgICAgc2l6ZV90IHVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMocyk7CisgICAgICAgIEMyU3RyaW5nIHNhbml0aXplZCA9IEMyU3RyaW5nKHMsIHVuZGVyc2NvcmVzIC0gZXh0cmFVbmRlcnNjb3Jlcyk7CisgICAgICAgIHNhbml0aXplZC5hcHBlbmQocyArIHByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3JlcyArCisgICAgICAgICAgICAgICAgICAgICh1cHBlckNhc2VQcmVmaXggJiYgc1twcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXNdID09ICdfJykpOworICAgICAgICBzYW5pdGl6ZWROYW1lcy5wdXNoX2JhY2soY2FtZWxDYXNlVG9EYXNoZWQoc2FuaXRpemVkKSk7CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZyBzIDogc2FuaXRpemVkTmFtZXMpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IHM7CisgICAgfQorCisgICAgcmV0dXJuIHNhbml0aXplZE5hbWVzOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6cGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gZm91bmROYW1lczsKKyAgICBzaXplX3QgcG9zID0gMCwgbGVuID0gc3RybGVuKHZhbHVlKTsKKyAgICBkbyB7CisgICAgICAgIHNpemVfdCBlbmRQb3MgPSBzdHJjc3BuKHZhbHVlICsgcG9zLCAiICw9IikgKyBwb3M7CisgICAgICAgIGlmIChlbmRQb3MgPiBwb3MpIHsKKyAgICAgICAgICAgIGZvdW5kTmFtZXMuZW1wbGFjZV9iYWNrKHZhbHVlICsgcG9zLCBlbmRQb3MgLSBwb3MpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZVtlbmRQb3NdICYmIHZhbHVlW2VuZFBvc10gIT0gJywnKSB7CisgICAgICAgICAgICBlbmRQb3MgKz0gc3RyY3Nwbih2YWx1ZSArIGVuZFBvcywgIiwiKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBzdHJzcG4odmFsdWUgKyBlbmRQb3MsICIgLCIpICsgZW5kUG9zOworICAgIH0gd2hpbGUgKHBvcyA8IGxlbik7CisgICAgcmV0dXJuIGZvdW5kTmFtZXM7Cit9CisKKy8vLyBzYWZlKHIpIHBhcnNpbmcgZnJvbSBwYXJhbWV0ZXIgYmxvYgorLy9zdGF0aWMKK0MyUGFyYW0gKkMyUGFyYW1VdGlsczo6UGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUsIGJ1dCByZWFsbHkgQzJQYXJhbSBtdXN0IGFsc28gdG8gYmUgYSB2YWxpZCBwYXJhbQorICAgIGlmIChzaXplIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKKyAgICBDMlBhcmFtICpwYXJhbSA9IChDMlBhcmFtKilibG9iOworICAgIGlmIChwYXJhbS0+c2l6ZSgpID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHBhcmFtOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA5ZmM1YTc2Li40ZTlhYzZlIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE5LDQ4ICsxOSw0NSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CiAgICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwpAQCAtOTIsNyArODksNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsNyArMTMwLDcgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKQEAgLTE1MSw2ICsxNDgsNyBAQAogICAgIH0KICAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEobU1ldGEsIHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKIAogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKQEAgLTE3NCwyOSArMTcyLDMwIEBACiAgICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCiAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwogICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjA0LDEzICsyMDMsMTIgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIxOSw4ICsyMTcsOCBAQAogY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CiAKIEFBQ1NvdXJjZTo6QUFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKQEAgLTIyOCw3ICsyMjYsNiBAQAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbU9mZnNldFZlY3RvcihvZmZzZXRfdmVjdG9yKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVfZHVyYXRpb25fdXMpIHsKIH0KQEAgLTIzOSw3ICsyMzYsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKQEAgLTI0OSwzMCArMjQ2LDI1IEBACiAgICAgfQogCiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI4Miw3ICsyNzQsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gbUZyYW1lRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBtRnJhbWVEdXJhdGlvblVzOwogCkBAIC0yOTIsMTMgKzI4NCwxMyBAQAogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgZnJhbWVTaXplV2l0aG91dEhlYWRlciwgaGVhZGVyU2l6ZTsKICAgICBpZiAoKGZyYW1lU2l6ZSA9IGdldEFkdHNGcmFtZUxlbmd0aChtRGF0YVNvdXJjZSwgbU9mZnNldCwgJmhlYWRlclNpemUpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CkBAIC0zMDcsMzcgKzI5OSwzOSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplV2l0aG91dEhlYWRlcik7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IG1GcmFtZUR1cmF0aW9uVXM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKnN0YXRpY19jYXN0PG9mZjY0X3QqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG9mZnNldCk7CisgICAgcmV0dXJuIHdyYXAobmV3IEFBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBvZmZzZXQpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGZvciAoOzspIHsKICAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCiAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTM2NCw3ICszNTgsNyBAQAogCiAgICAgdWludDhfdCBoZWFkZXJbMl07CiAKLSAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMzg3LDEzICszODEsMTMgQEAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjRmZDgwZWFlLTAzZDItNGQ3Mi05ZWI5LTQ4ZmE2YmI1NDYxMyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJBQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjIgPSBTbmlmZiB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAppbmRleCA5ZGFkYmVkLi42NDNkM2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMTgsOCArMTgsOSBAQAogCiAjZGVmaW5lIEFBQ19FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApAQCAtMjgsMjMgKzI5LDIzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBBQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOworICAgIEFBQ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBQUNFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKQEAgLTU1LDcgKzU2LDcgQEAKIH07CiAKIGJvb2wgU25pZmZBQUMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgb2ZmNjRfdCAqb2Zmc2V0KTsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCmluZGV4IDdjNTZjOTcuLmE1ODE2N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icApAQCAtOCw3ICs4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKaW5kZXggZjU2ZDVlZi4uMDBkMmE5MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCkBAIC0yMCw4ICsyMCw2IEBACiAKICNpbmNsdWRlICJBTVJFeHRyYWN0b3IuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMzEsMjkgKzI5LDI5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFNUlNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBib29sIGlzV2lkZSwKICAgICAgICAgICAgIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1SU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIGJvb2wgbUlzV2lkZTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKQEAgLTk4LDI3ICs5NiwyNyBAQAogICAgIHJldHVybiBmcmFtZVNpemU7CiB9CiAKLXN0YXRpYyBzdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIG1lZGlhX3N0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNXaWRlLCBzaXplX3QgKmZyYW1lU2l6ZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyOwogICAgIHNzaXplX3QgY291bnQgPSBzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZoZWFkZXIsIDEpOwogICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfSBlbHNlIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CiAKICAgICAqZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKGlzV2lkZSwgRlQpOwogICAgIGlmICgqZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0aWMgYm9vbCBTbmlmZkFNUigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCAqaXNXaWRlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGJvb2wgKmlzV2lkZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBjaGFyIGhlYWRlcls5XTsKIAogICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkgewpAQCAtMTQ0LDcgKzE0Miw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1BTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorQU1SRXh0cmFjdG9yOjpBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtT2Zmc2V0VGFibGVMZW5ndGgoMCkgewpAQCAtMTUzLDEyICsxNTEsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1NZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICBrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAxKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUlzV2lkZSA/IDE2MDAwIDogODAwMCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIDEpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUlzV2lkZSA/IDE2MDAwIDogODAwMCk7CiAKICAgICBvZmY2NF90IG9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBvZmY2NF90IHN0cmVhbVNpemU7CkBAIC0xNjYsMTEgKzE2NCwxMSBAQAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogCiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgewotICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKLSAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC0xODUsMzAgKzE4MywzMyBAQAogICAgICAgICAgICAgbnVtRnJhbWVzICsrOwogICAgICAgICB9CiAKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24pOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogQU1SRXh0cmFjdG9yOjp+QU1SRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKIAogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyAiYXVkaW8vYW1yLXdiIiA6ICJhdWRpby9hbXIiKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2lkZSA/ICJhdWRpby9hbXItd2IiIDogImF1ZGlvL2FtciIpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgQU1SRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqQU1SRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIxNywxOSArMjE4LDE4IEBACiAgICAgICAgICAgICBtT2Zmc2V0VGFibGUsIG1PZmZzZXRUYWJsZUxlbmd0aCk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBBTVJTb3VyY2U6OkFNUlNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgYm9vbCBpc1dpZGUsIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwgc2l6ZV90IG9mZnNldF90YWJsZV9sZW5ndGgpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCkBAIC0yNTAsMzUgKzI1MCwzMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSgxMjgpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoMTI4KTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgewogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0yOTYsNyArMjkxLDcgQEAKICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICBpZiAoKGVyciA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KG1EYXRhU291cmNlLCBtT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUsICZzaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzA5LDcgKzMwNCw3IEBACiAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCAmaGVhZGVyLCAxKTsKIAogICAgIGlmIChuIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGlmIChoZWFkZXIgJiAweDgzKSB7CkBAIC0zMTcsMjAgKzMxMiwyMCBAQAogCiAgICAgICAgIEFMT0dFKCJwYWRkaW5nIGJpdHMgbXVzdCBiZSAwLCBoZWFkZXIgaXMgMHglMDJ4IiwgaGVhZGVyKTsKIAotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCBGVCk7CiAgICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBmcmFtZVNpemUpOwpAQCAtMzQwLDI0ICszMzUsMjUgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBvbmx5IHBhcnRpYWwgZnJhbWUgaXMgYXZhaWxhYmxlLCB0cmVhdCBpdCBhcyBFT1MuCiAgICAgICAgICAgICBtT2Zmc2V0ICs9IG47Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZSk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0zNjUsMjQgKzM2MSwyNyBAQAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYzg2NjM5YzktMmYzMS00MGFjLWE3MTUtZmEwMWI0NDkzYWFmIiksCiAgICAgICAgIDEsCiAgICAgICAgICJBTVIgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZkFNUihzb3VyY2UsIG51bGxwdHIsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBTVJFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgIC52MiA9IFtdKAorICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChTbmlmZkFNUigmaGVscGVyLCBudWxscHRyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IEFNUkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH07CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCmluZGV4IGM5MGIzMjUuLmI3NmVlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCkBAIC0xOSw4ICsxOSw5IEBACiAjZGVmaW5lIEFNUl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjgsMjMgKzI5LDIzIEBACiBjbGFzcyBTdHJpbmc4OwogI2RlZmluZSBPRkZTRVRfVEFCTEVfTEVOICAgIDMwMAogCi1jbGFzcyBBTVJFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQU1SRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1SRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSXNXaWRlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAppbmRleCBiMmZiODgwLi40YmQ5MzNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKaW5kZXggNDI0MmQ3Ni4uM2EzZDA1MSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKQEAgLTgsMTMgKzgsMTcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGliZmxhY2V4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKaW5kZXggY2NmODBkMC4uYjVlYWY5YiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMjQsNDEgKzI0LDU2IEBACiAvLyBsaWJGTEFDIHBhcnNlcgogI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2RlY29kZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+IC8vIGZvciBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNZWRpYVNlcnZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGZsb2F0IGV4dHJhY3RvciBvdXRwdXQsIGJ1dCBnZW5lcmFsIHByb2Nlc3NlcworLy8gbWF5IG5vdCBiZSBhYmxlIHRvIGRvIHNvLgorLy8gVE9ETzogSW1wcm92ZSBBUEkgdG8gc2V0IGV4dHJhY3RvciBmbG9hdCBvdXRwdXQuCisvLyAoTm90ZTogZHVwbGljYXRlZCB3aXRoIFdBVkV4dHJhY3Rvci5jcHApCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQoaW50IGJpdHNQZXJTYW1wbGUpCit7CisgICAgcmV0dXJuIGJpdHNQZXJTYW1wbGUgPiAxNiAmJiBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX01FRElBOworfQorCiBjbGFzcyBGTEFDUGFyc2VyOwogCi1jbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIAogcHVibGljOgogICAgIEZMQUNTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ1NvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwpAQCAtNzUsMTQgKzkwLDE1IEBACiAKIHB1YmxpYzoKICAgICBlbnVtIHsKLSAgICAgICAga01heENoYW5uZWxzID0gOCwKKyAgICAgICAga01heENoYW5uZWxzID0gRkNDXzgsCiAgICAgfTsKIAogICAgIGV4cGxpY2l0IEZMQUNQYXJzZXIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAvLyBJZiBtZXRhZGF0YSBwb2ludGVycyBhcmVuJ3QgcHJvdmlkZWQsIHdlIGRvbid0IGZpbGwgdGhlbQotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSA9IDAsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSA9IDApOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSA9IDAsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSA9IDApOwogCiAgICAgdmlydHVhbCB+RkxBQ1BhcnNlcigpOwogCkBAIC0xMDgsMjQgKzEyNCwyNSBAQAogICAgIH0KIAogICAgIC8vIG1lZGlhIGJ1ZmZlcnMKLSAgICB2b2lkIGFsbG9jYXRlQnVmZmVycygpOworICAgIHZvaWQgYWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKTsKICAgICB2b2lkIHJlbGVhc2VCdWZmZXJzKCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKCkgeworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKCkgewogICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcihmYWxzZSwgMExMKTsKICAgICB9Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7CiAgICAgICAgIHJldHVybiByZWFkQnVmZmVyKHRydWUsIHNhbXBsZSk7CiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgKm1GaWxlTWV0YWRhdGE7Ci0gICAgTWV0YURhdGFCYXNlICptVHJhY2tNZXRhZGF0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCiAgICAgc2l6ZV90IG1NYXhCdWZmZXJTaXplOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptR3JvdXA7CiAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKIAogICAgIC8vIGhhbmRsZSB0byB1bmRlcmx5aW5nIGxpYkZMQUMgcGFyc2VyCkBAIC0xNDksNyArMTY2LDcgQEAKICAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgbUVycm9yU3RhdHVzOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOwogCiAgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CiAgICAgRkxBQ1BhcnNlcihjb25zdCBGTEFDUGFyc2VyICYpOwpAQCAtMTY5LDYgKzE4Niw3IEBACiAgICAgICAgICAgICBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10pOwogICAgIHZvaWQgbWV0YWRhdGFDYWxsYmFjayhjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEpOwogICAgIHZvaWQgZXJyb3JDYWxsYmFjayhGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzKTsKKyAgICBzaXplX3QgZ2V0T3V0cHV0U2FtcGxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7IH0KIAogICAgIC8vIEZMQUMgcGFyc2VyIGNhbGxiYWNrcyBhcyBDLWNhbGxhYmxlIGZ1bmN0aW9ucwogICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyByZWFkX2NhbGxiYWNrKApAQCAtMzY0LDkgKzM4Miw4IEBACiAgICAgY2FzZSBGTEFDX19NRVRBREFUQV9UWVBFX1BJQ1RVUkU6CiAgICAgICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKICAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhX1BpY3R1cmUgKnAgPSAmbWV0YWRhdGEtPmRhdGEucGljdHVyZTsKLSAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldERhdGEoa0tleUFsYnVtQXJ0LAotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YTo6VFlQRV9OT05FLCBwLT5kYXRhLCBwLT5kYXRhX2xlbmd0aCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIHAtPm1pbWVfdHlwZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCisgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0zODEsMTIyICszOTgsNjEgQEAKICAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7CiB9CiAKLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgc2lnbmVkCisvLyBvciAzMi1iaXQgZmxvYXQgaW50ZXJsZWF2ZWQuCisvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdG8gYXVkaW9fdXRpbHMuCiAvLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLQotc3RhdGljIHZvaWQgY29weU1vbm84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvMTZTaWduZWQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDgoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbGVmdFNoaWZ0ID0gMTYgLSAoaW50KWJpdHNQZXJTYW1wbGU7IC8vIGNhc3QgdG8gaW50IHRvIHByZXZlbnQgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgaWYgKGxlZnRTaGlmdCA+PSAwKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgbGVmdFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IHJpZ2h0U2hpZnQgPSAtbGVmdFNoaWZ0OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IHJpZ2h0U2hpZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG9GbG9hdCgKKyAgICAgICAgZmxvYXQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQogCi0vLyAyNC1iaXQgdmVyc2lvbnMgc2hvdWxkIGRvIGRpdGhlcmluZyBvciBub2lzZS1zaGFwaW5nLCBoZXJlIG9yIGluIEF1ZGlvRmxpbmdlcgotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDI0KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVRyZXNwYXNzKAotICAgICAgICBpbnQxNl90ICogLyogZHN0ICovLAotICAgICAgICBjb25zdCBpbnQgKltGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdIC8qIHNyYyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIFRSRVNQQVNTKCk7Ci19Ci0KIC8vIEZMQUNQYXJzZXIKIAogRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCiAgICAgICBtRmlsZU1ldGFkYXRhKGZpbGVNZXRhZGF0YSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAogICAgICAgbU1heEJ1ZmZlclNpemUoMCksCiAgICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtQ29weShjb3B5VHJlc3Bhc3MpLAogICAgICAgbURlY29kZXIoTlVMTCksCiAgICAgICBtQ3VycmVudFBvcygwTEwpLAogICAgICAgbUVPRihmYWxzZSksCkBAIC01NjcsOCArNTIzLDEwIEBACiAgICAgICAgIGNhc2UgODoKICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgY2FzZSAzMjogLy8gZ2VuZXJhbGx5IG5vdCBleHBlY3RlZCBmb3IgRkxBQwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHRoZSBGTEFDIGV4dHJhY3RvciBzdXBwb3J0cyAyLTMyIGJpdHMuCiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CkBAIC01ODUsNzEgKzU0Myw1MiBAQAogICAgICAgICBjYXNlIDQ4MDAwOgogICAgICAgICBjYXNlIDg4MjAwOgogICAgICAgICBjYXNlIDk2MDAwOgorICAgICAgICBjYXNlIDE3NjQwMDoKKyAgICAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIE5vdGU6IGludGVybmFsbHkgd2Ugc3VwcG9ydCBhcmJpdHJhcnkgc2FtcGxlIHJhdGVzIGZyb20gOGtIeiB0byAxOTJrSHouCiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJXUiLCBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSBhcHByb3ByaWF0ZSBjb3B5IGZ1bmN0aW9uLCBkZWZhdWx0aW5nIHRvIHRyZXNwYXNzCi0gICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICAgICAgdW5zaWduZWQgbUJpdHNQZXJTYW1wbGU7Ci0gICAgICAgICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgICAgICB9IHRhYmxlW10gPSB7Ci0gICAgICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgfSwKLSAgICAgICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICB9LAotICAgICAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgIH0sCi0gICAgICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgfSwKLSAgICAgICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICB9LAotICAgICAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0IH0sCi0gICAgICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7ICsraSkgewotICAgICAgICAgICAgaWYgKHRhYmxlW2ldLm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldLm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgICAgIG1Db3B5ID0gdGFibGVbaV0ubUNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgLy8gcG9wdWxhdGUgdHJhY2sgbWV0YWRhdGEKICAgICAgICAgaWYgKG1UcmFja01ldGFkYXRhICE9IDApIHsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBnZXRDaGFubmVscygpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIC8vIHNhbXBsZSByYXRlIGlzIG5vbi16ZXJvLCBzbyBkaXZpc2lvbiBieSB6ZXJvIG5vdCBwb3NzaWJsZQotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgKGdldFRvdGFsU2FtcGxlcygpICogMTAwMDAwMExMKSAvIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIm1pc3NpbmcgU1RSRUFNSU5GTyIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewotICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKCkKK3ZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKQogewogICAgIENIRUNLKG1Hcm91cCA9PSBOVUxMKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobU1heEJ1ZmZlclNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIobU1heEJ1ZmZlclNpemUpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6OnJlbGVhc2VCdWZmZXJzKCkKIHsKLSAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCitNZWRpYUJ1ZmZlckhlbHBlciAqRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSkKIHsKICAgICBtV3JpdGVSZXF1ZXN0ZWQgPSB0cnVlOwogICAgIG1Xcml0ZUNvbXBsZXRlZCA9IGZhbHNlOwpAQCAtNjg2LDQxICs2MjUsNTMgQEAKICAgICB9CiAgICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgogICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKICAgICBDSEVDSyhidWZmZXJTaXplIDw9IG1NYXhCdWZmZXJTaXplKTsKLSAgICBpbnQxNl90ICpkYXRhID0gKGludDE2X3QgKikgYnVmZmVyLT5kYXRhKCk7CiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYnVmZmVyU2l6ZSk7CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXIgbWVkaWEgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKGRhdGEsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlID0gZ2V0Qml0c1BlclNhbXBsZSgpOworICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvcHlUbzE2U2lnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9CiAgICAgLy8gZmlsbCBpbiBidWZmZXIgbWV0YWRhdGEKICAgICBDSEVDSyhtV3JpdGVIZWFkZXIubnVtYmVyX3R5cGUgPT0gRkxBQ19fRlJBTUVfTlVNQkVSX1RZUEVfU0FNUExFX05VTUJFUik7CiAgICAgRkxBQ19fdWludDY0IHNhbXBsZU51bWJlciA9IG1Xcml0ZUhlYWRlci5udW1iZXIuc2FtcGxlX251bWJlcjsKICAgICBpbnQ2NF90IHRpbWVVcyA9ICgxMDAwMDAwTEwgKiBzYW1wbGVOdW1iZXIpIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICByZXR1cm4gYnVmZmVyOwogfQogCiAvLyBGTEFDc291cmNlCiAKIEZMQUNTb3VyY2U6OkZMQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCi0gICAgICBtUGFyc2VyKDApLAotICAgICAgbUluaXRDaGVjayhmYWxzZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAorICAgICAgbVBhcnNlcihuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgb3V0cHV0RmxvYXQpKSwKKyAgICAgIG1Jbml0Q2hlY2sobVBhcnNlci0+aW5pdENoZWNrKCkpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OkZMQUNTb3VyY2UiKTsKLSAgICAvLyByZS11c2UgdGhlIHNhbWUgdHJhY2sgbWV0YWRhdGEgcGFzc2VkIGludG8gY29uc3RydWN0b3IgZnJvbSBGTEFDRXh0cmFjdG9yCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlKTsKLSAgICBtSW5pdENoZWNrICA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCiBGTEFDU291cmNlOjp+RkxBQ1NvdXJjZSgpCkBAIC03MzIsMTggKzY4MywxOCBAQAogICAgIGRlbGV0ZSBtUGFyc2VyOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycygpOworICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnN0b3AoKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdG9wIik7CiAKQEAgLTc1MSwxOSArNzAyLDIzIEBACiAgICAgbVBhcnNlci0+cmVsZWFzZUJ1ZmZlcnMoKTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKIHsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtNzg0LDIwICs3MzksMjIgQEAKICAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcigpOwogICAgIH0KICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gQU1FRElBX09LIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiB9CiAKIC8vIEZMQUNFeHRyYWN0b3IKIAogRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1QYXJzZXIobnVsbHB0ciksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgLy8gRkxBQ1BhcnNlciB3aWxsIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGZvciB1cwotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIGZhbHNlIC8qIG91dHB1dEZsb2F0ICovLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCkBAIC04MDUsNiArNzYyLDkgQEAKIHsKICAgICBBTE9HVigifkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKICAgICBkZWxldGUgbVBhcnNlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKIH0KIAogc2l6ZV90IEZMQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTgxMiwzMyArNzcyLDM5IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQorTWVkaWFUcmFja0hlbHBlciAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQogewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBGTEFDU291cmNlKG1EYXRhU291cmNlLCBtVHJhY2tNZXRhZGF0YSk7CisKKyAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UoCisgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEsIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1QYXJzZXItPmdldEJpdHNQZXJTYW1wbGUoKSkpOwogfQogCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobVBhcnNlci0+Z2V0Qml0c1BlclNhbXBsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YWRhdGEpOwogfQogCiAvLyBTbmlmZmVyCiAKLWJvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQorYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKIHsKICAgICAvLyBmaXJzdCA0IGlzIHRoZSBzaWduYXR1cmUgd29yZAogICAgIC8vIHNlY29uZCA0IGlzIHRoZSBzaXplb2YgU1RSRUFNSU5GTwpAQCAtODYwLDI0ICs4MjYsMjcgQEAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICAgICAgVVVJRCgiMTM2NGIwNDgtY2M0NS00ZmRhLTk5MzQtMzI3ZDBlYmY5ODI5IiksCiAgICAgICAgICAgICAxLAogICAgICAgICAgICAgIkZMQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgICAgIFtdKAotICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZMQUNFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC52MiA9IFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgRkxBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgIH07CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaAppbmRleCA3ZmI2ZWM2Li41YTczZDIwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKQEAgLTE4LDQ1ICsxOCw0NCBAQAogI2RlZmluZSBGTEFDX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBGTEFDUGFyc2VyOwogCi1jbGFzcyBGTEFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRkxBQ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiRkxBQ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBGTEFDRXh0cmFjdG9yKGNvbnN0IEZMQUNFeHRyYWN0b3IgJik7CiAgICAgRkxBQ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEZMQUNFeHRyYWN0b3IgJik7CiAKIH07CiAKLWJvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBGTEFDX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAppbmRleCA2ZTk4MTE0Li43ZDQyZTcwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icApAQCAtOCw3ICs4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCmluZGV4IGEzMGI2ZjguLjBjNzQzNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKQEAgLTI0LDM1ICsyNCwzNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXJCYXNlCisvLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlcgogc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKIAotY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIE1pZGlTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBNaWRpU291cmNlKAogICAgICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWlkaVNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE1pZGlFbmdpbmUgJm1FbmdpbmU7Ci0gICAgTWV0YURhdGFCYXNlICZtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC02OSw3ICs2OCw3IEBACiAKIE1pZGlTb3VyY2U6Ok1pZGlTb3VyY2UoCiAgICAgICAgIE1pZGlFbmdpbmUgJmVuZ2luZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRW5naW5lKGVuZ2luZSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLApAQCAtODcsMTcgKzg2LDE3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycygpOwotICAgIHJldHVybiBPSzsKKyAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0b3AoKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0b3AiKTsKIApAQCAtMTA1LDIwICsxMDQsMTkgQEAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1FbmdpbmUucmVsZWFzZUJ1ZmZlcnMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtMTMxLDcgKzEyOSw3IEBACiAgICAgYnVmZmVyID0gbUVuZ2luZS5yZWFkQnVmZmVyKCk7CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCAlcCBkb25lIiwgdGhpcyk7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyBBTUVESUFfT0sgOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKIH0KIAogc3RhdHVzX3QgTWlkaVNvdXJjZTo6aW5pdCgpCkBAIC0xNDIsMTAgKzE0MCw5IEBACiAKIC8vIE1pZGlFbmdpbmUKIAotTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkgOgotICAgICAgICAgICAgbUdyb3VwKE5VTEwpLAorTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkgOgogICAgICAgICAgICAgbUVhc0RhdGEoTlVMTCksCiAgICAgICAgICAgICBtRWFzSGFuZGxlKE5VTEwpLAogICAgICAgICAgICAgbUVhc0NvbmZpZyhOVUxMKSwKQEAgLTE3MCwxNiArMTY3LDIwIEBACiAgICAgfQogCiAgICAgaWYgKGZpbGVNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKTsKICAgICB9CiAKICAgICBpZiAodHJhY2tNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCiAgICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUVhc0NvbmZpZy0+c2FtcGxlUmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1FYXNDb25maWctPm51bUNoYW5uZWxzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKICAgICB9CiAgICAgbUlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogfQpAQCAtMTkxLDcgKzE5Miw2IEBACiAgICAgaWYgKG1FYXNEYXRhKSB7CiAgICAgICAgIEVBU19TaHV0ZG93bihtRWFzRGF0YSk7CiAgICAgfQotICAgIGRlbGV0ZSBtR3JvdXA7CiAgICAgZGVsZXRlIG1Jb1dyYXBwZXI7CiB9CiAKQEAgLTE5OSwyMiArMTk5LDIwIEBACiAgICAgcmV0dXJuIG1Jc0luaXRpYWxpemVkID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApIHsKICAgICAvLyBzZWxlY3QgcmV2ZXJiIHByZXNldCBhbmQgZW5hYmxlCiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfUFJFU0VULCBFQVNfUEFSQU1fUkVWRVJCX0NIQU1CRVIpOwogICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX0JZUEFTUywgRUFTX0ZBTFNFKTsKIAotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwogICAgIGludCBidWZzaXplID0gc2l6ZW9mKEVBU19QQ00pCiAgICAgICAgICAgICAqIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIE5VTV9DT01CSU5FX0JVRkZFUlM7CiAgICAgQUxPR1YoInVzaW5nICVkIGJ5dGUgYnVmZmVyIiwgYnVmc2l6ZSk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGJ1ZnNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoYnVmc2l6ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBNaWRpRW5naW5lOjpyZWxlYXNlQnVmZmVycygpIHsKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjQsMTMgKzIyMiwxMyBAQAogICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKK01lZGlhQnVmZmVySGVscGVyKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgewogICAgIEVBU19TVEFURSBzdGF0ZTsKICAgICBFQVNfU3RhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZzdGF0ZSk7CiAgICAgaWYgKChzdGF0ZSA9PSBFQVNfU1RBVEVfU1RPUFBFRCkgfHwgKHN0YXRlID09IEVBU19TVEFURV9FUlJPUikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJyZWFkQnVmZmVyOiBubyBidWZmZXIiKTsKQEAgLTIzOSw3ICsyMzcsOSBAQAogICAgIEVBU19JMzIgdGltZU1zOwogICAgIEVBU19HZXRMb2NhdGlvbihtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRpbWVNcyk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAxMDAwbGwgKiB0aW1lTXM7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBFQVNfUENNKiBwID0gKEVBU19QQ00qKSBidWZmZXItPmRhdGEoKTsKICAgICBpbnQgbnVtQnl0ZXNPdXRwdXQgPSAwOwpAQCAtMjYzLDE4ICsyNjMsMjMgQEAKIC8vIE1pZGlFeHRyYWN0b3IKIAogTWlkaUV4dHJhY3Rvcjo6TWlkaUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIENEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGN0b3IiKTsKLSAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1FbmdpbmUtPmluaXRDaGVjaygpOwogfQogCiBNaWRpRXh0cmFjdG9yOjp+TWlkaUV4dHJhY3RvcigpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgZHRvciIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CisgICAgZGVsZXRlIG1FbmdpbmU7CiB9CiAKIHNpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC0yODIsNyArMjg3LDcgQEAKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCitNZWRpYVRyYWNrSGVscGVyICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjkwLDI3ICsyOTUsMjUgQEAKICAgICByZXR1cm4gbmV3IE1pZGlTb3VyY2UoKm1FbmdpbmUsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEiKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmTWlkaShEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewogICAgIE1pZGlFbmdpbmUgcChzb3VyY2UsIE5VTEwsIE5VTEwpOwogICAgIGlmIChwLmluaXRDaGVjaygpID09IE9LKSB7CkBAIC0zMjMsMjcgKzMyNiwzMCBAQAogCiB9CiAKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiZWY2Y2NhMGEtZjhhMi00M2U2LWJhNWYtZGZjZDdjOWE3ZWYyIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNSURJIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIHsKKyAgICAgICAgICAgIC52MiA9IFtdKAorICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpKTt9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCmluZGV4IDI0NGRkMGYuLjJlNzgwODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaApAQCAtMTgsMTEgKzE4LDEyIEBACiAjZGVmaW5lIE1JRElfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KIApAQCAtMzAsNDggKzMxLDQ4IEBACiAKIGNsYXNzIE1pZGlFbmdpbmUgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSk7CisgICAgZXhwbGljaXQgTWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKTsKICAgICB+TWlkaUVuZ2luZSgpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAKLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApOwogICAgIHN0YXR1c190IHJlbGVhc2VCdWZmZXJzKCk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgcG9zaXRpb25Vcyk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlKiByZWFkQnVmZmVyKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIqIHJlYWRCdWZmZXIoKTsKIHByaXZhdGU6CiAgICAgTWlkaUlvV3JhcHBlciAqbUlvV3JhcHBlcjsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUdyb3VwOwogICAgIEVBU19EQVRBX0hBTkRMRSBtRWFzRGF0YTsKICAgICBFQVNfSEFORExFIG1FYXNIYW5kbGU7CiAgICAgY29uc3QgU19FQVNfTElCX0NPTkZJRyogbUVhc0NvbmZpZzsKICAgICBib29sIG1Jc0luaXRpYWxpemVkOwogfTsKIAotY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIAogcHVibGljOgotICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgTWlkaUV4dHJhY3RvcihDRGF0YVNvdXJjZSAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNaWRpRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWlkaUV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBDRGF0YVNvdXJjZSAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CiAKICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjawotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogCiAgICAgTWlkaUVuZ2luZSAqbUVuZ2luZTsKIApAQCAtODgsNyArODksNyBAQAogCiB9OwogCi1ib29sIFNuaWZmTWlkaShEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTWlkaShDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCmluZGV4IGY3ZWQwYzguLjE3NDRkM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApAQCAtMTEsNyArMTEsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggZDY1NzU4Mi4uNDJhOWM0MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMjMsMTcgKzIzLDE0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC00NCw3ICs0MSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewotICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUJhc2VSZWFkZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCkBAIC02OCw4ICs2NSwxMiBAQAogICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewogICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgKnRvdGFsID0gLTE7Ci0gICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICBpZiAodG90YWwpIHsKKyAgICAgICAgICAgICAgICAqdG90YWwgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC04Niw3ICs4Nyw3IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAKICAgICBEYXRhU291cmNlQmFzZVJlYWRlcihjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlUmVhZGVyICYpOwpAQCAtMTI0LDE2ICsxMjUsMTYgQEAKICAgICBCbG9ja0l0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKIH07CiAKLXN0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBNYXRyb3NrYVNvdXJjZShNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NYXRyb3NrYVNvdXJjZSgpOwpAQCAtMTUzLDEyICsxNTQsMTIgQEAKICAgICBCbG9ja0l0ZXJhdG9yIG1CbG9ja0l0ZXI7CiAgICAgc3NpemVfdCBtTkFMU2l6ZUxlbjsgIC8vIGZvciB0eXBlIEFWQyBvciBIRVZDCiAKLSAgICBMaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtUGVuZGluZ0ZyYW1lczsKKyAgICBMaXN0PE1lZGlhQnVmZmVySGVscGVyICo+IG1QZW5kaW5nRnJhbWVzOwogCiAgICAgc3RhdHVzX3QgYWR2YW5jZSgpOwogCi0gICAgc3RhdHVzX3Qgc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYpOwotICAgIHN0YXR1c190IHJlYWRCbG9jaygpOworICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJIZWxwZXIgKm1idWYpOworICAgIG1lZGlhX3N0YXR1c190IHJlYWRCbG9jaygpOwogICAgIHZvaWQgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAKICAgICBNYXRyb3NrYVNvdXJjZShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKQEAgLTIyMiw0MyArMjIzLDMxIEBACiAgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0sCiAgICAgICAgICAgICAgICAgIGluZGV4KSwKICAgICAgIG1OQUxTaXplTGVuKC0xKSB7Ci0gICAgTWV0YURhdGFCYXNlICZtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KS5tTWV0YTsKKyAgICBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvICZ0cmFja0luZm8gPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IHRyYWNrSW5mby5tTWV0YTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKICAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNik7CiAKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewogICAgICAgICBtVHlwZSA9IEFWQzsKIAotICAgICAgICB1aW50MzJfdCBkdW1teTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYXZjYzsKLSAgICAgICAgc2l6ZV90IGF2Y2NTaXplOwotICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSAwOwotICAgICAgICBpZiAobWV0YS5maW5kSW50MzIoa0tleU5hbExlbmd0aFNpemUsICZuYWxTaXplTGVuKSkgewotICAgICAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKLSAgICAgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0YS5maW5kRGF0YShrS2V5QVZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmYXZjYywgJmF2Y2NTaXplKQotICAgICAgICAgICAgICAgICYmIGF2Y2NTaXplID49IDV1KSB7Ci0gICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoYXZjY1s0XSAmIDMpOwotICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXpkIiwgbU5BTFNpemVMZW4pOworICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSB0cmFja0luZm8ubU5hbExlbmd0aFNpemU7CisgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gbU5BTFNpemVMZW4iKTsKKyAgICAgICAgICAgIEFMT0dFKCJObyBBVkMgbU5BTFNpemVMZW4iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKICAgICAgICAgbVR5cGUgPSBIRVZDOwogCi0gICAgICAgIHVpbnQzMl90IGR1bW15OwotICAgICAgICBjb25zdCB1aW50OF90ICpodmNjOwotICAgICAgICBzaXplX3QgaHZjY1NpemU7Ci0gICAgICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZodmNjLCAmaHZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgaHZjY1NpemUgPj0gMjJ1KSB7Ci0gICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoaHZjY1sxNCs3XSAmIDMpOwotICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXp1IiwgbU5BTFNpemVMZW4pOworICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSB0cmFja0luZm8ubU5hbExlbmd0aFNpemU7CisgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gbU5BTFNpemVMZW4iKTsKKyAgICAgICAgICAgIEFMT0dFKCJObyBIRVZDIG1OQUxTaXplTGVuIik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgbVR5cGUgPSBBQUM7CkBAIC0yNjksMjUgKzI1OCwyNiBAQAogICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoKSB7CiAgICAgaWYgKG1UeXBlID09IEFWQyAmJiBtTkFMU2l6ZUxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCisgICAgLy8gYWxsb2NhdGUgb25lIHNtYWxsIGluaXRpYWwgYnVmZmVyLCBidXQgbGVhdmUgcGxlbnR5IG9mIHJvb20gdG8gZ3JvdworICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMDI0IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBncm93dGggbGltaXQgKi8pOwogICAgIG1CbG9ja0l0ZXIucmVzZXQoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdG9wKCkgewogICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTc5LDcgKzU2OSw3IEBACiAKIHZvaWQgTWF0cm9za2FTb3VyY2U6OmNsZWFyUGVuZGluZ0ZyYW1lcygpIHsKICAgICB3aGlsZSAoIW1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKICAgICAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CiAKICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKQEAgLTU4Nyw3ICs1NzcsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJCYXNlICptYnVmKSB7CitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1ZikgewogICAgIGlmIChtYnVmLT5yYW5nZV9sZW5ndGgoKSA8IDEgfHwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxID4gSU5UMzJfTUFYKSB7CiAgICAgICAgIC8vIDEtYnl0ZSBzaWduYWwKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTYwMSwxNyArNTkxLDE3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CiAgICAgaWYgKGVuY3J5cHRlZCkgewogICAgICAgICB1aW50OF90IGN0ckNvdW50ZXJbMTZdID0geyAwIH07Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleUlkOwogICAgICAgICBzaXplX3Qga2V5SWRTaXplOwotICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKLSAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAoY29uc3Qgdm9pZCAqKikma2V5SWQsICZrZXlJZFNpemUpKTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGtleUlkLCBrZXlJZFNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwKKyAgICAgICAgICAgICAgICAodm9pZCoqKSZrZXlJZCwgJmtleUlkU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBrZXlJZCwga2V5SWRTaXplKTsKICAgICAgICAgbWVtY3B5KGN0ckNvdW50ZXIsIGRhdGEgKyAxLCA4KTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgY3RyQ291bnRlciwgMTYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBjdHJDb3VudGVyLCAxNik7CiAgICAgICAgIGlmIChwYXJ0aXRpb25lZCkgewogICAgICAgICAgICAgLyogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKQEAgLTY2NCw4ICs2NTQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZlBsYWluU2l6ZXMgPSBzaXplb2YodWludDMyX3QpICogcGxhaW5TaXplcy5zaXplKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBzaXplb2ZFbmNyeXB0ZWRTaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBlbmNyeXB0ZWRTaXplcy5zaXplKCk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMuZGF0YSgpLCBzaXplb2ZQbGFpblNpemVzKTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLmRhdGEoKSwgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5TaXplcy5kYXRhKCksIHNpemVvZlBsYWluU2l6ZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLmRhdGEoKSwgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMpOwogICAgICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKGZyYW1lT2Zmc2V0LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIGZyYW1lT2Zmc2V0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCkBAIC02ODUsOCArNjc3LDEwIEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGludDMyX3QgcGxhaW5TaXplc1tdID0geyAwIH07CiAgICAgICAgICAgICBpbnQzMl90IGVuY3J5cHRlZFNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gOSkgfTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOwogICAgICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDksIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gOSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNzAzLDE5ICs2OTcsMjEgQEAKICAgICAgICAgICovCiAgICAgICAgIGludDMyX3QgcGxhaW5TaXplc1tdID0geyBzdGF0aWNfY2FzdDxpbnQzMl90PihtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEpIH07CiAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgMCB9OwotICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKKyAgICAgICAgICAgICAgICBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKKyAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CiAgICAgICAgIG1idWYtPnNldF9yYW5nZSgxLCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWRCbG9jaygpIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CiAgICAgQ0hFQ0sobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSk7CiAKICAgICBpZiAobUJsb2NrSXRlci5lb3MoKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrID0gbUJsb2NrSXRlci5ibG9jaygpOwpAQCAtNzI3LDE4ICs3MjMsMjEgQEAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKGkpOwogICAgICAgICBzaXplX3QgbGVuID0gZnJhbWUubGVuOwogICAgICAgICBpZiAoU0laRV9NQVggLSBsZW4gPCB0cmFja0luZm8tPm1IZWFkZXJMZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCiAgICAgICAgIGxlbiArPSB0cmFja0luZm8tPm1IZWFkZXJMZW47Ci0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZiA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGxlbik7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICptYnVmOworICAgICAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtYnVmLCBmYWxzZSAvKiBub25ibG9ja2luZyAqLywgbGVuIC8qIHJlcXVlc3RlZCBzaXplICovKTsKKyAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDAsIGxlbik7CiAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1idWYtPmRhdGEoKSk7CiAgICAgICAgIGlmICh0cmFja0luZm8tPm1IZWFkZXIpIHsKICAgICAgICAgICAgIG1lbWNweShkYXRhLCB0cmFja0luZm8tPm1IZWFkZXIsIHRyYWNrSW5mby0+bUhlYWRlckxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBibG9jay0+SXNLZXkoKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCBibG9jay0+SXNLZXkoKSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gZnJhbWUuUmVhZChtRXh0cmFjdG9yLT5tUmVhZGVyLCBkYXRhICsgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKICAgICAgICAgaWYgKGVyciA9PSBPSwpAQCAtNzUyLDcgKzc1MSw3IEBACiAKICAgICAgICAgICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwogICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhtYnVmKTsKQEAgLTc2MCwxMSArNzU5LDExIEBACiAKICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMWxsOwpAQCAtNzczLDcgKzc3Miw3IEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1FeHRyYWN0b3ItPmlzTGl2ZVN0cmVhbWluZygpKSB7CkBAIC03OTEsNyArNzkwLDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CkBAIC04MDAsMTggKzc5OSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwogICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOwogCiAgICAgaWYgKChtVHlwZSAhPSBBVkMgJiYgbVR5cGUgIT0gSEVWQykgfHwgbU5BTFNpemVMZW4gPT0gMCkgewogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgewotICAgICAgICAgICAgZnJhbWUtPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChmcmFtZS0+bWV0YV9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICAqb3V0ID0gZnJhbWU7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIC8vIEVhY2ggaW5wdXQgZnJhbWUgY29udGFpbnMgb25lIG9yIG1vcmUgTkFMIGZyYWdtZW50cywgZWFjaCBmcmFnbWVudApAQCAtODI5LDcgKzgyOCw3IEBACiAgICAgc2l6ZV90IHNyY1NpemUgPSBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICBzaXplX3QgZHN0U2l6ZSA9IDA7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBOVUxMOwogICAgIHVpbnQ4X3QgKmRzdFB0ciA9IE5VTEw7CiAKICAgICBmb3IgKGludDMyX3QgcGFzcyA9IDA7IHBhc3MgPCAyOyArK3Bhc3MpIHsKQEAgLTg1MCw3ICs4NDksNyBAQAogICAgICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgZnJhbWUgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4gKyBOQUxzaXplID4gc3JjU2l6ZSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtODc4LDcgKzg3Nyw3IEBACiAgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgZnJhbWUgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocGFzcyA9PSAwKSB7CkBAIC04ODksMTYgKzg4OCwyMCBAQAogICAgICAgICAgICAgICAgIC8vIGVhY2ggNC1ieXRlIG5hbCBzaXplIHdpdGggYSA0LWJ5dGUgc3RhcnQgY29kZQogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGZyYW1lOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShkc3RTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwgZmFsc2UgLyogbm9uYmxvY2tpbmcgKi8sIGRzdFNpemUgLyogcmVxdWVzdGVkIHNpemUgKi8pOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdFNpemUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmZyYW1lTWV0YSA9IGZyYW1lLT5tZXRhX2RhdGEoKTsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDY0KGZyYW1lTWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmdGltZVVzKSk7CiAgICAgICAgICAgICBpbnQzMl90IGlzU3luYzsKLSAgICAgICAgICAgIENIRUNLKGZyYW1lLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZnJhbWVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsICZpc1N5bmMpKTsKIAotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc1N5bmMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpidWZNZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmTWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCBpc1N5bmMpOwogCiAgICAgICAgICAgICBkc3RQdHIgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICB9CkBAIC05MTAsMTggKzkxMywxOCBAQAogICAgIH0KIAogICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZmZXItPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgfQogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZUJhc2VSZWFkZXIobURhdGFTb3VyY2UpKSwKICAgICAgIG1TZWdtZW50KE5VTEwpLApAQCAtOTk0LDEzICs5OTcsMTUgQEAKIAogICAgIGRlbGV0ZSBtUmVhZGVyOwogICAgIG1SZWFkZXIgPSBOVUxMOworCisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBzaXplX3QgTWF0cm9za2FFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMDA4LDExICsxMDEzLDExIEBACiAgICAgcmV0dXJuIG5ldyBNYXRyb3NrYVNvdXJjZSh0aGlzLCBpbmRleCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpICYmICFtRXh0cmFjdGVkVGh1bWJuYWlscwpAQCAtMTAyMSw4ICsxMDI2LDcgQEAKICAgICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMgPSB0cnVlOwogICAgIH0KIAotICAgIG1ldGEgPSBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGEpOwogfQogCiBib29sIE1hdHJvc2thRXh0cmFjdG9yOjppc0xpdmVTdHJlYW1pbmcoKSBjb25zdCB7CkBAIC0xMDU3LDcgKzEwNjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGJvb2wgaXNBdWRpbywgY29uc3Qgdm9pZCAqcHJpdiwgc2l6ZV90IHByaXZTaXplKSB7CiAKICAgICBpbnQgcHJpdlNpemVCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKHByaXZTaXplKTsKQEAgLTEwODUsMTQgKzEwODksMTQgQEAKICAgICBzdG9yZVNpemUoZXNkcywgaWR4LCBwcml2U2l6ZSk7CiAgICAgbWVtY3B5KGVzZHMgKyBpZHgsIHByaXYsIHByaXZTaXplKTsKIAotICAgIG1ldGEuc2V0RGF0YShrS2V5RVNEUywgMCwgZXNkcywgZXNkc1NpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgcHJpdiwgcHJpdlNpemUpOwogCiAgICAgZGVsZXRlW10gZXNkczsKICAgICBlc2RzID0gTlVMTDsKIH0KIAogc3RhdHVzX3QgYWRkVm9yYmlzQ29kZWNJbmZvKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgY29uc3Qgdm9pZCAqX2NvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKICAgICAvLyBoZXhkdW1wKF9jb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCkBAIC0xMTUwLDcgKzExNTQsOCBAQAogICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAxKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIG1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKKyAgICAvLyBmb3JtZXJseSBrS2V5Vm9yYmlzSW5mbworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKIAogICAgIG9mZnNldCArPSBsZW4xOwogICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAzKSB7CkBAIC0xMTYyLDE5ICsxMTY3LDIwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgbWV0YS5zZXREYXRhKAotICAgICAgICAgICAga0tleVZvcmJpc0Jvb2tzLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sCi0gICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKKyAgICAvLyBmb3JtZXJseSBrS2V5Vm9yYmlzQm9va3MKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsCisgICAgICAgICAgICAmY29kZWNQcml2YXRlW29mZnNldF0sIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYWRkRmxhY01ldGFkYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgY29uc3Qgdm9pZCAqY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgewogICAgIC8vIGhleGR1bXAoY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIAotICAgIG1ldGEuc2V0RGF0YShrS2V5RmxhY01ldGFkYXRhLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgIC8vIGZvcm1lcmx5IGtLZXlGbGFjTWV0YWRhdGEKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZSA9IDY0IDw8IDEwOwogICAgIEZMQUNEZWNvZGVyICpmbGFjRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKQEAgLTExOTYsNyArMTIwMiw3IEBACiAgICAgICAgICAgICAgICAgKiBzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBzdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4SW5wdXRTaXplKTsKIAogICAgIGRlbGV0ZSBmbGFjRGVjb2RlcjsKICAgICByZXR1cm4gT0s7CkBAIC0xMjI1LDcgKzEyMzEsNyBAQAogICAgIH0KIAogICAgIC8vIE92ZXJyaWRlIHRoZSBzeW50aGVzaXplZCBuYWwgbGVuZ3RoIHNpemUsIHdoaWNoIGlzIGFyYml0cmFyeQotICAgIHRyYWNrSW5mby0+bU1ldGEuc2V0SW50MzIoa0tleU5hbExlbmd0aFNpemUsIDApOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAwOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTI0Nyw3ICsxMjUzLDcgQEAKIH0KIAogdm9pZCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0Q29sb3JJbmZvcm1hdGlvbigKLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgY29uc3QgbWt2cGFyc2VyOjpDb2xvdXIgKmNvbG9yID0gdnRyYWNrLT5HZXRDb2xvdXIoKTsKICAgICBpZiAoY29sb3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xMjU2LDcgKzEyNjIsNyBAQAogICAgIC8vIENvbG9yIEFzcGVjdHMKICAgICB7CiAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCi0gICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKKyAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAogICAgICAgICBpbnQzMl90IGNvZWZmcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAogICAgICAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOyAvLyBkZWZhdWx0CiAgICAgICAgIGJvb2wgcmFuZ2VTcGVjaWZpZWQgPSBmYWxzZTsKQEAgLTEyNjUsNyArMTI3MSw3IEBACiAgICAgICAgICAgICBwcmltYXJpZXMgPSBjb2xvci0+cHJpbWFyaWVzOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKSkgewotICAgICAgICAgICAgdHJhbnNmZXIgPSBjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgaXNvdHJhbnNmZXIgPSBjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50cykpIHsKICAgICAgICAgICAgIGNvZWZmcyA9IGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzOwpAQCAtMTI3OCwxNCArMTI4NCwyMSBAQAogICAgICAgICAgICAgcmFuZ2VTcGVjaWZpZWQgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKLSAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICBtZXRhLnNldEludDMyKAotICAgICAgICAgICAgICAgIGtLZXlDb2xvclJhbmdlLCByYW5nZVNwZWNpZmllZCA/IGFzcGVjdHMubVJhbmdlIDogQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkKTsKKyAgICAgICAgaW50MzJfdCByYW5nZSA9IDA7CisgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMDsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgICAgICBpZiAocmFuZ2UgIT0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsIHJhbmdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhbmRhcmQgIT0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNmZXIgIT0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEhEUiBTdGF0aWMgSW5mbwpAQCAtMTMyOSwyNiArMTM0MiwyOCBAQAogICAgICAgICAvLyBPbmx5IGFkdmVydGlzZSBzdGF0aWMgaW5mbyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGdyb3VwcyBoYXZlIGJlZW4gc3BlY2lmaWVkLgogICAgICAgICBpZiAobWVtY21wKCZpbmZvLCAmbnVsbEluZm8sIHNpemVvZihpbmZvKSkgIT0gMCkgewogICAgICAgICAgICAgaW5mby5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTE7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhkclN0YXRpY0luZm8sICdoZHJTJywgJmluZm8sIHNpemVvZihpbmZvKSk7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChpbmZvLCBtZXRhKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmluaXRUcmFja0luZm8oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEsIFRyYWNrSW5mbyAqdHJhY2tJbmZvKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLCBBTWVkaWFGb3JtYXQgKm1ldGEsIFRyYWNrSW5mbyAqdHJhY2tJbmZvKSB7CiAgICAgdHJhY2tJbmZvLT5tVHJhY2tOdW0gPSB0cmFjay0+R2V0TnVtYmVyKCk7CiAgICAgdHJhY2tJbmZvLT5tTWV0YSA9IG1ldGE7CiAgICAgdHJhY2tJbmZvLT5tRXh0cmFjdG9yID0gdGhpczsKICAgICB0cmFja0luZm8tPm1FbmNyeXB0ZWQgPSBmYWxzZTsKICAgICB0cmFja0luZm8tPm1IZWFkZXIgPSBOVUxMOwogICAgIHRyYWNrSW5mby0+bUhlYWRlckxlbiA9IDA7CisgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IC0xOwogCiAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdDb3VudCgpOyBpKyspIHsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2RpbmcgKmVuY29kaW5nID0gdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0J5SW5kZXgoaSk7CiAgICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkNvdW50KCk7IGorKykgewogICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2Rpbmc6OkNvbnRlbnRFbmNyeXB0aW9uICplbmNyeXB0aW9uOwogICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleChqKTsKLSAgICAgICAgICAgIHRyYWNrSW5mby0+bU1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcih0cmFja0luZm8tPm1NZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGVuY3J5cHRpb24tPmtleV9pZCwgZW5jcnlwdGlvbi0+a2V5X2lkX2xlbik7CiAgICAgICAgICAgICB0cmFja0luZm8tPm1FbmNyeXB0ZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzOTcsOSArMTQxMiwxMCBAQAogCiAgICAgICAgIGVudW0geyBWSURFT19UUkFDSyA9IDEsIEFVRElPX1RSQUNLID0gMiB9OwogCi0gICAgICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZSA9IC0xOwogCiAgICAgICAgIHN3aXRjaCAodHJhY2stPkdldFR5cGUoKSkgewogICAgICAgICAgICAgY2FzZSBWSURFT19UUkFDSzoKQEAgLTE0MDgsMjAgKzE0MjQsMjggQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICo+KHRyYWNrKTsKIAogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUFWQ0MsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IDEgKyAoY29kZWNQcml2YXRlWzRdICYgMyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFR0gvSVNPL0hFVkMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDE0ICsgNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUgPSAxICsgKGNvZGVjUHJpdmF0ZVsxNCArIDddICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiSEVWQyBpcyBkZXRlY3RlZCwgYnV0IGRvZXMgbm90IGhhdmUgY29uZmlndXJhdGlvbi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BU1AiLCBjb2RlY0lEKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGZhbHNlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQzMCwxNSArMTQ1NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfVlA4IiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOSIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAvLyAnY3NkLTAnIGZvciBWUDkgaXMgdGhlIEJsb2Igb2YgQ29kZWMgUHJpdmF0ZSBkYXRhIGFzCiAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3ZwOS9wcm9maWxlcy8uCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VnA5Q29kZWNQcml2YXRlLCAwLCBjb2RlY1ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKQEAgLTE0NTUsOCArMTQ3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBoZWlnaHQgZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCl3aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SGVpZ2h0LCAoaW50MzJfdCloZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCl3aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAoaW50MzJfdCloZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkaXNwbGF5IHdpZHRoL2hlaWdodCBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBkaXNwbGF5VW5pdCA9IHZ0cmFjay0+R2V0RGlzcGxheVVuaXQoKTsKQEAgLTE0NjYsOCArMTQ4OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheUhlaWdodCA+IDAgJiYgZGlzcGxheUhlaWdodCA8PSBJTlQzMl9NQVgpIHsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkaXNwbGF5VW5pdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIHBpeGVscwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gY2VudGltZXRlcnMKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBpbmNoZXMKQEAgLTE0ODEsOCArMTUwNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkSGVpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoaGVpZ2h0LCB3aWR0aCAqIGRpc3BsYXlIZWlnaHQgLyBkaXNwbGF5V2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGggPD0gSU5UMzJfTUFYICYmIGNvbXB1dGVkSGVpZ2h0IDw9IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdCljb21wdXRlZFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNTAyLDM0ICsxNTI5LDM5IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiQV9BQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAyKTsKIAogICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCB0cnVlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9WT1JCSVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKIAogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb2RlY0RlbGF5ID0gdHJhY2stPkdldENvZGVjRGVsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY0RlbGF5LCBzaXplb2YoY29kZWNEZWxheSkpOwogICAgICAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGxOcyA9IHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJm1TZWVrUHJlUm9sbE5zLCBzaXplb2YobVNlZWtQcmVSb2xsTnMpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX0ZMQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBhdHJhY2stPkdldENoYW5uZWxzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNTQyLDcgKzE1NzQsNyBAQAogICAgICAgICAgICBjaGFyIGxhbmdbNF07CiAgICAgICAgICAgIHN0cm5jcHkobGFuZywgbGFuZ3VhZ2UsIDMpOwogICAgICAgICAgICBsYW5nWzNdID0gJ1wwJzsKLSAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nKTsKKyAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLCBsYW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1NTEsMTIgKzE1ODMsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvbmcgbG9uZyBkdXJhdGlvbk5zID0gbVNlZ21lbnQtPkdldER1cmF0aW9uKCk7Ci0gICAgICAgIG1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOwogCiAgICAgICAgIG1UcmFja3MucHVzaCgpOwogICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOwogICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOworICAgICAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gbmFsU2l6ZTsKIAogICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBBVkMgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKQEAgLTE1NzMsNyArMTYwNiw3IEBACiAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0soaW5mby0+bU1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGluZm8tPm1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKICAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNTk5LDE2ICsxNjMyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWV0YS5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGluZm8tPm1NZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIHRodW1ibmFpbFRpbWVVcyk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLAotICAgICAgICAgICAgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC0xNjIxLDcgKzE2NTQsNyBAQAogfQogCiBib29sIFNuaWZmTWF0cm9za2EoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciByZWFkZXIoc291cmNlKTsKICAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKICAgICBsb25nIGxvbmcgcG9zOwpAQCAtMTYzOCwyNCArMTY3MSwyNyBAQAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICAudjIgPSBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYSgmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1hdHJvc2thRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDM1NjhlYTEuLjM4NzFiZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKQEAgLTM0LDE2ICszNSwxNiBAQAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOwogc3RydWN0IE1hdHJvc2thU291cmNlOwogCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKIAotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKQEAgLTU3LDkgKzU4LDE3IEBACiAgICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwogCiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIFRyYWNrSW5mbygpIHsKKyAgICAgICAgICAgIG1NZXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB+VHJhY2tJbmZvKCkgeworICAgICAgICAgICAgaWYgKG1NZXRhKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKICAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOwogCkBAIC02OCw2ICs3Nyw3IEBACiAgICAgICAgIC8vIGluIH5NYXRyb3NrYUV4dHJhY3Rvci4KICAgICAgICAgdW5zaWduZWQgY2hhciAqbUhlYWRlcjsKICAgICAgICAgc2l6ZV90IG1IZWFkZXJMZW47CisgICAgICAgIGludDMyX3QgbU5hbExlbmd0aFNpemU7CiAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKQEAgLTc2LDcgKzg2LDcgQEAKICAgICBNdXRleCBtTG9jazsKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyICptUmVhZGVyOwogICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKQEAgLTg3LDEzICs5NywxMyBAQAogICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOwogICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKICAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7CiAKICAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDQ5NGNlYWMuLjRlMmYyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTIsMTMgKzEyLDEzIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLjIwYmNkYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMzUgKzIwNywzNCBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKICAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CiAgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CkBAIC0yNTMsNyArMjUwLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODIsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTAsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI3LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzEsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA1LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUDNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDIwLDE0ICs0MjMsMTQgQEAKICAgICAgICAgICAgIG1TZWVrZXIpOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDQwLDcgKzQ0Myw3IEBACiAvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKIGNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KIE1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICBNUDNTZWVrZXIgKnNlZWtlcikKICAgICA6IG1NZXRhKG1ldGEpLApAQCAtNDUxLDcgKzQ1NCw2IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CYXNpc1RpbWVVcygwKSwKICAgICAgIG1TYW1wbGVzUmVhZCgwKSB7CiB9CkBAIC00NjIsMTIgKzQ2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKIAogICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwpAQCAtNDc3LDI3ICs0NzcsMjMgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNTA5LDExICs1MDUsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUyNywxMCArNTIzLDEwIEBACiAgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTM5LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NjksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDEzICs1ODQsMTUgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKIApAQCAtNjAyLDM5ICs2MDEsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXBlZyIpOwogCi0gICAgSUQzIGlkMyhtRGF0YVNvdXJjZSk7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIobURhdGFTb3VyY2UpOworICAgIElEMyBpZDMoJmhlbHBlcik7CiAKICAgICBpZiAoIWlkMy5pc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIHN0cnVjdCBNYXAgewotICAgICAgICBpbnQga2V5OworICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzI7CiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgeyBrS2V5QWxidW0sICJUQUxCIiwgIlRBTCIgfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCAiVENPTSIsICJUQ00iIH0sCi0gICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgIHsga0tleVllYXIsICJUWUUiLCAiVFlFUiIgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgIlRQQSIsICJUUE9TIiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCwgIlRQRTEiLCAiVFAxIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9HRU5SRSwgIlRDT04iLCAiVENPIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiwgIlRYVCIsICJURVhUIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sICJUQ1AiLCAiVENNUCIgfSwKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKQEAgLTY1NCw3ICs2NTQsNyBAQAogICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwga01hcFtpXS5rZXksIHMuc3RyaW5nKCkpOwogICAgIH0KIAogICAgIHNpemVfdCBkYXRhU2l6ZTsKQEAgLTY2MiwyOCArNjYyLDI4IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IGlkMy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgIGlmIChkYXRhKSB7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIG1pbWUuc3RyaW5nKCkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsIGRhdGEsIGRhdGFTaXplKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKm1ldGEpIHsKICAgICBNcDNNZXRhICptZXRhRGF0YSA9IHN0YXRpY19jYXN0PE1wM01ldGEgKj4obWV0YSk7Ci0gICAgcmV0dXJuIG5ldyBNUDNFeHRyYWN0b3Ioc291cmNlLCBtZXRhRGF0YSk7CisgICAgcmV0dXJuIHdyYXAobmV3IE1QM0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBtZXRhRGF0YSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKICAgICBvZmY2NF90IHBvc3RfaWQzX3BvczsKICAgICB1aW50MzJfdCBoZWFkZXI7CiAgICAgdWludDhfdCBtcGVnX2hlYWRlcls1XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKGhlbHBlci5yZWFkQXQoMCwgbXBlZ19oZWFkZXIsIHNpemVvZihtcGVnX2hlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKG1wZWdfaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTY5MSw3ICs2OTEsNyBAQAogICAgICAgICBBTE9HVigiTVBFRzFQUyBjb250YWluZXIgaXMgbm90IHN1cHBvcnRlZCEiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICghUmVzeW5jKHNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKKyAgICBpZiAoIVJlc3luYygmaGVscGVyLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTcxMCwxMyArNzEwLDEzIEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiTVAzIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYyID0gU25pZmYgfQogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmgKaW5kZXggNDg1YjBjYS4uMWUzOGFiNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmgKQEAgLTE5LDM1ICsxOSwzNyBAQAogI2RlZmluZSBNUDNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CisKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOwogc3RydWN0IE1QM1NlZWtlcjsKIGNsYXNzIFN0cmluZzg7CiBzdHJ1Y3QgTXAzTWV0YTsKIAotY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1QM0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpOworICAgIE1QM0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpOwogICAgIH5NUDNFeHRyYWN0b3IoKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUDNFeHRyYWN0b3IiOyB9CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAKaW5kZXggNTIzZjE0Yy4uOWViNzJhNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAKQEAgLTI3LDcgKzI3LDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM3LDcgKzM5LDcgQEAKIAogLy8gc3RhdGljCiBWQlJJU2Vla2VyICpWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3BvcykgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CiAgICAgb2ZmNjRfdCBwb3MgPSBwb3N0X2lkM19wb3M7CiAKICAgICB1aW50OF90IGhlYWRlcls0XTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaAppbmRleCA5MjEzZjZlLi41MDc4OTljIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCkBAIC0yNCwxMSArMjQsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBWQlJJU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7CiAgICAgc3RhdGljIFZCUklTZWVrZXIgKkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3Bvcyk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKIAogICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwCmluZGV4IDAxZTA2Y2EuLjlmMWZkN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03OSw3ICs4MSw3IEBACiAKIC8vIHN0YXRpYwogWElOR1NlZWtlciAqWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgewogCiAgICAgdWludDhfdCBidWZmZXJbNF07CiAgICAgaW50IG9mZnNldCA9IGZpcnN0X2ZyYW1lX3BvczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAppbmRleCA1ODY3ZWFlLi45YWNlZTM4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCkBAIC0yMiwxMSArMjIsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBYSU5HU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7CiAgICAgc3RhdGljIFhJTkdTZWVrZXIgKkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3Bvcyk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKIAogICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWEyZTliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcApAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUM0UGFyc2VyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJBQzRQYXJzZXIuaCIKKworI2RlZmluZSBCT09MU1RSKGEpICAoKGEpPyJ0cnVlIjoiZmFsc2UiKQorI2RlZmluZSBCWVRFX0FMSUdOIG1CaXRSZWFkZXIuc2tpcEJpdHMobUJpdFJlYWRlci5udW1CaXRzTGVmdCgpICUgOCkKKyNkZWZpbmUgQ0hFQ0tfQklUU19MRUZUKG4pIGlmIChtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgPCBuKSB7cmV0dXJuIGZhbHNlO30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBQzRQYXJzZXI6OkFDNFBhcnNlcigpIHsKK30KKworQUM0RFNJUGFyc2VyOjpBQzREU0lQYXJzZXIoQUJpdFJlYWRlciAmYnIpCisgICAgOiBtQml0UmVhZGVyKGJyKXsKKworICAgIG1EU0lTaXplID0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpOworfQorCisvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpIFRhYmxlIDc5OiBjaGFubmVsX21vZGUKK3N0YXRpYyBjb25zdCBjaGFyICpDaGFubmVsTW9kZXNbXSA9IHsKKyAgICAibW9ubyIsCisgICAgInN0ZXJlbyIsCisgICAgIjMuMCIsCisgICAgIjUuMCIsCisgICAgIjUuMSIsCisgICAgIjcuMCAoMy80LzApIiwKKyAgICAiNy4xICgzLzQvMC4xKSIsCisgICAgIjcuMCAoNS8yLzApIiwKKyAgICAiNy4xICg1LzIvMC4xKSIsCisgICAgIjcuMCAoMy8yLzIpIiwKKyAgICAiNy4xICgzLzIvMi4xKSIsCisgICAgIjcuMC40IiwKKyAgICAiNy4xLjQiLAorICAgICI5LjAuNCIsCisgICAgIjkuMS40IiwKKyAgICAiMjIuMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBDb250ZW50Q2xhc3NpZmllcltdID0geworICAgICJDb21wbGV0ZSBNYWluIiwKKyAgICAiTXVzaWMgYW5kIEVmZmVjdHMiLAorICAgICJWaXN1YWxseSBJbXBhaXJlZCIsCisgICAgIkhlYXJpbmcgSW1wYWlyZWQiLAorICAgICJEaWFsb2ciLAorICAgICJDb21tZW50YXJ5IiwKKyAgICAiRW1lcmdlbmN5IiwKKyAgICAiVm9pY2UgT3ZlciIKK307CisKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCl7CisgICAgQ0hFQ0tfQklUU19MRUZUKDYpOworICAgIHVpbnQzMl90IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDYpOworICAgIGlmIChuX2xhbmd1YWdlX3RhZ19ieXRlcyA8IDIgfHwgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPj0gNDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDSEVDS19CSVRTX0xFRlQobl9sYW5ndWFnZV90YWdfYnl0ZXMgKiA4KTsKKyAgICBjaGFyIGxhbmd1YWdlX3RhZ19ieXRlc1s0Ml07IC8vIFRTIDEwMyAxOTAgcGFydCAxIDQuMy4zLjguNworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2xhbmd1YWdlX3RhZ19ieXRlczsgaSsrKSB7CisgICAgICAgIGxhbmd1YWdlX3RhZ19ieXRlc1tpXSA9IChjaGFyKW1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICB9CisgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW25fbGFuZ3VhZ2VfdGFnX2J5dGVzXSA9IDA7CisgICAgQUxPR1YoIiV1LiV1OiBsYW5ndWFnZV90YWcgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBsYW5ndWFnZV90YWdfYnl0ZXMpOworCisgICAgc3RkOjpzdHJpbmcgbGFuZ3VhZ2UobGFuZ3VhZ2VfdGFnX2J5dGVzLCBuX2xhbmd1YWdlX3RhZ19ieXRlcyk7CisgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1MYW5ndWFnZSA9IGxhbmd1YWdlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgRS41IGFuZCBUUyAxMDMgMTkwLTIgdjEuMS4xIEUuOQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCl7CisgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgIHVpbnQzMl90IGNoYW5uZWxfbW9kZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgdWludDMyX3QgZHNpX3NmX211bHRpcGxpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogY2hhbm5lbF9tb2RlID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBjaGFubmVsX21vZGUsCisgICAgY2hhbm5lbF9tb2RlIDwgTkVMRU0oQ2hhbm5lbE1vZGVzKSA/IENoYW5uZWxNb2Rlc1tjaGFubmVsX21vZGVdIDogInJlc2VydmVkIik7CisgICAgQUxPR1YoIiV1LiV1OiBkc2lfc2ZfbXVsdGlwbGllciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwKKyAgICAgICAgc3Vic3RyZWFtSUQsIGRzaV9zZl9tdWx0aXBsaWVyKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgQk9PTFNUUihiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikpOworCisgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICBBTE9HVigiJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgIH0KKyAgICBpZiAoY2hhbm5lbF9tb2RlID49IDcgJiYgY2hhbm5lbF9tb2RlIDw9IDEwKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgdWludDMyX3QgYWRkX2NoX2Jhc2UgPSBtQml0UmVhZGVyLmdldEJpdHMoMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYWRkX2NoX2Jhc2UgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBhZGRfY2hfYmFzZSk7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY29udGVudF90eXBlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY29udGVudF90eXBlID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgQk9PTFNUUihiX2NvbnRlbnRfdHlwZSkpOworICAgIGlmIChiX2NvbnRlbnRfdHlwZSkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgIHVpbnQzMl90IGNvbnRlbnRfY2xhc3NpZmllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBjb250ZW50X2NsYXNzaWZpZXIgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBjb250ZW50X2NsYXNzaWZpZXIsIENvbnRlbnRDbGFzc2lmaWVyW2NvbnRlbnRfY2xhc3NpZmllcl0pOworCisgICAgICAgIC8vIEZvciBzdHJlYW1zIGJhc2VkIG9uIFRTIDEwMyAxOTAgcGFydCAxIHRoZSBwcmVzZW50YXRpb24gbGV2ZWwgY2hhbm5lbF9tb2RlIGRvZXNuJ3QKKyAgICAgICAgLy8gZXhpc3QgYW5kIHNvIHdlIHVzZSB0aGUgY2hhbm5lbF9tb2RlIGZyb20gZWl0aGVyIHRoZSBDTSBvciBNJkUgc3Vic3RyZWFtCisgICAgICAgIC8vICh0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNoYW5uZWxNb2RlID09IC0xICYmCisgICAgICAgICAgICAoY29udGVudF9jbGFzc2lmaWVyID09IDAgfHwgY29udGVudF9jbGFzc2lmaWVyID09IDEpKSB7CisgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNoYW5uZWxNb2RlID0gY2hhbm5lbF9tb2RlOworICAgICAgICB9CisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX2xhbmd1YWdlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgQk9PTFNUUihiX2xhbmd1YWdlX2luZGljYXRvcikpOworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIHYxLjEuMSBzZWN0aW9uIEUuMTEKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBncm91cElEKQoreworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfc3Vic3RyZWFtc19wcmVzZW50ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2hzZl9leHQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDgpOworICAgIHVpbnQzMl90IG5fc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICBBTE9HVigiJXUuJXU6IGJfc3Vic3RyZWFtc19wcmVzZW50ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtc19wcmVzZW50KSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2hzZl9leHQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9oc2ZfZXh0KSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jaGFubmVsX2NvZGVkKSk7CisgICAgQUxPR1YoIiV1LiV1OiBuX3N1YnN0cmVhbXMgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIG5fc3Vic3RyZWFtcyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9zdWJzdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBkc2lfc2ZfbXVsdGlwbGllciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgZHNpX3NmX211bHRpcGxpZXIpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgQk9PTFNUUihiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikpOworCisgICAgICAgIGlmIChiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYl9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgdWludDMyX3QgZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2sgPSBtQml0UmVhZGVyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IDB4JTA2eFxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYm9vbCBiX2Fqb2MgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX2Fqb2MgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksIEJPT0xTVFIoYl9ham9jKSk7CisgICAgICAgICAgICBpZiAoYl9ham9jKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgIGJvb2wgYl9zdGF0aWNfZG14ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfc3RhdGljX2RteCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3N0YXRpY19kbXgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJfc3RhdGljX2RteCkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fZG14X29iamVjdHNfbWludXMxID0gbUJpdFJlYWRlci5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fZG14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgbl9kbXhfb2JqZWN0c19taW51czEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgbl91bXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBuX3VteF9vYmplY3RzX21pbnVzMSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgbl91bXhfb2JqZWN0c19taW51czEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDQpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg0KTsgLy8gb2JqZWN0c19hc3NpZ25tZW50X21hc2sKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY29udGVudF90eXBlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY29udGVudF90eXBlID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICVzICgldSlcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICAgICAgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSwgY29udGVudF9jbGFzc2lmaWVyKTsKKworICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNvbnRlbnRDbGFzc2lmaWVyID0gY29udGVudF9jbGFzc2lmaWVyOworCisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX2xhbmd1YWdlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlTGFuZ3VhZ2VUYWcocHJlc2VudGF0aW9uSUQsIGdyb3VwSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZUJpdHJhdGVEc2koKSB7CisgICAgQ0hFQ0tfQklUU19MRUZUKDIgKyAzMiArIDMyKTsKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBiaXRfcmF0ZV9tb2RlCisgICAgbUJpdFJlYWRlci5za2lwQml0cygzMik7IC8vIGJpdF9yYXRlCisgICAgbUJpdFJlYWRlci5za2lwQml0cygzMik7IC8vIGJpdF9yYXRlX3ByZWNpc2lvbgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRTIDEwMyAxOTAtMSBzZWN0aW9uIEUuNCAoYWM0X2RzaSkgYW5kIFRTIDEwMyAxOTAtMiBzZWN0aW9uIEUuNiAoYWM0X2RzaV92MSkKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgdWludDMyX3QgYWM0X2RzaV92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPiAxKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciB3aGlsZSBwYXJzaW5nIGFjLTQgZHNpOiBvbmx5IHZlcnNpb25zIDAgYW5kIDEgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDcgKyAxICsgNCArIDkpOworICAgIHVpbnQzMl90IGJpdHN0cmVhbV92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMSk7IC8vIGZzX2luZGV4CisgICAgbUJpdFJlYWRlci5za2lwQml0cyg0KTsgLy8gZnJhbWVfcmF0ZV9pbmRleAorICAgIHVpbnQzMl90IG5fcHJlc2VudGF0aW9ucyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg5KTsKKworICAgIGludDMyX3Qgc2hvcnRfcHJvZ3JhbV9pZCA9IC0xOworICAgIGlmIChiaXRzdHJlYW1fdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKXsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGFjNCBkc2kiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9wcm9ncmFtX2lkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgaWYgKGJfcHJvZ3JhbV9pZCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2ICsgMSk7CisgICAgICAgICAgICBzaG9ydF9wcm9ncmFtX2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIGJvb2wgYl91dWlkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIGlmIChiX3V1aWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBrQUM0VVVJRFNpemVJbkJ5dGVzID0gMTY7CisgICAgICAgICAgICAgICAgY2hhciBwcm9ncmFtX3V1aWRba0FDNFVVSURTaXplSW5CeXRlc107CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKGtBQzRVVUlEU2l6ZUluQnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga0FDNFVVSURTaXplSW5CeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fdXVpZFtpXSA9IChjaGFyKShtQml0UmVhZGVyLmdldEJpdHMoOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiVVVJRCA9ICVzIiwgcHJvZ3JhbV91dWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICBpZiAoIXBhcnNlQml0cmF0ZURzaSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQllURV9BTElHTjsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IHByZXNlbnRhdGlvbiA9IDA7IHByZXNlbnRhdGlvbiA8IG5fcHJlc2VudGF0aW9uczsgcHJlc2VudGF0aW9uKyspIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJvZ3JhbUlEID0gc2hvcnRfcHJvZ3JhbV9pZDsKKyAgICAgICAgLy8ga25vd24gYXMgYl9zaW5nbGVfc3Vic3RyZWFtIGluIGFjNF9kc2lfdmVyc2lvbiAwCisgICAgICAgIGJvb2wgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jb25maWcgPSAwLCBwcmVzZW50YXRpb25fdmVyc2lvbiA9IDA7CisgICAgICAgIHVpbnQzMl90IHByZXNfYnl0ZXMgPSAwOworCisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyA1ICsgNSk7CisgICAgICAgICAgICBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICB9IGVsc2UgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoOCArIDgpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwcmVzX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgaWYgKHByZXNfYnl0ZXMgPT0gMHhmZikgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNik7CisgICAgICAgICAgICAgICAgcHJlc19ieXRlcyArPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2J5dGVzID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc19ieXRlcyk7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAyKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKHByZXNfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKHByZXNfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFjNF9wcmVzZW50YXRpb25fdjBfZHNpKCksIGFjNF9wcmVzZW50YXRpb25fdjFfZHNpKCkgYW5kIGFjNF9wcmVzZW50YXRpb25fdjJfZHNpKCkKKyAgICAgICAgICAgIC8vIGFsbCBzdGFydCB3aXRoIGEgcHJlc2VudGF0aW9uX2NvbmZpZyBvZiA1IGJpdHMKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jb25maWcgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSAocHJlc2VudGF0aW9uX2NvbmZpZyA9PSAweDFmKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpQcmVzZW50YXRpb25Db25maWdbXSA9IHsKKyAgICAgICAgICAgICJNdXNpYyZFZmZlY3RzICsgRGlhbG9nIiwKKyAgICAgICAgICAgICJNYWluICsgREUiLAorICAgICAgICAgICAgIk1haW4gKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIk11c2ljJkVmZmVjdHMgKyBEaWFsb2cgKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIk1haW4gKyBERSArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiQXJiaXRyYXJ5IHN1YnN0cmVhbSBncm91cHMiLAorICAgICAgICAgICAgIkVNREYgb25seSIKKyAgICAgICAgfTsKKyAgICAgICAgQUxPR1YoIiV1OiBiX3NpbmdsZV9zdWJzdHJlYW0vZ3JvdXAgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgQk9PTFNUUihiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXApKTsKKyAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fdmVyc2lvbiA9ICV1XG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl92ZXJzaW9uKTsKKyAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fY29uZmlnID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fY29uZmlnLAorICAgICAgICAgICAgKHByZXNlbnRhdGlvbl9jb25maWcgPj0gTkVMRU0oUHJlc2VudGF0aW9uQ29uZmlnKSA/CisgICAgICAgICAgICAicmVzZXJ2ZWQiIDogUHJlc2VudGF0aW9uQ29uZmlnW3ByZXNlbnRhdGlvbl9jb25maWddKSk7CisKKyAgICAgICAgLyogcmVjb3JkIGEgbWFya2VyLCBsZXNzIHRoZSBzaXplIG9mIHRoZSBwcmVzZW50YXRpb25fY29uZmlnICovCisgICAgICAgIHVpbnQ2NF90IHN0YXJ0ID0gKG1EU0lTaXplIC0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpKSAvIDg7CisKKyAgICAgICAgYm9vbCBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgJiYgcHJlc2VudGF0aW9uX2NvbmZpZyA9PSA2KSB7CisgICAgICAgICAgICBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMgKyAxKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1kY29tcGF0ID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBtZGNvbXBhdCA9ICVkXG4iLCBwcmVzZW50YXRpb24sIG1kY29tcGF0KTsKKworICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4KSk7CisgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tR3JvdXBJbmRleCA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUdyb3VwSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICAgICAgdWludDMyX3QgZHNpX2ZyYW1lX3JhdGVfbXVsdGlwbHlfaW5mbyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX2ZyYW1lX3JhdGVfbXVsdGlwbHlfaW5mbyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgZHNpX2ZyYW1lX3JhdGVfbXVsdGlwbHlfaW5mbyk7CisgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEgJiYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8gPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9rZXlfaWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTApOworICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbik7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9rZXlfaWQgPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fa2V5X2lkKTsKKworICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tQ2hhbm5lbE1vZGUgPSBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA9ICVkICglcylcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlIDwgTkVMRU0oQ2hhbm5lbE1vZGVzKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbE1vZGVzW2RzaV9wcmVzZW50YXRpb25fY2hfbW9kZV0gOiAicmVzZXJ2ZWQiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA+PSAxMSAmJiBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPD0gMTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzX3RvcF9jaGFubmVsX3BhaXJzID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfdG9wX2NoYW5uZWxfcGFpcnMgPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzX3RvcF9jaGFubmVsX3BhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrIGluIGFjNF9wcmVzZW50YXRpb25fdjBfZHNpKCkKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDI0KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFza192MSA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFza192MSA9IDB4JTA2eFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFza192MSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAxIHx8IHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cygyKTsgLy8gZHNpX3ByZXNlbnRhdGlvbl9jaGFubmVsX21vZGVfY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9maWx0ZXIgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2ZpbHRlcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2VuYWJsZV9wcmVzZW50YXRpb24gPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiX2VuYWJsZV9wcmVzZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1FbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX2VuYWJsZV9wcmVzZW50YXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fZmlsdGVyX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fZmlsdGVyX2J5dGVzICogOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9maWx0ZXJfYnl0ZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoOCk7IC8vIGZpbHRlcl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIGFjNF9kc2lfdmVyc2lvbiA9PSAxICovCisKKyAgICAgICAgICAgIGlmIChiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tdWx0aV9waWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfbXVsdGlfcGlkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX211bHRpX3BpZCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2hzZl9leHQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfaHNmX2V4dCA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9oc2ZfZXh0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlc2VudGF0aW9uX2NvbmZpZykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIgPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzZyA9IDA7IHNnIDwgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiArIDI7IHNnKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCBzZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNyk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fc2tpcF9ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fc2tpcF9ieXRlcyAqIDgpCisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuX3NraXBfYnl0ZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDEpOworICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVfdmlydHVhbGl6ZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubVByZVZpcnR1YWxpemVkID0gYl9wcmVfdmlydHVhbGl6ZWQ7CisgICAgICAgICAgICAgICAgYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlX3ZpcnR1YWxpemVkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX3ByZV92aXJ0dWFsaXplZCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX2FkZF9lbWRmX3N1YnN0cmVhbXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNyk7CisgICAgICAgICAgICB1aW50MzJfdCBuX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbl9hZGRfZW1kZl9zdWJzdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSArIDEwKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fZW1kZl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9rZXlfaWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTApOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZW1kZl9zdWJzdHJlYW1bJWRdOiB2ZXJzaW9uPSVkLCBrZXlfaWQ9JWRcbiIsIHByZXNlbnRhdGlvbiwgaiwKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyZWFtX2VtZGZfdmVyc2lvbiwgc3Vic3RyZWFtX2tleV9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9IGZhbHNlOworICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9ICVzXG4iLCBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbykpOworICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlQml0cmF0ZURzaSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYm9vbCBiX2FsdGVybmF0aXZlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCJiX2FsdGVybmF0aXZlID0gJXNcbiIsIEJPT0xTVFIoYl9hbHRlcm5hdGl2ZSkpOworICAgICAgICAgICAgaWYgKGJfYWx0ZXJuYXRpdmUpIHsKKyAgICAgICAgICAgICAgICBCWVRFX0FMSUdOOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNik7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbmFtZV9sZW4gPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuYW1lX2xlbiAqIDgpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZwcmVzZW50YXRpb25fbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubURlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWUucmVzaXplKG5hbWVfbGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZVtpXSA9IChjaGFyKShtQml0UmVhZGVyLmdldEJpdHMoOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgbl90YXJnZXRzID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChuX3RhcmdldHMgKiAoMyArIDgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl90YXJnZXRzOyBpKyspeworICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMpOyAvLyB0YXJnZXRfbWRfY29tcGF0CisgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoOCk7IC8vIHRhcmdldF9kZXZpY2VfY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCWVRFX0FMSUdOOworCisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgdWludDY0X3QgZW5kID0gKG1EU0lTaXplIC0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpKSAvIDg7CisgICAgICAgICAgICBpZiAobUJpdFJlYWRlci5udW1CaXRzTGVmdCgpICUgOCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZW5kICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IHByZXNlbnRhdGlvbl9ieXRlcyA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgdWludDY0X3Qgc2tpcF9ieXRlcyA9IHByZXNfYnl0ZXMgLSBwcmVzZW50YXRpb25fYnl0ZXM7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgPSAlIiBQUkl1NjQgIiBieXRlcyIsIHNraXBfYnl0ZXMpOworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKHNraXBfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGtub3cgdGhpcyBvciBzb21ldGhpbmcgaXMgcHJvYmFibHkgd3JvbmcKKyAgICAgICAgLy8gd2l0aCB0aGUgYml0c3RyZWFtIChvciB3ZSBkb24ndCBzdXBwb3J0IGl0KQorICAgICAgICBpZiAobVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tQ2hhbm5lbE1vZGUgPT0gLTEpeworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBkZXRlcm1pbmcgY2hhbm5lbCBtb2RlIG9mIHByZXNlbnRhdGlvbiAlZCIsIHByZXNlbnRhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8qIGVhY2ggcHJlc2VudGF0aW9uICovCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNmUzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQzRfUEFSU0VSX0hfCisjZGVmaW5lIEFDNF9QQVJTRVJfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEFDNFBhcnNlciB7CitwdWJsaWM6CisgICAgQUM0UGFyc2VyKCk7CisgICAgdmlydHVhbCB+QUM0UGFyc2VyKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFyc2UoKSA9IDA7CisKKyAgICBzdHJ1Y3QgQUM0UHJlc2VudGF0aW9uIHsKKyAgICAgICAgaW50MzJfdCBtQ2hhbm5lbE1vZGUgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtUHJvZ3JhbUlEID0gLTE7CisgICAgICAgIGludDMyX3QgbUdyb3VwSW5kZXggPSAtMTsKKworICAgICAgICAvLyBUUyAxMDMgMTkwLTEgdjEuMi4xIDQuMy4zLjguMQorICAgICAgICBlbnVtIENvbnRlbnRDbGFzc2lmaWVycyB7CisgICAgICAgICAgICBrQ29tcGxldGVNYWluLAorICAgICAgICAgICAga011c2ljQW5kRWZmZWN0cywKKyAgICAgICAgICAgIGtWaXN1YWxseUltcGFpcmVkLAorICAgICAgICAgICAga0hlYXJpbmdJbXBhaXJlZCwKKyAgICAgICAgICAgIGtEaWFsb2csCisgICAgICAgICAgICBrQ29tbWVudGFyeSwKKyAgICAgICAgICAgIGtFbWVyZ2VuY3ksCisgICAgICAgICAgICBrVm9pY2VPdmVyCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbUNvbnRlbnRDbGFzc2lmaWVyID0ga0NvbXBsZXRlTWFpbjsKKworICAgICAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpIFRhYmxlIDc5OiBjaGFubmVsX21vZGUKKyAgICAgICAgZW51bSBJbnB1dENoYW5uZWxNb2RlIHsKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9Nb25vLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlX1N0ZXJlbywKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV8zXzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8wLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzVfMSwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzM0LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfNTIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzMyMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzlfMF80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzlfMV80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzIyXzIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfUmVzZXJ2ZWQsCisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtSGFzRGlhbG9nRW5oYW5jZW1lbnRzID0gZmFsc2U7CisgICAgICAgIGJvb2wgbVByZVZpcnR1YWxpemVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgbUVuYWJsZWQgPSB0cnVlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1MYW5ndWFnZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbURlc2NyaXB0aW9uOworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgQUM0UHJlc2VudGF0aW9uPiBBQzRQcmVzZW50YXRpb25zOworCisgICAgY29uc3QgQUM0UHJlc2VudGF0aW9ucyYgZ2V0UHJlc2VudGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1QcmVzZW50YXRpb25zOyB9CisKK3Byb3RlY3RlZDoKKyAgICBBQzRQcmVzZW50YXRpb25zIG1QcmVzZW50YXRpb25zOworfTsKKworY2xhc3MgQUM0RFNJUGFyc2VyOiBwdWJsaWMgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBQzREU0lQYXJzZXIoQUJpdFJlYWRlciAmYnIpOworICAgIHZpcnR1YWwgfkFDNERTSVBhcnNlcigpIHsgfQorCisgICAgYm9vbCBwYXJzZSgpOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKTsKKyAgICBib29sIHBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpOworICAgIGJvb2wgcGFyc2VMYW5ndWFnZVRhZyh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VCaXRyYXRlRHNpKCk7CisKKyAgICB1aW50NjRfdCBtRFNJU2l6ZTsKKyAgICBBQml0UmVhZGVyJiBtQml0UmVhZGVyOworfTsKKworfTsKKworI2VuZGlmICAvLyBBQzRfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAppbmRleCBmMzE2ZGY2Li4xYjMwOGFhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKQEAgLTIsNiArMiw3IEBACiAgICAgbmFtZTogImxpYm1wNGV4dHJhY3Rvcl9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQzRQYXJzZXIuY3BwIiwKICAgICAgICAgIkl0ZW1UYWJsZS5jcHAiLAogICAgICAgICAiTVBFRzRFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCkBAIC0xNCw3ICsxNSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIgogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKaW5kZXggY2E5ZGVhYi4uNTVhMGM0NyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCkBAIC0xOCw3ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKIAogI2luY2x1ZGUgPEl0ZW1UYWJsZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTkyLDcgKzkzLDcgQEAKIAogc3RydWN0IEJveCB7CiBwcm90ZWN0ZWQ6Ci0gICAgQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKKyAgICBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksIG1UeXBlKHR5cGUpIHt9CiAKICAgICB2aXJ0dWFsIH5Cb3goKSB7fQpAQCAtMTA0LDE0ICsxMDUsMTQgQEAKIAogICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIGlubGluZSBEYXRhU291cmNlQmFzZSAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KKyAgICBpbmxpbmUgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KIAogICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKIAogICAgIHN0YXR1c190IHBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHVpbnQzMl90IG1UeXBlOwogfTsKIApAQCAtMTg2LDcgKzE4Nyw3IEBACiAKIHN0cnVjdCBGdWxsQm94IDogcHVibGljIEJveCB7CiBwcm90ZWN0ZWQ6Ci0gICAgRnVsbEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgRnVsbEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1WZXJzaW9uKDApLCBtRmxhZ3MoMCkge30KIAogICAgIGlubGluZSB1aW50OF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtVmVyc2lvbjsgfQpAQCAtMjIxLDcgKzIyMiw3IEBACiAvLwogCiBzdHJ1Y3QgUGl0bUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBQaXRtQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBQaXRtQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJykpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKQEAgLTMwMSw3ICszMDIsNyBAQAogfTsKIAogc3RydWN0IElsb2NCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSWxvY0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgSWxvY0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqaXRlbUxvY3MpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpKSwKICAgICAgICAgbUl0ZW1Mb2NzKGl0ZW1Mb2NzKSwgbUhhc0NvbnN0cnVjdE1ldGhvZDEoZmFsc2UpIHt9CiAKQEAgLTQ3MSw3ICs0NzIsNyBAQAogLy8KIAogc3RydWN0IEl0ZW1SZWZlcmVuY2UgOiBwdWJsaWMgQm94LCBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CisgICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGl0ZW1JZFNpemUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1JdGVtSWQoMCksIG1SZWZJZFNpemUoaXRlbUlkU2l6ZSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC02MjYsNyArNjI3LDcgQEAKIH0KIAogc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXJlZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICBJcmVmQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKSksIG1SZWZJZFNpemUoMCksIG1JdGVtUmVmcyhpdGVtUmVmcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC02ODgsNyArNjg5LDcgQEAKIH07CiAKIHN0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElzcGVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIElzcGVCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKSksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTcyNCw3ICs3MjUsNyBAQAogfQogCiBzdHJ1Y3QgSHZjY0JveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIEh2Y2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIEh2Y2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc1Nyw3ICs3NTgsNyBAQAogfQogCiBzdHJ1Y3QgSXJvdEJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElyb3RCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIElyb3RCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpKSwgbUFuZ2xlKDApIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtNzg2LDcgKzc4Nyw3IEBACiB9CiAKIHN0cnVjdCBDb2xyQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgQ29sckJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgQ29sckJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJykpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtODM0LDcgKzgzNSw3IEBACiB9CiAKIHN0cnVjdCBJcG1hQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElwbWFCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICBJcG1hQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTA4LDcgKzkwOSw3IEBACiB9CiAKIHN0cnVjdCBJcGNvQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBjb0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CisgICAgSXBjb0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC05NjUsNyArOTY2LDcgQEAKIH0KIAogc3RydWN0IElwcnBCb3ggOiBwdWJsaWMgQm94IHsKLSAgICBJcHJwQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgSXBycEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAogICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJykpLApAQCAtMTAyMiw3ICsxMDIzLDcgQEAKIH07CiAKIHN0cnVjdCBJbmZlQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIEluZmVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIEluZmVCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKTsKQEAgLTExMjcsNyArMTEyOCw3IEBACiB9CiAKIHN0cnVjdCBJaW5mQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElpbmZCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6CisgICAgSWluZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJykpLAogICAgICAgICBtSXRlbUluZm9zKGl0ZW1JbmZvcyksIG1IYXNHcmlkcyhmYWxzZSkge30KIApAQCAtMTE5Niw3ICsxMTk3LDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUl0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitJdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVByaW1hcnlJdGVtSWQoMCksCiAgICAgICBtSWRhdE9mZnNldCgwKSwKQEAgLTE0NzYsNyArMTQ3Nyw3IEBACiAgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7CiB9CiAKLXNwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CitBTWVkaWFGb3JtYXQgKkl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKICAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTUwMSw2NCArMTUwMiw3OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogCiAgICAgaWYgKGltYWdlLT5pdGVtSWQgPT0gbVByaW1hcnlJdGVtSWQpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAxKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwgMSk7CiAgICAgfQogCiAgICAgQUxPR1YoImltYWdlWyV1XTogc2l6ZSAlZHglZCIsIGltYWdlSW5kZXgsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CiAKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIGltYWdlLT53aWR0aCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKICAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQogICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCiAgICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgMzYwIC0gaW1hZ2UtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOyAvLyBkb24ndCBzZXQgaWYgaW52YWxpZAogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CiAKICAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CiAgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOwogCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJpbWFnZVsldV06IHRodW1ibmFpbDogc2l6ZSAlZHglZCwgaXRlbSBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdGh1bWJuYWlsIGRhdGEgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywgaW1hZ2UtPnJvd3MpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCiAgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQodGlsZUl0ZW1JbmRleCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlV2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwgaW1hZ2UtPndpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogaHZjYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKICAgICB9CiAgICAgcmV0dXJuIG1ldGE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCmluZGV4IDUzNmRjYjAuLmJlODFiNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCkBAIC0xOSwxMyArMTksMTUgQEAKIAogI2luY2x1ZGUgPHNldD4KIAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIE1ldGFEYXRhOwogCiBuYW1lc3BhY2UgaGVpZiB7CkBAIC00NSwxMyArNDcsMTMgQEAKIAogY2xhc3MgSXRlbVRhYmxlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHN0YXR1c190IHBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKICAgICBib29sIGlzVmFsaWQoKSB7IHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkOyB9CiAgICAgdWludDMyX3QgY291bnRJbWFnZXMoKSBjb25zdDsKLSAgICBzcDxNZXRhRGF0YT4gZ2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpOworICAgIEFNZWRpYUZvcm1hdCAqZ2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpOwogICAgIHN0YXR1c190IGZpbmRJbWFnZUl0ZW0oY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCwgdWludDMyX3QgKml0ZW1JbmRleCk7CiAgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbEl0ZW0oY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCwgdWludDMyX3QgKml0ZW1JbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0SW1hZ2VPZmZzZXRBbmRTaXplKApAQCAtNjIsNyArNjQsNyBAQAogICAgIH5JdGVtVGFibGUoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gbUl0ZW1Mb2NzOwogICAgIFZlY3RvcjxJdGVtSW5mbz4gbUl0ZW1JbmZvczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCAyMWNjZjQ0Li4yOTA5YTUwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNiwyNiArMjYsMjcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCiAjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgIkl0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CkBAIC02OCwxMyArNjksMTIgQEAKICAgICBrTWF4QXRvbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAogfTsKIAorY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBzdGF0aWMgY29uc3Qgc2l6ZV90ICBrTWF4UGNtRnJhbWVTaXplID0gODE5MjsKLQotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgIE1QRUc0U291cmNlKEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKQEAgLTgzLDIyICs4MywyMyBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgfk1QRUc0U291cmNlKCk7CiAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1Gb3JtYXQ7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBpbnQzMl90IG1UaW1lc2NhbGU7CiAgICAgc3A8U2FtcGxlVGFibGU+IG1TYW1wbGVUYWJsZTsKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtMTI5LDE2ICsxMzAsMTMgQEAKIAogICAgIGJvb2wgbUlzQVZDOwogICAgIGJvb2wgbUlzSEVWQzsKKyAgICBib29sIG1Jc0FDNDsKICAgICBib29sIG1Jc1BjbTsKICAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CiAKICAgICBib29sIG1TdGFydGVkOwogCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgTWVkaWFCdWZmZXJCYXNlICptQnVmZmVyOwotCi0gICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWZmZXI7CiAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCkBAIC0xNTMsNiArMTUxLDggQEAKICAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncyk7CiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVFbmNyeXB0aW9uKG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICAvLyByZXR1cm5zIC0xIGZvciBpbnZhbGlkIGxheWVyIElECisgICAgaW50MzJfdCBwYXJzZUhFVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyB7CiAgICAgICAgIGVudW0gRmxhZ3MgewpAQCAtMTk4LDE0ICsxOTgsMTQgQEAKIC8vIHBvc3NpYmx5IHdyYXBwaW5nIG11bHRpcGxlIHRpbWVzIHRvIGNvdmVyIGFsbCB0cmFja3MsIGkuZS4KIC8vIEVhY2ggQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSBjYWNoZXMgdGhlIHNhbXBsZXRhYmxlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB0cmFjay4KIAotc3RydWN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgewotICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitjbGFzcyBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKICAgICB2aXJ0dWFsIH5DYWNoZWRSYW5nZWREYXRhU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworICAgIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBmbGFncygpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgc2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2Vzcyk7CiAKQEAgLTIxMyw3ICsyMTMsNyBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgYm9vbCBtT3duc0RhdGFTb3VyY2U7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKQEAgLTIyNSw4ICsyMjUsOSBAQAogICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBDYWNoZWRSYW5nZWREYXRhU291cmNlICYpOwogfTsKIAotQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAorQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCisgICAgOiBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT3duc0RhdGFTb3VyY2UoZmFsc2UpLAogICAgICAgbUNhY2hlZE9mZnNldCgwKSwKICAgICAgIG1DYWNoZWRTaXplKDApLApAQCAtMjM2LDcgKzIzNyw3IEBACiBDYWNoZWRSYW5nZWREYXRhU291cmNlOjp+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpIHsKICAgICBjbGVhckNhY2hlKCk7CiAgICAgaWYgKG1Pd25zRGF0YVNvdXJjZSkgewotICAgICAgICBkZWxldGUgKENhY2hlZFJhbmdlZERhdGFTb3VyY2UqKW1Tb3VyY2U7CisgICAgICAgIGRlbGV0ZSBtU291cmNlOwogICAgIH0KIH0KIApAQCAtMjUwLDEwICsyNTEsNiBAQAogICAgIG1DYWNoZWRTaXplID0gMDsKIH0KIAotc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKLX0KLQogc3NpemVfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtMzE1LDYgKzMxMiw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ2MnLCAnLScsICczJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKKwogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwogCkBAIC0zMjksNiArMzI5LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOworICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnNCcpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIAogICAgICAgICBjYXNlIEZPVVJDQygndCcsICd3JywgJ28nLCAncycpOgogICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3cnLCAndCcpOgpAQCAtMzYyLDEyICszNjQsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLU1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQorTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAogICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCiAgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtQ2FjaGVkU291cmNlKE5VTEwpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCkBAIC0zNzcsNiArMzc4LDcgQEAKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CiAgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworICAgIG1GaWxlTWV0YURhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7CkBAIC0zODQsNiArMzg2LDcgQEAKICAgICB3aGlsZSAodHJhY2spIHsKICAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKIAorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrLT5tZXRhKTsKICAgICAgICAgZGVsZXRlIHRyYWNrOwogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQpAQCAtMzk0LDcgKzM5Nyw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNDAzLDEzICs0MDcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDMwLDE4ICs0MzQsMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00NDksMTUgKzQ1MywxNSBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOwogICAgICAgICBpZiAodHJhY2stPmhhc19lbHN0ICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJgotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSAmJgorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZXJhdGUpKSB7CiAKICAgICAgICAgICAgIC8vIGVsc3QgaGFzIHRvIGJlIHByb2Nlc3NlZCBvbmx5IHRoZSBmaXJzdCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCiAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKQEAgLTQ4MiwyMCArNDg2LDE0IEBACiAgICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIHRyYWNrLT50aW1lc2NhbGU7CiAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CiAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVsYXksIGhhbGZzY2FsZSwgJmRlbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gbUhlYWRlclRpbWVzY2FsZSwgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSBjYWxjdWxhdGVkIGRlbGF5IHNob3VsZCBiZSBzbWFsbCwgYnV0IHNvbWUgYXBwcwotICAgICAgICAgICAgICAgICAgICAgKiBhcHBlYXIgdG8gd3JpdGUgYSBib2d1cyBlZGl0IGxpc3QgdGhhdCBjYXVzZXMgYSByZWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICogbGFyZ2UgZGVsYXksIHJlc3VsdGluZyBpbiBwbGF5YmFjayBwcm9ibGVtcy4KLSAgICAgICAgICAgICAgICAgICAgICogSWdub3JlIHN1Y2ggZWRpdCBsaXN0cy4KLSAgICAgICAgICAgICAgICAgICAgICogKDQwOTYgaXMgZW5vdWdoIHRvIGRyb3AgNCBmdWxsIHNhbXBsZXMpCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBkZWxheSA+IDQwOTYgfHwKLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSB0cmFjay0+dGltZXNjYWxlLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiBJTlQzMl9NQVggfHwKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCBJTlQzMl9NSU4pIHsKICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggYm9ndXMgdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZGVsYXkpOwogCiAgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKICAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKQEAgLTUyNiw4ICs1MjQsOCBAQAogICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZW5kID0gJSIgUFJJZDY0ICIsIHBhZGRpbmcgPSAlIiBQUklkNjQsIHNlZ21lbnRfZW5kLCBwYWRkaW5nKTsKICAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAwOwogICAgICAgICAgICAgaWYgKHBhZGRpbmcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQga0tleUR1cmF0aW9uIGlzKSBtaWdodAotICAgICAgICAgICAgICAgIC8vIGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKKyAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OIGlzKQorICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgogICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTU0NSw3ICs1NDMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJwYWRkaW5nc2FtcGxlcyA9ICUiIFBSSWQ2NCwgcGFkZGluZ3NhbXBsZXMpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgIH0KICAgICB9KCk7CiAKQEAgLTU1NCw3ICs1NTIsNyBAQAogICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gdHJ1ZTsKIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgIC8vIE1QRUcyIHRyYWNrcyBkbyBub3QgcHJvdmlkZSBDU0QsIHNvIHJlYWQgdGhlIHN0cmVhbSBoZWFkZXIKICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSkgewpAQCAtNTY3LDE3ICs1NjUsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiwgaGVhZGVyLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGZhbmN5LCBqdXN0IHBpY2sgYSBmcmFtZSBuZWFyIDEvNHRoIG9mIHRoZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwgZHVyYXRpb24gLyA0KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIGR1cmF0aW9uIC8gNCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKQEAgLTU4NywxNiArNTg3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZXRhID0gdHJhY2stPm1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIHRyYWNrLT5tZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cmVhZE1ldGFEYXRhKCkgewpAQCAtNjMxLDEyICs2MzEsMTQgQEAKICAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OwogICAgICAgICBzaXplX3QgZXhpZlNpemU7CiAgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFLCAoaW50NjRfdClleGlmU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yICh1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBpbWFnZUluZGV4IDwgbUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKTsgaW1hZ2VJbmRleCsrKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKICAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiaGVpZiBpbWFnZSAldSBoYXMgbm8gbWV0YSEiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTY2MSw4ICs2NjMsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxhc3RUcmFjayA9IHRyYWNrOwogCi0gICAgICAgICAgICB0cmFjay0+bWV0YSA9ICoobWV0YS5nZXQoKSk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB0cmFjay0+bWV0YSA9IG1ldGE7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsIGltYWdlSW5kZXgpOwogICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwogICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDEwMDAwMDA7CkBAIC02NzEsMTYgKzY3MywxOCBAQAogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTcwNSw3ICs3MDksNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtOTIxLDggKzkyNSw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBjYWNoZWRTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05NTYsNyArOTYwLDkgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHRyYWNrLT5zdWJzYW1wbGVfZW5jcnlwdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtOTgwLDggKzk4NiwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTEwNTcsNyArMTA2NSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTMzLDEyICsxMTQxLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwogICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgdHlwZSBpcyAnYWxhYycsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdGhlIHBhcmFtZXRlcnMKQEAgLTExNjcsMTEgKzExNzgsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHNQZXJTYW1wbGUgPSBjb29raWVbNV07Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjb29raWVbOV0pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIFUzMl9BVCgmY29va2llWzIwXSkpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKIAogICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgc2l6ZSBvZiBBTEFDIFNwZWNpZmljIEluZm8gKDM2IGJ5dGVzKSBhbmQgdGVybWluYXRvcgogICAgICAgICAgICAgICAgIC8vIGF0b20gKDggYnl0ZXMpLgpAQCAtMTI3MiwxNiArMTI4NiwyMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHRtcEFsZ29yaXRobUlkOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnRtcEFsZ29yaXRobUlkKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmdG1wQWxnb3JpdGhtSWQpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIGRlZmF1bHRJVlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGRlZmF1bHRLZXlJZCwgMTYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29uc3RhbnRJdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgJ2RjaXYnLCBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0YW50SXYtPmRhdGEoKSwgZGVmYXVsdENvbnN0YW50SXYtPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQzMCw4ICsxNDUxLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTQ1OCw4ICsxNDc5LDcgQEAKICAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwogICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZ19jb2RlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0OTMsNyArMTUxMyw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgpAQCAtMTUzMyw5ICsxNTUzLDQwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUHJpb3IgdG8gQVBJIDI5LCB0aGUgbWV0YWRhdGEgdHJhY2sgd2FzIG5vdCBjb21wbGlhbnQgd2l0aCBJU08vSUVDCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMi0yMDE1LiBUaGlzIGxlZCB0byBzb21lIElTTy1jb21wbGlhbnQgcGFyc2VycyBmYWlsaW5nIHRvIHJlYWQgdGhlCisgICAgICAgICAgICAvLyBtZXRhdHJhY2suIEFzIG9mIEFQSSAyOSBhbmQgb253YXJkcywgYSBjaGFuZ2Ugd2FzIG1hZGUgdG8gbWV0YWRhdGEgdHJhY2sgdG8KKyAgICAgICAgICAgIC8vIG1ha2UgaXQgY29tcGxpYW50IHdpdGggdGhlIHN0YW5kYXJkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSB0aGUKKyAgICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcgdHdpY2UuIFRoaXMgYWxsb3dzIGNvbXBsaWFudCBwYXJzZXJzIHRvCisgICAgICAgICAgICAvLyByZWFkIHRoZSBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYW5kIGNvbnRlbnRfZW5jb2RpbmcgZmllbGRzCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBmaXJzdCBtaW1lX3R5cGUgc3RyaW5nLiBUaGUgYWN0dWFsIG1pbWVfZm9ybWF0IGZpZWxkIHdvdWxkIHRoZW4gYmUKKyAgICAgICAgICAgIC8vIHJlYWQgY29ycmVjdGx5IGZyb20gdGhlIHNlY29uZCBzdHJpbmcuIFRoZSBub24tY29tcGxpYW50IEFuZHJvaWQgZnJhbWV3b3JrcworICAgICAgICAgICAgLy8gZnJvbSBBUEkgMjggYW5kIGVhcmxpZXIgd291bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBtaW1lX2Zvcm1hdCBjb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIGFzIGl0IHdvdWxkIG9ubHkgcmVhZCB0aGUgZmlyc3QgbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZy4gVG8gZW5hYmxlCisgICAgICAgICAgICAvLyByZWFkaW5nIG1ldGFkYXRhIHRyYWNrcyBnZW5lcmF0ZWQgZnJvbSBib3RoIHRoZSBub24tY29tcGxpYW50IGFuZCBjb21wbGlhbnQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMsIGEgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZSB0byBzZWUgd2hpY2ggZm9ybWF0IGlzIHVzZWQuCisgICAgICAgICAgICBpbnQgbnVsbF9wb3MgPSAwOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyID0gYnVmZmVyLmdldCgpOworICAgICAgICAgICAgd2hpbGUgKG51bGxfcG9zIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgIGlmICgqKHN0ciArIG51bGxfcG9zKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKytudWxsX3BvczsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG51bGxfcG9zID09IGNodW5rX2RhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzdGFuZGFyZCBvbXBsaWFudCBtZXRhZGF0YSB0cmFjay4KKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbmRhcmQgY29tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRFbmNvZGluZygoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4KSk7CisgICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkgKyA4ICsgY29udGVudEVuY29kaW5nLnNpemUoKSArIDEpLAorICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplIC0gOCAtIGNvbnRlbnRFbmNvZGluZy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE2MTMsMjAgKzE2NjQsMjMgQEAKIAogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgZnJtYSBib3ggbGF0ZXIKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CiAgICAgICAgICAgICAgICAgQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKGNodW5rX3R5cGUsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgc2FtcGxlX3NpemUpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgc2FtcGxlX3NpemUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3QnLCAndycsICdvJywgJ3MnKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5UGNtQmlnRW5kaWFuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCIqKiogY29kaW5nPSclcycgJWQgY2hhbm5lbHMsIHNpemUgJWQsIHJhdGUgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgY2h1bmssIG51bV9jaGFubmVscywgc2FtcGxlX3NpemUsIHNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ2EnLCAnbCcsICdhJywgJ2MnKSkgewogCkBAIC0xNjUyLDExICsxNzA2LDE0IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY29va2llWzldKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5QWxhY01hZ2ljQ29va2llLCBNZXRhRGF0YTo6VFlQRV9OT05FLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY29va2llWzldKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIFUzMl9BVCgmY29va2llWzIwXSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOwogICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihjb29raWUpOwogICAgICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKICAgICAgICAgICAgICAgICBDSEVDS19FUSgqb2Zmc2V0LCBzdG9wX29mZnNldCk7CkBAIC0xNzE0LDEwICsxNzcxLDExIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAndicpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTgwNSwxMiArMTg2MywxNSBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgibWF4IHNhbXBsZSBzaXplIHRvbyBiaWc6ICV6dSIsIG1heF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSArIDEwICogMik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSArIDEwICogMik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIHNpemUgd2FzIHNwZWNpZmllZC4gUGljayBhIGNvbnNlcnZhdGl2ZWx5IGxhcmdlIHNpemUuCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlXaWR0aCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKLSAgICAgICAgICAgICAgICAgICAgIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlIZWlnaHQsKGludDMyX3QqKSAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCopJndpZHRoKSB8fAorICAgICAgICAgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsKGludDMyX3QqKSAmaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm8gd2lkdGggb3IgaGVpZ2h0LCBhc3N1bWluZyB3b3JzdCBjYXNlIDEwODBwIik7CiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTA4MDsKQEAgLTE4MjUsNyArMTg4Niw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhdWRpbywgdXNlIDEyOEtCCiAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gMTAyNCAqIDEyODsKQEAgLTE4NDIsMjYgKzE5MDMsMjggQEAKICAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgogICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTk9URTogc2V0dGluZyBhbm90aGVyIHBpZWNlIG9mIG1ldGFkYXRhIGludmFsaWRhdGVzIGFueSBwb2ludGVycyAoc3VjaCBhcyB0aGUKICAgICAgICAgICAgIC8vIG1pbWV0eXBlKSBwcmV2aW91c2x5IG9idGFpbmVkLCBzbyBkb24ndCBjYWNoZSB0aGVtLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBmcmFtZSByYXRlLgogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgblNhbXBsZXMgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Y291bnRTYW1wbGVzKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5TYW1wbGVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJnRyYWNrSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgLyB0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTg2OSwxNSArMTkzMiwxOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAoblNhbXBsZXMgKiAxMDAwMDAwTEwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdXJhdGlvblVzID4+IDEpKSAvIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIGZyYW1lIGNvdW50ICV6dSIsIG5TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVDb3VudCwgblNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCBuU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xOTg1LDcgKzIwNTEsNyBAQAogICAgICAgICAgICAgaWYgKGJ1ZmZlcltsZW4gLSAxXSAhPSAnLycpIHsKICAgICAgICAgICAgICAgICBidWZmZXJbbGVuXSA9ICcvJzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TG9jYXRpb24sICZidWZmZXJbMF0pOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OLCAmYnVmZmVyWzBdKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTIwMTUsOCArMjA4MSw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCiAgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKICAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKQEAgLTIwNDAsNyArMjEwNiw4IEBACiAgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKICAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMDY3LDEwICsyMTM0LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbNF0pOwogICAgICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKICAgICAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjA5NCw4ICsyMTYzLDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIxMTYsOCArMjE4NSw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTIxNTIsNyArMjIyMSw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjI4MCwxNSArMjM1MCwxNSBAQAogICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwICYmIGR1cmF0aW9uIDwgVUlOVDY0X01BWCAvIDEwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBzOwogICAgICAgICAgICAgaWYgKGNvbnZlcnRUaW1lVG9EYXRlKGNyZWF0aW9uVGltZSwgJnMpKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlEYXRlLCBzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfREFURSwgcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjMzMCw3ICsyNDAwLDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM2NCw3ICsyNDM1LDggQEAKICAgICAgICAgICAgIC8vIGZvciBhIHByYWN0aWNhbCByZWFzb24gYXMgdmFyaW91cyBNUEVHNCBjb250YWluZXJzIHVzZSBpdC4KICAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygndCcsICdlJywgJ3gnLCAndCcpIHx8IHR5cGUgPT0gRk9VUkNDKCdzJywgJ2InLCAndCcsICdsJykpIHsKICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0yNDA4LDExICsyNDgwLDEwIEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgICAgIHNpemVfdCBzaXplID0gMDsKLSAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kRGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgICAgIHNpemUgPSAwOwogICAgICAgICAgICAgfQogCkBAIC0yNDM5LDggKzI1MTAsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5VGV4dEZvcm1hdERhdGEsIDAsIGJ1ZmZlciwgc2l6ZSArIGNodW5rX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEsIGJ1ZmZlciwgc2l6ZSArIGNodW5rX3NpemUpOwogCiAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CiAKQEAgLTI0NzIsOCArMjU0Myw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAogICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSArIGtTa2lwQnl0ZXNPZkRhdGFCb3gsIGNodW5rX2RhdGFfc2l6ZSAtIGtTa2lwQnl0ZXNPZkRhdGFCb3gpOwogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI1NDcsNyArMjYxOCwxOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnMycpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VBQzNTYW1wbGVFbnRyeShkYXRhX29mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBQzNTcGVjaWZpY0JveChkYXRhX29mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnZScsICdjJywgJy0nLCAnMycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VFQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnYycsICctJywgJzQnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUM0U3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAndCcsICd5JywgJ3AnKToKQEAgLTI2MjEsMzYgKzI3MDQsMzI4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCkgeworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSkgewogICAgIC8vIHNraXAgMTYgYnl0ZXM6CiAgICAgLy8gICsgNi1ieXRlIHJlc2VydmVkLAogICAgIC8vICArIDItYnl0ZSBkYXRhIHJlZmVyZW5jZSBpbmRleCwKICAgICAvLyAgKyA4LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gMTY7Ci0gICAgdWludDE2X3QgY2hhbm5lbENvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZjaGFubmVsQ291bnQpKSB7CisgICAgKm9mZnNldCArPSAxNjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgY2hhbm5lbENvdW50KSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgc2FtcGxlIGVudHJ5IGJveDogY2Fubm90IHJlYWQgY2hhbm5lbCBjb3VudCIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICAvLyBza2lwIDggYnl0ZXM6CiAgICAgLy8gICsgMi1ieXRlIGNoYW5uZWxDb3VudCwKICAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlIHNpemUsCiAgICAgLy8gICsgNC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDg7Ci0gICAgdWludDE2X3Qgc2FtcGxlUmF0ZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmc2FtcGxlUmF0ZSkpIHsKLSAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CisgICAgKm9mZnNldCArPSA4OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNigqb2Zmc2V0LCBzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgc2FtcGxlIGVudHJ5IGJveDogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0KICAgICAvLyBza2lwIDQgYnl0ZXM6CiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZVJhdGUsCiAgICAgLy8gICsgMi1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgcmV0dXJuIHBhcnNlQUMzU3BlY2lmaWNCb3gob2Zmc2V0LCBzYW1wbGVSYXRlKTsKKyAgICAqb2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveCgKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDNFNwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxDb3VudCwgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtBQzRNaW5pbXVtQm94U2l6ZSA9IDQgKyA0ICsgMzsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwgc2l6ZSA8IGtBQzRNaW5pbXVtQm94U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBibG9jazogY2Fubm90IHJlYWQgc3BlY2lmaWMgYm94IHNpemUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnYScsICdjJywgJzQnKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkYWM0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIG9mZnNldCArPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplID0gMTE3NjsKKyAgICB1aW50OF90IGNodW5rW2tBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplXTsKKyAgICBzc2l6ZV90IGRzaVNpemUgPSBzaXplIC0gODsgLy8gc2l6ZSBvZiBib3ggLSBzaXplIGFuZCB0eXBlIGZpZWxkcworICAgIGlmIChkc2lTaXplID49IChzc2l6ZV90KWtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplIHx8CisgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgZHNpU2l6ZSkgIT0gZHNpU2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyArIHNpemUtYnl0ZSBwYXlsb2FkCisgICAgb2Zmc2V0ICs9IGRzaVNpemU7CisgICAgQUJpdFJlYWRlciBicihjaHVuaywgZHNpU2l6ZSk7CisgICAgQUM0RFNJUGFyc2VyIHBhcnNlcihicik7CisgICAgaWYgKCFwYXJzZXIucGFyc2UoKSl7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcGFyc2luZyBhYy00IHNwZWNpZmljIGJsb2NrIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gcHJlc2VudGF0aW9uczsKKyAgICAvLyB0cmFuc2xhdGUgdGhlIEFDNCBwcmVzZW50YXRpb24gaW5mb3JtYXRpb24gdG8gYXVkaW8gcHJlc2VudGF0aW9ucyBmb3IgdGhpcyB0cmFjaworICAgIEFDNERTSVBhcnNlcjo6QUM0UHJlc2VudGF0aW9ucyBhYzRQcmVzZW50YXRpb25zID0gcGFyc2VyLmdldFByZXNlbnRhdGlvbnMoKTsKKyAgICBpZiAoIWFjNFByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjNFByZXNlbnRhdGlvbiA6IGFjNFByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXNlbnRhdGlvbiA9IGFjNFByZXNlbnRhdGlvbi5zZWNvbmQ7CisgICAgICAgICAgICBpZiAoIXByZXNlbnRhdGlvbi5tRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgIGFwLm1QcmVzZW50YXRpb25JZCA9IHByZXNlbnRhdGlvbi5tR3JvdXBJbmRleDsKKyAgICAgICAgICAgIGFwLm1Qcm9ncmFtSWQgPSBwcmVzZW50YXRpb24ubVByb2dyYW1JRDsKKyAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IHByZXNlbnRhdGlvbi5tTGFuZ3VhZ2U7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uLm1QcmVWaXJ0dWFsaXplZCkgeworICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX0hFQURQSE9ORTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb24ubUNoYW5uZWxNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV9Nb25vOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfU3RlcmVvOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1RFUkVPOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8zXzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV81XzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV81XzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfMzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfNTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNTI6CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9TVVJST1VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV85XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzIyXzI6CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl8zRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtb2RlIGluIEFDNCBwcmVzZW50YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVmlzdWFsbHlJbXBhaXJlZCk7CisgICAgICAgICAgICBhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gKHByZXNlbnRhdGlvbi5tQ29udGVudENsYXNzaWZpZXIgPT0KKyAgICAgICAgICAgICAgICAgICAgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtWb2ljZU92ZXIpOworICAgICAgICAgICAgYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBwcmVzZW50YXRpb24ubUhhc0RpYWxvZ0VuaGFuY2VtZW50czsKKyAgICAgICAgICAgIGlmICghYXAubUxhbmd1YWdlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhcC5tTGFiZWxzLmVtcGxhY2UoYXAubUxhbmd1YWdlLCBwcmVzZW50YXRpb24ubURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXNlbnRhdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAvLyBDbGVhciBhdWRpbyBwcmVzZW50YXRpb24gaW5mbyBpbiBtZXRhZGF0YS4KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBudWxscHRyLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0U3RyZWFtKHN0ZDo6aW9zOjpvdXQpOworICAgICAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMocHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywKKyAgICAgICAgICAgICAgICBvdXRTdHJlYW0uc3RyKCkuZGF0YSgpLCBvdXRTdHJlYW0uc3RyKCkuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplID0gMTE7CisgICAgLy8gMTMgKyAzICsgKDggKiAoMiArIDUgKyA1ICsgMyArIDEgKyAzICsgNCArICgxNCAqIDkgKyAxKSkpIGJpdHMgPT0gMTUyIGJ5dGVzIHRoZW9yZXRpY2FsIG1heAorICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVxdWlyZWQgYml0cyByZWFkIGJlbG93IGFzIHdlbGwgYXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGVwZW5kZW50CisgICAgLy8gYW5kIGRlcGVuZGFudCBzdWIgc3RyZWFtcyB5b3UgY2FuIGhhdmUKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSA9IDE1MjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwKKyAgICAgICAgc2l6ZSA8IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplIHx8CisgICAgICAgIHNpemUgPiBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnZScsICdjJywgJzMnKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGVjMyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQ4X3QqIGNodW5rID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZV07CisgICAgaWYgKGNodW5rID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBzaXplKTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1bnNpZ25lZCBkYXRhX3JhdGUgPSBici5nZXRCaXRzKDEzKTsKKyAgICBBTE9HVigiRUFDMyBkYXRhIHJhdGUgPSAlZCIsIGRhdGFfcmF0ZSk7CisKKyAgICB1bnNpZ25lZCBudW1faW5kX3N1YiA9IGJyLmdldEJpdHMoMykgKyAxOworICAgIEFMT0dWKCJFQUMzIGluZGVwZW5kYW50IHN1YnN0cmVhbXMgPSAlZCIsIG51bV9pbmRfc3ViKTsKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IChudW1faW5kX3N1YiAqIDIzKSkgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1faW5kX3N1YjsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGZzY29kID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgaWYgKGZzY29kID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgZnNjb2QgKDMpIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgYm94U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIGlmIChib3hTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzYW1wbGUgcmF0ZSBtaXNtYXRjaDogYm94U2FtcGxlUmF0ZSA9ICVkLCBzYW1wbGVSYXRlID0gJWQiLAorICAgICAgICAgICAgICAgIGJveFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgYnNpZCA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgIGlmIChic2lkIDwgOCkgeworICAgICAgICAgICAgQUxPR1coIkluY29ycmVjdCBic2lkIGluIEVBQzMgaGVhZGVyLiBQb3NzaWJseSBBQy0zPyIpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcAorICAgICAgICBici5za2lwQml0cygyKTsKKyAgICAgICAgdW5zaWduZWQgYnNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoImJzbW9kID0gJWQsIGFjbW9kID0gJWQsIGxmZW9uID0gJWQiLCBic21vZCwgYWNtb2QsIGxmZW9uKTsKKworICAgICAgICBici5za2lwQml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbnVtX2RlcF9zdWIgPSBici5nZXRCaXRzKDQpOworICAgICAgICBBTE9HVigiRUFDMyBkZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2RlcF9zdWIpOworICAgICAgICBpZiAobnVtX2RlcF9zdWIgIT0gMCkgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA5KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjaGFuX2xvY190YmxbXSA9IHsgIkxjL1JjIiwiTHJzL1JycyIsIkNzIiwiVHMiLCJMc2QvUnNkIiwKKyAgICAgICAgICAgICAgICAiTHcvUnciLCJMdmgvUnZoIiwiQ3ZoIiwiTGZlMiIgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5fbG9jID0gYnIuZ2V0Qml0cyg5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1hc2sgPSAxOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDk7IGorKywgbWFzayA8PD0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoY2hhbl9sb2MgJiBtYXNrKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSAyIGNoYW5uZWxzIGluIHRoZSBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwIHx8IGogPT0gMSB8fCBqID09IDQgfHwgaiA9PSA1IHx8IGogPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgJXMiLCBjaGFuX2xvY190Ymxbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSAhPSAwKSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIG1hc2sgPSBici5nZXRCaXRzKDgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCgweDEgPDwgaSkgJiYgbWFzaykgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV4aXR5ID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGEgSk9DIHN0cmVhbSB3aXRoIGNvbXBsZXhpdHkgPSAlZCIsIGNvbXBsZXhpdHkpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDgpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBkZWxldGVbXSBjaHVuazsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAvLyArIDQtYnl0ZSBzaXplCiAgICAgLy8gKyA0LWJ5dGUgdHlwZQpAQCAtMjcwNSwxMiArMzA4MCw5IEBACiAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwogCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI4MzAsOCArMzIwMiw5IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKLSAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjkyOSw3ICszMzAyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgKihmbG9hdCAqKSZ2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFLCAqKGZsb2F0ICopJnZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IDY3ICYmIGRhdGFTaXplID49IDQpIHsKICAgICAgICAgLy8gQkUgc2lnbmVkIGludDMyCkBAIC0yOTM4LDcgKzMzMTEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQsIHZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZApAQCAtMjk5Miw3ICszMzY2LDcgQEAKICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpZCk7CiAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CkBAIC0zMDI4LDE1ICszNDAyLDE1IEBACiAgICAgfQogCiAgICAgaWYgKHJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgcm90YXRpb25EZWdyZWVzKTsKICAgICB9CiAKICAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgorICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IEFNRURJQUZPUk1BVF9LRVlfV0lEVEggYW5kIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULgogICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CiAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaGVpZ2h0ID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCB3aWR0aCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGhlaWdodCA+PiAxNik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zMDY0LDU0ICszNDM4LDUwIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOwogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBjaGFyIGNodW5rWzVdOwogICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbNF0sIGNodW5rKTsKICAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdBJywgJ1InLCAnVCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBcnRpc3Q7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnQScsICdSJywgJ1QnKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnRpc3Q7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bWFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZCcsICdhJywgJ3knKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInllYXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ24nLCAnYScsICdtJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ3cnLCAncicsICd0Jyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2cnLCAnZScsICduJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiZ2VucmUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAncCcsICdpJywgJ2wnKToKQEAgLTMxMjEsNyArMzQ5MSw3IEBACiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWJ1ZmZlcltzaXplIC0gMV0pOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDb21waWxhdGlvbiwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04sIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzEzMyw3ICszNTAzLDcgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsVHJhY2tzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBUcmFjayksIG50b2hzKCpwVG90YWxUcmFja3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTQ1LDcgKzM1MTUsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxEaXNjcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwRGlzYyksIG50b2hzKCpwVG90YWxEaXNjcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlEaXNjTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxODksOCArMzU1OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMzIwNSwxMiArMzU3NywxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJiAhbUZpbGVNZXRhRGF0YS5oYXNEYXRhKG1ldGFkYXRhS2V5KSkgewotICAgICAgICBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICB2b2lkICp0bXBEYXRhOworICAgIHNpemVfdCB0bXBEYXRhU2l6ZTsKKyAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmCisgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgJnRtcERhdGEsICZ0bXBEYXRhU2l6ZSkpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJhbGJ1bWFydCIpKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LAogICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyA4LCBzaXplIC0gOCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUdlbnJlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtZXRhZGF0YUtleSwgImdlbnJlIikpIHsKICAgICAgICAgICAgIGlmIChmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gdWludDhfdCBnZW5yZSBjb2RlLCBpVHVuZXMgZ2VucmUgY29kZXMgYXJlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YW5kYXJkIGlkMyBjb2RlcywgZXhjZXB0IHRoZXkgc3RhcnQKQEAgLTMyMjQsMTggKzM1OTgsMTggQEAKICAgICAgICAgICAgICAgICBjaGFyIGdlbnJlWzEwXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKGdlbnJlLCAiJWQiLCBnZW5yZWNvZGUpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCBnZW5yZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgZ2VucmUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIGdlbnJlIHN0cmluZwogICAgICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjY1LDIxICszNjM5LDMxIEBACiAgICAgaW50MzJfdCB0eXBlID0gVTMyX0FUKCZidWZmZXJbMF0pOwogICAgIGlmICgodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSAmJiBzaXplID49IDExKQogICAgICAgICAgICAgfHwgKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICdjJykgJiYgc2l6ZSA+PSAxMCkpIHsKLSAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7Ci0gICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOwotICAgICAgICBib29sIGZ1bGxSYW5nZSA9ICh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpKSAmJiAoYnVmZmVyWzEwXSAmIDEyOCk7Ci0KLSAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKLSAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7Ci0KICAgICAgICAgLy8gb25seSBzdG9yZSB0aGUgZmlyc3QgY29sb3Igc3BlY2lmaWNhdGlvbgotICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuaGFzRGF0YShrS2V5Q29sb3JQcmltYXJpZXMpKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JSYW5nZSwgYXNwZWN0cy5tUmFuZ2UpOworICAgICAgICBpbnQzMl90IGV4aXN0aW5nQ29sb3I7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgJmV4aXN0aW5nQ29sb3IpKSB7CisgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CisgICAgICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKKyAgICAgICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpICYmIChidWZmZXJbMTBdICYgMTI4KTsKKworICAgICAgICAgICAgaW50MzJfdCByYW5nZSA9IDA7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAwOworICAgICAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisKKyAgICAgICAgICAgIGlmIChyYW5nZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsIHJhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFuZGFyZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFuc2ZlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzMwNiwyNiArMzY5MCwyNiBAQAogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBzd2l0Y2ggKG1QYXRoW2RlcHRoXSkgewogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdpJywgJ3QnLCAnbCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInRpdGxlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2UnLCAncicsICdmJyk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd1JywgJ3QnLCAnaCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ3cml0ZXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgpAQCAtMzMzNCwxMCArMzcxOCwxMCBAQAogICAgICAgICAgICAgICBjaGFyIHRtcFs0XTsKICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIGJ1ZmZlcltzaXplIC0gMV0pOwogCi0gICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKQEAgLTMzNTUsNyArMzczOSw3IEBACiAgICAgICAgICAgICBpZiAoeWVhciA8IDEwMDAwKSB7CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIHllYXIpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMzNjQsNyArMzc0OCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7CisgICAgaWYgKG1ldGFkYXRhS2V5KSB7CiAgICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKICAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7CiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwpAQCAtMzQwMCwxMSArMzc4NCwxMSBAQAogCiAgICAgICAgIGlmIChpc1VURjgpIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgogICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNDE5LDI3ICszODAzLDI5IEBACiAKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgICAgIGludCBrZXk7CisgICAgICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVJUSVNULCAiVFBFMSIsICJUUDEiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0dFTlJFLCAiVENPTiIsICJUQ08iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SLCAiVFhUIiwgIlRFWFQiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgIlRDUCIsICJUQ01QIiB9LAogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCisgICAgICAgIHZvaWQgKnRtcERhdGE7CisgICAgICAgIHNpemVfdCB0bXBEYXRhU2l6ZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoIW1GaWxlTWV0YURhdGEuaGFzRGF0YShrTWFwW2ldLmtleSkpIHsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgJnRtcERhdGEsICZ0bXBEYXRhU2l6ZSkpIHsKICAgICAgICAgICAgICAgICBJRDM6Okl0ZXJhdG9yICppdCA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywga01hcFtpXS50YWcxKTsKICAgICAgICAgICAgICAgICBpZiAoaXQtPmRvbmUoKSkgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQ7CkBAIC0zNDU1LDcgKzM4NDEsNyBAQAogICAgICAgICAgICAgICAgIGl0LT5nZXRTdHJpbmcoJnMpOwogICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzQ2NCwxMyArMzg1MCwxMiBAQAogICAgICAgICBjb25zdCB2b2lkICpkYXRhID0gaWQzLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOwogCiAgICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgbWltZS5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsIGRhdGEsIGRhdGFTaXplKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotTWVkaWFUcmFjayAqTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIHN0YXR1c190IGVycjsKICAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM0OTMsNyArMzg3OCw3IEBACiAKICAgICBUcmV4ICp0cmV4ID0gTlVMTDsKICAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJnRyYWNrSWQpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKICAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKQEAgLTM1MDksMTYgKzM4OTQsMTUgQEAKICAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlenUiLCBtUHNzaC5zaXplKCkpOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBzcDxJdGVtVGFibGU+IGl0ZW1UYWJsZTsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM1MjksMTAgKzM5MTMsOSBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCkBAIC0zNTU5LDI2ICszOTQyLDIyIEBACiAvLyBzdGF0aWMKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spIHsKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNjYzLDcgKzQwNDIsNyBAQAogICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTM2ODAsMTAgKzQwNTksMTIgQEAKICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IDA7CiAgICAgICAgIGVzZHMuZ2V0Qml0UmF0ZSgmbWF4Qml0cmF0ZSwgJmF2Z0JpdHJhdGUpOwogICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzcyNyw3ICs0MTA4LDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIC8va2VlcCBBT1QgdHlwZQotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIG9iamVjdFR5cGUpOwogCiAgICAgdWludDMyX3QgZnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKIApAQCAtMzc0OCw3ICs0MTI5LDcgQEAKICAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRibCAxLjEzCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlIF9fdW51c2VkOwpAQCAtMzc2NSw3ICs0MTQ2LDcgQEAKICAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CiAgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KLSAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwga0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwogICAgIH0KIAogICAgIHN3aXRjaCAobnVtQ2hhbm5lbHMpIHsKQEAgLTM5MTgsMjQgKzQyOTksMjUgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZwcmV2U2FtcGxlUmF0ZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmcHJldlNhbXBsZVJhdGUpKTsKIAogICAgIGlmIChwcmV2U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBzYW1wbGUgcmF0ZSBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOwogCiAgICAgaW50MzJfdCBwcmV2Q2hhbm5lbENvdW50OwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZwcmV2Q2hhbm5lbENvdW50KSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZwcmV2Q2hhbm5lbENvdW50KSk7CiAKICAgICBpZiAocHJldkNoYW5uZWxDb3VudCAhPSBudW1DaGFubmVscykgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbCBjb3VudCBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtQ2hhbm5lbHMpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzk0Myw4ICs0MzI1LDggQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LApAQCAtMzk3MSw0NiArNDM1Myw0OSBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCiAgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCksCiAgICAgICBtSXNIZWlmKGl0ZW1UYWJsZSAhPSBOVUxMKSwKICAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJm1EZWZhdWx0SVZTaXplKTsKKyAgICB2b2lkICprZXk7CiAgICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKICAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKICAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CiAgICAgfQogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKIAogICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMjAsMTAgKzQ0MDUsOSBAQAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogICAgIH0gZWxzZSBpZiAobUlzSEVWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMzgsMjMgKzQ0MjIsMjUgQEAKICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOwotICAgICAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKTsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdHNQZXJTYW1wbGUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSk7CiAKICAgICAgICAgaW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgPj4gMzsKICAgICAgICAgaW50MzJfdCBwY21TYW1wbGVTaXplID0gYnl0ZXNQZXJTYW1wbGUgKiBudW1DaGFubmVsczsKIAogICAgICAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhTYW1wbGVTaXplKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgeworICAgICAgICBpZiAoZXJyICE9IE9LIHx8IG1heFNhbXBsZVNpemUgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwY21TYW1wbGVTaXplKQorICAgICAgICAgICAgICAgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgewogICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZAogICAgICAgICAgICAgbUlzUGNtID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRm9ybWF0LnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDSyhmb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmbVRyYWNrSWQpKTsKIAogfQogCkBAIC00MDc0LDIxICs0NDYwLDEzIEBACiAgICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJnZhbCkKLSAgICAgICAgJiYgdmFsICE9IDApIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKLSAgICB9Ci0KICAgICBpbnQzMl90IHRtcDsKLSAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmdG1wKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZ0bXApKTsKICAgICBzaXplX3QgbWF4X3NpemUgPSB0bXA7CiAKICAgICAvLyBBIHNvbWV3aGF0IGFyYml0cmFyeSBsaW1pdCB0aGF0IHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciA4ayB2aWRlbyBmcmFtZXMKQEAgLTQwOTYsMzIgKzQ0NzQsMzAgQEAKICAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlclNpemUgPSA2NCAqIDEwMjQgKiAxMDI0OwogICAgIGlmIChtYXhfc2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7CiAgICAgICAgIEFMT0dFKCJib2d1cyBtYXggaW5wdXQgc2l6ZTogJXp1ID4gJXp1IiwgbWF4X3NpemUsIGtNYXhCdWZmZXJTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGlmIChtYXhfc2l6ZSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJ6ZXJvIG1heCBpbnB1dCBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIC8vIEFsbG93IHVwIHRvIGtNYXhCdWZmZXJzLCBidXQgbm90IGlmIHRoZSB0b3RhbCBleGNlZWRzIGtNYXhCdWZmZXJTaXplLgogICAgIGNvbnN0IHNpemVfdCBrSW5pdGlhbEJ1ZmZlcnMgPSAyOwogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVycyA9IDg7CiAgICAgY29uc3Qgc2l6ZV90IHJlYWxNYXhCdWZmZXJzID0gbWluKGtNYXhCdWZmZXJTaXplIC8gbWF4X3NpemUsIGtNYXhCdWZmZXJzKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KGtJbml0aWFsQnVmZmVycywgbWF4X3NpemUsIHJlYWxNYXhCdWZmZXJzKTsKICAgICBtU3JjQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbbWF4X3NpemVdOwogICAgIGlmIChtU3JjQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gZmlsZSBwcm9iYWJseSBzcGVjaWZpZWQgYSBiYWQgbWF4IHNpemUKLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0b3AoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKQEAgLTQxMzQsMTMgKzQ1MTAsMTAgQEAKICAgICBkZWxldGVbXSBtU3JjQnVmZmVyOwogICAgIG1TcmNCdWZmZXIgPSBOVUxMOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKQEAgLTQyNTgsNyArNDYzMSw4IEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ28nKTogewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTQzODksNyArNDc2Myw4IEBACiAgICAgaWYgKGVudHJ5Y291bnQgPiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplKSB7CiAgICAgICAgIHVpbnQ2NF90ICpuZXdQdHIgPSAodWludDY0X3QgKilyZWFsbG9jKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMsIGVudHJ5Y291bnQgKiA4KTsKICAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMgPSBuZXdQdHI7CkBAIC00NDI4LDEwICs0ODAzLDExIEBACiAgICAgcmV0dXJuIHBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhkcm1vZmZzZXQsIGZhbHNlLCAwKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKSB7CitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKSB7CiAKLSAgICBpbnQgaXZsZW5ndGg7Ci0gICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZpdmxlbmd0aCkpOworICAgIGludDMyX3QgaXZsZW5ndGg7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJml2bGVuZ3RoKSk7CiAKICAgICAvLyBvbmx5IDAsIDggYW5kIDE2IGJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9ycyBhcmUgc3VwcG9ydGVkCiAgICAgaWYgKGl2bGVuZ3RoICE9IDAgJiYgaXZsZW5ndGggIT0gOCAmJiBpdmxlbmd0aCAhPSAxNikgewpAQCAtNDc3NSwxMCArNTE1MSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtZXRhID0gbUZvcm1hdDsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZvcm1hdCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgewpAQCAtNDgwMCwxNSArNTE3Niw0NCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworaW50MzJfdCBNUEVHNFNvdXJjZTo6cGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLKGRhdGEgIT0gbnVsbHB0ciAmJiBzaXplID49IChtTkFMTGVuZ3RoU2l6ZSArIDIpKTsKKworICAgIC8vIEhFVkMgTkFMLWhlYWRlciAoMTYtYml0KQorICAgIC8vICAxICAgNiAgICAgIDYgICAgIDMKKyAgICAvLyB8LXx1dXV1dXV8LS0tLS0tfGlpaXwKKyAgICAvLyAgICAgIF4gICAgICAgICAgICBeCisgICAgLy8gIE5BTF90eXBlICAgICAgICBsYXllcl9pZCArIDEKKyAgICAvLworICAgIC8vIExheWVyLWlkIGlzIG5vbi16ZXJvIG9ubHkgZm9yIFRlbXBvcmFsIFN1Yi1sYXllciBBY2Nlc3MgcGljdHVyZXMgKFRTQSkKKyAgICBlbnVtIHsKKyAgICAgICAgVFNBX04gPSAyLAorICAgICAgICBUU0FfUiA9IDMsCisgICAgICAgIFNUU0FfTiA9IDQsCisgICAgICAgIFNUU0FfUiA9IDUsCisgICAgfTsKKworICAgIGRhdGEgKz0gbU5BTExlbmd0aFNpemU7CisgICAgdWludDE2X3QgbmFsSGVhZGVyID0gZGF0YVswXSA8PCA4IHwgZGF0YVsxXTsKKworICAgIHVpbnQxNl90IG5hbFR5cGUgPSAobmFsSGVhZGVyID4+IDkpICYgMHgzRnU7CisgICAgaWYgKG5hbFR5cGUgPT0gVFNBX04gfHwgbmFsVHlwZSA9PSBUU0FfUiB8fCBuYWxUeXBlID09IFNUU0FfTiB8fCBuYWxUeXBlID09IFNUU0FfUikgeworICAgICAgICBpbnQzMl90IGxheWVySWRQbHVzT25lID0gbmFsSGVhZGVyICYgMHg3dTsKKyAgICAgICAgQUxPR0RfSUYobGF5ZXJJZFBsdXNPbmUgPT0gMCwgImdvdCBsYXllcklkIDAgZm9yIFRTQSBwaWN0dXJlIik7CisgICAgICAgIHJldHVybiBsYXllcklkUGx1c09uZSAtIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtQnVmZmVyR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA+IDApIHsKQEAgLTQ4MjYsOCArNTIzMSw4IEBACiAgICAgICAgICAgICBDSEVDSyhtU2FtcGxlVGFibGUgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtSXRlbVRhYmxlICE9IE5VTEwpOwogICAgICAgICAgICAgaW50MzJfdCBpbWFnZUluZGV4OwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJmltYWdlSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZpbWFnZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CkBAIC00ODM3LDcgKzUyNDIsNyBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWxJdGVtKGltYWdlSW5kZXgsICZtQ3VycmVudFNhbXBsZUluZGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7CkBAIC00ODkyLDEwICs1Mjk3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCiAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUCkBAIC00OTQ5LDI0ICs1MzU0LDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047IC8vIEVSUk9SX0JVRkZFUl9UT09fU01BTEwKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMgJiYgIW1Jc0FDNCkgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIHR3b3MnIFBDTSBibG9jayByZWFkZXIgYXNzdW1lcyB0aGF0IGFsbCBzYW1wbGVzIGhhcyB0aGUgc2FtZSBzaXplLgpAQCAtNDk4MSwyMiArNTM4OSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNUb1JlYWQsIHNpemUsIG1DdXJyZW50U2FtcGxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCkpOwogCi0gICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOworICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOwogICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZiA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZiwgdG90YWxTaXplKTsKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgKHNzaXplX3QpdG90YWxTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlT3JkZXI7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgJmJ5dGVPcmRlcik7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAmYnl0ZU9yZGVyKTsKIAogICAgICAgICAgICAgICAgIGlmIChieXRlT3JkZXIgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAvLyBCaWctZW5kaWFuIC0+IGxpdHRsZS1lbmRpYW4KQEAgLTUwMTgsMTY2ICs1NDI5LDgxIEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICAgICAgfQotCisgCiAgICAgICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KKyAgICB9IGVsc2UgaWYgKG1Jc0FDNCkgewogICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5Ci0gICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLSAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBzeW5jIGhlYWRlciBhbmQgdGhlIHJhdyBmcmFtZQorICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAoNyArIHNpemUpKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICAvLyBBZGQgQUMtNCBzeW5jIGhlYWRlciB0byBNUEVHNCBlbmNhcHN1bGF0ZWQgQUMtNCByYXcgZnJhbWUKKyAgICAgICAgLy8gQUM0MCBzeW5jIHdvcmQsIG1lYW5pbmcgbm8gQ1JDIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhBQzsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweDQwOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4RkY7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMTYpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDgpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDApICYgMHhGRik7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRzdERhdGEgKyBkc3RPZmZzZXQsIHNpemUpOworICAgICAgICBpZiAobnVtQnl0ZXNSZWFkICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzQVZDKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgfQogCiAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTUxODUsMTIgKzU1MTEsMTA1IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQorICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCisgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKworICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworCisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSXNBVkMpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSBwYXJzZUhFVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOworICAgICAgICB9CisKKyAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OworCisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogCiAgICAgQUxPR1YoIk1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCIpOwogCkBAIC01MjMxLDcgKzU2NTAsNyBAQAogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOwogICAgICAgICB9IGVsc2UgewpAQCAtNTI0Myw3ICs1NjYyLDcgQEAKICAgICAgICAgICAgIG9mZjY0X3QgdG1wID0gbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG1wKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7CiAgICAgICAgIH0KQEAgLTUyNjEsMTMgKzU2ODAsMTcgQEAKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAorICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKQEAgLTUyNzUsMTAgKzU2OTgsMTAgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01Mjg3LDU4ICs1NzEwLDU4IEBACiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwogICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwogICAgICAgICAgICAgQUxPR1YoImFjcXVpcmVfYnVmZmVyIHJldHVybmVkICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNvbnN0IFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVJbmRleF07Ci0gICAgTWV0YURhdGFCYXNlICZidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgYnVmbWV0YS5jbGVhcigpOworICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihidWZtZXRhKTsKICAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7CiAgICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCi0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKICAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFycmF5KCksIHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSAqIDQpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBtRGVmYXVsdElWU2l6ZSk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1DcnlwdG9Nb2RlKTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIG1EZWZhdWx0SVZTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIG1DcnlwdG9Nb2RlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIG1DcnlwdG9LZXksIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCBtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCi0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgICAgICBjb25zdCB2b2lkICppdiA9IE5VTEw7CisgICAgICAgIHZvaWQgKml2ID0gTlVMTDsKICAgICAgICAgc2l6ZV90IGl2bGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2bGVuZ3RoKSkgewotICAgICAgICAgICAgaXYgPSBzbXBsLT5pdjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgImNyeXB0by1pdiIsICZpdiwgJml2bGVuZ3RoKSkgeworICAgICAgICAgICAgaXYgPSAodm9pZCAqKSBzbXBsLT5pdjsKICAgICAgICAgICAgIGl2bGVuZ3RoID0gMTY7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/CiAgICAgICAgIH0KLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgaXYsIGl2bGVuZ3RoKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBpdiwgaXZsZW5ndGgpOwogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImZyYWdtZW50ZWRSZWFkIEVSUk9SX01BTEZPUk1FRCBzaXplICV6dSIsIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQpAQCAtNTM0OSwxMDMgKzU3NzIsNTcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gcGFyc2VIRVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQotICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigid2hvbGUgTkFMIik7CiAgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKICAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgogICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7CiAgICAgICAgIHZvaWQgKmRhdGEgPSBOVUxMOwogICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gZmFsc2U7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJm1heF9zaXplKQorICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgbWF4X3NpemU7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc01hbEZvcm1lZCB8fCBkYXRhID09IE5VTEwpIHsKQEAgLTU0NTQsNyArNTgzMSw3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwogCkBAIC01NDYzLDc1ICs1ODQwLDY5IEBACiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKLSAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01NTM5LDE1ICs1OTEwLDE3IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CiAgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpCiAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFjazsKICAgICAgICAgfQpAQCAtNTU1Niw3ICs1OTI5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKICAgICBzc2l6ZV90IG4gPSBzb3VyY2UtPnJlYWRBdCg0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKQEAgLTU2MjEsNyArNTk5NCw3IEBACiAvLyBBbHNvIHRyeSB0byBpZGVudGlmeSB3aGVyZSB0aGlzIGZpbGUncyBtZXRhZGF0YSBlbmRzCiAvLyAoZW5kIG9mIHRoZSAnbW9vdicgYXRvbSkgYW5kIHJlcG9ydCBpdCB0byB0aGUgY2FsbGVyIGFzIHBhcnQgb2YKIC8vIHRoZSBtZXRhZGF0YS4KLXN0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK3N0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIC8vIFdlIHNjYW4gdXAgdG8gMTI4IGJ5dGVzIHRvIGlkZW50aWZ5IHRoaXMgZmlsZSBhcyBhbiBNUDQuCiAgICAgc3RhdGljIGNvbnN0IG9mZjY0X3Qga01heFNjYW5PZmZzZXQgPSAxMjhsbDsKIApAQCAtNTY2Nyw3ICs2MDQwLDggQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwKKyAgICAgICAgICAgICAgICBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgogICAgICAgICAgICAgewpAQCAtNTcyOCwxOCArNjEwMiwxOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IE1QRUc0RXh0cmFjdG9yKHNvdXJjZSk7CitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqKSB7CisgICAgcmV0dXJuIHdyYXAobmV3IE1QRUc0RXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgewotICAgIGlmIChCZXR0ZXJTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiosCisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICBpZiAoQmV0dGVyU25pZmZNUEVHNCgmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogICAgIH0KIAotICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICBpZiAoTGVnYWN5U25pZmZNUEVHNCgmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICBBTE9HVygiSWRlbnRpZmllZCBzdXBwb3J0ZWQgbXBlZzQgdGhyb3VnaCBMZWdhY3lTbmlmZk1QRUc0LiIpOwogICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogICAgIH0KQEAgLTU3NTAsMTMgKzYxMjUsMTMgQEAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjI3NTc1YzY3LTQ0MTctNGM1NC04ZDNkLThlNjI2OTg1YTE2NCIpLAotICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgIDIsIC8vIHZlcnNpb24KICAgICAgICAgIk1QNCBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MiA9IFNuaWZmIH0KICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAzZWEwOTYzLi43OWQ1ZmY2ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaApAQCAtMjAsOSArMjAsOSBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CkBAIC0zMSw4ICszMSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOwotc3RydWN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogY2xhc3MgU2FtcGxlVGFibGU7CiBjbGFzcyBTdHJpbmc4OwogbmFtZXNwYWNlIGhlaWYgewpAQCAtNTMsMTUgKzUzLDE1IEBACiAgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7CiB9OwogCi1jbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOworICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHNEV4dHJhY3RvciI7IH0KIApAQCAtNzcsNyArNzcsNyBAQAogICAgIH07CiAgICAgc3RydWN0IFRyYWNrIHsKICAgICAgICAgVHJhY2sgKm5leHQ7Ci0gICAgICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGE7CiAgICAgICAgIHVpbnQzMl90IHRpbWVzY2FsZTsKICAgICAgICAgc3A8U2FtcGxlVGFibGU+IHNhbXBsZVRhYmxlOwogICAgICAgICBib29sIGluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YTsKQEAgLTk3LDggKzk3LDcgQEAKIAogICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICptQ2FjaGVkU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKICAgICBib29sIG1Jc1FUOwpAQCAtMTA4LDcgKzEwNyw3IEBACiAKICAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwogCi0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YURhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFEYXRhOwogCiAgICAgVmVjdG9yPHVpbnQzMl90PiBtUGF0aDsKICAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE1lYW47CkBAIC0xMzksMTcgKzEzOCwxNiBAQAogCiAgICAgVHJhY2sgKmZpbmRUcmFja0J5TWltZVByZWZpeChjb25zdCBjaGFyICptaW1lUHJlZml4KTsKIAotICAgIHN0YXR1c190IHBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpOwotICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgKKyAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZUFDNFNwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIE1QRUc0RXh0cmFjdG9yKGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogICAgIE1QRUc0RXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzQoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE1QRUc0X0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCmluZGV4IDkzZWU3YzYuLjFhNmQzMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKQEAgLTMyOCw3ICszMjgsMTUgQEAKICAgICAgICAgKyttVGltZVRvU2FtcGxlSW5kZXg7CiAgICAgfQogCi0gICAgKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisgICAgLy8gYmVsb3cgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAvLyAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICB1aW50MzJfdCB0bXA7CisgICAgaWYgKF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2FtcGxlSW5kZXgsIG1UVFNTYW1wbGVJbmRleCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobVRUU0R1cmF0aW9uLCB0bXAsICZ0bXApIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KG1UVFNTYW1wbGVUaW1lLCB0bXAsICZ0bXApKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgICp0aW1lID0gdG1wOwogCiAgICAgaW50MzJfdCBvZmZzZXQgPSBtVGFibGUtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7CiAgICAgaWYgKChvZmZzZXQgPCAwICYmICp0aW1lIDwgKG9mZnNldCA9PSBJTlQzMl9NSU4gPwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDI4ZmU3MTcuLmQyNDI3OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KIApAQCAtMTE0LDcgKzExNCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLVNhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtQ2h1bmtPZmZzZXRPZmZzZXQoLTEpLAogICAgICAgbUNodW5rT2Zmc2V0VHlwZSgwKSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCmluZGV4IGRkNjg4NjAuLmQ0YjVkYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaApAQCAtMjEsMTggKzIxLDE5IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7CiAKIGNsYXNzIFNhbXBsZVRhYmxlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIGV4cGxpY2l0IFNhbXBsZVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IFNhbXBsZVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKIApAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgLy8gTGltaXQgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGludGVybmFsIHRhYmxlcyB0byAyMDBNaUIuCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VG90YWxTaXplID0gMjAwICogKDEgPDwgMjApOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIE11dGV4IG1Mb2NrOwogCiAgICAgb2ZmNjRfdCBtQ2h1bmtPZmZzZXRPZmZzZXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggMzhjODZlYi4uYjgxNjA5MyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icApAQCAtMTUsMTQgKzE1LDExIEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTMwLDggKzI3LDEzIEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJtcGVnMmV4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKaW5kZXggOGEwZmEwMy4uMmY0MTk2YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcApAQCAtMTgsMzggKzE4LDQzIEBACiAjZGVmaW5lIExPR19UQUcgIk1QRUcyRXh0cmFjdG9yQnVuZGxlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgIk1QRUcyUFNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJNUEVHMlRTRXh0cmFjdG9yLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCIzZDFkY2ZlYi1lNDBhLTQzNmQtYTU3NC1jMjQzOGE1NTVlNWYiKSwKICAgICAgICAgMSwKICAgICAgICAgIk1QRUcyLVBTL1RTIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNUEVHMlRTKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1QRUcyVFNFeHRyYWN0b3Ioc291cmNlKTt9OwotICAgICAgICAgICAgfSBlbHNlIGlmIChTbmlmZk1QRUcyUFMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlBTRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgeworICAgICAgICAgICAgLnYyID0gW10oCisgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgaWYgKFNuaWZmTVBFRzJUUygmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyVFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTbmlmZk1QRUcyUFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggNjk4MGI4Mi4uNTU0ZDI1MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAibXBlZzJ0cy9FU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzQsMjIgKzMzLDIzIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjaywgcHVibGljIFJlZkJhc2Ugeworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflRyYWNrKCk7CkBAIC03MiwyOSArNzIsMjkgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7CiB9OwogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrIDogcHVibGljIE1lZGlhVHJhY2sgewotICAgIFdyYXBwZWRUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spOworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKKyAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBUcmFjayAqdHJhY2spOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+V3JhcHBlZFRyYWNrKCk7CiAKIHByaXZhdGU6CiAgICAgTVBFRzJQU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKLSAgICBzcDxNUEVHMlBTRXh0cmFjdG9yOjpUcmFjaz4gbVRyYWNrOworICAgIE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrICptVHJhY2s7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXcmFwcGVkVHJhY2spOwogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1GaW5hbFJlc3VsdChPSyksCkBAIC0xMDgsMjUgKzEwOCwyNyBAQAogICAgIH0KIAogICAgIC8vIFJlbW92ZSBhbGwgdHJhY2tzIHRoYXQgd2VyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZWlyIGZvcm1hdC4KLSAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgZm9yIChzaXplX3QgaSA9IG1UcmFja3Muc2l6ZSgpOyBpID4gMDspIHsKICAgICAgICAgaS0tOwotICAgICAgICBpZiAobVRyYWNrcy52YWx1ZUF0KGkpLT5nZXRGb3JtYXQobWV0YSkgIT0gT0spIHsKKyAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgbVRyYWNrcy5yZW1vdmVJdGVtc0F0KGkpOwogICAgICAgICB9CiAgICAgfQorICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWV0YSk7CiAKICAgICBtU2Nhbm5pbmcgPSBmYWxzZTsKIH0KIAogTVBFRzJQU0V4dHJhY3Rvcjo6fk1QRUcyUFNFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMzQsMjAgKzEzNiwyMCBAQAogICAgIHJldHVybiBuZXcgV3JhcHBlZFRyYWNrKHRoaXMsIG1UcmFja3MudmFsdWVBdChpbmRleCkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICByZXR1cm4gbVRyYWNrcy52YWx1ZUF0KGluZGV4KS0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHVpbnQzMl90IE1QRUcyUFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNjM1LDQyICs2MzcsNTUgQEAKICAgICBtUXVldWUgPSBOVUxMOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAvLyBpbml0aWFsaXplIHdpdGggb25lIHNtYWxsIGJ1ZmZlciwgYnV0IGFsbG93IGdyb3d0aAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG9uZSBidWZmZXIgKi8sIDI1NiAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKworICAgIGlmIChtU291cmNlLT5zdGFydChOVUxMKSA9PSBPSykgeyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdG9wKCkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworICAgIGlmIChtU291cmNlLT5zdG9wKCkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewordm9pZCBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCwgc3A8QU1lc3NhZ2U+IG1zZyk7CisKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBzb3VyY2VNZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgbWV0YSA9ICpzb3VyY2VNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2VNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwogICAgIHdoaWxlICghbVNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmZlZWRNb3JlKCk7CkBAIC02ODAsNyArNjk1LDQ3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZjsKKyAgICBtU291cmNlLT5yZWFkKCZtYnVmLCAoTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm91dGJ1ZjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRidWYsIGZhbHNlLCBsZW5ndGgpOworICAgIG1lbWNweShvdXRidWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBsZW5ndGgpOworICAgIG91dGJ1Zi0+c2V0X3JhbmdlKDAsIGxlbmd0aCk7CisgICAgKmJ1ZmZlciA9IG91dGJ1ZjsKKyAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqb3V0TWV0YSA9IG91dGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnZhbDY0KSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB2YWw2NCk7CisgICAgfQorICAgIGludDMyX3QgdmFsMzI7CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIHZhbDMyKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIHZhbDMyKTsKKyAgICB9CisgICAgdWludDMyX3QgYnVmVHlwZTsKKyAgICBjb25zdCB2b2lkICpidWZEYXRhOworICAgIHNpemVfdCBidWZTaXplOworICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0lWLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlTRUksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9TRUksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmFwcGVuZFBFU0RhdGEoCkBAIC03MjYsNyArNzgxLDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6V3JhcHBlZFRyYWNrKAotICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spCisgICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrKHRyYWNrKSB7CiB9CkBAIC03MzQsMjcgKzc4OSwyNyBAQAogTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjp+V3JhcHBlZFRyYWNrKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RhcnQocGFyYW1zKTsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgewogICAgIHJldHVybiBtVHJhY2stPnN0b3AoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbVRyYWNrLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICByZXR1cm4gbVRyYWNrLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgU25pZmZNUEVHMlBTKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbNV07CiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCA4YjlkYWQ5Li5lNWQ1OTFmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMTksNyArMTksOCBAQAogI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTMxLDE0ICszMiwxNCBAQAogc3RydWN0IFRyYWNrOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyUFNFeHRyYWN0b3IiOyB9CkBAIC01MSwxMiArNTIsMTIgQEAKICAgICBzdHJ1Y3QgV3JhcHBlZFRyYWNrOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwogICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFRyYWNrPiA+IG1UcmFja3M7CisgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIFRyYWNrKiA+IG1UcmFja3M7CiAgICAgYm9vbCBtU2Nhbm5pbmc7CiAKICAgICBib29sIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQ7CkBAIC03Miw3ICs3Myw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJQU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggMjRlNjIzYi4uM2JiMmFmNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTM1LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKQEAgLTUxLDE5ICs1MSwxOSBAQAogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZWFkU2l6ZSA9IDI1MDAwMExMOwogc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZXRyeSA9IDY7CiAKLXN0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgTVBFRzJUU1NvdXJjZSgKICAgICAgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAogICAgICAgICAgICAgYm9vbCBkb2VzU2Vlayk7CiAgICAgdmlydHVhbCB+TVBFRzJUU1NvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcml2YXRlOgogICAgIE1QRUcyVFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CkBAIC04OCw0NCArODgsMTQ5IEBACiBNUEVHMlRTU291cmNlOjp+TVBFRzJUU1NvdXJjZSgpIHsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKLSAgICByZXR1cm4gbUltcGwtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoKSB7CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAoIW1JbXBsLT5zdGFydChOVUxMKSkgeyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdG9wKCk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgeworICAgIGlmICghbUltcGwtPnN0b3AoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBzaXplX3QgbnVtRW50cmllcyA9IG1zZy0+Y291bnRFbnRyaWVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1zZy0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaWQgPSBtc2ctPmdldEVudHJ5QXQoaSk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgIGludDMyX3QgdmFsMzI7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbDMyKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBuYW1lLCB2YWwzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDY0OworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWw2NCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZvcm1hdCwgbmFtZSwgdmFsNjQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsZmxvYXQ7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbGZsb2F0KSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoZm9ybWF0LCBuYW1lLCB2YWxmbG9hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbGRvdWJsZTsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsZG91YmxlKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKGZvcm1hdCwgbmFtZSwgdmFsZG91YmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgICAgICBpZiAoQVN0cmluZyBzOyBpZC5maW5kKCZzKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdCwgbmFtZSwgcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmb3JtYXQsIG5hbWUsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgdW5zdXBwb3J0ZWQgdHlwZSAlZCAnJXMnIiwgdHlwZSwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBtSW1wbC0+Z2V0Rm9ybWF0KCk7Ci0gICAgbWV0YSA9ICppbXBsTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoaW1wbE1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwogICAgIGlmIChtRG9lc1NlZWsgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKICAgICAgICAgLy8gc2VlayBpcyBuZWVkZWQKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCBzZWVrTW9kZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgKFJlYWRPcHRpb25zOjpTZWVrTW9kZSlzZWVrTW9kZSk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1FeHRyYWN0b3ItPmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShtSW1wbCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbUltcGwtPnJlYWQoJm1idWYsIChNZWRpYVRyYWNrOjpSZWFkT3B0aW9ucyopIG9wdGlvbnMpOworICAgIHNpemVfdCBsZW5ndGggPSBtYnVmLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqb3V0YnVmOworICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dGJ1ZiwgZmFsc2UsIGxlbmd0aCk7CisgICAgbWVtY3B5KG91dGJ1Zi0+ZGF0YSgpLCBtYnVmLT5kYXRhKCksIGxlbmd0aCk7CisgICAgb3V0YnVmLT5zZXRfcmFuZ2UoMCwgbGVuZ3RoKTsKKyAgICAqb3V0ID0gb3V0YnVmOworICAgIE1ldGFEYXRhQmFzZSAmaW5NZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0ICpvdXRNZXRhID0gb3V0YnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIob3V0TWV0YSk7CisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnZhbDY0KSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB2YWw2NCk7CisgICAgfQorICAgIGludDMyX3QgdmFsMzI7CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIHZhbDMyKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIHZhbDMyKTsKKyAgICB9CisgICAgdWludDMyX3QgYnVmVHlwZTsKKyAgICBjb25zdCB2b2lkICpidWZEYXRhOworICAgIHNpemVfdCBidWZTaXplOworICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0lWLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlTRUksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9TRUksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVBhcnNlcihuZXcgQVRTUGFyc2VyKSwKICAgICAgIG1MYXN0U3luY0V2ZW50KDApLApAQCAtMTMzLDExICsyMzgsMTUgQEAKICAgICBpbml0KCk7CiB9CiAKK01QRUcyVFNFeHRyYWN0b3I6On5NUEVHMlRTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKK30KKwogc2l6ZV90IE1QRUcyVFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtU291cmNlSW1wbHMuc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtU291cmNlSW1wbHMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE0OCwyMiArMjU3LDIzIEBACiAgICAgICAgICAgICAobVNlZWtTeW5jUG9pbnRzID09ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KSkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBpbmRleCA8IG1Tb3VyY2VJbXBscy5zaXplKCkKICAgICAgICAgPyBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpIDogTlVMTDsKICAgICBpZiAoaW1wbE1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gKmltcGxNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShpbXBsTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7Ci0KLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vc3RhdGljCkBAIC0xNzQsNyArMjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELCBtaW1lKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CiAgICAgSGFsVG9rZW4gaGFsVG9rZW47CiAgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgodWludDhfdCopY2FzVG9rZW4sIHNpemUpOwogICAgIHNwPElDYXM+IGNhcyA9IElDYXM6OmNhc3RGcm9tKHJldHJpZXZlSGFsSW50ZXJmYWNlKGhhbFRva2VuKSk7CkBAIC0xODQsOCArMjk0LDkgQEAKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIEFMT0dJKCJBbGwgdHJhY2tzIG5vdyBoYXZlIGRlc2NyYW1ibGVycyIpOwogICAgICAgICBpbml0KCk7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQotICAgIHJldHVybiBlcnI7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCiB2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgewpAQCAtNDkxLDcgKzYwMiw3IEBACiB9CiAKIHN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICBjb25zdCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CisgICAgICAgIGNvbnN0IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSAmc2Vla01vZGUpIHsKICAgICBpZiAobVNlZWtTeW5jUG9pbnRzID09IE5VTEwgfHwgbVNlZWtTeW5jUG9pbnRzLT5pc0VtcHR5KCkpIHsKICAgICAgICAgQUxPR1coIk5vIHN5bmMgcG9pbnQgdG8gc2VlayB0by4iKTsKICAgICAgICAgLy8gLi4uIGFuZCB0aGVyZWZvcmUgd2UgaGF2ZSBub3RoaW5nIHVzZWZ1bCB0byBkbyBoZXJlLgpAQCAtNTEyLDE4ICs2MjMsMTggQEAKICAgICB9CiAKICAgICBzd2l0Y2ggKHNlZWtNb2RlKSB7Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKICAgICAgICAgICAgIGlmIChpbmRleCA9PSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJOZXh0IHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3Qgc3luYy4iKTsKICAgICAgICAgICAgICAgICAtLWluZGV4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CiAgICAgICAgICAgICBBTE9HVygic2Vla01vZGUgbm90IHN1cHBvcnRlZDogJWQ7IGZhbGxpbmcgYmFjayB0byBQUkVWSU9VU19TWU5DIiwKICAgICAgICAgICAgICAgICAgICAgc2Vla01vZGUpOwogICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgogICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVygiUHJldmlvdXMgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGVhcmxpZXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jLiIpOwpAQCAtNjY2LDcgKzc3Nyw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLWJvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7Citib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgICAgY2hhciBoZWFkZXI7CiAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChrVFNQYWNrZXRTaXplICogaSwgJmhlYWRlciwgMSkgIT0gMQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCBjYmRkM2NiLi5lNDI1ZDIzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOCBAQAogI2RlZmluZSBNUEVHMl9UU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC0zNCwzMCArMzQsMzMgQEAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogc3RydWN0IEFUU1BhcnNlcjsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IENEYXRhU291cmNlOwogc3RydWN0IE1QRUcyVFNTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1zdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlRTRXh0cmFjdG9yIjsgfQogCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TVBFRzJUU0V4dHJhY3RvcigpOworCiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBzcDxBVFNQYXJzZXI+IG1QYXJzZXI7CiAKQEAgLTgxLDEzICs4NCwxMyBAQAogICAgIC8vIFRyeSB0byBmZWVkIG1vcmUgZGF0YSBmcm9tIHNvdXJjZSB0byBwYXJzZXIuCiAgICAgLy8gfGlzSW5pdHwgbWVhbnMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW5zaWRlIGluaXQoKS4gVGhpcyBpcyBhIHNpZ25hbCB0bwogICAgIC8vIHNhdmUgU3luY0V2ZW50IHNvIHRoYXQgaW5pdCgpIGNhbiBhZGQgU3luY1BvaW50IGFmdGVyIGl0IHVwZGF0ZXMgfG1Tb3VyY2VJbXBsc3wuCi0gICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIE9LIGlmIGV4cGVjdGVkIGFtb3VudCBvZiBkYXRhIGlzIGZlZCBmcm9tIERhdGFTb3VyY2VCYXNlIHRvCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIE9LIGlmIGV4cGVjdGVkIGFtb3VudCBvZiBkYXRhIGlzIGZlZCBmcm9tIERhdGFTb3VyY2VIZWxwZXIgdG8KICAgICAvLyBwYXJzZXIgYW5kIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuIE90aGVyd2lzZSwgdmFyaW91cyBlcnJvciBjb2RlcyBjb3VsZCBiZQotICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VCYXNlLCBvcgorICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VIZWxwZXIsIG9yCiAgICAgLy8gdGhlIGRhdGEgaGFzIHN5bnRheCBlcnJvciBkdXJpbmcgcGFyc2luZywgZXRjLgogICAgIHN0YXR1c190IGZlZWRNb3JlKGJvb2wgaXNJbml0ID0gZmFsc2UpOwogICAgIHN0YXR1c190IHNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOworICAgICAgICAgICAgY29uc3QgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlJiBzZWVrTW9kZSk7CiAgICAgc3RhdHVzX3QgcXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKTsKIApAQCAtMTAxLDcgKzEwNCw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggZjNkMjc5NC4uNjA0ZWM1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC03LDEzICs3LDE4IEBACiAgICAgICAgICJleHRlcm5hbC90cmVtb2xvIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGIyZmU2OWMuLmMzOTE0ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcApAQCAtMjEsMTkgKzIxLDE3IEBACiAjaW5jbHVkZSAiT2dnRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0cmFjdG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVm9yYmlzQ29tbWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIGV4dGVybiAiQyIgewpAQCAtNDcsMTYgKzQ1LDE2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgZXhwbGljaXQgT2dnU291cmNlKE9nZ0V4dHJhY3RvciAqZXh0cmFjdG9yKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+T2dnU291cmNlKCk7CkBAIC03MSwyOCArNjksMzAgQEAKIAogc3RydWN0IE15T2dnRXh0cmFjdG9yIHsKICAgICBNeU9nZ0V4dHJhY3RvcigKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKTsKICAgICB2aXJ0dWFsIH5NeU9nZ0V4dHJhY3RvcigpOwogCi0gICAgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKSBjb25zdDsKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopIGNvbnN0OwogCiAgICAgLy8gUmV0dXJucyBhbiBhcHByb3hpbWF0ZSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KICAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCA9IDA7CiAKICAgICBzdGF0dXNfdCBzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcikgPSAwOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCi0gICAgc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgICAgICBtZXRhID0gbUZpbGVNZXRhOwotICAgICAgICByZXR1cm4gT0s7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgICAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhKTsKICAgICB9CiAKKyAgICB2b2lkIHNldEJ1ZmZlckdyb3VwKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKSB7CisgICAgICAgIG1CdWZmZXJHcm91cCA9IGdyb3VwOworICAgIH0KIHByb3RlY3RlZDoKICAgICBzdHJ1Y3QgUGFnZSB7CiAgICAgICAgIHVpbnQ2NF90IG1HcmFudWxlUG9zaXRpb247CkBAIC0xMTAsNyArMTEwLDggQEAKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwogICAgIH07CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptQnVmZmVyR3JvdXA7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgUGFnZSBtQ3VycmVudFBhZ2U7CiAgICAgdWludDY0X3QgbUN1ckdyYW51bGVQb3NpdGlvbjsKQEAgLTEyOSwxMSArMTMwLDEzIEBACiAgICAgdm9yYmlzX2luZm8gbVZpOwogICAgIHZvcmJpc19jb21tZW50IG1WYzsKIAotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGE7CiAKICAgICBWZWN0b3I8VE9DRW50cnk+IG1UYWJsZU9mQ29udGVudHM7CiAKKyAgICBpbnQzMl90IG1IYXB0aWNDaGFubmVsQ291bnQ7CisKICAgICBzc2l6ZV90IHJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKICAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCk7CiAKQEAgLTE0Niw3ICsxNDksNyBAQAogICAgIC8vIDEgLSBiaXRzdHJlYW0gaWRlbnRpZmljYXRpb24gaGVhZGVyCiAgICAgLy8gMyAtIGNvbW1lbnQgaGVhZGVyCiAgICAgLy8gNSAtIGNvZGVjIHNldHVwIGhlYWRlciAoVm9yYmlzIG9ubHkpCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOwogCiAgICAgLy8gUmVhZCB0aGUgbmV4dCBvZ2cgcGFja2V0IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2U7IG9wdGlvbmFsbHkKICAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG91dHB1dCBwYWNrZXQgd2hpbHN0IHByZXRlbmRpbmcKQEAgLTE1NCw5ICsxNTcsOSBAQAogICAgIC8vCiAgICAgLy8gKmJ1ZmZlciBpcyBOVUxMJ2VkIG91dCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LCBhbmQgaWYgc3VjY2Vzc2Z1bCBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkOwogICAgIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KLSAgICBzdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOworICAgIG1lZGlhX3N0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKIAotICAgIGludDMyX3QgZ2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKTsKIAogICAgIHZvaWQgcGFyc2VGaWxlTWV0YURhdGEoKTsKIApAQCAtMTY0LDEyICsxNjcsMTQgQEAKIAogICAgIHZvaWQgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKIAorICAgIHZvaWQgc2V0Q2hhbm5lbE1hc2soaW50IGNoYW5uZWxDb3VudCk7CisKICAgICBNeU9nZ0V4dHJhY3Rvcihjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKICAgICBNeU9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOwogfTsKIAogc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15Vm9yYmlzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsCiAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgICAgIC8qIG51bUhlYWRlcnMgKi8gMywKQEAgLTE3OCw3ICsxODMsNyBAQAogCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgeworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpIHsKICAgICAgICAgcmV0dXJuIF9yZWFkTmV4dFBhY2tldChidWZmZXIsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyB0cnVlKTsKICAgICB9CiAKQEAgLTE5MCwxNCArMTk1LDE0IEBACiAgICAgICAgIHJldHVybiBncmFudWxlUG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKIH07CiAKIHN0cnVjdCBNeU9wdXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgewogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOwogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtPcHVzU2Vla1ByZVJvbGxVcyA9IDgwMDAwOyAvLyA4MCBtcwogCi0gICAgZXhwbGljaXQgTXlPcHVzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgTXlPcHVzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBNeU9nZ0V4dHJhY3Rvcihzb3VyY2UsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIC8qbnVtSGVhZGVycyovIDIsIGtPcHVzU2Vla1ByZVJvbGxVcyksCiAgICAgICAgICAgbUNoYW5uZWxDb3VudCgwKSwKICAgICAgICAgICBtQ29kZWNEZWxheSgwKSwKQEAgLTIwOCwxNiArMjEzLDE2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKIAogcHJpdmF0ZToKLSAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLSAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3Q7CisgICAgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKTsKKyAgICBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CisgICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIGNvbnN0OwogCiAgICAgdWludDhfdCBtQ2hhbm5lbENvdW50OwogICAgIHVpbnQxNl90IG1Db2RlY0RlbGF5OwpAQCAtMjM3LDI4ICsyNDIsMzAgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1FeHRyYWN0b3ItPm1JbXBsLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KCkgewogICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCisgICAgLy8gaW5pdGlhbGl6ZSBidWZmZXIgZ3JvdXAgd2l0aCBhIHNpbmdsZSBzbWFsbCBidWZmZXIsIGJ1dCBhIGdlbmVyb3VzIHVwcGVyIGxpbWl0CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgKi8sIDEyOCAvKiBzaXplICovLCA2NCAvKiBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgKi8pOworICAgIG1FeHRyYWN0b3ItPm1JbXBsLT5zZXRCdWZmZXJHcm91cChtQnVmZmVyR3JvdXApOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0b3AoKSB7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0yNjYsNDEgKzI3Myw0MyBAQAogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpwYWNrZXQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnJlYWROZXh0UGFja2V0KCZwYWNrZXQpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpwYWNrZXQ7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnJlYWROZXh0UGFja2V0KCZwYWNrZXQpOwogCi0gICAgaWYgKGVyciAhPSBPSykgeworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gcGFja2V0LT5tZXRhX2RhdGEoKTsKICNpZiAwCiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgaWYgKHBhY2tldC0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZmluZEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVN0YW1wVXMpKSB7CiAgICAgICAgIEFMT0dJKCJmb3VuZCB0aW1lID0gJWxsZCB1cyIsIHRpbWVVcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0koIk5PIHRpbWUiKTsKICAgICB9CiAjZW5kaWYKIAotICAgIHBhY2tldC0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgICpvdXQgPSBwYWNrZXQ7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgQUxPR1YoInJldHVybmluZyBidWZmZXIgJXAiLCBwYWNrZXQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE15T2dnRXh0cmFjdG9yOjpNeU9nZ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCiAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcykKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICA6IG1CdWZmZXJHcm91cChOVUxMKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbVByZXZHcmFudWxlUG9zaXRpb24oMCksCkBAIC0zMTEsMjEgKzMyMCwyNSBAQAogICAgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKICAgICAgIG1OdW1IZWFkZXJzKG51bUhlYWRlcnMpLAogICAgICAgbVNlZWtQcmVSb2xsVXMoc2Vla1ByZVJvbGxVcyksCi0gICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSB7CisgICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSwKKyAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQoMCkgewogICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwogCiAgICAgdm9yYmlzX2luZm9faW5pdCgmbVZpKTsKICAgICB2b3JiaXNfY29tbWVudF9pbml0KCZtVmMpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1GaWxlTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIH0KIAogTXlPZ2dFeHRyYWN0b3I6On5NeU9nZ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CiAgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7CiB9CiAKLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSBjb25zdCB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSBjb25zdCB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKQEAgLTUwNSwyNyArNTE4LDI3IEBACiAgICAgICAgIGlmIChuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyWzRdICE9IDApIHsKICAgICAgICAgLy8gV3JvbmcgdmVyc2lvbi4KIAotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUZsYWdzID0gaGVhZGVyWzVdOwogCiAgICAgaWYgKHBhZ2UtPm1GbGFncyAmIH43KSB7CiAgICAgICAgIC8vIE9ubHkgYml0cyAwLTIgYXJlIGRlZmluZWQgaW4gdmVyc2lvbiAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7CkBAIC01NDIsNyArNTU1LDcgQEAKICAgICBpZiAobVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgIG9mZnNldCArIHNpemVvZihoZWFkZXIpLCBwYWdlLT5tTGFjZSwgcGFnZS0+bU51bVNlZ21lbnRzKQogICAgICAgICAgICAgPCAoc3NpemVfdClwYWdlLT5tTnVtU2VnbWVudHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOzsKQEAgLTU2NSwyMiArNTc4LDIyIEBACiAgICAgcmV0dXJuIHNpemVvZihoZWFkZXIpICsgcGFnZS0+bU51bVNlZ21lbnRzICsgdG90YWxTaXplOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCkgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCkgewogICAgIGlmIChtT2Zmc2V0IDw9IG1GaXJzdERhdGFPZmZzZXQgJiYgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uIDwgMCkgewogICAgICAgICAvLyBUaGUgZmlyc3Qgc2FtcGxlIG1pZ2h0IG5vdCBzdGFydCBhdCB0aW1lIDA7IGZpbmQgb3V0IHdoZXJlIGJ5IHN1YnRyYWN0aW5nCiAgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgZmlyc3QgcGFnZSBmcm9tIHRoZSBncmFudWxlIHBvc2l0aW9uCiAgICAgICAgIC8vIChwb3NpdGlvbiBvZiBsYXN0IGNvbXBsZXRlIHNhbXBsZSkgb2YgdGhlIGZpcnN0IHBhZ2UuIFRoaXMgaGFwcGVucwogICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZWFkIGEgcGFja2V0IGZyb20gdGhlIGZpcnN0IHBhZ2UuCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZjsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWY7CiAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOwogICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LICYmIGVyciAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBGaXJzdCB0d28gcGFnZXMgYXJlIGhlYWRlciBwYWdlcy4KLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOwpAQCAtNjAxLDMyICs2MTQsMzMgQEAKICAgICAgICAgc2Vla1RvT2Zmc2V0KDApOwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCiAgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOwogICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gKCpvdXQpLT5tZXRhX2RhdGEoKTsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKICAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKICAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgewogICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgY3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgIH0KICAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOwotICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKIAogICAgIHVpbnQzMl90IGZyYW1lcyA9IGdldE51bVNhbXBsZXNJblBhY2tldCgqb3V0KTsKICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uICs9IGZyYW1lczsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotdWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0IHsKK3VpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIGNvbnN0IHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjcyLDEwICs2ODYsNjYgQEAKICAgICByZXR1cm4gbnVtU2FtcGxlczsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworLyoKKyAqIGJhc2ljIG1lZGlhYnVmZmVyIGltcGxlbWVudGF0aW9uIHVzZWQgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBvZiB0aGUKKyAqIGhlYWRlciBwYWNrZXRzLCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBoYXZlIGEgYnVmZmVyIGdyb3VwCisgKi8KK2NsYXNzIFN0YW5kQWxvbmVNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckhlbHBlciB7Citwcml2YXRlOgorICAgIHZvaWQgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbU9mZnNldDsKKyAgICBzaXplX3QgbUxlbmd0aDsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CitwdWJsaWM6CisgICAgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKHNpemVfdCBzaXplKSA6IE1lZGlhQnVmZmVySGVscGVyKE5VTEwpIHsKKyAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICBtRGF0YSA9IG1hbGxvYyhtU2l6ZSk7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtTGVuZ3RoID0gbVNpemU7CisgICAgICAgIG1Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVkIHN0YW5kYWxvbmUgbWVkaWEgYnVmZmVyICVwIG9mIHNpemUgJXp1IiwgdGhpcywgbVNpemUpOworICAgIH0KKworICAgIH5TdGFuZEFsb25lTWVkaWFCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1Gb3JtYXQpOworICAgICAgICBBTE9HVigiZGVsZXRlZCBzdGFuZGFsb25lIG1lZGlhIGJ1ZmZlciAlcCBvZiBzaXplICV6dSIsIHRoaXMsIG1TaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KKworICAgIHZvaWQqIGRhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9vZmZzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtT2Zmc2V0OworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9sZW5ndGgoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0KKworICAgIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0ICptZXRhX2RhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRm9ybWF0OworICAgIH0KK307CisKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBOVUxMOwogICAgIGludDY0X3QgdGltZVVzID0gLTE7CiAKICAgICBmb3IgKDs7KSB7CkBAIC03MDksMTYgKzc3OSwyMyBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXAgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShmdWxsU2l6ZSk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqdG1wOworICAgICAgICAgICAgaWYgKG1CdWZmZXJHcm91cCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCwgZmFsc2UsIGZ1bGxTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZWQgYnVmZmVyICVwIGZyb20gZ3JvdXAiLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZXcgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKHRtcC0+bWV0YV9kYXRhKCkpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC03MzcsNyArODE0LDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIChsb25nIGxvbmcpZGF0YU9mZnNldCwgbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZ1bGxTaXplKTsKQEAgLTc0OCw4ICs4MjUsOSBAQAogICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgcmVhZCB0aGUgZW50aXJlIHBhY2tldC4KIAogICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQYWNrZXRJblBhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzcwLDExICs4NDgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyArPSBhY3R1YWxCbG9ja1NpemUgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCwgdGhlIGJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCkBAIC03OTMsNyArODcyLDcgQEAKIAogICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOwogCi0gICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gbiA8IDAgPyAobWVkaWFfc3RhdHVzX3QpIG4gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFByZXZlbnQgYSBoYXJtbGVzcyB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGJ5IGNsYW1waW5nIHRvIDAKQEAgLTgxNiwzNiArODk1LDM4IEBACiAgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb21wbGV0ZS4KIAogICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE15T2dnRXh0cmFjdG9yOjppbml0KCkgewotICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtTWltZVR5cGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbU1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGVycjsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnBhY2tldDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKICAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCi0gICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IE9LKSB7CisgICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAvKiB0eXBlID0gKi8gaSAqIDIgKyAxKTsKICAgICAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CkBAIC04NjUsMTIgKzk0NiwxMiBAQAogCiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKIAotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewpAQCAtOTEyLDcgKzk5Myw3IEBACiAgICAgfQogfQogCi1pbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCkBAIC05NTIsNyArMTAzMyw3IEBACiAgICAgcmV0dXJuIHBjbVNhbXBsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgLy8gdGhlcmUgYXJlIGFjdHVhbGx5IG5vIGhlYWRlciB0eXBlcyBkZWZpbmVkIGluIHRoZSBPcHVzIHNwZWM7IHdlIGNob29zZSAxIGFuZCAzIHRvIG1lYW4KICAgICAgICAgLy8gaGVhZGVyIGFuZCBjb21tZW50cyBzdWNoIHRoYXQgd2UgY2FuIHNoYXJlIGNvZGUgd2l0aCBNeVZvcmJpc0V4dHJhY3Rvci4KQEAgLTk2MSwxMSArMTA0MiwxMSBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CkBAIC05NzUsMjkgKzEwNTYsMzEgQEAKICAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQogICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCiAgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1DaGFubmVsQ291bnQgPSBkYXRhWzldOwogICAgIG1Db2RlY0RlbGF5ID0gVTE2TEVfQVQoJmRhdGFbMTBdKTsKIAotICAgIG1NZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKLSAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCi0gICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgLy8ga0tleU9wdXNIZWFkZXIgaXMgY3NkLTAKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1DaGFubmVsQ291bnQpOworICAgIGludDY0X3QgY29kZWNkZWxheSA9IG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY2RlbGF5LCBzaXplb2YoY29kZWNkZWxheSkpOworICAgIGludDY0X3QgcHJlcm9sbCA9IGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZwcmVyb2xsLCBzaXplb2YocHJlcm9sbCkpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgLy8gYWRkIGFydGlmaWNpYWwgZnJhbWluZyBiaXQgc28gd2UgY2FuIHJldXNlIF92b3JiaXNfdW5wYWNrX2NvbW1lbnQKICAgICBpbnQzMl90IGNvbW1lbnRTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDE7CiAgICAgYXV0byB0bXAgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNvbW1lbnRTaXplKTsKICAgICB1aW50OF90ICpjb21tZW50RGF0YSA9IHRtcC5nZXQoKTsKICAgICBpZiAoY29tbWVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtZW1jcHkoY29tbWVudERhdGEsCkBAIC0xMDI2LDE0ICsxMTA5LDE0IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJMZW47ICsraSkgewogICAgICAgICBjaGFyIGNociA9IG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CiAgICAgICAgIGlmIChjaHIgIT0gT3B1c1RhZ3NbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCB2ZW5kb3Igc3RyaW5nCiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSB2ZW5kb3JMZW47CkBAIC0xMDQ0LDEzICsxMTI3LDEzIEBACiAgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgaW50MzJfdCBsZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgICAgICBpZiAobGVuICA8IDAgfHwgbGVuICA+IChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOwogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CkBAIC0xMDU4LDcgKzExNDEsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBjb21tZW50RGF0YVtmcmFtaW5nQml0T2Zmc2V0XSA9IDE7CiAKQEAgLTEwNzUsMjIgKzExNTgsMjMgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKICAgICBpbnQgZXJyID0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cyk7CiAgICAgaWYgKDAgIT0gZXJyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIHNldENoYW5uZWxNYXNrKG1DaGFubmVsQ291bnQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKK21lZGlhX3N0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIAogICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIGlmIChzaXplIDwgNyB8fCBkYXRhWzBdICE9IHR5cGUgfHwgbWVtY21wKCZkYXRhWzFdLCAidm9yYmlzIiwgNikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgb2dnX2J1ZmZlciBidWY7CkBAIC0xMTA5LDcgKzExOTMsNyBAQAogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogCiAgICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA2OyArK2kpIHsKICAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsgIC8vIHNraXAgJ3ZvcmJpcycKQEAgLTExMTksMTMgKzEyMDMsMTMgQEAKICAgICAgICAgY2FzZSAxOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1WaS5yYXRlKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1WaS5jaGFubmVscyk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVZpLnJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1WaS5jaGFubmVscyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIG1WaS5iaXRyYXRlX25vbWluYWwpOwogCiAgICAgICAgICAgICBBTE9HVigibG93ZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX2xvd2VyKTsKICAgICAgICAgICAgIEFMT0dWKCJ1cHBlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfdXBwZXIpOwpAQCAtMTE0MCw3ICsxMjI0LDcgQEAKICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewogICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoYnBzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTExNDksMjUgKzEyMzMsMjYgQEAKICAgICAgICAgY2FzZSAzOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgICAgICAgICBzZXRDaGFubmVsTWFzayhtVmkuY2hhbm5lbHMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIDU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKCZtVmksICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsIGRhdGEsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSBjb25zdCB7CkBAIC0xMTgwLDIwICsxMjY1LDQzIEBACiAKIAogdm9pZCBNeU9nZ0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7Ci0gICAgbUZpbGVNZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZjLmNvbW1lbnRzOyArK2kpIHsKICAgICAgICAgY29uc3QgY2hhciAqY29tbWVudCA9IG1WYy51c2VyX2NvbW1lbnRzW2ldOwogICAgICAgICBzaXplX3QgY29tbWVudExlbmd0aCA9IG1WYy5jb21tZW50X2xlbmd0aHNbaV07Ci0gICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudCgmbUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KG1GaWxlTWV0YSwgY29tbWVudCwgY29tbWVudExlbmd0aCk7CiAgICAgICAgIC8vQUxPR0koImNvbW1lbnQgIyVkOiAnJXMnIiwgaSArIDEsIG1WYy51c2VyX2NvbW1lbnRzW2ldKTsKICAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZpbGVNZXRhLCAiaGFwdGljIiwgJm1IYXB0aWNDaGFubmVsQ291bnQpOworfQorCit2b2lkIE15T2dnRXh0cmFjdG9yOjpzZXRDaGFubmVsTWFzayhpbnQgY2hhbm5lbENvdW50KSB7CisgICAgLy8gU2V0IGNoYW5uZWwgbWFzayBhY2NvcmRpbmcgdG8gY2hhbm5lbCBjb3VudC4gV2hlbiBoYXB0aWMgY2hhbm5lbCBjb3VudCBpcyBmb3VuZCBpbgorICAgIC8vIGZpbGUgbWV0YSwgc2V0IGhhcHRpYyBjaGFubmVsIG1hc2sgdG8gdHJ5IGhhcHRpYyBwbGF5YmFjay4KKyAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIGhhcHRpY19jaGFubmVsX21hc2tfZnJvbV9jb3VudChtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBhdWRpb0NoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudCAtIG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGlmIChoYXB0aWNDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOVkFMSUQKKyAgICAgICAgICAgICAgICB8fCBhdWRpb0NoYW5uZWxDb3VudCA8PSAwIHx8IGF1ZGlvQ2hhbm5lbENvdW50ID4gRkNDXzgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGhhcHRpYyBjaGFubmVsIGNvdW50IGZvdW5kIGluIG1ldGFkYXRhOiAlZCIsIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ2hhbm5lbENvdW50KSB8IGhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywgY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSk7CisgICAgfQogfQogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU9nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitPZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1JbXBsKE5VTEwpIHsKQEAgLTEyMjAsMTMgKzEzMjgsMTQgQEAKIE9nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbUltcGw7CiAgICAgbUltcGwgPSBOVUxMOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE9nZ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAotTWVkaWFUcmFjayAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTIzNCwzMyArMTM0MywzNCBAQAogICAgIHJldHVybiBuZXcgT2dnU291cmNlKHRoaXMpOwogfQogCi1zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICByZXR1cm4gbUltcGwtPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1JbXBsLT5nZXRGaWxlTWV0YURhdGEobWV0YSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IE9nZ0V4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBPZ2dFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKICAgICBjaGFyIHRtcFs0XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgeworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xMjcyLDEzICsxMzgyLDEzIEBACiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4Y2M1Y2QwNi1mNzcyLTQ5NWUtOGE2Mi1jYmE5NjQ5Mzc0ZTkiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiT2dnIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYyID0gU25pZmYgfQogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKaW5kZXggOWZlMjk0NC4uYzc1ZGZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmgKQEAgLTE5LDI1ICsxOSwyNiBAQAogI2RlZmluZSBPR0dfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IE15T2dnRXh0cmFjdG9yOwogc3RydWN0IE9nZ1NvdXJjZTsKIAotc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgT2dnRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiT2dnRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CkBAIC00Niw3ICs0Nyw3IEBACiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgT2dnU291cmNlOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBNeU9nZ0V4dHJhY3RvciAqbUltcGw7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAppbmRleCBkZDA0NWI5Li43ZTg5MjcxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTcsMTEgKzcsMTMgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggZmU1MDliZi4uNmY5ZjY4OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMzIgQEAKIAogI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCiAKKy8vIE5PVEU6IFRoaXMgY29kZSBhc3N1bWVzIHRoZSBkZXZpY2UgcHJvY2Vzc29yIGlzIGxpdHRsZSBlbmRpYW4uCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBGTEFDRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGVudW0gewogICAgIFdBVkVfRk9STUFUX1BDTSAgICAgICAgPSAweDAwMDEsCiAgICAgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCA9IDB4MDAwMywKQEAgLTU1LDIwICs2NiwyMCBAQAogICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKIH0KIAotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgV0FWU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KIApAQCAtNzgsNjQgKzg5LDcyIEBACiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzaXplX3QgbVNpemU7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKIAogICAgIFdBVlNvdXJjZShjb25zdCBXQVZTb3VyY2UgJik7CiAgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOwogfTsKIAotV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1UcmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgbUluaXRDaGVjayA9IGluaXQoKTsKIH0KIAogV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGEpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBXQVZFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKICAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAotICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSksIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja01ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFdBVkV4dHJhY3Rvcjo6aW5pdCgpIHsKQEAgLTE4NSw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NVUxBVwogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NU0dTTQogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwpAQCAtMTk4LDEzICsyMTcsMTMgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzJdKTsKIAotICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gOCkgeworICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gRkNDXzgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzICglZCkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gRkNDXzIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1vcmUgdGhhbiAyIGNoYW5uZWxzICglZCkgaW4gbm9uLVdBVkVfRVhULCB1bmtub3duIGNoYW5uZWwgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjQsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkQml0c1BlclNhbXBsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgidmFsaWRCaXRzKCVkKSAhPSBiaXRzUGVyU2FtcGxlKCVkKSBhcmUgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgpAQCAtMjg0LDM1ICszMDMsMzMgQEAKICAgICAgICAgICAgICAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1UcmFja01ldGEpOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChtV2F2ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIG1CaXRzUGVyU2FtcGxlKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewogICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwpAQCAtMzIyLDE4ICszMzksMTggQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzUGVyU2FtcGxlIHx8ICFtTnVtQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbURhdGFTaXplIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TYW1wbGVSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQpAQCAtMzQ4LDI1ICszNjUsMjEgQEAKIGNvbnN0IHNpemVfdCBXQVZTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAzMjc2ODsKIAogV0FWU291cmNlOjpXQVZTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1NZXRhKG1ldGEpLAogICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1PZmZzZXQob2Zmc2V0KSwKICAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpIHsKLSAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbU51bUNoYW5uZWxzKSk7Ci0KLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmbVNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm1OdW1DaGFubmVscykpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZtQml0c1BlclNhbXBsZSkpOwogfQogCiBXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CkBAIC0zNzUsNTIgKzM4OCw1MSBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICAvLyBzb21lIFdBViBmaWxlcyBtYXkgaGF2ZSBsYXJnZSBhdWRpbyBidWZmZXJzIHRoYXQgdXNlIHNoYXJlZCBtZW1vcnkgdHJhbnNmZXIuCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKTsKLQotICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgOC0+MTYgYml0IGNvbnZlcnNpb24uCi0gICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgaWYgKCFtQnVmZmVyR3JvdXAtPmluaXQoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdG9wIik7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6Z2V0Rm9ybWF0Iik7CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNDQyLDE4ICs0NTQsMjIgQEAKICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBtYXhCeXRlc1RvUmVhZCBpcyBtdWx0aXBsZSBvZiAzLCBpbiAyNC1iaXQgY2FzZQotICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9Ci0gICAgICAgIG1CaXRzUGVyU2FtcGxlID09IDggPyBrTWF4RnJhbWVTaXplIC8gMiA6IAotICAgICAgICAobUJpdHNQZXJTYW1wbGUgPT0gMjQgPyAzKihrTWF4RnJhbWVTaXplLzMpOiBrTWF4RnJhbWVTaXplKTsKKyAgICAvLyBtYXhCeXRlc1RvUmVhZCBtYXkgYmUgcmVkdWNlZCBzbyB0aGF0IGluLXBsYWNlIGRhdGEgY29udmVyc2lvbiB3aWxsIGZpdCBpbiBidWZmZXIgc2l6ZS4KKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZDsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7IC8vIGRlc3RpbmF0aW9uIGlzIGZsb2F0IGF0IDQgYnl0ZXMgcGVyIHNhbXBsZSwgc291cmNlIG1heSBiZSBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IChtQml0c1BlclNhbXBsZSAvIDgpICogKGJ1ZmZlclNpemUgLyA0KTsKKyAgICB9IGVsc2UgeyAvLyBkZXN0aW5hdGlvbiBpcyBpbnQxNl90IGF0IDIgYnl0ZXMgcGVyIHNhbXBsZSwgb25seSBzb3VyY2Ugb2YgOCBiaXRzIGlzIGxlc3MuCisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGJ1ZmZlclNpemUgLyAyIDogYnVmZmVyU2l6ZTsKKyAgICB9CiAKLSAgICBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQorICAgIGNvbnN0IHNpemVfdCBtYXhCeXRlc0F2YWlsYWJsZSA9CiAgICAgICAgIChtQ3VycmVudFBvcyAtIG1PZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpCiAgICAgICAgICAgICA/IDAgOiBtU2l6ZSAtIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpOwogCkBAIC00ODIsNDUgKzQ5OCw2NCBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCiAgICAgLy8gVE9ETzogYWRkIGNhcGFiaWxpdHkgdG8gcmV0dXJuIGRhdGEgYXMgZmxvYXQgUENNIGluc3RlYWQgb2YgMTYgYml0IFBDTS4KICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7Ci0gICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDgtYml0IHVuc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZC4KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgd2l0aCAyIGJ5dGUgd2lkZSBzYW1wbGVzCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcDsKLSAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OCgoaW50MTZfdCAqKXRtcC0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gdG1wOwotICAgICAgICB9IGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDI0KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwotICAgICAgICB9ICBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgewotICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMigoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgaWYgKG1PdXRwdXRGbG9hdCkgeworICAgICAgICAgICAgZmxvYXQgKmZkZXN0ID0gKGZsb2F0ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzd2l0Y2ggKG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbik7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fdTgoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAyOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmRlc3QsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDQgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gYnVmZmVyIHJhbmdlIGlzIGNvcnJlY3QKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kzMihmZGVzdCwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICBicmVhazsgLy8gbm8gdHJhbnNsYXRpb24gbmVlZGVkCisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoaWRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IGZsb2F0IHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICBpZiAoIW1PdXRwdXRGbG9hdCkgeyAvLyBtQml0c1BlclNhbXBsZSA9PSAzMgorICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChpZGVzdCwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIE5vdGU6IGlmIG91dHB1dCBlbmNvZGluZyBpcyBmbG9hdCwgbm8gbmVlZCB0byBjb252ZXJ0IGlmIHNvdXJjZSBpcyBmbG9hdC4KICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKQEAgLTUzMywzOSArNTY4LDQzIEBACiAgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVN0YW1wVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogICAgIG1DdXJyZW50UG9zICs9IG47CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBXQVZFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqaGVscGVyID0gbmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKTsKICAgICBjaGFyIGhlYWRlclsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICBpZiAoaGVscGVyLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIlJJRkYiLCA0KSB8fCBtZW1jbXAoJmhlYWRlcls4XSwgIldBVkUiLCA0KSkgeworICAgICAgICBkZWxldGUgaGVscGVyOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIFdBVkV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3RvcihoZWxwZXIpOyAvLyBleHRyYWN0b3Igb3ducyB0aGUgaGVscGVyCiAgICAgaW50IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBkZWxldGUgZXh0cmFjdG9yOwogICAgIGlmIChudW1UcmFja3MgPT0gMCkgewpAQCAtNTgwLDEzICs2MTksMTMgQEAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJXQVYgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjIgPSBTbmlmZiB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAppbmRleCA0NjdkMGI3Li5iNTE0MTk2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApAQCAtMTksMzAgKzE5LDMxIEBACiAjZGVmaW5lIFdBVl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiV0FWRXh0cmFjdG9yIjsgfQogCiAgICAgdmlydHVhbCB+V0FWRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtVmFsaWRGb3JtYXQ7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CkBAIC01Miw3ICs1Myw3IEBACiAgICAgdWludDE2X3QgbUJpdHNQZXJTYW1wbGU7CiAgICAgb2ZmNjRfdCBtRGF0YU9mZnNldDsKICAgICBzaXplX3QgbURhdGFTaXplOwotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YTsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAppbmRleCBkZThmMTIwLi44ODE5Zjg3IDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICAgICAgQ0ZBX1JHR0IsCiAgICAgICAgICAgICBDRkFfQkdHUiwKICAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX05PTkUsCiAgICAgICAgIH07CiAKICAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKQEAgLTg5LDcgKzkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOwogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQogICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCkBAIC0xOTcsNiArMTk3LDMzIEBACiAKICAgICAgICAgc3RhdHVzX3QgYWRkT3Bjb2RlUHJlYW1ibGUodWludDMyX3Qgb3Bjb2RlSWQpOwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIEJheWVyIEdhaW5NYXAgb3Bjb2RlKHMpIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIH07CiAKIH0gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKaW5kZXggOWFjN2UyYS4uOTMwNGY1MyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKQEAgLTYwLDM0ICs2MCwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OwogICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKLSAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7Ci0gICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CiAKLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OwotCi0gICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cwotICAgIHNpemVfdCBqID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7Ci0gICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOwotICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07Ci0gICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOwotICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgc3dpdGNoIChjZmEpIHsKKyAgICAgICAgY2FzZSBDRkFfUkdHQjoKKyAgICAgICAgY2FzZSBDRkFfR1JCRzoKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgY2FzZSBDRkFfQkdHUjoKKyAgICAgICAgICAgIGVyciA9IGFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGNmYSwgbGVuc1NoYWRpbmdNYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX05PTkU6CisgICAgICAgICAgICBlcnIgPSBhZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YShsc21XaWR0aCwgbHNtSGVpZ2h0LCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUFyZWFIZWlnaHQsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIENGQSBsYXlvdXQgJWQiLCBfX0ZVTkNUSU9OX18sIGNmYSk7CisgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKICAgICB9CisgICAgcmV0dXJuIGVycjsKK30KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEJheWVyR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CiAgICAgdWludDMyX3QgcmVkVG9wID0gMDsKICAgICB1aW50MzJfdCByZWRMZWZ0ID0gMDsKICAgICB1aW50MzJfdCBncmVlbkV2ZW5Ub3AgPSAwOwpAQCAtMTQzLDYgKzE0NSwzMiBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOworICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07CisgICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOworICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLApAQCAtMjE2LDYgKzI0NCw0NiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqbWFwID0gbWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIG1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2ldOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9tYXApOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiOTgxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcl9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDQ3NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRPRE8gcmVtb3ZlIHRoZW4gd2hlbiB3ZSBzdXBwb3J0IG90aGVyIGFyY2hpdGVjdHVyZXMKLUFQUF9BQkkgOj0gYXJtNjQtdjhhCi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJlODc3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvbG9vcGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzbmRmaWxlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJhdWRpb3V0aWxzCi1MT0NBTF9NT0RVTEUgOj0gYWF1ZGlvX2xvb3BiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggYTJiOTE3Ny4uYTVkYzU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC0yODMsNyArMjgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmxlbihhcmcpID4gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIUFBdWRpb19zZXRNTWFwUG9saWN5KHBvbGljeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFBdWRpb19zZXRNTWFwUG9saWN5KHBvbGljeSkgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBpbnZhbGlkIE1NQVAgcG9saWN5IG1vZGUgJWlcbiIsIHBvbGljeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExYmQ0My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZV9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDRmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAppbmRleCBiOWUyOGEwLi40MDkwMjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC02LDYgKzYsNyBAQAogICAgICAgICAiY2xpZW50IiwKICAgICAgICAgImNvcmUiLAogICAgICAgICAiZmlmbyIsCisgICAgICAgICJmbG93Z3JhcGgiLAogICAgICAgICAibGVnYWN5IiwKICAgICAgICAgInV0aWxpdHkiLAogICAgIF0sCkBAIC0yNSw5ICsyNiw5IEBACiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCIsCiAgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5jcHAiLAotICAgICAgICAidXRpbGl0eS9MaW5lYXJSYW1wLmNwcCIsCiAgICAgICAgICJmaWZvL0ZpZm9CdWZmZXIuY3BwIiwKICAgICAgICAgImZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCIsCisgICAgICAgICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAiLApAQCAtNDIsNiArNDMsMTYgQEAKICAgICAgICAgImJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAiLAogICAgICAgICAiYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rRmxvYXQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rSTE2LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU2lua0kyNC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlSTE2LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlSTI0LmNwcCIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCmluZGV4IDk1OWRiNjEuLjNkMWJjOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CkBAIC0zNiw2ICs0MCw3IEBACiAKIHN0YXR1c190IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0RGV2aWNlSWQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0U2FtcGxlUmF0ZSgpKTsKQEAgLTQ2LDYgKzUxLDcgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0Rm9ybWF0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldERpcmVjdGlvbigpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRCdWZmZXJDYXBhY2l0eSgpKTsKQEAgLTYwLDcgKzY2LDcgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLndyaXRlVG9QYXJjZWwoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcygpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTgwLDcgKzg2LDggQEAKICAgICBzZXRTaGFyaW5nTW9kZSgoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSB2YWx1ZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldEZvcm1hdCgoYWF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CisgICAgc2V0Rm9ybWF0KChhdWRpb19mb3JtYXRfdCkgdmFsdWUpOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldERpcmVjdGlvbigoYWF1ZGlvX2RpcmVjdGlvbl90KSB2YWx1ZSk7CkBAIC05OSw4ICsxMDYsOSBAQAogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXRTZXNzaW9uSWQodmFsdWUpOworCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ucmVhZEZyb21QYXJjZWwoKTogcmVhZCBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggNjIwZWRjNy4uOWIzMjU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCkBAIC03Miw3ICs3Miw2IEBACiAgICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgdHJhbnNhY3QoT1BFTl9TVFJFQU0pIHJlYWRJbnQgJWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IE9QRU5fU1RSRUFNIHBhc3NlZCBzdHJlYW0gJWQiLCBzdHJlYW0pOwogICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgICAgfQogICAgICAgICBlcnIgPSBjb25maWd1cmF0aW9uT3V0cHV0LnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKaW5kZXggMGIwY2Y3Ny4uNjc5NTVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogCiB2b2lkIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnNldHVwKGNvbnN0IHVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpIHsKICAgICBtRmQucmVzZXQoZHVwKGZkLmdldCgpKSk7IC8vIHN0b3JlIGEgZHVwbGljYXRlIGZkCi0gICAgQUxPR1YoInNldHVwKCVkIC0+ICVkLCAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CisgICAgQUxPR1YoInNldHVwKGZkID0gJWQgLT4gJWQsIHNpemUgPSAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CiAgICAgbVNpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7CiB9CiAKQEAgLTEwNCw3ICsxMDQsOCBAQAogICAgIG1SZXNvbHZlZEFkZHJlc3MgPSAodWludDhfdCAqKSBtbWFwKDAsIG1TaXplSW5CeXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZC5nZXQoKSwgMCk7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgPT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKLSAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIGVycm5vID0gJXMiLCBmZC5nZXQoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIG5CeXRlcyA9ICVkLCBlcnJubyA9ICVzIiwKKyAgICAgICAgICAgICAgZmQuZ2V0KCksIG1TaXplSW5CeXRlcywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDgyYzIyNDAuLjRlYzM4YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtNzAsOCArNzAsOCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQpOwogCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgbUZkOwotICAgIGludDMyX3QgICAgIG1TaXplSW5CeXRlcyA9IDA7Ci0gICAgdWludDhfdCAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1TaXplSW5CeXRlcyA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOwogCiBwcml2YXRlOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQzYzZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvRmxvd0dyYXBoIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvRmxvd0dyYXBoLmgiCisKKyNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rRmxvYXQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kxNi5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTI0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUZsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkxNi5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMjQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0Zsb3dHcmFwaDo6Y29uZmlndXJlKGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCkgeworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpsYXN0T3V0cHV0ID0gbnVsbHB0cjsKKworICAgIEFMT0dEKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOworCisgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlRmxvYXQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUkxNj4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUkyND4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNvdXJjZSBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKyAgICBsYXN0T3V0cHV0ID0gJm1Tb3VyY2UtPm91dHB1dDsKKworICAgIC8vIEFwcGx5IHZvbHVtZSBhcyBhIHJhbXAgdG8gYXZvaWQgcG9wcy4KKyAgICBtVm9sdW1lUmFtcCA9IHN0ZDo6bWFrZV91bmlxdWU8UmFtcExpbmVhcj4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtVm9sdW1lUmFtcC0+aW5wdXQpOworICAgIGxhc3RPdXRwdXQgPSAmbVZvbHVtZVJhbXAtPm91dHB1dDsKKworICAgIC8vIEZvciBhIHB1cmUgZmxvYXQgZ3JhcGgsIHRoZXJlIGlzIGNoYW5jZSB0aGF0IHRoZSBkYXRhIHJhbmdlIG1heSBiZSB2ZXJ5IGxhcmdlLgorICAgIC8vIFNvIHdlIHNob3VsZCBjbGlwIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSB0aGF0IGFsbG93cyBhIGxpdHRsZSBoZWFkcm9vbS4KKyAgICBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgJiYgc2lua0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIG1DbGlwcGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGlwVG9SYW5nZT4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNsaXBwZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2xpcHBlci0+b3V0cHV0OworICAgIH0KKworICAgIC8vIEV4cGFuZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlmIHJlcXVpcmVkLgorICAgIGlmIChzb3VyY2VDaGFubmVsQ291bnQgPT0gMSAmJiBzaW5rQ2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBtQ2hhbm5lbENvbnZlcnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ub1RvTXVsdGlDb252ZXJ0ZXI+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtQ2hhbm5lbENvbnZlcnRlci0+aW5wdXQpOworICAgICAgICBsYXN0T3V0cHV0ID0gJm1DaGFubmVsQ29udmVydGVyLT5vdXRwdXQ7CisgICAgfSBlbHNlIGlmIChzb3VyY2VDaGFubmVsQ291bnQgIT0gc2lua0NoYW5uZWxDb3VudCkgeworICAgICAgICBBTE9HRSgiJXMoKSBDaGFubmVsIHJlZHVjdGlvbiBub3Qgc3VwcG9ydGVkLiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKworICAgIHN3aXRjaCAoc2lua0Zvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0Zsb2F0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtJMTY+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtJMjQ+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc2luayBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzaW5rRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVNpbmstPmlucHV0KTsKKworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpwcm9jZXNzKGNvbnN0IHZvaWQgKnNvdXJjZSwgdm9pZCAqZGVzdGluYXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbVNvdXJjZS0+c2V0RGF0YShzb3VyY2UsIG51bUZyYW1lcyk7CisgICAgbVNpbmstPnJlYWQoZGVzdGluYXRpb24sIG51bUZyYW1lcyk7Cit9CisKKy8qKgorICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgKi8KK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgbVZvbHVtZVJhbXAtPnNldFRhcmdldCh2b2x1bWUpOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbVZvbHVtZVJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWY2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKKyNkZWZpbmUgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKworY2xhc3MgQUF1ZGlvRmxvd0dyYXBoIHsKK3B1YmxpYzoKKyAgICAvKiogQ29ubmVjdCBzZXZlcmFsIG1vZHVsZXMgdG9nZXRoZXIgdG8gY29udmVydCBmcm9tIHNvdXJjZSB0byBzaW5rLgorICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRm9ybWF0CisgICAgICogQHBhcmFtIHNvdXJjZUNoYW5uZWxDb3VudAorICAgICAqIEBwYXJhbSBzaW5rRm9ybWF0CisgICAgICogQHBhcmFtIHNpbmtDaGFubmVsQ291bnQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpOworCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHZvaWQgKnNvdXJjZSwgdm9pZCAqZGVzdGluYXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICB2b2lkIHNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9Tb3VyY2U+ICAgICAgICAgIG1Tb3VyY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6UmFtcExpbmVhcj4gICAgICAgICAgIG1Wb2x1bWVSYW1wOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkNsaXBUb1JhbmdlPiAgICAgICAgICBtQ2xpcHBlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpNb25vVG9NdWx0aUNvbnZlcnRlcj4gbUNoYW5uZWxDb252ZXJ0ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9TaW5rPiAgICAgICAgICAgIG1TaW5rOworfTsKKworCisjZW5kaWYgLy9BTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKaW5kZXggZjhlMzRkMS4uMjE0Zjg4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpCkBAIC0yMDYsMTUgKzIwNiwxNSBAQAogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKQogewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVdyaXRlSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VSZWFkSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpzZXREYXRhUmVhZENvdW50ZXIoZmlmb19jb3VudGVyX3QgZnJhbWVzUmVhZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggOTIwNDgyNC4uZmZmY2RhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTM5LDcgKzM5LDYgQEAKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgogI2luY2x1ZGUgImZpZm8vRmlmb0J1ZmZlci5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogCkBAIC05MiwxMSArOTEsMTEgQEAKICAgICB9CiAKICAgICAvLyBXZSBoYXZlIHRvIGRvIHZvbHVtZSBzY2FsaW5nLiBTbyB3ZSBwcmVmZXIgRkxPQVQgZm9ybWF0LgotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9CiAgICAgLy8gUmVxdWVzdCBGTE9BVCBmb3IgdGhlIHNoYXJlZCBtaXhlci4KLSAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KICAgICByZXF1ZXN0LnNldFVzZXJJZChnZXR1aWQoKSk7CkBAIC0xMjYsMTMgKzEyNSwxMiBAQAogICAgICAgICAvLyBpZiB0aGF0IGZhaWxlZCB0aGVuIHRyeSBzd2l0Y2hpbmcgZnJvbSBtb25vIHRvIHN0ZXJlbyBpZiBPVVRQVVQuCiAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpbiB0aGUgY2xpZW50LiBPdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggYSBtb25vIG1peGVyIGluIHRoZSBzZXJ2aWNlCiAgICAgICAgIC8vIHRoYXQgd3JpdGVzIHRvIGEgc3RlcmVvIE1NQVAgc3RyZWFtLgotICAgICAgICBBTE9HRCgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQsIHRyeSBzd2l0Y2hpbmcgZnJvbSBNT05PIHRvIFNURVJFTyIsCisgICAgICAgIEFMT0dEKCIlcygpIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkLCB0cnkgc3dpdGNoaW5nIGZyb20gTU9OTyB0byBTVEVSRU8iLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVzUGVyRnJhbWUoMik7IC8vIHN0ZXJlbwogICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSA9IG1TZXJ2aWNlSW50ZXJmYWNlLm9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CiAgICAgfQogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA8IDApIHsKLSAgICAgICAgQUxPR0UoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlU3RyZWFtSGFuZGxlOwogICAgIH0KIApAQCAtMjEyLDkgKzIxMCw3IEBACiAgICAgICAgICAgICBtQ2FsbGJhY2tGcmFtZXMgPSBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7Ci0gICAgICAgIGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogYnl0ZXNQZXJGcmFtZTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBnZXRCeXRlc1BlckZyYW1lKCk7CiAgICAgICAgIG1DYWxsYmFja0J1ZmZlciA9IG5ldyB1aW50OF90W2NhbGxiYWNrQnVmZmVyU2l6ZV07CiAgICAgfQogCkBAIC02OTYsNyArNjkyLDYgQEAKICAgICB9CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbUF1ZGlvRW5kcG9pbnQuc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFkanVzdGVkRnJhbWVzLCAmYWN0dWFsRnJhbWVzKTsKLSAgICBBTE9HRCgic2V0QnVmZmVyU2l6ZSgpIHJlcSA9ICVkID0+ICVkIiwgcmVxdWVzdGVkRnJhbWVzLCBhY3R1YWxGcmFtZXMpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAppbmRleCAwNDI1Y2Q1Li4zYmI5ZTFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CkBAIC0xOTMsNiArMTkyLDggQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtU2VydmljZUxhdGVuY3lOYW5vcyA9IDA7CiAKKyAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGNoYW5uZWwgY291bnQgZnJvbSB0aGUgYXBwLgorICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbURldmljZUNoYW5uZWxDb3VudCA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKaW5kZXggMDcxOWZlMS4uNThlZjdiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKQEAgLTE2NSwzNSArMTY2LDM2IEBACiAgICAgLy8gUmVhZCBkYXRhIGluIG9uZSBvciB0d28gcGFydHMuCiAgICAgZm9yIChpbnQgcGFydEluZGV4ID0gMDsgZnJhbWVzTGVmdCA+IDAgJiYgcGFydEluZGV4IDwgV3JhcHBpbmdCdWZmZXI6OlNJWkU7IHBhcnRJbmRleCsrKSB7CiAgICAgICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gZnJhbWVzTGVmdDsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKICAgICAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA8PSAwKSBicmVhazsKIAogICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gZnJhbWVzQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNBdmFpbGFibGU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOwotICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvUHJvY2VzczsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGRlc3RpbmF0aW9uRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CiAgICAgICAgIC8vIFRPRE8gZmFjdG9yIHRoaXMgb3V0IGludG8gYSB1dGlsaXR5IGZ1bmN0aW9uCi0gICAgICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBnZXRGb3JtYXQoKSkgeworICAgICAgICBpZiAoc291cmNlRm9ybWF0ID09IGRlc3RpbmF0aW9uRm9ybWF0KSB7CiAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwgbnVtQnl0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIEZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIGF1ZGlvX2Zvcm1hdF90IHNvdXJjZSA9ICV1LCBkZXN0ID0gJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIGRlc3RpbmF0aW9uRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIH0KICAgICAgICAgZGVzdGluYXRpb24gKz0gbnVtQnl0ZXM7CkBAIC0yNTYsNyArMjU4LDcgQEAKICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dEKCJjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAppbmRleCA3OTViYTJjLi45YWY0N2IyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCkBAIC00Myw5ICs0MywxNyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKGJ1aWxkZXIpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHJlc3VsdCA9IG1GbG93R3JhcGguY29uZmlndXJlKGdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgICAvLyBTYW1wbGUgcmF0ZSBpcyBjb25zdHJhaW5lZCB0byBjb21tb24gdmFsdWVzIGJ5IG5vdyBhbmQgc2hvdWxkIG5vdCBvdmVyZmxvdy4KICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMgPSBrUmFtcE1TZWMgKiBnZXRTYW1wbGVSYXRlKCkgLyBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQ7Ci0gICAgICAgIG1Wb2x1bWVSYW1wLnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgICAgIG1GbG93R3JhcGguc2V0UmFtcExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yMTYsMjIgKzIyNCwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Xcml0ZTsKLSAgICAgICAgICAgIC8vIERhdGEgY29udmVyc2lvbi4KLSAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbTsKLSAgICAgICAgICAgIGZsb2F0IGxldmVsVG87Ci0gICAgICAgICAgICBtVm9sdW1lUmFtcC5uZXh0U2VnbWVudChmcmFtZXNUb1dyaXRlLCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7CiAKLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgc291cmNlKAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWJ5dGVCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIGdldEZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSk7Ci0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIGRlc3RpbmF0aW9uKAotICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7Ci0KLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoc291cmNlLCBkZXN0aW5hdGlvbiwgZnJhbWVzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKKyAgICAgICAgICAgIG1GbG93R3JhcGgucHJvY2Vzcygodm9pZCAqKWJ5dGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvV3JpdGUpOwogCiAgICAgICAgICAgICBieXRlQnVmZmVyICs9IG51bUJ5dGVzOwogICAgICAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1dyaXRlOwpAQCAtMjk3LDcgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMzEzLDYgKzMwOSw2IEBACiAgICAgZmxvYXQgY29tYmluZWRWb2x1bWUgPSBtU3RyZWFtVm9sdW1lICogZ2V0RHVja0FuZE11dGVWb2x1bWUoKTsKICAgICBBTE9HRCgiJXMoKSBtU3RyZWFtVm9sdW1lICogZHVja0FuZE11dGVWb2x1bWUgPSAlZiAqICVmID0gJWYiLAogICAgICAgICAgIF9fZnVuY19fLCBtU3RyZWFtVm9sdW1lLCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpLCBjb21iaW5lZFZvbHVtZSk7Ci0gICAgbVZvbHVtZVJhbXAuc2V0VGFyZ2V0KGNvbWJpbmVkVm9sdW1lKTsKKyAgICBtRmxvd0dyYXBoLnNldFRhcmdldFZvbHVtZShjb21iaW5lZFZvbHVtZSk7CiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKaW5kZXggOTc3YTkwOS4uY2FiMjk0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwpAQCAtOTMsNyArOTQsNyBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVzUmVhZCA9IDA7IC8vIHVzZWQgdG8gcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbgogCi0gICAgTGluZWFyUmFtcCAgICAgICAgICAgICAgIG1Wb2x1bWVSYW1wOworICAgIEFBdWRpb0Zsb3dHcmFwaCAgICAgICAgICBtRmxvd0dyYXBoOwogCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCBkZjBkYjc5Li4yZmIzOTg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTE0NiwxNCArMTQ2LDE0IEBACiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoY2hhbm5lbENvdW50KTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTE2Nyw3ICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoZm9ybWF0KTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgZXZlcnl3aGVyZSBpbnRlcm5hbGx5LgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGludGVybmFsRm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGZvcm1hdCk7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIzOSw3ICsyNDEsNyBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IG51bGxwdHI7CiAgICAgLy8gUGxlYXNlIGxlYXZlIHRoZXNlIGxvZ3MgYmVjYXVzZSB0aGV5IGFyZSB2ZXJ5IGhlbHBmdWwgd2hlbiBkZWJ1Z2dpbmcuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXyk7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gQ09NTU9OX0dFVF9GUk9NX0JVSUxERVJfT1JfUkVUVVJOKHN0cmVhbVB0cik7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0cmVhbUJ1aWxkZXItPmJ1aWxkKCZhdWRpb1N0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIHJldHVybnMgJWQgPSAlcyBmb3IgKCVwKSAtLS0tLS0tLS0tLS0tLS0tIiwKQEAgLTI2Nyw3ICsyNjksNyBAQAogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fRVJST1JfTlVMTDsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zYWZlQ2xvc2UoKTsKICAgICAgICAgLy8gQ2xvc2Ugd2lsbCBvbmx5IGZhaWwgaWYgY2FsbGVkIGlsbGVnYWxseSwgZm9yIGV4YW1wbGUsIGZyb20gYSBjYWxsYmFjay4KQEAgLTI4Miw3ICsyODQsNyBAQAogICAgIC8vIFdlJ3JlIHBvdGVudGlhbGx5IGZyZWVpbmcgYHN0cmVhbWAgYWJvdmUsIHNvIGl0cyB1c2UgaGVyZSBtYWtlcyBzb21lCiAgICAgLy8gc3RhdGljIGFuYWx5c2lzIHRvb2xzIHVuaGFwcHkuIENhc3RpbmcgdG8gdWludHB0cl90IGhlbHBzIGFzc3VyZQogICAgIC8vIHNhaWQgdG9vbHMgdGhhdCB3ZSdyZSBub3QgZG9pbmcgYW55dGhpbmcgYmFkIGhlcmUuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLAorICAgIEFMT0dEKCIlcyglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywKICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oc3RyZWFtKSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMjkwLDMwICsyOTIsMzAgQEAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKKyAgICBBTE9HRCgiJXMoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBzdHJlYW0sIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1QYXVzZSgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCVwKSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnNhZmVGbHVzaCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdG9wKCk7CiB9CiAKQEAgLTQwOCw3ICs0MTAsOSBAQAogQUFVRElPX0FQSSBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGludGVybmFsbHkuCisgICAgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggZDU2NzAxYi4uYmQ0MjY5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtNDgsNiArNDgsMjAgQEAKICAgICBtSW5wdXRQcmVzZXQgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OwogfQogCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IGlzRm9ybWF0VmFsaWQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkLCBhdWRpb19mb3JtYXRfdCA9IDB4JTA4eCIsIGZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOworICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKQEAgLTc5LDE2ICs5Myw4IEBACiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG1BdWRpb0Zvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkID0gJWQiLCBtQXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKLSAgICAgICAgICAgIC8vIGJyZWFrOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gaXNGb3JtYXRWYWxpZCAobUF1ZGlvRm9ybWF0KTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgcmV0dXJuIHJlc3VsdDsKIAogICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVSYXRlIDwgU0FNUExFX1JBVEVfSFpfTUlOIHx8IG1TYW1wbGVSYXRlID4gU0FNUExFX1JBVEVfSFpfTUFYKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggY2U1ZGFjZC4uNmJlYjRiMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC01NiwxMSArNTYsMTEgQEAKICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1BdWRpb0Zvcm1hdDsKICAgICB9CiAKLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBtQXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdDsKICAgICB9CiAKQEAgLTEyMCw4ICsxMjAsMTEgQEAKICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ5dGVzIHBlciBmcmFtZSBvZiBnZXRGb3JtYXQoKQorICAgICAqLwogICAgIGludDMyX3QgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXRGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzksNyArMTQyLDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICBtRGlyZWN0aW9uICAgICAgID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggMzU4MDIxYi4uMzkxYWYyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC0zNyw3ICszNyw2IEBACiB9CiAKIEF1ZGlvU3RyZWFtOjp+QXVkaW9TdHJlYW0oKSB7Ci0gICAgQUxPR0QoImRlc3Ryb3lpbmcgJXAsIHN0YXRlID0gJXMiLCB0aGlzLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAppbmRleCAzMWI4OTVjLi42MDIwMGIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaApAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSAgY29uc3QgewogICAgICAgICByZXR1cm4gbUZvcm1hdDsKICAgICB9CiAKQEAgLTI0OSwyMSArMjQ5LDE0IEBACiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldEZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKG1Gb3JtYXQpOworICAgICAgICByZXR1cm4gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldERldmljZUZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZUZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZSAqIGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldERldmljZUZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXREZXZpY2VGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSA9IDA7CkBAIC00NzgsMTggKzQ3MSwxOCBAQAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0Rm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KLSAgICB2b2lkIHNldERldmljZUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgdm9pZCBzZXREZXZpY2VGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CiAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXREZXZpY2VGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlRm9ybWF0OwogICAgIH0KIApAQCAtNTY1LDcgKzU1OCw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICAgbVNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CiAKQEAgLTU3Nyw3ICs1NzAsNyBAQAogCiAgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQgZnJvbSB0aGUgYXBwLgogICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAogICAgIC8vIGNhbGxiYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IGIwOTI1OGUuLmY1MTEzZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIzLDMwICsyMywyNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oIgogI2luY2x1ZGUgIkZpZm9CdWZmZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7IC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdDsKIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUsIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcykKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCi0gICAgICAgICwgbVN0b3JhZ2UobnVsbHB0cikKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQorICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCiB7Ci0gICAgLy8gVE9ETyBIYW5kbGUgcG9zc2libGUgZmFpbHVyZXMgdG8gYWxsb2NhdGUuIE1vdmUgb3V0IG9mIGNvbnN0cnVjdG9yPwotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVyKGNhcGFjaXR5SW5GcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOworICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlcj4oY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCiAgICAgaW50MzJfdCBieXRlc1BlckJ1ZmZlciA9IGJ5dGVzUGVyRnJhbWUgKiBjYXBhY2l0eUluRnJhbWVzOwogICAgIG1TdG9yYWdlID0gbmV3IHVpbnQ4X3RbYnl0ZXNQZXJCdWZmZXJdOwogICAgIG1TdG9yYWdlT3duZWQgPSB0cnVlOwotICAgIEFMT0dWKCJjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCi0gICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CisgICAgQUxPR1YoIiVzKCkgY2FwYWNpdHlJbkZyYW1lcyA9ICVkLCBieXRlc1BlckZyYW1lID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKIH0KIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlciggaW50MzJfdCAgIGJ5dGVzUGVyRnJhbWUsCkBAIC01NSwxNCArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICogIHdyaXRlSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICBkYXRhU3RvcmFnZUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKICAgICAgICAgLCBtU3RvcmFnZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KGRhdGFTdG9yYWdlQWRkcmVzcykpCi0gICAgICAgICwgbUZyYW1lc1JlYWRDb3VudCgwKQotICAgICAgICAsIG1GcmFtZXNVbmRlcnJ1bkNvdW50KDApCi0gICAgICAgICwgbVVuZGVycnVuQ291bnQoMCkKIHsKLSAgICBtRmlmbyA9IG5ldyBGaWZvQ29udHJvbGxlckluZGlyZWN0KGNhcGFjaXR5SW5GcmFtZXMsCisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVySW5kaXJlY3Q+KGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEluZGV4QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW5kZXhBZGRyZXNzKTsKQEAgLTczLDEwICs2NSw4IEBACiAgICAgaWYgKG1TdG9yYWdlT3duZWQpIHsKICAgICAgICAgZGVsZXRlW10gbVN0b3JhZ2U7CiAgICAgfQotICAgIGRlbGV0ZSBtRmlmbzsKIH0KIAotCiBpbnQzMl90IEZpZm9CdWZmZXI6OmNvbnZlcnRGcmFtZXNUb0J5dGVzKGZpZm9fZnJhbWVzX3QgZnJhbWVzKSB7CiAgICAgcmV0dXJuIGZyYW1lcyAqIG1CeXRlc1BlckZyYW1lOwogfQpAQCAtODcsMTEgKzc3LDEyIEBACiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKICAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKICAgICAgICAgLy8gRG9lcyB0aGUgYXZhaWxhYmxlIGRhdGEgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgRklGTz8KLSAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IG1GcmFtZUNhcGFjaXR5KSB7CisgICAgICAgIGlmICgoc3RhcnRJbmRleCArIGZyYW1lc0F2YWlsYWJsZSkgPiBjYXBhY2l0eSkgewogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMF0gPSBzb3VyY2U7Ci0gICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OworICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lcyA9IGNhcGFjaXR5IC0gc3RhcnRJbmRleDsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmaXJzdEZyYW1lczsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gJm1TdG9yYWdlWzBdOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IGZyYW1lc0F2YWlsYWJsZSAtIGZpcnN0RnJhbWVzOwpAQCAtMTA3LDcgKzk4LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRGdWxsRGF0YUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBiZSBvdmVyZnVsbCBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWZvLT5nZXRDYXBhY2l0eSgpKTsKICAgICBmaWZvX2ZyYW1lc190IHN0YXJ0SW5kZXggPSBtRmlmby0+Z2V0UmVhZEluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xMTUsNyArMTA3LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7CiAgICAgLy8gVGhlIEZJRk8gbWlnaHQgaGF2ZSB1bmRlcnJ1biBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksIG1GcmFtZUNhcGFjaXR5KTsKKyAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRXcml0ZUluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xODMsMjMgKzE3Niw2IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6cmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7Ci0gICAgbUxhc3RSZWFkU2l6ZSA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNSZWFkID0gcmVhZChidWZmZXIsIG51bUZyYW1lcyk7Ci0gICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNSZWFkQ291bnQgKz0gZnJhbWVzUmVhZDsKLSAgICBtRnJhbWVzVW5kZXJydW5Db3VudCArPSBmcmFtZXNMZWZ0OwotICAgIC8vIFplcm8gb3V0IGFueSBzYW1wbGVzIHdlIGNvdWxkIG5vdCBzZXQuCi0gICAgaWYgKGZyYW1lc0xlZnQgPiAwKSB7Ci0gICAgICAgIG1VbmRlcnJ1bkNvdW50Kys7Ci0gICAgICAgIGludDMyX3QgYnl0ZXNUb1plcm8gPSBjb252ZXJ0RnJhbWVzVG9CeXRlcyhmcmFtZXNMZWZ0KTsKLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXNUb1plcm8pOwotICAgIH0KLQotICAgIHJldHVybiBmcmFtZXNSZWFkOwotfQotCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldFRocmVzaG9sZCgpIHsKICAgICByZXR1cm4gbUZpZm8tPmdldFRocmVzaG9sZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKaW5kZXggZjVhOWUyNy4uMGQxODhjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEZJRk9fRklGT19CVUZGRVJfSAogI2RlZmluZSBGSUZPX0ZJRk9fQlVGRkVSX0gKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgpAQCAtNzcsMjQgKzc4LDEyIEBACiAgICAgICovCiAgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKTsKIAotICAgIC8qKgotICAgICAqIENvcHkgZGF0YSBmcm9tIHRoZSBGSUZPIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogQHBhcmFtIG51bUZyYW1lcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBmaWZvX2ZyYW1lc190IHJlYWROb3codm9pZCAqYnVmZmVyLCBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7Ci0KLSAgICBpbnQ2NF90IGdldE5leHRSZWFkVGltZShpbnQzMl90IGZyYW1lUmF0ZSk7Ci0KLSAgICBpbnQzMl90IGdldFVuZGVycnVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtVW5kZXJydW5Db3VudDsgfQotCi0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICpnZXRGaWZvQ29udHJvbGxlckJhc2UoKSB7IHJldHVybiBtRmlmbzsgfQotCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCkgewogICAgICAgICByZXR1cm4gbUJ5dGVzUGVyRnJhbWU7CiAgICAgfQogCisgICAgLy8gUHJveHkgbWV0aG9kcyBmb3IgdGhlIGludGVybmFsIEZpZm9Db250cm9sbGVyCisKICAgICBmaWZvX2NvdW50ZXJfdCBnZXRSZWFkQ291bnRlcigpIHsKICAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRSZWFkQ291bnRlcigpOwogICAgIH0KQEAgLTExMSw2ICsxMDAsMjIgQEAKICAgICAgICAgbUZpZm8tPnNldFdyaXRlQ291bnRlcihuKTsKICAgICB9CiAKKyAgICB2b2lkIGFkdmFuY2VSZWFkSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VSZWFkSW5kZXgobnVtRnJhbWVzKTsKKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2VXcml0ZUluZGV4KGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1GaWZvLT5hZHZhbmNlV3JpdGVJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICBmaWZvX2ZyYW1lc190IGdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKwogICAgIC8qCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgb25seSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBidWZmZXIgaXMgdXNlZC4KICAgICAgKi8KQEAgLTEyMSwxNSArMTI2LDEyIEBACiAgICAgdm9pZCBmaWxsV3JhcHBpbmdCdWZmZXIoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlLCBpbnQzMl90IHN0YXJ0SW5kZXgpOwogCi0gICAgY29uc3QgZmlmb19mcmFtZXNfdCBtRnJhbWVDYXBhY2l0eTsKLSAgICBjb25zdCBpbnQzMl90IG1CeXRlc1BlckZyYW1lOwotICAgIHVpbnQ4X3QgKm1TdG9yYWdlOwotICAgIGJvb2wgbVN0b3JhZ2VPd25lZDsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPwotICAgIEZpZm9Db250cm9sbGVyQmFzZSAqbUZpZm87Ci0gICAgZmlmb19jb3VudGVyX3QgbUZyYW1lc1JlYWRDb3VudDsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzVW5kZXJydW5Db3VudDsKLSAgICBpbnQzMl90IG1VbmRlcnJ1bkNvdW50OyAvLyBuZWVkPyBqdXN0IHVzZSBmcmFtZXMKLSAgICBpbnQzMl90IG1MYXN0UmVhZFNpemU7CisgICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZTsKKyAgICAvLyBXZSBkbyBub3QgdXNlIGEgc3RkOjp1bmlxdWVfcHRyIGZvciBtU3RvcmFnZSBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgcG9pbnRlciB0bworICAgIC8vIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIGNhbm5vdCBiZSBkZWxldGVkIHRyaXZpYWxseS4KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgKm1TdG9yYWdlID0gbnVsbHB0cjsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlT3duZWQgPSBmYWxzZTsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWZvQ29udHJvbGxlckJhc2U+IG1GaWZve307CiB9OwogCiB9ICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCmluZGV4IDc5ZDk4YTEuLjA1N2E5NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCkBAIC0zMCw3ICszMCw3IEBACiBjbGFzcyBGaWZvQ29udHJvbGxlciA6IHB1YmxpYyBGaWZvQ29udHJvbGxlckJhc2UKIHsKIHB1YmxpYzoKLSAgICBGaWZvQ29udHJvbGxlcihmaWZvX2NvdW50ZXJfdCBidWZmZXJTaXplLCBmaWZvX2NvdW50ZXJfdCB0aHJlc2hvbGQpCisgICAgRmlmb0NvbnRyb2xsZXIoZmlmb19mcmFtZXNfdCBidWZmZXJTaXplLCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkKICAgICA6IEZpZm9Db250cm9sbGVyQmFzZShidWZmZXJTaXplLCB0aHJlc2hvbGQpCiAgICAgLCBtUmVhZENvdW50ZXIoMCkKICAgICAsIG1Xcml0ZUNvdW50ZXIoMCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKaW5kZXggMTRhMmJlMS4uNjZlMjQ3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQ29udHJvbGxlckJhc2U6OmdldFJlYWRJbmRleCgpIHsKICAgICAvLyAlIHdvcmtzIHdpdGggbm9uLXBvd2VyIG9mIHR3byBzaXplcwotICAgIHJldHVybiAoZmlmb19mcmFtZXNfdCkgKGdldFJlYWRDb3VudGVyKCkgJSBtQ2FwYWNpdHkpOworICAgIHJldHVybiAoZmlmb19mcmFtZXNfdCkgKCh1aW50NjRfdClnZXRSZWFkQ291bnRlcigpICUgbUNhcGFjaXR5KTsKIH0KIAogdm9pZCBGaWZvQ29udHJvbGxlckJhc2U6OmFkdmFuY2VSZWFkSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKQEAgLTUxLDcgKzUxLDcgQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQ29udHJvbGxlckJhc2U6OmdldFdyaXRlSW5kZXgoKSB7CiAgICAgLy8gJSB3b3JrcyB3aXRoIG5vbi1wb3dlciBvZiB0d28gc2l6ZXMKLSAgICByZXR1cm4gKGZpZm9fZnJhbWVzX3QpIChnZXRXcml0ZUNvdW50ZXIoKSAlIG1DYXBhY2l0eSk7CisgICAgcmV0dXJuIChmaWZvX2ZyYW1lc190KSAoKHVpbnQ2NF90KWdldFdyaXRlQ291bnRlcigpICUgbUNhcGFjaXR5KTsKIH0KIAogdm9pZCBGaWZvQ29udHJvbGxlckJhc2U6OmFkdmFuY2VXcml0ZUluZGV4KGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CkBAIC01OSw1ICs1OSwxMCBAQAogfQogCiB2b2lkIEZpZm9Db250cm9sbGVyQmFzZTo6c2V0VGhyZXNob2xkKGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKSB7CisgICAgaWYgKHRocmVzaG9sZCA+IG1DYXBhY2l0eSkgeworICAgICAgICB0aHJlc2hvbGQgPSBtQ2FwYWNpdHk7CisgICAgfSBlbHNlIGlmICh0aHJlc2hvbGQgPCAwKSB7CisgICAgICAgIHRocmVzaG9sZCA9IDA7CisgICAgfQogICAgIG1UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKaW5kZXggNjRhZjc3Ny4uMWVkYjhhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaApAQCAtMTAyLDYgKzEwMiw5IEBACiAgICAgLyoqCiAgICAgICogWW91IGNhbiByZXF1ZXN0IHRoYXQgdGhlIGJ1ZmZlciBub3QgYmUgZmlsbGVkIGFib3ZlIGEgbWF4aW11bQogICAgICAqIG51bWJlciBvZiBmcmFtZXMuCisgICAgICoKKyAgICAgKiBUaGUgdGhyZXNob2xkIHdpbGwgYmUgY2xpcHBlZCBiZXR3ZWVuIHplcm8gYW5kIHRoZSBidWZmZXIgY2FwYWNpdHkuCisgICAgICoKICAgICAgKiBAcGFyYW0gdGhyZXNob2xkIGVmZmVjdGl2ZSBzaXplIG9mIHRoZSBidWZmZXIKICAgICAgKi8KICAgICB2b2lkIHNldFRocmVzaG9sZChmaWZvX2ZyYW1lc190IHRocmVzaG9sZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY3ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb1Byb2Nlc3NvckJhc2U6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpZiAoZnJhbWVQb3NpdGlvbiA+IG1MYXN0RnJhbWVQb3NpdGlvbikgeworICAgICAgICBtTGFzdEZyYW1lUG9zaXRpb24gPSBmcmFtZVBvc2l0aW9uOworICAgICAgICBtRnJhbWVzVmFsaWQgPSBvblByb2Nlc3MoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICB9CisgICAgcmV0dXJuIG1GcmFtZXNWYWxpZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0F1ZGlvRmxvYXRCbG9ja1BvcnQ6OkF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCbG9jaykKKyAgICAgICAgOiBBdWRpb1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICwgbUZyYW1lc1BlckJsb2NrKGZyYW1lc1BlckJsb2NrKQorICAgICAgICAsIG1TYW1wbGVCbG9jayhOVUxMKSB7CisgICAgaW50MzJfdCBudW1GbG9hdHMgPSBmcmFtZXNQZXJCbG9jayAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIG1TYW1wbGVCbG9jayA9IG5ldyBmbG9hdFtudW1GbG9hdHNdezAuMGZ9OworfQorCitBdWRpb0Zsb2F0QmxvY2tQb3J0Ojp+QXVkaW9GbG9hdEJsb2NrUG9ydCgpIHsKKyAgICBkZWxldGVbXSBtU2FtcGxlQmxvY2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvRmxvYXRPdXRwdXRQb3J0OjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbnVtRnJhbWVzID0gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQmxvY2soKSwgbnVtRnJhbWVzKTsKKyAgICByZXR1cm4gbVBhcmVudC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworfQorCisvLyBUaGVzZSBuZWVkIHRvIGJlIGluIHRoZSAuY3BwIGZpbGUgYmVjYXVzZSBvZiBmb3J3YXJkIGNyb3NzIHJlZmVyZW5jZXMuCit2b2lkIEF1ZGlvRmxvYXRPdXRwdXRQb3J0Ojpjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpIHsKKyAgICBwb3J0LT5jb25uZWN0KHRoaXMpOworfQorCit2b2lkIEF1ZGlvRmxvYXRPdXRwdXRQb3J0OjpkaXNjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpIHsKKyAgICBwb3J0LT5kaXNjb25uZWN0KHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb0Zsb2F0SW5wdXRQb3J0OjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgcmV0dXJuIChtQ29ubmVjdGVkID09IE5VTEwpCisgICAgICAgICAgICA/IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcykKKyAgICAgICAgICAgIDogbUNvbm5lY3RlZC0+cHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKK30KKworZmxvYXQgKkF1ZGlvRmxvYXRJbnB1dFBvcnQ6OmdldEJsb2NrKCkgeworICAgIGlmIChtQ29ubmVjdGVkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrKCk7IC8vIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0ZWQtPmdldEJsb2NrKCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb1Npbms6OnB1bGwoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGFjdHVhbEZyYW1lcyA9IGlucHV0LnB1bGxEYXRhKG1GcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIG1GcmFtZVBvc2l0aW9uICs9IGFjdHVhbEZyYW1lczsKKyAgICByZXR1cm4gYWN0dWFsRnJhbWVzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNDZhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQXVkaW9Qcm9jZXNzb3JCYXNlLmgKKyAqCisgKiBBdWRpbyBwcm9jZXNzaW5nIG5vZGUgYW5kIHBvcnRzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW1wbGUgZGF0YSBmbG93IGdyYXBoLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvLyBUT0RPIGNvbnNpZGVyIHB1Ymxpc2hpbmcgYWxsIGhlYWRlciBmaWxlcyB1bmRlciAiaW5jbHVkZS9saWJhYXVkaW8vRmxvd0dyYXBoLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCisvLyBEZWZhdWx0IGJsb2NrIHNpemUgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIHRoZSBBdWRpb0Zsb2F0QmxvY2tQb3J0IGlzIGNyZWF0ZWQuCisvLyBJZiBpdCBpcyB0b28gc21hbGwgdGhlbiB3ZSB3aWxsIGhhdmUgdG9vIG11Y2ggb3ZlcmhlYWQgZnJvbSBzd2l0Y2hpbmcgYmV0d2VlbiBub2Rlcy4KKy8vIElmIGl0IGlzIHRvbyBoaWdoIHRoZW4gd2Ugd2lsbCB0aHJhc2ggdGhlIGNhY2hlcy4KK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRCbG9ja1NpemUgPSA4OyAvLyBhcmJpdHJhcnkKKworY2xhc3MgQXVkaW9GbG9hdElucHV0UG9ydDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qcm9jZXNzb3JCYXNlKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBjdXN0b20gZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyByZXF1ZXN0ZWQgZm9yIHByb2Nlc3NpbmcKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgdmlydHVhbCBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgZnJhbWVQb3NpdGlvbiBpcyBhdCBvciBhZnRlciB0aGUgbGFzdCBmcmFtZSBwb3NpdGlvbiB0aGVuIGNhbGwgb25Qcm9jZXNzKCkuCisgICAgICogVGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gaW4gY2FzZSBvZiBjeWNsaWMgZ3JhcGhzLgorICAgICAqIEl0IGFsc28gcHJldmVudHMgbm9kZXMgdXBzdHJlYW0gZnJvbSBhIGJyYW5jaCBmcm9tIGJlaW5nIGV4ZWN1dGVkIHR3aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24KKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybgorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQ2NF90ICBtTGFzdEZyYW1lUG9zaXRpb24gPSAtMTsgLy8gU3RhcnQgYXQgLTEgc28gdGhhdCB0aGUgZmlyc3QgcHVsbCB3b3Jrcy4KKworcHJpdmF0ZToKKyAgICBpbnQzMl90ICBtRnJhbWVzVmFsaWQgPSAwOyAvLyBudW0gdmFsaWQgZnJhbWVzIGluIHRoZSBibG9jaworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICAqIFRoaXMgaXMgYSBjb25uZWN0b3IgdGhhdCBhbGxvd3MgZGF0YSB0byBmbG93IGJldHdlZW4gbW9kdWxlcy4KKyAgKi8KK2NsYXNzIEF1ZGlvUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9Qb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogbVBhcmVudChwYXJlbnQpCisgICAgICAgICAgICAsIG1TYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgLy8gUG9ydHMgYXJlIG9mdGVuIGRlY2xhcmVkIHB1YmxpYy4gU28gbGV0J3MgbWFrZSB0aGVtIG5vbi1jb3B5YWJsZS4KKyAgICBBdWRpb1BvcnQoY29uc3QgQXVkaW9Qb3J0JikgPSBkZWxldGU7CisgICAgQXVkaW9Qb3J0JiBvcGVyYXRvcj0oY29uc3QgQXVkaW9Qb3J0JikgPSBkZWxldGU7CisKKyAgICBpbnQzMl90IGdldFNhbXBsZXNQZXJGcmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50OworCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbVNhbXBsZXNQZXJGcmFtZSA9IDE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBUaGlzIHBvcnQgY29udGFpbnMgYSBmbG9hdCB0eXBlIGJ1ZmZlci4KKyAqIFRoZSBzaXplIGlzIGZyYW1lc1BlckJsb2NrICogc2FtcGxlc1BlckZyYW1lKS4KKyAqLworY2xhc3MgQXVkaW9GbG9hdEJsb2NrUG9ydCAgOiBwdWJsaWMgQXVkaW9Qb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrID0ga0RlZmF1bHRCbG9ja1NpemUKKyAgICAgICAgICAgICAgICApOworCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdEJsb2NrUG9ydCgpOworCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCbG9jaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJCbG9jazsKKyAgICB9CisKK3Byb3RlY3RlZDoKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYnVmZmVyIGludGVybmFsIHRvIHRoZSBwb3J0IG9yIGZyb20gYSBjb25uZWN0ZWQgcG9ydAorICAgICAqLworICAgIHZpcnR1YWwgZmxvYXQgKmdldEJsb2NrKCkgeworICAgICAgICByZXR1cm4gbVNhbXBsZUJsb2NrOworICAgIH0KKworCitwcml2YXRlOgorICAgIGNvbnN0IGludDMyX3QgICAgbUZyYW1lc1BlckJsb2NrID0gMTsKKyAgICBmbG9hdCAgICAgICAgICAgKm1TYW1wbGVCbG9jayA9IG51bGxwdHI7IC8vIGFsbG9jYXRlZCBpbiBjb25zdHJ1Y3RvcgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICAqIFRoZSByZXN1bHRzIG9mIGEgbW9kdWxlIGFyZSBzdG9yZWQgaW4gdGhlIGJ1ZmZlciBvZiB0aGUgb3V0cHV0IHBvcnRzLgorICAqLworY2xhc3MgQXVkaW9GbG9hdE91dHB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdE91dHB1dFBvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICB1c2luZyBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jazsKKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIHBhcmVudCBtb2R1bGUncyBvblByb2Nlc3MoKSBtZXRob2QuCisgICAgICogVGhhdCBtYXkgcHVsbCBkYXRhIGZyb20gaXRzIGlucHV0cyBhbmQgcmVjdXJzaXZlbHkKKyAgICAgKiBwcm9jZXNzIHRoZSBlbnRpcmUgZ3JhcGguCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHB1bGxlZAorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogSWYgeW91IGNvbm5lY3QgYSBzZWNvbmQgb3V0cHV0IHBvcnQgdG8gYW4gaW5wdXQgcG9ydAorICAgICAqIHRoZW4gaXQgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLiBEbyBub3QgbW9kaWZ5IHRoZSBncmFwaCB0b3BvbG9neSBmb3JtIGFub3RoZXIgdGhyZWFkIHdoaWxlIHJ1bm5pbmcuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBpbnB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9GbG9hdElucHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRJbnB1dFBvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBJZiBjb25uZWN0ZWQgdG8gYW4gb3V0cHV0IHBvcnQgdGhlbiB0aGlzIHdpbGwgcmV0dXJuCisgICAgICogdGhhdCBvdXRwdXQgcG9ydHMgYnVmZmVycy4KKyAgICAgKiBJZiBub3QgY29ubmVjdGVkIHRoZW4gaXQgcmV0dXJucyB0aGUgaW5wdXQgcG9ydHMgb3duIGJ1ZmZlcgorICAgICAqIHdoaWNoIGNhbiBiZSBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKS4KKyAgICAgKi8KKyAgICBmbG9hdCAqZ2V0QmxvY2soKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFB1bGwgZGF0YSBmcm9tIGFueSBvdXRwdXQgcG9ydCB0aGF0IGlzIGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogV3JpdGUgZXZlcnkgdmFsdWUgb2YgdGhlIGZsb2F0IGJ1ZmZlci4KKyAgICAgKiBUaGlzIHZhbHVlIHdpbGwgYmUgaWdub3JlZCBpZiBhbiBvdXRwdXQgcG9ydCBpcyBjb25uZWN0ZWQKKyAgICAgKiB0byB0aGlzIHBvcnQuCisgICAgICovCisgICAgdm9pZCBzZXRWYWx1ZShmbG9hdCB2YWx1ZSkgeworICAgICAgICBpbnQgbnVtRmxvYXRzID0ga0RlZmF1bHRCbG9ja1NpemUgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgZmxvYXQgKmJ1ZmZlciA9IGdldEJsb2NrKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmxvYXRzOyBpKyspIHsKKyAgICAgICAgICAgICpidWZmZXIrKyA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgb3V0cHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KGdldFNhbXBsZXNQZXJGcmFtZSgpID09IHBvcnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICAgICAgbUNvbm5lY3RlZCA9IHBvcnQ7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChtQ29ubmVjdGVkID09IHBvcnQpOworICAgICAgICAodm9pZCkgcG9ydDsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKm1Db25uZWN0ZWQgPSBudWxscHRyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvU291cmNlIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Tb3VyY2UoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKSA9IGRlZmF1bHQ7CisKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKKyAgICB2b2lkIHNldERhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbURhdGEgPSBkYXRhOworICAgICAgICBtU2l6ZUluRnJhbWVzID0gbnVtRnJhbWVzOworICAgICAgICBtRnJhbWVJbmRleCA9IDA7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3Qgdm9pZCAqbURhdGEgPSBudWxscHRyOworICAgIGludDMyX3QgICAgIG1TaXplSW5GcmFtZXMgPSAwOyAvLyBudW1iZXIgb2YgZnJhbWVzIGluIG1EYXRhCisgICAgaW50MzJfdCAgICAgbUZyYW1lSW5kZXggPSAwOyAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvU2luayA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvU2luayhpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvU2luaygpID0gZGVmYXVsdDsKKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisKKyAgICAvKioKKyAgICAgKiBEdW1teSBwcm9jZXNzb3IuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpIGZyYW1lUG9zaXRpb247CisgICAgICAgICh2b2lkKSBudW1GcmFtZXM7CisgICAgICAgIHJldHVybiAwOworICAgIH07CisKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgaW50MzJfdCBwdWxsKGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1GcmFtZVBvc2l0aW9uID0gMDsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLyogRkxPV0dSQVBIX0FVRElPX1BST0NFU1NPUl9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDljMjJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiQ2xpcFRvUmFuZ2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworQ2xpcFRvUmFuZ2U6OkNsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBDbGlwVG9SYW5nZTo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHN0ZDo6bWluKG1NYXhpbXVtLCBzdGQ6Om1heChtTWluaW11bSwgKmlucHV0QnVmZmVyKyspKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlZjI1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICisjZGVmaW5lIEZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KKy8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgorY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWF4SGVhZHJvb20gPSAxLjQxMjUzNzU0ZjsKK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1pbkhlYWRyb29tID0gLWtEZWZhdWx0TWF4SGVhZHJvb207CisKK2NsYXNzIENsaXBUb1JhbmdlIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+Q2xpcFRvUmFuZ2UoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TWluaW11bShmbG9hdCBtaW4pIHsKKyAgICAgICAgbU1pbmltdW0gPSBtaW47CisgICAgfQorCisgICAgZmxvYXQgZ2V0TWluaW11bSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NaW5pbXVtOworICAgIH0KKworICAgIHZvaWQgc2V0TWF4aW11bShmbG9hdCBtaW4pIHsKKyAgICAgICAgbU1heGltdW0gPSBtaW47CisgICAgfQorCisgICAgZmxvYXQgZ2V0TWF4aW11bSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NYXhpbXVtOworICAgIH0KKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCitwcml2YXRlOgorICAgIGZsb2F0IG1NaW5pbXVtID0ga0RlZmF1bHRNaW5IZWFkcm9vbTsKKyAgICBmbG9hdCBtTWF4aW11bSA9IGtEZWZhdWx0TWF4SGVhZHJvb207Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWFkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Ok1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCAxKQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Cit9CisKK01vbm9Ub011bHRpQ29udmVydGVyOjp+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKSB7IH0KKworaW50MzJfdCBNb25vVG9NdWx0aUNvbnZlcnRlcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAvLyBUT0RPIG1heWJlIG1vdmUgdG8gYXVkaW9fdXRpbCBhcyBhdWRpb19tb25vX3RvX211bHRpKCkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvUHJvY2VzczsgaSsrKSB7CisgICAgICAgIC8vIHJlYWQgb25lLCB3cml0ZSBtYW55CisgICAgICAgIGZsb2F0IHNhbXBsZSA9ICppbnB1dEJ1ZmZlcisrOworICAgICAgICBmb3IgKGludCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxDb3VudDsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBzYW1wbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkNTNjNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgTW9ub1RvTXVsdGlDb252ZXJ0ZXIgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5Nb25vVG9NdWx0aUNvbnZlcnRlcigpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjYwODI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSYW1wTGluZWFyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlJhbXBMaW5lYXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworUmFtcExpbmVhcjo6UmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgbVRhcmdldC5zdG9yZSgxLjBmKTsKK30KKwordm9pZCBSYW1wTGluZWFyOjpzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcykgeworICAgIG1MZW5ndGhJbkZyYW1lcyA9IGZyYW1lczsKK30KKwordm9pZCBSYW1wTGluZWFyOjpzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KSB7CisgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOworfQorCitmbG9hdCBSYW1wTGluZWFyOjppbnRlcnBvbGF0ZUN1cnJlbnQoKSB7CisgICAgcmV0dXJuIG1MZXZlbFRvIC0gKG1SZW1haW5pbmcgKiBtU2NhbGVyKTsKK30KKworaW50MzJfdCBSYW1wTGluZWFyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGZsb2F0IHRhcmdldCA9IGdldFRhcmdldCgpOworICAgIGlmICh0YXJnZXQgIT0gbUxldmVsVG8pIHsKKyAgICAgICAgLy8gU3RhcnQgbmV3IHJhbXAuIENvbnRpbnVlIGZyb20gcHJldmlvdXMgbGV2ZWwuCisgICAgICAgIG1MZXZlbEZyb20gPSBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKyAgICAgICAgbUxldmVsVG8gPSB0YXJnZXQ7CisgICAgICAgIG1SZW1haW5pbmcgPSBtTGVuZ3RoSW5GcmFtZXM7CisgICAgICAgIEFMT0dWKCIlcygpIG1MZXZlbEZyb20gPSAlZiwgbUxldmVsVG8gPSAlZiwgbVJlbWFpbmluZyA9ICVkLCBtU2NhbGVyID0gJWYiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUxldmVsRnJvbSwgbUxldmVsVG8sIG1SZW1haW5pbmcsIG1TY2FsZXIpOworICAgICAgICBtU2NhbGVyID0gKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtTGVuZ3RoSW5GcmFtZXM7IC8vIGZvciBpbnRlcnBvbGF0aW9uCisgICAgfQorCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAgaWYgKG1SZW1haW5pbmcgPiAwKSB7IC8vIFJhbXBpbmc/IFRoaXMgZG9lc24ndCBoYXBwZW4gdmVyeSBvZnRlbi4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNUb1JhbXAgPSBzdGQ6Om1pbihmcmFtZXNMZWZ0LCBtUmVtYWluaW5nKTsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1JhbXA7CisgICAgICAgIHdoaWxlIChmcmFtZXNUb1JhbXAgPiAwKSB7CisgICAgICAgICAgICBmbG9hdCBjdXJyZW50TGV2ZWwgPSBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSAqaW5wdXRCdWZmZXIrKyAqIGN1cnJlbnRMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZW1haW5pbmctLTsKKyAgICAgICAgICAgIGZyYW1lc1RvUmFtcC0tOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBhbnkgZnJhbWVzIGFmdGVyIHRoZSByYW1wLgorICAgIGludDMyX3Qgc2FtcGxlc0xlZnQgPSBmcmFtZXNMZWZ0ICogY2hhbm5lbENvdW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlc0xlZnQ7IGkrKykgeworICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSAqaW5wdXRCdWZmZXIrKyAqIG1MZXZlbFRvOworICAgIH0KKworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjOGY0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICisjZGVmaW5lIEZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFJhbXBMaW5lYXIgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBSYW1wTGluZWFyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgflJhbXBMaW5lYXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG5leHQgcmFtcC4KKyAgICAgKiBDYWxsaW5nIHRoaXMgZG9lcyBub3QgYWZmZWN0IGEgcmFtcCB0aGF0IGlzIGluIHByb2dyZXNzLgorICAgICAqLworICAgIHZvaWQgc2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpOworCisgICAgaW50MzJfdCBnZXRMZW5ndGhJbkZyYW1lcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGhJbkZyYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1heSBiZSBzYWZlbHkgY2FsbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgorICAgICAqIEBwYXJhbSB0YXJnZXQKKyAgICAgKi8KKyAgICB2b2lkIHNldFRhcmdldChmbG9hdCB0YXJnZXQpOworCisgICAgZmxvYXQgZ2V0VGFyZ2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRhcmdldC5sb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2UgdGhlIG5leHRTZWdtZW50IHRvIHN0YXJ0IGZyb20gdGhpcyBsZXZlbC4KKyAgICAgKgorICAgICAqIFdBUk5JTkc6IHRoaXMgY2FuIGNhdXNlIGEgZGlzY29udGludWl0eSBpZiBjYWxsZWQgd2hpbGUgdGhlIHJhbXAgaXMgYmVpbmcgdXNlZC4KKyAgICAgKiBPbmx5IGNhbGwgdGhpcyB3aGVuIHNldHRpbmcgdGhlIGluaXRpYWwgcmFtcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbAorICAgICAqLworICAgIHZvaWQgZm9yY2VDdXJyZW50KGZsb2F0IGxldmVsKSB7CisgICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsKKyAgICAgICAgbUxldmVsVG8gPSBsZXZlbDsKKyAgICB9CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworcHJpdmF0ZToKKworICAgIGZsb2F0IGludGVycG9sYXRlQ3VycmVudCgpOworCisgICAgc3RkOjphdG9taWM8ZmxvYXQ+ICBtVGFyZ2V0OworCisgICAgaW50MzJfdCAgICAgICAgICAgICBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAuMGYgLyAxMDAuMGYgOyAvLyAxMCBtc2VjIGF0IDQ4MDAwIEh6OworICAgIGludDMyX3QgICAgICAgICAgICAgbVJlbWFpbmluZyAgICAgICA9IDA7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtU2NhbGVyICAgICAgICAgID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1MZXZlbEZyb20gICAgICAgPSAwLjBmOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbUxldmVsVG8gICAgICAgICA9IDAuMGY7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2RjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0Zsb2F0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NpbmtGbG9hdDo6U2lua0Zsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTaW5rRmxvYXQ6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gKGZsb2F0ICopIGRhdGE7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworICAgICAgICBtZW1jcHkoZmxvYXREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgZmxvYXREYXRhICs9IG51bVNhbXBsZXM7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzVjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfRkxPQVRfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19GTE9BVF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0Zsb2F0IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0Zsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWM4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtJMTYuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU2lua0kxNjo6U2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorCitpbnQzMl90IFNpbmtJMTY6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQxNl90ICpzaG9ydERhdGEgPSAoaW50MTZfdCAqKSBkYXRhOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyNpZmRlZiBfX0FORFJPSURfXworICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc2hvcnREYXRhLCBzaWduYWwsIG51bVNhbXBsZXMpOworICAgICAgICBzaG9ydERhdGEgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgc2lnbmFsICs9IG51bVNhbXBsZXM7CisjZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBuID0gKGludDMyX3QpICgqc2lnbmFsKysgKiAzMjc2OC4wZik7CisgICAgICAgICAgICAqc2hvcnREYXRhKysgPSBzdGQ6Om1pbihJTlQxNl9NQVgsIHN0ZDo6bWF4KElOVDE2X01JTiwgbikpOyAvLyBjbGlwCisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODYyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19JMTZfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19JMTZfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtJMTYgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5MjgyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0kyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCisKK1NpbmtJMjQ6OlNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKworaW50MzJfdCBTaW5rSTI0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgdWludDhfdCAqYnl0ZURhdGEgPSAodWludDhfdCAqKSBkYXRhOworICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyNpZmRlZiBfX0FORFJPSURfXworICAgICAgICBtZW1jcHlfdG9fcDI0X2Zyb21fZmxvYXQoYnl0ZURhdGEsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyk7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKyAgICAgICAgYnl0ZURhdGEgKz0gbnVtU2FtcGxlcyAqIGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICAgICAgZmxvYXREYXRhICs9IG51bVNhbXBsZXM7CisjZWxzZQorICAgICAgICBjb25zdCBpbnQzMl90IGtJMjRQYWNrZWRNYXggPSAweDAwN0ZGRkZGOworICAgICAgICBjb25zdCBpbnQzMl90IGtJMjRQYWNrZWRNaW4gPSAweEZGODAwMDAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBuID0gKGludDMyX3QpICgqZmxvYXREYXRhKysgKiAweDAwODAwMDAwKTsKKyAgICAgICAgICAgIG4gPSBzdGQ6Om1pbihrSTI0UGFja2VkTWF4LCBzdGQ6Om1heChrSTI0UGFja2VkTWluLCBuKSk7IC8vIGNsaXAKKyAgICAgICAgICAgIC8vIFdyaXRlIGFzIGEgcGFja2VkIDI0LWJpdCBpbnRlZ2VyIGluIExpdHRsZSBFbmRpYW4gZm9ybWF0LgorICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgbjsKKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIChuID4+IDgpOworICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgKG4gPj4gMTYpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjliNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTI0X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTI0IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiNjc0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUZsb2F0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NvdXJjZUZsb2F0OjpTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VGbG9hdDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgZmxvYXQgKmZsb2F0QmFzZSA9IChmbG9hdCAqKSBtRGF0YTsKKyAgICBjb25zdCBmbG9hdCAqZmxvYXREYXRhID0gJmZsb2F0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CisgICAgbWVtY3B5KG91dHB1dEJ1ZmZlciwgZmxvYXREYXRhLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWVkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUZsb2F0IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTE2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NvdXJjZUkxNjo6U291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUkxNjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IGludDE2X3QgKnNob3J0QmFzZSA9IHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QgKj4obURhdGEpOworICAgIGNvbnN0IGludDE2X3QgKnNob3J0RGF0YSA9ICZzaG9ydEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXREYXRhLCBzaG9ydERhdGEsIG51bVNhbXBsZXMpOworI2Vsc2UKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqZmxvYXREYXRhKysgPSAqc2hvcnREYXRhKysgKiAoMS4wZiAvIDMyNzY4KTsKKyAgICB9CisjZW5kaWYKKworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMTZjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMTZfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kxNl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlSTE2IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxOTg4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitTb3VyY2VJMjQ6OlNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMjQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCB1aW50OF90ICpieXRlQmFzZSA9ICh1aW50OF90ICopIG1EYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVEYXRhID0gJmJ5dGVCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50ICoga0J5dGVzUGVySTI0UGFja2VkXTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZsb2F0RGF0YSwgYnl0ZURhdGEsIG51bVNhbXBsZXMpOworI2Vsc2UKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxLiAvIChmbG9hdCkoMVVMIDw8IDMxKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAvLyBBc3NlbWJsZSB0aGUgZGF0YSBhc3N1bWluZyBMaXR0bGUgRW5kaWFuIGZvcm1hdC4KKyAgICAgICAgaW50MzJfdCBwYWQgPSBieXRlRGF0YVsyXTsKKyAgICAgICAgcGFkIDw8PSA4OworICAgICAgICBwYWQgfD0gYnl0ZURhdGFbMV07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzBdOworICAgICAgICBwYWQgPDw9IDg7IC8vIFNoaWZ0IHRvIDMyIGJpdCBkYXRhIHNvIHRoZSBzaWduIGlzIGNvcnJlY3QuCisgICAgICAgIGJ5dGVEYXRhICs9IGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICAgICAgKmZsb2F0RGF0YSsrID0gcGFkICogc2NhbGU7IC8vIHNjYWxlIHRvIHJhbmdlIC0xLjAgdG8gMS4wCisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjE0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkyNCA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCmluZGV4IDQ5NGVkYmMuLjhlNzg1NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaApAQCAtNzcsNyArNzcsNiBAQAogCiAgICAgdmlydHVhbCBpbnQ2NF90IGluY3JlbWVudENsaWVudEZyYW1lQ291bnRlcihpbnQzMl90IGZyYW1lcykgID0gMDsKIAotCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVzV3JpdHRlbi5nZXQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggNTA1ZjJlZS4uNDBlMjJhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtNTcsNiArNTcsOSBAQAogCiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1JlY29yZAogCisgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCiAgICAgLy8gVE9ETyBTdXBwb3J0IFVOU1BFQ0lGSUVEIGluIEF1ZGlvUmVjb3JkLiBGb3Igbm93LCB1c2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwpAQCAtNjYsMjMgKzY5LDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKIAogCi0gICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKICAgICBzd2l0Y2ggKHBlcmZNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpICgocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICAgICAgICAgID8gKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19JTlBVVF9GTEFHX0ZBU1QpKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HOgogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBObyBmbGFncy4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgLy8gUHJlc2VydmUgYmVoYXZpb3Igb2YgQVBJIDI2Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KIAogICAgIC8vIE1heWJlIGNoYW5nZSBkZXZpY2UgZm9ybWF0IHRvIGdldCBhIEZBU1QgcGF0aC4KQEAgLTk5LDEyICsxMDYsMTIgQEAKICAgICAvLyBXZSBqdXN0IG1heSBub3QgZ2V0IGEgRkFTVCB0cmFjay4KICAgICAvLyBCdXQgd2Ugd291bGRuJ3QgaGF2ZSBhbnl3YXkgd2l0aG91dCB0aGlzIGhhY2suCiAgICAgY29uc3RleHByIGludDMyX3Qga01vc3RMaWtlbHlTYW1wbGVSYXRlRm9yRmFzdCA9IDQ4MDAwOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCiAgICAgICAgICAgICAmJiBwZXJmTW9kZSA9PSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWQogICAgICAgICAgICAgJiYgKHNhbXBsZXNQZXJGcmFtZSA8PSAyKSAvLyBGQVNUIG9ubHkgZm9yIG1vbm8gYW5kIHN0ZXJlbwogICAgICAgICAgICAgJiYgKGdldFNhbXBsZVJhdGUoKSA9PSBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0CiAgICAgICAgICAgICAgICAgfHwgZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkpIHsKLSAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0kxNik7CisgICAgICAgIHNldERldmljZUZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0RGV2aWNlRm9ybWF0KGdldEZvcm1hdCgpKTsKICAgICB9CkBAIC0xNDEsMTQgKzE0OCwxMCBAQAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07CiAKLSAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7Ci0KICAgICAvLyAtLS0tLS0tLS0tLSBvcGVuIHRoZSBBdWRpb1JlY29yZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBNaWdodCByZXRyeSwgYnV0IG5ldmVyIG1vcmUgdGhhbiBvbmNlLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykgewotICAgICAgICBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKIAogICAgICAgICBtQXVkaW9SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUgLy8gY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUgVE9ETyBkb2VzIG5vdCBjb21waWxlCkBAIC0yMTQsOCArMjE3LDggQEAKICAgICB9CiAKICAgICAvLyBBbGxvY2F0ZSBmb3JtYXQgY29udmVyc2lvbiBidWZmZXIgaWYgbmVlZGVkLgotICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKLSAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewogCiAgICAgICAgIGlmIChidWlsZGVyLmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY2FsbGJhY2sgdGhlbiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGRhdGEgaW50byBhbiBpbnRlcm5hbCBmbG9hdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAppbmRleCA1MDVjZDc3Li4xYWMyNTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcApAQCAtNTksMTggKzU5LDI1IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgY29uc3QgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOworICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworCiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBBdWRpb1RyYWNrCiAgICAgLy8gVXNlIHN0ZXJlbyBpZiB1bnNwZWNpZmllZC4KICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDIgOiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOwogCi0gICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBnZXRQZXJmb3JtYW5jZU1vZGUoKTsKICAgICBzd2l0Y2gocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKICAgICAgICAgICAgIC8vIEJ5cGFzcyB0aGUgbm9ybWFsIG1peGVyIGFuZCBnbyBzdHJhaWdodCB0byB0aGUgRkFTVCBtaXhlci4KLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBhcHAgYXNrcyBmb3IgYSBzZXNzaW9uSWQgdGhlbiBpdCBtZWFucyB0aGV5IHdhbnQgdG8gdXNlIGVmZmVjdHMuCisgICAgICAgICAgICAvLyBTbyBkb24ndCB1c2UgUkFXIGZsYWcuCisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX1JBVykKKyAgICAgICAgICAgICAgICAgICAgOiAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CkBAIC04MSw2ICs4OCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8vIE5vIGZsYWdzLiBVc2UgYSBub3JtYWwgbWl4ZXIgaW4gZnJvbnQgb2YgdGhlIEZBU1QgbWl4ZXIuCisgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTg4LDkgKzk2LDkgQEAKIAogICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gMDsKIAotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKQorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkKICAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgOiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0Rm9ybWF0KCkpOworICAgICAgICAgICAgOiBnZXRGb3JtYXQoKTsKIAogICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBpZiB0aGVyZSBpcyBvbmUuCiAgICAgQXVkaW9UcmFjazo6Y2FsbGJhY2tfdCBjYWxsYmFjayA9IG51bGxwdHI7CkBAIC0xMzUsMTEgKzE0Myw2IEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIHN0YXRpY19hc3NlcnQoQUFVRElPX1VOU1BFQ0lGSUVEID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsICJTZXNzaW9uIElEcyBzaG91bGQgbWF0Y2giKTsKLQotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKICAgICBtQXVkaW9UcmFjay0+c2V0KAogICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsICAvLyBpZ25vcmVkIGJlY2F1c2Ugd2UgcGFzcyBhdHRyaWJ1dGVzIGJlbG93CkBAIC0xNzgsMTAgKzE4MSw4IEBACiAKICAgICAvLyBHZXQgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgQXVkaW9UcmFjay4KICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpKTsKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwotICAgIHNldEZvcm1hdChhYXVkaW9Gb3JtYXQpOwotICAgIHNldERldmljZUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOworICAgIHNldERldmljZUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwogCiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKICAgICBBTE9HV19JRihhY3R1YWxTYW1wbGVSYXRlICE9IGdldFNhbXBsZVJhdGUoKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggNDBlYmI3Ni4uZjViM2FkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTMzLDM5NSArMzMsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KLS8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgotI2RlZmluZSBNQVhfSEVBRFJPT00gKDEuNDEyNTM3NTRmKQotI2RlZmluZSBNSU5fSEVBRFJPT00gKDAgLSBNQVhfSEVBRFJPT00pCi0KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICBpbnQzMl90IHNpemUgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vIFRPRE8gZXhwb3NlIGFuZCBjYWxsIGNsYW1wMTZfZnJvbV9mbG9hdCBmdW5jdGlvbiBpbiBwcmltaXRpdmVzLmgKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2X2Zyb21fZmxvYXQoZmxvYXQgZikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7Ci0gICAgcmV0dXJuIChpbnQxNl90KSByb3VuZGYoZm1heGYoZm1pbmYoZiAqIHNjYWxlLCBzY2FsZSAtIDEuZiksIC1zY2FsZSkpOwotfQotCi0vLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLS8vIEJ5IHVzaW5nIGZtaW4gYW5kIGZtYXggd2UgYWxzbyBwcm90ZWN0IGFnYWluc3QgTmFOLgotc3RhdGljIGZsb2F0IGNsaXBUb01pbk1heEhlYWRyb29tKGZsb2F0IGlucHV0KSB7Ci0gICAgcmV0dXJuIGZtaW4oTUFYX0hFQURST09NLCBmbWF4KE1JTl9IRUFEUk9PTSwgaW5wdXQpKTsKLX0KLQotc3RhdGljIGZsb2F0IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihmbG9hdCBzYW1wbGUsIGZsb2F0IHNjYWxlcikgewotICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAvLyBTY2FsZSBhbmQgY29udmVydCB0byBhIHNob3J0LgotICAgIGZsb2F0IGZ2YWwgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChmdmFsKTsKLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0jZGVmaW5lIFNIT1JUX1NDQUxFICAzMjc2OAotCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvbnZlcnQgTW9ubyBUbyBTdGVyZW8gYXQgdGhlIHNhbWUgdGltZSBhcyBjb252ZXJ0aW5nIGZvcm1hdC4KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyMSA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzY2FsZXIgPSBzY2FsZXIxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtmcmFtZUluZGV4XSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotCi0gICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlU2NhbGVkID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIGlmIChzb3VyY2UuY2hhbm5lbENvdW50ID09IDEgJiYgZGVzdGluYXRpb24uY2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgY29udmVydE1vbm9Ub1N0ZXJlbyhzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbi4gT3RoZXJ3aXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLSAgICAgICAgLy8gbXVzdCBtYXRjaC4KLSAgICAgICAgYXNzZXJ0KHNvdXJjZS5jaGFubmVsQ291bnQgPT0gZGVzdGluYXRpb24uY2hhbm5lbENvdW50KTsKLSAgICAgICAgY29udmVydENoYW5uZWxzTWF0Y2goc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0TW9ub1RvU3RlcmVvKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRDaGFubmVsc01hdGNoKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0gICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogc291cmNlLmNoYW5uZWxDb3VudDsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CiAgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGNhc2UgZm9yIEFBVURJT19PSyBhbmQgZm9yIHBvc2l0aXZlIHJlc3VsdHMuCiAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CkBAIC01MTMsNiArMTI0LDkgQEAKIGF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0KSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdDsKICAgICBzd2l0Y2ggKGFhdWRpb0Zvcm1hdCkgeworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBicmVhazsKQEAgLTUyMCwxNiArMTM0LDE5IEBACiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFhdWRpb0Zvcm1hdCk7CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhYXVkaW9Gb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFuZHJvaWRGb3JtYXQ7CiB9CiAKIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdCkgewotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdDsKICAgICBzd2l0Y2ggKGFuZHJvaWRGb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CiAgICAgICAgIGJyZWFrOwpAQCAtNTM4LDcgKzE1NSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYW5kcm9pZEZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYW5kcm9pZEZvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvRm9ybWF0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDRiOTc1ZTguLmRjMmIxOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTQ1LDE1NiArNDUsNiBAQAogYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKIAogLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBhbXBsaXR1ZGUgbGV2ZWwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBwYXN0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSAtMS4wIHRvICsxLjAuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKi8KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24pOwotCi0vKioKLSAqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tICsvLSBhbXBsaXR1ZGUuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKiBAcGFyYW0gYW1wbGl0dWRlCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIGF0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgZmxvYXRzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBpbnQxNl90J3MgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotY2xhc3MgQUF1ZGlvRGF0YUNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0KLSAgICBzdHJ1Y3QgRm9ybWF0dGVkRGF0YSB7Ci0KLSAgICAgICAgRm9ybWF0dGVkRGF0YSh2b2lkICpkYXRhLCBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogZGF0YShkYXRhKQotICAgICAgICAgICAgLCBmb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgLCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSB7fQotCi0gICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TW9ub1RvU3RlcmVvKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRDaGFubmVsc01hdGNoKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci19OwotCi0vKioKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCiAgKiBUaGUgKnNpemVJbkJ5dGVzIHdpbGwgYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKgpAQCAtMjM0LDEyICs4NCw2IEBACiAgKi8KIGF1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpOwogCi0vKioKLSAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbiBieXRlcyBvciBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAotICovCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQotCiAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBiZSByZXBsYWNlZCBieSBTZXR0aW5ncyBvciBieSBzb21lIG90aGVyIHN5c3RlbSBjb25maWd1cmF0aW9uIHRvb2wuCiAKICNkZWZpbmUgQUFVRElPX1BST1BfTU1BUF9QT0xJQ1kgICAgICAgICAgICJhYXVkaW8ubW1hcF9wb2xpY3kiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTRiYmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxpbmVhclJhbXAuaCIKLQotYm9vbCBMaW5lYXJSYW1wOjppc1JhbXBpbmcoKSB7Ci0gICAgZmxvYXQgdGFyZ2V0ID0gbVRhcmdldC5sb2FkKCk7Ci0gICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgewotICAgICAgICAvLyBVcGRhdGUgdGFyZ2V0LiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgotICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKLSAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1SZW1haW5pbmcgPiAwOwotICAgIH0KLX0KLQotYm9vbCBMaW5lYXJSYW1wOjpuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pIHsKLSAgICBib29sIHJhbXBpbmcgPSBpc1JhbXBpbmcoKTsKLSAgICAqbGV2ZWxGcm9tID0gbUxldmVsRnJvbTsKLSAgICBpZiAocmFtcGluZykgewotICAgICAgICBmbG9hdCBsZXZlbDsKLSAgICAgICAgaWYgKGZyYW1lcyA+PSBtUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbFRvOwotICAgICAgICAgICAgbVJlbWFpbmluZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbnRlcnBvbGF0ZSB0byBhIHBvaW50IGFsb25nIHRoZSBmdWxsIHJhbXAuCi0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbEZyb20gKyAoZnJhbWVzICogKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtUmVtYWluaW5nKTsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgLT0gZnJhbWVzOwotICAgICAgICB9Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsgLy8gZm9yIG5leHQgcmFtcAotICAgICAgICAqbGV2ZWxUbyA9IGxldmVsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpsZXZlbFRvID0gbUxldmVsVG87Ci0gICAgfQotICAgIHJldHVybiByYW1waW5nOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiOGUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFBVURJT19MSU5FQVJfUkFNUF9ICi0jZGVmaW5lIEFBVURJT19MSU5FQVJfUkFNUF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qKgotICogR2VuZXJhdGUgc2VnbWVudHMgYWxvbmcgYSBsaW5lYXIgcmFtcC4KLSAqIFRoZSByYW1wIHRhcmdldCBjYW4gYmUgdXBkYXRlZCBmcm9tIGFub3RoZXIgdGhyZWFkLgotICogV2hlbiB0aGUgdGFyZ2V0IGlzIHVwZGF0ZWQsIGEgbmV3IHJhbXAgaXMgc3RhcnRlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICoKLSAqIFRoZSBmaXJzdCByYW1wIHN0YXJ0cyBhdCAwLjAuCi0gKgotICovCi1jbGFzcyBMaW5lYXJSYW1wIHsKLXB1YmxpYzoKLSAgICBMaW5lYXJSYW1wKCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKLSAgICAgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKi8KLSAgICB2b2lkIHNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOwotICAgIH0KLQotICAgIGZsb2F0IGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCi0gICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCi0gICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKi8KLSAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgewotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7Ci0gICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7IC8vIGZvcmNlcyBhIHJhbXAgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0Q3VycmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1MZXZlbEZyb207Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGxldmVscyBmb3IgbmV4dCByYW1wIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWxGcm9tIHBvaW50ZXIgdG8gc3RhcnRpbmcgYW1wbGl0dWRlCi0gICAgICogQHBhcmFtIGxldmVsVG8gcG9pbnRlciB0byBlbmRpbmcgYW1wbGl0dWRlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHJhbXAgaXMgc3RpbGwgbW92aW5nIHRvd2FyZHMgdGhlIHRhcmdldAotICAgICAqLwotICAgIGJvb2wgbmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKTsKLQotcHJpdmF0ZToKLQotICAgIGJvb2wgaXNSYW1waW5nKCk7Ci0KLSAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICBtVGFyZ2V0OwotCi0gICAgaW50MzJfdCBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAgLyAxMDA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHoKLSAgICBpbnQzMl90IG1SZW1haW5pbmcgICAgICAgPSAwOwotICAgIGZsb2F0ICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7Ci0gICAgZmxvYXQgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKLX07Ci0KLQotI2VuZGlmIC8vQUFVRElPX0xJTkVBUl9SQU1QX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjgxOTRkYi4uY2IyNDNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDE4IEBACiB9CiAKIGNjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Nsb2NrX21vZGVsIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfY2xvY2tfbW9kZWwuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfYmxvY2tfYWRhcHRlciIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2Jsb2NrX2FkYXB0ZXIuY3BwIl0sCkBAIC0zNCwxMyArNDYsNiBAQAogfQogCiBjY190ZXN0IHsKLSAgICBuYW1lOiAidGVzdF9saW5lYXJfcmFtcCIsCi0gICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X2xpbmVhcl9yYW1wLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAotfQotCi1jY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLApAQCAtMTY3LDMgKzE3MiwyNyBAQAogICAgIHNyY3M6IFsidGVzdF9hdG9taWNfZmlmby5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfZmxvd2dyYXBoIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfZmxvd2dyYXBoLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfcmV0dXJuX3N0b3AiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9yZXR1cm5fc3RvcC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKaW5kZXggMDA4NTIxNy4uMTMwZWY0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcApAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSAiZmlmby9GaWZvQ29udHJvbGxlci5oIgogCiB1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwordXNpbmcgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3Q7CiB1c2luZyBhbmRyb2lkOjpGaWZvQ29udHJvbGxlcjsKIHVzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7CiB1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIAotLy92b2lkIGZvbygpIHsKLVRFU1QodGVzdF9maWZpX2NvbnRyb2xsZXIsIGZpZm9faW5kaWNlcykgeworVEVTVCh0ZXN0X2ZpZm9fY29udHJvbGxlciwgZmlmb19pbmRpY2VzKSB7CiAgICAgLy8gVmFsdWVzIGFyZSBhcmJpdHJhcnkgcHJpbWVzIGRlc2lnbmVkIHRvIHRyaWdnZXIgZWRnZSBjYXNlcy4KICAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gODM7CiAgICAgY29uc3RleHByIGludCB0aHJlc2hvbGQgPSA0NzsKQEAgLTczLDE4ICs3Myw1OSBAQAogICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQgLSBhZHZhbmNlMiwgZmlmb0NvbnRyb2xsZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSk7CiB9CiAKK1RFU1QodGVzdF9maWZvX2NvbnRyb2xsZXIsIGZpZm9fd3JhcF9hcm91bmRfemVybykgeworICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA3OyAvLyBhcmJpdHJhcnkgcHJpbWUKKyAgICBjb25zdGV4cHIgaW50IHRocmVzaG9sZCA9IGNhcGFjaXR5OworICAgIEZpZm9Db250cm9sbGVyIGZpZm9Db250cm9sbGVyKGNhcGFjaXR5LCB0aHJlc2hvbGQpOworICAgIEFTU0VSVF9FUShjYXBhY2l0eSwgZmlmb0NvbnRyb2xsZXIuZ2V0Q2FwYWNpdHkoKSk7CisgICAgQVNTRVJUX0VRKHRocmVzaG9sZCwgZmlmb0NvbnRyb2xsZXIuZ2V0VGhyZXNob2xkKCkpOworCisgICAgZmlmb0NvbnRyb2xsZXIuc2V0UmVhZENvdW50ZXIoLTEwKTsgLy8gYSBiaXQgbGVzcyB0aGFuIG5lZ2F0aXZlIGNhcGFjaXR5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShpIC0gMTAsIGZpZm9Db250cm9sbGVyLmdldFJlYWRDb3VudGVyKCkpOworICAgICAgICBFWFBFQ1RfR0UoZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZEluZGV4KCksIDApOworICAgICAgICBFWFBFQ1RfTFQoZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZEluZGV4KCksIGNhcGFjaXR5KTsKKyAgICAgICAgZmlmb0NvbnRyb2xsZXIuYWR2YW5jZVJlYWRJbmRleCgxKTsKKyAgICB9CisKKyAgICBmaWZvQ29udHJvbGxlci5zZXRXcml0ZUNvdW50ZXIoLTEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGkgLSAxMCwgZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVDb3VudGVyKCkpOworICAgICAgICBFWFBFQ1RfR0UoZmlmb0NvbnRyb2xsZXIuZ2V0V3JpdGVJbmRleCgpLCAwKTsKKyAgICAgICAgRVhQRUNUX0xUKGZpZm9Db250cm9sbGVyLmdldFdyaXRlSW5kZXgoKSwgY2FwYWNpdHkpOworICAgICAgICBmaWZvQ29udHJvbGxlci5hZHZhbmNlV3JpdGVJbmRleCgxKTsKKyAgICB9Cit9CisKKwogLy8gVE9ETyBjb25zaWRlciB1c2luZyBhIHRlbXBsYXRlIGZvciBvdGhlciBkYXRhIHR5cGVzLgorCisvLyBDcmVhdGUgYSBiaWcgYXJyYXkgYW5kIHRoZW4gdXNlIGEgcmVnaW9uIGluIHRoZSBtaWRkbGUgZm9yIHRoZSAgdW5pdCB0ZXN0cy4KKy8vIFRoZW4gd2UgY2FuIHNjYW4gdGhlIHJlc3Qgb2YgdGhlIGFycmF5IHRvIHNlZSBpZiBpdCBnb3QgY2xvYmJlcmVkLgorc3RhdGljIGNvbnN0ZXhwciBmaWZvX2ZyYW1lc190IGtCaWdBcnJheVNpemUgPSAxMDI0Oworc3RhdGljIGNvbnN0ZXhwciBmaWZvX2ZyYW1lc190IGtGaWZvRGF0YU9mZnNldCA9IDEyODsgLy8gc3RhcnRpbmcgaW5kZXggb2YgRklGTyBkYXRhCitzdGF0aWMgY29uc3RleHByIGludDE2X3QgICAgICAga1NhZmVEYXRhVmFsdWUgPSAweDc2NTQ7IC8vIG9yaWdpbmFsIHZhbHVlIG9mIEJpZ0FycmF5CisKIGNsYXNzIFRlc3RGaWZvQnVmZmVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBUZXN0Rmlmb0J1ZmZlcihmaWZvX2ZyYW1lc190IGNhcGFjaXR5LCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCA9IDApCi0gICAgICAgIDogbUZpZm9CdWZmZXIoc2l6ZW9mKGludDE2X3QpLCBjYXBhY2l0eSkgeworICAgICAgICA6IG1GaWZvQnVmZmVyKHNpemVvZihpbnQxNl90KSwgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgJm1SZWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgJm1Xcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICZtVmVyeUJpZ0FycmF5W2tGaWZvRGF0YU9mZnNldF0pIC8vIGFkZHJlc3Mgb2Ygc3RhcnQgb2YgRklGTyBkYXRhCisgICAgeworCisgICAgICAgIC8vIEFzc3VtZSBhIGZyYW1lIGlzIG9uZSBpbnQxNl90LgogICAgICAgICAvLyBGb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KLSAgICAgICAgbURhdGEgPSBuZXcgaW50MTZfdFtjYXBhY2l0eV07CiAgICAgICAgIGlmICh0aHJlc2hvbGQgPD0gMCkgewogICAgICAgICAgICAgdGhyZXNob2xkID0gY2FwYWNpdHk7CiAgICAgICAgIH0KICAgICAgICAgbUZpZm9CdWZmZXIuc2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CiAgICAgICAgIG1UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisKKyAgICAgICAgZm9yIChmaWZvX2ZyYW1lc190IGkgPSAwOyBpIDwga0JpZ0FycmF5U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBtVmVyeUJpZ0FycmF5W2ldID0ga1NhZmVEYXRhVmFsdWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGNoZWNrTWlzYygpIHsKQEAgLTkyLDI4ICsxMzMsNzIgQEAKICAgICAgICAgQVNTRVJUX0VRKG1UaHJlc2hvbGQsIG1GaWZvQnVmZmVyLmdldFRocmVzaG9sZCgpKTsKICAgICB9CiAKKyAgICB2b2lkIHZlcmlmeUFkZHJlc3NJblJhbmdlKHZvaWQgKnAsIHZvaWQgKnZhbGlkLCBzaXplX3QgbnVtQnl0ZXMpIHsKKyAgICAgICAgdWludHB0cl90IHBfaW50ID0gKHVpbnRwdHJfdCkgcDsKKyAgICAgICAgdWludHB0cl90IHZhbGlkX2ludCA9ICh1aW50cHRyX3QpIHZhbGlkOworICAgICAgICBFWFBFQ1RfR0UocF9pbnQsIHZhbGlkX2ludCk7CisgICAgICAgIEVYUEVDVF9MVChwX2ludCwgKHZhbGlkX2ludCArIG51bUJ5dGVzKSk7CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCkgeworICAgICAgICBmb3IgKGZpZm9fZnJhbWVzX3QgaSA9IDA7IGkgPCBrRmlmb0RhdGFPZmZzZXQ7IGkrKykgeworICAgICAgICAgICAgRVhQRUNUX0VRKG1WZXJ5QmlnQXJyYXlbaV0sIGtTYWZlRGF0YVZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVBZnRlciA9IGtGaWZvRGF0YU9mZnNldCArIG1GaWZvQnVmZmVyLmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICAgICAgZm9yIChmaWZvX2ZyYW1lc190IGkgPSBmaXJzdEZyYW1lQWZ0ZXI7IGkgPCBrQmlnQXJyYXlTaXplOyBpKyspIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtVmVyeUJpZ0FycmF5W2ldLCBrU2FmZURhdGFWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYXZhaWxhYmxlIGZyYW1lcyBpbiBlYWNoIHBhcnQgYWRkIHVwIGNvcnJlY3RseS4KLSAgICB2b2lkIGNoZWNrV3JhcHBpbmdCdWZmZXIoKSB7CisgICAgdm9pZCB2ZXJpZnlXcmFwcGluZ0J1ZmZlcigpIHsKICAgICAgICAgV3JhcHBpbmdCdWZmZXIgd3JhcHBpbmdCdWZmZXI7CisKKworICAgICAgICAvLyBEb2VzIHRoZSBzdW0gb2YgdGhlIHR3byBwYXJ0cyBtYXRjaCB0aGUgYXZhaWxhYmxlIHZhbHVlIHJldHVybmVkPworICAgICAgICAvLyBGb3IgRW1wdHlSb29tCiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRFbXB0eVJvb21BdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7Ci0KKyAgICAgICAgLy8gRm9yIEZ1bGxEYXRhCiAgICAgICAgIGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRGdWxsRGF0YUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7CisKKyAgICAgICAgLy8gQXJlIGZyYW1lIGNvdW50cyBpbiBsZWdhbCByYW5nZT8KKyAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvQnVmZmVyLmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICAgICAgRVhQRUNUX0dFKHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSwgMCk7CisgICAgICAgIEVYUEVDVF9MRSh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0sIGNhcGFjaXR5KTsKKyAgICAgICAgRVhQRUNUX0dFKHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXSwgMCk7CisgICAgICAgIEVYUEVDVF9MRSh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV0sIGNhcGFjaXR5KTsKKworICAgICAgICAvLyBBcmUgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRklGTyBkYXRhIGFyZWE/CisgICAgICAgIHNpemVfdCB2YWxpZEJ5dGVzID0gY2FwYWNpdHkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0pIHsKKyAgICAgICAgICAgIHZlcmlmeUFkZHJlc3NJblJhbmdlKHdyYXBwaW5nQnVmZmVyLmRhdGFbMF0sIG1GaWZvU3RvcmFnZSwgdmFsaWRCeXRlcyk7CisgICAgICAgICAgICB1aW50OF90ICpsYXN0ID0gKCh1aW50OF90ICopd3JhcHBpbmdCdWZmZXIuZGF0YVswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1GaWZvQnVmZmVyLmNvbnZlcnRGcmFtZXNUb0J5dGVzKHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSkgLSAxOworICAgICAgICAgICAgdmVyaWZ5QWRkcmVzc0luUmFuZ2UobGFzdCwgbUZpZm9TdG9yYWdlLCB2YWxpZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdKSB7CisgICAgICAgICAgICB2ZXJpZnlBZGRyZXNzSW5SYW5nZSh3cmFwcGluZ0J1ZmZlci5kYXRhWzFdLCBtRmlmb1N0b3JhZ2UsIHZhbGlkQnl0ZXMpOworICAgICAgICAgICAgdWludDhfdCAqbGFzdCA9ICgodWludDhfdCAqKXdyYXBwaW5nQnVmZmVyLmRhdGFbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRmlmb0J1ZmZlci5jb252ZXJ0RnJhbWVzVG9CeXRlcyh3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV0pIC0gMTsKKyAgICAgICAgICAgIHZlcmlmeUFkZHJlc3NJblJhbmdlKGxhc3QsIG1GaWZvU3RvcmFnZSwgdmFsaWRCeXRlcyk7CisgICAgICAgIH0KKwogICAgIH0KIAogICAgIC8vIFdyaXRlIGRhdGEgYnV0IGRvIG5vdCBvdmVyZmxvdy4KLSAgICB2b2lkIHdyaXRlRGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgIHZvaWQgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9Xcml0ZSA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1dyaXRlOyBpKyspIHsKICAgICAgICAgICAgIG1EYXRhW2ldID0gbU5leHRXcml0ZUluZGV4Kys7CkBAIC0xMjIsMTAgKzIwNywxMCBAQAogICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9Xcml0ZSwgYWN0dWFsKTsKICAgICB9CiAKLSAgICAvLyBSZWFkIGRhdGEgYnV0IGRvIG5vdCB1bmRlcmZsb3cuCi0gICAgdm9pZCB2ZXJpZnlEYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgLy8gUmVhZCB3aGF0ZXZlciBkYXRhIGlzIGF2YWlsYWJsZSwgRG8gbm90IHVuZGVyZmxvdy4KKyAgICB2b2lkIHZlcmlmeU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CiAgICAgICAgIEFTU0VSVF9FUShmcmFtZXNUb1JlYWQsIGFjdHVhbCk7CkBAIC0xMzQsMjAgKzIxOSwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gUmVhZCBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcworICAgIHZvaWQgdmVyaWZ5UmVxdWVzdGVkRGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICBBU1NFUlRfTEUobnVtRnJhbWVzLCBmcmFtZXNBdmFpbGFibGUpOworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOworICAgICAgICBBU1NFUlRfRVEoYWN0dWFsLCBudW1GcmFtZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbDsgaSsrKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEobU5leHRWZXJpZnlJbmRleCsrLCBtRGF0YVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBXcmFwIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCiAgICAgdm9pZCBjaGVja1dyYXBwaW5nV3JpdGVSZWFkKCkgewogICAgICAgICBjb25zdGV4cHIgaW50IGZyYW1lczEgPSA0MzsKICAgICAgICAgY29uc3RleHByIGludCBmcmFtZXMyID0gMTU7CiAKLSAgICAgICAgd3JpdGVEYXRhKGZyYW1lczEpOwotICAgICAgICBjaGVja1dyYXBwaW5nQnVmZmVyKCk7Ci0gICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMSk7Ci0gICAgICAgIGNoZWNrV3JhcHBpbmdCdWZmZXIoKTsKKyAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMoZnJhbWVzMSk7CisgICAgICAgIHZlcmlmeVdyYXBwaW5nQnVmZmVyKCk7CisgICAgICAgIHZlcmlmeVJlcXVlc3RlZERhdGEoZnJhbWVzMSk7CisgICAgICAgIHZlcmlmeVdyYXBwaW5nQnVmZmVyKCk7CiAKLSAgICAgICAgd3JpdGVEYXRhKGZyYW1lczIpOwotICAgICAgICBjaGVja1dyYXBwaW5nQnVmZmVyKCk7Ci0gICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMik7Ci0gICAgICAgIGNoZWNrV3JhcHBpbmdCdWZmZXIoKTsKKyAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMoZnJhbWVzMik7CisgICAgICAgIHZlcmlmeVdyYXBwaW5nQnVmZmVyKCk7CisgICAgICAgIHZlcmlmeVJlcXVlc3RlZERhdGEoZnJhbWVzMik7CisgICAgICAgIHZlcmlmeVdyYXBwaW5nQnVmZmVyKCk7CisKKyAgICAgICAgdmVyaWZ5U3RvcmFnZUludGVncml0eSgpOwogICAgIH0KIAogICAgIC8vIFdyaXRlIGFuZCBSZWFkIGEgc3BlY2lmaWMgYW1vdW50IG9mIGRhdGEuCkBAIC0xNTYsMTAgKzI1NiwxMiBAQAogICAgICAgICAvLyBXcmFwIGFyb3VuZCB3aXRoIHRoZSBzbWFsbGVyIHJlZ2lvbiBpbiB0aGUgc2Vjb25kIGhhbGYuCiAgICAgICAgIGNvbnN0IGludCBmcmFtZXMxID0gY2FwYWNpdHkgLSA0OwogICAgICAgICBjb25zdCBpbnQgZnJhbWVzMiA9IDc7IC8vIGFyYml0cmFyeSwgc21hbGwKLSAgICAgICAgd3JpdGVEYXRhKGZyYW1lczEpOwotICAgICAgICB2ZXJpZnlEYXRhKGZyYW1lczEpOwotICAgICAgICB3cml0ZURhdGEoZnJhbWVzMik7Ci0gICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMik7CisgICAgICAgIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZyYW1lczEpOworICAgICAgICB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZyYW1lczEpOworICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmcmFtZXMyKTsKKyAgICAgICAgdmVyaWZ5UmVxdWVzdGVkRGF0YShmcmFtZXMyKTsKKworICAgICAgICB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCk7CiAgICAgfQogCiAgICAgLy8gV3JpdGUgYW5kIFJlYWQgYSBzcGVjaWZpYyBhbW91bnQgb2YgZGF0YS4KQEAgLTE2OCw0MiArMjcwLDgxIEBACiAgICAgICAgIC8vIFdyYXAgYXJvdW5kIHdpdGggdGhlIGxhcmdlciByZWdpb24gaW4gdGhlIHNlY29uZCBoYWxmLgogICAgICAgICBjb25zdCBpbnQgZnJhbWVzMSA9IGNhcGFjaXR5IC0gNDsKICAgICAgICAgY29uc3QgaW50IGZyYW1lczIgPSBjYXBhY2l0eSAtIDk7IC8vIGFyYml0cmFyeSwgbGFyZ2UKLSAgICAgICAgd3JpdGVEYXRhKGZyYW1lczEpOwotICAgICAgICB2ZXJpZnlEYXRhKGZyYW1lczEpOwotICAgICAgICB3cml0ZURhdGEoZnJhbWVzMik7Ci0gICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMik7CisgICAgICAgIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZyYW1lczEpOworICAgICAgICB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZyYW1lczEpOworICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmcmFtZXMyKTsKKyAgICAgICAgdmVyaWZ5UmVxdWVzdGVkRGF0YShmcmFtZXMyKTsKKworICAgICAgICB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCk7CiAgICAgfQogCiAgICAgLy8gUmFuZG9tbHkgcmVhZCBvciB3cml0ZSB1cCB0byB0aGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YS4KICAgICB2b2lkIGNoZWNrUmFuZG9tV3JpdGVSZWFkKCkgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzRW1wdHkgPQotICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0VtcHR5KTsKLSAgICAgICAgICAgIHdyaXRlRGF0YShudW1GcmFtZXMpOworICAgICAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKIAogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOwotICAgICAgICAgICAgdmVyaWZ5RGF0YShudW1GcmFtZXMpOworICAgICAgICAgICAgdmVyaWZ5TXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgICAgIH0KKworICAgICAgICB2ZXJpZnlTdG9yYWdlSW50ZWdyaXR5KCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgYW5kIFJlYWQgYSBzcGVjaWZpYyBhbW91bnQgb2YgZGF0YS4KKyAgICB2b2lkIGNoZWNrTmVnYXRpdmVDb3VudGVycygpIHsKKyAgICAgICAgZmlmb19jb3VudGVyX3QgY291bnRlciA9IC05ODc2OworICAgICAgICBtRmlmb0J1ZmZlci5zZXRXcml0ZUNvdW50ZXIoY291bnRlcik7CisgICAgICAgIG1GaWZvQnVmZmVyLnNldFJlYWRDb3VudGVyKGNvdW50ZXIpOworICAgICAgICBjaGVja1dyYXBwaW5nV3JpdGVSZWFkKCk7CisgICAgfQorCisgICAgLy8gV3JhcCBvdmVyIHRoZSBib3VuZGFyeSBhdCAweDdGRkZGRkZGRkZGRkZGRkYKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIG92ZXJmbG93IGlzIHRlY2huaWNhbGx5IHVuZGVmaW5lZC4KKyAgICB2b2lkIGNoZWNrSGFsZldyYXAoKSB7CisgICAgICAgIGZpZm9fY291bnRlcl90IGNvdW50ZXIgPSBJTlQ2NF9NQVggLSAxMDsKKyAgICAgICAgbUZpZm9CdWZmZXIuc2V0V3JpdGVDb3VudGVyKGNvdW50ZXIpOworICAgICAgICBtRmlmb0J1ZmZlci5zZXRSZWFkQ291bnRlcihjb3VudGVyKTsKKyAgICAgICAgQVNTRVJUX0dUKG1GaWZvQnVmZmVyLmdldFdyaXRlQ291bnRlcigpLCAwKTsKKyAgICAgICAgY2hlY2tXcmFwcGluZ1dyaXRlUmVhZCgpOworICAgICAgICBBU1NFUlRfTFQobUZpZm9CdWZmZXIuZ2V0V3JpdGVDb3VudGVyKCksIDApOyAvLyBkaWQgd2Ugd3JhcCBwYXN0IElOVDY0X01BWD8KKyAgICB9CisKKyAgICAvLyBXcmFwIG92ZXIgdGhlIGJvdW5kYXJ5IGF0IDB4RkZGRkZGRkZGRkZGRkZGRgorICAgIHZvaWQgY2hlY2tGdWxsV3JhcCgpIHsKKyAgICAgICAgZmlmb19jb3VudGVyX3QgY291bnRlciA9IC0xMDsKKyAgICAgICAgbUZpZm9CdWZmZXIuc2V0V3JpdGVDb3VudGVyKGNvdW50ZXIpOworICAgICAgICBtRmlmb0J1ZmZlci5zZXRSZWFkQ291bnRlcihjb3VudGVyKTsKKyAgICAgICAgQVNTRVJUX0xUKG1GaWZvQnVmZmVyLmdldFdyaXRlQ291bnRlcigpLCAwKTsKKyAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMoMjApOworICAgICAgICBBU1NFUlRfR1QobUZpZm9CdWZmZXIuZ2V0V3JpdGVDb3VudGVyKCksIDApOyAvLyBkaWQgd2Ugd3JhcCBwYXN0IHplcm8/CisgICAgICAgIHZlcmlmeVN0b3JhZ2VJbnRlZ3JpdHkoKTsKICAgICB9CiAKICAgICBGaWZvQnVmZmVyICAgICBtRmlmb0J1ZmZlcjsKLSAgICBpbnQxNl90ICAgICAgICptRGF0YTsKICAgICBmaWZvX2ZyYW1lc190ICBtTmV4dFdyaXRlSW5kZXggPSAwOwogICAgIGZpZm9fZnJhbWVzX3QgIG1OZXh0VmVyaWZ5SW5kZXggPSAwOwogICAgIGZpZm9fZnJhbWVzX3QgIG1UaHJlc2hvbGQ7CisKKyAgICBmaWZvX2NvdW50ZXJfdCBtUmVhZEluZGV4ID0gMDsKKyAgICBmaWZvX2NvdW50ZXJfdCBtV3JpdGVJbmRleCA9IDA7CisgICAgaW50MTZfdCAgICAgICAgbVZlcnlCaWdBcnJheVtrQmlnQXJyYXlTaXplXTsgLy8gVXNlIHRoZSBtaWRkbGUgb2YgdGhpcyBhcnJheSBmb3IgdGhlIEZJRk8uCisgICAgaW50MTZfdCAgICAgICAqbUZpZm9TdG9yYWdlID0gJm1WZXJ5QmlnQXJyYXlba0ZpZm9EYXRhT2Zmc2V0XTsgLy8gU3RhcnQgaGVyZSBmb3Igc3RvcmFnZS4KKyAgICBpbnQxNl90ICAgICAgICBtRGF0YVtrQmlnQXJyYXlTaXplXXt9OwogfTsKIAotVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3JlYWRfd3JpdGUpIHsKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb193cml0ZV9yZWFkKSB7CiAgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDUxOyAvLyBhcmJpdHJhcnkKICAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOwogICAgIHRlc3Rlci5jaGVja01pc2MoKTsKICAgICB0ZXN0ZXIuY2hlY2tXcml0ZVJlYWQoKTsKIH0KIAotVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3dyYXBwaW5nX3JlYWRfd3JpdGUpIHsKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb193cmFwcGluZ193cml0ZV9yZWFkKSB7CiAgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDU5OyAvLyBhcmJpdHJhcnksIGEgbGl0dGxlIGJpZ2dlciB0aGlzIHRpbWUKICAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOwogICAgIHRlc3Rlci5jaGVja1dyYXBwaW5nV3JpdGVSZWFkKCk7CkBAIC0yMjcsMyArMzY4LDIxIEBACiAgICAgVGVzdEZpZm9CdWZmZXIgdGVzdGVyKGNhcGFjaXR5LCB0aHJlc2hvbGQpOwogICAgIHRlc3Rlci5jaGVja1JhbmRvbVdyaXRlUmVhZCgpOwogfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fbmVnYXRpdmVfY291bnRlcnMpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNDk7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrTmVnYXRpdmVDb3VudGVycygpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9faGFsZl93cmFwKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDU3OyAvLyBhcmJpdHJhcnkKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOworICAgIHRlc3Rlci5jaGVja0hhbGZXcmFwKCk7Cit9CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb19mdWxsX3dyYXApIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNTc7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrRnVsbFdyYXAoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA5MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCB0ZXN0cyBmb3IgSXNvY2hyb25vdXMgQ2xvY2sgTW9kZWwKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8Y2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87CisKKy8vIFdlIGNhbiB1c2UgYXJiaXRyYXJ5IHZhbHVlcyBoZXJlIGJlY2F1c2Ugd2UgYXJlIG5vdCBvcGVuaW5nIGEgcmVhbCBhdWRpbyBzdHJlYW0uCisjZGVmaW5lIFNBTVBMRV9SQVRFICAgICAgICAgICAgIDQ4MDAwCisjZGVmaW5lIEhXX0ZSQU1FU19QRVJfQlVSU1QgICAgIDQ4CisjZGVmaW5lIE5BTk9TX1BFUl9CVVJTVCAgICAgICAgIChOQU5PU19QRVJfU0VDT05EICogSFdfRlJBTUVTX1BFUl9CVVJTVCAvIFNBTVBMRV9SQVRFKQorCitjbGFzcyBDbG9ja01vZGVsVGVzdEZpeHR1cmU6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIENsb2NrTW9kZWxUZXN0Rml4dHVyZSgpIHsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgeworICAgICAgICBtb2RlbC5zZXRTYW1wbGVSYXRlKFNBTVBMRV9SQVRFKTsKKyAgICAgICAgbW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QoSFdfRlJBTUVTX1BFUl9CVVJTVCk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIHsKKworICAgIH0KKworICAgIH5DbG9ja01vZGVsVGVzdEZpeHR1cmUoKSAgeworICAgICAgICAvLyBjbGVhbnVwIGFueSBwZW5kaW5nIHN0dWZmLCBidXQgbm8gZXhjZXB0aW9ucyBhbGxvd2VkCisgICAgfQorCisgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsIG1vZGVsOworfTsKKworLy8gQ2hlY2sgZGVmYXVsdCBzZXR1cC4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3NldHVwKSB7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFLCBtb2RlbC5nZXRTYW1wbGVSYXRlKCkpOworICAgIEFTU0VSVF9FUShIV19GUkFNRVNfUEVSX0JVUlNULCBtb2RlbC5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKK30KKworLy8gVGVzdCBkZWx0YSBjYWxjdWxhdGlvbnMuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19kZWx0YXMpIHsKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFLCBwb3NpdGlvbik7CisKKyAgICAvLyBEZWx0YXMgYXJlIG5vdCBxdWFudGl6ZWQuCisgICAgLy8gQ29tcGFyZSB0aW1lIHRvIHRoZSBlcXVpdmFsZW50IHBvc2l0aW9uIGluIGZyYW1lcy4KKyAgICBjb25zdGV4cHIgaW50NjRfdCBrTmFub3NQZXJCdXJzdCA9IEhXX0ZSQU1FU19QRVJfQlVSU1QgKiBOQU5PU19QRVJfU0VDT05EIC8gU0FNUExFX1JBVEU7CisgICAgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0RGVsdGFUaW1lVG9Qb3NpdGlvbihOQU5PU19QRVJfU0VDT05EICsgKGtOYW5vc1BlckJ1cnN0IC8gMikpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSArIChIV19GUkFNRVNfUEVSX0JVUlNUIC8gMiksIHBvc2l0aW9uKTsKKworICAgIGludDY0X3QgdGltZSA9IG1vZGVsLmNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKFNBTVBMRV9SQVRFKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCwgdGltZSk7CisKKyAgICAvLyBDb21wYXJlIHBvc2l0aW9uIGluIGZyYW1lcyB0byB0aGUgZXF1aXZhbGVudCB0aW1lLgorICAgIHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSArIChIV19GUkFNRVNfUEVSX0JVUlNUIC8gMikpOworICAgIEFTU0VSVF9FUShOQU5PU19QRVJfU0VDT05EICsgKGtOYW5vc1BlckJ1cnN0IC8gMiksIHRpbWUpOworfQorCisvLyBzdGFydCgpIHNob3VsZCBmb3JjZSB0aGUgaW50ZXJuYWwgbWFya2VycworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc3RhcnQpIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihzdGFydFRpbWUpOworICAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24pOworICAgIEVYUEVDVF9FUShzdGFydFRpbWUsIHRpbWUpOworCisgICAgdGltZSA9IHN0YXJ0VGltZSArICg1MDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKHRpbWUpOworICAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7Cit9CisKKy8vIHRpbWVzdGFtcHMgbW92ZXMgdGhlIHdpbmRvdyBpZiBvdXRzaWRlIHRoZSBib3VuZHMKKy8vIFRPRE8gdGVzdCBudWRnaW5nIHRoZSB3aW5kb3cKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3RpbWVzdGFtcCkgeworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lID0gMTAwMDAwMDAwOworICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZSk7CisKKyAgICBjb25zdCBpbnQ2NF90IHBvc2l0aW9uID0gSFdfRlJBTUVTX1BFUl9CVVJTVDsgLy8gaGFyZHdhcmUKKyAgICBpbnQ2NF90IG1hcmtlclRpbWUgPSBzdGFydFRpbWUgKyBOQU5PU19QRVJfTUlMTElTRUNPTkQgKyAoMjAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKworICAgIC8vIFNob3VsZCBzZXQgbWFya2VyLgorICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAocG9zaXRpb24sIG1hcmtlclRpbWUpOworICAgIEVYUEVDVF9FUShwb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUpKTsKKworICAgIC8vIGNvbnZlcnRUaW1lVG9Qb3NpdGlvbiByb3VuZHMgZG93bgorICAgIEVYUEVDVF9FUShwb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUgKyAoNzMgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpKSk7CisKKyAgICAvLyBjb252ZXJ0UG9zaXRpb25Ub1RpbWUgcm91bmRzIHVwCisgICAgRVhQRUNUX0VRKG1hcmtlclRpbWUgKyBOQU5PU19QRVJfQlVSU1QsIG1vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShwb3NpdGlvbiArIDE3KSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYzYTdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRlc3QgRmxvd0dyYXBoCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9SYW1wTGluZWFyLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtGbG9hdC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTE2LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMjQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTE2LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9zaW5raTE2KSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMC41ZiwgLTAuMjVmLCAtMS4wZiwgMC4wZiwgNTMuOWYsIC04Ny4yZn07CisgICAgc3RhdGljIGNvbnN0IGludDE2X3QgZXhwZWN0ZWRbXSA9IHszMjc2NywgMTYzODQsIC04MTkyLCAtMzI3NjgsIDAsIDMyNzY3LCAtMzI3Njh9OworICAgIGludDE2X3Qgb3V0cHV0WzIwXTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBTaW5rSTE2IHNpbmtJMTZ7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKGlucHV0WzBdKTsKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMTYuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKGludDE2X3QpOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMTYucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfbW9ub190b19zdGVyZW8pIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHsxLjBmLCAyLjBmLCAzLjBmfTsKKyAgICBmbG9hdCBvdXRwdXRbMTAwXSA9IHt9OworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIE1vbm9Ub011bHRpQ29udmVydGVyIG1vbm9Ub1N0ZXJlb3syfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezJ9OworCisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgMyk7CisKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmbW9ub1RvU3RlcmVvLmlucHV0KTsKKyAgICBtb25vVG9TdGVyZW8ub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIDgpOworICAgIEFTU0VSVF9FUSgzLCBudW1SZWFkKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMF0sIG91dHB1dFswXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMV0pOworICAgIEVYUEVDVF9FUShpbnB1dFsxXSwgb3V0cHV0WzJdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFszXSk7Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9yYW1wX2xpbmVhcikgeworICAgIGNvbnN0ZXhwciBpbnQgcmFtcFNpemUgPSA1OworICAgIGNvbnN0ZXhwciBpbnQgbnVtT3V0cHV0ID0gMTAwOworICAgIGNvbnN0ZXhwciBmbG9hdCB2YWx1ZSA9IDEuMGY7CisgICAgY29uc3RleHByIGZsb2F0IHRhcmdldCA9IDEwMC4wZjsKKyAgICBmbG9hdCBvdXRwdXRbbnVtT3V0cHV0XSA9IHt9OworICAgIFJhbXBMaW5lYXIgcmFtcExpbmVhcnsxfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OworCisgICAgcmFtcExpbmVhci5pbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgcmFtcExpbmVhci5zZXRMZW5ndGhJbkZyYW1lcyhyYW1wU2l6ZSk7CisgICAgcmFtcExpbmVhci5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICByYW1wTGluZWFyLmZvcmNlQ3VycmVudCgwLjBmKTsKKworICAgIHJhbXBMaW5lYXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dCk7CisgICAgQVNTRVJUX0VRKG51bU91dHB1dCwgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMWY7IC8vIGFyYml0cmFyeQorICAgIGludCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IHJhbXBTaXplOyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSBpICogdmFsdWUgKiB0YXJnZXQgLyByYW1wU2l6ZTsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBudW1PdXRwdXQ7IGkrKykgeworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IHZhbHVlICogdGFyZ2V0OworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KKworLy8gSXQgaXMgZWFzaWVzdCB0byByZXByZXNlbnQgcGFja2VkIDI0LWJpdCBkYXRhIGFzIGEgYnl0ZSBhcnJheS4KKy8vIFRoaXMgdGVzdCB3aWxsIHJlYWQgZnJvbSBpbnB1dCwgY29udmVydCB0byBmbG9hdCwgdGhlbiB3cml0ZQorLy8gYmFjayB0byBvdXRwdXQgYXMgYnl0ZXMuCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcGFja2VkXzI0KSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW5wdXRbXSA9IHsweDAxLCAweDIzLCAweDQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NywgMHg4OSwgMHhBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Q0QsIDB4RUYsIDB4NUF9OworICAgIHVpbnQ4X3Qgb3V0cHV0Wzk5XSA9IHt9OworICAgIFNvdXJjZUkyNCBzb3VyY2VJMjR7MX07CisgICAgU2lua0kyNCBzaW5rSTI0ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIGtCeXRlc1BlckkyNFBhY2tlZDsKKyAgICBzb3VyY2VJMjQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUkyNC5vdXRwdXQuY29ubmVjdCgmc2lua0kyNC5pbnB1dCk7CisKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTI0LnJlYWQob3V0cHV0LCBzaXplb2Yob3V0cHV0KSAvIGtCeXRlc1BlckkyNFBhY2tlZCk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihpbnB1dCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoaW5wdXRbaV0sIG91dHB1dFtpXSk7CisgICAgfQorfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfY2xpcF90b19yYW5nZSkgeworICAgIGNvbnN0ZXhwciBmbG9hdCBteU1pbiA9IC0yLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCBteU1heCA9IDEuNWY7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHstOS43LCAwLjVmLCAtMC4yNSwgMS4wZiwgMTIuM307CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGV4cGVjdGVkW10gPSB7bXlNaW4sIDAuNWYsIC0wLjI1LCAxLjBmLCBteU1heH07CisgICAgZmxvYXQgb3V0cHV0WzEwMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgQ2xpcFRvUmFuZ2UgY2xpcHBlcnsxfTsKKyAgICBTaW5rRmxvYXQgc2lua0Zsb2F0ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworCisgICAgY2xpcHBlci5zZXRNaW5pbXVtKG15TWluKTsKKyAgICBjbGlwcGVyLnNldE1heGltdW0obXlNYXgpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJmNsaXBwZXIuaW5wdXQpOworICAgIGNsaXBwZXIub3V0cHV0LmNvbm5lY3QoJnNpbmtGbG9hdC5pbnB1dCk7CisKKyAgICBpbnQgbnVtT3V0cHV0RnJhbWVzID0gc2l6ZW9mKG91dHB1dCkgLyBzaXplb2Yob3V0cHV0WzBdKTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rRmxvYXQucmVhZChvdXRwdXQsIG51bU91dHB1dEZyYW1lcyk7CisgICAgQVNTRVJUX0VRKG51bUlucHV0RnJhbWVzLCBudW1SZWFkKTsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMjZiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0xpbmVhclJhbXAuaCIKLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9zZWdtZW50cykgewotICAgIExpbmVhclJhbXAgcmFtcDsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotICAgIGZsb2F0IGRlc3RpbmF0aW9uWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQotICAgIGZsb2F0IGxldmVsRnJvbSA9IC0xLjBmOwotICAgIGZsb2F0IGxldmVsVG8gPSAtMS4wZjsKLSAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDgpOwotICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwotCi0gICAgRVhQRUNUX0VRKDgsIHJhbXAuZ2V0TGVuZ3RoSW5GcmFtZXMoKSk7Ci0KLSAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSgxLjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDIuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoMy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgxLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDUuMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoNi4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg3LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLSAgICByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotfTsKLQotCi1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGxpbmVhcl9yYW1wX2ZvcmNlZCkgewotICAgIExpbmVhclJhbXAgcmFtcDsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotICAgIGZsb2F0IGRlc3RpbmF0aW9uWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQotICAgIGZsb2F0IGxldmVsRnJvbSA9IC0xLjBmOwotICAgIGZsb2F0IGxldmVsVG8gPSAtMS4wZjsKLSAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDQpOwotICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwotICAgIHJhbXAuZm9yY2VDdXJyZW50KDQuMGYpOwotICAgIEVYUEVDVF9FUSg0LjBmLCByYW1wLmdldEN1cnJlbnQoKSk7Ci0KLSAgICBib29sIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLWNvbnN0ZXhwciBpbnQxNl90IGtNYXhJMTYgPSBJTlQxNl9NQVg7Ci1jb25zdGV4cHIgaW50MTZfdCBrTWluSTE2ID0gSU5UMTZfTUlOOwotY29uc3RleHByIGludDE2X3Qga0hhbGZJMTYgPSAxNjM4NDsKLWNvbnN0ZXhwciBpbnQxNl90IGtUZW50aEkxNiA9IDMyNzc7Ci0KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpOwotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBmbG9hdF90b19pMTYpIHsKLSAgICBjb25zdCBmbG9hdCBzb3VyY2VbXSA9IHsxMjM0NS42ZiwgMS4wZiwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZiwgLTEyMzQ1LjZmfTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKLSAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHtrTWF4STE2LCBrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNiwga01pbkkxNn07Ci0KLSAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgaTE2X3RvX2Zsb2F0KSB7Ci0gICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHtrTWF4STE2LCBrSGFsZkkxNiwga1RlbnRoSTE2LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWtUZW50aEkxNiwgLWtIYWxmSTE2LCBrTWluSTE2fTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgZmxvYXQgZXhwZWN0ZWRbY291bnRdID0geygzMjc2Ny4wZiAvIDMyNzY4LjBmKSwgMC41ZiwgMC4xZiwgMC4wZiwgLTAuMWYsIC0wLjVmLCAtMS4wZn07Ci0KLSAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMS4wZik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBkZXN0aW5hdGlvbltpXSwgMC4wMDAxZik7Ci0gICAgfQotCi19Ci0KLS8vdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLS8vICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgcmFtcF9pMTZfdG9faTE2KSB7Ci0gICAgY29uc3QgaW50MTZfdCBzb3VyY2VbXSA9IHsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHNvdXJjZSkgLyBzaXplb2Yoc291cmNlWzBdKTsKLSAgICBpbnQxNl90IGRlc3RpbmF0aW9uW2NvdW50XTsKLSAgICAvLyBSYW1wIHdpbGwgc3dlZXAgZnJvbSAtMSB0byBhbG1vc3QgKzEKLSAgICBjb25zdCBpbnQxNl90IGV4cGVjdGVkW2NvdW50XSA9IHsKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0xLjAwCi0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMC43NQotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNTUsIHJvdW5kIGF3YXkgZnJvbSB6ZXJvCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAtMC4yNSwgcm91bmQgdXAgdG8gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gIDAuMDAKLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjI1LCByb3VuZCBkb3duIHRvIHplcm8KLSAgICAgICAgICAgIDEsICAvLyBmcm9tICAwLjUwLCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMSAgIC8vIGZyb20gIDAuNzUKLSAgICB9OwotCi0gICAgLy8gc3dlZXAgYWNyb3NzIHplcm8gdG8gdGVzdCBzeW1tZXRyeQotICAgIGNvbnN0ZXhwciBmbG9hdCBhbXBsaXR1ZGUxID0gLTEuMDsKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMiA9IDEuMDsKLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCBjb3VudCwgMSwgYW1wbGl0dWRlMSwgYW1wbGl0dWRlMik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOWUwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZXR1cm5fc3RvcC5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFJldHVybiBzdG9wIGZyb20gdGhlIGNhbGxiYWNrLgorICogRXhwZWN0IHRoZSBjYWxsYmFjayB0byBjZWFzZS4KKyAqIENoZWNrIHRoZSBsb2djYXQgZm9yIGJhZCBiZWhhdmlvci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAoKGludDY0X3QpMTAwMDAwMDAwMCkKKyNkZWZpbmUgU1RPUF9BVF9NU0VDICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTE9PUF9EVVJBVElPTl9NU0VDICAgIDQwMDAKKyNkZWZpbmUgU0xFRVBfRFVSQVRJT05fTVNFQyAgICAyMDAKKworc3RhdGljIHZvaWQgc19teUVycm9yQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcik7CisKK3N0cnVjdCBBdWRpb0VuZ2luZSB7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAqc3RyZWFtID0gbnVsbHB0cjsKKyAgICBzdGQ6OnRocmVhZCAgICAgICAgICp0aHJlYWQgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgICAgICAgIHN0b3BBdEZyYW1lID0gMDsKKyAgICBib29sICAgICAgICAgICAgICAgICBzdG9wcGVkID0gZmFsc2U7CisgICAgLy8gVGhlc2UgY291bnRlcnMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gYnkgdGhlIGNhbGxiYWNrIGFuZCB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gZnJhbWVzUmVhZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IHN0YXJ0aW5nRnJhbWVzUmVhZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc0NhbGxlZHt9OworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGNhbGxiYWNrQ291bnR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50QWZ0ZXJTdG9we307CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBmcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBzdGFydGluZ0ZyYW1lc1JlYWQuc3RvcmUoMCk7CisgICAgICAgIGZyYW1lc0NhbGxlZC5zdG9yZSgwKTsKKyAgICAgICAgY2FsbGJhY2tDb3VudC5zdG9yZSgwKTsKKyAgICAgICAgY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5zdG9yZSgwKTsKKyAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIH0KK307CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCitzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3Qgc19teURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcworKSB7CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoc3RydWN0IEF1ZGlvRW5naW5lICopdXNlckRhdGE7CisgICAgZW5naW5lLT5jYWxsYmFja0NvdW50Kys7CisgICAgaWYgKGVuZ2luZS0+c3RvcHBlZCkgeworICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnRBZnRlclN0b3ArKzsKKyAgICB9CisKKyAgICBlbmdpbmUtPmZyYW1lc1JlYWQgPSAoaW50MzJfdClBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0pOworICAgIGlmIChlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZCA9PSAwKSB7CisgICAgICAgIGVuZ2luZS0+c3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKGVuZ2luZS0+ZnJhbWVzUmVhZC5sb2FkKCkpOworICAgIH0KKyAgICBlbmdpbmUtPmZyYW1lc0NhbGxlZCArPSBudW1GcmFtZXM7CisgICAgaWYgKGVuZ2luZS0+ZnJhbWVzQ2FsbGVkID49IGVuZ2luZS0+c3RvcEF0RnJhbWUpIHsKKyAgICAgICAgZW5naW5lLT5zdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9Cit9CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3Qgc19PcGVuQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZlbmdpbmUtPmJ1aWxkZXIpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChlbmdpbmUtPmJ1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGVuZ2luZS0+YnVpbGRlciwgc2hhcmluZ01vZGUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGVuZ2luZS0+YnVpbGRlciwgZGlyZWN0aW9uKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhlbmdpbmUtPmJ1aWxkZXIsIHNfbXlEYXRhQ2FsbGJhY2tQcm9jLCBlbmdpbmUpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjayhlbmdpbmUtPmJ1aWxkZXIsIHNfbXlFcnJvckNhbGxiYWNrUHJvYywgZW5naW5lKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGVuZ2luZS0+YnVpbGRlciwgJmVuZ2luZS0+c3RyZWFtKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfQ2xvc2VBdWRpb1N0cmVhbShzdHJ1Y3QgQXVkaW9FbmdpbmUgKmVuZ2luZSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaWYgKGVuZ2luZS0+c3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKGVuZ2luZS0+c3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIGVuZ2luZS0+c3RyZWFtID0gbnVsbHB0cjsKKyAgICB9CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoZW5naW5lLT5idWlsZGVyKTsKKyAgICBlbmdpbmUtPmJ1aWxkZXIgPSBudWxscHRyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCisgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBwcmludGYoIiVzKCkgLSBlcnJvciA9ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCit2b2lkIHVzYWdlKCkgeworICAgIHByaW50ZigidGVzdF9yZXR1cm5fc3RvcCBbLWldIFsteF0gWy1uXSBbLWNdXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWkgZGlyZWN0aW9uIElOUFVULCBvdGhlcndpc2UgT1VUUFVUXG4iKTsKKyAgICBwcmludGYoIiAgICAgLXggc2hhcmluZyBtb2RlIEVYQ0xVU0lWRSwgb3RoZXJ3aXNlIFNIQVJFRFxuIik7CisgICAgcHJpbnRmKCIgICAgIC1uIHBlcmZvcm1hbmNlIG1vZGUgTk9ORSwgb3RoZXJ3aXNlIExPV19MQVRFTkNZXG4iKTsKKyAgICBwcmludGYoIiAgICAgLWMgYWx3YXlzIHJldHVybiBDT05USU5VRSBmcm9tIGNhbGxiYWNrLCBub3QgU1RPUFxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworICAgIHN0cnVjdCBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGJvb2wgYWx3YXlzQ29udGludWUgPSBmYWxzZTsKKyAgICBpbnQgZXJyb3JDb3VudCA9IDA7CisgICAgaW50IGNhbGxiYWNrUmVzdWx0ID0gRVhJVF9TVUNDRVNTOworCisgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCisgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBwcmludGYoIlRlc3QgUmV0dXJuIFN0b3AgVjEuMFxuIik7CisgICAgcHJpbnRmKCJXYWl0IGZvciBhIGZldyBzZWNvbmRzLlxuIik7CisgICAgcHJpbnRmKCJZb3Ugc2hvdWxkIHNlZSBjYWxsYmFja0NvdW50IGFuZCBmcmFtZXNSZWFkIHN0b3AgYWR2YW5jaW5nXG4iKTsKKyAgICBwcmludGYoIndoZW4gY2FsbGJhY2tDb3VudCByZWFjaGVzICVkIG1zZWNcbiIsIFNUT1BfQVRfTVNFQyk7CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKyAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKKyAgICAgICAgICAgIGNoYXIgb3B0aW9uID0gYXJnWzFdOworICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgICAgYWx3YXlzQ29udGludWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9JTlBVVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgICAgIHBlcmZNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgPSBzX09wZW5BdWRpb1N0cmVhbSgmZW5naW5lLCBkaXJlY3Rpb24sIHNoYXJpbmdNb2RlLCBwZXJmTW9kZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJzX09wZW5BdWRpb1N0cmVhbSByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgZXJyb3JDb3VudCsrOworICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoZW5naW5lLnN0cmVhbSk7CisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBmcmFtZXNQZXJCdXJzdCA9ICUzZCwgcGVyZk1vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgZGV2aWNlSWQsIGZyYW1lc1BlckJ1cnN0LCBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgY2FsbGJhY2tzIG5lZWRlZC4KKyAgICBpZiAoYWx3YXlzQ29udGludWUpIHsKKyAgICAgICAgZW5naW5lLnN0b3BBdEZyYW1lID0gSU5UMzJfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBTVE9QX0FUX01TRUMgKiBzYW1wbGVSYXRlIC8gMTAwMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBsb29wcyA9IDA7IGxvb3BzIDwgMiAmJiByZXN1bHQgPT0gQUFVRElPX09LOyBsb29wcysrKSB7CisgICAgICAgIGVuZ2luZS5yZXNldCgpOworCisgICAgICAgIC8vIFN0YXJ0IHN0cmVhbS4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3YXRjaExvb3BzID0gTE9PUF9EVVJBVElPTl9NU0VDIC8gU0xFRVBfRFVSQVRJT05fTVNFQzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB3YXRjaExvb3BzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJwbGF5aW5nIHNpbGVuY2UgIyUwMmQsIGZyYW1lc1JlYWQgPSAlN2QsIGZyYW1lc1dyaXR0ZW4gPSAlN2QsIgorICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lc0NhbGxlZCA9ICU2ZCwgY2FsbGJhY2tDb3VudCA9ICU0ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGVuZ2luZS5zdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oZW5naW5lLnN0cmVhbSksCisgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5mcmFtZXNDYWxsZWQubG9hZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuY2FsbGJhY2tDb3VudC5sb2FkKCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHVzbGVlcChTTEVFUF9EVVJBVElPTl9NU0VDICogMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5naW5lLnN0b3BBdEZyYW1lICE9IElOVDMyX01BWCkgeworICAgICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSAoZW5naW5lLmNhbGxiYWNrQ291bnRBZnRlclN0b3AgPT0gMCkgPyBFWElUX1NVQ0NFU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQ2FsbGJhY2sgY291bnQgYWZ0ZXIgU1RPUCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5sb2FkKCkpOworICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RhcnRpbmdGcmFtZXNSZWFkLmxvYWQoKSA9PSBlbmdpbmUuZnJhbWVzUmVhZC5sb2FkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBmcmFtZXNSZWFkIGRpZCBub3QgYWR2YW5jZSBhY3Jvc3MgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSByZXR1cm5lZCAlZCA8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgcHJpbnRmKCJnZXRGcmFtZXNSZWFkKCkgPSAlZCwgZ2V0RnJhbWVzV3JpdHRlbigpID0gJWRcbiIsCisgICAgICAgICAgICAgICAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoZW5naW5lLnN0cmVhbSksCisgICAgICAgICAgICAgICAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oZW5naW5lLnN0cmVhbSkpOworICAgIH0KKworICAgIHNfQ2xvc2VBdWRpb1N0cmVhbSgmZW5naW5lKTsKKworICAgIHByaW50ZigiYWF1ZGlvIHJlc3VsdCA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgcHJpbnRmKCJ0ZXN0ICVzXG4iLCBlcnJvckNvdW50ID8gIkZBSUxFRCIgOiAiUEFTU0VEIik7CisKKyAgICByZXR1cm4gZXJyb3JDb3VudCA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IGY5M2Q0NGIuLjgyN2RmNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtNDAsMTUgKzQwLDE3IEBACiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IGI0MGYwZGIuLmNmMTE5MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTQzMiwxNCArNDMyLDE1IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIC8qY29uc3QqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhZi0+Z2V0RWZmZWN0RGVzY3JpcHRvcih1dWlkLCBkZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgdHlwZSwgcHJlZmVycmVkVHlwZUZsYWcsIGRlc2NyaXB0b3IpOwogfQogCi0KIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKQEAgLTQ0OCw2ICs0NDksOTUgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYXBzLT5xdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKIH0KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICppZCA9IGFmLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfRUZGRUNUKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCAqaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIGlmICh0eXBlU3RyID09IE5VTEwgJiYgdXVpZFN0ciA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gQ29udmVydCB0eXBlICYgdXVpZCBmcm9tIHN0cmluZyB0byBlZmZlY3RfdXVpZF90LgorICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh0eXBlU3RyLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBpZiAodXVpZFN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIHJldHVybiBhcHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKmd1aWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggMGFhYmFmNy4uMzIyMzY0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtNDksOCArNDksOSBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsICIKLSAgICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIgorICAgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtNTgsOCArNTksOCBAQAogICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCiAgICAgaWYgKCgqZnJhbWVDb3VudCA9IChzaXplICogMikgLyAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spICoKICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkpID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCi0gICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMjA5LDggKzIxMCw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvUmVjb3JkLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVNlc3Npb25JZCk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEgLypwaWQqLyk7CiAgICAgfQogfQpAQCAtMjM4LDkgKzIzOSwxMSBAQAogICAgIHBpZF90IGNhbGxpbmdQaWQ7CiAgICAgcGlkX3QgbXlQaWQ7CiAKLSAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBvcFBhY2thZ2VOYW1lICVzICIKICAgICAgICAgICAidWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCBTdHJpbmc4KG1PcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwogCkBAIC0yNTYsNyArMjU5LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMjY1LDcgKzI2OCw3IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yNzMsNyArMjc2LDcgQEAKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI4NCw4ICsyODcsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KIAogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTI5OCwxNCArMzAxLDE0IEBACiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIC8vIEF1ZGlvRmxpbmdlciBjYXB0dXJlIG9ubHkgc3VwcG9ydHMgbGluZWFyIFBDTQogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMzI2LDcgKzMyOSw3IEBACiAgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVSZWNvcmRfbAogCiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoKTogbVNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBtU2Vzc2lvbklkKTsKIAogICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgbXlQaWQgPSBnZXRwaWQoKTsKQEAgLTM1Myw2ICszNTYsOCBAQAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCiAgICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKIAorICAgIEFMT0dWKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOworCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCkBAIC0zODgsNyArMzkzLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKIHsKLSAgICBBTE9HVigic3RhcnQsIHN5bmMgZXZlbnQgJWQgdHJpZ2dlciBzZXNzaW9uICVkIiwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKKyAgICBBTE9HVigiJXMoJWQpOiBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBldmVudCwgdHJpZ2dlclNlc3Npb24pOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtQWN0aXZlKSB7CkBAIC00MjksNyArNDM0LDcgQEAKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gdCA9IG1BdWRpb1JlY29yZFRocmVhZDsKICAgICAgICAgaWYgKHQgIT0gMCkgewpAQCAtNDUzLDYgKzQ1OCw3IEBACiB2b2lkIEF1ZGlvUmVjb3JkOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogbUFjdGl2ZTolZFxuIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1BY3RpdmUpOwogICAgIGlmICghbUFjdGl2ZSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjMxLDggKzYzNyw4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9SZWNvcmQ6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGlkKCVkKSBzdGF0dXMoJWQpLCBhY3RpdmUoJWQpLCBzZXNzaW9uIElkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1BY3RpdmUsIG1TZXNzaW9uSWQpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZmxhZ3MoJSN4KSwgcmVxLiBmbGFncyglI3gpLCBhdWRpbyBzb3VyY2UoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCBtT3JpZ0ZsYWdzLCBtQXR0cmlidXRlcy5zb3VyY2UpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KSwgc2FtcGxlIHJhdGUoJXUpXG4iLApAQCAtNjc0LDcgKzY4MCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogCiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTcwMSw3ICs3MDcsOCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pOwogICAgICAgICBpZiAoIXVzZUNhc2VBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQobVRyYW5zZmVyKSk7CiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH4oQVVESU9fSU5QVVRfRkxBR19GQVNUIHwKICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19SQVcpKTsKQEAgLTczNiw3ICs3NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKHJlY29yZCAhPSAwKTsKQEAgLTc0Niw3ICs3NTQsOCBAQAogCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgIEFMT0dJKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgQUxPR0koIiVzKCVkKTogQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgfQpAQCAtNzU2LDEzICs3NjUsMTMgQEAKICAgICBtU2FtcGxlUmF0ZSA9IG91dHB1dC5zYW1wbGVSYXRlOwogCiAgICAgaWYgKG91dHB1dC5jYmxrID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgaU1lbVBvaW50ZXIgPSBvdXRwdXQuY2JsayAtPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC03NzcsNyArNzg2LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBidWZmZXJzID0gb3V0cHV0LmJ1ZmZlcnMtPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC03OTEsMTkgKzgwMCwyMiBAQAogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IG91dHB1dC5jYmxrOwogICAgIG1CdWZmZXJNZW1vcnkgPSBvdXRwdXQuYnVmZmVyczsKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKICAgICBtQ2JsayA9IGNibGs7CiAgICAgLy8gbm90ZSB0aGF0IG91dHB1dC5mcmFtZUNvdW50IGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgbVJlcUZyYW1lQ291bnQKICAgICBpZiAob3V0cHV0LmZyYW1lQ291bnQgPCBtUmVxRnJhbWVDb3VudCB8fCAobVJlcUZyYW1lQ291bnQgPT0gMCAmJiBvdXRwdXQuZnJhbWVDb3VudCA9PSAwKSkgewotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IFJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsICBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgb3ZlcnJ1bi4KICAgICAvLyBUaGUgY29tcHV0YXRpb24gaXMgZG9uZSBvbiBzZXJ2ZXIgc2lkZS4KICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA+IDAgJiYgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgIT0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSkgewotICAgICAgICBBTE9HVygiU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBTZXJ2ZXIgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdClvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKQEAgLTg3MSw3ICs4ODMsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtOTgwLDcgKzk5Miw4IEBACiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKSAoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTEwMzcsNyArMTA1MCw3IEBACiAgICAgICAgICAgICBwb2xsVXMgPDw9IDE7CiAgICAgICAgIH0gd2hpbGUgKHRyeUNvdW50ZXItLSA+IDApOwogICAgICAgICBpZiAodHJ5Q291bnRlciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTE2MCw3ICsxMTczLDggQEAKICAgICBpZiAobnMgIT0gTlNfV0hFTkVWRVIpIHsKICAgICAgICAgdGltZW91dC50dl9zZWMgPSBucyAvIDEwMDAwMDAwMDBMTDsKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gbnMgJSAxMDAwMDAwMDAwTEw7Ci0gICAgICAgIEFMT0dWKCJ0aW1lb3V0ICVsZC4lMDNkIiwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOworICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lb3V0ICVsZC4lMDNkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9CiAKQEAgLTExNzIsMTYgKzExODYsMTggQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwgZXJyKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVycm9yICVkIG9idGFpbmluZyBhbiBhdWRpbyBidWZmZXIsIGdpdmluZyB1cC4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjAzLDggKzEyMTksOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjY0LDcgKzEyODAsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6cmVzdG9yZVJlY29yZF9sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgZnJvbSk7CisgICAgQUxPR1coIiVzKCVkKTogZGVhZCBJQXVkaW9SZWNvcmQsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICBjb25zdCBpbnQgSU5JVElBTF9SRVRSSUVTID0gMzsKQEAgLTEyODQsMTAgKzEzMDAsNyBAQAogICAgIG1OZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgbVVwZGF0ZVBlcmlvZDsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVSZWNvcmRfbChwb3NpdGlvbiwgbU9wUGFja2FnZU5hbWUpOwogCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKTogY3JlYXRlUmVjb3JkX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHJpZXMgPSAwOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBpZiAobUFjdGl2ZSkgewogICAgICAgICAgICAgLy8gY2FsbGJhY2sgdGhyZWFkIG9yIHN5bmMgZXZlbnQgaGFzbid0IGNoYW5nZWQKICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgZmFpbHMgaWYgd2UgaGF2ZSBhIG5ldyBBdWRpb0ZsaW5nZXIgaW5zdGFuY2UKQEAgLTEyOTgsMTUgKzEzMTEsMTcgQEAKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgcmVzdWx0LCByZXRyaWVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCByZXN1bHQsIHJldHJpZXMpOwogICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgLy8gbGVhdmUgdGltZSBmb3IgYW4gZXZlbnR1YWwgcmFjZSBjb25kaXRpb24gdG8gY2xlYXIgYmVmb3JlIHJldHJ5aW5nCisgICAgICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJyZXN0b3JlUmVjb3JkX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBpZiBubyByZXRyaWVzIGxlZnQsIHNldCBpbnZhbGlkIGJpdCB0byBmb3JjZSByZXN0b3JpbmcgYXQgbmV4dCBvY2Nhc2lvbgorICAgICAgICAvLyBhbmQgYXZvaWQgaW5jb25zaXN0ZW50IGFjdGl2ZSBzdGF0ZSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcworICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTMxNSwxOCArMTMzMCwxOCBAQAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKQEAgLTEzMzksMTIgKzEzNTQsMTIgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKQEAgLTE0NDksNyArMTQ2NCw3IEBACiAgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCkgcmV0dXJuZWQgJWxsZCIsIF9fZnVuY19fLCAobG9uZyBsb25nKW5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjMDcyOTAxLi5kYzc1MzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC04NzgsMzEgKzg3OCwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQocG9ydElkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIGFwcy0+c3RvcE91dHB1dChwb3J0SWQpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuOwotICAgIGFwcy0+cmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgYXBzLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtOTIzLDExICs5MTcsMTEgQEAKICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sICpzaWxlbmNlZCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQsIHNpbGVuY2VkKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC0xMjQ0LDE4ICsxMjM4LDE4IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICByZXR1cm4gYXBzLT5zdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpAQCAtMTMwNCw2ICsxMjk4LDMxIEBACiAgICAgcmV0dXJuIGFwcy0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKIH0KIAorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEFzc2lzdGFudFVpZCh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5zZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworfQorCitib29sIEF1ZGlvU3lzdGVtOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKApAQCAtMTM2OSw5ICsxMzg4LDE0IEBACiB9CiAKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewogICAgIHJlY29yZF9jb25maWdfY2FsbGJhY2sgY2IgPSBOVUxMOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CkBAIC0xMzc5LDcgKzE0MDMsOCBAQAogICAgIH0KIAogICAgIGlmIChjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICBjYihldmVudCwgY2xpZW50SW5mbywgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCBhZGViNmE2Li5iNDQ0ZDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMzAsOSArMzAsMTEgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCkBAIC0xMjAsMjIgKzEyMiwyMiBAQAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHVpbnQzMl90IGFmTGF0ZW5jeTsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtMTQ4LDE1ICsxNTAsMjQgQEAKICAgICAvLyBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01JTiA8PSBzYW1wbGVSYXRlIDw9IEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUFYLgogICAgIC8vIFJldHVybiBlcnJvciBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBpdCBkb2VzIG5vdCwgYXMgdGhhdCdzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdC4KICAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRSgiJXMoKTogZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAotICAgICAgICAgICAgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgIEFMT0dWKCIlcygpOiBnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAorICAgICAgICAgICAgX19mdW5jX18sICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKy8vIHN0YXRpYworYm9vbCBBdWRpb1RyYWNrOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIEFMT0dWKCIlcygpIiwgX19GVU5DVElPTl9fKTsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db250ZW50VHlwZVN0cmluZyhhdWRpb19jb250ZW50X3R5cGVfdCB2YWx1ZSkgewpAQCAtMjAxLDcgKzIxMiw3IEBACiAgICAgLy8gWFhYOiBzaGFsbCB3ZSBnYXRoZXIgYWx0ZXJuYXRpdmUgaW5mbyBpZiBmYWlsaW5nPwogICAgIGNvbnN0IHN0YXR1c190IGxzdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGxzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0QoIm5vIG1ldHJpY3MgZ2F0aGVyZWQsIHRyYWNrIHN0YXR1cz0lZCIsIChpbnQpIGxzdGF0dXMpOworICAgICAgICBBTE9HRCgiJXMoKTogbm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgX19mdW5jX18sIChpbnQpIGxzdGF0dXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0zNDMsNyArMzU0LDggQEAKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEFMT0dWKCJ+QXVkaW9UcmFjaywgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICBBTE9HVigiJXMoJWQpLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CkBAIC0zNzYsOCArMzg4LDEwIEBACiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCisgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJWQsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCisgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOwogCkBAIC0zOTYsOCArNDEwLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKKyAgICBjYXNlIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0s6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSAlcyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQodHJhbnNmZXJUeXBlKSwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC00MDUsMjAgKzQyMSwyMSBAQAogICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgogICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfU0hBUkVEOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX1NIQVJFRCBidXQgc2hhcmVkQnVmZmVyID09IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX1NIQVJFRCBidXQgc2hhcmVkQnVmZmVyID09IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00MjYsMTQgKzQ0MywxNSBAQAogICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKICAgICBtRG9Ob3RSZWNvbm5lY3QgPSBkb05vdFJlY29ubmVjdDsKIAotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1Iiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICIlcygpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CiAKLSAgICBBTE9HVigic2V0KCkgc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLAorICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CisgICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00NDQsNyArNDYyLDcgQEAKICAgICB9CiAgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKICAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBfX2Z1bmNfXywgc3RyZWFtVHlwZSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTQ1MywxOSArNDcxLDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiIKKyAgICAgICAgICAgICAgICAiIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci0gICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0xPV19MQVRFTkNZKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgZGVlcCBidWZmZXIgYWZ0ZXIgZmxhZ3MgaGF2ZSBiZWVuIG1vZGlmaWVkIGFib3ZlCi0gICAgICAgIGlmIChmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmIChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7Ci0gICAgICAgIH0KKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MobUF0dHJpYnV0ZXMuZmxhZ3MsIGZsYWdzKTsKICAgICB9CiAKICAgICAvLyB0aGVzZSBiZWxvdyBzaG91bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZSBhdWRpb0ZsaW5nZXIgdG9vLi4uCkBAIC00NzcsMTQgKzQ4OCwxNCBAQAogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZm9ybWF0KTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQ5Nyw4ICs1MDgsOSBAQAogICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKQogICAgICAgICAgICAgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICBBTE9HViggKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKLSAgICAgICAgICAgICAgICAgICAgPyAiT2ZmbG9hZCByZXF1ZXN0LCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiCi0gICAgICAgICAgICAgICAgICAgIDogIk5vdCBsaW5lYXIgUENNLCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgPyAiJXMoKTogT2ZmbG9hZCByZXF1ZXN0LCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiCisgICAgICAgICAgICAgICAgICAgIDogIiVzKCk6IE5vdCBsaW5lYXIgUENNLCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHdoeSBjYW4ndCB3ZSBhbGxvdyBkaXJlY3QgQU5EIGZhc3Q/CiAgICAgICAgICAgICAgICAgKChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CkBAIC01NTQsMTQgKzU2NiwxNCBAQAogICAgICAgICBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCEoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcyk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5vdGlmaWNhdGlvbkZyYW1lcyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgd2l0aCBub24temVybyBmcmFtZUNvdW50PSV6dSIsCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgd2l0aCBub24temVybyBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC01NzEsNyArNTgzLDggQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSBtaW4obWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlciwKICAgICAgICAgICAgICAgICBtYXgoKHVpbnQzMl90KSAtbm90aWZpY2F0aW9uRnJhbWVzLCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyKSk7CiAgICAgICAgIEFMT0dXX0lGKG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxICE9ICh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgICIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgY2xhbXBlZCB0byB0aGUgcmFuZ2UgLSV1IHRvIC0ldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyLCBtYXhOb3RpZmljYXRpb25zUGVyQnVmZmVyKTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CkBAIC02NDcsNiArNjYwLDcgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnN0YXJ0KCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKIAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTY4Niw3ICs3MDAsOCBAQAogICAgICAgICAgICAgLy8gU2VydmVyIHNpZGUgaGFzIGNvbnN1bWVkIHNvbWV0aGluZywgYnV0IGlzIGl0IGZpbmlzaGVkIGNvbnN1bWluZz8KICAgICAgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHNpbmNlIGZsdXNoIGFuZCBzdG9wIGFyZSBhc3luY2hyb25vdXMgdGhhdCB0aGUgc2VydmVyCiAgICAgICAgICAgICAvLyBpcyBzdGlsbCBhY3RpdmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgIEFMT0dWKCJzdGFydDogc2VydmVyIHJlYWQ6JWxsZCAgY3VtdWxhdGl2ZSBmbHVzaGVkOiVsbGQgIGNsaWVudCB3cml0dGVuOiVsbGQiLAorICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogc2VydmVyIHJlYWQ6JWxsZCAgY3VtdWxhdGl2ZSBmbHVzaGVkOiVsbGQgIGNsaWVudCB3cml0dGVuOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykobUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGFydEV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0pLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tRmx1c2hlZCwKQEAgLTc0Nyw3ICs3NjIsNyBAQAogICAgICAgICAvLyBTdGFydCBvdXIgbG9jYWwgVm9sdW1lSGFuZGxlciBmb3IgcmVzdG9yYXRpb24gcHVycG9zZXMuCiAgICAgICAgIG1Wb2x1bWVIYW5kbGVyLT5zZXRTdGFydGVkKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgIG1TdGF0ZSA9IHByZXZpb3VzU3RhdGU7CiAgICAgICAgIGlmICh0ICE9IDApIHsKICAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICE9IFNUQVRFX1NUT1BQSU5HKSB7CkBAIC03NjUsNiArNzgwLDggQEAKIHZvaWQgQXVkaW9UcmFjazo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSAmJiBtU3RhdGUgIT0gU1RBVEVfUEFVU0VEKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC03NzQsNyArNzkxLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgICAgICBBTE9HRF9JRihtU2hhcmVkQnVmZmVyID09IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgInN0b3AoKSBjYWxsZWQgd2l0aCAldSBmcmFtZXMgZGVsaXZlcmVkIiwgbVJlbGVhc2VkLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICIlcyglZCk6IGNhbGxlZCB3aXRoICV1IGZyYW1lcyBkZWxpdmVyZWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbGVhc2VkLnZhbHVlKCkpOwogICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgIH0KIApAQCAtNzk1LDYgKzgxMiwxMCBAQAogICAgIGlmICh0ICE9IDApIHsKICAgICAgICAgaWYgKCFpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgICAgIHQtPnBhdXNlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIGNhdXNlcyB3YWtlIHVwIG9mIHRoZSBwbGF5YmFjayB0aHJlYWQsIHRoYXQgd2lsbCBjYWxsYmFjayB0aGUgY2xpZW50IGZvcgorICAgICAgICAgICAgLy8gRVZFTlRfU1RSRUFNX0VORCBpbiBwcm9jZXNzQXVkaW9CdWZmZXIoKQorICAgICAgICAgICAgdC0+d2FrZSgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBtUHJldmlvdXNQcmlvcml0eSk7CkBAIC04MTAsMTAgKzgzMSwxMiBAQAogCiB2b2lkIEF1ZGlvVHJhY2s6OmZsdXNoKCkKIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg0Miw2ICs4NjUsOCBAQAogdm9pZCBBdWRpb1RyYWNrOjpwYXVzZSgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBJTkcpIHsKQEAgLTg2Nyw3ICs4OTIsOCBAQAogCiAgICAgICAgICAgICB1aW50MzJfdCBoYWxGcmFtZXM7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJm1QYXVzZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBBTE9HVigiQXVkaW9UcmFjazo6cGF1c2UgZm9yIG9mZmxvYWQsIGNhY2hlIGN1cnJlbnQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZm9yIG9mZmxvYWQsIGNhY2hlIGN1cnJlbnQgcG9zaXRpb24gJXUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTkyMSwxMCArOTQ3LDEzIEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRTYW1wbGVSYXRlKHVpbnQzMl90IHJhdGUpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIHJhdGU6JXUiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpLCByYXRlKTsKKwogICAgIGlmIChyYXRlID09IG1TYW1wbGVSYXRlKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9Ci0gICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkKKyAgICAgICAgICAgIHx8IChtQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKQEAgLTk4Niw4ICsxMDE1LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGlucHV0KTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBBTE9HVigiJXMoJWQpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAvLyBwaXRjaCBpcyBlbXVsYXRlZCBieSBhZGp1c3Rpbmcgc3BlZWQgYW5kIHNhbXBsZVJhdGUKICAgICBjb25zdCB1aW50MzJfdCBlZmZlY3RpdmVSYXRlID0gYWRqdXN0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgY29uc3QgZmxvYXQgZWZmZWN0aXZlU3BlZWQgPSBhZGp1c3RTcGVlZChwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKQEAgLTk5NiwzMiArMTAyNSwzMiBAQAogICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CiAgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGVmZmVjdGl2ZSk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCkgKGVmZmVjdGl2ZSkgbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOwogCiAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgPiAodWludDY0X3QpbVNhbXBsZVJhdGUgKgogICAgICAgICAgICAgKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgKiAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8ICh1aW50NjRfdCltU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjIyLDcgKzEyNTEsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgICpwb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMTM2OCw3ICsxMzk4LDcgQEAKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShtT3V0cHV0LCAmbUFmTGF0ZW5jeSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIG1PdXRwdXQsIHN0YXR1cyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgbU91dHB1dCwgc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGSVhNRSBkb24ndCBiZWxpZXZlIHRoaXMgbGllCiAgICAgICAgIG1MYXRlbmN5ID0gbUFmTGF0ZW5jeSArICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKQEAgLTEzODQsNiArMTQxNCw3IEBACiAgICAgICAgIE1FRElBX0NBU0VfRU5VTShUUkFOU0ZFUl9PQlRBSU4pOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU1lOQyk7CiAgICAgICAgIE1FRElBX0NBU0VfRU5VTShUUkFOU0ZFUl9TSEFSRUQpOworICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSyk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gIlVOUkVDT0dOSVpFRCI7CiAgICAgfQpAQCAtMTM5Niw3ICsxNDI3LDggQEAKIAogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNDE1LDExICsxNDQ3LDE0IEBACiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAzOiBvYnRhaW4vcmVsZWFzZSBtb2RlCiAgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX09CVEFJTikgfHwKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDQ6IHN5bmNocm9ub3VzIHdyaXRlCi0gICAgICAgICAgICAoKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DKSAmJiBtVGhyZWFkQ2FuQ2FsbEphdmEpOworICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQyB8fCBtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykKKyAgICAgICAgICAgICAgICAgICAgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKIAogICAgICAgICBib29sIGZhc3RBbGxvd2VkID0gc2hhcmVkQnVmZmVyIHx8IHRyYW5zZmVyQWxsb3dlZDsKICAgICAgICAgaWYgKCFmYXN0QWxsb3dlZCkgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwgbm90IHNoYXJlZCBidWZmZXIgYW5kIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50LCIKKyAgICAgICAgICAgICAgICAgICIgbm90IHNoYXJlZCBidWZmZXIgYW5kIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQobVRyYW5zZmVyKSk7CiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgICAgIH0KQEAgLTE0NjgsNyArMTUwMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0Lm91dHB1dElkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cywgb3V0cHV0Lm91dHB1dElkKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgfQpAQCAtMTQ4OSw2ICsxNTI1LDcgQEAKICAgICBtQWZGcmFtZUNvdW50ID0gb3V0cHV0LmFmRnJhbWVDb3VudDsKICAgICBtQWZTYW1wbGVSYXRlID0gb3V0cHV0LmFmU2FtcGxlUmF0ZTsKICAgICBtQWZMYXRlbmN5ID0gb3V0cHV0LmFmTGF0ZW5jeU1zOworICAgIG1Qb3J0SWQgPSBvdXRwdXQucG9ydElkOwogCiAgICAgbUxhdGVuY3kgPSBtQWZMYXRlbmN5ICsgKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwogCkBAIC0xNDk4LDEzICsxNTM1LDEzIEBACiAgICAgLy8gRklYTUUgY29tcGFyZSB0byBBdWRpb1JlY29yZAogICAgIHNwPElNZW1vcnk+IGlNZW0gPSB0cmFjay0+Z2V0Q2JsaygpOwogICAgIGlmIChpTWVtID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgdm9pZCAqaU1lbVBvaW50ZXIgPSBpTWVtLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTUyMywxNCArMTU2MCwxNCBAQAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dJKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCi0gICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR0koIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgICAgICBpZiAoIW1UaHJlYWRDYW5DYWxsSmF2YSkgewogICAgICAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsIG1SZXFGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgbUZsYWdzID0gb3V0cHV0LmZsYWdzOwpAQCAtMTU1OCw3ICsxNTk1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTE2NDcsNyArMTY4NCw3IEBACiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IChsb25nKSAobXMgJSAxMDAwKSAqIDEwMDAwMDA7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHdhaXRDb3VudCAlZCIsIF9fZnVuY19fLCB3YWl0Q291bnQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBpbnZhbGlkIHdhaXRDb3VudCAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCB3YWl0Q291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSBOVUxMOwogICAgIH0KICAgICByZXR1cm4gb2J0YWluQnVmZmVyKGF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwgLyplbGFwc2VkKi8sIG5vbkNvbnRpZyk7CkBAIC0xNzU3LDcgKzE3OTQsOCBAQAogewogICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKTsKICAgICBpZiAoKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpICYmIChmbGFncyAmIENCTEtfRElTQUJMRUQpKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgdGhpcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aGlzKTsKICAgICAgICAgLy8gRklYTUUgaWdub3Jpbmcgc3RhdHVzCiAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgIH0KQEAgLTE3NjcsNyArMTgwNSw3IEBACiAKIHNzaXplX3QgQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUsIGJvb2wgYmxvY2tpbmcpCiB7Ci0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DKSB7CisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DICYmIG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTE3ODQsNyArMTgyMiw4IEBACiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gU2FuaXR5LWNoZWNrOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6d3JpdGUoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXpkKSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9UcmFjazo6d3JpdGUoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXpkKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTE4MTcsNyArMTg1NiwxNyBAQAogCiAgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IHdyaXR0ZW4gLyBtRnJhbWVTaXplOworCisgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOworICAgICAgICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGNhdXNlcyB3YWtlIHVwIG9mIHRoZSBwbGF5YmFjayB0aHJlYWQsIHRoYXQgd2lsbCBjYWxsYmFjayB0aGUgY2xpZW50IGZvcgorICAgICAgICAgICAgICAgIC8vIG1vcmUgZGF0YSAod2l0aCBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBKSBpbiBwcm9jZXNzQXVkaW9CdWZmZXIoKQorICAgICAgICAgICAgICAgIHQtPndha2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKwogICAgIHJldHVybiB3cml0dGVuOwogfQogCkBAIC0xODQ2LDcgKzE4OTUsOCBAQAogICAgICAgICAgICAgcG9sbFVzIDw8PSAxOwogICAgICAgICB9IHdoaWxlICh0cnlDb3VudGVyLS0gPiAwKTsKICAgICAgICAgaWYgKHRyeUNvdW50ZXIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IGRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseQogICAgICAgICByZXR1cm4gMDsKQEAgLTIwNzAsOCArMjEyMCw4IEBACiAgICAgICAgIGlmIChucyA8IDApIG5zID0gMDsKICAgICB9CiAKLSAgICAvLyBJZiBub3Qgc3VwcGx5aW5nIGRhdGEgYnkgRVZFTlRfTU9SRV9EQVRBLCB0aGVuIHdlJ3JlIGRvbmUKLSAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX0NBTExCQUNLKSB7CisgICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSBvciBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBLCB0aGVuIHdlJ3JlIGRvbmUKKyAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX0NBTExCQUNLICYmIG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CiAgICAgICAgIHJldHVybiBuczsKICAgICB9CiAKQEAgLTIwODcsNyArMjEzNyw4IEBACiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gbnMgLyAxMDAwMDAwMDAwTEw7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IG5zICUgMTAwMDAwMDAwMExMOwotICAgICAgICBBTE9HVigidGltZW91dCAlbGQuJTAzZCIsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZW91dCAlbGQuJTAzZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfQogCkBAIC0yMDk5LDE4ICsyMTUwLDIwIEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogb2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nOwogICAgICAgICBzaXplX3QgYXZhaWwgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ICsgbm9uQ29udGlnOwotICAgICAgICBBTE9HVigib2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnLCBlcnIpOworICAgICAgICBBTE9HVigiJXMoJWQpOiBvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnLCBlcnIpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBpZiAoZXJyID09IFRJTUVEX09VVCB8fCBlcnIgPT0gV09VTERfQkxPQ0sgfHwgZXJyID09IC1FSU5UUiB8fAogICAgICAgICAgICAgICAgICAgICAoaXNPZmZsb2FkZWQoKSAmJiAoZXJyID09IERFQURfT0JKRUNUKSkpIHsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSBidWcgMjUxOTU3NTkKICAgICAgICAgICAgICAgICByZXR1cm4gMTAwMDAwMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwgZXJyKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVycm9yICVkIG9idGFpbmluZyBhbiBhdWRpbyBidWZmZXIsIGdpdmluZyB1cC4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0yMTMwLDE3ICsyMTgzLDMxIEBACiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgcmVxU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7Ci0gICAgICAgIG1DYmYoRVZFTlRfTU9SRV9EQVRBLCBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CisgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgLy8gd2hlbiBub3RpZnlpbmcgY2xpZW50IGl0IGNhbiB3cml0ZSBtb3JlIGRhdGEsIHBhc3MgdGhlIHRvdGFsIHNpemUgdGhhdCBjYW4gYmUKKyAgICAgICAgICAgIC8vIHdyaXR0ZW4gaW4gdGhlIG5leHQgd3JpdGUoKSBjYWxsLCBzaW5jZSBpdCdzIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgIGF1ZGlvQnVmZmVyLnNpemUgKz0gbm9uQ29udGlnOworICAgICAgICB9CisgICAgICAgIG1DYmYobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLID8gRVZFTlRfTU9SRV9EQVRBIDogRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwKKyAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAod3JpdHRlblNpemUgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEgd2FzIHByb2Nlc3NlZCBpbiB0aGUgSk5JIG9mCisgICAgICAgICAgICAgICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrLiBUaGUgSk5JIGlzIG5vdCB1c2luZyB0aGUgY2FsbGJhY2sgdG8gcHJvdmlkZSBkYXRhLAorICAgICAgICAgICAgICAgIC8vIGl0IG9ubHkgc2lnbmFscyB0byB0aGUgSmF2YSBjbGllbnQgdGhhdCBpdCBjYW4gcHJvdmlkZSBtb3JlIGRhdGEsIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayBpcyByZWFkIHRvIGFjY2VwdCBub3cuCisgICAgICAgICAgICAgICAgLy8gVGhlIHBsYXliYWNrIHRocmVhZCB3aWxsIGJlIGF3YWtlbiBhdCB0aGUgbmV4dCA6OndyaXRlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlNfV0hFTkVWRVI7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgaXMgZG9uZSBmaWxsaW5nIGJ1ZmZlcnMKICAgICAgICAgICAgIC8vIEtlZXAgdGhpcyB0aHJlYWQgZ29pbmcgdG8gaGFuZGxlIHRpbWVkIGV2ZW50cyBhbmQKICAgICAgICAgICAgIC8vIHN0aWxsIHRyeSB0byBnZXQgbW9yZSBkYXRhIGluIGludGVydmFscyBvZiBXQUlUX1BFUklPRF9NUwpAQCAtMjIzMSw4ICsyMjk4LDggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6cmVzdG9yZVRyYWNrX2woY29uc3QgY2hhciAqZnJvbSkKIHsKLSAgICBBTE9HVygiZGVhZCBJQXVkaW9UcmFjaywgJXMsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLAotICAgICAgICAgIGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpID8gIk9mZmxvYWRlZCBvciBEaXJlY3QiIDogIlBDTSIsIGZyb20pOworICAgIEFMT0dXKCIlcyglZCk6IGRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKICAgICArK21TZXF1ZW5jZTsKIAogICAgIC8vIHJlZnJlc2ggdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gY2FjaGUgaW4gdGhpcyBwcm9jZXNzIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgbmV3CkBAIC0yMjc1LDEwICsyMzQyLDcgQEAKICAgICAvLyBJZiBhIG5ldyBJQXVkaW9UcmFjayBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHByZXZpb3VzIChkZWFkKSBpbnN0YW5jZSB3aWxsIGJlIGxlZnQgaW50YWN0LgogICAgIHN0YXR1c190IHJlc3VsdCA9IGNyZWF0ZVRyYWNrX2woKTsKIAotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVRyYWNrX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHJpZXMgPSAwOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAvLyB0YWtlIHRoZSBmcmFtZXMgdGhhdCB3aWxsIGJlIGxvc3QgYnkgdHJhY2sgcmVjcmVhdGlvbiBpbnRvIGFjY291bnQgaW4gc2F2ZWQgcG9zaXRpb24KICAgICAgICAgLy8gRm9yIHN0cmVhbWluZyB0cmFja3MsIHRoaXMgaXMgdGhlIGFtb3VudCB3ZSBvYnRhaW5lZCBmcm9tIHRoZSB1c2VyL2NsaWVudAogICAgICAgICAvLyAobm90IHRoZSBudW1iZXIgYWN0dWFsbHkgY29uc3VtZWQgYXQgdGhlIHNlcnZlciAtIHRob3NlIGFyZSBhbHJlYWR5IGxvc3QpLgpAQCAtMjI5Myw3ICsyMzU3LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRpY1Byb3h5LT5zZXRCdWZmZXJQb3NpdGlvbihidWZmZXJQb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclBvc2l0aW9uID09IG1GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dEKCJyZXN0b3JpbmcgdHJhY2sgYXQgZW5kIG9mIHN0YXRpYyBidWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogcmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjMyMywxNCArMjM4NywxOCBAQAogICAgICAgICBtRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSA9IG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0OwogICAgIH0KICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgcmVzdWx0LCByZXRyaWVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCByZXN1bHQsIHJldHJpZXMpOwogICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgLy8gbGVhdmUgdGltZSBmb3IgYW4gZXZlbnR1YWwgcmFjZSBjb25kaXRpb24gdG8gY2xlYXIgYmVmb3JlIHJldHJ5aW5nCisgICAgICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgIH0KLSAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgbVJlbGVhc2VkID0gMDsKKyAgICAgICAgLy8gaWYgbm8gcmV0cmllcyBsZWZ0LCBzZXQgaW52YWxpZCBiaXQgdG8gZm9yY2UgcmVzdG9yaW5nIGF0IG5leHQgb2NjYXNpb24KKyAgICAgICAgLy8gYW5kIGF2b2lkIGluY29uc2lzdGVudCBhY3RpdmUgc3RhdGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKKyAgICAgICAgaWYgKG1DYmxrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjM0OCw4ICsyNDE2LDggQEAKICAgICAvLyAgICAgIHVubGVzcyB0aGUgc2VydmVyIGhhcyBtb3JlIHRoYW4gMl4zMSBmcmFtZXMgaW4gaXRzIGJ1ZmZlciwKICAgICAvLyAgICAgIGluIHdoaWNoIGNhc2UgdGhlIHVzZSBvZiB1aW50MzJfdCBmb3IgdGhlc2UgY291bnRlcnMgaGFzIGJpZ2dlciBpc3N1ZXMuCiAgICAgQUxPR0VfSUYoZGVsdGEgPCAwLAotICAgICAgICAgICAgImRldGVjdGVkIGlsbGVnYWwgcmV0cm9ncmFkZSBtb3Rpb24gYnkgdGhlIHNlcnZlcjogbVNlcnZlciBhZHZhbmNlZCBieSAlZCIsCi0gICAgICAgICAgICBkZWx0YSk7CisgICAgICAgICAgICAiJXMoJWQpOiBkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGRlbHRhKTsKICAgICBtU2VydmVyID0gbmV3U2VydmVyOwogICAgIGlmIChkZWx0YSA+IDApIHsgLy8gYXZvaWQgcmV0cm9ncmFkZQogICAgICAgICBtUG9zaXRpb24gKz0gZGVsdGE7CkBAIC0yMzY5LDkgKzI0MzcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc3BlZWQgLyosIDAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLyk7CiAgICAgY29uc3QgYm9vbCBhbGxvd2VkID0gbUZyYW1lQ291bnQgPj0gbWluRnJhbWVDb3VudDsKICAgICBBTE9HRF9JRighYWxsb3dlZCwKLSAgICAgICAgICAgICJpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbCBkZW5pZWQgIgorICAgICAgICAgICAgIiVzKCVkKTogZGVuaWVkICIKICAgICAgICAgICAgICJtQWZMYXRlbmN5OiV1ICBtQWZGcmFtZUNvdW50OiV6dSAgbUFmU2FtcGxlUmF0ZToldSAgc2FtcGxlUmF0ZToldSAgc3BlZWQ6JWYgIgogICAgICAgICAgICAgIm1GcmFtZUNvdW50OiV6dSA8IG1pbkZyYW1lQ291bnQ6JXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgbUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7CiAgICAgcmV0dXJuIGFsbG93ZWQ7CkBAIC0yMzg5LDcgKzI0NTgsOCBAQAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7Ci0gICAgQUxPR1YoIlByZXNlbnRhdGlvbklkL1Byb2dyYW1JZFslc10iLHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIEFMT0dWKCIlcyglZCk6IFByZXNlbnRhdGlvbklkL1Byb2dyYW1JZFslc10iLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogCiAgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOwogfQpAQCAtMjQxNiw3ICsyNDg2LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyB3YXJuIG9ubHkgaWYgbm90IGFuIGV4cGVjdGVkIHJlc3RvcmUgZmFpbHVyZS4KICAgICAgICAgQUxPR1dfSUYoISgoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgbURvTm90UmVjb25uZWN0KSAmJiBzdGF0dXMgPT0gREVBRF9PQkpFQ1QpLAotICAgICAgICAgICAgICAgICJhcHBseVZvbHVtZVNoYXBlciBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBhcHBseVZvbHVtZVNoYXBlciBmYWlsZWQ6ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNDU3LDcgKzI1MjcsOCBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IC8vIG5vdCBzdXBwb3J0ZWQKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVByb3h5LT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBPSywgInN0YXR1cyAlZCBub3QgYWxsb3dlZCBmcm9tIHByb3h5IGdldFRpbWVzdGFtcCIsIHN0YXR1cyk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICIlcyglZCk6IHN0YXR1cyAlZCBub3QgYWxsb3dlZCBmcm9tIHByb3h5IGdldFRpbWVzdGFtcCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICBib29sIGZvdW5kID0gZmFsc2U7CiAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSBtRnJhbWVzV3JpdHRlbjsKICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0gPSAwOwpAQCAtMjUwMCw3ICsyNTcxLDggQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsgLy8gb2ZmbG9hZGVkIHRyYWNrcyBoYW5kbGVkIGJlbG93CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwgbVN0YXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBJbnZhbGlkIG1TdGF0ZSBpbiBnZXRUaW1lc3RhbXAoKTogJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TdGF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjUzNCw3ICsyNjA2LDggQEAKICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYWRqdXN0IHRoZSBwb3NpdGlvbiBmcm9tIHRoZSBwcmV2aW91cyBjb21wdXRlZCBsYXRlbmN5LgogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKG1QcmV2aW91c0xvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCgpIGxvY2F0aW9uIG1vdmVkIGZyb20ga2VybmVsIHRvIHNlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IGxvY2F0aW9uIG1vdmVkIGZyb20ga2VybmVsIHRvIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBsYXN0IGtlcm5lbCBPSyB0aW1lIGluZm8gZXhpc3RzIGFuZCB0aGUgcG9zaXRpb25zCiAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB2YWxpZCAoaWYgdGhleSBwcmVkYXRlIHRoZSBjdXJyZW50IHRyYWNrLCB0aGUgcG9zaXRpb25zIG1heQogICAgICAgICAgICAgICAgICAgICAvLyBiZSB6ZXJvIG9yIG5lZ2F0aXZlKS4KQEAgLTI1NDksOCArMjYyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJfTEFTVEtFUk5FTE9LXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMX0xBU1RLRVJORUxPS10pOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiZnJhbWUgYWRqdXN0bWVudDolbGxkICB0aW1lc3RhbXA6JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZnJhbWVzLCBldHMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogZnJhbWUgYWRqdXN0bWVudDolbGxkICB0aW1lc3RhbXA6JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXMgPj0gZXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjU1OCw3ICsyNjMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIHNlcnZlciB0byBrZXJuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIHNlcnZlciB0byBrZXJuZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIHRpbWVzdGFtcCB0aW1lIGV2ZW4gd2hlbiBwYXVzZWQuCkBAIC0yNTgyLDcgKzI2NTYsNyBAQAogICAgICAgICAgICAgICAgIG1QcmV2aW91c0xvY2F0aW9uID0gbG9jYXRpb247CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGFmdGVyIEF1ZGlvVHJhY2sgaXMgc3RhcnRlZCwgb25lIG1heSBub3QgZmluZCBhIHRpbWVzdGFtcAotICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRCZXN0VGltZXN0YW1wIGRpZCBub3QgZmluZCB0aW1lc3RhbXAiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBnZXRCZXN0VGltZXN0YW1wIGRpZCBub3QgZmluZCB0aW1lc3RhbXAiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewpAQCAtMjU5Miw3ICsyNjY2LDggQEAKICAgICAgICAgICAgIC8vIHRvIGJlIHplcm8gd2UgY29udmVydCB0aGlzIHRvIFdPVUxEX0JMT0NLICh3aXRoIHRoZSBpbXBsaWNpdCBtZWFuaW5nIG9mCiAgICAgICAgICAgICAvLyAiemVybyIgZm9yIE51UGxheWVyKS4gIFdlIGRvbid0IGNvbnZlcnQgZm9yIHRyYWNrIHJlc3RvcmF0aW9uIGFzIHBvc2l0aW9uCiAgICAgICAgICAgICAvLyBkb2VzIG5vdCByZXNldC4KLSAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgc2VydmVyIG9mZnNldDolbGxkIHJlc3RvcmUgZnJhbWVzOiVsbGQiLAorICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZXN0YW1wIHNlcnZlciBvZmZzZXQ6JWxsZCByZXN0b3JlIGZyYW1lczolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQsIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUpOwogICAgICAgICAgICAgaWYgKG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0ICE9IG1GcmFtZXNXcml0dGVuQXRSZXN0b3JlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gV09VTERfQkxPQ0s7CkBAIC0yNjAwLDcgKzI2NzUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiZ2V0VGltZXN0YW1wIGVycm9yOiUjeCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgIiVzKCVkKTogZ2V0VGltZXN0YW1wIGVycm9yOiUjeCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKQEAgLTI2MzksOCArMjcxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBzdGFydCB0aW1lLiAgSWYgZ3JlYXRlciwgdGhlbiB0aGF0IG1lYW5zIHdlIG1heSBoYXZlIGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAvLyB0byBjb21wbGV0ZWx5IGZsdXNoIG9yIHN0b3AgdGhlIHByZXZpb3VzIHBsYXlpbmcgdHJhY2suCiAgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKCFtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAgc3RhcnR1cCBnbGl0Y2ggZGV0ZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogc3RhcnR1cCBnbGl0Y2ggZGV0ZWN0ZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkZWx0YVRpbWVVcyglbGxkKSBkZWx0YVBvc2l0aW9uVXMoJWxsZCkgdHNtUG9zaXRpb24oJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbHRhVGltZVVzLCAobG9uZyBsb25nKWRlbHRhUG9zaXRpb25CeVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gdHJ1ZTsKQEAgLTI3MDgsOCArMjc4NCw5IEBACiAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhZ05zID0gaW50NjRfdChtQWZMYXRlbmN5ICogMTAwMDAwMExMKTsKICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGltaXROcyA9IG1TdGFydE5zIC0gbGFnTnM7CiAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IGxpbWl0TnMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRCgiY29ycmVjdGluZyB0aW1lc3RhbXAgdGltZSBmb3IgcGF1c2UsICIKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiBjb3JyZWN0aW5nIHRpbWVzdGFtcCB0aW1lIGZvciBwYXVzZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgImN1cnJlbnRUaW1lTmFub3M6ICVsbGQgPCBsaW1pdE5zOiAlbGxkIDwgbVN0YXJ0TnM6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpbGltaXROcywgKGxvbmcgbG9uZyltU3RhcnROcyk7CiAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKICAgICAgICAgICAgICAgICBjdXJyZW50VGltZU5hbm9zID0gbGltaXROczsKQEAgLTI3MTcsNyArMjc5NCw4IEBACiAKICAgICAgICAgICAgIC8vIHJldHJvZ3JhZGUgY2hlY2sKICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZU5hbm9zIDwgcHJldmlvdXNUaW1lTmFub3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSBjb3JyZWN0ZWQsICVsbGQgPCAlbGxkIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiByZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpcHJldmlvdXNUaW1lTmFub3MpOwogICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZTsKICAgICAgICAgICAgICAgICAvLyBjdXJyZW50VGltZU5hbm9zIG5vdCB1c2VkIGJlbG93LgpAQCAtMjczMCw3ICsyODA4LDggQEAKICAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uIDwgMCkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IG9uY2UgcGVyIHBvc2l0aW9uIGluc3RlYWQgb2Ygc3BhbW1pbmcgdGhlIGxvZy4KICAgICAgICAgICAgICAgICBpZiAoIW1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHBvc2l0aW9uIGNvcnJlY3RlZCwgJWQgPSAldSAtICV1IiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgcG9zaXRpb24gY29ycmVjdGVkLCAlZCA9ICV1IC0gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKTsKQEAgLTI3NTAsNyArMjgyOSw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwotICAgICAgICAgICAgICAgIEFMT0dEKCJjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IGNvbXB1dGVkU2FtcGxlUmF0ZToldSAgc2FtcGxlUmF0ZToldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljb21wdXRlZFNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIH0KICNlbmRpZgpAQCAtMjc5Niw4ICsyODc2LDggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLApAQCAtMjgzOSwxOCArMjkxOSwxOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwpAQCAtMjg2MywxMiArMjk0MywxMiBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgIT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjay5jbGVhcigpOwpAQCAtMjk3NCw3ICszMDU0LDcgQEAKICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHdlJ3JlIG5vdCBhY3RpdmUKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgbVN0YXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1TdGF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjk5MCw3ICszMDcwLDggQEAKICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgICAgIHdhaXQgPSAodHMubVBvc2l0aW9uID09IDAgfHwgdHMubVBvc2l0aW9uID09IG1TdGFydFRzLm1Qb3NpdGlvbik7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBoYXNTdGFydGVkIHdhaXQ6JWQgIHRzOiV1ICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgdHMubVBvc2l0aW9uLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VHMubVBvc2l0aW9uKTsKQEAgLTMwMTEsNyArMzA5Miw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBoYXNTdGFydGVkIHdhaXQ6JWQgIGV0czolbGxkICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylldHMubVBvc2l0aW9uW2xvY2F0aW9uXSwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tUG9zaXRpb25bbG9jYXRpb25dKTsKQEAgLTMwODYsNyArMzE2OCw4IEBACiAgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCVkKTogcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJWxsZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1SZWNlaXZlci5tUG9ydElkLCAobG9uZyBsb25nKW5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggMDFmNDAwZC4uYzk5N2NmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTI2LDYgKzI2LDI0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVE9ETzogY29uc2lkZXIgcHVsbGluZyB0aGlzIGludG8gYSBzaGFyZWQgaGVhZGVyLgorLy8gc2FmZV9zdWJfb3ZlcmZsb3cgaXMgdXNlZCBlbnN1cmUgdGhhdCBzdWJ0cmFjdGlvbiBvY2N1cnMgaW4gdGhlIHNhbWUgbmF0aXZlIHR5cGUKKy8vIHdpdGggcHJvcGVyIDIncyBjb21wbGVtZW50IG92ZXJmbG93LiAgV2l0aG91dCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGl0IGlzIHBvc3NpYmxlLAorLy8gZm9yIGV4YW1wbGUsIHRoYXQgb3B0aW1pemluZyBjb21waWxlcnMgbWF5IGVsZWN0IHRvIHRyZWF0IDMyIGJpdCBzdWJ0cmFjdGlvbgorLy8gYXMgNjQgYml0IHN1YnRyYWN0aW9uIHdoZW4gc3RvcmluZyBpbnRvIGEgNjQgYml0IGRlc3RpbmF0aW9uIGFzIGludGVnZXIgb3ZlcmZsb3cgaXMKKy8vIHRlY2huaWNhbGx5IHVuZGVmaW5lZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICB0eXBlbmFtZSBVLAorICAgICAgICAgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxzdGQ6OmRlY2F5X3Q8VD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlY2F5X3Q8VT4+e30+PgorICAgICAgICAgLy8gZW5zdXJlIGFyZ3VtZW50cyBhcmUgc2FtZSB0eXBlIChpZ25vcmluZyB2b2xhdGlsZSwgd2hpY2ggaXMgdXNlZCBpbiBjYmxrIHZhcmlhYmxlcykuCithdXRvIHNhZmVfc3ViX292ZXJmbG93KGNvbnN0IFQmIGEsIGNvbnN0IFUmIGIpIHsKKyAgICBzdGQ6OmRlY2F5X3Q8VD4gcmVzdWx0OworICAgICh2b2lkKV9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coYSwgYiwgJnJlc3VsdCk7CisgICAgLy8gbm90ZSBpZiBfX2J1aWx0aW5fc3ViX292ZXJmbG93IHJldHVybnMgdHJ1ZSwgYW4gb3ZlcmZsb3cgb2NjdXJyZWQuCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogLy8gdXNlZCB0byBjbGFtcCBhIHZhbHVlIHRvIHNpemVfdC4gIFRPRE86IG1vdmUgdG8gYW5vdGhlciBmaWxlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzaXplX3QgY2xhbXBUb1NpemUoVCB4KSB7CkBAIC0xODYsNyArMjA0LDcgQEAKICAgICAgICAgICAgIGZyb250ID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKICAgICAgICAgfQogICAgICAgICAvLyB3cml0ZSB0byByZWFyLCByZWFkIGZyb20gZnJvbnQKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgICAgICAvLyBwaXBlIHNob3VsZCBub3QgYmUgb3ZlcmZ1bGwKICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICAgICAgaWYgKG1Jc091dCkgewpAQCAtNjg0LDcgKzcwMiw3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBvdmVyZmxvd0JpdCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgIGludDMyX3QgbmV3RnJvbnQgPSAoZnJvbnQgJiB+bWFzaykgfCAoZmx1c2ggJiBtYXNrKTsKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gbmV3RnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgbmV3RnJvbnQpOwogICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CiAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzawogICAgICAgICAgICAgLy8gc28gcmViYXNpbmcgbmV3RnJvbnQgb24gdGhlIGZyb250IG9mZnNldCBpcyBvZmYgYnkgdGhlIG92ZXJmbG93IGJpdC4KQEAgLTcyNiw3ICs3NDQsNyBAQAogICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CiAgICAgICAgIGNvbnN0IHNpemVfdCBtYXNrID0gb3ZlcmZsb3dCaXQgLSAxOwogICAgICAgICBpbnQzMl90IG5ld1JlYXIgPSAocmVhciAmIH5tYXNrKSB8IChzdG9wICYgbWFzayk7Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gbmV3UmVhciAtIGZyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KG5ld1JlYXIsIGZyb250KTsKICAgICAgICAgLy8gb3ZlcmZsb3dCaXQgaXMgdW5zaWduZWQsIHNvIGNhc3QgdG8gc2lnbmVkIGZvciBjb21wYXJpc29uLgogICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CiAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzawpAQCAtNzc4LDcgKzc5Niw3IEBACiAgICAgICAgIGZyb250ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICAgICAgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICB9Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgc2h1dHRpbmcgZG93biIsCkBAIC05MDUsNyArOTIzLDcgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogICAgIH0KICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBnZXRSZWFyKCk7Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7IHNodXR0aW5nIGRvd24iLApAQCAtOTMxLDcgKzk0OSw3IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9CiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwotICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgogICAgIH0KQEAgLTEyMzMsNiArMTI1MSwyMSBAQAogICAgIHJldHVybiAwOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK3NpemVfdCBBdWRpb1JlY29yZFNlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIGlmIChtSXNTaHV0ZG93bikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCBmcm9udCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CisgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgeworICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KKyAgICB9CisgICAgcmV0dXJuIGZpbGxlZDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCA5ZjNiNzQyLi4wMDY3OGMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcApAQCAtMjQsMTAgKzI0LDggQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJJQXVkaW9GbGluZ2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYwMCwxNCArNTk4LDE4IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CiAgICAgewotICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHBVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlKHBUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHByZWZlcnJlZFR5cGVGbGFnKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTYzNiwxMCArNjM4LDEwIEBACiAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdDsKIAogICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgICB9CiAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC05MTIsNyArOTE0LDcgQEAKICAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CiAgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgogICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTUxLDkgKzk1Myw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBjaGFyIHRpbWVDaGVja1N0cmluZ1s2NF07Ci0gICAgc25wcmludGYodGltZUNoZWNrU3RyaW5nLCBzaXplb2YodGltZUNoZWNrU3RyaW5nKSwgIklBdWRpb0ZsaW5nZXI6ICVkIiwgY29kZSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRpbWVDaGVja1N0cmluZyk7CisgICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9GbGluZ2VyIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKKyAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOwogCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1RSQUNLOiB7CkBAIC0xMjgwLDggKzEyODEsMTEgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CiAgICAgICAgICAgICBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZyA9IGRhdGEucmVhZFVpbnQzMigpOwogICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0ge307Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZ1dWlkLCAmZGVzYyk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZ1dWlkLCAmdHlwZSwgcHJlZmVycmVkVHlwZUZsYWcsICZkZXNjKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCA4Y2Q0YTg1Li4wY2U4YjE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjQsMTEgKzI0LDEwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC02Myw2ICs2Miw3IEBACiAgICAgU0VUX0VGRkVDVF9FTkFCTEVELAogICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCiAgICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQsCisgICAgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsCiAgICAgTElTVF9BVURJT19QT1JUUywKICAgICBHRVRfQVVESU9fUE9SVCwKICAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCkBAIC04Miw3ICs4MiwxNCBAQAogICAgIEdFVF9NQVNURVJfTU9OTywKICAgICBHRVRfU1RSRUFNX1ZPTFVNRV9EQiwKICAgICBHRVRfU1VSUk9VTkRfRk9STUFUUywKLSAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQKKyAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQsCisgICAgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsCisgICAgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBTRVRfQVNTSVNUQU5UX1VJRCwKKyAgICBTRVRfQTExWV9TRVJWSUNFU19VSURTLAorICAgIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0yNDUsNDEgKzI1MiwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTMzNiwxNiArMzMxLDEzIEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKnNpbGVuY2VkID8gMSA6IDApOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgKnNpbGVuY2VkID0gcmVwbHkucmVhZEludDMyKCkgPT0gMTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTUzMyw2ICs1MjUsMTYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpIDogZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNzUzLDExICs3NTUsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZShzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKQEAgLTc3MCwxNSArNzcyLDE1IEBACiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfQVVESU9fU09VUkNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtODc5LDYgKzg4MSwxMTUgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzYWdlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BU1NJU1RBTlRfVUlELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byB1aWQgOiB1aWRzKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0ExMVlfU0VSVklDRVNfVUlEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7CisgICAgfQorCiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC05MzUsOCArMTA0NiwxMCBAQAogICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKLSAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6CisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzogeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTQ4LDkgKzEwNjEsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9Qb2xpY3lTZXJ2aWNlOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewpAQCAtMTA3NywzNCArMTE4OSwyMiBAQAogCiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMTM5LDEwICsxMjM5LDggQEAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0SW5wdXQocG9ydElkLCAmc2lsZW5jZWQpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpbGVuY2VkID8gMSA6IDApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMzEzLDYgKzE0MTEsMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHt9OworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQ5OCwxNyArMTYwOCwxNyBAQAogICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xNTg3LDYgKzE2OTcsMTIzIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWlkcy5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlQm9vbChpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IGFkN2YxZGUuLjFmOWVhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC01MiwxMiArNTIsMzcgQEAKICAgICBjbGllbnRJbmZvLT51aWQgPSAodWlkX3QpIGRhdGEucmVhZFVpbnQzMigpOwogICAgIGNsaWVudEluZm8tPnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgIGNsaWVudEluZm8tPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICBkYXRhLnJlYWQoJmNsaWVudEluZm8tPnBvcnRfaWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgY2xpZW50SW5mby0+c2lsZW5jZWQgPSBkYXRhLnJlYWRCb29sKCk7CiB9CiAKLWlubGluZSB2b2lkIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvVG9QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgewogICAgIGRhdGEud3JpdGVVaW50MzIoKHVpbnQzMl90KSBjbGllbnRJbmZvLT51aWQpOwogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c2Vzc2lvbik7CiAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zb3VyY2UpOworICAgIGRhdGEud3JpdGUoJmNsaWVudEluZm8tPnBvcnRfaWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgZGF0YS53cml0ZUJvb2woY2xpZW50SW5mby0+c2lsZW5jZWQpOworfQorCitpbmxpbmUgdm9pZCByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiAqZWZmZWN0cykgeworICAgIGludDMyX3QgbnVtRWZmZWN0cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZWZmZWN0OworICAgICAgICBpZiAoZGF0YS5yZWFkKCZlZmZlY3QsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICgqZWZmZWN0cykucHVzaF9iYWNrKGVmZmVjdCk7CisgICAgfQorfQorCitpbmxpbmUgdm9pZCB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKFBhcmNlbCYgZGF0YSwgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cykgeworICAgIGRhdGEud3JpdGVVaW50MzIoKHVpbnQzMl90KSBlZmZlY3RzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBlZmZlY3QgOiBlZmZlY3RzKSB7CisgICAgICAgIGlmIChkYXRhLndyaXRlKCZlZmZlY3QsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05MiwxNiArMTE3LDI0IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNSVhfU1RBVEVfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiAKLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgeworICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGV2ZW50KTsKLSAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCBjbGllbnRJbmZvKTsKKyAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvVG9QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgY2xpZW50Q29uZmlnKTsKKyAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBjbGllbnRFZmZlY3RzKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBkZXZpY2VDb25maWcpOworICAgICAgICB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKGRhdGEsIGVmZmVjdHMpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGF0Y2hIYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC0xMzksMTAgKzE3MiwxNSBAQAogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7CiAgICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOworICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmNsaWVudEVmZmVjdHMpOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmRldmljZUNvbmZpZyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOworICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmVmZmVjdHMpOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKaW5kZXggYWRmZjA1Ny4uODNhNTY4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcApAQCAtMzksNiArMzksNyBAQAogICAgIFBBVVNFLAogICAgIEFUVEFDSF9BVVhfRUZGRUNULAogICAgIFNFVF9QQVJBTUVURVJTLAorICAgIFNFTEVDVF9QUkVTRU5UQVRJT04sCiAgICAgR0VUX1RJTUVTVEFNUCwKICAgICBTSUdOQUwsCiAgICAgQVBQTFlfVk9MVU1FX1NIQVBFUiwKQEAgLTEyNyw2ICsxMjgsMTkgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmVzZW50YXRpb25JZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcm9ncmFtSWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VMRUNUX1BSRVNFTlRBVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMjM5LDYgKzI1MywxMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VMRUNUX1BSRVNFTlRBVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RQcmVzZW50YXRpb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9USU1FU1RBTVA6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IDMyNGJjYjkuLjZiZDQxMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTkwLDI3ICs5MCwzNCBAQAogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAKLQogICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBlZmZlY3QgdXVpZC4KKyAgICAgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBlZmZlY3QgdXVpZCBvciB0eXBlLgorICAgICAqCisgICAgICogTG9va3VwIGFuIGVmZmVjdCBieSB1dWlkLCBvciBpZiB0aGF0J3MgdW5zcGVjaWZpZWQgKEVGRkVDVF9VVUlEX05VTEwpLAorICAgICAqIGRvIHNvIGJ5IHR5cGUgYW5kIHByZWZlcnJlZCBmbGFncyBpbnN0ZWFkLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKiAgICAgIHV1aWQ6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHV1aWQuCisgICAgICogICAgICB0eXBlOiAgICAgICBwb2ludGVyIHRvIGVmZmVjdCB0eXBlIHV1aWQuCisgICAgICogICAgICBwcmVmZXJyZWRUeXBlRmxhZ3M6IGlmIG11bHRpcGxlIGVmZmVjdHMgb2YgdGhlIGdpdmVuIHR5cGUgZXhpc3QsCisgICAgICogICAgICAgICAgICAgICAgICBvbmUgd2l0aCBhIG1hdGNoaW5nIHR5cGUgZmxhZyB3aWxsIGJlIGNob3NlbiBvdmVyIG9uZSB3aXRob3V0LgorICAgICAqICAgICAgICAgICAgICAgICAgVXNlIEVGRkVDVF9GTEFHX1RZUEVfTUFTSyB0byBpbmRpY2F0ZSBubyBwcmVmZXJlbmNlLgogICAgICAqICAgICAgZGVzY3JpcHRvcjogYWRkcmVzcyB3aGVyZSB0aGUgZWZmZWN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIHJldHVybmVkLgogICAgICAqCiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCiAgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKICAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQotICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgdXVpZCBvciBkZXNjcmlwdG9yIHBvaW50ZXJzCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB0eXBlIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKICAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlCiAgICAgICogICAqZGVzY3JpcHRvciB1cGRhdGVkIHdpdGggZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIC8qY29uc3QqLzsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAKICAgICAvKgogICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRlc2NyaXB0b3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZSBwcm9jZXNzaW5ncyBlbmFibGVkIGJ5IGRlZmF1bHQKQEAgLTE0NCw2ICsxNTEsMTMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKIAogICAgIC8qCisgICAgICogR2V0cyBhIG5ldyBzeXN0ZW0td2lkZSB1bmlxdWUgZWZmZWN0IGlkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgYWRkcmVzcyB0byByZXR1cm4gdGhlIGdlbmVyYXRlZCBpZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBuZXcgdW5pcXVlIHN5c3RlbS13aWRlIGVmZmVjdCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbmV3RWZmZWN0VW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogU3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZy9yZW1vdmluZyBzeXN0ZW0td2lkZSBlZmZlY3RzLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzb3VyY2Ugb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgc291cmNlOiAgIFRoZSBzb3VyY2UgdGhpcyBlZmZlY3Qgc2hvdWxkIGJlIGEgZGVmYXVsdCBmb3IuCisgICAgICogICBpZDogICAgICAgQWRkcmVzcyB3aGVyZSB0aGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBkZWZhdWx0IGVmZmVjdCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgc291cmNlLCB0eXBlIHV1aWQgb3IgaW1wbGVtZW50YXRpb24gdXVpZC4KKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgb3IgdHlwZSBmb3VuZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBhZGRlZCBkZWZhdWx0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyKiB0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogQWRkcyBhbiBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBlZmZlY3QgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSB3aGVuIGEgc3RyZWFtIG9mIHRoZSBnaXZlbiB0eXBlCisgICAgICogaXMgY3JlYXRlZCwgdGhlIHN5c3RlbSB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgYWRkaW5nIGl0LgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgIHR5cGVTdHI6ICBUeXBlIHV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdXVpZFN0ciBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyBtYXkgY29ycmVzcG9uZCB0byB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdCwKKyAgICAgKiAgICAgICAgICAgICBvciBjb3VsZCBiZSBzb21lIHZlbmRvci1kZWZpbmVkIHR5cGUuCisgICAgICogICBvcFBhY2thZ2VOYW1lOiBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgICogICB1dWlkU3RyOiAgVXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqICAgICAgICAgICAgIE5vdGUgaWYgYm90aCB1dWlkU3RyIGFuZCB0eXBlU3RyIGFyZSBzcGVjaWZpZWQsIHR5cGVTdHIgaXMgaWdub3JlZC4KKyAgICAgKiAgIHByaW9yaXR5OiBSZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgdmFsdWUgb2YgcHJpb3JpdHkgcGFyYW1ldGVyOiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgbG93ZXIgcHJpb3JpdGllcywgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZXMgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KKyAgICAgKiAgIHVzYWdlOiAgICBUaGUgdXNhZ2UgdGhpcyBlZmZlY3Qgc2hvdWxkIGJlIGEgZGVmYXVsdCBmb3IuIFVucmVjb2duaXplZCB2YWx1ZXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgIHRyZWF0ZWQgYXMgQVVESU9fVVNBR0VfVU5LTk9XTi4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB0eXBlIHV1aWQgb3IgaW1wbGVtZW50YXRpb24gdXVpZC4KKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgb3IgdHlwZSBmb3VuZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqaWQ6ICBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBhZGRlZCBkZWZhdWx0IGVmZmVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyKiB0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzb3VyY2UgdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKKyAgICAgKiBSZW1vdmVzIGFuIGVmZmVjdCBmcm9tIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGVmZmVjdCB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgYSBkZWZhdWx0LgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKworICAgIC8qCiAgICAgICogRXZlbnRzIHVzZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb24gKGVmZmVjdF9jYWxsYmFja190KS4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAppbmRleCBjZjdkOTBmLi4zYWU3MTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApAQCAtMTgsMTcgKzE4LDE4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX0gKIAorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyUHJvdmlkZXJzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Db21wYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC00MSw2ICs0MiwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK25hbWVzcGFjZSBOQkxvZyB7CitjbGFzcyBXcml0ZXI7Cit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9NaXhlcgpAQCAtNzMsNiArNzgsOCBAQAogICAgICAgICBET1dOTUlYX1RZUEUgICAgPSAwWDQwMDQsCiAgICAgICAgIE1JWEVSX0ZPUk1BVCAgICA9IDB4NDAwNSwgLy8gQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQogICAgICAgICBNSVhFUl9DSEFOTkVMX01BU0sgPSAweDQwMDYsIC8vIENoYW5uZWwgbWFzayBmb3IgbWl4ZXIgb3V0cHV0CisgICAgICAgIC8vIGZvciBoYXB0aWMKKyAgICAgICAgSEFQVElDX0VOQUJMRUQgID0gMHg0MDA3LCAvLyBTZXQgaGFwdGljIGRhdGEgZnJvbSB0aGlzIHRyYWNrIHNob3VsZCBiZSBwbGF5ZWQgb3Igbm90LgogICAgICAgICAvLyBmb3IgdGFyZ2V0IFJFU0FNUExFCiAgICAgICAgIFNBTVBMRV9SQVRFICAgICA9IDB4NDEwMCwgLy8gQ29uZmlndXJlIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIHRoZSBuZXcgc2FtcGxlIHJhdGUgaW4gSHouCkBAIC0xMzIsNiArMTM5LDEzIEBACiAgICAgdm9pZCAgICAgICAgc2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKTsKIAogICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1UcmFja3MpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIGNvbnRyYWN0ZWQgYnVmZmVyIGJlZm9yZSBwcm9jZXNzaW5nIGlmIGNvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIHNhdmVkCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBpZiAodC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICB0LT5jbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAodGhpcy0+Km1Ib29rKSgpOwogICAgIH0KIApAQCAtMjMwLDYgKzI0NCw4IEBACiAgICAgICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIH0KIAogICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CkBAIC0yNDQsNiArMjYwLDExIEBACiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvclJlZm9ybWF0KCk7CiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpOworICAgICAgICB2b2lkICAgICAgICBjbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKICAgICAgICAgYm9vbCAgICAgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogICAgICAgICB2b2lkICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogCkBAIC0yOTcsMTcgKzMxOCwyMiBAQAogICAgICAgICAgKiBhbGwgcHJlLW1peGVyIHRyYWNrIGJ1ZmZlciBjb252ZXJzaW9ucyBvdXRzaWRlIHRoZSBBdWRpb01peGVyIGNsYXNzLgogICAgICAgICAgKgogICAgICAgICAgKiAxKSBtSW5wdXRCdWZmZXJQcm92aWRlcjogVGhlIEF1ZGlvVHJhY2sgYnVmZmVyIHByb3ZpZGVyLgotICAgICAgICAgKiAyKSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBhdWRpbyByZWZvcm1hdCB0bworICAgICAgICAgKiAyKSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjogRXhwZW5kIG9yIGNvbnRyYWN0cyBkYXRhCisgICAgICAgICAqIDMpIG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6IE5vbi1kZXN0cnVjdGl2ZWx5IGFkanVzdCBzYW1wbGUgZGF0YQorICAgICAgICAgKiA0KSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBhdWRpbyByZWZvcm1hdCB0bwogICAgICAgICAgKiAgICBtYXRjaCBlaXRoZXIgbU1peGVySW5Gb3JtYXQgb3IgbURvd25taXhSZXF1aXJlc0Zvcm1hdCwgaWYgdGhlIGRvd25taXhlcgogICAgICAgICAgKiAgICByZXF1aXJlcyByZWZvcm1hdC4gRm9yIGV4YW1wbGUsIGl0IG1heSBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IGlucHV0IHRvCiAgICAgICAgICAqICAgIFBDTV8xNl9iaXQgaWYgdGhhdCdzIHJlcXVpcmVkIGJ5IHRoZSBkb3dubWl4ZXIuCi0gICAgICAgICAqIDMpIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCisgICAgICAgICAqIDUpIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCiAgICAgICAgICAqICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcmVxdWlyZWQgYnkgdGhlIG1peGVyIHNpbmsuCi0gICAgICAgICAqIDQpIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyByZWZvcm1hdHRpbmcgZnJvbQorICAgICAgICAgKiA2KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KICAgICAgICAgICogICAgdGhlIGRvd25taXhlciByZXF1aXJlbWVudHMgdG8gdGhlIG1peGVyIGVuZ2luZSBpbnB1dCByZXF1aXJlbWVudHMuCi0gICAgICAgICAqIDUpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCisgICAgICAgICAqIDcpIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOiBBZGRzIHRpbWVzdHJldGNoaW5nIGZvciBwbGF5YmFjayByYXRlCiAgICAgICAgICAqLwogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAvLyBUT0RPOiBjb21iaW5lIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgYW5kIEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwpAQCAtMzM2LDYgKzM2MiwxOCBAQAogCiAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CiAKKyAgICAgICAgLy8gSGFwdGljCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1IYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdEluQ2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0T3V0Q2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50OworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVsczsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8vIGhvb2tzCiAgICAgICAgIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKaW5kZXggOTY3ZDg5NS4uMjQ4MzdlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaApAQCAtNjQsNiArNjQsOSBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJlc2VudGF0aW9uSWQ7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlQcm9ncmFtSWQ7CiAKKyAgICAvLyAga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDogUHJlZmVycmVkIGF1ZGlvIGxhbmd1YWdlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkOworCiAgICAgLy8gIGtleVN0cmVhbUNvbm5lY3QgLyBEaXNjb25uZWN0OiB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Db25uZWN0OwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtRGlzY29ubmVjdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAppbmRleCBmYmU5NTQ2Li40NmRlNmIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCkBAIC0yMCw2ICsyMCw0MyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBzdGF0aWMgaW5saW5lCithdWRpb19zdHJlYW1fdHlwZV90IGF1ZGlvX3VzYWdlX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCit7CisgICAgc3dpdGNoKHVzYWdlKSB7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOworCisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworCisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7CisKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047CisKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKIGF1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCiB7CiAgICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwpAQCAtMzEsMzggKzY4LDcgQEAKICAgICB9CiAKICAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KKyAgICByZXR1cm4gYXVkaW9fdXNhZ2VfdG9fc3RyZWFtX3R5cGUoYXR0ci0+dXNhZ2UpOwogfQogCiBzdGF0aWMgaW5saW5lCkBAIC0xMTcsNCArMTIzLDIxIEBACiAgICAgfQogfQogCisvLyBDb252ZXJ0IGZsYWdzIHNlbnQgZnJvbSBKYXZhIEF1ZGlvQXR0cmlidXRlcy5nZXRGbGFncygpIG1ldGhvZCB0byBhdWRpb19vdXRwdXRfZmxhZ3NfdAorc3RhdGljIGlubGluZQordm9pZCBhdWRpb19hdHRyaWJ1dGVzX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhjb25zdCBhdWRpb19mbGFnc19tYXNrX3QgYXVkaW9BdHRyaWJ1dGVGbGFncywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICZmbGFncykgeworICAgIGlmICgoYXVkaW9BdHRyaWJ1dGVGbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PihmbGFncyB8CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgaWYgKChhdWRpb0F0dHJpYnV0ZUZsYWdzICYgQVVESU9fRkxBR19MT1dfTEFURU5DWSkgIT0gMCkgeworICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PihmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgIH0KKyAgICAvLyBjaGVjayBkZWVwIGJ1ZmZlciBhZnRlciBmbGFncyBoYXZlIGJlZW4gbW9kaWZpZWQgYWJvdmUKKyAgICBpZiAoZmxhZ3MgPT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAmJiAoYXVkaW9BdHRyaWJ1dGVGbGFncyAmIEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICB9Cit9CisKICNlbmRpZiAvL0FVRElPX1BPTElDWV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCA4MDYyODBhLi4zNWE3ZTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC01MzQsOSArNTM0LDE1IEBACiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKLSAgICAvKgotICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyByZWNvcmQuCi0gICAgICovCisgICAgIC8qIEdldCB0aGUgdW5pcXVlIHBvcnQgSUQgYXNzaWduZWQgdG8gdGhpcyBBdWRpb1JlY29yZCBpbnN0YW5jZSBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICAqIG9mIGEgZ2l2ZW4gQXVkaW9SZWNvcmQgaW5zdGFuY2UgaWYgdGhlIGNvbm5lY3Rpb24gdG8gYXVkaW9zZXJ2ZXIgaXMgcmVzdG9yZWQuCisgICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgICAgIC8qCisgICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyByZWNvcmQuCisgICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiBwcml2YXRlOgpAQCAtNjU0LDYgKzY2MCw3IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAgICAgbU9yaWdGbGFnczsgICAgICAgICAgICAgLy8gYXMgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yIG9yIHNldCgpLCBjb25zdAogCiAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKIAogICAgIC8vIE5leHQgNSBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQsIGJ1dCBhbHdheXMgIT0gMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDRjMGY3OTYuLmIwZGE1YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTM1LDkgKzM1LDE0IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKIGNsYXNzIElBdWRpb0ZsaW5nZXI7CiBjbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtMjI0LDE1ICsyMjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIGNyZWF0ZVJlY29yZCgpLAogICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KQEAgLTI0Nyw4ICsyNDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0zMjgsOSArMzI2LDkgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTM0OSw2ICszNDcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCk7CisgICAgc3RhdGljIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHN0YXRpYyBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCkBAIC00NTAsOSArNDUzLDEzIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAppbmRleCA0OThkZThlLi5lNTkyNWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCkBAIC0xMzUsOCArMTM1LDIzIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBkb3VibGUgZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHVpbnQzMl90IHNhbXBsZVJhdGUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldExhdGVuY3lNcyhzYW1wbGVSYXRlLCBMT0NBVElPTl9TRVJWRVIsIExPQ0FUSU9OX0tFUk5FTCk7CisgICAgfQorCisgICAgZG91YmxlIGdldExhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlLCBMb2NhdGlvbiBsb2NhdGlvbjEsIExvY2F0aW9uIGxvY2F0aW9uMikgY29uc3QgeworICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjFdID4gMCAmJiBtVGltZU5zW2xvY2F0aW9uMl0gPiAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lRGlmZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvbltsb2NhdGlvbjFdIC0gbVBvc2l0aW9uW2xvY2F0aW9uMl07CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVEaWZmZXJlbmNlTnMgPQorICAgICAgICAgICAgICAgICAgICBtVGltZU5zW2xvY2F0aW9uMV0gLSBtVGltZU5zW2xvY2F0aW9uMl07CisgICAgICAgICAgICByZXR1cm4gKChkb3VibGUpZnJhbWVEaWZmZXJlbmNlICogMWU5IC8gc2FtcGxlUmF0ZSAtIHRpbWVEaWZmZXJlbmNlTnMpICogMWUtNjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMC47CisgICAgfQorCiAgICAgLy8gY29udmVydCBmaWVsZHMgdG8gYSBwcmludGFibGUgc3RyaW5nCi0gICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CiAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogCiAgICAgICAgIHNzIDw8ICJCT09UVElNRSBvZmZzZXQgIiA8PCBtVGltZWJhc2VPZmZzZXRbVElNRUJBU0VfQk9PVFRJTUVdIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IDU5YzZmNGMuLjdmZGY3Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC03NCw2ICs3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWFwcGluZyBmcm9tIGZyYW1lIHBvc2l0aW9uIHRvIHByZXNlbnRhdGlvbiB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIEF1ZGlvVGltZXN0YW1wIGZvciB0aGUgaW5mb3JtYXRpb24gaW5jbHVkZWQgd2l0aCBldmVudC4KICNlbmRpZgorICAgICAgICBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBID0gOSwvLyBOb3RpZmljYXRpb24gdGhhdCBtb3JlIGRhdGEgY2FuIGJlIGdpdmVuIGJ5IHdyaXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZXZlbnQgb25seSBvY2N1cnMgZm9yIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0suCiAgICAgfTsKIAogICAgIC8qIENsaWVudCBzaG91bGQgZGVjbGFyZSBhIEJ1ZmZlciBhbmQgcGFzcyB0aGUgYWRkcmVzcyB0byBvYnRhaW5CdWZmZXIoKQpAQCAtMTQ1LDYgKzE0NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKIAorICAgIC8qIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgdGhlIGdpdmVuIGF1ZGlvIGNvbmZpZ3VyYXRpb24gYW5kIGF0dHJpYnV0ZXMuCisgICAgICogUmV0dXJuIHRydWUgaWYgb3V0cHV0IGlzIHBvc3NpYmxlIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgc3RhdGljIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CisKICAgICAvKiBIb3cgZGF0YSBpcyB0cmFuc2ZlcnJlZCB0byBBdWRpb1RyYWNrCiAgICAgICovCiAgICAgZW51bSB0cmFuc2Zlcl90eXBlIHsKQEAgLTE1Myw2ICsxNjEsNyBAQAogICAgICAgICBUUkFOU0ZFUl9PQlRBSU4sICAgIC8vIGNhbGwgb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKQogICAgICAgICBUUkFOU0ZFUl9TWU5DLCAgICAgIC8vIHN5bmNocm9ub3VzIHdyaXRlKCkKICAgICAgICAgVFJBTlNGRVJfU0hBUkVELCAgICAvLyBzaGFyZWQgbWVtb3J5CisgICAgICAgIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0ssIC8vIHN5bmNocm9ub3VzIHdyaXRlKCksIG5vdGlmIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEKICAgICB9OwogCiAgICAgLyogQ29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIEF1ZGlvVHJhY2suIE5vIGNvbm5lY3Rpb24gd2l0aApAQCAtMjk1LDYgKzMwNCw4IEBACiAgICAgICogUGFyYW1ldGVycyBub3QgbGlzdGVkIGluIHRoZSBBdWRpb1RyYWNrIGNvbnN0cnVjdG9ycyBhYm92ZToKICAgICAgKgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgV2hldGhlciBjYWxsYmFja3MgYXJlIG1hZGUgZnJvbSBhbiBhdHRhY2hlZCB0aHJlYWQgYW5kIHRodXMgY2FuIGNhbGwgSk5JLgorICAgICAqICAgICAgT25seSBzZXQgdG8gdHJ1ZSB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHVzZWQgZm9yIGEgamF2YSBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2sKKyAgICAgKiAgICAgIGluIGl0cyBKTkkgY29kZS4KICAgICAgKgogICAgICAqIEludGVybmFsIHN0YXRlIHBvc3QgY29uZGl0aW9uOgogICAgICAqICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSBpbXBsaWVzIHRoaXMgQXVkaW9UcmFjayBoYXMgdmFsaWQgYXR0cmlidXRlcwpAQCAtOTA3LDcgKzkxOCwxNCBAQAogICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0FDVElWRSB8fCBtU3RhdGUgPT0gU1RBVEVfU1RPUFBJTkc7CiAgICAgICAgICAgICB9Ci1wcm90ZWN0ZWQ6CisKKyAgICAvKiBHZXQgdGhlIHVuaXF1ZSBwb3J0IElEIGFzc2lnbmVkIHRvIHRoaXMgQXVkaW9UcmFjayBpbnN0YW5jZSBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgKiBvZiBhIGdpdmVuIEF1ZGlvVHJhY2sgaW5zdGFuY2UgaWYgdGhlIGNvbm5lY3Rpb24gdG8gYXVkaW9zZXJ2ZXIgaXMgcmVzdG9yZWQuCisgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyBwcm90ZWN0ZWQ6CiAgICAgLyogY29weWluZyBhdWRpbyB0cmFja3MgaXMgbm90IGFsbG93ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soY29uc3QgQXVkaW9UcmFjayYgb3RoZXIpOwogICAgICAgICAgICAgQXVkaW9UcmFjayYgb3BlcmF0b3IgPSAoY29uc3QgQXVkaW9UcmFjayYgb3RoZXIpOwpAQCAtMTA1OCw2ICsxMDc2LDE5IEBACiAgICAgICAgIFNUQVRFX1NUT1BQSU5HLAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZTsKIAorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RhdGVUb1N0cmluZyhTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9BQ1RJVkU6ICAgICAgICAgIHJldHVybiAiU1RBVEVfQUNUSVZFIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiAgICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiAgICAgICAgICByZXR1cm4gIlNUQVRFX1BBVVNFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOiByZXR1cm4gIlNUQVRFX1BBVVNFRF9TVE9QUElORyI7CisgICAgICAgIGNhc2UgU1RBVEVfRkxVU0hFRDogICAgICAgICByZXR1cm4gIlNUQVRFX0ZMVVNIRUQiOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOiAgICAgICAgcmV0dXJuICJTVEFURV9TVE9QUElORyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCiAgICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGFuZGxlciBmb3IgZXZlbnRzLCBvciBOVUxMCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwpAQCAtMTE0OCw2ICsxMTc5LDcgQEAKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCBlNmJmNzJmLi5hMzRiMjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtMTQ2LDYgKzE0Niw3IEBACiAgICAgICAgICAgICBhZlNhbXBsZVJhdGUgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgYWZMYXRlbmN5TXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNjMsNiArMTY0LDcgQEAKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChhZlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKGFmTGF0ZW5jeU1zKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNzksNiArMTgxLDcgQEAKICAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNczsKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0SWQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvKiBDcmVhdGVSZWNvcmRJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCkBAIC0yNzEsNiArMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0yOTcsNiArMzAxLDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTMxMyw2ICszMTgsNyBAQAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dElkOwogICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwogICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKICAgICB9OwogCiAgICAgLy8gaW52YXJpYW50IG9uIGV4aXQgZm9yIGFsbCBBUElzIHRoYXQgcmV0dXJuIGFuIHNwPD46CkBAIC00MjgsNyArNDM0LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCBjMzg3NmFmLi42MWYzYjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMjAsMTUgKzIwLDE0IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02NiwxNSArNjUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODUsOCArNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMTE1LDEwICsxMDcsMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSA9IDA7CiAKKyAgICAvLyBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc2FtcGxlIHJhdGUsIGNoYW5uZWwgbWFzayBhbmQgZmxhZ3MuCisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSA9IDA7CisKICAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xNTksOCArMTY5LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTE3Miw2ICsxODIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKaW5kZXggZTBkMjQ5NS4uYjNjMDM4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKQEAgLTE3LDEwICsxNywxMiBAQAogI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAogCisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDYgKzMyLDggQEAKICAgICB1aWRfdCB1aWQ7CiAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydF9pZDsKKyAgICBib29sIHNpbGVuY2VkOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHJlY29yZF9jbGllbnRfaW5mb190OwpAQCAtNTEsOCArNTUsMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSA9IDA7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDk0YWZlM2MuLjA2ZTc4NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTcwLDYgKzcwLDkgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgPSAwOworCiAgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0YjQzNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwYmY4Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKLSAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKLSAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKLSAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCi0gICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCi0gICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKLSAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOwotICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Ci19Ci0KLUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCi0gICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTZmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKLSAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTlkNzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbURldmljZS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvSW5wdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIEF1ZGlvU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzFjYjU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzYmY3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzIwMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzM1OTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6bmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSkgewotICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbmFtZUZyb21IYWwobmFtZSwgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDg4NDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OwotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOwotCi0gICAgc3RhdGljIHN0YXR1c190IG5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YmU3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1N2Q2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDE4YWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZhNTAwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlMDA4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmIwMzJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IEF1ZGlvQ2hhbm5lbE1hc2soaGFsQ29uZmlnLmNoYW5uZWxzKTsKLSAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOwotICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgY29uZmlnLT5tYXNrID0gRWZmZWN0Q29uZmlnUGFyYW1ldGVycyhoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZkYWYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDBlNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI1NDgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2JkNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLSAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKLSAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKLX0KLQotYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewotICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAotICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKLSAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgotICAgIHJldHVybiBlcnIgPT0gMDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgotCi1UaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi1pcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCi1XaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgotCi1UaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKLXRoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KLUlTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKLWZyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KLQotVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCi1ieSBBdWRpb0ZsaW5nZXIuCi0KLSovCi0KLXN0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgewotICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9Ci0KLSAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSkgewotICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQotICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCi0gICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKLSAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwotICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgotICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKLSAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOwotICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKLSAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7Ci0gICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAotICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOwotICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7Ci0gICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhZDhhZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1Jbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXQuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Ci11c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKLXVzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Ci11c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsOwotCi1jbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7Ci0gICAgSVN0cmVhbSAqbVN0cmVhbTsKLSAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OwotICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCi0gICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKLSAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOwotICAgIHZvaWQgb25FcnJvcigpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOwotCi0gICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwotCi0gICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTA3ZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE4ZDBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhiMWFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZGVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKLQotICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAotICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhhcmR3YXJlIiwKLSAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZm1xIiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnV0aWxAYWxsLXZlcnNpb25zIiwKLSAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmZtcSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI3NTA0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lTG9jYXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewotICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7Ci0gICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7Ci0gICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCi0gICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcwotICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgotICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8Ci0gICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKLSAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwotfQotCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLS8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCi1zdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgewotICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCi0gICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOwotICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOwotICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8Ci0gICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbEFkZHJlc3M7Ci19Ci0KLS8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCi0KLWF1ZGlvX21pY3JvcGhvbmVfY2hhbm5lbF9tYXBwaW5nX3QgIGNoYW5uZWxNYXBwaW5nVG9IYWwoQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmcgbWFwcGluZykgewotICAgIHN3aXRjaCAobWFwcGluZykgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpVTlVTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfRElSRUNUOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpQUk9DRVNTRUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfUFJPQ0VTU0VEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBjaGFubmVsTWFwcGluZ1RvSGFsIGNvbnZlcnNpb24gJWQiLCBtYXBwaW5nKTsKLSAgICB9Ci19Ci0KLWF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7Ci0gICAgfQotfQotYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7Ci0gICAgc3dpdGNoIChkaXIpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjptaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgewotICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKLSAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjaDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKLSAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKLSAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOwotICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKLSAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7Ci0gICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOwotICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKLSAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7Ci0gICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7Ci0gICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyM2E4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7Ci0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKLSAgICBzdGF0aWMgdm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOwotCi0gICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgewotICAgICAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCi0gICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQgcmV0dmFsKSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIFY0XzAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhY2NhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotbmFtZXNwYWNlIHsKLQotc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwotCi0gICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKLX0KLQotRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7Ci0gICAgaWYgKG1EZXZpY2UgIT0gMCkgewotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgewotICAgIC8vIE9ic29sZXRlLgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgLy8gVE9ETzogY2hhbmdlIHRoZSBBUEkgc28gdGhhdCBjb250ZXh0IGFuZCBrdlBhaXJzIGFyZSBzZXBhcmF0ZWQKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobURldmljZSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKG1EZXZpY2UsCi0gICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBta0VudW1Db252ZXJ0ZXI8QXVkaW9PdXRwdXRGbGFnPihmbGFncyksCi0gICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKLSAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCi0gICAgU2lua01ldGFkYXRhIG1ldGFkYXRhID0ge3t7QXVkaW9Tb3VyY2Uoc291cmNlKSwgMX19fTsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vY29udmVydAotICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7Ci0gICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOwotICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQyMTc1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NWRkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzQxYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzE5NGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCi0gICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKLSAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ODg5Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYxZWM3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRlZGQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxYzUyMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2M4OWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU3OGM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOwotICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWM0YzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjp1dGlsczo6bWtFbnVtQ29udmVydGVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gbWtFbnVtQ29udmVydGVyPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IG1rRW51bUNvbnZlcnRlcjxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKLSAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgewotICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOwotICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCi0gICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7Ci0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOwotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgewotICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCi0gICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgewotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKLSAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgewotICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotCi0gICAgLy8gU3BlY2lhbCBjYXNlcy4KLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBDb21tb24gY2FzZS4KLSAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKLSAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgewotICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKLSAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOwotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBSZXR1cm48dm9pZD4gcmV0OwotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8Ci0gICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7Ci0gICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOwotICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7Ci0gICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTRkYWIxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdEJ1ZmZlckNvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOwotCi0gICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKLSAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOwotCi0gICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKLQotICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgotICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8Ci0gICAgICAgIGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7Ci0gICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKLSAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdCYgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOwotICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKLSAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZWQ3ODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlV1aWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJmNWY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29udGVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Vc2FnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZWNvcmRUcmFja01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBtU3RyZWFtLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgYnVmZmVyIHNpemUgZnJhbWUgd2FzIGEgaGFjayBpbiBPIGFuZCBQIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgc2hhcmVhYmxlIHRvIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgKj0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgfCBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgewotICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwotfQotCi1ib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7Ci0gICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCi0gICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOwotICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCi0gICAgcmV0dXJuIGVyciA9PSAwOwotfQotCi1uYW1lc3BhY2UgewotCi0vKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCi0KLVRoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLWlzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KLVdoZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCi0KLVRodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwotdGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bwotSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJwotZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgotCi1UaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKLWJ5IEF1ZGlvRmxpbmdlci4KLQotKi8KLQotc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7Ci0gICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KLQotICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KLSAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCi0gICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAotICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgewotICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOwotICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgewotICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKLSAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCi0gICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotLyoqIFRyYW5zZm9ybSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gdG8gYW4gSElETCB2ZWN0b3IuICovCi10ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVzLCBjbGFzcyBFbGVtZW50Q29udmVydGVyPgotc3RhdGljIGF1dG8gdHJhbnNmb3JtVG9IaWRsVmVjKGNvbnN0IFZhbHVlcyYgdmFsdWVzLCBFbGVtZW50Q29udmVydGVyIGNvbnZlcnRlcikgewotICAgIGhpZGxfdmVjPGRlY2x0eXBlKGNvbnZlcnRlcigqdmFsdWVzLmJlZ2luKCkpKT4gcmVzdWx0e3ZhbHVlcy5zaXplKCl9OwotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgdHJhbnNmb3JtKGJlZ2luKHZhbHVlcyksIGVuZCh2YWx1ZXMpLCBiZWdpbihyZXN1bHQpLCBjb252ZXJ0ZXIpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAotICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBoaWRsX3ZlYzxNaWNyb3Bob25lSW5mbz4gbWljQXJyYXlIYWwpIHsKLSAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtaWNBcnJheUhhbC5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IGRzdDsKLSAgICAgICAgICAgIC8vIGNvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEFjdGl2ZU1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCi0gICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRhMGY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTZiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgewotICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewotICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQotICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewotICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKndyaXR0ZW4gPSAwOwotICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKLSAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1TdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKLSAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKLSAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWFkID0gMDsKLSAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKLSAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7Ci0gICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOwotICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNzUwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsOwotCi1jbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7Ci0KLSAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7Ci0KLSAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNzIwMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBTdHJlYW1Qb3dlckxvZyB7Ci1wdWJsaWM6Ci0gICAgU3RyZWFtUG93ZXJMb2coKSA6Ci0gICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKLSAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAotICAgICAgICBtRnJhbWVTaXplKDApIHsKLSAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KLSAgICB9Ci0KLSAgICB+U3RyZWFtUG93ZXJMb2coKSB7Ci0gICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOwotICAgIH0KLQotICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCi0gICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKLSAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCi0gICAgfQotCi0gICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKLSAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAotICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOwotICAgIH0KLQotICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgotICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCi0gICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAotICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIH0KLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAotICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOwotICAgIH0KLQotICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLwotICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOwotCi0gICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOwotICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0NmMyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KLVJldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1SZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNmRlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OwotICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGI3YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDNhNWRmMjcuLjU4NGMyYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtOCwxNiArOCwyMCBAQAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAogICAgICAgICAibGliYXVkaW9oYWxAMi4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA1LjAiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCA0YzhlYWY2Li5mODYwMDljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwxOSArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNS4wL0lEZXZpY2VzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaD4KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjVfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gVjVfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKKyAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWNF8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKyAgICAgICAgcmV0dXJuIFYyXzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCmluZGV4IGVhZDFmYTIuLmJkM2VmNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTE2LDIwICsxNiwyMiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC81LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CiAKLSNpbmNsdWRlIDxFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLSNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwogc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNV8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlY1XzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNF8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjJfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9IYWxEZWF0aEhhbmRsZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0hhbERlYXRoSGFuZGxlckhpZGwuY3BwCmluZGV4IDFlM2FiNTguLjZlMzM1MjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0hhbERlYXRoSGFuZGxlckhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0hhbERlYXRoSGFuZGxlckhpZGwuY3BwCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIGhhbmRsZXIuc2Vjb25kKCk7CiAgICAgfQogICAgIEFMT0dFKCJIQUwgc2VydmVyIGNyYXNoZWQsIGF1ZGlvIHNlcnZlciBpcyByZXN0YXJ0aW5nIik7Ci0gICAgZXhpdCgxKTsKKyAgICBfZXhpdCgxKTsgIC8vIEF2b2lkIGNhbGxpbmcgYXRleGl0IGhhbmRsZXJzLCBhcyB0aGlzIGNvZGUgcnVucyBvbiBhIHRocmVhZCBmcm9tIFJQQyB0aHJlYWRwb29sLgogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1MzNkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMiBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKKworICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049MiIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NCIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxANS4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1BSk9SX1ZFUlNJT049NSIsCisgICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCisgICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGE1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKKyAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKKyAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKKyAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCisgICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgorICAgIFN0cmluZzggdmFsdWU7CisgICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKKyAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOworICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKKyAgICB9CisgICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Cit9CisKK0NvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCisgICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorLy8gVE9ETzogVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGluIHRoZSBoYWwgd2hlbiBpdCBtb3ZlcyB0byBhIHV0aWwgbGlicmFyeS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgeworICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCisgICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOworICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOworICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKKyAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8CisgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbEFkZHJlc3M7Cit9CisKKy8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCisKK3N0YXRpYyBhdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKKyAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7CisgICAgfQorfQorCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9sb2NhdGlvbl90IGxvY2F0aW9uVG9IYWwoQXVkaW9NaWNyb3Bob25lTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWV9NT1ZBQkxFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFlfTU9WQUJMRTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6UEVSSVBIRVJBTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1BFUklQSEVSQUw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGxvY2F0aW9uVG9IYWwgY29udmVyc2lvbiAlZCIsIGxvY2F0aW9uKTsKKyAgICB9Cit9CitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOworICAgIH0KK30KKwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KSB7CisgICAgaWYgKHBEc3QgIT0gTlVMTCkgeworICAgICAgICBzbnByaW50ZihwRHN0LT5kZXZpY2VfaWQsIHNpemVvZihwRHN0LT5kZXZpY2VfaWQpLAorICAgICAgICAgICAgICAgICAiJXMiLCBzcmMuZGV2aWNlSWQuY19zdHIoKSk7CisgICAgICAgIHBEc3QtPmRldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3JjLmRldmljZUFkZHJlc3MuZGV2aWNlKTsKKyAgICAgICAgc25wcmludGYocERzdC0+YWRkcmVzcywgc2l6ZW9mKHBEc3QtPmFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAiJXMiLCBkZXZpY2VBZGRyZXNzVG9IYWwoc3JjLmRldmljZUFkZHJlc3MpLmNfc3RyKCkpOworICAgICAgICBpZiAoc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSA+IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKSB7CisgICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlenUgY2hhbm5lbE1hcHBpbmcgZWxlbWVudHMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpLCBBVURJT19DSEFOTkVMX0NPVU5UX01BWCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNoOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpICYmIGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBjaGFubmVsTWFwcGluZ1RvSGFsKHNyYy5jaGFubmVsTWFwcGluZ1tjaF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOworICAgICAgICB9CisgICAgICAgIHBEc3QtPmxvY2F0aW9uID0gbG9jYXRpb25Ub0hhbChzcmMubG9jYXRpb24pOworICAgICAgICBwRHN0LT5ncm91cCA9IChhdWRpb19taWNyb3Bob25lX2dyb3VwX3Qpc3JjLmdyb3VwOworICAgICAgICBwRHN0LT5pbmRleF9pbl90aGVfZ3JvdXAgPSAodW5zaWduZWQgaW50KXNyYy5pbmRleEluVGhlR3JvdXA7CisgICAgICAgIHBEc3QtPnNlbnNpdGl2aXR5ID0gc3JjLnNlbnNpdGl2aXR5OworICAgICAgICBwRHN0LT5tYXhfc3BsID0gc3JjLm1heFNwbDsKKyAgICAgICAgcERzdC0+bWluX3NwbCA9IHNyYy5taW5TcGw7CisgICAgICAgIHBEc3QtPmRpcmVjdGlvbmFsaXR5ID0gZGlyZWN0aW9uYWxpdHlUb0hhbChzcmMuZGlyZWN0aW9uYWxpdHkpOworICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9ICh1bnNpZ25lZCBpbnQpc3JjLmZyZXF1ZW5jeVJlc3BvbnNlLnNpemUoKTsKKyAgICAgICAgaWYgKHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID4gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUykgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJWQgZnJlcXVlbmN5IHJlc3BvbnNlcy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzLCBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKTsKKyAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzOyBrKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10uZnJlcXVlbmN5OworICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1sxXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5sZXZlbDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueCA9IHNyYy5wb3NpdGlvbi54OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueSA9IHNyYy5wb3NpdGlvbi55OworICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueiA9IHNyYy5wb3NpdGlvbi56OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi54ID0gc3JjLm9yaWVudGF0aW9uLng7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnkgPSBzcmMub3JpZW50YXRpb24ueTsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueiA9IHNyYy5vcmllbnRhdGlvbi56OworICAgIH0KK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIENvcmVSZXN1bHQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOworICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CisgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KKyAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxDb3JlUmVzdWx0PiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIENvcmVSZXN1bHQgcmV0dmFsKSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtQ2xhc3NOYW1lOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgQ29yZVJlc3VsdCYgcmVzdWx0KTsKKworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Cit9OworCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA0Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046Ok1pY3JvcGhvbmVJbmZvOwordm9pZCBtaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzNzYwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lQcmltYXJ5RGV2aWNlLmgpCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Cit9CisKK0RldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgeworICAgIGlmIChtRGV2aWNlICE9IDApIHsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisjZW5kaWYKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorICAgIGF1dG8gc291cmNlTWV0YWRhdGEgPSBBdWRpb1NvdXJjZShzb3VyY2UpOworI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CisgICAgLy8gVE9ETzogY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgdHJhY2tzIHNvdXJjZXMgYW5kIHZvbHVtZQorICAgIC8vICAgICAgIGZvciBub3csIG9ubHkgc2VuZCB0aGUgbWFpbiBzb3VyY2UgYXQgMWRiZnMKKyAgICBTaW5rTWV0YWRhdGEgc291cmNlTWV0YWRhdGEgPSB7e3tBdWRpb1NvdXJjZShzb3VyY2UpLCAxfX19OworI2VuZGlmCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvSW5wdXRGbGFnPihmbGFncyksCisgICAgICAgICAgICBzb3VyY2VNZXRhZGF0YSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvL2NvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MWM4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJUHJpbWFyeURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOworICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZmU5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCisgICAgICAgIDogbURldihkZXYpIHsKK30KKworRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKKyAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOworICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICBtRGV2ID0gMDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7CisgICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7CisgICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgeworICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3V0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgeworICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAorICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKKyAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgeworICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOworICAgIH0KKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3VsdDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCisgICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCisgICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1EZXYtPmdldF9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7CisgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbURldi0+Z2V0X21pY3JvcGhvbmVzKG1EZXYsICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICByZXR1cm4gbURldi0+ZHVtcChtRGV2LCBmZCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KSB7CisgICAgbURldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShtRGV2LCBzdHJlYW1fb3V0KTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pIHsKKyAgICBtRGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0obURldiwgc3RyZWFtX2luKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGJkODc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOworCisgICAgLy8gTXV0aW5nIGNvbnRyb2wuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7CisKKyAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOworICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOworCisgIHByaXZhdGU6CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKKworICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMWU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKKyAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IGRlZmF1bHRGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpfTsKKyAgICBpZiAoIWRlZmF1bHRGYWN0b3J5KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElEZXZpY2VzRmFjdG9yeS9kZWZhdWx0IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG1EZXZpY2VGYWN0b3JpZXMucHVzaF9iYWNrKGRlZmF1bHRGYWN0b3J5KTsKKyAgICBpZiAoTUFKT1JfVkVSU0lPTiA+PSA0KSB7CisgICAgICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbCBhbmQgb25seSBhdmFpbGFibGUgc3RhcnRpbmcgYXQgSEFMIDQuMAorICAgICAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1zZEZhY3Rvcnl7SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKX07CisgICAgICAgIGlmIChtc2RGYWN0b3J5KSB7CisgICAgICAgICAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhtc2RGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UgaW5zdGFuY2UgaXMgb3duZWQKKyAgICAgICAgLy8gYnkgQXVkaW9GbGluZ2VyIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCisgICAgICAgIGZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKKyAgICB9Cit9CisKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdGljIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGlkRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBzdGF0dXNfdCogc3RhdHVzKSB7CisgICAgKnN0YXR1cyA9IE9LOworICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQikgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlVTQjsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7CisgICAgfQorICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBuYW1lICVzIiwgbmFtZSk7CisgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICByZXR1cm4ge307Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXRpYyBjb25zdCBjaGFyKiBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICByZXR1cm4gbmFtZTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1EZXZpY2VGYWN0b3JpZXMuZW1wdHkoKSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGF1dG8gaGlkbElkID0gaWRGcm9tSGFsKG5hbWUsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIGZvciAoY29uc3QgYXV0byYgZmFjdG9yeSA6IG1EZXZpY2VGYWN0b3JpZXMpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2UoCisgICAgICAgICAgICAgICAgaGlkbElkLAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgc3dpdGNoIChyZXR2YWwpIHsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYW5kIHdhcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYnV0IGZhaWxlZCB0byBpbml0YWxpemUuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSBpdGVyYXRpbmcuCisgICAgICAgICAgICBkZWZhdWx0OiA7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1coIlRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQ6IFwiJXNcIiIsIG5hbWUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UwNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlc0ZhY3RvcnkuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJRGV2aWNlc0ZhY3Rvcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gbURldmljZUZhY3RvcmllczsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpID0gZGVmYXVsdDsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzdhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQorICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCisgICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgeworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCisgICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzBkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworCisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKK307CisKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjdmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKKyAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXR1cm4gT0s7CisKK291dDoKKyAgICAqZGV2ID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKKyAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOworICAgIGlmIChyYyA9PSBPSykgeworICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMDhkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KKworICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY3OTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCisvLyBzdGF0aWMKK3VpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07CisgICAgcmV0dXJuIGNvdW50ZXIrKzsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCisgICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKKyAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7CisgICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQorICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAorICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKKyAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitFZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKKyAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICBpZiAoYXNobWVtID09IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIG1CdWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgeworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgeworICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgeworICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7CisgICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOworICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgeworICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOworfQorCit2b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgeworICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOworfQorCitib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKKyAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgeworICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7CisgICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7CisgICAgY29tbWl0KG1CdWZmZXJTaXplKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgbU1lbW9yeS0+dXBkYXRlKCk7CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKKyAgICBtTWVtb3J5LT5jb21taXQoKTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47CisgICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOworICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODI2ODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKKworICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7CisgICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQorCisgICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7CisgICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7CisKKyAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOworCisgICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOworCisgICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOworICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7CisgICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1OTdiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK0VmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCisgICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7CisgICAgaWYgKG1FZmZlY3QgIT0gMCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgeworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOworICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOworICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7CisgICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOworfQorCisvLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgorLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKKyAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWctPmNoYW5uZWxzID0gRW51bUJpdGZpZWxkPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7CisgICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKKyAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOworICAgIGNvbmZpZy0+bWFzayA9IEVudW1CaXRmaWVsZDxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKKyAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7CisgICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOworICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgeworICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOworICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCisgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7CisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7CisgICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgeworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKKyAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworCisgICAgLy8gU3BlY2lhbCBjYXNlcy4KKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9CisKKyAgICAvLyBDb21tb24gY2FzZS4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKKyAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgeworICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKKyAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBSZXR1cm48dm9pZD4gcmV0OworICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8CisgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7CisgICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOworICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7CisgICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ZjcwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdC5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitjbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKKworICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCisgICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKKworICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworCisgICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQorCisgICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKKyAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOworICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgorICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKKyAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOworICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7CisgICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ2YmRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7CisgICAgfQorICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7CisgICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE3OGZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdHNGYWN0b3J5LmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpDUFBfVkVSU0lPTjo6Q29udmVyc2lvbkhlbHBlckhpZGw7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOworCisgICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OworICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7CisKKyAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Cit9OworCitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKSB7CisgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyYjM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw4NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKK3VzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBtU3RyZWFtLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RkOjp2ZWN0b3I8UGFyYW1ldGVyVmFsdWU+IHBhcmFtZXRlcnM7CisgICAgU3RyaW5nOCBoYWxQYXJhbWV0ZXJzOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQsIHN0ZDo6dG9fc3RyaW5nKHByZXNlbnRhdGlvbklkKX0pOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkLCBzdGQ6OnRvX3N0cmluZyhwcm9ncmFtSWQpfSk7CisgICAgcGFyYW1ldGVyc1RvSGFsKGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPihwYXJhbWV0ZXJzKSwgJmhhbFBhcmFtZXRlcnMpOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKGhhbFBhcmFtZXRlcnMpOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNlbGVjdFByZXNlbnRhdGlvbiIsCisgICAgICAgICAgICBtU3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCkpOworfQorI2VuZGlmCisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqd3JpdHRlbiA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCisgICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSkgeworICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCisgICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQorICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCisgICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7CisgICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKKyAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOworICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgorICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgeworICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOworICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKKyAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7CisgICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAorICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOworICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CisvKiogVHJhbnNmb3JtIGEgc3RhbmRhcmQgY29sbGVjdGlvbiB0byBhbiBISURMIHZlY3Rvci4gKi8KK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZXMsIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXI+CitzdGF0aWMgYXV0byB0cmFuc2Zvcm1Ub0hpZGxWZWMoY29uc3QgVmFsdWVzJiB2YWx1ZXMsIEVsZW1lbnRDb252ZXJ0ZXIgY29udmVydGVyKSB7CisgICAgaGlkbF92ZWM8ZGVjbHR5cGUoY29udmVydGVyKCp2YWx1ZXMuYmVnaW4oKSkpPiByZXN1bHR7dmFsdWVzLnNpemUoKX07CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICB0cmFuc2Zvcm0oYmVnaW4odmFsdWVzKSwgZW5kKHZhbHVlcyksIGJlZ2luKHJlc3VsdCksIGNvbnZlcnRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKyNlbmRpZgorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiAvKiBzaW5rTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNpbmsgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvLyBjb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QKKyAgICAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjUwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dC5oKQorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Cit1c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKK3VzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbDsKKworY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOworICAgIElTdHJlYW0gKm1TdHJlYW07CisgICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKKyAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCisgICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKKyAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOworICAgIHZvaWQgb25FcnJvcigpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOworCisgICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOworCisgICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OworICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkMzBkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7CisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7CisgICAgfQorfQorCitTdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgeworICAgIG1TdHJlYW0gPSAwOworICAgIG1EZXZpY2UuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKKyAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKKyAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCisgICAgcmV0dXJuIE9LOworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgeworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKKyAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7CisgICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqd3JpdHRlbiA9IDA7CisgICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7CisgICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCisgICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCisgICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKKyAgICAvLyBkZWNyZW1lbnRlZC4KKyAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKKyAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKKyAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6CisgICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOworICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Cit9CisKK1N0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgeworICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKKyAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgeworICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnJlYWQgPSAwOworICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7CisgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQxOTYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKK2NsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKKworICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07CisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOworCisgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQzOTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIFN0cmVhbVBvd2VyTG9nIHsKK3B1YmxpYzoKKyAgICBTdHJlYW1Qb3dlckxvZygpIDoKKyAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAorICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCisgICAgICAgIG1GcmFtZVNpemUoMCkgeworICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgorICAgIH0KKworICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKKyAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KKyAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KKyAgICB9CisKKyAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgeworICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCisgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7CisgICAgfQorCisgICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCisgICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KKyAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCisgICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7CisgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCisgICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7CisgICAgfQorCisgICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCisgICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7CisKKyAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7CisgICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKKyAgICBzaXplX3QgbUZyYW1lU2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwYTQyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKK25hbWVzcGFjZSB1dGlscyB7CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhrZXlzLCBjYWxsYmFjayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKKyAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGtleXMpOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMxOWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKKworLyoqIEBmaWxlIExpYnJhcnkgZW50cnkgcG9pbnRzIHRvIGNyZWF0ZSB0aGUgSEFMIGZhY3Rvcmllcy4gKi8KKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgVjJfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFYyXzAKKworbmFtZXNwYWNlIFY0XzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNF8wCisKK25hbWVzcGFjZSBWNV8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjVfMAorfSAvLyBuYW1lc3BhY2UgZWZmZWN0CisKK25hbWVzcGFjZSBWMl8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjJfMAorCituYW1lc3BhY2UgVjRfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY0XzAKKworbmFtZXNwYWNlIFY1XzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNV8wCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAppbmRleCBjOTY5ZTI4Li5iZDcxZGMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKQEAgLTEwOSw2ICsxMDksOSBAQAogICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgPSAwOwogCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgPSAwOworCiAgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pID0gMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGYzZWE4MjYuLjI1NjdiM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTEzNiw2ICsxMzYsOSBAQAogCiAgICAgICAgIC8vIG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZAogICAgICAgICAvLyB0LT5mcmFtZUNvdW50CisgICAgICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgICAgICB0LT5tSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1IYXB0aWNDaGFubmVsTWFzayk7CisgICAgICAgIGNoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CiAgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgIHQtPmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgQUxPR1ZfSUYoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCkBAIC0xNjIsNiArMTY1LDE1IEBACiAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTiwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1NaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgdC0+bVBsYXliYWNrUmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAgICAgLy8gaGFwdGljCisgICAgICAgIHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgdC0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHQtPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdC0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50OworICAgICAgICB0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IGZhbHNlOwogICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdC0+cHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTcxLDYgKzE4Myw4IEBACiAgICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKICAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CiAKICAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTE4NSwxMyArMTk5LDIwIEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOwogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAotICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLT5jaGFubmVsTWFzawotICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSAodHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaykKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHRyYWNrQ2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtaXhlckNoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CiAgICAgLy8gYWx3YXlzIHJlY29tcHV0ZSBmb3IgYm90aCBjaGFubmVsIG1hc2tzIGV2ZW4gaWYgb25seSBvbmUgaGFzIGNoYW5nZWQuCiAgICAgY29uc3QgdWludDMyX3QgdHJhY2tDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodHJhY2tDaGFubmVsTWFzayk7CiAgICAgY29uc3QgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJIYXB0aWNDaGFubmVsTWFzayk7CiAKICAgICBBTE9HX0FTU0VSVCgodHJhY2tDaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKQogICAgICAgICAgICAgJiYgdHJhY2tDaGFubmVsQ291bnQKQEAgLTIwMCw2ICsyMjEsMjQgQEAKICAgICB0cmFjay0+Y2hhbm5lbENvdW50ID0gdHJhY2tDaGFubmVsQ291bnQ7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisgICAgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzayA9IGhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID0gaGFwdGljQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IG1peGVySGFwdGljQ2hhbm5lbENvdW50OworCisgICAgaWYgKHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKyAgICB9CiAKICAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CiAgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQpAQCAtMjEyLDYgKzI1MSw5IEBACiAgICAgLy8gZG8gaXQgYWZ0ZXIgZG93bm1peCBzaW5jZSB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKICAgICB0cmFjay0+cHJlcGFyZUZvclJlZm9ybWF0KCk7CiAKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUobUZyYW1lQ291bnQpOworICAgIHRyYWNrLT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKwogICAgIGlmICh0cmFjay0+bVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIHJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLT5zYW1wbGVSYXRlOwpAQCAtMzM1LDkgKzM3Nyw4MiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKQoreworICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyIpOworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCit7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsIG91dENoYW5uZWxDb3VudDogJXUiLAorICAgICAgICAgICAgdGhpcywgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KTsKKyAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgIGlmIChtQWRqdXN0SW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE91dENoYW5uZWxDb3VudCkgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKQoreworICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlIik7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKHNpemVfdCBmcmFtZXMpCit7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCVwKSB3aXRoIGluQ2hhbm5lbENvdW50OiAldSwgIgorICAgICAgICAgICJvdXRDaGFubmVsQ291bnQ6ICV1LCBrZWVwQ29udHJhY3RlZENoYW5uZWxzOiAlZCIsCisgICAgICAgICAgICB0aGlzLCBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpOworICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKTsKKyAgICBpZiAobUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50KSB7CisgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IG1LZWVwQ29udHJhY3RlZENoYW5uZWxzCisgICAgICAgICAgICAgICAgPyAodWludDhfdCopbWFpbkJ1ZmZlciArIGZyYW1lcyAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxDb3VudCwgbU1peGVyRm9ybWF0KQorICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPyBtTWl4ZXJGb3JtYXQgOiBBVURJT19GT1JNQVRfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OmNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpCit7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBzdGF0aWNfY2FzdDxBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIqPigKKyAgICAgICAgICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+Y2xlYXJDb250cmFjdGVkRnJhbWVzKCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpCiB7CisgICAgLy8gY29uZmlndXJlIGZyb20gdXBzdHJlYW0gdG8gZG93bnN0cmVhbSBidWZmZXIgcHJvdmlkZXJzLgogICAgIGJ1ZmZlclByb3ZpZGVyID0gbUlucHV0QnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKTsKKyAgICB9CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKTsKKyAgICB9CiAgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKTsKQEAgLTUzMiw3ICs2NDcsOCBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIHRyYWNrQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KQEAgLTU0MSw2ICs2NTcsOSBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNQUlOX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC01NzAsMTYgKzY4OSwyOSBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tTWl4ZXJGb3JtYXQgIT0gZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLT5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19FTkFCTEVEOiB7CisgICAgICAgICAgICBjb25zdCBib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHRyYWNrOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgIH0KQEAgLTgxMywxNCArOTQ1LDE5IEBACiAgICAgaWYgKHRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlciA9PSBidWZmZXJQcm92aWRlcikgewogICAgICAgICByZXR1cm47IC8vIGRvbid0IHJlc2V0IGFueSBidWZmZXIgcHJvdmlkZXJzIGlmIGlkZW50aWNhbC4KICAgICB9Ci0gICAgaWYgKHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIC8vIHJlc2V0IG9yZGVyIGZyb20gZG93bnN0cmVhbSB0byB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXJzLgorICAgIGlmICh0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfSBlbHNlIGlmICh0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHRyYWNrLT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAodHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bUFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0KIAogICAgIHRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOwpAQCAtMTI2NCw4ICsxNDAxLDggQEAKIAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tncm91cFswXV07CiAgICAgICAgIG1lbXNldCh0LT5tYWluQnVmZmVyLCAwLAotICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50Ci0gICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJGb3JtYXQpKTsKIAogICAgICAgICAvLyBub3cgY29uc3VtZSBkYXRhCiAgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAppbmRleCA5MjE0NGQwLi40NzkxNDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaApAQCAtNTUsNiArNTUsMTEgQEAKICAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnJlc2V0KCk7CisgICAgICAgIG1JbkJ1ZmZlci5yZXNldCgpOworICAgIH0KKwogICAgIC8vIE1ha2UgYXZhaWxhYmxlIGtleSBkZXNpZ24gY3JpdGVyaWEgZm9yIHRlc3RpbmcKICAgICBpbnQgZ2V0SGFsZkxlbmd0aCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMubUhhbGZOdW1Db2VmczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAppbmRleCBhNzQxNjc3Li45YjcwYTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6YWNjKGNvZWYsIGRhdGEpOwogICAgIH0KICAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQsIFRPIGdhaW4pIHsKLSAgICAgICAgKm91dCsrID0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKKyAgICAgICAgKm91dCsrICs9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6dm9sdW1lKG91dCwgZ2Fpbik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IDMyMGI4Y2YuLjVhMDNhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAppbmRleCBkNjA1NjBiLi5iNzY0Y2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcApAQCAtMTcsOCArMTcsMTEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUHJvdmlkZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxzb25pYy5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgpAQCAtMzUsMTMgKzM4LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQogQ29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAogICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgogICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLApAQCAtNjMsNyArNTksOCBAQAogCiBDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQogewotICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIEFMT0dWKCIlcyglcCkgJXp1ICVwICVwIiwKKyAgICAgICAgICAgX19mdW5jX18sIHRoaXMsIG1CdWZmZXIuZnJhbWVDb3VudCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1Mb2NhbEJ1ZmZlckRhdGEpOwogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgewogICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgfQpAQCAtOTgsOCArOTUsOCBAQAogICAgICAgICBtQ29uc3VtZWQgPSAwOwogICAgIH0KICAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOwotICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOwotICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBzaXplX3QgY291bnQgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOwogICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CiAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OwogICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCkBAIC0xMzMsNiArMTMwLDE2IEBACiAgICAgbUNvbnN1bWVkID0gMDsKIH0KIAordm9pZCBDb3B5QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC00NzksNyArNDg2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRpbWUtc3RyZXRjaCB0aGUgZGF0YQotICAgICAgICBkc3RBdmFpbGFibGUgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOworICAgICAgICBkc3RBdmFpbGFibGUgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50IC0gbVJlbWFpbmluZywgb3V0cHV0RGVzaXJlZCk7CiAgICAgICAgIHNpemVfdCBzcmNBdmFpbGFibGUgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgIHByb2Nlc3NGcmFtZXMoKHVpbnQ4X3QqKW1Mb2NhbEJ1ZmZlckRhdGEgKyBtUmVtYWluaW5nICogbUZyYW1lU2l6ZSwgJmRzdEF2YWlsYWJsZSwKICAgICAgICAgICAgICAgICBtQnVmZmVyLnJhdywgJnNyY0F2YWlsYWJsZSk7CkBAIC01MjgsNiArNTM1LDE2IEBACiAgICAgbVJlbWFpbmluZyA9IDA7CiB9CiAKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgIEFMT0dWKCIlcyglcCk6IG1UcmFja0J1ZmZlclByb3ZpZGVyOiVwICBtQnVmZmVyLmZyYW1lQ291bnQ6JXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwLCBtVHJhY2tCdWZmZXJQcm92aWRlciwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBpZiAobVRyYWNrQnVmZmVyUHJvdmlkZXIgPT0gcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIocCk7Cit9CisKIHN0YXR1c190IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQogewogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC01NjcsNyArNTg0LDcgQEAKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gY3ljbGljYWxseSByZXBlYXQgdGhlIHNvdXJjZS4KICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IDA7IGNvdW50IDwgKmRzdEZyYW1lczsgY291bnQgKz0gKnNyY0ZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gbWluKCpzcmNGcmFtZXMsICpkc3RGcmFtZXMgLSBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBzdGQ6Om1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKWRzdEJ1ZmZlciArIG1GcmFtZVNpemUgKiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsIG1GcmFtZVNpemUgKiByZW1haW5pbmcpOwogICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYwOSw1ICs2MjYsODMgQEAKICAgICAgICAgfQogICAgIH0KIH0KKworQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcihhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHNpemVfdCBpbkNoYW5uZWxDb3VudCwgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShpbkNoYW5uZWxDb3VudCwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUob3V0Q2hhbm5lbENvdW50LCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSkKK3sKKyAgICBBTE9HVigiQWRqdXN0QnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICV6dSkiLAorICAgICAgICAgICAgdGhpcywgZm9ybWF0LCBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LCBmcmFtZUNvdW50KTsKK30KKwordm9pZCBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIGFkanVzdF9jaGFubmVscyhzcmMsIG1JbkNoYW5uZWxDb3VudCwgZHN0LCBtT3V0Q2hhbm5lbENvdW50LCBtU2FtcGxlU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICBmcmFtZXMgKiBtSW5DaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXMpOworfQorCitBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6OkFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvbnRyYWN0ZWRGb3JtYXQsIHNpemVfdCBjb250cmFjdGVkRnJhbWVDb3VudCwgdm9pZCogY29udHJhY3RlZEJ1ZmZlcikgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKHN0ZDo6bWF4KGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQpLCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShzdGQ6Om1heChpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50KSwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBjb250cmFjdGVkRnJhbWVDb3VudCksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbUluQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50KSwKKyAgICAgICAgbU91dENoYW5uZWxDb3VudChvdXRDaGFubmVsQ291bnQpLAorICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMoYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSwKKyAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQgLSBvdXRDaGFubmVsQ291bnQpLAorICAgICAgICBtQ29udHJhY3RlZEZvcm1hdChjb250cmFjdGVkRm9ybWF0KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZUNvdW50KGNvbnRyYWN0ZWRGcmFtZUNvdW50KSwKKyAgICAgICAgbUNvbnRyYWN0ZWRCdWZmZXIoY29udHJhY3RlZEJ1ZmZlciksCisgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcygwKQoreworICAgIEFMT0dWKCJBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICUjeCwgJXApIiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5DaGFubmVsQ291bnQsIG91dENoYW5uZWxDb3VudCwgY29udHJhY3RlZEZvcm1hdCwgY29udHJhY3RlZEJ1ZmZlcik7CisgICAgaWYgKG1Db250cmFjdGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgbUNvbnRyYWN0ZWRGcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNvbnRyYWN0ZWRDaGFubmVsQ291bnQsIG1Db250cmFjdGVkRm9ybWF0KTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBwQnVmZmVyKQoreworICAgIGNvbnN0IHNpemVfdCBvdXRGcmFtZXNMZWZ0ID0gbUNvbnRyYWN0ZWRGcmFtZUNvdW50IC0gbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgIGlmIChvdXRGcmFtZXNMZWZ0IDwgcEJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICAvLyBSZXN0cmljdCB0aGUgZnJhbWUgY291bnQgc28gdGhhdCB3ZSBkb24ndCB3cml0ZSBvdmVyIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gb3V0RnJhbWVzTGVmdDsKKyAgICB9CisgICAgcmV0dXJuIENvcHlCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyKTsKK30KKwordm9pZCBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXMoCisgICAgICAgIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwgbVNhbXBsZVNpemVJbkJ5dGVzLAorICAgICAgICAgICAgZnJhbWVzICogbUluQ2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzKTsKKyAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQgJiYgbUNvbnRyYWN0ZWRCdWZmZXIgIT0gTlVMTAorICAgICAgICAgICAgJiYgbUluQ2hhbm5lbENvdW50ID4gbU91dENoYW5uZWxDb3VudCkgeworICAgICAgICBjb25zdCBzaXplX3QgY29udHJhY3RlZElkeCA9IGZyYW1lcyAqIG1PdXRDaGFubmVsQ291bnQgKiBtU2FtcGxlU2l6ZUluQnl0ZXM7CisgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW1Db250cmFjdGVkQnVmZmVyICsgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICogbUNvbnRyYWN0ZWRGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRGb3JtYXQsICh1aW50OF90Kilkc3QgKyBjb250cmFjdGVkSWR4LCBtRm9ybWF0LAorICAgICAgICAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50ICogZnJhbWVzKTsKKyAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzICs9IGZyYW1lczsKKyAgICB9Cit9CisKK3ZvaWQgQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpCit7CisgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzID0gMDsKKyAgICBDb3B5QnVmZmVyUHJvdmlkZXI6OnJlc2V0KCk7Cit9CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAppbmRleCAwNTVmNzI0Li41MGNhMzNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTEwNCw4ICsxMDQsOCBAQAogICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcHIyKSB7CiAgICAgcmV0dXJuIGZhYnMocHIxLm1TcGVlZCAtIHByMi5tU3BlZWQpIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOX0RFTFRBICYmCiAgICAgICAgICAgIGZhYnMocHIxLm1QaXRjaCAtIHByMi5tUGl0Y2gpIDwgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBICYmCi0gICAgICAgICAgIHByMi5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgotICAgICAgICAgICBwcjIubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKKyAgICAgICAgICAgcHIxLm1TdHJldGNoTW9kZSA9PSBwcjIubVN0cmV0Y2hNb2RlICYmCisgICAgICAgICAgIHByMS5tRmFsbGJhY2tNb2RlID09IHByMi5tRmFsbGJhY2tNb2RlOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCmluZGV4IDlkMjljZjEuLmQ2MWVmZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcApAQCAtMzAsNiArMzAsMjYgQEAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9sb3VkbmVzc2VuaGFuY2VyLmg+CiAjaW5jbHVkZSAiZHNwL2NvcmUvZHluYW1pY19yYW5nZV9jb21wcmVzc2lvbi5oIgogCisvLyBCVUlMRF9GTE9BVCB0YXJnZXRzIGJ1aWxkaW5nIGEgZmxvYXQgZWZmZWN0IGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBpbnQxNl90IGVmZmVjdC4KKyNkZWZpbmUgQlVJTERfRkxPQVQKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisjZWxzZQorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCisjZW5kaWYgLy8gQlVJTERfRkxPQVQKKwogZXh0ZXJuICJDIiB7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIExFIGVmZmVjdApAQCAtODAsMTMgKzEwMCw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMRV9zZXRDb25maWcoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTEsNyArMTI0LDcgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0ga1Byb2Nlc3NGb3JtYXQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgcENvbnRleHQtPm1Db25maWcgPSAqcENvbmZpZzsKIApAQCAtMTU5LDcgKzE3Miw3IEBACiAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMTY3LDcgKzE4MCw3IEBACiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjg0LDE4ICsyOTcsNDEgQEAKIAogICAgIC8vQUxPR1YoIkxFIGFib3V0IHRvIHByb2Nlc3MgJWQgc2FtcGxlcyIsIGluQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICB1aW50MTZfdCBpbklkeDsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGNvbnN0ZXhwciBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7IC8vIHBvd2VyIG9mIDIgaXMgbG9zc2xlc3MgY29udmVyc2lvbiB0byBpbnQxNl90IHJhbmdlCisgICAgY29uc3RleHByIGZsb2F0IGludmVyc2VTY2FsZSA9IDEuZiAvIHNjYWxlOworICAgIGNvbnN0IGZsb2F0IGlucHV0QW1wID0gcG93KDEwLCBwQ29udGV4dC0+bVRhcmdldEdhaW5tQi8yMDAwLjBmKSAqIHNjYWxlOworI2Vsc2UKICAgICBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZik7CisjZW5kaWYKICAgICBmbG9hdCBsZWZ0U2FtcGxlLCByaWdodFNhbXBsZTsKICAgICBmb3IgKGluSWR4ID0gMCA7IGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQgOyBpbklkeCsrKSB7CiAgICAgICAgIC8vIG1ha2V1cCBnYWluIGlzIGFwcGxpZWQgb24gdGhlIGlucHV0IG9mIHRoZSBjb21wcmVzc29yCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgbGVmdFNhbXBsZSAgPSBpbnB1dEFtcCAqIGluQnVmZmVyLT5mMzJbMippbklkeF07CisgICAgICAgIHJpZ2h0U2FtcGxlID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHggKzFdOworICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOworICAgICAgICBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdICAgID0gbGVmdFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXSA9IHJpZ2h0U2FtcGxlICogaW52ZXJzZVNjYWxlOworI2Vsc2UKICAgICAgICAgbGVmdFNhbXBsZSAgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHhdOwogICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogKGZsb2F0KWluQnVmZmVyLT5zMTZbMippbklkeCArMV07CiAgICAgICAgIHBDb250ZXh0LT5tQ29tcHJlc3Nvci0+Q29tcHJlc3MoJmxlZnRTYW1wbGUsICZyaWdodFNhbXBsZSk7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeF0gICAgPSAoaW50MTZfdCkgbGVmdFNhbXBsZTsKICAgICAgICAgaW5CdWZmZXItPnMxNlsyKmluSWR4ICsxXSA9IChpbnQxNl90KSByaWdodFNhbXBsZTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorI2Vsc2UKICAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgewogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOwpAQCAtMzAzLDYgKzMzOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gTE9VRE5FU1NfRU5IQU5DRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKaW5kZXggNWM1N2M0My4uN2EzMmQzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKQEAgLTEyOSwxMSArMTI5LDE0IEBACiAgICAgICAgICJDb21tb24vbGliIiwKICAgICAgICAgIkJ1bmRsZS9saWIiLAogICAgIF0sCi0KKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1ESElHSEVSX0ZTIiwKKyAgICAgICAgIi1EU1VQUE9SVF9NQyIsCiAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAppbmRleCA0YzJiOTU0Li5jYzA2NmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApAQCAtMTk5LDggKzE5OSwxMCBAQAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgMjU2CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0jZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWREJFX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgNDA5NgogI2VuZGlmCiAKIHR5cGVkZWYgZW51bQpAQCAtMjE1LDggKzIxNywxMCBAQAogICAgIExWREJFX0ZTXzQ0MTAwID0gNywKICAgICBMVkRCRV9GU180ODAwMCA9IDgsCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgTFZEQkVfRlNfOTYwMDAgPSA5LAotICAgIExWREJFX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzg4MjAwID0gOSwKKyAgICBMVkRCRV9GU185NjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzE3NjQwMCA9IDExLAorICAgIExWREJFX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwpAQCAtMjU2LDYgKzI2MCw5IEBACiAgICAgTFZEQkVfVm9sdW1lX2VuICAgICAgICAgVm9sdW1lQ29udHJvbDsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWb2x1bWVkQjsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBIZWFkcm9vbWRCOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiAKIH0gTFZEQkVfUGFyYW1zX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAppbmRleCA0ZWNhZjE0Li44ZjA1OGU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCkBAIC01ODAsMTIgKzU4MCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTYzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0NDY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ0ODFmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzIwODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDkxNWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MzY2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTcyMzNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzIzN2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDU4OGYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgpAQCAtNjQyLDEyICs2NTQsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODc4NzFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzA1NDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzM1OWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMzgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM4OThmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzgyMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Njc5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY2ODVmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQwODZmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKQEAgLTcwMywxMiArNzI3LDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5MzU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTIxNTFmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE4MmYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTk4NGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyNzg5ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzMyMjRmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjA3NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MDgzZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczNTM5ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCkBAIC03NjQsMTIgKzgwMCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNDk3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4MTY4ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTA5NDRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MDk4NWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODg5MmYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkxNjgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI2MjlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTQ3MmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1NDgyZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyOTkyZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCkBAIC04MzEsMTIgKzg3OSwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA4MzFmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDgzMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODMyMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTgzMzhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc2MmYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzYyZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDYxZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODQ3N2YKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwNDE2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA0MTZmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTkxNjRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MTY5ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCkBAIC04OTIsMTIgKzk1MiwyNCBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTQ2ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMTQ2ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc2ODRmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc3MDhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTczZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTczZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTg4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg4NTNmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA1MjhmKQpAQCAtOTUzLDEyICsxMDI1LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMTY5M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE2OTNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2NTgyZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTY2MTVmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NTU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5Njg2MGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Njg5MWYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA4NDdmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODI5OGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODMwNmYKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA3NzhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc3OGYpCkBAIC0xMDE0LDEyICsxMDk4LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA4M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMDgzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NzkxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTgzNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTkxM2YpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MTM0ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjE3NGYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDQyZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNDJmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc5MDRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3OTE1ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwOTU4ZikKQEAgLTEwNDUsNyArMTE0MSw5IEBACiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTYyOGYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfQVRUQUNLX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDU4ZgogI2RlZmluZSBBR0NfQVRUQUNLX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NzEyZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTk5ZgogI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyODMwZgogI2VuZGlmCiAKQEAgLTEwNjIsNyArMTE2MCw5IEBACiAjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwN2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBBR0NfREVDQVlfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMzhmCiAjZGVmaW5lIEFHQ19ERUNBWV9GUzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzNWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMTg4ZgogI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxNzVmCiAjZW5kaWYKIApAQCAtMTEyNSw3ICsxMjI1LDkgQEAKICNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQ1MjVmCiAjZGVmaW5lIFZPTF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MTU4ZgogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBWT0xfVENfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjI2M2YKICNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTMxZgogI2RlZmluZSBWT0xfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTAzOWYKICNlbmRpZgogI2RlZmluZSBNSVhfVENfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTM2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODk2MTUxICovCkBAIC0xMTM4LDkgKzEyNDAsMTMgQEAKICNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwogI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4OTcwNCAqLworI2RlZmluZSBNSVhfVENfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQzMAogI2RlZmluZSBNSVhfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNTMwICovCisvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDgzOCAqLworI2RlZmluZSBNSVhfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjU5OAogI2RlZmluZSBNSVhfVENfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjYxMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyNTI0ICovCiAjZW5kaWYKIAogI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwppbmRleCBmZDQwMTZiLi4wYmEyYzg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAqIENhbGN1bGF0ZSB0aGUgdGFibGUgb2Zmc2V0cwogICAgICAqLwogICAgIExWTV9VSU5UMTYgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOwogI2VuZGlmCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKaW5kZXggM2ZmZjJhMi4uMjk0NjczNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCkBAIC05NSw3ICs5NSw3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7CiAjZWxzZQotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsgICAKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0NvZWZfdCk7CiAjZW5kaWYKICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA0ZTUyMDdmLi40MjI1YTMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTY0LDcgKzY0LDEyIEBACiAjZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLwogI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDMpCisjZWxzZQogI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICA2ICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZgogCiAjZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KICNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKaW5kZXggMTBlYTcwMC4uYzRkMzQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0yMSwxMSArMjEsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtc2V0CiAjaW5jbHVkZSAiTFZEQkUuaCIKICNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIkFHQy5oIgogI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE4Nyw0MiArMTg5LDQ5IEBACiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCiAgICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAogICAgIExWTV9GTE9BVCAqcE91dERhdGEsCi0gICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQorICAgIGNvbnN0IExWTV9VSU5UMTYgTnJGcmFtZXMpIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KIHsKLQogICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCi0gIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKLSAgTFZNX0ZMT0FUICpwTW9ubzsKLSAgTFZNX0lOVDMyIGlpID0gMDsKIAotICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7Ci0vLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKKyAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQorICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNlbHNlCisgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCi0gIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDYqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgcE1vbm8gPSAmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdOworICAvKiBTcGFjZSB0byBzdG9yZSBEQkUgcGF0aCBjb21wdXRhdGlvbiAqLworICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9CisgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7CiAKICAgLyoKLSAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YKKyAgICogTnJTYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoLgogICAgKi8KLSAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgIExWTV9GTE9BVCAqIGNvbnN0IHBNb25vID0gcFNjcmF0Y2ggKyBOclNhbXBsZXM7CisKKyAgLyoKKyAgICogVFJJQ0tZOiBwTW9ubyBpcyB1c2VkIGFuZCBkaXNjYXJkZWQgYnkgdGhlIERCRSBwYXRoLgorICAgKiAgICAgICAgIHNvIGl0IGlzIGF2YWlsYWJsZSBmb3IgdXNlIGZvciB0aGUgcFNjcmF0Y2hWb2wKKyAgICogICAgICAgICBwYXRoIHdoaWNoIGlzIGNvbXB1dGVkIGFmdGVyd2FyZHMuCisgICAqCisgICAqIFNwYWNlIHRvIHN0b3JlIFZvbHVtZSBDb250cm9sIHBhdGggY29tcHV0YXRpb24uCisgICAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHBNb25vIChzZWUgVFJJQ0tZIGNvbW1lbnQpLgorICAgKi8KKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2hWb2wgPSBwTW9ubzsKKworICAvKgorICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCisgICAqLworICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCiAgIHsKLSAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOworICAgIHJldHVybiBMVkRCRV9UT09NQU5ZU0FNUExFUzsKICAgfQogCiAgIC8qCi0gICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gRmxvYXQKLSAgICovCi0gIENvcHlfRmxvYXQocEluRGF0YSwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgICBwU2NyYXRjaF9pbiwgLyogRGVzdC4gMzItYml0IGRhdGEgICAgICovCi0gICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAgICAgICAgKi8KLQotICBmb3IgKGlpID0gMDsgaWkgPCAyICogTnVtU2FtcGxlczsgaWkrKykgewotICAgIHBTY3JhdGNoW2lpXSA9IHBTY3JhdGNoX2luW2lpXTsKLSAgfQotICAvKgogICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKICAgICovCiAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCkBAIC0yMzAsNTAgKzIzOSw4MSBAQAogICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkKICAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCiAgIHsKKyAgICAvLyBtYWtlIGNvcHkgb2YgaW5wdXQgZGF0YQorICAgIENvcHlfRmxvYXQocEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKICAgICAgKi8KICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLworICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLworICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICB9CiAKICAgICAvKgogICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KICAgICAgKi8KLSAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTb3VyY2UgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KICAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KICAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgQUdDIGFuZCBtaXgKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KKyAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICovCisgICAgICAgIE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzICAgICAqLworICAgICAgICBOckNoYW5uZWxzKTsgLyogTnVtYmVyIG9mIGNoYW5uZWxzICAgICAqLworI2Vsc2UKICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KICAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICBOckZyYW1lcyk7CisjZW5kaWYKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7CisgICAgZm9yIChMVk1fSU5UMzIgaWkgPSAwOyBpaSA8IE5yU2FtcGxlczsgKytpaSkgewogICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KLSAgICAgIGlmKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKKyAgICAgIGlmIChwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CiAgICAgICAgIHBTY3JhdGNoW2lpXSA9IC0xLjA7Ci0gICAgICB9IGVsc2UgaWYocFNjcmF0Y2hbaWldID4gMS4wKSB7CisgICAgICB9IGVsc2UgaWYgKHBTY3JhdGNoW2lpXSA+IDEuMCkgewogICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CiAgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIC8vIGNsZWFyIERCRSBwcm9jZXNzZWQgcGF0aAorICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOwogICB9CiAKICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwpAQCAtMjg2LDIxICszMjYsNDAgQEAKICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgogICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCiAgICAgICovCi0gICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcFNjcmF0Y2hfaW4sCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcEluRGF0YSwKICAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIExlZnQgYW5kIHJpZ2h0LCByZWFsbHkgIyBzYW1wbGVzICovCisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKICAgfQogCiAgIC8qCiAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAogICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIHBTY3JhdGNoLAorICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAogICAgICAgcFNjcmF0Y2gsCiAgICAgICBwU2NyYXRjaFZvbCwKICAgICAgIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKLQotICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisjZW5kaWYKKyAgcmV0dXJuIExWREJFX1NVQ0NFU1M7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwppbmRleCBjNGE5YjE0Li5hMmNlNDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC04OCwxMSArODgsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKQEAgLTE0NywxMSArMTU3LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCkBAIC0yMDcsMTEgKzIyNywyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLApAQCAtMjY5LDExICsyOTksMjEgQEAKIAogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7SFBGX0ZzODgyMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzkwX0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjOTBfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMCwKQEAgLTMyMCw5ICszNjAsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAge0JQRl9Gczg4MjAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IyLAorICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjF9LAogICAgICB7QlBGX0ZzOTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgICB7QlBGX0ZzMTc2NDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjIsCisgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAogICAgICB7QlBGX0ZzMTkyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKQEAgLTM1Nyw5ICs0MDMsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCkBAIC0zOTQsOSArNDQ2LDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjF9LApAQCAtNDMyLDkgKzQ5MCwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0JQRl9Gczg4MjAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzkwX0IxfSwKICAgICB7QlBGX0ZzOTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMiwKICAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnMxOTIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjF9CkBAIC00NjYsNyArNTMwLDkgQEAKICAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCiAgICAgQUdDX0FUVEFDS19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLEFHQ19BVFRBQ0tfRnM4ODIwMAogICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKKyAgICAsQUdDX0FUVEFDS19GczE3NjQwMAogICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCiAjZW5kaWYKIApAQCAtNDg4LDcgKzU1NCw5IEBACiAgICAgQUdDX0RFQ0FZX0ZzNDQxMDAsCiAgICAgQUdDX0RFQ0FZX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0RFQ0FZX0ZzODgyMDAKICAgICAsQUdDX0RFQ0FZX0ZTOTYwMDAKKyAgICAsQUdDX0RFQ0FZX0ZzMTc2NDAwCiAgICAgLEFHQ19ERUNBWV9GUzE5MjAwMAogI2VuZGlmCiAKQEAgLTU4Myw3ICs2NTEsOSBAQAogICAgIFZPTF9UQ19GczQ0MTAwLAogICAgIFZPTF9UQ19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLFZPTF9UQ19Gczg4MjAwCiAgICAgLFZPTF9UQ19Gczk2MDAwCisgICAgLFZPTF9UQ19GczE3NjQwMAogICAgICxWT0xfVENfRnMxOTIwMDAKICNlbmRpZgogfTsKQEAgLTYwMiw3ICs2NzIsOSBAQAogICAgIE1JWF9UQ19GczQ0MTAwLAogICAgIE1JWF9UQ19GczQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgLE1JWF9UQ19Gczg4MjAwCiAgICAgLE1JWF9UQ19Gczk2MDAwCisgICAgLE1JWF9UQ19GczE3NjQwMAogICAgICxNSVhfVENfRnMxOTIwMDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IDliNmRhMzEuLjgzZWNhZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC0yOTYsNiArMjk2LDkgQEAKICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBwYXJhbWV0ZXJzIENvbnRyb2wgKi8KICAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0VuYWJsZTsKICAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gICAgICAgUFNBX1BlYWtEZWNheVJhdGU7ICAgICAgLyogUGVhayB2YWx1ZSBkZWNheSByYXRlKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIAogfSBMVk1fQ29udHJvbFBhcmFtc190OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwppbmRleCAwYTNjMzBlLi4zNzI3MmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsOCArNjQsMTEgQEAKICAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CiAgICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZWxzZQogICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKQEAgLTIwNyw4ICsyMTIsNyBAQAogICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKICAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0yOwotCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCkBAIC00OTksNyArNTAzLDcgQEAKICAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKQogICAgICAgICB7CiAgICAgICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKnBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwogICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgdGhlIG51bWJyIG9mIHNhbXBsZXMgdG8gb3V0cHV0ICovCkBAIC03NTAsNyArNzU0LDExIEBACiAgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CiAgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CiAgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNkZWZpbmUgRnJhbWVDb3VudCBTYW1wbGVDb3VudAorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcG9pbnRlcnMKQEAgLTc1OCw3ICs3NjYsNiBAQAogICAgIE51bVNhbXBsZXMgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7CiAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOwogCi0KICAgICAvKgogICAgICAqIGNoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKICAgICAgICovCkBAIC03ODYsMTQgKzc5MywyNSBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIG91dHB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFNhbXBsZXMgbGVmdCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbmQgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCkBAIC04MDMsMjMgKzgyMSw0MCBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbHNlCiAgICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKKyNlbHNlCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgIH0KICAgICB9CkBAIC04MzYsMTMgKzg3MSwyMyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgICAgICArPSBOckNoYW5uZWxzICogRnJhbWVDb3VudDsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgfQpAQCAtODUxLDE0ICs4OTYsMjUgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBTdGFydCAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLwogICAgICAgICAgICAgcERlc3QgICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KICAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KICAgICAgICAgfQpAQCAtODcwLDkgKzkyNiwxNiBAQAogICAgICAqLwogICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2Vsc2UKICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbmRpZgogICAgICAgICAvKiBVcGRhdGUgdGhlIGJ1ZmZlciBjb3VudCAqLwogICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgKyBTYW1wbGVDb3VudCk7CiAgICAgfQpAQCAtMTA2MywxNCArMTEyNiwyNCBAQAogewogCiAgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9MjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyN1bmRlZiBOckZyYW1lcworI2RlZmluZSBOckZyYW1lcyAoKnBOdW1TYW1wbGVzKSAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2Vsc2UKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKyNlbmRpZgogCiAKICAgICAvKgogICAgICAqIFVwZGF0ZSBzYW1wbGUgY291bnRzCiAgICAgICovCiAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIE51bUNoYW5uZWxzKTsgLyogVXBkYXRlIHRoZSBJL08gcG9pbnRlcnMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKE5yRnJhbWVzICogTnVtQ2hhbm5lbHMpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogMik7CisjZW5kaWYKICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggOGMwNDg0Ny4uYmFiNDA0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtNDg3LDYgKzQ4Nyw5NyBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAogI2lmZGVmIEhJR0hFUl9GUworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA4ODIwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDM3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NDEyNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwMDI2NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDcxNDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxOTA3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NjU5NTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ1MjM4MGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45OTkyNjNmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwMTk1M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDg4MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc2OTc3N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMTY2NTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODA3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41MDQ5NjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2OTM1NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MTYyMzhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwNjQxMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMyOTVmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjcyMzk1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4yMTkyNzdmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTcwODMyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41MTc3MTRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzA1Njg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44NTI1NjZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjgxMzk0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4yMjgyNzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTAyOTQ3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy42NDk4MzBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTc1OTM4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4xMjI4MjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDk2MDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwpAQCAtNTgwLDYgKzY3MSw5OCBAQAogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTc2NDAwICovCisvKiBHYWluID0gMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNjcxMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODU1ODA3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI2NDQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzU1MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjA3ODRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEwOTg4MGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTUxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjYwNjEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgwNjQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40Mjk3MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS44NzA0MDVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYxOTUwMWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MzMyMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODMyNDE3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzIyMjE3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wNzEzMTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41OTAyNjNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzOTM1OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODkxMDE2ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjQwMTEyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yMjg0NjVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi45Nzc1NjFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYwNzA5MGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjM1NjE4NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDMxOTE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNzgxMDEwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41MDg1NzVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4yNTc2NzFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA1LjA0MzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljc5MjQ5M2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTkyMDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNzgyMwpAQCAtMTIxNiw0ICsxMzk5LDQgQEAKIAogCiAjZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKaW5kZXggY2ZlNTNiOC4uNjJiNGM3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgogI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5LDE4ICs3MSwyOSBAQAogICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAogI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKICNlbmRpZgorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSB8fAorI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgfHwKKyNlbmRpZgogICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCiAgICAgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9IHBQYXJhbXMtPk5yQ2hhbm5lbHM7CisjZW5kaWYKICAgICAvKgogICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCiAgICAgICovCkBAIC01NjksNiArNTgyLDEwIEBACiAgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgIChDb3VudCA+IDApKTsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCisKICAgICAvKiBDbGVhciBhbGwgaW50ZXJuYWwgZGF0YSBpZiBmb3JtYXQgY2hhbmdlKi8KICAgICBpZihMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KQogICAgIHsKQEAgLTcxOSw2ICs3MzYsOSBAQAogICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOwogICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOwogICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgREJFX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwpAQCAtNzc1LDcgKzc5NSw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9NT05PSU5TVEVSRU87ICAgICAvKiBGb3JjZSB0byBNb25vLWluLVN0ZXJlbyBtb2RlICovCiAgICAgICAgIH0KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgRVFOQl9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCkBAIC04NDksNyArODcxLDkgQEAKICAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKICAgICAgICAgQ1NfUGFyYW1zLlJldmVyYkxldmVsID0gTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbDsKICAgICAgICAgQ1NfUGFyYW1zLkVmZmVjdExldmVsID0gTG9jYWxQYXJhbXMuQ1NfRWZmZWN0TGV2ZWw7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENTX1BhcmFtcy5OckNoYW5uZWxzICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKaW5kZXggMjZjMWM0Zi4uMDY2OWE4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCkBAIC0yMzMsNyArMjMzLDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMjcwLDcgKzI3NiwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTU4NCw4ICs1OTYsMTEgQEAKICAgICAvKgogICAgICAqIERDIHJlbW92YWwgZmlsdGVyCiAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKyNlbHNlCiAgICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogVHJlYmxlIEVuaGFuY2VtZW50CkBAIC03NDQsNyArNzU5LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtODAyLDcgKzgyMywxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTEwMzksNyArMTA2NiwxMSBAQAogICAgIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhoSW5zdGFuY2UsICZIZWFkcm9vbVBhcmFtcyk7CiAKICAgICAvKiBEQyByZW1vdmFsIGZpbHRlciAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZWxzZQogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKyNlbmRpZgogCiAgICAgcmV0dXJuIExWTV9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggYjQ1MzIyMi4uMTlkMTUzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0xNDQsMTIgKzE0NCwxOSBAQAogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlcltMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisjZWxzZQogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogT3V0cHV0IGJ1ZmZlciBkZWxheSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLwpAQCAtMjgyLDYgKzI4OSwxMCBAQAogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOb1Ntb290aFZvbHVtZTsgICAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBzbW9vdGggdm9sdW1lIGNoYW5nZXMqLwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgorCiB9IExWTV9JbnN0YW5jZV90OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCmluZGV4IDRhMTlhMTMuLjk0YmEyNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwpAQCAtNjUsNiArNjUsMTAgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOwogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICBOckNoYW5uZWxzICA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgU2FtcGxlQ291bnQgIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KQEAgLTExMiw2ICsxMTYsMTAgQEAKICAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKICAgICB7CiAgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAvKiBVcGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIE5yQ2hhbm5lbHMgZnJvbSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgdmFsdWUgKi8KKyAgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKICAgICAgICAgewpAQCAtMTMwLDYgKzEzOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwogICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7CiAgICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIE5yQ2hhbm5lbHMgPSAyOworI2VuZGlmCiAgICAgfQogCiAKQEAgLTE1Myw3ICsxNjQsNiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCiAgICAgICAgIHsKLQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAogICAgICAgICAgICAgICovCkBAIC0xNzEsMTAgKzE4MSwxOCBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCiAgICAgICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbmRpZgogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCkBAIC0yMjEsMjAgKzIzOSwzMyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKyNlbmRpZgogCiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgLyogVE9ETyAtIE11bHRpY2hhbm5lbCBzdXBwb3J0IHRvIGJlIGFkZGVkICovCisgICAgICAgICAgICBpZiAoTnJDaGFubmVscyA9PSAyKQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCkBAIC0yNDIsMjggKzI3MywzOSBAQAogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjZW5kaWYKIAotICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKKyAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogREMgcmVtb3ZhbAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLQotCisjZW5kaWYKICAgICAgICAgfQotCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAgICAgKi8KQEAgLTQ5Nyw0ICs1MzksNCBAQAogCiAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKIH0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCmluZGV4IDE5OWRkZGUuLmE1MzU2ZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKQEAgLTI2OSw2ICsyNjksNTMgQEAKICAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgLyogODhrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTVfQjF9LAorCiAgICAgICAgICAgICAgICAgICAgIC8qIDk2a0h6IHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwogICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMV9BMCwKQEAgLTMxNiw2ICszNjMsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwLAogICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE1X0IxfSwKIAorICAgICAgICAgICAgICAgICAgICAvKiAxNzZrSHogU2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTVfQjF9LAorCiAgICAgICAgICAgICAgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCiAgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCiAgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMV9BMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKaW5kZXggOWEzZDM1ZC4uMDZlNzQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKQEAgLTc4LDYgKzc4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDNlZTdmNjMuLjAxNTM5YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0zMCw4ICszMCwxNyBAQAogI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBUaGUgbWVtb3J5IHJlZ2lvbiBjcmVhdGVkIGJ5IHRoaXMgc3RydWN0dXJlIGluc3RhbmNlIGlzIHR5cGVjYXN0CisgICAgICogaW50byBhbm90aGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGEgcG9pbnRlciBhbmQgYW4gYXJyYXkgb2YgZmlsdGVyCisgICAgICogY29lZmZpY2llbnRzLiBJbiBvbmUgY2FzZSB0aGlzIG1lbW9yeSByZWdpb24gaXMgdXNlZCBmb3Igc3RvcmluZworICAgICAqIERDIGNvbXBvbmVudCBvZiBjaGFubmVscworICAgICAqLworICAgIExWTV9GTE9BVCAqcFN0b3JhZ2U7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbTFZNX01BWF9DSEFOTkVMU107CisjZWxzZQogICAgIExWTV9GTE9BVCBTdG9yYWdlWzZdOwotCisjZW5kaWYKIH0gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE3OSw3ICsxODgsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBMVk1fTUFYX0NIQU5ORUxTIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDIpIF07CisjZWxzZQorICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisjZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE5NywxMiArMjExLDE3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyogTFZNX01BWF9DSEFOTkVMUywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbIChMVk1fTUFYX0NIQU5ORUxTICogNCkgXTsKKyNlbHNlCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogNCkgXTsgIC8qIFR3byBjaGFubmVscywgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisjZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QKQEAgLTM2Niw2ICszODUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKQEAgLTQzNCw2ICs0NjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLApAQCAtNTI3LDYgKzU2MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLApAQCAtNTQwLDEyICs1ODAsMjIgQEAKIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOworCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVGltZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCmluZGV4IDgxZTI4OGMuLmE3NjM1NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCkBAIC00NCw3ICs0NCwxNSBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOworICAgIC8qCisgICAgICogVGhlIG1lbW9yeSBhcmVhIGNyZWF0ZWQgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgaW50ZXJuYWxseQorICAgICAqIHR5cGVjYXN0IHRvIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgYW5kIHVzZWQuCisgICAgICogVGhlIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3Qgc3RydWN0dXJlIGhhcyAzIHBvaW50ZXIgdHlwZSBlbGVtZW50cworICAgICAqIDIgZWxlbWVudHMgb2YgdHlwZSBMVk1fSU5UMzIgYW5kIG9uZSBlbGVtZW50IG9mIHR5cGUgTFZNX0lOVDE2LgorICAgICAqIElub3JkZXIgdG8gY2F0ZXIgYm90aCAzMiBhbmQgNjQgYml0IGJ1aWxkcywgU3RvcmFnZSBhcnJheSBzaG91bGQKKyAgICAgKiBoYXZlIGEgbWluaW11bSBvZiA5IGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyLgorICAgICAqLworICAgIExWTV9JTlQzMiBTdG9yYWdlWzldOwogCiB9IExWTV9UaW1lcl9JbnN0YW5jZV90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IGVhMTYwNzIuLjU5NTg2ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC0xMjIsNiArMTIyLDEyIEBACiAKICNlbmRpZiAvLyBOQVRJVkVfRkxPQVRfQlVGRkVSCiAKKyNpZmRlZiBTVVBQT1JUX01DCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgOCAvLyBGQ0NfOAorI2Vsc2UKKyNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyAyIC8vIEZDQ18yCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTQzLDYgKzE0OSw5IEBACiAgICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCiAgICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCiAgICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9NVUxUSUNIQU5ORUwgICAgPSAzLAorI2VuZGlmCiAgICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCiB9IExWTV9Gb3JtYXRfZW47CiAKQEAgLTE2MCw4ICsxNjksMTAgQEAKICAgICBMVk1fRlNfNDQxMDAgPSA3LAogICAgIExWTV9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZTXzk2MDAwID0gOSwKLSAgICBMVk1fRlNfMTkyMDAwID0gMTAsCisgICAgTFZNX0ZTXzg4MjAwID0gOSwKKyAgICBMVk1fRlNfOTYwMDAgPSAxMCwKKyAgICBMVk1fRlNfMTc2NDAwID0gMTEsCisgICAgTFZNX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAogICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMGJhMjBhMy4uNzQ2OGE5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtNDcsNiArNDcsMTYgQEAKIHZvaWQgQ29weV9GbG9hdCggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7Cit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTE4MSw2ICsxOTEsMTIgQEAKIHZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMzIoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwppbmRleCBmYTlmMDFmLi41Yzg2NTVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwpAQCAtMzA1LDQgKzMwNSwxNTAgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1jU3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KKy8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1jU3JjICAgICAgICAgICAgICAgICAgTXVsdGljaGFubmVsIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTW9ub1NyYyAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBEc3QgICAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJGcmFtZXMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOckNoYW5uZWxzICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTWNTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKworICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaSwgamo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgdmFsdWUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KKworCisgICAgLyoKKyAgICAgKiBJbnN0YW5jZSBjb250cm9sIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19HYWluICAgICAgPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19NYXhHYWluICAgPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAgICAgIC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIC8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19EZWNheSAgICAgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7CisgICAgTFZNX0ZMT0FUICAgICAgQUdDX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgICAgICAgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfQ3VycmVudCAgID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAgICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgYmFzaXMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTnJGcmFtZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggZnJhbWUgKi8KKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBzY2FsZXJzCisgICAgICAgICAqLworICAgICAgICBBR0NfTXVsdCAgICA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgICAgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7ICAgICAgICAgICAvKiBHZXQgdGhlIHZvbHVtZSBnYWluICovCisKKyAgICAgICAgQWJzUGVhayA9IDAuMGY7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgU2FtcGxlVmFsICA9ICpwTWNTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgc2FtcGxlIHZhbHVlIG9mIGpqIENoYW5uZWwqLworICAgICAgICAgICAgTW9ubyAgICAgICA9ICpwTW9ub1NyYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIGlucHV0IHNpZ25hbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSBTYW1wbGVWYWwgICogVm9sX011bHQ7CisKKyAgICAgICAgICAgICpwRHN0KysgPSBTYW1wbGVWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFic1BlYWsgPSBBYnNfRmxvYXQoU2FtcGxlVmFsKSA+IEFic1BlYWsgPyBBYnNfRmxvYXQoU2FtcGxlVmFsKSA6IEFic1BlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gbGFyZ2Ugc28gZGVjcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQUdDX0dhaW4gPSBBR0NfR2FpbiAqIEFHQ19BdHRhY2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gc21hbGwgc28gaW5jcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gLT0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gKz0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcE1vbm9TcmMrKzsKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KICNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IDk2MGRlNzkuLmQ2MzM2NWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMTIzLDYgKzEyMyw4NyBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMQorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzIC0gMV0gaXMgeChuLTEpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVscyAtIDFdIGlzIHkobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIENIQU5ORUwtV0lTRQorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB5biA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEExICAqIHgobi0xKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEEwICAqIHgobikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMSAgKiB5KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLworICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZiAvKlNVUFBPUlRfTUMqLworCiAjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCmluZGV4IGU0ODkwMzEuLjFmOWY2NTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKQEAgLTg0LDUgKzg0LDY1IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLy8gRXh0cmFjdCBvdXQgdGhlIHN0ZXJlbyBjaGFubmVsIHBhaXIgZnJvbSBtdWx0aWNoYW5uZWwgc291cmNlLgordm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBpZiAoTnJDaGFubmVscyA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgICAgICBkc3QgKz0gMjsKKyAgICAgICAgICAgIHNyYyArPSBOckNoYW5uZWxzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKE5yQ2hhbm5lbHMgPT0gMSkKKyAgICB7ICAgLy8gbm90IGV4cGVjdGVkIHRvIG9jY3VyLCBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzLgorICAgICAgICBzcmMgKz0gKE5yRnJhbWVzIC0gMSk7CisgICAgICAgIGRzdCArPSAyICogKE5yRnJhbWVzIC0gMSk7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0IC09IDI7CisgICAgICAgICAgICBzcmMgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIE1lcmdlIGEgbXVsdGljaGFubmVsIHNvdXJjZSB3aXRoIHN0ZXJlbyBjb250YWluZWQgaW4gZHN0LCB0byBkc3QuCit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fRkxPQVQgKnNyY19zdCA9IGRzdCArIDIgKiAoTnJGcmFtZXMgLSAxKTsKKworICAgIC8vIHJlcGFjayBkc3Qgd2hpY2ggY2FycmllcyBzdGVyZW8gaW5mb3JtYXRpb24KKyAgICAvLyB0b2dldGhlciB3aXRoIHRoZSB1cHBlciBjaGFubmVscyBvZiBzcmMuCisgICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBzcmMgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsKKyAgICAgICAgZHN0WzFdID0gc3JjX3N0WzFdOworICAgICAgICBmb3IgKGpqID0gMjsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbampdID0gc3JjW2pqXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjICAgIC09IE5yQ2hhbm5lbHM7CisgICAgICAgIHNyY19zdCAtPSAyOworICAgIH0KK30KKyNlbmRpZgogI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCmluZGV4IGQyNjFjOWUuLjEzZmFjNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICBSaWdodERDID0gcEJpcXVhZFN0YXRlLT5SaWdodERDOwogICAgICAgICBmb3IoaiA9IE5yU2FtcGxlcy0xOyBqID49IDA7IGotLSkKICAgICAgICAgewotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLwogICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChMZWZ0REMpOwogICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CiAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KQEAgLTY0LDYgKzY0LDU4IEBACiAKIAogICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxCisgKgorICogREVTQ1JJUFRJT046CisgKiAgREMgcmVtb3ZhbCBmcm9tIGFsbCBjaGFubmVscyBvZiBhIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcEluc3RhbmNlICAgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHBEYXRhSW4gICAgICAgIElucHV0L1NvdXJjZQorICogIHBEYXRhT3V0ICAgICAgIE91dHB1dC9EZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgKkNoREM7CisgICAgICAgIExWTV9GTE9BVCBEaWZmOworICAgICAgICBMVk1fSU5UMzIgajsKKyAgICAgICAgTFZNX0lOVDMyIGk7CisgICAgICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMpIHBJbnN0YW5jZTsKKworICAgICAgICBDaERDID0gJnBCaXF1YWRTdGF0ZS0+Q2hEQ1swXTsKKyAgICAgICAgZm9yIChqID0gTnJGcmFtZXMgLSAxOyBqID49IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCisgICAgICAgICAgICBmb3IgKGkgPSBOckNoYW5uZWxzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlmZiA9ICoocERhdGFJbisrKSAtIChDaERDW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSAtPSBEQ19GTE9BVF9TVEVQOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENoRENbaV0gKz0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgogI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwppbmRleCA0ZjRmY2Q4Li4wZjk0MWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0yNCw2ICsyNCwxNyBAQAogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworICAgIExWTV9JTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspCisgICAgeworICAgICAgICBwQmlxdWFkU3RhdGUtPkNoRENbaV0gPSAwLjBmOworICAgIH0KK30KKyNlbmRpZgogI2Vsc2UKIHZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGZhNmI3MjkuLmRiM2E2ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTM0LDYgKzM0LDEzIEBACiAgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLwogfUZpbHRlcl9GTE9BVF9TdGF0ZTsKIHR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7CisjaWZkZWYgU1VQUE9SVF9NQwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18KK3sKKyAgICBMVk1fRkxPQVQgIENoRENbTFZNX01BWF9DSEFOTkVMU107ICAgICAvKiBDaGFubmVsREMgICovCit9IEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jICogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyA7CisjZW5kaWYKICNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCmluZGV4IDE5MjkyN2MuLjJhNTBmMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKQEAgLTExNyw2ICsxMTcsOTMgQEAKICAgICAgICAgfQogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVNTVU1QVElPTlM6CitDT0VGUy0KK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQorCitQQVJBTUVURVJTOgorIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQorIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCisgcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KKyBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscworCitSRVRVUk5TOgorIHZvaWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW47CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBjaDsKKyAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOworICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOworCisKKworCisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCisgICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKKworICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCisgICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCisgICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSBUZW1wOworCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwRGVsYXlzWzFdID0geW47IC8vIFVwZGF0ZSB5KG4tMSkKKyAgICAgICAgICAgICAgICBwRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgICAgICBpZiAoeW4gPiAxLjBmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW4gPSAxLjBmOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeW4gPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICB5biA9IC0xLjBmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bjsKKyAgICAgICAgICAgICAgICBwRGVsYXlzICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRGVsYXlzIC09IE5yQ2hhbm5lbHMgKiAyOworICAgICAgICB9CisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IGFjMWVlYTguLmQwMmFmODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC02OCw1ICs2OCw0NyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0CisgKgorICogREVTQ1JJUFRJT046CisgKiAgQ3JlYXRlcyBhIG1vbm8gc3RyZWFtIGZyb20gYSBtdWx0aWNoYW5uZWwgaW5wdXQgdGFraW5nIHRoZSBhdmVyZ2FlIG9mCisgKiAgc2FtcGxlIHZhbHVlcyBvZiBhbGwgY2hhbm5lbHMKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gMC4wZjsKKyAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcCArPSAoKnNyYyk7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgfQorICAgICAgICAqZHN0ID0gVGVtcCAvIE5yQ2hhbm5lbHM7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgorCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggZDI2OTRjYy4uNDE5YzdjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCiB7CiAKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwpAQCAtMTE0LDYgKzExNCwxMzkgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKK3sKKworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIC8qCisgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KKyAgICAgKiBTbyB0d28gZnJhbWVzIGFyZSBwcm9jZXNzZWQgaW4gb25lIGl0ZXJhdGlvbiBhbmQKKyAgICAgKiB0aGUgbG9vcCB3aWxsIHJ1biBvbmx5IGZvciBoYWxmIHRoZSBOckZyYW1lcyB2YWx1ZSB0aW1lcy4KKyAgICAgKi8KKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyA+PiAxKTsKKyAgICAvKiBPdXRMb29wIGlzIGNhbGN1bGF0ZWQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIE5yRnJhbWVzIHZhbHVlIGNhbiBiZSBvZGQuKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgLSAoSW5Mb29wIDw8IDEpKTsKKworICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKK30KKworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCmluZGV4IGI1ZTdmNWMuLjViZmRhZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKQEAgLTI3LDEwICsyNywxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCiB7CiAgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKICAgICBMVk1fSU5UMTYgICBJbkxvb3A7CkBAIC0xMDUsNiArMTA1LDExOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KKworCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YT0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIC8qCisgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KKyAgICAgKiBTbyB0d28gZnJhbWVzIGFyZSBwcm9jZXNzZWQgaW4gb25lIGl0ZXJhdGlvbiBhbmQKKyAgICAgKiB0aGUgbG9vcCB3aWxsIHJ1biBvbmx5IGZvciBoYWxmIHRoZSBOckZyYW1lcyB2YWx1ZSB0aW1lcy4KKyAgICAgKi8KKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyA+PiAxKTsKKyAgICAvKiBPdXRMb29wIGlzIGNhbGN1bGF0ZWQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIE5yRnJhbWVzIHZhbHVlIGNhbiBiZSBvZGQuKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgLSAoSW5Mb29wIDw8IDEpKTsKKworICAgIGlmIChDdXJyZW50PFRhcmdldCkgeworICAgICAgICBpZiAoT3V0TG9vcCkgeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworCisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OworfQorI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggMTkyZjEyNi4uNjU5NTZmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTM0LDEwICszNCwxMCBAQAogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CiAgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKQEAgLTEwNiw2ICsxMDYsMTEwIEBACiAgICAgfQogCiB9CisKKworCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApIHsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZgorCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKaW5kZXggMTAxN2RlMy4uMDY3OGFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0xMDMsNiArMTAzLDEwMSBAQAogICAgICAgICB9CiAgICAgfQogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBGcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKaW5kZXggM2M5MDA3MS4uOGE4OWRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMSArMjYsMTEgQEAKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQogewogICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKQEAgLTY3LDYgKzY3LDcwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIDIgc3RyZWFtIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMxICAgICAgICAgICBGaXJzdCBtdWx0aWNoYW5uZWwgc291cmNlCisgKiAgc3JjMiAgICAgICAgICAgU2Vjb25kIG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICB9Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAqc3JjMSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggZjkwNDkxNS4uN2YxODc0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTE1NywxMCArMTU3LDE4IEBACiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTY5LDEwICsxNzcsMTggQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTgxLDExICsxOTcsMTkgQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMSwKQEAgLTIwMCwxMCArMjI0LDEwIEBACiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwppbmRleCBjNjc0NTVhLi41MDdlZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCkBAIC0zNSw3ICszNSw3IEBACiB7CiAgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIAorCiAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgogICAgIHJldHVybiBUYXJnZXRHYWluOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKaW5kZXggZDBkMGUxZi4uZjEwMDk0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCkBAIC02Miw2ICs2MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKQEAgLTczLDYgKzgwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKaW5kZXggOWMxN2EwNS4uNmM4YjJkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCkBAIC0xMTksNiArMTE5LDgwIEBACiAgICAgICAgIH0KIAogICAgIH0KKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorREVMQVlTLQorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAtIDFdIGlzIHgobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzIC0gMV0gaXMgeChuLTIpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVscyAtIDFdIGlzIHkobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1s0Kk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5biwgeW5PLCB0ZW1wOworICAgICAgICBMVk1fSU5UMTYgaWksIGpqOworICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgamogQ0hBTk5FTAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiB5bj0gKEEwICAqICh4KG4pIC0geChuLTIpKSkqLworICAgICAgICAgICAgICAgIHRlbXAgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKyBqal07CisgICAgICAgICAgICAgICAgeW4gPSB0ZW1wICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKCgtQjIgICogeShuLTIpKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMyArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKCgtQjEgKiB5KG4tMSkpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW5PPSAoKEdhaW4gKiB5bikpICovCisgICAgICAgICAgICAgICAgeW5PID0geW4gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAgICAgLyogeW5PPSh5bk8gKyB4KG4pKSovCisgICAgICAgICAgICAgICAgeW5PICs9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IHluOyAvKiBVcGRhdGUgeShuLTEpICovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSkqLworICAgICAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5POyAvKiBXcml0ZSBvdXRwdXQqLworICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgogI2Vsc2UKIHZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggOGUwYjczOC4uMzg1ZGJjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC0yMDEsOCArMjAxLDEwIEBACiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDQxMDAgICAgICAgICAgICAgICAgMTI4CiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAgMjU2CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgIDUxMgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xNzY0MDAgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICAgNDA5NgogI2VuZGlmCiAKIHR5cGVkZWYgZW51bQpAQCAtMjE3LDggKzIxOSwxMCBAQAogICAgIExWRVFOQl9GU180NDEwMCA9IDcsCiAgICAgTFZFUU5CX0ZTXzQ4MDAwID0gOCwKICNpZmRlZiBISUdIRVJfRlMKLSAgICBMVkVRTkJfRlNfOTYwMDAgPSA5LAotICAgIExWRVFOQl9GU18xOTIwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfODgyMDAgPSA5LAorICAgIExWRVFOQl9GU185NjAwMCA9IDEwLAorICAgIExWRVFOQl9GU18xNzY0MDAgPSAxMSwKKyAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTIsCiAjZW5kaWYKICAgICBMVkVRTkJfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Gc19lbjsKQEAgLTI2Nyw3ICsyNzEsOSBAQAogICAgIC8qIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE5CYW5kczsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwogICAgIExWRVFOQl9CYW5kRGVmX3QgICAgICAgICAgICAqcEJhbmREZWZpbml0aW9uOyAgICAgICAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWRVFOQl9QYXJhbXNfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCmluZGV4IDQyZWE0NmYuLjc1NTE0MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCkBAIC0xMDksNyArMTA5LDkgQEAKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWRVFOQl8yUGlPbl84ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA3MWYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDY1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzZmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzM2YKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKaW5kZXggNTZiMDJlMC4uYTljZDVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApAQCAtNDYsNyArNDYsMTIgQEAKICNkZWZpbmUgTFZFUU5CX0lOU1RBTkNFX0FMSUdOICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgaW5zdGFuY2Ugc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfREFUQV9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIExWRVFOQl9DT0VGX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDIpCisjZWxzZQogI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hfQUxJR04gICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCiAKICNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAgICAgIDEwMCAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIFRDICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKaW5kZXggNjMyODE4MS4uZDE4OGMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJCSVFVQUQuaCIKIAorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYxLDE0ICs2MiwxOCBAQAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICBpOwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBCaXF1YWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgICBOckZyYW1lcykKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLy8gTW9ubyBwYXNzZWQgaW4gYXMgc3RlcmVvCisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IDEKKyAgICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNlbHNlCisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSAyOyAvLyBGQ0NfMgorI2VuZGlmCisgICAgY29uc3QgTFZNX0lOVDMyIE5yU2FtcGxlcyA9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsKIAogICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwogICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQpAQCAtODIsMTQgKzg3LDE0IEBACiAgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CiAgICAgfQogCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CisgICAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKIAogICAgIC8qCi0gICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQogICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQogICAgIHsKLSAgICAgICAgcmV0dXJuKExWRVFOQl9UT09NQU5ZU0FNUExFUyk7CisgICAgICAgIHJldHVybiBMVkVRTkJfVE9PTUFOWVNBTVBMRVM7CiAgICAgfQogCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQpAQCAtOTcsMTYgKzEwMiwxNiBAQAogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKICAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAotICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggc2VjdGlvbiBleGVjdGUgdGhlIGZpbHRlciB1bmxlc3MgdGhlIGdhaW4gaXMgMGRCCiAgICAgICAgICAqLwogICAgICAgICBpZiAocEluc3RhbmNlLT5OQmFuZHMgIT0gMCkKICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCisgICAgICAgICAgICBmb3IgKExWTV9VSU5UMTYgaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCkBAIC0xMTYsNyArMTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBCaXF1YWQgPSAmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKnBCaXF1YWQgPSAmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdFtpXTsKIAogCiAgICAgICAgICAgICAgICAgICAgIC8qCkBAIC0xMjYsMTAgKzEzMSwxOCBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE0MSwxOSArMTU0LDI5IEBACiAKIAogICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7Ci0gICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworI2VuZGlmCisgICAgICAgICAgICAvLyBkdXBsaWNhdGUgd2l0aCBlbHNlIGNsYXVzZShzKQorICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiApKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTE2MywxMiArMTg2LDEyIEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKICAgICAgICAgewotICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgICAgICAgICAgICAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKyAgICByZXR1cm4gTFZFUU5CX1NVQ0NFU1M7CiAKIH0KICNlbHNlCkBAIC0zMTIsNCArMzM1LDQgQEAKICAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwogCiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKaW5kZXggNTYzMTgxYy4uNDUzYzQyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTQ2LDcgKzQ2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCiB9OwogI2Vsc2UKQEAgLTgyLDcgKzg0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzg4MjAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl85NjAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTc2NDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMjQ5LDMwICsyNTMsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzODAwMCAgICAzMjU4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMTAyNSAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczEyMDAwICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAgICAzMjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyMjA1MCAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczI0MDAwICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAgICAzMjcyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0NDEwMCAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ4MDAwICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwotCi0KLWNvbnN0IExWTV9JTlQxNiBMVkVRTkJfTWl4ZXJUQ1RhYmxlW10gPSB7Ci0gICAgTFZFUU5CX01JWF9UQ19GczgwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczExMDI1LAotICAgIExWRVFOQl9NSVhfVENfRnMxMjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczIyMDUwLAotICAgIExWRVFOQl9NSVhfVENfRnMyNDAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczQ0MTAwLAotICAgIExWRVFOQl9NSVhfVENfRnM0ODAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKaW5kZXggZmY3NDc1ZS4uYzkxNWFjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaApAQCAtMTIzLDcgKzEyMyw3IEBACiAjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLwogI2Vsc2UKLSNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KKyNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KICNlbmRpZgogCiAjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgICAgICAgICAgICAgNjQgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBsb3cgbGltaXQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwppbmRleCA1NjZkODRmLi4xZDEyODNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCkBAIC01NzksNyArNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgIAorCiAgICAgLyoKICAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCmluZGV4IGE3MTkwNTMuLmRmZWQyOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwpAQCAtNjQsMTIgKzY0LDIyIEBACiAgICAgICAgICgKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSAgICAgIAorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKQogI2lmZGVmIEhJR0hFUl9GUwotICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQogI2VuZGlmCiAgICAgICAgICkKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICAgICAgICYmCisgICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCisgICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAgICAgICAgICYmCisgICAgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSkKKyNlbHNlCiAgICAgICAgIHx8ICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpICkKKyNlbmRpZgogICAgIHsKICAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCmluZGV4IGIzZWRjNjAuLjEwNTg3NDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jCkBAIC01Miw3ICs1Miw5IEBACiAgICAgMzIwMDAsCiAgICAgNDQxMDAsCiAgICAgNDgwMDAsCisgICAgODgyMDAsCiAgICAgOTYwMDAsCisgICAgMTc2NDAwLAogICAgIDE5MjAwMAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKaW5kZXggYTc1MGJiMC4uZWUwN2UyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCkBAIC00Niw3ICs0Niw3IEBACiAjaWZuZGVmIEhJR0hFUl9GUwogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICA5ICAgICAgLyogRnJvbSA4MDAwSHogdG8gNDgwMDBIeiovCiAjZWxzZQotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTMgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCiAjZW5kaWYKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCmluZGV4IDEyODc1MDMuLmY4YWY0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKQEAgLTU0LDcgKzU0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKIApAQCAtNzgsNyArODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5CiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDI0MzQ4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIyMzY5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMTc0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExMTg1ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xMDUsNyArMTA5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE3NjQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDE5MjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM1MjgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDM4NDAgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTI4LDcgKzEzNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAvKiA0NDEwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAvKiA0ODAwMCBTL3MgICovCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDYwICAgICAgICAgICAgICAgICAgIC8qIDg4MjAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjQgICAgICAgICAgICAgICAgICAgLyogOTYwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjAgICAgICAgICAgICAgICAgICAvKiAxNzY0MDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjggICAgICAgICAgICAgICAgICAvKjE5MjAwMCBTL3MgICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTE1Myw3ICsxNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3ODEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM5MgogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIzOTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTE5NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwOTggICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTY5LDcgKzE3OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NTkwODlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMzQwMzcyZgogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNzI5NDc2ZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wNjcwMTg2ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzY0NzM4ZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMC4wMzM1MDkzZiAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0zNTIsNyArMzY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KQEAgLTM2OCw3ICszODIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KQEAgLTM4Myw3ICszOTksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAppbmRleCBlNzU2OTVlLi5lNTA3YTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMjA1LDYgKzIwNSw5IEBACiAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsOyAgICAgICAgICAgIC8qIEVmZmVjdCBsZXZlbCAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFJldmVyYkxldmVsOyAgICAgICAgICAgIC8qIFJldmVyYiBsZXZlbCBpbiAlICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIH0gTFZDU19QYXJhbXNfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAppbmRleCAwYzJmZTUzLi5lNDVkODFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTE1Miw2ICsxNTIsMjQgQEAKICNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogQ29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzODQ2ZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMyNjU3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45OTI3NDdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzE1NDFmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4yODk1ODZmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjA1ODA0NWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjc2NTMwMGYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNzY5ODE2ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAorCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjUqLwogLyogaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dG9mZiBmcmVxdWVuY3kgMTAyLjE4IEh6Ki8KICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzU1MzIKQEAgLTE2MCwxMyArMTc4LDMzIEBACiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5MzMzNCkKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLS8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDE2NzI3Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDE2NzI3KQotI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuNzkzMzcyKQotI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTcyMzYKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIyNDMyNmYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yOTQ5MzdmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wNzA2MTFmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuNzkyMTY2ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk1ODMwZgorI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzOTczZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMzM3OGYpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45OTYzNjdmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xOTk4MzZmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzA3NTQ0ZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMTA3NzA4ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg3NjU3MmYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjg3Nzc3MWYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5CkBAIC0xNzUsMTMgKzIxMywxNSBAQAogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTk2NjYxKQogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0vKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg5OTEKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDA4OTkxKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjg5MjUwOSkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjg5MzUyNAotI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgMTQKKy8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KKyAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgIDAuMTk2MDM5ZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjMxMTAyN2YpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjExNDk4OGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTEzODBmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC44OTIzNDYwZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgMTQKICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTk5LDcgKzIzOSwxMyBAQAogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLwogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLwogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLworLy8gVE9ETzogdGhpcyBzaG91bGQgbGluZWFybHkgc2NhbGUgYnkgZnJlcXVlbmN5IGJ1dCBpcyBsaW1pdGVkIHRvIDUxMiBmcmFtZXMgdW50aWwKKy8vIHdlIGVuc3VyZSBlbm91Z2ggYnVmZmVyIHNpemUgaGFzIGJlZW4gYWxsb2NhdGVkLgogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDg4LjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTc2LjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTk2a1MvcyAqLwogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKQEAgLTI3NSw2ICszMjEsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKQEAgLTI4NCw2ICszMzgsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQpAQCAtNDQ2LDYgKzUwOCwyNCBAQAogCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUzOCwyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi5hYjhjY2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAKIC8qIE1lbW9yeSAqLwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bworICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKKyAqIGZyb20gdGhlIG11bHRpY2hhbm5lbCBpbnB1dCBpbnRvIHNjcmF0Y2ggYnVmZmVyLiBUaGUgYnVmZmVycyBhZGRlZCBoZXJlCisgKiBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgMgorI2VuZGlmCiAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDM5NTZkNGQuLmVmMWQ5ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNzYsNiArNzYsMjIgQEAKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorCisgICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCisgICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KKyAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscworICAgICAqYXQgdGhpcyBwb2ludC4KKyAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCisgICAgICovCisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorI2VuZGlmCiAKICAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CkBAIC04Myw2ICs5OSwyNSBAQAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKgorICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCisgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgorICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KKyAgICAgKi8KKyAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOworICAgIHBTdEluICA9IHBTY3JhdGNoICsgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBOckZyYW1lcyk7CisgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAqLworICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKKyAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOworI2Vsc2UKICAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKICAgICB7CiAgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwpAQCAtOTYsMTQgKzEzMSwyMSBAQAogICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCiAgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CiAgICAgfQotCisjZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLworI2Vsc2UKICAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCkBAIC0xMTIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgCisKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwpAQCAtMjM5LDcgKzI4MSwxNSBAQAogCiAgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KQEAgLTI2MCw4ICszMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAorCisKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKQEAgLTM3NiwxNyArNDI2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCmluZGV4IGUxNTRlMjkuLmExZmI0OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKQEAgLTc0LDEwICs3NCwxOCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfODgyMDBfQTEsCisgICAgIENTX01JRERMRV84ODIwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19NSURETEVfOTYwMDBfQTEsCiAgICAgIENTX01JRERMRV85NjAwMF9CMSwKICAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xNzY0MDBfQTAsICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTc2NDAwX0ExLAorICAgICBDU19NSURETEVfMTc2NDAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCiAgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCkBAIC0xNDQsMTIgKzE1MiwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAgLAorICAgIHtDU19TSURFXzg4MjAwX0EwLCAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfODgyMDBfQTEsCisgICAgIENTX1NJREVfODgyMDBfQTIsCisgICAgIENTX1NJREVfODgyMDBfQjEsCisgICAgIENTX1NJREVfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODgyMDBfU0NBTEV9LAogICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzk2MDAwX0ExLAogICAgICBDU19TSURFXzk2MDAwX0EyLAogICAgICBDU19TSURFXzk2MDAwX0IxLAogICAgICBDU19TSURFXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMTc2NDAwX0EwLCAgICAgICAgICAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTc2NDAwX0ExLAorICAgICBDU19TSURFXzE3NjQwMF9BMiwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjEsCisgICAgIENTX1NJREVfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCiAgICAgIENTX1NJREVfMTkyMDAwX0EyLApAQCAtMjIzLDEyICsyNDMsMjQgQEAKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzg4MjAwX0EwLCAgICAgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTI5NCwxMiArMzI2LDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTMyNiw3ICszNzAsMTIgQEAKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0hafTsKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiwKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzkyLDEyICs0NDEsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTX1JFVkVSQl84ODIwMF9BMCwgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84ODIwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0EyLAorICAgICBDU19SRVZFUkJfODgyMDBfQjEsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzk2MDAwX0ExLAogICAgICBDU19SRVZFUkJfOTYwMDBfQTIsCiAgICAgIENTX1JFVkVSQl85NjAwMF9CMSwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTc2NDAwX0ExLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0EyLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IxLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMSwKICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMiwKQEAgLTUwOSwyMiArNTcwLDI2IEBACiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODgyMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NDgxMDY2ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovICAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTc2NDAwICAgIDMyNzU5ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NzQwNDk5ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwICAgIDMyNzYzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KICNlbmRpZgogCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzExXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczIyMDUwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyNDAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0ODAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzOTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE5MjAwMAorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxM10gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCkBAIC01NDUsMTcgKzYxMCwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxMV0gPSB7ODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLQkJCQkJCQkJCQkJICAxMjAwMCwKLQkJCQkJCQkJCQkJICAxNjAwMCwKLQkJCQkJCQkJCQkJICAyMjA1MCwKLQkJCQkJCQkJCQkJICAyNDAwMCwKLQkJCQkJCQkJCQkJICAzMjAwMCwKLQkJCQkJCQkJCQkJICA0NDEwMCwKLQkJCQkJCQkJCQkJICA0ODAwMCwKLQkJCQkJCQkJCQkJICA5NjAwMCwKLQkJCQkJCQkJCQkJICAxOTIwMDAKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTgwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBlZmZlY3RzCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsdm10ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbImx2bXRlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzQwNDY5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgorIworCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworbW0gLWoKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworIyBsb2NhdGlvbiBvZiB0ZXN0IGZpbGVzCit0ZXN0ZGlyPSIvZGF0YS9sb2NhbC90bXAvbHZtVGVzdCIKKworI2ZsYWdzPSItYkUgLXRFIC1lcUUgLWNzRSIKK2ZsYWdzPSItY3NFIC10RSAtZXFFIgorCisKK2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitlY2hvICJ0ZXN0aW5nIGx2bSIKK2FkYiBzaGVsbCBta2RpciAkdGVzdGRpcgorYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL2x2bXRlc3QvYXJtNjQvbHZtdGVzdCAkdGVzdGRpcgorCisjIHJ1biBtdWx0aWNoYW5uZWwgZWZmZWN0cyBhdCBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudHMsIHNhdmluZyBvbmx5IHRoZSBzdGVyZW8gY2hhbm5lbCBwYWlyLgorYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyAtbzokdGVzdGRpci9zaW5lc3dlZXBfMS5yYXdcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1jaDoxIC1mczo0NDEwMCAkZmxhZ3MKK2FkYiBzaGVsbCAkdGVzdGRpci9sdm10ZXN0IC1pOiR0ZXN0ZGlyL3NpbmVzd2VlcHJhdy5yYXcgLW86JHRlc3RkaXIvc2luZXN3ZWVwXzIucmF3XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLWNoOjIgLWZzOjQ0MTAwICRmbGFncworYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyAtbzokdGVzdGRpci9zaW5lc3dlZXBfNC5yYXdcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtY2g6NCAtZnM6NDQxMDAgJGZsYWdzCithZGIgc2hlbGwgJHRlc3RkaXIvbHZtdGVzdCAtaTokdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IC1vOiR0ZXN0ZGlyL3NpbmVzd2VlcF82LnJhd1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC1jaDo2IC1mczo0NDEwMCAkZmxhZ3MKK2FkYiBzaGVsbCAkdGVzdGRpci9sdm10ZXN0IC1pOiR0ZXN0ZGlyL3NpbmVzd2VlcHJhdy5yYXcgLW86JHRlc3RkaXIvc2luZXN3ZWVwXzgucmF3XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLWNoOjggLWZzOjQ0MTAwICRmbGFncworCisjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMi5yYXcgJHRlc3RkaXIvc2luZXN3ZWVwXzIucmF3CithZGIgc2hlbGwgY21wICR0ZXN0ZGlyL3NpbmVzd2VlcF8yLnJhdyAkdGVzdGRpci9zaW5lc3dlZXBfNC5yYXcKK2FkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzIucmF3ICR0ZXN0ZGlyL3NpbmVzd2VlcF82LnJhdworYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMi5yYXcgJHRlc3RkaXIvc2luZXN3ZWVwXzgucmF3CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTUxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcApAQCAtMCwwICsxLDcyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgXAorICBkbyB7ICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiICNjb25kKTsgXAorICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFwKK30KKworI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RydWN0IGx2bUNvbmZpZ1BhcmFtc190IHsKKyAgaW50ICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgICAgPSA0NDEwMDsKKyAgaW50ICAgICAgICAgICAgICBuckNoYW5uZWxzICAgICAgPSAyOworICBpbnQgICAgICAgICAgICAgIGZDaGFubmVscyAgICAgICA9IDI7CisgIGludCAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsID0gMDsKKyAgaW50ICAgICAgICAgICAgICBlcVByZXNldExldmVsICAgPSAwOworICBpbnQgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICAgICA9IDI1NjsKKyAgTFZNX0JFX01vZGVfZW4gICBiYXNzRW5hYmxlICAgICAgPSBMVk1fQkVfT0ZGOworICBMVk1fVEVfTW9kZV9lbiAgIHRyZWJsZUVuYWJsZSAgICA9IExWTV9URV9PRkY7CisgIExWTV9FUU5CX01vZGVfZW4gZXFFbmFibGUgICAgICAgID0gTFZNX0VRTkJfT0ZGOworICBMVk1fTW9kZV9lbiAgICAgIGNzRW5hYmxlICAgICAgICA9IExWTV9NT0RFX09GRjsKK307CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgcHJpbnRmKCJcbiAgICAgPGV4Y2V1dGFibGU+IC1pOjxpbnB1dF9maWxlPiAtbzo8b3V0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgIHByaW50ZigiXG53aGVyZSwgXG4gICAgIDxpbnB1dGZpbGU+ICBpcyB0aGUgaW5wdXQgZmlsZSBuYW1lIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICBvbiB3aGljaCBMVk0gZWZmZWN0cyBhcmUgYXBwbGllZCIpOworICBwcmludGYoIlxuICAgICA8b3V0cHV0ZmlsZT4gcHJvY2Vzc2VkIG91dHB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtaGVscCAob3IpIC1oIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWNoOjxwcm9jZXNzX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOworICBwcmludGYoIlxuICAgICAtYmFzc2x2bDo8ZWZmZWN0X2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBBIHZhbHVlIHRoYXQgcmFuZ2VzIGJldHdlZW4gMCAtIDE1IGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcVByZXNldDo8cHJlc2V0IFZhbHVlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gTm9ybWFsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSBDbGFzc2ljYWwiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMiAtIERhbmNlIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDMgLSBGbGF0Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDQgLSBGb2xrIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDUgLSBIZWF2eSBNZXRhbCIpOworICBwcmludGYoIlxuICAgICAgICAgICA2IC0gSGlwIEhvcCIpOworICBwcmludGYoIlxuICAgICAgICAgICA3IC0gSmF6eiIpOworICBwcmludGYoIlxuICAgICAgICAgICA4IC0gUG9wIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDkgLSBSb2NrIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtYkUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtdEUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY3NFICIpOworICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcUUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZnJlZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX01lbVRhYl90IE1lbVRhYjsKKworICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorfSAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190ICpwYXJhbXMpIHsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKKworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgeworICAgIEFMT0dWKAorICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgIi0+IENhbGxpbmcgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworCisgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworCisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgfQorCisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKKyAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLCAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOworICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCisgICAqIHRoYXQgd2VyZQorICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAqLworICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworCisgIC8qIEluaXRpYWxpc2UgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CisKKyAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CisgIHBhcmFtcy0+RVFOQl9OQmFuZHMgPSBGSVZFQkFORF9OVU1CQU5EUzsKKyAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKworICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPlZDX0JhbGFuY2UgPSAwOworCisgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSAwOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSAoTFZNX1BTQV9EZWNheVNwZWVkX2VuKTA7CisKKyAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKKyAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+QkVfQ2VudHJlRnJlcSA9IExWTV9CRV9DRU5UUkVfOTBIejsKKyAgcGFyYW1zLT5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKworICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgTHZtU3RhdHVzID0KKyAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyA9IDIwOworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfTG93ID0gNTAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOworICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CisKKyAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgIHJldHVybiAwOworfSAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KKworaW50IGx2bUNyZWF0ZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIGludCByZXQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0KSk7CisgIGlmIChOVUxMID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpIHsKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOworCisgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZQorICAgKiBzZXQgdG8gdGhlIGdldAorICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwKKyAgICogYXZvaWQKKyAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gLTE7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gTlVMTDsKKyNlbmRpZgorICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICB9CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGx2bUNvbnRyb2woc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBjb25zdCBpbnQgbnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIHBhcmFtcy0+TnJDaGFubmVscyA9IG5yQ2hhbm5lbHM7CisgIGlmIChuckNoYW5uZWxzID09IDEpIHsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICB9IGVsc2UgaWYgKG5yQ2hhbm5lbHMgPT0gMikgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgfSBlbHNlIGlmIChuckNoYW5uZWxzID4gMiAmJiBuckNoYW5uZWxzIDw9IDgpIHsgLy8gRkNDXzIgRkNDXzgKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7CisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIExWTV9Gc19lbiBzYW1wbGVSYXRlOworICBzd2l0Y2ggKHBsdm1Db25maWdQYXJhbXMtPnNhbXBsaW5nRnJlcSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTEwMjU6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzExMDI1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjIwNTA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjQwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg4MjAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5jc0VuYWJsZTsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5HYWluID0KKyAgICAgICAgRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07CisgIH0KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcUVuYWJsZTsKKyAvLyBDYXV0aW9uOiByYXcgcG9pbnRlciB0byBzdGFjayBkYXRhLCBzdG9yZWQgaW4gaW5zdGFuY2UgYnkgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzLgorICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CisKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1FeGVjdXRlKGZsb2F0ICpmbG9hdEluLCBmbG9hdCAqZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zKSB7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICByZXR1cm4KKyAgICAgIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KK30KKworaW50IGx2bU1haW5Qcm9jZXNzKGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zLCBGSUxFICpmaW5wLCBGSUxFICpmb3V0KSB7CisgIHN0cnVjdCBFZmZlY3RDb250ZXh0IGNvbnRleHQ7CisgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworCisgIGludCBlcnJDb2RlID0gbHZtQ3JlYXRlKCZjb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICByZXR1cm4gZXJyQ29kZTsKKyAgfQorCisgIGVyckNvZGUgPSBsdm1Db250cm9sKCZjb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAvLyBmaWxlIGxvYWQgc2l6ZQorICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisgIC8qCisgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICogYnkgY29weWluZyB0aGUgc2FtZSBkYXRhIGludG8gdGhlIHNlY29uZCBjaGFubmVsLgorICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAqIDIgY2hhbm5lbHMuIFRoZSBtZW1BbGxvY0NoQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICogbWVtb3J5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIGNvbnN0IGludCBtZW1BbGxvY0NoQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBtZW1BbGxvY0NoQ291bnQpOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgIH0KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisjaWYgMQorICAgIGVyckNvZGUgPSBsdm1FeGVjdXRlKGZsb2F0SW4uZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksICZjb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zKTsKKyAgICBpZiAoZXJyQ29kZSkgeworICAgICAgcHJpbnRmKCJcbkVycm9yOiBsdm1FeGVjdXRlIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOworICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgfQorCisgICAgKHZvaWQpZnJhbWVTaXplOyAvLyBlbGltaW5hdGUgd2FybmluZworI2Vsc2UKKyAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgIH0KKyAgICAodm9pZCkgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZm91dCk7CisgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGx2bUNvbmZpZ1BhcmFtc190IGx2bUNvbmZpZ1BhcmFtc3t9OyAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgRklMRSAqZmlucCA9IG51bGxwdHIsICpmb3V0ID0gbnVsbHB0cjsKKworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItaToiLCAzKSkgeworICAgICAgZmlucCA9IGZvcGVuKGFyZ3ZbaV0gKyAzLCAicmIiKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItbzoiLCAzKSkgeworICAgICAgZm91dCA9IGZvcGVuKGFyZ3ZbaV0gKyAzLCAid2IiKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZnM6IiwgNCkpIHsKKyAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgIGlmIChzYW1wbGluZ0ZyZXEgIT0gODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTEwMjUgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE2MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDIyMDUwICYmIHNhbXBsaW5nRnJlcSAhPSAyNDAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAzMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDQxMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gNDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDg4MjAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDk2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNzY0MDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTkyMDAwKSB7CisgICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCBTYW1wbGluZyBGcmVxdWVuY3kgOiAlZFxuIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IHNhbXBsaW5nRnJlcTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItY2g6IiwgNCkpIHsKKyAgICAgIGNvbnN0IGludCBuckNoYW5uZWxzID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAobnJDaGFubmVscyA+IDggfHwgbnJDaGFubmVscyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyA6ICVkXG4iLCBuckNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBuckNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZpbGUgY2hhbm5lbHMgOiAlZFxuIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmZDaGFubmVscyA9IGZDaGFubmVsczsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IDE1IHx8IGJhc3NFZmZlY3RMZXZlbCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIEJhc3MgRWZmZWN0IExldmVsIDogJWRcbiIsCisgICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRWZmZWN0TGV2ZWwgPSBiYXNzRWZmZWN0TGV2ZWw7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWVxUHJlc2V0OiIsIDEwKSkgeworICAgICAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMCk7CisgICAgICBpZiAoZXFQcmVzZXRMZXZlbCA+IDkgfHwgZXFQcmVzZXRMZXZlbCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIEVxdWFsaXplciBQcmVzZXQgOiAlZFxuIiwgZXFQcmVzZXRMZXZlbCk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxUHJlc2V0TGV2ZWwgPSBlcVByZXNldExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWJFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRW5hYmxlID0gTFZNX0JFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi10RSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRW5hYmxlID0gTFZNX1RFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWNzRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuY3NFbmFibGUgPSBMVk1fTU9ERV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChmaW5wID09IG51bGxwdHIgfHwgZm91dCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvb3V0cHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgLy8gb2sgbm90IHRvIGNsb3NlLgorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGNvbnN0IGludCBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmx2bUNvbmZpZ1BhcmFtcywgZmlucCwgZm91dCk7CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZvdXQpOworCisgIGlmIChlcnJDb2RlKSB7CisgICAgQUxPR0UoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5zIHdpdGggdGhlIGVycm9yOiAlZCBcbiIsIGVyckNvZGUpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCAxMGZkOTcwLi4xNmZhMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1EQlVJTERfRkxPQVQiLAogICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA1M2QyNjZhLi5iNTg2MGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PUxWTV9GQUxTRSkgJiYKICAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD09TFZNX0ZBTFNFKSkKICAgICB7Ci0gICAgICAgICNpZmRlZiBMVk1fUENNCisjaWZkZWYgTFZNX1BDTQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgICNlbmRpZgorI2VuZGlmCiAKIAogICAgICAgICAvLyBDbGVhciB0aGUgU2Vzc2lvbkluZGV4CkBAIC03NTEsMTkgKzc1MSwyMSBAQAogCiAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgKnBPdXRUbXA7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPQorICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBOckNoYW5uZWxzKTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewogICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBOckNoYW5uZWxzKTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKQEAgLTc4NCw3ICs3ODYsNyBAQAogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yKTsKKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQpAQCAtNzk4LDEzICs4MDAsMTUgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocEluLAotICAgICAgICAgICAgZnJhbWVDb3VudCpzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogI2VuZGlmCiAKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHBJbnB1dEJ1ZmYsIHBJbiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KQEAgLTgxNCw3ICs4MTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLwogCiAgICAgLyogQ29udmVydGluZyBvdXRwdXQgZGF0YSBmcm9tIGZsb2F0IHBvaW50IHRvIGZpeGVkIHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChwT3V0VG1wLCBwT3V0cHV0QnVmZiwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHMpOwogCiAjZWxzZQogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KQEAgLTgyOSwxMiArODMzLDE0IEBACiAKICNpZmRlZiBMVk1fUENNCiAgICAgZndyaXRlKHBPdXRUbXAsCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAjZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7IGkrKykgewogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKXBPdXRbaV0gKyAoTFZNX0lOVDMyKXBPdXRUbXBbaV0pOwogI2Vsc2UKQEAgLTEyMzIsNDUgKzEyMzgsNTggQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOworI2Vsc2UKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyNlbmRpZgogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICBwQ29udGV4dC0+Y29uZmlnID0gKnBDb25maWc7CisgICAgY29uc3QgTFZNX0lOVDE2IE5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKICAgICBjYXNlIDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjIwNTA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDQxMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4ODIwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE3NjQwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTkyMDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAgKiBOckNoYW5uZWxzOwogICAgICAgICBicmVhazsKICNlbmRpZgogICAgIGRlZmF1bHQ6CkBAIC0xMjk0LDYgKzEzMTMsMTAgQEAKIAogICAgICAgICBBY3RpdmVQYXJhbXMuU2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEFjdGl2ZVBhcmFtcy5OckNoYW5uZWxzID0gTnJDaGFubmVsczsKKyNlbmRpZgorCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCkBAIC0xNDk4LDYgKzE1MjEsNyBAQAogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgorICAgIC8vIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOiAgLy8gRm9yIFVTQiB0ZXN0aW5nIG9mIHRoZSB2aXJ0dWFsaXplciBvbmx5LgogICAgICAgICByZXR1cm4gMDsKICAgICBkZWZhdWx0IDoKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTIwLDEwICsxNTQ0LDkgQEAKIGludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgIGlmICgoY2hhbm5lbENvdW50ID09IDApIHx8IChjaGFubmVsQ291bnQgPiAyKSkgeworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IExWTV9NQVhfQ0hBTk5FTFMpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotCiAgICAgcmV0dXJuIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlVHlwZSk7CiB9CiAKQEAgLTMyMTYsNiArMzIzOSw3IEBACiAgICAgRWZmZWN0Q29udGV4dCAqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQgKikgc2VsZjsKICAgICBpbnQgICAgc3RhdHVzID0gMDsKICAgICBpbnQgICAgcHJvY2Vzc1N0YXR1cyA9IDA7CisgICAgY29uc3QgaW50IE5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAKIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgU3RhcnQgOiBFbmFibGVkID0gJWQgICAgIENhbGxlZCA9ICVkICglOGQgJThkICU4ZCkiLAogLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCxwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLApAQCAtMzI0Niw3ICszMjcwLDcgQEAKICAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fQkFTU19CT09TVCBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7IC8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgQkFTU19CT09TVCwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiKTsKICAgICAgICAgfQpAQCAtMzI2Niw3ICszMjkwLDcgQEAKICAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9FUVVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOyAvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEVRVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxKTsKICAgICAgICAgfQpAQCAtMzI4MCw3ICszMzA0LDggQEAKICAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZJUlRVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ly8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IC09CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgZm9yIHRvIHR1cm4gb2ZmIFZJUlRVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCk7CiAgICAgICAgIH0KQEAgLTMzMzEsNyArMzM1Niw3IEBACiAgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwogCiAgICAgICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogRkNDXzI7ICsraSl7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7ICsraSkgewogI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOwogI2Vsc2UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IGQ1NTgxNjkuLjYwMmY2MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtNjc1LDkgKzY3NSwxNSBAQAogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICBicmVhazsKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyAgICBjYXNlIDg4MjAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIDk2MDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3NjQwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNzY0MDA7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTkyMDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCmluZGV4IDcwNDA5ZGUuLjM1ZTJmM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC05LDYgKzksNyBAQAogCiBMT0NBTF9DRkxBR1MrPSAtTzIgLWZ2aXNpYmlsaXR5PWhpZGRlbgogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtREJVSUxEX0ZMT0FUIC1EU1VQUE9SVF9NQwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJjdXRpbHMgXApAQCAtMTksNyArMjAsOCBAQAogTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogCiBMT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAppbmRleCA4MDdmMjRkLi4wMGJjMzcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0yNCwxMSArMjQsMjMgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+IC8vIG1heAogI2luY2x1ZGUgPG5ldz4KIAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCisjZW5kaWYgLy8gQlVJTERfRkxPQVQKIAogZXh0ZXJuICJDIiB7CiAKQEAgLTE0MywxMCArMTU1LDE1IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IEZDQ184KSByZXR1cm4gLUVJTlZBTDsKKyNlbHNlCisgICAgaWYgKGNoYW5uZWxDb3VudCAhPSBGQ0NfMikgcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKICAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0ga1Byb2Nlc3NGb3JtYXQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgcENvbnRleHQtPm1Db25maWcgPSAqcENvbmZpZzsKIApAQCAtMTkyLDcgKzIwOSw3IEBACiB7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTIwMCw3ICsyMTcsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTMwMSwxNSArMzE4LDggQEAKIC8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIGludCBWaXN1YWxpemVyX3Byb2Nlc3MoCi0gICAgICAgIGVmZmVjdF9oYW5kbGVfdCBzZWxmLGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKIHsKICAgICBWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKFZpc3VhbGl6ZXJDb250ZXh0ICopc2VsZjsKIApAQCAtMzI0LDcxICszMzQsMTE4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIGNvbnN0IHNpemVfdCBzYW1wbGVMZW4gPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OworCiAgICAgLy8gcGVyZm9ybSBtZWFzdXJlbWVudHMgaWYgbmVlZGVkCiAgICAgaWYgKHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlICYgTUVBU1VSRU1FTlRfTU9ERV9QRUFLX1JNUykgewogICAgICAgICAvLyBmaW5kIHRoZSBwZWFrIGFuZCBSTVMgc3F1YXJlZCBmb3IgdGhlIG5ldyBidWZmZXIKLSAgICAgICAgdWludDMyX3QgaW5JZHg7Ci0gICAgICAgIGludDE2X3QgbWF4U2FtcGxlID0gMDsKICAgICAgICAgZmxvYXQgcm1zU3FBY2MgPSAwOwotICAgICAgICBmb3IgKGluSWR4ID0gMCA7IGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCA7IGluSWR4KyspIHsKLSAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+czE2W2luSWR4XSA+IG1heFNhbXBsZSkgewotICAgICAgICAgICAgICAgIG1heFNhbXBsZSA9IGluQnVmZmVyLT5zMTZbaW5JZHhdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgtaW5CdWZmZXItPnMxNltpbklkeF0gPiBtYXhTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtYXhTYW1wbGUgPSAtaW5CdWZmZXItPnMxNltpbklkeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBybXNTcUFjYyArPSAoaW5CdWZmZXItPnMxNltpbklkeF0gKiBpbkJ1ZmZlci0+czE2W2luSWR4XSk7CisKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBmbG9hdCBtYXhTYW1wbGUgPSAwLmY7CisgICAgICAgIGZvciAoc2l6ZV90IGluSWR4ID0gMDsgaW5JZHggPCBzYW1wbGVMZW47ICsraW5JZHgpIHsKKyAgICAgICAgICAgIG1heFNhbXBsZSA9IGZtYXgobWF4U2FtcGxlLCBmYWJzKGluQnVmZmVyLT5mMzJbaW5JZHhdKSk7CisgICAgICAgICAgICBybXNTcUFjYyArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4XSAqIGluQnVmZmVyLT5mMzJbaW5JZHhdOwogICAgICAgICB9CisgICAgICAgIG1heFNhbXBsZSAqPSAxIDw8IDE1OyAvLyBzY2FsZSB0byBpbnQxNl90LCB3aXRoIGV4YWN0bHkgMSA8PCAxNSByZXByZXNlbnRpbmcgcG9zaXRpdmUgbnVtLgorICAgICAgICBybXNTcUFjYyAqPSAxIDw8IDMwOyAvLyBzY2FsZSB0byBpbnQxNl90ICogMgorI2Vsc2UKKyAgICAgICAgaW50IG1heFNhbXBsZSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGluSWR4ID0gMDsgaW5JZHggPCBzYW1wbGVMZW47ICsraW5JZHgpIHsKKyAgICAgICAgICAgIG1heFNhbXBsZSA9IHN0ZDo6bWF4KG1heFNhbXBsZSwgc3RkOjphYnMoaW50MzJfdChpbkJ1ZmZlci0+czE2W2luSWR4XSkpKTsKKyAgICAgICAgICAgIHJtc1NxQWNjICs9IGluQnVmZmVyLT5zMTZbaW5JZHhdICogaW5CdWZmZXItPnMxNltpbklkeF07CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAvLyBzdG9yZSB0aGUgbWVhc3VyZW1lbnQKICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHhdLm1QZWFrVTE2ID0gKHVpbnQxNl90KW1heFNhbXBsZTsKICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHhdLm1SbXNTcXVhcmVkID0KLSAgICAgICAgICAgICAgICBybXNTcUFjYyAvIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBybXNTcUFjYyAvIHNhbXBsZUxlbjsKICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHhdLm1Jc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgaWYgKCsrcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeCA+PSBwQ29udGV4dC0+bU1lYXN1cmVtZW50V2luZG93U2l6ZUluQnVmZmVycykgewogICAgICAgICAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeCA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBhbGwgY29kZSBiZWxvdyBhc3N1bWVzIHN0ZXJlbyAxNiBiaXQgUENNIG91dHB1dCBhbmQgaW5wdXQKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGZsb2F0IGZzY2FsZTsgLy8gbXVsdGlwbGljYXRpdmUgc2NhbGUKKyNlbHNlCiAgICAgaW50MzJfdCBzaGlmdDsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogCiAgICAgaWYgKHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPT0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfTk9STUFMSVpFRCkgewogICAgICAgICAvLyBkZXJpdmUgY2FwdHVyZSBzY2FsaW5nIGZhY3RvciBmcm9tIHBlYWsgdmFsdWUgaW4gY3VycmVudCBidWZmZXIKICAgICAgICAgLy8gdGhpcyBnaXZlcyBtb3JlIGludGVyZXN0aW5nIGNhcHR1cmVzIGZvciBkaXNwbGF5LgotICAgICAgICBzaGlmdCA9IDMyOwotICAgICAgICBpbnQgbGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiAyOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBmbG9hdCBtYXhTYW1wbGUgPSAwLmY7CisgICAgICAgIGZvciAoc2l6ZV90IGluSWR4ID0gMDsgaW5JZHggPCBzYW1wbGVMZW47ICkgeworICAgICAgICAgICAgLy8gd2UgcmVjb25zdHJ1Y3QgdGhlIGFjdHVhbCBzdW1tZWQgdmFsdWUgdG8gZW5zdXJlIHByb3BlciBub3JtYWxpemF0aW9uCisgICAgICAgICAgICAvLyBmb3IgbXVsdGljaGFubmVsIG91dHB1dHMgKGNoYW5uZWxzID4gMiBtYXkgb2Z0ZW4gYmUgMCkuCisgICAgICAgICAgICBmbG9hdCBzbXAgPSAwLmY7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzbXAgKz0gaW5CdWZmZXItPmYzMltpbklkeCsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heFNhbXBsZSA9IGZtYXgobWF4U2FtcGxlLCBmYWJzKHNtcCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhTYW1wbGUgPiAwLmYpIHsKKyAgICAgICAgICAgIGZzY2FsZSA9IDEyNy5mIC8gbWF4U2FtcGxlOworICAgICAgICAgICAgaW50IGV4cDsgLy8gdW51c2VkCisgICAgICAgICAgICBjb25zdCBmbG9hdCBzaWduaWZpY2FuZCA9IGZyZXhwKGZzY2FsZSwgJmV4cCk7CisgICAgICAgICAgICBpZiAoc2lnbmlmaWNhbmQgPT0gMC41ZikgeworICAgICAgICAgICAgICAgIGZzY2FsZSAqPSAyNTUuZiAvIDI1Ni5mOyAvLyBhdm9pZCByZXR1cm5pbmcgdW5hbHRlcmVkIFBDTSBzaWduYWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNjYWxlIGRvZXNuJ3QgbWF0dGVyLCB0aGUgdmFsdWVzIGFyZSBhbGwgMC4KKyAgICAgICAgICAgIGZzY2FsZSA9IDEuZjsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaW50MzJfdCBvckFjY3VtID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVMZW47ICsraSkgewogICAgICAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2W2ldOwogICAgICAgICAgICAgaWYgKHNtcCA8IDApIHNtcCA9IC1zbXAgLSAxOyAvLyB0YWtlIGNhcmUgdG8ga2VlcCB0aGUgbWF4IG5lZ2F0aXZlIGluIHJhbmdlCi0gICAgICAgICAgICBpbnQzMl90IGNseiA9IF9fYnVpbHRpbl9jbHooc21wKTsKLSAgICAgICAgICAgIGlmIChzaGlmdCA+IGNseikgc2hpZnQgPSBjbHo7CisgICAgICAgICAgICBvckFjY3VtIHw9IHNtcDsKICAgICAgICAgfQorCiAgICAgICAgIC8vIEEgbWF4aW11bSBhbXBsaXR1ZGUgc2lnbmFsIHdpbGwgaGF2ZSAxNyBsZWFkaW5nIHplcm9zLCB3aGljaCB3ZSB3YW50IHRvCiAgICAgICAgIC8vIHRyYW5zbGF0ZSB0byBhIHNoaWZ0IG9mIDggKGZvciBjb252ZXJ0aW5nIDE2IGJpdCB0byA4IGJpdCkKLSAgICAgICAgc2hpZnQgPSAyNSAtIHNoaWZ0OworICAgICAgICBzaGlmdCA9IDI1IC0gX19idWlsdGluX2NseihvckFjY3VtKTsKKwogICAgICAgICAvLyBOZXZlciBzY2FsZSBieSBsZXNzIHRoYW4gOCB0byBhdm9pZCByZXR1cm5pbmcgdW5hbHRlcmVkIFBDTSBzaWduYWwuCiAgICAgICAgIGlmIChzaGlmdCA8IDMpIHsKICAgICAgICAgICAgIHNoaWZ0ID0gMzsKICAgICAgICAgfQogICAgICAgICAvLyBhZGQgb25lIHRvIGNvbWJpbmUgdGhlIGRpdmlzaW9uIGJ5IDIgbmVlZGVkIGFmdGVyIHN1bW1pbmcgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgYmVsb3cKICAgICAgICAgc2hpZnQrKzsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0gZWxzZSB7CiAgICAgICAgIGFzc2VydChwQ29udGV4dC0+bVNjYWxpbmdNb2RlID09IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX0FTX1BMQVlFRCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgLy8gTm90ZTogaWYgY2hhbm5lbHMgYXJlIHVuY29ycmVsYXRlZCwgMS9zcXJ0KE4pIGNvdWxkIGJlIHVzZWQgYXQgdGhlIHJpc2sgb2YgY2xpcHBpbmcuCisgICAgICAgIGZzY2FsZSA9IDEuZiAvIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyAgLy8gYWNjb3VudCBmb3Igc3VtbWluZyBhbGwgdGhlIGNoYW5uZWxzIHRvZ2V0aGVyLgorI2Vsc2UKICAgICAgICAgc2hpZnQgPSA5OworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogCiAgICAgdWludDMyX3QgY2FwdElkeDsKICAgICB1aW50MzJfdCBpbklkeDsKICAgICB1aW50OF90ICpidWYgPSBwQ29udGV4dC0+bUNhcHR1cmVCdWY7CiAgICAgZm9yIChpbklkeCA9IDAsIGNhcHRJZHggPSBwQ29udGV4dC0+bUNhcHR1cmVJZHg7Ci0gICAgICAgICBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgaW5JZHgrKywgY2FwdElkeCsrKSB7Ci0gICAgICAgIGlmIChjYXB0SWR4ID49IENBUFRVUkVfQlVGX1NJWkUpIHsKLSAgICAgICAgICAgIC8vIHdyYXAgYXJvdW5kCi0gICAgICAgICAgICBjYXB0SWR4ID0gMDsKKyAgICAgICAgIGluSWR4IDwgc2FtcGxlTGVuOworICAgICAgICAgY2FwdElkeCsrKSB7CisgICAgICAgIGlmIChjYXB0SWR4ID49IENBUFRVUkVfQlVGX1NJWkUpIGNhcHRJZHggPSAwOyAvLyB3cmFwCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBmbG9hdCBzbXAgPSAwLmY7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICBzbXAgKz0gaW5CdWZmZXItPmYzMltpbklkeCsrXTsKICAgICAgICAgfQotICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbMiAqIGluSWR4XSArIGluQnVmZmVyLT5zMTZbMiAqIGluSWR4ICsgMV07Ci0gICAgICAgIHNtcCA9IHNtcCA+PiBzaGlmdDsKKyAgICAgICAgYnVmW2NhcHRJZHhdID0gY2xhbXA4X2Zyb21fZmxvYXQoc21wICogZnNjYWxlKTsKKyNlbHNlCisgICAgICAgIGNvbnN0IGludDMyX3Qgc21wID0gKGluQnVmZmVyLT5zMTZbaW5JZHhdICsgaW5CdWZmZXItPnMxNltpbklkeCArIDFdKSA+PiBzaGlmdDsKKyAgICAgICAgaW5JZHggKz0gRkNDXzI7ICAvLyBpbnRlZ2VyIHN1cHBvcnRzIHN0ZXJlbyBvbmx5LgogICAgICAgICBidWZbY2FwdElkeF0gPSAoKHVpbnQ4X3Qpc21wKV4weDgwOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogCiAgICAgLy8gWFhYIHRoZSBmb2xsb3dpbmcgdHdvIHNob3VsZCByZWFsbHkgYmUgYXRvbWljLCB0aG91Z2ggaXQgcHJvYmFibHkgZG9lc24ndApAQCAtNDAwLDYgKzQ1NywxNSBAQAogICAgIH0KIAogICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlTGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBzYW1wbGVMZW4gKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorI2Vsc2UKICAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgewogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOwpAQCAtNDA3LDYgKzQ3Myw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCmluZGV4IDAxZjAxNGYuLmE5NzczMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKQEAgLTg2LDcgKzg2LDcgQEAKICAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWlmU3RyZWFtPiBtU3RyZWFtOwogICAgIGJvb2wgbUVPUzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbUNhY2hlOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1DYWNoZTsKICAgICBvZmY2NF90IG1DYWNoZWRPZmZzZXQ7CiAgICAgc2l6ZV90IG1DYWNoZWRTaXplOwogICAgIHNpemVfdCBtQ2FjaGVCdWZmZXJTaXplOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgIC8vIGl0J3MgcmVhY2hpbmcgbWF4IGNhY2hlIGJ1ZmZlciBzaXplLCBuZWVkIHRvIHJvbGwgd2luZG93LCBhbmQgcG9zc2libHkKICAgICAgICAgLy8gZXhwYW5kIHRoZSBjYWNoZSBidWZmZXIuCiAgICAgICAgIHNpemVfdCBuZXdDYWNoZUJ1ZmZlclNpemUgPSBtQ2FjaGVCdWZmZXJTaXplOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbmV3Q2FjaGU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG5ld0NhY2hlOwogICAgICAgICB1aW50OF90KiBkc3QgPSBtQ2FjaGUuZ2V0KCk7CiAgICAgICAgIGlmIChuZXdDYWNoZUJ1ZmZlclNpemUgPCBrTWF4Q2FjaGVCdWZmZXJTaXplKSB7CiAgICAgICAgICAgICBuZXdDYWNoZUJ1ZmZlclNpemUgPSBrTWF4Q2FjaGVCdWZmZXJTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmggYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAppbmRleCA1MTgzYzM5Li5hYTEwZjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAorKysgYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaApAQCAtNzQsNyArNzQsNyBAQAogICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCiAgICAgdWludDMyX3QgbUJ5dGVzUGVyUGl4ZWw7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbAogICAgIHVpbnQzMl90IG1JY2NTaXplOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1JY2NEYXRhOyAvLyBBY3R1YWwgSUNDIGRhdGEsIG1lbW9yeSBpcyBvd25lZCBieSB0aGlzIHN0cnVjdHVyZQorICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1JY2NEYXRhOyAvLyBBY3R1YWwgSUNDIGRhdGEsIG1lbW9yeSBpcyBvd25lZCBieSB0aGlzIHN0cnVjdHVyZQogfTsKIAogLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IGY5ZTdiOTUuLjYwMDJlOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMjEsNyArMjEsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAotICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIiwgIlRpbWVDaGVjay5jcHAiXSwKKyAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKQEAgLTMzLDYgKzMzLDkgQEAKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKICAgICBjbGFuZzogdHJ1ZSwKIH0KIApAQCAtMTIyLDYgKzEyNSwxMCBAQAogICAgICAgICAibGlic29uaXZveCIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKQEAgLTE0MCw3ICsxNDcsNyBAQAogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibWVkaWF1cGRhdGVzZXJ2aWNlX2FpZGwiLAogICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVVwZGF0ZVNlcnZpY2UuYWlkbCIsCiAgICAgXSwKIH0KIApAQCAtMTgzLDYgKzE5MCw4IEBACiAgICAgICAgICJNZWRpYVJlc291cmNlUG9saWN5LmNwcCIsCiAgICAgICAgICJWaXN1YWxpemVyLmNwcCIsCiAgICAgICAgICJTdHJpbmdBcnJheS5jcHAiLAorICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAogICAgIF0sCiAKICAgICBhaWRsOiB7CkBAIC0xOTIsMTAgKzIwMSwxMiBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTI1MywxOCArMjY0LDEzIEBACiAgICAgfSwKIH0KIAotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZURlc2MuY3BwIiwKLSAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCi0gICAgICAgICJJTWVkaWFFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0J1ZmZlci5jcHAiLAotICAgICAgICAiTWVkaWFVdGlscy5jcHAiLAogICAgICAgICAiTWV0YWRhdGEuY3BwIiwKICAgICAgICAgIk5ka1dyYXBwZXIuY3BwIiwKICAgICBdLApAQCAtMjc2LDcgKzI4Miw3IEBACiAgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0yOTEsNiArMjk3LDEwIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCmluZGV4IDAzNGY3YzIuLjFjOTVlMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0tFWV9BVURJT19MQU5HVUFHRV9QUkVGRVJSRUQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQgPSBBVURJT19QQVJBTUVURVJfTU9OT19PVVRQVVQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Db25uZWN0ID0gQVVESU9fUEFSQU1FVEVSX0RFVklDRV9DT05ORUNUOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBkNzUzM2NhLi4wMjk1YWJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGFjYTdhZDkuLmJkMThhNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCmluZGV4IGYxODVmZDQuLmU3ZGE0ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcApAQCAtMTg2LDYgKzE4Niw5IEBACiAgICAgICAgIHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBBTE9HVigicmVhZE11bHRpcGxlIHN0YXR1cyAlZCwgYnVmZmVyQ291bnQgJXUsIHNpbmNlU3RvcCAldSIsCiAgICAgICAgICAgICAgICAgcmV0LCBidWZmZXJDb3VudCwgbUJ1ZmZlcnNTaW5jZVN0b3ApOworICAgICAgICBpZiAoYnVmZmVyQ291bnQgJiYgcmV0ID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBlMGY1YTQwLi4wOGM2YTUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNDgsNyArNDgsOCBAQAogICAgIHsiYW1yd2IiLCAgQVVESU9fRU5DT0RFUl9BTVJfV0J9LAogICAgIHsiYWFjIiwgICAgQVVESU9fRU5DT0RFUl9BQUN9LAogICAgIHsiaGVhYWMiLCAgQVVESU9fRU5DT0RFUl9IRV9BQUN9LAotICAgIHsiYWFjZWxkIiwgQVVESU9fRU5DT0RFUl9BQUNfRUxEfQorICAgIHsiYWFjZWxkIiwgQVVESU9fRU5DT0RFUl9BQUNfRUxEfSwgCisgICAgeyJvcHVzIiwgICBBVURJT19FTkNPREVSX09QVVN9CiB9OwogCiBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0ZpbGVGb3JtYXRNYXBbXSA9IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggNWNhM2I0OC4uZDhlZjljZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAKIHN0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgewogICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7CkBAIC00OSwxMCArNTAsNDcgQEAKICAgICBtRGF0YVNvdXJjZSA9IG51bGxwdHI7CiB9CiAKLU1pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgewotICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2UpIik7CitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IGNzb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCB+RGF0YVNvdXJjZVVud3JhcHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSkiKTsKICAgICBtRmQgPSAtMTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtQmFzZSA9IDA7CisgICAgbURhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZVVud3JhcHBlcihjc291cmNlKTsKICAgICBvZmY2NF90IGw7CiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZsKSA9PSBPSykgewogICAgICAgICBtTGVuZ3RoID0gbDsKQEAgLTY2LDYgKzEwNCw3IEBACiAgICAgaWYgKG1GZCA+PSAwKSB7CiAgICAgICAgIGNsb3NlKG1GZCk7CiAgICAgfQorICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogaW50IE1pZGlJb1dyYXBwZXI6OnJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYjkxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gVU5LTk9XTl9FUlJPUikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWZiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQorQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKmRhdGEpIHsKKyAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7CisgICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKKyAgICBtRGF0YS0+bUZvcm1hdCA9ICpkYXRhOworICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKKyAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgfQorICAgIHJldHVybiBtRGF0YTsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHNwPEFNZXNzYWdlPiAqZGVzdCkgeworICAgICpkZXN0ID0gbURhdGEtPm1Gb3JtYXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCmluZGV4IDExODQwN2UuLmVlZDk2ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCkBAIC0yNywyMyArMjcsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotLy8gVGVtcG9yYXJpbHkga2VlcGluZyBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdCgpIHdoZXJlIGl0IGlzIHVzZWQuCi0vLyBXaWxsIGJlIHJlbW92ZWQgc29vbiBpbiBmYXZvciBvZiBvZmZpY2lhbCBwdWJsaWMgQVBJcy4KLXN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgewotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFCdWZmZXI+IG1Qc3NoQnVmOwotfTsKLQotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoQU1lZGlhRXh0cmFjdG9yICogZXgpIHsKLSAgICBleC0+bUltcGwtPmRpc2Nvbm5lY3QoKTsKLSAgICByZXR1cm4gQU1FRElBX09LOwotfQorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMDgyLDE0ICsxMDcwLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChtQU1lZGlhRXh0cmFjdG9yKTsKLSAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOwotICAgIH0KLSAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci19Ci0KIEFNZWRpYUV4dHJhY3RvciAqQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0QU1lZGlhRXh0cmFjdG9yKCkgY29uc3QgewogICAgIHJldHVybiBtQU1lZGlhRXh0cmFjdG9yOwogfQpAQCAtMTI2NiwzNyArMTI0NiwyMSBAQAogICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKSk7CiB9CiAKLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBvZmY2NF90IHNpemUgPSAtMTsKLSAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOwotICAgIHJldHVybiBzaXplOwotfQotCi1zc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIHJldHVybiBzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1Ziwgc2l6ZSk7Ci19Ci0KLXZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgc291cmNlLT5jbG9zZSgpOwotfQotCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1BTWVkaWFEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2VfbmV3KCkpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBkYXRhU291cmNlLmdldCgpKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1BTWVkaWFEYXRhU291cmNlLCBkYXRhU291cmNlLmdldCgpKTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KTsKLSAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKTsKKyAgICAgIG1BTWVkaWFEYXRhU291cmNlKGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKGRhdGFTb3VyY2UpKSB7Cit9CisKK0FNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihBTWVkaWFEYXRhU291cmNlICphRGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKE5VTEwpLAorICAgICAgbUFNZWRpYURhdGFTb3VyY2UoYURhdGFTb3VyY2UpIHsKIH0KIAogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6On5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpIHsKICAgICBpZiAobUFNZWRpYURhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKG1BTWVkaWFEYXRhU291cmNlKTsKICAgICBtQU1lZGlhRGF0YVNvdXJjZSA9IE5VTEw7CiB9CkBAIC0xMzA1LDQgKzEyNjksOCBAQAogICAgIHJldHVybiBtQU1lZGlhRGF0YVNvdXJjZTsKIH0KIAordm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6Y2xvc2UoKSB7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNWQ0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKLSAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCi0gICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQotewotfQotCi1UaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7Ci0gICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLW5zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7Ci0gICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci0gICAgcmV0dXJuIGVuZFRpbWVOczsKLX0KLQotdm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOwotICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotCi0gICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKLSAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0Ci0gICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOwotICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOwotICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOwotICAgICAgICB9Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiVGltZUNoZWNrIHRpbWVvdXQgZm9yICVzIiwgdGFnKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggYTNkYjc1NC4uYjVhNzE3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTEzMiw2ICsxMzIsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0RJUkVDVCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMjMyLDYgKzIzMywxMiBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQUIpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTI3OCw2ICsyODUsNyBAQAogCiB0ZW1wbGF0ZSA8PgogY29uc3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6VGFibGUgU3RyZWFtVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9ERUZBVUxUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fU1lTVEVNKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1JJTkcpLApAQCAtMzU0LDYgKzM2MiwyMiBAQAogICAgIFRFUk1JTkFUT1IKIH07CiAKK3RlbXBsYXRlIDw+Citjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9ORSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfU0VDVVJFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TQ08pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JFQUNPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfSE9UV09SRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JZUEFTU19NVVRFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19MT1dfTEFURU5DWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIFRFUk1JTkFUT1IKK307CisKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjsKQEAgLTM2Nyw2ICszOTEsNyBAQAogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxBdWRpb01vZGVUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvRmxhZ1RyYWl0cz47CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpIHsKICAgICByZXR1cm4gSW5wdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKSB8fApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjFiYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiBTZXJ2aWNlIHRvIHJlbG9hZCBleHRyYWN0b3IgcGx1Z2lucyB3aGVuIHVwZGF0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC91bmluc3RhbGxlZC4KLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIHsKLSAgICB2b2lkIGxvYWRQbHVnaW5zKEB1dGY4SW5DcHAgU3RyaW5nIGFwa1BhdGgpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFVcGRhdGVTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3Nzk2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFVcGRhdGVTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFNlcnZpY2UgdG8gcmVsb2FkIG1lZGlhIGNvbXBvbmVudCBwbHVnaW5zIHdoZW4gdXBkYXRlIHBhY2thZ2UgaXMgaW5zdGFsbGVkL3VuaW5zdGFsbGVkLgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElNZWRpYVVwZGF0ZVNlcnZpY2UgeworICAgIHZvaWQgbG9hZFBsdWdpbnMoQHV0ZjhJbkNwcCBTdHJpbmcgYXBrUGF0aCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAppbmRleCBkNmE5Y2ZiLi5lYTQxNTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKQEAgLTc4LDYgKzc4LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKICAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCkBAIC0xODYsNiArMTg3LDcgQEAKIAogICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogCkBAIC0yMTYsNiArMjE4LDUzIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQ7IC8vIGZsYWcgZm9yIGN1cnJlbnQgcGFyYW1ldGVycyB2YWxpZGl0eQogfTsKIAorLy8gQWRqdXN0QnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBhZGp1c3Qgc2FtcGxlIGRhdGEuCisvLyBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZCBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLgorLy8gRXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgb21pdHRlZCBmcm9tIHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KK2NsYXNzIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpOworICAgIC8vT3ZlcnJpZGVzCisgICAgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOworfTsKKworLy8gQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gYWRqdXN0IHNhbXBsZSBkYXRhLgorLy8gRXhwYW5kcyBvciBjb250cmFjdHMgc2FtcGxlIGRhdGEgZnJvbSBvbmUgaW50ZXJsZWF2ZWQgY2hhbm5lbCBmb3JtYXQgdG8gYW5vdGhlci4KKy8vIEV4dHJhIGV4cGFuZGVkIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCBpbiBmcm9tIHRoZSBlbmQgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIG91dHB1dCBidWZmZXIuCitjbGFzcyBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCBzaXplX3QgY29udHJhY3RlZEZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkKiBjb250cmFjdGVkQnVmZmVyKTsKKyAgICAvL092ZXJyaWRlcworICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBwQnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpIG92ZXJyaWRlOworICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKworICAgIHZvaWQgY2xlYXJDb250cmFjdGVkRnJhbWVzKCkgeyBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOyB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbkNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0Q2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplSW5CeXRlczsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtQ29udHJhY3RlZEZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtQ29udHJhY3RlZEZyYW1lQ291bnQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUNvbnRyYWN0ZWRCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplOworfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCmluZGV4IGMxOTAyNjEuLjQzMzY3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKQEAgLTMwLDYgKzMwLDExIEBACiAvLyBBIGJpbmRlciBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyBhIHN0YWdlZnJpZ2h0IERhdGFTb3VyY2UgcmVtb3RlbHkuCiBzdHJ1Y3QgRGF0YVNvdXJjZURlc2MgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CisgICAgLy8gaW50ZW50aW9uYWxseSBsZXNzIHRoYW4gSU5UNjRfTUFYCisgICAgLy8ga2VlcCBjb25zaXN0ZW50IHdpdGggSkFWQSBjb2RlCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWVNcyA9IDB4N2ZmZmZmZmZmZmZmZmZmbGwgLyAxMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lVXMgPSBrTWF4VGltZU1zICogMTAwMDsKKwogICAgIGVudW0gewogICAgICAgICAvKiBObyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBzZXQgeWV0ICovCiAgICAgICAgIFRZUEVfTk9ORSAgICAgPSAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKaW5kZXggZjI2N2Y3Ni4uMzMwMjk4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KQEAgLTM2LDYgKzM4LDcgQEAKIHVzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbjsKIHVzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CkBAIC0xMTMsNiArMTE2LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKQEAgLTE4Miw2ICsxOTAsNyBAQAogICAgIGNvbnN0IFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CiAgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKICAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CiAgICAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7CiAKICAgICAvLyBNdXRhYmxlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiB3aXRoaW4gR2V0UHJvcGVydHlCeXRlQXJyYXkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCmluZGV4IDhlOWViM2EuLjQ5MTY2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC03NSw4ICs3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcElkcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CkBAIC05MSw2ICs5MSwxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyMTdkZTE0Li5mMmUyMDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMjYsMTEgKzI2LDExIEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElNZWRpYVBsYXllcjsKIGNsYXNzIElNZWRpYUNvZGVjTGlzdDsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaAppbmRleCBmYjExNDM1Li5lYTBhYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaApAQCAtMjYsOCArMjYsNyBAQAogcHVibGljOgogICAgIC8qIENyZWF0ZXMgYSBKYXZhIEF1ZGlvQXR0cmlidXRlcyBvYmplY3QuICovCiAgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKEpOSUVudiAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykgewogCiAgICAgICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyIik7CiAgICAgICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtNTgsMTEgKzU3LDYgQEAKICAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSB0aGUgJ3RhZ3MnIChjaGFyW10gdG8gSGFzaFNldDxTdHJpbmc+KS4KICAgICAgICAgICAgIC8vIEhvdyB0byBwYXJzZSB0aGUgY2hhcltdPyBJcyB0aGVyZSBhbnkgZXhhbXBsZSBvZiBpdD8KICAgICAgICAgICAgIC8vIEFsc28sIHRoZSBhZGRUYWdzKCkgbWV0aG9kIGlzIGhpZGRlbi4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENhbGwgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIuc2V0TGVnYWN5U3RyZWFtVHlwZSgpLmJ1aWxkKCkKLSAgICAgICAgICAgIGptZXRob2RJRCBqU2V0TGVnYWN5U3RyZWFtVHlwZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRMZWdhY3lTdHJlYW1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOwotICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRMZWdhY3lTdHJlYW1UeXBlLCBzdHJlYW1UeXBlKTsKICAgICAgICAgfQogCiAgICAgICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAppbmRleCBiNWU1NjVlLi5iMTlkNDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApAQCAtMjMsMTEgKzIzLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlcjsKKwogY2xhc3MgTWlkaUlvV3JhcHBlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKTsKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSk7Ci0gICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKTsKIAogICAgIH5NaWRpSW9XcmFwcGVyKCk7CiAKQEAgLTQwLDcgKzQzLDcgQEAKICAgICBpbnQgbUZkOwogICAgIG9mZjY0X3QgbUJhc2U7CiAgICAgaW50NjRfdCAgbUxlbmd0aDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZVVud3JhcHBlciAqbURhdGFTb3VyY2U7CiAgICAgRUFTX0ZJTEUgbUVhc0ZpbGU7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCmluZGV4IGM5N2QxNzEuLjhhNDE3ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCkBAIC0yNzgsNiArMjc4LDI1IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhQ29kZWNXcmFwcGVyKTsKIH07CiAKK3N0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+Jik7CisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoQU1lZGlhRGF0YVNvdXJjZSopOworCisgICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOworCisgICAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKK307CisKIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewogCiAgICAgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3IgKmFNZWRpYUV4dHJhY3Rvcik7CkBAIC0yODcsOCArMzA2LDYgQEAKIAogICAgIHN0YXR1c190IHJlbGVhc2UoKTsKIAotICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKLQogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbik7CkBAIC0zMzksMzEgKzM1Niw2IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRXh0cmFjdG9yV3JhcHBlcik7CiB9OwogCi1zdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycik7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKLQotICAgIHN0YXRpYyB2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKLX07Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTkRLX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorI2RlZmluZSBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisvLyBUaGlzIGlzIGEgaGVhZGVyLW9ubHkgdXRpbGl0eS4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXRjaEJ1aWxkZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgbWl4X3VzZWNhc2VfdCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ6OnVzZWNhc2UpOworCisgICAgUGF0Y2hCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gQWxsIGV4aXN0aW5nIG1ldGhvZHMgb3BlcmF0aW5nIG9uIGF1ZGlvIHBhdGNoZXMgdGFrZSBhIHBvaW50ZXIgdG8gY29uc3QuCisgICAgLy8gSXQncyBPSyB0byBjb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgUGF0Y2hCdWlsZGVyIHdoaWxlIHByZXBhcmluZyBhIHBhcmFtZXRlcgorICAgIC8vIHRvIHN1Y2ggYSBmdW5jdGlvbiBiZWNhdXNlIHRoZSBCdWlsZGVyIHdpbGwgYmUga2VwdCBhbGl2ZSB1bnRpbCB0aGUgY29kZQorICAgIC8vIGV4ZWN1dGlvbiByZWFjaGVzIHRoZSBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudCBzZW1pY29sb24uCisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCgpIGNvbnN0IHsgcmV0dXJuICZtUGF0Y2g7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUG9ydENmZ3MgeworICAgICAgICBQb3J0Q2Zncyh1bnNpZ25lZCBpbnQgKmNvdW50UHRyLCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnBvcnRDZmdzKQorICAgICAgICAgICAgICAgIDogbUNvdW50UHRyKGNvdW50UHRyKSwgbVBvcnRDZmdzKHBvcnRDZmdzKSB7fQorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0Q2ZnKSB7CisgICAgICAgICAgICByZXR1cm4gKmFkdmFuY2UoKSA9IHBvcnRDZmc7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBzcDxUPiYgZW50aXR5KSB7CisgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyogYWRkZWQgPSBhZHZhbmNlKCk7CisgICAgICAgICAgICBlbnRpdHktPnRvQXVkaW9Qb3J0Q29uZmlnKGFkZGVkKTsKKyAgICAgICAgICAgIHJldHVybiAqYWRkZWQ7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXNlY2FzZVVwZGF0ZSkgeworICAgICAgICAgICAgYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlID0gdXNlY2FzZVVwZGF0ZTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LAorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248bWl4X3VzZWNhc2VfdChjb25zdCBtaXhfdXNlY2FzZV90Jik+IHVzZWNhc2VVcGRhdGVyKSB7CisgICAgICAgICAgICBtaXhfdXNlY2FzZV90KiB1c2VjYXNlID0gJmFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZTsKKyAgICAgICAgICAgICp1c2VjYXNlID0gdXNlY2FzZVVwZGF0ZXIoKnVzZWNhc2UpOworICAgICAgICB9CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogYWR2YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAmbVBvcnRDZmdzWygqbUNvdW50UHRyKSsrXTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBpbnQgKm1Db3VudFB0cjsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICptUG9ydENmZ3M7CisgICAgfTsKKworICAgIFBvcnRDZmdzIHNpbmtzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7IH0KKyAgICBQb3J0Q2ZncyBzb3VyY2VzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc291cmNlcywgbVBhdGNoLnNvdXJjZXMpOyB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoID0ge307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCmluZGV4IGQ0MjM5NjIuLmMyNzYxY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCkBAIC05OSw2ICs5OSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1BY2sgLSBzZXF1ZW5jZSA+PSAwOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIChvciB0aGUgY29udGVudHMgb2YgdGhlIHNoYXJlZCBidWZmZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy8gaWYgbm8gdmFsdWUgd2FzIHdyaXR0ZW4pLgorICAgICAgICBUIGxhc3QoKSBjb25zdAorICAgICAgICB7ICAgLy8gYXNzdW1lIG5vIHNlcXVlbmNlIGNoZWNrIHJlcXVpcmVkIC0gd2UgYXJlIHRoZSB3cml0ZXIuCisgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bVZhbHVlOworICAgICAgICB9CisKICAgICBwcml2YXRlOgogICAgICAgICBpbnQzMl90ICAgICBtU2VxdWVuY2U7CiAgICAgICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmluZGV4IDg2ZjBkNGMuLjQxOGUwOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzAsNzcgKzMxLDU1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFNhbXBsZVJhdGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRGV2aWNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19kZXZpY2VzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKLXN0cnVjdCBPdXRwdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19vdXRwdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IElucHV0RmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9faW5wdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEZvcm1hdFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZm9ybWF0X3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBDaGFubmVsVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jaGFubmVsX21hc2tfdCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBHYWluTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZ2Fpbl9tb2RlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBTdHJlYW1UcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3N0cmVhbV90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBBdWRpb01vZGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvQ29udGVudFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fY29udGVudF90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBVc2FnZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fdXNhZ2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFNvdXJjZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc291cmNlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IERlZmF1bHRUcmFpdHMKIHsKICAgICB0eXBlZGVmIFQgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICB9CiB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU29ydGVkVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OworCit1c2luZyBTYW1wbGVSYXRlVHJhaXRzID0gU29ydGVkVmVjdG9yVHJhaXRzPHVpbnQzMl90PjsKK3VzaW5nIERldmljZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZGV2aWNlc190PjsKK3N0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Oworc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKK3VzaW5nIENoYW5uZWxUcmFpdHMgPSBTb3J0ZWRWZWN0b3JUcmFpdHM8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+Oworc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3VzaW5nIElucHV0RmxhZ1RyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9faW5wdXRfZmxhZ3NfdD47Cit1c2luZyBPdXRwdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19vdXRwdXRfZmxhZ3NfdD47Cit1c2luZyBGb3JtYXRUcmFpdHMgPSBWZWN0b3JUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+OwordXNpbmcgR2Fpbk1vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2dhaW5fbW9kZV90PjsKK3VzaW5nIFN0cmVhbVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBBdWRpb01vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX21vZGVfdD47Cit1c2luZyBBdWRpb0NvbnRlbnRUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2NvbnRlbnRfdHlwZV90PjsKK3VzaW5nIFVzYWdlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb191c2FnZV90PjsKK3VzaW5nIFNvdXJjZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc291cmNlX3Q+Oworc3RydWN0IEF1ZGlvRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGF1ZGlvX2ZsYWdzX21hc2tfdD4ge307CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CiBzdGF0aWMgdm9pZCBjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCkBAIC0xMTAsNyArODksNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmICh1dGlsaXRpZXM6OmNvbnZlcnRUbzxzdGQ6OnN0cmluZywgdHlwZW5hbWUgVHJhaXRzOjpUeXBlID4oY3N0ciwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKQEAgLTE4MSw3ICsxNjAsNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmIChmcm9tU3RyaW5nKGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7CkBAIC0yMzQsNiArMjEzLDcgQEAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+IFVzYWdlVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPiBBdWRpb0ZsYWdDb252ZXJ0ZXI7CiAKIHRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwpAQCAtMjQ5LDYgKzIyOSw3IEBACiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFVzYWdlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107CiAKIGJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwogCkBAIC0yNzQsNiArMjU1LDY5IEBACiBPdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRDaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK3sKKyAgICBzdGQ6OnN0cmluZyB1c2FnZUxpdGVyYWw7CisgICAgaWYgKCFhbmRyb2lkOjpVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCB1c2FnZTogJWQiLCB1c2FnZSk7CisgICAgICAgIHJldHVybiAiQVVESU9fVVNBR0VfVU5LTk9XTiI7CisgICAgfQorICAgIHJldHVybiB1c2FnZUxpdGVyYWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudCkKK3sKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50TGl0ZXJhbDsKKyAgICBpZiAoIWFuZHJvaWQ6OkF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNvbnRlbnQsIGNvbnRlbnRMaXRlcmFsKSkgeworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIGNvbnZlcnQgY29udGVudCB0eXBlOiAlZCIsIGNvbnRlbnQpOworICAgICAgICByZXR1cm4gIkFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOIjsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRlbnRMaXRlcmFsOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbUxpdGVyYWw7CisgICAgaWYgKCFhbmRyb2lkOjpTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhzdHJlYW0sIHN0cmVhbUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCBzdHJlYW06ICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuICJBVURJT19TVFJFQU1fREVGQVVMVCI7CisgICAgfQorICAgIHJldHVybiBzdHJlYW1MaXRlcmFsOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VMaXRlcmFsOworICAgIGlmICghYW5kcm9pZDo6U291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoc291cmNlLCBzb3VyY2VMaXRlcmFsKSkgeworICAgICAgICBBTE9HVigiZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlOiAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiAiQVVESU9fU09VUkNFX0RFRkFVTFQiOworICAgIH0KKyAgICByZXR1cm4gc291cmNlTGl0ZXJhbDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpCit7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICByZXN1bHQgPDwgInsgQ29udGVudCB0eXBlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuY29udGVudF90eXBlKQorICAgICAgICAgICA8PCAiIFVzYWdlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMudXNhZ2UpCisgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IHRvU3RyaW5nKGF0dHJpYnV0ZXMuc291cmNlKQorICAgICAgICAgICA8PCAiIEZsYWdzOiAiIDw8IGF0dHJpYnV0ZXMuZmxhZ3MKKyAgICAgICAgICAgPDwgIiBUYWdzOiAiIDw8IGF0dHJpYnV0ZXMudGFncworICAgICAgICAgICA8PCAiIH0iOworCisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhhdWRpb19tb2RlX3QgbW9kZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBtb2RlTGl0ZXJhbDsKKyAgICBpZiAoIWFuZHJvaWQ6OkF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobW9kZSwgbW9kZUxpdGVyYWwpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gY29udmVydCBtb2RlOiAlZCIsIG1vZGUpOworICAgICAgICByZXR1cm4gIkFVRElPX01PREVfSU5WQUxJRCI7CisgICAgfQorICAgIHJldHVybiBtb2RlTGl0ZXJhbDsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvKkFORFJPSURfVFlQRV9DT05WRVJURVJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkOGIwZmU3Li5iZGYxYWFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCiAgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCiAKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LApAQCAtODEsNiArODEsOSBAQAogICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCiAKKyAgICAvKiBPcHVzIGRhdGEgaW4gYSBPR0cgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9PR0cgPSAxMSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAogICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKKyAgICBBVURJT19FTkNPREVSX09QVVMgPSA3LAogCiAgICAgQVVESU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXVkaW8gZW5jb2RlciB0eXBlCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKaW5kZXggYjQzYjhmNi4uMWFhMWUxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKKyAgICBzdGF0aWM6IHsKKyAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgICAgICItRE5PX0lNRU1PUlkiLAorICAgICAgICBdLAorICAgIH0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtMjIsMTcgKzMxLDIyIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIHNyY3M6IFsKICAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCiAgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAogICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCiAgICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCiAgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1ldGFEYXRhLmNwcCIsCiAgICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKLSAgICAgICAgIlZvcmJpc0NvbW1lbnQuY3BwIiwKICAgICBdLAogCiAgICAgY2xhbmc6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKaW5kZXggZDE5N2IzZi4uYmFiM2EwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyLmNwcApAQCAtMzksOCArMzksNyBAQAogICAgICAgbVJhbmdlT2Zmc2V0KDApLAogICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAogICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7CisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgewogfQogCiBNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCkBAIC01MSwxMSArNTAsMTMgQEAKICAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKICAgICAgIG1Pd25zRGF0YSh0cnVlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7CisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworI2lmbmRlZiBOT19JTUVNT1JZCiAgICAgaWYgKHNpemUgPCBrU2hhcmVkTWVtVGhyZXNob2xkCiAgICAgICAgICAgICB8fCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtVXNlU2hhcmVkTWVtb3J5LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSAwKSB7CisjZW5kaWYKICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7CisjaWZuZGVmIE5PX0lNRU1PUlkKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7CiAgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0KQEAgLTczLDYgKzc0LDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgc2hhcmVkIG1lbSBidWZmZXIgb2Ygc2l6ZSAlenUgQCAlcCIsIHNpemUsIG1EYXRhKTsKICAgICAgICAgfQogICAgIH0KKyNlbmRpZgogfQogCiBNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKQEAgLTg0LDggKzg2LDcgQEAKICAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCiAgICAgICBtQnVmZmVyKGJ1ZmZlciksCiAgICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7CiB9CiAKIHZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7CkBAIC0xNjIsMTEgKzE2Myw2IEBACiAgICAgICAgIG1EYXRhID0gTlVMTDsKICAgICB9CiAKLSAgICBpZiAobU9yaWdpbmFsICE9IE5VTEwpIHsKLSAgICAgICAgbU9yaWdpbmFsLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1PcmlnaW5hbCA9IE5VTEw7Ci0gICAgfQotCiAgICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7CiAgICB9CkBAIC0xNzgsMTUgKzE3NCw0IEBACiAgICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSAqTWVkaWFCdWZmZXI6OmNsb25lKCkgewotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobURhdGEsIG1TaXplKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aCk7Ci0gICAgYnVmZmVyLT5tTWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCptTWV0YURhdGEpOwotCi0gICAgYWRkX3JlZigpOwotICAgIGJ1ZmZlci0+bU9yaWdpbmFsID0gdGhpczsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCmluZGV4IDJhOGRkNDEuLjg0ZmY5YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC00NCwxMiArNDQsMTYgQEAKIH07CiAKIE1lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0KQotICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIDogbVdyYXBwZXIobnVsbHB0ciksIG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OwogfQogCiBNZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKKyAgICA6IG1XcmFwcGVyKG51bGxwdHIpLCBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgaW5pdChidWZmZXJzLCBidWZmZXJfc2l6ZSwgZ3Jvd3RoTGltaXQpOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KSB7CiAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKIAogICAgIGlmIChtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CkBAIC01OCw2ICs2Miw3IEBACiAgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gYnVmZmVyczsKICAgICB9CiAKKyNpZm5kZWYgTk9fSU1FTU9SWQogICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7CiAgICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKICAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCkBAIC04MCw2ICs4NSw5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KKyNlbHNlCisgICAgKHZvaWQpa1NoYXJlZE1lbW9yeVRocmVzaG9sZDsKKyNlbmRpZgogCiAgICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewpAQCAtMTE3LDYgKzEyNSw3IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgIH0KICAgICBkZWxldGUgbUludGVybmFsOworICAgIGRlbGV0ZSBtV3JhcHBlcjsKIH0KIAogdm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjphZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CkBAIC0xNTcsMTEgKzE2NiwxNSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIHNpemVfdCBiaWdnZXN0ID0gcmVxdWVzdGVkU2l6ZTsKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOwogICAgICAgICBhdXRvIGZyZWUgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gYmlnZ2VzdCkgeworICAgICAgICAgICAgICAgIGJpZ2dlc3QgPSBzaXplOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc2LDcgKzE4OSw4IEBACiAgICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQogICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgewogICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NhdGVTaXplID0gcmVxdWVzdGVkU2l6ZSA9PSAwID8gYmlnZ2VzdCA6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7CiAgICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKICAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjNkYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7Ci0gICAgaWYgKCFMT0dfTkRFQlVHKSB7Ci0gICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOwotICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7Ci0gICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOwotICAgIH0KLX0KLQotTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9Ci0KLXVpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYzZjU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9Ci0KLU1lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlJlYWRPcHRpb25zKCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnJlc2V0KCkgewotICAgIG1PcHRpb25zID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgewotICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKLSAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0gICAgbVNlZWtNb2RlID0gbW9kZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7Ci0gICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKLX0KLQotYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAotICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgewotICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7Ci0gICAgKm1vZGUgPSBtU2Vla01vZGU7Ci0gICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiYWY1MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWb3JiaXNDb21tZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAibWVkaWEvVm9yYmlzQ29tbWVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBmbGFjQnVmZmVyID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKSk7Ci0gICAgaWYgKGZsYWNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZmxhY1NpemUgPSBmbGFjQnVmZmVyLT5zaXplKCk7Ci0gICAgdWludDhfdCAqZmxhYyA9IGZsYWNCdWZmZXItPmRhdGEoKTsKLSAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7Ci0KLSAgICB1aW50MzJfdCBwaWNUeXBlOwotICAgIHVpbnQzMl90IHR5cGVMZW47Ci0gICAgdWludDMyX3QgZGVzY0xlbjsKLSAgICB1aW50MzJfdCBkYXRhTGVuOwotICAgIGNoYXIgdHlwZVsxMjhdOwotCi0gICAgaWYgKGZsYWNTaXplIDwgOCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKLQotICAgIGlmIChwaWNUeXBlICE9IDMpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOwotICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAotICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOwotICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOwotCi0gICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKLQotICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOwotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCi0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKLSAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICBrS2V5QWxidW1BcnQsIDAsICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgdHlwZSk7Ci19Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkKLXsKLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOwotICAgICAgICB1aW50MzJfdCBtS2V5OwotICAgIH0ga01hcFtdID0gewotICAgICAgICB7ICJUSVRMRSIsIGtLZXlUaXRsZSB9LAotICAgICAgICB7ICJBUlRJU1QiLCBrS2V5QXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJDT01QSUxBVElPTiIsIGtLZXlDb21waWxhdGlvbiB9LAotICAgICAgICB7ICJBTEJVTSIsIGtLZXlBbGJ1bSB9LAotICAgICAgICB7ICJDT01QT1NFUiIsIGtLZXlDb21wb3NlciB9LAotICAgICAgICB7ICJHRU5SRSIsIGtLZXlHZW5yZSB9LAotICAgICAgICB7ICJBVVRIT1IiLCBrS2V5QXV0aG9yIH0sCi0gICAgICAgIHsgIlRSQUNLTlVNQkVSIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKLSAgICAgICAgeyAiRElTQ05VTUJFUiIsIGtLZXlEaXNjTnVtYmVyIH0sCi0gICAgICAgIHsgIkRBVEUiLCBrS2V5RGF0ZSB9LAotICAgICAgICB7ICJZRUFSIiwga0tleVllYXIgfSwKLSAgICAgICAgeyAiTFlSSUNJU1QiLCBrS2V5V3JpdGVyIH0sCi0gICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBrS2V5QWxidW1BcnQgfSwKLSAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwga0tleUF1dG9Mb29wIH0sCi0gICAgfTsKLQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7Ci0gICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQotICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tZW50W3RhZ0xlbiArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGggLSB0YWdMZW4gLSAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKCZjb21tZW50W3RhZ0xlbiArIDFdLCAidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUF1dG9Mb29wLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCmluZGV4IDBlNTlmMzkuLjFmN2E0NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMzQsNyArMzUsNyBAQAogCiBjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBEYXRhU291cmNlKCkge30KKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQogCiAgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKQEAgLTY5LDEwICs3MCwzNSBAQAogICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgfQogCisgICAgQ0RhdGFTb3VyY2UgKndyYXAoKSB7CisgICAgICAgIGlmIChtV3JhcHBlcikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgICAgICB9CisgICAgICAgIG1XcmFwcGVyID0gbmV3IENEYXRhU291cmNlKCk7CisgICAgICAgIG1XcmFwcGVyLT5oYW5kbGUgPSB0aGlzOworCisgICAgICAgIG1XcmFwcGVyLT5yZWFkQXQgPSBbXSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgLT4gc3NpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmdldFNpemUgPSBbXSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFNpemUoc2l6ZSk7CisgICAgICAgIH07CisgICAgICAgIG1XcmFwcGVyLT5mbGFncyA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdWludDMyX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+ZmxhZ3MoKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmdldFVyaSA9IFtdKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5nZXRVcmkodXJpU3RyaW5nLCBidWZmZXJTaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKwogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7fQorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICB9CiAKIHByaXZhdGU6CisgICAgQ0RhdGFTb3VyY2UgKm1XcmFwcGVyOwogICAgIERhdGFTb3VyY2UoY29uc3QgRGF0YVNvdXJjZSAmKTsKICAgICBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZSAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKaW5kZXggNTE5OTNkYS4uYWY1YjgzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApAQCAtNjYsNiArNjYsMTAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAqIC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhOThkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLXN0cnVjdCBNZWRpYVRyYWNrOwotCi0KLWNsYXNzIEV4dHJhY3RvckFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgRXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+RXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGZyZWVkOiAlcCIsIHRoaXMpOwotICAgIH0KLX07Ci0KLQotY2xhc3MgTWVkaWFFeHRyYWN0b3IKLS8vIDogcHVibGljIEV4dHJhY3RvckFsbG9jVHJhY2tlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yKCk7Ci0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKLQotICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKLSAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKLSAgICB9OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOwotCi0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgotICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKLSAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCi0gICAgfTsKLQotICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKLSAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KLQotICAgIHR5cGVkZWYgTWVkaWFFeHRyYWN0b3IqICgqQ3JlYXRvckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Ci0gICAgdHlwZWRlZiB2b2lkICgqRnJlZU1ldGFGdW5jKSh2b2lkICptZXRhKTsKLQotICAgIC8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCi0gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKLSAgICAvLyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLiBJZiAiZnJlZU1ldGEiIGlzIGdpdmVuLCBpdCB3aWxsIGJlCi0gICAgLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KLSAgICB0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Ci0gICAgfSB1dWlkX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGRlZl92ZXJzaW9uOwotCi0gICAgICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgotICAgICAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KLSAgICAgICAgdXVpZF90IGV4dHJhY3Rvcl91dWlkOwotCi0gICAgICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCi0gICAgICAgIC8vIGJlIHVzZWQuCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOwotCi0gICAgICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQotICAgICAgICBjb25zdCBjaGFyICpleHRyYWN0b3JfbmFtZTsKLQotICAgICAgICAvLyB0aGUgc25pZmZlciBmdW5jdGlvbgotICAgICAgICBjb25zdCBTbmlmZmVyRnVuYyBzbmlmZjsKLSAgICB9IEV4dHJhY3RvckRlZjsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IDE7Ci0KLSAgICB0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKLQotcHJvdGVjdGVkOgotICAgIE1lZGlhRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci0gICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLX07Ci0KLS8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKLS8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQotaW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCi0gICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCi0gICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgewotICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKLX0KLQotY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7Ci0gICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOwotfQotCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1jb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgewotICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOwotICAgIHJldHVybgotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCi0gICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHt7Ci0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKLSAgICAgICAgICAgIH19OwotfQotLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCi0vLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQotLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgotLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLS8vCi0vLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKLS8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCi0vLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCi0vLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKLQotI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQotCi0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWE2MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLQotY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTWVkaWFUcmFjawotLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgotewotICAgIE1lZGlhVHJhY2soKTsKLQotICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAotICAgIC8vIGdldEZvcm1hdCgpLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKSA9IDA7Ci0KLSAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKLSAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKLSAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgotICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7Ci0KLSAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCi0gICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCi0gICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCi0gICAgc3RydWN0IFJlYWRPcHRpb25zIHsKLSAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgewotICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DLAotICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCwKLSAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVgsCi0gICAgICAgIH07Ci0KLSAgICAgICAgUmVhZE9wdGlvbnMoKTsKLQotICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7Ci0gICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKLSAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7Ci0gICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKLQotICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCi0gICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgewotICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZW51bSBPcHRpb25zIHsKLSAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1PcHRpb25zOwotICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7Ci0gICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKLQotICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKLSAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLSAgICAvLyBpcyByZWFjaGVkLgotICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCi0gICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKLSAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCi0gICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLQotICAgIHZpcnR1YWwgfk1lZGlhVHJhY2soKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYVRyYWNrKGNvbnN0IE1lZGlhVHJhY2sgJik7Ci0gICAgTWVkaWFUcmFjayAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhVHJhY2sgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmEzMjk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBWT1JCSVNfQ09NTUVOVF9IXwotI2RlZmluZSBWT1JCSVNfQ09NTUVOVF9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFZPUkJJU19DT01NRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKaW5kZXggNWEyNTk2NS4uYWNlNjNhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtNDYsMTIgKzQ2LDEzIEBACiAgICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpOwogCiAgICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0KKyNpZm5kZWYgTk9fSU1FTU9SWQogICAgIE1lZGlhQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+ICZtZW0pIDoKICAgICAgICAgTWVkaWFCdWZmZXIoKHVpbnQ4X3QgKiltZW0tPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgbWVtLT5zaXplKCkpIHsKICAgICAgICAgLy8gZGVsZWdhdGUgYW5kIG92ZXJyaWRlIG1NZW1vcnkKICAgICAgICAgbU1lbW9yeSA9IG1lbTsKICAgICB9CisjZW5kaWYKIAogICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKICAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQpAQCAtODAsMTEgKzgxLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CiAKLSAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCk7Ci0KICAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCiAgICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgogICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgewpAQCAtOTcsMTcgKzkzLDI2IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisjaWZuZGVmIE5PX0lNRU1PUlkKICAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7CiAgICAgICAgIGludDMyX3QgcmVtb3RlUmVmY291bnQgPQogICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5nZXRSZW1vdGVSZWZjb3VudCgpOwogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgc28gdGhhdCByZW1vdGVSZWZDb3VudCgpIGlzIG5vbi1uZWdhdGl2ZS4KICAgICAgICAgcmV0dXJuIHJlbW90ZVJlZmNvdW50ID49IDAgPyByZW1vdGVSZWZjb3VudCA6IDA7IC8vIGRvIG5vdCBhbGxvdyBjb3JydXB0ZWQgZGF0YS4KKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCiAgICAgfQogCiAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKICAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworI2lmbmRlZiBOT19JTUVNT1JZCiAgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwogICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmFkZFJlbW90ZVJlZmNvdW50KHZhbHVlKTsKKyNlbHNlCisgICAgICAgICh2b2lkKSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKICAgICB9CiAKICAgICBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKQEAgLTExNSw4ICsxMjAsMTMgQEAKICAgICB9CiAKICAgICBzdGF0aWMgYm9vbCBpc0RlYWRPYmplY3QoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSkgeworI2lmbmRlZiBOT19JTUVNT1JZCiAgICAgICAgIGlmIChtZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obWVtb3J5LT5wb2ludGVyKCkpLT5pc0RlYWRPYmplY3QoKTsKKyNlbHNlCisgICAgICAgICh2b2lkKSBtZW1vcnk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8vIFN0aWNreSBvbiBlbmFibGluZyBvZiBzaGFyZWQgbWVtb3J5IE1lZGlhQnVmZmVycy4gQnkgZGVmYXVsdCB3ZSBkb24ndCB1c2UKQEAgLTE1OCw4ICsxNjgsNiBAQAogCiAgICAgTWV0YURhdGFCYXNlKiBtTWV0YURhdGE7CiAKLSAgICBNZWRpYUJ1ZmZlciAqbU9yaWdpbmFsOwotCiAgICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKIAogICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOwpAQCAtMjExLDcgKzIxOSwxMSBAQAogICAgIH07CiAKICAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKKyNpZm5kZWYgTk9fSU1FTU9SWQogICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCiAgICAgIH0KIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCmluZGV4IDZjOGQ5NGEuLmUyY2JmYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApAQCAtMTgsNiArMTgsMTAgQEAKIAogI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXwogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwpAQCAtNjYsMTcgKzcwLDY1IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApID0gMDsKIAotICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyQmFzZSBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UKLSAgICAvLyBjb3VudC4gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCkgPSAwOwotCiAgICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge307CisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkgeworICAgICAgICBkZWxldGUgbVdyYXBwZXI7CisgICAgICAgIGRlbGV0ZSBtRm9ybWF0OworICAgIH07CisKKyAgICBDTWVkaWFCdWZmZXIgKndyYXAoKSB7CisgICAgICAgIGlmIChtV3JhcHBlcikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgICAgICB9CisgICAgICAgIG1XcmFwcGVyID0gbmV3IENNZWRpYUJ1ZmZlcjsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlbGVhc2UgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHZvaWQgeworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnJlbGVhc2UoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+ZGF0YSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdm9pZCAqIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+ZGF0YSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5zaXplID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5zaXplKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnJhbmdlX29mZnNldCA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnJhbmdlX2xlbmd0aCA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnNldF9yYW5nZSA9IFtdKHZvaWQgKmhhbmRsZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgLT4gdm9pZCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnNldF9yYW5nZShvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPm1ldGFfZGF0YSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gQU1lZGlhRm9ybWF0KiB7CisgICAgICAgICAgICBpZiAoKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0OworICAgICAgICB9OworCisgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgTWVkaWFCdWZmZXJCYXNlKCkgeworICAgICAgICBtV3JhcHBlciA9IG51bGxwdHI7CisgICAgICAgIG1Gb3JtYXQgPSBudWxscHRyOworICAgIH0KK3ByaXZhdGU6CisgICAgQ01lZGlhQnVmZmVyICptV3JhcHBlcjsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAppbmRleCA3NWQ1ZGY3Li5hMTYyMTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApAQCAtMjAsNiArMjAsOCBAQAogCiAjaW5jbHVkZSA8bGlzdD4KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC01NywxMiArNTksNTQgQEAKICAgICAvLyBJZiBidWZmZXIgaXMgbnVsbHB0ciwgaGF2ZSBhY3F1aXJlX2J1ZmZlcigpIGNoZWNrIGZvciByZW1vdGUgcmVsZWFzZS4KICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogCisgICAgQ01lZGlhQnVmZmVyR3JvdXAgKndyYXAoKSB7CisgICAgICAgIGlmIChtV3JhcHBlcikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgICAgICB9CisKKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ01lZGlhQnVmZmVyR3JvdXA7CisgICAgICAgIG1XcmFwcGVyLT5oYW5kbGUgPSB0aGlzOworCisgICAgICAgIG1XcmFwcGVyLT5hZGRfYnVmZmVyID0gW10odm9pZCAqaGFuZGxlLCBzaXplX3Qgc2l6ZSkgLT4gdm9pZCB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZiA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKHNpemUpOworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5hZGRfYnVmZmVyKGJ1Zik7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmluaXQgPSBbXSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KSAtPiBib29sIHsKKyAgICAgICAgICAgICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+aW5pdChidWZmZXJzLCBidWZmZXJfc2l6ZSwgZ3Jvd3RoTGltaXQpOworICAgICAgICAgIC8vICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPm1XcmFwcGVyLT5pbml0ID0gbnVsbHB0cjsgLy8gZW5mb3JjZSBjYWxsLW9uY2UKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5hY3F1aXJlX2J1ZmZlciA9IFtdKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBDTWVkaWFCdWZmZXIgKipidWYsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmFjcXVpcmVkQnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9ICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+YWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICAgICAgICAgICZhY3F1aXJlZEJ1Ziwgbm9uQmxvY2tpbmcsIHJlcXVlc3RlZFNpemUpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBhY3F1aXJlZEJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9IGFjcXVpcmVkQnVmLT53cmFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWYgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5oYXNfYnVmZmVycyA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5oYXNfYnVmZmVycygpOworICAgICAgICB9OworCisgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICB9CisKIHByaXZhdGU6CisgICAgQ01lZGlhQnVmZmVyR3JvdXAgKm1XcmFwcGVyOwogICAgIHN0cnVjdCBJbnRlcm5hbERhdGE7CiAgICAgSW50ZXJuYWxEYXRhICptSW50ZXJuYWw7CiAKICAgICBNZWRpYUJ1ZmZlckdyb3VwKGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7CiAgICAgTWVkaWFCdWZmZXJHcm91cCAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7CisgICAgdm9pZCBpbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKaW5kZXggM2U0ZTg2Yy4uYjk5YzE0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC02OCw3ICs2OCw2IEBACiAgICAga0tleU9wdXNTZWVrUHJlUm9sbCAgID0gJ29zcHInLCAgLy8gdWludDY0X3QgKHNlZWsgcHJlcm9sbCBpbiBucykKICAgICBrS2V5RmxhY01ldGFkYXRhICAgICAgPSAnZmxNZCcsICAvLyByYXcgZGF0YQogICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQotICAgIGtLZXlXYW50c05BTEZyYWdtZW50cyA9ICdOQUxmJywKICAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzTXV4ZXJEYXRhICAgICAgID0gJ211eGQnLCAgLy8gaW50MzJfdCAoYm9vbCkKQEAgLTkwLDcgKzg5LDYgQEAKICAgICBrS2V5TWF4SGVpZ2h0ICAgICAgICAgPSAnbWF4SCcsCiAgICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCiAgICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAotICAgIGtLZXlJc0RSTSAgICAgICAgICAgICA9ICdpZHJtJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQogICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKIApAQCAtMTAyLDcgKzEwMCw2IEBACiAgICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZwogICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKICAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKLSAgICBrS2V5QWxidW1BcnRNSU1FICAgICAgPSAnYWxBTScsICAvLyBjc3RyaW5nCiAgICAga0tleUF1dGhvciAgICAgICAgICAgID0gJ2F1dGgnLCAgLy8gY3N0cmluZwogICAgIGtLZXlDRFRyYWNrTnVtYmVyICAgICA9ICdjZHRyJywgIC8vIGNzdHJpbmcKICAgICBrS2V5RGlzY051bWJlciAgICAgICAgPSAnZG51bScsICAvLyBjc3RyaW5nCkBAIC0xODIsNiArMTc5LDcgQEAKICAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQogICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKICAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlDQVByaXZhdGVEYXRhICAgICA9ICdjYWRjJywgIC8vIHJhdyBkYXRhCiAKICAgICBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrID0gJ2NibGsnLCAgLy8gdWludDhfdAogICAgIGtLZXlTa2lwQnl0ZUJsb2NrICAgICA9ICdzYmxrJywgIC8vIHVpbnQ4X3QKQEAgLTE5OSwxMSArMTk3LDkgQEAKICAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCiAgICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQogCi0gICAgLy8gU2l6ZSBvZiBOQUxVIGxlbmd0aCBpbiBta3YvbXA0Ci0gICAga0tleU5hbExlbmd0aFNpemUgICAgID0gJ25hbHMnLCAvLyBpbnQzMl90Ci0KICAgICAvLyBIRFIgcmVsYXRlZAogICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCisgICAga0tleUhkcjEwUGx1c0luZm8gICAgPSAnaGRyRCcsIC8vIHJhdyBkYXRhCiAKICAgICAvLyBjb2xvciBhc3BlY3RzCiAgICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQpAQCAtMjI2LDExICsyMjIsMTMgQEAKICAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAogICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQogICAgIGtLZXlJc0V4aWYgICAgICAgICAgID0gJ2V4aWYnLCAvLyBib29sIChpbnQzMl90KSBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrCi0KICAgICBrS2V5UGNtQmlnRW5kaWFuICAgICA9ICdwY21iJywgLy8gYm9vbCAoaW50MzJfdCkKIAogICAgIC8vIEtleSBmb3IgQUxBQyBNYWdpYyBDb29raWUKICAgICBrS2V5QWxhY01hZ2ljQ29va2llICA9ICdhbG1jJywgLy8gcmF3IGRhdGEKKworICAgIC8vIEFDLTQgQXVkaW9QcmVzZW50YXRpb25JbmZvCisgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbyA9ICdhdWRQJywgIC8vIHJhdyBkYXRhCiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKaW5kZXggMGEzNDJiOC4uOGY4YzQ3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKQEAgLTYsMTUgKzYsMTYgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJJTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJNZWRpYUFuYWx5dGljc0l0ZW0uY3BwIiwKKyAgICAgICAgIk1lZGlhTWV0cmljcy5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTMyLDQgKzMzLDEzIEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorCisgICAgLy8gZW51bWVyYXRlIHRoZSBzdGFibGUgaW50ZXJmYWNlCisvLyB0aGlzIHdvdWxkIG1lYW4gbm9ib2R5IGNhbiB1c2UgdGhlIEMrKyBpbnRlcmZhY2UuIGhhdmUgdG8gcmV3b3JrIHNvbWUgdGhpbmdzLgorLy8gIHN0dWJzOiB7CisvLyAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFtZXRyaWNzLm1hcC50eHQiLAorLy8gICAgICB2ZXJzaW9uczogWworLy8gICAgICAgICAgIjEiICwKKy8vICAgICAgXQorLy8gIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCmluZGV4IDEzNWM5YjYuLjQ0OGUyZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwCkBAIC00NzgsNyArNDc4LDcgQEAKIC8vIGNhbGxlciByZXNwb25zaWJsZSBmb3IgdGhlIHJldHVybmVkIHN0cmluZwogYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldENTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGNoYXIgKip2YWx1ZSkgewogICAgIFByb3AgKnByb3AgPSBmaW5kUHJvcChuYW1lKTsKLSAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlRG91YmxlKSB7CisgICAgaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5tVHlwZSAhPSBrVHlwZUNTdHJpbmcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewpAQCAtNDg3LDYgKzQ4NywxOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0U3RyaW5nKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBzdGQ6OnN0cmluZyAqdmFsdWUpIHsKKyAgICBQcm9wICpwcm9wID0gZmluZFByb3AobmFtZSk7CisgICAgaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5tVHlwZSAhPSBrVHlwZUNTdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAvLyBzdGQ6OnN0cmluZyBtYWtlcyBhIGNvcHkgZm9yIHVzCisgICAgICAgICp2YWx1ZSA9IHByb3AtPnUuQ1N0cmluZ1ZhbHVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogLy8gcmVtb3ZlIGluZGljYXRlZCBrZXlzIGFuZCB0aGVpciB2YWx1ZXMKIC8vIHJldHVybiB2YWx1ZSBpcyAjIGtleXMgcmVtb3ZlZAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OmZpbHRlcihpbnQgbiwgTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIGF0dHJzW10pIHsKQEAgLTcyNiw2ICs3MzgsMTUgQEAKIH0KIAogCitjb25zdCBjaGFyICpNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZygpIHsKKyAgIHJldHVybiB0b0NTdHJpbmcoUFJPVE9fTEFTVCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZyhpbnQgdmVyc2lvbikgeworICAgIHN0ZDo6c3RyaW5nIHZhbCA9IHRvU3RyaW5nKHZlcnNpb24pOworICAgIHJldHVybiBzdHJkdXAodmFsLmNfc3RyKCkpOworfQorCiBzdGQ6OnN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRvU3RyaW5nKFBST1RPX0xBU1QpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljcy5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA4YWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljcy5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhTWV0cmljcyIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3MuaD4KKworLy8KKy8vIHByb3ZpZGUgYSBDLWlzaCBpbnRlcmZhY2UgdGhhdCBpcyBlYXNpZXIgdG8gc3RhYmlsaXplIHRoYW4gdGhlIGV4aXN0aW5nIEMrKworLy8gaW50ZXJmYWNlCisvLworLy8gQUxMIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBjaGFyICogZ2l2ZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGFsbG9jYXRlZCBidWZmZXIKKy8vIHRvIHRoZSBjYWxsZXIuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gY2FsbCBmcmVlKCkgb24gdGhhdCBwb2ludGVyLgorLy8KKworLy8gbWFuYWdlIHRoZSBvdmVyYWxsIHJlY29yZAorbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1lZGlhbWV0cmljc19jcmVhdGUobWVkaWFtZXRyaWNza2V5X3Qga2V5KSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbShrZXkpOworICAgIHJldHVybiAobWVkaWFtZXRyaWNzX2hhbmRsZV90KSBpdGVtOworfQorCit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybjsKKyAgICBkZWxldGUgaXRlbTsKK30KKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHN0cmR1cChpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKK30KKworLy8gbnVwbGF5ZXIsIGV0IGFsIHVzZSBpdCB3aGVuIGFjdGluZyBhcyBwcm94aWVzCit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0VWlkKHVpZCk7Cit9CisKKy8vIHNldCBhdHRyaWJ1dGVzCisvLworCit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0Q1N0cmluZyhhdHRyLCB2YWx1ZSk7Cit9CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLworCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorLy8KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50MzIoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0UmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24sIHJhdGUpOworfQorCisvLyBOQjogY2FsbGVyIG93bnMgdGhlIHN0cmluZyB0aGF0IGNvbWVzIGJhY2ssIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGl0ZW0tPmdldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpIHsKKyAgICBmcmVlKHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7Cit9CisKKworY29uc3QgY2hhciAqbWVkaWFtZXRyaWNzX3JlYWRhYmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gIiI7CisgICAgcmV0dXJuIGl0ZW0tPnRvQ1N0cmluZygpOworfQorCitpbnQzMl90IG1lZGlhbWV0cmljc19jb3VudChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGl0ZW0tPmNvdW50KCk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpIHsKKyAgICAvLyBzdGF0aWMsIHNvIGRvZXNuJ3QgbmVlZCBhbiBpbnN0YW5jZQorICAgIHJldHVybiBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmlzRW5hYmxlZCgpOworfQorCisjaWYgMAorLy8gZG8gbm90IGV4cG9zZSB0aGlzIGFzIGlzLgorLy8gbmVlZCB0byByZXZpc2l0IChvciByZWRlZmluZSkgaG93IHRoZSBhbmRyb2lkOjpQYXJjZWwgcGFyYW1ldGVyIGlzIGhhbmRsZWQKKy8vIHNvIHRoYXQgaXQgbWVldHMgdGhlIHN0YWJsZS1BUEkgY3JpdGVyaWEgZm9yIHVwZGF0ZWFibGUgY29tcG9uZW50cy4KKy8vCitpbnQzMl90IG1lZGlhbWV0cmljc193cml0ZVRvUGFyY2VsKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpdGVtLT53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCmluZGV4IDI2M2NkZTcuLmI5OWNkOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCkBAIC0xMzQsNiArMTM0LDcgQEAKICAgICAgICAgYm9vbCBnZXRSYXRlKEF0dHIsIGludDY0X3QgKmNvdW50LCBpbnQ2NF90ICpkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKICAgICAgICAgLy8gQ2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHN0cmluZwogICAgICAgICBib29sIGdldENTdHJpbmcoQXR0ciwgY2hhciAqKnZhbHVlKTsKKyAgICAgICAgYm9vbCBnZXRTdHJpbmcoQXR0ciwgc3RkOjpzdHJpbmcgKnZhbHVlKTsKIAogICAgICAgICAvLyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2xvc2UgYW55IGV4aXN0aW5nIG9wZW4KICAgICAgICAgLy8gcmVjb3JkIHdpdGggc2FtZSBrZXkgYmVmb3JlIGVzdGFibGlzaGluZyBhIG5ldyByZWNvcmQKQEAgLTE3Niw2ICsxNzcsOCBAQAogCiAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCk7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGludCB2ZXJzaW9uKTsKKyAgICAgICAgY29uc3QgY2hhciAqdG9DU3RyaW5nKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnRvQ1N0cmluZyhpbnQgdmVyc2lvbik7CiAKICAgICAgICAgLy8gYXJlIHdlIGNvbGxlY3RpbmcgYW5hbHl0aWNzIGRhdGEKICAgICAgICAgc3RhdGljIGJvb2wgaXNFbmFibGVkKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmYzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX01FRElBTUVUUklDU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTX0gKKworLy8KKy8vIGRlZmluZSBhIEMgaW50ZXJmYWNlIHRvIHRoZSBtZWRpYSBtZXRyaWNzIGZ1bmN0aW9uYWxpdHkKKy8vCisvLyBBbGwgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2hhciAqIG9yIGNvbnN0IGNoYXIgKiBhbHNvIGdpdmUgcmVzcG9uc2liaWxpdHkKKy8vIGZvciB0aGF0IHN0cmluZyB0byB0aGUgY2FsbGVyLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZyZWUoKQorLy8gb24gdGhhdCBwb2ludGVyIHdoZW4gZG9uZSB1c2luZyB0aGUgdmFsdWUuCisKK19fQkVHSU5fREVDTFMKKworLy8gaW50ZXJuYWxseSByZS1jYXN0IHRvIHRoZSBiZWhpbmQtdGhlLXNjZW5lcyBDKysgY2xhc3MgaW5zdGFuY2UKK3R5cGVkZWYgaW50NjRfdCBtZWRpYW1ldHJpY3NfaGFuZGxlX3Q7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKm1lZGlhbWV0cmljc2tleV90OwordHlwZWRlZiBjb25zdCBjaGFyICphdHRyX3Q7CisKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfY3JlYXRlKG1lZGlhbWV0cmljc2tleV90IGtleSk7Cit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK21lZGlhbWV0cmljc2tleV90IG1lZGlhbWV0cmljc19nZXRLZXkobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKKworLy8gc2V0Cit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbik7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiB2YWx1ZSk7CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLyB0aGVzZSBkbyBub3QgcHJvdmlkZSBhdG9taWNpdHkgb3IgbXV0dWFsIGV4Y2x1c2lvbiwgb25seSBzaW1wbGVyIGNvZGUgc2VxdWVuY2VzLgordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pOworCisvLyBmaW5kICYgZXh0cmFjdCB2YWx1ZXMKKy8vIHJldHVybiBpbmRpY2F0ZXMgd2hldGhlciBhdHRyIGV4aXN0cyAoYW5kIHRodXMgd2hldGhlciB2YWx1ZSBmaWxsZWQgaW4pCisvLyBOVUxMIHBhcmFtZXRlciB2YWx1ZSBzdXBwcmVzc2VzIHN0b3JhZ2Ugb2YgdmFsdWUuCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogY291bnQsIGludDY0X3QgKiBkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKTsKKy8vIHRvIHJlbGVhc2Ugc3RyaW5ncyByZXR1cm5lZCB2aWEgZ2V0Q1N0cmluZygpCit2b2lkIG1lZGlhbWV0cmljc19mcmVlQ1N0cmluZyhjaGFyICp2YWx1ZSk7CisKKy8vICMgb2YgYXR0cmlidXRlcyBzZXQgd2l0aGluIHRoaXMgcmVjb3JkLgoraW50MzJfdCBtZWRpYW1ldHJpY3NfY291bnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2Jvb2wgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2NvbnN0IGNoYXIgKm1lZGlhbWV0cmljc19yZWFkYWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFVpZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCB1aWRfdCB1aWQpOworYm9vbCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCk7CisKKyNpZiAwCisvLyBkbyBub3QgZXhwb3NlIHRoaXMgYXMgaXMuCisvLyBuZWVkIHRvIHJldmlzaXQgKG9yIHJlZGVmaW5lKSBob3cgdGhlIGFuZHJvaWQ6OlBhcmNlbCBwYXJhbWV0ZXIgaXMgaGFuZGxlZAorLy8gc28gdGhhdCBpdCBtZWV0cyB0aGUgc3RhYmxlLUFQSSBjcml0ZXJpYSBmb3IgdXBkYXRlYWJsZSBjb21wb25lbnRzLgorLy8KK2ludDMyX3QgbWVkaWFtZXRyaWNzX3dyaXRlVG9QYXJjZWwobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icAppbmRleCBjZDI3YmQxLi42YjQzMzc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icApAQCAtNCwxMSArNCwxMCBAQAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXIyIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIkpBdWRpb1RyYWNrLmNwcCIsCiAgICAgICAgICJNZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIyLmNwcCIsCiAgICAgXSwKQEAgLTIxLDIyICsyMCwyMCBAQAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAogCiAgICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtNDksMTEgKzQ2LDIwIEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQyIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKQEAgLTc0LDMgKzgwLDU1IEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWEyX2puaV9jb3JlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkphdmFWTUhlbHBlci5jcHAiLAorICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKKyAgICAgICAgIkpNZWRpYTJIVFRQU2VydmljZS5jcHAiLAorICAgICAgICAiSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJuYXRpdmVoZWxwZXIiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKaW5kZXggYWMwY2M1Ny4uYTAxYWZhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCkBAIC0yMSwyNyArMjEsMjggQEAKICNpbmNsdWRlICJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaCIKIAogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfQXVkaW9FcnJvcnMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gVE9ETzogU3RvcmUgSmF2YSBjbGFzcy9tZXRob2RJRCBhcyBhIG1lbWJlciB2YXJpYWJsZSBpbiB0aGUgY2xhc3MuCiAvLyBUT0RPOiBBZGQgTlVMTCAmJiBFeGNlcHRpb24gY2hlY2tzIGFmdGVyIGV2ZXJ5IEpOSSBjYWxsLgogSkF1ZGlvVHJhY2s6OkpBdWRpb1RyYWNrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCBVc2FnZXMgb2YgdGhlIGFyZ3VtZW50cyBhcmUgYmVsb3cgPgotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsICAgICAgICAgICAgICAgLy8gQXVkaW9BdWRpb0F0dHJpYnV0ZXMKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKICAgICAgICAgdm9pZCogdXNlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2sKKyAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzLCAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvQXR0cmlidXRlcwogICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkKSB7ICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyU2l6ZUluQnl0ZXMKIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKwogICAgIGpjbGFzcyBqQXVkaW9UcmFja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2siKTsKLSAgICBtQXVkaW9UcmFja0NscyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKKyAgICBtQXVkaW9UcmFja0NscyA9IHJlaW50ZXJwcmV0X2Nhc3Q8amNsYXNzPihlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0NscykpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakF1ZGlvVHJhY2tDbHMpOwogCiAgICAgbWF4UmVxdWlyZWRTcGVlZCA9IHN0ZDo6bWluKHN0ZDo6bWF4KG1heFJlcXVpcmVkU3BlZWQsIDEuMGYpLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpOwogCkBAIC02NCwxMCArNjUsMTkgQEAKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKICAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7CiAKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAotICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKLSAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldEF1ZGlvQXR0cmlidXRlcywKLSAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIHBBdHRyaWJ1dGVzLCBzdHJlYW1UeXBlKSk7CisgICAgeworICAgICAgICBzcDxKT2JqZWN0SG9sZGVyPiBhdWRpb0F0dHJpYnV0ZXNPYmo7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvQXR0cmlidXRlc09iaiA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW9BdHRyaWJ1dGVzT2JqID0gbmV3IEpPYmplY3RIb2xkZXIoCisgICAgICAgICAgICAgICAgICAgIEpBdWRpb0F0dHJpYnV0ZXM6OmNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihlbnYsIE5VTEwpKTsKKyAgICAgICAgfQorICAgICAgICBqbWV0aG9kSUQgalNldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLAorICAgICAgICAgICAgICAgIGpTZXRBdWRpb0F0dHJpYnV0ZXMsIGF1ZGlvQXR0cmlidXRlc09iai0+Z2V0Sk9iamVjdCgpKTsKKyAgICB9CiAKICAgICBqbWV0aG9kSUQgalNldEF1ZGlvRm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvRm9ybWF0IiwKICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7KUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKQEAgLTkyLDYgKzEwMiw3IEBACiAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0U2Vzc2lvbklkLCBzZXNzaW9uSWQpOwogICAgIH0KIAorICAgIG1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIGptZXRob2RJRCBqU2V0T2ZmbG9hZGVkUGxheWJhY2sgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0T2ZmbG9hZGVkUGxheWJhY2siLAogICAgICAgICAgICAgICAgICIoWilMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CkBAIC0xMDAsNyArMTExLDkgQEAKICAgICB9CiAKICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjazsiKTsKLSAgICBtQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICBqb2JqZWN0IGpBdWRpb1RyYWNrT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworICAgIG1BdWRpb1RyYWNrT2JqID0gcmVpbnRlcnByZXRfY2FzdDxqb2JqZWN0PihlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja09iaikpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoakJ1aWxkZXJPYmopOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFNldCBvZmZsb2FkIG1vZGUgY2FsbGJhY2sKQEAgLTExNiwxOSArMTI5LDIwIEBACiB9CiAKIEpBdWRpb1RyYWNrOjp+SkF1ZGlvVHJhY2soKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1BdWRpb1RyYWNrQ2xzKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja09iaik7CiB9CiAKIHNpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRCdWZmZXJTaXplSW5GcmFtZXMiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEJ1ZmZlclNpemVJbkZyYW1lcyk7CiB9CiAKIHNpemVfdCBKQXVkaW9UcmFjazo6Y2hhbm5lbENvdW50KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldENoYW5uZWxDb3VudCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRDaGFubmVsQ291bnQiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldENoYW5uZWxDb3VudCk7CiB9CkBAIC0xNDMsNyArMTU3LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbiA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrSGVhZFBvc2l0aW9uIiwgIigpSSIpOwogICAgICpwb3NpdGlvbiA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXliYWNrSGVhZFBvc2l0aW9uKTsKQEAgLTE1MSwyMSArMTY1LDIxIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1ib29sIEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgamNsYXNzIGpBdWRpb1RpbWVTdGFtcENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wIik7CiAgICAgam9iamVjdCBqQXVkaW9UaW1lU3RhbXBPYmogPSBlbnYtPkFsbG9jT2JqZWN0KGpBdWRpb1RpbWVTdGFtcENscyk7CiAKLSAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkwiKTsKLSAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiTCIpOworICAgIGpmaWVsZElEIGpGcmFtZVBvc2l0aW9uID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgImZyYW1lUG9zaXRpb24iLCAiSiIpOworICAgIGpmaWVsZElEIGpOYW5vVGltZSA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJuYW5vVGltZSIsICJKIik7CiAKICAgICBqbWV0aG9kSUQgakdldFRpbWVzdGFtcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCi0gICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcClCIik7CisgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIiwgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcDspWiIpOwogICAgIGJvb2wgc3VjY2VzcyA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRUaW1lc3RhbXAsIGpBdWRpb1RpbWVTdGFtcE9iaik7CiAKICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKICAgICBsb25nIGxvbmcgZnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0TG9uZ0ZpZWxkKGpBdWRpb1RpbWVTdGFtcE9iaiwgakZyYW1lUG9zaXRpb24pOwpAQCAtMTc4LDcgKzE5Miw3IEBACiAgICAgdGltZXN0YW1wLm1UaW1lID0gdHM7CiAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9ICh1aW50MzJfdCkgZnJhbWVQb3NpdGlvbjsKIAotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wIF9fdW51c2VkKSB7CkBAIC0xODksNyArMjAzLDcgQEAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgewogICAgIC8vIFRPRE86IGV4aXN0aW5nIG5hdGl2ZSBBdWRpb1RyYWNrIHJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gb24gb2ZmbG9hZC9kaXJlY3QvZmFzdCB0cmFja3MuCiAgICAgLy8gU2hvdWxkIHdlIGRvIHRoZSBzYW1lIHRoaW5nPwotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqUGxheWJhY2tQYXJhbXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtcyIpOwogICAgIGptZXRob2RJRCBqUGxheWJhY2tQYXJhbXNDdG9yID0gZW52LT5HZXRNZXRob2RJRChqUGxheWJhY2tQYXJhbXNDbHMsICI8aW5pdD4iLCAiKClWIik7CkBAIC0yMjQsNyArMjM4LDcgQEAKIH0KIAogY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgSkF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqbWV0aG9kSUQgakdldFBsYXliYWNrUGFyYW1zID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheWJhY2tQYXJhbXMiLCAiKClMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKQEAgLTI2Niw3ICsyODAsNyBAQAogICAgICAgICByZXR1cm4gbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzKEJBRF9WQUxVRSk7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgam1ldGhvZElEIGpDcmVhdGVWb2x1bWVTaGFwZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiY3JlYXRlVm9sdW1lU2hhcGVyIiwKICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb247KUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlcjsiKTsKQEAgLTI4Miw3ICsyOTYsNyBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU2V0QXV4RWZmZWN0U2VuZExldmVsID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAic2V0QXV4RWZmZWN0U2VuZExldmVsIiwgIihGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0QXV4RWZmZWN0U2VuZExldmVsLCBsZXZlbCk7CkBAIC0yOTAsMTQgKzMwNCwxNCBAQAogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakF0dGFjaEF1eEVmZmVjdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJhdHRhY2hBdXhFZmZlY3QiLCAiKEkpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBdHRhY2hBdXhFZmZlY3QsIGVmZmVjdElkKTsKICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgLy8gVE9ETzogSmF2YSBzZXRTdGVyZW9Wb2x1bWUgaXMgZGVwcmVjYXRlZC4gRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBtZXRob2Q/CiAgICAgam1ldGhvZElEIGpTZXRTdGVyZW9Wb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0U3RlcmVvVm9sdW1lIiwgIihGRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFN0ZXJlb1ZvbHVtZSwgbGVmdCwgcmlnaHQpOwpAQCAtMzA1LDE0ICszMTksMTQgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpTZXRWb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0Vm9sdW1lIiwgIihGKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0Vm9sdW1lLCB2b2x1bWUpOwogICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnN0YXJ0KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalBsYXkgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGxheSIsICIoKVYiKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggdGhlIEphdmEgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGZyb20gcGxheSgpPwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQbGF5KTsKQEAgLTMyNCw3ICszMzgsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqYnl0ZUFycmF5IGpBdWRpb0RhdGEgPSBlbnYtPk5ld0J5dGVBcnJheShzaXplKTsKICAgICBlbnYtPlNldEJ5dGVBcnJheVJlZ2lvbihqQXVkaW9EYXRhLCAwLCBzaXplLCAoamJ5dGUgKikgYnVmZmVyKTsKIApAQCAtMzUzLDcgKzM2Nyw3IEBACiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OnN0b3AoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU3RvcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzdG9wIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTdG9wKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPwpAQCAtMzY1LDIwICszNzksMjAgQEAKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6Zmx1c2goKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqRmx1c2ggPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZmx1c2giLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgakZsdXNoKTsKIH0KIAogdm9pZCBKQXVkaW9UcmFjazo6cGF1c2UoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqUGF1c2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAicGF1c2UiLCAiKClWIik7CiAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalBhdXNlKTsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPwogfQogCiBib29sIEpBdWRpb1RyYWNrOjppc1BsYXlpbmcoKSBjb25zdCB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0UGxheVN0YXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFBsYXlTdGF0ZSIsICIoKUkiKTsKICAgICBpbnQgY3VycmVudFBsYXlTdGF0ZSA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXlTdGF0ZSk7CiAKQEAgLTM5Myw3ICs0MDcsNyBAQAogfQogCiB1aW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0U2FtcGxlUmF0ZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRTYW1wbGVSYXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFNhbXBsZVJhdGUiLCAiKClJIik7CiAgICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFNhbXBsZVJhdGUpOwogfQpAQCAtNDAzLDcgKzQxNyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIGludCBidWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNDE3LDEyICs0MzEsMjYgQEAKIH0KIAogYXVkaW9fZm9ybWF0X3QgSkF1ZGlvVHJhY2s6OmZvcm1hdCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0Zvcm1hdCIsICIoKUkiKTsKICAgICBpbnQgamF2YUZvcm1hdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvRm9ybWF0KTsKICAgICByZXR1cm4gYXVkaW9Gb3JtYXRUb05hdGl2ZShqYXZhRm9ybWF0KTsKIH0KIAorc2l6ZV90IEpBdWRpb1RyYWNrOjpmcmFtZVNpemUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0Rm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJnZXRGb3JtYXQiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdDsiKTsKKyAgICBqb2JqZWN0IGpBdWRpb0Zvcm1hdE9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEZvcm1hdCk7CisKKyAgICBqY2xhc3MgakF1ZGlvRm9ybWF0Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQiKTsKKyAgICBqbWV0aG9kSUQgakdldEZyYW1lU2l6ZUluQnl0ZXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakF1ZGlvRm9ybWF0Q2xzLCAiZ2V0RnJhbWVTaXplSW5CeXRlcyIsICIoKUkiKTsKKyAgICBqaW50IGphdmFGcmFtZVNpemVJbkJ5dGVzID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0Zvcm1hdE9iaiwgakdldEZyYW1lU2l6ZUluQnl0ZXMpOworCisgICAgcmV0dXJuIChzaXplX3QpamF2YUZyYW1lU2l6ZUluQnl0ZXM7Cit9CisKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKQEAgLTQzMiwxMCArNDYwLDYgQEAKICAgICAvLyBUT0RPOiBSZW1vdmUgbG9ncyB0aGF0IGluY2x1ZGVzIHVuYXZhaWxhYmxlIGluZm9ybWF0aW9uIGZyb20gYmVsb3cuCiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKLS8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoJm1BdHRyaWJ1dGVzKSA6IG1TdHJlYW1UeXBlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAogLy8gICAgICAgICAgICAgICAgICBmb3JtYXQoKSwgbUNoYW5uZWxNYXNrLCBjaGFubmVsQ291bnQoKSk7CiAvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHNhbXBsZSByYXRlKCV1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZilcbiIsCkBAIC00NTMsMzggKzQ3Nyw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9fcG9ydF9oYW5kbGVfdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Citqb2JqZWN0IEpBdWRpb1RyYWNrOjpnZXRSb3V0ZWREZXZpY2UoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0Um91dGVkRGV2aWNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFJvdXRlZERldmljZSIsCiAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm87Iik7Ci0gICAgam9iamVjdCBqQXVkaW9EZXZpY2VJbmZvT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Um91dGVkRGV2aWNlKTsKLSAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoakF1ZGlvRGV2aWNlSW5mb09iaiwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotCi0gICAgamNsYXNzIGpBdWRpb0RldmljZUluZm9DbHMgPSBlbnYtPkZpbmRDbGFzcygiTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvIik7Ci0gICAgam1ldGhvZElEIGpHZXRJZCA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvRGV2aWNlSW5mb0NscywgImdldElkIiwgIigpSSIpOwotICAgIGppbnQgcm91dGVkRGV2aWNlSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvRGV2aWNlSW5mb09iaiwgakdldElkKTsKLSAgICByZXR1cm4gcm91dGVkRGV2aWNlSWQ7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CitpbnQzMl90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRBdWRpb1Nlc3Npb25JZCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb1Nlc3Npb25JZCIsICIoKUkiKTsKICAgICBqaW50IHNlc3Npb25JZCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvU2Vzc2lvbklkKTsKLSAgICByZXR1cm4gKGF1ZGlvX3Nlc3Npb25fdCkgc2Vzc2lvbklkOworICAgIHJldHVybiBzZXNzaW9uSWQ7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqTVAySW1wbENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMkltcGwiKTsKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBqTVAySW1wbENscywgInNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjaztJKVoiKTsKLSAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAotICAgICAgICAgICAgak1QMkltcGxDbHMsIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQsIG1BdWRpb1RyYWNrT2JqLCBkZXZpY2VJZCk7CitzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqU2V0UHJlZmVycmVkRGV2aWNlSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0UHJlZmVycmVkRGV2aWNlIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOylaIik7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFByZWZlcnJlZERldmljZUlkLCBkZXZpY2UpOwogICAgIHJldHVybiByZXN1bHQgPT0gdHJ1ZSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOwogfQogCithdWRpb19zdHJlYW1fdHlwZV90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1N0cmVhbVR5cGUoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0QXVkaW9BdHRyaWJ1dGVzID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvQXR0cmlidXRlcyIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXM7Iik7CisgICAgam9iamVjdCBqQXVkaW9BdHRyaWJ1dGVzID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9BdHRyaWJ1dGVzKTsKKyAgICBqY2xhc3MgakF1ZGlvQXR0cmlidXRlc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyIpOworICAgIGptZXRob2RJRCBqR2V0Vm9sdW1lQ29udHJvbFN0cmVhbSA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvQXR0cmlidXRlc0NscywKKyAgICAgICAgICAgICJnZXRWb2x1bWVDb250cm9sU3RyZWFtIiwgIigpSSIpOworICAgIGludCBqYXZhQXVkaW9TdHJlYW1UeXBlID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0F0dHJpYnV0ZXMsIGpHZXRWb2x1bWVDb250cm9sU3RyZWFtKTsKKyAgICByZXR1cm4gKGF1ZGlvX3N0cmVhbV90eXBlX3QpamF2YUF1ZGlvU3RyZWFtVHlwZTsKK30KKwogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnBlbmRpbmdEdXJhdGlvbihpbnQzMl90ICptc2VjKSB7CiAgICAgaWYgKG1zZWMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNTI2LDE4ICs1NTIsODUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyLCBqb2JqZWN0IGhhbmRsZXIpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpBZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgImFkZE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7TGFuZHJvaWQvb3MvSGFuZGxlcjspViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpBZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIsIGxpc3RlbmVyLCBoYW5kbGVyKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqUmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJyZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyOylWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciwgbGlzdGVuZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBKQXVkaW9UcmFjazo6cmVnaXN0ZXJSb3V0aW5nRGVsZWdhdGVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiByb3V0aW5nRGVsZWdhdGVzKSB7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+OjppdGVyYXRvciBpdCA9IHJvdXRpbmdEZWxlZ2F0ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IHJvdXRpbmdEZWxlZ2F0ZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhpdC0+c2Vjb25kLCBnZXRIYW5kbGVyKGl0LT5zZWNvbmQpKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyAgICAgICAgICAgICAgICBTdGF0aWMgbWV0aG9kcyBiZWdpbiAgICAgICAgICAgICAgICAgICAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqUm91dGluZ0RlbGVnYXRlQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUm91dGluZ0RlbGVnYXRlIik7CisgICAgam1ldGhvZElEIGpHZXRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgICAgICJnZXRMaXN0ZW5lciIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7Iik7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChyb3V0aW5nRGVsZWdhdGVPYmosIGpHZXRMaXN0ZW5lcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldEhhbmRsZXIgPSBlbnYtPkdldE1ldGhvZElEKGpSb3V0aW5nRGVsZWdhdGVDbHMsCisgICAgICAgICJnZXRIYW5kbGVyIiwgIigpTGFuZHJvaWQvb3MvSGFuZGxlcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldEhhbmRsZXIpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjphZGRHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYob2JqKSk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVHbG9iYWxSZWYoY29uc3Qgam9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG9iaik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+Pjo6aXRlcmF0b3IgaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LCBrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBKQXVkaW9UcmFjazo6ZXJhc2VCeUtleShzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+JiBtcCwgY29uc3Qgam9iamVjdCBrZXkpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8am9iamVjdCwgam9iamVjdD4+OjppdGVyYXRvciBpdCA9IG1wLmJlZ2luKCk7IGl0ICE9IG1wLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChpdC0+Zmlyc3QsIGtleSkpIHsKKyAgICAgICAgICAgIG1wLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vICAgICAgICAgICAgICAgIFByaXZhdGUgbWV0aG9kIGJlZ2lucyAgICAgICAgICAgICAgICAgIC8vLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTUwLDcgKzY0Myw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIC8vIFJlZmVyZW5jZWQgImFuZHJvaWRfbWVkaWFfVm9sdW1lU2hhcGVyLmgiLgogICAgIGpmbG9hdEFycmF5IHhhcnJheSA9IG51bGxwdHI7CkBAIC01OTUsNyArNjg4LDcgQEAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaigKICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXIiKTsKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTY0NywxNSArNzQwLDE1IEBACiB9CiAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgakNhbGxiYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCRTdHJlYW1FdmVudENhbGxiYWNrIik7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIkU3RyZWFtRXZlbnRDYWxsYmFjayIpOwogICAgIGptZXRob2RJRCBqQ2FsbGJhY2tDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQ2FsbGJhY2tDbHMsICI8aW5pdD4iLCAiKEpKSilWIik7CiAgICAgam9iamVjdCBqQ2FsbGJhY2tPYmogPSBlbnYtPk5ld09iamVjdChqQ2FsbGJhY2tDbHMsIGpDYWxsYmFja0N0b3IsIHRoaXMsIGNiZiwgdXNlcik7CiAgICAgcmV0dXJuIGpDYWxsYmFja09iajsKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamNsYXNzIGpFeGVjdXRvcnNDbHMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzIik7CiAgICAgam1ldGhvZElEIGpOZXdTaW5nbGVUaHJlYWRFeGVjdXRvciA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakV4ZWN1dG9yc0NscywKICAgICAgICAgICAgICJuZXdTaW5nbGVUaHJlYWRFeGVjdXRvciIsICIoKUxqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2U7Iik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjRhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZExvY2FsUmVmLmg+CisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJTaXplID0gMzI3Njg7CisKK0pNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Sk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MoCisgICAgICAgICAgICBlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1Db25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiY29ubmVjdCIsCisgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIik7CisgICAgQ0hFQ0sobUNvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtRGlzY29ubmVjdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgIigpViIpOworICAgIENIRUNLKG1EaXNjb25uZWN0TWV0aG9kICE9IE5VTEwpOworCisgICAgbVJlYWRBdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgInJlYWRBdCIsCisgICAgICAgICAgICAiKEpbQkkpSSIpOworICAgIENIRUNLKG1SZWFkQXRNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0U2l6ZU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFNpemUiLAorICAgICAgICAgICAgIigpSiIpOworICAgIENIRUNLKG1HZXRTaXplTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldE1JTUVUeXBlTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0TUlNRVR5cGUiLAorICAgICAgICAgICAgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgQ0hFQ0sobUdldE1JTUVUeXBlTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldFVyaU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFVyaSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0VXJpTWV0aG9kICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gdG1wKAorICAgICAgICBlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGtCdWZmZXJTaXplKSk7CisgICAgbUJ5dGVBcnJheU9iaiA9IChqYnl0ZUFycmF5KWVudi0+TmV3R2xvYmFsUmVmKHRtcC5nZXQoKSk7CisgICAgQ0hFQ0sobUJ5dGVBcnJheU9iaiAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjp+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1CeXRlQXJyYXlPYmopOworfQorCitib29sIEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIFN0cmluZzggdG1wKCIiKTsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+a2V5QXQoaSkpOworICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmc4KCI6ICIpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+dmFsdWVBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIlxyXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKyAgICBqc3RyaW5nIGpoZWFkZXJzID0gZW52LT5OZXdTdHJpbmdVVEYodG1wLnN0cmluZygpKTsKKworICAgIGpib29sZWFuIHJldCA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtQ29ubmVjdE1ldGhvZCwganVyaSwgamhlYWRlcnMpOworCisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpoZWFkZXJzKTsKKworICAgIHJldHVybiAoYm9vbClyZXQ7Cit9CisKK3ZvaWQgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbURpc2Nvbm5lY3RNZXRob2QpOworfQorCitzc2l6ZV90IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKworICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKKyAgICAgICAgc2l6ZSA9IGtCdWZmZXJTaXplOworICAgIH0KKworICAgIGppbnQgbiA9IGVudi0+Q2FsbEludE1ldGhvZCgKKyAgICAgICAgICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbVJlYWRBdE1ldGhvZCwgKGpsb25nKW9mZnNldCwgbUJ5dGVBcnJheU9iaiwgKGppbnQpc2l6ZSk7CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oCisgICAgICAgICAgICAgICAgbUJ5dGVBcnJheU9iaiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgKGpieXRlICopZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK29mZjY0X3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRTaXplKCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gKG9mZjY0X3QpKGVudi0+Q2FsbExvbmdNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0U2l6ZU1ldGhvZCkpOworfQorCitzdGF0dXNfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgam1pbWUgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0TUlNRVR5cGVNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGptaW1lLCAwKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgICptaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgIH0KKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqbWltZSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0VXJpTWV0aG9kKTsKKyAgICBqYm9vbGVhbiBmbGFnID0gZW52LT5FeGNlcHRpb25DaGVjaygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqdXJpLCAwKTsKKyAgICAqdXJpID0gU3RyaW5nOChzdHIpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGp1cmksIHN0cik7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRjMTVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUFNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9TY29wZWRMb2NhbFJlZi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0pNZWRpYTJIVFRQU2VydmljZTo6Sk1lZGlhMkhUVFBTZXJ2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUFNlcnZpY2VPYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUFNlcnZpY2VPYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MoZW52LCBlbnYtPkdldE9iamVjdENsYXNzKG1NZWRpYTJIVFRQU2VydmljZU9iaikpOworICAgIENIRUNLKG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAibWFrZUhUVFBDb25uZWN0aW9uIiwKKyAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBDb25uZWN0aW9uOyIpOworICAgIENIRUNLKG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgIT0gTlVMTCk7Cit9CisKK0pNZWRpYTJIVFRQU2VydmljZTo6fkpNZWRpYTJIVFRQU2VydmljZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKTsKK30KKworc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gSk1lZGlhMkhUVFBTZXJ2aWNlOjptYWtlSFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpvYmplY3QgbWVkaWEySFRUUENvbm5lY3Rpb25PYmogPQorICAgICAgICBlbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBTZXJ2aWNlT2JqLCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kKTsKKworICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBDb25uZWN0aW9uKGVudiwgbWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGFhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJKYXZhVk1IZWxwZXIiCisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitzdGQ6OmF0b21pYzxKYXZhVk0gKj4gSmF2YVZNSGVscGVyOjpzSmF2YVZNKE5VTEwpOworCisvLyBzdGF0aWMKK0pOSUVudiAqSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKSB7CisgICAgSk5JRW52ICplbnY7CisgICAgSmF2YVZNICp2bSA9IHNKYXZhVk0ubG9hZCgpOworICAgIENIRUNLKHZtICE9IE5VTEwpOworCisgICAgaWYgKHZtLT5HZXRFbnYoKHZvaWQgKiopJmVudiwgSk5JX1ZFUlNJT05fMV80KSAhPSBKTklfT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGVudjsKK30KKworLy8gc3RhdGljCit2b2lkIEphdmFWTUhlbHBlcjo6c2V0SmF2YVZNKEphdmFWTSAqdm0pIHsKKyAgICBzSmF2YVZNLnN0b3JlKHZtKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCmluZGV4IGE4ZTFkMWYuLjk4YTNlNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIHsKQEAgLTQ0LDMxICs0MywyOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHZvbHVtZSglZilcbiIsIG1Wb2x1bWUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgKG1UcmFjayAhPSAwKSA/IG1UcmFjay0+bGF0ZW5jeSgpIDogLTEpOworICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgPyBtSkF1ZGlvVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGF1eCBlZmZlY3QgaWQoJWQpLCBzZW5kIGxldmVsICglZilcbiIsCiAgICAgICAgICAgICBtQXV4RWZmZWN0SWQsIG1TZW5kTGV2ZWwpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLCBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAotICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKLSAgICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksCi0gICAgICBtTGVmdFZvbHVtZSgxLjApLAotICAgICAgbVJpZ2h0Vm9sdW1lKDEuMCksCitNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoaW50MzJfdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKKyAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKQorICAgIDogbUNhbGxiYWNrKG51bGxwdHIpLAorICAgICAgbUNhbGxiYWNrQ29va2llKG51bGxwdHIpLAorICAgICAgbUNhbGxiYWNrRGF0YShudWxscHRyKSwKKyAgICAgIG1Wb2x1bWUoMS4wKSwKICAgICAgIG1QbGF5YmFja1JhdGUoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKICAgICAgIG1TYW1wbGVSYXRlSHooMCksCiAgICAgICBtTXNlY3NQZXJGcmFtZSgwKSwKQEAgLTc4LDI4ICs3NCwyMiBAQAogICAgICAgbVBpZChwaWQpLAogICAgICAgbVNlbmRMZXZlbCgwLjApLAogICAgICAgbUF1eEVmZmVjdElkKDApLAotICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAotICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKGZhbHNlKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFjayhkZXZpY2VDYWxsYmFjaykgeworICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKLSAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBpZiAobUF0dHJpYnV0ZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CisKKyAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxscHRyKSB7CisgICAgICAgIG1BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBtUm91dGluZ0RlbGVnYXRlcy5jbGVhcigpOwogfQogCiBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6fk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCkgeworICAgIGZvciAoYXV0byByb3V0aW5nRGVsZWdhdGUgOiBtUm91dGluZ0RlbGVnYXRlcykgeworICAgICAgICBKQXVkaW9UcmFjazo6cmVtb3ZlR2xvYmFsUmVmKHJvdXRpbmdEZWxlZ2F0ZS5zZWNvbmQpOworICAgIH0KICAgICBjbG9zZSgpOwotICAgIGZyZWUobUF0dHJpYnV0ZXMpOwogICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCkBAIC0xMjYsMzEgKzExNiwzMSBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZnJhbWVDb3VudCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICByZXR1cm4gbUZyYW1lU2l6ZTsKQEAgLTE1OCwxMCArMTQ4LDEwIEBACiAKIHVpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+bGF0ZW5jeSgpOwogfQogCiBmbG9hdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0IHsKQEAgLTE3MSwxOCArMTYxLDE4IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKIH0KIAogLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dER1cmF0aW9uVXMoKQpAQCAtMTk1LDcgKzE4NSw3IEBACiAvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgogaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjAzLDIyICsxOTMsMTggQEAKICAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0VXM7CiAgICAgQXVkaW9UaW1lc3RhbXAgdHM7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgc3RhdHVzX3QgcmVzID0gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworCiAgICAgaWYgKHJlcyA9PSBPSykgeyAgICAgICAgICAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzIGFuZCBvZmZsb2FkZWQgdHJhY2tzLgogICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCiAgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKICAgICAgICAgLy8gICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgotICAgICAgICByZXMgPSBtVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOwotICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyArPSAxMDAwTEwgKiBtVHJhY2stPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLwotICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJXUgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKICAgICB9CiAKICAgICAvLyBDSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKQEAgLTI0NCwxMDggKzIzMCw1NSBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKICAgICBpZiAoc3RhdHVzID09IE9LIHx8IHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICAqZnJhbWVzd3JpdHRlbiA9ICh1aW50MzJfdClldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICBtQXR0cmlidXRlcyA9IChhdHRyaWJ1dGVzID09IG51bGxwdHIpID8gbnVsbHB0ciA6IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogfQogCi1TdHJpbmc4ICBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7CithdWRpb19zdHJlYW1fdHlwZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7CisgICAgQUxPR1YoImdldEF1ZGlvU3RyZWFtVHlwZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKLSAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkgewotICAgIG1UcmFjay5jbGVhcigpOworICAgIG1KQXVkaW9UcmFjay5jbGVhcigpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6b3BlbigKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCkgewotICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CisgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZm9ybWF0LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAKICAgICAvLyBvZmZsb2FkaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIGNhbGxiYWNrIG1vZGUgZm9yIG5vdy4KICAgICAvLyBvZmZsb2FkSW5mbyBtdXN0IGJlIHByZXNlbnQgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldAogICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgJiYKLSAgICAgICAgICAgICgoY2IgPT0gTlVMTCkgfHwgKG9mZmxvYWRJbmZvID09IE5VTEwpKSkgeworICAgICAgICAgICAgKChjYiA9PSBudWxscHRyKSB8fCAob2ZmbG9hZEluZm8gPT0gbnVsbHB0cikpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gY29tcHV0ZSBmcmFtZSBjb3VudCBmb3IgdGhlIEF1ZGlvVHJhY2sgaW50ZXJuYWwgYnVmZmVyCi0gICAgc2l6ZV90IGZyYW1lQ291bnQ7Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IDA7IC8vIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB0cnkgdG8gZXN0aW1hdGUgdGhlIGJ1ZmZlciBwcm9jZXNzaW5nIGZldGNoIHNpemUgZnJvbSBBdWRpb0ZsaW5nZXIuCi0gICAgICAgIC8vIGZyYW1lc1BlckJ1ZmZlciBpcyBhcHByb3hpbWF0ZSBhbmQgZ2VuZXJhbGx5IGNvcnJlY3QsIGV4Y2VwdCB3aGVuIGl0J3Mgbm90IDotKS4KLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGFmRnJhbWVDb3VudCAvIGFmU2FtcGxlUmF0ZTsKLQotICAgICAgICBpZiAoYnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBhcmd1bWVudCBidWZmZXJDb3VudCBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgICAgICBpZiAoYnVmZmVyQ291bnQgIT0gMCAmJiBidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7Ci0gICAgICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBmcmFtZUNvdW50IGlzIDAsIHRoZW4gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHRoZSBtaW5pbXVtIHNpemUgcGVybWl0dGVkLgotICAgICAgICBmcmFtZUNvdW50ID0gYnVmZmVyQ291bnQgKiBmcmFtZXNQZXJCdWZmZXI7Ci0gICAgfQorICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApID8gMCA6IHN1Z2dlc3RlZEZyYW1lQ291bnQ7CiAKICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CiAgICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CkBAIC0zNTksMzIgKzI5MiwyMyBAQAogICAgIG1DYWxsYmFjayA9IGNiOwogICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIAotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOworICAgIHNwPEpBdWRpb1RyYWNrPiBqVDsKKyAgICBDYWxsYmFja0RhdGEgKm5ld2NiZCA9IG51bGxwdHI7CiAKLSAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEF1ZGlvVHJhY2siKTsKKyAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEpBdWRpb1RyYWNrIik7CiAKLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKICAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIG5ld2NiZCwKLSAgICAgICAgICAgICAgICAwLCAgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICBqVCA9IG5ldyBKQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAorICAgICAgICAgICAgICAgICBuZXdjYmQsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgMS4wZik7ICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETzogRHVlIHRvIGJ1ZmZlciBtZW1vcnkgY29uY2VybnMsIHdlIHVzZSBhIG1heCB0YXJnZXQgcGxheWJhY2sgc3BlZWQKICAgICAgICAgLy8gYmFzZWQgb24gbVBsYXliYWNrUmF0ZSBhdCB0aGUgdGltZSBvZiBvcGVuIChpbnN0ZWFkIG9mIGtNYXhSZXF1aXJlZFNwZWVkKSwKQEAgLTM5NCw3MyArMzE4LDYyIEBACiAgICAgICAgIEFMT0dXX0lGKHRhcmdldFNwZWVkICE9IG1QbGF5YmFja1JhdGUubVNwZWVkLAogICAgICAgICAgICAgICAgICJ0cmFjayB0YXJnZXQgc3BlZWQ6JWYgY2xhbXBlZCBmcm9tIHBsYXliYWNrIHNwZWVkOiVmIiwKICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOwotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBjYWxsYmFjawotICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQotICAgICAgICAgICAgICAgIDAsIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gb2ZmbG9hZCBpbmZvCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgalQgPSBuZXcgSkF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQpOwogICAgIH0KIAotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CisgICAgaWYgKGpUID09IDApIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgLy8gdCBnb2VzIG91dCBvZiBzY29wZSwgc28gcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8KICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAotICAgICAgICAvLyBmcm9tIHRoZSBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIG1TdHJlYW1UeXBlID0gdC0+c3RyZWFtVHlwZSgpOwogICAgIH0KIAotICAgIENIRUNLKCh0ICE9IE5VTEwpICYmICgobUNhbGxiYWNrID09IE5VTEwpIHx8IChuZXdjYmQgIT0gTlVMTCkpKTsKKyAgICBDSEVDSygoalQgIT0gbnVsbHB0cikgJiYgKChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgfHwgKG5ld2NiZCAhPSBudWxscHRyKSkpOwogCiAgICAgbUNhbGxiYWNrRGF0YSA9IG5ld2NiZDsKICAgICBBTE9HVigic2V0Vm9sdW1lIik7Ci0gICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIGpULT5zZXRWb2x1bWUobVZvbHVtZSk7CiAKICAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKLSAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7Ci0gICAgbVRyYWNrID0gdDsKKyAgICBtRnJhbWVTaXplID0galQtPmZyYW1lU2l6ZSgpOworICAgIG1KQXVkaW9UcmFjayA9IGpUOwogCiAgICAgcmV0dXJuIHVwZGF0ZVRyYWNrX2woKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnVwZGF0ZVRyYWNrX2woKSB7Ci0gICAgaWYgKG1UcmFjayA9PSBOVUxMKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKICAgICAvLyBOb3RlIHNvbWUgb3V0cHV0IGRldmljZXMgbWF5IGdpdmUgdXMgYSBkaXJlY3QgdHJhY2sgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgc3BlY2lmeSBpdC4KICAgICAvLyBFeGFtcGxlOiBMaW5lIGFwcGxpY2F0aW9uIGIvMTc0NTk5ODIuCi0gICAgaWYgKChtVHJhY2stPmdldEZsYWdzKCkKKyAgICBpZiAoKG1KQXVkaW9UcmFjay0+Z2V0RmxhZ3MoKQogICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpID09IDApIHsKLSAgICAgICAgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwogICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKLSAgICAgICAgICAgIHJlcyA9IG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CisgICAgICAgICAgICBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UobVNlbGVjdGVkRGV2aWNlSWQpOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKSB7Ci0gICAgICAgIG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBpZiAobVByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0UHJlZmVycmVkRGV2aWNlKG1QcmVmZXJyZWREZXZpY2UtPmdldEpPYmplY3QoKSk7CiAgICAgfQorCisgICAgbUpBdWRpb1RyYWNrLT5yZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMobVJvdXRpbmdEZWxlZ2F0ZXMpOworCiAgICAgQUxPR1YoInVwZGF0ZVRyYWNrX2woKSBET05FIHN0YXR1cyAlZCIsIHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQ2OCwxMyArMzgxLDEzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RhcnQoKSB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CiAgICAgfQotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRWb2x1bWUobVZvbHVtZSk7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtNDgyLDExICszOTUsMTEgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBudWxscHRyLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKIAogICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQpAQCAtNDk0LDQ1ICs0MDcsNDQgQEAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0b3AoKSB7CiAgICAgQUxPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c3RvcCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZsdXNoKCkgewogICAgIEFMT0dWKCJmbHVzaCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5mbHVzaCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmZsdXNoKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKICAgICBBTE9HVigicGF1c2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+cGF1c2UoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5wYXVzZSgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2UoKSB7CiAgICAgQUxPR1YoImNsb3NlIik7Ci0gICAgc3A8QXVkaW9UcmFjaz4gdHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+IHRyYWNrOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICB0cmFjayA9IG1UcmFjazsKLSAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbVRyYWNrCisgICAgICAgIHRyYWNrID0gbUpBdWRpb1RyYWNrOworICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtSkF1ZGlvVHJhY2sKICAgICB9CiAgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHRyYWNrIG9jY3VycyBvdXRzaWRlIG9mIG11dGV4LgogfQogCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgQUxPR1YoInNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICBtVm9sdW1lID0gdm9sdW1lOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFZvbHVtZSh2b2x1bWUpOwogICAgIH0KIH0KIApAQCAtNTQwLDEyICs0NTIsMTIgQEAKICAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCiAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAogICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtSkF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNTU5LDEyICs0NzEsMTIgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUiKTsKKyAgICBBTE9HVigiZ2V0UGxheWJhY2tSYXRlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgKnJhdGUgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOworICAgICpyYXRlID0gbUpBdWRpb1RyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTU3Miw4ICs0ODQsOCBAQAogICAgIEFMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtU2VuZExldmVsID0gbGV2ZWw7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTU4Miw0NCArNDk0LDU5IEBACiAgICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gbUpBdWRpb1RyYWNrLT5zZXRQcmVmZXJyZWREZXZpY2UoZGV2aWNlKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBtUHJlZmVycmVkRGV2aWNlID0gbmV3IEpPYmplY3RIb2xkZXIoZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworam9iamVjdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFJvdXRlZERldmljZSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBqUm91dGluZ0RlbGVnYXRlKSB7CisgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgam9iamVjdCBsaXN0ZW5lciA9IEpBdWRpb1RyYWNrOjpnZXRMaXN0ZW5lcihqUm91dGluZ0RlbGVnYXRlKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIgJiYKKyAgICAgICAgSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpID09IG51bGxwdHIpIHsKKyAgICAgICAgam9iamVjdCBoYW5kbGVyID0gSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlID0gSkF1ZGlvVHJhY2s6OmFkZEdsb2JhbFJlZihqUm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgbVJvdXRpbmdEZWxlZ2F0ZXMucHVzaF9iYWNrKHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0PihsaXN0ZW5lciwgcm91dGluZ0RlbGVnYXRlKSk7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlLCBoYW5kbGVyKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpIHsKLSAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBBTE9HVigicmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVJvdXRlZERldmljZUlkID0gbVRyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgIH0KLSAgICAqZGV2aWNlSWQgPSBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKLSAgICBBTE9HVigiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjaywgJWQiLCBlbmFibGVkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSA9IG51bGxwdHI7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyICYmCisgICAgICAgIChyb3V0aW5nRGVsZWdhdGUgPSBKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcikpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIEpBdWRpb1RyYWNrOjplcmFzZUJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcik7CisgICAgICAgIGlmIChKQXVkaW9UcmFjazo6cmVtb3ZlR2xvYmFsUmVmKHJvdXRpbmdEZWxlZ2F0ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNjMyLDIxICs1NTksMjEgQEAKICAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCiAgICAgZGF0YS0+bG9jaygpOwogICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgaWYgKG1lID09IE5VTEwpIHsKKyAgICBKQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoSkF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCiAgICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KICAgICAgICAgZGF0YS0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPm1TaXplID0gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKICAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPm1EYXRhLCBidWZmZXItPm1TaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAogICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAogICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgpAQCAtNjU4LDI1ICs1ODUsMjUgQEAKICAgICAgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOwogICAgICAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgogCi0gICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKKyAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+bVNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKIAotICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOworICAgICAgICBidWZmZXItPm1TaXplID0gYWN0dWFsU2l6ZTsKICAgICAgICAgfSBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgogICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CiAgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CiAgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQogICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCiAgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCkBAIC02OTYsMjkgKzYyMywzMSBAQAogICAgIGRhdGEtPnVubG9jaygpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0Ci17CitpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHJldHVybiBtU2Vzc2lvbklkOwogfQogCi11aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAotaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QKLXsKK3VpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKK30KKworaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgaWYgKG1UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGR1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAppbmRleCAzMDE4MjViLi44N2RjODg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaApAQCAtMTcsMTkgKzE3LDIxIEBACiAjaWZuZGVmIEFORFJPSURfSkFVRElPVFJBQ0tfSAogI2RlZmluZSBBTkRST0lEX0pBVURJT1RSQUNLX0gKIAorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9Wb2x1bWVTaGFwZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4gICAvLyBJdCBoYXMgZGVwZW5kZW5jeSBvbiBhdWRpby5oL0Vycm9ycy5oLCBidXQgZG9lc24ndAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGVtIGluIGl0LiBUaGVyZWZvcmUgaXQgaXMgaW5jbHVkZWQgaGVyZSBhdCBsYXN0LgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEpBdWRpb1RyYWNrIHsKK2NsYXNzIEpBdWRpb1RyYWNrIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgogCiAgICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9UcmFjayBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGJhY2tfdCkuCkBAIC0zNyw2ICszOSw4IEBACiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKICAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KKyAgICAgICAgRVZFTlRfVU5ERVJSVU4gPSAxLCAgICAgICAgIC8vIEJ1ZmZlciB1bmRlcnJ1biBvY2N1cnJlZC4gVGhpcyB3aWxsIG5vdCBvY2N1ciBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRpYyB0cmFja3MuCiAgICAgICAgIEVWRU5UX05FV19JQVVESU9UUkFDSyA9IDYsICAvLyBJQXVkaW9UcmFjayB3YXMgcmUtY3JlYXRlZCwgZWl0aGVyIGR1ZSB0byByZS1yb3V0aW5nIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sdW50YXJ5IGludmFsaWRhdGlvbiBieSBtZWRpYXNlcnZlciwgb3IgbWVkaWFzZXJ2ZXIgY3Jhc2guCiAgICAgICAgIEVWRU5UX1NUUkVBTV9FTkQgPSA3LCAgICAgICAvLyBTZW50IGFmdGVyIGFsbCB0aGUgYnVmZmVycyBxdWV1ZWQgaW4gQUYgYW5kIEhXIGFyZSBwbGF5ZWQKQEAgLTEwNCwxNSArMTA4LDE0IEBACiAgICAgICoKICAgICAgKiBUT0RPOiBSZXZpdmUgcmVtb3ZlZCBhcmd1bWVudHMgYWZ0ZXIgb2ZmbG9hZCBtb2RlIGlzIHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBKQXVkaW9UcmFjayhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICBKQXVkaW9UcmFjayh1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICBjb25zdCBqb2JqZWN0IHBBdHRyaWJ1dGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CiAKICAgICAvKgpAQCAtMTU4LDEwICsxNjEsMTAgQEAKICAgICAgKiBDYXV0aW9uOiBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvbyBvZnRlbiBtYXkgYmUgaW5lZmZpY2llbnQ7CiAgICAgICogaWYgeW91IG5lZWQgYSBoaWdoIHJlc29sdXRpb24gbWFwcGluZyBiZXR3ZWVuIGZyYW1lIHBvc2l0aW9uIGFuZCBwcmVzZW50YXRpb24gdGltZSwKICAgICAgKiBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhhdCBhdCBhcHBsaWNhdGlvbiBsZXZlbCwgYmFzZWQgb24gdGhlIGxvdyByZXNvbHV0aW9uIHRpbWVzdGFtcHMuCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KLSAgICAgKiBUaGUgdGltZXN0YW1wIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb24gcmV0dXJuLCBpZiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiAgICAgICAgIE5PX0lOSVQgaWYgZmluZHMgZXJyb3IsIGFuZCB0aW1lc3RhbXAgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkIG9uIHJldHVybi4KICAgICAgKi8KLSAgICBib29sIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CiAKICAgICAvLyBUT0RPOiBUaGlzIGRvYyBpcyBqdXN0IGNvcGllZCBmcm9tIEF1ZGlvVHJhY2suaC4gUmV2aXNlIGl0IGFmdGVyIGltcGxlbWVuYXRpb24uCiAgICAgLyogUmV0dXJuIHRoZSBleHRlbmRlZCB0aW1lc3RhbXAsIHdpdGggYWRkaXRpb25hbCB0aW1lYmFzZSBpbmZvIGFuZCBpbXByb3ZlZCBkcmFpbiBiZWhhdmlvci4KQEAgLTMyNCwzNyArMzI3LDQzIEBACiAKICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKTsKIAorICAgIHNpemVfdCBmcmFtZVNpemUoKTsKKwogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgogICAgICAqIE5vdCBhIGdlbmVyYWwtcHVycG9zZSBBUEk7IGludGVuZGVkIG9ubHkgZm9yIHVzZSBieSBtZWRpYSBwbGF5ZXIgc2VydmljZSB0byBkdW1wIGl0cyB0cmFja3MuCiAgICAgICovCiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCi0gICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCi0gICAgICogYXR0YWNoZWQuIFdoZW4gdGhlIEF1ZGlvVHJhY2sgaXMgaW5hY3RpdmUsIGl0IHdpbGwgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkUuCisgICAgLyogUmV0dXJucyB0aGUgQXVkaW9EZXZpY2VJbmZvIHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKKyAgICAgKiBhdHRhY2hlZC4KICAgICAgKi8KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CisgICAgam9iamVjdCBnZXRSb3V0ZWREZXZpY2UoKTsKIAogICAgIC8qIFJldHVybnMgdGhlIElEIG9mIHRoZSBhdWRpbyBzZXNzaW9uIHRoaXMgQXVkaW9UcmFjayBiZWxvbmdzIHRvLiAqLwotICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgIGludDMyX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKIAotICAgIC8qIFNlbGVjdHMgdGhlIGF1ZGlvIGRldmljZSB0byB1c2UgZm9yIG91dHB1dCBvZiB0aGlzIEF1ZGlvVHJhY2suIEEgdmFsdWUgb2YKLSAgICAgKiBBVURJT19QT1JUX0hBTkRMRV9OT05FIGluZGljYXRlcyBkZWZhdWx0IHJvdXRpbmcuCisgICAgLyogU2V0cyB0aGUgcHJlZmVycmVkIGF1ZGlvIGRldmljZSB0byB1c2UgZm9yIG91dHB1dCBvZiB0aGlzIEF1ZGlvVHJhY2suCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICBUaGUgZGV2aWNlIElEIG9mIHRoZSBzZWxlY3RlZCBkZXZpY2UgKGFzIHJldHVybmVkIGJ5IHRoZSBBdWRpb0RldmljZXNNYW5hZ2VyIEFQSSkuCisgICAgICogRGV2aWNlOiBhbiBBdWRpb0RldmljZUluZm8gb2JqZWN0LgogICAgICAqCiAgICAgICogUmV0dXJuZWQgdmFsdWU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCi0gICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gZmluZCB0aGUgdmFsaWQgb3V0cHV0IGRldmljZSB3aXRoIGdpdmVuIGRldmljZSBJZC4KKyAgICAgKiAgLSBCQURfVkFMVUU6IGZhaWxlZCB0byBzZXQgdGhlIGRldmljZQogICAgICAqLwotICAgIHN0YXR1c190IHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOwogCiAgICAgLy8gVE9ETzogQWRkIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgogICAgIC8vIFRPRE86IEFkZCBBVURJT19GTEFHX0hXX0FWX1NZTkMgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBjaGVjay4KICAgICAvKiBSZXR1cm5zIHRoZSBmbGFncyAqLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAKKyAgICAvKiBXZSBkb24ndCBrZWVwIHN0cmVhbSB0eXBlIGhlcmUsCisgICAgICogaW5zdGVhZCwgd2Uga2VlcCBhdHRyaWJ1dGVzIGFuZCBjYWxsIGdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKSB0byBnZXQgc3RyZWFtIHR5cGUKKyAgICAgKi8KKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpOworCiAgICAgLyogT2J0YWluIHRoZSBwZW5kaW5nIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBmb3IgcGxheWJhY2sgb2YgcHVyZSBQQ00gZGF0YSByZW1haW5pbmcgaW4KICAgICAgKiBBdWRpb1RyYWNrLgogICAgICAqCkBAIC0zNjksMjcgKzM3OCw2OCBAQAogICAgICAqIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IGluc3RhbGxlZCBjYWxsYmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqIExpc3RlbmVyOiB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgcmVyb3V0aW5nIGV2ZW50cy4KKyAgICAgKiBIYW5kbGVyOiB0aGUgaGFuZGxlciB0byBoYW5kbGVyIHRoZSByZXJvdXRpbmcgZXZlbnRzLgogICAgICAqCiAgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgotICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCi0gICAgICogICAgICAgICBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqICAgICAgICAgKFRPRE8pIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBzYW1lIGNhbGxiYWNrIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorICAgICAqICAgICAgICAgKFRPRE8pIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQorICAgICAqICAgICAgICAgKFRPRE8pIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAogICAgICAqLwotICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyLCBqb2JqZWN0IHJkKTsKIAogICAgIC8qIFJlbW92ZXMgYW4gQXVkaW9EZXZpY2VDYWxsYmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqIExpc3RlbmVyOiB0aGUgbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgcmVyb3V0aW5nIGV2ZW50cy4KICAgICAgKgogICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCi0gICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKKyAgICAgKiAgICAgICAgIChUT0RPKSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZAorICAgICAqICAgICAgICAgKFRPRE8pIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAogICAgICAqLwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKKworICAgIC8qIFJlZ2lzdGVyIGFsbCBiYWNrZWQtdXAgcm91dGluZyBkZWxlZ2F0ZXMuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIHJvdXRpbmdEZWxlZ2F0ZXM6IGJhY2tlZC11cCByb3V0aW5nIGRlbGVnYXRlcworICAgICAqCisgICAgICovCisgICAgdm9pZCByZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGpvYmplY3QsIGpvYmplY3Q+PiYgcm91dGluZ0RlbGVnYXRlcyk7CisKKyAgICAvKiBnZXQgbGlzdGVuZXIgZnJvbSBSb3V0aW5nRGVsZWdhdGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZ2V0TGlzdGVuZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyogZ2V0IGhhbmRsZXIgZnJvbSBSb3V0aW5nRGVsZWdhdGUgb2JqZWN0CisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZ2V0SGFuZGxlcihjb25zdCBqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZU9iaik7CisKKyAgICAvKiBjb252ZXJ0IGxvY2FsIHJlZmVyZW5jZSB0byBnbG9iYWwgcmVmZXJlbmNlLgorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGFkZEdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaik7CisKKyAgICAvKiBlcmFzZSBnbG9iYWwgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZWVkcworICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIG9iaiBpcyBOVUxMCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUdsb2JhbFJlZihjb25zdCBqb2JqZWN0IG9iaik7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKgorICAgICAqIFJldHVybnMgdmFsdWUgaWYga2V5IGlzIGluIHRoZSBtYXAKKyAgICAgKiAgICAgICAgIG51bGxwdHIgaWYga2V5IGlzIG5vdCBpbiB0aGUgbWFwCisgICAgICovCisgICAgc3RhdGljIGpvYmplY3QgZmluZEJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSk7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBlcmFzZUJ5S2V5KHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSk7CiAKIHByaXZhdGU6CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjdmODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCisjZGVmaW5lIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uIDogcHVibGljIE1lZGlhSFRUUENvbm5lY3Rpb24geworICAgIEpNZWRpYTJIVFRQQ29ubmVjdGlvbihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KTsKKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKnVyaSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5KTWVkaWEySFRUUENvbm5lY3Rpb24oKTsKKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iajsKKyAgICBqbWV0aG9kSUQgbUNvbm5lY3RNZXRob2Q7CisgICAgam1ldGhvZElEIG1EaXNjb25uZWN0TWV0aG9kOworICAgIGptZXRob2RJRCBtUmVhZEF0TWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0U2l6ZU1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbUdldE1JTUVUeXBlTWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0VXJpTWV0aG9kOworCisgICAgamJ5dGVBcnJheSBtQnl0ZUFycmF5T2JqOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSk1lZGlhMkhUVFBDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCisjZGVmaW5lIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWEySFRUUFNlcnZpY2UgOiBwdWJsaWMgTWVkaWFIVFRQU2VydmljZSB7CisgICAgSk1lZGlhMkhUVFBTZXJ2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopOworCisgICAgdmlydHVhbCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkpNZWRpYTJIVFRQU2VydmljZSgpOworCitwcml2YXRlOgorICAgIGpvYmplY3QgbU1lZGlhMkhUVFBTZXJ2aWNlT2JqOworCisgICAgam1ldGhvZElEIG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKTWVkaWEySFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQTJfSFRUUF9TRVJWSUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q4YjQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEpPQkpFQ1RfSE9MREVSX0hfCisKKyNkZWZpbmUgSk9CSkVDVF9IT0xERVJfSF8KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyBnbG9iYWwgcmVmZXJlbmNlIG9mIGpvYmplY3QuCitzdHJ1Y3QgSk9iamVjdEhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBKT2JqZWN0SG9sZGVyKGpvYmplY3Qgb2JqKSB7CisgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgbUpPYmplY3QgPSByZWludGVycHJldF9jYXN0PGpvYmplY3Q+KGVudi0+TmV3R2xvYmFsUmVmKG9iaikpOworICAgIH0KKworICAgIHZpcnR1YWwgfkpPYmplY3RIb2xkZXIoKSB7CisgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUpPYmplY3QpOworICAgIH0KKworICAgIGpvYmplY3QgZ2V0Sk9iamVjdCgpIHsgcmV0dXJuIG1KT2JqZWN0OyB9CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtSk9iamVjdDsKK307CisKK30gIC8vIiBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSk9CSkVDVF9IT0xERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA5MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSkFWQV9WTV9IRUxQRVJfSF8KKworI2RlZmluZSBKQVZBX1ZNX0hFTFBFUl9IXworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlIDxhdG9taWM+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEphdmFWTUhlbHBlciB7CisgICAgc3RhdGljIEpOSUVudiAqZ2V0Sk5JRW52KCk7CisgICAgc3RhdGljIHZvaWQgc2V0SmF2YVZNKEphdmFWTSAqdm0pOworCitwcml2YXRlOgorICAgIC8vIE9uY2UgYSB2YWxpZCBKYXZhVk0gaGFzIGJlZW4gc2V0LCBpdCBzaG91bGQgbmV2ZXIgYmUgcmVzZXQgb3IgY2hhbmdlZC4KKyAgICAvLyBIb3dldmVyLCBhcyBpdCBtYXkgYmUgYWNjZXNzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLCBhY2Nlc3MgbmVlZHMgdG8gYmUKKyAgICAvLyBzeW5jaHJvbml6ZWQuCisgICAgc3RhdGljIHN0ZDo6YXRvbWljPEphdmFWTSAqPiBzSmF2YVZNOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBKQVZBX1ZNX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaAppbmRleCA1ZDViOGU0Li5iZGE0ZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaApAQCAtMTksMTAgKzE5LDE2IEBACiAjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyQVVESU9PVVRQVVRfSAogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSAiam5pLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQXVkaW9UcmFjazsKQEAgLTMyLDE1ICszOCwxNCBAQAogICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKIAogcHVibGljOgotICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoaW50MzJfdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOwogICAgIHZpcnR1YWwgfk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVHJhY2sgIT0gMDsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjayAhPSBudWxscHRyOwogICAgIH0KICAgICB2aXJ0dWFsIHNzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZUNvdW50KCkgY29uc3Q7CkBAIC01MiwxNyArNTcsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CkBAIC03MSwxMyArNzYsMTAgQEAKICAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKLSAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwotICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKLSAgICB9Ci0gICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcyk7CisgICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3Q7CiAKLSAgICB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CiAKQEAgLTkyLDEzICs5NCwxMSBAQAogICAgICAgICAvLyBUT0RPOiByZXR1cm4gY29ycmVjdCB2YWx1ZS4KICAgICAgICAgLy9yZXR1cm4gbU5leHRPdXRwdXQgPT0gTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotCiAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgIHZpcnR1YWwgam9iamVjdCBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgdm9pZCBzZXRNaW5CdWZmZXJDb3VudCgpOwpAQCAtMTA3LDI5ICsxMDcsMjUgQEAKICAgICB2b2lkIGNsb3NlX2woKTsKICAgICBzdGF0dXNfdCB1cGRhdGVUcmFja19sKCk7CiAKLSAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+ICAgICAgICAgbUpBdWRpb1RyYWNrOwogICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKICAgICB2b2lkICogICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWU7CiAgICAgQ2FsbGJhY2tEYXRhICogICAgICAgICAgbUNhbGxiYWNrRGF0YTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICBtQXR0cmlidXRlczsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbUF0dHJpYnV0ZXM7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVZvbHVtZTsKICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICAgICBtUGxheWJhY2tSYXRlOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlSHo7IC8vIHNhbXBsZSByYXRlIG9mIHRoZSBjb250ZW50LCBhcyBzZXQgaW4gb3BlbigpCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbVVpZDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICAgIG1GbGFnczsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtU2VsZWN0ZWREZXZpY2VJZDsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKLSAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gICAgICAgIG1EZXZpY2VDYWxsYmFjazsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICBtUHJlZmVycmVkRGV2aWNlOwogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxqb2JqZWN0LCBqb2JqZWN0Pj4gbVJvdXRpbmdEZWxlZ2F0ZXM7IC8vIDxsaXN0ZW5lciwgcm91dGluZ0RlbGVnYXRlPgogCiAgICAgLy8gc3RhdGljIHZhcmlhYmxlcyBiZWxvdyBub3QgcHJvdGVjdGVkIGJ5IG11dGV4CiAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAppbmRleCAwMmJmODkxLi41ZTk4NTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxqbmkuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KQEAgLTMzLDYgKzM0LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgogCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKwogLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKIC8vIGdsb2JhbCwgYW5kIG5vdCBpbiBhbmRyb2lkOjoKIHN0cnVjdCBzb2NrYWRkcl9pbjsKQEAgLTQzLDcgKzQ5LDYgQEAKIGNsYXNzIFBhcmNlbDsKIHN0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKIAotI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCA0CiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUlNJWkUgMTIwMAogI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19TQU1QTEVSQVRFIDQ0MTAwCiAKQEAgLTU2LDcgKzYxLDggQEAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZSA6IHB1YmxpYyBBSGFuZGxlciB7CkBAIC04OCw3ICs5NCw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0ID0gMDsKQEAgLTk4LDEyICsxMDQsMTAgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdD1BVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQ9REVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApID0gMDsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwpAQCAtMTM5LDkgKzE0MywxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBqb2JqZWN0ICAgICBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOwogICAgIH07CiAKICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2UoKSA6IG1MaXN0ZW5lcihOVUxMKSB7IH0KQEAgLTE3MSw3ICsxNzYsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgewpAQCAtMjE4LDcgKzIyMiw3IEBACiAgICAgLy8gICAgICAgICAgICAgICAgZGF0YSBzZW50IGJ5IHRoZSBqYXZhIGxheWVyLgogICAgIC8vIEBwYXJhbVtvdXRdIHJlcGx5IFBhcmNlbCB0byBob2xkIHRoZSByZXBseSBkYXRhLiBDYW5ub3QgYmUgbnVsbC4KICAgICAvLyBAcmV0dXJuIE9LIGlmIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSA9IDA7CiAKICAgICAvLyBUaGUgQ2xpZW50IGluIHRoZSBNZXRhZGF0YVBsYXllclNlcnZpY2UgY2FsbHMgdGhpcyBtZXRob2Qgb24KICAgICAvLyB0aGUgbmF0aXZlIHBsYXllciB0byByZXRyaWV2ZSBhbGwgb3IgYSBzdWJzZXQgb2YgbWV0YWRhdGEuCkBAIC0yMzcsNyArMjQxLDcgQEAKICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgfQogCi0gICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGFyY2VsICpvYmo9TlVMTCkgeworICAgIHZvaWQgc2VuZEV2ZW50KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxPTAsIGludCBleHQyPTAsIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaj1OVUxMKSB7CiAgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwpAQCAtMjU2LDExICsyNjAsMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSBvdmVycmlkZSB7IH0KIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGludDY0X3QgLypzcmNJZCovLCBjb25zdCB1aW50OF90IC8qIHV1aWQgKi9bMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIC8qIGRybVNlc3Npb25JZCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCAvKnNyY0lkKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaAppbmRleCAzOTA1YjU1Li4yNDMwMjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaApAQCAtMzQsOCArMzQsNyBAQAogICAgIE1FRElBMl9TRVRfVklERU9fU0laRSAgICA9IDUsCiAgICAgTUVESUEyX1NUQVJURUQgICAgICAgICAgID0gNiwKICAgICBNRURJQTJfUEFVU0VEICAgICAgICAgICAgPSA3LAotICAgIE1FRElBMl9TVE9QUEVEICAgICAgICAgICA9IDgsCi0gICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOSwKKyAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA4LAogICAgIE1FRElBMl9OT1RJRllfVElNRSAgICAgICA9IDk4LAogICAgIE1FRElBMl9USU1FRF9URVhUICAgICAgICA9IDk5LAogICAgIE1FRElBMl9FUlJPUiAgICAgICAgICAgICA9IDEwMCwKQEAgLTQzLDcgKzQyLDYgQEAKICAgICBNRURJQTJfU1VCVElUTEVfREFUQSAgICAgPSAyMDEsCiAgICAgTUVESUEyX01FVEFfREFUQSAgICAgICAgID0gMjAyLAogICAgIE1FRElBMl9EUk1fSU5GTyAgICAgICAgICA9IDIxMCwKLSAgICBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VEID0gMTAwMDAsCiB9OwogCiAvLyBHZW5lcmljIGVycm9yIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIEVycm9ycyBhcmUgZmF0YWwsIHRoZQpAQCAtOTYsMTcgKzk0LDIwIEBACiBlbnVtIG1lZGlhMl9pbmZvX3R5cGUgewogICAgIC8vIDB4eAogICAgIE1FRElBMl9JTkZPX1VOS05PV04gPSAxLAotICAgIC8vIFRoZSBwbGF5ZXIgd2FzIHN0YXJ0ZWQgYmVjYXVzZSBpdCB3YXMgdXNlZCBhcyB0aGUgbmV4dCBwbGF5ZXIgZm9yIGFub3RoZXIKLSAgICAvLyBwbGF5ZXIsIHdoaWNoIGp1c3QgY29tcGxldGVkIHBsYXliYWNrCi0gICAgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhUID0gMiwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3Qgc3RhcnRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCA9IDIsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCB2aWRlbyBmcmFtZSBmb3IgcmVuZGVyaW5nCiAgICAgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJUID0gMywKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IGF1ZGlvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19BVURJT19SRU5ERVJJTkdfU1RBUlQgPSA0LAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoaXMgZGF0YSBzb3VyY2UKLSAgICBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSA9IDUsCi0gICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhlIGZ1bGwgcGxheSBsaXN0Ci0gICAgTUVESUEyX0lORk9fUExBWUxJU1RfRU5EID0gNiwKKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9FTkQgPSA1LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIGFsbCBkYXRhIHNvdXJjZXMuCisgICAgLy8gQnV0IHRoaXMgaXMgbm90IHZpc2libGUgaW4gbmF0aXZlIGNvZGUuIEp1c3Qga2VlcCB0aGlzIGVudHJ5IGZvciBjb21wbGV0ZW5lc3MuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfTElTVF9FTkQgPSA2LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYW4gaXRlcmF0aW9uIG9mIHBsYXliYWNrIGxvb3AuIFRoaXMgZXZlbnQgaXMgc2VudCBvbmx5IHdoZW4KKyAgICAvLyBsb29waW5nIGlzIGVuYWJsZWQuCisgICAgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUID0gNywKIAogICAgIC8vMXh4CiAgICAgLy8gVGhlIHBsYXllciBqdXN0IHByZXBhcmVkIGEgZGF0YSBzb3VyY2UuCkBAIC0xNTAsMTEgKzE1MSwxMSBAQAogCiAvLyBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNZWRpYVBsYXllcjIuamF2YQogZW51bSBtZWRpYXBsYXllcjJfc3RhdGVzIHsKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMSwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMiwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMywKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gNCwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gNSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMTAwMSwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMTAwMiwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gMTAwMywKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMTAwNCwKKyAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gMTAwNSwKIH07CiAKIGVudW0gbWVkaWFfcGxheWVyMl9pbnRlcm5hbF9zdGF0ZXMgewpAQCAtMTY1LDggKzE2Niw3IEBACiAgICAgTUVESUFfUExBWUVSMl9QUkVQQVJFRCAgICAgICAgICAgPSAxIDw8IDMsCiAgICAgTUVESUFfUExBWUVSMl9TVEFSVEVEICAgICAgICAgICAgPSAxIDw8IDQsCiAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgICAgICAgICAgICAgPSAxIDw8IDUsCi0gICAgTUVESUFfUExBWUVSMl9TVE9QUEVEICAgICAgICAgICAgPSAxIDw8IDYsCi0gICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSAgPSAxIDw8IDcKKyAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNgogfTsKIAogLy8gS2VlcCBLRVlfUEFSQU1FVEVSXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyMi5qYXZhLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCmluZGV4IGQ1ODYxOTIuLmE5NDVmZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKQEAgLTI0LDcgKzI0LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMzIsNiArMzQsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CkBAIC00Miw3ICs0Niw4IEBACiBjbGFzcyBNZWRpYVBsYXllcjJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCkgPSAwOwogfTsKIAogY2xhc3MgTWVkaWFQbGF5ZXIyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyCkBAIC01MCw3ICs1NSw3IEBACiBwdWJsaWM6CiAgICAgfk1lZGlhUGxheWVyMigpOwogCi0gICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKCk7CisgICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgRHVtcEFsbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwpAQCAtNjUsMTAgKzcwLDkgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwYXVzZSgpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzUGxheWluZygpOwotICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRNZWRpYVBsYXllcjJTdGF0ZSgpOworICAgICAgICAgICAgbWVkaWFwbGF5ZXIyX3N0YXRlcyBnZXRTdGF0ZSgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwpAQCAtODIsNjAgKzg2LDUyIEBACiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50NjRfdCBzcmNJZCwgaW50NjRfdCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICptZXRhZGF0YSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCk7CisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldEF1ZGlvQXR0cmlidXRlcygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwqIHJlcGx5KTsKIAogICAgICAgICAgICAgLy8gTW9kdWxhciBEUk0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShpbnQ2NF90IHNyY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogICAgICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpOworICAgICAgICAgICAgam9iamVjdCAgICAgICAgIGdldFJvdXRlZERldmljZSgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByaXZhdGU6Ci0gICAgTWVkaWFQbGF5ZXIyKCk7CisgICAgTWVkaWFQbGF5ZXIyKGludDMyX3Qgc2Vzc2lvbklkKTsKICAgICBib29sIGluaXQoKTsKIAotICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSB0ZXN0ZWQuCi0gICAgLy8gQHJldHVybiB0cnVlIGlmIHRoZSBtZXRhZGF0YSBzaG91bGQgYmUgZHJvcHBlZCBhY2NvcmRpbmcgdG8KLSAgICAvLyAgICAgICAgICAgICAgdGhlIGZpbHRlcnMuCi0gICAgYm9vbCBzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpIGNvbnN0OwotCi0gICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIHNldCBvZiBtZXRhZGF0YSB1cGRhdGVkLiBOb29wIGlmCi0gICAgLy8gdGhlIGVsZW1lbnQgZXhpc3RzIGFscmVhZHkuCi0gICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHJlY29yZGVkLgotICAgIHZvaWQgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpOwotCiAgICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFOYXRpdmVXaW5kb3cuCiAgICAgdm9pZCBkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKTsKIAotICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKIAogICAgIHZvaWQgY2xlYXJfbCgpOwogICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CiAgICAgc3RhdHVzX3QgcHJlcGFyZUFzeW5jX2woKTsKICAgICBzdGF0dXNfdCBnZXREdXJhdGlvbl9sKGludDY0X3QgKm1zZWMpOwogICAgIHN0YXR1c190IHJlc2V0X2woKTsKLSAgICBzdGF0dXNfdCBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CisgICAgc3RhdHVzX3QgY2hlY2tTdGF0ZV9sKCk7CiAKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKQEAgLTE1MiwyNyArMTQ4LDE0IEBACiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1TZWVrUG9zaXRpb247CiAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgICAgICAgIG1TZWVrTW9kZTsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgUGFyY2VsKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0OwotICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKKyAgICBzcDxKT2JqZWN0SG9sZGVyPiAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKLQogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAgICBtQ29ubmVjdGVkV2luZG93OwotCi0gICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFBbGxvdzsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YURyb3A7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLQotICAgIC8vIE1ldGFkYXRhIHVwZGF0ZWQuIEZvciBlYWNoIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFCi0gICAgLy8gbm90aWZpY2F0aW9uIHdlIHRyeSB0byB1cGRhdGUgbU1ldGFkYXRhVXBkYXRlZCB3aGljaCBpcyBhCi0gICAgLy8gc2V0OiBubyBkdXBsaWNhdGUuCi0gICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YVVwZGF0ZWQ7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCmluZGV4IGU1NTY3ZGMuLmY0MzIwNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCkBAIC01MywxNjkgKzUzLDYgQEAKIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwogCi0vLyBNYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGZpbHRlci4KLWNvbnN0IGludCBrTWF4RmlsdGVyU2l6ZSA9IDY0OyAgLy8gSSBwdWxsZWQgdGhhdCBvdXQgb2YgdGhpbiBhaXIuCi0KLS8vIEZJWE1FOiBNb3ZlIGFsbCB0aGUgbWV0YWRhdGEgcmVsYXRlZCBmdW5jdGlvbiBpbiB0aGUgTWV0YWRhdGEuY3BwCi0KLS8vIFVubWFyc2hhbGwgYSBmaWx0ZXIgZnJvbSBhIFBhcmNlbC4KLS8vIEZpbHRlciBmb3JtYXQgaW4gYSBwYXJjZWw6Ci0vLwotLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBlbnRyaWVzIChuKSAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAxICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDIgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vICAuLi4uCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSBuICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLwotLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgc2hvdWxkIHN0YXJ0IHdpdGggYSBmaWx0ZXIuCi0vLyBAcGFyYW1bb3V0XSBmaWx0ZXIgT24gZXhpdCBjb250YWlucyB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0eXBlIHRvIGJlCi0vLyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuCi0vLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCi0vLyBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmNlbCBzdGFydHMgd2l0aCBhIHZhbGlkIGZpbHRlci4KLWJvb2wgdW5tYXJzaGFsbEZpbHRlcihjb25zdCBQYXJjZWwmIHAsCi0gICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSB7Ci0gICAgaW50MzJfdCB2YWw7Ci0gICAgaWYgKHAucmVhZEludDMyKCZ2YWwpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmaWx0ZXIncyBsZW5ndGgiKTsKLSAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh2YWwgPiBrTWF4RmlsdGVyU2l6ZSB8fCB2YWwgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZpbHRlciBsZW4gJWQiLCB2YWwpOwotICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3Qgc2l6ZV90IG51bSA9IHZhbDsKLQotICAgIGZpbHRlci0+Y2xlYXIoKTsKLSAgICBmaWx0ZXItPnNldENhcGFjaXR5KG51bSk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG51bSAqIHNpemVvZihtZWRpYTo6TWV0YWRhdGE6OlR5cGUpOwotCi0KLSAgICBpZiAocC5kYXRhQXZhaWwoKSA8IHNpemUpIHsKLSAgICAgICAgQUxPR0UoIkZpbHRlciB0b28gc2hvcnQgZXhwZWN0ZWQgJXp1IGJ1dCBnb3QgJXp1Iiwgc2l6ZSwgcC5kYXRhQXZhaWwoKSk7Ci0gICAgICAgICpzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgKmRhdGEgPQotICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUqPihwLnJlYWRJbnBsYWNlKHNpemUpKTsKLQotICAgIGlmIChOVUxMID09IGRhdGEpIHsKLSAgICAgICAgQUxPR0UoIkZpbHRlciBoYWQgbm8gZGF0YSIpOwotICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogVGhlIHN0bCBpbXBsIG9mIHZlY3RvciB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCBoZXJlCi0gICAgLy8gYmVjYXVzZSBpdCBkZWdlbmVyYXRlcyBpbnRvIGEgbWVtY3B5IG9uIHBvZCB0eXBlcy4gVHJ5IHRvCi0gICAgLy8gcmVwbGFjZSBsYXRlciBvciB1c2Ugc3RsOjpzZXQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICsraSkgewotICAgICAgICBmaWx0ZXItPmFkZCgqZGF0YSk7Ci0gICAgICAgICsrZGF0YTsKLSAgICB9Ci0gICAgKnN0YXR1cyA9IE9LOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBAcGFyYW0gZmlsdGVyIE9mIG1ldGFkYXRhIHR5cGUuCi0vLyBAcGFyYW0gdmFsIFRvIGJlIHNlYXJjaGVkLgotLy8gQHJldHVybiB0cnVlIGlmIGEgbWF0Y2ggd2FzIGZvdW5kLgotYm9vbCBmaW5kTWV0YWRhdGEoY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGZpbHRlciwgY29uc3QgaW50MzJfdCB2YWwpIHsKLSAgICAvLyBEZWFsIHdpdGggZW1wdHkgYW5kIEFOWSByaWdodCBhd2F5Ci0gICAgaWYgKGZpbHRlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoZmlsdGVyWzBdID09IG1lZGlhOjpNZXRhZGF0YTo6a0FueSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmlsdGVyLmluZGV4T2YodmFsKSA+PSAwOwotfQotCi0vLyBtYXJzaGFsbGluZyB0YWcgaW5kaWNhdGluZyBmbGF0dGVuZWQgdXRmMTYgdGFncwotLy8ga2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuamF2YQotY29uc3QgaW50MzJfdCBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyA9IDE7Ci0KLS8vIEF1ZGlvIGF0dHJpYnV0ZXMgZm9ybWF0IGluIGEgcGFyY2VsOgotLy8KLS8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzICB8IC8vIGlnbm9yZSB0YWdzIGlmIG5vdCBmb3VuZAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZCB0YWdzIGluIFVURjE2ICAgICAgICAgICAgICAgICB8Ci0vLyB8ICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vCi0vLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBjb250YWlucyBhdWRpbyBhdHRyaWJ1dGVzLgotLy8gQHBhcmFtW291dF0gYXR0cmlidXRlcyBPbiBleGl0IHBvaW50cyB0byBhbiBpbml0aWFsaXplZCBhdWRpb19hdHRyaWJ1dGVzX3Qgc3RydWN0dXJlCi0vLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCi12b2lkIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoY29uc3QgUGFyY2VsJiBwYXJjZWwsIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcykgewotICAgIGF0dHJpYnV0ZXMtPnVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBhdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUgPSAoYXVkaW9fY29udGVudF90eXBlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBhdHRyaWJ1dGVzLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBhdHRyaWJ1dGVzLT5mbGFncyA9IChhdWRpb19mbGFnc19tYXNrX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBjb25zdCBib29sIGhhc0ZsYXR0ZW5lZFRhZyA9IChwYXJjZWwucmVhZEludDMyKCkgPT0ga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MpOwotICAgIGlmIChoYXNGbGF0dGVuZWRUYWcpIHsKLSAgICAgICAgLy8gdGhlIHRhZ3MgYXJlIFVURjE2LCBjb252ZXJ0IHRvIFVURjgKLSAgICAgICAgU3RyaW5nMTYgdGFncyA9IHBhcmNlbC5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgc3NpemVfdCByZWFsVGFnU2l6ZSA9IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKHRhZ3Muc3RyaW5nKCksIHRhZ3Muc2l6ZSgpKTsKLSAgICAgICAgaWYgKHJlYWxUYWdTaXplIDw9IDApIHsKLSAgICAgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjb3B5IHRoZSBmbGF0dGVuZWQgc3RyaW5nIGludG8gdGhlIGF0dHJpYnV0ZXMgYXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29udmVyc2lvbjoKLSAgICAgICAgICAgIC8vIGNvcHlpbmcgYXJyYXkgc2l6ZSAtMSwgYXJyYXkgZm9yIHRhZ3Mgd2FzIGNhbGxvYydkLCBubyBuZWVkIHRvIE5VTEwtdGVybWluYXRlIGl0Ci0gICAgICAgICAgICBzaXplX3QgdGFnU2l6ZSA9IHJlYWxUYWdTaXplID4gQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA/Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgOiByZWFsVGFnU2l6ZTsKLSAgICAgICAgICAgIHV0ZjE2X3RvX3V0ZjgodGFncy5zdHJpbmcoKSwgdGFnU2l6ZSwgYXR0cmlidXRlcy0+dGFncywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3MpIC8gc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3NbMF0pKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJ1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKCkgcmVjZWl2ZWQgdW5mbGF0dGVuZWQgdGFncywgaWdub3JpbmcgdGFnIHZhbHVlcyIpOwotICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOwotICAgIH0KLX0KLQotY2xhc3MgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6IHB1YmxpYyBBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjayB7Ci1wdWJsaWM6Ci0gICAgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiYgbGlzdGVuZXIpCi0gICAgICAgIDogbUxpc3RlbmVyKGxpc3RlbmVyKSB7IH0KLQotICAgIH5BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcigpIHsgfQotCi0gICAgdmlydHVhbCB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSBvdmVycmlkZSB7Ci0gICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgwLCBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VELCBhdWRpb0lvLCBkZXZpY2VJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHdwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gbUxpc3RlbmVyOwotfTsKLQogY2xhc3MgcHJveHlMaXN0ZW5lciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lciB7CiBwdWJsaWM6CiAgICAgcHJveHlMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllcjI+ICZwbGF5ZXIpCkBAIC0yMjMsNyArNjAsOCBAQAogCiAgICAgfnByb3h5TGlzdGVuZXIoKSB7IH07CiAKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIG92ZXJyaWRlIHsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKKyAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKm9iaikgb3ZlcnJpZGUgewogICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG1QbGF5ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAocGxheWVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHBsYXllci0+bm90aWZ5KHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CkBAIC0zODAsOCArMjE4LDggQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy9zdGF0aWMKLXNwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoKSB7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7CitzcDxNZWRpYVBsYXllcjI+IE1lZGlhUGxheWVyMjo6Q3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkKSB7CisgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKHNlc3Npb25JZCk7CiAKICAgICBpZiAoIXBsYXllci0+aW5pdCgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzk4LDQ0ICsyMzYsMzQgQEAKICAgICByZXR1cm4gZHVtcFBsYXllcnMoZmQsIGFyZ3MpOwogfQogCi1NZWRpYVBsYXllcjI6Ok1lZGlhUGxheWVyMigpIHsKK01lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKGludDMyX3Qgc2Vzc2lvbklkKSB7CiAgICAgQUxPR1YoImNvbnN0cnVjdG9yIik7CiAgICAgbVNyY0lkID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKICAgICBtTGlzdGVuZXIgPSBOVUxMOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOwogICAgIG1Mb29wID0gZmFsc2U7Ci0gICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7CisgICAgbVZvbHVtZSA9IDEuMDsKICAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgbUF1ZGlvU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIG1TZW5kTGV2ZWwgPSAwOwogCiAgICAgLy8gVE9ETzogZ2V0IHBpZCBhbmQgdWlkIGZyb20gSkFWQQogICAgIG1QaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgbVVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKIAotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChzZXNzaW9uSWQsIG1VaWQsIG1QaWQsIE5VTEwgLyphdHRyaWJ1dGVzKi8pOwogfQogCiBNZWRpYVBsYXllcjI6On5NZWRpYVBsYXllcjIoKSB7CiAgICAgQUxPR1YoImRlc3RydWN0b3IiKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKLSAgICB9Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBkaXNjb25uZWN0KCk7CiAgICAgcmVtb3ZlUGxheWVyKHRoaXMpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9CiB9CiAKIGJvb2wgTWVkaWFQbGF5ZXIyOjppbml0KCkgewpAQCAtNDkzLDYgKzMyMSwxNSBAQAogICAgIGlmIChkc2QgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICAvLyBNaWNyb3NlY29uZCBpcyB1c2VkIGluIE51UGxheWVyMi4KKyAgICBpZiAoZHNkLT5tU3RhcnRQb3NpdGlvbk1zID4gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXMpIHsKKyAgICAgICAgZHNkLT5tU3RhcnRQb3NpdGlvbk1zID0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXM7CisgICAgICAgIEFMT0dXKCJzZXREYXRhU291cmNlLCBzdGFydCBwb2lzdGlvbiBjbGFtcGVkIHRvICVsbGQgbXMiLCAobG9uZyBsb25nKWRzZC0+bVN0YXJ0UG9zaXRpb25Ncyk7CisgICAgfQorICAgIGlmIChkc2QtPm1FbmRQb3NpdGlvbk1zID4gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXMpIHsKKyAgICAgICAgZHNkLT5tRW5kUG9zaXRpb25NcyA9IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zOworICAgICAgICBBTE9HVygic2V0RGF0YVNvdXJjZSwgZW5kIHBvaXN0aW9uIGNsYW1wZWQgdG8gJWxsZCBtcyIsIChsb25nIGxvbmcpZHNkLT5tU3RhcnRQb3NpdGlvbk1zKTsKKyAgICB9CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgdHlwZSglZCksIHNyY0lkKCVsbGQpIiwgZHNkLT5tVHlwZSwgKGxvbmcgbG9uZylkc2QtPm1JZCk7CiAKICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG9sZFBsYXllcjsKQEAgLTUxNSw4ICszNTIsNiBAQAogICAgICAgICBjbGVhcl9sKCk7CiAKICAgICAgICAgcGxheWVyLT5zZXRMaXN0ZW5lcihuZXcgcHJveHlMaXN0ZW5lcih0aGlzKSk7Ci0gICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHBsYXllcikpOwogICAgICAgICBwbGF5ZXItPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwogCiAgICAgICAgIGVyciA9IHBsYXllci0+c2V0RGF0YVNvdXJjZShkc2QpOwpAQCAtNTY1LDc5ICs0MDAsMTggQEAKICAgICByZXR1cm4gbVBsYXllci0+cGxheU5leHREYXRhU291cmNlKHNyY0lkKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjppbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXBseSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgY29uc3QgYm9vbCBoYXNCZWVuSW5pdGlhbGl6ZWQgPQogICAgICAgICAgICAgKG1DdXJyZW50U3RhdGUgIT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikgJiYKICAgICAgICAgICAgICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkgIT0gTUVESUFfUExBWUVSMl9JRExFKTsKICAgICBpZiAoKG1QbGF5ZXIgPT0gTlVMTCkgfHwgIWhhc0JlZW5Jbml0aWFsaXplZCkgewotICAgICAgICBBTE9HRSgiaW52b2tlIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgICAgIEFMT0dFKCJpbnZva2UoKSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKICAgICByZXR1cm4gbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKIH0KIAotLy8gVGhpcyBjYWxsIGRvZXNuJ3QgbmVlZCB0byBhY2Nlc3MgdGhlIG5hdGl2ZSBwbGF5ZXIuCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKSB7Ci0gICAgQUxPR0QoInNldE1ldGFkYXRhRmlsdGVyIik7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgYWxsb3csIGRyb3A7Ci0KLSAgICBpZiAodW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZhbGxvdywgJnN0YXR1cykgJiYKLSAgICAgICAgdW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZkcm9wLCAmc3RhdHVzKSkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICAgICAgbU1ldGFkYXRhQWxsb3cgPSBhbGxvdzsKLSAgICAgICAgbU1ldGFkYXRhRHJvcCA9IGRyb3A7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKiBhcHBseV9maWx0ZXIgKi8sIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBBTE9HRCgiZ2V0TWV0YWRhdGEiKTsKLSAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllcjsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBpZHM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHsKLSAgICAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBQbGFjZWhvbGRlciBmb3IgdGhlIHJldHVybiBjb2RlLCB1cGRhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKC0xKTsKLQotICAgICAgICAvLyBXZSBkb24ndCBibG9jayBub3RpZmljYXRpb25zIHdoaWxlIHdlIGZldGNoIHRoZSBkYXRhLiBXZSBjbGVhcgotICAgICAgICAvLyBtTWV0YWRhdGFVcGRhdGVkIGZpcnN0IHNvIHdlIGRvbid0IGxvc2Ugbm90aWZpY2F0aW9ucyBoYXBwZW5pbmcKLSAgICAgICAgLy8gZHVyaW5nIHRoZSByZXN0IG9mIHRoaXMgY2FsbC4KLSAgICAgICAgaWYgKHVwZGF0ZV9vbmx5KSB7Ci0gICAgICAgICAgICBpZHMgPSBtTWV0YWRhdGFVcGRhdGVkOwotICAgICAgICB9Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtZWRpYTo6TWV0YWRhdGEgbWV0YWRhdGEocmVwbHkpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kSGVhZGVyKCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGxheWVyLT5nZXRNZXRhZGF0YShpZHMsIHJlcGx5KTsKLQotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbWV0YWRhdGEucmVzZXRQYXJjZWwoKTsKLSAgICAgICAgQUxPR0UoImdldE1ldGFkYXRhIGZhaWxlZCAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IGVtZW50IGZpbHRlcmluZyBvbiB0aGUgcmVzdWx0LiBOb3QgY3JpdGljYWwgc2luY2UKLSAgICAvLyBmaWx0ZXJpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIHVwZGF0ZSBub3RpZmljYXRpb25zIGFscmVhZHkuIFRoaXMKLSAgICAvLyB3b3VsZCBiZSB3aGVuIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGZldGNoIGFuZCBhIGZpbHRlciBpcyBzZXQuCi0KLSAgICAvLyBFdmVyeXRoaW5nIGlzIGZpbmUsIHVwZGF0ZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLgotICAgIG1ldGFkYXRhLnVwZGF0ZUxlbmd0aCgpOwotICAgIHJldHVybiBPSzsKLX0KLQogdm9pZCBNZWRpYVBsYXllcjI6OmRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpIHsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMICYmIG1Db25uZWN0ZWRXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoCkBAIC03MjcsMjIgKzUwMSw5IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgfQotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7Ci0KLSAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCi0gICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOwotCi0gICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTc1MCwxNCArNTExLDEyIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVBc3luYygpIHsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpKSB7Ci0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKCptQXVkaW9BdHRyaWJ1dGVzUGFyY2VsKTsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEKSkgeworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChtQXVkaW9BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QUkVQQVJJTkc7CiAgICAgICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTc4MSw3ICs1NDAsNyBAQAogICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKIAogICAgICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobVZvbHVtZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKQEAgLTgwNiwzMCArNTY1LDEyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkgcmV0dXJuIE5PX0VSUk9SOwotICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwKLSAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICkgKSApIHsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RvcCgpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUT1BQRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgQUxPR0UoInN0b3AgY2FsbGVkIGluIHN0YXRlICVkLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwYXVzZSgpIHsKICAgICBBTE9HVigicGF1c2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEfE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKQogICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSkgeworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1NUQVJURUQgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEKSkpIHsKICAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7CkBAIC04NjAsNyArNjAxLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLW1lZGlhcGxheWVyMl9zdGF0ZXMgTWVkaWFQbGF5ZXIyOjpnZXRNZWRpYVBsYXllcjJTdGF0ZSgpIHsKK21lZGlhcGxheWVyMl9zdGF0ZXMgTWVkaWFQbGF5ZXIyOjpnZXRTdGF0ZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX0VSUk9SOwpAQCAtODczLDggKzYxNCw3IEBACiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HOwogICAgIH0KLSAgICBpZiAobUN1cnJlbnRTdGF0ZQotICAgICAgICAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BBVVNFRDsKICAgICB9CiAgICAgLy8gbm93IG9ubHkgbUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgaXMgdHJ1ZQpAQCAtODkwLDcgKzYzMCw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpIHsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTk3OCwxMSArNzE4LDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3Qgc3JjSWQsIGludDY0X3QgKm1zZWMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIFRPRE86IGNhY2hlIGR1cmF0aW9uIGZvciBjdXJyZW50U3JjSWQgYW5kIG5leHRTcmNJZCwgYW5kIHJldHVybiBjb3JyZWN0CisgICAgLy8gdmFsdWUgZm9yIG5leHRTcmNJZC4KKyAgICBpZiAoc3JjSWQgIT0gbVNyY0lkKSB7CisgICAgICAgICptc2VjID0gLTE7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOwogICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8Ci0gICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOwogICAgIGlmIChtUGxheWVyID09IDAgfHwgIWlzVmFsaWRTdGF0ZSkgewogICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBjYWxsIGdldER1cmF0aW9uIGluIHdyb25nIHN0YXRlOiBtUGxheWVyPSVwLCBtQ3VycmVudFN0YXRlPSV1IiwKICAgICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKQEAgLTExMzgsMTggKzg4NSwxNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0Vm9sdW1lOworICAgIG1Wb2x1bWUgPSB2b2x1bWU7CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUodm9sdW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkpIHsKQEAgLTExNTksMTcgKzkwNSwxOCBAQAogICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwgJiYgc2Vzc2lvbklkICE9IG1BdWRpb091dHB1dC0+Z2V0U2Vzc2lvbklkKCkpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKK2ludDMyX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFNlc3Npb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKQEAgLTExOTYsNjcgKzk0MywzNyBAQAogfQogCiAvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSkgewotICAgIHN3aXRjaChrZXkpIHsKLSAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgewotICAgICAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKLSAgICAgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8gcGFyYW1ldGVyIGRvZXNuJ3QgcmVxdWlyZSBwbGF5ZXIgc3RhdGUgY2hlY2sKLSAgICAgICAgYnJlYWs7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVfbCgpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgeworICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXMiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgeworICAgIGlmIChjaGVja1N0YXRlX2woKSAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBzd2l0Y2ggKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgLy8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWX0lGKG1QbGF5ZXIgPT0gTlVMTCwgInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwotICAgIH0KKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CisgICAgc3RhdHVzID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woYXR0cmlidXRlcyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAoram9iamVjdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvQXR0cmlidXRlcygpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb0F0dHJpYnV0ZXMpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMID8gbUF1ZGlvQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogTlVMTDsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlciglZCkiLCBrZXkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGtleSA9PSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTKSB7Ci0gICAgICAgIGlmIChyZXBseSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlcGx5LT5hcHBlbmRGcm9tKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwsIDAsIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmRhdGFTaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI2OSw0NCArOTg2LDEwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotYm9vbCBNZWRpYVBsYXllcjI6OnNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgY29kZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChmaW5kTWV0YWRhdGEobU1ldGFkYXRhRHJvcCwgY29kZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1NZXRhZGF0YUFsbG93LmlzRW1wdHkoKSB8fCBmaW5kTWV0YWRhdGEobU1ldGFkYXRhQWxsb3csIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotdm9pZCBNZWRpYVBsYXllcjI6OmFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtTWV0YWRhdGFVcGRhdGVkLmluZGV4T2YobWV0YWRhdGFfdHlwZSkgPCAwKSB7Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuYWRkKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjI6Om5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Cit2b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSB7CiAgICAgQUxPR1YoIm1lc3NhZ2UgcmVjZWl2ZWQgc3JjSWQ9JWxsZCwgbXNnPSVkLCBleHQxPSVkLCBleHQyPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBtc2csIGV4dDEsIGV4dDIpOwogCi0gICAgaWYgKE1FRElBMl9JTkZPID09IG1zZyAmJiBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUgPT0gZXh0MSkgewotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSA9IGV4dDI7Ci0KLSAgICAgICAgaWYoc2hvdWxkRHJvcE1ldGFkYXRhKG1ldGFkYXRhX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdGhhdCBoYXZlIGNoYW5nZWQuIGdldE1ldGFkYXRhCi0gICAgICAgIC8vIGFsc28gYWNjZXNzIG1NZXRhZGF0YVVwZGF0ZWQgYW5kIGNsZWFycyBpdC4KLSAgICAgICAgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWV0YWRhdGFfdHlwZSk7Ci0gICAgfQotCiAgICAgYm9vbCBzZW5kID0gdHJ1ZTsKICAgICBib29sIGxvY2tlZCA9IGZhbHNlOwogCkBAIC0xNDE4LDcgKzExMDEsOCBAQAogfQogCiAvLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgicHJlcGFyZURybTogdXVpZDogJXAgIGRybVNlc3Npb25JZDogJXAoJXp1KSIsIHV1aWQsCiAgICAgICAgICAgICBkcm1TZXNzaW9uSWQuYXJyYXkoKSwgZHJtU2Vzc2lvbklkLnNpemUoKSk7CkBAIC0xNDQyLDcgKzExMjYsNyBAQAogICAgIH0KIAogICAgIC8vIFBhc3NpbmcgZG93biB0byBtZWRpYXNlcnZlciBtYWlubHkgZm9yIGNyZWF0aW5nIHRoZSBjcnlwdG8KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybShzcmNJZCwgdXVpZCwgZHJtU2Vzc2lvbklkKTsKICAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssICJwcmVwYXJlRHJtOiBGYWlsZWQgYXQgbWVkaWFzZXJ2ZXIgd2l0aCByZXQ6ICVkIiwgc3RhdHVzKTsKIAogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCkBAIC0xNDUxLDcgKzExMzUsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cmVsZWFzZURybSgpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTQ2Niw3ICsxMTUwLDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5yZWxlYXNlRHJtKHNyY0lkKTsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgogICAgIEFMT0dEKCJyZWxlYXNlRHJtOiBtZWRpYXNlcnZlcjo6cmVsZWFzZURybSByZXQ6ICVkIiwgc3RhdHVzKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CkBAIC0xNDc5LDM2ICsxMTYzLDQwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQcmVmZXJyZWREZXZpY2Uoam9iamVjdCBkZXZpY2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0UHJlZmVycmVkRGV2aWNlKGRldmljZSk7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKK2pvYmplY3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZUlkOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlSWQ7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+Z2V0Um91dGVkRGV2aWNlKCk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhyb3V0aW5nRGVsZWdhdGUpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobGlzdGVuZXIpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKaW5kZXggOWIzYWFkMi4uNzFjZDUwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icApAQCAtMSw2ICsxLDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkpNZWRpYVBsYXllcjJVdGlscy5jcHAiLAogICAgICAgICAiSldha2VMb2NrLmNwcCIsCiAgICAgICAgICJHZW5lcmljU291cmNlMi5jcHAiLAogICAgICAgICAiSFRUUExpdmVTb3VyY2UyLmNwcCIsCkBAIC0yOCw2ICsyOSw4IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtNDgsMTMgKzUxLDE1IEBACiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcAppbmRleCAxOTZiMTAzLi5mMDEzNjFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcApAQCAtMjEsMzAgKzIxLDE5IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyRHJtLmgiCiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04OSw4ICs3OCw2IEBACiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlc2V0RGF0YVNvdXJjZSgpIHsKICAgICBBTE9HVigicmVzZXREYXRhU291cmNlIik7CiAKLSAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKLSAgICBtSHR0cFNvdXJjZS5jbGVhcigpOwogICAgIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKICAgICBtVXJpLmNsZWFyKCk7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKQEAgLTExMCw3ICs5Nyw2IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMTgsNyArMTA0LDYgQEAKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogCi0gICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CiAgICAgbVVyaSA9IHVybDsKIAogICAgIGlmIChoZWFkZXJzKSB7CkBAIC0xNTEsNyArMTM2LDcgQEAKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBzb3VyY2UuZ2V0KCkpOwogCiAgICAgcmVzZXREYXRhU291cmNlKCk7Ci0gICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKHNvdXJjZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNjIsMjQgKzE0NywyMSBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjppbml0RnJvbURhdGFTb3VyY2UoKSB7CiAgICAgbUV4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7Ci0gICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCB8fCBtRmQgIT0gLTEpOwotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICBDSEVDSyhtRmQgPj0wIHx8IG1EYXRhU291cmNlV3JhcHBlciAhPSBOVUxMKTsKKyAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gYVNvdXJjZVdyYXBwZXIgPSBtRGF0YVNvdXJjZVdyYXBwZXI7CiAgICAgY29uc3QgaW50IGZkID0gbUZkOwotICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKLSAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7CiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbHB0cikgewotICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoZGF0YVNvdXJjZSk7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgIGlmIChhU291cmNlV3JhcHBlciAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoYVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBzZXQgZXh0cmFjdG9yIGRhdGEgc291cmNlISIpOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTE5MSwxMCArMTczLDggQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUxvY2subG9jaygpOwotICAgIG1GZCA9IC0xOwotICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKICAgICBtRmlsZU1ldGEgPSBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShtRXh0cmFjdG9yLT5nZXRGb3JtYXQoKSk7CisgICAgbUxvY2subG9jaygpOwogICAgIGlmIChtRmlsZU1ldGEgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgICAgICBpZiAobUZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CkBAIC0yMTUsMTAgKzE5NSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gdHJhY2tFeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOwotICAgICAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1EYXRhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKKyAgICAgICAgaWYgKGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYWNrRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC0zMzAsMTkgKzMxMCwxOSBAQAogICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwogICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtRGF0YVNvdXJjZS0+Y2xvc2UoKTsKKyAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLT5jbG9zZSgpOwogICAgIH0KICAgICByZXNldERhdGFTb3VyY2UoKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7Cit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jOiAobG9vcGVyOiAlZCkiLCAobUxvb3BlciAhPSBOVUxMKSk7CiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYyIpOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljMiIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLwogICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKQEAgLTM1MSw1OSArMzMxLDQ1IEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBzdGFydFRpbWVVcyk7CisKICAgICBtc2ctPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblByZXBhcmVBc3luYygpIHsKLSAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1EYXRhU291cmNlOiAlZCIsIChtRGF0YVNvdXJjZSAhPSBOVUxMKSk7Cit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpIHsKKyAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1GZCAlZCBtVXJpICVzIG1EYXRhU291cmNlV3JhcHBlcjogJXAiLAorICAgICAgICAgICAgbUZkLCBtVXJpLmNfc3RyKCksIG1EYXRhU291cmNlV3JhcHBlci5nZXQoKSk7CiAKLSAgICAvLyBkZWxheWVkIGRhdGEgc291cmNlIGNyZWF0aW9uCi0gICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGZpcnN0LCBpZiB0aGUgZXh0cmFjdG9yCi0gICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgotICAgICAgICBtSXNTZWN1cmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIW1VcmkuZW1wdHkoKSkgewotICAgICAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOwotICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZTsKLQotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKLSAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgY29ubmVjdGlvbiBoYXMgc29tZSBpc3N1ZS4KLSAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSSgKLSAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmY29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoIW1VcmkuZW1wdHkoKSkgeworICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7CisgICAgICAgIHNpemVfdCBudW1oZWFkZXJzID0gbVVyaUhlYWRlcnMuc2l6ZSgpOworICAgICAgICBjb25zdCBjaGFyICoqa2V5X3ZhbHVlcyA9IG51bWhlYWRlcnMgPyBuZXcgY29uc3QgY2hhciAqW251bWhlYWRlcnMgKiAyXSA6IE5VTEw7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgICAgICBrZXlfdmFsdWVzW2kgKiAyXSA9IG1VcmlIZWFkZXJzLmtleUF0KGkpLmNfc3RyKCk7CisgICAgICAgICAgICBrZXlfdmFsdWVzW2kgKiAyICsgMV0gPSAgbVVyaUhlYWRlcnMudmFsdWVBdChpKS5jX3N0cigpOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1GZCA9PSAtMSAmJiBtRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKLSAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSAqYVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKHVyaSwgbnVtaGVhZGVycywga2V5X3ZhbHVlcyk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyID0gYVNvdXJjZSA/IG5ldyBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihhU291cmNlKSA6IE5VTEw7CisgICAgICAgIGRlbGV0ZVtdIGtleV92YWx1ZXM7CisgICAgICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAorICAgICAgICAvLyBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KKyAgICAgICAgbUlzU3RyZWFtaW5nID0gIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KTsKICAgICB9CiAKLSAgICBpZiAobURhdGFTb3VyY2UgIT0gbnVsbHB0ciAmJiBtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOworICAgIGlmIChtRGlzY29ubmVjdGVkIHx8IChtRmQgPCAwICYmIG1EYXRhU291cmNlV3JhcHBlciA9PSBOVUxMKSkgeworICAgICAgICBBTE9HRSgibURpc2Nvbm5lY3RlZCglZCkgb3IgRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiLCBtRGlzY29ubmVjdGVkKTsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gRm9yIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IgZW5vdWdoCi0gICAgLy8gYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCi0gICAgbUlzU3RyZWFtaW5nID0gKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCk7Ci0KICAgICAvLyBpbml0IGV4dHJhY3RvciBmcm9tIGRhdGEgc291cmNlCiAgICAgc3RhdHVzX3QgZXJyID0gaW5pdEZyb21EYXRhU291cmNlKCk7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGZyb20gZGF0YSBzb3VyY2UhIik7CkBAIC00MzAsNiArMzk2LDcgQEAKICAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCB8CiAgICAgICAgICAgICBGTEFHX0NBTl9TRUVLKTsKIAorICAgIGRvU2VlayhzdGFydFRpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfQ0xPU0VTVCk7CiAgICAgZmluaXNoUHJlcGFyZUFzeW5jKCk7CiAKICAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IERvbmUiKTsKQEAgLTQzOSw4ICs0MDYsOCBAQAogICAgIEFMT0dWKCJmaW5pc2hQcmVwYXJlQXN5bmMiKTsKIAogICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKLSAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwogICAgICAgICBtUHJlcGFyaW5nID0gdHJ1ZTsKKyAgICAgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CiAgICAgICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CkBAIC00NTcsOSArNDI0LDcgQEAKIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKSB7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOwotICAgICAgICBtQ2FjaGVkU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgICAgIG1EYXRhU291cmNlV3JhcHBlci5jbGVhcigpOwogCiAgICAgICAgIG1CaXRyYXRlID0gLTE7CiAgICAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOwpAQCAtNDk5LDUzICs0NjQsMjcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpkaXNjb25uZWN0KCkgewotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UsIGh0dHBTb3VyY2U7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7Ci0gICAgICAgIGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKICAgICAgICAgbURpc2Nvbm5lY3RlZCA9IHRydWU7CiAgICAgfQotCi0gICAgaWYgKGRhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCi0gICAgICAgIGlmIChkYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihkYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChodHRwU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oaHR0cFNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICBpZiAobURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLT5jbG9zZSgpOwogICAgIH0KLQotICAgIG1EYXRhU291cmNlV3JhcHBlciA9IE5VTEw7Ci0KIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmVlZE1vcmVUU0RhdGEoKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlbmRDYWNoZVN0YXRzKCkgewotICAgIGludDMyX3Qga2JwcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENhY2hlU3RhdHMpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJiYW5kd2lkdGgiLCBrYnBzKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgogICAgICAgewotICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmc3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICBvblByZXBhcmVBc3luYyhzdGFydFRpbWVVcyk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CkBAIC04MzUsOCArNzc0LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMtPmdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KCZmaW5hbFJlc3VsdCkgPCAyCiAgICAgICAgICAgICAgICAgJiYgIW1TZW50UGF1c2VPbkJ1ZmZlcmluZyAmJiAhbVByZXBhcmluZykgewotICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOwogICAgICAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CkBAIC0xMzkyLDcgKzEzMjksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKQEAgLTE0NDQsNDcgKzEzODAsMzEgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOwotICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKKyAgICAgICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCisgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwogICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IC0xbGw7Ci0gICAgc3NpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gLTE7CiAKLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGNhY2hlZERhdGFSZW1haW5pbmcgPSBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAwbGw7Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gfGJpdHJhdGV8IHVzZXMgYml0cy9zZWNvbmQgdW5pdCwgd2hpbGUgc2l6ZSBpcyBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICAgICAgICAgICAgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYml0cmF0ZSA9IG1CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yOworICAgIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZXh0cmFjdG9yID0gbVZpZGVvVHJhY2subUV4dHJhY3RvcjsKKyAgICB9IGVsc2UgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBleHRyYWN0b3IgPSBtQXVkaW9UcmFjay5tRXh0cmFjdG9yOwogICAgIH0KIAotICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOwotCi0gICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKKyAgICBpZiAoZXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGV4dHJhY3Rvci0+Z2V0Q2FjaGVkRHVyYXRpb24oKTsKICAgICB9CiAKICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwbGwpIHsKLSAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMGxsKSB7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlU2l6ZSgpOworICAgICAgICBpZiAoc2FtcGxlU2l6ZSA+PSAwbGwpIHsKICAgICAgICAgICAgIGludDY0X3QgY2FjaGVkUG9zVXMgPSBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgKyBjYWNoZWREdXJhdGlvblVzOwogICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZFBvc1VzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgewpAQCAtMTQ5Miw5ICsxNDEyLDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShwZXJjZW50YWdlKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZER1cmF0aW9uVXMgJS4xZiBzZWMiLCBjYWNoZWREdXJhdGlvblVzIC8gMTAwMDAwMC4wZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IEVPUyIpOwogICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKICAgICB9CiAKICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKQEAgLTE1OTEsMTUgKzE1MTMsMjAgQEAKICAgICAgICAgcmV0dXJuIE9LOyAvLyBzb3VyY2Ugd2l0aG91dCBEUk0gaW5mbwogICAgIH0KIAotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbyk7Ci0gICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpZHJtSW5mb0J1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBzdGF0dXNfdCByZXQgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbywgJnBsYXllck1zZyk7CisgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgaWYgKGRybUluZm9CdWZmZXItPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjaGVja0RybUluZm86IFVuZXhwZWN0ZWQgcGFyY2VsIHNpemU6IDAiKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjaGVja0RybUluZm86IGZhaWxlZCB0byByZXRyaXZlIERybUluZm8gJWQiLCByZXQpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBub3RpZnlEcm1JbmZvKGRybUluZm9CdWZmZXIpOworICAgIGludCBzaXplID0gcGxheWVyTXNnLkJ5dGVTaXplKCk7CisgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHBsYXllck1zZy5TZXJpYWxpemVUb0FycmF5KGRybUluZm9CdWYtPmRhdGEoKSwgc2l6ZSk7CisgICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisgICAgbm90aWZ5RHJtSW5mbyhkcm1JbmZvQnVmKTsKIAogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaAppbmRleCA5YmM1MTgyLi5hZGUxYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCkBAIC0zNywxMSArMzcsOSBAQAogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIElEYXRhU291cmNlOwogY2xhc3MgSU1lZGlhU291cmNlOwotc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUNsb2NrOwotc3RydWN0IE51Q2FjaGVkU291cmNlMjsKIAogc3RydWN0IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTIgOiBwdWJsaWMgTnVQbGF5ZXIyOjpTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIC8vIE1vZHVsYXIgRFJNCkBAIC01MCw3ICs0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNjIsNyArNTksNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwpAQCAtMTUxLDcgKzE0OCw2IEBACiAgICAgYm9vbCBtSXNTdHJlYW1pbmc7CiAgICAgdWlkX3QgbVVJRDsKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVXJpOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOwogICAgIGludCBtRmQ7CkBAIC0xNTksOSArMTU1LDYgQEAKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAKICAgICBib29sIG1EaXNjb25uZWN0ZWQ7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOwotICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CiAgICAgc3A8QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI+IG1EYXRhU291cmNlV3JhcHBlcjsKICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBtRXh0cmFjdG9yOwpAQCAtMTk0LDcgKzE4Nyw3IEBACiAgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwogICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwogCi0gICAgdm9pZCBvblByZXBhcmVBc3luYygpOworICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAKICAgICB2b2lkIGZldGNoVGV4dERhdGEoCiAgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCkBAIC0yMzIsOCArMjI1LDYgQEAKICAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOwogICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CiAKLSAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7Ci0KICAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0X2woYm9vbCBhdWRpbyk7CiAgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKTsKICAgICBpbnQzMl90IGdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKaW5kZXggOGVkYmNiZi4uZTUzOTAwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcApAQCAtOTksMTAgKzk5LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cHJlcGFyZUFzeW5jKGludDY0X3QgLyogc3RhcnRUaW1lVXMgKi8pIHsKICAgICBpZiAobUxpdmVMb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUyIik7CiAgICAgICAgIG1MaXZlTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNhbkNhbGxKYXZhICovKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKaW5kZXggOTdkMzY1My4uOGZjNzFlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDIyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWFQbGF5ZXIyVXRpbHMiCisKKyNpbmNsdWRlICJKTWVkaWFQbGF5ZXIyVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRNaW5EdXJhdGlvblNlYyA9IDYwOworCisvLyBzdGF0aWMKK2Jvb2wgSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGlmIChoYXNWaWRlbyB8fCBzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpbmZvLmR1cmF0aW9uX3VzIDwga09mZmxvYWRNaW5EdXJhdGlvblNlYyAqIDEwMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdEZyb21OYXRpdmUoaW5mby5mb3JtYXQpOworICAgIGludDMyX3QgY2hhbm5lbE1hc2sgPSBvdXRDaGFubmVsTWFza0Zyb21OYXRpdmUoaW5mby5jaGFubmVsX21hc2spOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBFTkNPRElOR19JTlZBTElEIHx8IGNoYW5uZWxNYXNrID09IENIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqTVAyVXRpbHNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJVdGlscyIpOworICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRCgKKyAgICAgICAgICAgIGpNUDJVdGlsc0NscywgImlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCIsICIoSUlJKVoiKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAorICAgICAgICAgICAgak1QMlV0aWxzQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBhdWRpb0Zvcm1hdCwgaW5mby5zYW1wbGVfcmF0ZSwgY2hhbm5lbE1hc2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JkNDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KKyNkZWZpbmUgX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgImFuZHJvaWRfbWVkaWFfQXVkaW9Gb3JtYXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhUGxheWVyMlV0aWxzIHsKKyAgICBzdGF0aWMgYm9vbCBpc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sIGJvb2wgaXNTdHJlYW1pbmcsCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKaW5kZXggZGU0ZjM0ZS4uMDgwZDkyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyMi5oIgogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UyLmgiCisjaW5jbHVkZSAiSk1lZGlhUGxheWVyMlV0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2Rlci5oIgogI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCiAjaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgotI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zMi5oIgogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKQEAgLTIxMiwxMSArMjEzLDExIEBACiAgICAgOiBtUElEKHBpZCksCiAgICAgICBtVUlEKHVpZCksCiAgICAgICBtTWVkaWFDbG9jayhtZWRpYUNsb2NrKSwKLSAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAogICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCisgICAgICBtRU9TTW9uaXRvckdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zKDApLAogICAgICAgbVByZXZpb3VzU2Vla1RpbWVVcygwKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCkBAIC0yMzksOSArMjQwLDcgQEAKICAgICAgIG1WaWRlb0RlY29kZXJFcnJvcihmYWxzZSksCiAgICAgICBtUGF1c2VkKGZhbHNlKSwKICAgICAgIG1QYXVzZWRCeUNsaWVudCh0cnVlKSwKLSAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAotICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKLSAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpIHsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQpAQCAtMzA5LDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOwogCi0gICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOwpAQCAtMzkzLDExICszOTIsMTMgQEAKICAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgogICAgICovCiAKLSAgICBtRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKKyAgICBtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBkc2QtPm1TdGFydFBvc2l0aW9uTXMgKiAxMDAwKTsKKyAgICBtc2ctPnNldEludDY0KCJlbmRUaW1lVXMiLCBkc2QtPm1FbmRQb3NpdGlvbk1zICogMTAwMCk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQxNSwxMSArNDE2LDEzIEBACiAgICAgLy8gTm93LCBzb3VyY2UgIT0gTlVMTC4KICAgICAqLwogCi0gICAgbU5leHREYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOworICAgIG1OZXh0U291cmNlSW5mby5tRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UsIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgZHNkLT5tU3RhcnRQb3NpdGlvbk1zICogMTAwMCk7CisgICAgbXNnLT5zZXRJbnQ2NCgiZW5kVGltZVVzIiwgZHNkLT5tRW5kUG9zaXRpb25NcyAqIDEwMDApOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC00ODcsNyArNDkwLDcgQEAKIHN0YXR1c190IE51UGxheWVyMjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgewogICAgIC8vIGRvIHNvbWUgY3Vyc29yeSB2YWxpZGF0aW9uIG9mIHRoZSBzZXR0aW5ncyBoZXJlLiBhdWRpbyBtb2RlcyBhcmUKICAgICAvLyBvbmx5IHZhbGlkYXRlZCB3aGVuIHNldCBvbiB0aGUgYXVkaW9zaW5rLgotICAgICBpZiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTikKKyAgICAgaWYgKHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCiAgICAgICAgICAgICB8fCByYXRlLm1TcGVlZCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAogICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKSB7CkBAIC01NTQsNyArNTU3LDcgQEAKICAgICBzcDxTb3VyY2U+IHNvdXJjZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIHNvdXJjZSA9IG1Tb3VyY2U7CisgICAgICAgIHNvdXJjZSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlOwogICAgIH0KIAogICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewpAQCAtNTg0LDkgKzU4NywxMyBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCit2b2lkIE51UGxheWVyMjo6cmV3aW5kKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXdpbmQsIHRoaXMpOworICAgIG1zZy0+cG9zdCgpOworfQogCiB2b2lkIE51UGxheWVyMjo6d3JpdGVUcmFja0luZm8oCi0gICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7CisgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3QgewogICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTlVMTCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjE5LDEwICs2MjYsOSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIHdyaXRlIHNvbWV0aGluZyBub24temVybwotICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrVHlwZSk7Ci0gICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7Ci0gICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZy5jX3N0cigpKSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRyYWNrVHlwZSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X3N0cmluZ192YWx1ZShtaW1lLmNfc3RyKCkpOworICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9zdHJpbmdfdmFsdWUobGFuZy5jX3N0cigpKTsKIAogICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewogICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKQEAgLTYzMCwyNyArNjM2LDMwIEBACiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CiAKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNBdXRvKTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzRGVmYXVsdCk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0ZvcmNlZCk7CiAgICAgfQogfQogCiB2b2lkIE51UGxheWVyMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFNldERhdGFTb3VyY2U6CiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldERhdGFTb3VyY2UiKTsKIAotICAgICAgICAgICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbVNyY0lkKSk7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJm1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZW5kVGltZVVzIiwgJm1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzKSk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRTZXREYXRhU291cmNlLCBzb3VyY2Ugc2hvdWxkIG5vdCBiZSBOVUxMIik7CkBAIC02NTksNyArNjY4LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1Ecml2ZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKG1TcmNJZCwgZXJyKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NzMsOSArNjgyLDExIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U3JjSWQpKTsKLSAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgIG1OZXh0U291cmNlLT5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZtTmV4dFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImVuZFRpbWVVcyIsICZtTmV4dFNvdXJjZUluZm8ubUVuZFRpbWVVcykpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVBc3luYyhtTmV4dFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KQEAgLTY4OCw3ICs2OTksNyBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0UGxheU5leHREYXRhU291cmNlIik7CiAgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJnNyY0lkKSk7Ci0gICAgICAgICAgICBpZiAoc3JjSWQgIT0gbU5leHRTcmNJZCkgeworICAgICAgICAgICAgaWYgKHNyY0lkICE9IG1OZXh0U291cmNlSW5mby5tU3JjSWQpIHsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtNzA5LDYgKzcyMCwyMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0RU9TTW9uaXRvcjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtRU9TTW9uaXRvckdlbmVyYXRpb24gfHwgcmVhc29uICE9IE1lZGlhQ2xvY2s6OlRJTUVSX1JFQVNPTl9SRUFDSEVEKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZSBvciByZXNldAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigia1doYXRFT1NNb25pdG9yIik7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3M6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwpAQCAtNzE3LDggKzc0NCw4IEBACiAgICAgICAgICAgICBBTE9HVigia1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyIpOwogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CkBAIC03NDAsOCArNzY3LDggQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKICAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTc1NSw3ICs3ODIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVigib25NZXNzYWdlUmVjZWl2ZWQga1doYXRQcmVwYXJlIik7CiAKLSAgICAgICAgICAgIG1Tb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnByZXBhcmVBc3luYyhtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTc2NCwxMiArNzkxLDE2IEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAoaW50NjRfdCopJnNyY0lkKSk7CisKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwogCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKQEAgLTc3OCwxMSArODA5LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRvdGFsIHRyYWNrIGNvdW50Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CisgICAgICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOwogCiAgICAgICAgICAgICAvLyB3cml0ZSBpbmJhbmQgdHJhY2tzCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluYmFuZFRyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0luZm8oaSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjawpAQCAtNzk3LDIwICs4MjgsMzUgQEAKIAogICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKICAgICAgICAgeworICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKKworICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgorICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKLSAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLQotICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UqIHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHNlbGVjdGVkVHJhY2spOworCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKQEAgLTgyNSwxOCArODcxLDIxIEBACiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKICAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwogICAgICAgICAgICAgaW50MzJfdCBzZWxlY3Q7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogCisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgY29ycmVjdCBzb3VyY2UgaW5mbyBiYXNlZCBvbiBzcmNJZC4KICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CiAgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CkBAIC04NDQsMTEgKzg5MywxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IGluYmFuZFRyYWNrcykgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZm8tPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKQEAgLTg4MSwxMCArOTMwLDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKICAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1TcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZHVyYXRpb25Vcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC05MDEsMTMgKzk1MCwxNSBAQAogCiAgICAgICAgICAgICBBTE9HRCgib25TZXRWaWRlb1N1cmZhY2UoJXAsICVzIHZpZGVvIGRlY29kZXIpIiwKICAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKLSAgICAgICAgICAgICAgICAgICAgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZCAmJiBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSA/ICJoYXZlIiA6ICJubyIpOwogCi0gICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1Tb3VyY2UtPmdldEZvcm1hdCBiZWNhdXNlIE51UGxheWVyMiBtaWdodAotICAgICAgICAgICAgLy8gYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KLSAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCi0gICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZCB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdAorICAgICAgICAgICAgLy8gYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQgYmUgaW4gcHJlcGFyaW5nIHN0YXRlIGFuZCBpdCBjb3VsZCB0YWtlIGxvbmcgdGltZS4KKyAgICAgICAgICAgIC8vIFdoZW4gbVN0YXJ0ZWQgaXMgdHJ1ZSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgorICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbVZpZGVvRGVjb2RlcidzIG1OYXRpdmVXaW5kb3cgaXMgYWx3YXlzIG5vbi1udWxsCiAgICAgICAgICAgICAgICAgICAgIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbVZpZGVvRGVjb2Rlci0+c2V0VmlkZW9TdXJmYWNlKG53dykgPT0gT0spKSB7CiAgICAgICAgICAgICAgICAgcGVyZm9ybVNldFN1cmZhY2Uobnd3KTsKQEAgLTk3MSwxMCArMTAyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgICAgIG9uU3RhcnQodHJ1ZSAvKiBwbGF5ICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC05ODgsOCArMTAzOSw3IEBACiAgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvLyBBdWRpb1NpbmsgYWxsb3dzIG9ubHkgMS5mIGFuZCAwLmYgZm9yIG9mZmxvYWQgbW9kZS4KICAgICAgICAgICAgICAgICAvLyBGb3Igb3RoZXIgc3BlZWQsIHN3aXRjaCB0byBub24tb2ZmbG9hZCBtb2RlLgotICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkICE9IDEuZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAocmF0ZS5tU3BlZWQgIT0gMS5mIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CkBAIC0xMDEyLDM2ICsxMDYyLDE1IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGFsbCBvdGhlciBzZXR0aW5ncyAodXNpbmcgbm9uLXBhdXNlZCBzcGVlZCkKLSAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJlc3RvcmUgdGhlbSBvbiBzdGFydAotICAgICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiByYXRlLm1TcGVlZCAhPSAwLmYgKi8KLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWRGb3JCdWZmZXJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmVwYXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwogCi0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgicGxheWJhY2stc3BlZWQiLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwotICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKQEAgLTEwNjEsOSArMTA5MCw2IEBACiAgICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtMTE1NywyMSArMTE4MywyMiBAQAogICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGZvdW5kIGFueXRoaW5nIHBsYXlhYmxlLgogCi0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgewogICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlciA9PSBOVUxMICYmIG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgY3VycmVudGx5IGRlY29kaW5nIGFueXRoaW5nIChubyBhdWRpbyBvcgogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyB0cmFja3MgZm91bmQpIGFuZCB3ZSBqdXN0IHJhbiBvdXQgb2YgaW5wdXQgZGF0YS4KIAogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyNTMsMTAgKzEyODAsMTAgQEAKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogCiAgICAgICAgICAgICAgICAgc2V0VmlkZW9TY2FsaW5nTW9kZShtVmlkZW9TY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewpAQCAtMTMyMywyOCArMTM1MCwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7ICAvLyBTaG91bGQgbm90IG9jY3VyLgogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvLyBGaW5pc2ggYW55d2F5cy4KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgYXVkaW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXVkaW8gdHJhY2sgaGFzIGVycm9yLiBWaWRlbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB2aWRlbyB0cmFjayBoYXMgZXJyb3IuIEF1ZGlvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTM5NCwxMiArMTQzMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGZpbmFsUmVzdWx0KTsKIAogICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoKG1BdWRpb0VPUyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKQEAgLTE0MjAsMTAgKzE0NTksMTEgQEAKICAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCBmYWxzZSAvKiBpc0RlY29kZXIgKi8pOwogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJtZWRpYSByZW5kZXJpbmcgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb1RlYXJEb3duKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKQEAgLTE0NzYsNyArMTUxNiw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVyVXM7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXJVcyIsICZ0aW1lclVzKSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX05PVElGWV9USU1FLCB0aW1lclVzLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDk1LDIwICsxNTM1LDIwIEBACiAgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChuZWVkTm90aWZ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKIAogICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLApAQCAtMTUyNywxMCArMTU2Nyw0OSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0UmV3aW5kOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRSZXdpbmQiKTsKKworICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1Q7CisKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9GTFVTSCAvKiB2aWRlbyAqLykpOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpKTsKKworICAgICAgICAgICAgLy8gQWZ0ZXIgYSBmbHVzaCB3aXRob3V0IHNodXRkb3duLCBkZWNvZGVyIGlzIHBhdXNlZC4KKyAgICAgICAgICAgIC8vIERvbid0IHJlc3VtZSBpdCB1bnRpbCBzb3VyY2Ugc2VlayBpcyBkb25lLCBvdGhlcndpc2UgaXQgY291bGQKKyAgICAgICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzdW1lRGVjb2RlckFjdGlvbihmYWxzZSAvKiBuZWVkTm90aWZ5ICovKSk7CisKKyAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgb25TdGFydChmYWxzZSAvKiBwbGF5ICovKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTU2MSw3ICsxNjQwLDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZURybToKICAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0obXNnKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOwpAQCAtMTU4Myw4ICsxNjYyLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cmVzdW1lKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQpAQCAtMTYwMiwxMiArMTY4MSwxMiBAQAogICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25yZXN1bWUiKTsKIH0KIAotdm9pZCBOdVBsYXllcjI6Om9uU3RhcnQoKSB7Ci0gICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Cit2b2lkIE51UGxheWVyMjo6b25TdGFydChib29sIHBsYXkpIHsKKyAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSk7CiAKICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgfQogCiAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTYxOCwyMiArMTY5NywyMyBAQAogCiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCi0gICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CiAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKICAgICB9CiAKLSAgICBib29sIGhhc0F1ZGlvID0gKG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKLSAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNBdWRpbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGJvb2wgaGFzVmlkZW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgaWYgKCFoYXNBdWRpbyAmJiAhaGFzVmlkZW8pIHsKICAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciBlaXRoZXIgYXVkaW8gb3IgdmlkZW8gc291cmNlIik7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWX0lGKCFoYXNBdWRpbywgIm5vIG1ldGFkYXRhIGZvciBhdWRpbyBzb3VyY2UiKTsgIC8vIHZpZGVvIG9ubHkgc3RyZWFtCiAKLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CiAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewpAQCAtMTY0MSwxMSArMTcyMSwxMiBAQAogICAgIH0KIAogICAgIG1PZmZsb2FkQXVkaW8gPQotICAgICAgICBjYW5PZmZsb2FkU3RyZWFtKGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgICAgIEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQogICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOwogCiAgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCi0gICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CiAgICAgICAgIEFMT0dWKCJvblN0YXJ0OiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBub3cgdGhhdCB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKICAgICB9CkBAIC0xNjU5LDE1ICsxNzQwLDE1IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOwogICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBmbGFncyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7Ci0gICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXIyUmVuZGVyZXIiKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCB0cnVlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKG1QbGF5YmFja1NldHRpbmdzKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xNjc2LDYgKzE3NTcsMTIgQEAKICAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKICAgICB9CiAKKyAgICBhZGRFbmRUaW1lTW9uaXRvcigpOworICAgIC8vIFJlbmRlcmVyIGlzIGNyZWF0ZWQgaW4gcGF1c2VkIHN0YXRlLgorICAgIGlmIChwbGF5KSB7CisgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgfQorCiAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRSZW5kZXJlcihtUmVuZGVyZXIpOwogICAgIH0KQEAgLTE2ODQsMTAgKzE3NzEsMjMgQEAKICAgICB9CiAKICAgICBzdGFydFBsYXliYWNrVGltZXIoIm9uc3RhcnQiKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogCiAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXIyOjphZGRFbmRUaW1lTW9uaXRvcigpIHsKKyAgICArK21FT1NNb25pdG9yR2VuZXJhdGlvbjsKKworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcyA9PSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVVcykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPU01vbml0b3IsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRU9TTW9uaXRvckdlbmVyYXRpb24pOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzKTsKK30KKwogdm9pZCBOdVBsYXllcjI6OnN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKICAgICBpZiAobUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9PSAwKSB7CkBAIC0xNzA5LDcgKzE4MDksNyBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHBsYXllZCk7CiAKICAgICAgICAgICAgIGlmIChwbGF5ZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gMDsKQEAgLTE3MjcsNyArMTgyNyw4IEBACiB2b2lkIE51UGxheWVyMjo6c3RvcFJlYnVmZmVyaW5nVGltZXIoYm9vbCBleGl0aW5nUGxheWJhY2spIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CiAKLSAgICBBTE9HVigic3RvcFJlYnVmZmVyVGltZXIoKSAgdGltZSAlMjAiIFBSSWQ2NCAiIChleGl0aW5nICVkKSIsIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOworICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwKKyAgICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKIAogICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyAhPSAwKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CkBAIC0xNzM3LDkgKzE4MzgsMTAgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wUmVidWZmZXJpbmdUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCByZWJ1ZmZlcmVkKTsKIAogICAgICAgICAgICAgaWYgKHJlYnVmZmVyZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMobVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKICAgICAgICAgICAgICAgICBpZiAoZXhpdGluZ1BsYXliYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtU3JjSWQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzU1LDggKzE4NTcsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cGF1c2UoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KQEAgLTE4NDYsNyArMTk0OCw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCiAgICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAotICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOworICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm1PZmZsb2FkQXVkaW8sIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1N0cmVhbWluZygpKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIC8vIEFueSBmYWlsdXJlIHdlIHR1cm4gb2ZmIG1PZmZsb2FkQXVkaW8uCiAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKQEAgLTE4OTksNyArMjAwMSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhdWRpb0Zvcm1hdCkgewotICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE5MDksMTYgKzIwMTEsMTYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwotICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7Ci0gICAgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgYm9vbCBjYW5PZmZsb2FkID0gSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CiAKICAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKLSAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIGNhbk9mZmxvYWQgPSBmYWxzZTsKICAgICAgICAgQUxPR1YoImRldGVybWluZUF1ZGlvTW9kZUNoYW5nZTogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gYi9jIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwogICAgIH0KQEAgLTE5NDUsNyArMjA0Nyw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CiAKICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xOTY3LDExICsyMDY5LDExIEBACiAgICAgICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKICAgICAgICAgfQogCkBAIC0xOTkwLDE2ICsyMDkyLDE2IEBACiAgICAgICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoZm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyUGFzc1Rocm91Z2ggIGhhc1ZpZGVvOiAlZCIsIGhhc1ZpZGVvKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyIik7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CkBAIC0yMDA5LDcgKzIxMTEsOCBAQAogICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCiAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIoCi0gICAgICAgICAgICAgICAgbm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csIG1DQ0RlY29kZXIpOworICAgICAgICAgICAgICAgIG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgICAgICBtQ0NEZWNvZGVyKTsKICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CiAKICAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90CkBAIC0yMDI0LDEwICsyMTI3LDExIEBACiAgICAgKCpkZWNvZGVyKS0+aW5pdCgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3J5cHRvKTsKLSAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwgbUNyeXB0by5nZXQoKSwKLSAgICAgICAgICAgICAgICAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvKTsKKyAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSwKKyAgICAgICAgICAgICAgICAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOwogICAgIH0KIAogICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwpAQCAtMjE0Niw3ICsyMjUwLDggQEAKICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQpOwogfQogCi12b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Cit2b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMjMwLDggKzIzMzUsOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0VHJhY2tJbmZvLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjIzOSw5ICsyMzQ1LDEwIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDY0X3Qgc3JjSWQsIGludDMyX3QgdHlwZSwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yMjUyLDggKzIzNTksOSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKICAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CkBAIC0yMjk0LDExICsyNDAyLDExIEBACiB9CiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworICAgIHJldHVybiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKIH0KIAogZmxvYXQgTnVQbGF5ZXIyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTIzNTYsMTYgKzI0NjQsMTYgQEAKICAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOwogCi0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQogICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAotICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgICJtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgLy8gZXZlcnl0aGluZydzIGZsdXNoZWQsIGNvbnRpbnVlIHBsYXliYWNrLgpAQCAtMjQxMiwxNyArMjUyMCwxMyBAQAogICAgIG1SZW5kZXJlci5jbGVhcigpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9CisgICAgcmVzZXRTb3VyY2VJbmZvKG1DdXJyZW50U291cmNlSW5mbyk7CisgICAgcmVzZXRTb3VyY2VJbmZvKG1OZXh0U291cmNlSW5mbyk7CiAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlc2V0Q29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0MzEsMTQgKzI1MzUsNiBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKSB7CkBAIC0yNDU3LDI1ICsyNTUzLDMxIEBACiAKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgIH0KIAogICAgIGxvbmcgcHJldmlvdXNTcmNJZDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UgPSBtTmV4dFNvdXJjZTsKLSAgICAgICAgbU5leHRTb3VyY2UgPSBOVUxMOwotICAgICAgICBwcmV2aW91c1NyY0lkID0gbVNyY0lkOwotICAgICAgICBtU3JjSWQgPSBtTmV4dFNyY0lkOwotICAgICAgICArK21OZXh0U3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCisgICAgICAgIHByZXZpb3VzU3JjSWQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOworCisgICAgICAgIG1DdXJyZW50U291cmNlSW5mbyA9IG1OZXh0U291cmNlSW5mbzsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvID0gU291cmNlSW5mbygpOworICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNyY0lkID0gfm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCiAgICAgfQogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSwgMCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIocHJldmlvdXNTcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDg0LDIyICsyNTg2LDE1IEBACiAgICAgbVJlc2V0dGluZyA9IGZhbHNlOwogICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGVjb2RlcnMgd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGlzIHNvIHRoZWlyIG1DcnlwdG8gd291bGQgZ28gYXdheSBvbiB0aGVpciBvd24KLSAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfQotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CiAKICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBvblN0YXJ0KCk7CisgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKQEAgLTI1MjUsNyArMjYyMCw3IEBACiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI1NTcsNyArMjY1Miw3IEBACiB2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgewogICAgIGlmIChtUmVzdW1lUGVuZGluZykgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgIH0KIH0KIApAQCAtMjU3OSwzNiArMjY3NCw1MCBAQAogICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQcmVwYXJlZDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTogJXAiLCBtU291cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKLSAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgotICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICBBTE9HVigiTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQgc291cmNlOiVwLCBJZCglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS5nZXQoKSwgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcworICAgICAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2h1dCBkb3duIHBvdGVudGlhbCBzZWN1cmUgY29kZWNzIGluIGNhc2UgY2xpZW50IG5ldmVyIGNhbGxzIHJlc2V0CisgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKHNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI2MTcsMTUgKzI3MjYsMTUgQEAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKICAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mbzsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiZHJtSW5mbyIsICZkcm1JbmZvKSk7Ci0gICAgICAgICAgICBwYXJjZWwuc2V0RGF0YShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CisgICAgICAgICAgICBwbGF5ZXJNc2cuUGFyc2VGcm9tQXJyYXkoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOwogCi0gICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGxheWVyTXNnIHNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBsYXllck1zZyk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjU0LDE5ICsyNzYzLDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RmxhZ3NDaGFuZ2VkKHNyY0lkLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmICgobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGR1cmF0aW9uIHBvbGxpbmcgZm9yIG5leHQgc291cmNlLgorICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4MTcsOCArMjkzMyw4IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKQEAgLTI4MjcsNyArMjk0Myw3IEBACiAKICAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgogICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODQ2LDM1ICsyOTYyLDMxIEBACiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKHRpbWVVcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKGR1cmF0aW9uVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJnBsYXllck1zZyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIGludDY0X3QgdGltZVVzOwotICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnMyOjpJTl9CQU5EX1RFWFRfM0dQUDsKIAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CkBAIC0yODgzLDI4ICsyOTk1LDI4IEBACiAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKIAotICAgIFBhcmNlbCBwYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CiAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpHTE9CQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpMT0NBTF9ERVNDUklQVElPTlM7CiAgICAgICAgIH0KLSAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwbGF5ZXJNc2cpOwogICAgIH0KIAotICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICBpZiAocGxheWVyTXNnLnZhbHVlc19zaXplKCkgPiAwKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGxheWVyTXNnKTsKICAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CiAgICAgfQogfQogCiBjb25zdCBjaGFyICpOdVBsYXllcjI6OmdldERhdGFTb3VyY2VUeXBlKCkgewotICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CisgICAgc3dpdGNoIChtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlKSB7CiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CiAgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKIApAQCAtMjkyNiw4ICszMDM4LDM0IEBACiAgICAgfQogIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvKiBOdVBsYXllcjI6OmdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQ2NF90IHNyY0lkOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkID09IHNyY0lkKSB7CisgICAgICAgIHJldHVybiAmbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIH0gZWxzZSBpZiAobU5leHRTb3VyY2VJbmZvLm1TcmNJZCA9PSBzcmNJZCkgeworICAgICAgICByZXR1cm4gJm1OZXh0U291cmNlSW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpyZXNldFNvdXJjZUluZm8oTnVQbGF5ZXIyOjpTb3VyY2VJbmZvICZzcmNJbmZvKSB7CisgICAgaWYgKHNyY0luZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS0+c3RvcCgpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICAvLyBNb2R1bGFyIERSTQorICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBzcmNJbmZvLm1DcnlwdG8uZ2V0KCkpOworICAgIHNyY0luZm8ubUNyeXB0by5jbGVhcigpOworICAgIHNyY0luZm8ubUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Cit9CisKIC8vIE1vZHVsYXIgRFJNIGJlZ2luCi1zdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtICIpOwogCkBAIC0yOTM3LDYgKzMwNzUsNyBAQAogICAgIHVpbnQ4X3QgVVVJRFsxNl07CiAgICAgbWVtY3B5KFVVSUQsIHV1aWQsIHNpemVvZihVVUlEKSk7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IGRybVNlc3Npb25JZDsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInV1aWQiLCAodm9pZCopVVVJRCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCopJnNlc3Npb25JZCk7CiAKQEAgLTI5NTMsMTEgKzMwOTIsMTIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpCiB7CiAgICAgQUxPR1YoInJlbGVhc2VEcm0gIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZURybSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwpAQCAtMjk3OCw4ICszMTE4LDE1IEBACiAgICAgQUxPR0QoIm9uUHJlcGFyZURybSAiKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwgc3RhdHVzKTsKKyAgICBTb3VyY2VJbmZvICpzcmNJbmZvID0gZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhtc2cpOworICAgIGlmIChzcmNJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNyY0lkID0gc3JjSW5mby0+bVNyY0lkOworICAgIGlmIChzcmNJbmZvLT5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBObyBzb3VyY2UuIG9uUHJlcGFyZURybSBmYWlsZWQgd2l0aCAlZC4iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0yOTkxLDQyICszMTM4LDUwIEBACiAgICAgc3RhdHVzID0gT0s7CiAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKIAotICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CisgICAgc3RhdHVzID0gc3JjSW5mby0+bVNvdXJjZS0+cHJlcGFyZURybSh1dWlkLCAqZHJtU2Vzc2lvbklkLCAmY3J5cHRvKTsKICAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBmYWlsZWQuIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpLm1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBBTE9HVigib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIHN1Y2NlZWRlZCIpOworICAgIEFMT0dWKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkubVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiLCAobG9uZyBsb25nKXNyY0lkKTsKIAotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBVbmV4cGVjdGVkLiBBbHJlYWR5IGhhdmluZyBtQ3J5cHRvOiAlcCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3JjSW5mby0+bUNyeXB0by5nZXQoKSk7CisgICAgICAgIHNyY0luZm8tPm1DcnlwdG8uY2xlYXIoKTsKICAgICB9CiAKLSAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIG1Jc0RybVByb3RlY3RlZCA9IHRydWU7CisgICAgc3JjSW5mby0+bUNyeXB0byA9IGNyeXB0bzsKKyAgICBzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOwogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICBBTE9HRCgib25QcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCiB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOwotCi0gICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgU291cmNlSW5mbyAqc3JjSW5mbyA9IGdldFNvdXJjZUluZm9CeUlkSW5Nc2cobXNnKTs7CisgICAgaWYgKHNyY0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgaW50NjRfdCBzcmNJZCA9IHNyY0luZm8tPm1TcmNJZDsKKyAgICBpZiAoIXNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBBTE9HVygib25SZWxlYXNlRHJtOiBzcmNJbmZvKCVsbGQpIFVuZXhwZWN0ZWQuIG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgfQorCisgICAgc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBzb3VyY2UgZmlyc3QgYmVmb3JlIHJlbW92aW5nIGNyeXB0byBmcm9tIGNvZGVjCi0gICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnJlbGVhc2VEcm0oKTsKKyAgICAgICAgaWYgKHNyY0luZm8tPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3JjSW5mby0+bVNvdXJjZS0+cmVsZWFzZURybSgpOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzPU9LOwpAQCAtMzA0Nyw5ICszMjAyLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJvblJlbGVhc2VEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9IGVsc2UgeyAgIC8vIG1DcnlwdG8gPT0gTlVMTAorICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOworICAgICAgICBzcmNJbmZvLT5tQ3J5cHRvLmNsZWFyKCk7CisgICAgfSBlbHNlIHsgICAvLyBzcmNJbmZvLT5tQ3J5cHRvID09IE5VTEwKICAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gVGhlcmUgaXMgbm8gY3J5cHRvLiIpOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zMTExLDQgKzMyNjYsMjQgQEAKICAgICBUUkVTUEFTUygpOwogfQogCitOdVBsYXllcjI6OlNvdXJjZUluZm86OlNvdXJjZUluZm8oKQorICAgIDogbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSksCisgICAgICBtU3JjSWQoMCksCisgICAgICBtU291cmNlRmxhZ3MoMCksCisgICAgICBtU3RhcnRUaW1lVXMoMCksCisgICAgICBtRW5kVGltZVVzKERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7Cit9CisKK051UGxheWVyMjo6U291cmNlSW5mbyAmIE51UGxheWVyMjo6U291cmNlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IE51UGxheWVyMjo6U291cmNlSW5mbyAmb3RoZXIpIHsKKyAgICBtU291cmNlID0gb3RoZXIubVNvdXJjZTsKKyAgICBtQ3J5cHRvID0gb3RoZXIubUNyeXB0bzsKKyAgICBtRGF0YVNvdXJjZVR5cGUgPSAoREFUQV9TT1VSQ0VfVFlQRSlvdGhlci5tRGF0YVNvdXJjZVR5cGU7CisgICAgbVNyY0lkID0gb3RoZXIubVNyY0lkOworICAgIG1Tb3VyY2VGbGFncyA9IG90aGVyLm1Tb3VyY2VGbGFnczsKKyAgICBtU3RhcnRUaW1lVXMgPSBvdGhlci5tU3RhcnRUaW1lVXM7CisgICAgbUVuZFRpbWVVcyA9IG90aGVyLm1FbmRUaW1lVXM7CisgICAgbUlzRHJtUHJvdGVjdGVkID0gb3RoZXIubUlzRHJtUHJvdGVjdGVkOworICAgIHJldHVybiAqdGhpczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCmluZGV4IDk2Zjg1ZjkuLmZkYzEyOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApAQCAtMjMsNiArMjMsMTAgQEAKIAogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KIAorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CkBAIC03NSwxMSArNzksMTIgQEAKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DLAogICAgICAgICAgICAgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOworICAgIHZvaWQgcmV3aW5kKCk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50NjRfdCBzcmNJZCwgaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50NjRfdCBzcmNJZCwgc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOwogICAgIHZvaWQgZ2V0U3RhdHMoVmVjdG9yPHNwPEFNZXNzYWdlPiA+ICptVHJhY2tTdGF0cyk7CiAKQEAgLTg3LDggKzkyLDggQEAKICAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7Ci0gICAgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHByZXBhcmVEcm0oaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAKICAgICBjb25zdCBjaGFyICpnZXREYXRhU291cmNlVHlwZSgpOwogCkBAIC0xNTAsNiArMTU1LDMyIEBACiAgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCiAgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCiAgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0UmV3aW5kICAgICAgICAgICAgICAgICAgICAgPSAncmVXZCcsCisgICAgICAgIGtXaGF0RU9TTW9uaXRvciAgICAgICAgICAgICAgICAgPSAnZW9zTScsCisgICAgfTsKKworICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAorICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKKworICAgIHN0cnVjdCBTb3VyY2VJbmZvIHsKKyAgICAgICAgU291cmNlSW5mbygpOworICAgICAgICBTb3VyY2VJbmZvICZvcGVyYXRvcj0oY29uc3QgU291cmNlSW5mbyAmKTsKKworICAgICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKKyAgICAgICAgaW50NjRfdCBtU3JjSWQ7CisgICAgICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKKyAgICAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgICAgIGludDY0X3QgbUVuZFRpbWVVczsKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gbUNyeXB0bzsKKyAgICAgICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKICAgICB9OwogCiAgICAgd3A8TnVQbGF5ZXIyRHJpdmVyPiBtRHJpdmVyOwpAQCAtMTU3LDEyICsxODgsOCBAQAogICAgIHVpZF90IG1VSUQ7CiAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgTXV0ZXggbVNvdXJjZUxvY2s7ICAvLyBndWFyZCB8bVNvdXJjZXwuCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIGludDY0X3QgbVNyY0lkOwotICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKLSAgICBzcDxTb3VyY2U+IG1OZXh0U291cmNlOwotICAgIGludDY0X3QgbU5leHRTcmNJZDsKLSAgICB1aW50MzJfdCBtTmV4dFNvdXJjZUZsYWdzOworICAgIFNvdXJjZUluZm8gbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIFNvdXJjZUluZm8gbU5leHRTb3VyY2VJbmZvOwogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXJCYXNlPiBtVmlkZW9EZWNvZGVyOwpAQCAtMTc0LDYgKzIwMSw3IEBACiAgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1FT1NNb25pdG9yR2VuZXJhdGlvbjsKIAogICAgIE11dGV4IG1QbGF5aW5nVGltZUxvY2s7CiAgICAgaW50NjRfdCBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOwpAQCAtMjQ0LDIyICsyNzIsNiBAQAogICAgIC8vIFBhdXNlIHN0YXRlIGFzIHJlcXVlc3RlZCBieSBzb3VyY2UgKGludGVybmFsbHkpIGR1ZSB0byBidWZmZXJpbmcKICAgICBib29sIG1QYXVzZWRGb3JCdWZmZXJpbmc7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87Ci0gICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKLSAgICB9IERBVEFfU09VUkNFX1RZUEU7Ci0KLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtRGF0YVNvdXJjZVR5cGU7Ci0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbU5leHREYXRhU291cmNlVHlwZTsKLQogICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgewogICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKICAgICB9CkBAIC0yOTIsMTIgKzMwNCwxNCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CiAKLSAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOworCisgICAgdm9pZCBhZGRFbmRUaW1lTW9uaXRvcigpOwogCiAgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBvblN0YXJ0KCk7CisgICAgdm9pZCBvblN0YXJ0KGJvb2wgcGxheSk7CiAgICAgdm9pZCBvblJlc3VtZSgpOwogICAgIHZvaWQgb25QYXVzZSgpOwogCkBAIC0zMzMsMTAgKzM0NywxMyBAQAogICAgIHZvaWQgc2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAotICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OworICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGxheWVyTWVzc2FnZSogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIFNvdXJjZUluZm8qIGdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgcmVzZXRTb3VyY2VJbmZvKFNvdXJjZUluZm8gJnNyY0luZm8pOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKaW5kZXggYTIzNTQ2YS4uOThjMzQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcApAQCAtMTk5LDYgKzE5OSwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjppc1NlbGVjdGVkKCkgY29uc3QgewogICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjayA+PSAwICYmIG1TZWxlY3RlZFRyYWNrIDwgKGludDMyX3QpZ2V0VHJhY2tDb3VudCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKaW5kZXggNTdkNWVhMi4uOTc4MzRkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAppbmRleCBmNTcxOGUxLi40OWUzZTNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKQEAgLTEwODgsNiArMTA4OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCmluZGV4IDg3OTMwYzcuLjkxNGYyOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCkBAIC0zOCw3ICszOCw3IEBACiAgICAgLy8gRXZlcnkgZGVjb2RlciBoYXMgaXRzIG93biBsb29wZXIgYmVjYXVzZSBNZWRpYUNvZGVjIG9wZXJhdGlvbnMKICAgICAvLyBhcmUgYmxvY2tpbmcsIGJ1dCBOdVBsYXllcjIgbmVlZHMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCiAgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlBEZWNvZGVyIik7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QMkRlY29kZXIiKTsKICAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKaW5kZXggMzk4YzI0Ni4uMmRhYjJkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcApAQCAtMzcsNDUgKzM3LDQ3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAKK3VzaW5nIGdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlZhbHVlOworCiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBQYXJjZWxXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIHN0YXRpYyBzcDxQYXJjZWxXcmFwcGVyPiBDcmVhdGUoY29uc3QgUGFyY2VsICpwKSB7CitzdHJ1Y3QgUGxheWVyTWVzc2FnZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgc3RhdGljIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBDcmVhdGUoY29uc3QgUGxheWVyTWVzc2FnZSAqcCkgewogICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBwdyA9IG5ldyBQYXJjZWxXcmFwcGVyKCk7Ci0gICAgICAgICAgICBpZiAocHctPmFwcGVuZEZyb20ocCkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHc7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gcHcgPSBuZXcgUGxheWVyTWVzc2FnZVdyYXBwZXIoKTsKKyAgICAgICAgICAgIHB3LT5jb3B5RnJvbShwKTsKKyAgICAgICAgICAgIHJldHVybiBwdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBjb25zdCBQYXJjZWwgKmdldFBhcmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYXJjZWw7CisgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqZ2V0UGxheWVyTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXJNZXNzYWdlOwogICAgIH0KIAogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflBhcmNlbFdyYXBwZXIoKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtUGFyY2VsOworICAgIHZpcnR1YWwgflBsYXllck1lc3NhZ2VXcmFwcGVyKCkgeworICAgICAgICBpZiAobVBsYXllck1lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIG1QbGF5ZXJNZXNzYWdlOwogICAgICAgICB9CiAgICAgfQogCiBwcml2YXRlOgotICAgIFBhcmNlbFdyYXBwZXIoKQotICAgICAgICA6IG1QYXJjZWwoTlVMTCkgeyB9CisgICAgUGxheWVyTWVzc2FnZVdyYXBwZXIoKQorICAgICAgICA6IG1QbGF5ZXJNZXNzYWdlKE5VTEwpIHsgfQogCi0gICAgc3RhdHVzX3QgYXBwZW5kRnJvbShjb25zdCBQYXJjZWwgKnApIHsKLSAgICAgICAgaWYgKG1QYXJjZWwgPT0gTlVMTCkgewotICAgICAgICAgICAgbVBhcmNlbCA9IG5ldyBQYXJjZWw7CisgICAgdm9pZCBjb3B5RnJvbShjb25zdCBQbGF5ZXJNZXNzYWdlICpwKSB7CisgICAgICAgIGlmIChtUGxheWVyTWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBtUGxheWVyTWVzc2FnZSA9IG5ldyBQbGF5ZXJNZXNzYWdlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtUGFyY2VsLT5hcHBlbmRGcm9tKHAsIDAgLyogc3RhcnQgKi8sIHAtPmRhdGFTaXplKCkpOworICAgICAgICBtUGxheWVyTWVzc2FnZS0+Q29weUZyb20oKnApOwogICAgIH0KIAotICAgIFBhcmNlbCAqbVBhcmNlbDsKKyAgICBQbGF5ZXJNZXNzYWdlICptUGxheWVyTWVzc2FnZTsKIH07CiAKIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcwpAQCAtMjczLDEzICsyNzUsNiBAQAogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwogICAgICAgICAgICAgbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVhbGx5IGp1c3QgcGF1c2VkLiBoYW5kbGUgYXMgc2VlayB0byBzdGFydAotICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKQEAgLTI5NCw3ICsyODksNiBAQAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdGFydF9sKCkgewogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICB7CiAgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwpAQCAtMzA0LDcgKzI5OCw3IEBACiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1BdEVPUykgewotICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJld2luZCgpOwogICAgICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1Qb3NpdGlvblVzID0gLTE7CiAgICAgICAgICAgICB9CkBAIC0zMjAsMzQgKzMxNCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0b3AoKSB7Ci0gICAgQUxPR0QoInN0b3AoJXApIiwgdGhpcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKLSAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLQotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICAvL25vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwYXVzZSgpIHsKICAgICBBTE9HRCgicGF1c2UoJXApIiwgdGhpcyk7CiAgICAgLy8gVGhlIE51UGxheWVyUmVuZGVyZXIgbWF5IGdldCBmbHVzaGVkIGlmIHBhdXNlIGZvciBsb25nIGVub3VnaCwgZS5nLiB0aGUgcGF1c2UgdGltZW91dCB0ZWFyCkBAIC0zNjEsOSArMzI3LDkgQEAKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICAgICAgcmV0dXJuIE9LOwogCisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CkBAIC0zODYsMTUgKzM1Miw2IEBACiAgICAgICAgIC8vIHRyeSB0byB1cGRhdGUgcG9zaXRpb24KICAgICAgICAgaW50NjRfdCB1bnVzZWQ7CiAgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbigmdW51c2VkKTsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICB9IGVsc2UgaWYgKHJhdGUubVNwZWVkICE9IDAuZgotICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VECi0gICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRAotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpKSB7Ci0gICAgICAgICAgICBlcnIgPSBzdGFydF9sKCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTQxOSw3ICszNzYsNiBAQAogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgewpAQCAtNjAxLDEwICs1NTcsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgIC8vIG5vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtNjMzLDUwICs1ODUsNTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgewotICAgIGlmIChyZXBseSA9PSBOVUxMKSB7CitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgeworICAgIGlmIChyZXNwb25zZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZXBseSBpcyBhIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGludDMyX3QgbWV0aG9kSWQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcmVxdWVzdC5yZWFkSW50MzIoJm1ldGhvZElkKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBtZXRob2QgdG8gaW52b2tlLCBlcnIoJWQpIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxjb25zdCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVxdWVzdC52YWx1ZXMoKS5jYmVnaW4oKTsKKyAgICBpbnQzMl90IG1ldGhvZElkID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogCiAgICAgc3dpdGNoIChtZXRob2RJZCkgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBtb2RlID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU2NhbGluZ01vZGUobW9kZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPOgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHNyY0lkLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgaW50NjRfdCBtc2VjID0gMDsKICAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSwogICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBMTCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2soc3JjSWQsIHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMExMKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKAorICAgICAgICAgICAgICAgICAgICBzcmNJZCwgdHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHNyY0lkLCB0eXBlLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtNzgwLDIwICs3MzMsNyBAQAogICAgIEFMT0dWKCJub3RpZnlTZWVrQ29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtU2Vla0luUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICBub3RpZnlTZWVrQ29tcGxldGVfbChzcmNJZCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGVfbChpbnQ2NF90IHNyY0lkKSB7Ci0gICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgewotICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgLy8gbm8gbmVlZCB0byBub3RpZnkgbGlzdGVuZXIKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCB3YXNTZWVraW5nID8gTUVESUEyX1NFRUtfQ09NUExFVEUgOiBNRURJQTJfUFJFUEFSRUQpOworICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9TRUVLX0NPTVBMRVRFKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpkdW1wKApAQCAtODg0LDEyICs4MjQsMTIgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtZXNzYWdlSWQiLCAmbXNnSWQpKTsKICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQxIiwgJmV4dDEpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDIiLCAmZXh0Mik7Ci0gICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBpbjsKKyAgICAgICAgICAgIHNwPFBsYXllck1lc3NhZ2VXcmFwcGVyPiBpbjsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoInBhcmNlbCIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQYXJjZWxXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJvYmoiLCAmb2JqKSAmJiBvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluID0gc3RhdGljX2Nhc3Q8UGxheWVyTWVzc2FnZVdyYXBwZXIgKj4ob2JqLmdldCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRFdmVudChzcmNJZCwgbXNnSWQsIGV4dDEsIGV4dDIsIChpbiA9PSBOVUxMID8gTlVMTCA6IGluLT5nZXRQYXJjZWwoKSkpOworICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBsYXllck1lc3NhZ2UoKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKQEAgLTg5OCwxNiArODM4LDE2IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwgaW4pOwogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglbGxkLCAlZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKICAgICAgICAgICAgIHRoaXMsIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwKLSAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CisgICAgICAgICAgICAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+Qnl0ZVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOwogICAgIGlmIChzcmNJZCA9PSBtU3JjSWQpIHsKICAgICAgICAgc3dpdGNoIChtc2cpIHsKICAgICAgICAgICAgIGNhc2UgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFOgpAQCAtOTI0LDEzICs4NjQsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgbUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJld2luZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBoYXMgc3RvcHBlZCB0aGUgc2luayBhdCB0aGUgZW5kIGluIG9yZGVyIHRvIHBsYXkgb3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgbGl0dGxlIGJpdCBvZiBhdWRpby4gSW4gbG9vcGluZyBtb2RlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNlbmQgY29tcGxldGlvbiBldmVudCB3aGVuIGxvb3BpbmcKKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeUxpc3RlbmVyLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgTUVESUEyX0lORk8pOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1JFUEVBVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKQEAgLTk2OSw3ICs5MTQsNyBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoIm1lc3NhZ2VJZCIsIG1zZyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIGV4dDEpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDIiLCBleHQyKTsKLSAgICBub3RpZnktPnNldE9iamVjdCgicGFyY2VsIiwgUGFyY2VsV3JhcHBlcjo6Q3JlYXRlKGluKSk7CisgICAgbm90aWZ5LT5zZXRPYmplY3QoIm9iaiIsIFBsYXllck1lc3NhZ2VXcmFwcGVyOjpDcmVhdGUoKFBsYXllck1lc3NhZ2UqKWluKSk7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTEwMzYsMjQgKzk4MSwyNSBAQAogfQogCiAvLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKIHsKICAgICBBTE9HVigicHJlcGFyZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKIAogICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnByZXBhcmVEcm0oc3JjSWQsIHV1aWQsIGRybVNlc3Npb25JZCk7CiAKICAgICBBTE9HVigicHJlcGFyZURybSByZXQ6ICVkIiwgcmV0KTsKIAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybSgpCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkKIHsKICAgICBBTE9HVigicmVsZWFzZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKIAogICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oc3JjSWQpOwogCiAgICAgQUxPR1YoInJlbGVhc2VEcm0gcmV0OiAlZCIsIHJldCk7CiAKQEAgLTEwNzMsOSArMTAxOSw2IEBACiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzogcnZhbCA9ICJSVU5OSU5HIjsgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiBydmFsID0gIlBBVVNFRCI7IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOiBydmFsID0gIlJFU0VUX0lOX1BST0dSRVNTIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogcnZhbCA9ICJTVE9QUEVEIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUklORyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUkVEIjsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvLyB5ZXMsIHRoaXMgYnVmZmVyIGlzIHNoYXJlZCBhbmQgdnVsbmVyYWJsZSB0byByYWNlcwogICAgICAgICAgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKaW5kZXggNGRhMjU2Ni4uYmIzMGM3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCkBAIC00MCwzMSArNDAsMzEgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAotICAgICAgICAgICAgaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7CisgICAgICAgICAgICBpbnQ2NF90IG1zZWMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAotICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CiAKQEAgLTc3LDE0ICs3NywxNCBAQAogICAgIHZvaWQgbm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3Qgc3JjSWQsIGludDY0X3QgdGltZVVzKTsKICAgICB2b2lkIG5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoaW50NjRfdCBzcmNJZCwgYm9vbCBzdGF0dXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQoaW50NjRfdCBzcmNJZCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdVBsYXllcjJEcml2ZXIoKTsKQEAgLTk5LDkgKzk5LDYgQEAKICAgICAgICAgU1RBVEVfUlVOTklORywKICAgICAgICAgU1RBVEVfUEFVU0VELAogICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKLSAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZwotICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKICAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CkBAIC0xNDksNyArMTQ2LDcgQEAKIAogICAgIHN0YXR1c190IHN0YXJ0X2woKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMkRyaXZlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCmluZGV4IDBlMDk2YjAuLmY0MWE0MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKQEAgLTEzMyw5ICsxMzMsOCBAQAogICAgIHJldHVybiBkcm1JbmZvQnVmZmVyOwogfQogCi1zcDxBQnVmZmVyPiBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8pCitzdGF0dXNfdCBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqcHNzaEluZm8sIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykKIHsKLQogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBwc3NoLCBkcm1JbmZvOwogCiAgICAgLy8gMCkgR2VuZXJhdGUgUFNTSCBieXRlcwpAQCAtMTU0LDIyICsxNTMsMjAgQEAKICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgocHNzaFB0ciwgcHNzaFNpemUpLnN0cmluZygpKTsKIAogICAgIC8vIDEpIFdyaXRlIFBTU0ggYnl0ZXMKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmcHNzaFNpemUpLCBzaXplb2YocHNzaFNpemUpKTsKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoLnN0cigpLmNfc3RyKCkpLCBwc3NoU2l6ZSk7CiAKICAgICAvLyAyKSBXcml0ZSBzdXBwb3J0ZWREUk1zCiAgICAgdWludDMyX3QgbnVtZW50cmllcyA9IHBzc2hJbmZvLT5udW1lbnRyaWVzOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZudW1lbnRyaWVzKSwgc2l6ZW9mKG51bWVudHJpZXMpKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKG51bWVudHJpZXMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CiAgICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07Ci0gICAgICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOworICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKICAgICAgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUFfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKICAgICAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KChjb25zdCB1aW50OF90KikmZW50cnktPnV1aWQsIHNpemVvZihBTWVkaWFVVUlEKSkuc3RyaW5nKCkpOwogICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZHJtSW5mby5zdHIoKS5jX3N0cigpLCBkcm1JbmZvLnRlbGxwKCkpOwotICAgIGRybUluZm9CdWYtPnNldFJhbmdlKDAsIGRybUluZm8udGVsbHAoKSk7Ci0gICAgcmV0dXJuIGRybUluZm9CdWY7CisgICAgcmV0dXJuIE9LOwogfQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCmluZGV4IDk5ZDI0MTUuLjk2OGQxYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApAQCAtMjMsNiArMjMsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICAgICBzdHJ1Y3QgRHJtVVVJRCB7CkBAIC04MCw3ICs4NCw3IEBACiAKICAgICBwdWJsaWM6CiAgICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpOwotICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICopOworICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICosIFBsYXllck1lc3NhZ2UgKik7CiAKICAgICB9OyAgLy8gTnVQbGF5ZXIyRHJtCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKaW5kZXggNDM4OWNmZC4uZTNjOWI0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvKGZhbHNlKSwKICAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMoMCksCiAgICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKQEAgLTEzMyw4ICsxMzMsNyBAQAogICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAogICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soKSkgewogICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKIH0KIAogTnVQbGF5ZXIyOjpSZW5kZXJlcjo6flJlbmRlcmVyKCkgewpAQCAtMTkwLDI2ICsxODksMjAgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25Db25maWdQbGF5YmFjayhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pIHsKLSAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgLy8gZG9uJ3QgY2FsbCBhdWRpb3NpbmsncyBzZXRQbGF5YmFja1JhdGUgaWYgcGF1c2luZywgYXMgcGl0Y2ggZG9lcyBub3QKLSAgICAgICAgLy8gaGF2ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBhbnkgbm9uLTAgc3BlZWQgKGUuZyBvbGQgc3BlZWQpLiBLZWVwCi0gICAgICAgIC8vIHNldHRpbmdzIG5vbmV0aGVsZXNzLCB1c2luZyB0aGUgb2xkIHNwZWVkLCBpbiBjYXNlIGF1ZGlvc2luayBjaGFuZ2VzLgotICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKLSAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIGlmIChyYXRlLm1TcGVlZCA8PSAwLmYpIHsKKyAgICAgICAgQUxPR1coInBsYXliYWNrIHJhdGUgY2Fubm90IGJlICVmIiwgcmF0ZS5tU3BlZWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZ2V0IHBsYXliYWNrIHJhdGUgZnJvbSBhdWRpbyBzaW5rLCBlcnIoJWQpIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgIG1QbGF5YmFja1JhdGUgPSByYXRlLm1TcGVlZDsKLSAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIzMSwxNCArMjI0LDEyIEBACiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPmdldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwoKnJhdGUsIG1QbGF5YmFja1NldHRpbmdzKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGluZyBtaXNtYXRjaCBpbiBpbnRlcm5hbC9leHRlcm5hbCBwbGF5YmFjayByYXRlLCAlZiB2cyAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgYXVkaW9zaW5rLCBhcyBpdCBtYXkgYmUKICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gKnJhdGU7Ci0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCA9IDAuZjsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTU2MCw4ICs1NTEsOCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgKiBudW1GcmFtZXNQZW5kaW5nUGxheW91dCAqIDEwMDBsbDsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrUmF0ZSA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tSYXRlOworICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgaXQgbW9yZSBkYXRhIGFmdGVyIGFib3V0IGhhbGYgdGhhdCB0aW1lCkBAIC0xNDQ1LDcgKzE0MzYsNyBAQAogCiAgICAgaWYgKG1IYXNWaWRlbykgewogICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKICAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU3Myw2ICsxNTY0LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5vdGlmeUNvbXBsZXRlID0gbU5vdGlmeUNvbXBsZXRlVmlkZW87CiAgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyA9IGZhbHNlOworICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN5bmNpbmcgdGhlIHF1ZXVlcywgaS5lLiBkcm9wcGluZyBhdWRpbyB3aGlsZQpAQCAtMTc3Myw3ICsxNzY1LDcgQEAKICAgICAgICAgICAgIG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgICAgIH0KIAotICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOworICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAKICAgICAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKQEAgLTE3ODcsNyArMTc3OSw3IEBACiAKIHZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CiAgICAgfQogICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdChmcHMpOwogfQpAQCAtMTg1Nyw2ICsxODQ5LDcgQEAKICAgICAgICAgYm9vbCBpc1N0cmVhbWluZykgewogICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkT25seSglZCkgb2ZmbG9hZGluZ0F1ZGlvKCVkKSIsCiAgICAgICAgICAgICBvZmZsb2FkT25seSwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworCiAgICAgYm9vbCBhdWRpb1NpbmtDaGFuZ2VkID0gZmFsc2U7CiAKICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwpAQCAtMTkyOCw3ICsxOTIxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KW9mZmxvYWRGbGFncywKQEAgLTE5OTksMTMgKzE5OTEsNiBAQAogICAgICAgICBjb25zdCB1aW50MzJfdCBmcmFtZUNvdW50ID0KICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSAvIDEwMDA7CiAKLSAgICAgICAgLy8gVGhlIGRvTm90UmVjb25uZWN0IG1lYW5zIEF1ZGlvU2luayB3aWxsIHNpZ25hbCBiYWNrIGFuZCBsZXQgTnVQbGF5ZXIyIHRvIHJlLWNvbnN0cnVjdAotICAgICAgICAvLyBBdWRpb1NpbmsuIFdlIGRvbid0IHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3MgdmlkZW8gYmVjYXVzZSBpdCB3aWxsIGNhdXNlIGEgdmlkZW8gc2VlayB0bwotICAgICAgICAvLyB0aGUgcHJldmlvdXMgSSBmcmFtZS4gQnV0IHdlIGRvIHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3Mgb25seSBhdWRpbyBiZWNhdXNlIGl0IHdpbGwgZ2l2ZQotICAgICAgICAvLyBOdVBsYXllcjIgYSBjaGFuY2UgdG8gc3dpdGNoIGZyb20gbm9uLW9mZmxvYWQgbW9kZSB0byBvZmZsb2FkIG1vZGUuCi0gICAgICAgIC8vIFNvIHdlIG9ubHkgc2V0IGRvTm90UmVjb25uZWN0IHdoZW4gdGhlcmUncyBubyB2aWRlby4KLSAgICAgICAgY29uc3QgYm9vbCBkb05vdFJlY29ubmVjdCA9ICFoYXNWaWRlbzsKLQogICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gc2V0IG91ciBwbGF5YmFjayBzZXR0aW5ncyBpZiB0aGUgc2luayBpcyBjbG9zZWQuCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKSAhPSBPSywKICAgICAgICAgICAgICAgICAib25PcGVuQXVkaW9TaW5rOiBjYW4ndCBzZXQgcGxheWJhY2sgcmF0ZSBvbiBjbG9zZWQgc2luayIpOwpAQCAtMjAxNCwxMiArMTk5OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAogICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coIm9wZW5BdWRpb1Npbms6IG5vbiBvZmZsb2FkZWQgb3BlbiBmYWlsZWQgc3RhdHVzOiAlZCIsIGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKaW5kZXggNjJjZjBkOC4uNDg0ZDliNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaApAQCAtMjgsNyArMjgsNyBAQAogY2xhc3MgIEpXYWtlTG9jazsKIHN0cnVjdCBNZWRpYUNsb2NrOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOwogCiBzdHJ1Y3QgTnVQbGF5ZXIyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CkBAIC0xNjcsNyArMTY3LDYgQEAKICAgICBpbnQzMl90IG1BdWRpb0VPU0dlbmVyYXRpb247CiAKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBmbG9hdCBtUGxheWJhY2tSYXRlOyAvLyBhdWRpbyB0cmFjayByYXRlCiAKICAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKICAgICBBVlN5bmNTZXR0aW5ncyBtU3luY1NldHRpbmdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKaW5kZXggNjYyMjM1Zi4uOTI5OGE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAppbmRleCA3MGJjMGE5Li5hNzAyNjllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcApAQCAtOTYsNyArOTYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtSXNTRFAgJiYgbUhUVFBTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwMiIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaAppbmRleCA3MTJjM2U1Li5lNWYxNzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDc0MjM2Y2IuLjUxODc5ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggZTNhZTAyZS4uZWFlNTJjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CkBAIC05NDgsNiArOTQ5LDEwIEBACiAgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9PR0c6CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE9nZ1JlY29yZGluZygpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwpAQCAtMTAxMyw2ICsxMDE4LDcgQEAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9PR0c6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwogICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CkBAIC0xMTEzLDYgKzExMTksOSBAQAogICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfT1BVUzoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKQEAgLTExNjksNiArMTE3OCwxMyBAQAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwT2dnUmVjb3JkaW5nKCkgeworICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfT0dHKTsKKworICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKG1PdXRwdXRGZCk7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBTVJSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fAogICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpOwpAQCAtMTgxMyw2ICsxODI5LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjMsMTkgKzE4ODAsMTggQEAKICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewotICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZwotICAgICAgICBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICB9CisgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgY29uc3QgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmYWEyZTU5Li4yYWRhMzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTE2Niw2ICsxNjYsNyBAQAogICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwT2dnUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggODMxYTAxMi4uZTJhYThmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtMTU0Nyw2ICsxNTQ3LDE2IEBACiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZmluYWxTdGF0dXMpOworICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TZW50UGF1c2VPbkJ1ZmZlcmluZykgeworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKKyAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggNGIwOWRkYS4uNWNmNmJiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC02NTksMjAgKzY1OSwzMSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IC0xOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwotICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwotCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayA9PSAtMSAmJiBtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUNDRGVjb2Rlci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFjayAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrICs9IGluYmFuZFRyYWNrczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAppbmRleCA3ZjQ3NzNiLi4wMTU2YWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKQEAgLTIwMCw2ICsyMDAsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCmluZGV4IGYzMTBmMzcuLjM3YjgyMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDRhZDZlYWIuLmRmMWZmZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOworICAgIG1TdGF0cy0+c2V0RmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCBtRnJhbWVSYXRlVG90YWwpOwogICAgIHJldHVybiBtU3RhdHM7CiB9CiAKQEAgLTEwNjksNiArMTA3MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCA4NzhiZDFlLi5iYTNlYmFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTUzLDYgKzUzLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC01NzcsNiArNTc4LDEwIEBACiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwogCisgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoa1BsYXllckZyYW1lUmF0ZSwgKGRvdWJsZSkgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKQEAgLTYwMiw2ICs2MDcsNyBAQAogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisKICAgICB9CiAKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKaW5kZXggYmRlMDg2Mi4uOGQ4NzZkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCkBAIC0yMzksOCArMjM5LDE0IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpCiB7CiAgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQotICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKENyeXB0b0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIHNpemVfdCBjcnlwdG9zaXplOworICAgIC8vIHNpemVvZihDcnlwdG9JbmZvKSArIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSksIG51bVN1YlNhbXBsZXMsICZjcnlwdG9zaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhjcnlwdG9zaXplLCBzaXplb2YoQ3J5cHRvSW5mbyksICZjcnlwdG9zaXplKSkgeworICAgICAgICBBTE9HRSgiY3J5cHRvIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgQ3J5cHRvSW5mbyAqcmV0ID0gKENyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCAwMTIzMmIxLi5jOGY2NzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTg3LDYgKzg5LDIwIEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBhdWRpb19mb3JtYXRfdCBjb25zdGV4cHIgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcoaW50MzJfdCBwY21FbmNvZGluZykgeworICAgIHN3aXRjaCAocGNtRW5jb2RpbmcpIHsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY204Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV84X0JJVDsgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCkBAIC0xODc3LDggKzE4OTMsMTMgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKIAorICAgIC8vIHJlYWQgcGNtIGVuY29kaW5nIGZyb20gTWVkaWFDb2RlYyBvdXRwdXQgZm9ybWF0LCBpZiBhdmFpbGFibGUKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nOworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykgPworICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhwY21FbmNvZGluZykgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKwogICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOwpAQCAtMTk4MCw3ICsyMDAxLDcgQEAKICAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewogICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKICAgICAgICAgfTsKQEAgLTIwMTksNyArMjA0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCkBAIC0yMDc3LDQgKzIwOTgsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCBhMDQ3OTc1Li5hNTIxZjYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzICBBV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU4NmI2OGEuLjQ3NDlhOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSw3IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgXSwKIAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAppbmRleCA3NGFhZjc3Li4xMTg4MzIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKQEAgLTMsOSArMywxMyBAQAogICAgIG5hbWU6ICJsaWJuYmxvZyIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJOQkxvZy5jcHAiLAorICAgICAgICAiRW50cnkuY3BwIiwKKyAgICAgICAgIk1lcmdlci5jcHAiLAogICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAorICAgICAgICAiUmVhZGVyLmNwcCIsCiAgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAorICAgICAgICAiVGltZWxpbmUuY3BwIiwKKyAgICAgICAgIldyaXRlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTMsOSArMTcsMTQgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcCBiL21lZGlhL2xpYm5ibG9nL0VudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitpbnQgRW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKKyAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1FdmVudDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkgeworICAgICAgICByZXR1cm4gKGludCkgKChjaGFyICopIG1EYXRhKVtvZmZzZXQgLSAyXTsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOyAgIC8vIEZJWE1FIGlzIHRoaXMgYW4gZXJyb3I/CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkgICAvLyBEdW1teSBpbml0aWFsaXphdGlvbi4KKyAgICA6IG1QdHIobnVsbHB0cikKK3sKK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKKyAgICA6IG1QdHIoZW50cnkpCit7Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpCisgICAgOiBtUHRyKG90aGVyLm1QdHIpCit7Cit9CisKK2NvbnN0IGVudHJ5JiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdAoreworICAgIHJldHVybiAqKGVudHJ5KikgbVB0cjsKK30KKworY29uc3QgZW50cnkqIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdAoreworICAgIHJldHVybiAoZW50cnkqKSBtUHRyOworfQorCitFbnRyeUl0ZXJhdG9yJiBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkKK3sKKyAgICBtUHRyICs9IG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0VudHJ5SXRlcmF0b3ImIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKQoreworICAgIG1QdHIgLT0gbVB0cltFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSArIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitFbnRyeUl0ZXJhdG9yIEVudHJ5SXRlcmF0b3I6Om5leHQoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKKyAgICByZXR1cm4gKythdXg7Cit9CisKK0VudHJ5SXRlcmF0b3IgRW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiAtLWF1eDsKK30KKworYm9vbCBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBtUHRyICE9IG90aGVyLm1QdHI7Cit9CisKK2ludCBFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHIgLSBvdGhlci5tUHRyOworfQorCitib29sIEVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBtUHRyW21QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKKyAgICAgICAgRW50cnk6OmtPdmVyaGVhZCArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOworfQorCit2b2lkIEVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICBkc3QtPndyaXRlKG1QdHIsIGxlbmd0aCk7Cit9CisKK3ZvaWQgRW50cnlJdGVyYXRvcjo6Y29weURhdGEodWludDhfdCAqZHN0KSBjb25zdAoreworICAgIG1lbWNweSgodm9pZCopIGRzdCwgbVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKQoreworICAgIGlmIChwdHIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCB0eXBlID0gRW50cnlJdGVyYXRvcihwdHIpLT50eXBlOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRVZFTlRfRk1UX1NUQVJUOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGb3JtYXRFbnRyeT4oRm9ybWF0RW50cnkocHRyKSk7CisgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURToKKyAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzoKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SGlzdG9ncmFtRW50cnk+KEhpc3RvZ3JhbUVudHJ5KHB0cikpOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJUcmllZCB0byBjcmVhdGUgQWJzdHJhY3RFbnRyeSBvZiB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KK30KKworRW50cnlJdGVyYXRvciBGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSk7Cit9CisKK2NvbnN0IGNoYXIgKkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdAoreworICAgIHJldHVybiAoY29uc3QgY2hhciopIG1FbnRyeSArIG9mZnNldG9mKGVudHJ5LCBkYXRhKTsKK30KKworc2l6ZV90IEZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBtRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldOworfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsgLy8gc2tpcCBoYXNoCisgICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAorICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9GTVRfQVVUSE9SKSB7CisgICAgICAgICsraXQ7CisgICAgfQorICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Cit9CisKK2xvZ19oYXNoX3QgRm9ybWF0RW50cnk6Omhhc2goKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAorICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOworICAgIHJldHVybiBoYXNoOworfQorCitpbnQgRm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgICsraXQ7IC8vIHNraXAgaGFzaAorICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCisgICAgcmV0dXJuIGl0LT50eXBlID09IEVWRU5UX0ZNVF9BVVRIT1IgPyBpdC5wYXlsb2FkPGludD4oKSA6IC0xOworfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIGl0LmNvcHlUbyhkc3QpOyAgICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKKyAgICAoKytpdCkuY29weVRvKGRzdCk7IC8vIGNvcHkgdGltZXN0YW1wCisgICAgKCsraXQpLmNvcHlUbyhkc3QpOyAvLyBjb3B5IGhhc2gKKyAgICAvLyBpbnNlcnQgYXV0aG9yIGVudHJ5CisgICAgc2l6ZV90IGF1dGhvckVudHJ5U2l6ZSA9IEVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKKyAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0ZNVF9BVVRIT1I7CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID0KKyAgICAgICAgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQorICAgICAgICBzaXplb2YoYXV0aG9yKTsKKyAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7CisgICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKKyAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcworICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRk1UX0VORCkgeworICAgICAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICB9CisgICAgaXQuY29weVRvKGRzdCk7CisgICAgKytpdDsKKyAgICByZXR1cm4gaXQ7Cit9CisKK2ludDY0X3QgSGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOworfQorCitsb2dfaGFzaF90IEhpc3RvZ3JhbUVudHJ5OjpoYXNoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKK30KKworaW50IEhpc3RvZ3JhbUVudHJ5OjphdXRob3IoKSBjb25zdAoreworICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKKyAgICByZXR1cm4gaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKQorICAgICAgICAgICAgPyBpdC5wYXlsb2FkPEhpc3RUc0VudHJ5V2l0aEF1dGhvcj4oKS5hdXRob3IgOiAtMTsKK30KKworRW50cnlJdGVyYXRvciBIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QKK3sKKyAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgorICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KKyAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOworICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgorICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOworICAgIC8vIENvcHkgdGhlIGF1dGhvcgorICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKKyAgICAvLyBVcGRhdGUgbGVuZ3RocworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCisgICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KKyAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDZkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9NZXJnZXIuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8anNvbi9qc29uLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworTWVyZ2VyOjpNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk6CisgICAgICBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpCit7Cit9CisKK3ZvaWQgTWVyZ2VyOjphZGRSZWFkZXIoY29uc3Qgc3A8UmVhZGVyPiAmcmVhZGVyKQoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgorICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCisgICAgbVJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Cit9CisKKy8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKKy8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCitzdHJ1Y3QgTWVyZ2VJdGVtCit7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgaW5kZXg7CisgICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Cit9OworCitib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpCit7CisgICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOworfQorCisvLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Cit2b2lkIE1lcmdlcjo6bWVyZ2UoKQoreworICAgIGlmICh0cnVlKSByZXR1cm47IC8vIE1lcmdpbmcgaXMgbm90IG5lY2Vzc2FyeSBhdCB0aGUgbW9tZW50LCBzbyB0aGlzIGlzIHRvIGRpc2FibGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYnlwYXNzIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IG1lbWJlciB2YXJpYWJsZXMgbm90IGJlaW5nIHVzZWQuCisgICAgY29uc3QgaW50IG5Mb2dzID0gbVJlYWRlcnMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7CisgICAgc3RkOjp2ZWN0b3I8RW50cnlJdGVyYXRvcj4gb2Zmc2V0czsKKyAgICBvZmZzZXRzLnJlc2VydmUobkxvZ3MpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkgeworICAgICAgICBzbmFwc2hvdHNbaV0gPSBtUmVhZGVyc1tpXS0+Z2V0U25hcHNob3QoKTsKKyAgICAgICAgb2Zmc2V0cy5wdXNoX2JhY2soc25hcHNob3RzW2ldLT5iZWdpbigpKTsKKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCisgICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKKyAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGFic3RyYWN0RW50cnkgPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaV0pOworICAgICAgICAgICAgaWYgKGFic3RyYWN0RW50cnkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKGFic3RyYWN0RW50cnktPnRpbWVzdGFtcCgpLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7CisgICAgICAgIGludCBpbmRleCA9IHRpbWVzdGFtcHMudG9wKCkuaW5kZXg7ICAgICAvLyBmaW5kIG1pbmltdW0gdGltZXN0YW1wCisgICAgICAgIC8vIGNvcHkgaXQgdG8gdGhlIGxvZywgaW5jcmVhc2luZyBvZmZzZXQKKyAgICAgICAgb2Zmc2V0c1tpbmRleF0gPSBBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KG9mZnNldHNbaW5kZXhdKS0+CisgICAgICAgICAgICBjb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwgaW5kZXgpOworICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgIHRpbWVzdGFtcHMucG9wKCk7CisgICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgeworICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgTWVyZ2VyOjpnZXRSZWFkZXJzKCkgY29uc3QKK3sKKyAgICAvL0F1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1SZWFkZXJzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVyZ2VSZWFkZXI6Ok1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKQorICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSwgIk1lcmdlUmVhZGVyIiksIG1SZWFkZXJzKG1lcmdlci5nZXRSZWFkZXJzKCkpCit7Cit9CisKKy8vIFRha2VzIHJhdyBjb250ZW50IG9mIHRoZSBsb2NhbCBtZXJnZXIgRklGTywgcHJvY2Vzc2VzIGxvZyBlbnRyaWVzLCBhbmQKKy8vIHdyaXRlcyB0aGUgZGF0YSB0byBhIG1hcCBvZiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBiYXNlZCBvbiB0aGVpciB0aHJlYWQgSUQuCit2b2lkIE1lcmdlUmVhZGVyOjpwcm9jZXNzU25hcHNob3QoU25hcHNob3QgJnNuYXBzaG90LCBpbnQgYXV0aG9yKQoreworICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhW2F1dGhvcl07CisgICAgLy8gV2UgZG9uJ3QgZG8gImF1dG8gaXQiIGJlY2F1c2UgaXQgcmVkdWNlcyByZWFkYWJpbGl0eSBpbiB0aGlzIGNhc2UuCisgICAgZm9yIChFbnRyeUl0ZXJhdG9yIGl0ID0gc25hcHNob3QuYmVnaW4oKTsgaXQgIT0gc25hcHNob3QuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUzogeworICAgICAgICAgICAgY29uc3QgSGlzdFRzRW50cnkgcGF5bG9hZCA9IGl0LnBheWxvYWQ8SGlzdFRzRW50cnk+KCk7CisgICAgICAgICAgICAvLyBUT0RPOiBoYXNoIGZvciBoaXN0b2dyYW0gdHMgYW5kIGF1ZGlvIHN0YXRlIG5lZWQgdG8gbWF0Y2gKKyAgICAgICAgICAgIC8vIGFuZCBjb3JyZXNwb25kIHRvIGF1ZGlvIHByb2R1Y3Rpb24gc291cmNlIGZpbGUgbG9jYXRpb24KKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2F1dGhvcl1bMCAvKmhhc2gqL10ubG9nVHNFbnRyeShwYXlsb2FkLnRzKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogeworICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbYXV0aG9yXVswIC8qaGFzaCovXS5oYW5kbGVTdGF0ZUNoYW5nZSgpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfaW5mb190IGluZm8gPSBpdC5wYXlsb2FkPHRocmVhZF9pbmZvX3Q+KCk7CisgICAgICAgICAgICBkYXRhLnRocmVhZEluZm8gPSBpbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9QQVJBTVM6IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9wYXJhbXNfdCBwYXJhbXMgPSBpdC5wYXlsb2FkPHRocmVhZF9wYXJhbXNfdD4oKTsKKyAgICAgICAgICAgIGRhdGEudGhyZWFkUGFyYW1zID0gcGFyYW1zOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGRhdGEubGF0ZW5jeUhpc3QuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV09SS19USU1FOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG1vbm90b25pY05zID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1vbm90b25pY01zID0gbW9ub3RvbmljTnMgKiAxZS02OworICAgICAgICAgICAgZGF0YS53b3JrSGlzdC5hZGQobW9ub3RvbmljTXMpOworICAgICAgICAgICAgZGF0YS5hY3RpdmUgKz0gbW9ub3RvbmljTnM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV0FSTVVQX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lTXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGRhdGEud2FybXVwSGlzdC5hZGQodGltZU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9VTkRFUlJVTjogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0cyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGRhdGEudW5kZXJydW5zKys7CisgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5lbXBsYWNlX2Zyb250KEVWRU5UX1VOREVSUlVOLCB0cyk7CisgICAgICAgICAgICAvLyBUT0RPIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZXNpemluZworICAgICAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLnNpemUoKSA+IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE6OmtNYXhTbmFwc2hvdHNUb1N0b3JlKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9PVkVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgZGF0YS5vdmVycnVucysrOworICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMuZW1wbGFjZV9mcm9udChFVkVOVF9VTkRFUlJVTiwgdHMpOworICAgICAgICAgICAgLy8gVE9ETyBoYXZlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8gYXV0b21hdGljYWxseSBoYW5kbGUgcmVzaXppbmcKKyAgICAgICAgICAgIGlmIChkYXRhLnNuYXBzaG90cy5zaXplKCkgPiBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhOjprTWF4U25hcHNob3RzVG9TdG9yZSkgeworICAgICAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVZFTlRfVVBQRVJfQk9VTkQ6CisgICAgICAgICAgICBBTE9HVygid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGl0LT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdCgpCit7CisgICAgLy8gZ2V0IGEgc25hcHNob3Qgb2YgZWFjaCByZWFkZXIgYW5kIHByb2Nlc3MgdGhlbQorICAgIC8vIFRPRE8gaW5zZXJ0IGxvY2sgaGVyZQorICAgIGNvbnN0IHNpemVfdCBuTG9ncyA9IG1SZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkxvZ3M7IGkrKykgeworICAgICAgICBzbmFwc2hvdHNbaV0gPSBtUmVhZGVyc1tpXS0+Z2V0U25hcHNob3QoKTsKKyAgICB9CisgICAgLy8gVE9ETyB1bmxvY2sgbG9jayBoZXJlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTG9nczsgaSsrKSB7CisgICAgICAgIGlmIChzbmFwc2hvdHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJvY2Vzc1NuYXBzaG90KCooc25hcHNob3RzW2ldKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKTsKK30KKwordm9pZCBNZXJnZVJlYWRlcjo6Y2hlY2tQdXNoVG9NZWRpYU1ldHJpY3MoKQoreworICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoYXV0byYgaXRlbSA6IG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAobm93IC0gZGF0YS5zdGFydCA+PSBrUGVyaW9kaWNNZWRpYU1ldHJpY3NQdXNoKSB7CisgICAgICAgICAgICAodm9pZClSZXBvcnRQZXJmb3JtYW5jZTo6c2VuZFRvTWVkaWFNZXRyaWNzKGRhdGEpOworICAgICAgICAgICAgZGF0YS5yZXNldCgpOyAgIC8vIGRhdGEgaXMgcGVyc2lzdGVudCBwZXIgdGhyZWFkCisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIC8vIFRPRE86IGFkZCBhIG11dGV4IGFyb3VuZCBtZWRpYS5sb2cgZHVtcAorICAgIC8vIE9wdGlvbnMgZm9yIGR1bXBzeXMKKyAgICBib29sIHBhID0gZmFsc2UsIGpzb24gPSBmYWxzZSwgcGxvdHMgPSBmYWxzZSwgcmV0cm8gPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmFyZyA6IGFyZ3MpIHsKKyAgICAgICAgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1wYSIpKSB7CisgICAgICAgICAgICBwYSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLWpzb24iKSkgeworICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnID09IFN0cmluZzE2KCItLXBsb3RzIikpIHsKKyAgICAgICAgICAgIHBsb3RzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcmV0cm8iKSkgeworICAgICAgICAgICAgcmV0cm8gPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwYSkgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcChmZCwgMCAvKmluZGVudCovLCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CisgICAgfQorICAgIGlmIChqc29uKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSnNvbihmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorICAgIGlmIChwbG90cykgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFBsb3RzKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9CisgICAgaWYgKHJldHJvKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wUmV0cm8oZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6aGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KQoreworICAgIGludCBhdXRob3IgPSBlbnRyeS5hdXRob3IoKTsKKyAgICBpZiAoYXV0aG9yID09IC0xKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gRklYTUUgTmVlZHMgYSBsb2NrCisgICAgY29uc3QgY2hhciogbmFtZSA9IG1SZWFkZXJzW2F1dGhvcl0tPm5hbWUoKS5jX3N0cigpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVyZ2VUaHJlYWQ6Ok1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCisgICAgOiBtTWVyZ2VyKG1lcmdlciksCisgICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAorICAgICAgbVRpbWVvdXRVcygwKQoreworfQorCitNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkKK3sKKyAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBzZXRUaW1lb3V0VXMoMCk7CisgICAgam9pbigpOworfQorCitib29sIE1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBib29sIGRvTWVyZ2U7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCisgICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIG1lcmdlLiBUaGUgbWluaW11bSBwZXJpb2QgYmV0d2VlbiB3YWtpbmcgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQorICAgICAgICAvLyBpcyBoYW5kbGVkIGluIEF1ZGlvRmxpbmdlcjo6TWVkaWFMb2dOb3RpZmllcjo6dGhyZWFkTG9vcCgpLgorICAgICAgICBtQ29uZC53YWl0KG1NdXRleCk7CisgICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKKyAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKKyAgICB9CisgICAgaWYgKGRvTWVyZ2UpIHsKKyAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycworICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7CisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKKyAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKKyAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQorICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lcmdlVGhyZWFkOjp3YWtldXAoKQoreworICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOworfQorCit2b2lkIE1lcmdlVGhyZWFkOjpzZXRUaW1lb3V0VXMoaW50IHRpbWUpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgbVRpbWVvdXRVcyA9IHRpbWU7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwIGIvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZhM2UzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCBOQkxvZzo6RW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAotewotICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKLSAgICBpZiAob2Zmc2V0ID09IDApCi0gICAgICAgIHJldHVybiBtRXZlbnQ7Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IDEpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOwotICAgIGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQotICAgICAgICByZXR1cm4gbUxlbmd0aDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLypzdGF0aWMqLwotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpBYnN0cmFjdEVudHJ5PiBOQkxvZzo6QWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKLSAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgotICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfQotCi1OQkxvZzo6QWJzdHJhY3RFbnRyeTo6QWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKLX0KLQotY29uc3QgY2hhciAqTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOwotfQotCi1zaXplX3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAotICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKLSAgICAgICAgKytpdDsKLSAgICB9Ci0gICAgcmV0dXJuIGl0OwotfQotCi1pbnQ2NF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6Rm9ybWF0RW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOwotICAgIHJldHVybiBoYXNoOwotfQotCi1pbnQgTkJMb2c6OkZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIC8vIHNraXAgdGltZXN0YW1wCi0gICAgKytpdDsKLSAgICAvLyBza2lwIGhhc2gKLSAgICArK2l0OwotICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCi0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ+KCk7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICAvLyBjb3B5IHRpbWVzdGFtcAotICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgICAgLy8gY29weSBoYXNoCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOwotICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKLSAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKLSAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07Ci0gICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0FVVEhPUjsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQotICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQotICAgICAgICBzaXplb2YoYXV0aG9yKTsKLSAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7Ci0gICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKLSAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcwotICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCkgewotICAgICAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICB9Ci0gICAgaXQuY29weVRvKGRzdCk7Ci0gICAgKytpdDsKLSAgICByZXR1cm4gaXQ7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0IHsKLSAgICBzaXplX3QgbGVuZ3RoID0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIGRzdC0+d3JpdGUocHRyLCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0IHsKLSAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkKLSAgICA6IHB0cihudWxscHRyKSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKLSAgICA6IHB0cihlbnRyeSkge30KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKQotICAgIDogcHRyKG90aGVyLnB0cikge30KLQotY29uc3QgTkJMb2c6OmVudHJ5JiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICAgIHJldHVybiAqKGVudHJ5KikgcHRyOwotfQotCi1jb25zdCBOQkxvZzo6ZW50cnkqIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QgewotICAgIHJldHVybiAoZW50cnkqKSBwdHI7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgICBwdHIgKz0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkgewotICAgIHB0ciAtPSBwdHJbTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuICsrYXV4OwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7Ci0gICAgcmV0dXJuIC0tYXV4OwotfQotCi1pbnQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyIC0gb3RoZXIucHRyOwotfQotCi1ib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0ciAhPSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gcHRyW3B0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludDY0X3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOwotfQotCi1OQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Ci19Ci0KLWludCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7Ci0gICAgaWYgKGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikpIHsKLSAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvcjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgotICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KLSAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOwotICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgotICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOwotICAgIC8vIENvcHkgdGhlIGF1dGhvcgotICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKLSAgICAvLyBVcGRhdGUgbGVuZ3RocwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCi0gICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KLSAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIDAgICAvLyBGSVhNRSBzZWUgbm90ZSBpbiBOQkxvZy5oCi1OQkxvZzo6VGltZWxpbmU6OlRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQpCi0gICAgOiBtU2l6ZShyb3VuZHVwKHNpemUpKSwgbU93bihzaGFyZWQgPT0gTlVMTCksCi0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgKG1Pd24gPyBuZXcgY2hhcltzaGFyZWRTaXplKHNpemUpXSA6IHNoYXJlZCkpCi17Ci0gICAgbmV3IChtU2hhcmVkKSBTaGFyZWQ7Ci19Ci0KLU5CTG9nOjpUaW1lbGluZTo6flRpbWVsaW5lKCkKLXsKLSAgICBtU2hhcmVkLT5+U2hhcmVkKCk7Ci0gICAgaWYgKG1Pd24pIHsKLSAgICAgICAgZGVsZXRlW10gKGNoYXIgKikgbVNoYXJlZDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLypzdGF0aWMqLwotc2l6ZV90IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKLXsKLSAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCi0gICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcigpCi0gICAgOiBtU2hhcmVkKE5VTEwpLCBtRmlmbyhOVUxMKSwgbUZpZm9Xcml0ZXIoTlVMTCksIG1FbmFibGVkKGZhbHNlKSwgbVBpZFRhZyhOVUxMKSwgbVBpZFRhZ1NpemUoMCkKLXsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgbUVuYWJsZWQobUZpZm9Xcml0ZXIgIT0gTlVMTCkKLXsKLSAgICAvLyBjYWNoaW5nIHBpZCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgcGlkX3QgaWQgPSA6OmdldHBpZCgpOwotICAgIGNoYXIgcHJvY05hbWVbMTZdOwotICAgIGludCBzdGF0dXMgPSBwcmN0bChQUl9HRVRfTkFNRSwgcHJvY05hbWUpOwotICAgIGlmIChzdGF0dXMpIHsgIC8vIGVycm9yIGdldHRpbmcgcHJvY2VzcyBuYW1lCi0gICAgICAgIHByb2NOYW1lWzBdID0gJ1wwJzsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihwcm9jTmFtZSk7Ci0gICAgbVBpZFRhZ1NpemUgPSBsZW5ndGggKyBzaXplb2YocGlkX3QpOwotICAgIG1QaWRUYWcgPSBuZXcgY2hhclttUGlkVGFnU2l6ZV07Ci0gICAgbWVtY3B5KG1QaWRUYWcsICZpZCwgc2l6ZW9mKHBpZF90KSk7Ci0gICAgbWVtY3B5KG1QaWRUYWcgKyBzaXplb2YocGlkX3QpLCBwcm9jTmFtZSwgbGVuZ3RoKTsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6V3JpdGVyOjp+V3JpdGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9Xcml0ZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotICAgIGRlbGV0ZVtdIG1QaWRUYWc7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpbmcgPT0gTlVMTCwgIkF0dGVtcHRlZCB0byBsb2cgTlVMTCBzdHJpbmciKTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RSSU5HLCBzdHJpbmcsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOwotICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7Ci0gICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7Ci0gICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKLSAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwotICAgIH0KLSAgICBpZiAobGVuZ3RoID49IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQ2NF90IHRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmICh0cyA+IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0lOVEVHRVIsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9GTE9BVCwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUQVJUX0ZNVCwgZm10LCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGVudHJ5ID0gRW50cnkoRVZFTlRfRU5EX0ZNVCwgTlVMTCwgMCk7Ci0gICAgbG9nKCZlbnRyeSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIaXN0VHNFbnRyeSBkYXRhOwotICAgIGRhdGEuaGFzaCA9IGhhc2g7Ci0gICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAoZGF0YS50cyA+IDApIHsKLSAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgaGFzaCk7Ci0gICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGY7Ci0gICAgY2hhciogczsKLSAgICBpbnQ2NF90IHQ7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci0gICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBpZiAoKnAgIT0gJyUnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2goKisrcCkgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZyhzKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIHQgPSB2YV9hcmcoYXJncCwgaW50NjRfdCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ0ludGVnZXIoaSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIGYgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ0Zsb2F0KChmbG9hdClmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nUElEKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCi0gICAgICAgIGNhc2UgJ1wwJzoKLSAgICAgICAgICAgIC0tcDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICAvLyBUT0RPIFBlcmhhcHMgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzcGxheSB0cnVuY2F0ZWQgZGF0YSBvciBhdCBsZWFzdCBhCi0gICAgICAgIC8vICAgICAgbWVzc2FnZSB0aGF0IHRoZSBkYXRhIGlzIHRvbyBsb25nPyAgVGhlIGN1cnJlbnQgYmVoYXZpb3IgY2FuIGNyZWF0ZQotICAgICAgICAvLyAgICAgIGEgY29uZnVzaW9uIGZvciBhIHByb2dyYW1tZXIgZGVidWdnaW5nIHRoZWlyIGNvZGUuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gSWdub3JlIGlmIGludmFsaWQgZXZlbnQKLSAgICBpZiAoZXZlbnQgPT0gRVZFTlRfUkVTRVJWRUQgfHwgZXZlbnQgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBldHIoZXZlbnQsIGRhdGEsIGxlbmd0aCk7Ci0gICAgbG9nKCZldHIsIHRydWUgLyp0cnVzdGVkKi8pOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBOQkxvZzo6RW50cnkgKmV0ciwgYm9vbCB0cnVzdGVkKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXRydXN0ZWQpIHsKLSAgICAgICAgbG9nKGV0ci0+bUV2ZW50LCBldHItPm1EYXRhLCBldHItPm1MZW5ndGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBuZWVkID0gZXRyLT5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTwotCi0gICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgotICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCi0gICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCi0gICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07Ci0gICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgewotICAgICAgICB0ZW1wW2ldID0gZXRyLT5jb3B5RW50cnlEYXRhQXQoaSk7Ci0gICAgfQotICAgIC8vIHdyaXRlIHRvIGNpcmN1bGFyIGJ1ZmZlcgotICAgIG1GaWZvV3JpdGVyLT53cml0ZSh0ZW1wLCBuZWVkKTsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBtRW5hYmxlZDsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBib29sIG9sZCA9IG1FbmFibGVkOwotICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7Ci0gICAgcmV0dXJuIG9sZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcigpCi0gICAgOiBXcml0ZXIoKQotewotfQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCi17Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nKHN0cmluZyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciB0aGUgY2xvY2tfZ2V0dGltZSgpIHN5c2NhbGwKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0cyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSW50ZWdlcih4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dGbG9hdCh4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dQSUQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dQSUQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci19Ci0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dFbmQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjpzZXRFbmFibGVkKGVuYWJsZWQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjpzdGFydGluZ1R5cGVzIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX1NUQVJUX0ZNVCwKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OwotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjplbmRpbmdUeXBlcyAgIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX0VORF9GTVQsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtRmQoLTEpLCBtSW5kZW50KDApLCBtTG9zdCgwKSwKLSAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQotewotfQotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpSZWFkZXI6On5SZWFkZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci19Ci0KLWNvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7Ci0gICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgICAgIGlmIChwcmV2IDwgZnJvbnQgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2spIHsKLQotICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlcy5maW5kKChjb25zdCBFdmVudCkgcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldKSAhPSB0eXBlcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIHByZXY7Ci0gICAgICAgIH0KLSAgICAgICAgYmFjayA9IHByZXY7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAotfQotCi0vLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90Ci0vLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCi0vLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4gTkJMb2c6OlJlYWRlcjo6Z2V0U25hcHNob3QoKQotewotICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0gICAgLy8gbWFrZSBhIGNvcHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2l0aCB3cml0ZXIKLSAgICBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKLQotICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQotICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCi0gICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgotICAgIHNpemVfdCBsb3N0OwotICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOwotICAgIHNzaXplX3QgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3QpOwotICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOwotICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOwotICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgewotICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKLSAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKLSAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKLSAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBFTkRfRk1UKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCi0gICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQotCi0gICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOwotICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOwotCi0gICAgLy8gRmluZCBsYXN0IEVORF9GTVQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KLSAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9FTkRfRk1ULgotICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgYmFjaywgZW5kaW5nVHlwZXMpOwotICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEVORF9GTVQgZW50cnkKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKLSAgICAgICAgLy8gZmluZCBmaXJzdCBTVEFSVF9GTVQKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIHN0YXJ0aW5nVHlwZXMpKQotICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBTVEFSVF9GTVQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCi0gICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCi0gICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7Ci0KLSAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OwotICAgIHJldHVybiBzbmFwc2hvdDsKLQotfQotCi0vLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCi0vLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdChOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCi17Ci0gICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7Ci0KLSAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKLSAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgewotICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAotICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgotICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHRzKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHMgaWYgdW51c2VkCi0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVWRU5UX0VORF9GTVQ6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogZ290IHRvIGVuZCBmb3JtYXQgZXZlbnQiKTsKLSAgICAgICAgICAgICsrZW50cnk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgZW50cnktPnR5cGUpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBwcmludCB0aGUgd2FybmluZ3MgaGVyZSBvciBlbHNld2hlcmUKLSAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKLXsKLSAgICAvLyBnZXQgYSBzbmFwc2hvdCwgcHJvY2VzcyBpdAotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcCA9IGdldFNuYXBzaG90KCk7Ci0gICAgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCpzbmFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBpbnQgaW5kZW50KSB7Ci0gICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCi0gICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIGluZGVudCwgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOwotfQotCi0vLyBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGNvbnNvbGUKLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcExpbmUoY29uc3QgU3RyaW5nOCAmdGltZXN0YW1wLCBTdHJpbmc4ICZib2R5KQotewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBkcHJpbnRmKG1GZCwgIiUuKnMlcyAlc1xuIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIiUuKnMlcyAlcyIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0KLSAgICBib2R5LmNsZWFyKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OlJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAotewotICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTkJMb2c6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50NjRfdCB0czsKLSAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2YodHMpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludCB4ID0gKigoaW50KikgZGF0YSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBmbG9hdCBmOwotICAgIG1lbWNweSgmZiwgZGF0YSwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOwotICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBTdHJpbmc4IHN0cjsKLSAgICBzdHIuYXBwZW5kKCJbICIpOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOwotICAgIH0KLSAgICBzdHIuYXBwZW5kKCJdIik7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKLXsKLSAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6UmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSkgewotICAgIC8vIGxvZyB0aW1lc3RhbXAKLSAgICBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7Ci0gICAgdGltZXN0YW1wLT5jbGVhcigpOwotICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLQotICAgIC8vIGxvZyB1bmlxdWUgaGFzaAotICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKLSAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKLQotICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCi0gICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKLQotICAgIC8vIGxvZyBzdHJpbmcKLSAgICBOQkxvZzo6RW50cnlJdGVyYXRvciBhcmcgPSBmbXRFbnRyeS5hcmdzKCk7Ci0KLSAgICBjb25zdCBjaGFyKiBmbXQgPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmcoKTsKLSAgICBzaXplX3QgZm10X2xlbmd0aCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZ0xlbmd0aCgpOwotCi0gICAgZm9yIChzaXplX3QgZm10X29mZnNldCA9IDA7IGZtdF9vZmZzZXQgPCBmbXRfbGVuZ3RoOyArK2ZtdF9vZmZzZXQpIHsKLSAgICAgICAgaWYgKGZtdFtmbXRfb2Zmc2V0XSAhPSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgmZm10W2ZtdF9vZmZzZXRdLCAxKTsgLy8gVE9ETyBvcHRpbWl6ZSB0byB3cml0ZSBjb25zZWN1dGl2ZSBzdHJpbmdzIGF0IG9uY2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiUlIiIKLSAgICAgICAgaWYgKGZtdFsrK2ZtdF9vZmZzZXRdID09ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCIlIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlXDAiCi0gICAgICAgIGlmIChmbXRfb2Zmc2V0ID09IGZtdF9sZW5ndGgpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTkJMb2c6OkV2ZW50IGV2ZW50ID0gKE5CTG9nOjpFdmVudCkgYXJnLT50eXBlOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7Ci0KLSAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAotCi0gICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncwotICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1NUUklORywKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1RJTUVTVEFNUCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgdGltZXN0YW1wIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRUaW1lc3RhbXAoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZMT0FULAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfUElELAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBwaWQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFBJRChib2R5LCBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgUmVhZGVyIGVuY291bnRlcmVkIHVua25vd24gY2hhcmFjdGVyICVjIiwgZm10W2ZtdF9vZmZzZXRdKTsKLSAgICAgICAgfQotICAgICAgICArK2FyZzsKLSAgICB9Ci0gICAgQUxPR1dfSUYoYXJnLT50eXBlICE9IEVWRU5UX0VORF9GTVQsICJFeHBlY3RlZCBlbmQgb2YgZm9ybWF0LCBnb3QgJWQiLCBhcmctPnR5cGUpOwotICAgICsrYXJnOwotICAgIHJldHVybiBhcmc7Ci19Ci0KLU5CTG9nOjpNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKLSAgICAgIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IE5CTG9nOjpOYW1lZFJlYWRlciAmcmVhZGVyKSB7Ci0KLSAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKLSAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCi0gICAgbU5hbWVkUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKLX0KLQotLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQotLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KLXN0cnVjdCBNZXJnZUl0ZW0KLXsKLSAgICBpbnQ2NF90IHRzOwotICAgIGludCBpbmRleDsKLSAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KLX07Ci0KLS8vIG9wZXJhdG9ycyBuZWVkZWQgZm9yIHByaW9yaXR5IHF1ZXVlIGluIG1lcmdlCi0vLyBib29sIG9wZXJhdG9yPihjb25zdCBpbnQ2NF90ICZ0MSwgY29uc3QgaW50NjRfdCAmdDIpIHsKLS8vICAgICByZXR1cm4gdDEudHZfc2VjID4gdDIudHZfc2VjIHx8ICh0MS50dl9zZWMgPT0gdDIudHZfc2VjICYmIHQxLnR2X25zZWMgPiB0Mi50dl9uc2VjKTsKLS8vIH0KLQotYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKSB7Ci0gICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOwotfQotCi0vLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Ci12b2lkIE5CTG9nOjpNZXJnZXI6Om1lcmdlKCkgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IG1lcmdlIHRocmVhZAotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBpbnQgbkxvZ3MgPSBtTmFtZWRSZWFkZXJzLnNpemUoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOwotICAgIHN0ZDo6dmVjdG9yPE5CTG9nOjpFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzKG5Mb2dzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKLSAgICAgICAgc25hcHNob3RzW2ldID0gbU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+Z2V0U25hcHNob3QoKTsKLSAgICAgICAgb2Zmc2V0c1tpXSA9IHNuYXBzaG90c1tpXS0+YmVnaW4oKTsKLSAgICB9Ci0gICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCi0gICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKLSAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKLSAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKLSAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsKLSAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAotICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT5jb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICAgICAgIHRpbWVzdGFtcHMucG9wKCk7Ci0gICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBzdGQ6OnZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+JiBOQkxvZzo6TWVyZ2VyOjpnZXROYW1lZFJlYWRlcnMoKSBjb25zdCB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICByZXR1cm4gbU5hbWVkUmVhZGVyczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCi0gICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplKSwgbU5hbWVkUmVhZGVycyhtZXJnZXIuZ2V0TmFtZWRSZWFkZXJzKCkpIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgTkJMb2c6OkFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KSB7Ci0gICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOwotICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jawotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtTmFtZWRSZWFkZXJzW2F1dGhvcl0ubmFtZSgpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChOQkxvZzo6TWVyZ2VyICZtZXJnZXIsIE5CTG9nOjpNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCi0gICAgOiBtTWVyZ2VyKG1lcmdlciksCi0gICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAotICAgICAgbVRpbWVvdXRVcygwKSB7fQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpIHsKLSAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCi0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBzZXRUaW1lb3V0VXMoMCk7Ci0gICAgam9pbigpOwotfQotCi1ib29sIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpIHsKLSAgICBib29sIGRvTWVyZ2U7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCi0gICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIHdhaXQga1RocmVhZFNsZWVwUGVyaW9kVXMgYW5kIHRoZW4gbWVyZ2UKLSAgICAgICAgbnNlY3NfdCB3YWl0VGltZSA9IG1UaW1lb3V0VXMgPiAwID8ga1RocmVhZFNsZWVwUGVyaW9kVXMgKiAxMDAwIDogTExPTkdfTUFYOwotICAgICAgICBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZSk7Ci0gICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKLSAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKLSAgICB9Ci0gICAgaWYgKGRvTWVyZ2UpIHsKLSAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycwotICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7Ci0gICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKLSAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKLSAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQotICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6d2FrZXVwKCkgewotICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKSB7Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgbVRpbWVvdXRVcyA9IHRpbWU7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAppbmRleCBmMDllOTNkLi5lOTFhNTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApAQCAtMTcsMTMgKzE3LDE2IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiUGVyZm9ybWFuY2VBbmFseXNpcyIKIC8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyAjZGVmaW5lIFdSSVRFX1RPX0ZJTEUKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjbGltaXRzPgogI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMzIsMjAgKzM1LDEyNiBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvTG9nUGxvdC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAordm9pZCBIaXN0b2dyYW06OmFkZChkb3VibGUgdmFsdWUpCit7CisgICAgaWYgKG1CaW5TaXplIDw9IDAgfHwgbUJpbnMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRPRE8gSGFuZGxlIGRvbWFpbiBhbmQgcmFuZ2UgZXJyb3IgZXhjZXB0aW9ucz8KKyAgICBjb25zdCBpbnQgdW5ib3VuZGVkSW5kZXggPSBscm91bmQoKHZhbHVlIC0gbUxvdykgLyBtQmluU2l6ZSkgKyAxOworICAgIC8vIHN0ZDo6Y2xhbXAgaXMgaW50cm9kdWNlZCBpbiBDKysxNworICAgIC8vY29uc3QgaW50IGluZGV4ID0gc3RkOjpjbGFtcCh1bmJvdW5kZWRJbmRleCwgMCwgKGludCkobUJpbnMuc2l6ZSgpIC0gMSkpOworICAgIGNvbnN0IGludCBpbmRleCA9IHN0ZDo6bWF4KDAsIHN0ZDo6bWluKChpbnQpKG1CaW5zLnNpemUoKSAtIDEpLCB1bmJvdW5kZWRJbmRleCkpOworICAgIG1CaW5zW2luZGV4XSsrOworICAgIG1Ub3RhbENvdW50Kys7Cit9CisKK3ZvaWQgSGlzdG9ncmFtOjpjbGVhcigpCit7CisgICAgc3RkOjpmaWxsKG1CaW5zLmJlZ2luKCksIG1CaW5zLmVuZCgpLCAwKTsKKyAgICBtVG90YWxDb3VudCA9IDA7Cit9CisKK3VpbnQ2NF90IEhpc3RvZ3JhbTo6dG90YWxDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Ub3RhbENvdW50OworfQorCitzdGQ6OnN0cmluZyBIaXN0b2dyYW06OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrRGl2aWRlciA9ICd8JzsKKyAgICBzcyA8PCBrVmVyc2lvbiA8PCAiLCIgPDwgbUJpblNpemUgPDwgIiwiIDw8IG1OdW1CaW5zIDw8ICIsIiA8PCBtTG93IDw8ICIseyI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQmlucy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUJpbnNbaV0gIT0gMCkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIHNzIDw8ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzIDw8IHN0YXRpY19jYXN0PGludD4oaSkgLSAxIDw8IGtEaXZpZGVyIDw8IG1CaW5zW2ldOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcyA8PCAifSI7CisKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIEhpc3RvZ3JhbTo6YXNjaWlBcnRTdHJpbmcoc2l6ZV90IGluZGVudCkgY29uc3QgeworICAgIGlmICh0b3RhbENvdW50KCkgPT0gMCB8fCBtQmluU2l6ZSA8PSAwIHx8IG1CaW5zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrTWFya2VyID0gJy0nOworICAgIC8vIE9uZSBpbmNyZW1lbnQgaXMgY29uc2lkZXJlZCBvbmUgc3RlcCBvZiBhIGJpbidzIGhlaWdodC4KKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2Vyc1BlckluY3JlbWVudCA9IDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heEluY3JlbWVudHMgPSA2NCArIDE7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01heE51bWJlcldpZHRoID0gNzsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01hcmtlcnMoa01hcmtlcnNQZXJJbmNyZW1lbnQgKiBrTWF4SW5jcmVtZW50cywga01hcmtlcik7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtTcGFjZXMoa01hcmtlcnNQZXJJbmNyZW1lbnQgKiBrTWF4SW5jcmVtZW50cywgJyAnKTsKKyAgICAvLyBnZXQgdGhlIGxhc3QgbiBjaGFyYWN0ZXJzIG9mIHMsIG9yIHRoZSB3aG9sZSBzdHJpbmcgaWYgaXQgaXMgc2hvcnRlcgorICAgIGF1dG8gZ2V0VGFpbCA9IFtdKGNvbnN0IHNpemVfdCBuLCBjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICAgICAgICByZXR1cm4gcy5jX3N0cigpICsgcy5zaXplKCkgLSBzdGQ6Om1pbihuLCBzLnNpemUoKSk7CisgICAgfTsKKworICAgIC8vIFNpbmNlIHRvdGFsQ291bnQoKSA+IDAsIG1CaW5zIGlzIG5vdCBlbXB0eSBhbmQgbWF4Q291bnQgPiAwLgorICAgIGNvbnN0IHVuc2lnbmVkIG1heENvdW50ID0gKnN0ZDo6bWF4X2VsZW1lbnQobUJpbnMuYmVnaW4oKSwgbUJpbnMuZW5kKCkpOworICAgIGNvbnN0IHNpemVfdCBtYXhJbmNyZW1lbnRzID0gbG9nMihtYXhDb3VudCkgKyAxOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICAvLyBOb24temVybyBiaW5zIG11c3QgZXhpc3QgYXQgdGhpcyBwb2ludCBiZWNhdXNlIHRvdGFsQ291bnQoKSA+IDAuCisgICAgc2l6ZV90IGZpcnN0Tm9uWmVyb0JpbiA9IDA7CisgICAgLy8gSWYgZmlyc3ROb25aZXJvQmluIHJlYWNoZXMgbUJpbnMuc2l6ZSgpIC0gMSwgdGhlbiBpdCBtdXN0IGJlIGEgbm9uemVybyBiaW4uCisgICAgZm9yICg7IGZpcnN0Tm9uWmVyb0JpbiA8IG1CaW5zLnNpemUoKSAtIDEgJiYgbUJpbnNbZmlyc3ROb25aZXJvQmluXSA9PSAwOyBmaXJzdE5vblplcm9CaW4rKykge30KKyAgICBjb25zdCBzaXplX3QgZmlyc3RCaW5Ub1ByaW50ID0gZmlyc3ROb25aZXJvQmluID09IDAgPyAwIDogZmlyc3ROb25aZXJvQmluIC0gMTsKKworICAgIHNpemVfdCBsYXN0Tm9uWmVyb0JpbiA9IG1CaW5zLnNpemUoKSAtIDE7CisgICAgLy8gSWYgbGFzdE5vblplcm9CaW4gcmVhY2hlcyAwLCB0aGVuIGl0IG11c3QgYmUgYSBub256ZXJvIGJpbi4KKyAgICBmb3IgKDsgbGFzdE5vblplcm9CaW4gPiAwICYmIG1CaW5zW2xhc3ROb25aZXJvQmluXSA9PSAwOyBsYXN0Tm9uWmVyb0Jpbi0tKSB7fQorICAgIGNvbnN0IHNpemVfdCBsYXN0QmluVG9QcmludCA9IGxhc3ROb25aZXJvQmluID09IG1CaW5zLnNpemUoKSAtIDEgPyBsYXN0Tm9uWmVyb0JpbgorICAgICAgICAgICAgOiBsYXN0Tm9uWmVyb0JpbiArIDE7CisKKyAgICBmb3IgKHNpemVfdCBiaW4gPSBmaXJzdEJpblRvUHJpbnQ7IGJpbiA8PSBsYXN0QmluVG9QcmludDsgYmluKyspIHsKKyAgICAgICAgc3MgPDwgc3RkOjpzZXR3KGluZGVudCArIGtNYXhOdW1iZXJXaWR0aCk7CisgICAgICAgIGlmIChiaW4gPT0gMCkgeworICAgICAgICAgICAgc3MgPDwgIjwiOworICAgICAgICB9IGVsc2UgaWYgKGJpbiA9PSBtQmlucy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICBzcyA8PCAiPiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcyA8PCBtTG93ICsgKGJpbiAtIDEpICogbUJpblNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgIiB8IjsKKyAgICAgICAgc2l6ZV90IGluY3JlbWVudHMgPSAwOworICAgICAgICBjb25zdCB1aW50NjRfdCBiaW5Db3VudCA9IG1CaW5zW2Jpbl07CisgICAgICAgIGlmIChiaW5Db3VudCA+IDApIHsKKyAgICAgICAgICAgIGluY3JlbWVudHMgPSBsb2cyKGJpbkNvdW50KSArIDE7CisgICAgICAgICAgICBzcyA8PCBnZXRUYWlsKGluY3JlbWVudHMgKiBrTWFya2Vyc1BlckluY3JlbWVudCwga01hcmtlcnMpOworICAgICAgICB9CisgICAgICAgIHNzIDw8IGdldFRhaWwoKG1heEluY3JlbWVudHMgLSBpbmNyZW1lbnRzICsgMSkgKiBrTWFya2Vyc1BlckluY3JlbWVudCwga1NwYWNlcykKKyAgICAgICAgICAgICAgICA8PCBiaW5Db3VudCA8PCAiXG4iOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworCisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAvLyBHaXZlbiBhbiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXAsIGJ1Y2tldHMgdGhlIHRpbWUgaW50ZXJ2YWwKIC8vIHNpbmNlIHRoZSBwcmV2aW91cyB0aW1lc3RhbXAgaW50byBhIGhpc3RvZ3JhbSwgc2VhcmNoZXMgZm9yCiAvLyBvdXRsaWVycywgYW5hbHl6ZXMgdGhlIG91dGxpZXIgc2VyaWVzIGZvciB1bmV4cGVjdGVkbHkKQEAgLTIwOCwyNyArMzE3LDYgQEAKICAgICByZXR1cm4gaXNPdXRsaWVyOwogfQogCi1zdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIGlmICh4IDwgMCkgewotICAgICAgICB3aWR0aCsrOwotICAgICAgICB4ID0geCA9PSBJTlRfTUlOID8gSU5UX01BWCA6IC14OwotICAgIH0KLSAgICAvLyBhc3NlcnQgKHggPj0gMCkKLSAgICBkbyB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIHggLz0gMTA7Ci0gICAgfSB3aGlsZSAoeCA+IDApOwotICAgIHJldHVybiB3aWR0aDsKLX0KLQotLy8gY29tcHV0ZXMgdGhlIGNvbHVtbiB3aWR0aCByZXF1aXJlZCBmb3IgYSBzcGVjaWZpYyBoaXN0b2dyYW0gdmFsdWUKLWlubGluZSBpbnQgbnVtYmVyV2lkdGgoZG91YmxlIG51bWJlciwgaW50IGxlZnRQYWRkaW5nKSB7Ci0gICAgLy8gQWRkZWQgdmFsdWVzIGFjY291bnQgZm9yIHdoaXRlc3BhY2VzIG5lZWRlZCBhcm91bmQgbnVtYmVycywgYW5kIGZvciB0aGUKLSAgICAvLyBkb3QgYW5kIGRlY2ltYWwgZGlnaXQgbm90IGFjY291bnRlZCBmb3IgYnkgd2lkdGhPZgotICAgIHJldHVybiBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKHN0YXRpY19jYXN0PGludD4obnVtYmVyKSkgKyAzLCAyKSwgbGVmdFBhZGRpbmcgKyAxKTsKLX0KLQogLy8gcm91bmRzIHZhbHVlIHRvIHByZWNpc2lvbiBiYXNlZCBvbiBsb2ctZGlzdGFuY2UgZnJvbSBtZWFuCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiBpbmxpbmUgZG91YmxlIGxvZ1JvdW5kKGRvdWJsZSB4LCBkb3VibGUgbWVhbikgewpAQCAtMjU0LDcgKzM0Miw3IEBACiAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzCiB2b2lkIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnJlcG9ydFBlcmZvcm1hbmNlKFN0cmluZzggKmJvZHksIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCkgewotICAgIGlmIChtSGlzdHMuZW1wdHkoKSkgeworICAgIGlmIChtSGlzdHMuZW1wdHkoKSB8fCBib2R5ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjczLDY5ICszNjEsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHVuZGVyc2NvcmVzIGFuZCBzcGFjZXMgbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIG1heGltdW0gd2lkdGggb2YgaGlzdG9ncmFtCi0gICAgc3RhdGljIGNvbnN0IGludCBrTGVuID0gMjAwOwotICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7Ci0gICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7Ci0KLSAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOwotICAgIGRvdWJsZSBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKLSAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7Ci0gICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgewotICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgewotICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKLSAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKLSAgICBjb25zdCBpbnQgYnVja2V0V2lkdGggPSBudW1iZXJXaWR0aChtYXhEZWx0YSwgbGVmdFBhZGRpbmcpOwotICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKLSAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKLSAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7Ci0gICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKLSAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMgJTMuMmYgJXMiLCBsZWZ0UGFkZGluZyArIDExLAotICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMlZCwgJWxsZCwgJWxsZFxuIiwgbGVmdFBhZGRpbmcgKyAxMSwKKyAgICBzdGF0aWMgY29uc3QgaW50IFNJWkUgPSAxMjg7CisgICAgY2hhciB0aXRsZVtTSVpFXTsKKyAgICBzbnByaW50Zih0aXRsZSwgc2l6ZW9mKHRpdGxlKSwgIlxuJXMgJTMuMmYgJXNcbiVzJWQsICVsbGQsICVsbGRcbiIsCisgICAgICAgICAgICAiT2NjdXJyZW5jZXMgaW4iLCAoZWxhcHNlZE1zIC8ga01zUGVyU2VjKSwgInNlY29uZHMgb2YgYXVkaW86IiwKICAgICAgICAgICAgICJUaHJlYWQsIGhhc2gsIHN0YXJ0aW5nIHRpbWVzdGFtcDogIiwgYXV0aG9yLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KHN0YXJ0aW5nVHMpKTsKLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IDEgPDwgcm93OwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCBsZWZ0UGFkZGluZywgc3BhY2VzLmNfc3RyKCkpOwotICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICB9Ci0gICAgLy8gcHJpbnQgeC1heGlzCi0gICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBidWNrZXRXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oc3RhcnRpbmdUcykpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0xhYmVsID0gIm1zIjsKIAotICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOwotICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqLipmIiwgY29sV2lkdGgsIDEsIHguZmlyc3QpOwotICAgIH0KLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGJ1Y2tldFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiVzIiwKKyAgICAgICAgICAgIGF1ZGlvX3V0aWxzX3Bsb3RfaGlzdG9ncmFtKGJ1Y2tldHMsIHRpdGxlLCBrTGFiZWwsIG1heEhlaWdodCkuY19zdHIoKSk7CiAKICAgICAvLyBOb3cgcmVwb3J0IGdsaXRjaGVzCiAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbnRpbWUgZWxhcHNlZCBiZXR3ZWVuIGdsaXRjaGVzIGFuZCBnbGl0Y2ggdGltZXN0YW1wczpcbiIpOwpAQCAtMzUwLDcgKzM4NSw5IEBACiAvLyB3cml0ZXMgc3VtbWFyeSBvZiBwZXJmb3JtYW5jZSBpbnRvIHNwZWNpZmllZCBmaWxlIGRlc2NyaXB0b3IKIHZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQsIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgJnRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKICAgICBTdHJpbmc4IGJvZHk7CisjaWZkZWYgV1JJVEVfVE9fRklMRQogICAgIGNvbnN0IGNoYXIqIGNvbnN0IGtEaXJlY3RvcnkgPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci8iOworI2VuZGlmCiAgICAgZm9yIChhdXRvICYgdGhyZWFkIDogdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgewogICAgICAgICBmb3IgKGF1dG8gJiBoYXNoOiB0aHJlYWQuc2Vjb25kKSB7CiAgICAgICAgICAgICBQZXJmb3JtYW5jZUFuYWx5c2lzJiBjdXJyID0gaGFzaC5zZWNvbmQ7CkBAIC0zNjAsOSArMzk3LDExIEBACiAgICAgICAgICAgICAgICAgZHVtcExpbmUoZmQsIGluZGVudCwgYm9keSk7CiAgICAgICAgICAgICAgICAgYm9keS5jbGVhcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gd3JpdGUgdG8gZmlsZQorI2lmZGVmIFdSSVRFX1RPX0ZJTEUKKyAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUuIEVuYWJsZSBieSB1bmNvbW1lbnRpbmcgbWFjcm8gYXQgdG9wIG9mIGZpbGUuCiAgICAgICAgICAgICB3cml0ZVRvRmlsZShjdXJyLm1IaXN0cywgY3Vyci5tT3V0bGllckRhdGEsIGN1cnIubVBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAga0RpcmVjdG9yeSwgZmFsc2UsIHRocmVhZC5maXJzdCwgaGFzaC5maXJzdCk7CisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM3NCw1ICs0MTMsNCBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAgYi9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTMwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9SZWFkZXIuY3BwCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK1JlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgIDogbU5hbWUobmFtZSksCisgICAgICBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLworICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9SZWFkZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3JlYWRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IFJlYWRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUsIG5hbWUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitSZWFkZXI6On5SZWFkZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKKyAgICBkZWxldGUgbUZpZm87Cit9CisKKy8vIENvcGllcyBjb250ZW50IG9mIGEgUmVhZGVyIEZJRk8gaW50byBpdHMgU25hcHNob3QKKy8vIFRoZSBTbmFwc2hvdCBoYXMgdGhlIHNhbWUgcmF3IGRhdGEsIGJ1dCByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMKKy8vIGFuZCBhbiBFbnRyeUl0ZXJhdG9yIG1ha2luZyBpdCBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBkYXRhLgorc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBSZWFkZXI6OmdldFNuYXBzaG90KGJvb2wgZmx1c2gpCit7CisgICAgaWYgKG1GaWZvUmVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOworICAgIH0KKworICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQorICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCisgICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgorICAgIHNpemVfdCBsb3N0ID0gMDsKKyAgICBhdWRpb191dGlsc19pb3ZlYyBpb3ZlY1syXTsKKyAgICBjb25zdCBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKKyAgICBzc2l6ZV90IGF2YWlsVG9SZWFkOworICAgIC8vIEEgY2FsbCB0byBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6b2J0YWluKCkgcGxhY2VzIHRoZSByZWFkIHBvaW50ZXIgb25lIGJ1ZmZlciBsZW5ndGgKKyAgICAvLyBiZWZvcmUgdGhlIHdyaXRlcidzIHBvaW50ZXIgKHNpbmNlIG1GaWZvUmVhZGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGZsdXNoPWZhbHNlKS4gVGhlCisgICAgLy8gZG8gd2hpbGUgbG9vcCBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYWxsIG9mIHRoZSBGSUZPJ3MgY29udGVudHMgcmVnYXJkbGVzcyBvZiBob3cgYmVoaW5kCisgICAgLy8gdGhlIHJlYWRlciBpcyB3aXRoIHJlc3BlY3QgdG8gdGhlIHdyaXRlci4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBzY2hlZHVsaW5nIHNlcXVlbmNlIGlzCisgICAgLy8gcG9zc2libGUgYW5kIGNhbiBsZWFkIHRvIGEgc3RhcnZhdGlvbiBzaXR1YXRpb246CisgICAgLy8gLSBXcml0ZXIgVDEgd3JpdGVzLCBvdmVycnVuIHdpdGggcmVzcGVjdCB0byBSZWFkZXIgVDIKKyAgICAvLyAtIFQyIGNhbGxzIG9idGFpbigpIGFuZCBnZXRzIEVPVkVSRkxPVywgVDIgcHRyIHBsYWNlZCBvbmUgYnVmZmVyIHNpemUgYmVoaW5kIFQxIHB0cgorICAgIC8vIC0gVDEgd3JpdGUsIG92ZXJydW4KKyAgICAvLyAtIFQyIG9idGFpbigpLCBFT1ZFUkZMT1cgKGFuZCBzbyBvbi4uLikKKyAgICAvLyBUbyBhZGRyZXNzIHRoaXMgaXNzdWUsIHdlIGxpbWl0IHRoZSBudW1iZXIgb2YgdHJpZXMgZm9yIHRoZSByZWFkZXIgdG8gY2F0Y2ggdXAgd2l0aAorICAgIC8vIHRoZSB3cml0ZXIuCisgICAgaW50IHRyaWVzID0gMDsKKyAgICBzaXplX3QgbG9zdFRlbXA7CisgICAgZG8geworICAgICAgICBhdmFpbFRvUmVhZCA9IG1GaWZvUmVhZGVyLT5vYnRhaW4oaW92ZWMsIGNhcGFjaXR5LCBOVUxMIC8qdGltZW91dCovLCAmbG9zdFRlbXApOworICAgICAgICBsb3N0ICs9IGxvc3RUZW1wOworICAgIH0gd2hpbGUgKGF2YWlsVG9SZWFkIDwgMCB8fCArK3RyaWVzIDw9IGtNYXhPYnRhaW5Ucmllcyk7CisKKyAgICBpZiAoYXZhaWxUb1JlYWQgPD0gMCkgeworICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCA8IDAsICJOQkxvZyBSZWFkZXIgJXMgZmFpbGVkIHRvIGNhdGNoIHVwIHdpdGggV3JpdGVyIiwgbU5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICAvLyBDaGFuZ2UgdG8gI2lmIDEgZm9yIGRlYnVnZ2luZy4gVGhpcyBzdGF0ZW1lbnQgaXMgdXNlZnVsIGZvciBjaGVja2luZyBidWZmZXIgZnVsbG5lc3MgbGV2ZWxzCisgICAgLy8gKGFzIHNlZW4gYnkgcmVhZGVyKSBhbmQgaG93IG11Y2ggZGF0YSB3YXMgbG9zdC4gSWYgeW91IGZpbmQgdGhhdCB0aGUgZnVsbG5lc3MgbGV2ZWwgaXMKKyAgICAvLyBnZXR0aW5nIGNsb3NlIHRvIGZ1bGwsIG9yIHRoYXQgZGF0YSBsb3NzIGlzIGhhcHBlbmluZyB0byBvZnRlbiwgdGhlbiB5b3Ugc2hvdWxkCisgICAgLy8gcHJvYmFibHkgdHJ5IHNvbWUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAvLyAtIGxvZyBsZXNzIGRhdGEKKyAgICAvLyAtIGxvZyBsZXNzIG9mdGVuCisgICAgLy8gLSBpbmNyZWFzZSB0aGUgaW5pdGlhbCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBidWZmZXIKKyNpZiAwCisgICAgQUxPR0QoImdldFNuYXBzaG90IG5hbWU9JXMsIGF2YWlsVG9SZWFkPSV6ZCwgY2FwYWNpdHk9JXp1LCBmdWxsbmVzcz0lLjNmLCBsb3N0PSV6dSIsCisgICAgICAgICAgICBuYW1lKCkuY19zdHIoKSwgYXZhaWxUb1JlYWQsIGNhcGFjaXR5LCAoZG91YmxlKWF2YWlsVG9SZWFkIC8gKGRvdWJsZSljYXBhY2l0eSwgbG9zdCk7CisjZW5kaWYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOworICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOworICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgeworICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAorICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzFdLm1PZmZzZXQsIGlvdmVjWzFdLm1MZW5ndGgpOworICAgIH0KKworICAgIC8vIEhhbmRsZSBjb3JydXB0ZWQgYnVmZmVyCisgICAgLy8gUG90ZW50aWFsbHksIGEgYnVmZmVyIGhhcyBjb3JydXB0ZWQgZGF0YSBvbiBib3RoIGJlZ2lubmluZyAoZHVlIHRvIG92ZXJmbG93KSBhbmQgZW5kCisgICAgLy8gKGR1ZSB0byBpbmNvbXBsZXRlIGZvcm1hdCBlbnRyeSkuIEJ1dCBldmVuIGlmIHRoZSBlbmQgZm9ybWF0IGVudHJ5IGlzIGluY29tcGxldGUsCisgICAgLy8gaXQgZW5kcyBpbiBhIGNvbXBsZXRlIGVudHJ5ICh3aGljaCBpcyBub3QgYW4gRk1UX0VORCkuIFNvIGlzIHNhZmUgdG8gdHJhdmVyc2UgYmFja3dhcmRzLgorICAgIC8vIFRPRE86IGhhbmRsZSBjbGllbnQgY29ycnVwdGlvbiAoaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlcikKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJhY2sgPSBzbmFwc2hvdC0+bURhdGEgKyBhdmFpbFRvUmVhZDsKKyAgICBjb25zdCB1aW50OF90ICpmcm9udCA9IHNuYXBzaG90LT5tRGF0YTsKKworICAgIC8vIEZpbmQgbGFzdCBGTVRfRU5ELiA8YmFjaz4gaXMgc2l0dGluZyBvbiBhbiBlbnRyeSB3aGljaCBtaWdodCBiZSB0aGUgbWlkZGxlIG9mIGEgRm9ybWF0RW50cnkuCisgICAgLy8gV2UgZ28gYmFja3dhcmRzIHVudGlsIHdlIGZpbmQgYW4gRVZFTlRfRk1UX0VORC4KKyAgICBjb25zdCB1aW50OF90ICpsYXN0RW5kID0gZmluZExhc3RWYWxpZEVudHJ5KGZyb250LCBiYWNrLCBpbnZhbGlkRW5kVHlwZXMpOworICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEZNVF9FTkQgZW50cnkKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKKyAgICAgICAgLy8gZmluZCBmaXJzdCBGTVRfU1RBUlQKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RWYWxpZEVudHJ5KGZyb250LCBmaXJzdFN0YXJ0VG1wLCBpbnZhbGlkQmVnaW5UeXBlcykpCisgICAgICAgICAgICAgICAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZmlyc3RTdGFydCA9IGZpcnN0U3RhcnRUbXA7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmlyc3RTdGFydCBpcyBudWxsIGlmIG5vIEZNVF9TVEFSVCBlbnRyeSB3YXMgZm91bmQgYmVmb3JlIGxhc3RFbmQKKyAgICAgICAgaWYgKGZpcnN0U3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IHNuYXBzaG90LT5tRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZmlyc3RTdGFydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhZHZhbmNlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIGxhc3QgZW50cnkgcmVhZC4KKyAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7CisgICAgfQorCisgICAgc25hcHNob3QtPm1Mb3N0ID0gbG9zdDsKKyAgICByZXR1cm4gc25hcHNob3Q7Cit9CisKK2Jvb2wgUmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOworfQorCisvLyBXZSBtYWtlIGEgc2V0IG9mIHRoZSBpbnZhbGlkIHR5cGVzIHJhdGhlciB0aGFuIHRoZSB2YWxpZCB0eXBlcyB3aGVuIGFsaWduaW5nCisvLyBTbmFwc2hvdCBFbnRyeUl0ZXJhdG9ycyB0byB2YWxpZCBlbnRyaWVzIGR1cmluZyBsb2cgY29ycnVwdGlvbiBjaGVja2luZy4KKy8vIFRoaXMgaXMgZG9uZSBpbiBvcmRlciB0byBhdm9pZCB0aGUgbWFpbnRlbmFuY2Ugb3ZlcmhlYWQgb2YgYWRkaW5nIGEgbmV3IEV2ZW50CisvLyB0eXBlIHRvIHRoZSB0d28gc2V0cyBiZWxvdyB3aGVuZXZlciBhIG5ldyBFdmVudCB0eXBlIGlzIGNyZWF0ZWQsIGFzIGl0IGlzCisvLyB2ZXJ5IGxpa2VseSB0aGF0IG5ldyB0eXBlcyBhZGRlZCB3aWxsIGJlIHZhbGlkIHR5cGVzLgorLy8gQ3VycmVudGx5LCBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgc3BlY2lhbAorLy8gY2FzZSBvZiBhIEZvcm1hdCBFbnRyeSwgd2hpY2ggY29uc2lzdHMgb2YgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc2ltcGxlIGxvZyBlbnRyaWVzLgorLy8gSWYgYSBuZXcgRXZlbnQgaXMgYWRkZWQgdGhhdCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBzaW1wbGUgbG9nIGVudHJpZXMsCisvLyB0aGVuIHRoZXNlIHNldHMgbmVlZCB0byBiZSB1cGRhdGVkLgorCisvLyBXZSB3YW50IHRoZSBiZWdpbm5pbmcgb2YgYSBTbmFwc2hvdCB0byBwb2ludCB0byBhbiBlbnRyeSB0aGF0IGlzIG5vdCBpbgorLy8gdGhlIG1pZGRsZSBvZiBhIGZvcm1hdHRlZCBlbnRyeSBhbmQgbm90IGFuIEZNVF9FTkQuCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IFJlYWRlcjo6aW52YWxpZEJlZ2luVHlwZXMgeworICAgIEVWRU5UX0ZNVF9BVVRIT1IsCisgICAgRVZFTlRfRk1UX0VORCwKKyAgICBFVkVOVF9GTVRfRkxPQVQsCisgICAgRVZFTlRfRk1UX0hBU0gsCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgRVZFTlRfRk1UX1BJRCwKKyAgICBFVkVOVF9GTVRfU1RSSU5HLAorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsCit9OworCisvLyBXZSB3YW50IHRoZSBlbmQgb2YgYSBTbmFwc2hvdCB0byBwb2ludCB0byBhbiBlbnRyeSB0aGF0IGlzIG5vdCBpbgorLy8gdGhlIG1pZGRsZSBvZiBhIGZvcm1hdHRlZCBlbnRyeSBhbmQgbm90IGEgRk1UX1NUQVJULgorY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBSZWFkZXI6OmludmFsaWRFbmRUeXBlcyB7CisgICAgRVZFTlRfRk1UX0FVVEhPUiwKKyAgICBFVkVOVF9GTVRfRkxPQVQsCisgICAgRVZFTlRfRk1UX0hBU0gsCisgICAgRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgRVZFTlRfRk1UX1BJRCwKKyAgICBFVkVOVF9GTVRfU1RBUlQsCisgICAgRVZFTlRfRk1UX1NUUklORywKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLAorfTsKKworY29uc3QgdWludDhfdCAqUmVhZGVyOjpmaW5kTGFzdFZhbGlkRW50cnkoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+ICZpbnZhbGlkVHlwZXMpIHsKKyAgICBpZiAoZnJvbnQgPT0gbnVsbHB0ciB8fCBiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHdoaWxlIChiYWNrICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldCA+PSBmcm9udCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwcmV2ID0gYmFjayAtIGJhY2tbRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gLSBFbnRyeTo6a092ZXJoZWFkOworICAgICAgICBjb25zdCBFdmVudCB0eXBlID0gKGNvbnN0IEV2ZW50KXByZXZbb2Zmc2V0b2YoZW50cnksIHR5cGUpXTsKKyAgICAgICAgaWYgKHByZXYgPCBmcm9udAorICAgICAgICAgICAgICAgIHx8IHByZXYgKyBwcmV2W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaworICAgICAgICAgICAgICAgIHx8IHR5cGUgPD0gRVZFTlRfUkVTRVJWRUQgfHwgdHlwZSA+PSBFVkVOVF9VUFBFUl9CT1VORCkgeworICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIGlmIGludmFsaWRUeXBlcyBkb2VzIG5vdCBjb250YWluIHRoZSB0eXBlLCB0aGVuIHRoZSB0eXBlIGlzIHZhbGlkLgorICAgICAgICBpZiAoaW52YWxpZFR5cGVzLmZpbmQodHlwZSkgPT0gaW52YWxpZFR5cGVzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICAgICAgfQorICAgICAgICBiYWNrID0gcHJldjsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCit9CisKKy8vIFRPRE8gZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5LCB3b3VsZCBwcmVmZXIgdG8gaGF2ZSBhIGR1bXAoKSBnbyB0byBzdHJpbmcsIGFuZCB0aGVuIGdvCisvLyB0byBmZCBvbmx5IHdoZW4gaW52b2tlZCB0aHJvdWdoIGJpbmRlci4KK3ZvaWQgRHVtcFJlYWRlcjo6ZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQpCit7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QgPSBnZXRTbmFwc2hvdChmYWxzZSAvKmZsdXNoKi8pOworICAgIGlmIChzbmFwc2hvdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisKKyAgICAvLyBUT0RPIGFsbCBsb2dnZWQgdHlwZXMgc2hvdWxkIGhhdmUgYSBwcmludGFibGUgZm9ybWF0LgorICAgIC8vIFRPRE8gY2FuIHdlIG1ha2UgdGhlIHByaW50aW5nIGdlbmVyaWM/CisgICAgZm9yIChFbnRyeUl0ZXJhdG9yIGl0ID0gc25hcHNob3QtPmJlZ2luKCk7IGl0ICE9IHNuYXBzaG90LT5lbmQoKTsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfRk1UX1NUQVJUOgorICAgICAgICAgICAgaXQgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoaXQpLCAmdGltZXN0YW1wLCAmYm9keSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9MQVRFTkNZOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gaXQucGF5bG9hZDxkb3VibGU+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfTEFURU5DWSwlLjNmIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9PVkVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX09WRVJSVU4sJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odHMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfSU5GTzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX2luZm9fdCBpbmZvID0gaXQucGF5bG9hZDx0aHJlYWRfaW5mb190PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1RIUkVBRF9JTkZPLCVkLCVzIiwgc3RhdGljX2Nhc3Q8aW50PihpbmZvLmlkKSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkVHlwZVRvU3RyaW5nKGluZm8udHlwZSkpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1VOREVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1VOREVSUlVOLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRzKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfV0FSTVVQX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0aW1lTXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9XQVJNVVBfVElNRSwlLjNmIiwgdGltZU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XT1JLX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbW9ub3RvbmljTnMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfV09SS19USU1FLCVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1vbm90b25pY05zKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX1BBUkFNUzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX3BhcmFtc190IHBhcmFtcyA9IGl0LnBheWxvYWQ8dGhyZWFkX3BhcmFtc190PigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1RIUkVBRF9QQVJBTVMsJXp1LCV1IiwgcGFyYW1zLmZyYW1lQ291bnQsIHBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9GTVRfRU5EOgorICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEVWRU5UX1VQUEVSX0JPVU5EOgorICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBpdC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIlLipzJXMgJXNcbiIsIChpbnQpaW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXAuY2xlYXIoKTsKKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3IgRHVtcFJlYWRlcjo6aGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKKyAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KQoreworICAgIC8vIGxvZyB0aW1lc3RhbXAKKyAgICBjb25zdCBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7CisgICAgdGltZXN0YW1wLT5jbGVhcigpOworICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKKworICAgIC8vIGxvZyB1bmlxdWUgaGFzaAorICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKKyAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKKworICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCisgICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKKworICAgIC8vIGxvZyBzdHJpbmcKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKKworICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOworICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7CisKKyAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgeworICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJSUiIgorICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiVcMCIKKyAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBFdmVudCBldmVudCA9IChFdmVudCkgYXJnLT50eXBlOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAorCisgICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncworICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9GTE9BVCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9QSUQsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOworICAgICAgICB9CisgICAgICAgICsrYXJnOworICAgIH0KKyAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRk1UX0VORCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7CisgICAgcmV0dXJuIGFyZzsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vaW50IHggPSAqKChpbnQqKSBkYXRhKTsKKyAgICBpbnQgeDsKKyAgICBtZW1jcHkoJngsIGRhdGEsIHNpemVvZih4KSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsb2F0IGY7CisgICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZikpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOworICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQ2NF90IHRzOworICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIFN0cmluZzggc3RyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJbICIpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzdHI7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKK3sKKyAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAppbmRleCA4MjdlNzMxLi5mNjMyZTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCkBAIC0xNSw5ICsxNSwxMSBAQAogICovCiAKICNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTI3LDIzICsyOSwxOTUgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZHVtcFRvSnNvbihjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiByb290UHRyID0gc3RkOjptYWtlX3VuaXF1ZTxKc29uOjpWYWx1ZT4oSnNvbjo6b2JqZWN0VmFsdWUpOworICAgIEpzb246OlZhbHVlJiByb290ID0gKnJvb3RQdHI7CisgICAgcm9vdFsiaW9IYW5kbGUiXSA9IGRhdGEudGhyZWFkSW5mby5pZDsKKyAgICByb290WyJ0eXBlIl0gPSBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKTsKKyAgICByb290WyJmcmFtZUNvdW50Il0gPSAoSnNvbjo6VmFsdWU6OkludClkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50OworICAgIHJvb3RbInNhbXBsZVJhdGUiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGU7CisgICAgcm9vdFsid29ya01zSGlzdCJdID0gZGF0YS53b3JrSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbImxhdGVuY3lNc0hpc3QiXSA9IGRhdGEubGF0ZW5jeUhpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJ3YXJtdXBNc0hpc3QiXSA9IGRhdGEud2FybXVwSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbInVuZGVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLnVuZGVycnVuczsKKyAgICByb290WyJvdmVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLm92ZXJydW5zOworICAgIHJvb3RbImFjdGl2ZU1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKGRhdGEuYWN0aXZlKTsKKyAgICByb290WyJkdXJhdGlvbk1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpOworICAgIHJldHVybiByb290UHRyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhpc3RvZ3JhbXNUb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICBzcyA8PCAiVGhyZWFkIHR5cGU9IiA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKQorICAgICAgICAgICAgPDwgIiBoYW5kbGU9IiA8PCBkYXRhLnRocmVhZEluZm8uaWQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlUmF0ZT0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGUKKyAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudD0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQgPDwgIlxuIjsKKyAgICBzcyA8PCAiICBUaHJlYWQgd29yayB0aW1lcyBpbiBtczpcbiIgPDwgZGF0YS53b3JrSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCBsYXRlbmNpZXMgaW4gbXM6XG4iIDw8IGRhdGEubGF0ZW5jeUhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICBzcyA8PCAiICBUaHJlYWQgd2FybXVwIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndhcm11cEhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcEpzb24oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSnNvbjo6VmFsdWUgcm9vdChKc29uOjphcnJheVZhbHVlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgLy8gU2tpcCB0aHJlYWRzIHRoYXQgZG8gbm90IGhhdmUgcGVyZm9ybWFuY2UgZGF0YSByZWNvcmRlZCB5ZXQuCisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZGF0YUpzb24gPSBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFRvSnNvbihkYXRhKTsKKyAgICAgICAgaWYgKGRhdGFKc29uID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICgqZGF0YUpzb24pWyJ0aHJlYWROdW0iXSA9IGl0ZW0uZmlyc3Q7CisgICAgICAgIHJvb3QuYXBwZW5kKCpkYXRhSnNvbik7CisgICAgfQorICAgIEpzb246OlN0eWxlZFdyaXRlciB3cml0ZXI7CisgICAgc3RkOjpzdHJpbmcgcm9vdFN0ciA9IHdyaXRlci53cml0ZShyb290KTsKKyAgICB3cml0ZShmZCwgcm9vdFN0ci5jX3N0cigpLCByb290U3RyLnNpemUoKSk7Cit9CisKK3ZvaWQgZHVtcFBsb3RzKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBoaXN0cyA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGRhdGEpOworICAgICAgICB3cml0ZShmZCwgaGlzdHMuY19zdHIoKSwgaGlzdHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wUmV0cm9TdHJpbmcoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhLCBpbnQ2NF90IG5vdykKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKSA8PCAiLCIgPDwgZGF0YS50aHJlYWRJbmZvLmlkIDw8ICJcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogZGF0YS5zbmFwc2hvdHMpIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgYW4gZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBtZXRob2QuIE9uZSBnb29kIGlkZWE6CisgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMzgxNTcKKyAgICAgICAgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX1VOREVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfVU5ERVJSVU4sIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpcnN0ID09IE5CTG9nOjpFVkVOVF9PVkVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfT1ZFUlJVTiwiOworICAgICAgICB9CisgICAgICAgIHNzIDw8IG5vdyAtIGl0ZW0uc2Vjb25kIDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIGR1bXBSZXRybyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJldHJvU3RyID0gZHVtcFJldHJvU3RyaW5nKGRhdGEsIG5vdyk7CisgICAgICAgIHdyaXRlKGZkLCByZXRyb1N0ci5jX3N0cigpLCByZXRyb1N0ci5zaXplKCkpOworICAgIH0KK30KKworYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBtZXRyaWNzIGhlcmU6CisgICAgLy8gZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMTEtLTZkeU9YVk9wYWNZUUxaaWFPWTVRVnRRalV5cU54MnpUOWNDekxLWUUvZWRpdD91c3A9c2hhcmluZworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRGcmFtZUNvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5mcmFtZWNvdW50IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkV29ya0hpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndvcmtNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZExhdGVuY3lIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5sYXRlbmN5TXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXYXJtdXBIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC53YXJtdXBNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFVuZGVycnVuc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudW5kZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZE92ZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5vdmVycnVucyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRBY3RpdmVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmFjdGl2ZU1zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5kdXJhdGlvbk1zIjsKKworICAgIC8vIEN1cnJlbnRseSwgd2Ugb25seSBhbGxvdyBGYXN0TWl4ZXIgdGhyZWFkIGRhdGEgdG8gYmUgc2VudCB0byBNZWRpYSBNZXRyaWNzLgorICAgIGlmIChkYXRhLnRocmVhZEluZm8udHlwZSAhPSBOQkxvZzo6RkFTVE1JWEVSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvdGhyZWFkIikpOworCisgICAgY29uc3QgSGlzdG9ncmFtICZ3b3JrSGlzdCA9IGRhdGEud29ya0hpc3Q7CisgICAgaWYgKHdvcmtIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV29ya0hpc3QsIHdvcmtIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZsYXRlbmN5SGlzdCA9IGRhdGEubGF0ZW5jeUhpc3Q7CisgICAgaWYgKGxhdGVuY3lIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkTGF0ZW5jeUhpc3QsIGxhdGVuY3lIaXN0LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgY29uc3QgSGlzdG9ncmFtICZ3YXJtdXBIaXN0ID0gZGF0YS53YXJtdXBIaXN0OworICAgIGlmICh3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrVGhyZWFkV2FybXVwSGlzdCwgd2FybXVwSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChkYXRhLnVuZGVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZFVuZGVycnVucywgZGF0YS51bmRlcnJ1bnMpOworICAgIH0KKworICAgIGlmIChkYXRhLm92ZXJydW5zID4gMCkgeworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkT3ZlcnJ1bnMsIGRhdGEub3ZlcnJ1bnMpOworICAgIH0KKworICAgIC8vIFNlbmQgdG8gTWVkaWEgTWV0cmljcyBpZiB0aGUgcmVjb3JkIGlzIG5vdCBlbXB0eS4KKyAgICAvLyBUaGUgdGhyZWFkIGFuZCB0aW1lIGluZm8gYXJlIGFkZGVkIGluc2lkZSB0aGUgaWYgc3RhdGVtZW50IGJlY2F1c2UKKyAgICAvLyB3ZSB3YW50IHRvIHNlbmQgdGhlbSBvbmx5IGlmIHRoZXJlIGFyZSBwZXJmb3JtYW5jZSBtZXRyaWNzIHRvIHNlbmQuCisgICAgaWYgKGl0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgIC8vIEFkZCB0aHJlYWQgaW5mbyBmaWVsZHMuCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlU3RyaW5nID0gTkJMb2c6OnRocmVhZFR5cGVUb1N0cmluZyhkYXRhLnRocmVhZEluZm8udHlwZSk7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFR5cGUsIHR5cGVTdHJpbmcpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkRnJhbWVDb3VudCwgZGF0YS50aHJlYWRQYXJhbXMuZnJhbWVDb3VudCk7CisgICAgICAgIGl0ZW0tPnNldEludDMyKGtUaHJlYWRTYW1wbGVSYXRlLCBkYXRhLnRocmVhZFBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQWRkIHRpbWUgaW5mbyBmaWVsZHMuCisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRBY3RpdmUsIGRhdGEuYWN0aXZlIC8gMTAwMDAwMCk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWREdXJhdGlvbiwgKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpIC8gMTAwMDAwMCk7CisgICAgICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVE9ETzogdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGV4dHJhY3QgbG9naWMgZnJvbSB3cml0ZVRvRmlsZQogLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkyNzk2MjAKIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUgaW50ZXJ2YWxzIHRvIGZpbGUuCiAvLyBUT0RPOiB3cml0ZSBkYXRhIGluIGJpbmFyeSBmb3JtYXQKLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKSB7CkBAIC0xMjgsNiArMzAyLDUgQEAKICAgICBwZnMuY2xvc2UoKTsKIH0KIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5YjAzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1RpbWVsaW5lLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKyNpZiAwICAgLy8gRklYTUUgc2VlIG5vdGUgaW4gVGltZWxpbmUuaAorTkJMb2c6OlRpbWVsaW5lOjpUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkKQorICAgIDogbVNpemUocm91bmR1cChzaXplKSksIG1Pd24oc2hhcmVkID09IE5VTEwpLAorICAgICAgbVNoYXJlZCgoU2hhcmVkICopIChtT3duID8gbmV3IGNoYXJbc2hhcmVkU2l6ZShzaXplKV0gOiBzaGFyZWQpKQoreworICAgIG5ldyAobVNoYXJlZCkgU2hhcmVkOworfQorCitOQkxvZzo6VGltZWxpbmU6On5UaW1lbGluZSgpCit7CisgICAgbVNoYXJlZC0+flNoYXJlZCgpOworICAgIGlmIChtT3duKSB7CisgICAgICAgIGRlbGV0ZVtdIChjaGFyICopIG1TaGFyZWQ7CisgICAgfQorfQorI2VuZGlmCisKKy8qc3RhdGljKi8KK3NpemVfdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCisgICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9Xcml0ZXIuY3BwIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTNiZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcApAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTkJMb2ciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvVGltZWxpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9Xcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitXcml0ZXI6OldyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKSwKKyAgICAgIG1FbmFibGVkKG1GaWZvV3JpdGVyICE9IE5VTEwpCit7CisgICAgLy8gY2FjaGluZyBwaWQgYW5kIHByb2Nlc3MgbmFtZQorICAgIHBpZF90IGlkID0gOjpnZXRwaWQoKTsKKyAgICBjaGFyIHByb2NOYW1lWzE2XTsKKyAgICBpbnQgc3RhdHVzID0gcHJjdGwoUFJfR0VUX05BTUUsIHByb2NOYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7ICAvLyBlcnJvciBnZXR0aW5nIHByb2Nlc3MgbmFtZQorICAgICAgICBwcm9jTmFtZVswXSA9ICdcMCc7CisgICAgfQorICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4ocHJvY05hbWUpOworICAgIG1QaWRUYWdTaXplID0gbGVuZ3RoICsgc2l6ZW9mKHBpZF90KTsKKyAgICBtUGlkVGFnID0gbmV3IGNoYXJbbVBpZFRhZ1NpemVdOworICAgIG1lbWNweShtUGlkVGFnLCAmaWQsIHNpemVvZihwaWRfdCkpOworICAgIG1lbWNweShtUGlkVGFnICsgc2l6ZW9mKHBpZF90KSwgcHJvY05hbWUsIGxlbmd0aCk7Cit9CisKK1dyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitXcml0ZXI6On5Xcml0ZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKKyAgICBkZWxldGUgbUZpZm87CisgICAgZGVsZXRlW10gbVBpZFRhZzsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaW5nID09IE5VTEwsICJBdHRlbXB0ZWQgdG8gbG9nIE5VTEwgc3RyaW5nIik7CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihzdHJpbmcpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUUklORywgc3RyaW5nLCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGlmICghY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykpIHsKKyAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgaGFzaCk7CisgICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBIaXN0VHNFbnRyeSBkYXRhOworICAgIGRhdGEuaGFzaCA9IGhhc2g7CisgICAgZGF0YS50cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAoZGF0YS50cyA+IDApIHsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK2Jvb2wgV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworYm9vbCBXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKKyAgICByZXR1cm4gb2xkOworfQorCit2b2lkIFdyaXRlcjo6bG9nKGNvbnN0IEVudHJ5ICZldHIsIGJvb2wgdHJ1c3RlZCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF0cnVzdGVkKSB7CisgICAgICAgIGxvZyhldHIubUV2ZW50LCBldHIubURhdGEsIGV0ci5tTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgbmVlZCA9IGV0ci5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCisKKyAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCisgICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KKyAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKKyAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKKyAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7CisgICAgICAgIHRlbXBbaV0gPSBldHIuY29weUVudHJ5RGF0YUF0KGkpOworICAgIH0KKyAgICAvLyB3cml0ZSB0byBjaXJjdWxhciBidWZmZXIKKyAgICBtRmlmb1dyaXRlci0+d3JpdGUodGVtcCwgbmVlZCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkYXRhID09IE5VTEwgfHwgbGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgLy8gVE9ETyBQZXJoYXBzIGl0IG1ha2VzIHNlbnNlIHRvIGRpc3BsYXkgdHJ1bmNhdGVkIGRhdGEgb3IgYXQgbGVhc3QgYQorICAgICAgICAvLyAgICAgIG1lc3NhZ2UgdGhhdCB0aGUgZGF0YSBpcyB0b28gbG9uZz8gIFRoZSBjdXJyZW50IGJlaGF2aW9yIGNhbiBjcmVhdGUKKyAgICAgICAgLy8gICAgICBhIGNvbmZ1c2lvbiBmb3IgYSBwcm9ncmFtbWVyIGRlYnVnZ2luZyB0aGVpciBjb2RlLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElnbm9yZSBpZiBpbnZhbGlkIGV2ZW50CisgICAgaWYgKGV2ZW50ID09IEVWRU5UX1JFU0VSVkVEIHx8IGV2ZW50ID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRW50cnkgZXRyKGV2ZW50LCBkYXRhLCBsZW5ndGgpOworICAgIGxvZyhldHIsIHRydWUgLyp0cnVzdGVkKi8pOworfQorCit2b2lkIFdyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107CisgICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKKyAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7CisgICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKKyAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkgeworICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfRk1UX1NUQVJULCBmbXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2dUaW1lc3RhbXBGb3JtYXQoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBuc2Vjc190IHRzID0gc3lzdGVtVGltZSgpOworICAgIGlmICh0cyA+IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7CisgICAgaW50IGk7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICBjaGFyKiBzOworICAgIHNpemVfdCBsZW5ndGg7CisgICAgaW50NjRfdCB0OworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgbG9nKEVWRU5UX0ZNVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCisgICAgICAgIGlmICgqcCAhPSAnJScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCgqKytwKSB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9TVFJJTkcsIHMsIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICB0ID0gdmFfYXJnKGFyZ3AsIGludDY0X3QpOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9USU1FU1RBTVAsICZ0LCBzaXplb2YodCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfSU5URUdFUiwgJmksIHNpemVvZihpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIGQgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCisgICAgICAgICAgICBmID0gKGZsb2F0KWQ7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0ZMT0FULCAmZiwgc2l6ZW9mKGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFbnRyeSBldHIoRVZFTlRfRk1UX0VORCwgbnVsbHB0ciwgMCk7CisgICAgbG9nKGV0ciwgdHJ1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQorICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKK3sKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKK30KKworYm9vbCBMb2NrZWRXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6c2V0RW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBMb2NrZWRXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2coZW50cnksIHRydXN0ZWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FbnRyeS5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKKy8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQorc3RydWN0IGVudHJ5IHsKKyAgICBjb25zdCB1aW50OF90IHR5cGU7CisgICAgY29uc3QgdWludDhfdCBsZW5ndGg7CisgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOworfTsKKworLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKK3N0cnVjdCBlbmRpbmcgeworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgbmV4dFswXTsKK307CisKKy8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5CisvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKKy8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKKy8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCisvLyAgLi4uCisvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQorLy8gIC4uLgorLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQorLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCisvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQorY2xhc3MgRW50cnkgeworcHVibGljOgorICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkge30KKyAgICB+RW50cnkoKSB7fQorCisgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KKyAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV3JpdGVyOworICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKKyAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAorICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKK3B1YmxpYzoKKyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7CisgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQorICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKworICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Cit9OworCisvLyBlbnRyeSBpdGVyYXRvcgorY2xhc3MgRW50cnlJdGVyYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNlZCBmb3IgZHVtbXkgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQKKyAgICAvLyBFbnRyeUl0ZXJhdG9yIG90aGVyIHRoYW4gYXNzaWduaW5nIGl0IHRvIGFub3RoZXIgdmFsaWQgRW50cnlJdGVyYXRvcgorICAgIC8vIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBFbnRyeUl0ZXJhdG9yKCk7CisgICAgLy8gQ2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGVudHJ5IGlzIG5vdCBudWxscHRyLgorICAgIC8vIFBhc3NpbmcgaW4gbnVsbHB0ciBjYW4gcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKKworICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKKyAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKKyAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yJiAgb3BlcmF0b3IrKygpOyAvLyArK2kKKyAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCisgICAgLy8gcmV0dXJucyBhbiBFbnRyeUl0ZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5leHQgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgbmV4dCgpIGNvbnN0OworICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgICBwcmV2KCkgY29uc3Q7CisgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7CisKKyAgICAvLyBtZW1jcHkgcHJlZmVycmVkIHRvIHJlaW50ZXJwcmV0X2Nhc3QgdG8gYXZvaWQgcG90ZW50aWFsbHkgdW5zdXBwb3J0ZWQKKyAgICAvLyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzcy4KKyNpZiAwCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKKyAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4obVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7CisgICAgfQorI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUIHBheWxvYWQoKSBjb25zdCB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIk5CTG9nOjpFbnRyeUl0ZXJhdG9yIHBheWxvYWQgbXVzdCBiZSB0cml2aWFsbHkgY29weWFibGUsIG5vbi1wb2ludGVyIHR5cGUuIik7CisgICAgICAgIFQgcGF5bG9hZDsKKyAgICAgICAgbWVtY3B5KCZwYXlsb2FkLCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBzaXplb2YocGF5bG9hZCkpOworICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICB9CisjZW5kaWYKKworICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgICptUHRyOyAgIC8vIFNob3VsZCBub3QgYmUgbnVsbHB0ciBleGNlcHQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgdXNlZCBmb3IgbWVyZ2luZyBpbnRvIHRoZSBNZXJnZXIncyBidWZmZXIuCisKK2NsYXNzIEFic3RyYWN0RW50cnkgeworcHVibGljOgorICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQorCisgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwdHIuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIHZpcnR1YWwgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCA9IDA7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKKworICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKKyAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlciwgd2hpY2ggc2hhbGwgbm90IGJlIG51bGxwdHIuCisgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHt9CisgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5CisgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IG1FbnRyeTsKK307CisKKy8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKKworLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorLy8gICAgKiBGTVRfU1RBUlQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKKy8vICAgICogVElNRVNUQU1QIGVudHJ5CisvLyAgICAqIEhBU0ggZW50cnkKKy8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCisvLyAgICAqIGZvcm1hdCBhcmcxCisvLyAgICAqIGZvcm1hdCBhcmcyCisvLyAgICAqIC4uLgorLy8gICAgKiBGTVRfRU5EIGVudHJ5CitjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CisgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5Gb3JtYXRFbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZworICAgIGNvbnN0IGNoYXIqICAgZm9ybWF0U3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCisgICAgc2l6ZV90ICAgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKKworICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZ3MoKSBjb25zdDsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9CisgICAgfkhpc3RvZ3JhbUVudHJ5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgaW50NjRfdCAgICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGxvZ19oYXNoX3QgICAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgIEVudHJ5SXRlcmF0b3IgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX0VOVFJZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRXZlbnRzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTRmZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBUT0RPIGhhdmUgYSBjb21tZW50IHNvbWV3aGVyZSBleHBsYWluaW5nIHRoZSB3aG9sZSBwcm9jZXNzIGZvciBhZGRpbmcgYSBuZXcgRVZFTlRfCisKKy8vIE5CTG9nIEV2ZW50IHR5cGVzLiBUaGUgRXZlbnRzIGFyZSBuYW1lZCB0byBwcm92aWRlIGNvbnRleHR1YWwgbWVhbmluZyBmb3Igd2hhdCBpcyBsb2dnZWQuCisvLyBJZiBhZGRpbmcgYSBuZXcgc3RhbmRhbG9uZSBFdmVudCBoZXJlLCB1cGRhdGUgdGhlIGV2ZW50LXRvLXR5cGUgbWFwcGluZyBieSBhZGRpbmcgYQorLy8gTUFQX0VWRU5UX1RPX1RZUEUgc3RhdGVtZW50IGJlbG93LgorLy8gWFhYIE5vdGUgdGhhdCBhcyBvZiB0aGUgY3VycmVudCBkZXNpZ24sIEV2ZW50cyBzaG91bGQgbm90IGJlIHJlbnVtYmVyZWQgKGkuZS4gcmVvcmRlcmVkKQorLy8gaWYgdGhleSBldmVyIGxlYXZlIG1lbW9yeSAoZm9yIGV4YW1wbGUsIHdyaXR0ZW4gdG8gZmlsZSwgdXBsb2FkZWQgdG8gY2xvdWQsIGV0Yy4pLgorLy8gVE9ETyBtYWtlIHNvbWUgc29ydCBvZiBpbnRlcmZhY2UgdG8ga2VlcCB0aGVzZSAiY29udHJhY3QiIGNvbnN0YW50cy4KK2VudW0gRXZlbnQgOiB1aW50OF90IHsKKyAgICBFVkVOVF9SRVNFUlZFRCwKKyAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKKyAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisKKyAgICAvLyBUeXBlcyBmb3IgRm9ybWF0IEVudHJ5LCBpLmUuIGZvcm1hdHRlZCBlbnRyeQorICAgIEVWRU5UX0ZNVF9TVEFSVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cworICAgIC8vIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfQVVUSE9SLCAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKKyAgICBFVkVOVF9GTVRfRkxPQVQsICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfSEFTSCwgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgorICAgIEVWRU5UX0ZNVF9JTlRFR0VSLCAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1BJRCwgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQorICAgIEVWRU5UX0ZNVF9TVFJJTkcsICAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUgZW50cnkKKyAgICBFVkVOVF9GTVRfVElNRVNUQU1QLCAgICAgICAgLy8gdGltZXN0YW1wIHZhbHVlIGVudHJ5CisgICAgLy8gZW5kIG9mIGZvcm1hdCBhcmd1bWVudHMKKyAgICBFVkVOVF9GTVRfRU5ELCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0CisKKyAgICAvLyBUeXBlcyBmb3Igd2FrZXVwIHRpbWVzdGFtcCBoaXN0b2dyYW1zCisgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCisgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQorCisgICAgLy8gVHlwZXMgcmVwcmVzZW50aW5nIGF1ZGlvIHBlcmZvcm1hbmNlIG1ldHJpY3MKKyAgICBFVkVOVF9MQVRFTkNZLCAgICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssIGRpdmlkZWQgYnkgc2FtcGxlIHJhdGUuCisgICAgRVZFTlRfT1ZFUlJVTiwgICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgb3ZlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9USFJFQURfSU5GTywgICAgICAgICAgLy8gc2VlIHRocmVhZF9pbmZvX3QgYmVsb3cKKyAgICBFVkVOVF9VTkRFUlJVTiwgICAgICAgICAgICAgLy8gcHJlZGljdGVkIHRocmVhZCB1bmRlcnJ1biBldmVudCB0aW1lc3RhbXAKKyAgICBFVkVOVF9XQVJNVVBfVElNRSwgICAgICAgICAgLy8gdGhyZWFkIHdhcm11cCB0aW1lCisgICAgRVZFTlRfV09SS19USU1FLCAgICAgICAgICAgIC8vIHRoZSB0aW1lIGEgdGhyZWFkIHRha2VzIHRvIGRvIHdvcmssIGUuZy4gcmVhZCwgd3JpdGUsIGV0Yy4KKyAgICBFVkVOVF9USFJFQURfUEFSQU1TLCAgICAgICAgLy8gc2VlIHRocmVhZF9wYXJhbXNfdCBiZWxvdworCisgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cworfTsKKworLy8gTkJMb2cgY3VzdG9tLWRlZmluZWQgc3RydWN0cy4gU29tZSBOQkxvZyBFdmVudCB0eXBlcyBtYXAgdG8gdGhlc2Ugc3RydWN0cy4KKwordXNpbmcgbG9nX2hhc2hfdCA9IHVpbnQ2NF90OworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnkgeworICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBpbnQ2NF90IHRzOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyB1c2VkIGZvciBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMgKG5vdCBtYXBwZWQpCitzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgYXV0aG9yOworfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIFRocmVhZFR5cGUgeworICAgIFVOS05PV04sCisgICAgTUlYRVIsCisgICAgQ0FQVFVSRSwKKyAgICBGQVNUTUlYRVIsCisgICAgRkFTVENBUFRVUkUsCit9OworCitpbmxpbmUgY29uc3QgY2hhciAqdGhyZWFkVHlwZVRvU3RyaW5nKFRocmVhZFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiAiTUlYRVIiOworICAgIGNhc2UgQ0FQVFVSRToKKyAgICAgICAgcmV0dXJuICJDQVBUVVJFIjsKKyAgICBjYXNlIEZBU1RNSVhFUjoKKyAgICAgICAgcmV0dXJuICJGQVNUTUlYRVIiOworICAgIGNhc2UgRkFTVENBUFRVUkU6CisgICAgICAgIHJldHVybiAiRkFTVENBUFRVUkUiOworICAgIGNhc2UgVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIH0KK30KKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX0lORk8KKy8vIFRoZXNlIGZpZWxkcyBhbHdheXMgc3RheSB0aGUgc2FtZSB0aHJvdWdob3V0IGEgdGhyZWFkJ3MgbGlmZXRpbWUgYW5kCisvLyBzaG91bGQgb25seSBuZWVkIHRvIGJlIGxvZ2dlZCBvbmNlIHVwb24gdGhyZWFkIGluaXRpYWxpemF0aW9uLgorLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIHJlY292ZXJ5IG1lY2hhbmlzbSBpZiB0aGUgbG9nIGV2ZW50IGNvcnJlc3BvbmRpbmcKKy8vIHRvIHRoaXMgdHlwZSBpcyBsb3N0LgorLy8gVE9ETyBhZGQgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGFkZGluZyBhIHJlYWRlciB0byBNZWRpYUxvZ1NlcnZpY2U/CitzdHJ1Y3QgdGhyZWFkX2luZm9fdCB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSAtMTsgICAgICAvLyBUaHJlYWQgSS9PIGhhbmRsZQorICAgIFRocmVhZFR5cGUgdHlwZSA9IFVOS05PV047ICAgICAgLy8gU2VlIGVudW0gVGhyZWFkVHlwZSBhYm92ZQorfTsKKworLy8gbWFwcGVkIGZyb20gRVZFTlRfVEhSRUFEX1BBUkFNUworLy8gVGhlc2UgZmllbGRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29uc3RhbnQgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gY2FuIGJlIGxvZ2dlZCB3aGVuZXZlciBhIHRocmVhZCByZWNlaXZlcyBuZXcgY29uZmlndXJhdGlvbnMgb3IgcGFyYW1ldGVycy4KK3N0cnVjdCB0aHJlYWRfcGFyYW1zX3QgeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgcmVhZCBvciB3cml0ZSBidWZmZXIKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlID0gMDsgICAgICAgIC8vIGluIGZyYW1lcyBwZXIgc2Vjb25kCit9OworCit0ZW1wbGF0ZSA8RXZlbnQgRT4gc3RydWN0IGdldF9tYXBwZWQ7CisjZGVmaW5lIE1BUF9FVkVOVF9UT19UWVBFKEUsIFQpIFwKK3RlbXBsYXRlPD4gc3RydWN0IGdldF9tYXBwZWQ8RT4geyBcCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUgXAorICAgICAgICAgICAgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJOQkxvZzo6RXZlbnQgbXVzdCBtYXAgdG8gdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOyBcCisgICAgdHlwZWRlZiBUIHR5cGU7IFwKK30KKworLy8gTWFwcyBhbiBOQkxvZyBFdmVudCB0eXBlIHRvIGEgQysrIFBPRCB0eXBlLgorTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfTEFURU5DWSwgZG91YmxlKTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX09WRVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX0lORk8sIHRocmVhZF9pbmZvX3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVU5ERVJSVU4sIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV0FSTVVQX1RJTUUsIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9XT1JLX1RJTUUsIGludDY0X3QpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfVEhSRUFEX1BBUkFNUywgdGhyZWFkX3BhcmFtc190KTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9NZXJnZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhODUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVhZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nMTY7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBUT0RPIHVwZGF0ZSBjb21tZW50cyB0byByZWZsZWN0IGN1cnJlbnQgZnVuY3Rpb25hbGl0aWVzCisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5CisvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCitjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgfk1lcmdlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+ICZyZWFkZXIpOworICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgorICAgIHZvaWQgbWVyZ2UoKTsKKworICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8UmVhZGVyPj4mIGdldFJlYWRlcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgorICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaworICAgIHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+IG1SZWFkZXJzOworCisgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KK307CisKKy8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKKy8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCisvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KK2NsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7CitwdWJsaWM6CisgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOworCisgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgIHZvaWQgcHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICZzbmFwLCBpbnQgYXV0aG9yKTsKKworICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQorICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisKKyAgICAvLyBjaGVjayBmb3IgcGVyaW9kaWMgcHVzaCBvZiBwZXJmb3JtYW5jZSBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGFuZCBwZXJmb3JtCisgICAgLy8gdGhlIHNlbmQgaWYgaXQgaXMgdGltZSB0byBkbyBzby4KKyAgICB2b2lkIGNoZWNrUHVzaFRvTWVkaWFNZXRyaWNzKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAorICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCisgICAgLy8gVGhlIG9iamVjdCBpcyBvd25lZCBieSB0aGUgTWVyZ2VyIGNsYXNzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBtUmVhZGVyczsKKworICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCisgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCisgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7CisKKyAgICAvLyBjb21wcmVzc2VzIGFuZCBzdG9yZXMgYXVkaW8gcGVyZm9ybWFuY2UgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgYnVmZmVycy4KKyAgICAvLyBmaXJzdCBwYXJhbWV0ZXIgaXMgYXV0aG9yLCBpLmUuIHRocmVhZCBpbmRleC4KKyAgICBzdGQ6Om1hcDxpbnQsIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE+IG1UaHJlYWRQZXJmb3JtYW5jZURhdGE7CisKKyAgICAvLyBob3cgb2Z0ZW4gdG8gcHVzaCBkYXRhIHRvIE1lZGlhIE1ldHJpY3MKKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga1BlcmlvZGljTWVkaWFNZXRyaWNzUHVzaCA9IHMybnMoKG5zZWNzX3QpMiAqIDYwICogNjApOyAvLyAyIGhvdXJzCisKKyAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQorICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKK307CisKKy8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKKy8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCisvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCisvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgorY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKKyAgICB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKKworICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCisgICAgdm9pZCB3YWtldXAoKTsKKworICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCisgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOworCitwcml2YXRlOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCisgICAgTWVyZ2VyJiAgICAgIG1NZXJnZXI7CisKKyAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKKyAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOworCisgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICBNdXRleCAgICAgICAgbU11dGV4OworCisgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCisgICAgQ29uZGl0aW9uICAgIG1Db25kOworCisgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCisgICAgaW50ICAgICAgICAgIG1UaW1lb3V0VXM7CisKKyAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKKyAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOworCisgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKaW5kZXggZmI2ZjE3OS4uZmQ3MzUzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMTksNTk1ICsxOSwxMCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAKLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmluZzg7Ci0KLWNsYXNzIE5CTG9nIHsKLQotcHVibGljOgotCi0gICAgdXNpbmcgbG9nX2hhc2hfdCA9IFJlcG9ydFBlcmZvcm1hbmNlOjpsb2dfaGFzaF90OwotCi0gICAgLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKLSAgICAvLyAgICAgICBmcm9tIHRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBjbGFzcyBXcml0ZXI7Ci0gICAgY2xhc3MgUmVhZGVyOwotCi0gICAgZW51bSBFdmVudCA6IHVpbnQ4X3QgewotICAgICAgICBFVkVOVF9SRVNFUlZFRCwKLSAgICAgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRpbWVzdGFtcCBvcHRpb25hbAotICAgICAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgICAgIEVWRU5UX0lOVEVHRVIsICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlIGVudHJ5Ci0gICAgICAgIEVWRU5UX0ZMT0FULCAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgICAgIEVWRU5UX0FVVEhPUiwgICAgICAgICAgICAgICAvLyBhdXRob3IgaW5kZXggKHByZXNlbnQgaW4gbWVyZ2VkIGxvZ3MpIHRyYWNrcyBlbnRyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBsb2cKLSAgICAgICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGxvd2luZyBlbnRyaWVzIGNvbnRhaW4gZm9ybWF0IGFyZ3VtZW50cwotICAgICAgICBFVkVOVF9IQVNILCAgICAgICAgICAgICAgICAgLy8gdW5pcXVlIEhBU0ggb2YgbG9nIG9yaWdpbiwgb3JpZ2luYXRlcyBmcm9tIGhhc2ggb2YgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKLSAgICAgICAgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLCAgIC8vIHNpbmdsZSBkYXR1bSBmb3IgdGltZXN0YW1wIGhpc3RvZ3JhbQotICAgICAgICBFVkVOVF9BVURJT19TVEFURSwgICAgICAgICAgLy8gYXVkaW8gb24vb2ZmIGV2ZW50OiBsb2dnZWQgb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlIGNhbGwKLSAgICAgICAgRVZFTlRfRU5EX0ZNVCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAotCi0gICAgICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKLSAgICB9OwotCi1wcml2YXRlOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwotCi0gICAgLy8gYSBmb3JtYXR0ZWQgZW50cnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIC8vICAgICogU1RBUlRfRk1UIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCi0gICAgLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKLSAgICAvLyAgICAqIEhBU0ggZW50cnkKLSAgICAvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQotICAgIC8vICAgICogZm9ybWF0IGFyZzEKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcyCi0gICAgLy8gICAgKiAuLi4KLSAgICAvLyAgICAqIEVORF9GTVQgZW50cnkKLQotICAgIC8vIGVudHJ5IHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeQotICAgIHN0cnVjdCBlbnRyeSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKLSAgICAgICAgY29uc3QgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgdGFpbCByZXByZXNlbnRhdGlvbiAoYWZ0ZXIgZGF0YSkKLSAgICBzdHJ1Y3QgZW5kaW5nIHsKLSAgICAgICAgdWludDhfdCBsZW5ndGg7Ci0gICAgICAgIHVpbnQ4X3QgbmV4dFswXTsKLSAgICB9OwotCi0gICAgLy8gZW50cnkgaXRlcmF0b3IKLSAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoKTsKLSAgICAgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IoY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpOwotCi0gICAgICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKLSAgICAgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OwotICAgICAgICBjb25zdCBlbnRyeSogICAgb3BlcmF0b3ItPigpIGNvbnN0OwotICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3IrKygpOyAvLyArK2kKLSAgICAgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQotICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBuZXh0KCkgY29uc3Q7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIHByZXYoKSBjb25zdDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotICAgICAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLQotICAgICAgICBib29sICAgICAgICAgICAgaGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ocHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBwdHI7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICpwdHI7Ci0gICAgfTsKLQotICAgIGNsYXNzIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBFbnRyeSBzdGFydGluZyBpbiB0aGUgZ2l2ZW4gcG9pbnRlcgotICAgICAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICAgICAgdmlydHVhbCB+QWJzdHJhY3RFbnRyeSgpIHt9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29uY3JldGUgZW50cnkgb2YgYXBwcm9wcmlhdGUgY2xhc3MgZnJvbSBwb2ludGVyCi0gICAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgIHRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKLSAgICAgICAgLy8gc2l6ZV90ICAgICAgY29weUVudHJ5KGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICpkc3QsIGNvbnN0IGl0ZXJhdG9yICZpdCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgICptRW50cnk7Ci0gICAgfTsKLQotICAgIGNsYXNzIEZvcm1hdEVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotICAgICAgICBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkZvcm1hdEVudHJ5KCkge30KLQotICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW50cnkncyBmb3JtYXQgc3RyaW5nCi0gICAgICAgIGNvbnN0ICAgY2hhciogZm9ybWF0U3RyaW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAotICAgICAgICBzaXplX3QgICAgICBmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdDsKLQotICAgICAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgICAgYXJncygpIGNvbnN0OwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQotICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBzaXplIG9mIG9yaWdpbmFsIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICBjbGFzcyBIaXN0b2dyYW1FbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IEhpc3RvZ3JhbUVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikgewotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KLQotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHByaXZhdGUgbWVtb3J5Ci0gICAgc3RydWN0IEVudHJ5IHsKLSAgICAgICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICAgICAgICA6IG1FdmVudChldmVudCksIG1MZW5ndGgobGVuZ3RoKSwgbURhdGEoZGF0YSkgeyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5FbnRyeSgpIHsgfQotCi0gICAgICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotICAgICAgICBpbnQgICAgIGNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7Ci0gICAgICAgIEV2ZW50ICAgICAgIG1FdmVudDsgICAgIC8vIGV2ZW50IHR5cGUKLSAgICAgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heExlbmd0aCA9IDI1NTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT3ZlcmhlYWQgPSBzaXplb2YoZW50cnkpICsgc2l6ZW9mKGVuZGluZyk7Ci0gICAgICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKLSAgICAgICAgc3RhdGljIGNvbnN0IHNzaXplX3Qga1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID0gLSBzaXplb2YoZW5kaW5nKSArCi0gICAgICAgICAgICBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBIaXN0VHNFbnRyeSB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnlXaXRoQXV0aG9yIHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICBpbnQgYXV0aG9yOwotICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotICAgIHN0cnVjdCBIaXN0SW50RW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vICBieXRlWzBdICAgICAgICAgICAgIG1FdmVudAotICAgIC8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKLSAgICAvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQotICAgIC8vICAuLi4KLSAgICAvLyAgYnl0ZVsyK21MZW5ndGgtMV0gICBtRGF0YVttTGVuZ3RoLTFdCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCi0gICAgLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKLQotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyBzaXplX3QgIGZtdEVudHJ5TGVuZ3RoKGNvbnN0IHVpbnQ4X3QgKmRhdGEpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7Ci1wdWJsaWM6Ci0KLSAgICAvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgotICAgIC8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgotICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBQT0QsIHRoZSBkZXN0cnVjdG9yIGlzIGVtcHR5IGFuZCB1bm5lY2Vzc2FyeSB0byBjYWxsIGl0IGV4cGxpY2l0bHkuCi0gICAgc3RydWN0IFNoYXJlZCB7Ci0gICAgICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+U2hhcmVkKCkgeyB9Ci0KLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19pbmRleCAgbVJlYXI7ICAvLyBpbmRleCBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQgb2YgbW9zdCByZWNlbnQgRW50cnkKLSAgICAgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKLSAgICB9OwotCi1wdWJsaWM6Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCi0gICAgLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCi0gICAgY2xhc3MgVGltZWxpbmUgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotI2lmIDAKLSAgICAgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIH5UaW1lbGluZSgpOwotI2VuZGlmCi0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgotICAgICAgICBzdGF0aWMgc2l6ZV90IHNoYXJlZFNpemUoc2l6ZV90IHNpemUpOwotCi0jaWYgMAotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyAgICBSZWFkZXI7Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgotICAgICAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotI2VuZGlmCi0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKLSAgICAvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KLSAgICBjbGFzcyBXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5Xcml0ZXIoKTsKLQotICAgICAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIGJvb2wgICAgZW5hYmxlKCkgICAgeyByZXR1cm4gc2V0RW5hYmxlZCh0cnVlKTsgfQotICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9Ci0KLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCAgeyByZXR1cm4gbUlNZW1vcnk7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAgICAgLy8gd3JpdGVzIGEgc2luZ2xlIEVudHJ5IHRvIHRoZSBGSUZPCi0gICAgICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQotICAgICAgICB2b2lkICAgIGxvZyhjb25zdCBFbnRyeSAqZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKLQotICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcjsgICAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAotICAgICAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKLQotICAgICAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKLSAgICAgICAgLy8gdG90YWwgdGFnIGxlbmd0aCBpcyBtUGlkVGFnU2l6ZSBhbmQgcHJvY2VzcyBuYW1lIGlzIG5vdCB6ZXJvIHRlcm1pbmF0ZWQKLSAgICAgICAgY2hhciAgICptUGlkVGFnOwotICAgICAgICBzaXplX3QgIG1QaWRUYWdTaXplOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQotICAgIGNsYXNzIExvY2tlZFdyaXRlciA6IHB1YmxpYyBXcml0ZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTG9ja2VkV3JpdGVyKCk7Ci0gICAgICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGNsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgotICAgICAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0Ci0gICAgICAgIGNsYXNzIFNuYXBzaG90IHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQotCi0gICAgICAgICAgICBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KLQotICAgICAgICAgICAgflNuYXBzaG90KCkgeyBkZWxldGVbXSBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotCi0gICAgICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKLSAgICAgICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICAgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUVuZDsgfQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgTWVyZ2VSZWFkZXI7Ci0gICAgICAgICAgICBmcmllbmQgY2xhc3MgUmVhZGVyOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgKm1EYXRhOwotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtQmVnaW47Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1FbmQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgotICAgICAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgflJlYWRlcigpOwotCi0gICAgICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KCk7Ci0KLSAgICAgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwZXJmb3JtYW5jZSB0byB0aGUgY29uc29sZQotICAgICAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7Ci0gICAgICAgIEVudHJ5SXRlcmF0b3IgICBoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKLSAgICAgICAgaW50IG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCi0gICAgICAgIGludCBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCi0gICAgICAgIGludCBtTG9zdDsgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGRhdGEgbG9zdCBiZWZvcmUgYnVmZmVyIHdhcyByZWFkCi0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IHN0YXJ0aW5nVHlwZXM7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7Ci0KLSAgICAgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKLSAgICAgICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKLQotICAgICAgICAvKmNvbnN0Ki8gU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5LCBhY3R1YWxseSBjb25zdCBidXQgbm90Ci0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAotICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICAgICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0KLSAgICAgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IGVudHJ5IG9mIHR5cGUgPHR5cGU+IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCi0gICAgICAgIC8vIGJhY2sgaGFzIHRvIGJlIGVudHJ5LWFsaWduZWQuIFJldHVybnMgbnVsbHB0ciBpZiBub25lIGVuY29udW50ZXJlZC4KLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+ICZ0eXBlcyk7Ci0KLSAgICAgICAgLy8gZHVtbXkgbWV0aG9kIGZvciBoYW5kbGluZyBhYnNlbnQgYXV0aG9yIGVudHJ5Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSYgLypmbXRFbnRyeSovLCBTdHJpbmc4KiAvKmJvZHkqLykge30KLSAgICB9OwotCi0gICAgLy8gV3JhcHBlciBmb3IgYSByZWFkZXIgd2l0aCBhIG5hbWUuIENvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgcmVhZGVyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgICBjbGFzcyBOYW1lZFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBOYW1lZFJlYWRlcigpIHsgbU5hbWVbMF0gPSAnXDAnOyB9IC8vIGZvciBWZWN0b3IKLSAgICAgICAgTmFtZWRSZWFkZXIoY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mIHJlYWRlciwgY29uc3QgY2hhciAqbmFtZSkgOgotICAgICAgICAgICAgbVJlYWRlcihyZWFkZXIpCi0gICAgICAgICAgICB7IHN0cmxjcHkobU5hbWUsIG5hbWUsIHNpemVvZihtTmFtZSkpOyB9Ci0gICAgICAgIH5OYW1lZFJlYWRlcigpIHsgfQotICAgICAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KLSAgICAgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICBuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TmFtZSA9IDMyOwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgIG1OYW1lW2tNYXhOYW1lXTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQotICAgIC8vIGFuZCB3cml0ZSBpdCB0byBhIHNpbmdsZSBGSUZPIGluIGxvY2FsIG1lbW9yeS4KLSAgICBjbGFzcyBNZXJnZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+TWVyZ2VyKCkge30KLQotICAgICAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKLSAgICAgICAgLy8gVE9ETyBhZGQgcmVtb3ZlUmVhZGVyCi0gICAgICAgIHZvaWQgbWVyZ2UoKTsKLQotICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KLSAgICAgICAgLy8gZXZlcnkgcmVhZGVyIHJlYWRzIGZyb20gYSB3cml0ZXIncyBidWZmZXIKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawotICAgICAgICBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4gbU5hbWVkUmVhZGVyczsKLQotICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvPiBtRmlmbzsgLy8gRklGTyBpdHNlbGYKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCi0gICAgfTsKLQotICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgcG9pbnRlciB0byB0aGUgRklGTyBpbiBsb2NhbCBtZW1vcnkgd2hpY2ggc3RvcmVzIHRoZSBtZXJnZWQKLSAgICAvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIE5hbWVkUmVhZGVycy4gSXQgaXMgdXNlZCB0byBwcm9jZXNzCi0gICAgLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCi0gICAgY2xhc3MgTWVyZ2VSZWFkZXIgOiBwdWJsaWMgUmVhZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKLQotICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50ID0gMCk7Ci0gICAgICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKLSAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoU25hcHNob3QgJiBzbmFwKTsKLSAgICAgICAgLy8gY2FsbCBnZXRTbmFwc2hvdCBvZiB0aGUgY29udGVudCBvZiB0aGUgcmVhZGVyJ3MgYnVmZmVyIGFuZCBwcm9jZXNzIHRoZSBkYXRhCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLAotICAgICAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcwotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgLy8gYW5hbHl6ZXMsIGNvbXByZXNzZXMgYW5kIHN0b3JlcyB0aGUgbWVyZ2VkIGRhdGEKLSAgICAgICAgLy8gY29udGFpbnMgYSBzZXBhcmF0ZSBpbnN0YW5jZSBmb3IgZXZlcnkgYXV0aG9yICh0aHJlYWQpLCBhbmQgZm9yIGV2ZXJ5IHNvdXJjZSBmaWxlCi0gICAgICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgotICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpc01hcCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpczsKLQotICAgICAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQotICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKLSAgICAgICAgdm9pZCBoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZm10RW50cnksIFN0cmluZzggKmJvZHkpOwotICAgIH07Ci0KLSAgICAvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6Ci0gICAgLy8gd2hlbiB0cmlnZ2VyZWQsIGl0IGF3YWtlcyBmb3IgYSBsYXBzZSBvZiB0aW1lLCBkdXJpbmcgd2hpY2ggaXQgcGVyaW9kaWNhbGx5IG1lcmdlczsgaWYKLSAgICAvLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCi0gICAgLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KLSAgICBjbGFzcyBNZXJnZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7Ci0gICAgICAgIHZpcnR1YWwgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gUmVzZXQgdGltZW91dCBhbmQgYWN0aXZhdGUgdGhyZWFkIHRvIG1lcmdlIHBlcmlvZGljYWxseSBpZiBpdCdzIGlkbGUKLSAgICAgICAgdm9pZCB3YWtldXAoKTsKLQotICAgICAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgotICAgICAgICB2b2lkIHNldFRpbWVvdXRVcyhpbnQgdGltZSk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncwotICAgICAgICBNZXJnZXImICAgICBtTWVyZ2VyOwotCi0gICAgICAgIC8vIHRoZSBtZXJnZXJlYWRlciB1c2VkIHRvIHByb2Nlc3MgZGF0YSBtZXJnZWQgYnkgbU1lcmdlcgotICAgICAgICBNZXJnZVJlYWRlciYgbU1lcmdlUmVhZGVyOwotCi0gICAgICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCi0gICAgICAgIE11dGV4ICAgICAgIG1NdXRleDsKLQotICAgICAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKLSAgICAgICAgQ29uZGl0aW9uICAgbUNvbmQ7Ci0KLSAgICAgICAgLy8gdGltZSBsZWZ0IHVudGlsIHRoZSB0aHJlYWQgYmxvY2tzIGFnYWluIChpbiBtaWNyb3NlY29uZHMpCi0gICAgICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7Ci0KLSAgICAgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRTbGVlcFBlcmlvZFVzID0gMTAwMDAwMCAvKjFzKi87Ci0KLSAgICAgICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOwotICAgIH07Ci0KLX07ICAvLyBjbGFzcyBOQkxvZwotCi0vLyBUT0RPIHB1dCBzb21ld2hlcmUgZWxzZQotc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF9tb25vdG9uaWNfbnMoKSB7Ci0gICAgdGltZXNwZWMgdHM7Ci0gICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKLSAgICAgICAgcmV0dXJuICh1aW50NjRfdCkgdHMudHZfc2VjICogMTAwMCAqIDEwMDAgKiAxMDAwICsgdHMudHZfbnNlYzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7IC8vIHNob3VsZCBub3QgaGFwcGVuLgotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCmluZGV4IGRkZmU5ZDYuLmQ3YzE2YjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0xOSwxNCArMTksMTc2IEBACiAKICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBTdHJpbmc4OworCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCisvLyBUT0RPIG1ha2UgdGhpcyBhIHRlbXBsYXRlZCBjbGFzcyBhbmQgcHV0IGl0IGluIGEgc2VwYXJhdGUgZmlsZS4KKy8vIFRoZSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyB3b3VsZCBiZSBiaW4gc2l6ZSBhbmQgbG93IGxpbWl0LgorLyoKKyAqIEhpc3RvZ3JhbSBwcm92aWRlcyBhIHdheSB0byBzdG9yZSBudW1lcmljIGRhdGEgaW4gaGlzdG9ncmFtIGZvcm1hdCBhbmQgcmVhZCBpdCBhcyBhIHNlcmlhbGl6ZWQKKyAqIHN0cmluZy4gVGhlIHRlcm1zICJiaW4iIGFuZCAiYnVja2V0IiBhcmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCisgKgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCisgKi8KK2NsYXNzIEhpc3RvZ3JhbSB7CitwdWJsaWM6CisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBiaW5TaXplOyAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgICAgICBjb25zdCBzaXplX3QgbnVtQmluczsKKyAgICAgICAgY29uc3QgZG91YmxlIGxvdzsgICAgICAgLy8gVE9ETyB0ZW1wbGF0ZSB0eXBlCisgICAgfTsKKworICAgIC8vIEhpc3RvZ3JhbXMgYXJlIGNvbnN0cnVjdGVkIHdpdGggZml4ZWQgY29uZmlndXJhdGlvbiBudW1iZXJzLiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gYmFzZWQKKyAgICAvLyB0aGUgZGF0YSBpcyBwb3NzaWJsZSBidXQgY29tcGxleCBiZWNhdXNlCisgICAgLy8gLSBkYXRhIHBvaW50cyBhcmUgYWRkZWQgb25lIGJ5IG9uZSwgbm90IHByb2Nlc3NlZCBhcyBhIGJhdGNoLgorICAgIC8vIC0gSGlzdG9ncmFtcyB3aXRoIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHRyaWNreSB0byBhZ2dyZWdhdGUsIGFuZCB0aGV5CisgICAgLy8gICB3aWxsIG5lZWQgdG8gYmUgYWdncmVnYXRlZCBhdCB0aGUgTWVkaWEgTWV0cmljcyBjbG91ZCBzaWRlLgorICAgIC8vIC0gbm90IHByb3ZpZGluZyBsaW1pdHMgdGhlb3JldGljYWxseSBhbGxvd3MgZm9yIGluZmluaXRlIG51bWJlciBvZiBidWNrZXRzLgorCisgICAgLyoqCisgICAgICogXGJyaWVmIENyZWF0ZXMgYSBIaXN0b2dyYW0gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGJpblNpemUgdGhlIHdpZHRoIG9mIGVhY2ggYmluIG9mIHRoZSBoaXN0b2dyYW0sIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqIFxwYXJhbSBudW1CaW5zIHRoZSBudW1iZXIgb2YgYmlucyBkZXNpcmVkIGluIHRoZSBoaXN0b2dyYW0gcmFuZ2UsIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisgICAgICogXHBhcmFtIGxvdyAgICAgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBoaXN0b2dyYW0gYnVja2V0IHZhbHVlcy4KKyAgICAgKiAgICAgICAgICAgICAgICBVbml0cyBhcmUgd2hhdGV2ZXIgZGF0YSB0aGUgY2FsbGVyIGRlY2lkZXMgdG8gc3RvcmUuCisgICAgICogICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSB1cHBlciBib3VuZCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgICAgICAgdXBwZXIgPSBsb3dlciArIGJpblNpemUgKiBudW1CaW5zLgorICAgICAqLworICAgIEhpc3RvZ3JhbShkb3VibGUgYmluU2l6ZSwgc2l6ZV90IG51bUJpbnMsIGRvdWJsZSBsb3cgPSAwLikKKyAgICAgICAgOiBtQmluU2l6ZShiaW5TaXplKSwgbU51bUJpbnMobnVtQmlucyksIG1Mb3cobG93KSwgbUJpbnMobU51bUJpbnMgKyAyKSB7fQorCisgICAgSGlzdG9ncmFtKGNvbnN0IENvbmZpZyAmYykKKyAgICAgICAgOiBIaXN0b2dyYW0oYy5iaW5TaXplLCBjLm51bUJpbnMsIGMubG93KSB7fQorCisgICAgLyoqCisgICAgICogXGJyaWVmIEFkZCBhIGRhdGEgcG9pbnQgdG8gdGhlIGhpc3RvZ3JhbS4gVGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50CisgICAgICogICAgICAgIGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgdGhlIGJpbiBzaXplIChiZWZvcmUgYWNjb3VudGluZworICAgICAqICAgICAgICBmb3IgdGhlIGxvd2VyIGJvdW5kIG9mZnNldCwgd2hpY2ggbWF5IG5vdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSkuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50IHRvIGFkZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChkb3VibGUgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJlbW92ZXMgYWxsIGRhdGEgcG9pbnRzIGZyb20gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGFkZGVkIHRvIHRoZSBoaXN0b2dyYW0uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgaW4gdGhlIGhpc3RvZ3JhbS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbENvdW50KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgU2VyaWFsaXplcyB0aGUgaGlzdG9ncmFtIGludG8gYSBzdHJpbmcuIFRoZSBmb3JtYXQgaXMgY2hvc2VuIHRvIGJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqICAgICAgICB0aGUgaGlzdG9ncmFtIHJlcHJlc2VudGF0aW9uIHRvIHNlbmQgdG8gdGhlIE1lZGlhIE1ldHJpY3Mgc2VydmljZS4KKyAgICAgKgorICAgICAqICAgICAgICBUaGUgc3RyaW5nIGlzIGFzIGZvbGxvd3M6CisgICAgICogICAgICAgICAgYmluU2l6ZSxudW1CaW5zLGxvdyx7LTF8bG93Q291bnQsLi4uLGJpbkluZGV4fGNvdW50LC4uLixudW1CaW5zfGhpZ2hDb3VudH0KKyAgICAgKgorICAgICAqICAgICAgICAtIGJpbkluZGV4IGlzIGFuIGludGVnZXIgd2l0aCAwIDw9IGJpbkluZGV4IDwgbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSAocm91bmRlZCkgdmFsdWUKKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogYnVja2V0SW5kZXguCisgICAgICogICAgICAgIC0gbG93Q291bnQgaXMgdGhlIG51bWJlciBvZiAocm91bmRlZCkgdmFsdWVzIGxlc3MgdGhhbiBsb3cuCisgICAgICogICAgICAgIC0gaGlnaENvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgKiAgICAgICAgICBsb3cgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKiAgICAgICAgLSBhIGJpbkluZGV4IG1heSBiZSBza2lwcGVkIGlmIGl0cyBjb3VudCBpcyAwLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgaGlzdG9ncmFtIHNlcmlhbGl6ZWQgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIERyYXcgbG9nIHNjYWxlIHNpZGV3YXlzIGhpc3RvZ3JhbSBhcyBBU0NJSSBhcnQgYW5kIHN0b3JlIGFzIGEgc3RkOjpzdHJpbmcuCisgICAgLy8gRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRvdGFsQ291bnQoKSA9PSAwLgorICAgIHN0ZDo6c3RyaW5nIGFzY2lpQXJ0U3RyaW5nKHNpemVfdCBpbmRlbnQgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBIaXN0b2dyYW0gdmVyc2lvbiBudW1iZXIuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1ZlcnNpb24gPSAxOworCisgICAgY29uc3QgZG91YmxlIG1CaW5TaXplOyAgICAgICAgICAvLyBTaXplIG9mIGVhY2ggYnVja2V0CisgICAgY29uc3Qgc2l6ZV90IG1OdW1CaW5zOyAgICAgICAgICAvLyBOdW1iZXIgb2YgYnVja2V0cyBpbiByYW5nZSAoZXhjbHVkZXMgbG93IGFuZCBoaWdoKQorICAgIGNvbnN0IGRvdWJsZSBtTG93OyAgICAgICAgICAgICAgLy8gTG93ZXIgYm91bmQgb2YgdmFsdWVzCisKKyAgICAvLyBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgYWN0dWFsIGhpc3RvZ3JhbS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMgbGVzcyB0aGFuIG1Mb3cKKyAgICAvLyBhcmUgc3RvcmVkIGluIG1CaW5zWzBdLiBCaW4gaW5kZXggaSBjb3JyZXNwb25kcyB0byBtQmluc1tpKzFdLiBDb3VudHMgb2YgYmluIHZhbHVlcworICAgIC8vID49IGhpZ2ggYXJlIHN0b3JlZCBpbiBtQmluc1ttTnVtQmlucyArIDFdLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBtQmluczsKKworICAgIHVpbnQ2NF90IG1Ub3RhbENvdW50ID0gMDsgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHZhbHVlcyByZWNvcmRlZAorfTsKKworLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBidXQgUGVyZm9ybWFuY2VBbmFseXNpcworLy8gYWxzbyBkb2VzIHNvbWUgYWRkaXRpb25hbCBhbmFseXppbmcgb2YgZGF0YSwgd2hpbGUgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3QgaXMKKy8vIHRvIGhvbGQgZGF0YS4KK3N0cnVjdCBQZXJmb3JtYW5jZURhdGEgeworICAgIC8vIFRPRE8gdGhlIEhpc3RvZ3JhbTo6Q29uZmlnIG51bWJlcnMgYmVsb3cgYXJlIGZvciBGYXN0TWl4ZXIuCisgICAgLy8gU3BlY2lmeSBkaWZmZXJlbnQgbnVtYmVycyBmb3Igb3RoZXIgdGhyZWFkIHR5cGVzLgorCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIG1VbmRlcnJ1bk5zIGFuZCBtT3ZlcnJ1bk5zIGluIEZhc3RNaXhlci5jcHAgZm9yIGZyYW1lQ291bnQgPSAxOTIKKyAgICAvLyBhbmQgbVNhbXBsZVJhdGUgPSA0ODAwMCwgd2hpY2ggY29ycmVzcG9uZCB0byAyIGFuZCA3IHNlY29uZHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV29ya0NvbmZpZyA9IHsgMC4yNSwgMjAsIDIufTsKKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiB0cmlhbCBhbmQgZXJyb3IgbG9nZ2luZy4gTmVlZCBhIGJldHRlciB3YXkgdG8gZGV0ZXJtaW5lCisgICAgLy8gYmluIHNpemUgYW5kIGxvd2VyL3VwcGVyIGxpbWl0cy4KKyAgICBzdGF0aWMgY29uc3RleHByIEhpc3RvZ3JhbTo6Q29uZmlnIGtMYXRlbmN5Q29uZmlnID0geyAyLiwgMTAsIDEwLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrV2FybXVwQ29uZmlnID0geyA1LiwgMTAsIDEwLn07CisKKyAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCB0aHJlYWRJbmZve307CisgICAgTkJMb2c6OnRocmVhZF9wYXJhbXNfdCB0aHJlYWRQYXJhbXN7fTsKKworICAgIC8vIFBlcmZvcm1hbmNlIERhdGEKKyAgICBIaXN0b2dyYW0gd29ya0hpc3R7a1dvcmtDb25maWd9OworICAgIEhpc3RvZ3JhbSBsYXRlbmN5SGlzdHtrTGF0ZW5jeUNvbmZpZ307CisgICAgSGlzdG9ncmFtIHdhcm11cEhpc3R7a1dhcm11cENvbmZpZ307CisgICAgaW50NjRfdCB1bmRlcnJ1bnMgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXhTbmFwc2hvdHNUb1N0b3JlID0gMjU2OworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPE5CTG9nOjpFdmVudCwgaW50NjRfdCAvKnRpbWVzdGFtcCovPj4gc25hcHNob3RzOworICAgIGludDY0X3Qgb3ZlcnJ1bnMgPSAwOworICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICBuc2Vjc190IHN0YXJ0e3N5c3RlbVRpbWUoKX07CisKKyAgICAvLyBSZXNldCB0aGUgcGVyZm9ybWFuY2UgZGF0YS4gVGhpcyBkb2VzIG5vdCByZXByZXNlbnQgYSB0aHJlYWQgc3RhdGUgY2hhbmdlLgorICAgIC8vIFRocmVhZCBpbmZvIGlzIG5vdCByZXNldCBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMgbWVhbnQgdG8gYmUgYSBjb250aW51YXRpb24gb2YgdGhlIHRocmVhZAorICAgIC8vIHRoYXQgc3RydWN0IFBlcmZvcm1hbmNlRGF0YSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd29ya0hpc3QuY2xlYXIoKTsKKyAgICAgICAgbGF0ZW5jeUhpc3QuY2xlYXIoKTsKKyAgICAgICAgd2FybXVwSGlzdC5jbGVhcigpOworICAgICAgICB1bmRlcnJ1bnMgPSAwOworICAgICAgICBvdmVycnVucyA9IDA7CisgICAgICAgIGFjdGl2ZSA9IDA7CisgICAgICAgIHN0YXJ0ID0gc3lzdGVtVGltZSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHBlcmZvcm1hbmNlIGRhdGEgaGFzIG5vdCBiZWVuIHJlY29yZGVkIHlldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB3b3JrSGlzdC50b3RhbENvdW50KCkgPT0gMCAmJiBsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPT0gMAorICAgICAgICAgICAgICAgICYmIHdhcm11cEhpc3QudG90YWxDb3VudCgpID09IDAgJiYgdW5kZXJydW5zID09IDAgJiYgb3ZlcnJ1bnMgPT0gMAorICAgICAgICAgICAgICAgICYmIGFjdGl2ZSA9PSAwOworICAgIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXM7CiAKIC8vIGEgbWFwIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMgaW5zdGFuY2VzCkBAIC04MCw3ICsyNDIsNyBAQAogICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CiAKICAgICAvLyBzdG9yZXMgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQotICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUhpc3RzOworICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+IG1IaXN0czsKIAogICAgIC8vIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGRldGVjdGluZyBvdXRsaWVycwogICAgIHN0cnVjdCBCdWZmZXJQZXJpb2QgewpAQCAtMTE5LDggKzI4MSw3IEBACiB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKIHZvaWQgZHVtcExpbmUoaW50IGZkLCBpbnQgaW5kZW50LCBjb25zdCBTdHJpbmc4ICZib2R5KTsKIAotfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKLQorfSAgIC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9QRVJGT1JNQU5DRUFOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVhZGVyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTVlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIFN0cmluZzg7CisKK25hbWVzcGFjZSBOQkxvZyB7CisKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFJlYWRlciBBUEkKKworY2xhc3MgU25hcHNob3Q7ICAgICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG5lZWRlZCBmb3IgUmVhZGVyOjpnZXRTbmFwc2hvdCgpCisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworICAgIFJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICB+UmVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IGdldFNuYXBzaG90KGJvb2wgZmx1c2ggPSB0cnVlKTsKKyAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworcHJpdmF0ZToKKyAgICAvLyBBbW91bnQgb2YgdHJpZXMgZm9yIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoIHdyaXRlciBpbiBnZXRTbmFwc2hvdCgpLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhPYnRhaW5UcmllcyA9IDM7CisKKyAgICAvLyBpbnZhbGlkQmVnaW5UeXBlcyBhbmQgaW52YWxpZEVuZFR5cGVzIGFyZSB1c2VkIHRvIGFsaWduIHRoZSBTbmFwc2hvdDo6YmVnaW4oKSBhbmQKKyAgICAvLyBTbmFwc2hvdDo6ZW5kKCkgRW50cnlJdGVyYXRvcnMgdG8gdmFsaWQgZW50cmllcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkQmVnaW5UeXBlczsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiBpbnZhbGlkRW5kVHlwZXM7CisKKyAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgorICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgICAgICAgICAgICAvLyBuYW1lIG9mIHJlYWRlciAoYWN0dWFsbHkgbmFtZSBvZiB3cml0ZXIpCisgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAorICAgIGF1ZGlvX3V0aWxzX2ZpZm8gKiBjb25zdCBtRmlmbzsgICAgICAgICAgICAgICAgIC8vIEZJRk8gaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisKKyAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgdmFsaWQgZW50cnkgaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKKyAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PEV2ZW50PiAmaW52YWxpZFR5cGVzKTsKK307CisKKy8vIEEgc25hcHNob3Qgb2YgYSByZWFkZXJzIGJ1ZmZlcgorLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAorY2xhc3MgU25hcHNob3QgeworcHVibGljOgorICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KKworICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQorICAgIHNpemVfdCBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KKworICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgLy8gZGF0YSBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgaGFzIHZhbGlkIGVudHJpZXMKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIEVudHJ5SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbUVuZDsgfQorCitwcml2YXRlOgorICAgIFNuYXBzaG90KCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQorICAgIGZyaWVuZCBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCk7CisKKyAgICB1aW50OF90ICogY29uc3QgICAgICAgbURhdGEgPSBudWxscHRyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdCA9IDA7CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1CZWdpbjsKKyAgICBFbnRyeUl0ZXJhdG9yICAgICAgICAgbUVuZDsKK307CisKKy8vIFRPRE8gbW92ZSB0aGlzIHRvIE1lZGlhTG9nU2VydmljZT8KK2NsYXNzIER1bXBSZWFkZXIgOiBwdWJsaWMgTkJMb2c6OlJlYWRlciB7CitwdWJsaWM6CisgICAgRHVtcFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSB7fQorICAgIER1bXBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBSZWFkZXIoaU1lbW9yeSwgc2l6ZSwgbmFtZSkge30KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBzaXplX3QgaW5kZW50ID0gMCk7Citwcml2YXRlOgorICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIGZtdEVudHJ5IF9fdW51c2VkLCBTdHJpbmc4KiBib2R5IF9fdW51c2VkKSB7fQorICAgIEVudHJ5SXRlcmF0b3IgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqdGltZXN0YW1wLCBTdHJpbmc4ICpib2R5KTsKKworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRGbG9hdChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRQSUQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworCisgICAgLy8gVGhlIGJ1ZmZlckR1bXAgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCmluZGV4IGVjMDg0MmYuLjY0YTU3MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTIyLDE5ICsyMiwzMyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgU3RyaW5nOCBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCi1jbGFzcyBTdHJpbmc4OwotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhOworCisvLyBEdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGluIGEgSlNPTiBmb3JtYXQuCit2b2lkIGR1bXBKc29uKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy9EdW1wcyBwZXJmb3JtYW5jZSBkYXRhIGFzIHZpc3VhbGl6ZWQgcGxvdHMuCit2b2lkIGR1bXBQbG90cyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vIER1bXBzIHNuYXBzaG90cyBhdCBpbXBvcnRhbnQgZXZlbnRzIGluIHRoZSBwYXN0Lgordm9pZCBkdW1wUmV0cm8oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBTZW5kIG9uZSB0aHJlYWQncyBkYXRhIHRvIG1lZGlhIG1ldHJpY3MsIGlmIHRoZSBwZXJmb3JtYW5jZSBkYXRhIGlzIG5vbnRyaXZpYWwgKGkuZS4gbm90CisvLyBhbGwgemVybyB2YWx1ZXMpLiBSZXR1cm4gdHJ1ZSBpZiBkYXRhIHdhcyBzZW50LCBmYWxzZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHdyaXRlCisvLyBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nLgorYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogY29uc3RleHByIGludCBrTXNQZXJTZWMgPSAxMDAwOwogY29uc3RleHByIGludCBrU2VjUGVyTWluID0gNjA7CiAKIGNvbnN0ZXhwciBpbnQga0ppZmZ5UGVyTXMgPSAxMDsgLy8gdGltZSB1bml0IGZvciBoaXN0b2dyYW0gYXMgYSBtdWx0aXBsZSBvZiBtaWxsaXNlY29uZHMKIAogLy8gc3RvcmVzIGEgaGlzdG9ncmFtOiBrZXk6IG9ic2VydmVkIGJ1ZmZlciBwZXJpb2QgKG11bHRpcGxlIG9mIGppZmZ5KS4gdmFsdWU6IGNvdW50Ci11c2luZyBIaXN0b2dyYW0gPSBzdGQ6Om1hcDxpbnQsIGludD47Cit1c2luZyBIaXN0ID0gc3RkOjptYXA8aW50LCBpbnQ+OwogCiB1c2luZyBtc0ludGVydmFsID0gZG91YmxlOwogdXNpbmcgamlmZnlJbnRlcnZhbCA9IGRvdWJsZTsKQEAgLTU3LDEzICs3MSwxMiBAQAogfQogCiAvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIHBlYWtzIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHRvIGEgZmlsZS4KLXZvaWQgd3JpdGVUb0ZpbGUoY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiAmaGlzdHMsCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdD4+ICZoaXN0cywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoga0RpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjBjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1RpbWVsaW5lLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvX2luZGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBMb2NhdGVkIGluIHNoYXJlZCBtZW1vcnksIG11c3QgYmUgUE9ELgorLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCisvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5Lgorc3RydWN0IFNoYXJlZCB7CisgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8ge30KKyAgICB+U2hhcmVkKCkge30KKworICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5CisgICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKK307CisKKy8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCisvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KK2NsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorI2lmIDAKKyAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7CisgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKKyNlbmRpZgorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCisgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKKworI2lmIDAKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKKyAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOworCisgICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAorICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyNlbmRpZgorfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19USU1FTElORV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1dyaXRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm87CitjbGFzcyBhdWRpb191dGlsc19maWZvX3dyaXRlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworCituYW1lc3BhY2UgTkJMb2cgeworCitjbGFzcyBFbnRyeTsKK3N0cnVjdCBTaGFyZWQ7CisKKy8vIE5CTG9nIFdyaXRlciBJbnRlcmZhY2UKKworLy8gV3JpdGVyIGlzIHRocmVhZC1zYWZlIHdpdGggcmVzcGVjdCB0byBSZWFkZXIsIGJ1dCBub3Qgd2l0aCByZXNwZWN0IHRvIG11bHRpcGxlIHRocmVhZHMKKy8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgorY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIFdyaXRlcigpID0gZGVmYXVsdDsgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5CisKKyAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KKyAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB+V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKKyAgICB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOworICAgIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7CisgICAgdm9pZCAgICBsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKTsKKworICAgIC8vIExvZyBkYXRhIHJlbGF0ZWQgdG8gRXZlbnQgRS4gU2VlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgZm9yIHRoZSB0eXBlIG9mIGRhdGEKKyAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBldmVudC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWUgYSBtYXBwaW5nIHN0YXRlbWVudDoKKyAgICAvLyAgICAgTUFQX1RZUEVfVE9fRVZFTlQoRSwgVCk7CisgICAgLy8gdGhlbiB0aGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2Qgd291bGQgYmU6CisgICAgLy8gICAgIFQgZGF0YSA9IGRvQ29tcHV0YXRpb24oKTsKKyAgICAvLyAgICAgdGxOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFPihkYXRhKTsKKyAgICB0ZW1wbGF0ZTxFdmVudCBFPgorICAgIHZvaWQgICAgbG9nKHR5cGVuYW1lIGdldF9tYXBwZWQ8RT46OnR5cGUgZGF0YSkgeworICAgICAgICBsb2coRSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHZhbHVlIGZvciBhbGwgb2YgdGhlc2UgaXMgdGhlIHByZXZpb3VzIGlzRW5hYmxlZCgpCisgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKKyAgICBib29sICAgICAgICAgICAgZW5hYmxlKCkgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KKyAgICBib29sICAgICAgICAgICAgZGlzYWJsZSgpIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9CisKKyAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1JTWVtb3J5OyB9CisKKyAgICAvLyBQdWJsaWMgbG9nZ2luZyBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFsd2F5cyB1c2Ugb25lIG9mIHRoZQorICAgIC8vIHR3byBsb2coKSBmdW5jdGlvbiBjYWxscyBiZWxvdyB0byB3cml0ZSB0byBzaGFyZWQgbWVtb3J5LgorcHJvdGVjdGVkOgorICAgIC8vIFdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTyBpZiB0aGUgd3JpdGVyIGlzIGVuYWJsZWQuCisgICAgLy8gVGhpcyBpcyBwcm90ZWN0ZWQgYW5kIHZpcnR1YWwgYmVjYXVzZSBMb2NrZWRXcml0ZXIgdXNlcyBhIGxvY2sgdG8gcHJvdGVjdAorICAgIC8vIHdyaXRpbmcgdG8gdGhlIEZJRk8gYmVmb3JlIHdyaXRpbmcgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICAvLyBMb2cgYSBzaW5nbGUgRW50cnkgd2l0aCBjb3JyZXNwb25kaW5nIGV2ZW50LCBkYXRhLCBhbmQgbGVuZ3RoLgorICAgIHZvaWQgICAgbG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKworICAgIC8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIGxvZ2dpbmcgcGFydHMgb2YgYSBmb3JtYXR0ZWQgZW50cnkKKyAgICB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgdm9pZCAgICBsb2dUaW1lc3RhbXBGb3JtYXQoKTsKKyAgICB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOworCisgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWR7fTsgICAgICAgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQorICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeXt9OyAgICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm97fTsgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKiBjb25zdCBtRmlmb1dyaXRlcnt9OyAgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPLCBub24tTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKKworICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCisgICAgY2hhciAgICptUGlkVGFne307CisgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CitjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBMb2NrZWRXcml0ZXIoKSA9IGRlZmF1bHQ7CisgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLyBMb2NrIG5lZWRzIHRvIGJlIG9idGFpbmVkIGJlZm9yZSB3cml0aW5nIHRvIEZJRk8uCisgICAgdm9pZCBsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX05CTE9HX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA5MmU3MmI5Li42YWQwNDE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTU3Niw2ICs1NzYsNyBAQAogICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKICAgICAgIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAorICAgICAgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbVN0YXRlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WZW5kb3JFeHRlbnNpb25zU3RhdHVzKGtFeHRlbnNpb25zVW5jaGVja2VkKSB7CiAgICAgbWVtc2V0KCZtTGFzdEhEUlN0YXRpY0luZm8sIDAsIHNpemVvZihtTGFzdEhEUlN0YXRpY0luZm8pKTsKQEAgLTE3NDgsMjkgKzE3NDksMzIgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHN0b3JlTWV0YTsKLSAgICBpZiAoZW5jb2RlcgotICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKLSAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgewotICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlOwotICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljTmF0aXZlSGFuZGxlOwotICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8Ci0gICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgSU9NWDo6UG9ydE1vZGUgbW9kZSA9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXI7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8CisgICAgICAgICAgICAgICAgICAgIHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVyciA9IHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgbW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1c2FnZUJpdHM7Ci0gICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAgICAgJnVzYWdlQml0cywgc2l6ZW9mKHVzYWdlQml0cykpID09IE9LKSB7Ci0gICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgIGlmIChtb2RlICE9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKKyAgICAgICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjM0LDYgKzIyMzgsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwRUFDM0NvZGVjKGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKICAgICAgICAgfQorICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCkpIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gc2V0dXBBQzRDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMzQ1LDYgKzIzNTgsMTcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKSB7CisgICAgT01YX0FVRElPX0NPTkZJR19BTkRST0lEX0FVRElPUFJFU0VOVEFUSU9OIGNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgIGNvbmZpZy5uUHJlc2VudGF0aW9uSWQgPSAoT01YX1MzMilwcmVzZW50YXRpb25JZDsKKyAgICBjb25maWcublByb2dyYW1JZCA9IChPTVhfUzMyKXByb2dyYW1JZDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQXVkaW9QcmVzZW50YXRpb24sCisgICAgICAgICAgICAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KSB7CiAgICAgaWYgKHByaW9yaXR5IDwgMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjg5MCw2ICsyOTE0LDM4IEBACiAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEVhYzMsICZkZWYsIHNpemVvZihkZWYpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFDNENvZGVjKAorICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIHN0YXR1c190IGVyciA9IHNldHVwUmF3QXVkaW9Gb3JtYXQoCisgICAgICAgICAgICBlbmNvZGVyID8ga1BvcnRJbmRleElucHV0IDoga1BvcnRJbmRleE91dHB1dCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIEFMT0dXKCJBQzQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBkZWYubkNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7CisgICAgZGVmLm5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAgIHJldHVybiBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKK30KKwogc3RhdGljIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgcGlja01vZGVGcm9tQml0UmF0ZSgKICAgICAgICAgYm9vbCBpc0FNUldCLCBpbnQzMl90IGJwcykgewogICAgIGlmIChpc0FNUldCKSB7CkBAIC0zNzEwLDggKzM3NjYsMTcgQEAKICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFJTdGF0aWNJbmZvIiwgJm1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFIxMFBsdXNJbmZvIiwgJm1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKSB7CkBAIC01MjQzLDYgKzUzMDgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEFDNDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgcGFyYW1zOwpAQCAtNTMyMyw2ICs1NDA3LDcwIEBACiAgICAgcmV0dXJuIGdldFZlbmRvclBhcmFtZXRlcnMocG9ydEluZGV4LCBub3RpZnkpOwogfQogCitEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIEFDb2RlYzo6Z2V0SERSMTBQbHVzSW5mbyhzaXplX3QgcGFyYW1TaXplVXNlZCkgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0SERSMTBQbHVzSW5mbzogZG9lcyBub3Qgc3VwcG9ydCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IG5ld1NpemUgPSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSAtIDEgKworICAgICAgICAgICAgKChwYXJhbVNpemVVc2VkID4gMCkgPyBwYXJhbVNpemVVc2VkIDogNTEyKTsKKyAgICBpZiAobUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgbmV3U2l6ZSA+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdTaXplKTsKKyAgICB9CisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPQorICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKW1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5kYXRhKCk7CisgICAgSW5pdE9NWFBhcmFtcyhjb25maWcpOworICAgIGNvbmZpZy0+blNpemUgPSBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpOworICAgIGNvbmZpZy0+blBvcnRJbmRleCA9IDE7CisgICAgc2l6ZV90IHBhcmFtU2l6ZSA9IGNvbmZpZy0+blNpemUgLSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSArIDE7CisgICAgY29uZmlnLT5uUGFyYW1TaXplID0gcGFyYW1TaXplOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPSAwOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5nZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSltRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgICBjb25maWcsIGNvbmZpZy0+blNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIChlcnIgJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChjb25maWctPm5QYXJhbVNpemUgIT0gcGFyYW1TaXplKSB7CisgICAgICAgIEFMT0dFKCJEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgYWx0ZXJzIG5QYXJhbVNpemU6ICV1IHZzICV6dSIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5uUGFyYW1TaXplLCBwYXJhbVNpemUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKHBhcmFtU2l6ZVVzZWQgPiAwICYmIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgIT0gcGFyYW1TaXplVXNlZCkgeworICAgICAgICBBTE9HRSgiRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIHJldHVybnMgd3JvbmcgblBhcmFtU2l6ZVVzZWQ6ICV1IHZzICV6dSIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCwgcGFyYW1TaXplVXNlZCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29uZmlnOworfQorCit2b2lkIEFDb2RlYzo6b25Db25maWdVcGRhdGUoT01YX0lOREVYVFlQRSBjb25maWdJbmRleCkgeworICAgIGlmIChtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPT0gMAorICAgICAgICAgICAgfHwgY29uZmlnSW5kZXggIT0gbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KSB7CisgICAgICAgIC8vIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCBpcyB0aGUgb25seSB1cGRhdGUgd2UgcmVjb2duaXplIG5vdworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICpjb25maWcgPSBnZXRIRFIxMFBsdXNJbmZvKCk7CisgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQgPiBjb25maWctPm5QYXJhbVNpemUpIHsKKyAgICAgICAgLy8gdHJ5IGFnYWluIHdpdGggdGhlIHNpemUgc3BlY2lmaWVkCisgICAgICAgIGNvbmZpZyA9IGdldEhEUjEwUGx1c0luZm8oY29uZmlnLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGFuIG91dHB1dCBmb3JtYXQgY2hhbmdlZCBldmVudAorICAgIG1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwKKyAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25maWctPm5WYWx1ZSwgY29uZmlnLT5uUGFyYW1TaXplVXNlZCkpOworfQorCiB2b2lkIEFDb2RlYzo6b25EYXRhU3BhY2VDaGFuZ2VkKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ29sb3JBc3BlY3RzICZhc3BlY3RzKSB7CiAgICAgLy8gYXNwZWN0cyBhcmUgbm9ybWFsbHkgY29tbXVuaWNhdGVkIGluIENvbG9yQXNwZWN0cwogICAgIGludDMyX3QgcmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlcjsKQEAgLTU1NTgsNiArNTcwNiwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOiB7CisgICAgICAgICAgICBBTE9HVigiTm8tb3AgYnkgZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTYyNTgsNiArNjQxMSwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgaWYgKGJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyKSB7CisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyID0gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHNhdmUgYnVmZmVycyBzZW50IHRvIHRoZSBzdXJmYWNlIHNvIHdlIGNhbiBnZXQgcmVuZGVyIHRpbWUgd2hlbiB0aGV5IHJldHVybgogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CkBAIC03Mzg0LDEyICs3NTQ2LDU3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHByZXNlbnRhdGlvbklkID0gLTE7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIiwgJnByZXNlbnRhdGlvbklkKSkgeworICAgICAgICBpbnQzMl90IHByb2dyYW1JZCA9IC0xOworICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByb2dyYW0taWQiLCAmcHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9QcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZhaWxlZCBzZXRBdWRpb1ByZXNlbnRhdGlvbi4gRmFpbHVyZSBpcyBmaW5lIHNpbmNlIHRoaXMga2V5IGlzIG9wdGlvbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAodm9pZClzZXRIZHIxMFBsdXNJbmZvKGhkcjEwUGx1c0luZm8pOworICAgIH0KKwogICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgogICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZHIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyBoZHIxMFBsdXNJbmZvLT5zaXplKCkgLSAxOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMDsKKyAgICBjb25maWctPm5TaXplID0gbmV3U2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBtZW1jcHkoY29uZmlnLT5uVmFsdWUsIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLy8gUmVtb3ZlcyB0cmFpbGluZyB0YWdzIG1hdGNoaW5nIHx0YWd8IGZyb20gfGtleXwgKGUuZy4gYSBzZXR0aW5ncyBuYW1lKS4gfG1pbkxlbmd0aHwgc3BlY2lmaWVzCiAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBrZWVwIGluIHxrZXl8IChldmVuIGlmIGl0IGhhcyB0cmFpbGluZyB0YWdzKS4KIC8vIChVc2VkIHRvIHJlbW92ZSB0cmFpbGluZyAndmFsdWUnIHRhZ3MgaW4gc2V0dGluZ3MgbmFtZXMsIGUuZy4gdG8gbm9ybWFsaXplCkBAIC03ODExLDYgKzgwMTgsMTUgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRDb25maWdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKworICAgICAgICAgICAgbUNvZGVjLT5vbkNvbmZpZ1VwZGF0ZSgoT01YX0lOREVYVFlQRSlkYXRhMik7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfRXZlbnRCdWZmZXJGbGFnOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTc4NzUsNiArODA5MSwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzg4Niw2ICs4MTE0LDExIEBACiB2b2lkIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7CiAgICAgQUxPR1YoIlslc10gTm93IGhhbmRsaW5nIG91dHB1dCBwb3J0IHNldHRpbmdzIGNoYW5nZSIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoCkBAIC04MTQ4LDYgKzgzODEsMTEgQEAKICAgICBBTE9HVigiWyVzXSBOb3cgRmx1c2hpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSA9IG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODE2Miw2ICs4NDAwLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTgxODIsNiArODQyMSwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCA3MTBhZTY4Li4yNjZhMjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMTI5LDYgKzEyOSw3IEBACiAgICAgICAgIHNlY3VyZUhhbmRsZSA9IHN0YXRpY19jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihzZWN1cmVEYXRhLT5nZXREZXN0aW5hdGlvblBvaW50ZXIoKSk7CiAgICAgfQogICAgIHNzaXplX3QgcmVzdWx0ID0gLTE7CisgICAgc3NpemVfdCBjb2RlY0RhdGFPZmZzZXQgPSAwOwogICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgZGVzdGluYXRpb247CiAgICAgICAgIGlmIChzZWN1cmUpIHsKQEAgLTE4MCw5ICsxODEsMTYgQEAKIAogICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKICAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CiAKICAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAotICAgICAgICAgICAgICAgIGtleSAhPSBOVUxMID8gKFNjcmFtYmxpbmdDb250cm9sKWtleVswXSA6IFNjcmFtYmxpbmdDb250cm9sOjpVTlNDUkFNQkxFRCwKKyAgICAgICAgICAgICAgICBzY3RybCwKICAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgMCwKQEAgLTIwMiw2ICsyMTAsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogICAgICAgICBBTE9HVigiZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIHJlc3VsdCk7CiAKICAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKQEAgLTIxMCw3ICsyMjMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKKyAgICBpdC0+bUNvZGVjQnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CiAKICAgICAvLyBDb3B5IG1ldGFkYXRhIGZyb20gY2xpZW50IHRvIGNvZGVjIGJ1ZmZlci4KICAgICBpdC0+bUNvZGVjQnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OWI4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FTdGF0ZTo6QVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQorICAgIDogbVBhcmVudFN0YXRlKHBhcmVudFN0YXRlKSB7Cit9CisKK0FTdGF0ZTo6fkFTdGF0ZSgpIHsKK30KKworc3A8QVN0YXRlPiBBU3RhdGU6OnBhcmVudFN0YXRlKCkgeworICAgIHJldHVybiBtUGFyZW50U3RhdGU7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7Cit9CisKK3ZvaWQgQVN0YXRlOjpzdGF0ZUV4aXRlZCgpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKK30KKworQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKKworICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOworICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiAhY3VyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpKSB7CisgICAgICAgIC8vIElmIHlvdSBjbGFpbSBub3QgdG8gaGF2ZSBoYW5kbGVkIHRoZSBtZXNzYWdlIHlvdSBzaG91bGRuJ3QKKyAgICAgICAgLy8gaGF2ZSBjYWxsZWQgc2V0U3RhdGUuLi4KKyAgICAgICAgQ0hFQ0soc2F2ZSA9PSBtU3RhdGUpOworCisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJXYXJuaW5nIG1lc3NhZ2UgJXMgdW5oYW5kbGVkIGluIHJvb3Qgc3RhdGUuIiwKKyAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKK30KKwordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSkgeworICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKKyAgICAgICAgLy8gUXVpY2sgZXhpdCBmb3IgdGhlIGVhc3kgY2FzZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQTsKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEEucHVzaChjdXIpOworICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEI7CisgICAgY3VyID0gc3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBCLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBjb21tb24gdGFpbC4KKyAgICB3aGlsZSAoQS5zaXplKCkgPiAwICYmIEIuc2l6ZSgpID4gMCAmJiBBLnRvcCgpID09IEIudG9wKCkpIHsKKyAgICAgICAgQS5wb3AoKTsKKyAgICAgICAgQi5wb3AoKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBzdGF0ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQS5zaXplKCk7ICsraSkgeworICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOworICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IGJjNzU2OWYuLjMzODhlZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtMzksNyArMzksNyBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiLCAibGlibWVkaWFuZGsiXSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtNzcsMTYgKzc3LDE2IEBACiAgICAgfSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0IiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFBQ1dyaXRlci5jcHAiLAogICAgICAgICAiQUNvZGVjLmNwcCIsCiAgICAgICAgICJBQ29kZWNCdWZmZXJDaGFubmVsLmNwcCIsCi0gICAgICAgICJBQUNXcml0ZXIuY3BwIiwKKyAgICAgICAgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIiwKICAgICAgICAgIkFNUldyaXRlci5jcHAiLAogICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKLSAgICAgICAgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAiLAogICAgICAgICAiQXVkaW9Tb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlckltcGwuY3BwIiwKICAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLApAQCAtOTYsNiArOTYsNyBAQAogICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLApAQCAtMTEwLDEyICsxMTEsMTYgQEAKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0LmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY1NvdXJjZS5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAogICAgICAgICAiTWVkaWFTeW5jLmNwcCIsCisgICAgICAgICJNZWRpYVRyYWNrLmNwcCIsCisgICAgICAgICJodHRwL0NsZWFyTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAogICAgICAgICAiTWVkaWFNdXhlci5jcHAiLAogICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJPZ2dXcml0ZXIuY3BwIiwKICAgICAgICAgIk9NWENsaWVudC5jcHAiLAogICAgICAgICAiT214SW5mb0J1aWxkZXIuY3BwIiwKICAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCkBAIC0xMjgsMTEgKzEzMywxMyBAQAogICAgICAgICAiU3VyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJVdGlscy5jcHAiLAogICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAogICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYmN1dGlscyIsCkBAIC0xNTQsNiArMTYxLDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vcHVzX2NvbW1vbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgICAgICAibGliUlNjcHAiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKQEAgLTE3NCwxMiArMTgyLDE3IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgICAgICJsaWJ2cHgiLAorICAgICAgICAibGlib2dnIiwKICAgICAgICAgImxpYndlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLApAQCAtMjE0LDU4ICsyMjcsMzQgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCisgICAgICAgICJDbGVhckZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKLSAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKLSAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKICAgICAgICAgIk5ka1V0aWxzLmNwcCIsCi0gICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKLSAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKLSAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLSAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKLSAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAorICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTE4NTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1ByZXNlbnRhdGlvbkluZm86OkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLX0KLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjp+QXVkaW9QcmVzZW50YXRpb25JbmZvKCkgewotICAgIG1QcmVzZW50YXRpb25zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9QcmVzZW50YXRpb25JbmZvOjphZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbikgewotICAgIG1QcmVzZW50YXRpb25zLnB1c2gocHJlc2VudGF0aW9uKTsKLX0KLQotc2l6ZV90IEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6Y291bnRQcmVzZW50YXRpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtUHJlc2VudGF0aW9ucy5zaXplKCk7Ci19Ci0KLS8vIFJldHVybnMgYW4gQXVkaW9QcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlbiB2YWxpZCBpbmRleAotLy8gaW5kZXggbXVzdCBiZSA+PTAgYW5kIDwgY291bnRQcmVzZW50YXRpb25zKCkKLWNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnNbaW5kZXhdOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhMmNiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyRmlsZVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2xlYXJGaWxlU291cmNlOjpDbGVhckZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtRmQoLTEpLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1MZW5ndGgoLTEpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKworICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7CisgICAgfQorICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKKworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitDbGVhckZpbGVTb3VyY2U6OkNsZWFyRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKKyAgICA6IG1GZChmZCksCisgICAgICBtT2Zmc2V0KG9mZnNldCksCisgICAgICBtTGVuZ3RoKGxlbmd0aCksCisgICAgICBtTmFtZSgiPG51bGw+IikgeworICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAorICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOworCisgICAgaWYgKG1PZmZzZXQgPCAwKSB7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgIH0KKyAgICBpZiAobUxlbmd0aCA8IDApIHsKKyAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgeworICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgczsKKyAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7CisgICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOworICAgICAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKKyAgICB9CisKKyAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAorICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOworCit9CisKK0NsZWFyRmlsZVNvdXJjZTo6fkNsZWFyRmlsZVNvdXJjZSgpIHsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgOjpjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9Cit9CisKK3N0YXR1c190IENsZWFyRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKK30KKworc3NpemVfdCBDbGVhckZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtTGVuZ3RoID49IDApIHsKKyAgICAgICAgaWYgKG9mZnNldCA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIEVPRi4KKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgICBpZiAoKHVpbnQ2NF90KXNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3NzaXplX3QgQ2xlYXJGaWxlU291cmNlOjpyZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIDo6cmVhZChtRmQsIGRhdGEsIHNpemUpOworfQorCitzdGF0dXNfdCBDbGVhckZpbGVTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1MZW5ndGg7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCmluZGV4IGVlZjUzMTQuLmFlZTdmZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCkBAIC0yMiw5MCArMjIsMjggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRmlsZVNvdXJjZTo6RmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKLSAgICA6IG1GZCgtMSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbUxlbmd0aCgtMSksCi0gICAgICBtTmFtZSgiPG51bGw+IiksCisgICAgOiBDbGVhckZpbGVTb3VyY2UoZmlsZW5hbWUpLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKICAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCiAgICAgICBtRHJtQnVmU2l6ZSgwKSwKICAgICAgIG1Ecm1CdWYoTlVMTCl7Ci0KLSAgICBpZiAoZmlsZW5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkZpbGVTb3VyY2UoJXMpIiwgZmlsZW5hbWUpOwotICAgIH0KLSAgICBBTE9HVigiJXMiLCBmaWxlbmFtZSk7Ci0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19MQVJHRUZJTEUgfCBPX1JET05MWSk7Ci0KLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IGxzZWVrNjQobUZkLCAwLCBTRUVLX0VORCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGZpbGUgJyVzJy4gKCVzKSIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KIH0KIAogRmlsZVNvdXJjZTo6RmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLSAgICA6IG1GZChmZCksCi0gICAgICBtT2Zmc2V0KG9mZnNldCksCi0gICAgICBtTGVuZ3RoKGxlbmd0aCksCi0gICAgICBtTmFtZSgiPG51bGw+IiksCisgICAgOiBDbGVhckZpbGVTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCiAgICAgICBtRHJtQnVmT2Zmc2V0KDApLAogICAgICAgbURybUJ1ZlNpemUoMCksCiAgICAgICBtRHJtQnVmKE5VTEwpIHsKLSAgICBBTE9HVigiZmQ9JWQgKCVzKSwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwKLSAgICAgICAgICAgIGZkLCBuYW1lRm9yRmQoZmQpLmNfc3RyKCksIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoKTsKLQotICAgIGlmIChtT2Zmc2V0IDwgMCkgewotICAgICAgICBtT2Zmc2V0ID0gMDsKLSAgICB9Ci0gICAgaWYgKG1MZW5ndGggPCAwKSB7Ci0gICAgICAgIG1MZW5ndGggPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA+IElOVDY0X01BWCAtIG1PZmZzZXQpIHsKLSAgICAgICAgbUxlbmd0aCA9IElOVDY0X01BWCAtIG1PZmZzZXQ7Ci0gICAgfQotICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgaWYgKGZzdGF0KGZkLCAmcykgPT0gMCkgewotICAgICAgICBpZiAobU9mZnNldCA+IHMuc3Rfc2l6ZSkgewotICAgICAgICAgICAgbU9mZnNldCA9IHMuc3Rfc2l6ZTsKLSAgICAgICAgICAgIG1MZW5ndGggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtT2Zmc2V0ICsgbUxlbmd0aCA+IHMuc3Rfc2l6ZSkgewotICAgICAgICAgICAgbUxlbmd0aCA9IHMuc3Rfc2l6ZSAtIG1PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1PZmZzZXQgIT0gb2Zmc2V0IHx8IG1MZW5ndGggIT0gbGVuZ3RoKSB7Ci0gICAgICAgIEFMT0dXKCJvZmZzZXQvbGVuZ3RoIGFkanVzdGVkIGZyb20gJWxsZC8lbGxkIHRvICVsbGQvJWxsZCIsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgsCi0gICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwgKGxvbmcgbG9uZykgbUxlbmd0aCk7Ci0gICAgfQotCi0gICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAiRmlsZVNvdXJjZShmZCglcyksICVsbGQsICVsbGQpIiwKLSAgICAgICAgICAgIG5hbWVGb3JGZChmZCkuY19zdHIoKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsCi0gICAgICAgICAgICAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLQogfQogCiBGaWxlU291cmNlOjp+RmlsZVNvdXJjZSgpIHsKLSAgICBpZiAobUZkID49IDApIHsKLSAgICAgICAgOjpjbG9zZShtRmQpOwotICAgICAgICBtRmQgPSAtMTsKLSAgICB9Ci0KICAgICBpZiAobURybUJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgIGRlbGV0ZVtdIG1Ecm1CdWY7CiAgICAgICAgIG1Ecm1CdWYgPSBOVUxMOwpAQCAtMTI0LDEwICs2Miw2IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1GZCA+PSAwID8gT0sgOiBOT19JTklUOwotfQotCiBzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAobUZkIDwgMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE0NywzMCArODEsMTIgQEAKIAogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMICYmIERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQKICAgICAgICAgICAgID09IG1EZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSkgewotICAgICAgICByZXR1cm4gcmVhZEF0RFJNKG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZWFkQXREUk1fbChvZmZzZXQsIGRhdGEsIHNpemUpOwogICAgfSBlbHNlIHsKLSAgICAgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDo6cmVhZChtRmQsIGRhdGEsIHNpemUpOworICAgICAgICByZXR1cm4gcmVhZEF0X2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEZpbGVTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUZkIDwgMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1MZW5ndGg7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHNwPERlY3J5cHRIYW5kbGU+IEZpbGVTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBpZiAoZ2V0dWlkKCkgPT0gQUlEX01FRElBX0VYKSByZXR1cm4gbnVsbHB0cjsgLy8gbm8gRFJNIGluIG1lZGlhIGV4dHJhY3RvcgogICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CkBAIC0xOTQsNyArMTEwLDcgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLXNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk1fbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBzaXplX3QgRFJNX0NBQ0hFX1NJWkUgPSAxMDI0OwogICAgIGlmIChtRHJtQnVmID09IE5VTEwpIHsKICAgICAgICAgbURybUJ1ZiA9IG5ldyB1bnNpZ25lZCBjaGFyW0RSTV9DQUNIRV9TSVpFXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCmluZGV4IDZlOTQ1MTcuLmM2MmMwNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtNTAxLDkgKzUwMSwxNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzcmNGb3JtYXQ7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJmb3JtYXQgbWlzc2luZyBkaW1lbnNpb24gb3IgY29sb3I6ICVzIiwKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CkBAIC01MjIsMTkgKzUyOCwyNyBAQAogICAgIGFkZEZyYW1lKGZyYW1lTWVtKTsKICAgICBWaWRlb0ZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihmcmFtZU1lbS0+cG9pbnRlcigpKTsKIAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CisgICAgICAgIHN0YW5kYXJkID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgeworICAgICAgICByYW5nZSA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAwOworICAgIH0KKyAgICBjb252ZXJ0ZXIuc2V0U3JjQ29sb3JTcGFjZShzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyKTsKKwogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCwgZnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC02ODEsOSArNjk1LDEwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpKTsKIAogICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgewogICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKQEAgLTY5OCw2ICs3MTMsMTggQEAKIAogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207CiAgICAgZHN0TGVmdCA9IG1UaWxlc0RlY29kZWQgJSBtR3JpZENvbHMgKiB3aWR0aDsKICAgICBkc3RUb3AgPSBtVGlsZXNEZWNvZGVkIC8gbUdyaWRDb2xzICogaGVpZ2h0OwpAQCAtNzI3LDExICs3NTQsMTAgQEAKICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewogICAgICAgICBjb252ZXJ0ZXIuY29udmVydCgKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKICAgICAgICAgICAgICAgICBtRnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBtRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgbUZyYW1lLT5tV2lkdGgsIG1GcmFtZS0+bUhlaWdodCwgbUZyYW1lLT5tUm93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAppbmRleCAwZjI0MzI5Li4wM2UwZDEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCkBAIC0xMTQsMzAgKzExNCw0IEBACiAgICAgbU1heEJhbmR3aWR0aEhpc3RvcnlJdGVtcyA9IG51bUhpc3RvcnlJdGVtczsKIH0KIAotLy8gc3RhdGljCi12b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7Ci0gICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0YWdnaW5nIHNvY2tldCAlZCBmb3IgdWlkICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCB1aWQsIGdldGV1aWQoKSk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7Ci0gICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKSB7Ci0gICAgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhzb2NrZmQsIGdldGV1aWQoKSk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggNmZmM2Q3OC4uYTQ4NDY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMzY3NCw2ICszNjc0LDI5IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgLy8gVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkKKworICAgIC8vICBIQUNLIHRvIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZSBJU08gc3RhbmRhcmQuCisgICAgLy8KKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgaXMgYWRkZWQgZnJvbSBBUEkgMjYgYW5kIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAorICAgIC8vICBmdWxseSBmb2xsb3dlZCB0aGUgVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMTItMjAxNQorICAgIC8vICBpbiB0aGF0IG9ubHkgdGhlIG1pbWVfZm9ybWF0IGlzIHdyaXR0ZW4gb3V0LiBjb250ZW50X2VuY29kaW5nIGFuZAorICAgIC8vICBkYXRhX3JlZmVyZW5jZV9pbmRleCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gb3V0LiBUaGlzIGxlYWRzIHRvIHRoZSBmYWlsdXJlCisgICAgLy8gIHdoZW4gc29tZSBNUDQgcGFyc2VyIHRyaWVzIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSB0cmFjayBhY2NvcmRpbmcgdG8gdGhlCisgICAgLy8gIHN0YW5kYXJkLiBUaGUgaGFjayBoZXJlIHdpbGwgbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlCisgICAgLy8gIHN0YW5kYXJkIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHdvdWxkIGVuYWJsZQorICAgIC8vICBBbmRyb2lkIHZlcnNpb25zIGJlZm9yZSBBUEkgMjkgdG8gYmUgYWJsZSB0byByZWFkIG91dCB0aGUgc3RhbmRhcmQgY29tcGxpYW50CisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGdlbmVyYXRlZCB3aXRoIEFuZHJvaWQgQVBJIDI5IGFuZCB1cHdhcmQuIFRoZSB0cmljayBpcyBiYXNlZAorICAgIC8vICBvbiB0aGUgZmFjdCB0aGF0IHRoZSBNZXRhZGF0YSB0cmFjayBtdXN0IHN0YXJ0IHdpdGggcHJlZml4IOKAnGFwcGxpY2F0aW9uL+KAnSBhbmQKKyAgICAvLyAgdGhvc2UgbWlzc2luZyBmaWVsZHMgYXJlIG5vdCB1c2VkIGluIEFuZHJvaWQncyBNZXRhZGF0YSB0cmFjay4gQnkgd3JpdHRpbmcKKyAgICAvLyAgb3V0IHRoZSBtaW1lX2Zvcm1hdCB0d2ljZSwgdGhlIGZpcnN0IG1pbWVfZm9ybWF0IHdpbGwgYmUgdXNlZCB0byBmaWxsIG91dCB0aGUKKyAgICAvLyAgbWlzc2luZyByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgZmllbGRzLiBPbiB0aGUKKyAgICAvLyAgcGFyc2VyIHNpZGUsIHRoZSBleHRyYWN0ZXIgYmVmb3JlIEFQSSAyOSAgd2lsbCByZWFkIG91dCB0aGUgZmlyc3QgbWltZV9mb3JtYXQKKyAgICAvLyAgY29ycmVjdGx5IGFuZCBkcm9wIHRoZSBzZWNvbmQgbWltZV9mb3JtYXQuIFRoZSBleHRyYWN0b3IgZnJvbSBBUEkgMjkgd2lsbAorICAgIC8vICBjaGVjayBpZiB0aGUgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGFyZSBmaWxsZWQKKyAgICAvLyAgd2l0aCDigJxhcHBsaWNhdGlvbuKAnSB0byBkZXRlY3QgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjaworICAgIC8vICBhbmQgcmVhZCBvdXQgdGhlIGRhdGEgYWNjb3JkaW5nbHkuCisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7CisKICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsgIC8vIG1ldGFkYXRhIG1pbWVfZm9ybWF0CiAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gbWV0dAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCAxMjBjODY0Li5iZDllMmJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMjE5Nyw2ICsyMTk3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfaGRyMTBfcGx1c19tZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtU3VyZmFjZSwgbVJvdGF0aW9uRGVncmVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjY3NCw3ICsyNjgxLDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTExOTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhRXh0cmFjdG9yOjpNZWRpYUV4dHJhY3RvcigpIHsKKyAgICBpZiAoIUxPR19OREVCVUcpIHsKKyAgICAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7CisgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKKyAgICAgICAgQUxPR1YoImV4dHJhY3RvciBjcmVhdGVkIGluIHVpZDogJWQgKCVzKSIsIGdldHVpZCgpLCBwdy0+cHdfbmFtZSk7CisgICAgfQorfQorCitNZWRpYUV4dHJhY3Rvcjo6fk1lZGlhRXh0cmFjdG9yKCkge30KKwordWludDMyX3QgTWVkaWFFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fUEFVU0UgfCBDQU5fU0VFSzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKENNZWRpYUV4dHJhY3RvciAqcGx1Z2luKSB7CisgICAgdGhpcy0+cGx1Z2luID0gcGx1Z2luOworfQorCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6On5NZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoKSB7CisgICAgcGx1Z2luLT5mcmVlKHBsdWdpbi0+ZGF0YSk7CisgICAgZnJlZShwbHVnaW4pOworfQorCitzaXplX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gcGx1Z2luLT5jb3VudFRyYWNrcyhwbHVnaW4tPmRhdGEpOworfQorCitNZWRpYVRyYWNrICpNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIHJldHVybiBuZXcgTWVkaWFUcmFja0NVbndyYXBwZXIocGx1Z2luLT5nZXRUcmFjayhwbHVnaW4tPmRhdGEsIGluZGV4KSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0VHJhY2tNZXRhRGF0YShwbHVnaW4tPmRhdGEsIGZvcm1hdCwgaW5kZXgsIGZsYWdzKTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSBmb3JtYXQ7CisgICAgbWV0YSA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBwbHVnaW4tPmdldE1ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSBmb3JtYXQ7CisgICAgbWV0YSA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitjb25zdCBjaGFyICogTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpuYW1lKCkgeworICAgIHJldHVybiBwbHVnaW4tPm5hbWUocGx1Z2luLT5kYXRhKTsKK30KKwordWludDMyX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gcGx1Z2luLT5mbGFncyhwbHVnaW4tPmRhdGEpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBwbHVnaW4tPnNldE1lZGlhQ2FzKHBsdWdpbi0+ZGF0YSwgY2FzVG9rZW4sIHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKaW5kZXggYjBiZjI2OS4uMmM3YTRlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCkBAIC0xOCwxNCArMTgsMTUgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9kbGV4dC5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CkBAIC0zNiw2ICszNywyMyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAKKy8vIENvcGllZCBmcm9tIEdyYXBoaWNzRW52LmNwcAorLy8gVE9ETyhiLzM3MDQ5MzE5KSBHZXQgdGhpcyBmcm9tIGEgaGVhZGVyIG9uY2Ugb25lIGV4aXN0cworZXh0ZXJuICJDIiB7CisgIGFuZHJvaWRfbmFtZXNwYWNlX3QqIGFuZHJvaWRfY3JlYXRlX25hbWVzcGFjZShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGRfbGlicmFyeV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdF9saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGVybWl0dGVkX3doZW5faXNvbGF0ZWRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QqIHBhcmVudCk7CisgIGJvb2wgYW5kcm9pZF9saW5rX25hbWVzcGFjZXMoYW5kcm9pZF9uYW1lc3BhY2VfdCogZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX25hbWVzcGFjZV90KiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFyZWRfbGlic19zb25hbWVzKTsKKyAgZW51bSB7CisgICAgIEFORFJPSURfTkFNRVNQQUNFX1RZUEVfSVNPTEFURUQgPSAxLAorICB9OworfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYwpAQCAtNzYsMjUgKzk0LDMwIEBACiAgICAgc291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihudWxscHRyIC8qIG1pbWUgKi8pOwogCiAgICAgdm9pZCAqbWV0YSA9IG51bGxwdHI7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGNyZWF0b3IgPSBOVUxMOwotICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOworICAgIHZvaWQgKmNyZWF0b3IgPSBOVUxMOworICAgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgY29uZmlkZW5jZTsKICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+IHBsdWdpbjsKLSAgICBjcmVhdG9yID0gc25pZmYoc291cmNlLmdldCgpLCAmY29uZmlkZW5jZSwgJm1ldGEsICZmcmVlTWV0YSwgcGx1Z2luKTsKKyAgICB1aW50MzJfdCBjcmVhdG9yVmVyc2lvbiA9IDA7CisgICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbiwgJmNyZWF0b3JWZXJzaW9uKTsKICAgICBpZiAoIWNyZWF0b3IpIHsKICAgICAgICAgQUxPR1YoIkZBSUxFRCB0byBhdXRvZGV0ZWN0IG1lZGlhIGNvbnRlbnQuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yICpyZXQgPSBjcmVhdG9yKHNvdXJjZS5nZXQoKSwgbWV0YSk7Ci0gICAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgIE1lZGlhRXh0cmFjdG9yICpleCA9IG51bGxwdHI7CisgICAgaWYgKGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSkgeworICAgICAgICBDTWVkaWFFeHRyYWN0b3IgKnJldCA9ICgoQ3JlYXRvckZ1bmMpY3JlYXRvcikoc291cmNlLT53cmFwKCksIG1ldGEpOworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgICAgICB9CisgICAgICAgIGV4ID0gcmV0ICE9IG51bGxwdHIgPyBuZXcgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKHJldCkgOiBudWxscHRyOwogICAgIH0KIAogICAgIEFMT0dWKCJDcmVhdGVkIGFuIGV4dHJhY3RvciAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgIHJldCAhPSBudWxscHRyID8gcmV0LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CisgICAgICAgICBleCAhPSBudWxscHRyID8gZXgtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKIAotICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7CisgICAgcmV0dXJuIENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcihleCwgc291cmNlLCBwbHVnaW4pOwogfQogCiAvL3N0YXRpYwpAQCAtMTA1LDE0ICsxMjgsMTQgQEAKIH0KIAogc3RydWN0IEV4dHJhY3RvclBsdWdpbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZjsKKyAgICBFeHRyYWN0b3JEZWYgZGVmOwogICAgIHZvaWQgKmxpYkhhbmRsZTsKICAgICBTdHJpbmc4IGxpYlBhdGg7CiAgICAgU3RyaW5nOCB1dWlkU3RyaW5nOwogCi0gICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgIEV4dHJhY3RvclBsdWdpbihFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQogICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIEV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgewogICAgICAgICAgICAgdXVpZFN0cmluZy5hcHBlbmRGb3JtYXQoIiUwMngiLCBkZWYuZXh0cmFjdG9yX3V1aWQuYltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjUsMTcgKzE0OCwyNSBAQAogfTsKIAogTXV0ZXggTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luTXV0ZXg7Ci1zdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKK3N0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CiBib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Citib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z0lnbm9yZVZlcnNpb24gPSBmYWxzZTsKK3N0ZDo6c3RyaW5nIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z0xpbmtlZExpYnJhcmllczsKIAogLy8gc3RhdGljCi1NZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpzbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6U2V0TGlua2VkTGlicmFyaWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5rZWRMaWJyYXJpZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKKyAgICBnTGlua2VkTGlicmFyaWVzID0gbGlua2VkTGlicmFyaWVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQgKk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6c25pZmYoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pIHsKICAgICAqY29uZmlkZW5jZSA9IDAuMGY7CiAgICAgKm1ldGEgPSBudWxscHRyOwogCi0gICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gcGx1Z2luczsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnUGx1Z2luTXV0ZXgpOwogICAgICAgICBpZiAoIWdQbHVnaW5zUmVnaXN0ZXJlZCkgewpAQCAtMTQ0LDEzICsxNzUsMjAgQEAKICAgICAgICAgcGx1Z2lucyA9IGdQbHVnaW5zOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjdXJDcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgYmVzdENyZWF0b3IgPSBOVUxMOworICAgIHZvaWQgKmJlc3RDcmVhdG9yID0gTlVMTDsKICAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBwbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBBTE9HVigic25pZmZpbmcgJXMiLCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl9uYW1lKTsKICAgICAgICAgZmxvYXQgbmV3Q29uZmlkZW5jZTsKICAgICAgICAgdm9pZCAqbmV3TWV0YSA9IG51bGxwdHI7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOwotICAgICAgICBpZiAoKGN1ckNyZWF0b3IgPSAoKml0KS0+ZGVmLnNuaWZmKHNvdXJjZSwgJm5ld0NvbmZpZGVuY2UsICZuZXdNZXRhLCAmbmV3RnJlZU1ldGEpKSkgeworICAgICAgICBGcmVlTWV0YUZ1bmMgbmV3RnJlZU1ldGEgPSBudWxscHRyOworCisgICAgICAgIHZvaWQgKmN1ckNyZWF0b3IgPSBOVUxMOworICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYuc25pZmYudjIoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyQ3JlYXRvcikgewogICAgICAgICAgICAgaWYgKG5ld0NvbmZpZGVuY2UgPiAqY29uZmlkZW5jZSkgewogICAgICAgICAgICAgICAgICpjb25maWRlbmNlID0gbmV3Q29uZmlkZW5jZTsKICAgICAgICAgICAgICAgICBpZiAoKm1ldGEgIT0gbnVsbHB0ciAmJiAqZnJlZU1ldGEgIT0gbnVsbHB0cikgewpAQCAtMTYwLDYgKzE5OCw3IEBACiAgICAgICAgICAgICAgICAgKmZyZWVNZXRhID0gbmV3RnJlZU1ldGE7CiAgICAgICAgICAgICAgICAgcGx1Z2luID0gKml0OwogICAgICAgICAgICAgICAgIGJlc3RDcmVhdG9yID0gY3VyQ3JlYXRvcjsKKyAgICAgICAgICAgICAgICAqY3JlYXRvclZlcnNpb24gPSAoKml0KS0+ZGVmLmRlZl92ZXJzaW9uOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAobmV3TWV0YSAhPSBudWxscHRyICYmIG5ld0ZyZWVNZXRhICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgbmV3RnJlZU1ldGEobmV3TWV0YSk7CkBAIC0xNzMsMTAgKzIxMiw5IEBACiAKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKLSAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICAvLyBzYW5pdHkgY2hlY2sgY2hlY2sgc3RydWN0IHZlcnNpb24sIHV1aWQsIG5hbWUKLSAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPT0gMAotICAgICAgICAgICAgfHwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPiBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04pIHsKKyAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CiAgICAgICAgIEFMT0dFKCJkb24ndCB1bmRlcnN0YW5kIGV4dHJhY3RvciBmb3JtYXQgJXUsIGlnbm9yaW5nLiIsIHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE5Miw3ICsyMzAsNyBAQAogICAgIGZvciAoYXV0byBpdCA9IHBsdWdpbkxpc3QuYmVnaW4oKTsgaXQgIT0gcGx1Z2luTGlzdC5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAobWVtY21wKCYoKCppdCktPmRlZi5leHRyYWN0b3JfdXVpZCksICZwbHVnaW4tPmRlZi5leHRyYWN0b3JfdXVpZCwgMTYpID09IDApIHsKICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYWxyZWFkeSBhbiBleHRyYWN0b3Igd2l0aCB0aGUgc2FtZSB1dWlkCi0gICAgICAgICAgICBpZiAoKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiA8IHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAoZ0lnbm9yZVZlcnNpb24gfHwgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiA8IHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmUgaXMgbmV3ZXIsIHJlcGxhY2UgdGhlIG9sZCBvbmUKICAgICAgICAgICAgICAgICBBTE9HVygicmVwbGFjaW5nIGV4dHJhY3RvciAnJXMnIHZlcnNpb24gJXUgd2l0aCB2ZXJzaW9uICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lLApAQCAtMjE1LDcgKzI1Myw3IEBACiAKIC8vc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CiAgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGFwa1BhdGgpOwogICAgIFppcEFyY2hpdmVIYW5kbGUgemlwSGFuZGxlOwogICAgIGludDMyX3QgcmV0ID0gT3BlbkFyY2hpdmUoYXBrUGF0aCwgJnppcEhhbmRsZSk7CkBAIC0yMzcsOCArMjc1LDggQEAKICAgICAgICAgICAgICAgICAvLyB3aXRoaW4gdGhlIGFwayBpbnN0ZWFkIG9mIHN5c3RlbSBsaWJyYXJpZXMgYWxyZWFkeSBsb2FkZWQuCiAgICAgICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguc3RyaW5nKCksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CiAgICAgICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CisgICAgICAgICAgICAgICAgICAgIEdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChnZXREZWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCkBAIC0yNjMsMTcgKzMwMSwyMCBAQAogCiAvL3N0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewogICAgIEFMT0dWKCJzZWFyY2ggZm9yIHBsdWdpbnMgYXQgJXMiLCBsaWJEaXJQYXRoKTsKICAgICBESVIgKmxpYkRpciA9IG9wZW5kaXIobGliRGlyUGF0aCk7CiAgICAgaWYgKGxpYkRpcikgewogICAgICAgICBzdHJ1Y3QgZGlyZW50KiBsaWJFbnRyeTsKICAgICAgICAgd2hpbGUgKChsaWJFbnRyeSA9IHJlYWRkaXIobGliRGlyKSkpIHsKKyAgICAgICAgICAgIGlmIChsaWJFbnRyeS0+ZF9uYW1lWzBdID09ICcuJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7CiAgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9Ci0gICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICBHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KKyAgICAgICAgICAgICAgICAgICAgKEdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CiAgICAgICAgICAgICAgICAgaWYgKGdldERlZikgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCkBAIC0yOTMsNiArMzM0LDY2IEBACiAgICAgfQogfQogCisvL3N0YXRpYwordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luQXBleCgKKyAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOworICAgIEFMT0dWKCJsaW5rZWQgbGlicyAlcyIsIGdMaW5rZWRMaWJyYXJpZXMuY19zdHIoKSk7CisKKyAgICBhbmRyb2lkX25hbWVzcGFjZV90ICpleHRyYWN0b3JOcyA9IGFuZHJvaWRfY3JlYXRlX25hbWVzcGFjZSgiZXh0cmFjdG9yIiwKKyAgICAgICAgICAgIG51bGxwdHIsICAvLyBsZF9saWJyYXJ5X3BhdGgKKyAgICAgICAgICAgIGxpYkRpclBhdGgsCisgICAgICAgICAgICBBTkRST0lEX05BTUVTUEFDRV9UWVBFX0lTT0xBVEVELAorICAgICAgICAgICAgbnVsbHB0ciwgIC8vIHBlcm1pdHRlZF93aGVuX2lzb2xhdGVkX3BhdGgKKyAgICAgICAgICAgIG51bGxwdHIpOyAvLyBwYXJlbnQKKyAgICBpZiAoIWFuZHJvaWRfbGlua19uYW1lc3BhY2VzKGV4dHJhY3Rvck5zLCBudWxscHRyLCBnTGlua2VkTGlicmFyaWVzLmNfc3RyKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbGluayBuYW1lc3BhY2UuIEZhaWxlZCB0byBsb2FkIGV4dHJhY3RvciBwbHVnLWlucyBpbiBhcGV4LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvIGRsZXh0aW5mbyA9IHsKKyAgICAgICAgLmZsYWdzID0gQU5EUk9JRF9ETEVYVF9VU0VfTkFNRVNQQUNFLAorICAgICAgICAubGlicmFyeV9uYW1lc3BhY2UgPSBleHRyYWN0b3JOcywKKyAgICB9OworCisgICAgRElSICpsaWJEaXIgPSBvcGVuZGlyKGxpYkRpclBhdGgpOworICAgIGlmIChsaWJEaXIpIHsKKyAgICAgICAgc3RydWN0IGRpcmVudCogbGliRW50cnk7CisgICAgICAgIHdoaWxlICgobGliRW50cnkgPSByZWFkZGlyKGxpYkRpcikpKSB7CisgICAgICAgICAgICBpZiAobGliRW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgobGliRGlyUGF0aCkgKyAiLyIgKyBsaWJFbnRyeS0+ZF9uYW1lOworICAgICAgICAgICAgaWYgKCFsaWJQYXRoLmNvbnRhaW5zKCJleHRyYWN0b3Iuc28iKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gYW5kcm9pZF9kbG9wZW5fZXh0KAorICAgICAgICAgICAgICAgICAgICBsaWJQYXRoLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBSVExEX05PVyB8IFJUTERfTE9DQUwsICZkbGV4dGluZm8pOworICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSkgeworICAgICAgICAgICAgICAgIEdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIiwgbGliUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihsaWJEaXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuZGlyKCVzKSIsIGxpYkRpclBhdGgpOworICAgIH0KK30KKworc3RhdGljIGJvb2wgY29tcGFyZUZ1bmMoY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiYgZmlyc3QsIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4mIHNlY29uZCkgeworICAgIHJldHVybiBzdHJjbXAoZmlyc3QtPmRlZi5leHRyYWN0b3JfbmFtZSwgc2Vjb25kLT5kZWYuZXh0cmFjdG9yX25hbWUpIDwgMDsKK30KKwogLy8gc3RhdGljCiB2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6VXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CkBAIC0zMDMsNyArNDA0LDE1IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKyAgICBnSWdub3JlVmVyc2lvbiA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5leHRyYWN0b3IuaWdub3JlX3ZlcnNpb24iLCBmYWxzZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisKKyAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwZXgoIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2xpYiIKKyNpZmRlZiBfX0xQNjRfXworICAgICAgICAgICAgIjY0IgorI2VuZGlmCisgICAgICAgICAgICAsICpuZXdMaXN0KTsKIAogICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKCIvc3lzdGVtL2xpYiIKICNpZmRlZiBfX0xQNjRfXwpAQCAtMzE1LDYgKzQyNCw3IEBACiAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKG5ld1VwZGF0ZUFwa1BhdGgsICpuZXdMaXN0KTsKICAgICB9CiAKKyAgICBuZXdMaXN0LT5zb3J0KGNvbXBhcmVGdW5jKTsKICAgICBnUGx1Z2lucyA9IG5ld0xpc3Q7CiAgICAgZ1BsdWdpbnNSZWdpc3RlcmVkID0gdHJ1ZTsKIH0KQEAgLTMzNSw4ICs0NDUsOSBAQAogICAgICAgICBvdXQuYXBwZW5kKCJBdmFpbGFibGUgZXh0cmFjdG9yczpcbiIpOwogICAgICAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBnUGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gZ1BsdWdpbnMtPmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpXG4iLAorICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogcGx1Z2luX3ZlcnNpb24oJWQpLCB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5kZWZfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT51dWlkU3RyaW5nLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmxpYlBhdGguY19zdHIoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCmluZGV4IDk4ZjU5YjUuLjliYTJhZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTIsNiArNTMsOCBAQAogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZkKTsKICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKICAgICAgICAgbVdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKGZkKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX09HRykgeworICAgICAgICBtV3JpdGVyID0gbmV3IE9nZ1dyaXRlcihmZCk7CiAgICAgfQogCiAgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewpAQCAtNTksNiArNjIsOCBAQAogICAgICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfSEVJRikgewogICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBrZXkgdXNlcyByZWNvcmRlciBmaWxlIHR5cGVzLgogICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfSEVJRik7CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfT0dHKSB7CisgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9PR0cpOwogICAgICAgICB9CiAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYmUzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQorCitNZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVNlZWtNb2RlID0gbW9kZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAorICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7CisgICAgKm1vZGUgPSBtU2Vla01vZGU7CisgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLSB1bndyYXBwZXIgLS0tLS0tLS0tLS0tLS0tICovCisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjpNZWRpYVRyYWNrQ1Vud3JhcHBlcihDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICB3cmFwcGVyID0gY21lZGlhdHJhY2s7CisgICAgYnVmZmVyR3JvdXAgPSBudWxscHRyOworfQorCitNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6fk1lZGlhVHJhY2tDVW53cmFwcGVyKCkgeworICAgIHdyYXBwZXItPmZyZWUod3JhcHBlci0+ZGF0YSk7CisgICAgZnJlZSh3cmFwcGVyKTsKKyAgICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdGFydCgpIHsKKyAgICBpZiAoYnVmZmVyR3JvdXAgPT0gbnVsbHB0cikgeworICAgICAgICBidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgfQorICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcih3cmFwcGVyLT5zdGFydCh3cmFwcGVyLT5kYXRhLCBidWZmZXJHcm91cC0+d3JhcCgpKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdG9wKCkgeworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcih3cmFwcGVyLT5zdG9wKHdyYXBwZXItPmRhdGEpKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKnRtcEZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB3cmFwcGVyLT5nZXRGb3JtYXQod3JhcHBlci0+ZGF0YSwgdG1wRm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSB0bXBGb3JtYXQ7CisgICAgZm9ybWF0ID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpyZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKworICAgIHVpbnQzMl90IG9wdHMgPSAwOworCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSkgeworICAgICAgICBvcHRzIHw9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6Ok5PTkJMT0NLSU5HOworICAgIH0KKworICAgIGludDY0X3Qgc2Vla1Bvc2l0aW9uID0gMDsKKyAgICBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrUG9zaXRpb24sICZzZWVrTW9kZSkpIHsKKyAgICAgICAgb3B0cyB8PSBTRUVLOworICAgICAgICBvcHRzIHw9ICh1aW50MzJfdCkgc2Vla01vZGU7CisgICAgfQorICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB3cmFwcGVyLT5yZWFkKHdyYXBwZXItPmRhdGEsICZidWYsIG9wdHMsIHNlZWtQb3NpdGlvbik7CisgICAgaWYgKHJldCA9PSBBTUVESUFfT0sgJiYgYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmJ1ZmZlciA9IChNZWRpYUJ1ZmZlckJhc2UqKWJ1Zi0+aGFuZGxlOworICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IGJ1Zi0+bWV0YV9kYXRhKGJ1Zi0+aGFuZGxlKTsKKyAgICAgICAgLy8gb25seSBjb252ZXJ0IHRoZSBrZXlzIHdlJ3JlIGFjdHVhbGx5IGV4cGVjdGluZywgYXMgZG9pbmcKKyAgICAgICAgLy8gdGhlIGZ1bGwgY29udmVydE1lc3NhZ2VUb01ldGFkYXRhKCkgZm9yIGV2ZXJ5IGJ1ZmZlciBpcworICAgICAgICAvLyB0b28gZXhwZW5zaXZlCisgICAgICAgIGludDY0X3QgdmFsNjQ7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5VGltZSwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgiZHVyYXRpb24iLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGFyZ2V0LXRpbWUiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUYXJnZXRUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJpcy1zeW5jLWZyYW1lIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1tb2RlIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidmFsaWQtc2FtcGxlcyIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbGJ1ZjsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLXBsYWluLXNpemVzIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8ta2V5IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8taXYiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigic2VpIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5U0VJLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitib29sIE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCh3cmFwcGVyLT5kYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKaW5kZXggMDRmNmFkZS4uZGJjMjg3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKQEAgLTE2LDE1ICsxNiwyNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGJvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgaW50MzJfdCB3aWR0aDsKICAgICBpbnQzMl90IGhlaWdodDsKICAgICBpbnQzMl90IHNhcldpZHRoOwpAQCAtNDYsMjEgKzU2LDg2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobWV0YSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCBzYXJXaWR0aDsKKyAgICBpbnQzMl90IHNhckhlaWdodDsKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoKHZvaWQqKWRhdGEsICBzaXplKTsKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCwgJndpZHRoLCAmaGVpZ2h0LCAmc2FyV2lkdGgsICZzYXJIZWlnaHQpOworICAgIGlmIChjc2QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIHdpZHRoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CisgICAgaWYgKHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCwgc2FyV2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hULCBzYXJIZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYml0cyhkYXRhLCBzaXplKTsKKworICAgIC8vIGFkdHNfZml4ZWRfaGVhZGVyCisKKyAgICBpZiAoYml0cy5nZXRCaXRzKDEyKSAhPSAweGZmZnUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIGF0ZHNfZml4ZWRfaGVhZGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBiaXRzLnNraXBCaXRzKDQpOyAgLy8gSUQsIGxheWVyLCBwcm90ZWN0aW9uX2Fic2VudAorCisgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAocHJvZmlsZSA9PSAzdSkgeworICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOworICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0CisgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOworICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKKyAgICAgICAgQUxPR0UoImNoYW5uZWxfY29uZmlnIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBtZXRhLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZXRhLnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAotICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAotICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdWludDhfdCAqY3NkLCAvKiBvdXQgKi8KKyAgICAgICAgc2l6ZV90ICplc2RzX3NpemUsIC8qIGluL291dCAqLworICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCAvKiBpbiAqLworICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LCAvKiBpbiAqLworICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIC8qIGluICovCisgICAgICAgIGludDMyX3QgKnNhbXBsaW5nX3JhdGUgLyogb3V0ICovCispIHsKICAgICBpZihzYW1wbGluZ19mcmVxX2luZGV4ID4gMTF1KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIGludDMyX3QgY2hhbm5lbENvdW50OwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHsKICAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAogICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCiAgICAgfTsKLSAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKLSAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb247CisgICAgKnNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwogCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKICAgICAgICAgMHgwMywgMjIsCkBAIC04Myw3ICsxNTgsOSBAQAogICAgIH07CiAKICAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihrU3RhdGljRVNEUykgKyAyOwotICAgIHVpbnQ4X3QgKmNzZCA9IG5ldyB1aW50OF90W2NzZFNpemVdOworICAgIGlmIChjc2RTaXplID4gKmVzZHNfc2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIG1lbWNweShjc2QsIGtTdGF0aWNFU0RTLCBzaXplb2Yoa1N0YXRpY0VTRFMpKTsKIAogICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9CkBAIC05MiwxNCArMTY5LDE5OCBAQAogICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPQogICAgICAgICAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CiAKKyAgICAqZXNkc19zaXplID0gY3NkU2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKworICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgY3NkWzJdOworICAgIGNzZFswXSA9ICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7CisgICAgY3NkWzFdID0gKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNzZCwgc2l6ZW9mKGNzZCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgdWludDhfdCBjc2RbMjRdOworICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGNzZCk7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoY3NkLCAmY3NkU2l6ZSwgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogCiAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOwotCisgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogICAgIG1ldGEuc2V0RGF0YShrS2V5RVNEUywgMCwgY3NkLCBjc2RTaXplKTsKLSAgICBkZWxldGUgW10gY3NkOwogICAgIHJldHVybiB0cnVlOwogfQogCisKK3N0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7CisKKyAgICBzaXplX3QgaW5MZW4gPSBzdHJubGVuKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CisgICAgc2l6ZV90IGZsYWNTaXplID0gaW5MZW4gLyA0ICogMzsKKyAgICB1aW50OF90ICpmbGFjID0gbmV3IHVpbnQ4X3RbZmxhY1NpemVdOworICAgIGlmICghZGVjb2RlQmFzZTY0KGZsYWMsICZmbGFjU2l6ZSwgKGNvbnN0IGNoYXIqKWRhdGEpKSB7CisgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKKworICAgIHVpbnQzMl90IHBpY1R5cGU7CisgICAgdWludDMyX3QgdHlwZUxlbjsKKyAgICB1aW50MzJfdCBkZXNjTGVuOworICAgIHVpbnQzMl90IGRhdGFMZW47CisgICAgY2hhciB0eXBlWzEyOF07CisKKyAgICBpZiAoZmxhY1NpemUgPCA4KSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOworCisgICAgaWYgKHBpY1R5cGUgIT0gMykgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7CisgICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4CisgICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7CisgICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7CisKKyAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOworCisgICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7CisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAorICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7CisKKyAgICBkZWxldGVbXSBmbGFjOworfQorCit2b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpIHsKKyAgICAvLyBIYXB0aWMgdGFnIGlzIG9ubHkga2VwdCBoZXJlIGFzIGl0IHdpbGwgb25seSBiZSB1c2VkIGluIGV4dHJhY3RvciB0byBnZW5lcmF0ZSBjaGFubmVsIG1hc2suCisgICAgY29uc3QgY2hhciogY29uc3QgaGFwdGljID0gImhhcHRpYyI7CisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKKyAgICAgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICB9IGtNYXBbXSA9IHsKKyAgICAgICAgeyAiVElUTEUiLCBBTUVESUFGT1JNQVRfS0VZX1RJVExFIH0sCisgICAgICAgIHsgIkFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUIH0sCisgICAgICAgIHsgIkFMQlVNQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIH0sCisgICAgICAgIHsgIkNPTVBJTEFUSU9OIiwgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiB9LAorICAgICAgICB7ICJBTEJVTSIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gfSwKKyAgICAgICAgeyAiQ09NUE9TRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIH0sCisgICAgICAgIHsgIkdFTlJFIiwgQU1FRElBRk9STUFUX0tFWV9HRU5SRSB9LAorICAgICAgICB7ICJBVVRIT1IiLCBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiB9LAorICAgICAgICB7ICJUUkFDS05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiB9LAorICAgICAgICB7ICJESVNDTlVNQkVSIiwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSIH0sCisgICAgICAgIHsgIkRBVEUiLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUgfSwKKyAgICAgICAgeyAiWUVBUiIsIEFNRURJQUZPUk1BVF9LRVlfWUVBUiB9LAorICAgICAgICB7ICJMWVJJQ0lTVCIsIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgfSwKKyAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwgQU1FRElBRk9STUFUX0tFWV9MT09QIH0sCisgICAgICAgIHsgIkFORFJPSURfSEFQVElDIiwgaGFwdGljIH0sCisgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7CisgICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7CisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQorICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUKSB7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9MT09QKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gaGFwdGljKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGFwdGljQ2hhbm5lbENvdW50ID0gc3RydG9sKCZjb21tZW50W3RhZ0xlbiArIDFdLCAmZW5kLCAxMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZmlsZU1ldGEsIGhhcHRpYywgaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciglZCkgd2hlbiBwYXJzaW5nIGhhcHRpYyBjaGFubmVsIGNvdW50IiwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmaWxlTWV0YSwga01hcFtqXS5tS2V5LCAmY29tbWVudFt0YWdMZW4gKyAxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCmluZGV4IDE4ZjRiMTIuLjcwMjVhZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMjU2LDYgKzI1NiwxMCBAQAogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmNsb3NlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKK30KKwogdm9pZCBOdUNhY2hlZFNvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKICAgICAgICAgQUxPR1YoImRpc2Nvbm5lY3RpbmcgSFRUUEJhc2VkU291cmNlIik7CkBAIC01NjcsMTIgKzU3MSwxOSBAQAogICAgIHJldHVybiBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwogfQogCi1zaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Qgeworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKGZpbmFsU3RhdHVzKTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgKnNpemUgPSBhcHByb3hEYXRhUmVtYWluaW5nX2wob2Zmc2V0LCAmZmluYWxTdGF0dXMpOworICAgIHJldHVybiBmaW5hbFN0YXR1czsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Qgeworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBhcHByb3hEYXRhUmVtYWluaW5nX2wobUxhc3RBY2Nlc3NQb3MsIGZpbmFsU3RhdHVzKTsKK30KKworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKICAgICAqZmluYWxTdGF0dXMgPSBtRmluYWxTdGF0dXM7CiAKICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA+IDApIHsKQEAgLTU4MCw5ICs1OTEsMTAgQEAKICAgICAgICAgKmZpbmFsU3RhdHVzID0gT0s7CiAgICAgfQogCisgICAgb2Zmc2V0ID0gb2Zmc2V0ID49IDAgPyBvZmZzZXQgOiBtTGFzdEFjY2Vzc1BvczsKICAgICBvZmY2NF90IGxhc3RCeXRlUG9zQ2FjaGVkID0gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKLSAgICBpZiAobUxhc3RBY2Nlc3NQb3MgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgewotICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBtTGFzdEFjY2Vzc1BvczsKKyAgICBpZiAob2Zmc2V0IDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gb2Zmc2V0OwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggNGE3ZDZjYS4uZjUxNzhkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIxLDEwICsyMSw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDYgKzMyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0yMDUsMTUgKzIwNCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51TWVkaWFFeHRyYWN0b3I6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGlzY29ubmVjdCBkYXRhIHNvdXJjZQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjp1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKSB7CiAgICAgaWYgKG1JbXBsLT5jb3VudFRyYWNrcygpID4ga01heFRyYWNrQ291bnQpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtNzkwLDE2ICs3ODAsMTIgQEAKICAgICAgICAgaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIG9mZjY0X3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IC0xOworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUoLTEsICZjYWNoZWREYXRhUmVtYWluaW5nKTsKKwogICAgIGludDY0X3QgYml0cmF0ZTsKLSAgICBpZiAoKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpCisgICAgaWYgKGNhY2hlZERhdGFSZW1haW5pbmcgPj0gMAogICAgICAgICAgICAgJiYgZ2V0VG90YWxCaXRyYXRlKCZiaXRyYXRlKSkgewotICAgICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IGNhY2hlZFNvdXJjZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOwotCi0gICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICBjYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKLQogICAgICAgICAqZHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwogICAgICAgICAqZW9zID0gKGZpbmFsU3RhdHVzICE9IE9LKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04MDgsNCArNzk0LDMyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBSZXR1cm4gT0sgaWYgd2UgaGF2ZSByZWNlaXZlZCBhbiBhdWRpbyBwcmVzZW50YXRpb24gaW5mby4KKy8vIFJldHVybiBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgdHJhY2sgaGFzIG5vIGF1ZGlvIHByZXNlbnRhdGlvbi4KKy8vIFJldHVybiBJTlZBTElEX09QRVJBVElPTiBpZiBhdWRpbyBwcmVzZW50YXRpb24gbWV0YWRhdGEgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4KK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldEF1ZGlvUHJlc2VudGF0aW9ucygKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUltcGwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAodHJhY2tJbmRleCA+PSBtSW1wbC0+Y291bnRUcmFja3MoKSkgeworICAgICAgICByZXR1cm4gLUVSQU5HRTsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JbXBsLT5nZXRUcmFja01ldGFEYXRhKHRyYWNrSW5kZXgpOworCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbWV0YS0+ZmluZERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluU3RyZWFtKHN0ZDo6c3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSkpOworICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoJmluU3RyZWFtLCBwcmVzZW50YXRpb25zKTsKKyAgICB9CisgICAgQUxPR0UoIlNvdXJjZSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU1YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT2dnV3JpdGVyIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgIk9wdXNIZWFkZXIuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8b2dnL29nZy5oPgorfQorCisvLyBzdG9yZSB0aGUgaW50MzIgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWludChjaGFyICpidWYsIGludCBiYXNlLCBpbnQzMl90IHZhbCkgeworICAgIGJ1ZltiYXNlICsgM10gPSAoKHZhbCkgPj4gMjQpICYgMHhmZjsKKyAgICBidWZbYmFzZSArIDJdID0gKCh2YWwpID4+IDE2KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAxXSA9ICgodmFsKSA+PiA4KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2VdID0gKHZhbCkmMHhmZjsKK30KKworLy8gbGlua2FnZSBiZXR3ZWVuIG91ciBoZWFkZXIgT2dnU3RyZWFtU3RhdGUgYW5kIHRoZSB1bmRlcmx5aW5nIG9nZ19zdHJlYW1fc3RhdGUKKy8vIHNvIHRoYXQgY29uc3VtZXJzIG9mIG91ciBpbnRlcmZhY2UgZG8gbm90IHJlcXVpcmUgdGhlIG9nZyBoZWFkZXJzIHRoZW1zZWx2ZXMuCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGUgOiBwdWJsaWMgb2dnX3N0cmVhbV9zdGF0ZSB7fTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitPZ2dXcml0ZXI6Ok9nZ1dyaXRlcihpbnQgZmQpCisgICAgICA6IG1GZChkdXAoZmQpKSwKKyAgICAgICAgbUluaXRDaGVjayhtRmQgPCAwID8gTk9fSU5JVCA6IE9LKSB7CisgICAgLy8gZW1wdHkKK30KKworT2dnV3JpdGVyOjp+T2dnV3JpdGVyKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIGlmIChtRmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorCisgICAgZnJlZShtT3MpOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFN1cHBvcnQgaXMgbGltaXRlZCB0byBzaW5nbGUgdHJhY2sgb2YgT3B1cyBhdWRpby4KKyAgICBjb25zdCBjaGFyKiBtaW1lOworICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIGNvbnN0IGNoYXIqIG9wdXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTOworICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCBvcHVzLCBzdHJsZW4ob3B1cykpKSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMgaXMgbm90IHN1cHBvcnRlZCIsIG1pbWUsIG9wdXMpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgbU9zID0gKE9nZ1N0cmVhbVN0YXRlKikgbWFsbG9jKHNpemVvZihvZ2dfc3RyZWFtX3N0YXRlKSk7CisgICAgaWYgKG9nZ19zdHJlYW1faW5pdCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCByYW5kKCkpID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJvZ2cgc3RyZWFtIGluaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIFdyaXRlIE9nZyBoZWFkZXJzLgorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMDsKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbkNoYW5uZWxzKSkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5cyBmb3IgYXVkaW8gdHJhY2siKTsKKyAgICAgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXkgZm9yIHNhbXBsZSByYXRlIik7CisgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICBoZWFkZXIuY2hhbm5lbHMgPSBuQ2hhbm5lbHM7CisgICAgaGVhZGVyLm51bV9zdHJlYW1zID0gbkNoYW5uZWxzOworICAgIGhlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgaGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobkNoYW5uZWxzID4gOCkgPyAyNTUgOiAobkNoYW5uZWxzID4gMikpOworICAgIGhlYWRlci5nYWluX2RiID0gMDsKKyAgICBoZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKKworICAgIC8vIGhlYWRlcnMgYXJlIDIxLWJ5dGVzICsgc29tZXRoaW5nIGRyaXZlbiBieSBjaGFubmVsIGNvdW50CisgICAgLy8gZXhwZWN0IG51bWJlcnMgaW4gdGhlIGxvdyAzMCdzIGhlcmUuIFdyaXRlT3B1c0hlYWRlcigpIHdpbGwgdGVsbCB1cworICAgIC8vIGlmIHRoaW5ncyBhcmUgYmFkLgorICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX2RhdGFbMTAwXTsKKyAgICBvZ2dfcGFja2V0IG9wOworICAgIG9nZ19wYWdlIG9nOworCisgICAgY29uc3QgaW50IHBhY2tldF9zaXplID0gV3JpdGVPcHVzSGVhZGVyKGhlYWRlciwgbVNhbXBsZVJhdGUsICh1aW50OF90KiloZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlcl9kYXRhKSk7CisKKyAgICBpZiAocGFja2V0X3NpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJvcHVzIGhlYWRlciB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgb3AucGFja2V0ID0gaGVhZGVyX2RhdGE7CisgICAgb3AuYnl0ZXMgPSBwYWNrZXRfc2l6ZTsKKyAgICBvcC5iX29fcyA9IDE7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMDsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICBpbnQgcmV0OworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisKKyAgICBjb25zdCBjaGFyKiB2ZW5kb3Jfc3RyaW5nID0gImxpYm9wdXMiOworICAgIGNvbnN0IGludCB2ZW5kb3JfbGVuZ3RoID0gc3RybGVuKHZlbmRvcl9zdHJpbmcpOworICAgIGludCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGggPSAwOworCisgICAgY29uc3QgaW50IGNvbW1lbnRzX2xlbmd0aCA9IDggKyA0ICsgdmVuZG9yX2xlbmd0aCArIDQgKyB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGg7CisgICAgY2hhciogY29tbWVudHMgPSAoY2hhciopbWFsbG9jKGNvbW1lbnRzX2xlbmd0aCk7CisgICAgaWYgKGNvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBvZ2cgY29tbWVudCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1lbWNweShjb21tZW50cywgIk9wdXNUYWdzIiwgOCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDgsIHZlbmRvcl9sZW5ndGgpOworICAgIG1lbWNweShjb21tZW50cyArIDEyLCB2ZW5kb3Jfc3RyaW5nLCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICB3cml0ZWludChjb21tZW50cywgMTIgKyB2ZW5kb3JfbGVuZ3RoLCB1c2VyX2NvbW1lbnRfbGlzdF9sZW5ndGgpOworCisgICAgb3AucGFja2V0ID0gKHVuc2lnbmVkIGNoYXIqKWNvbW1lbnRzOworICAgIG9wLmJ5dGVzID0gY29tbWVudHNfbGVuZ3RoOworICAgIG9wLmJfb19zID0gMDsKKyAgICBvcC5lX29fcyA9IDA7CisgICAgb3AuZ3JhbnVsZXBvcyA9IDA7CisgICAgb3AucGFja2V0bm8gPSAxOworICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKworICAgIHdoaWxlICgocmV0ID0gb2dnX3N0cmVhbV9mbHVzaCgob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb2cpKSkgeworICAgICAgICBpZiAoIXJldCkgYnJlYWs7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgd3JpdGUobUZkLCBvZy5ib2R5LCBvZy5ib2R5X2xlbik7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICBmcmVlKGNvbW1lbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIC8vIEFscmVhZHkgc3RhcnRlZCwgZG9lcyBub3RoaW5nCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworCisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworCisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CisKKyAgICB2b2lkKiBkdW1teTsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKKworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKKyAgICB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID4gbU1heEZpbGVTaXplTGltaXRCeXRlczsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkRHVyYXRpb25VcyA+IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzOworfQorCisvLyBzdGF0aWMKK3ZvaWQqIE9nZ1dyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkKiBtZSkgeworICAgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8T2dnV3JpdGVyKj4obWUpLT50aHJlYWRGdW5jKCk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFNpemVCeXRlcyA9IDA7CisgICAgYm9vbCBzdG9wcGVkUHJlbWF0dXJlbHkgPSB0cnVlOworICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1heFRpbWVzdGFtcFVzID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT2dnV3JpdGVyIiwgMCwgMCwgMCk7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlYWQgbmV4dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIEFMT0dXKCJlc3RpbWF0ZWQgc2l6ZSglIiBQUklkNjQgIikgZXhjZWVkcyBsaW1pdCAoJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMsIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtRXN0aW1hdGVkRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSAodGltZXN0YW1wVXMgLSBtYXhUaW1lc3RhbXBVcyAtIDIwMDAwKTsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIGR1cmF0aW9uKCUiIFBSSWQ2NCAiIHVzKSBleGNlZWRzIGxpbWl0KCUiIFBSSWQ2NCAiIHVzKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvZ2dfcGFja2V0IG9wOworICAgICAgICBvZ2dfcGFnZSBvZzsKKyAgICAgICAgb3AucGFja2V0ID0gKHVpbnQ4X3QqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgb3AuYnl0ZXMgPSAobG9uZylidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBvcC5iX29fcyA9IDA7CisgICAgICAgIG9wLmVfb19zID0gbVJlYWNoZWRFT1MgPyAxIDogMDsKKyAgICAgICAgLy8gZ3JhbnVsZXBvcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIFBDTSBhdWRpbyBzYW1wbGVzIEAgNDgga0h6LCB1cCB0byBhbmQKKyAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgICAgICAgb2dnX2ludDY0X3QgZ3JhbnVsZXBvcyA9ICg0ODAwMCAqIG1Fc3RpbWF0ZWREdXJhdGlvblVzKSAvIDEwMDAwMDA7CisgICAgICAgIG9wLmdyYW51bGVwb3MgPSBncmFudWxlcG9zOworCisgICAgICAgIC8vIEhlYWRlcnMgYXJlIGF0IHBhY2tldHMgMCBhbmQgMS4KKyAgICAgICAgb3AucGFja2V0bm8gPSAyICsgKG9nZ19pbnQzMl90KW1DdXJyZW50UGFja2V0SWQrKzsKKyAgICAgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworICAgICAgICBzaXplX3QgbiA9IDA7CisKKyAgICAgICAgd2hpbGUgKG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuaGVhZGVyLCBvZy5oZWFkZXJfbGVuKTsKKyAgICAgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgICAgICAgICAgbiA9IG4gKyBvZy5oZWFkZXJfbGVuICsgb2cuYm9keV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0lPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN0b3BwZWRQcmVtYXR1cmVseSA9IGZhbHNlOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIGVuZCBvZiBzdHJlYW0gaXMgYW4gb2sgdGhpbmcKKyAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSyAmJiBzdG9wcGVkUHJlbWF0dXJlbHkpIHsKKyAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuIG1SZWFjaGVkRU9TOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCmluZGV4IGQwN2FmZWMuLmRiMzFhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTI1LDI1ICsyNSwyOSBAQAogICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVHJhY2soc291cmNlKSwKICAgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7fQogCiBSZW1vdGVNZWRpYVNvdXJjZTo6flJlbW90ZU1lZGlhU291cmNlKCkgewotICAgIGRlbGV0ZSBtU291cmNlOworICAgIGRlbGV0ZSBtVHJhY2s7CiAgICAgbUV4dHJhY3RvclBsdWdpbiA9IG51bGxwdHI7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcyk7CisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBBTE9HVygiZHJvcHBpbmcgc3RhcnQgcGFyYW1ldGVyczoiKTsKKyAgICAgICAgcGFyYW1zLT5kdW1wVG9Mb2coKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKCk7Ci0gICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKKyAgICBpZiAobVRyYWNrLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CiAgICAgICAgIHJldHVybiBtZXRhOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTUxLDcgKzU1LDExIEBACiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7CisgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworfQorCitib29sIFJlbW90ZU1lZGlhU291cmNlOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiBtVHJhY2stPnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnBhdXNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDQwNGM1MzcuLmJhYmRjN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTM3LDYgKzM3LDcgQEAKIAogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JPdXRwdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlY29uZHMKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9ySW5wdXRVcyA9IDUwMDA7IC8vIDUgbWlsbGlzZWNvbmRzCitjb25zdCBpbnQga1RpbWVvdXRNYXhSZXRyaWVzID0gMjA7CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBmb3IgKGludCByZXRyaWVzID0gMDsgKytyZXRyaWVzOyApIHsKKyAgICBmb3IgKGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IGtUaW1lb3V0TWF4UmV0cmllczsgKytyZXRyaWVzKSB7CiAgICAgICAgIC8vIElmIHdlIGZpbGwgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzLCB3ZSBzaG91bGQgZXhwZWN0IHRoYXQKICAgICAgICAgLy8gdGhlIGNvZGVjIHByb2R1Y2VzIGF0IGxlYXN0IG9uZSBvdXRwdXQgYnVmZmVyLiBBbHNvLCB0aGUgY29kZWMKICAgICAgICAgLy8gc2hvdWxkIHByb2R1Y2UgYW4gb3V0cHV0IGJ1ZmZlciBpbiBhdCBtb3N0IDEgc2Vjb25kcy4gUmV0cnkgYQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA4NGE2NDFmLi5mMzRkNTRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTI3NSwxMiArMjc2LDYgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgaW50MzJfdCBkcm0gPSAwOwotICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApIHsKLSAgICAgICAgQUxPR0UoImZyYW1lIGdyYWIgbm90IGFsbG93ZWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKLSAgICB9Ci0KICAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewpAQCAtMzQyLDE1ICszMzcsMTUgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBWaWRlb0ZyYW1lRGVjb2RlciBkZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKLSAgICAgICAgaWYgKGRlY29kZXIuaW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKKyAgICAgICAgc3A8VmlkZW9GcmFtZURlY29kZXI+IGRlY29kZXIgPSBuZXcgVmlkZW9GcmFtZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm91dEZyYW1lID0gZGVjb2Rlci5leHRyYWN0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoKm91dEZyYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0RnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWVzKG91dEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDUxOWU4NzAuLmI5MDY0OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgpAQCAtMjcsOSArMjgsMTcgQEAKIC8qIHN0YXRpYyAqLyBNdXRleCBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c011dGV4OwogLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKIAotU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCi0gICAgOiBtQ3JlYXRlQ29kZWMobnVsbHB0ciksCi0gICAgICBtQ3JlYXRlQnVpbGRlcihudWxscHRyKSB7CituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtDQ29kZWNQbHVnaW5QYXRoW10gPSAibGlic2ZwbHVnaW5fY2NvZGVjLnNvIjsKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLm1lZGlhLmNvZGVjMiIsIDApID09IDApIHsKKyAgICAgICAgQUxPR0QoIkNDb2RlYyBpcyBkaXNhYmxlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CiAgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CkBAIC00Niw3ICs1NSw3IEBACiAgICAgfQogICAgIG1DcmVhdGVJbnB1dFN1cmZhY2UgPSAoQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jKWRsc3ltKAogICAgICAgICAgICAgbUxpYkhhbmRsZSwgIkNyZWF0ZUlucHV0U3VyZmFjZSIpOwotICAgIGlmIChtQ3JlYXRlQnVpbGRlciA9PSBudWxscHRyKSB7CisgICAgaWYgKG1DcmVhdGVJbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVJbnB1dFN1cmZhY2UgKCVzKSIsIGRsZXJyb3IoKSk7CiAgICAgfQogfQpAQCAtODcsNyArOTYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOwogICAgIGlmICghc0luc3RhbmNlKSB7CiAgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKLSAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcigibGlic3RhZ2VmcmlnaHRfY2NvZGVjLnNvIikpOworICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGtDQ29kZWNQbHVnaW5QYXRoKSk7CiAgICAgfQogICAgIHJldHVybiBzSW5zdGFuY2U7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaAppbmRleCA5OTlkMzBjLi43OGVmZmJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgIHN0YXRpYyBNdXRleCBzTXV0ZXg7CiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gc0luc3RhbmNlOwogCi0gICAgdm9pZCAqbUxpYkhhbmRsZTsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWM7Ci0gICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXI7Ci0gICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2U7CisgICAgdm9pZCAqbUxpYkhhbmRsZXtudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWN7bnVsbHB0cn07CisgICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXJ7bnVsbHB0cn07CisgICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2V7bnVsbHB0cn07CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicG9zdHN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggYzc1NzliYy4uMTYzY2QwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtNzQsNyArNzQsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CitzdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIC8vIDAgdmFsdWVzIGFyZSB1bnNwZWNpZmllZAogICAgIGludDMyX3QgcmFuZ2UgPSAwOwogICAgIGludDMyX3QgcHJpbWFyaWVzID0gMDsKQEAgLTExOSw3ICsxMTksOCBAQAogICAgIH0KIAogICAgIC8vIGlmIHVzZXIvY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIHRydWUKLSAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKKyAgICBpZiAoKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpIHx8IGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKQorICAgICAgICAgICAgJiYgIWZvcm1hdC0+Y29udGFpbnMoImNvbG9yLXRyYW5zZmVyIikpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIC8vIG90aGVyd2lzZSwgdmVyaWZ5IHRoYXQgYW4gSERSIHRyYW5zZmVyIGZ1bmN0aW9uIGlzIHNldApAQCAtNTY4LDggKzU2OSwxNjIgQEAKICAgICB9CiB9CiAKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gc3RyaW5nTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiYXJ0aXN0Iiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJhdXRob3IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgImNkdHJhY2tudW0iLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJjb21waWxhdGlvbiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJjb21wb3NlciIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJkYXRlIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiZGlzY251bSIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgImdlbnJlIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgImxvY2F0aW9uIiwga0tleUxvY2F0aW9uIH0sCisgICAgICAgIHsgImx5cmljaXN0Iiwga0tleVdyaXRlciB9LAorICAgICAgICB7ICJ0aXRsZSIsIGtLZXlUaXRsZSB9LAorICAgICAgICB7ICJ5ZWFyIiwga0tleVllYXIgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBmbG9hdE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImNhcHR1cmUtcmF0ZSIsIGtLZXlDYXB0dXJlRnJhbWVyYXRlIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50NjRNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJleGlmLW9mZnNldCIsIGtLZXlFeGlmT2Zmc2V0IH0sCisgICAgICAgIHsgImV4aWYtc2l6ZSIsIGtLZXlFeGlmU2l6ZSB9LAorICAgICAgICB7ICJ0YXJnZXQtdGltZSIsIGtLZXlUYXJnZXRUaW1lIH0sCisgICAgICAgIHsgInRodW1ibmFpbC10aW1lIiwga0tleVRodW1ibmFpbFRpbWUgfSwKKyAgICAgICAgeyAidGltZVVzIiwga0tleVRpbWUgfSwKKyAgICAgICAgeyAiZHVyYXRpb25VcyIsIGtLZXlEdXJhdGlvbiB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGludDMyTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAibG9vcCIsIGtLZXlBdXRvTG9vcCB9LAorICAgICAgICB7ICJ0aW1lLXNjYWxlIiwga0tleVRpbWVTY2FsZSB9LAorICAgICAgICB7ICJjcnlwdG8tbW9kZSIsIGtLZXlDcnlwdG9Nb2RlIH0sCisgICAgICAgIHsgImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLCBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siLCBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImNyeXB0by1za2lwLWJ5dGUtYmxvY2siLCBrS2V5U2tpcEJ5dGVCbG9jayB9LAorICAgICAgICB7ICJmcmFtZS1jb3VudCIsIGtLZXlGcmFtZUNvdW50IH0sCisgICAgICAgIHsgIm1heC1iaXRyYXRlIiwga0tleU1heEJpdFJhdGUgfSwKKyAgICAgICAgeyAicGNtLWJpZy1lbmRpYW4iLCBrS2V5UGNtQmlnRW5kaWFuIH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWNvdW50Iiwga0tleVRlbXBvcmFsTGF5ZXJDb3VudCB9LAorICAgICAgICB7ICJ0ZW1wb3JhbC1sYXllci1pZCIsIGtLZXlUZW1wb3JhbExheWVySWQgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXdpZHRoIiwga0tleVRodW1ibmFpbFdpZHRoIH0sCisgICAgICAgIHsgInRodW1ibmFpbC1oZWlnaHQiLCBrS2V5VGh1bWJuYWlsSGVpZ2h0IH0sCisgICAgICAgIHsgInZhbGlkLXNhbXBsZXMiLCBrS2V5VmFsaWRTYW1wbGVzIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gYnVmZmVyTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW1hcnQiLCBrS2V5QWxidW1BcnQgfSwKKyAgICAgICAgeyAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvIH0sCisgICAgICAgIHsgInBzc2giLCBrS2V5UHNzaCB9LAorICAgICAgICB7ICJjcnlwdG8taXYiLCBrS2V5Q3J5cHRvSVYgfSwKKyAgICAgICAgeyAiY3J5cHRvLWtleSIsIGtLZXlDcnlwdG9LZXkgfSwKKyAgICAgICAgeyAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsIGtLZXlFbmNyeXB0ZWRTaXplcyB9LAorICAgICAgICB7ICJjcnlwdG8tcGxhaW4tc2l6ZXMiLCBrS2V5UGxhaW5TaXplcyB9LAorICAgICAgICB7ICJpY2MtcHJvZmlsZSIsIGtLZXlJY2NQcm9maWxlIH0sCisgICAgICAgIHsgInNlaSIsIGtLZXlTRUkgfSwKKyAgICAgICAgeyAidGV4dC1mb3JtYXQtZGF0YSIsIGtLZXlUZXh0Rm9ybWF0RGF0YSB9LAorICAgIH0KK307CisKK3ZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKKyAgICBmb3IgKGF1dG8gZWxlbSA6IHN0cmluZ01hcHBpbmdzKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhlbGVtLnNlY29uZCwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRGbG9hdChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICBzcDxBQnVmZmVyPiB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGVsZW0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsdWUtPmRhdGEoKSwgdmFsdWUtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhlbGVtLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoZWxlbS5maXJzdCwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBmbG9hdE1hcHBpbmdzKSB7CisgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEZsb2F0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEZsb2F0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50NjRNYXBwaW5ncykgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50MzJNYXBwaW5ncykgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogYnVmZmVyTWFwcGluZ3MpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShlbGVtLnNlY29uZCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0QnVmZmVyKGVsZW0uZmlyc3QsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIHJldHVybiBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YS5nZXQoKSwgZm9ybWF0KTsKK30KKworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CiAKICAgICBmb3JtYXQtPmNsZWFyKCk7CiAKQEAgLTU4Niw2ICs3NDEsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CiAgICAgbXNnLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKIAorICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUZyb21NYXBwaW5ncyhtZXRhLCBtc2cpOworCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtNTk5LDYgKzc1NiwxNiBAQAogICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwogICAgIH0KIAorICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsIGJ1ZmZlcik7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgfQorCiAgICAgaW50MzJfdCBzeXN0ZW1JZDsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDQVN5c3RlbUlELCAmc3lzdGVtSWQpKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImNhLXN5c3RlbS1pZCIsIHN5c3RlbUlkKTsKQEAgLTcxMiw2ICs4NzksMTYgQEAKICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KCooSERSU3RhdGljSW5mbyopZGF0YSwgbXNnKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SGRyMTBQbHVzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICAmJiBzaXplID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsIGJ1ZmZlcik7CisgICAgICAgIH0KKwogICAgICAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMobWV0YSwgbXNnKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKQEAgLTcyMyw2ICs5MDAsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG51bUNoYW5uZWxzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKIAorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYml0cy1wZXItc2FtcGxlIiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1tYXNrIiwgY2hhbm5lbE1hc2spOwpAQCAtMTA0OCw3ICsxMjMwLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJtYXgtYml0cmF0ZSIsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrVHlwZUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogICAgICAgICBwYXJzZUgyNjNQcm9maWxlTGV2ZWxGcm9tRDI2MyhwdHIsIHNpemUsIG1zZyk7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKQEAgLTExNDgsMTMgKzEzMzAsNiBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAotICAgIC8vIFRPRE8gZXhwb3NlICJjcnlwdG8ta2V5Ii9rS2V5Q3J5cHRvS2V5IHRocm91Z2ggcHVibGljIGFwaQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNyeXB0by1rZXkiLCBidWZmZXIpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQogICAgICpmb3JtYXQgPSBtc2c7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMzUzLDYgKzE1MjgsMjEgQEAKICAgICAgICAgQUxPR1coImRpZCBub3QgZmluZCBtaW1lIHR5cGUiKTsKICAgICB9CiAKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MobXNnLCBtZXRhKTsKKworICAgIGludDMyX3Qgc3lzdGVtSWQ7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjYS1zeXN0ZW0taWQiLCAmc3lzdGVtSWQpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBzeXN0ZW1JZCk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2FTZXNzaW9uSWQsIGNhUHZ0RGF0YTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY2Etc2Vzc2lvbi1pZCIsICZjYVNlc3Npb25JZCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLCBjYVNlc3Npb25JZC0+ZGF0YSgpLCBjYVNlc3Npb25JZC0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1wcml2YXRlLWRhdGEiLCAmY2FQdnREYXRhKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgMCwgY2FQdnREYXRhLT5kYXRhKCksIGNhUHZ0RGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICBpZiAobXNnLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKQEAgLTEzODQsNyArMTU3NCw3IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKKyAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOwogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwpAQCAtMTQ0Nyw2ICsxNjM3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhkcjEwUGx1c0luZm8sIDAsCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUNvbG9yQXNwZWN0cyhtc2csIG1ldGEpOwogCiAgICAgICAgIEFTdHJpbmcgdHNTY2hlbWE7CkBAIC0xNDcxLDYgKzE2NjcsMTAgQEAKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgICAgICB9CisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgY2hhbm5lbE1hc2spOwpAQCAtMTUyOSwxOSArMTcyOSwxOSBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBlc2RzKGNzZDBzaXplICsgMzEpOwogICAgICAgICAgICAgLy8gVGhlIHdyaXR0ZW4gRVNEUyBpcyBhY3R1YWxseSBmb3IgYW4gYXVkaW8gc3RyZWFtLCBidXQgaXQncyBlbm91Z2gKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKICAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKQEAgLTE1NjAsMTEgKzE3NjAsMTcgQEAKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFsYWNNYWdpY0Nvb2tpZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCB0aW1lU2NhbGU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDICYmIG1zZy0+ZmluZEJ1ZmZlcigiY3NkLWF2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1oZXZjIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJlc2RzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJtcGVnMi1zdHJlYW0taGVhZGVyIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoImQyNjMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgfQogCiAgICAgLy8gWFhYIFRPRE8gYWRkIHdoYXRldmVyIG90aGVyIGtleXMgdGhlcmUgYXJlCkBAIC0xNjQwLDYgKzE4NDYsOSBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICAgICAgICBBVURJT19GT1JNQVRfT1BVU30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMsICAgICAgICAgQVVESU9fRk9STUFUX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLCAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLCAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwgICAgICAgICBBVURJT19GT1JNQVRfQUM0fSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICAgICAgICBBVURJT19GT1JNQVRfRkxBQ30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0FMQUMgfSwKICAgICB7IDAsIEFVRElPX0ZPUk1BVF9JTlZBTElEIH0KQEAgLTE2OTMsNDMgKzE5MDIsNDMgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorc3RhdHVzX3QgZ2V0QXVkaW9PZmZsb2FkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKmluZm8pCiB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgKCppbmZvKSA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CiAKLSAgICBpbmZvLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGlmIChtYXBNaW1lVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwgbWltZSkgIT0gT0spIHsKKyAgICBpbmZvLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LCBtaW1lKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiIENvdWxkbid0IG1hcCBtaW1lIHR5cGUgXCIlc1wiIHRvIGEgdmFsaWQgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAhIiwgbWltZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby5mb3JtYXQpOworICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby0+Zm9ybWF0KTsKICAgICB9CiAKLSAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby5mb3JtYXQpIHsKKyAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby0+Zm9ybWF0KSB7CiAgICAgICAgIC8vIGNhbid0IG9mZmxvYWQgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBzb3VyY2UgZm9ybWF0IGlzCiAgICAgICAgIEFMT0dFKCJtaW1lIHR5cGUgXCIlc1wiIG5vdCBhIGtub3duIGF1ZGlvIGZvcm1hdCIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gUmVkZWZpbmUgYWFjIGZvcm1hdCBhY2NvcmRpbmcgdG8gaXRzIHByb2ZpbGUKICAgICAvLyBPZmZsb2FkaW5nIGRlcGVuZHMgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4KICAgICBpbnQzMl90IGFhY2FvdCA9IC0xOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKLSAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc3JhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBzYW1wbGUgcmF0ZSIsIG1pbWUpOwogICAgIH0KLSAgICBpbmZvLnNhbXBsZV9yYXRlID0gc3JhdGU7CisgICAgaW5mby0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKIAogICAgIGludDMyX3QgY21hc2sgPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNtYXNrKSB8fCBjbWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKQEAgLTE3NDMsMjUgKzE5NTIsMzQgQEAKICAgICAgICAgICAgIGNtYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaW5mby5jaGFubmVsX21hc2sgPSBjbWFzazsKKyAgICBpbmZvLT5jaGFubmVsX21hc2sgPSBjbWFzazsKIAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggZHVyYXRpb24iLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOworICAgIGluZm8tPmR1cmF0aW9uX3VzID0gZHVyYXRpb247CiAKICAgICBpbnQzMl90IGJyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZicmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGJpdHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5iaXRfcmF0ZSA9IGJyYXRlOworICAgIGluZm8tPmJpdF9yYXRlID0gYnJhdGU7CiAKIAotICAgIGluZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOwotICAgIGluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87Ci0gICAgaW5mby5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKyAgICBpbmZvLT5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7CisgICAgaW5mby0+aGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgaW5mby0+aXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgcmV0dXJuIE9LOworfQogCitib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZwogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwpAQCAtMTkzMSw0ICsyMTQ5LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCA5MDIwZmMxLi40ZTViNWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE5LDggKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgpAQCAtMzIsMzIxICszMSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7Ci0gICAgaWYgKCpsaHMgPCAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKLXN0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYwotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IGtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIGtOYW5vc0luMXM7IC8vIDEwIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OlBMTCgpCi0gICAgOiBtUGVyaW9kKC0xKSwKLSAgICAgIG1QaGFzZSgwKSwKLSAgICAgIG1QcmltZWQoZmFsc2UpLAotICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKLSAgICAgIG1MYXN0VGltZSgtMSksCi0gICAgICBtTnVtU2FtcGxlcygwKSB7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKLSAgICAvL3Rlc3QoKTsKLQotICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgIG1MYXN0VGltZSA9IC0xOwotCi0gICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAotICAgIGlmIChmcHMgPD0gMC5mKSB7Ci0gICAgICAgIG1QZXJpb2QgPSAtMTsKLSAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7Ci0gICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKLSAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmVzdGFydCgpOwotfQotCi0vLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzdGFydCgpIHsKLSAgICBtTnVtU2FtcGxlcyA9IDA7Ci0gICAgbVBoYXNlID0gLTE7Ci19Ci0KLSNpZiAwCi0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjp0ZXN0KCkgewotICAgIG5zZWNzX3QgcGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOwotICAgIG1UaW1lc1swXSA9IDA7Ci0gICAgbVRpbWVzWzFdID0gcGVyaW9kOwotICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7Ci0gICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKLSAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OwotICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7Ci0gICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7Ci0gICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7Ci0gICAgbU51bVNhbXBsZXMgPSA4OwotICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7Ci0gICAgLy8gYSA9IDAuOCg1KSsKLSAgICAvLyBiID0gLTAuMTQwOTcoMikrCi0gICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCi0gICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKLX0KLQotI2VuZGlmCi0KLWJvb2wgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpmaXQoCi0gICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKLSAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKLSAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7Ci0gICAgfQotCi0gICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKLSAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3Qgc3VtWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWCA9IDA7Ci0gICAgaW50NjRfdCBzdW1YWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZWSA9IDA7Ci0gICAgaW50NjRfdCBzdW1ZID0gMDsKLQotICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQotICAgIG5zZWNzX3QgbGFzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgewotICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKLSAgICAgICAgfQotICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KLSAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZwotICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAotICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgotICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKLSAgICAgICAgc3VtWCArPSB4OwotICAgICAgICBzdW1ZICs9IHk7Ci0gICAgICAgIHN1bVhYICs9IHggKiB4OwotICAgICAgICBzdW1YWSArPSB4ICogeTsKLSAgICAgICAgc3VtWVkgKz0geSAqIHk7Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKLSAgICBpZiAoZGl2ID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOwotICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKLSAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOwotICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7Ci0gICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50Ci0gICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKLSAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCi0gICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCi0gICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLSAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCi0KLSAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKLSAgICAvLyAybmQgb3JkZXIgZGVsdGFzCi0gICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKLSAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgewotICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKLSAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdFRpbWUgPSB0aW1lOwotICAgIH0KLSAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKLSAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKLSAgICBpZiAobnVtRGVsdGFzID4gMSkgewotICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgewotICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7Ci0gICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKLSAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKLSAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAotICAgIGludDY0X3QgYmVzdFNjb3JlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07Ci0gICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOwotI2lmIDEKLSAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKLSAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOwotICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgewotICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzY29yZSA9IG1hdGNoZXM7Ci0jaWYgMAotICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCi0gICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7Ci0gICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKLSAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOwotICAgICAgICB9Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKLSAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKLSAgICBpZiAobUxhc3RUaW1lID49IDAKLSAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKLSAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKLSAgICAgICAgcmVzdGFydCgpOwotICAgIH0KLQotICAgIG1MYXN0VGltZSA9IHRpbWU7Ci0gICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7Ci0gICAgKyttTnVtU2FtcGxlczsKLQotICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7Ci0gICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7Ci0gICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOwotICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7Ci0gICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICBpZiAobVBoYXNlIDwgMCkgewotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQotICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKLSAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKLSAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb0ZpdCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgewotICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKLSAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KLSAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKLQotICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKLSAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKLQotICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1QZXJpb2Q7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegotc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCi0KLVZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKQotICAgIDogbVZzeW5jVGltZSgwKSwKLSAgICAgIG1Wc3luY1BlcmlvZCgwKSwKLSAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKLSAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKLSAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7CitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkgOiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHsKIH0KIAogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjp1cGRhdGVWc3luYygpIHsKICAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOwotICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAgICAgbVZzeW5jVGltZSA9IDA7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKIAotICAgIC8vIFRPRE86IHNjaGVkdWxlIGZyYW1lcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UKLSAgICAvLyBGb3Igbm93LCBzdXJmYWNlIGZsaW5nZXIgb25seSBzY2hlZHVsZXMgZnJhbWVzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkKICAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKICAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpAQCAtMzY4LDEzNiArNjAsNiBAQAogICAgIH0KIH0KIAotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7Ci0gICAgdXBkYXRlVnN5bmMoKTsKLQotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlc3RhcnQoKSB7Ci0gICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKLSAgICBtVGltZUNvcnJlY3Rpb24gPSAwOwotCi0gICAgbVBsbC5yZXN0YXJ0KCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7Ci0gICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKLSAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Ci19Ci0KLWZsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5nZXRQZXJpb2QoKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxZTkgLyB2aWRlb1BlcmlvZDsKLSAgICB9Ci0gICAgcmV0dXJuIDAuZjsKLX0KLQotbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKLSAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKLQotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7Ci0gICAgICAgIHVwZGF0ZVZzeW5jKCk7Ci0gICAgfQotCi0gICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0gICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKLSAgICB9Ci0KLSAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQotICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKLSAgICAgICAgbVZzeW5jVGltZSAtPQotICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKLSAgICB9Ci0KLSAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCi0gICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKLSAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0KLSAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOwotICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKLSAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKLSAgICAgICAgc2l6ZV90IE4gPSAxMjsKLSAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQotICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7Ci0gICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCi0gICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCi0gICAgICAgICAgICBOID0gMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7Ci0gICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgewotICAgICAgICAgICAgb2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOwotICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKLSAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKLSAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOwotICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7Ci0gICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKLSAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KLSAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7Ci0gICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7Ci0KLSAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCi0gICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQwotICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKLSAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQotICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKLSAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKLSAgICAgICAgICAgICAgICByZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcwotICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKLSAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7Ci0gICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKLSAgICByZXR1cm4gcmVuZGVyVGltZTsKLX0KLQogdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZWxlYXNlKCkgewogICAgIG1Db21wb3Nlci5jbGVhcigpOwogfQpAQCAtNTA3LDQgKzY5LDMgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyYWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcApAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlcjIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Nob3Jlb2dyYXBoZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KGxvbmcqIGFwcFZzeW5jT2Zmc2V0UHRyLCBsb25nKiBzZlZzeW5jT2Zmc2V0UHRyKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZzeW5jVHJhY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBWc3luY1RyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZXsKK3B1YmxpYzoKKyAgICBWc3luY1RyYWNrZXIoKTsKKyAgICB+VnN5bmNUcmFja2VyKCkge30KKyAgICBsb25nIGdldFZzeW5jUGVyaW9kKCk7CisgICAgbG9uZyBnZXRWc3luY1RpbWUobG9uZyBwZXJpb2RPZmZzZXQpOworICAgIHZvaWQgYWRkU2FtcGxlKGxvbmcgdGltZXN0YW1wKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhTYW1wbGVzID0gMzI7CisgICAgc3RhdGljIGNvbnN0IGludCBrTWluU2FtcGxlc0ZvclVwZGF0ZSA9IDY7CisgICAgaW50IG1OdW1TYW1wbGVzOworICAgIGludCBtRmlyc3RTYW1wbGU7CisgICAgbG9uZyBtUmVmZXJlbmNlVGltZTsKKyAgICBsb25nIG1QaGFzZTsKKyAgICBsb25nIG1QZXJpb2Q7CisgICAgbG9uZyBtVGltZXN0YW1wU2FtcGxlc1trTWF4U2FtcGxlc107CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICB2b2lkIHVwZGF0ZU1vZGVsTG9ja2VkKCk7Cit9OworCitWc3luY1RyYWNrZXI6OlZzeW5jVHJhY2tlcigpCisgICAgOiBtTnVtU2FtcGxlcygwKSwKKyAgICAgIG1GaXJzdFNhbXBsZSgwKSwKKyAgICAgIG1SZWZlcmVuY2VUaW1lKDApLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVBlcmlvZCgwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U2FtcGxlczsgaSsrKSB7CisgICAgICAgIG1UaW1lc3RhbXBTYW1wbGVzW2ldID0gMDsKKyAgICB9Cit9CisKK2xvbmcgVnN5bmNUcmFja2VyOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIHJldHVybiBtUGVyaW9kOworfQorCitsb25nIFZzeW5jVHJhY2tlcjo6Z2V0VnN5bmNUaW1lKGxvbmcgcGVyaW9kT2Zmc2V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICBjb25zdCBsb25nIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBsb25nIHBoYXNlID0gbVJlZmVyZW5jZVRpbWUgKyBtUGhhc2U7CisgICAgcmV0dXJuICgoKG5vdyAtIHBoYXNlKSAvIG1QZXJpb2QpICsgcGVyaW9kT2Zmc2V0ICsgMSkgKiBtUGVyaW9kICsgcGhhc2U7Cit9CisKK3ZvaWQgVnN5bmNUcmFja2VyOjphZGRTYW1wbGUobG9uZyB0aW1lc3RhbXApIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgZGF0YUxvY2sobUxvY2spOworICAgIGlmIChtTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIG1QaGFzZSA9IDA7CisgICAgICAgIG1SZWZlcmVuY2VUaW1lID0gdGltZXN0YW1wOworICAgIH0KKyAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIG1OdW1TYW1wbGVzKSAlIGtNYXhTYW1wbGVzOworICAgIG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gPSB0aW1lc3RhbXA7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwga01heFNhbXBsZXMpIHsKKyAgICAgICAgbU51bVNhbXBsZXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmlyc3RTYW1wbGUgPSAobUZpcnN0U2FtcGxlICsgMSkgJSBrTWF4U2FtcGxlczsKKyAgICB9CisgICAgdXBkYXRlTW9kZWxMb2NrZWQoKTsKK30KKwordm9pZCBWc3luY1RyYWNrZXI6OnVwZGF0ZU1vZGVsTG9ja2VkKCkgeworICAgIGlmIChtTnVtU2FtcGxlcyA8IGtNaW5TYW1wbGVzRm9yVXBkYXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9uZyBkdXJhdGlvblN1bSA9IDA7CisgICAgbG9uZyBtaW5EdXJhdGlvbiA9IExPTkdfTUFYOworICAgIGxvbmcgbWF4RHVyYXRpb24gPSAwOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgaW50IHByZXYgPSAoaWR4ICsga01heFNhbXBsZXMgLSAxKSAlIGtNYXhTYW1wbGVzOworICAgICAgICBsb25nIGR1cmF0aW9uID0gbVRpbWVzdGFtcFNhbXBsZXNbaWR4XSAtIG1UaW1lc3RhbXBTYW1wbGVzW3ByZXZdOworICAgICAgICBkdXJhdGlvblN1bSArPSBkdXJhdGlvbjsKKyAgICAgICAgbWluRHVyYXRpb24gPSBtaW4obWluRHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICAgICAgbWF4RHVyYXRpb24gPSBtYXgobWF4RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICB9CisKKyAgICBkdXJhdGlvblN1bSAtPSAobWluRHVyYXRpb24gKyBtYXhEdXJhdGlvbik7CisgICAgbVBlcmlvZCA9IGR1cmF0aW9uU3VtIC8gKG1OdW1TYW1wbGVzIC0gMyk7CisKKyAgICBkb3VibGUgc2FtcGxlQXZnWCA9IDAuMDsKKyAgICBkb3VibGUgc2FtcGxlQXZnWSA9IDAuMDsKKyAgICBkb3VibGUgc2NhbGUgPSAyLjAgKiBNX1BJIC8gKGRvdWJsZSkgbVBlcmlvZDsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbU51bVNhbXBsZXM7IGkrKykgeworICAgICAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIGkpICUga01heFNhbXBsZXM7CisgICAgICAgIGxvbmcgc2FtcGxlID0gbVRpbWVzdGFtcFNhbXBsZXNbaWR4XSAtIG1SZWZlcmVuY2VUaW1lOworICAgICAgICBkb3VibGUgc2FtcGxlUGhhc2UgPSAoZG91YmxlKSAoc2FtcGxlICUgbVBlcmlvZCkgKiBzY2FsZTsKKyAgICAgICAgc2FtcGxlQXZnWCArPSBjb3Moc2FtcGxlUGhhc2UpOworICAgICAgICBzYW1wbGVBdmdZICs9IHNpbihzYW1wbGVQaGFzZSk7CisgICAgfQorCisgICAgc2FtcGxlQXZnWCAvPSAoZG91YmxlKSBtTnVtU2FtcGxlcyAtIDEuMDsKKyAgICBzYW1wbGVBdmdZIC89IChkb3VibGUpIG1OdW1TYW1wbGVzIC0gMS4wOworICAgIG1QaGFzZSA9IChsb25nKSAoYXRhbjIoc2FtcGxlQXZnWSwgc2FtcGxlQXZnWCkgLyBzY2FsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lQ2FsbGJhY2sobG9uZyBmcmFtZVRpbWVOYW5vcywgdm9pZCogZGF0YSkgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxWc3luY1RyYWNrZXI+IHZzeW5jVHJhY2tlcihzdGF0aWNfY2FzdDxWc3luY1RyYWNrZXIqPihkYXRhKSk7CisgICAgdnN5bmNUcmFja2VyLT5hZGRTYW1wbGUoZnJhbWVUaW1lTmFub3MpOworICAgIEFDaG9yZW9ncmFwaGVyX3Bvc3RGcmFtZUNhbGxiYWNrKEFDaG9yZW9ncmFwaGVyX2dldEluc3RhbmNlKCksCisgICAgICAgICAgICBmcmFtZUNhbGxiYWNrLCBzdGF0aWNfY2FzdDx2b2lkKj4odnN5bmNUcmFja2VyLmdldCgpKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHZvaWQgZ2V0VnN5bmNPZmZzZXQobG9uZyogYXBwVnN5bmNPZmZzZXRQdHIsIGxvbmcqIHNmVnN5bmNPZmZzZXRQdHIpIHsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBrT25lTWlsbGlzZWNJbk5hbm9zZWMgPSAxMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBsb25nIGtPbmVTZWNJbk5hbm9zZWMgPSBrT25lTWlsbGlzZWNJbk5hbm9zZWMgKiAxMDAwOworCisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMgPSBlbnYtPkZpbmRDbGFzcygKKyAgICAgICAgICAgICJhbmRyb2lkL2hhcmR3YXJlL2Rpc3BsYXkvRGlzcGxheU1hbmFnZXJHbG9iYWwiKTsKKyAgICBqY2xhc3MgakRpc3BsYXlDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L0Rpc3BsYXkiKTsKKworICAgIGptZXRob2RJRCBqR2V0SW5zdGFuY2UgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywKKyAgICAgICAgICAgICJnZXRJbnN0YW5jZSIsICIoKUxhbmRyb2lkL2hhcmR3YXJlL2Rpc3BsYXkvRGlzcGxheU1hbmFnZXJHbG9iYWw7Iik7CisgICAgam9iamVjdCBqYXZhRGlzcGxheU1hbmFnZXJHbG9iYWxPYmogPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoCisgICAgICAgICAgICBqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsIGpHZXRJbnN0YW5jZSk7CisKKyAgICBqZmllbGRJRCBqREVGQVVMVF9ESVNQTEFZID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKGpEaXNwbGF5Q2xzLCAiREVGQVVMVF9ESVNQTEFZIiwgIkkiKTsKKyAgICBqaW50IERFRkFVTFRfRElTUExBWSA9IGVudi0+R2V0U3RhdGljSW50RmllbGQoakRpc3BsYXlDbHMsIGpERUZBVUxUX0RJU1BMQVkpOworCisgICAgam1ldGhvZElEIGpnZXRSZWFsRGlzcGxheSA9IGVudi0+R2V0TWV0aG9kSUQoakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLAorICAgICAgICAgICAgImdldFJlYWxEaXNwbGF5IiwgIihJKUxhbmRyb2lkL3ZpZXcvRGlzcGxheTsiKTsKKyAgICBqb2JqZWN0IGphdmFEaXNwbGF5T2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgamF2YURpc3BsYXlNYW5hZ2VyR2xvYmFsT2JqLCBqZ2V0UmVhbERpc3BsYXksIERFRkFVTFRfRElTUExBWSk7CisKKyAgICBqbWV0aG9kSUQgakdldFJlZnJlc2hSYXRlID0gZW52LT5HZXRNZXRob2RJRChqRGlzcGxheUNscywgImdldFJlZnJlc2hSYXRlIiwgIigpRiIpOworICAgIGpmbG9hdCBqYXZhUmVmcmVzaFJhdGUgPSBlbnYtPkNhbGxGbG9hdE1ldGhvZChqYXZhRGlzcGxheU9iaiwgakdldFJlZnJlc2hSYXRlKTsKKyAgICBsb25nIHZzeW5jUGVyaW9kID0gKGxvbmcpIChrT25lU2VjSW5OYW5vc2VjIC8gKGZsb2F0KSBqYXZhUmVmcmVzaFJhdGUpOworCisgICAgam1ldGhvZElEIGpHZXRBcHBWc3luY09mZnNldE5hbm9zID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpEaXNwbGF5Q2xzLCAiZ2V0QXBwVnN5bmNPZmZzZXROYW5vcyIsICIoKUoiKTsKKyAgICBqbG9uZyBqYXZhQXBwVnN5bmNPZmZzZXQgPSBlbnYtPkNhbGxMb25nTWV0aG9kKGphdmFEaXNwbGF5T2JqLCBqR2V0QXBwVnN5bmNPZmZzZXROYW5vcyk7CisgICAgKmFwcFZzeW5jT2Zmc2V0UHRyID0gKGxvbmcpIGphdmFBcHBWc3luY09mZnNldDsKKworICAgIGptZXRob2RJRCBqR2V0UHJlc2VudGF0aW9uRGVhZGxpbmVOYW5vcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqRGlzcGxheUNscywgImdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MiLCAiKClKIik7CisgICAgamxvbmcgamF2YVByZXNlbnRhdGlvbkRlYWRsaW5lID0gZW52LT5DYWxsTG9uZ01ldGhvZCgKKyAgICAgICAgICAgIGphdmFEaXNwbGF5T2JqLCBqR2V0UHJlc2VudGF0aW9uRGVhZGxpbmVOYW5vcyk7CisKKyAgICAqc2ZWc3luY09mZnNldFB0ciA9IHZzeW5jUGVyaW9kIC0gKChsb25nKSBqYXZhUHJlc2VudGF0aW9uRGVhZGxpbmUgLSBrT25lTWlsbGlzZWNJbk5hbm9zZWMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIENob3Jlb2dyYXBoZXIgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0cnVjdCBDaG9yZW9ncmFwaGVyVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgQ2hvcmVvZ3JhcGhlclRocmVhZChib29sIGNhbkNhbGxKYXZhKTsKKyAgICBzdGF0dXNfdCBpbml0KHZvaWQqIGRhdGEpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZHlUb1J1bigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DaG9yZW9ncmFwaGVyVGhyZWFkKCkge30KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaG9yZW9ncmFwaGVyVGhyZWFkKTsKKyAgICB2b2lkKiBtRGF0YTsKK307CisKK0Nob3Jlb2dyYXBoZXJUaHJlYWQ6OkNob3Jlb2dyYXBoZXJUaHJlYWQoYm9vbCBjYW5DYWxsSmF2YSkgOiBUaHJlYWQoY2FuQ2FsbEphdmEpIHsKK30KKworc3RhdHVzX3QgQ2hvcmVvZ3JhcGhlclRocmVhZDo6aW5pdCh2b2lkKiBkYXRhKSB7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbURhdGEgPSBkYXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2hvcmVvZ3JhcGhlclRocmVhZDo6cmVhZHlUb1J1bigpIHsKKyAgICBBTG9vcGVyX3ByZXBhcmUoQUxPT1BFUl9QUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1MpOworICAgIGlmIChBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFDaG9yZW9ncmFwaGVyX3Bvc3RGcmFtZUNhbGxiYWNrKEFDaG9yZW9ncmFwaGVyX2dldEluc3RhbmNlKCksIGZyYW1lQ2FsbGJhY2ssIG1EYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2hvcmVvZ3JhcGhlclRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICBBTG9vcGVyX3BvbGxPbmNlKC0xLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6VmlkZW9GcmFtZVNjaGVkdWxlcjIoKSA6IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkgeworCisgICAgZ2V0VnN5bmNPZmZzZXQoJm1BcHBWc3luY09mZnNldCwgJm1TZlZzeW5jT2Zmc2V0KTsKKworICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZCA9IG5ldyBDaG9yZW9ncmFwaGVyVGhyZWFkKHRydWUpOworCisgICAgbVZzeW5jVHJhY2tlciA9IG5ldyBWc3luY1RyYWNrZXIoKTsKKyAgICBpZiAobUNob3Jlb2dyYXBoZXJUaHJlYWQtPmluaXQoc3RhdGljX2Nhc3Q8dm9pZCo+KG1Wc3luY1RyYWNrZXIuZ2V0KCkpKSAhPSBPSykgeworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUNob3Jlb2dyYXBoZXJUaHJlYWQgIT0gTlVMTCAmJiBtQ2hvcmVvZ3JhcGhlclRocmVhZC0+cnVuKCJDaG9yZW9ncmFwaGVyIikgIT0gT0spIHsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjI6OnVwZGF0ZVZzeW5jKCkgeworICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CisKKyAgICBpZiAobVZzeW5jVHJhY2tlciAhPSBOVUxMKSB7CisgICAgICAgIG1Wc3luY1BlcmlvZCA9IG1Wc3luY1RyYWNrZXItPmdldFZzeW5jUGVyaW9kKCk7CisgICAgICAgIG1Wc3luY1RpbWUgPSBtVnN5bmNUcmFja2VyLT5nZXRWc3luY1RpbWUobVNmVnN5bmNPZmZzZXQgLSBtQXBwVnN5bmNPZmZzZXQpOworICAgIH0KKyAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXIyOjpyZWxlYXNlKCkgeworICAgIC8vIERvIG5vdCBjaGFuZ2Ugb3JkZXIKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKworICAgIG1Wc3luY1RyYWNrZXIuY2xlYXIoKTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlcjI6On5WaWRlb0ZyYW1lU2NoZWR1bGVyMigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzEwN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3QgVCAqbGhzLCBjb25zdCBUICpyaHMpIHsKKyAgICBpZiAoKmxocyA8ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoKmxocyA+ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RvcFByaW1lID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1JQorc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDElCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7IC8vIDEwIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpQTEwoKQorICAgIDogbVBlcmlvZCgtMSksCisgICAgICBtUGhhc2UoMCksCisgICAgICBtUHJpbWVkKGZhbHNlKSwKKyAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCisgICAgICBtTGFzdFRpbWUoLTEpLAorICAgICAgbU51bVNhbXBsZXMoMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgeworICAgIC8vdGVzdCgpOworCisgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgbUxhc3RUaW1lID0gLTE7CisKKyAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCisgICAgaWYgKGZwcyA8PSAwLmYpIHsKKyAgICAgICAgbVBlcmlvZCA9IC0xOworICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKKyAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOworICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN0YXJ0KCk7Cit9CisKKy8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzdGFydCgpIHsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVBoYXNlID0gLTE7Cit9CisKKyNpZiAwCisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6dGVzdCgpIHsKKyAgICBuc2Vjc190IHBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gNjA7CisgICAgbVRpbWVzWzBdID0gMDsKKyAgICBtVGltZXNbMV0gPSBwZXJpb2Q7CisgICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKKyAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OworICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7CisgICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKKyAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKKyAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKKyAgICBtTnVtU2FtcGxlcyA9IDg7CisgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKKyAgICAvLyBhID0gMC44KDUpKworICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKKyAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKKyAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworfQorCisjZW5kaWYKKworYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpmaXQoCisgICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorCisgICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKKyAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3Qgc3VtWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZID0gMDsKKworICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQorICAgIG5zZWNzX3QgbGFzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgeworICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKKyAgICAgICAgfQorICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KKyAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZworICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAorICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgorICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKKyAgICAgICAgc3VtWCArPSB4OworICAgICAgICBzdW1ZICs9IHk7CisgICAgICAgIHN1bVhYICs9IHggKiB4OworICAgICAgICBzdW1YWSArPSB4ICogeTsKKyAgICAgICAgc3VtWVkgKz0geSAqIHk7CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKKyAgICBpZiAoZGl2ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOworICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKKyAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOworICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7CisgICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50CisgICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKKyAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisgICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcworCisgICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCisgICAgLy8gMm5kIG9yZGVyIGRlbHRhcworICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7CisgICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOworICAgICAgICB9CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisgICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7CisgICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7CisgICAgaWYgKG51bURlbHRhcyA+IDEpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOworICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOworICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07CisgICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKKyAgICBpbnQ2NF90IGJlc3RTY29yZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgeworICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOworICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKKyNpZiAxCisgICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCisgICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKKyAgICAgICAgICAgICAgICArK21hdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NvcmUgPSBtYXRjaGVzOworI2lmIDAKKyAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7CisgICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKKyAgICAgICAgfQorI2VuZGlmCisjZWxzZQorICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7CisgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgeworICAgIGlmIChtTGFzdFRpbWUgPj0gMAorICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZworICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgeworICAgICAgICByZXN0YXJ0KCk7CisgICAgfQorCisgICAgbUxhc3RUaW1lID0gdGltZTsKKyAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKKyAgICArK21OdW1TYW1wbGVzOworCisgICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKKyAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKKyAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7CisgICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKyAgICAgICAgZG9GaXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgIGlmIChtUGhhc2UgPCAwKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCisgICAgICAgICAgICBtUGhhc2UgPSB0aW1lOworICAgICAgICAgICAgZG9GaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOworICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQorICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgorICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOworICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOworCisgICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworCisgICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKQorICAgIDogbVZzeW5jVGltZSgwKSwKKyAgICAgIG1Wc3luY1BlcmlvZCgwKSwKKyAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKKyAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKKyAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKKyAgICB1cGRhdGVWc3luYygpOworCisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnJlc3RhcnQoKSB7CisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXN0YXJ0KCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7CisgICAgfQorICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOworfQorCitmbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0RnJhbWVSYXRlKCkgeworICAgIG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmdldFBlcmlvZCgpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIDFlOSAvIHZpZGVvUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4gMC5mOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKKyAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7CisgICAgICAgIHVwZGF0ZVZzeW5jKCk7CisgICAgfQorCisgICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQorICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKKyAgICAgICAgbVZzeW5jVGltZSAtPQorICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKKyAgICB9CisKKyAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCisgICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKKyAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisKKyAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKKyAgICAgICAgc2l6ZV90IE4gPSAxMjsKKyAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQorICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7CisgICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCisgICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCisgICAgICAgICAgICBOID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7CisgICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9CisgICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOworICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKKyAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKKyAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOworICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7CisgICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KKyAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7CisgICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7CisgICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQorICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7CisKKyAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCisgICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQorICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKKyAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKKyAgICAgICAgICAgICAgICByZXN0YXJ0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKKyAgICB9CisKKyAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcworICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKKyAgICByZXR1cm4gcmVuZGVyVGltZTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6On5WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHt9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IGRiODYyMTguLjgxNzc3ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icApAQCAtNCw3ICs0LDcgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLQorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBzcmNzOiBbCiAgICAgICAgICJDb252ZXJzaW9uLmNwcCIsCiAgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKaW5kZXggZmZlZDAwNS4uOTFkN2M3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKQEAgLTk4LDYgKzk4LDE3IEBACiAgKi8KIAogLyoqCisgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgorICovCisvLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKK3N0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKKyAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6ICh0LmlzRGVhZE9iamVjdCgpID8gREVBRF9PQkpFQ1QgOiBVTktOT1dOX0VSUk9SKTsKK30KKworLyoqCiAgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgYmluZGVyOjpTdGF0dXNgLgogICoKICAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgpAQCAtMTA3LDIyICsxMTgsMTEgQEAKIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoCiAgICAgICAgIFJldHVybjx2b2lkPiBjb25zdCYgdCkgewogICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKLSAgICAgICAgICAgIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgdG9TdGF0dXNUKHQpLAogICAgICAgICAgICAgdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogfQogCiAvKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAotc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotLyoqCiAgKiBcYnJpZWYgV3JhcCBgbmF0aXZlX2hhbmRsZV90KmAgaW4gYGhpZGxfaGFuZGxlYC4KICAqCiAgKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCBkZDAzZDM4Li44YzFkYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtNzY3LDcgKzc2Nyw3IEBACiAgICAgICAgICAgICBkb3VibGUgbkZyYW1lcyA9ICh0aW1lVXMgLSBtUHJldkNhcHR1cmVVcykgKiBtQ2FwdHVyZUZwcyAvIDEwMDAwMDA7CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8IDAuNSAtIGtUaW1lc3RhbXBGbHVjdHVhdGlvbikgewogICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBmcmFtZSBhcyBpdCdzIHRvbyBjbG9zZSB0byBwcmV2aW91cyBjYXB0dXJlCi0gICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAgICAgQUxPR0QoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPD0gMS4wKSB7CkBAIC0xMTA2LDYgKzExMDYsMTQgQEAKICAgICAgICAgY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CiAgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7CiAKKyAgICAgICAgLy8gU2V0IGltcGwuIGRlZmluZWQgZm9ybWF0IGFzIGRlZmF1bHQuIERlcGVuZGluZyBvbiB0aGUgdXNhZ2UgZmxhZ3MKKyAgICAgICAgLy8gdGhlIGRldmljZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB3aWxsIGRlcml2ZSB0aGUgZXhhY3QgZm9ybWF0LgorICAgICAgICBlcnIgPSBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgc3VyZmFjZSBkZWZhdWx0IGZvcm1hdCByZXQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICAvLyBTZXRzIHRoZSBkZWZhdWx0IGJ1ZmZlciBkYXRhIHNwYWNlCiAgICAgICAgIEFMT0dEKCJzZXR0aW5nIGRhdGFzcGFjZTogJSN4LCBhY3F1aXJlZD0lZCIsIGRhdGFTcGFjZSwgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOwogICAgICAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJEYXRhU3BhY2UoKGFuZHJvaWRfZGF0YXNwYWNlKWRhdGFTcGFjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCAzNzlkNDFlLi5lMGYyNjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTEwNTgsOCArMTA1OCw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRBVkM6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKSB7CitPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CiAgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTExMjUsNyArMTEyNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZyhpbmRleCwgX3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoaW5kZXgsIF9wYXJhbXMsIGZyYW1lQ29uZmlnKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKaW5kZXggYTQzY2RmMS4uODI1M2I3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmgKQEAgLTIxOSw4ICsyMTksOCBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdHJhdGUpOwogCi0gICAgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CisgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKaW5kZXggYTc1NDgzYS4uM2QxMDA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTYxNyw2ICs2MTcsNyBAQAogICAgIHJldHVybjsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93X2ludHJhKAogICAgIGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgKICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDc1Y2E4NDYuLjljMGZjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtMTg2LDggKzE4Niw4IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOwogICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKICNlbHNlCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7CkBAIC0yMTMsNiArMjEzLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQzMiBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChidWZmZXJfc2l6ZSA9IEJpdHN0cmVhbU9wZW4oc3RyZWFtLCBpZHgpKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkluaXRWaWRlb0RlY29kZXIoKTogQ2FuJ3QgYWxsb2NhdGUgYml0c3RyZWFtIGJ1ZmZlci5cbiIpOwpAQCAtMzM5LDI3ICszNDAsMzMgQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IElNRU1fY3VyclZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAKICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBJTUVNX3ByZXZWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2Vsc2UKICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwogICAgIH0KICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbmRpZgogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZSAqIDMpOwogI2VuZGlmICAgLy8gTUVNT1JZX1BPT0wKQEAgLTM4Myw4ICszOTAsMTAgQEAKIAogICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgzICogc2l6ZSAvIDIpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTQzMSwxMCArNDQwLDEyIEBACiAjZWxzZQogICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmFjUHJlZEZsYWcsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ1N0b3JlKSkgewpAQCAtNDQyLDYgKzQ1Myw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkREMsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogCiAgICAgaWYgKG5NQlBlclJvdyA+IElOVDMyX01BWCAtIDEKQEAgLTQ1MCw2ICs0NjIsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgb3NjbF9tYWxsb2MoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogCiAgICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KQEAgLTQ1OSw5ICs0NzIsMTEgQEAKICAgICAvKiBBbGxvY2F0aW5nIEhlYWRlckluZm8gc3RydWN0dXJlICYgUXVhbnRpemVyIGFycmF5ICovCiAgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0ICh2aWRlby0+aGVhZGVySW5mby5DQlAsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKGludDE2KSkgewpAQCAtNDY5LDYgKzQ4NCw3IEBACiAgICAgfQogICAgIHZpZGVvLT5RUE1CID0gKGludDE2ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5RUE1CLCAweDAsIG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKIAogICAgIC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLwpAQCAtNDg5LDggKzUwNSwxMCBAQAogICAgIH0KICAgICB2aWRlby0+bW90WCA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCAwMGYyZGQzLi43MWUxMTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTcsNyArMTcsNiBAQAogI2lmbmRlZiBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KICNkZWZpbmUgU09GVF9NUEVHNF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDIzNjQ2ODQuLmNkOTg0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwogCiAgICAgdWludDMyX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgbURlY29kZXJCdWYgPSBjYWxsb2MoMSwgbWVtUmVxdWlyZW1lbnRzKTsKIAogICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKICAgICBtSXNGaXJzdCA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDNkZjRkNGMuLmM2NTU1NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWcyZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggOGQ1ZjNlNy4uMGYyZmYxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMCwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUyLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKKyAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMkhEUjEwUGx1cywgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogfTsKIAogU29mdFZQWDo6U29mdFZQWCgKQEAgLTg0LDYgKzg1LDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgU29mdFZQWDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgU29mdFZQWDo6aW5pdERlY29kZXIoKSB7CiAgICAgbUN0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CiAgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CkBAIC0xNjcsNyArMTcyLDEyIEBACiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIGJwcCAqIDMpIC8gMjsKLSAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gKihPTVhfVElDS1MgKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIFByaXZJbmZvICpwcml2SW5mbyA9IChQcml2SW5mbyAqKW1JbWctPnVzZXJfcHJpdjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gcHJpdkluZm8tPm1UaW1lU3RhbXA7CisgICAgICAgIGlmIChwcml2SW5mby0+bUhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcXVldWVPdXRwdXRGcmFtZUNvbmZpZyhwcml2SW5mby0+bUhkcjEwUGx1c0luZm8pOworICAgICAgICB9CisKICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlclNhZmUob3V0SGVhZGVyKSkgewogICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyOwogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKQEAgLTI3NSw3ICsyODUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1UaW1lU3RhbXBzW21UaW1lU3RhbXBJZHhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgaWYgKGluSW5mby0+bUZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubUhkcjEwUGx1c0luZm8gPSBkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvLmNsZWFyKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewogICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOwpAQCAtMjg1LDcgKzMwMSw3IEBACiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdCBlcnIgPSB2cHhfY29kZWNfZGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sICZtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLCAwKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVlBYX0NPREVDX09LKSB7CiAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IGI2MmI1MjYuLjBhYThlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQUJ1ZmZlcjsKKwogc3RydWN0IFNvZnRWUFggOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdFZQWChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50Um9sZSwKQEAgLTQxLDYgKzQzLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewpAQCAtNjAsNyArNjMsMTEgQEAKIAogICAgIHZvaWQgKm1DdHg7CiAgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KLSAgICBPTVhfVElDS1MgbVRpbWVTdGFtcHNba051bUJ1ZmZlcnNdOworICAgIHN0cnVjdCBQcml2SW5mbyB7CisgICAgICAgIE9NWF9USUNLUyBtVGltZVN0YW1wOworICAgICAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzSW5mbzsKKyAgICB9OworICAgIFByaXZJbmZvIG1Qcml2SW5mb1trTnVtQnVmZmVyc107CiAgICAgdWludDhfdCBtVGltZVN0YW1wSWR4OwogICAgIHZweF9pbWFnZV90ICptSW1nOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggMmRmYmExMy4uZDBjYjA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtNDAxLDggKzQwMSw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCBkZDg2ZDM2Li4yNjNkMTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTg0LDggKzg0LDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtKTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIC8vIE9NWCBjYWxsYmFjayB3aGVuIGJ1ZmZlcnMgYXZhaWxhYmxlCiAgICAgLy8gTm90ZSB0aGF0IGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IDgxMzAwNGIuLjk0MmY4NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNDMxLDcgKzQzMSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUhlYWRlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUhlYWRlcjsKICAgICAgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKICAgICAgICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoZGF0YSwgc2l6ZSwgbUhlYWRlcikpIHsKQEAgLTQ1Miw2ICs0NTIsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAppbmRleCAwNmIxNWIzLi5mMzUyZmJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCkBAIC03OSw3ICs3OSw3IEBACiAKIHN0YXRpYyBjb25zdCBPTVhfVTMyIGtTdXBwb3J0ZWRQcm9maWxlc1tdID0gewogICAgIE9NWF9BVURJT19BQUNPYmplY3RMQywgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLAotICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwgT01YX0FVRElPX0FBQ09iamVjdEVMRCwKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsIE9NWF9BVURJT19BQUNPYmplY3RYSEUKIH07CiAKIFNvZnRYQUFDOjpTb2Z0WEFBQyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFKiBjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDcwZjUyYzMuLjg2YmQ5ZDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjEsMTAgKzIxLDEyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2Zyb20uaCIKKyNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9hcmdiLmgiCiAjaW5jbHVkZSAibGlieXV2L3ZpZGVvX2NvbW1vbi5oIgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTQ1LDEwICs0NywyOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBib29sIGlzUkdCKE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworfQorCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0J0NzA5KCkgeworICAgIHJldHVybiAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDkpOworfQorCisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzSnBlZygpIHsKKyAgICByZXR1cm4gKChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUpCisgICAgICAgICAgICB8fCAobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1KSkKKyAgICAgICAgICAgICYmIChtUmFuZ2UgPT0gQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsKTsKK30KKwogQ29sb3JDb252ZXJ0ZXI6OkNvbG9yQ29udmVydGVyKAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmcm9tLCBPTVhfQ09MT1JfRk9STUFUVFlQRSB0bykKICAgICA6IG1TcmNGb3JtYXQoZnJvbSksCiAgICAgICBtRHN0Rm9ybWF0KHRvKSwKKyAgICAgIG1TcmNDb2xvclNwYWNlKHswLCAwLCAwfSksCiAgICAgICBtQ2xpcChOVUxMKSB7CiB9CiAKQEAgLTgxLDE0ICsxMDEsMjkgQEAKIH0KIAogYm9vbCBDb2xvckNvbnZlcnRlcjo6aXNEc3RSR0IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1Ci0gICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4Ci0gICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgIHJldHVybiBpc1JHQihtRHN0Rm9ybWF0KTsKIH0KIAordm9pZCBDb2xvckNvbnZlcnRlcjo6c2V0U3JjQ29sb3JTcGFjZSgKKyAgICAgICAgdWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2ZlcikgeworICAgIGlmIChpc1JHQihtU3JjRm9ybWF0KSkgeworICAgICAgICBBTE9HVygiQ2FuJ3Qgc2V0IGNvbG9yIHNwYWNlIG9uIFJHQiBzb3VyY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3JjQ29sb3JTcGFjZS5tU3RhbmRhcmQgPSBzdGFuZGFyZDsKKyAgICBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPSByYW5nZTsKKyAgICBtU3JjQ29sb3JTcGFjZS5tVHJhbnNmZXIgPSB0cmFuc2ZlcjsKK30KKworLyoKKyAqIElmIHN0cmlkZSBpcyBub24temVybywgY2xpZW50J3Mgc3RyaWRlIHdpbGwgYmUgdXNlZC4gRm9yIHBsYW5hcgorICogb3Igc2VtaS1wbGFuYXIgWVVWIGZvcm1hdHMsIHN0cmlkZSBtdXN0IGJlIGV2ZW4gbnVtYmVycy4KKyAqIElmIHN0cmlkZSBpcyB6ZXJvLCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2lkdGggYW5kIGJwcAorICogb2YgdGhlIGZvcm1hdCwgYXNzdW1pbmcgbm8gcGFkZGluZyBvbiB0aGUgcmlnaHQgZWRnZS4KKyAqLwogQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Qml0bWFwUGFyYW1zKAogICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHN0cmlkZSwKICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KQpAQCAtMTAyLDYgKzEzNyw4IEBACiAgICAgICBtQ3JvcEJvdHRvbShjcm9wQm90dG9tKSB7CiAgICAgc3dpdGNoKG1Db2xvckZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgbUJwcCA9IDI7CiAgICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwogICAgICAgICBicmVhazsKQEAgLTExMywxMyArMTUwLDcgQEAKICAgICAgICAgbVN0cmlkZSA9IDQgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6Ci0gICAgICAgIG1CcHAgPSAyOwotICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKLSAgICAgICAgYnJlYWs7Ci0KICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6Ci0gICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CkBAIC0xMzMsNiArMTY0LDEwIEBACiAgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICAvLyB1c2UgY2xpZW50J3Mgc3RyaWRlIGlmIGl0J3Mgc3BlY2lmaWVkLgorICAgIGlmIChzdHJpZGUgIT0gMCkgeworICAgICAgICBtU3RyaWRlID0gc3RyaWRlOworICAgIH0KIH0KIAogc2l6ZV90IENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OmNyb3BXaWR0aCgpIGNvbnN0IHsKQEAgLTE0NSwyMSArMTgwLDIxIEBACiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0KAogICAgICAgICBjb25zdCB2b2lkICpzcmNCaXRzLAotICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCisgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgc2l6ZV90IHNyY0Nyb3BMZWZ0LCBzaXplX3Qgc3JjQ3JvcFRvcCwKICAgICAgICAgc2l6ZV90IHNyY0Nyb3BSaWdodCwgc2l6ZV90IHNyY0Nyb3BCb3R0b20sCiAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwKKyAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LCBzaXplX3QgZHN0U3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSkgewogICAgIEJpdG1hcFBhcmFtcyBzcmMoCiAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oc3JjQml0cyksCi0gICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LAorICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwgc3JjU3RyaWRlLAogICAgICAgICAgICAgc3JjQ3JvcExlZnQsIHNyY0Nyb3BUb3AsIHNyY0Nyb3BSaWdodCwgc3JjQ3JvcEJvdHRvbSwgbVNyY0Zvcm1hdCk7CiAKICAgICBCaXRtYXBQYXJhbXMgZHN0KAogICAgICAgICAgICAgZHN0Qml0cywKLSAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsCisgICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBkc3RDcm9wTGVmdCwgZHN0Q3JvcFRvcCwgZHN0Q3JvcFJpZ2h0LCBkc3RDcm9wQm90dG9tLCBtRHN0Rm9ybWF0KTsKIAogICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMApAQCAtMjc2LDYgKzMxMSwxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorI2RlZmluZSBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIHJnYikgaW50ICgqZnVuYykoICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4KiwgaW50LCBjb25zdCB1aW50OCosIGludCwgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIHVpbnQ4KiwgaW50LCBpbnQsIGludCkgICAgICAgXAorICAgICAgICA9IG1TcmNDb2xvclNwYWNlLmlzQnQ3MDkoKSA/IGxpYnl1djo6SDQyMFRvIyNyZ2IgXAorICAgICAgICA6IG1TcmNDb2xvclNwYWNlLmlzSnBlZygpID8gbGlieXV2OjpKNDIwVG8jI3JnYiAgXAorICAgICAgICA6IGxpYnl1djo6STQyMFRvIyNyZ2IKKwogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cwpAQCAtMjkzLDE5ICszMzUsMjggQEAKIAogICAgIHN3aXRjaCAobURzdEZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgotICAgICAgICBsaWJ5dXY6Okk0MjBUb1JHQjU2NShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIFJHQjU2NSk7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQUJHUik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFCR1IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKLSAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FSR0IpOworICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBBUkdCKTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTc5MywxNSArODQ0LDE1IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCi0gICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CisgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKikoKHVpbnQ4X3QgKikKKyAgICAgICAgICAgIGRzdC5tQml0cyArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tU3RyaWRlICsgZHN0Lm1Dcm9wTGVmdCAqIGRzdC5tQnBwKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjX3kgKyBzcmMubVdpZHRoICogc3JjLm1IZWlnaHQKLSAgICAgICAgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUhlaWdodCAqIHNyYy5tU3RyaWRlICsKKyAgICAgICAgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgLyAyICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKQEAgLTg0MywxMyArODk0LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZTsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCA2NTdhMDViLi4zNTlkZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCiAgICAgICBtV2lkdGgoMCksCiAgICAgICBtSGVpZ2h0KDApLAorICAgICAgbVN0cmlkZSgwKSwKICAgICAgIG1Dcm9wTGVmdCgwKSwKICAgICAgIG1Dcm9wVG9wKDApLAogICAgICAgbUNyb3BSaWdodCgwKSwKQEAgLTY3LDkgKzY4LDEwIEBACiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CiAKLSAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldywgc3RyaWRlTmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aE5ldykpOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGVOZXcpKTsKIAogICAgIGludDMyX3QgY3JvcExlZnROZXcsIGNyb3BUb3BOZXcsIGNyb3BSaWdodE5ldywgY3JvcEJvdHRvbU5ldzsKICAgICBpZiAoIWZvcm1hdC0+ZmluZFJlY3QoCkBAIC0xMDYsNiArMTA4LDcgQEAKICAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOwogICAgIG1XaWR0aCA9IHdpZHRoTmV3OwogICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbVN0cmlkZSA9IHN0cmlkZU5ldzsKICAgICBtQ3JvcExlZnQgPSBjcm9wTGVmdE5ldzsKICAgICBtQ3JvcFRvcCA9IGNyb3BUb3BOZXc7CiAgICAgbUNyb3BSaWdodCA9IGNyb3BSaWdodE5ldzsKQEAgLTI3NiwyMCArMjc5LDE1IEBACiAgICAgaWYgKG1Db252ZXJ0ZXIpIHsKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1TdHJpZGUsCiAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsIDAsCiAgICAgICAgICAgICAgICAgMCwgMCwgbUNyb3BXaWR0aCAtIDEsIG1Dcm9wSGVpZ2h0IC0gMSk7CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPW1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7Ci0gICAgICAgIHNyY192ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgKyBtQ3JvcExlZnQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzA1LDcgKzMwMyw3IEBACiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgbWVtY3B5KGRzdF95LCBzcmNfeSwgbUNyb3BXaWR0aCk7CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIHNyY195ICs9IG1TdHJpZGU7CiAgICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKICAgICAgICAgfQogCkBAIC0zMTMsMTkgKzMxMSwxNSBAQAogICAgICAgICAgICAgbWVtY3B5KGRzdF91LCBzcmNfdSwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogICAgICAgICAgICAgbWVtY3B5KGRzdF92LCBzcmNfdiwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpIHsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY195ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY191ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgc3JjX3kgKz0gbUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKLSAgICAgICAgc3JjX3YgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdCAqIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzQwLDIxICszMzQsMjEgQEAKIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbUNyb3BXaWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoc3JjX3lbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY195KVt4XSA+PiAyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAobUNyb3BXaWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoc3JjX3VbeF0gPj4gMik7Ci0gICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoc3JjX3ZbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY191KVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3YpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM3ZjY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQVN0YXRlOjpBU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmcGFyZW50U3RhdGUpCi0gICAgOiBtUGFyZW50U3RhdGUocGFyZW50U3RhdGUpIHsKLX0KLQotQVN0YXRlOjp+QVN0YXRlKCkgewotfQotCi1zcDxBU3RhdGU+IEFTdGF0ZTo6cGFyZW50U3RhdGUoKSB7Ci0gICAgcmV0dXJuIG1QYXJlbnRTdGF0ZTsKLX0KLQotdm9pZCBBU3RhdGU6OnN0YXRlRW50ZXJlZCgpIHsKLX0KLQotdm9pZCBBU3RhdGU6OnN0YXRlRXhpdGVkKCkgewotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi1BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKLX0KLQotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOwotCi0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgd2hpbGUgKGN1ciAhPSBOVUxMICYmICFjdXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZykpIHsKLSAgICAgICAgLy8gSWYgeW91IGNsYWltIG5vdCB0byBoYXZlIGhhbmRsZWQgdGhlIG1lc3NhZ2UgeW91IHNob3VsZG4ndAotICAgICAgICAvLyBoYXZlIGNhbGxlZCBzZXRTdGF0ZS4uLgotICAgICAgICBDSEVDSyhzYXZlID09IG1TdGF0ZSk7Ci0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIGlmIChjdXIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1coIldhcm5pbmcgbWVzc2FnZSAlcyB1bmhhbmRsZWQgaW4gcm9vdCBzdGF0ZS4iLAotICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmNoYW5nZVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnN0YXRlKSB7Ci0gICAgaWYgKHN0YXRlID09IG1TdGF0ZSkgewotICAgICAgICAvLyBRdWljayBleGl0IGZvciB0aGUgZWFzeSBjYXNlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBBOwotICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQS5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQjsKLSAgICBjdXIgPSBzdGF0ZTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEIucHVzaChjdXIpOwotICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgdGhlIGNvbW1vbiB0YWlsLgotICAgIHdoaWxlIChBLnNpemUoKSA+IDAgJiYgQi5zaXplKCkgPiAwICYmIEEudG9wKCkgPT0gQi50b3AoKSkgewotICAgICAgICBBLnBvcCgpOwotICAgICAgICBCLnBvcCgpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IHN0YXRlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEEuZWRpdEl0ZW1BdChpKS0+c3RhdGVFeGl0ZWQoKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gQi5zaXplKCk7IGkgPiAwOykgewotICAgICAgICBpLS07Ci0gICAgICAgIEIuZWRpdEl0ZW1BdChpKS0+c3RhdGVFbnRlcmVkKCk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKaW5kZXggOTkyMTYzNi4uNzY4Y2JkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCkBAIC0xNzAsNyArMTcwLDkgQEAKIAogICAgIGludDY0X3Qgd2hlblVzOwogICAgIGlmIChkZWxheVVzID4gMCkgewotICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpICsgZGVsYXlVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEdldE5vd1VzKCk7CisgICAgICAgIHdoZW5VcyA9IChkZWxheVVzID4gSU5UNjRfTUFYIC0gbm93VXMgPyBJTlQ2NF9NQVggOiBub3dVcyArIGRlbGF5VXMpOworCiAgICAgfSBlbHNlIHsKICAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKTsKICAgICB9CkBAIC0yMDgsNiArMjEwLDkgQEAKIAogICAgICAgICBpZiAod2hlblVzID4gbm93VXMpIHsKICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHdoZW5VcyAtIG5vd1VzOworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiBJTlQ2NF9NQVggLyAxMDAwKSB7CisgICAgICAgICAgICAgICAgZGVsYXlVcyA9IElOVDY0X01BWCAvIDEwMDA7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywgZGVsYXlVcyAqIDEwMDBsbCk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZkYzM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrU2Vzc2lvbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFOZXR3b3JrU2Vzc2lvbi5oIgotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVRFBTaXplID0gMTUwMDsKLXN0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhVRFBSZXRyaWVzID0gMjAwOwotCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgZXhwbGljaXQgTmV0d29ya1RocmVhZChBTmV0d29ya1Nlc3Npb24gKnNlc3Npb24pOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TmV0d29ya1RocmVhZCgpOwotCi1wcml2YXRlOgotICAgIEFOZXR3b3JrU2Vzc2lvbiAqbVNlc3Npb247Ci0KLSAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTmV0d29ya1RocmVhZCk7Ci19OwotCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIE1PREVfUlRTUCwKLSAgICAgICAgTU9ERV9EQVRBR1JBTSwKLSAgICAgICAgTU9ERV9XRUJTT0NLRVQsCi0gICAgfTsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIExJU1RFTklOR19SVFNQLAotICAgICAgICBMSVNURU5JTkdfVENQX0RHUkFNUywKLSAgICAgICAgREFUQUdSQU0sCi0gICAgfTsKLQotICAgIFNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgIGludCBzLAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgaW50MzJfdCBzZXNzaW9uSUQoKSBjb25zdDsKLSAgICBpbnQgc29ja2V0KCkgY29uc3Q7Ci0gICAgc3A8QU1lc3NhZ2U+IGdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSBjb25zdDsKLQotICAgIGJvb2wgaXNSVFNQU2VydmVyKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3Q7Ci0KLSAgICBib29sIHdhbnRzVG9SZWFkKCk7Ci0gICAgYm9vbCB3YW50c1RvV3JpdGUoKTsKLQotICAgIHN0YXR1c190IHJlYWRNb3JlKCk7Ci0gICAgc3RhdHVzX3Qgd3JpdGVNb3JlKCk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKTsKLQotICAgIHZvaWQgc2V0TW9kZShNb2RlIG1vZGUpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCA9IDEsCi0gICAgfTsKLSAgICBzdHJ1Y3QgRnJhZ21lbnQgewotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIGludDY0X3QgbVRpbWVVczsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICB9OwotCi0gICAgaW50MzJfdCBtU2Vzc2lvbklEOwotICAgIFN0YXRlIG1TdGF0ZTsKLSAgICBNb2RlIG1Nb2RlOwotICAgIGludCBtU29ja2V0OwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotICAgIGJvb2wgbVNhd1JlY2VpdmVGYWlsdXJlLCBtU2F3U2VuZEZhaWx1cmU7Ci0gICAgaW50MzJfdCBtVURQUmV0cmllczsKLQotICAgIExpc3Q8RnJhZ21lbnQ+IG1PdXRGcmFnbWVudHM7Ci0KLSAgICBBU3RyaW5nIG1JbkJ1ZmZlcjsKLQotICAgIGludDY0X3QgbUxhc3RTdGFsbFJlcG9ydFVzOwotCi0gICAgdm9pZCBub3RpZnlFcnJvcihib29sIHNlbmQsIHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqZGV0YWlsKTsKLSAgICB2b2lkIG5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKTsKLQotICAgIHZvaWQgZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJmZyYWcpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbik7Ci19OwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjpOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbikKLSAgICA6IG1TZXNzaW9uKHNlc3Npb24pIHsKLX0KLQotQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjp+TmV0d29ya1RocmVhZCgpIHsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0gICAgbVNlc3Npb24tPnRocmVhZExvb3AoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246OlNlc3Npb246OlNlc3Npb24oCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBTdGF0ZSBzdGF0ZSwKLSAgICAgICAgaW50IHMsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbVNlc3Npb25JRChzZXNzaW9uSUQpLAotICAgICAgbVN0YXRlKHN0YXRlKSwKLSAgICAgIG1Nb2RlKE1PREVfREFUQUdSQU0pLAotICAgICAgbVNvY2tldChzKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZShmYWxzZSksCi0gICAgICBtU2F3U2VuZEZhaWx1cmUoZmFsc2UpLAotICAgICAgbVVEUFJldHJpZXMoa01heFVEUFJldHJpZXMpLAotICAgICAgbUxhc3RTdGFsbFJlcG9ydFVzKC0xbGwpIHsKLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCkgewotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxBZGRyOwotICAgICAgICBzb2NrbGVuX3QgbG9jYWxBZGRyTGVuID0gc2l6ZW9mKGxvY2FsQWRkcik7Ci0KLSAgICAgICAgaW50IHJlcyA9IGdldHNvY2tuYW1lKAotICAgICAgICAgICAgICAgIG1Tb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbG9jYWxBZGRyLCAmbG9jYWxBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgcmVzID0gZ2V0cGVlcm5hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0gICAgICAgIENIRUNLX0dFKHJlcywgMCk7Ci0KLSAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChsb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyBsb2NhbEFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmKTsKLQotICAgICAgICBhZGRyID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIHJlbW90ZUFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdENsaWVudENvbm5lY3RlZCk7Ci0gICAgICAgIG1zZy0+c2V0U3RyaW5nKCJzZXJ2ZXItaXAiLCBsb2NhbEFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInNlcnZlci1wb3J0IiwgbnRvaHMobG9jYWxBZGRyLnNpbl9wb3J0KSk7Ci0gICAgICAgIG1zZy0+c2V0U3RyaW5nKCJjbGllbnQtaXAiLCByZW1vdGVBZGRyU3RyaW5nLmNfc3RyKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJjbGllbnQtcG9ydCIsIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi1BTmV0d29ya1Nlc3Npb246OlNlc3Npb246On5TZXNzaW9uKCkgewotICAgIEFMT0dWKCJTZXNzaW9uICVkIGdvbmUiLCBtU2Vzc2lvbklEKTsKLQotICAgIGNsb3NlKG1Tb2NrZXQpOwotICAgIG1Tb2NrZXQgPSAtMTsKLX0KLQotaW50MzJfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNlc3Npb25JRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlc3Npb25JRDsKLX0KLQotaW50IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c29ja2V0KCkgY29uc3QgewotICAgIHJldHVybiBtU29ja2V0OwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2V0TW9kZShNb2RlIG1vZGUpIHsKLSAgICBtTW9kZSA9IG1vZGU7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKCkgewotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEIHx8IG1Nb2RlICE9IE1PREVfUlRTUCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbU1vZGUgPSBNT0RFX1dFQlNPQ0tFVDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8QU1lc3NhZ2U+IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6Z2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vdGlmeTsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmlzUlRTUFNlcnZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXRlID09IExJU1RFTklOR19SVFNQOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNUQ1BEYXRhZ3JhbVNlcnZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXRlID09IExJU1RFTklOR19UQ1BfREdSQU1TOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d2FudHNUb1JlYWQoKSB7Ci0gICAgcmV0dXJuICFtU2F3UmVjZWl2ZUZhaWx1cmUgJiYgbVN0YXRlICE9IENPTk5FQ1RJTkc7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvV3JpdGUoKSB7Ci0gICAgcmV0dXJuICFtU2F3U2VuZEZhaWx1cmUKLSAgICAgICAgJiYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IENPTk5FQ1RFRCAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKQotICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBEQVRBR1JBTSAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKSk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6cmVhZE1vcmUoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBEQVRBR1JBTSkgewotICAgICAgICBDSEVDS19FUShtTW9kZSwgTU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7Ci0KLSAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gcmVjdmZyb20oCi0gICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0LCBidWYtPmRhdGEoKSwgYnVmLT5jYXBhY2l0eSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0gICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBuKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGlwID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgImZyb21BZGRyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1LiV1LiV1LiV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCA+PiAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwICYgMHhmZikuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmcm9tUG9ydCIsIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LKTsKLQotICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGZhbHNlIC8qIHNlbmQgKi8sIGVyciwgIlJlY3Zmcm9tIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVURQUmV0cmllcy0tOwotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWN2ZnJvbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY2hhciB0bXBbNTEyXTsKLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gcmVjdihtU29ja2V0LCB0bXAsIHNpemVvZih0bXApLCAwKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChuID4gMCkgewotICAgICAgICBtSW5CdWZmZXIuYXBwZW5kKHRtcCwgbik7Ci0KLSNpZiAwCi0gICAgICAgIEFMT0dJKCJpbjoiKTsKLSAgICAgICAgaGV4ZHVtcCh0bXAsIG4pOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgfQotCi0gICAgaWYgKG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgLy8gVENQIHN0cmVhbSBjYXJyeWluZyAxNi1iaXQgbGVuZ3RoLXByZWZpeGVkIGRhdGFncmFtcy4KLQotICAgICAgICB3aGlsZSAobUluQnVmZmVyLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgICBzaXplX3QgcGFja2V0U2l6ZSA9IFUxNl9BVCgoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpKTsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCBwYWNrZXRTaXplICsgMikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBwYWNrZXQgPSBuZXcgQUJ1ZmZlcihwYWNrZXRTaXplKTsKLSAgICAgICAgICAgIG1lbWNweShwYWNrZXQtPmRhdGEoKSwgbUluQnVmZmVyLmNfc3RyKCkgKyAyLCBwYWNrZXRTaXplKTsKLQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBwYWNrZXQtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhZ3JhbSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIHBhY2tldFNpemUgKyAyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNpemVfdCBsZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpID4gMCAmJiBtSW5CdWZmZXIuY19zdHIoKVswXSA9PSAnJCcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkgKyAyKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCArIGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXRCaW5hcnlEYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsIiwgbUluQnVmZmVyLmNfc3RyKClbMV0pOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGF0YSA9IG5ldyBBQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEtPmRhdGEoKSwgbUluQnVmZmVyLmNfc3RyKCkgKyA0LCBsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgZGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgNCArIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9Ci0gICAgICAgICAgICAgICAgUGFyc2VkTWVzc2FnZTo6UGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5CdWZmZXIuY19zdHIoKSwgbUluQnVmZmVyLnNpemUoKSwgZXJyICE9IE9LLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKG1zZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJkYXRhIiwgbXNnKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0jaWYgMQotICAgICAgICAgICAgLy8gWFhYIFRoZSAob2xkKSBkb25nbGUgc2VuZHMgdGhlIHdyb25nIGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBvbiBhCi0gICAgICAgICAgICAvLyBTRVRfUEFSQU1FVEVSIHJlcXVlc3QgdGhhdCBzaWduYWxzIGEgIndmZF9pZHJfcmVxdWVzdCIuCi0gICAgICAgICAgICAvLyAoMTcgaW5zdGVhZCBvZiAxOSkuCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50ID0gbXNnLT5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudAotICAgICAgICAgICAgICAgICAgICAmJiAhbWVtY21wKGNvbnRlbnQsICJ3ZmRfaWRyX3JlcXVlc3RcclxuIiwgMTcpCi0gICAgICAgICAgICAgICAgICAgICYmIGxlbmd0aCA+PSAxOQotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGhdID09ICdccicKLSAgICAgICAgICAgICAgICAgICAgJiYgbUluQnVmZmVyLmNfc3RyKClbbGVuZ3RoICsgMV0gPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGxlbmd0aCArPSAyOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19FUShtTW9kZSwgTU9ERV9XRUJTT0NLRVQpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpOwotICAgICAgICAvLyBoZXhkdW1wKGRhdGEsIG1JbkJ1ZmZlci5zaXplKCkpOwotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAyOwotCi0gICAgICAgICAgICB1aW50NjRfdCBwYXlsb2FkTGVuID0gZGF0YVsxXSAmIDB4N2Y7Ci0gICAgICAgICAgICBpZiAocGF5bG9hZExlbiA9PSAxMjYpIHsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMiA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF5bG9hZExlbiA9IFUxNl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbiA9PSAxMjcpIHsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF5bG9hZExlbiA9IFU2NF9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IDA7Ci0gICAgICAgICAgICBpZiAoZGF0YVsxXSAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAvLyBNQVNLPT0xCi0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDQgPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hc2sgPSBVMzJfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID4gbUluQnVmZmVyLnNpemUoKSB8fCBvZmZzZXQgPiBtSW5CdWZmZXIuc2l6ZSgpIC0gcGF5bG9hZExlbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBmdWxsIG1lc3NhZ2UuCi0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBheWxvYWRMZW4pOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCAmZGF0YVtvZmZzZXRdLCBwYXlsb2FkTGVuKTsKLQotICAgICAgICAgICAgaWYgKG1hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF5bG9hZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldC0+ZGF0YSgpW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdFdlYlNvY2tldE1lc3NhZ2UpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBwYWNrZXQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVhZGVyQnl0ZSIsIGRhdGFbMF0pOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBvZmZzZXQgKyBwYXlsb2FkTGVuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdiBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICYgLyogZnJhZyAqLykgewotI2lmIDAKLSAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpbnQ2NF90IGRlbGF5TXMgPSAobm93VXMgLSBmcmFnLm1UaW1lVXMpIC8gMTAwMGxsOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkRlbGF5TXMgPSAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhEZWxheU1zID0gMzAwOwotCi0gICAgY29uc3QgY2hhciAqa1BhdHRlcm4gPSAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyI7Ci0gICAgc2l6ZV90IGtQYXR0ZXJuU2l6ZSA9IHN0cmxlbihrUGF0dGVybik7Ci0KLSAgICBpbnQgbiA9IChrUGF0dGVyblNpemUgKiAoZGVsYXlNcyAtIGtNaW5EZWxheU1zKSkKLSAgICAgICAgICAgICAgICAvIChrTWF4RGVsYXlNcyAtIGtNaW5EZWxheU1zKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBuID0gMDsKLSAgICB9IGVsc2UgaWYgKChzaXplX3QpbiA+IGtQYXR0ZXJuU2l6ZSkgewotICAgICAgICBuID0ga1BhdHRlcm5TaXplOwotICAgIH0KLQotICAgIEFMT0dJKCJbJWxsZF06ICglNGxsZCBtcykgJXNcbiIsCi0gICAgICAgICAgZnJhZy5tVGltZVVzIC8gMTAwMCwKLSAgICAgICAgICBkZWxheU1zLAotICAgICAgICAgIGtQYXR0ZXJuICsga1BhdHRlcm5TaXplIC0gbik7Ci0jZW5kaWYKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3cml0ZU1vcmUoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBEQVRBR1JBTSkgewotICAgICAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKLSAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZkYXRhZ3JhbSA9IGZyYWcubUJ1ZmZlcjsKLQotICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbiA9IHNlbmQobVNvY2tldCwgZGF0YWdyYW0tPmRhdGEoKSwgZGF0YWdyYW0tPnNpemUoKSwgMCk7Ci0gICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVtcEZyYWdtZW50U3RhdHMoZnJhZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIGlmICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiV6dSBkYXRhZ3JhbXMgcmVtYWluIHF1ZXVlZC4iLCBtT3V0RnJhZ21lbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmICghbVVEUFJldHJpZXMpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlFcnJvcih0cnVlIC8qIHNlbmQgKi8sIGVyciwgIlNlbmQgZGF0YWdyYW0gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNlbmQgZGF0YWdyYW0gZmFpbGVkLCAlZC8lZCByZXRyaWVzIGxlZnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVEUFJldHJpZXMsIGtNYXhVRFBSZXRyaWVzKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VRFBSZXRyaWVzID0ga01heFVEUFJldHJpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICBzb2NrbGVuX3Qgb3B0aW9uTGVuID0gc2l6ZW9mKGVycik7Ci0gICAgICAgIENIRUNLX0VRKGdldHNvY2tvcHQobVNvY2tldCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnIsICZvcHRpb25MZW4pLCAwKTsKLSAgICAgICAgQ0hFQ0tfRVEob3B0aW9uTGVuLCAoc29ja2xlbl90KXNpemVvZihlcnIpKTsKLQotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIG5vdGlmeUVycm9yKGtXaGF0RXJyb3IsIC1lcnIsICJDb25uZWN0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIC1lcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgIG5vdGlmeShrV2hhdENvbm5lY3RlZCk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1TdGF0ZSwgQ09OTkVDVEVEKTsKLSAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgIHNzaXplX3QgbiA9IC0xOwotICAgIHdoaWxlICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBmcmFnLm1CdWZmZXItPmRhdGEoKSwgZnJhZy5tQnVmZmVyLT5zaXplKCksIDApOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFnLm1CdWZmZXItPnNldFJhbmdlKAotICAgICAgICAgICAgICAgIGZyYWcubUJ1ZmZlci0+b2Zmc2V0KCkgKyBuLCBmcmFnLm1CdWZmZXItPnNpemUoKSAtIG4pOwotCi0gICAgICAgIGlmIChmcmFnLm1CdWZmZXItPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZyYWcubUZsYWdzICYgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEKSB7Ci0gICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1PdXRGcmFnbWVudHMuZXJhc2UobU91dEZyYWdtZW50cy5iZWdpbigpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcih0cnVlIC8qIHNlbmQgKi8sIGVyciwgIlNlbmQgZmFpbGVkLiIpOwotICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotICAgIH0KLQotI2lmIDAKLSAgICBpbnQgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgaW50IHJlcyA9IGlvY3RsKG1Tb2NrZXQsIFNJT0NPVVRRLCAmbnVtQnl0ZXNRdWV1ZWQpOwotICAgIGlmIChyZXMgPT0gMCAmJiBudW1CeXRlc1F1ZXVlZCA+IDUwICogMTAyNCkgewotICAgICAgICBpZiAobnVtQnl0ZXNRdWV1ZWQgPiA0MDk2MDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIhISEgbnVtQnl0ZXNRdWV1ZWQgPSAlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgIGlmIChtTGFzdFN0YWxsUmVwb3J0VXMgPCAwbGwKLSAgICAgICAgICAgICAgICB8fCBub3dVcyA+IG1MYXN0U3RhbGxSZXBvcnRVcyArIDEwMDAwMGxsKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0TmV0d29ya1N0YWxsKTsKLSAgICAgICAgICAgIG1zZy0+c2V0U2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCBudW1CeXRlc1F1ZXVlZCk7Ci0gICAgICAgICAgICBtc2ctPnBvc3QoKTsKLQotICAgICAgICAgICAgbUxhc3RTdGFsbFJlcG9ydFVzID0gbm93VXM7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2VuZFJlcXVlc3QoCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgQ0hFQ0sobVN0YXRlID09IENPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gREFUQUdSQU0pOwotCi0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgIHNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilkYXRhKTsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX0RBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0xFKHNpemUsIDY1NTM1KTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplICsgMik7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gc2l6ZSA+PiA4OwotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IHNpemUgJiAweGZmOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyAyLCBkYXRhLCBzaXplKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgbU1vZGUgPT0gTU9ERV9XRUJTT0NLRVQpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wga1VzZU1hc2sgPSBmYWxzZTsgIC8vIENocm9taXVtIGRvZXNuJ3QgbGlrZSBpdC4KLQotICAgICAgICBzaXplX3QgbnVtSGVhZGVyQnl0ZXMgPSAyICsgKGtVc2VNYXNrID8gNCA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDY1NTM1KSB7Ci0gICAgICAgICAgICBudW1IZWFkZXJCeXRlcyArPSA4OwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihudW1IZWFkZXJCeXRlcyArIHNpemUpOwotICAgICAgICBidWZmZXItPmRhdGEoKVswXSA9IDB4ODE7ICAvLyBGSU49PTEgfCBvcGNvZGU9MSAodGV4dCkKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSBrVXNlTWFzayA/IDB4ODAgOiAweDAwOwotCi0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNzsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzNdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzRdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzVdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzZdID0gKHNpemUgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzddID0gKHNpemUgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzhdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOV0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMTI1KSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSAxMjY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsyXSA9IChzaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzNdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtVc2VNYXNrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gcmFuZCgpOwotCi0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDRdID0gKG1hc2sgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gM10gPSAobWFzayA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAyXSA9IChtYXNrID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gMV0gPSBtYXNrICYgMHhmZjsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoc2l6ZV90KXNpemU7ICsraSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzICsgaV0gPQotICAgICAgICAgICAgICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKilkYXRhKVtpXQotICAgICAgICAgICAgICAgICAgICAgICAgXiAoKG1hc2sgPj4gKDggKiAoMyAtIChpICUgNCkpKSkgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIG51bUhlYWRlckJ5dGVzLCBkYXRhLCBzaXplKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQotICAgIEZyYWdtZW50IGZyYWc7Ci0KLSAgICBmcmFnLm1GbGFncyA9IDA7Ci0gICAgaWYgKHRpbWVWYWxpZCkgewotICAgICAgICBmcmFnLm1GbGFncyA9IEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRDsKLSAgICAgICAgZnJhZy5tVGltZVVzID0gdGltZVVzOwotICAgIH0KLQotICAgIGZyYWcubUJ1ZmZlciA9IGJ1ZmZlcjsKLQotICAgIG1PdXRGcmFnbWVudHMucHVzaF9iYWNrKGZyYWcpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6bm90aWZ5RXJyb3IoCi0gICAgICAgIGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXRFcnJvcik7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VuZCIsIHNlbmQpOwotICAgIG1zZy0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbXNnLT5zZXRTdHJpbmcoImRldGFpbCIsIGRldGFpbCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnkoTm90aWZpY2F0aW9uUmVhc29uIHJlYXNvbikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246OkFOZXR3b3JrU2Vzc2lvbigpCi0gICAgOiBtTmV4dFNlc3Npb25JRCgxKSB7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLX0KLQotQU5ldHdvcmtTZXNzaW9uOjp+QU5ldHdvcmtTZXNzaW9uKCkgewotICAgIHN0b3AoKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzdGFydCgpIHsKLSAgICBpZiAobVRocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gcGlwZShtUGlwZUZkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICBtVGhyZWFkID0gbmV3IE5ldHdvcmtUaHJlYWQodGhpcyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtVGhyZWFkLT5ydW4oIkFOZXR3b3JrU2Vzc2lvbiIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtVGhyZWFkLmNsZWFyKCk7Ci0KLSAgICAgICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgICAgIGNsb3NlKG1QaXBlRmRbMV0pOwotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0b3AoKSB7Ci0gICAgaWYgKG1UaHJlYWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbVRocmVhZC0+cmVxdWVzdEV4aXQoKTsKLSAgICBpbnRlcnJ1cHQoKTsKLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLQotICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgIGNsb3NlKG1QaXBlRmRbMF0pOwotICAgIGNsb3NlKG1QaXBlRmRbMV0pOwotICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlUlRTUENsaWVudCgKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlUlRTUENsaWVudCwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIDAgLyogcG9ydCAqLywKLSAgICAgICAgICAgIGhvc3QsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlUlRTUFNlcnZlciwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVEUFNlc3Npb24obG9jYWxQb3J0LCBOVUxMLCAwLCBub3RpZnksIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVVRFBTZXNzaW9uLAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgbG9jYWxQb3J0LAotICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUsCi0gICAgICAgICAgICAmYWRkciwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBOVUxMIC8qIHJlbW90ZUhvc3QgKi8sCi0gICAgICAgICAgICAwIC8qIHJlbW90ZVBvcnQgKi8sCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUsCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6ZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6TWFrZVNvY2tldE5vbkJsb2NraW5nKGludCBzKSB7Ci0gICAgaW50IGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCk7Ci0gICAgaWYgKGZsYWdzIDwgMCkgewotICAgICAgICBmbGFncyA9IDA7Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IGZjbnRsKHMsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7Ci0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmxvY2FsQWRkciwKLSAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqc2Vzc2lvbklEID0gMDsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBpbnQgcywgcmVzOwotICAgIHNwPFNlc3Npb24+IHNlc3Npb247Ci0KLSAgICBzID0gc29ja2V0KAotICAgICAgICAgICAgQUZfSU5FVCwKLSAgICAgICAgICAgIChtb2RlID09IGtNb2RlQ3JlYXRlVURQU2Vzc2lvbikgPyBTT0NLX0RHUkFNIDogU09DS19TVFJFQU0sCi0gICAgICAgICAgICAwKTsKLQotICAgIGlmIChzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlKSB7Ci0gICAgICAgIGNvbnN0IGludCB5ZXMgPSAxOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgc2l6ZW9mKHllcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSB7Ci0gICAgICAgIGludCBzaXplID0gMjU2ICogMTAyNDsKLQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnNpemUsIHNpemVvZihzaXplKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnNpemUsIHNpemVvZihzaXplKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgaW50IGZsYWcgPSAxOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJmZsYWcsIHNpemVvZihmbGFnKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdG9zID0gMjI0OyAgLy8gVk9JQ0UKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBJUFBST1RPX0lQLCBJUF9UT1MsICZ0b3MsIHNpemVvZih0b3MpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IE1ha2VTb2NrZXROb25CbG9ja2luZyhzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgZ290byBiYWlsMjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgICBtZW1zZXQoYWRkci5zaW5femVybywgMCwgc2l6ZW9mKGFkZHIuc2luX3plcm8pKTsKLSAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50Ci0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0gICAgfSBlbHNlIGlmIChsb2NhbEFkZHIgIT0gTlVMTCkgewotICAgICAgICBhZGRyLnNpbl9hZGRyID0gKmxvY2FsQWRkcjsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgaW5fYWRkcl90IHggPSBudG9obChhZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFMT0dJKCJjb25uZWN0aW5nIHNvY2tldCAlZCB0byAlZC4lZC4lZC4lZDolZCIsCi0gICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICh4ID4+IDI0KSwKLSAgICAgICAgICAgICAgKHggPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgKHggPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICB4ICYgMHhmZiwKLSAgICAgICAgICAgICAgbnRvaHMoYWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgIHJlcyA9IGNvbm5lY3QocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwotCi0gICAgICAgIENIRUNLX0xUKHJlcywgMCk7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IGJpbmQocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQU2VydmVyCi0gICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gbGlzdGVuKHMsIDQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihyZW1vdGVBZGRyLnNpbl96ZXJvKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLQotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50PSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICAgICAgICAgICAgICByZXMgPSBjb25uZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVBZGRyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIFNlc3Npb246OlN0YXRlIHN0YXRlOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlUlRTUENsaWVudDoKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmU6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6TElTVEVOSU5HX1RDUF9ER1JBTVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlUlRTUFNlcnZlcjoKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6TElTVEVOSU5HX1JUU1A7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQ0hFQ0tfRVEobW9kZSwga01vZGVDcmVhdGVVRFBTZXNzaW9uKTsKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6REFUQUdSQU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzZXNzaW9uID0gbmV3IFNlc3Npb24oCi0gICAgICAgICAgICBtTmV4dFNlc3Npb25JRCsrLAotICAgICAgICAgICAgc3RhdGUsCi0gICAgICAgICAgICBzLAotICAgICAgICAgICAgbm90aWZ5KTsKLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0gICAgfSBlbHNlIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudCkgewotICAgICAgICBzZXNzaW9uLT5zZXRNb2RlKFNlc3Npb246Ok1PREVfUlRTUCk7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgICpzZXNzaW9uSUQgPSBzZXNzaW9uLT5zZXNzaW9uSUQoKTsKLQotICAgIGdvdG8gYmFpbDsKLQotYmFpbDI6Ci0gICAgY2xvc2Uocyk7Ci0gICAgcyA9IC0xOwotCi1iYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBjaGFyICpyZW1vdGVIb3N0LCB1bnNpZ25lZCByZW1vdGVQb3J0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICByZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICByZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0KLSAgICAgICAgaW50IHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKLSAgICAgICAgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+c2VuZFJlcXVlc3QoZGF0YSwgc2l6ZSwgdGltZVZhbGlkLCB0aW1lVXMpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN3aXRjaFRvV2ViU29ja2V0TW9kZShpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gc2Vzc2lvbi0+c3dpdGNoVG9XZWJTb2NrZXRNb2RlKCk7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjppbnRlcnJ1cHQoKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgZHVtbXkgPSAwOwotCi0gICAgc3NpemVfdCBuOwotICAgIGRvIHsKLSAgICAgICAgbiA9IHdyaXRlKG1QaXBlRmRbMV0sICZkdW1teSwgMSk7Ci0gICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJFcnJvciB3cml0aW5nIHRvIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6dGhyZWFkTG9vcCgpIHsKLSAgICBmZF9zZXQgcnMsIHdzOwotICAgIEZEX1pFUk8oJnJzKTsKLSAgICBGRF9aRVJPKCZ3cyk7Ci0KLSAgICBGRF9TRVQobVBpcGVGZFswXSwgJnJzKTsKLSAgICBpbnQgbWF4RmQgPSBtUGlwZUZkWzBdOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICBGRF9TRVQocywgJnJzKTsKLSAgICAgICAgICAgICAgICBpZiAocyA+IG1heEZkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEZkID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT53YW50c1RvV3JpdGUoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmd3MpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCByZXMgPSBzZWxlY3QobWF4RmQgKyAxLCAmcnMsICZ3cywgTlVMTCwgTlVMTCAvKiB0diAqLyk7Ci0KLSAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR0UoInNlbGVjdCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKEZEX0lTU0VUKG1QaXBlRmRbMF0sICZycykpIHsKLSAgICAgICAgY2hhciBjOwotICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSByZWFkKG1QaXBlRmRbMF0sICZjLCAxKTsKLSAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgQUxPR1coIkVycm9yIHJlYWRpbmcgZnJvbSBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLS1yZXM7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIExpc3Q8c3A8U2Vzc2lvbj4gPiBzZXNzaW9uc1RvQWRkOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtU2Vzc2lvbnMuc2l6ZSgpOyByZXMgPiAwICYmIGkgPiAwOykgewotICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgY29uc3Qgc3A8U2Vzc2lvbj4gJnNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpKTsKLQotICAgICAgICAgICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgICAgICAgICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmcnMpIHx8IEZEX0lTU0VUKHMsICZ3cykpIHsKLSAgICAgICAgICAgICAgICAtLXJlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkgfHwgc2Vzc2lvbi0+aXNUQ1BEYXRhZ3JhbVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50U29ja2V0ID0gYWNjZXB0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRTb2NrZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG1ha2UgY2xpZW50IHNvY2tldCBub24gYmxvY2tpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tICVkLiVkLiVkLiVkOiVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNvY2tldCAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U2Vzc2lvbj4gY2xpZW50U2Vzc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbjo6Q09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5nZXROb3RpZmljYXRpb25NZXNzYWdlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U2Vzc2lvbi0+c2V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmlzUlRTUFNlcnZlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTZXNzaW9uOjpNT0RFX1JUU1AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlc3Npb246Ok1PREVfREFUQUdSQU0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnNUb0FkZC5wdXNoX2JhY2soY2xpZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYWNjZXB0IHJldHVybmVkIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5yZWFkTW9yZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmVhZE1vcmUgb24gc29ja2V0ICVkIGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPndyaXRlTW9yZSgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIndyaXRlTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIXNlc3Npb25zVG9BZGQuZW1wdHkoKSkgewotICAgICAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9ICpzZXNzaW9uc1RvQWRkLmJlZ2luKCk7Ci0gICAgICAgICAgICBzZXNzaW9uc1RvQWRkLmVyYXNlKHNlc3Npb25zVG9BZGQuYmVnaW4oKSk7Ci0KLSAgICAgICAgICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbi0+c2Vzc2lvbklEKCksIHNlc3Npb24pOwotCi0gICAgICAgICAgICBBTE9HSSgiYWRkZWQgY2xpZW50U2Vzc2lvbiAlZCIsIHNlc3Npb24tPnNlc3Npb25JRCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAppbmRleCAyOWNmMWVkLi5kY2YxYWI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCkBAIC01NiwxOCArNTYsMTYgQEAKICAgICAgICAgIkFCdWZmZXIuY3BwIiwKICAgICAgICAgIkFEZWJ1Zy5jcHAiLAogICAgICAgICAiQUhhbmRsZXIuY3BwIiwKLSAgICAgICAgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIiwKICAgICAgICAgIkFMb29wZXIuY3BwIiwKICAgICAgICAgIkFMb29wZXJSb3N0ZXIuY3BwIiwKICAgICAgICAgIkFNZXNzYWdlLmNwcCIsCi0gICAgICAgICJBTmV0d29ya1Nlc3Npb24uY3BwIiwKICAgICAgICAgIkFTdHJpbmcuY3BwIiwKICAgICAgICAgIkFTdHJpbmdVdGlscy5jcHAiLAorICAgICAgICAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCIsCiAgICAgICAgICJCeXRlVXRpbHMuY3BwIiwKICAgICAgICAgIkNvbG9yVXRpbHMuY3BwIiwKICAgICAgICAgIk1lZGlhRGVmcy5jcHAiLAogICAgICAgICAiTWVkaWFLZXlzLmNwcCIsCi0gICAgICAgICJQYXJzZWRNZXNzYWdlLmNwcCIsCiAgICAgICAgICJhdmNfdXRpbHMuY3BwIiwKICAgICAgICAgImJhc2U2NC5jcHAiLAogICAgICAgICAiaGV4ZHVtcC5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGU5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KSB7CisgICAgdWludDMyX3QgbnVtUHJlc2VudGF0aW9ucyA9IHByZXNlbnRhdGlvbnMuc2l6ZSgpOworICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1QcmVzZW50YXRpb25zKSwgc2l6ZW9mKG51bVByZXNlbnRhdGlvbnMpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFwIDogcHJlc2VudGF0aW9ucykgeworICAgICAgICBpZiAoYXAubVZlcnNpb24gPT0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tVmVyc2lvbikpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVZlcnNpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVByZXNlbnRhdGlvbklkKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJlc2VudGF0aW9uSWQpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVByb2dyYW1JZCkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByb2dyYW1JZCkpOworCisgICAgICAgICAgICB1aW50MzJfdCBudW1MYWJlbHMgPSBhcC5tTGFiZWxzLnNpemUoKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbnVtTGFiZWxzKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1MYWJlbHMpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbGFiZWwgOiBhcC5tTGFiZWxzKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxLZXlTaXplID0gbGFiZWwuZmlyc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhYmVsS2V5U2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsS2V5U2l6ZSkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGxhYmVsLmZpcnN0LmNfc3RyKCksIGxhYmVsS2V5U2l6ZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbFZhbFNpemUgPSBsYWJlbC5zZWNvbmQuc2l6ZSgpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhYmVsVmFsU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGxhYmVsLnNlY29uZC5jX3N0cigpLCBsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBsYW5nU2l6ZSA9IGFwLm1MYW5ndWFnZS5zaXplKCk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhbmdTaXplKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYW5nU2l6ZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoYXAubUxhbmd1YWdlLmNfc3RyKCksIGxhbmdTaXplKTsKKworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubU1hc3RlcmluZ0luZGljYXRpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpIHsKKyAgICB1aW50MzJfdCBudW1QcmVzZW50YXRpb25zOworICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtUHJlc2VudGF0aW9ucyksIHNpemVvZihudW1QcmVzZW50YXRpb25zKSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bVByZXNlbnRhdGlvbnM7ICsraSkgeworICAgICAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnZlcnNpb24pLCBzaXplb2YodmVyc2lvbikpOworICAgICAgICBpZiAodmVyc2lvbiA9PSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvblYxIGFwOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVByZXNlbnRhdGlvbklkKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1QcmVzZW50YXRpb25JZCkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tUHJvZ3JhbUlkKSwgc2l6ZW9mKGFwLm1Qcm9ncmFtSWQpKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtTGFiZWxzOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1MYWJlbHMpLCBzaXplb2YobnVtTGFiZWxzKSk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbnVtTGFiZWxzOyArK2opIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbEtleVNpemU7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYWJlbEtleVNpemUpLCBzaXplb2YobGFiZWxLZXlTaXplKSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFiZWxLZXkobGFiZWxLZXlTaXplKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFiZWxLZXkuZGF0YSgpLCBsYWJlbEtleVNpemUpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxWYWxTaXplOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFiZWxWYWxTaXplKSwgc2l6ZW9mKGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhYmVsVmFsKGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhYmVsVmFsLmRhdGEoKSwgbGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgICAgICBhcC5tTGFiZWxzLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYWJlbEtleS5kYXRhKCkpLCBsYWJlbEtleVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFiZWxWYWwuZGF0YSgpKSwgbGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBsYW5ndWFnZVNpemU7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhbmd1YWdlU2l6ZSksIHNpemVvZihsYW5ndWFnZVNpemUpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhbmd1YWdlKGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFuZ3VhZ2UuZGF0YSgpLCBsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgYXAubUxhbmd1YWdlID0gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFuZ3VhZ2UuZGF0YSgpKSwgbGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubU1hc3RlcmluZ0luZGljYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpOworICAgICAgICAgICAgcHJlc2VudGF0aW9ucy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCmluZGV4IGM0ZWFhMjcuLjA3MGUzMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzQyLDYgKzM0MywxNCBAQAogICAgIGFzcGVjdHMubVJhbmdlID0gZnVsbFJhbmdlID8gQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgOiBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZDsKIH0KIAordm9pZCBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGludHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKKyAgICAgICAgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICpvdXR0cmFuc2ZlcikgeworICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOworICAgIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhwcmltYXJpZXMsIGludHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKKyAgICBjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCByYW5nZSwgc3RhbmRhcmQsIG91dHRyYW5zZmVyKTsKK30KKwogLy8gc3RhdGljCiBDb2xvckFzcGVjdHMgQ29sb3JVdGlsczo6dW5wYWNrVG9Db2xvckFzcGVjdHModWludDMyX3QgcGFja2VkKSB7CiAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CkBAIC02ODQsNiArNjkzLDEzIEBACiAgICAgICAgICAgICB0cmFuc2ZlciwgYXNTdHJpbmcoKENvbG9yVHJhbnNmZXIpdHJhbnNmZXIpKTsKIH0KIAorCisvLyBzdGF0aWMKK3ZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoCisgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoaW5mbywgZm9ybWF0LT5tRm9ybWF0KTsKK30KKwogLy8gc3RhdGljCiB2b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KAogICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCmluZGV4IGU1YTg1ZTkuLmFiYTQ0YmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKQEAgLTUwLDEyICs1MCwxNCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00gPSAiYXVkaW8vZ3NtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMyA9ICJhdWRpby9hYzMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DID0gImF1ZGlvL2VhYzMtam9jIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDID0gImF1ZGlvL2FsYWMiOwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhdWRpby9vZ2ciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWM5YWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3A8UGFyc2VkTWVzc2FnZT4gUGFyc2VkTWVzc2FnZTo6UGFyc2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKSB7Ci0gICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0gbmV3IFBhcnNlZE1lc3NhZ2U7Ci0gICAgc3NpemVfdCByZXMgPSBtc2ctPnBhcnNlKGRhdGEsIHNpemUsIG5vTW9yZURhdGEpOwotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgKmxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpsZW5ndGggPSByZXM7Ci0gICAgcmV0dXJuIG1zZzsKLX0KLQotUGFyc2VkTWVzc2FnZTo6UGFyc2VkTWVzc2FnZSgpIHsKLX0KLQotUGFyc2VkTWVzc2FnZTo6flBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6ZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKLSAgICBrZXkudG9sb3dlcigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1EaWN0LmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0KLSAgICBpZiAoIWZpbmRTdHJpbmcobmFtZSwgJnN0cmluZ1ZhbHVlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICp2YWx1ZSA9IHN0cnRvbChzdHJpbmdWYWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IHN0cmluZ1ZhbHVlLmNfc3RyKCkgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgY2hhciAqUGFyc2VkTWVzc2FnZTo6Z2V0Q29udGVudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNvbnRlbnQuY19zdHIoKTsKLX0KLQotc3NpemVfdCBQYXJzZWRNZXNzYWdlOjpwYXJzZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhKSB7Ci0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3NpemVfdCBsYXN0RGljdEluZGV4ID0gLTE7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBib29sIGhlYWRlcnNDb21wbGV0ZSA9IGZhbHNlOwotICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBsaW5lRW5kT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICB3aGlsZSAobGluZUVuZE9mZnNldCArIDEgPCBzaXplCi0gICAgICAgICAgICAgICAgJiYgKGRhdGFbbGluZUVuZE9mZnNldF0gIT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGF0YVtsaW5lRW5kT2Zmc2V0ICsgMV0gIT0gJ1xuJykpIHsKLSAgICAgICAgICAgICsrbGluZUVuZE9mZnNldDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lRW5kT2Zmc2V0ICsgMSA+PSBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIGxpbmUoJmRhdGFbb2Zmc2V0XSwgbGluZUVuZE9mZnNldCAtIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgcmVxdWVzdC9zdGF0dXMgbGluZS4KLQotICAgICAgICAgICAgbURpY3QuYWRkKEFTdHJpbmcoIl8iKSwgbGluZSk7Ci0gICAgICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCA9PSBvZmZzZXQpIHsKLSAgICAgICAgICAgIC8vIEFuIGVtcHR5IGxpbmUgc2VwYXJhdGVzIGhlYWRlcnMgZnJvbSBib2R5LgotICAgICAgICAgICAgaGVhZGVyc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZS5jX3N0cigpWzBdID09ICcgJyB8fCBsaW5lLmNfc3RyKClbMF0gPT0gJ1x0JykgewotICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3IgZm9sZGVkIGhlYWRlciB2YWx1ZXMuCi0KLSAgICAgICAgICAgIGlmIChsYXN0RGljdEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgaXQncyBtYWxmb3JtZWQgc2luY2UgdGhlIGZpcnN0IGhlYWRlciBsaW5lCi0gICAgICAgICAgICAgICAgLy8gY2Fubm90IGNvbnRpbnVlIGFueXRoaW5nLi4uCi0KLSAgICAgICAgICAgICAgICBBU3RyaW5nICZ2YWx1ZSA9IG1EaWN0LmVkaXRWYWx1ZUF0KGxhc3REaWN0SW5kZXgpOwotICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKLSAgICAgICAgaWYgKGNvbG9uUG9zID49IDApIHsKLSAgICAgICAgICAgIEFTdHJpbmcga2V5KGxpbmUsIDAsIGNvbG9uUG9zKTsKLSAgICAgICAgICAgIGtleS50cmltKCk7Ci0gICAgICAgICAgICBrZXkudG9sb3dlcigpOwotCi0gICAgICAgICAgICBsaW5lLmVyYXNlKDAsIGNvbG9uUG9zICsgMSk7Ci0KLSAgICAgICAgICAgIGxhc3REaWN0SW5kZXggPSBtRGljdC5hZGQoa2V5LCBsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgIH0KLQotICAgIGlmICghaGVhZGVyc0NvbXBsZXRlICYmICghbm9Nb3JlRGF0YSB8fCBvZmZzZXQgPT0gMCkpIHsKLSAgICAgICAgLy8gV2UgZWl0aGVyIHNhdyB0aGUgZW1wdHkgbGluZSBzZXBhcmF0aW5nIGhlYWRlcnMgZnJvbSBib2R5Ci0gICAgICAgIC8vIG9yIHdlIHNhdyBhdCBsZWFzdCB0aGUgc3RhdHVzIGxpbmUgYW5kIGtub3cgdGhhdCBubyBtb3JlIGRhdGEKLSAgICAgICAgLy8gaXMgZ29pbmcgdG8gZm9sbG93LgotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGljdC5zaXplKCk7ICsraSkgewotICAgICAgICBtRGljdC5lZGl0VmFsdWVBdChpKS50cmltKCk7Ci0gICAgfQotCi0gICAgaW50MzJfdCBjb250ZW50TGVuZ3RoOwotICAgIGlmICghZmluZEludDMyKCJjb250ZW50LWxlbmd0aCIsICZjb250ZW50TGVuZ3RoKSB8fCBjb250ZW50TGVuZ3RoIDwgMCkgewotICAgICAgICBjb250ZW50TGVuZ3RoID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgdG90YWxMZW5ndGggPSBvZmZzZXQgKyBjb250ZW50TGVuZ3RoOwotCi0gICAgaWYgKHNpemUgPCB0b3RhbExlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbUNvbnRlbnQuc2V0VG8oJmRhdGFbb2Zmc2V0XSwgY29udGVudExlbmd0aCk7Ci0KLSAgICByZXR1cm4gdG90YWxMZW5ndGg7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0UmVxdWVzdEZpZWxkKHNpemVfdCBpbmRleCwgQVN0cmluZyAqZmllbGQpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBzaXplX3QgcHJldk9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkgewotICAgICAgICBpZiAob2Zmc2V0ID49IGxpbmUuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IHNwYWNlUG9zID0gbGluZS5maW5kKCIgIiwgb2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3BhY2VQb3MgPCAwKSB7Ci0gICAgICAgICAgICBzcGFjZVBvcyA9IGxpbmUuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJldk9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgb2Zmc2V0ID0gc3BhY2VQb3MgKyAxOwotICAgIH0KLQotICAgIGZpZWxkLT5zZXRUbyhsaW5lLCBwcmV2T2Zmc2V0LCBvZmZzZXQgLSBwcmV2T2Zmc2V0IC0gMSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0YXR1c0NvZGVTdHJpbmc7Ci0gICAgaWYgKCFnZXRSZXF1ZXN0RmllbGQoMSwgJnN0YXR1c0NvZGVTdHJpbmcpKSB7Ci0gICAgICAgICpzdGF0dXNDb2RlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqc3RhdHVzQ29kZSA9IHN0cnRvbChzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmICgqZW5kICE9ICdcMCcgfHwgZW5kID09IHN0YXR1c0NvZGVTdHJpbmcuY19zdHIoKQotICAgICAgICAgICAgfHwgKCpzdGF0dXNDb2RlKSA8IDEwMCB8fCAoKnN0YXR1c0NvZGUpID4gOTk5KSB7Ci0gICAgICAgICpzdGF0dXNDb2RlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIFBhcnNlZE1lc3NhZ2U6OmRlYnVnU3RyaW5nKCkgY29uc3QgewotICAgIEFTdHJpbmcgbGluZTsKLSAgICBDSEVDSyhmaW5kU3RyaW5nKCJfIiwgJmxpbmUpKTsKLQotICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGljdC5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBBU3RyaW5nICZrZXkgPSBtRGljdC5rZXlBdChpKTsKLSAgICAgICAgY29uc3QgQVN0cmluZyAmdmFsdWUgPSBtRGljdC52YWx1ZUF0KGkpOwotCi0gICAgICAgIGlmIChrZXkgPT0gQVN0cmluZygiXyIpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxpbmUuYXBwZW5kKGtleSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCI6ICIpOwotICAgICAgICBsaW5lLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotICAgIGxpbmUuYXBwZW5kKG1Db250ZW50KTsKLQotICAgIHJldHVybiBsaW5lOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgUGFyc2VkTWVzc2FnZTo6R2V0QXR0cmlidXRlKAotICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7Ci0gICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgewotICAgICAgICAgICAgKytzOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKLQotICAgICAgICBzaXplX3QgbGVuID0KLSAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKLQotICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKLSAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzID0gY29sb25Qb3MgKyAxOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEludDMyQXR0cmlidXRlKAotICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKSB7Ci0gICAgQVN0cmluZyBzdHJpbmdWYWx1ZTsKLSAgICBpZiAoIUdldEF0dHJpYnV0ZShzLCBrZXksICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAppbmRleCA4ZjMyNTgyLi44MzRiODhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0yOCwxNCArMjgsMzEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgc2l6ZV90IGJ1ZlNpemUgPSBuIC8gNCAqIDM7CisgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoYnVmU2l6ZSk7CisKKyAgICBpZiAoZGVjb2RlQmFzZTY0KGJ1Zi0+ZGF0YSgpLCAmYnVmU2l6ZSwgcy5jX3N0cigpKSkgeworICAgICAgICBidWYtPnNldFJhbmdlKDAsIGJ1ZlNpemUpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcykgeworICAgIHNpemVfdCBuID0gc3RybGVuKHMpOworCisgICAgaWYgKChuICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgc2l6ZV90IHBhZGRpbmcgPSAwOwotICAgIGlmIChuID49IDEgJiYgcy5jX3N0cigpW24gLSAxXSA9PSAnPScpIHsKKyAgICBpZiAobiA+PSAxICYmIHNbbiAtIDFdID09ICc9JykgewogICAgICAgICBwYWRkaW5nID0gMTsKIAotICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgIGlmIChuID49IDIgJiYgc1tuIC0gMl0gPT0gJz0nKSB7CiAgICAgICAgICAgICBwYWRkaW5nID0gMjsKIAotICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzLmNfc3RyKClbbiAtIDNdID09ICc9JykgeworICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzW24gLSAzXSA9PSAnPScpIHsKICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUsMTUgKzYyLDEzIEBACiAgICAgLy8gYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCBuICUgNCA9PSAwLgogICAgIHNpemVfdCBvdXRMZW4gPSAobiAvIDQpICogMyAtIHBhZGRpbmc7CiAKLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW4pOwotICAgIHVpbnQ4X3QgKm91dCA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgIGlmIChvdXQgPT0gTlVMTCB8fCBidWZmZXItPnNpemUoKSA8IG91dExlbikgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob3V0ID09IE5VTEwgfHwgKmluT3V0QnVmU2l6ZSA8IG91dExlbikgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBqID0gMDsKICAgICB1aW50MzJfdCBhY2N1bSA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgY2hhciBjID0gcy5jX3N0cigpW2ldOworICAgICAgICBjaGFyIGMgPSBzW2ldOwogICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQSc7CkBAIC02NiwxMCArODEsMTAgQEAKICAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJyB8fCBjID09ICdfJykgewogICAgICAgICAgICAgdmFsdWUgPSA2MzsKICAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA8IG4gLSBwYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2YWx1ZSA9IDA7CkBAIC04Niw3ICsxMDEsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAqaW5PdXRCdWZTaXplID0gajsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNlYmFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2RlZmluZSBBX05FVFdPUktfU0VTU0lPTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgotCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLQotLy8gSGVscGVyIGNsYXNzIHRvIG1hbmFnZSBhIG51bWJlciBvZiBsaXZlIHNvY2tldHMgKGRhdGFncmFtIGFuZCBzdHJlYW0tYmFzZWQpCi0vLyBvbiBhIHNpbmdsZSB0aHJlYWQuIENsaWVudHMgYXJlIG5vdGlmaWVkIGFib3V0IGFjdGl2aXR5IHRocm91Z2ggQU1lc3NhZ2VzLgotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBBTmV0d29ya1Nlc3Npb24oKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlUlRTUENsaWVudCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BTZXJ2ZXIoCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0VURQU2Vzc2lvbigKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBjaGFyICpyZW1vdGVIb3N0LCB1bnNpZ25lZCByZW1vdGVQb3J0KTsKLQotICAgIC8vIHBhc3NpdmUKLSAgICBzdGF0dXNfdCBjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgLy8gYWN0aXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBkZXN0cm95U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUmVxdWVzdCgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUgPSAtMSwKLSAgICAgICAgICAgIGJvb2wgdGltZVZhbGlkID0gZmFsc2UsIGludDY0X3QgdGltZVVzID0gLTFsbCk7Ci0KLSAgICBzdGF0dXNfdCBzd2l0Y2hUb1dlYlNvY2tldE1vZGUoaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgZW51bSBOb3RpZmljYXRpb25SZWFzb24gewotICAgICAgICBrV2hhdEVycm9yLAotICAgICAgICBrV2hhdENvbm5lY3RlZCwKLSAgICAgICAga1doYXRDbGllbnRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0RGF0YSwKLSAgICAgICAga1doYXREYXRhZ3JhbSwKLSAgICAgICAga1doYXRCaW5hcnlEYXRhLAotICAgICAgICBrV2hhdFdlYlNvY2tldE1lc3NhZ2UsCi0gICAgICAgIGtXaGF0TmV0d29ya1N0YWxsLAotICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTmV0d29ya1Nlc3Npb24oKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgTmV0d29ya1RocmVhZDsKLSAgICBzdHJ1Y3QgU2Vzc2lvbjsKLQotICAgIE11dGV4IG1Mb2NrOwotICAgIHNwPFRocmVhZD4gbVRocmVhZDsKLQotICAgIGludDMyX3QgbU5leHRTZXNzaW9uSUQ7Ci0KLSAgICBpbnQgbVBpcGVGZFsyXTsKLQotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNwPFNlc3Npb24+ID4gbVNlc3Npb25zOwotCi0gICAgZW51bSBNb2RlIHsKLSAgICAgICAga01vZGVDcmVhdGVVRFBTZXNzaW9uLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUsCi0gICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIsCi0gICAgICAgIGtNb2RlQ3JlYXRlUlRTUENsaWVudCwKLSAgICB9OwotICAgIHN0YXR1c190IGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAgTW9kZSBtb2RlLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCi0gICAgICAgICAgICB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICB2b2lkIHRocmVhZExvb3AoKTsKLSAgICB2b2lkIGludGVycnVwdCgpOwotCi0gICAgc3RhdGljIHN0YXR1c190IE1ha2VTb2NrZXROb25CbG9ja2luZyhpbnQgcyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTmV0d29ya1Nlc3Npb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBX05FVFdPUktfU0VTU0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ0ZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KKyNkZWZpbmUgQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0gQXVkaW9QcmVzZW50YXRpb25WZXJzaW9uIHsKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQgPSAwLAorICAgIFBSRVNFTlRBVElPTl9WRVJTSU9OXzEsCit9OworCitlbnVtIE1hc3RlcmluZ0luZGljYXRpb24geworICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAorICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCisgICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAorICAgIE1BU1RFUkVEX0ZPUl8zRCwKKyAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAorfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIHsKKyAgICB1aW50MzJfdCBtVmVyc2lvbiA9IFBSRVNFTlRBVElPTl9WRVJTSU9OX1VOREVGSU5FRDsKKyAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZCA9IC0xOworICAgIGludDMyX3QgbVByb2dyYW1JZCA9IC0xOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbUxhYmVsczsKKyAgICBzdGQ6OnN0cmluZyBtTGFuZ3VhZ2U7CisgICAgTWFzdGVyaW5nSW5kaWNhdGlvbiBtTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUklOR19OT1RfSU5ESUNBVEVEOworICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKKyAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBib29sIG1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gZmFsc2U7Cit9OworCitzdHJ1Y3QgQXVkaW9QcmVzZW50YXRpb25WMSA6IHB1YmxpYyBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgQXVkaW9QcmVzZW50YXRpb25WMSgpIHsKKyAgICAgICAgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xOworICAgIH0KK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8QXVkaW9QcmVzZW50YXRpb24+IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbjsKKwordm9pZCBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3QgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uJiBwcmVzZW50YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0qIHNlcmlhbGl6ZWRPdXRwdXQpOworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoc3RkOjppc3RyZWFtKiBzZXJpYWxpemVkSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCmluZGV4IGQ2Yzc2OGQuLmNkMGFmMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBDb2xvclV0aWxzIHsKQEAgLTEzNSw2ICsxMzcsOSBAQAogICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKICAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IHRyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCiAgICAgICAgICAgICBDb2xvckFzcGVjdHMgJmFzcGVjdHMpOworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgaXNvdHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKKyAgICAgICAgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICp0cmFuc2Zlcik7CiAKICAgICAvLyB1bnBhY2sgYSB1aW50MzJfdCB0byBhIGZ1bGwgQ29sb3JBc3BlY3RzIHN0cnVjdAogICAgIHN0YXRpYyBDb2xvckFzcGVjdHMgdW5wYWNrVG9Db2xvckFzcGVjdHModWludDMyX3QgcGFja2VkKTsKQEAgLTE4MCw2ICsxODUsOCBAQAogCiAgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KICAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KKyAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKGFuZHJvaWQ6OkNvbG9yVXRpbHM6OkNvbG9yU3RhbmRhcmQgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAppbmRleCA1ODc1OGJjLi44ZWRkZGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaApAQCAtNTIsNiArNTIsOCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQzYTkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5jYXBzdWxhdGVzIGFuICJIVFRQL1JUU1Agc3R5bGUiIHJlc3BvbnNlLCBpLmUuIGEgc3RhdHVzIGxpbmUsCi0vLyBrZXkvdmFsdWUgcGFpcnMgbWFraW5nIHVwIHRoZSBoZWFkZXJzIGFuZCBhbiBvcHRpb25hbCBib2R5L2NvbnRlbnQuCi1zdHJ1Y3QgUGFyc2VkTWVzc2FnZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyc2VkTWVzc2FnZT4gUGFyc2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCk7Ci0KLSAgICBib29sIGZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKLQotICAgIGNvbnN0IGNoYXIgKmdldENvbnRlbnQoKSBjb25zdDsKLQotICAgIGJvb2wgZ2V0UmVxdWVzdEZpZWxkKHNpemVfdCBpbmRleCwgQVN0cmluZyAqZmllbGQpIGNvbnN0OwotICAgIGJvb2wgZ2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdDsKLQotICAgIEFTdHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKLQotICAgIHN0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKTsKLQotICAgIHN0YXRpYyBib29sIEdldEludDMyQXR0cmlidXRlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSk7Ci0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflBhcnNlZE1lc3NhZ2UoKTsKLQotcHJpdmF0ZToKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBBU3RyaW5nPiBtRGljdDsKLSAgICBBU3RyaW5nIG1Db250ZW50OwotCi0gICAgUGFyc2VkTWVzc2FnZSgpOwotCi0gICAgc3NpemVfdCBwYXJzZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlZE1lc3NhZ2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKaW5kZXggYWJjOTVlMC4uNjBmYjlmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmgKQEAgLTI2LDYgKzI2LDkgQEAKIHN0cnVjdCBBU3RyaW5nOwogCiBzcDxBQnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3QgQVN0cmluZyAmcyk7CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpOworCiB2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKIAogdm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTdjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJNZWRpYUhUVFAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NsZWFyTWVkaWFIVFRQOjpDbGVhck1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKKyAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAorICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAorICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCisgICAgICBtQ2FjaGVkU2l6ZSgwbGwpIHsKK30KKworQ2xlYXJNZWRpYUhUVFA6On5DbGVhck1lZGlhSFRUUCgpIHsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisKKyAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7CisgICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworICAgIH0KKworICAgIG1MYXN0VVJJID0gdXJpOworICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAorICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KKyAgICB1cmkgPSBOVUxMOworCisgICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKKworICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7CisKKyAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7CisKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKKyAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkNsZWFyTWVkaWFIVFRQKCVzKSIsIHNhbml0aXplZC5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKwordm9pZCBDbGVhck1lZGlhSFRUUDo6Y2xvc2UoKSB7CisgICAgZGlzY29ubmVjdCgpOworfQorCit2b2lkIENsZWFyTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgeworICAgIG1OYW1lID0gU3RyaW5nOCgiQ2xlYXJNZWRpYUhUVFAoPGRpc2Nvbm5lY3RlZD4pIik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzc2l6ZV90IENsZWFyTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgeworICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KKyAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworCisgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKKworICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCisgICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgorCisgICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7CisgICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7CisgICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOworICAgIH0KKworICAgICpzaXplID0gbUNhY2hlZFNpemU7CisKKyAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oT0spOworfQorCit1aW50MzJfdCBDbGVhck1lZGlhSFRUUDo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOworfQorCisKK1N0cmluZzggQ2xlYXJNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IHVyaTsKKyAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Cit9CisKK1N0cmluZzggQ2xlYXJNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIHJldHVybiBtaW1lVHlwZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCA3YzkyNDdlLi4wZmJhM2RjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0zMCwxMCArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKLSAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAotICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAotICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCi0gICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAorICAgIDogQ2xlYXJNZWRpYUhUVFAoY29ubiksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CiAKQEAgLTQxLDExNyArMzgsNiBAQAogICAgIGNsZWFyRFJNU3RhdGVfbCgpOwogfQogCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9Ci0KLSAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7Ci0gICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOwotICAgIH0KLQotICAgIG1MYXN0VVJJID0gdXJpOwotICAgIC8vIHJlY29ubmVjdCgpIGNhbGxzIHdpdGggdXJpID09IG9sZCBtTGFzdFVSSS5jX3N0cigpLCB3aGljaCBnZXRzIHphcHBlZAotICAgIC8vIGFzIHBhcnQgb2YgdGhlIGFib3ZlIGFzc2lnbm1lbnQuIEVuc3VyZSBubyBhY2NpZGVudGFsIGxhdGVyIHVzZS4KLSAgICB1cmkgPSBOVUxMOwotCi0gICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZleHRIZWFkZXJzKTsKLQotICAgIG1MYXN0SGVhZGVycyA9IGV4dEhlYWRlcnM7Ci0KLSAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gZmFsc2U7Ci0KLSAgICBpZiAoc3VjY2VzcykgewotICAgICAgICBBU3RyaW5nIHNhbml0aXplZCA9IHVyaURlYnVnU3RyaW5nKG1MYXN0VVJJKTsKLSAgICAgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIk1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXZvaWQgTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgewotICAgIG1OYW1lID0gU3RyaW5nOCgiTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXNzaXplX3QgTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKLSAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKLSAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCi0gICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KLSAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7Ci0KLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47Ci0gICAgfQotCi0gICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwotCi0gICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKLQotICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQotICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KLQotICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgewotICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOwotICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOwotCi0gICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKLX0KLQotdWludDMyX3QgTWVkaWFIVFRQOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gY29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmbUxhc3RIZWFkZXJzLCBvZmZzZXQpOwotfQotCiAvLyBEUk0uLi4KIAogc3A8RGVjcnlwdEhhbmRsZT4gTWVkaWFIVFRQOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7CkBAIC0xNzYsMzMgKzYyLDYgQEAKICAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7CiB9CiAKLVN0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCB1cmk7Ci0gICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIFN0cmluZzggbWltZVR5cGU7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVUeXBlOwotfQotCiB2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgewogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IDkwNTNkNjIuLmM0YTA3MmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMjksMTggKzI5LDE5IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCmluZGV4IDcyNjA0ZTMuLjU5MjY1ZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KQEAgLTM4LDcgKzM4LDcgQEAKIEhUVFBEb3dubG9hZGVyOjpIVFRQRG93bmxvYWRlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgotICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAorICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgQ2xlYXJNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCiAgICAgbUV4dHJhSGVhZGVycyhoZWFkZXJzKSwKICAgICBtRGlzY29ubmVjdGluZyhmYWxzZSkgewogfQpAQCAtOTEsNyArOTEsNyBAQAogCiAgICAgaWYgKHJlY29ubmVjdCkgewogICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgewotICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmwgKyA3KTsKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IENsZWFyRmlsZVNvdXJjZSh1cmwgKyA3KTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKICAgICAgICAgICAgICAgICAmJiBzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCA4YWIzM2Y3Li5kMDZkOWYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTEzOTEsNiArMTM5MSw3IEBACiAgICAgICAgIGNhc2UgJ1FETUMnOgogICAgICAgICBjYXNlICd1bGF3JzoKICAgICAgICAgY2FzZSAndmR2YSc6CisgICAgICAgIGNhc2UgJ2FjLTQnOgogICAgICAgICAgICAgcmV0dXJuICFzdHJjbXAoImF1ZGlvIiwgdHlwZSk7CiAKICAgICAgICAgY2FzZSAnYXZjMSc6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCmluZGV4IGY5ZjhhM2QuLjcxNTFkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCkBAIC0zLDYgKzMsMTAgQEAKIAogICAgIHNyY3M6IFsiSUQzLmNwcCJdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggYTBhNjJmNC4uYjQ4OTE4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL0lEMy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNTYsNiArNTgsNTUgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZW1vcnlTb3VyY2UpOwogfTsKIAorY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlciA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlVW53cmFwcGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZWhlbHBlcikgeworICAgICAgICBtU291cmNlID0gc291cmNlaGVscGVyOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqIC8qdXJpU3RyaW5nKi8sIHNpemVfdCAvKmJ1ZmZlclNpemUqLykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307Citwcml2YXRlOgorICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7Cit9OworCisKK0lEMzo6SUQzKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZWhlbHBlciwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCisgICAgOiBtSXNWYWxpZChmYWxzZSksCisgICAgICBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUZpcnN0RnJhbWVPZmZzZXQoMCksCisgICAgICBtVmVyc2lvbihJRDNfVU5LTk9XTiksCisgICAgICBtUmF3U2l6ZSgwKSB7CisgICAgRGF0YVNvdXJjZVVud3JhcHBlciBzb3VyY2Uoc291cmNlaGVscGVyKTsKKyAgICBtSXNWYWxpZCA9IHBhcnNlVjIoJnNvdXJjZSwgb2Zmc2V0KTsKKworICAgIGlmICghbUlzVmFsaWQgJiYgIWlnbm9yZVYxKSB7CisgICAgICAgIG1Jc1ZhbGlkID0gcGFyc2VWMSgmc291cmNlKTsKKyAgICB9Cit9CisKIElEMzo6SUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbUlzVmFsaWQoZmFsc2UpLAogICAgICAgbURhdGEoTlVMTCksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKaW5kZXggYTkyNDE5Ny4uOGIyMDE4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaApAQCAtNTEsMTIgKzUxLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRCYW5kd2lkdGhIaXN0b3J5U2l6ZShzaXplX3QgbnVtSGlzdG9yeUl0ZW1zKTsKIAotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOwotICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOwotCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOwotICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKLQogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCmluZGV4IDdjMjM5MWUuLjVlNDMzZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaApAQCAtMjQsNiArMjQsNyBAQAogCiBjbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgSUQzIHsKICAgICBlbnVtIFZlcnNpb24gewpAQCAtMzUsNiArMzYsNyBAQAogICAgICAgICBJRDNfVjJfNCwKICAgICB9OwogCisgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlLCBvZmY2NF90IG9mZnNldCA9IDApOwogICAgIGV4cGxpY2l0IElEMyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgSUQzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIGlnbm9yZVYxID0gZmFsc2UpOwogICAgIH5JRDMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCmluZGV4IGY0MzlhMWMuLjU5NmVmYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKICAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwpAQCAtNTEsNiArNTMsOCBAQAogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQogCisgICAgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSk7CisKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICAgICBzaXplX3QgY2FjaGVkU2l6ZSgpOwpAQCAtMTM1LDcgKzEzOSw3IEBACiAgICAgc3NpemVfdCByZWFkSW50ZXJuYWwob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBzZWVrSW50ZXJuYWxfbChvZmY2NF90IG9mZnNldCk7CiAKLSAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Q7CisgICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKIAogICAgIHZvaWQgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKAogICAgICAgICAgICAgYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCA9IGZhbHNlLCBib29sIGZvcmNlID0gZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAppbmRleCBjMjg2NTE2Li42NGRjYTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIENvbG9yQ29udmVydGVyICptQ29udmVydGVyOwogICAgIFlVVk1vZGUgbVlVVk1vZGU7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKLSAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodCwgbVN0cmlkZTsKICAgICBpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOwogICAgIGludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CiAgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCAxYTQ0ZTFmLi5jNTA2NzdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMjYsNyArMjYsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBEYXRhU291cmNlOwotY2xhc3MgTWVkaWFFeHRyYWN0b3I7CiBzdHJ1Y3QgSW1hZ2VEZWNvZGVyOwogc3RydWN0IEZyYW1lUmVjdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggOTdkMTVhNy4uOWIyODUzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMTM3LDYgKzEzNyw3IEBACiAgICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICAgICAgPSAnT01YZCcsCiAgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgICAgIGtXaGF0Rm9yY2VTdGF0ZVRyYW5zaXRpb24gICAgPSAnZnN0dCcsCisgICAgICAgIGtXaGF0Q2hlY2tJZlN0dWNrICAgICAgICAgICAgPSAnQ3N0aycsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMjM2LDYgKzIzNyw4IEBACiAgICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IG1MYXN0TmF0aXZlV2luZG93Q3JvcDsKICAgICBpbnQzMl90IG1MYXN0TmF0aXZlV2luZG93RGF0YVNwYWNlOwogICAgIEhEUlN0YXRpY0luZm8gbUxhc3RIRFJTdGF0aWNJbmZvOworICAgIHNwPEFCdWZmZXI+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyOworICAgIHNwPEFCdWZmZXI+IG1MYXN0SGRyMTBQbHVzQnVmZmVyOwogICAgIHNwPEFNZXNzYWdlPiBtQ29uZmlnRm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CkBAIC0yODksNiArMjkyLDcgQEAKIAogICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXg7CiAgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXg7CisgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXg7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QUNvZGVjQnVmZmVyQ2hhbm5lbD4gbUJ1ZmZlckNoYW5uZWw7CiAKQEAgLTQyMyw2ICs0MjcsMTEgQEAKICAgICAvLyB1bnNwZWNpZmllZCB2YWx1ZXMuCiAgICAgdm9pZCBvbkRhdGFTcGFjZUNoYW5nZWQoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDb2xvckFzcGVjdHMgJmFzcGVjdHMpOwogCisgICAgLy8gbm90aWZpZXMgdGhlIGNvZGVjIHRoYXQgdGhlIGNvbmZpZyB3aXRoIHxjb25maWdJbmRleHwgaGFzIGNoYW5nZWQsIHRoZSB2YWx1ZQorICAgIC8vIGNhbiBiZSBxdWVyaWVkIGJ5IE9NWCBnZXRDb25maWcsIGFuZCB0aGUgY29uZmlnIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBuZXh0CisgICAgLy8gb3V0cHV0IGJ1ZmZlciBub3RpZmllZCBhZnRlciB0aGlzIGNhbGxiYWNrLgorICAgIHZvaWQgb25Db25maWdVcGRhdGUoT01YX0lOREVYVFlQRSBjb25maWdJbmRleCk7CisKICAgICAvLyBnZXRzIGluZGV4IG9yIHNldHMgaXQgdG8gMCBvbiBlcnJvci4gUmV0dXJucyBlcnJvciBmcm9tIGNvZGVjLgogICAgIHN0YXR1c190IGluaXREZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCgpOwogCkBAIC00MzQsMTIgKzQ0MywyMiBAQAogICAgIC8vIHNldHMgfHBhcmFtc3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgogICAgIHN0YXR1c190IHNldEhEUlN0YXRpY0luZm8oY29uc3QgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpOwogCisgICAgLy8gc2V0cyB8aGRyMTBQbHVzSW5mb3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgorICAgIHN0YXR1c190IHNldEhkcjEwUGx1c0luZm8oY29uc3Qgc3A8QUJ1ZmZlcj4gJmhkcjEwUGx1c0luZm8pOworCiAgICAgLy8gZ2V0cyB8cGFyYW1zfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCiAgICAgc3RhdHVzX3QgZ2V0SERSU3RhdGljSW5mbyhEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcyk7CiAKICAgICAvLyBnZXRzIEhEUiBzdGF0aWMgaW5mb3JtYXRpb24gZm9yIHRoZSB2aWRlbyBlbmNvZGVyL2RlY29kZXIgcG9ydCBhbmQgc2V0cyB0aGVtIGludG8gfGZvcm1hdHwuCiAgICAgc3RhdHVzX3QgZ2V0SERSU3RhdGljSW5mb0ZvclZpZGVvQ29kZWMoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAorICAgIC8vIGdldHMgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIHBhcmFtcy4gSWYgfHBhcmFtU2l6ZVVzZWR8IGlzIHplcm8sIGl0J3MKKyAgICAvLyBwb3NzaWJsZSB0aGF0IHRoZSByZXR1cm5lZCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgb25seSBoYXMgdGhlCisgICAgLy8gblBhcmFtU2l6ZVVzZWQgZmllbGQgdXBkYXRlZCwgYmVjYXVzZSB0aGUgc2l6ZSBvZiB0aGUgc3RvcmFnZSBpcyBpbnN1ZmZpY2llbnQuCisgICAgLy8gSW4gdGhpcyBjYXNlLCBnZXRIRFIxMFBsdXNJbmZvKCkgc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHxwYXJhbVNpemVVc2VkfAorICAgIC8vIHNwZWNpZmllZCB0byB0aGUgcHJldmlvdXMgcmV0dXJuZWQgdmFsdWUuCisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBnZXRIRFIxMFBsdXNJbmZvKHNpemVfdCBwYXJhbVNpemVVc2VkID0gMCk7CisKICAgICB0eXBlZGVmIHN0cnVjdCBkcmNQYXJhbXMgewogICAgICAgICBpbnQzMl90IGRyY0N1dDsKICAgICAgICAgaW50MzJfdCBkcmNCb29zdDsKQEAgLTQ2MCw2ICs0NzksOCBAQAogCiAgICAgc3RhdHVzX3Qgc2V0dXBFQUMzQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpOwogCisgICAgc3RhdHVzX3Qgc2V0dXBBQzRDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CisKICAgICBzdGF0dXNfdCBzZWxlY3RBdWRpb1BvcnRGb3JtYXQoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0FVRElPX0NPRElOR1RZUEUgZGVzaXJlZEZvcm1hdCk7CiAKQEAgLTQ3Niw2ICs0OTcsNyBAQAogICAgIHN0YXR1c190IHNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpOwogICAgIHN0YXR1c190IHNldExhdGVuY3kodWludDMyX3QgbGF0ZW5jeSk7CiAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpOwogICAgIHN0YXR1c190IHNldE9wZXJhdGluZ1JhdGUoZmxvYXQgcmF0ZUZsb2F0LCBib29sIGlzVmlkZW8pOwogICAgIHN0YXR1c190IGdldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCAqaW50cmFSZWZyZXNoUGVyaW9kKTsKICAgICBzdGF0dXNfdCBzZXRJbnRyYVJlZnJlc2hQZXJpb2QodWludDMyX3QgaW50cmFSZWZyZXNoUGVyaW9kLCBib29sIGluQ29uZmlndXJlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTgzNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9GSUxFX1NPVVJDRV9IXworCisjZGVmaW5lIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENsZWFyRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICBDbGVhckZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIC8vIENsZWFyRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCisgICAgQ2xlYXJGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNsZWFyRmlsZVNvdXJjZSgpOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50IG1GZDsKKyAgICBpbnQ2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtTGVuZ3RoOworICAgIE11dGV4IG1Mb2NrOworCitwcml2YXRlOgorICAgIFN0cmluZzggbU5hbWU7CisKKyAgICBDbGVhckZpbGVTb3VyY2UoY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworICAgIENsZWFyRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENsZWFyRmlsZVNvdXJjZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTA3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjZGVmaW5lIENMRUFSX01FRElBX0hUVFBfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgQ2xlYXJNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2UgeworICAgIENsZWFyTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJNZWRpYUhUVFAoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKKworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENsZWFyTWVkaWFIVFRQKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJfTUVESUFfSFRUUF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDViMzU0M2QuLjZkNGMxYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTM1LDIxICszNSwzMiBAQAogCiAgICAgYm9vbCBpc0RzdFJHQigpIGNvbnN0OwogCisgICAgdm9pZCBzZXRTcmNDb2xvclNwYWNlKHVpbnQzMl90IHN0YW5kYXJkLCB1aW50MzJfdCByYW5nZSwgdWludDMyX3QgdHJhbnNmZXIpOworCiAgICAgc3RhdHVzX3QgY29udmVydCgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IHNyY0Nyb3BSaWdodCwgc2l6ZV90IHNyY0Nyb3BCb3R0b20sCiAgICAgICAgICAgICB2b2lkICpkc3RCaXRzLAotICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LCBzaXplX3QgZHN0U3RyaWRlLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BMZWZ0LCBzaXplX3QgZHN0Q3JvcFRvcCwKICAgICAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQ29sb3JTcGFjZSB7CisgICAgICAgIHVpbnQzMl90IG1TdGFuZGFyZDsKKyAgICAgICAgdWludDMyX3QgbVJhbmdlOworICAgICAgICB1aW50MzJfdCBtVHJhbnNmZXI7CisKKyAgICAgICAgYm9vbCBpc0J0NzA5KCk7CisgICAgICAgIGJvb2wgaXNKcGVnKCk7CisgICAgfTsKKwogICAgIHN0cnVjdCBCaXRtYXBQYXJhbXMgewogICAgICAgICBCaXRtYXBQYXJhbXMoCiAgICAgICAgICAgICAgICAgdm9pZCAqYml0cywKLSAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpOwpAQCAtNjUsNiArNzYsNyBAQAogICAgIH07CiAKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0OworICAgIENvbG9yU3BhY2UgbVNyY0NvbG9yU3BhY2U7CiAgICAgdWludDhfdCAqbUNsaXA7CiAKICAgICB1aW50OF90ICppbml0Q2xpcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA4NjA0ODkwLi5iNjEwZWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMjAsNDcgKzIwLDI5IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK2NsYXNzIEZpbGVTb3VyY2UgOiBwdWJsaWMgQ2xlYXJGaWxlU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgewotICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KICAgICBzdGF0aWMgYm9vbCByZXF1aXJlc0RybShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgaW50IG1GZDsKLSAgICBpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgaW50NjRfdCBtTGVuZ3RoOwotICAgIE11dGV4IG1Mb2NrOwotICAgIFN0cmluZzggbU5hbWU7Ci0KICAgICAvKmZvciBEUk0qLwogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwpAQCAtNjgsNyArNTAsNyBAQAogICAgIHNzaXplX3QgbURybUJ1ZlNpemU7CiAgICAgdW5zaWduZWQgY2hhciAqbURybUJ1ZjsKIAotICAgIHNzaXplX3QgcmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3NpemVfdCByZWFkQXREUk1fbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgRmlsZVNvdXJjZShjb25zdCBGaWxlU291cmNlICYpOwogICAgIEZpbGVTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGaWxlU291cmNlICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCmluZGV4IGYwZWJkNDguLmI4M2E5NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgSU5URVJGQUNFX1VUSUxTX0hfCiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDNlZjRjMGUuLjcwNGJmZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0xMzUsNiArMTM1LDggQEAKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzID0gMHgwODsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUySERSID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTNIRFIgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUjEwUGx1cyA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSMTBQbHVzID0gMHg4MDAwOwogCiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDEgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwxMSA9IDB4MjsKQEAgLTE1NSw2ICsxNTcsNyBAQAogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTAgICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW5TdGlsbCAgID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyA9IDB4MjAwMDsKIAogY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWwxICA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMSAgPSAweDI7CkBAIC0zMjcsNiArMzMwLDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9CSVRSQVRFX01PREVbXSA9ICJiaXRyYXRlLW1vZGUiOwogY29uc3RleHByIGNoYXIgS0VZX0NBX1NFU1NJT05fSURbXSA9ICJjYS1zZXNzaW9uLWlkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TWVNURU1fSURbXSA9ICJjYS1zeXN0ZW0taWQiOworY29uc3RleHByIGNoYXIgS0VZX0NBX1BSSVZBVEVfREFUQVtdID0gImNhLXByaXZhdGUtZGF0YSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FQVFVSRV9SQVRFW10gPSAiY2FwdHVyZS1yYXRlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DSEFOTkVMX0NPVU5UW10gPSAiY2hhbm5lbC1jb3VudCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9NQVNLW10gPSAiY2hhbm5lbC1tYXNrIjsKQEAgLTM0Miw2ICszNDYsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0dSSURfQ09MVU1OU1tdID0gImdyaWQtY29scyI7CiBjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9ST1dTW10gPSAiZ3JpZC1yb3dzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJoZHItc3RhdGljLWluZm8iOworY29uc3RleHByIGNoYXIgS0VZX0hEUjEwX1BMVVNfSU5GT1tdID0gImhkcjEwLXBsdXMtaW5mbyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSEVJR0hUW10gPSAiaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9JX0ZSQU1FX0lOVEVSVkFMW10gPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0RbXSA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLjg0ZTAxZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMjEsOCArMjEsNiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNywyMiArMzUsMjcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKICAgICBzdGF0aWMgdm9pZCBMb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgIHN0YXRpYyB2b2lkIFNldExpbmtlZExpYnJhcmllcyhjb25zdCBzdGQ6OnN0cmluZyYgbGlua2VkTGlicmFyaWVzKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgTXV0ZXggZ1BsdWdpbk11dGV4OwotICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IGdQbHVnaW5zOwogICAgIHN0YXRpYyBib29sIGdQbHVnaW5zUmVnaXN0ZXJlZDsKKyAgICBzdGF0aWMgYm9vbCBnSWdub3JlVmVyc2lvbjsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ0xpbmtlZExpYnJhcmllczsKIAogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKAotICAgICAgICAgICAgY29uc3QgY2hhciAqYXBrUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogCi0gICAgc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBzbmlmZihEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwKLSAgICAgICAgICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbik7CisgICAgc3RhdGljIHZvaWQgKnNuaWZmKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCisgICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIHVpbnQzMl90ICpjcmVhdG9yVmVyc2lvbik7CiAKICAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCmluZGV4IGZlMGU2MTMuLmFjYWE2YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMTksNTAgKzE5LDIxIEBACiAjZGVmaW5lIE1FRElBX0hUVFBfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CiAKLXN0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2Ugeworc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBDbGVhck1lZGlhSFRUUCB7CiAgICAgTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOwogCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247Ci0KLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7Ci0gICAgQVN0cmluZyBtTGFzdFVSSTsKLQotICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKLSAgICBvZmY2NF90IG1DYWNoZWRTaXplOwotCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggNjZmNGQ3Mi4uNjlkNmNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9XRUJNICAgICAgICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQICAgPSAyLAogICAgICAgICBPVVRQVVRfRk9STUFUX0hFSUYgICAgICAgID0gMywKKyAgICAgICAgT1VUUFVUX0ZPUk1BVF9PR0cgICAgICAgICA9IDQsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKaW5kZXggZDVhODA4MC4uZGNhZjI3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKQEAgLTIwLDEzICsyMCwyNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIGJvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAogICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTUVUQV9EQVRBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDU0YTcwOTUuLjhkYzhkMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NCw4ICs2NSw2IEBACiAKICAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKIAotICAgIHZvaWQgZGlzY29ubmVjdCgpOwotCiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCwgdWludDMyX3QgZmxhZ3MgPSAwKSBjb25zdDsKIApAQCAtOTcsNiArOTYsOSBAQAogCiAgICAgYm9vbCBnZXRDYWNoZWREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpIGNvbnN0OwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9QcmVzZW50YXRpb25zKHNpemVfdCB0cmFja0lkeCwKKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucykgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdU1lZGlhRXh0cmFjdG9yKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODM3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9HR19XUklURVJfSF8KKworI2RlZmluZSBPR0dfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCBPZ2dTdHJlYW1TdGF0ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT2dnV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBPZ2dXcml0ZXIoaW50IGZkKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOworICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSogcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworcHJvdGVjdGVkOgorICAgIH5PZ2dXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBpbnQgbUZkOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtU3RhcnRlZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgcHRocmVhZF90IG1UaHJlYWQ7CisgICAgaW50NjRfdCBtU2FtcGxlUmF0ZTsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWRTaXplQnl0ZXM7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkRHVyYXRpb25VczsKKworICAgIHN0YXRpYyB2b2lkKiBUaHJlYWRXcmFwcGVyKHZvaWQqKTsKKyAgICBzdGF0dXNfdCB0aHJlYWRGdW5jKCk7CisgICAgYm9vbCBleGNlZWRzRmlsZVNpemVMaW1pdCgpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCk7CisgICAgc3RhdHVzX3QgcmVzZXQoKTsKKworICAgIGludDMyX3QgbUN1cnJlbnRQYWNrZXRJZDsKKyAgICBPZ2dTdHJlYW1TdGF0ZSogbU9zID0gbnVsbHB0cjsKKworICAgIE9nZ1dyaXRlcihjb25zdCBPZ2dXcml0ZXImKTsKKyAgICBPZ2dXcml0ZXImIG9wZXJhdG9yPShjb25zdCBPZ2dXcml0ZXImKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT0dHX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDUwOWU2NjkuLjk5MjUxMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCmluZGV4IDFkNzIwYWYuLjAzZDM4NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTM3LDEyICszNywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiBwcml2YXRlOgogICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgTWVkaWFUcmFjayAqbVRyYWNrOwogICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CiAKICAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCA2YTI4ZTBiLi5lOGUwYTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzcDxNZXRhRGF0YT4gJm1ldGEpOwpAQCAtNTAsNiArNTIsMTAgQEAKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAorLy8gUmV0dXJuIHxhdWRpb19vZmZsb2FkX2luZm9fdHwgZmlsbGVkIGZyb20gZ2l2ZW4gbWV0YWRhdGEKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKTsKKwogLy8gQ2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGRlZmluZWQgYnkgbWV0YSBjYW4gYmUgb2ZmbG9hZGVkIHRvIGhhcmR3YXJlCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IDlkOTdkZmQuLmZjZmNiZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsODcgKzE3LDI0IEBACiAjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KIAotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CiAKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2Ugeworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLQotICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgotICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKLSAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKLSAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKLSAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKLSAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFBMTCB7Ci0gICAgICAgIFBMTCgpOwotCi0gICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCi0gICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOwotICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCi0gICAgICAgIHZvaWQgcmVzdGFydCgpOwotICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCi0gICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7Ci0gICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBuc2Vjc190IG1QZXJpb2Q7Ci0gICAgICAgIG5zZWNzX3QgbVBoYXNlOwotCi0gICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKLSAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotCi0gICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQotICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0Ci0KLSAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCi0gICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7Ci0gICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOwotICAgIH07Ci0KLSAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5Ci0gICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7Ci0gICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KLQotICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCi0gICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50Ci0KLSAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKLQorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTkxMWNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVnN5bmNUcmFja2VyOworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQ7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyMiA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOworCisgICAgbG9uZyBtQXBwVnN5bmNPZmZzZXQ7CisgICAgbG9uZyBtU2ZWc3luY09mZnNldDsKKyAgICBzcDxWc3luY1RyYWNrZXI+IG1Wc3luY1RyYWNrZXI7CisgICAgc3A8Q2hvcmVvZ3JhcGhlclRocmVhZD4gbUNob3Jlb2dyYXBoZXJUaHJlYWQ7CisgICAgTXV0ZXggbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZzeW5jKCkgPSAwOworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA1Y2M1MDkzLi5lOWJhYTFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00NiwxMiArNDYsMTMgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKK3R5cGVkZWYgaGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yIFRBbGxvY2F0b3I7Cit0eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBUTWVtb3J5OwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMTE3LDE1ICsxMTgsMTIgQEAKICAgICB2b2lkIHNpZ25hbE5ld1NhbXBsZUFlc0tleShjb25zdCBzcDxBTWVzc2FnZT4gJmtleUl0ZW0pOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICAgICAgdW5zaWduZWQgbVR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIG1QSUQ7Ci0gICAgICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgfTsKIAogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKKyAgICB1aW50MzJfdCBtUE1UVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtUE1UX0NSQzsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOwpAQCAtMTQyLDE1ICsxNDAsMTUgQEAKIH07CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpOworICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKTsKIAogICAgIHVuc2lnbmVkIHR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHVuc2lnbmVkIHR5cGVFeHQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZUV4dDsgfQogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CisgICAgdm9pZCBzZXRBdWRpb1ByZXNlbnRhdGlvbnMoQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIGF1ZGlvUHJlc2VudGF0aW9ucykgeworICAgICAgICBtQXVkaW9QcmVzZW50YXRpb25zID0gYXVkaW9QcmVzZW50YXRpb25zOworICAgIH0KIAogICAgIHZvaWQgc2V0Q2FzSW5mbygKICAgICAgICAgICAgIGludDMyX3Qgc3lzdGVtSWQsCkBAIC0xOTQsNiArMTkyLDcgQEAKICAgICBQcm9ncmFtICptUHJvZ3JhbTsKICAgICB1bnNpZ25lZCBtRWxlbWVudGFyeVBJRDsKICAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZUV4dDsKICAgICB1bnNpZ25lZCBtUENSX1BJRDsKICAgICBpbnQzMl90IG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyOwogCkBAIC0yMTAsMTMgKzIwOSwxMyBAQAogICAgIGJvb2wgbVNjcmFtYmxlZDsKICAgICBib29sIG1TYW1wbGVFbmNyeXB0ZWQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwotICAgIHNwPElNZW1vcnk+IG1NZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwotICAgIHNwPEhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRBbGxvY2F0b3I+IG1IaWRsQWxsb2NhdG9yOwogICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKIAogICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKICAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYwpAQCAtMjk5LDYgKzI5OCw4IEBACiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAorICAgICAgbVBNVFZlcnNpb24oMHhmZmZmZmZmZiksCisgICAgICBtUE1UX0NSQygweGZmZmZmZmZmKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFBUUygwKSwKICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKQEAgLTQ0Nyw3ICs0NDgsNyBAQAogICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBpbmZvTGVuZ3RoKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gOSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOwpAQCAtNDg2LDcgKzQ4NywxMyBAQAogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7Ci0gICAgTVlfTE9HVigiICB2ZXJzaW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoNSkpOworICAgIGJvb2wgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IGZhbHNlOworICAgIHVuc2lnbmVkIHBtdFZlcnNpb24gPSBici0+Z2V0Qml0cyg1KTsKKyAgICBpZiAocG10VmVyc2lvbiAhPSBtUE1UVmVyc2lvbikgeworICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbVBNVFZlcnNpb24gPSBwbXRWZXJzaW9uOworICAgIH0KKyAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBwbXRWZXJzaW9uKTsKICAgICBNWV9MT0dWKCIgIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKICAgICBNWV9MT0dWKCIgIHNlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CiAgICAgTVlfTE9HVigiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CkBAIC01MTMsNDMgKzUyMCwxNjYgQEAKICAgICAvLyBpbmZvQnl0ZXNSZW1haW5pbmcgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1ha2UgdXAgdGhlCiAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIHNlY3Rpb24gb2YgRVNfaW5mb3MuIEl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCiAgICAgLy8gZmluYWwgQ1JDLgotICAgIHNpemVfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKKyAgICBpbnQzMl90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCiAgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7Ci0KLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwotICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7Ci0KKyAgICAgICAgU3RyZWFtSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UeXBlID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBpbmZvLm1UeXBlKTsKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygzKSk7CiAKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKLSAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGVsZW1lbnRhcnlQSUQpOworICAgICAgICBpbmZvLm1QSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBpbmZvLm1QSUQpOwogCiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoNCkpOwogCiAgICAgICAgIHVuc2lnbmVkIEVTX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgICAgICBBTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7CisgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAKICAgICAgICAgQ0FEZXNjcmlwdG9yIHN0cmVhbUNBOwotICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmluZENBRGVzY3JpcHRvcihiciwgRVNfaW5mb19sZW5ndGgsICZzdHJlYW1DQSk7CisgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfUkVTRVJWRURfTUFYOworCisgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5jbGVhcigpOworICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChFU19pbmZvX2xlbmd0aCA+IDIgJiYgaW5mb0J5dGVzUmVtYWluaW5nID49IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnID0gMHglMDJ4IiwgZGVzY3JpcHRvcl90YWcpOworCisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIGxlbiA9ICV1IiwgZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSAyOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gRVNfaW5mb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aCAtPSA0OworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1Qcml2YXRlRGF0YS5hc3NpZ24oYnItPmRhdGEoKSwgYnItPmRhdGEoKSArIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5tVHlwZSA9PSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjVGFnRXh0ID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZ19leHQgPSAweCUwMngiLCBkZXNjVGFnRXh0KTsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aC0tOworICAgICAgICAgICAgICAgIC8vIFRoZSBBQzQgZGVzY3JpcHRvciBpcyB1c2VkIGluIHRoZSBQU0kgUE1UIHRvIGlkZW50aWZ5IHN0cmVhbXMgd2hpY2ggY2FycnkgQUM0CisgICAgICAgICAgICAgICAgLy8gYXVkaW8uCisgICAgICAgICAgICAgICAgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjVGFnRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTEwCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9wcmVzZWxlY3Rpb25zID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcHJlc2VsZWN0aW9uczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBici0+Z2V0Qml0cyg1KTsgIC8vIHByZXNlbGVjdGlvbl9pZAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpb19yZW5kZXJpbmdfaW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBzdGF0aWNfY2FzdDxNYXN0ZXJpbmdJbmRpY2F0aW9uPihici0+Z2V0Qml0cygzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAlZCIsIGludGVyYWN0aXZpdHlfZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFuZ3VhZ2VfY29kZV9wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXh0X2xhYmVsX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnV0dXJlX2V4dGVuc2lvbiA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZV9jb2RlX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAyNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxhbmd1YWdlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzBdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMV0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsyXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBTdHJpbmc4KGxhbmd1YWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXBzIHRoZSBwcmVzZW50YXRpb24gaWQgdG8gdGhlIG1lc3NhZ2UgaWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFWFRfREVTQ1JJUFRPUl9EVkJfTUVTU0FHRSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHByZXNlbnRhdGlvbiBsYWJlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xhYmVsX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lc3NhZ2VfaWQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBtZXNzYWdlX2lkID0gJXUiLCBtZXNzYWdlX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3N0cmVhbV9pbmZvX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hdXhfY29tcG9uZW50cyA9IGJyLT5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyg1KTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKG51bV9hdXhfY29tcG9uZW50cyAqIDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhudW1fYXV4X2NvbXBvbmVudHMgKiA4KTsgIC8vIGNvbXBvbmVudF90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdXR1cmVfZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoMyk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCk7ICAvLyBmdXR1cmVfZXh0ZW5zaW9uX2J5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChoYXNTdHJlYW1DQSAmJiAhbVBhcnNlci0+bUNhc01hbmFnZXItPmFkZFN0cmVhbSgKLSAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgZWxlbWVudGFyeVBJRCwgc3RyZWFtQ0EpKSB7CisgICAgICAgICAgICAgICAgbVByb2dyYW1OdW1iZXIsIGluZm8ubVBJRCwgc3RyZWFtQ0EpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9Ci0gICAgICAgIFN0cmVhbUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5tVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGluZm8ubVBJRCA9IGVsZW1lbnRhcnlQSUQ7Ci0gICAgICAgIGluZm8ubUNBU3lzdGVtSWQgPSBoYXNQcm9ncmFtQ0EgPyBwcm9ncmFtQ0EubVN5c3RlbUlEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID8gc3RyZWFtQ0EubVN5c3RlbUlEICA6IC0xOwotICAgICAgICBpbmZvcy5wdXNoKGluZm8pOworICAgICAgICBpZiAoaGFzUHJvZ3JhbUNBKSB7CisgICAgICAgICAgICBpbmZvLm1DQURlc2NyaXB0b3IgPSBwcm9ncmFtQ0E7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzU3RyZWFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHN0cmVhbUNBOworICAgICAgICB9CiAKLSAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgaW5mb3MucHVzaChpbmZvKTsKICAgICB9CiAKICAgICBpZiAoaW5mb0J5dGVzUmVtYWluaW5nICE9IDApIHsKICAgICAgICAgQUxPR1coIlNlY3Rpb24gZGF0YSByZW1haW5zIHVuY29uc3VtZWQiKTsKICAgICB9Ci0gICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworICAgIHVuc2lnbmVkIGNyYyA9IGJyLT5nZXRCaXRzKDMyKTsKKyAgICBpZiAoY3JjICE9IG1QTVRfQ1JDKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UX0NSQyA9IGNyYzsKKyAgICB9CisgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBjcmMpOwogCiAgICAgYm9vbCBQSURzQ2hhbmdlZCA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKQEAgLTYwMSwxNiArNzMxLDE5IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGluZm8ubVBJRCk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIFBDUl9QSUQsIGluZm8ubUNBU3lzdGVtSWQpOworICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXMsIFBDUl9QSUQsIGluZm8pOwogCiAgICAgICAgICAgICBpZiAobVNhbXBsZUFlc0tleUl0ZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHN0cmVhbS0+c2lnbmFsTmV3U2FtcGxlQWVzS2V5KG1TYW1wbGVBZXNLZXlJdGVtKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FTeXN0ZW1JZCA+PSAwOworICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FEZXNjcmlwdG9yLm1TeXN0ZW1JRCA+PSAwOwogICAgICAgICAgICAgbVN0cmVhbXMuYWRkKGluZm8ubVBJRCwgc3RyZWFtKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbmRleCA+PSAwICYmIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+aXNBdWRpbygpCisgICAgICAgICAgICAgICAgICYmIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+c2V0QXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0pIHsKQEAgLTcxNywzNCArODUwLDMzIEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAKIEFUU1BhcnNlcjo6U3RyZWFtOjpTdHJlYW0oCi0gICAgICAgIFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKQorICAgICAgICBQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKQogICAgIDogbVByb2dyYW0ocHJvZ3JhbSksCi0gICAgICBtRWxlbWVudGFyeVBJRChlbGVtZW50YXJ5UElEKSwKLSAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAorICAgICAgbUVsZW1lbnRhcnlQSUQoaW5mby5tUElEKSwKKyAgICAgIG1TdHJlYW1UeXBlKGluZm8ubVR5cGUpLAorICAgICAgbVN0cmVhbVR5cGVFeHQoaW5mby5tVHlwZUV4dCksCiAgICAgICBtUENSX1BJRChQQ1JfUElEKSwKICAgICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyKC0xKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCiAgICAgICBtRU9TUmVhY2hlZChmYWxzZSksCiAgICAgICBtUHJldlBUUygwKSwKICAgICAgIG1RdWV1ZShOVUxMKSwKLSAgICAgIG1TY3JhbWJsZWQoQ0Ffc3lzdGVtX0lEID49IDApIHsKLQorICAgICAgbVNjcmFtYmxlZChpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDApLAorICAgICAgbUF1ZGlvUHJlc2VudGF0aW9ucyhpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMpIHsKICAgICBtU2FtcGxlRW5jcnlwdGVkID0KICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRCAgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDsKIAogICAgIEFMT0dWKCJuZXcgc3RyZWFtIFBJRCAweCUwMngsIHR5cGUgMHglMDJ4LCBzY3JhbWJsZWQgJWQsIFNhbXBsZUVuY3J5cHRlZDogJWQiLAotICAgICAgICAgICAgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CisgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIG1TY3JhbWJsZWQsIG1TYW1wbGVFbmNyeXB0ZWQpOwogCi0gICAgdWludDMyX3QgZmxhZ3MgPQotICAgICAgICAgICAgKGlzVmlkZW8oKSAmJiBtU2NyYW1ibGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YSA6Ci0gICAgICAgICAgICAobVNhbXBsZUVuY3J5cHRlZCkgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGEgOgotICAgICAgICAgICAgMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKCgoaXNWaWRlbygpIHx8IGlzQXVkaW8oKSkgJiYgbVNjcmFtYmxlZCkpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NjcmFtYmxlZERhdGE7CisgICAgfSBlbHNlIGlmIChtU2FtcGxlRW5jcnlwdGVkKSB7CisgICAgICAgIGZsYWdzID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TYW1wbGVFbmNyeXB0ZWREYXRhOworICAgIH0KIAogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TW9kZSBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpJTlZBTElEOwogCkBAIC03ODEsMTMgKzkxMywyMyBAQAogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpFQUMzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1FVEFEQVRBOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzdHJlYW0gUElEIDB4JTAyeCBoYXMgaW52YWxpZCBzdHJlYW0gdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tUElELCBpbmZvLm1UeXBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTgwNyw3ICs5NDksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaXNBdWRpbygpID8gTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCk7CiAgICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIENBX3N5c3RlbV9JRCk7CisgICAgICAgICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBpbmZvLm1DQURlc2NyaXB0b3I7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgZGVzY3JpcHRvci5tU3lzdGVtSUQpOworCisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLnNpemUoKSk7CisKICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgyNywxNiArOTc1LDQzIEBACiAgICAgICAgICAgICBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+Y2FwYWNpdHkoKSwgbmVlZGVkU2l6ZSwgbVNjcmFtYmxlZCk7CiAKICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIsIG5ld1NjcmFtYmxlZEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBuZXdNZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBuZXdEZWFsZXI7CisgICAgc3A8VE1lbW9yeT4gbmV3TWVtOwogICAgIGlmIChtU2NyYW1ibGVkKSB7Ci0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgKGFsaWdubWVudCAtIDEpKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCi0gICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKLSAgICAgICAgbmV3RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZWVkZWRTaXplLCAiQVRTUGFyc2VyIik7Ci0gICAgICAgIG5ld01lbSA9IG5ld0RlYWxlci0+YWxsb2NhdGUobmVlZGVkU2l6ZSk7Ci0gICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+cG9pbnRlcigpLCBuZXdNZW0tPnNpemUoKSk7CisgICAgICAgIGlmIChtSGlkbEFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtSGlkbEFsbG9jYXRvciA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgICAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gY2FuJ3QgZ2V0IGhpZGwgYWxsb2NhdG9yIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfbWVtb3J5IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gbUhpZGxBbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG5lZWRlZFNpemUsCisgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIGF0IHRoZSB0cmFuc3BvcnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5ld01lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOworICAgICAgICBpZiAobmV3TWVtID09IG51bGxwdHIgfHwgbmV3TWVtLT5nZXRQb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgZmFpbGVkIHRvIG1hcCBtZW1vcnkiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdNZW0tPmdldFBvaW50ZXIoKSwgbmV3TWVtLT5nZXRTaXplKCkpOwogCiAgICAgICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbWVtY3B5KG5ld1NjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLApAQCAtODQ1LDI0ICsxMDIwLDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICB9Ci0gICAgICAgIG1NZW0gPSBuZXdNZW07Ci0gICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CisgICAgICAgIG1IaWRsTWVtb3J5ID0gbmV3TWVtOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CiAKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9IDBVTEw7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gICh1aW50NjRfdCluZWVkZWRTaXplOwogCi0gICAgICAgIG1IaWRsTWVtb3J5ID0gZnJvbUhlYXAoaGVhcCk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKLQotICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIG9mZnNldCAlemQsIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG5lZWRlZFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTk4Niw5ICsxMTUyLDEyIEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9FQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRDoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM0Nyw3ICsxNTE2LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1NZW0gPT0gTlVMTCkgeworICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgPT0gTlVMTCB8fCBtSGlkbE1lbW9yeSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBzY3JhbWJsZWQgcGFja2V0cyB3aXRob3V0IHNoYXJlZCBtZW1vcnkhIik7CiAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xMzk1LDcgKzE1NjQsNyBAQAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKLSAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOworICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOwogICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CkBAIC0xNDEyLDEwICsxNTgxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7Ci0gICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHBlc09mZnNldDsKICAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKQEAgLTE0MzEsOSArMTU5OSw5IEBACiAgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKnNyY09mZnNldCovLAogICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKmRzdE9mZnNldCovLAogICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKQEAgLTE0NTAsOSArMTYxOCwyMSBAQAogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwotICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKKworICAgICAgICAvLyBTZXQgZGVzY3JhbWJsZUJ5dGVzIHRvIHRoZSByZXR1cm5lZCByZXN1bHQuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgICAgICAgIC8vIChlZy4gd2hlbiB3ZSdyZSBkZXNjcmFtYmxpbmcgdGhlIFBFUyBoZWFkZXIgcG9ydGlvbiBvZiBhIHNlY3VyZSBzdHJlYW0sCisgICAgICAgIC8vIHRoZSBwbHVnaW4gbWlnaHQgY3V0IGl0IG9mZiByaWdodCBhZnRlciB0aGUgUEVTIGhlYWRlci4pCisgICAgICAgIGRlc2NyYW1ibGVCeXRlcyA9IGJ5dGVzV3JpdHRlbjsKICAgICB9CiAKKyAgICAvLyB8YnVmZmVyfCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHdlJ2QgcGFyc2UgdGhlIFBFUyBoZWFkZXIuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBzY3JhbWJsZWQsIGl0IHBvaW50cyB0byBtRGVzY3JhbWJsZWRCdWZmZXIKKyAgICAvLyAodW5sZXNzIGFsbCBwYWNrZXRzIGluIHRoaXMgUEVTIGFyZSBhY3R1YWxseSBjbGVhciwgaW4gd2hpY2ggY2FzZSwKKyAgICAvLyBpdCBwb2ludHMgdG8gbUJ1ZmZlciBzaW5jZSB3ZSBuZXZlciBjb3BpZWQgaW50byBtRGVzY3JhbWJsZWRCdWZmZXIpLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgY2xlYXIsIGl0IHBvaW50cyB0byBtQnVmZmVyLCBhbmQgd2UnbGwKKyAgICAvLyBjb3B5IGFsbCBkZXNjcmFtYmxlZCBkYXRhIGJhY2sgdG8gbUJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQnVmZmVyOwogICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKICAgICAgICAgLy8gUXVldWUgc3ViU2FtcGxlIGluZm8gZm9yIHNjcmFtYmxlZCBxdWV1ZQogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzQnVmZmVyID0gbmV3IEFCdWZmZXIobVN1YlNhbXBsZXMuc2l6ZSgpICogNCk7CkBAIC0xNDY0LDggKzE2NDQsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmICgoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB8fCBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjbGVhclNpemVQdHJbaV0gPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgICAgICBlbmNTaXplUHRyW2ldID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDc0LDE0ICsxNjUzLDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpc1N5bmMgfD0gaXQtPnJhbmRvbV9hY2Nlc3NfaW5kaWNhdG9yOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKKyAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKKyAgICAgICAgICAgIGNsZWFyU2l6ZVB0clswXSA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIGVuY1NpemVQdHJbMF0gLT0gcGVzT2Zmc2V0OworICAgICAgICB9CiAgICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIFRTIHN1YnNhbXBsZSBzaXplIG5vdy4gVGhlIFBFUyBoZWFkZXIgYWRqdXN0CiAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBzY3JhbWJsZWQgQVUgaXMgZGVxdWV1ZWQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiBkZXNjcmFtYmxlQnl0ZXMgaXMgMCwgaXQgbWVhbnMgdGhpcyBQRVMgY29udGFpbnMgb25seQorICAgICAgICAvLyBhbGwgdHMgcGFja2V0cywgbGVhZGluZ0NsZWFyQnl0ZXMgaXMgZW50aXJlIGJ1ZmZlciBzaXplLgogICAgICAgICBtUXVldWUtPmFwcGVuZFNjcmFtYmxlZERhdGEoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksIHNjdHJsLAotICAgICAgICAgICAgICAgIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSA/IGRlc2NyYW1ibGVCeXRlcyA6IG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzY3RybCwgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFCaXRSZWFkZXIgYnIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIsIGV2ZW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1NjUsNiArMTc1OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+Y29udmVydEF1ZGlvUHJlc2VudGF0aW9uSW5mb1RvTWV0YWRhdGEobUF1ZGlvUHJlc2VudGF0aW9ucyk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9uUGF5bG9hZERhdGE6IGNyZWF0ZWQgQW5vdGhlclBhY2tldFNvdXJjZSBQSUQgMHglMDh4IG9mIHR5cGUgMHglMDJ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBtU3RyZWFtVHlwZSk7CiAgICAgICAgICAgICB9CkBAIC0xNTc3LDYgKzE3NzIsNyBAQAogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIG1Tb3VyY2UtPmNvbnZlcnRBdWRpb1ByZXNlbnRhdGlvbkluZm9Ub01ldGFkYXRhKG1BdWRpb1ByZXNlbnRhdGlvbnMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRXZlcnkgYWNjZXNzIHVuaXQgaGFzIGEgcGVzU3RhcnRPZmZzZXQgcXVldWVkIGluIHxtUGVzU3RhcnRPZmZzZXRzfC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDQ1Y2EwNmIuLjBmZjJkN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMTQyLDYgKzE0Myw3IEBACiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfVklERU8gICAgICAgICAgPSAweDAyLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcxX0FVRElPICAgICAgICAgID0gMHgwMywKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJTyAgICAgICAgICA9IDB4MDQsCisgICAgICAgIFNUUkVBTVRZUEVfUEVTX1BSSVZBVEVfREFUQSAgICAgPSAweDA2LAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFMgICAgID0gMHgwZiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHNF9WSURFTyAgICAgICAgICA9IDB4MTAsCiAgICAgICAgIFNUUkVBTVRZUEVfTUVUQURBVEEgICAgICAgICAgICAgPSAweDE1LApAQCAtMTUzLDYgKzE1NSw3IEBACiAgICAgICAgIC8vIFN0cmVhbSB0eXBlIDB4ODMgaXMgbm9uLXN0YW5kYXJkLAogICAgICAgICAvLyBpdCBjb3VsZCBiZSBMUENNIG9yIFRydWVIRCBBQzMKICAgICAgICAgU1RSRUFNVFlQRV9MUENNX0FDMyAgICAgICAgICAgICA9IDB4ODMsCisgICAgICAgIFNUUkVBTVRZUEVfRUFDMyAgICAgICAgICAgICAgICAgPSAweDg3LAogCiAgICAgICAgIC8vU2FtcGxlIEVuY3J5cHRlZCB0eXBlcwogICAgICAgICBTVFJFQU1UWVBFX0gyNjRfRU5DUllQVEVEICAgICAgID0gMHhEQiwKQEAgLTE2MCw2ICsxNjMsMjEgQEAKICAgICAgICAgU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEICAgICAgICA9IDB4QzEsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICAvLyBGcm9tIElTTy9JRUMgMTM4MTgtMTogMjAwNyAoRSksIFRhYmxlIDItNDUKKyAgICAgICAgREVTQ1JJUFRPUl9DQSAgICAgICAgICAgICAgICAgICA9IDB4MDksCisKKyAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTIKKyAgICAgICAgREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICAgICAgICA9IDB4N0YsCisgICAgfTsKKworICAgIC8vIERWQiBCbHVlQm9vayBBMDM4IFRhYmxlIDEwOQorICAgIGVudW0geworICAgICAgICBFWFRfREVTQ1JJUFRPUl9EVkJfQUM0ICAgICAgICAgICAgICAgICAgPSAweDE1LAorICAgICAgICBFWFRfREVTQ1JJUFRPUl9EVkJfQVVESU9fUFJFU0VMRUNUSU9OICAgPSAweDE5LAorICAgICAgICBFWFRfREVTQ1JJUFRPUl9EVkJfUkVTRVJWRURfTUFYICAgICAgICAgPSAweDdGLAorICAgIH07CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BVFNQYXJzZXIoKTsKIApAQCAtMTY5LDExICsxODcsMjAgQEAKICAgICBzdHJ1Y3QgUFNJU2VjdGlvbjsKICAgICBzdHJ1Y3QgQ2FzTWFuYWdlcjsKICAgICBzdHJ1Y3QgQ0FEZXNjcmlwdG9yIHsKLSAgICAgICAgaW50MzJfdCBtU3lzdGVtSUQ7CisgICAgICAgIENBRGVzY3JpcHRvcigpIDogbVBJRCgwKSwgbVN5c3RlbUlEKC0xKSB7fQogICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVByaXZhdGVEYXRhOwogICAgIH07CiAKKyAgICBzdHJ1Y3QgU3RyZWFtSW5mbyB7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlOworICAgICAgICB1bnNpZ25lZCBtVHlwZUV4dDsKKyAgICAgICAgdW5zaWduZWQgbVBJRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yIG1DQURlc2NyaXB0b3I7CisgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiBtQXVkaW9QcmVzZW50YXRpb25zOworICAgIH07CisKICAgICBzcDxDYXNNYW5hZ2VyPiBtQ2FzTWFuYWdlcjsKIAogICAgIHVpbnQzMl90IG1GbGFnczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAppbmRleCBmOWRjYmM5Li5hNTA3YjkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCkBAIC0zMCw5ICszMCwxNCBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAppbmRleCBlY2UwNjkyLi5lMmM1MDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTIyNiw2ICsyMjYsNyBAQAogICAgICAgICBpbnQzMl90IGNyeXB0b01vZGU7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9Nb2RlIiwgJmNyeXB0b01vZGUpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGNyeXB0b0tleTsKKyAgICAgICAgICAgIGludDMyX3QgcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJCeXRlc0J1ZmZlciwgZW5jQnl0ZXNCdWZmZXI7CiAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b0tleSIsICZjcnlwdG9LZXkpKTsKQEAgLTIzMyw2ICsyMzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjbGVhckJ5dGVzQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImVuY0J5dGVzIiwgJmVuY0J5dGVzQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAmJiBlbmNCeXRlc0J1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInBlc09mZnNldCIsICZwZXNPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICYmIChwZXNPZmZzZXQgPj0gMCkgJiYgKHBlc09mZnNldCA8IDY1NTM2KSk7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGNyeXB0b01vZGUpOwogCkBAIC0yNDAsNiArMjQzLDExIEBACiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBhcnJheVswXSA9ICh1aW50OF90KSAoY3J5cHRvS2V5ICYgMHhmZik7CisgICAgICAgICAgICAvLyBhcnJheVsxXSBjb250YWlucyBQRVMgaGVhZGVyIGZsYWcsIHdoaWNoIHdlIGRvbid0IHVzZS4KKyAgICAgICAgICAgIC8vIGFycmF5WzJ+M10gY29udGFpbiB0aGUgUEVTIG9mZnNldC4KKyAgICAgICAgICAgIGFycmF5WzJdID0gKHVpbnQ4X3QpIChwZXNPZmZzZXQgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5WzNdID0gKHVpbnQ4X3QpICgocGVzT2Zmc2V0ID4+IDgpICYgMHhmZik7CisKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCkBAIC02ODksNCArNjk3LDIzIEBACiAgICAgcmV0dXJuIGZpcnN0TWV0YTsKIH0KIAordm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpjb252ZXJ0QXVkaW9QcmVzZW50YXRpb25JbmZvVG9NZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uJiBwcmVzZW50YXRpb25zKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXQoKTsKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAvLyBDbGVhciBhdWRpbyBwcmVzZW50YXRpb24gaW5mbyBpbiBtZXRhZGF0YS4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbWV0YS0+cmVtb3ZlKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRTdHJlYW0oc3RkOjppb3M6Om91dCk7CisgICAgICAgIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhwcmVzZW50YXRpb25zLCAmb3V0U3RyZWFtKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgICAgICAgICAgICAgIG91dFN0cmVhbS5zdHIoKS5kYXRhKCksIG91dFN0cmVhbS5zdHIoKS5zaXplKCkpOworICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKaW5kZXggZjRhNmFjYi4uNTdhNmMzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKQEAgLTg1LDYgKzg1LDggQEAKICAgICB2b2lkIHRyaW1CdWZmZXJzQWZ0ZXJNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSk7CiAgICAgc3A8QU1lc3NhZ2U+IHRyaW1CdWZmZXJzQmVmb3JlTWV0YShjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOwogCisgICAgdm9pZCBjb252ZXJ0QXVkaW9QcmVzZW50YXRpb25JbmZvVG9NZXRhZGF0YShjb25zdCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gJnByZXNlbnRhdGlvbnMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QW5vdGhlclBhY2tldFNvdXJjZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCAwZmE5ZmNiLi5mYjhiOWZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTg2LDYgKzg2LDIxIEBACiAgICAgbUNhc1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAorc3RhdGljIGludDMyX3QgcmVhZFZhcmlhYmxlQml0cyhBQml0UmVhZGVyICZiaXRzLCBpbnQzMl90IG5iaXRzKSB7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaW50MzJfdCBtb3JlX2JpdHMgPSAxOworCisgICAgd2hpbGUgKG1vcmVfYml0cykgeworICAgICAgICB2YWx1ZSArPSBiaXRzLmdldEJpdHMobmJpdHMpOworICAgICAgICBtb3JlX2JpdHMgPSBiaXRzLmdldEJpdHMoMSk7CisgICAgICAgIGlmICghbW9yZV9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIHZhbHVlIDw8PSBuYml0czsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCiAvLyBQYXJzZSBBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCiAvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKIHN0YXRpYyB1bnNpZ25lZCBwYXJzZUFDM1N5bmNGcmFtZSgKQEAgLTE5NSw4ICsyMTAsMTUzIEBACiAgICAgcmV0dXJuIHBheWxvYWRTaXplOwogfQogCi1zdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCBOVUxMKSA+IDA7CisvLyBQYXJzZSBFQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLAorLy8gdXBkYXRlIG1ldGFkYXRhIG9ubHkgYXBwbGljYWJsZSwgYW5kIHJldHVybiB0aGUgcGF5bG9hZCBzaXplCisvLyBBVFNDIEEvNTI6MjAxMiBFMi4zLjEKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZUVBQzNTeW5jRnJhbWUoCisgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZTJbXSA9IHsyNDAwMCwgMjIwNTAsIDE2MDAwfTsKKworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJpdHMuZ2V0Qml0cygxNikgIT0gMHgwQjc3KSB7CisgICAgICAgIEFMT0dFKCJObyB2YWxpZCBzeW5jIHdvcmQgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgcGFyc2UgdXAgdG8gYnNpZCBzbyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCB0aGF0IG1hbnkgYml0cworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyICsgMyArIDExICsgMiArIDIgKyAzICsgMSArIDUpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYml0cyBsZWZ0IGZvciBmdXJ0aGVyIHBhcnNpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5zaWduZWQgc3RybXR5cCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAoc3RybXR5cCA9PSAzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvcnJlY3Qgc3RybXR5cCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdWJzdHJlYW1pZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAvLyBvbmx5IHRoZSBmaXJzdCBpbmRlcGVuZGVudCBzdHJlYW0gaXMgc3VwcG9ydGVkCisgICAgaWYgKChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSAmJiBzdWJzdHJlYW1pZCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGZybXNpeiA9IGJpdHMuZ2V0Qml0cygxMSk7CisgICAgdW5zaWduZWQgZnNjb2QgPSBiaXRzLmdldEJpdHMoMik7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ1JhdGUgPSAwOworICAgIGlmIChmc2NvZCA9PSAweDMpIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QyID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QyID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgZnNjb2QyIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZTJbZnNjb2QyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIHVuc2lnbmVkIG51bWJsa3Njb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgfQorCisgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgbGZlb24gPSBiaXRzLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgYnNpZCA9IGJpdHMuZ2V0Qml0cyg1KTsKKyAgICBpZiAoYnNpZCA8IDExIHx8IGJzaWQgPiAxNikgeworICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gRUFDMyBoZWFkZXIuIENvdWxkIGJlIEFDLTMgb3Igc29tZSB1bmtub3duIEVBQzMgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IGluZGVwZW5kYW50IHN0cmVhbQorICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMICYmIChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoIkVBQzMgY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HVigiRUFDMyBzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gZnJtc2l6ICsgMTsKKyAgICBwYXlsb2FkU2l6ZSA8PD0gMTsgIC8vIGNvbnZlcnQgZnJvbSAxNi1iaXQgd29yZHMgdG8gYnl0ZXMKKworICAgIHJldHVybiBwYXlsb2FkU2l6ZTsKK30KKworLy8gUGFyc2UgQUM0IGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lCisvLyBhbmQgdXBkYXRlIGZyYW1lU2l6ZSBhbmQgbWV0YWRhdGEuCitzdGF0aWMgc3RhdHVzX3QgcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkICZmcmFtZVNpemUsIHNwPE1ldGFEYXRhPiAqbWV0YURhdGEpIHsKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpLCBBbm5leCBDCisgICAgLy8gVGhlIHN5bmNfd29yZCBjYW4gYmUgZWl0aGVyIDB4QUM0MCBvciAweEFDNDEuCisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQwID0gMHhBQzQwOworICAgIHN0YXRpYyBjb25zdCBpbnQga1N5bmNXb3JkQUM0MSA9IDB4QUM0MTsKKworICAgIHNpemVfdCBoZWFkZXJTaXplID0gMDsKKyAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKKyAgICBpbnQzMl90IHN5bmNXb3JkID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBpZiAoKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDApICYmIChzeW5jV29yZCAhPSBrU3luY1dvcmRBQzQxKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzeW5jd29yZCBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGhlYWRlclNpemUgKz0gMjsKKworICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygxNik7CisgICAgaGVhZGVyU2l6ZSArPSAyOworICAgIGlmIChmcmFtZVNpemUgPT0gMHhGRkZGKSB7CisgICAgICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygyNCk7CisgICAgICAgIGhlYWRlclNpemUgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgc2l6ZSBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGZyYW1lU2l6ZSArPSBoZWFkZXJTaXplOworICAgIC8vIElmIHRoZSBzeW5jX3dvcmQgaXMgMHhBQzQxLCBhIGNyY193b3JkIGlzIGFsc28gdHJhbnNtaXR0ZWQuCisgICAgaWYgKHN5bmNXb3JkID09IGtTeW5jV29yZEFDNDEpIHsKKyAgICAgICAgZnJhbWVTaXplICs9IDI7IC8vIGNyY193b3JkCisgICAgfQorICAgIEFMT0dWKCJBQzQgZnJhbWVTaXplID0gJXUiLCBmcmFtZVNpemUpOworCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xIDYuMi4xLjEKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1WZXJzaW9uID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChiaXRzdHJlYW1WZXJzaW9uID09IDMpIHsKKyAgICAgICAgYml0c3RyZWFtVmVyc2lvbiArPSByZWFkVmFyaWFibGVCaXRzKGJpdHMsIDIpOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoMTApOyAvLyBTZXF1ZW5jZSBDb3VudGVyCisKKyAgICB1aW50MzJfdCBiV2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICBpZiAoYldhaXRGcmFtZXMpIHsKKyAgICAgICAgdWludDMyX3Qgd2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAgICAgaWYgKHdhaXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBicl9jb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwIFYxLjEuMSBUYWJsZSA4MgorICAgIGJvb2wgZnNJbmRleCA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBmc0luZGV4ID8gNDgwMDAgOiA0NDEwMDsKKworICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEFDNCBTZXR0aW5nIG1Gb3JtYXQiKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgLy8gW0ZJWE1FXSBBQzQgY2hhbm5lbCBjb3VudCBpcyBkZWZpbmVkIHBlciBwcmVzZW50YXRpb24uIFByb3ZpZGUgYSBkZWZhdWx0IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gYXMgc3RlcmVvIGZvciB0aGUgZW50aXJlIHN0cmVhbS4KKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0YXR1c190IElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSkgeworICAgIHJldHVybiBwYXJzZUFDNFN5bmNGcmFtZShwdHIsIHNpemUsIGZyYW1lU2l6ZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBRFRTSGVhZGVyKApAQCAtMjc5LDcgKzQzOSw4IEBACiAgICAgICAgIEFMT0dFKCJhcHBlbmRpbmcgZGF0YSBhZnRlciBFT1MiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgeworCisgICAgaWYgKCFpc1NjcmFtYmxlZCgpICYmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKICAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKQEAgLTM5MCwxMiArNTUxLDE5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgQUMzOgorICAgICAgICAgICAgY2FzZSBFQUMzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDM0hlYWRlcigmcHRyW2ldLCBzaXplIC0gaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZSgmcHRyW2ldLCBzaXplIC0gaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQwNiw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiAoRSlBQzMgc3luY3dvcmQgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC00MTYsNiArNTg0LDQzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcmFtZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoJnB0cltpXSwgc2l6ZSAtIGksIGZyYW1lU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDNCBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplICE9IHNpemUgLSBzdGFydE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQUM0IGZyYW1lIHNpemUgaXMgJXUgYnl0ZXMsIHdoaWxlIHRoZSBidWZmZXIgc2l6ZSBpcyAlemQgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBzaXplIC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1QRUdfQVVESU86CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwpAQCAtNDk0LDYgKzY5OSw3IEBACiAKIHZvaWQgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjphcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgc3A8QUJ1ZmZlcj4gZW5jU2l6ZXMpIHsKICAgICBpZiAoIWlzU2NyYW1ibGVkKCkpIHsKQEAgLTUyMSw2ICs3MjcsNyBAQAogCiAgICAgU2NyYW1ibGVkUmFuZ2VJbmZvIHNjcmFtYmxlZEluZm87CiAgICAgc2NyYW1ibGVkSW5mby5tTGVuZ3RoID0gc2l6ZTsKKyAgICBzY3JhbWJsZWRJbmZvLm1MZWFkaW5nQ2xlYXJCeXRlcyA9IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHNjcmFtYmxlZEluZm8ubUtleUlkID0ga2V5SWQ7CiAgICAgc2NyYW1ibGVkSW5mby5tSXNTeW5jID0gaXNTeW5jOwogICAgIHNjcmFtYmxlZEluZm8ubUNsZWFyU2l6ZXMgPSBjbGVhclNpemVzOwpAQCAtNTMzLDcgKzc0MCw2IEBACiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKSB7CiAgICAgc2l6ZV90IG5leHRTY2FuID0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIGludDMyX3QgcGVzT2Zmc2V0ID0gMCwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPSAwOwogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4sICZwZXNPZmZzZXQsICZwZXNTY3JhbWJsaW5nQ29udHJvbCk7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewpAQCAtNTQ0LDYgKzc1MCw3IEBACiAgICAgLy8gcmV0dXJuIHNjcmFtYmxlZCB1bml0CiAgICAgaW50MzJfdCBrZXlJZCA9IHBlc1NjcmFtYmxpbmdDb250cm9sLCBpc1N5bmMgPSAwLCBzY3JhbWJsZWRMZW5ndGggPSAwOwogICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIGVuY1NpemVzOworICAgIHNpemVfdCBsZWFkaW5nQ2xlYXJCeXRlczsKICAgICB3aGlsZSAobVNjcmFtYmxlZFJhbmdlSW5mb3Muc2l6ZSgpID4gbVJhbmdlSW5mb3Muc2l6ZSgpKSB7CiAgICAgICAgIGF1dG8gaXQgPSBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5iZWdpbigpOwogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZmV0Y2hpbmcgc2NyYW1ibGVkIHJhbmdlOiBzaXplPSV6dSIsIG1Nb2RlLCBpdC0+bUxlbmd0aCk7CkBAIC01NjEsNiArNzY4LDcgQEAKICAgICAgICAgY2xlYXJTaXplcyA9IGl0LT5tQ2xlYXJTaXplczsKICAgICAgICAgZW5jU2l6ZXMgPSBpdC0+bUVuY1NpemVzOwogICAgICAgICBpc1N5bmMgPSBpdC0+bUlzU3luYzsKKyAgICAgICAgbGVhZGluZ0NsZWFyQnl0ZXMgPSBpdC0+bUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5lcmFzZShpdCk7CiAgICAgfQogICAgIGlmIChzY3JhbWJsZWRMZW5ndGggPT0gMCkgewpAQCAtNTY4LDI2ICs3NzYsNzQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gc2tpcCB0aGUgUEVTIGhlYWRlciwgYW5kIGNvcHkgdGhlIHJlc3QgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKLSAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAotICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgcGVzT2Zmc2V0LAotICAgICAgICAgICAgc2NyYW1ibGVkTGVuZ3RoIC0gcGVzT2Zmc2V0KTsKLQotICAgIC8vIGZpeCB1cCBmaXJzdCBzYW1wbGUgc2l6ZSBhZnRlciBza2lwcGluZyB0aGUgUEVTIGhlYWRlcgotICAgIGlmIChwZXNPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0Q2xlYXJTaXplID0gKihpbnQzMl90KiljbGVhclNpemVzLT5kYXRhKCk7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0RW5jU2l6ZSA9ICooaW50MzJfdCopZW5jU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgLy8gQ3V0IGF3YXkgdGhlIFBFUyBoZWFkZXIKLSAgICAgICAgaWYgKGZpcnN0Q2xlYXJTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgVFMtbGV2ZWwgc2NyYW1ibGluZywgd2UgZGVzY3JhbWJsZWQgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAob3IgaXQgd2FzIGNsZWFyIHRvIGJlZ2luIHdpdGgpCi0gICAgICAgICAgICBmaXJzdENsZWFyU2l6ZSAtPSBwZXNPZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbmNTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBiZSBQRVMtbGV2ZWwgc2NyYW1ibGluZwotICAgICAgICAgICAgZmlyc3RFbmNTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluZm8sIGFuZCB1c2UgaXQgdG8gc2V0IHRoZSBjbGVhcgorICAgIC8vIHJhbmdlIG9uIG1CdWZmZXIuIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBjbGVhciBieXRlcyBpbmNsdWRlcyB0aGUKKyAgICAvLyBQRVMgaGVhZGVyIHBvcnRpb24sIHdoaWxlIG1CdWZmZXIgZG9lc24ndC4KKyAgICBpZiAoKGludDMyX3QpbGVhZGluZ0NsZWFyQnl0ZXMgPiBwZXNPZmZzZXQpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbGVhZGluZ0NsZWFyQnl0ZXMgLSBwZXNPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KIAorICAgIC8vIFRyeSB0byBwYXJzZSBmb3JtYXRzLCBhbmQgaWYgdW5hdmFpbGFibGUgc2V0IHVwIGEgZHVtbXkgZm9ybWF0LgorICAgIC8vIE9ubHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBzY3JhbWJsZWQgY29udGVudCBmb3Igbm93LgorICAgIC8vICh3aWxsIGJlIGV4cGFuZGVkIGxhdGVyKS4KKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBBQUMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qcHJvZmlsZSovLCA3IC8qc2FtcGxpbmdfZnJlcV9pbmRleCovLCAxIC8qY2hhbm5lbF9jb25maWcqLyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlIGZvciBzY3JhbWJsZWQgY29udGVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgMCwgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIC8vIGNvcHkgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKKyAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBzY3JhbWJsZWRMZW5ndGgpOworCiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBpZiAoaXNTeW5jKSB7CiAgICAgICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwpAQCAtNjAwLDYgKzg1Niw3IEBACiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3J5cHRvS2V5Iiwga2V5SWQpOwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJjbGVhckJ5dGVzIiwgY2xlYXJTaXplcyk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImVuY0J5dGVzIiwgZW5jU2l6ZXMpOworICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInBlc09mZnNldCIsIHBlc09mZnNldCk7CiAKICAgICBtZW1tb3ZlKG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSArIHNjcmFtYmxlZExlbmd0aCwKQEAgLTYxNCw3ICs4NzEsMTEgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKLSAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0ICYmICFpc1NjcmFtYmxlZCgpKSB7CisgICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7CisgICAgfQorCisgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ19BbGlnbmVkRGF0YSkgJiYgbU1vZGUgPT0gSDI2NCkgewogICAgICAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTY0OCw3ICs5MDksMTAgQEAKICAgICAgICAgY2FzZSBBQUM6CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKICAgICAgICAgY2FzZSBBQzM6Ci0gICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKTsKKyAgICAgICAgY2FzZSBFQUMzOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgICAgICBjYXNlIEFDNDoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDNCgpOwogICAgICAgICBjYXNlIE1QRUdfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKICAgICAgICAgY2FzZSBNUEVHNF9WSURFTzoKQEAgLTY2NiwzNCArOTMwLDM4IEBACiAgICAgfQogfQogCi1zcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUMzKCkgeworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEVBQzMoKSB7CiAgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsgIC8vIGluIGJ5dGVzCiAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CiAKLSAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAotICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3M7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgJmZvcm1hdCk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUVBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKICAgICAgICAgICAgICAgICBtQVVJbmRleCwgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CiAKICAgICAgICAgKytzeW5jU3RhcnRQb3M7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBBQzMiKTsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEUvQUMzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzAxLDcgKzk2OSw2IEBACiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0KICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CiAgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKQEAgLTcxMCw3ICs5NzcsMTIgQEAKIAogICAgIC8vIE5vdCBkZWNyeXB0aW5nIGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgaWYgKG1TYW1wbGVEZWNyeXB0b3IgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIEFVIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBtQVVJbmRleCsrOwogCkBAIC03MzAsNiArMTAwMiw2OSBAQAogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUM0KCkgeworICAgIHVuc2lnbmVkIHN5bmNTdGFydFBvcyA9IDA7CisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICAvLyBBIHZhbGlkIEFDNCBzdHJlYW0gc2hvdWxkIGhhdmUgbWluaW11bSBvZiA3IGJ5dGVzIGluIGl0cyBidWZmZXIuCisgICAgLy8gKFN5bmMgaGVhZGVyIDQgYnl0ZXMgKyBBQzQgdG9jIDMgYnl0ZXMpCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKHN5bmNTdGFydFBvcyArIDIgPj0gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcnNlQUM0U3luY0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzRbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKworICAgICAgICArK3N5bmNTdGFydFBvczsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtQVVJbmRleCsrOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisKKyAgICBtZW1tb3ZlKAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUsCisgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpIHsKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTg1MSwyNSArMTE4NiwxMSBAQAogICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50ID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CiAKICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlID09IDN1KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOwotICAgICAgICAgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAgLy8gb3JpZ2luYWxfY29weSwgaG9tZQotCiAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC04ODQsMTIgKzEyMDUsMTIgQEAKIAogICAgICAgICAgICAgQUxPR0koImZvdW5kIEFBQyBjb2RlYyBjb25maWcgKCVkIEh6LCAlZCBjaGFubmVscykiLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAotICAgICAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCi0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCisgICAgICAgIC8vIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgb3JpZ2luYWxfY29weSwgaG9tZQorICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKKwogICAgICAgICAvLyBhZHRzX3ZhcmlhYmxlX2hlYWRlcgogCiAgICAgICAgIC8vIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9iaXQsIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9zdGFydApAQCAtMTAwNCwyNyArMTMyNSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLAotICAgICAgICAgICAgICAgICAgICBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOwotICAgIH0KLQogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKQEAgLTEzMjQsMjUgKzE2MjQsNiBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBmZmNiNTAyLi4zMjI3ZjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtMzgsNiArMzgsOCBAQAogICAgICAgICBIMjY0LAogICAgICAgICBBQUMsCiAgICAgICAgIEFDMywKKyAgICAgICAgRUFDMywKKyAgICAgICAgQUM0LAogICAgICAgICBNUEVHX0FVRElPLAogICAgICAgICBNUEVHX1ZJREVPLAogICAgICAgICBNUEVHNF9WSURFTywKQEAgLTU5LDYgKzYxLDcgQEAKIAogICAgIHZvaWQgYXBwZW5kU2NyYW1ibGVkRGF0YSgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICAgICAgaW50MzJfdCBrZXlJZCwgYm9vbCBpc1N5bmMsCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcyk7CiAKQEAgLTg0LDggKzg3LDggQEAKICAgICB9OwogCiAgICAgc3RydWN0IFNjcmFtYmxlZFJhbmdlSW5mbyB7Ci0gICAgICAgIC8vaW50NjRfdCBtVGltZXN0YW1wVXM7CiAgICAgICAgIHNpemVfdCBtTGVuZ3RoOworICAgICAgICBzaXplX3QgbUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBpbnQzMl90IG1LZXlJZDsKICAgICAgICAgaW50MzJfdCBtSXNTeW5jOwogICAgICAgICBzcDxBQnVmZmVyPiBtQ2xlYXJTaXplczsKQEAgLTExNSw3ICsxMTgsOCBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKLSAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggOWVkNGE5OS4uYjE4NzAzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0xNjQsNiArMTY0LDEwIEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzMiLCAiYXVkaW9fZW5jb2Rlci5hYzMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzMiLCAiYXVkaW9fZW5jb2Rlci5lYWMzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZWFjM19qb2MiLCAiYXVkaW9fZW5jb2Rlci5lYWMzX2pvYyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYzQiLCAiYXVkaW9fZW5jb2Rlci5hYzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAogICAgICAgICAgICAgImltYWdlX2RlY29kZXIuaGVpYyIsICJpbWFnZV9lbmNvZGVyLmhlaWMiIH0sCiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCA1NWFmZTA0Li5kZGI0NTlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0zNCw3ICszNCw4IEBACiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1IYW5kbGVyKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxTaW1wbGVTb2Z0T01YQ29tcG9uZW50Pih0aGlzKSksCiAgICAgICBtU3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKLSAgICAgIG1UYXJnZXRTdGF0ZShPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgIG1UYXJnZXRTdGF0ZShPTVhfU3RhdGVMb2FkZWQpLAorICAgICAgbUZyYW1lQ29uZmlnKGZhbHNlKSB7CiAgICAgbUxvb3Blci0+c2V0TmFtZShuYW1lKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwogCkBAIC0yMDQsNiArMjA1LDIxIEBACiAgICAgfQogfQogCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKKyAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworfQorCitPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBib29sIGZyYW1lQ29uZmlnID0gbUZyYW1lQ29uZmlnOworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gaW50ZXJuYWxTZXRDb25maWcoaW5kZXgsIHBhcmFtcywgJmZyYW1lQ29uZmlnKTsKKyAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgbUZyYW1lQ29uZmlnID0gZnJhbWVDb25maWc7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIE9NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6dXNlQnVmZmVyKAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmhlYWRlciwKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCkBAIC0zMzYsNiArMzUyLDEwIEBACiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RW1wdHlUaGlzQnVmZmVyLCBtSGFuZGxlcik7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOworICAgIGlmIChtRnJhbWVDb25maWcpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZnJhbWUtY29uZmlnIiwgbUZyYW1lQ29uZmlnKTsKKyAgICAgICAgbUZyYW1lQ29uZmlnID0gZmFsc2U7CisgICAgfQogICAgIG1zZy0+cG9zdCgpOwogCiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC0zNzgsNiArMzk4LDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXI7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJoZWFkZXIiLCAodm9pZCAqKikmaGVhZGVyKSk7CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lQ29uZmlnOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtY29uZmlnIiwgJmZyYW1lQ29uZmlnKSkgeworICAgICAgICAgICAgICAgIGZyYW1lQ29uZmlnID0gMDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZyAmJiBtVGFyZ2V0U3RhdGUgPT0gbVN0YXRlKTsKIApAQCAtMzkzLDYgKzQxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFidWZmZXItPm1Pd25lZEJ5VXMpOwogCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bU93bmVkQnlVcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bUZyYW1lQ29uZmlnID0gKGJvb2wpZnJhbWVDb25maWc7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soKG1zZ1R5cGUgPT0ga1doYXRFbXB0eVRoaXNCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3J0LT5tRGVmLmVEaXIgPT0gT01YX0RpcklucHV0KQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDkzNWRjMzQuLmU4NTNkYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7Ci0gICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAogICAgIGludDMyX3QgYnBwID0gKG1PdXRwdXRGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSA/IDIgOiAxOworICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGJwcDsKICAgICBvdXREZWYtPm5CdWZmZXJTaXplID0KLSAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiBicHAgKiAzKSAvIDI7CisgICAgICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIDMpIC8gMjsKIAogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmluRGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgIGluRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CkBAIC01MDIsNyArNTAyLDggQEAKICAgICAgICAgICAgIC8vIFRoZXNlIHZhbHVlcyB3ZXJlIGNob3NlbiB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGZ1cnRoZXIgZG93biB0aGUgbGluZSwgYW5kIGRvCiAgICAgICAgICAgICAvLyBub3QgaW5kaWNhdGUgc3VwcG9ydCBmb3IgMzJreDMyayB2aWRlby4KICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IDMyNzY4IHx8IG5ld0hlaWdodCA+IDMyNzY4Ci0gICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU3RyaWRlIDwgLTMyNzY4CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMjg4NTQyMSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CkBAIC02MDEsMTMgKzYwMiw0MCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1IZHIxMFBsdXNPdXRwdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c091dHB1dHMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9ICgqaXQpLmdldCgpOworCisgICAgICAgICAgICAgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBvdXRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgICAgIG91dFBhcmFtcy0+blBhcmFtU2l6ZVVzZWQgPSBpbmZvLT5zaXplKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBlbm91Z2gKKyAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLCByZXR1cm4gdGhlIHNpemUgb25seSBhbmQgZG8gbm90IHJlbW92ZSB0aGUgcGFyYW0geWV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRQYXJhbXMtPm5QYXJhbVNpemUgPj0gaW5mby0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvdXRQYXJhbXMtPm5WYWx1ZSwgaW5mby0+ZGF0YSgpLCBpbmZvLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBtSGRyMTBQbHVzT3V0cHV0cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVyZmxvdzsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyl7CitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIGtEZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OgogICAgICAgICB7CkBAIC02NTcsMTEgKzY4NSw1NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBpblBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICgqZnJhbWVDb25maWcpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCB0byBhcHBlbmQgdG8gdGhlIGN1cnJlbnQgZnJhbWUgY29uZmlnIHNldC4KKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSByZXBsYWNlIHdpdGggdGhlIGxhc3Qgc2V0IHZhbHVlLgorICAgICAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzSW5wdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKigtLW1IZHIxMFBsdXNJbnB1dHMuZW5kKCkpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDogYXBwZW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUgY29uZmlnIHdoaWxlIG5vIGZyYW1lIGNvbmZpZyBpcyBwcmVzZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZnJhbWUgY29uZmlnLCBzZXR0aW5nICpmcmFtZUNvbmZpZyB0byB0cnVlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2xpZW50IG1hcmtzIHRoZSBuZXh0IHF1ZXVlZCBpbnB1dCBmcmFtZSB0byBhcHBseSBpdC4KKyAgICAgICAgICAgICAgICAqZnJhbWVDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1IZHIxMFBsdXNJbnB1dHMucHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCitzcDxBQnVmZmVyPiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpIHsKKyAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c0lucHV0cy5iZWdpbigpOworICAgIHNwPEFCdWZmZXI+IGluZm8gPSAqaXQ7CisgICAgbUhkcjEwUGx1c0lucHV0cy5lcmFzZShpdCk7CisgICAgcmV0dXJuIGluZm87Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6cXVldWVPdXRwdXRGcmFtZUNvbmZpZyhjb25zdCBzcDxBQnVmZmVyPiAmaW5mbykgeworICAgIG1IZHIxMFBsdXNPdXRwdXRzLnB1c2hfYmFjayhpbmZvKTsKKyAgICBub3RpZnkoT01YX0V2ZW50Q29uZmlnVXBkYXRlLAorICAgICAgICAgICBrT3V0cHV0UG9ydEluZGV4LAorICAgICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgIE5VTEwpOworfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewpAQCAtNjc2LDYgKzc0OCwxMCBAQAogICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHJTdGF0aWNJbmZvSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSMTBQbHVzSW5mbyIpCisgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCiAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKQEAgLTY5Myw2ICs3NjksMTAgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpIHsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKaW5kZXggYTlmY2U1NS4uMGYyMjlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTE5MCw3ICsxOTAsMTIgQEAKICAqLwogLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CiBpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjxTdGF0dXM+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAodC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKTsKKyAgICB9IGVsc2UgaWYgKHQuaXNEZWFkT2JqZWN0KCkpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAppbmRleCAxZDFmMmJkLi42YmJlZGRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIlNvZnRPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTI4LDYgKzI5LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgQUJ1ZmZlcjsKIAogc3RydWN0IENvZGVjUHJvZmlsZUxldmVsIHsKICAgICBPTVhfVTMyIG1Qcm9maWxlOwpAQCAtNDksNiArNTEsNyBAQAogICAgIHN0cnVjdCBCdWZmZXJJbmZvIHsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm1IZWFkZXI7CiAgICAgICAgIGJvb2wgbU93bmVkQnlVczsKKyAgICAgICAgYm9vbCBtRnJhbWVDb25maWc7CiAgICAgfTsKIAogICAgIHN0cnVjdCBQb3J0SW5mbyB7CkBAIC03Niw2ICs3OSw5IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKKwogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmdldFBvcnRRdWV1ZShPTVhfVTMyIHBvcnRJbmRleCk7CiAKQEAgLTEwMSw2ICsxMDcsNyBAQAogICAgIE9NWF9TVEFURVRZUEUgbVRhcmdldFN0YXRlOwogCiAgICAgVmVjdG9yPFBvcnRJbmZvPiBtUG9ydHM7CisgICAgc3RkOjphdG9taWNfYm9vbCBtRnJhbWVDb25maWc7CiAKICAgICBib29sIGlzU2V0UGFyYW1ldGVyQWxsb3dlZCgKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSBjb25zdDsKQEAgLTExNCw2ICsxMjEsOSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCA1NmZjNjkxLi4zYjM4MWNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CkBAIC0yOCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDgsNiArNTAsNyBAQAogICAgIGVudW0gewogICAgICAgICBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMSwKICAgICAgICAga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAyLAorICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDMsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtNjgsOCArNzEsOCBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CkBAIC04MCw2ICs4Myw4IEBACiAKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpOwogCisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKKwogICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBib3RoIG1pbmltdW0gYnVmZmVyIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mCiAgICAgLy8gaW5wdXQgcG9ydCB0byBiZSB8bnVtSW5wdXRCdWZmZXJzfC4gSXQgd2lsbCBhbHNvIHNldCBib3RoIG1pbmltdW0gYnVmZmVyCiAgICAgLy8gY291bnQgYW5kIGFjdHVhbCBidWZmZXIgY291bnQgb2Ygb3V0cHV0IHBvcnQgdG8gYmUgfG51bU91dHB1dEJ1ZmZlcnN8LgpAQCAtMTY2LDYgKzE3MSw5IEBACiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGR1bXAgdGhlIENvbG9yQXNwZWN0cy4KICAgICB2b2lkIGR1bXBDb2xvckFzcGVjdHMoY29uc3QgQ29sb3JBc3BlY3RzICZjb2xvckFzcGVjdHMpOwogCisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICB2b2lkIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmluZm8pOworCiBwcml2YXRlOgogICAgIHVpbnQzMl90IG1NaW5JbnB1dEJ1ZmZlclNpemU7CiAgICAgdWludDMyX3QgbU1pbkNvbXByZXNzaW9uUmF0aW87CkBAIC0xNzQsNiArMTgyLDkgQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBtQ29kaW5nVHlwZTsKICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAqbVByb2ZpbGVMZXZlbHM7CiAgICAgc2l6ZV90IG1OdW1Qcm9maWxlTGV2ZWxzOworICAgIHR5cGVkZWYgTGlzdDxzcDxBQnVmZmVyPiA+IEhkcjEwUGx1c0luZm9MaXN0OworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNJbnB1dHM7CisgICAgSGRyMTBQbHVzSW5mb0xpc3QgbUhkcjEwUGx1c091dHB1dHM7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGVmMzY5ODIuLjMxYmM4MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yOSw2ICsyOSw3IEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggMTVhNzY1NS4uYzJmMTA3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwODZlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29wdXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDIxIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X29wdXNfY29tbW9uIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBzcmNzOiBbIk9wdXNIZWFkZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL09wdXNIZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb3B1cy9PcHVzSGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGE0NjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb3B1cy9PcHVzSGVhZGVyLmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE9wdXMiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworCitjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKKy8vIE9wdXMgYWx3YXlzIGhhcyBhIDQ4a0h6IG91dHB1dCByYXRlLiBUaGlzIGlzIHRydWUgZm9yIGFsbCBPcHVzLCBub3QganVzdCB0aGlzCisvLyBpbXBsZW1lbnRhdGlvbi4KK2NvbnN0ZXhwciBpbnQga1JhdGUgPSA0ODAwMDsKKy8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKy8vIE9mZnNldCB0byBtYWdpYyBzdHJpbmcgdGhhdCBzdGFydHMgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQgPSAwOworLy8gT2Zmc2V0IHRvIE9wdXMgdmVyc2lvbiBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyVmVyc2lvbk9mZnNldCA9IDg7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKy8vIE9mZnNldCB0byBzYW1wbGUgcmF0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCA9IDEyOworLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKy8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKy8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKy8vIHZhbHVlczoKKy8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisvLyAgICAgICAgICAgICB2YWx1ZXMuCisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0gMTk7CisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIHRoYXQgYXJlIGNvdXBsZWQgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0ID0gMjA7CisvLyBPZmZzZXQgdG8gdGhlIHN0cmVhbSB0byBjaGFubmVsIG1hcHBpbmcgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjLgorY29uc3RleHByIGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitjb25zdGV4cHIgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKK2NvbnN0ZXhwciB1aW50OF90IGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXRba01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXRdID0gezAsIDF9OworCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSAybmQgYnl0ZSBpcyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgIGlmIChyZWFkX29mZnNldCArIDEgPj0gZGF0YV9zaXplKSByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF07CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8IDEgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IGRhdGFba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gZGF0YVtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gZGF0YVtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSkgeworICAgIC8vIFNlZSBodHRwczovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKKyAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZW5zdXJlIGVudGlyZSBoZWFkZXIgaXMgY2xlYXJlZCwgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIG11Y2ggb2YgaXQgYmVsb3cKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAvLyBTZXQgbWFnaWMgc2lnbmF0dXJlLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0LCAiT3B1c0hlYWQiLCA4KTsKKyAgICAvLyBTZXQgT3B1cyB2ZXJzaW9uLgorICAgIG91dHB1dFtrT3B1c0hlYWRlclZlcnNpb25PZmZzZXRdID0gMTsKKyAgICAvLyBTZXQgY2hhbm5lbCBjb3VudC4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF0gPSAodWludDhfdCloZWFkZXIuY2hhbm5lbHM7CisgICAgLy8gU2V0IHByZS1za2lwCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQsICZoZWFkZXIuc2tpcF9zYW1wbGVzLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAvLyBTZXQgb3JpZ2luYWwgaW5wdXQgc2FtcGxlIHJhdGUgaW4gSHouCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCwgJmlucHV0X3NhbXBsZV9yYXRlLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAvLyBTZXQgb3V0cHV0IGdhaW4gaW4gZEIuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCwgJmhlYWRlci5nYWluX2RiLCBzaXplb2YodWludDE2X3QpKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIFNldCBjaGFubmVsIG1hcHBpbmcKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMTsKKyAgICAgICAgLy8gQXNzdW1pbmcgbm8gY291cGxlZCBzdHJlYW1zLiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZQorICAgICAgICAvLyBjaGFubmVscygpIC0gfGNvdXBsZWRfc3RyZWFtc3wuCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdID0gaGVhZGVyLmNoYW5uZWxzOworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF0gPSAwOworCisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHN0cmVhbSBtYXAuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldID0ga09wdXNDaGFubmVsTWFwW2hlYWRlci5jaGFubmVscyAtIDFdW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVscyArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMDsKKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgKyAxOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29wdXMvaW5jbHVkZS9PcHVzSGVhZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL2luY2x1ZGUvT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Zjc5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vcHVzL2luY2x1ZGUvT3B1c0hlYWRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhlIE9wdXMgc3BlY2lmaWNhdGlvbiBpcyBwYXJ0IG9mIElFVEYgUkZDIDY3MTY6CisgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzE2CisgKi8KKworI2lmbmRlZiBPUFVTX0hFQURFUl9IXworI2RlZmluZSBPUFVTX0hFQURFUl9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgICBpbnQgbnVtX3N0cmVhbXM7CisgICAgaW50IG51bV9jb3VwbGVkOworICAgIGludDE2X3QgZ2Fpbl9kYjsKKyAgICBpbnQgc2tpcF9zYW1wbGVzOworICAgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcik7CitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLCB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSk7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9QVVNfSEVBREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggNTYyMGNmOC4uMzNjMWMxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTksOCArNjAsOCBAQAogICAgIGlmIChtU29ja2V0ID49IDApIHsKICAgICAgICAgQUxPR0UoIkNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiwgY2xvc2luZyB0aGUgc29ja2V0LiIpOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yMTQsOCArMjE1LDggQEAKIAogICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTI2Niw5ICsyNjcsOSBAQAogICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwogCiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRTUCIpOwotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOwogICAgIH0KIAogICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CkBAIC0yOTcsOCArMjk4LDggQEAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTMxNSw4ICszMTYsOCBAQAogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6cGVyZm9ybURpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgIH0KICAgICBjbG9zZShtU29ja2V0KTsKICAgICBtU29ja2V0ID0gLTE7CkBAIC0zODksOCArMzkwLDggQEAKIAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCA1OTUxZGRmLi45YmM5Yzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsNSBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQU1SQXNzZW1ibGVyLmNwcCIsCkBAIC00OSw2ICs0OSwyMSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlscy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJuZXRkX2NsaWVudF9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBkMTgzNTE2Li41ZDk5M2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTc1NywxMCArNzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOwpAQCAtODg2LDEwICs4ODcsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOwpAQCAtMTY2NSwxMiArMTY2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CiAKICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgeworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKKyAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5FVFdPUktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUV09SS19VVElMU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOZXR3b3JrVXRpbHMgeworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkVUV09SS19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisKKy8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCwgdWlkX3QsIHVpbnQzMl90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQsIHVpZF90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZDQ1OWNiZC4uNjY1ZDUxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgeworICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggYTRlODg5ZC4uOTdlMWVjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTIyLDMgKzIyLDM2IEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorCisgICAgc3JjczogWyJUZXh0RGVzY3JpcHRpb25zMi5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZWFjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVGV4dERlc2NyaXB0aW9uczI6OlRleHREZXNjcmlwdGlvbnMyKCkgeworfQorCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6Z2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKyAgICBpZiAoZmxhZ3MgJiBJTl9CQU5EX1RFWFRfM0dQUCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBHTE9CQUxfREVTQ1JJUFRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgcGxheWVyTXNnKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIE9VVF9PRl9CQU5EX1RFWFRfU1JUKSB7CisgICAgICAgIGlmIChmbGFncyAmIExPQ0FMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucyhkYXRhLCBzaXplLCB0aW1lTXMsIHBsYXllck1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vIFBhcnNlIHRoZSBTUlQgdGV4dCBzYW1wbGUsIGFuZCBzdG9yZSB0aGUgdGltaW5nIGFuZCB0ZXh0IHNhbXBsZSBpbiBhIFBsYXllck1lc3NhZ2UuCisvLyBUaGUgUGxheWVyTWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gTWVkaWFQbGF5ZXIyLmphdmEgdGhyb3VnaCBldmVudCwgYW5kIHdpbGwgYmUKKy8vIHBhcnNlZCBpbiBUaW1lZFRleHQuamF2YS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RBUlRfVElNRSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZSh0aW1lTXMpOworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFQpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoZGF0YSwgc2l6ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEV4dHJhY3QgdGhlIGxvY2FsIDNHUFAgZGlzcGxheSBkZXNjcmlwdGlvbnMuIDNHUFAgbG9jYWwgZGVzY3JpcHRpb25zCisvLyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRleHQgc2FtcGxlIGlmIGFueS4KK3N0YXR1c190IFRleHREZXNjcmlwdGlvbnMyOjpleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfTE9DQUxfU0VUVElORyk7CisKKyAgICAvLyB3cml0ZSBzdGFydCB0aW1lIHRvIGRpc3BsYXkgdGhpcyB0ZXh0IHNhbXBsZQorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIGlmIChzaXplIDwgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHNzaXplX3QgdGV4dExlbiA9ICgqZGF0YSkgPDwgOCB8ICgqKGRhdGEgKyAxKSk7CisKKyAgICBpZiAoc2l6ZSA8IHRleHRMZW4gKyAyKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyB3cml0ZSB0ZXh0IHNhbXBsZSBsZW5ndGggYW5kIHRleHQgc2FtcGxlIGl0c2VsZgorICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEgKyAyLCB0ZXh0TGVuKTsKKworICAgIGlmIChzaXplID4gdGV4dExlbiArIDIpIHsKKyAgICAgICAgZGF0YSArPSAodGV4dExlbiArIDIpOworICAgICAgICBzaXplIC09ICh0ZXh0TGVuICsgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHdoaWxlIChzaXplID49IDgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKHRtcERhdGEpOyAgICAgIC8vIHNpemUgaW5jbHVkZXMgc2l6ZSBhbmQgdHlwZQorICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wRGF0YSArIDQpOworCisgICAgICAgIGlmIChjaHVua1NpemUgPD0gOCB8fCBjaHVua1NpemUgPiBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gY2h1bmtTaXplIC0gODsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisKKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgLy8gJ3Rib3gnIGJveCB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRleHQgd2l0aCB2YWx1ZXMKKyAgICAgICAgICAgIC8vIG9mIHRvcCwgbGVmdCwgYm90dG9tIGFuZCByaWdodAorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnYicsICdvJywgJ3gnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gY2h1bmtTaXplOworICAgICAgICBzaXplIC09IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRvIGV4dHJhY3QgYm94ICd0eDNnJyBkZWZpbmVkIGluIDNHUFAgVFMgMjYuMjQ1LCBhbmQgc3RvcmUgaXQgaW4gYSBQbGF5ZXJNZXNzYWdlCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9HTE9CQUxfU0VUVElORyk7CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIHNzaXplX3QgY2h1bmtTaXplID0gVTMyX0FUKGRhdGEpOworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSArIDQpOworICAgICAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gZGF0YTsKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIDg7CisKKyAgICAgICAgaWYgKHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAxOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNraXAgRElTUExBWV9GTEFHUywgU1RSVUNUX0pVU1RJRklDQVRJT04sIGFuZCBCQUNLR1JPVU5EX0NPTE9SX1JHQkEKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDE4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfU1RSVUNUX1RFWFRfUE9TKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNCkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA2KSk7CisKKyAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDE4OworICAgICAgICAgICAgICAgIC8vIElnbm9yZSByZW1haW5pbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKQEAgLTAsMCArMSw4OCBAQAorIC8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjZGVmaW5lIFRFWFRfREVTQ1JJUFRJT05TMl9IXworCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dERlc2NyaXB0aW9uczIgeworcHVibGljOgorICAgIGVudW0geworICAgICAgICBJTl9CQU5EX1RFWFRfM0dQUCAgICAgICAgICAgICA9IDB4MDEsCisgICAgICAgIE9VVF9PRl9CQU5EX1RFWFRfU1JUICAgICAgICAgID0gMHgwMiwKKworICAgICAgICBHTE9CQUxfREVTQ1JJUFRJT05TICAgICAgICAgICA9IDB4MTAwLAorICAgICAgICBMT0NBTF9ERVNDUklQVElPTlMgICAgICAgICAgICA9IDB4MjAwLAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UGxheWVyTWVzc2FnZU9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7Citwcml2YXRlOgorICAgIFRleHREZXNjcmlwdGlvbnMyKCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlc2Uga2V5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUga2V5cyBpbiBUaW1lZFRleHQuamF2YQorICAgICAgICBLRVlfRElTUExBWV9GTEFHUyAgICAgICAgICAgICAgICAgPSAxLCAvLyBpbnQKKyAgICAgICAgS0VZX1NUWUxFX0ZMQUdTICAgICAgICAgICAgICAgICAgID0gMiwgLy8gaW50CisgICAgICAgIEtFWV9CQUNLR1JPVU5EX0NPTE9SX1JHQkEgICAgICAgICA9IDMsIC8vIGludAorICAgICAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgICAgICAgICAgPSA0LCAvLyBpbnQKKyAgICAgICAgS0VZX1NDUk9MTF9ERUxBWSAgICAgICAgICAgICAgICAgID0gNSwgLy8gaW50CisgICAgICAgIEtFWV9XUkFQX1RFWFQgICAgICAgICAgICAgICAgICAgICA9IDYsIC8vIGludAorICAgICAgICBLRVlfU1RBUlRfVElNRSAgICAgICAgICAgICAgICAgICAgPSA3LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgICAgID0gOCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0ZPTlRfTElTVCAgICAgICAgICAgICAgPSA5LCAvLyBMaXN0PEZvbnQ+CisgICAgICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgICAgICAgICA9IDEwLCAvLyBMaXN0PENoYXJQb3M+CisgICAgICAgIEtFWV9TVFJVQ1RfSFlQRVJfVEVYVF9MSVNUICAgICAgICA9IDExLCAvLyBMaXN0PEh5cGVyVGV4dD4KKyAgICAgICAgS0VZX1NUUlVDVF9LQVJBT0tFX0xJU1QgICAgICAgICAgID0gMTIsIC8vIExpc3Q8S2FyYW9rZT4KKyAgICAgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUICAgICAgICAgICAgID0gMTMsIC8vIExpc3Q8U3R5bGU+CisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgICAgICAgICAgICAgICA9IDE0LCAvLyBUZXh0UG9zCisgICAgICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiAgICAgICAgICA9IDE1LCAvLyBKdXN0aWZpY2F0aW9uCisgICAgICAgIEtFWV9TVFJVQ1RfVEVYVCAgICAgICAgICAgICAgICAgICA9IDE2LCAvLyBUZXh0CisKKyAgICAgICAgS0VZX0dMT0JBTF9TRVRUSU5HICAgICAgICAgICAgICAgID0gMTAxLAorICAgICAgICBLRVlfTE9DQUxfU0VUVElORyAgICAgICAgICAgICAgICAgPSAxMDIsCisgICAgICAgIEtFWV9TVEFSVF9DSEFSICAgICAgICAgICAgICAgICAgICA9IDEwMywKKyAgICAgICAgS0VZX0VORF9DSEFSICAgICAgICAgICAgICAgICAgICAgID0gMTA0LAorICAgICAgICBLRVlfRk9OVF9JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsCisgICAgICAgIEtFWV9GT05UX1NJWkUgICAgICAgICAgICAgICAgICAgICA9IDEwNiwKKyAgICAgICAgS0VZX1RFWFRfQ09MT1JfUkdCQSAgICAgICAgICAgICAgID0gMTA3LAorICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBHbG9iYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsCisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworICAgIHN0YXRpYyBzdGF0dXNfdCBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRleHREZXNjcmlwdGlvbnMyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIFRFWFRfREVTQ1JJUFRJT05TMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCmluZGV4IDI2NmI2MTEuLjFmODQwYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKQEAgLTI4LDcgKzI4LDEyIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vcHVzX2NvbW1vbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCmluZGV4IGE1MTIwYjkuLjRkNTA0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0zMDUsNiArMzA1LDcgQEAKIH0KIAogc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICBsYWNpbmcsCiAgICAgICAgICAgICBsYW5nLAotICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGNvZGVjLAogICAgICAgICAgICAga0F1ZGlvVHlwZSwKICAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKaW5kZXggZmZiYmExYi4uYTk0YzIzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CiAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggNGQ3M2ViOC4uN2I0YjIzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPE9wdXNIZWFkZXIuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCkBAIC0xMTIsNDYgKzExNCwxMDIgQEAKIC8vIHN0YXRpYwogc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OmF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgewogICAgIGludDMyX3QgbkNoYW5uZWxzLCBzYW1wbGVyYXRlOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7Ci0gICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAotICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7Ci0gICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlOwogCiAgICAgaWYgKCFtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCisgICAgICAgIHx8ICFtZC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpKSB7CiAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOwogICAgICAgICBtZC0+ZHVtcFRvTG9nKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworICAgIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkpIHsKKyAgICAgICAgLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAvLyBvZiB0aGUgdHJhY2sgaXMgYW4gT3B1cyBPZ2cgaGVhZGVyIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzg0NSNzZWN0aW9uLTUuMSkKKyAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHRyYWNrIGlzbid0IHN0YW5kYXJkaXplZCwgaXRzIHZhbHVlIHNob3VsZCBiZSAiQV9PUFVTIi4KKyAgICAgICAgT3B1c0hlYWRlciBoZWFkZXI7CisgICAgICAgIGhlYWRlci5jaGFubmVscyA9IG5DaGFubmVsczsKKyAgICAgICAgaGVhZGVyLm51bV9zdHJlYW1zID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICAvLyAtIENoYW5uZWwgbWFwcGluZyBmYW1pbHkgKDggYml0cyB1bnNpZ25lZCkKKyAgICAgICAgLy8gIC0tICAwID0gb25lIHN0cmVhbTogbW9ubyBvciBMLFIgc3RlcmVvCisgICAgICAgIC8vICAtLSAgMSA9IGNoYW5uZWxzIGluIHZvcmJpcyBzcGVjIG9yZGVyOiBtb25vIG9yIEwsUiBzdGVyZW8gb3IgLi4uIG9yIEZMLEMsRlIsUkwsUlIsTEZFLCAuLi4KKyAgICAgICAgLy8gIC0tICAyLi4yNTQgPSByZXNlcnZlZCAodHJlYXQgYXMgMjU1KQorICAgICAgICAvLyAgLS0gIDI1NSA9IG5vIGRlZmluZWQgY2hhbm5lbCBtZWFuaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vICBvdXIgaW1wbGVtZW50YXRpb24gZW5jb2RlczogIDAsIDEsIG9yIDI1NQorICAgICAgICBoZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChuQ2hhbm5lbHMgPiA4KSA/IDI1NSA6IChuQ2hhbm5lbHMgPiAyKSk7CisgICAgICAgIGhlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgaGVhZGVyLnNraXBfc2FtcGxlcyA9IDA7CiAKLSAgICBvZmZfdCBvZmYgPSAwOwotICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOwotICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKLSAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisgICAgICAgIC8vIGhlYWRlcnMgYXJlIDIxLWJ5dGVzICsgc29tZXRoaW5nIGRyaXZlbiBieSBjaGFubmVsIGNvdW50CisgICAgICAgIC8vIGV4cGVjdCBudW1iZXJzIGluIHRoZSBsb3cgMzAncyBoZXJlLiBXcml0ZU9wdXNIZWFkZXIoKSB3aWxsIHRlbGwgdXMKKyAgICAgICAgLy8gaWYgdGhpbmdzIGFyZSBiYWQuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX2RhdGFbMTAwXTsKKyAgICAgICAgaW50IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBzYW1wbGVyYXRlLCAodWludDhfdCopaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJfZGF0YSkpOwogCi0gICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworICAgICAgICBpZiAoaGVhZGVyU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGRpZG4ndCBmaWxsIG91dCB0aGF0IGhlYWRlciBmb3Igc29tZSByZWFzb24KKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2VuZXJhdGUgT1BVUyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7Ci0gICAgb2ZmICs9IGhlYWRlclNpemUyOwotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDA7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTsKIAotICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCi0gICAgICAgICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmKTsKLSAgICByZXR1cm4gZW50cnk7CisgICAgICAgIG9mZl90IG9mZiA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICB1aW50OF90KiBjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsICh1aW50OF90KiloZWFkZXJfZGF0YSwgaGVhZGVyU2l6ZSk7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9CisgICAgICAgICAgICAgICAgV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgiQV9PUFVTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLCBjb2RlY1ByaXZhdGVCdWYpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICAgICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OworICAgICAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICAgICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworCisgICAgICAgIGlmICghbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCisgICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICAgICAgQUxPR0UoIk1pc3NpbmcgaGVhZGVyIGZvcm1hdCBrZXlzIGZvciB2b3JiaXMgdHJhY2siKTsKKyAgICAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKyAgICAgICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworCisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMjsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX1ZPUkJJUyIsIG5DaGFubmVscywgc2FtcGxlcmF0ZSwgY29kZWNQcml2YXRlQnVmKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIGlzIG5vdCBhIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiLCBtaW1lVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc2l6ZV90IFdlYm1Xcml0ZXI6Om51bVRyYWNrcygpIHsKQEAgLTM4MiwxNiArNDQwLDE4IEBACiAgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogICAgIGNvbnN0IGNoYXIgKnZwOSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKICAgICBjb25zdCBjaGFyICp2b3JiaXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVM7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiAKICAgICBzaXplX3Qgc3RyZWFtSW5kZXg7CiAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2cDgsIHN0cmxlbih2cDgpKSB8fAogICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgdnA5LCBzdHJsZW4odnA5KSkpIHsKICAgICAgICAgc3RyZWFtSW5kZXggPSBrVmlkZW9JbmRleDsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpIHx8CisgICAgICAgICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtBdWRpb0luZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMsICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzKTsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMsICVzLCBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgbWltZSwgdnA4LCB2cDksIHZvcmJpcywgb3B1cyk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCmluZGV4IDA4MzI5NDQuLjJkZWM5ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApAQCAtOTIsMTggKzkyLDE4IEBACiBzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKICAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLAogICAgICAgICAgICAgKGZvdW5kID8gIiIgOiAibm8gIiksIGF0dHIpOwotICAgIHJldHVybiAtRUlOVkFMOworICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKIHN0YXR1c190IGxpbWl0RXJyb3IoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7CiAgICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLCBtc2cpOwotICAgIHJldHVybiAtRUlOVkFMOworICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKIHN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogYXR0ciwgY29uc3QgY2hhciogdmFsdWUpIHsKICAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoIGludmFsaWQgJyVzJyBhdHRyaWJ1dGUgKCVzKSIsIG5hbWUsCiAgICAgICAgICAgICBhdHRyLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAogfTsgLy8gdW5uYW1lZCBuYW1lc3BhY2UKQEAgLTIzMiwxMiArMjMyLDEyIEBACiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKICAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaHJlZiIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhyZWYgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJpbmNsdWRlWE1MRmlsZTogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KQEAgLTI1MiwzMiArMjUyLDMyIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBocmVmOwogICAgIGlmIChmaWxlbmFtZS5jb21wYXJlKDAsIDEzLCAibWVkaWFfY29kZWNzXyIpICE9IDAgfHwKICAgICAgICAgICAgIGZpbGVuYW1lLmNvbXBhcmUoZmlsZW5hbWUuc2l6ZSgpIC0gNCwgNCwgIi54bWwiKSAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG1IcmVmQmFzZSk7CiAKKyAgICBzdGF0dXNfdCBvbGRQYXJzaW5nU3RhdHVzID0gbVBhcnNpbmdTdGF0dXM7CisKICAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworCisgICAgc3RhdHVzX3QgbmV3UGFyc2luZ1N0YXR1cyA9IG1QYXJzaW5nU3RhdHVzOworICAgIG1QYXJzaW5nU3RhdHVzID0gb2xkUGFyc2luZ1N0YXR1czsKKyAgICByZXR1cm4gbmV3UGFyc2luZ1N0YXR1czsKIH0KIAogdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6c3RhcnRFbGVtZW50SGFuZGxlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgaWYgKG1QYXJzaW5nU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBib29sIGluVHlwZSA9IHRydWU7CiAKICAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSkgewotICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKLSAgICAgICAgaWYgKG1QYXJzaW5nU3RhdHVzID09IE9LKSB7CisgICAgICAgIGlmIChpbmNsdWRlWE1MRmlsZShhdHRycykgPT0gT0spIHsKICAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKG1DdXJyZW50U2VjdGlvbik7CiAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7CiAgICAgICAgIH0KQEAgLTMwMCw3ICszMDAsNyBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fU0VUVElOR1M6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZyIpKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgICAgICh2b2lkKWFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzA4LDkgKzMwOCw3IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0KKyAgICAgICAgICAgICAgICAodm9pZClhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoZmFsc2UgLyogZW5jb2RlciAqLywgYXR0cnMpOwogICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzE5LDkgKzMxNyw3IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgIGFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLQorICAgICAgICAgICAgICAgICh2b2lkKWFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTMzMSw5ICszMjcsOSBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRRdWlyayhhdHRycyk7CisgICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgKHZvaWQpYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0VOQ09ERVIpKTsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQogICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIgPwpAQCAtMzUzLDkgKzM0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZExpbWl0KGF0dHJzKTsKKyAgICAgICAgICAgICAgICAodm9pZClhZGRMaW1pdChhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJGZWF0dXJlIikpIHsKLSAgICAgICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IGFkZEZlYXR1cmUoYXR0cnMpOworICAgICAgICAgICAgICAgICh2b2lkKWFkZEZlYXR1cmUoYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM2NywxMCArMzYzLDYgQEAKIH0KIAogdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZW5kRWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSkgewotICAgIGlmIChtUGFyc2luZ1N0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgogICAgICAgICB7CkBAIC00NTIsMzEgKzQ0NCwzMSBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCiAgICAgaWYgKG5hbWUgPT0gbnVsbHB0ciB8fCB2YWx1ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IG5hbWUgb3IgdmFsdWUgdW5zcGVjaWZpZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gQm9vbGVhbiB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byAiMCIgb3IgIjEiLgpAQCAtNDg5LDcgKzQ4MSw3IEBACiAgICAgaWYgKGF0dHJpYnV0ZSA9PSBtU2VydmljZUF0dHJpYnV0ZU1hcC5lbmQoKSkgeyAvLyBOZXcgYXR0cmlidXRlIG5hbWUKICAgICAgICAgaWYgKG1VcGRhdGUpIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyBzZXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVNYXAuaW5zZXJ0KEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOwogICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGF0dHJpYnV0ZSBuYW1lCkBAIC01MTMsMzkgKzUwNSw0MCBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidHlwZSIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdHlwZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHR5cGUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInVwZGF0ZSIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdXBkYXRlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCiAgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKICAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmZpbmQobmFtZSk7CiAgICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7IC8vIE5ldyBjb2RlYyBuYW1lCiAgICAgICAgIGlmIChtVXBkYXRlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3RpbmcgY29kZWMiKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgQUxPR1coImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogY2Fubm90IHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIGNvZGVjIFwiJXNcIi4iLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvZGVjIGluIG1Db2RlY01hcAogICAgICAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmluc2VydCgKQEAgLTU2MCwxOCArNTUzLDI2IEBACiAgICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5vcmRlciA9IG1Db2RlY0NvdW50ZXIrKzsKICAgICB9IGVsc2UgeyAvLyBFeGlzdGluZyBjb2RlYyBuYW1lCiAgICAgICAgIGlmICghbVVwZGF0ZSkgewotICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogYWRkaW5nIGV4aXN0aW5nIGNvZGVjIik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIEFMT0dXKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHRyeWluZyB0byBhZGQgIgorICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGNvZGVjIFwiJXNcIiIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CiAgICAgICAgICAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIHR5cGUgXCIlc1wiIGZvciBjb2RlYyBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGNvZGVjIGhhcyBhdCBtb3N0IG9uZSB0eXBlLgogICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgXCIlc1wiIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC01NzksNiArNTgwLDEwIEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKQEAgLTU4NiwxOSArNTkxLDE5IEBACiAgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRRdWlyazogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoImFkZFF1aXJrOiBuYW1lIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKQEAgLTYwNiw2ICs2MTEsMTAgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2RlcikgeworICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CiAKQEAgLTYxNCw0MiArNjIzLDUxIEBACiAgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLmlzRW5jb2RlciA9IGVuY29kZXI7CiAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZmluZChuYW1lKTsKICAgICBpZiAoIW1VcGRhdGUpIHsKICAgICAgICAgaWYgKG1DdXJyZW50VHlwZSAhPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogcmUtZGVmaW5pbmcgZXhpc3RpbmcgdHlwZSB3aXRob3V0IHVwZGF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBBTE9HVygiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB0cnlpbmcgdG8gdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICJleGlzdGluZyB0eXBlIFwiJXNcIiIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50VHlwZSA9IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmluc2VydCgKICAgICAgICAgICAgICAgICBUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CiAgICAgfSBlbHNlIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKICAgICAgICAgQUxPR0UoImFkZFR5cGVGcm9tQXR0cmlidXRlczogdXBkYXRpbmcgbm9uLWV4aXN0aW5nIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBjb25zdCBjaGFyKiBhX25hbWUgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIqIGFfZGVmYXVsdCA9IG51bGxwdHI7CiAgICAgY29uc3QgY2hhciogYV9pbiA9IG51bGxwdHI7CkBAIC02NjUsNzggKzY4Myw3MyBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRlZmF1bHQiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogZGVmYXVsdCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFfZGVmYXVsdCA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAiaW4iKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogaW4gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX2luID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtYXgiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWF4IGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYV9tYXggPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1pbiIpKSB7CiAgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBtaW4gaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX21pbiA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2UiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2UgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX3JhbmdlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZXMiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogcmFuZ2VzIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInNjYWxlIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHNjYWxlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYV9zY2FsZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgewogICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHVucmVjb2duaXplZCBsaW1pdDogJXMiLCBhdHRyc1tpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAogICAgIGlmIChhX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgibGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbywKICAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKICAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCiAgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICBBTE9HVygiaWdub3JpbmcgbnVsbCB0eXBlIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBzdGQ6OnN0cmluZyByYW5nZTsKICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJpdHJhdGUiKSB8fApAQCAtODgwLDYgKzg5MywxMyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIHNpemVfdCBpID0gMDsKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKICAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7CkBAIC04OTAsMzAgKzkxMCwzMCBAQAogICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogb3B0aW9uYWwgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcHRpb25hbCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogcmVxdWlyZWQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKICAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2ldOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CkBAIC05MjEsMjMgKzk0MSwxOCBAQAogICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KICAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJmZWF0dXJlIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dXKCJpZ25vcmluZyBudWxsIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGlmICgob3B0aW9uYWwgIT0gLTEpIHx8IChyZXF1aXJlZCAhPSAtMSkpIHsKICAgICAgICAgaWYgKG9wdGlvbmFsID09IHJlcXVpcmVkKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBpZiAoKG9wdGlvbmFsID09IDEpIHx8IChyZXF1aXJlZCA9PSAxKSkgewogICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGNhbm5vdCBoYXZlIGV4dHJhICd2YWx1ZSciLCBuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbc3RkOjpzdHJpbmcoImZlYXR1cmUtIikgKyBuYW1lXSA9CiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsID09IDEgPyAiMCIgOiAiMSI7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGYyNWZjNzEuLmFkM2MwNjggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC0yMTIsNyArMjEyLDYgQEAKICAgICB1aW50MTZfdCB2YWx1ZSA9IHNldHVwLT53VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOwogICAgIGJ1Zi5yZXNpemUobGVuZ3RoKTsKLSAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmICghKHR5cGUgJiBVU0JfRElSX0lOKSkgewogICAgICAgICBpZiAoOjpyZWFkKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgewpAQCAtMjI1LDggKzIyNCw4IEBACiAgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKICAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKICAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1JFUV9HRVRfREVWSUNFX1NUQVRVUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpICsgNCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCBjY2RkZDZlLi5jYThjYjc4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtOTksNiArOTksNyBAQAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKICAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKKyAgICBNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGludCBjb250cm9sRmQsIGJvb2wgcHRwLApAQCAtMjU5LDYgKzI2MCwxMSBAQAogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsIGhhbmRsZSk7CiB9CiAKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEFMT0dWKCJzZW5kT2JqZWN0SW5mb0NoYW5nZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELCBoYW5kbGUpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZFN0b3JlQWRkZWQoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgQUxPR1YoInNlbmRTdG9yZUFkZGVkICUwOFhcbiIsIGlkKTsKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX0FEREVELCBpZCk7CkBAIC00NDIsNiArNDQ4LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGlmIChyZXNwb25zZSAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICBBTE9HVygiW01UUF0gZ290IHJlc3BvbnNlIDB4JVggaW4gY29tbWFuZCAlcyAoJXgpIiwgcmVzcG9uc2UsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKICAgICBpZiAocmVzcG9uc2UgPT0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIG1SZXNwb25zZS5zZXRSZXNwb25zZUNvZGUocmVzcG9uc2UpOwpAQCAtNjUyLDggKzY2MSw4IEBACiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKLSAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCi0gICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlcyAoMHglMDRYKVxuIiwgaGFuZGxlLAorICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpLCBwcm9wZXJ0eSk7CiAKICAgICByZXR1cm4gbURhdGFiYXNlLT5nZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKIH0KQEAgLTk0Niw3ICs5NTUsOCBAQAogICAgIGlmICghbURhdGEuZ2V0U3RyaW5nKG1vZGlmaWVkKSkgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsgICAgIC8vIGRhdGUgbW9kaWZpZWQKICAgICAvLyBrZXl3b3JkcyBmb2xsb3cKIAotICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6ICUwNFhcbiIsIChjb25zdCBjaGFyICopbmFtZSwgZm9ybWF0KTsKKyAgICBBTE9HVigibmFtZTogJXMgZm9ybWF0OiAweCUwNFggKCVzKVxuIiwgKGNvbnN0IGNoYXIqKW5hbWUsIGZvcm1hdCwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CiAgICAgdGltZV90IG1vZGlmaWVkVGltZTsKICAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCiAgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CkBAIC05NjcsOSArOTc3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0U7CiAgICAgfQogCi0gICAgQUxPR0QoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HVigicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtRGF0YWJhc2UtPmJlZ2luU2VuZE9iamVjdCgoY29uc3QgY2hhciopcGF0aCwgZm9ybWF0LAogICAgICAgICAgICAgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dEKCJoYW5kbGU6ICVkLCBwYXJlbnQ6ICVkLCBzdG9yYWdlSUQ6ICUwOFgiLCBoYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZjY5MzlkNy4uMWY4Nzk5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTE1LDYgKzExNSw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IGM3MGQ4MDcuLjY5NzY5NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC0zMSw2ICszMSwxMyBAQAogICAgIGxpY2Vuc2U6ICJOT1RJQ0UiLAogfQogCisvLyBmb3IgdXNlIHdpdGggaGVhZGVyX2xpYnMKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogCkBAIC01NSw3ICs2Miw2IEBACiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAotCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLApAQCAtNjUsNiArNzEsOCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKQEAgLTczLDE0ICs4MSwxOSBAQAogICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJhbmRyb2lkIiwKICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMTAwLDUgKzExMyw2NyBAQAogbGxuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka191dGlscyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0IiwKKyAgICBzcmNzOiBbInRlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURfX0FORFJPSURfVk5ES19fIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKaW5kZXggYmU2MzVmZi4uYjg2YWI0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfaGFyZHdhcmVfSGFyZHdhcmVCdWZmZXIuaD4KICNpbmNsdWRlIDxncmFsbG9jdXNhZ2UvR3JhbGxvY1VzYWdlQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTQzLDYgKzQ0LDEwIEBACiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtDb250ZXh0S2V5ICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQUltYWdlUmVhZGVyOjprR3JhcGhpY0J1ZmZlcktleSA9ICJHcmFwaGljQnVmZmVyIjsKIAorc3RhdGljIGNvbnN0ZXhwciBpbnQga1dpbmRvd0hhbFRva2VuU2l6ZU1heCA9IDI1NjsKKworc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoY29uc3QgSGFsVG9rZW4gJmhhbFRva2VuKTsKKwogYm9vbAogQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdEFuZFVzYWdlKGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSkgewogICAgIC8vIENoZWNrIHdoZXRoZXIgdXNhZ2UgaGFzIGVpdGhlciBDUFVfUkVBRF9PRlRFTiBvciBDUFVfUkVBRCBzZXQuIE5vdGUgdGhhdCBjaGVjayBhZ2FpbnN0CkBAIC02Myw2ICs2OCw3IEBACiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgLy8gRm9yIHByaXZhdGUgZm9ybWF0LCBjcHUgdXNhZ2UgaXMgcHJvaGliaXRlZC4KQEAgLTg5LDYgKzk1LDcgQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTM2Myw2ICszNzAsMTUgQEAKICAgICAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lci0+YWJhbmRvbigpOwogICAgICAgICBtQnVmZmVySXRlbUNvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKG51bGxwdHIpOwogICAgIH0KKworICAgIGlmIChtV2luZG93SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgaW50IHNpemUgPSBtV2luZG93SGFuZGxlLT5kYXRhWzBdOworICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoYWxUb2tlbjsKKyAgICAgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmbVdpbmRvd0hhbmRsZS0+ZGF0YVsxXSksIHNpemUpOworICAgICAgICBkZWxldGVIYWxUb2tlbihoYWxUb2tlbik7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1XaW5kb3dIYW5kbGUpOworICAgIH0KIH0KIAogbWVkaWFfc3RhdHVzX3QKQEAgLTUyMiw2ICs1MzgsMjUgQEAKICAgICB9CiB9CiAKK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcjo6Z2V0V2luZG93TmF0aXZlSGFuZGxlKG5hdGl2ZV9oYW5kbGUgKipoYW5kbGUpIHsKKyAgICBpZiAobVdpbmRvd0hhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICpoYW5kbGUgPSBtV2luZG93SGFuZGxlOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0KKyAgICAgICAgbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KG1Qcm9kdWNlcik7CisgICAgSGFsVG9rZW4gaGFsVG9rZW47CisgICAgaWYgKCFjcmVhdGVIYWxUb2tlbihoZ2JwLCAmaGFsVG9rZW4pKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgbVdpbmRvd0hhbmRsZSA9IGNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKGhhbFRva2VuKTsKKyAgICBpZiAoIW1XaW5kb3dIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICAqaGFuZGxlID0gbVdpbmRvd0hhbmRsZTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCiBpbnQKIEFJbWFnZVJlYWRlcjo6Z2V0QnVmZmVyV2lkdGgoQnVmZmVySXRlbSogYnVmZmVyKSB7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gLTE7CkBAIC01ODUsNiArNjIwLDMzIEBACiAgICAgfQogfQogCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZSgKKyAgICAgICAgY29uc3QgSGFsVG9rZW4gJmhhbFRva2VuKSB7CisgICAgLy8gV2UgYXR0ZW1wdCB0byBzdG9yZSBoYWxUb2tlbiBpbiB0aGUgaW50cyBvZiB0aGUgbmF0aXZlX2hhbmRsZV90IGFmdGVyIGl0cworICAgIC8vIHNpemUuIFRoZSBmaXJzdCBpbnQgc3RvcmVzIHRoZSBzaXplIG9mIHRoZSB0b2tlbi4gV2Ugc3RvcmUgdGhpcyBpbiBhbiBpbnQKKyAgICAvLyB0byBhdm9pZCBhbGlnbm1lbnQgaXNzdWVzIHdoZXJlIHNpemVfdCBhbmQgaW50IGRvIG5vdCBoYXZlIHRoZSBzYW1lCisgICAgLy8gYWxpZ25tZW50LgorICAgIHNpemVfdCBuaERhdGFCeXRlU2l6ZSA9IGhhbFRva2VuLnNpemUoKTsKKyAgICBpZiAobmhEYXRhQnl0ZVNpemUgPiBrV2luZG93SGFsVG9rZW5TaXplTWF4KSB7CisgICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSB0b2tlbiBpc24ndCByZWFzb25hYmxlLi4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNpemVfdCBudW1JbnRzID0gY2VpbChuaERhdGFCeXRlU2l6ZSAvIHNpemVvZihpbnQpKSArIDE7CisKKyAgICAvLyBXZSBkb24ndCBjaGVjayBmb3Igb3ZlcmZsb3csIHdoZXRoZXIgbnVtSW50cyBjYW4gZml0IGluIGFuIGludCwgc2luY2Ugd2UKKyAgICAvLyBleHBlY3Qga1dpbmRvd0hhbFRva2VuU2l6ZU1heCB0byBiZSBhIHJlYXNvbmFibGUgbGltaXQuCisgICAgLy8gY3JlYXRlIGEgbmF0aXZlX2hhbmRsZV90IHdpdGggMCBudW1GZHMgYW5kIG51bUludHMgbnVtYmVyIG9mIGludHMuCisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDAsIG51bUludHMpOworICAgIGlmICghbmgpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIC8vIFN0b3JlIHRoZSBzaXplIG9mIHRoZSB0b2tlbiBpbiB0aGUgZmlyc3QgaW50LgorICAgIG5oLT5kYXRhWzBdID0gbmhEYXRhQnl0ZVNpemU7CisgICAgbWVtY3B5KCYobmgtPmRhdGFbMV0pLCBoYWxUb2tlbi5kYXRhKCksIG5oRGF0YUJ5dGVTaXplKTsKKyAgICByZXR1cm4gbmg7Cit9CisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ldygKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCBpbnQzMl90IG1heEltYWdlcywKQEAgLTU5NCw2ICs2NTYsMTkgQEAKICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOLCBtYXhJbWFnZXMsIHJlYWRlcik7CiB9CiAKK2V4dGVybiAiQyIgeworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoCisgICAgICAgIEFJbWFnZVJlYWRlciAqcmVhZGVyLCAvKm91dCovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKHJlYWRlciA9PSBudWxscHRyIHx8IGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiByZWFkZXItPmdldFdpbmRvd05hdGl2ZUhhbmRsZShoYW5kbGUpOworfQorCit9IC8vZXh0ZXJuICJDIgorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2UoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmggYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKaW5kZXggYmVkOGEyMS4uNzgxNTJkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaApAQCAtNjksNiArNjksOCBAQAogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVOZXh0SW1hZ2UoLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBmZW5jZUZkKTsKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlTGF0ZXN0SW1hZ2UoLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBmZW5jZUZkKTsKIAorICAgIG1lZGlhX3N0YXR1c190IGdldFdpbmRvd05hdGl2ZUhhbmRsZSgvKm91dCovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKwogICAgIEFOYXRpdmVXaW5kb3cqIGdldFdpbmRvdygpICAgIGNvbnN0IHsgcmV0dXJuIG1XaW5kb3cuZ2V0KCk7IH07CiAgICAgaW50MzJfdCAgICAgICAgZ2V0V2lkdGgoKSAgICAgY29uc3QgeyByZXR1cm4gbVdpZHRoOyB9OwogICAgIGludDMyX3QgICAgICAgIGdldEhlaWdodCgpICAgIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH07CkBAIC0xNjAsNiArMTYyLDcgQEAKICAgICBzcDxTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+ICAgICBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgIG1XaW5kb3c7CisgICAgbmF0aXZlX2hhbmRsZV90KiAgICAgICAgICAgbVdpbmRvd0hhbmRsZSA9IG51bGxwdHI7CiAKICAgICBMaXN0PEFJbWFnZSo+ICAgICAgICAgICAgICBtQWNxdWlyZWRJbWFnZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCA0MjI4NWY4Li5jMjNmMTliIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvUHJpdi5oIgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKaW5kZXggZDcxOTNjYS4uYjhhZjVmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKaW5kZXggOWQwMGU1ZS4uMWFiZWU5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKQEAgLTIzLDE2ICsyMywyMyBAQAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KIAogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTQxLDE0ICs0OCwyMCBAQAogICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0OwogICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemU7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlOworICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemU7CisgICAgc3A8RGF0YVNvdXJjZT4gbUltcGw7CisgICAgdWludDMyX3QgbUZsYWdzOwogfTsKIAogTmRrRGF0YVNvdXJjZTo6TmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUpOworICAgIG1EYXRhU291cmNlLT5tSW1wbCA9IGRhdGFTb3VyY2UtPm1JbXBsOworICAgIG1EYXRhU291cmNlLT5tRmxhZ3MgPSBkYXRhU291cmNlLT5tRmxhZ3M7CiB9CiAKIE5ka0RhdGFTb3VyY2U6On5OZGtEYXRhU291cmNlKCkgewpAQCAtNTksOSArNzIsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3VpbnQzMl90IE5ka0RhdGFTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBtRGF0YVNvdXJjZS0+bUZsYWdzOworfQorCiBzc2l6ZV90IE5ka0RhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQsIGRhdGEsIHNpemUpOwpAQCAtOTIsNiArMTA5LDk1IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBOZGtEYXRhU291cmNlOjpnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplcHRyKSB7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1EYXRhU291cmNlLT51c2VyZGF0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBzaXplcHRyICE9IE5VTEwpIHsKKyAgICAgICAgc2l6ZSA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgKnNpemVwdHIgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gc2l6ZSA+PSAwID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCitzdGF0aWMgc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgaW50IHZlcnNpb24pIHsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgb2JqKSk7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBTZXJ2aWNlKGVudiwgb2JqKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZSgKKyAgICAgICAgSk5JRW52ICplbnYsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgY2hhciAqY2xhenosCisgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCwKKyAgICAgICAgY29uc3QgY2hhciAqc2lnbmF0dXJlLAorICAgICAgICBpbnQgdmVyc2lvbikgeworICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7CisgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJodHRwIHNlcnZpY2UgbXVzdCBiZSBjcmVhdGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoY2xhenopOworICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhKDIpSHR0cFNlcnZpY2UiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywgbWV0aG9kLCBzaWduYXR1cmUpOworICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworCisgICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworCisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKGVudiwgc2VydmljZSwgdmVyc2lvbik7CisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworCit9CisKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbikgeworCisgICAgSk5JRW52ICplbnY7CisgICAgY29uc3QgY2hhciAqY2xhenosICptZXRob2QsICpzaWduYXR1cmU7CisKKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIG1ldGhvZCA9ICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYTJIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSFRUUFNlcnZpY2UiOworICAgICAgICAgICAgc2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2U7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZShlbnYsIHVyaSwgY2xhenosIG1ldGhvZCwgc2lnbmF0dXJlLCB2ZXJzaW9uKTsKKworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC0xMDUsNiArMjExLDMyIEBACiB9CiAKIEVYUE9SVAorQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgeworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gc2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5X3ZhbHVlc1tpICogMl0pOworICAgICAgICBTdHJpbmc4IHZhbHVlOChrZXlfdmFsdWVzW2kgKiAyICsgMV0pOworICAgICAgICBoZWFkZXJzLmFkZChrZXk4LCB2YWx1ZTgpOworICAgIH0KKworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKHNlcnZpY2UsIHVyaSwgJmhlYWRlcnMpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEFMT0dJKCJBTWVkaWFEYXRhU291cmNlX25ld1VyaSBzb3VyY2UgJXMgZmxhZ3MgJXUiLCBzb3VyY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgc291cmNlLT5mbGFncygpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlKiBhU291cmNlID0gY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBhU291cmNlLT5tSW1wbCA9IHNvdXJjZTsKKyAgICBhU291cmNlLT5tRmxhZ3MgPSBzb3VyY2UtPmZsYWdzKCk7CisgICAgcmV0dXJuIGFTb3VyY2U7Cit9CisKK0VYUE9SVAogdm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlICptU291cmNlKSB7CiAgICAgQUxPR1YoImR0b3IiKTsKICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CkBAIC0xMzIsNSArMjY0LDE2IEBACiAgICAgbVNvdXJjZS0+Y2xvc2UgPSBjbG9zZTsKIH0KIAorRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgeworICAgIHJldHVybiBtU291cmNlLT5jbG9zZShtU291cmNlLT51c2VyZGF0YSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZSkgeworICAgIG1Tb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgPSBnZXRBdmFpbGFibGVTaXplOworfQorCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE1N2RhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MiCisKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3NpemVfdCBEYXRhU291cmNlX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOworfQorCit2b2lkIERhdGFTb3VyY2VfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmNsb3NlKCk7Cit9CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCkgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShvZmZzZXQsICZzaXplKTsKKyAgICByZXR1cm4gIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAzMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKKworI2RlZmluZSBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworc3RhdGljIGlubGluZSBBTWVkaWFEYXRhU291cmNlKiBjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTWVkaWFEYXRhU291cmNlICptU291cmNlID0gQU1lZGlhRGF0YVNvdXJjZV9uZXcoKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1Tb3VyY2UsIHNvdXJjZS5nZXQoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobVNvdXJjZSwgRGF0YVNvdXJjZV9yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobVNvdXJjZSwgRGF0YVNvdXJjZV9jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKG1Tb3VyY2UsIERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgcmV0dXJuIG1Tb3VyY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKaW5kZXggZWE5Yzg2NS4uMTZmZjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDMsMTEgKzQ0LDEzIEBACiAgICAgTmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICopOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICopOwogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OZGtEYXRhU291cmNlKCk7CkBAIC01OSw1ICs2Miw3IEBACiAKIH07CiAKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbik7CisKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IDZkMTBmMWMuLjU1YWZiMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMTcsNiArMTcsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURybSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTQwLDEwICs0MiwzMiBAQAogewogcHJpdmF0ZToKICAgICBBTWVkaWFEcm0gKm1PYmo7Ci0gICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBtRXZlbnRMaXN0ZW5lcjsKKyAgICBBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcjsKKyAgICBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbUtleXNDaGFuZ2VMaXN0ZW5lcjsKIAogcHVibGljOgotICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwgbUxpc3RlbmVyKGxpc3RlbmVyKSB7fQorICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwKKyAgICAgICAgICAgIG1FdmVudExpc3RlbmVyKGxpc3RlbmVyKSwgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihOVUxMKSwgbUtleXNDaGFuZ2VMaXN0ZW5lcihOVUxMKSB7fQorCisgICAgRHJtTGlzdGVuZXIoQU1lZGlhRHJtICpvYmosIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksCisgICAgICAgICAgICBtRXZlbnRMaXN0ZW5lcihOVUxMKSwgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIG1LZXlzQ2hhbmdlTGlzdGVuZXIoTlVMTCkge30KKworICAgIERybUxpc3RlbmVyKEFNZWRpYURybSAqb2JqLCBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLAorICAgICAgICAgICAgbUV2ZW50TGlzdGVuZXIoTlVMTCksIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoTlVMTCksIG1LZXlzQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKKyAgICB2b2lkIHNldEV2ZW50TGlzdGVuZXIoQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtRXZlbnRMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHZvaWQgc2V0RXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRLZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1LZXlzQ2hhbmdlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKICAgICB2b2lkIG5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopOwogfTsKIApAQCAtNjIsMjcgKzg2LDc1IEBACiB9OwogCiB2b2lkIERybUxpc3RlbmVyOjpub3RpZnkoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Ci0gICAgaWYgKCFtTGlzdGVuZXIpIHsKKyAgICBpZiAoIW1FdmVudExpc3RlbmVyICYmICFtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyICYmICFtS2V5c0NoYW5nZUxpc3RlbmVyKSB7CisgICAgICAgIEFMT0dFKCJObyBsaXN0ZW5lcnMgYXJlIHNwZWNpZmllZCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgb2JqLT5zZXREYXRhUG9zaXRpb24oMCk7CisKICAgICBBTWVkaWFEcm1TZXNzaW9uSWQgc2Vzc2lvbklkID0ge05VTEwsIDB9OwogICAgIGludDMyX3Qgc2Vzc2lvbklkU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7Ci0gICAgaWYgKHNlc3Npb25JZFNpemUpIHsKLSAgICAgICAgdWludDhfdCAqc2Vzc2lvbklkRGF0YSA9IG5ldyB1aW50OF90W3Nlc3Npb25JZFNpemVdOwotICAgICAgICBzZXNzaW9uSWQucHRyID0gc2Vzc2lvbklkRGF0YTsKLSAgICAgICAgc2Vzc2lvbklkLmxlbmd0aCA9IHNlc3Npb25JZFNpemU7Ci0gICAgICAgIG9iai0+cmVhZChzZXNzaW9uSWREYXRhLCBzZXNzaW9uSWQubGVuZ3RoKTsKKyAgICBpZiAoc2Vzc2lvbklkU2l6ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNlc3Npb24gaWQgc2l6ZSIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW50MzJfdCBkYXRhU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7Ci0gICAgdWludDhfdCAqZGF0YSA9IE5VTEw7Ci0gICAgaWYgKGRhdGFTaXplKSB7Ci0gICAgICAgIGRhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07Ci0gICAgICAgIG9iai0+cmVhZChkYXRhLCBkYXRhU2l6ZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gc2Vzc2lvbklkRGF0YShuZXcgdWludDhfdFtzZXNzaW9uSWRTaXplXSk7CisgICAgc2Vzc2lvbklkLnB0ciA9IHNlc3Npb25JZERhdGEuZ2V0KCk7CisgICAgc2Vzc2lvbklkLmxlbmd0aCA9IHNlc3Npb25JZFNpemU7CisgICAgc3RhdHVzX3QgZXJyID0gb2JqLT5yZWFkKHNlc3Npb25JZERhdGEuZ2V0KCksIHNlc3Npb25JZC5sZW5ndGgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIHNlc3Npb24gaWQsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIHRyYW5zbGF0ZSBEcm1QbHVnaW4gZXZlbnQgdHlwZXMgaW50byB0aGVpciBOREsgZXF1aXZhbGVudHMKKyAgICBpZiAoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRFeHBpcmF0aW9uVXBkYXRlID09IGV2ZW50VHlwZSkgeworICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TID0gb2JqLT5yZWFkSW50NjQoKTsKKyAgICAgICAgaWYgKGV4cGlyeVRpbWVJbk1TID49IDApIHsKKyAgICAgICAgICAgICgqbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwgZXhwaXJ5VGltZUluTVMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGV4cGlyeSB0aW1lLCBzdGF0dXM9JSIgUFJJZDY0ICIiLCBleHBpcnlUaW1lSW5NUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlzQ2hhbmdlID09IGV2ZW50VHlwZSkgeworICAgICAgICBpbnQzMl90IG51bUtleXMgPSAwOworICAgICAgICBlcnIgPSBvYmotPnJlYWRJbnQzMigmbnVtS2V5cyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBudW1iZXIgb2Yga2V5cyBzdGF0dXMsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxBTWVkaWFEcm1LZXlTdGF0dXM+IGtleXNTdGF0dXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+ID4gZGF0YVBvaW50ZXJzOworICAgICAgICBBTWVkaWFEcm1LZXlTdGF0dXMga2V5U3RhdHVzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtS2V5czsgKytpKSB7CisgICAgICAgICAgICBrZXlTdGF0dXMua2V5SWQucHRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5sZW5ndGggPSAwOworICAgICAgICAgICAgaW50MzJfdCBpZFNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKGlkU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBkYXRhKG5ldyB1aW50OF90W2lkU2l6ZV0pOworICAgICAgICAgICAgICAgIGVyciA9IG9iai0+cmVhZChkYXRhLmdldCgpLCBpZFNpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGtleSBkYXRhLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLnB0ciA9IGRhdGEuZ2V0KCk7CisgICAgICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLmxlbmd0aCA9IGlkU2l6ZTsKKyAgICAgICAgICAgICAgICBkYXRhUG9pbnRlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShkYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZXlTdGF0dXMua2V5VHlwZSA9IHN0YXRpY19jYXN0PEFNZWRpYURybUtleVN0YXR1c1R5cGU+KG9iai0+cmVhZEludDMyKCkpOworICAgICAgICAgICAga2V5c1N0YXR1cy5wdXNoKGtleVN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgICAgICgqbUtleXNDaGFuZ2VMaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwga2V5c1N0YXR1cy5hcnJheSgpLCBudW1LZXlzLCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSGFuZGxlcyBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGJlbG93OgorICAgIC8vICB0cmFuc2xhdGVzIERybVBsdWdpbiBldmVudCB0eXBlcyBpbnRvIHRoZWlyIE5ESyBlcXVpdmFsZW50cwogICAgIEFNZWRpYURybUV2ZW50VHlwZSBuZGtFdmVudFR5cGU7CiAgICAgc3dpdGNoKGV2ZW50VHlwZSkgewogICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50UHJvdmlzaW9uUmVxdWlyZWQ6CkBAIC05NywxOSArMTY5LDMwIEBACiAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRWZW5kb3JEZWZpbmVkOgogICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfVkVORE9SX0RFRklORUQ7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25SZWNsYWltZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9TRVNTSU9OX1JFQ0xBSU1FRDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZXZlbnQgRHJtUGx1Z2luOjpFdmVudFR5cGUgJWQsIGlnbm9yZWQiLCAoaW50KWV2ZW50VHlwZSk7Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgKCptTGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIG5ka0V2ZW50VHlwZSwgZXh0cmEsIGRhdGEsIGRhdGFTaXplKTsKLQotIGNsZWFudXA6Ci0gICAgZGVsZXRlIFtdIHNlc3Npb25JZC5wdHI7Ci0gICAgZGVsZXRlIFtdIGRhdGE7CisgICAgaW50MzJfdCBkYXRhU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgdWludDhfdCAqZGF0YSA9IE5VTEw7CisgICAgaWYgKGRhdGFTaXplID4gMCkgeworICAgICAgICBkYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOworICAgICAgICBlcnIgPSBvYmotPnJlYWQoZGF0YSwgZGF0YVNpemUpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAoKm1FdmVudExpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBuZGtFdmVudFR5cGUsIGV4dHJhLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZXZlbnQgZGF0YSwgZXJyb3I9JWQiLCBlcnIpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBbXSBkYXRhOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIHBhcmNlbDogaW52YWxpZCBldmVudCBkYXRhIHNpemU9JWQiLCBkYXRhU2l6ZSk7CisgICAgfQogfQogCi0KIGV4dGVybiAiQyIgewogCiBzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlU3RhdHVzKHN0YXR1c190IHN0YXR1cykgewpAQCAtMTk4LDYgKzI4MSw4IEBACiBBTWVkaWFEcm0qIEFNZWRpYURybV9jcmVhdGVCeVVVSUQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CiAgICAgQU1lZGlhRHJtICptT2JqID0gbmV3IEFNZWRpYURybSgpOwogICAgIG1PYmotPm1Ecm0gPSBDcmVhdGVEcm1Gcm9tVVVJRCh1dWlkKTsKKworICAgIG1PYmotPm1MaXN0ZW5lci5jbGVhcigpOwogICAgIHJldHVybiBtT2JqOwogfQogCkBAIC0yMTYsMTEgKzMwMSw0NyBAQAogICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKICAgICB9Ci0gICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKworICAgIGlmIChtT2JqLT5tTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyLT5zZXRFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworICAgIH0KICAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihtT2JqLT5tTGlzdGVuZXIpOwogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKworICAgIGlmIChtT2JqLT5tTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyLT5zZXRFeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgfQorICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKG1PYmotPm1MaXN0ZW5lcik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKG1PYmotPm1MaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXItPnNldEtleXNDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKyAgICB9CisgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQogCiBzdGF0aWMgYm9vbCBmaW5kSWQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1CeXRlQXJyYXkgJmlkLCBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciAmaXRlcikgewogICAgIGZvciAoaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsgaXRlciAhPSBtT2JqLT5tSWRzLmVuZCgpOyArK2l0ZXIpIHsKQEAgLTMwOSw2ICs0MzAsNyBAQAogICAgIH0KICAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CiAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBtT2JqLT5tS2V5UmVxdWVzdC5jbGVhcigpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCiAgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCwKICAgICAgICAgICAgICZrZXlSZXF1ZXN0VHlwZSk7CkBAIC01NzYsNyArNjk4LDcgQEAKICAgICBWZWN0b3I8dWludDhfdD4gYnl0ZUFycmF5OwogICAgIGJ5dGVBcnJheS5hcHBlbmRBcnJheSh2YWx1ZSwgdmFsdWVTaXplKTsKIAotICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAogICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXkpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggYWM4MzdhMy4uZjY5N2JkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZVByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTQwLDE5ICs0MSw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwotICAgIH0KLQotICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7Ci0gICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwotfQotCiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKICAgICBzcDxBQnVmZmVyPiBtUHNzaEJ1ZjsKQEAgLTgyLDQ3ICs3MCwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5cywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICp2YWx1ZXMpIHsKKworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNyZWF0ZSBodHRwIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OChrZXlzW2ldKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgodmFsdWVzW2ldKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmksIG51bWhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgY29uc3QgY2hhciAqbG9jYXRpb24pIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCBsb2NhdGlvbik7Ci0gICAgLy8gVE9ETzogYWRkIGhlYWRlciBzdXBwb3J0Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOwotICAgIGlmIChlbnYgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZShwYXRoKSBtdXN0IGJlIGNhbGxlZCBmcm9tIEphdmEgdGhyZWFkIik7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpOwotICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhSHR0cFNlcnZpY2UiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLAotICAgICAgICAgICAgImNyZWF0ZUh0dHBTZXJ2aWNlQmluZGVySWZOZWNlc3NhcnkiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyIpOwotICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKLSAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpzdHJpbmcgamxvYyA9IGVudi0+TmV3U3RyaW5nVVRGKGxvY2F0aW9uKTsKLQotICAgIHNlcnZpY2UgPSBlbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobWVkaWFodHRwY2xhc3MsIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCwgamxvYyk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihqbG9jKTsKLQotICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKLSAgICBpZiAoc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgc2VydmljZSk7Ci0gICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBsb2NhdGlvbiwgTlVMTCk7Ci0gICAgZW52LT5FeGNlcHRpb25DbGVhcigpOwotICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhtRGF0YSwgbG9jYXRpb24sIDAsIE5VTEwsIE5VTEwpOwogfQogCiBFWFBPUlQKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IGYzMmI4M2UuLjkyZDNhZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgpAQCAtMzIsMzEgKzMzLDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0cnVjdCBBTWVkaWFGb3JtYXQgewotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIFN0cmluZzggbURlYnVnOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1TdHJpbmdDYWNoZTsKLX07Ci0KIGV4dGVybiAiQyIgewogCi0vLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKGNvbnN0IHZvaWQqIGRhdGEpIHsKLSAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7Ci0gICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKLSAgICBtRGF0YS0+bUZvcm1hdCA9ICooKHNwPEFNZXNzYWdlPiopZGF0YSk7Ci0gICAgaWYgKG1EYXRhLT5tRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImdvdCBOVUxMIGZvcm1hdCIpOwotICAgICAgICBtRGF0YS0+bUZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCkgewotICAgICooKHNwPEFNZXNzYWdlPiopZGVzdCkgPSBtRGF0YS0+bUZvcm1hdDsKLX0KLQotCiAvKgogICogcHVibGljIGZ1bmN0aW9uIGZvbGxvdwogICovCkBAIC03NCw2ICs1MiwyMSBAQAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPmNsZWFyKCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2NvcHkoQU1lZGlhRm9ybWF0ICp0bywgQU1lZGlhRm9ybWF0ICpmcm9tKSB7CisgICAgaWYgKCF0byB8fCAhZnJvbSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICB0by0+bUZvcm1hdC0+Y2xlYXIoKTsKKyAgICB0by0+bUZvcm1hdC0+ZXh0ZW5kKGZyb20tPm1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIAogRVhQT1JUCiBjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0ICptRGF0YSkgewpAQCAtMjU2LDcgKzI0OSw3IEBACiB9CiAKIEVYUE9SVAotdm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIC8vIHRoZSBBQnVmZmVyKHZvaWQqLCBzaXplX3QpIGNvbnN0cnVjdG9yIGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGRhdGEsIHNvIGNyZWF0ZQogICAgIC8vIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0CiAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CkBAIC0yNzUsNjUgKzI2OCwxMTggQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQgPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUgPSAiYWFjLXNici1tb2RlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNID0gImFsYnVtIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUID0gImFsYnVtYXJ0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUID0gImFsYnVtYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCA9ICJhcnRpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gPSAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCA9CisgICAgICAgICJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEID0gImF1ZGlvLXByZXNlbnRhdGlvbi1wcm9ncmFtLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQgPSAiYXVkaW8tc2Vzc2lvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgPSAiYXV0aG9yIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERSA9ICJiaXRyYXRlLW1vZGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUgPSAiYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgPSAiYml0cy1wZXItc2FtcGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSA9ICJjYXB0dXJlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiA9ICJjZHRyYWNrbnVtIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgPSAiY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgPSAiY2hhbm5lbC1tYXNrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCA9ICJjb2xvci1mb3JtYXQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UgPSAiY29sb3ItcmFuZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQgPSAiY29sb3Itc3RhbmRhcmQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIgPSAiY29sb3ItdHJhbnNmZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gPSAiY29tcGlsYXRpb24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSA9ICJjb21wbGV4aXR5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSID0gImNvbXBvc2VyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgPSAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgPSAiY3J5cHRvLWl2IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgPSAiY3J5cHRvLWtleSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSA9ICJjcnlwdG8tbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLID0gImNyeXB0by1za2lwLWJ5dGUtYmxvY2siOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEID0gImNzZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMCA9ICJjc2QtMCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMSA9ICJjc2QtMSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMiA9ICJjc2QtMiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDID0gImNzZC1hdmMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMgPSAiY3NkLWhldmMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyA9ICJkMjYzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RBVEUgPSAiZGF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSID0gImRpc2NudW0iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QID0gImNyb3AiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQgPSAiZGlzcGxheS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCA9ICJkaXNwbGF5LXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OID0gImR1cmF0aW9uVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSA9ICJlbmNvZGVyLWRlbGF5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORyA9ICJlbmNvZGVyLXBhZGRpbmciOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVNEUyA9ICJlc2RzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUID0gImV4aWYtb2Zmc2V0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSA9ICJleGlmLXNpemUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UID0gImZyYW1lLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUgPSAiZnJhbWUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HRU5SRSA9ICJnZW5yZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMgPSAiZ3JpZC1jb2xzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUyA9ICJncmlkLXJvd3MiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPID0gImhkci1zdGF0aWMtaW5mbyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFIxMF9QTFVTX0lORk8gPSAiaGRyMTAtcGx1cy1pbmZvIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCA9ICJoZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUgPSAiaWNjLXByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QgPSAiaW50cmEtcmVmcmVzaC1wZXJpb2QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUyA9ICJpcy1hZHRzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1QgPSAiaXMtYXV0b3NlbGVjdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUID0gImlzLWRlZmF1bHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFID0gImlzLWZvcmNlZC1zdWJ0aXRsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FID0gImlzLXN5bmMtZnJhbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCA9ICJpLWZyYW1lLWludGVydmFsIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFID0gImxhbmd1YWdlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1kgPSAibGF0ZW5jeSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MRVZFTCA9ICJsZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiA9ICJsb2NhdGlvbiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT09QID0gImxvb3AiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgPSAibHlyaWNpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFID0gIm1heC1iaXRyYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUUgPSAibWltZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSA9ICJtcGVnLXVzZXItZGF0YSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSID0gIm1wZWcyLXN0cmVhbS1oZWFkZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUgPSAib3BlcmF0aW5nLXJhdGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HID0gInBjbS1lbmNvZGluZyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSA9ICJwcmlvcml0eSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFID0gInByb2ZpbGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gPSAicGNtLWJpZy1lbmRpYW4iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCA9ICJwc3NoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIgPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OID0gInJvdGF0aW9uLWRlZ3JlZXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgPSAic2FtcGxlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCA9ICJzYXItaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCA9ICJzYXItd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0VJID0gInNlaSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQgPSAic2xpY2UtaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERSA9ICJzdHJpZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgPSAidGFyZ2V0LXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgPSAidGVtcG9yYWwtbGF5ZXItY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQgPSAidGVtcG9yYWwtbGF5ZXItaWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcgPSAidHMtc2NoZW1hIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgPSAidGV4dC1mb3JtYXQtZGF0YSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUID0gInRodW1ibmFpbC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgPSAidGh1bWJuYWlsLXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIID0gInRodW1ibmFpbC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCA9ICJ0aWxlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIID0gInRpbGUtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUyA9ICJ0aW1lVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgPSAidGl0bGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgPSAidHJhY2staWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggPSAidHJhY2staW5kZXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyA9ICJ2YWxpZC1zYW1wbGVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKLQorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjU2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCi0gKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCi0gKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgotICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgotICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgotICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KLSAqLwotCi0jaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Ci12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggZGZmYzRkNy4uZTc5OTI2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM2LDE0ICszNyw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IGY5MzYxMTguLjE1YjM0MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDk5LDcgKzQ5OSwzNCBAQAogICAgICAqIDxwPldoZW4gYW4ge0BsaW5rIEFJbWFnZX0gb2YgdGhpcyBmb3JtYXQgaXMgb2J0YWluZWQgZnJvbSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvcgogICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHplcm8uPC9wPgogICAgICAqLwotICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyCisgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIsCisKKyAgICAvKioKKyAgICAgKiBBbmRyb2lkIFk4IGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlk4IGlzIGEgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBvbmx5LCB3aXRoIGVhY2ggcGl4ZWwKKyAgICAgKiBiZWluZyByZXByZXNlbnRlZCBieSA4IGJpdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgYXNzdW1lcworICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YW4gZXZlbiB3aWR0aDwvbGk+CisgICAgICogPGxpPmFuIGV2ZW4gaGVpZ2h0PC9saT4KKyAgICAgKiA8bGk+YSBob3Jpem9udGFsIHN0cmlkZSBtdWx0aXBsZSBvZiAxNiBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHByZT4gc2l6ZSA9IHN0cmlkZSAqIGhlaWdodCA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGUge0BsaW5rIEFJbWFnZX0gb2JqZWN0IGNhbiBwcm92aWRlIGRhdGEKKyAgICAgKiBpbiB0aGlzIGZvcm1hdCBmcm9tIGEge0BsaW5rIEFDYW1lcmFEZXZpY2V9IChpZiBzdXBwb3J0ZWQpIHRocm91Z2ggYQorICAgICAqIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9iamVjdC4gVGhlIG51bWJlciBvZiBwbGFuZXMgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzfSB3aWxsIGFsd2F5cyBiZSAxLiBUaGUgcGl4ZWwgc3RyaWRlIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlfSB3aWxsIGFsd2F5cyBiZSAxLCBhbmQgdGhlCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZX0gZGVzY3JpYmVkIHRoZSB2ZXJ0aWNhbCBuZWlnaGJvcmluZyBwaXhlbCBkaXN0YW5jZQorICAgICAqIChpbiBieXRlcykgYmV0d2VlbiBhZGphY2VudCByb3dzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfWTggPSAweDIwMjAzODU5CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDY4ZGUxNzYuLmU1ZDg2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtMzcsNiArMzcsOSBAQAogI2RlZmluZSBfTkRLX0lNQUdFX1JFQURFUl9ICiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgpAQCAtNDYxLDYgKzQ2NCwyMyBAQAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcigKICAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIqIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworLyoKKyAqIEdldCB0aGUgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFOYXRpdmVXaW5kb3cgb3duZWQgYnkgdGhlCisgKiBBSW1hZ2VSZWFkZXIgcHJvdmlkZWQuCisgKgorICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgorICogQHBhcmFtIGhhbmRsZSBUaGUgb3V0cHV0IG5hdGl2ZV9oYW5kbGVfdC4gVGhpcyBuYXRpdmUgaGFuZGxlIGlzIG93bmVkIGJ5CisgKiAgICAgICAgICAgICAgIHRoaXMgaW1hZ2UgcmVhZGVyLgorICoKKyAqIEByZXR1cm4gQU1FRElBX09LIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIGlmIHJlYWRlciBvciBoYW5kbGUgYXJlIE5VTEwuCisgKiAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIGlmIHNvbWUgb3RoZXIgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoCisgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qIG91dCAqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAppbmRleCBlYTViYTBjLi4xNmIxZWIzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaApAQCAtNDMsMTQgKzQzLDkgQEAKIC8qCiAgKiBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHRocmVhZAogICogb3IgdGhyZWFkIHBvb2wuIE5vIGd1YXJhbnRlZXMgYXJlIHByb3ZpZGVkIGFib3V0IHdoaWNoIHRocmVhZChzKSB3aWxsIGJlIHVzZWQgZm9yCi0gKiBjYWxsYmFja3MuIEhvd2V2ZXIsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgb25seQotICogZXZlciBiZSBpbnZva2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuCi0gKgotICogVGhlcmUgd2lsbCBiZSBhIHRocmVhZCBzeW5jaHJvbml6YXRpb24gcG9pbnQgYmV0d2VlbiBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoYXQKLSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlIG9mIHlvdXIgQU1lZGlhRGF0YVNvdXJjZSBhcmUgdmlzaWJsZSB0byBmdXR1cmUKLSAqIGNhbGxzLiBUaGlzIG1lYW5zIHlvdSBkb24ndCBuZWVkIHRvIGRvIHlvdXIgb3duIHN5bmNocm9uaXphdGlvbiB1bmxlc3MgeW91J3JlCi0gKiBtb2RpZnlpbmcgdGhlIEFNZWRpYURhdGFTb3VyY2UgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlCi0gKiBmcmFtZXdvcmsuCisgKiBjYWxsYmFja3MuIEZvciBleGFtcGxlLCB8Y2xvc2V8IGNhbiBiZSBpbnZva2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlCisgKiB0aHJlYWQgaW52b2tpbmcgfHJlYWRBdHwuIEFzIHN1Y2gsIHRoZSBJbXBsZW1lbnRhdGlvbnMgb2YgQU1lZGlhRGF0YVNvdXJjZSBjYWxsYmFja3MKKyAqIG11c3QgYmUgdGhyZWFkc2FmZS4KICAqLwogCiAvKioKQEAgLTc0LDkgKzY5LDE5IEBACiB0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSkodm9pZCAqdXNlcmRhdGEpOwogCiAvKioKLSAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCi0gKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgfGNsb3NlfCBpcyBjYWxsZWQKLSAqIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBkYXRhIHNvdXJjZS4KKyAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQKKyAqIHJlc291cmNlcy4KKyAqCisgKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IHxjbG9zZXwgaXMKKyAqIGNhbGxlZCwgbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlIGV4Y2VwdAorICogZm9yIHxjbG9zZXwgaXRzZWxmLgorICoKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBhbGxvd3MgcmVhZEF0IGNhbGxzIHRoYXQgd2VyZSBibG9ja2VkIHdhaXRpbmcKKyAqIGZvciBJL08gZGF0YSB0byByZXR1cm4gcHJvbXB0bHkuCisgKgorICogV2hlbiB1c2luZyBBTWVkaWFEYXRhU291cmNlIGFzIGlucHV0IHRvIEFNZWRpYUV4dHJhY3RvciwgY2xvc2luZworICogaGFzIHRoZSBlZmZlY3Qgb2YgdW5ibG9ja2luZyBzbG93IHJlYWRzIGluc2lkZSBvZiBzZXREYXRhU291cmNlCisgKiBhbmQgcmVhZFNhbXBsZURhdGEuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURhdGFTb3VyY2VDbG9zZSkodm9pZCAqdXNlcmRhdGEpOwogCkBAIC04Niw2ICs5MSwzOCBAQAogICovCiBBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDYWxsZWQgdG8gZ2V0IGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UKKyAqIHN0YXJ0aW5nIGF0IHxvZmZzZXR8IHdpdGhvdXQgYmxvY2tpbmcgZm9yIEkvTy4KKyAqCisgKiBSZXR1cm4gLTEgd2hlbiBzdWNoIGFuIGVzdGltYXRlIGlzIG5vdCBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBkYXRhIHNvdXJjZS4gUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmb3IgdGhlIG5ldyBkYXRhIHNvdXJjZSBvYmplY3QgZmFpbHMuCisgKgorICogU2V0IHRoZSB8dXJpfCBmcm9tIHdoaWNoIHRoZSBkYXRhIHNvdXJjZSB3aWxsIHJlYWQsCisgKiBwbHVzIGFkZGl0aW9uYWwgaHR0cCBoZWFkZXJzIHdoZW4gaW5pdGlhdGluZyB0aGUgcmVxdWVzdC4KKyAqCisgKiBIZWFkZXJzIHdpbGwgY29udGFpbiBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gfGtleV92YWx1ZXN8CisgKiBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgKgorICoga2V5X3ZhbHVlc1swXTprZXlfdmFsdWVzWzFdCisgKiBrZXlfdmFsdWVzWzJdOmtleV92YWx1ZXNbM10KKyAqIC4uLgorICoga2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMl06a2V5X3ZhbHVlc1sobnVtaGVhZGVycyAtIDEpICogMiArIDFdCisgKgorICovCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaShjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogLyoqCiAgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgZGF0YSBzb3VyY2UuCiAgKi8KQEAgLTEzNyw2ICsxNzQsMzAgQEAKIAogI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGZvcgorICogYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSopIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgYnl0ZXMKKyAqIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGRhdGEgc291cmNlIHN0YXJ0aW5nIGF0IGFuIG9mZnNldCB3aXRob3V0CisgKiBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZQorICogZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCmluZGV4IDAyMDk2ODEuLjJlNDM4ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaApAQCAtNTYsNiArNTYsNyBAQAogdHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2NvcGU7CiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlJZDsKIAogdHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CiAgICAgLyoqCkBAIC04MSwxMiArODIsODkgQEAKICAgICAgKiBUaGlzIGV2ZW50IG1heSBpbmRpY2F0ZSBzb21lIHNwZWNpZmljIHZlbmRvci1kZWZpbmVkIGNvbmRpdGlvbiwgc2VlIHlvdXIKICAgICAgKiBEUk0gcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscwogICAgICAqLwotICAgIEVWRU5UX1ZFTkRPUl9ERUZJTkVEID0gNAorICAgIEVWRU5UX1ZFTkRPUl9ERUZJTkVEID0gNCwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgaW5kaWNhdGVzIHRoYXQgYSBzZXNzaW9uIG9wZW5lZCBieSB0aGUgYXBwIGhhcyBiZWVuIHJlY2xhaW1lZAorICAgICAqIGJ5IHRoZSByZXNvdXJjZSBtYW5hZ2VyLgorICAgICAqLworICAgIEVWRU5UX1NFU1NJT05fUkVDTEFJTUVEID0gNSwKIH0gQU1lZGlhRHJtRXZlbnRUeXBlOwogCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9ubGluZSB1c2UsIHRoZXkgd2lsbAorICAgICAqIG5vdCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciBzdWJzZXF1ZW50IHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZAorICAgICAqIHRvIGEgbmV0d29yay4KKyAgICAgKi8KKyAgICBLRVlfVFlQRV9TVFJFQU1JTkcgPSAxLAorCisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9mZmxpbmUgdXNlLCB0aGV5CisgICAgICogd2lsbCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLgorICAgICAqLworICAgIEtFWV9UWVBFX09GRkxJTkUgPSAyLAorCisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHByZXZpb3VzbHkgc2F2ZWQgb2ZmbGluZSBrZXlzIHNob3VsZCBiZSByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBLRVlfVFlQRV9SRUxFQVNFID0gMworfSBBTWVkaWFEcm1LZXlUeXBlOworCisvKioKKyAqICBEYXRhIHR5cGUgY29udGFpbmluZyB7a2V5LCB2YWx1ZX0gcGFpcgorICovCit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm1LZXlWYWx1ZVBhaXIgeworICAgIGNvbnN0IGNoYXIgKm1LZXk7CisgICAgY29uc3QgY2hhciAqbVZhbHVlOworfSBBTWVkaWFEcm1LZXlWYWx1ZTsKKwordHlwZWRlZiBlbnVtIEFNZWRpYUtleVN0YXR1c1R5cGUgeworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX1VTQUJMRSwKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgbm8gbG9uZ2VyIHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBpdHMgZXhwaXJhdGlvbgorICAgICAqIHRpbWUgaGFzIHBhc3NlZC4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfRVhQSVJFRCwKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgbm90IGN1cnJlbnRseSB1c2FibGUgdG8gZGVjcnlwdCBtZWRpYSBkYXRhIGJlY2F1c2UgaXRzIG91dHB1dAorICAgICAqIHJlcXVpcmVtZW50cyBjYW5ub3QgY3VycmVudGx5IGJlIG1ldC4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfT1VUUFVUTk9UQUxMT1dFRCwKKworICAgIC8qKgorICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGtleSBpcyBub3QgeWV0IGtub3duIGFuZCBpcyBiZWluZyBkZXRlcm1pbmVkLgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9TVEFUVVNQRU5ESU5HLAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBub3QgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBvZiBhbgorICAgICAqIGludGVybmFsIGVycm9yIGluIHByb2Nlc3NpbmcgdW5yZWxhdGVkIHRvIGlucHV0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX0lOVEVSTkFMRVJST1IsCisKK30gQU1lZGlhRHJtS2V5U3RhdHVzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5U3RhdHVzIHsKKyAgICBBTWVkaWFEcm1LZXlJZCBrZXlJZDsKKyAgICBBTWVkaWFEcm1LZXlTdGF0dXNUeXBlIGtleVR5cGU7Cit9IEFNZWRpYURybUtleVN0YXR1czsKKwogdHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7CiAKK3R5cGVkZWYgdm9pZCAoKkFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcikoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLCBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyKShBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGNvbnN0IEFNZWRpYURybUtleVN0YXR1cyAqa2V5U3RhdHVzLAorICAgICAgICBzaXplX3QgbnVtS2V5cywgYm9vbCBoYXNOZXdVc2FibGVLZXkpOworCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKIC8qKgpAQCAtMTIwLDYgKzE5OCwyMiBAQAogICAgICAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV4cGlyYXRpb24gdXBkYXRlIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBzdGF0dXMgY2hhbmdlIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCiAgKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgogICoKICAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKQEAgLTEzNSwzNCArMjI5LDYgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosCiAgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi10eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvbmxpbmUgdXNlLCB0aGV5IHdpbGwKLSAgICAgKiBub3QgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3Igc3Vic2VxdWVudCB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQKLSAgICAgKiB0byBhIG5ldHdvcmsuCi0gICAgICovCi0gICAgS0VZX1RZUEVfU1RSRUFNSU5HID0gMSwKLQotICAgIC8qKgotICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvZmZsaW5lIHVzZSwgdGhleQotICAgICAqIHdpbGwgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3IgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KLSAgICAgKi8KLSAgICBLRVlfVFlQRV9PRkZMSU5FID0gMiwKLQotICAgIC8qKgotICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCBwcmV2aW91c2x5IHNhdmVkIG9mZmxpbmUga2V5cyBzaG91bGQgYmUgcmVsZWFzZWQuCi0gICAgICovCi0gICAgS0VZX1RZUEVfUkVMRUFTRSA9IDMKLX0gQU1lZGlhRHJtS2V5VHlwZTsKLQotLyoqCi0gKiAgRGF0YSB0eXBlIGNvbnRhaW5pbmcge2tleSwgdmFsdWV9IHBhaXIKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5VmFsdWVQYWlyIHsKLSAgICBjb25zdCBjaGFyICptS2V5OwotICAgIGNvbnN0IGNoYXIgKm1WYWx1ZTsKLX0gQU1lZGlhRHJtS2V5VmFsdWU7Ci0KIC8qKgogICogQSBrZXkgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIGxpY2Vuc2Ugc2VydmVyCiAgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAppbmRleCA3NWY0NjA1Li4yYmUxZDZlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCkBAIC02Myw2ICs2Myw3IEBACiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKICAgICBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA2LAogICAgIEFNRURJQV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gOCwKIAogICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCiAgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCA2YTE3OTZmLi5lM2Q5ZmU2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTcyLDcgKzcyLDYgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwKICAgICAgICAgY29uc3QgY2hhciAqbG9jYXRpb24pIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggNWY3ODA0ZC4uMjU1MTIyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC04MywxMyArODMsOSBAQAogLyoqCiAgKiBUaGUgcHJvdmlkZWQgZGF0YSBpcyBjb3BpZWQgaW50byB0aGUgZm9ybWF0LgogICovCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAotCi0vKioKLSAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/Ci0gKi8KIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiBfX0lOVFJPRFVDRURfSU4oMjgpOwpAQCAtMTU2LDcgKzE1Miw2IEBACiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0KICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOApAQCAtMTcwLDYgKzE2NSw3MiBAQAogICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiByZW1vdmUgYWxsIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBnaXZlbiBBTWVkaWFGb3JtYXQKKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBjb3B5IG9uZSBBTWVkaWFGb3JtYXQgdG8gYW5vdGhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfY29weShBTWVkaWFGb3JtYXQgKnRvLCBBTWVkaWFGb3JtYXQgKmZyb20pIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0QyNjMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVkgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVNEUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QU1NIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAppbmRleCAxNzNlN2I0Li5jNTAwODRlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAorKysgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dApAQCAtNCw2ICs0LDcgQEAKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZUxhdGVzdEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jOyAjIGludHJvZHVjZWQ9MjYKKyAgICBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlOyAjdm5kawogICAgIEFJbWFnZVJlYWRlcl9kZWxldGU7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9nZXRGb3JtYXQ7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9nZXRIZWlnaHQ7ICMgaW50cm9kdWNlZD0yNApAQCAtMzQsNjQgKzM1LDExNCBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU07ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTzsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVI7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVY7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0s7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzA7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9HRU5SRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1M7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0Q7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0U7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1k7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9PUDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUklPUklUWTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfUFNTSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1A7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1NFSTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TVFJJREU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USVRMRTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVM7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1lFQVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50OyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlOwpAQCAtMTQyLDYgKzE5Myw5IEBACiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplOyAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQ7ICAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmk7ICAgICAgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZTsgICAgICAgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplOyAjIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFEcm1fY2xvc2VTZXNzaW9uOwogICAgIEFNZWRpYURybV9jcmVhdGVCeVVVSUQ7CiAgICAgQU1lZGlhRHJtX2RlY3J5cHQ7CkBAIC0xNjMsNiArMjE3LDggQEAKICAgICBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyOwogICAgIEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheTsKICAgICBBTWVkaWFEcm1fc2V0UHJvcGVydHlTdHJpbmc7CisgICAgQU1lZGlhRHJtX3NldE9uRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXI7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9zaWduOwogICAgIEFNZWRpYURybV92ZXJpZnk7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2U7CkBAIC0xODYsNiArMjQyLDggQEAKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZDsKICAgICBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjazsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXI7ICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYUZvcm1hdF9jb3B5OyAjIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlOwogICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXI7CiAgICAgQU1lZGlhRm9ybWF0X2dldERvdWJsZTsgIyBpbnRyb2R1Y2VkPTI4CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwZmY2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8TmRrSW1hZ2VSZWFkZXJQcml2Lmg+CisjaW5jbHVkZSA8dm5kay9oYXJkd2FyZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFpbWc6OkFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZTsKKwordHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7Cit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtJbWFnZUJ1ZmZlclVzYWdlID0KKyAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX09GVEVOOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0ltYWdlV2lkdGggPSA2NDA7CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1JHQkFfODg4ODsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhJbWFnZXMgPSAxOworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1F1ZXVlQnVmZmVySW5wdXRUaW1lU3RhbXAgPSAxMzg0ODg4NjExOworc3RhdGljIGNvbnN0ZXhwciBib29sIGtRdWV1ZUJ1ZmZlcklucHV0SXNBdXRvVGltZVN0YW1wID0gZmFsc2U7CitzdGF0aWMgY29uc3RleHByIGFuZHJvaWRfZGF0YXNwYWNlIGtRdWV1ZUJ1ZmZlcklucHV0RGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworc3RhdGljIGNvbnN0IFJlY3Qga1F1ZXVlQnVmZmVySW5wdXRSZWN0ID0gUmVjdChrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0KTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtRdWV1ZUJ1ZmZlcklucHV0U2NhbGluZ01vZGUgPSAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0gPSAwOworc3RhdGljIGNvbnN0IHNwPEZlbmNlPiBrUXVldWVCdWZmZXJJbnB1dEZlbmNlID0gRmVuY2U6Ok5PX0ZFTkNFOworCitzdGF0aWMgY29uc3RleHByIGludCBrT25JbWFnZUF2YWlsYWJsZVdhaXRVcyA9IDEwMCAqIDEwMDA7CisKK2NsYXNzIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQsIGtJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VCdWZmZXJVc2FnZSAsIGtNYXhJbWFnZXMsICZpbWFnZVJlYWRlcl8pOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgQVNTRVJUX05FKGltYWdlUmVhZGVyXywgbnVsbHB0cik7CisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlUmVhZGVyQXZhaWxhYmxlQ2JfKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihpbWFnZVJlYWRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlUmVhZGVyRGV0YWNoZWRDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgIH0KKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoaW1hZ2VSZWFkZXJfKSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKGltYWdlUmVhZGVyXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEhhbmRsZUltYWdlQXZhaWxhYmxlKCkgeworICAgICAgICBBSW1hZ2UgKm91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQU1FRElBX09LOworICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFtdKEFJbWFnZSAqaW1nKSB7IEFJbWFnZV9kZWxldGUoaW1nKTsgfTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFJbWFnZSwgZGVjbHR5cGUoaW1hZ2VEZWxldGVyKT4gaW1nKG51bGxwdHIsIGltYWdlRGVsZXRlcik7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBpbWFnZSBjYW4gYmUgYWNxdWlyZWQuCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlKGltYWdlUmVhZGVyXywgJm91dEltYWdlKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgaW1nLnJlc2V0KG91dEltYWdlKTsKKyAgICAgICAgQVNTRVJUX05FKGltZywgbnVsbHB0cik7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHdlIGNhbiBnZXQgYSBoYW5kbGUgdG8gdGhlIGltYWdlJ3MgaGFyZHdhcmUgYnVmZmVyIGFuZCBhCisgICAgICAgIC8vIG5hdGl2ZSBoYW5kbGUgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlciAqaGFyZHdhcmVCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmaGFyZHdhcmVCdWZmZXIpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBBU1NFUlRfTkUoaGFyZHdhcmVCdWZmZXIsIG51bGxwdHIpOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oID0gQUhhcmR3YXJlQnVmZmVyX2dldE5hdGl2ZUhhbmRsZShoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9ORShuaCwgbnVsbHB0cik7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgICAgIGltYWdlQXZhaWxhYmxlXyA9IHRydWU7CisgICAgICAgIGltYWdlQ29uZFZhcl8ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uSW1hZ2VBdmFpbGFibGUodm9pZCAqY29udGV4dCwgQUltYWdlUmVhZGVyICpyZWFkZXIpIHsKKyAgICAgICAgKHZvaWQpcmVhZGVyOworICAgICAgICBBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0ICp0aGlzQ29udGV4dCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKj4oY29udGV4dCk7CisgICAgICAgIHRoaXNDb250ZXh0LT5IYW5kbGVJbWFnZUF2YWlsYWJsZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uQnVmZmVyUmVtb3ZlZCh2b2lkICosIEFJbWFnZVJlYWRlciAqLCBBSGFyZHdhcmVCdWZmZXIgKikgeworICAgIH0KKworICAgIEFJbWFnZVJlYWRlciAqaW1hZ2VSZWFkZXJfID0gbnVsbHB0cjsKKyAgICBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciBpbWFnZVJlYWRlckF2YWlsYWJsZUNiX3t0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIGltYWdlUmVhZGVyRGV0YWNoZWRDYl97dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKKyAgICBzdGQ6Om11dGV4IGltYWdlQXZhaWxhYmxlTXV0ZXhfOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGltYWdlQ29uZFZhcl87CisgICAgYm9vbCBpbWFnZUF2YWlsYWJsZV8gPSBmYWxzZTsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxSR0JBOEJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICAgIGNvbnN0IHNpemVfdCBQSVhFTF9TSVpFID0gNDsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gKHkgKiBzdHJpZGUgKyB4KSAqIFBJWEVMX1NJWkU7CisgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworICAgICAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gKDEgPDwgKGMrMikpKSAmIDE7CisgICAgICAgICAgICAgICAgYnVmW29mZnNldCArIGNdID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDIzMSA6IDM1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgLy8gQUltYWdlUmVhZGVyLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaW1hZ2VSZWFkZXJfLCAmbmgpOworICAgIEFTU0VSVF9ORShuaCwgbnVsbHB0cik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBvbmx5IGludHMgaW4gdGhlIGhhbmRsZS4KKyAgICBBU1NFUlRfRVEobmgtPm51bUZkcywgMCk7CisgICAgQVNTRVJUX05FKG5oLT5udW1JbnRzLCAwKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIEhHQlAgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBoYW5kbGUuCisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9ICBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUobmgpOworICAgIEFTU0VSVF9ORShoZ2JwLCBudWxscHRyKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihoZ2JwKTsKKyAgICBpbnQgZGVxdWV1ZWRTbG90ID0gLTE7CisgICAgc3A8RmVuY2U+IGRlcXVldWVkRmVuY2U7CisgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgb3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+Y29ubmVjdChudWxscHRyLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUsIGZhbHNlLCAmb3V0cHV0KSk7CisKKyAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGRlcXVldWUgYSBidWZmZXIuCisgICAgQVNTRVJUX0VRKE9LLAorICAgICAgICAgICAgICB+SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiAmCisgICAgICAgICAgICAgICAgICAgICAgKGlnYnAtPmRlcXVldWVCdWZmZXIoJmRlcXVldWVkU2xvdCwgJmRlcXVldWVkRmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VGb3JtYXQsIGtJbWFnZUJ1ZmZlclVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpKSk7CisgICAgRVhQRUNUX0xFKDAsIGRlcXVldWVkU2xvdCk7CisgICAgRVhQRUNUX0dUKEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTLCBkZXF1ZXVlZFNsb3QpOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZGVxdWV1ZWRCdWZmZXI7CisgICAgaWdicC0+cmVxdWVzdEJ1ZmZlcihkZXF1ZXVlZFNsb3QsICZkZXF1ZXVlZEJ1ZmZlcik7CisgICAgdWludDhfdCogaW1nID0gbnVsbHB0cjsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT5sb2NrKGtJbWFnZUJ1ZmZlclVzYWdlLCAodm9pZCoqKSgmaW1nKSkpOworCisgICAgLy8gV3JpdGUgaW4gc29tZSBkdW1teSBpbWFnZSBkYXRhLgorICAgIGZpbGxSR0JBOEJ1ZmZlcihpbWcsIGRlcXVldWVkQnVmZmVyLT5nZXRXaWR0aCgpLCBkZXF1ZXVlZEJ1ZmZlci0+Z2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgIGRlcXVldWVkQnVmZmVyLT5nZXRTdHJpZGUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkZXF1ZXVlZEJ1ZmZlci0+dW5sb2NrKCkpOworICAgIFF1ZXVlQnVmZmVySW5wdXQgcXVldWVCdWZmZXJJbnB1dChrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RGF0YXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0U2NhbGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0VHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dEZlbmNlKTsKKyAgICBRdWV1ZUJ1ZmZlck91dHB1dCBxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICBBU1NFUlRfRVEoT0ssIGlnYnAtPnF1ZXVlQnVmZmVyKGRlcXVldWVkU2xvdCwgcXVldWVCdWZmZXJJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWV1ZUJ1ZmZlck91dHB1dCkpOworICAgIC8vIHdhaXQgdW50aWwgdGhlIG9uSW1hZ2VBdmFpbGFibGUgY2FsbGJhY2sgaXMgY2FsbGVkLCBvciB0aW1lb3V0IGNvbXBsZXRlcy4KKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW1hZ2VBdmFpbGFibGVNdXRleF8pOworICAgIGltYWdlQ29uZFZhcl8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrT25JbWFnZUF2YWlsYWJsZVdhaXRVcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc117IHJldHVybiB0aGlzLT5pbWFnZUF2YWlsYWJsZV87fSk7CisgICAgRVhQRUNUX1RSVUUoaW1hZ2VBdmFpbGFibGVfKSA8PCAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbWFnZSBkYXRhIHRvIGJlIGhhbmRsZWQhXG4iOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuY3BwIGIvbWVkaWEvdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5N2MzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL0h5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWltZyB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKKworc3RhdGljIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGNvbnZlcnROYXRpdmVIYW5kbGVUb0hHQlAgKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgeworICAgIC8vIFJlYWQgdGhlIHNpemUgb2YgdGhlIGhhbFRva2VuIHZlYzx1aW50OF90PgorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihjb25zdF9jYXN0PGludCAqPigmKGhhbmRsZS0+ZGF0YVsxXSkpKSwKKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdKTsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0KKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKKyAgICByZXR1cm4gaGdicDsKK30KKworc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKAorICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoaGFuZGxlLT5udW1GZHMgIT0gMCAgfHwKKyAgICAgICAgaGFuZGxlLT5udW1JbnRzIDwgc3RkOjpjZWlsKHNpemVvZihzaXplX3QpIC8gc2l6ZW9mKGludCkpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUChoYW5kbGUpOworfQorCit9IC8vbmFtZXNwYWNlIGFpbWcKK30gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggZDZkYWU1Yi4uYjA1ZTAyMiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCkBAIC0xNiwyNSArMTYsNDAgQEAKICAgICBuYW1lOiAibGlibWVkaWF1dGlscyIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBSW1hZ2VSZWFkZXJVdGlscy5jcHAiLAogICAgICAgICAiQmF0dGVyeU5vdGlmaWVyLmNwcCIsCiAgICAgICAgICJJU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lbW9yeUxlYWtUcmFja1V0aWwuY3BwIiwKICAgICAgICAgIlByb2Nlc3NJbmZvLmNwcCIsCiAgICAgICAgICJTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAorICAgICAgICAiU2VydmljZVV0aWxpdGllcy5jcHAiLAorICAgICAgICAiVGltZUNoZWNrLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgXSwKIAorICAgIGxvZ3RhZ3M6IFsiRXZlbnRMb2dUYWdzLmxvZ3RhZ3MiXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgcHJvZHVjdF9pc19pb3Q6IHsKKyAgICAgICAgICAgIGNmbGFnczogWyItRFRBUkdFVF9BTkRST0lEX1RISU5HUyJdLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MgYi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2YwZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKQEAgLTAsMCArMSw0MSBAQAorIyBUaGUgZW50cmllcyBpbiB0aGlzIGZpbGUgbWFwIGEgc3BhcnNlIHNldCBvZiBsb2cgdGFnIG51bWJlcnMgdG8gdGFnIG5hbWVzLgorIyBUaGlzIGlzIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLCBpbiAvc3lzdGVtL2V0YywgYW5kIHBhcnNlZCBieSBsb2djYXQuCisjCisjIFRhZyBudW1iZXJzIGFyZSBkZWNpbWFsIGludGVnZXJzLCBmcm9tIDAgdG8gMl4zMS4gIChMZXQncyBsZWF2ZSB0aGUKKyMgbmVnYXRpdmUgdmFsdWVzIGFsb25lIGZvciBub3cuKQorIworIyBUYWcgbmFtZXMgYXJlIG9uZSBvciBtb3JlIEFTQ0lJIGxldHRlcnMgYW5kIG51bWJlcnMgb3IgdW5kZXJzY29yZXMsIGkuZS4KKyMgIltBLVpdW2Etel1bMC05XV8iLiAgRG8gbm90IGluY2x1ZGUgc3BhY2VzIG9yIHB1bmN0dWF0aW9uICh0aGUgZm9ybWVyCisjIGltcGFjdHMgbG9nIHJlYWRhYmlsaXR5LCB0aGUgbGF0dGVyIG1ha2VzIHJlZ2V4IHNlYXJjaGVzIG1vcmUgYW5ub3lpbmcpLgorIworIyBUYWcgbnVtYmVycyBhbmQgbmFtZXMgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgQmxhbmsgbGluZXMgYW5kIGxpbmVzCisjIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBpZ25vcmVkLgorIworIyBPcHRpb25hbGx5LCBhZnRlciB0aGUgdGFnIG5hbWVzIGNhbiBiZSBwdXQgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIHZhbHVlKHMpCisjIG9mIHRoZSB0YWcuIERlc2NyaXB0aW9uIGFyZSBpbiB0aGUgZm9ybWF0CisjICAgICg8bmFtZT58ZGF0YSB0eXBlW3xkYXRhIHVuaXRdKQorIyBNdWx0aXBsZSB2YWx1ZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMuCisjCisjIFRoZSBkYXRhIHR5cGUgaXMgYSBudW1iZXIgZnJvbSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyMgMTogaW50CisjIDI6IGxvbmcKKyMgMzogc3RyaW5nCisjIDQ6IGxpc3QKKyMKKyMgVGhlIGRhdGEgdW5pdCBpcyBhIG51bWJlciB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyMgMTogTnVtYmVyIG9mIG9iamVjdHMKKyMgMjogTnVtYmVyIG9mIGJ5dGVzCisjIDM6IE51bWJlciBvZiBtaWxsaXNlY29uZHMKKyMgNDogTnVtYmVyIG9mIGFsbG9jYXRpb25zCisjIDU6IElkCisjIDY6IFBlcmNlbnQKKyMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KKyMKKyMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisKKyMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKKworNjEwMDAgYXVkaW9zZXJ2ZXJfYmluZGVyX3RpbWVvdXQgKGNvbW1hbmR8MykKKworIyBOT1RFIC0gdGhlIHJhbmdlIDEwMDAwMDAtMjAwMDAwMCBpcyByZXNlcnZlZCBmb3IgcGFydG5lcnMgYW5kIG90aGVycyB3aG8KKyMgd2FudCB0byBkZWZpbmUgdGhlaXIgb3duIGxvZyB0YWdzIHdpdGhvdXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgY29yZSBwbGF0Zm9ybS4KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1NGFlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTZXJ2aWNlVXRpbGl0aWVzIgorCisjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIgorCisvKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgorICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAorICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQorICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKKyAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCisgKi8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKKworc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOworICAgIH0KKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgorICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCisgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucworICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KKyAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKKyAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCisgICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKKyAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKyAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZXNbMF07Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworCisgICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCisgICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCisgICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhcHBPcHMubm90ZU9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyBmYWxzZSk7Cit9CisKK2Jvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gdHJ1ZSk7Cit9CisKK3ZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKKyAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuOworCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAorICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7CisgICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7CisgICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOworICAgIGFwcE9wcy5maW5pc2hPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpOworfQorCitib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgorICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOworCisgICAgaWYgKG9rKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOworICAgIH0KKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7CisgICAgLy8gZ2l2ZW4gdGhpcyBpcyBhIHBlcm1pc3Npb24gY2hlY2ssIGNvdWxkIHRoaXMgYmUgaXNBdWRpb1NlcnZlck9yUm9vdFVpZCgpPworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoCisgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKTsKKworI2lmZGVmIFRBUkdFVF9BTkRST0lEX1RISU5HUworICAgIGlmICghb2spIHsKKyAgICAgICAgLy8gVXNlIGEgc2Vjb25kYXJ5IHBlcm1pc3Npb24gb24gQW5kcm9pZCBUaGluZ3MgdG8gYWxsb3cgYSBtb3JlIGxlbmllbnQgbGV2ZWwgb2YgcHJvdGVjdGlvbi4KKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQW5kcm9pZFRoaW5nc0FsbG93ZWQoCisgICAgICAgICAgICAgICAgImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQW5kcm9pZFRoaW5nc0FsbG93ZWQpOworICAgIH0KKyAgICBpZiAoIW9rKSBBTE9HRSgiY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyNlbHNlCisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisjZW5kaWYKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgZHVtcEFsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7CisgICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQorICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CisgICAgcmV0dXJuIG9rOworfQorCitzdGF0dXNfdCBjaGVja0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpCit7CisgICAgaWYgKGlNZW1vcnkgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBOVUxMIElNZW1vcnkgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBpTWVtb3J5LT5nZXRNZW1vcnkoKTsKKyAgICBpZiAoaGVhcCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IE5VTEwgaGVhcCBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBvZmZfdCBzaXplID0gbHNlZWsoaGVhcC0+Z2V0SGVhcElEKCksIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhoZWFwLT5nZXRIZWFwSUQoKSwgMCwgU0VFS19TRVQpOworCisgICAgaWYgKGlNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMIHx8IHNpemUgPCAob2ZmX3QpaU1lbW9yeS0+c2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IHBvaW50ZXIgJXAgc2l6ZSAlenUgZmQgc2l6ZSAldSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaU1lbW9yeS0+cG9pbnRlcigpLCBpTWVtb3J5LT5zaXplKCksICh1aW50MzJfdClzaXplKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2Y0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9FdmVudExvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKKyAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCisgICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoreworfQorCitUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7CisgICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK25zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7CisgICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7CisgICAgbUNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIGVuZFRpbWVOczsKK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOworICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworCisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKKyAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0CisgICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOworICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOworICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HX0VWRU5UX1NUUklORyhMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQsIHRhZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUlNQUdFX1JFQURFUl9VVElMU19ICisjZGVmaW5lIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFJldHJpZXZlcyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hdGl2ZV9oYW5kbGVfdAorLy8gcHJvdmlkZWQgKHRoaXMgbmF0aXZlIGhhbmRsZSBNVVNUIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKCkpLgorc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKTsKKworfS8vIG5hbWVzcGFjZSBhaW1nCit9Ly8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQUlNQUdFX1JFQURFUl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1M2QzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKyNkZWZpbmUgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBrZWVwIHZhbHVlcyBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9hdi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncworZW51bSB7CisgIExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCA9IDYxMDAwLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmNTRjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEF1ZGlvIHBlcm1pc3Npb24gdXRpbGl0aWVzCisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tIHN5c3RlbSBzZXJ2aWNlcy4KKy8vIFdlIGFsbG93IHRoYXQgc29tZSBzZXJ2aWNlcyBtaWdodCBoYXZlIHNlcGFyYXRlIHByb2Nlc3NlcyB0bworLy8gaGFuZGxlIG11bHRpcGxlIHVzZXJzLCBlLmcuIHUxMF9zeXN0ZW0sIHUxMF9ibHVldG9vdGgsIHUxMF9yYWRpby4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPCBBSURfQVBQX1NUQVJUOworfQorCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBhdWRpb3NlcnZlci4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiB1aWQgPT0gQUlEX0FVRElPU0VSVkVSOworfQorCisvLyBVc2VkIGZvciBzb21lIHBlcm1pc3Npb24gY2hlY2tzLgorLy8gQUlEX1JPT1QgaXMgT0sgZm9yIGNvbW1hbmQtbGluZSB0ZXN0cy4gIE5hdGl2ZSBhdWRpb3NlcnZlciBhbHdheXMgT0suCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gdWlkID09IEFJRF9BVURJT1NFUlZFUiB8fCB1aWQgPT0gQUlEX1JPT1Q7Cit9CisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIGNvbWUgZnJvbSBzeXN0ZW0gc2VydmVyIG9yIGludGVybmFsLgorLy8gTm90ZTogc3lzdGVtIHNlcnZlciBpcyBtdWx0aXByb2Nlc3MgZm9yIG11bHRpcGxlIHVzZXJzLiAgYXVkaW9zZXJ2ZXIgaXMgbm90Lgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA9PSBBSURfU1lTVEVNIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVI7Cit9CisKKy8vIE1lZGlhc2VydmVyIG1heSBmb3J3YXJkIHRoZSBjbGllbnQgUElEIGFuZCBVSUQgYXMgcGFydCBvZiBhIGJpbmRlciBpbnRlcmZhY2UgY2FsbDsKKy8vIG90aGVyd2lzZSB0aGUgY2FsbGluZyBVSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xpZW50IFVJRC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICBzd2l0Y2ggKHVpZCkgeworICAgIGNhc2UgQUlEX01FRElBOgorICAgIGNhc2UgQUlEX0FVRElPU0VSVkVSOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK3ZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Citib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKTsKK2Jvb2wgZHVtcEFsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKcmVuYW1lIHRvIG1lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmOWRjNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIHBhY2thZ2UgaXMgZXhjbHVkZWQgZnJvbSBidWlsZCBmb3Igbm93IHNpbmNlIEFQSXMgdXNpbmcgdGhpcyBhcGsgYmVjYW1lIGhpZGRlbi4KLSMKLSNMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0jaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkgIyBCdWlsZCBNZWRpYUNvbXBvbmVudHMgb25seSBpZiB0aGlzIGlzIG5vdCBhIFBESyBidWlsZC4gIE1lZGlhQ29tcG9uZW50cyB3b24ndAotIyMgYnVpbGQgaW4gUERLIGJ1aWxkcyBiZWNhdXNlIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEgaXMgbm90IGF2YWlsYWJsZSBidXQKLSMjIElNZWRpYVNlc3Npb24yLmFpZGwgYW5kIElNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYXJlIHVzaW5nIGNsYXNzZXMgZnJvbQotIyMgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS4KLSMKLSNpbmNsdWRlICQoQ0xFQVJfVkFSUykKLSMKLSNMT0NBTF9QQUNLQUdFX05BTUUgOj0gTWVkaWFDb21wb25lbnRzCi0jTE9DQUxfTU9EVUxFX09XTkVSIDo9IGdvb2dsZQotIwotIyMgVE9ETzogY3JlYXRlIGEgc2VwYXJhdGUga2V5IGZvciB0aGlzIHBhY2thZ2UuCi0jTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLSMKLSMjIFRPRE86IFVzZSBTeXN0ZW0gU0RLIG9uY2UgcHVibGljIEFQSXMgYXJlIGFwcHJvdmVkCi0jIyBMT0NBTF9TREtfVkVSU0lPTiA6PSBzeXN0ZW1fY3VycmVudAotI0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCi0jCi0jTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSMgICAgJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpIFwKLSMgICAgJChjYWxsIGFsbC1JYWlkbC1maWxlcy11bmRlciwgc3JjKQotIwotI0xPQ0FMX1BST0dVQVJEX0ZMQUdfRklMRVMgOj0gcHJvZ3VhcmQuY2ZnCi0jCi0jTE9DQUxfTVVMVElMSUIgOj0gZmlyc3QKLSMKLSNMT0NBTF9KQVZBX0xJQlJBUklFUyArPSBhbmRyb2lkLXN1cHBvcnQtYW5ub3RhdGlvbnMKLSMKLSMjIFRvIGVtYmVkIG5hdGl2ZSBsaWJyYXJpZXMgaW4gcGFja2FnZSwgdW5jb21tZW50IHRoZSBsaW5lcyBiZWxvdy4KLSMjTE9DQUxfTU9EVUxFX1RBR1MgOj0gc2FtcGxlcwotIyNMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0jIyAgICBsaWJhYWNleHRyYWN0b3IgXAotIyMgICAgbGliYW1yZXh0cmFjdG9yIFwKLSMjICAgIGxpYmZsYWNleHRyYWN0b3IgXAotIyMgICAgbGlibWlkaWV4dHJhY3RvciBcCi0jIyAgICBsaWJta3ZleHRyYWN0b3IgXAotIyMgICAgbGlibXAzZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wNGV4dHJhY3RvciBcCi0jIyAgICBsaWJtcGVnMmV4dHJhY3RvciBcCi0jIyAgICBsaWJvZ2dleHRyYWN0b3IgXAotIyMgICAgbGlid2F2ZXh0cmFjdG9yIFwKLSMKLSMjIFRPRE86IFJlbW92ZSBkZXBlbmRlbmN5IHdpdGggb3RoZXIgc3VwcG9ydCBsaWJyYXJpZXMuCi0jTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTICs9IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY0IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY3LWFwcGNvbXBhdCBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1wYWxldHRlCi0jTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKLSMKLSNpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKLSMKLSNlbmRpZiAgIyBpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQotIwotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZmRjYTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUiCi0gICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKLSAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiID4KLQotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBDb21wb25lbnRzIFVwZGF0ZSIKLSAgICAgICAgYW5kcm9pZDptdWx0aUFyY2g9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOmV4dHJhY3ROYXRpdmVMaWJzPSJmYWxzZSI+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L0FuZHJvaWQuYnAgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWViNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDEgQEAKK2ZpbGVncm91cCB7CisgICAgbmFtZTogIm1lZGlhX2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS8qKi8qLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL3NlcnZpY2UvKiovKi5haWRsIiwKKyAgICBdLAorICAgIGV4Y2x1ZGVfc3JjczogWworICAgICAgICAvLyBFeGNsdWRlIHRoZXNlIGFpZGxzIHRvIGF2b2lkIGVycm9ycyBzdWNoIGFzCisgICAgICAgIC8vICJSZWZ1c2luZyB0byBnZW5lcmF0ZSBjb2RlIHdpdGggdW5zdHJ1Y3R1cmVkIHBhcmNlbGFibGVzLiIKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyaXB0aW9uLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuYWlkbCIsCisgICAgICAgIC8vIFRPRE8oaW5zdW4pOiBjaGVjayB3aHkgTWVkaWFQYXJjZWxlZExpc3RTbGljZS5haWRsIHNob3VsZCBiZSBhZGRlZCBoZXJlCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQYXJjZWxlZExpc3RTbGljZS5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuYWlkbCIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3Nlci5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5haWRsIiwKKyAgICAgICAgImphdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmFpZGwiLAorICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGxheWJhY2tTdGF0ZS5haWRsIiwKKyAgICBdLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJtZWRpYSIsCisgICAgaW5zdGFsbGFibGU6IHRydWUsCisgICAgc2RrX3ZlcnNpb246ICJzeXN0ZW1fY3VycmVudCIsCisgICAgc3JjczogWworICAgICAgICAiamF2YS9hbmRyb2lkL21lZGlhLyoqLyouamF2YSIsCisgICAgICAgICJqYXZhL2FuZHJvaWQvc2VydmljZS8qKi8qLmphdmEiLAorICAgICAgICAiOm1lZGlhX2FpZGwiLAorICAgICAgICAiOmZyYW1ld29yay1tZWRpYS1hbm5vdGF0aW9uLXNyY3MiLAorICAgIF0sCisgICAgYWlkbDogeworICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiamF2YSJdLAorICAgICAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIiwKKyAgICAgICAgICAgIC8vIGZvciBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcAorICAgICAgICAgICAgLy8gZnJvbSBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrCisgICAgICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2dyYXBoaWNzL2phdmEiLAorICAgICAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lSZW1vdGVWb2x1bWVDb250cm9sbGVyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvSVJlbW90ZVZvbHVtZUNvbnRyb2xsZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGE0YTQyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL0lSZW1vdGVWb2x1bWVDb250cm9sbGVyLmFpZGwKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JU2Vzc2lvbkNvbnRyb2xsZXI7CisKKy8qKgorICogQUlETCBmb3IgdGhlIE1lZGlhU2Vzc2lvblNlcnZpY2UgdG8gcmVwb3J0IGludGVyZXN0aW5nIGV2ZW50cyBvbiByZW1vdGUgcGxheWJhY2sKKyAqIHRvIGEgdm9sdW1lIGNvbnRyb2wgZGlhbG9nLiBTZWUgYWxzbyBJVm9sdW1lQ29udHJvbGxlciBmb3IgdGhlIEF1ZGlvU2VydmljZSBoYWxmLgorICogVE9ETyBhZGQgaW4gYmV0dGVyIHN1cHBvcnQgZm9yIG11bHRpcGxlIHJlbW90ZSBzZXNzaW9ucy4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSVJlbW90ZVZvbHVtZUNvbnRyb2xsZXIgeworICAgIHZvaWQgcmVtb3RlVm9sdW1lQ2hhbmdlZChJU2Vzc2lvbkNvbnRyb2xsZXIgc2Vzc2lvbiwgaW50IGZsYWdzKTsKKyAgICAvLyBzZXRzIHRoZSBkZWZhdWx0IHNlc3Npb24gdG8gdXNlIHdpdGggdGhlIHNsaWRlciwgcmVwbGFjZXMgcmVtb3RlU2xpZGVyVmlzaWJpbGl0eQorICAgIC8vIG9uIElWb2x1bWVDb250cm9sbGVyCisgICAgdm9pZCB1cGRhdGVSZW1vdGVDb250cm9sbGVyKElTZXNzaW9uQ29udHJvbGxlciBzZXNzaW9uKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9JU2Vzc2lvblRva2Vuc0xpc3RlbmVyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvSVNlc3Npb25Ub2tlbnNMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2ExOWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvSVNlc3Npb25Ub2tlbnNMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2Ygc2Vzc2lvbiB0b2tlbnMuCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElTZXNzaW9uVG9rZW5zTGlzdGVuZXIgeworICAgIHZvaWQgb25TZXNzaW9uVG9rZW5zQ2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gdG9rZW5zKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyaXB0aW9uLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOTM0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5haWRsCkBAIC0wLDAgKzEsMTggQEAKKy8qIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK3BhcmNlbGFibGUgTWVkaWFEZXNjcmlwdGlvbjsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYURlc2NyaXB0aW9uLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDc5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzgzIEBACitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworLyoqCisgKiBBIHNpbXBsZSBzZXQgb2YgbWV0YWRhdGEgZm9yIGEgbWVkaWEgaXRlbSBzdWl0YWJsZSBmb3IgZGlzcGxheS4gVGhpcyBjYW4gYmUKKyAqIGNyZWF0ZWQgdXNpbmcgdGhlIEJ1aWxkZXIgb3IgcmV0cmlldmVkIGZyb20gZXhpc3RpbmcgbWV0YWRhdGEgdXNpbmcKKyAqIHtAbGluayBNZWRpYU1ldGFkYXRhI2dldERlc2NyaXB0aW9uKCl9LgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIEEgdW5pcXVlIHBlcnNpc3RlbnQgaWQgZm9yIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1lZGlhSWQ7CisgICAgLyoqCisgICAgICogQSBwcmltYXJ5IHRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIC8qKgorICAgICAqIEEgc3VidGl0bGUgc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdGlvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIG1EZXNjcmlwdGlvbjsKKyAgICAvKioKKyAgICAgKiBBIGJpdG1hcCBpY29uIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUljb247CisgICAgLyoqCisgICAgICogQSBVcmkgZm9yIGFuIGljb24gc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKKyAgICAvKioKKyAgICAgKiBFeHRyYXMgZm9yIG9wYXF1ZSB1c2UgYnkgYXBwcy9zeXN0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKKyAgICAvKioKKyAgICAgKiBBIFVyaSB0byBpZGVudGlmeSB0aGlzIGNvbnRlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbU1lZGlhVXJpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGxvbmcgZXh0cmEgZmllbGQgdG8gaW5kaWNhdGUgdGhlIGJsdWV0b290aCBmb2xkZXIgdHlwZSBvZiB0aGUgbWVkaWEgaXRlbSBhcworICAgICAqIHNwZWNpZmllZCBpbiB0aGUgc2VjdGlvbiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4gVGhpcyBpcyB2YWxpZCBvbmx5IGZvcgorICAgICAqIHtAbGluayBNZWRpYUJyb3dzZXIuTWVkaWFJdGVtfSB3aXRoIHtAbGluayBNZWRpYUJyb3dzZXIuTWVkaWFJdGVtI0ZMQUdfQlJPV1NBQkxFfS4gVGhlIHZhbHVlCisgICAgICogc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9NSVhFRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0JUX0ZPTERFUl9UWVBFX1RJVExFU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0JUX0ZPTERFUl9UWVBFX0FMQlVNU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0JUX0ZPTERFUl9UWVBFX0FSVElTVFN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9HRU5SRVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9QTEFZTElTVFN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNCVF9GT0xERVJfVFlQRV9ZRUFSU308L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlICNnZXRFeHRyYXMoKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0JUX0ZPTERFUl9UWVBFID0gImFuZHJvaWQubWVkaWEuZXh0cmEuQlRfRk9MREVSX1RZUEUiOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgaXMgdW5rbm93biBvciBjb250YWlucyBtZWRpYSBlbGVtZW50cyBvZiBtaXhlZCB0eXBlcyBhcyBzcGVjaWZpZWQgaW4KKyAgICAgKiB0aGUgc2VjdGlvbiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfTUlYRUQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgY29udGFpbnMgbWVkaWEgZWxlbWVudHMgb25seSBhcyBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24gNi4xMC4yLjIgb2YKKyAgICAgKiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfVElUTEVTID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGNvbnRhaW5zIGZvbGRlcnMgY2F0ZWdvcml6ZWQgYnkgYWxidW0gYXMgc3BlY2lmaWVkIGluIHRoZSBzZWN0aW9uCisgICAgICogNi4xMC4yLjIgb2YgdGhlIEJsdWV0b290aCBBVlJDUCAxLjUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJUX0ZPTERFUl9UWVBFX0FMQlVNUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmb2xkZXIgdGhhdCBjb250YWlucyBmb2xkZXJzIGNhdGVnb3JpemVkIGJ5IGFydGlzdCBhcyBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24KKyAgICAgKiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfQVJUSVNUUyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmb2xkZXIgdGhhdCBjb250YWlucyBmb2xkZXJzIGNhdGVnb3JpemVkIGJ5IGdlbnJlIGFzIHNwZWNpZmllZCBpbiB0aGUgc2VjdGlvbgorICAgICAqIDYuMTAuMi4yIG9mIHRoZSBCbHVldG9vdGggQVZSQ1AgMS41LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBCVF9GT0xERVJfVFlQRV9HRU5SRVMgPSA0OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgZm9sZGVyIHRoYXQgY29udGFpbnMgZm9sZGVycyBjYXRlZ29yaXplZCBieSBwbGF5bGlzdCBhcyBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24KKyAgICAgKiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfUExBWUxJU1RTID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGZvbGRlciB0aGF0IGNvbnRhaW5zIGZvbGRlcnMgY2F0ZWdvcml6ZWQgYnkgeWVhciBhcyBzcGVjaWZpZWQgaW4gdGhlIHNlY3Rpb24KKyAgICAgKiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoIEFWUkNQIDEuNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQlRfRk9MREVSX1RZUEVfWUVBUlMgPSA2OworCisgICAgcHJpdmF0ZSBNZWRpYURlc2NyaXB0aW9uKFN0cmluZyBtZWRpYUlkLCBDaGFyU2VxdWVuY2UgdGl0bGUsIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbiwgQml0bWFwIGljb24sIFVyaSBpY29uVXJpLCBCdW5kbGUgZXh0cmFzLCBVcmkgbWVkaWFVcmkpIHsKKyAgICAgICAgbU1lZGlhSWQgPSBtZWRpYUlkOworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgIG1JY29uVXJpID0gaWNvblVyaTsKKyAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgbU1lZGlhVXJpID0gbWVkaWFVcmk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYURlc2NyaXB0aW9uKFBhcmNlbCBpbikgeworICAgICAgICBtTWVkaWFJZCA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbVRpdGxlID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgbVN1YnRpdGxlID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgbURlc2NyaXB0aW9uID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgbUljb24gPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKKyAgICAgICAgbUljb25VcmkgPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKKyAgICAgICAgbUV4dHJhcyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgbU1lZGlhVXJpID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVkaWEgaWQgb3IgbnVsbC4gU2VlCisgICAgICoge0BsaW5rIE1lZGlhTWV0YWRhdGEjTUVUQURBVEFfS0VZX01FRElBX0lEfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRNZWRpYUlkKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHRpdGxlIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3VidGl0bGUgc3VpdGFibGUgZm9yIGRpc3BsYXkgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBzdWJ0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVN1YnRpdGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBBIGRlc2NyaXB0aW9uIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGJpdG1hcCBpY29uIHN1aXRhYmxlIGZvciBkaXNwbGF5IG9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIGljb24gb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgeworICAgICAgICByZXR1cm4gbUljb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFVyaSBmb3IgYW4gaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSBvciBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBpY29uIHVyaSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgVXJpIGdldEljb25VcmkoKSB7CisgICAgICAgIHJldHVybiBtSWNvblVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFueSBleHRyYXMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBidW5kbGUgb2YgZXh0cmFzIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVXJpIHJlcHJlc2VudGluZyB0aGlzIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBtZWRpYSBVcmkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFVyaSBnZXRNZWRpYVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYVVyaTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1NZWRpYUlkKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobVRpdGxlLCBkZXN0LCAwKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobVN1YnRpdGxlLCBkZXN0LCAwKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobURlc2NyaXB0aW9uLCBkZXN0LCAwKTsKKyAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUobUljb24sIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUobUljb25VcmksIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShtRXh0cmFzKTsKKyAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUobU1lZGlhVXJpLCBmbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNZWRpYURlc2NyaXB0aW9uKSl7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNZWRpYURlc2NyaXB0aW9uIGQgPSAoTWVkaWFEZXNjcmlwdGlvbikgbzsKKworICAgICAgICBpZiAoIVN0cmluZy52YWx1ZU9mKG1UaXRsZSkuZXF1YWxzKFN0cmluZy52YWx1ZU9mKGQubVRpdGxlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU3RyaW5nLnZhbHVlT2YobVN1YnRpdGxlKS5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoZC5tU3VidGl0bGUpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTdHJpbmcudmFsdWVPZihtRGVzY3JpcHRpb24pLmVxdWFscyhTdHJpbmcudmFsdWVPZihkLm1EZXNjcmlwdGlvbikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlICsgIiwgIiArIG1TdWJ0aXRsZSArICIsICIgKyBtRGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8TWVkaWFEZXNjcmlwdGlvbj4gQ1JFQVRPUiA9CisgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhRGVzY3JpcHRpb24+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYURlc2NyaXB0aW9uIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFEZXNjcmlwdGlvbihpbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhRGVzY3JpcHRpb25bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhRGVzY3JpcHRpb25bc2l6ZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYURlc2NyaXB0aW9ufSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1NZWRpYUlkOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbURlc2NyaXB0aW9uOworICAgICAgICBwcml2YXRlIEJpdG1hcCBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBVcmkgbUljb25Vcmk7CisgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CisgICAgICAgIHByaXZhdGUgVXJpIG1NZWRpYVVyaTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBpbml0aWFsbHkgZW1wdHkgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIG1lZGlhIGlkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgdW5pcXVlIGlkIGZvciB0aGUgaXRlbSBvciBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhSWQoQE51bGxhYmxlIFN0cmluZyBtZWRpYUlkKSB7CisgICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB0aXRsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRpdGxlIEEgdGl0bGUgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIgb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaXRsZShATnVsbGFibGUgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHN1YnRpdGxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3VidGl0bGUgQSBzdWJ0aXRsZSBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlciBvciBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFN1YnRpdGxlKEBOdWxsYWJsZSBDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyIG9yCisgICAgICAgICAqICAgICAgICAgICAgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXNjcmlwdGlvbihATnVsbGFibGUgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGljb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpY29uIEEge0BsaW5rIEJpdG1hcH0gaWNvbiBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlciBvcgorICAgICAgICAgKiAgICAgICAgICAgIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvbkJpdG1hcChATnVsbGFibGUgQml0bWFwIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGljb24gdXJpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWNvblVyaSBBIHtAbGluayBVcml9IGZvciBhbiBpY29uIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZQorICAgICAgICAgKiAgICAgICAgICAgIHVzZXIgb3IgbnVsbC4KKyAgICAgICAgICogQHJldHVybiB0aGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKEBOdWxsYWJsZSBVcmkgaWNvblVyaSkgeworICAgICAgICAgICAgbUljb25VcmkgPSBpY29uVXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgVGhlIGV4dHJhcyB0byBpbmNsdWRlIHdpdGggdGhpcyBkZXNjcmlwdGlvbiBvciBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIG1lZGlhIHVyaS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhVXJpIFRoZSBjb250ZW50J3Mge0BsaW5rIFVyaX0gZm9yIHRoZSBpdGVtIG9yIG51bGwuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWVkaWFVcmkoQE51bGxhYmxlIFVyaSBtZWRpYVVyaSkgeworICAgICAgICAgICAgbU1lZGlhVXJpID0gbWVkaWFVcmk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZWRpYURlc2NyaXB0aW9uIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYURlc2NyaXB0aW9uKG1NZWRpYUlkLCBtVGl0bGUsIG1TdWJ0aXRsZSwgbURlc2NyaXB0aW9uLCBtSWNvbiwgbUljb25VcmksCisgICAgICAgICAgICAgICAgICAgIG1FeHRyYXMsIG1NZWRpYVVyaSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YS5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmVlNDgzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuYWlkbApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitwYXJjZWxhYmxlIE1lZGlhTWV0YWRhdGE7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZkMjBiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEuamF2YQpAQCAtMCwwICsxLDk0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU3RyaW5nRGVmOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogQ29udGFpbnMgbWV0YWRhdGEgYWJvdXQgYW4gaXRlbSwgc3VjaCBhcyB0aGUgdGl0bGUsIGFydGlzdCwgZXRjLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFNZXRhZGF0YSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YSI7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBTdHJpbmdEZWYocHJlZml4ID0geyAiTUVUQURBVEFfS0VZXyIgfSwgdmFsdWUgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FVVEhPUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQ09NUE9TRVIsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfREFURSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9HRU5SRSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0RFU0NSSVBUSU9OLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfTUVESUFfSUQsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfTUVESUFfVVJJLAorICAgIH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRleHRLZXkge30KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFN0cmluZ0RlZihwcmVmaXggPSB7ICJNRVRBREFUQV9LRVlfIiB9LCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9EVVJBVElPTiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ZRUFSLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFLAorICAgIH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvbmdLZXkge30KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFN0cmluZ0RlZihwcmVmaXggPSB7ICJNRVRBREFUQV9LRVlfIiB9LCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKKyAgICB9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBCaXRtYXBLZXkge30KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFN0cmluZ0RlZihwcmVmaXggPSB7ICJNRVRBREFUQV9LRVlfIiB9LCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9SQVRJTkcsCisgICAgfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgUmF0aW5nS2V5IHt9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRJVExFIjsKKworICAgIC8qKgorICAgICAqIFRoZSBhcnRpc3Qgb2YgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRJU1QiOworCisgICAgLyoqCisgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBtZWRpYSBpbiBtcy4gQSBuZWdhdGl2ZSBkdXJhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAgKiBkdXJhdGlvbiBpcyB1bmtub3duIChvciBpbmZpbml0ZSkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RVUkFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRFVSQVRJT04iOworCisgICAgLyoqCisgICAgICogVGhlIGFsYnVtIHRpdGxlIGZvciB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0FMQlVNID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQUxCVU0iOworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhvciBvZiB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0FVVEhPUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFVVEhPUiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGVyIG9mIHRoZSBtZWRpYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfV1JJVEVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuV1JJVEVSIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb3NlciBvZiB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0NPTVBPU0VSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUE9TRVIiOworCisgICAgLyoqCisgICAgICogVGhlIGNvbXBpbGF0aW9uIHN0YXR1cyBvZiB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUElMQVRJT04iOworCisgICAgLyoqCisgICAgICogVGhlIGRhdGUgdGhlIG1lZGlhIHdhcyBjcmVhdGVkIG9yIHB1Ymxpc2hlZC4gVGhlIGZvcm1hdCBpcyB1bnNwZWNpZmllZAorICAgICAqIGJ1dCBSRkMgMzMzOSBpcyByZWNvbW1lbmRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfREFURSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRBVEUiOworCisgICAgLyoqCisgICAgICogVGhlIHllYXIgdGhlIG1lZGlhIHdhcyBjcmVhdGVkIG9yIHB1Ymxpc2hlZCBhcyBhIGxvbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX1lFQVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ZRUFSIjsKKworICAgIC8qKgorICAgICAqIFRoZSBnZW5yZSBvZiB0aGUgbWVkaWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0dFTlJFID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuR0VOUkUiOworCisgICAgLyoqCisgICAgICogVGhlIHRyYWNrIG51bWJlciBmb3IgdGhlIG1lZGlhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5UUkFDS19OVU1CRVIiOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB0cmFja3MgaW4gdGhlIG1lZGlhJ3Mgb3JpZ2luYWwgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuTlVNX1RSQUNLUyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzYyBudW1iZXIgZm9yIHRoZSBtZWRpYSdzIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNDX05VTUJFUiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJ0aXN0IGZvciB0aGUgYWxidW0gb2YgdGhlIG1lZGlhJ3Mgb3JpZ2luYWwgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRJU1QiOworCisgICAgLyoqCisgICAgICogVGhlIGFydHdvcmsgZm9yIHRoZSBtZWRpYSBhcyBhIHtAbGluayBCaXRtYXB9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBhcnR3b3JrIHNob3VsZCBiZSByZWxhdGl2ZWx5IHNtYWxsIGFuZCBtYXkgYmUgc2NhbGVkIGRvd24gYnkgdGhlCisgICAgICogc3lzdGVtIGlmIGl0IGlzIHRvbyBsYXJnZS4gRm9yIGhpZ2hlciByZXNvbHV0aW9uIGFydHdvcmsKKyAgICAgKiB7QGxpbmsgI01FVEFEQVRBX0tFWV9BUlRfVVJJfSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BUlQgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlQiOworCisgICAgLyoqCisgICAgICogVGhlIGFydHdvcmsgZm9yIHRoZSBtZWRpYSBhcyBhIFVyaSBmb3JtYXR0ZWQgU3RyaW5nLiBUaGUgYXJ0d29yayBjYW4gYmUKKyAgICAgKiBsb2FkZWQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5JbnB1dFN0cmVhbX0gYW5kCisgICAgICoge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlU3RyZWFtfS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgdGhlIGJlc3QgcmVzdWx0cywgVXJpcyBzaG91bGQgdXNlIHRoZSBjb250ZW50Oi8vIHN0eWxlIGFuZCBzdXBwb3J0CisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNFWFRSQV9TSVpFfSBmb3IgcmV0cmlldmluZyBzY2FsZWQgYXJ0d29yayB0aHJvdWdoCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nLCBCdW5kbGUpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQVJUX1VSSSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFSVF9VUkkiOworCisgICAgLyoqCisgICAgICogVGhlIGFydHdvcmsgZm9yIHRoZSBhbGJ1bSBvZiB0aGUgbWVkaWEncyBvcmlnaW5hbCBzb3VyY2UgYXMgYQorICAgICAqIHtAbGluayBCaXRtYXB9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBhcnR3b3JrIHNob3VsZCBiZSByZWxhdGl2ZWx5IHNtYWxsIGFuZCBtYXkgYmUgc2NhbGVkIGRvd24gYnkgdGhlCisgICAgICogc3lzdGVtIGlmIGl0IGlzIHRvbyBsYXJnZS4gRm9yIGhpZ2hlciByZXNvbHV0aW9uIGFydHdvcmsKKyAgICAgKiB7QGxpbmsgI01FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJfSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlQiOworCisgICAgLyoqCisgICAgICogVGhlIGFydHdvcmsgZm9yIHRoZSBhbGJ1bSBvZiB0aGUgbWVkaWEncyBvcmlnaW5hbCBzb3VyY2UgYXMgYSBVcmkKKyAgICAgKiBmb3JtYXR0ZWQgU3RyaW5nLiBUaGUgYXJ0d29yayBjYW4gYmUgbG9hZGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2YKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5JbnB1dFN0cmVhbX0gYW5kCisgICAgICoge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlU3RyZWFtfS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgdGhlIGJlc3QgcmVzdWx0cywgVXJpcyBzaG91bGQgdXNlIHRoZSBjb250ZW50Oi8vIHN0eWxlIGFuZCBzdXBwb3J0CisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNFWFRSQV9TSVpFfSBmb3IgcmV0cmlldmluZyBzY2FsZWQgYXJ0d29yayB0aHJvdWdoCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nLCBCdW5kbGUpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX0FSVF9VUkkiOworCisgICAgLyoqCisgICAgICogVGhlIHVzZXIncyByYXRpbmcgZm9yIHRoZSBtZWRpYS4KKyAgICAgKgorICAgICAqIEBzZWUgUmF0aW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX1VTRVJfUkFUSU5HID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuVVNFUl9SQVRJTkciOworCisgICAgLyoqCisgICAgICogVGhlIG92ZXJhbGwgcmF0aW5nIGZvciB0aGUgbWVkaWEuCisgICAgICoKKyAgICAgKiBAc2VlIFJhdGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9SQVRJTkcgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5SQVRJTkciOworCisgICAgLyoqCisgICAgICogQSB0aXRsZSB0aGF0IGlzIHN1aXRhYmxlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyLiBUaGlzIHdpbGwgZ2VuZXJhbGx5IGJlCisgICAgICogdGhlIHNhbWUgYXMge0BsaW5rICNNRVRBREFUQV9LRVlfVElUTEV9IGJ1dCBtYXkgZGlmZmVyIGZvciBzb21lIGZvcm1hdHMuCisgICAgICogV2hlbiBkaXNwbGF5aW5nIG1lZGlhIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIHRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZAorICAgICAqIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ESVNQTEFZX1RJVExFIjsKKworICAgIC8qKgorICAgICAqIEEgc3VidGl0bGUgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlci4gV2hlbiBkaXNwbGF5aW5nIGEKKyAgICAgKiBzZWNvbmQgbGluZSBmb3IgbWVkaWEgZGVzY3JpYmVkIGJ5IHRoaXMgbWV0YWRhdGEgdGhpcyBzaG91bGQgYmUgcHJlZmVycmVkCisgICAgICogdG8gb3RoZXIgZmllbGRzIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUKKyAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTUExBWV9TVUJUSVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBBIGRlc2NyaXB0aW9uIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIuIFdoZW4gZGlzcGxheWluZworICAgICAqIG1vcmUgaW5mb3JtYXRpb24gZm9yIG1lZGlhIGRlc2NyaWJlZCBieSB0aGlzIG1ldGFkYXRhIHRoaXMgc2hvdWxkIGJlCisgICAgICogcHJlZmVycmVkIHRvIG90aGVyIGZpZWxkcyBpZiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0RFU0NSSVBUSU9OCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU1BMQVlfREVTQ1JJUFRJT04iOworCisgICAgLyoqCisgICAgICogQW4gaWNvbiBvciB0aHVtYm5haWwgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzcGxheSB0byB0aGUgdXNlci4gV2hlbgorICAgICAqIGRpc3BsYXlpbmcgYW4gaWNvbiBmb3IgbWVkaWEgZGVzY3JpYmVkIGJ5IHRoaXMgbWV0YWRhdGEgdGhpcyBzaG91bGQgYmUKKyAgICAgKiBwcmVmZXJyZWQgdG8gb3RoZXIgZmllbGRzIGlmIHByZXNlbnQuIFRoaXMgbXVzdCBiZSBhIHtAbGluayBCaXRtYXB9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBpY29uIHNob3VsZCBiZSByZWxhdGl2ZWx5IHNtYWxsIGFuZCBtYXkgYmUgc2NhbGVkIGRvd24gYnkgdGhlIHN5c3RlbQorICAgICAqIGlmIGl0IGlzIHRvbyBsYXJnZS4gRm9yIGhpZ2hlciByZXNvbHV0aW9uIGFydHdvcmsKKyAgICAgKiB7QGxpbmsgI01FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJfSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04KKyAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTUExBWV9JQ09OIjsKKworICAgIC8qKgorICAgICAqIEEgVXJpIGZvcm1hdHRlZCBTdHJpbmcgZm9yIGFuIGljb24gb3IgdGh1bWJuYWlsIHRoYXQgaXMgc3VpdGFibGUgZm9yCisgICAgICogZGlzcGxheSB0byB0aGUgdXNlci4gV2hlbiBkaXNwbGF5aW5nIG1vcmUgaW5mb3JtYXRpb24gZm9yIG1lZGlhIGRlc2NyaWJlZAorICAgICAqIGJ5IHRoaXMgbWV0YWRhdGEgdGhlIGRpc3BsYXkgZGVzY3JpcHRpb24gc2hvdWxkIGJlIHByZWZlcnJlZCB0byBvdGhlcgorICAgICAqIGZpZWxkcyB3aGVuIHByZXNlbnQuIFRoZSBpY29uIGNhbiBiZSBsb2FkZWQgdXNpbmcgYSBjb21iaW5hdGlvbiBvZgorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlbklucHV0U3RyZWFtfSBhbmQKKyAgICAgKiB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVTdHJlYW19LgorICAgICAqIDxwPgorICAgICAqIEZvciB0aGUgYmVzdCByZXN1bHRzLCBVcmlzIHNob3VsZCB1c2UgdGhlIGNvbnRlbnQ6Ly8gc3R5bGUgYW5kIHN1cHBvcnQKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI0VYVFJBX1NJWkV9IGZvciByZXRyaWV2aW5nIHNjYWxlZCBhcnR3b3JrIHRocm91Z2gKKyAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcsIEJ1bmRsZSl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU1BMQVlfSUNPTl9VUkkiOworCisgICAgLyoqCisgICAgICogQSBTdHJpbmcga2V5IGZvciBpZGVudGlmeWluZyB0aGUgY29udGVudC4gVGhpcyB2YWx1ZSBpcyBzcGVjaWZpYyB0byB0aGUKKyAgICAgKiBzZXJ2aWNlIHByb3ZpZGluZyB0aGUgY29udGVudC4gSWYgdXNlZCwgdGhpcyBzaG91bGQgYmUgYSBwZXJzaXN0ZW50CisgICAgICogdW5pcXVlIGtleSBmb3IgdGhlIHVuZGVybHlpbmcgY29udGVudC4gSXQgbWF5IGJlIHVzZWQgd2l0aAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMjcGxheUZyb21NZWRpYUlkKFN0cmluZywgQnVuZGxlKX0KKyAgICAgKiB0byBpbml0aWF0ZSBwbGF5YmFjayB3aGVuIHByb3ZpZGVkIGJ5IGEge0BsaW5rIE1lZGlhQnJvd3Nlcn0gY29ubmVjdGVkIHRvCisgICAgICogdGhlIHNhbWUgYXBwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX0tFWV9NRURJQV9JRCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLk1FRElBX0lEIjsKKworICAgIC8qKgorICAgICAqIEEgVXJpIGZvcm1hdHRlZCBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50LiBUaGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIHRoZQorICAgICAqIHNlcnZpY2UgcHJvdmlkaW5nIHRoZSBjb250ZW50LiBJdCBtYXkgYmUgdXNlZCB3aXRoCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyNwbGF5RnJvbVVyaShVcmksIEJ1bmRsZSl9CisgICAgICogdG8gaW5pdGlhdGUgcGxheWJhY2sgd2hlbiBwcm92aWRlZCBieSBhIHtAbGluayBNZWRpYUJyb3dzZXJ9IGNvbm5lY3RlZCB0bworICAgICAqIHRoZSBzYW1lIGFwcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9LRVlfTUVESUFfVVJJID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuTUVESUFfVVJJIjsKKworICAgIC8qKgorICAgICAqIFRoZSBibHVldG9vdGggZm9sZGVyIHR5cGUgb2YgdGhlIG1lZGlhIHNwZWNpZmllZCBpbiB0aGUgc2VjdGlvbiA2LjEwLjIuMiBvZiB0aGUgQmx1ZXRvb3RoCisgICAgICogQVZSQ1AgMS41LiBJdCBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9NSVhFRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9USVRMRVN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfQUxCVU1TfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYURlc2NyaXB0aW9uI0JUX0ZPTERFUl9UWVBFX0FSVElTVFN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhRGVzY3JpcHRpb24jQlRfRk9MREVSX1RZUEVfR0VOUkVTfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYURlc2NyaXB0aW9uI0JUX0ZPTERFUl9UWVBFX1BMQVlMSVNUU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFEZXNjcmlwdGlvbiNCVF9GT0xERVJfVFlQRV9ZRUFSU308L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkJUX0ZPTERFUl9UWVBFIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5IFN0cmluZ1tdIFBSRUZFUlJFRF9ERVNDUklQVElPTl9PUkRFUiA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9USVRMRSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRJU1QsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU0sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX1dSSVRFUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BVVRIT1IsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQ09NUE9TRVIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQEJpdG1hcEtleSBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5IFN0cmluZ1tdIFBSRUZFUlJFRF9VUklfT1JERVIgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRfVVJJLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfSU5WQUxJRCA9IC0xOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1RFWFQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0JJVE1BUCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9JRCwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PFN0cmluZz4gRURJVE9SX0tFWV9NQVBQSU5HOworCisgICAgc3RhdGljIHsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HID0gbmV3IFNwYXJzZUFycmF5PFN0cmluZz4oKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhRWRpdG9yLkJJVE1BUF9LRVlfQVJUV09SSywgTUVUQURBVEFfS0VZX0FSVCk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YUVkaXRvci5SQVRJTkdfS0VZX0JZX09USEVSUywgTUVUQURBVEFfS0VZX1JBVElORyk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YUVkaXRvci5SQVRJTkdfS0VZX0JZX1VTRVIsIE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORyk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX0tFWV9BTEJVTSk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCk7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9LRVlfQVJUSVNUKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9BVVRIT1IsIE1FVEFEQVRBX0tFWV9BVVRIT1IpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0NEX1RSQUNLX05VTUJFUiwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfVFJBQ0tfTlVNQkVSKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfS0VZX0NPTVBPU0VSKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04pOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX0tFWV9EQVRFKTsKKyAgICAgICAgRURJVE9SX0tFWV9NQVBQSU5HLnB1dChNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9LRVlfRFVSQVRJT04pOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9LRVlfR0VOUkUpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX05VTV9UUkFDS1MpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9LRVlfVElUTEUpOworICAgICAgICBFRElUT1JfS0VZX01BUFBJTkcucHV0KE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1dSSVRFUiwgTUVUQURBVEFfS0VZX1dSSVRFUik7CisgICAgICAgIEVESVRPUl9LRVlfTUFQUElORy5wdXQoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfS0VZX1lFQVIpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgcHJpdmF0ZSBNZWRpYURlc2NyaXB0aW9uIG1EZXNjcmlwdGlvbjsKKworICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGJ1bmRsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhKFBhcmNlbCBpbikgeworICAgICAgICBtQnVuZGxlID0gaW4ucmVhZEJ1bmRsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGNvbnRhaW5lZCBpbiB0aGUgbWV0YWRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgYSBTdHJpbmcga2V5CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoaXMgbWV0YWRhdGEsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSwgb3IgbnVsbCBpZiBubyBtYXBwaW5nIG9mCisgICAgICogdGhlIGRlc2lyZWQgdHlwZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBrZXkgb3IgYSBudWxsIHZhbHVlIGlzIGV4cGxpY2l0bHkKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGUgdmFsdWUgaXMgc3RvcmVkIHVuZGVyCisgICAgICogQHJldHVybiBhIENoYXJTZXF1ZW5jZSB2YWx1ZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dChAVGV4dEtleSBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgYXMgYSBTdHJpbmcsIG9yIG51bGwKKyAgICAgKiBpZiBubyBtYXBwaW5nIG9mIHRoZSBkZXNpcmVkIHR5cGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4ga2V5IG9yIGEgbnVsbAorICAgICAqIHZhbHVlIGlzIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICAqIGNhbGxpbmcge0BsaW5rICNnZXRUZXh0IGdldFRleHQoKS50b1N0cmluZygpfSBpZiB0aGUgdmFsdWUgaXMgbm90IG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdGhlIHZhbHVlIGlzIHN0b3JlZCB1bmRlcgorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgdmFsdWUsIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhAVGV4dEtleSBTdHJpbmcga2V5KSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZ2V0VGV4dChrZXkpOworICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5LCBvciAwTCBpZiBubyBsb25nIGV4aXN0cworICAgICAqIGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRoZSB2YWx1ZSBpcyBzdG9yZWQgdW5kZXIKKyAgICAgKiBAcmV0dXJuIGEgbG9uZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExvbmcoQExvbmdLZXkgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKGtleSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBSYXRpbmd9IGZvciB0aGUgZ2l2ZW4ga2V5IG9yIG51bGwgaWYgbm8gcmF0aW5nIGV4aXN0cworICAgICAqIGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRoZSB2YWx1ZSBpcyBzdG9yZWQgdW5kZXIKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIFJhdGluZ30gb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBSYXRpbmcgZ2V0UmF0aW5nKEBSYXRpbmdLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBSYXRpbmcgcmF0aW5nID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhdGluZyA9IG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShrZXkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgYml0bWFwCisgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgUmF0aW5nLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYXRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBCaXRtYXB9IGZvciB0aGUgZ2l2ZW4ga2V5IG9yIG51bGwgaWYgbm8gYml0bWFwIGV4aXN0cworICAgICAqIGZvciB0aGUgZ2l2ZW4ga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRoZSB2YWx1ZSBpcyBzdG9yZWQgdW5kZXIKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIEJpdG1hcH0gb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBCaXRtYXAgZ2V0Qml0bWFwKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBCaXRtYXAgYm1wID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJtcCA9IG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShrZXkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgYml0bWFwCisgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgQml0bWFwLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBibXA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShtQnVuZGxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgbWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoZSBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU2V0IGNvbnRhaW5pbmcgdGhlIFN0cmluZ3MgdXNlZCBhcyBrZXlzIGluIHRoaXMgbWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgU2V0IG9mIFN0cmluZyBrZXlzCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUua2V5U2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1ldGFkYXRhIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBBIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1ldGFkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBATm9uTnVsbCBNZWRpYURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICBpZiAobURlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbWVkaWFJZCA9IGdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOworCisgICAgICAgIENoYXJTZXF1ZW5jZVtdIHRleHQgPSBuZXcgQ2hhclNlcXVlbmNlWzNdOworICAgICAgICBCaXRtYXAgaWNvbiA9IG51bGw7CisgICAgICAgIFVyaSBpY29uVXJpID0gbnVsbDsKKworICAgICAgICAvLyBGaXJzdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgZGlzcGxheSBkYXRhIGlzIHNldCBhbHJlYWR5CisgICAgICAgIENoYXJTZXF1ZW5jZSBkaXNwbGF5VGV4dCA9IGdldFRleHQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlUZXh0KSkgeworICAgICAgICAgICAgLy8gSWYgdGhleSBoYXZlIGEgZGlzcGxheSB0aXRsZSB1c2Ugb25seSBkaXNwbGF5IGRhdGEsIG90aGVyd2lzZSB1c2UKKyAgICAgICAgICAgIC8vIG91ciBiZXN0IGJldHMKKyAgICAgICAgICAgIHRleHRbMF0gPSBkaXNwbGF5VGV4dDsKKyAgICAgICAgICAgIHRleHRbMV0gPSBnZXRUZXh0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1NVQlRJVExFKTsKKyAgICAgICAgICAgIHRleHRbMl0gPSBnZXRUZXh0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0RFU0NSSVBUSU9OKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFVzZSB3aGF0ZXZlciBmaWVsZHMgd2UgY2FuCisgICAgICAgICAgICBpbnQgdGV4dEluZGV4ID0gMDsKKyAgICAgICAgICAgIGludCBrZXlJbmRleCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodGV4dEluZGV4IDwgdGV4dC5sZW5ndGggJiYga2V5SW5kZXggPCBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIG5leHQgPSBnZXRUZXh0KFBSRUZFUlJFRF9ERVNDUklQVElPTl9PUkRFUltrZXlJbmRleCsrXSk7CisgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShuZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBuZXh0IGVtcHR5IGJpdCBvZiB0ZXh0CisgICAgICAgICAgICAgICAgICAgIHRleHRbdGV4dEluZGV4KytdID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgdGhlIGJlc3QgYXJ0IGJpdG1hcCB3ZSBjYW4gZmluZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRUZFUlJFRF9CSVRNQVBfT1JERVIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEJpdG1hcCBuZXh0ID0gZ2V0Qml0bWFwKFBSRUZFUlJFRF9CSVRNQVBfT1JERVJbaV0pOworICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGljb24gPSBuZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBiZXN0IFVyaSB3ZSBjYW4gZmluZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRUZFUlJFRF9VUklfT1JERVIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuZXh0ID0gZ2V0U3RyaW5nKFBSRUZFUlJFRF9VUklfT1JERVJbaV0pOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShuZXh0KSkgeworICAgICAgICAgICAgICAgIGljb25VcmkgPSBVcmkucGFyc2UobmV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBVcmkgbWVkaWFVcmkgPSBudWxsOworICAgICAgICBTdHJpbmcgbWVkaWFVcmlTdHIgPSBnZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX1VSSSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobWVkaWFVcmlTdHIpKSB7CisgICAgICAgICAgICBtZWRpYVVyaSA9IFVyaS5wYXJzZShtZWRpYVVyaVN0cik7CisgICAgICAgIH0KKworICAgICAgICBNZWRpYURlc2NyaXB0aW9uLkJ1aWxkZXIgYm9iID0gbmV3IE1lZGlhRGVzY3JpcHRpb24uQnVpbGRlcigpOworICAgICAgICBib2Iuc2V0TWVkaWFJZChtZWRpYUlkKTsKKyAgICAgICAgYm9iLnNldFRpdGxlKHRleHRbMF0pOworICAgICAgICBib2Iuc2V0U3VidGl0bGUodGV4dFsxXSk7CisgICAgICAgIGJvYi5zZXREZXNjcmlwdGlvbih0ZXh0WzJdKTsKKyAgICAgICAgYm9iLnNldEljb25CaXRtYXAoaWNvbik7CisgICAgICAgIGJvYi5zZXRJY29uVXJpKGljb25VcmkpOworICAgICAgICBib2Iuc2V0TWVkaWFVcmkobWVkaWFVcmkpOworICAgICAgICBpZiAobUJ1bmRsZS5jb250YWluc0tleShNRVRBREFUQV9LRVlfQlRfRk9MREVSX1RZUEUpKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnB1dExvbmcoTWVkaWFEZXNjcmlwdGlvbi5FWFRSQV9CVF9GT0xERVJfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9uZyhNRVRBREFUQV9LRVlfQlRfRk9MREVSX1RZUEUpKTsKKyAgICAgICAgICAgIGJvYi5zZXRFeHRyYXMoYnVuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtRGVzY3JpcHRpb24gPSBib2IuYnVpbGQoKTsKKworICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBmb3IgZ2V0dGluZyB0aGUgU3RyaW5nIGtleSB1c2VkIGJ5IHtAbGluayBNZWRpYU1ldGFkYXRhfSBmcm9tIHRoZQorICAgICAqIGludGVnZXIga2V5IHRoYXQge0BsaW5rIE1lZGlhTWV0YWRhdGFFZGl0b3J9IHVzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWRpdG9yS2V5IFRoZSBrZXkgdXNlZCBieSB0aGUgZWRpdG9yCisgICAgICogQHJldHVybiBUaGUga2V5IHVzZWQgYnkgdGhpcyBjbGFzcyBvciBudWxsIGlmIG5vIG1hcHBpbmcgZXhpc3RzCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleUZyb21NZXRhZGF0YUVkaXRvcktleShpbnQgZWRpdG9yS2V5KSB7CisgICAgICAgIHJldHVybiBFRElUT1JfS0VZX01BUFBJTkcuZ2V0KGVkaXRvcktleSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8TWVkaWFNZXRhZGF0YT4gQ1JFQVRPUiA9CisgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhTWV0YWRhdGE+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YShpbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhTWV0YWRhdGFbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGFbc2l6ZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdCB0byBhbm90aGVyIE1lZGlhTWV0YWRhdGEgb2JqZWN0LiBJdAorICAgICAqIGRvZXMgbm90IGNvbXBhcmUgQml0bWFwcyBhbmQgUmF0aW5ncyBhcyB0aGUgbWVkaWEgcGxheWVyIGNhbiBjaG9vc2UgdG8KKyAgICAgKiBmb3JnbyB0aGVzZSBmaWVsZHMgZGVwZW5kaW5nIG9uIGhvdyB5b3UgcmV0cmlldmUgdGhlIE1lZGlhTWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbyBUaGUgTWV0YWRhdGEgb2JqZWN0IHRvIGNvbXBhcmUgdGhpcyBvYmplY3QgYWdhaW5zdAorICAgICAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHR3byBvYmplY3RzIGhhdmUgbWF0Y2hpbmcgZmllbGRzIChleGNsdWRpbmcKKyAgICAgKiBCaXRtYXBzIGFuZCBSYXRpbmdzKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNZWRpYU1ldGFkYXRhKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVkaWFNZXRhZGF0YSBtID0gKE1lZGlhTWV0YWRhdGEpIG87CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRVRBREFUQV9LRVlTX1RZUEUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBNRVRBREFUQV9LRVlTX1RZUEUua2V5QXQoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKE1FVEFEQVRBX0tFWVNfVFlQRS52YWx1ZUF0KGkpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNRVRBREFUQV9UWVBFX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMoZ2V0U3RyaW5nKGtleSksIG0uZ2V0U3RyaW5nKGtleSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNRVRBREFUQV9UWVBFX0xPTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRMb25nKGtleSkgIT0gbS5nZXRMb25nKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgcmF0aW5ncyBhbmQgYml0bWFwcyB3aGVuIGNvbXBhcmluZworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoQ29kZSA9IDE3OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVUQURBVEFfS0VZU19UWVBFLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gTUVUQURBVEFfS0VZU19UWVBFLmtleUF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChNRVRBREFUQV9LRVlTX1RZUEUudmFsdWVBdChpKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTUVUQURBVEFfVFlQRV9URVhUOgorICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyBPYmplY3RzLmhhc2goZ2V0U3RyaW5nKGtleSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1FVEFEQVRBX1RZUEVfTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgTG9uZy5oYXNoQ29kZShnZXRMb25nKGtleSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgcmF0aW5ncyBhbmQgYml0bWFwcyB3aGVuIGNvbXBhcmluZworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoYXNoQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdG8gYnVpbGQgTWVkaWFNZXRhZGF0YSBvYmplY3RzLiBUaGUgc3lzdGVtIGRlZmluZWQgbWV0YWRhdGEga2V5cyBtdXN0CisgICAgICogdXNlIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGVtcHR5IEJ1aWxkZXIuIEFueSBmaWVsZCB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIE1lZGlhTWV0YWRhdGF9IG11c3QgYmUgYWRkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgQnVpbGRlciB1c2luZyBhIHtAbGluayBNZWRpYU1ldGFkYXRhfSBpbnN0YW5jZSB0byBzZXQgdGhlCisgICAgICAgICAqIGluaXRpYWwgdmFsdWVzLiBBbGwgZmllbGRzIGluIHRoZSBzb3VyY2UgbWV0YWRhdGEgd2lsbCBiZSBpbmNsdWRlZCBpbgorICAgICAgICAgKiB0aGUgbmV3IG1ldGFkYXRhLiBGaWVsZHMgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IGFkZGluZyB0aGUgc2FtZSBrZXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhTWV0YWRhdGEgc291cmNlKSB7CisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzb3VyY2UubUJ1bmRsZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgQnVpbGRlciB1c2luZyBhIHtAbGluayBNZWRpYU1ldGFkYXRhfSBpbnN0YW5jZSB0byBzZXQKKyAgICAgICAgICogaW5pdGlhbCB2YWx1ZXMsIGJ1dCByZXBsYWNlIGJpdG1hcHMgd2l0aCBhIHNjYWxlZCBkb3duIGNvcHkgaWYgdGhleQorICAgICAgICAgKiBhcmUgbGFyZ2VyIHRoYW4gbWF4Qml0bWFwU2l6ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNvdXJjZSBUaGUgb3JpZ2luYWwgbWV0YWRhdGEgdG8gY29weS4KKyAgICAgICAgICogQHBhcmFtIG1heEJpdG1hcFNpemUgVGhlIG1heGltdW0gaGVpZ2h0L3dpZHRoIGZvciBiaXRtYXBzIGNvbnRhaW5lZAorICAgICAgICAgKiAgICAgICAgICAgIGluIHRoZSBtZXRhZGF0YS4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhTWV0YWRhdGEgc291cmNlLCBpbnQgbWF4Qml0bWFwU2l6ZSkgeworICAgICAgICAgICAgdGhpcyhzb3VyY2UpOworICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbUJ1bmRsZS5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1CdW5kbGUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBCaXRtYXApIHsKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtcCA9IChCaXRtYXApIHZhbHVlOworICAgICAgICAgICAgICAgICAgICBpZiAoYm1wLmdldEhlaWdodCgpID4gbWF4Qml0bWFwU2l6ZSB8fCBibXAuZ2V0V2lkdGgoKSA+IG1heEJpdG1hcFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIENoYXJTZXF1ZW5jZSB2YWx1ZSBpbnRvIHRoZSBtZXRhZGF0YS4gQ3VzdG9tIGtleXMgbWF5IGJlIHVzZWQsCisgICAgICAgICAqIGJ1dCBpZiB0aGUgTUVUQURBVEFfS0VZcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgYXJlIHVzZWQgdGhleSBtYXkgb25seQorICAgICAgICAgKiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVElTVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU19PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FVVEhPUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfV1JJVEVSfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9DT01QT1NFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfREFURX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfR0VOUkV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQVJUX1VSSX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSX08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBDaGFyU2VxdWVuY2UgdmFsdWUgdG8gc3RvcmUKKyAgICAgICAgICogQHJldHVybiBUaGUgQnVpbGRlciB0byBhbGxvdyBjaGFpbmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0VGV4dChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBDaGFyU2VxdWVuY2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1dCBhIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBtZXRhZGF0YS4gQ3VzdG9tIGtleXMgbWF5IGJlIHVzZWQsIGJ1dCBpZgorICAgICAgICAgKiB0aGUgTUVUQURBVEFfS0VZcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgYXJlIHVzZWQgdGhleSBtYXkgb25seSBiZSBvbmUKKyAgICAgICAgICogb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfVElUTEV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVElTVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU19PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FVVEhPUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfV1JJVEVSfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9DT01QT1NFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfREFURX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfR0VOUkV9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQVJUX1VSSX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSX08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVXJpcyBmb3IgYXJ0d29yayBzaG91bGQgdXNlIHRoZSBjb250ZW50Oi8vIHN0eWxlIGFuZCBzdXBwb3J0CisgICAgICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjRVhUUkFfU0laRX0gZm9yIHJldHJpZXZpbmcgc2NhbGVkIGFydHdvcmsKKyAgICAgICAgICogdGhyb3VnaCB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLAorICAgICAgICAgKiBTdHJpbmcsIEJ1bmRsZSl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHJlZmVyZW5jaW5nIHRoaXMgdmFsdWUKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFRoZSBTdHJpbmcgdmFsdWUgdG8gc3RvcmUKKyAgICAgICAgICogQHJldHVybiBUaGUgQnVpbGRlciB0byBhbGxvdyBjaGFpbmluZworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0U3RyaW5nKEBUZXh0S2V5IFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHV0IGEgbG9uZyB2YWx1ZSBpbnRvIHRoZSBtZXRhZGF0YS4gQ3VzdG9tIGtleXMgbWF5IGJlIHVzZWQsIGJ1dCBpZgorICAgICAgICAgKiB0aGUgTUVUQURBVEFfS0VZcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgYXJlIHVzZWQgdGhleSBtYXkgb25seSBiZSBvbmUKKyAgICAgICAgICogb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRFVSQVRJT059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfTlVNX1RSQUNLU308L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfRElTQ19OVU1CRVJ9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1lFQVJ9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbG9uZyB2YWx1ZSB0byBzdG9yZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBCdWlsZGVyIHRvIGFsbG93IGNoYWluaW5nCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nKEBMb25nS2V5IFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9MT05HKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBsb25nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHV0IGEge0BsaW5rIFJhdGluZ30gaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLCBidXQKKyAgICAgICAgICogaWYgdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkgYmUKKyAgICAgICAgICogb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX1JBVElOR308L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkd9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgUmF0aW5nIHZhbHVlIHRvIHN0b3JlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEJ1aWxkZXIgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFJhdGluZyhAUmF0aW5nS2V5IFN0cmluZyBrZXksIFJhdGluZyB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1JBVElORykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgUmF0aW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHV0IGEge0BsaW5rIEJpdG1hcH0gaW50byB0aGUgbWV0YWRhdGEuIEN1c3RvbSBrZXlzIG1heSBiZSB1c2VkLCBidXQKKyAgICAgICAgICogaWYgdGhlIE1FVEFEQVRBX0tFWXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRoZXkgbWF5IG9ubHkgYmUKKyAgICAgICAgICogb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayAjTUVUQURBVEFfS0VZX0FSVH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNNRVRBREFUQV9LRVlfQUxCVU1fQVJUfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI01FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT059PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIExhcmdlIGJpdG1hcHMgbWF5IGJlIHNjYWxlZCBkb3duIGJ5IHRoZSBzeXN0ZW0gd2hlbgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbiNzZXRNZXRhZGF0YX0gaXMgY2FsbGVkLgorICAgICAgICAgKiBUbyBwYXNzIGZ1bGwgcmVzb2x1dGlvbiBpbWFnZXMge0BsaW5rIFVyaSBVcmlzfSBzaG91bGQgYmUgdXNlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjcHV0U3RyaW5nfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciByZWZlcmVuY2luZyB0aGlzIHZhbHVlCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgQml0bWFwIHRvIHN0b3JlCisgICAgICAgICAqIEByZXR1cm4gVGhlIEJ1aWxkZXIgdG8gYWxsb3cgY2hhaW5pbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcChAQml0bWFwS2V5IFN0cmluZyBrZXksIEJpdG1hcCB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0JJVE1BUCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQml0bWFwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAbGluayBNZWRpYU1ldGFkYXRhfSBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgZmllbGRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBuZXcgTWVkaWFNZXRhZGF0YSBpbnN0YW5jZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhTWV0YWRhdGEgYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEobUJ1bmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJpdG1hcCBzY2FsZUJpdG1hcChCaXRtYXAgYm1wLCBpbnQgbWF4U2l6ZSkgeworICAgICAgICAgICAgZmxvYXQgbWF4U2l6ZUYgPSBtYXhTaXplOworICAgICAgICAgICAgZmxvYXQgd2lkdGhTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldFdpZHRoKCk7CisgICAgICAgICAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldEhlaWdodCgpOworICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgKGJtcC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChibXAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGJtcCwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQYXJjZWxlZExpc3RTbGljZS5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhlYTljCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKiogQGhpZGUgKi8KK3BhcmNlbGFibGUgTWVkaWFQYXJjZWxlZExpc3RTbGljZTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQYXJjZWxlZExpc3RTbGljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNmZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGFyY2VsZWRMaXN0U2xpY2UuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUcmFuc2ZlciBhIGxhcmdlIGxpc3Qgb2Ygb2JqZWN0cyBhY3Jvc3MgYW4gSVBDLiBTcGxpdHMgaW50byBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgaWYgbmVlZGVkLgorICogTm90ZTogT25seSB1c2UgY2xhc3NlcyBkZWNsYXJlZCBmaW5hbCBpbiBvcmRlciB0byBhdm9pZCBzdWJjbGFzc2VzIG92ZXJyaWRpbmcgcmVhZGluZy93cml0aW5nCisgKiBwYXJjZWwgbG9naWMuCisgKgorICogVE9ETzogQWRkIHRlc3QgZm9yIHNlbmRpbmcgbGFyZ2UgZGF0YQorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2U8VCBleHRlbmRzIFBhcmNlbGFibGU+IGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lQQ19TSVpFID0gNjQgKiAxMDI0OyAvLyBJQmluZGVyLk1BWF9JUENfU0laRQorCisgICAgZmluYWwgTGlzdDxUPiBtTGlzdDsKKworICAgIHB1YmxpYyBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlKExpc3Q8VD4gbGlzdCkgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QgPSBsaXN0OworICAgIH0KKworICAgIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UoUGFyY2VsIHApIHsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IHAucmVhZEludCgpOworICAgICAgICBtTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihpdGVtQ291bnQpOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlJldHJpZXZpbmcgIiArIGl0ZW1Db3VudCArICIgaXRlbXMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbUNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChwLnJlYWRJbnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFQgcGFyY2VsYWJsZSA9IHAucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgICAgICBtTGlzdC5hZGQocGFyY2VsYWJsZSk7CisKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlYWQgaW5saW5lICMiICsgaSArICI6ICIgKyBtTGlzdC5nZXQobUxpc3Quc2l6ZSgpIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpID49IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElCaW5kZXIgcmV0cmlldmVyID0gcC5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50KSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWFkaW5nIG1vcmUgQCIgKyBpICsgIiBvZiAiICsgaXRlbUNvdW50ICsgIjogcmV0cmlldmVyPSIgKyByZXRyaWV2ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KGkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIudHJhbnNhY3QoSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWx1cmUgcmV0cmlldmluZyBhcnJheTsgb25seSByZWNlaXZlZCAiICsgaSArICIgb2YgIiArIGl0ZW1Db3VudCwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQgJiYgcmVwbHkucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUIHBhcmNlbGFibGUgPSByZXBseS5yZWFkUGFyY2VsYWJsZShudWxsKTsKKyAgICAgICAgICAgICAgICBtTGlzdC5hZGQocGFyY2VsYWJsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVhZCBleHRyYSAjIiArIGkgKyAiOiAiICsgbUxpc3QuZ2V0KG1MaXN0LnNpemUoKSAtIDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUPiBnZXRMaXN0KCkgeworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhpcyB0byBhbm90aGVyIFBhcmNlbC4gTm90ZSB0aGF0IHRoaXMgZGlzY2FyZHMgdGhlIGludGVybmFsIFBhcmNlbAorICAgICAqIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYW55bW9yZS4gVGhpcyBpcyBzbyB3ZSBjYW4gcGFzcyB0aGlzIHRvIGEgQmluZGVyCisgICAgICogd2hlcmUgd2Ugd29uJ3QgaGF2ZSBhIGNoYW5jZSB0byBjYWxsIHJlY3ljbGUgb24gdGhpcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IG1MaXN0LnNpemUoKTsKKyAgICAgICAgZGVzdC53cml0ZUludChpdGVtQ291bnQpOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIldyaXRpbmcgIiArIGl0ZW1Db3VudCArICIgaXRlbXMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbUNvdW50ID4gMCkgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQgJiYgZGVzdC5kYXRhU2l6ZSgpIDwgTUFYX0lQQ19TSVpFKSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFQgcGFyY2VsYWJsZSA9IG1MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlUGFyY2VsYWJsZShwYXJjZWxhYmxlLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiV3JvdGUgaW5saW5lICMiICsgaSArICI6ICIgKyBtTGlzdC5nZXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgQmluZGVyIHJldHJpZXZlciA9IG5ldyBCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBQYXJjZWwgZGF0YSwgUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBGSVJTVF9DQUxMX1RSQU5TQUNUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJXcml0aW5nIG1vcmUgQCIgKyBpICsgIiBvZiAiICsgaXRlbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaXRlbUNvdW50ICYmIHJlcGx5LmRhdGFTaXplKCkgPCBNQVhfSVBDX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFQgcGFyY2VsYWJsZSA9IG1MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZVBhcmNlbGFibGUocGFyY2VsYWJsZSwgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIldyb3RlIGV4dHJhICMiICsgaSArICI6ICIgKyBtTGlzdC5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJCcmVha2luZyBAIiArIGkgKyAiIG9mICIgKyBpdGVtQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQnJlYWtpbmcgQCIgKyBpICsgIiBvZiAiICsgaXRlbUNvdW50ICsgIjogcmV0cmlldmVyPSIgKyByZXRyaWV2ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlU3Ryb25nQmluZGVyKHJldHJpZXZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIGludCBjb250ZW50cyA9IDA7CisgICAgICAgIGZpbmFsIExpc3Q8VD4gbGlzdCA9IGdldExpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb250ZW50cyB8PSBsaXN0LmdldChpKS5kZXNjcmliZUNvbnRlbnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPE1lZGlhUGFyY2VsZWRMaXN0U2xpY2U+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYVBhcmNlbGVkTGlzdFNsaWNlPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UoaW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFQYXJjZWxlZExpc3RTbGljZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvUmF0aW5nLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjMzM2YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitwYXJjZWxhYmxlIFJhdGluZzsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9SYXRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQ1MzY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1JhdGluZy5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogQSBjbGFzcyB0byBlbmNhcHN1bGF0ZSByYXRpbmcgaW5mb3JtYXRpb24gdXNlZCBhcyBjb250ZW50IG1ldGFkYXRhLgorICogQSByYXRpbmcgaXMgZGVmaW5lZCBieSBpdHMgcmF0aW5nIHN0eWxlIChzZWUge0BsaW5rICNSQVRJTkdfSEVBUlR9LAorICoge0BsaW5rICNSQVRJTkdfVEhVTUJfVVBfRE9XTn0sIHtAbGluayAjUkFUSU5HXzNfU1RBUlN9LCB7QGxpbmsgI1JBVElOR180X1NUQVJTfSwKKyAqIHtAbGluayAjUkFUSU5HXzVfU1RBUlN9IG9yIHtAbGluayAjUkFUSU5HX1BFUkNFTlRBR0V9KSBhbmQgdGhlIGFjdHVhbCByYXRpbmcgdmFsdWUgKHdoaWNoIG1heQorICogYmUgZGVmaW5lZCBhcyAidW5yYXRlZCIpLCBib3RoIG9mIHdoaWNoIGFyZSBkZWZpbmVkIHdoZW4gdGhlIHJhdGluZyBpbnN0YW5jZSBpcyBjb25zdHJ1Y3RlZAorICogdGhyb3VnaCBvbmUgb2YgdGhlIGZhY3RvcnkgbWV0aG9kcy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJhdGluZyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiUmF0aW5nIjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQEludERlZih7UkFUSU5HX05PTkUsIFJBVElOR19IRUFSVCwgUkFUSU5HX1RIVU1CX1VQX0RPV04sIFJBVElOR18zX1NUQVJTLCBSQVRJTkdfNF9TVEFSUywKKyAgICAgICAgICAgIFJBVElOR181X1NUQVJTLCBSQVRJTkdfUEVSQ0VOVEFHRX0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0eWxlIHt9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBJbnREZWYoe1JBVElOR18zX1NUQVJTLCBSQVRJTkdfNF9TVEFSUywgUkFUSU5HXzVfU1RBUlN9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBTdGFyU3R5bGUge30KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBhIHJhdGluZyBzdHlsZSBpcyBub3Qgc3VwcG9ydGVkLiBBIFJhdGluZyB3aWxsIG5ldmVyIGhhdmUgdGhpcworICAgICAqIHR5cGUsIGJ1dCBjYW4gYmUgdXNlZCBieSBvdGhlciBjbGFzc2VzIHRvIGluZGljYXRlIHRoZXkgZG8gbm90IHN1cHBvcnQKKyAgICAgKiBSYXRpbmcuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkFUSU5HX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogQSByYXRpbmcgc3R5bGUgd2l0aCBhIHNpbmdsZSBkZWdyZWUgb2YgcmF0aW5nLCAiaGVhcnQiIHZzICJubyBoZWFydCIuIENhbiBiZSB1c2VkIHRvCisgICAgICogaW5kaWNhdGUgdGhlIGNvbnRlbnQgcmVmZXJyZWQgdG8gaXMgYSBmYXZvcml0ZSAob3Igbm90KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSQVRJTkdfSEVBUlQgPSAxOworCisgICAgLyoqCisgICAgICogQSByYXRpbmcgc3R5bGUgZm9yICJ0aHVtYiB1cCIgdnMgInRodW1iIGRvd24iLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR19USFVNQl9VUF9ET1dOID0gMjsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggMCB0byAzIHN0YXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR18zX1NUQVJTID0gMzsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggMCB0byA0IHN0YXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR180X1NUQVJTID0gNDsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIHdpdGggMCB0byA1IHN0YXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJBVElOR181X1NUQVJTID0gNTsKKworICAgIC8qKgorICAgICAqIEEgcmF0aW5nIHN0eWxlIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkFUSU5HX1BFUkNFTlRBR0UgPSA2OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJhdGluZ1N0eWxlOworCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7CisKKyAgICBwcml2YXRlIFJhdGluZyhAU3R5bGUgaW50IHJhdGluZ1N0eWxlLCBmbG9hdCByYXRpbmcpIHsKKyAgICAgICAgbVJhdGluZ1N0eWxlID0gcmF0aW5nU3R5bGU7CisgICAgICAgIG1SYXRpbmdWYWx1ZSA9IHJhdGluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlJhdGluZzpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgorICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVJhdGluZ1N0eWxlKTsKKyAgICAgICAgZGVzdC53cml0ZUZsb2F0KG1SYXRpbmdWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8UmF0aW5nPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UmF0aW5nPigpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYnVpbGRzIGEgUmF0aW5nIHByZXZpb3VzbHkgc3RvcmVkIHdpdGggd3JpdGVUb1BhcmNlbCgpLgorICAgICAgICAgKiBAcGFyYW0gcCAgICBQYXJjZWwgb2JqZWN0IHRvIHJlYWQgdGhlIFJhdGluZyBmcm9tCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgUmF0aW5nIGNyZWF0ZWQgZnJvbSB0aGUgZGF0YSBpbiB0aGUgcGFyY2VsCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJhdGluZyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZyhwLnJlYWRJbnQoKSwgcC5yZWFkRmxvYXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJhdGluZ1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZ1tzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBubyByYXRpbmcuCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlIHdpdGggbm8gcmF0aW5nIGtub3duIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiByYXRpbmcgc3R5bGUuCisgICAgICogQHBhcmFtIHJhdGluZ1N0eWxlIG9uZSBvZiB7QGxpbmsgI1JBVElOR19IRUFSVH0sIHtAbGluayAjUkFUSU5HX1RIVU1CX1VQX0RPV059LAorICAgICAqICAgIHtAbGluayAjUkFUSU5HXzNfU1RBUlN9LCB7QGxpbmsgI1JBVElOR180X1NUQVJTfSwge0BsaW5rICNSQVRJTkdfNV9TVEFSU30sCisgICAgICogICAgb3Ige0BsaW5rICNSQVRJTkdfUEVSQ0VOVEFHRX0uCisgICAgICogQHJldHVybiBudWxsIGlmIGFuIGludmFsaWQgcmF0aW5nIHN0eWxlIGlzIHBhc3NlZCwgYSBuZXcgUmF0aW5nIGluc3RhbmNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZyBuZXdVbnJhdGVkUmF0aW5nKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUpIHsKKyAgICAgICAgc3dpdGNoKHJhdGluZ1N0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFJBVElOR19IRUFSVDoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HX1RIVU1CX1VQX0RPV046CisgICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR19QRVJDRU5UQUdFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIGhlYXJ0LWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHJhdGluZyBzdHlsZSBvZiB7QGxpbmsgI1JBVElOR19IRUFSVH0sCisgICAgICogYW5kIGEgaGVhcnQtYmFzZWQgcmF0aW5nLgorICAgICAqIEBwYXJhbSBoYXNIZWFydCB0cnVlIGZvciBhICJoZWFydCBzZWxlY3RlZCIgcmF0aW5nLCBmYWxzZSBmb3IgImhlYXJ0IHVuc2VsZWN0ZWQiLgorICAgICAqIEByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nIG5ld0hlYXJ0UmF0aW5nKGJvb2xlYW4gaGFzSGVhcnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHRodW1iLWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHtAbGluayAjUkFUSU5HX1RIVU1CX1VQX0RPV059CisgICAgICogcmF0aW5nIHN0eWxlLCBhbmQgYSAidGh1bWIgdXAiIG9yICJ0aHVtYiBkb3duIiByYXRpbmcuCisgICAgICogQHBhcmFtIHRodW1iSXNVcCB0cnVlIGZvciBhICJ0aHVtYiB1cCIgcmF0aW5nLCBmYWxzZSBmb3IgInRodW1iIGRvd24iLgorICAgICAqIEByZXR1cm4gYSBuZXcgUmF0aW5nIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nIG5ld1RodW1iUmF0aW5nKGJvb2xlYW4gdGh1bWJJc1VwKSB7CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKFJBVElOR19USFVNQl9VUF9ET1dOLCB0aHVtYklzVXAgPyAxLjBmIDogMC4wZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUmF0aW5nIGluc3RhbmNlIHdpdGggYSBzdGFyLWJhc2VkIHJhdGluZy4KKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBvbmUgb2YgdGhlIHN0YXItYmFzZSByYXRpbmcgc3R5bGVzCisgICAgICogYW5kIHRoZSBnaXZlbiBpbnRlZ2VyIG9yIGZyYWN0aW9uYWwgbnVtYmVyIG9mIHN0YXJzLiBOb24gaW50ZWdlciB2YWx1ZXMgY2FuIGZvciBpbnN0YW5jZQorICAgICAqIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIGF2ZXJhZ2UgcmF0aW5nIHZhbHVlLCB3aGljaCBtaWdodCBub3QgYmUgYW4gaW50ZWdlciBudW1iZXIgb2Ygc3RhcnMuCisgICAgICogQHBhcmFtIHN0YXJSYXRpbmdTdHlsZSBvbmUgb2Yge0BsaW5rICNSQVRJTkdfM19TVEFSU30sIHtAbGluayAjUkFUSU5HXzRfU1RBUlN9LAorICAgICAqICAgICB7QGxpbmsgI1JBVElOR181X1NUQVJTfS4KKyAgICAgKiBAcGFyYW0gc3RhclJhdGluZyBhIG51bWJlciByYW5naW5nIGZyb20gMC4wZiB0byAzLjBmLCA0LjBmIG9yIDUuMGYgYWNjb3JkaW5nIHRvCisgICAgICogICAgIHRoZSByYXRpbmcgc3R5bGUuCisgICAgICogQHJldHVybiBudWxsIGlmIHRoZSByYXRpbmcgc3R5bGUgaXMgaW52YWxpZCwgb3IgdGhlIHJhdGluZyBpcyBvdXQgb2YgcmFuZ2UsCisgICAgICogICAgIGEgbmV3IFJhdGluZyBpbnN0YW5jZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcgbmV3U3RhclJhdGluZyhAU3RhclN0eWxlIGludCBzdGFyUmF0aW5nU3R5bGUsIGZsb2F0IHN0YXJSYXRpbmcpIHsKKyAgICAgICAgZmxvYXQgbWF4UmF0aW5nID0gLTEuMGY7CisgICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGFyUmF0aW5nIDwgMC4wZikgfHwgKHN0YXJSYXRpbmcgPiBtYXhSYXRpbmcpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJUcnlpbmcgdG8gc2V0IG91dCBvZiByYW5nZSBzdGFyLWJhc2VkIHJhdGluZyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSYXRpbmcgaW5zdGFuY2Ugd2l0aCBhIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nLgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJhdGluZyBpbnN0YW5jZSB3aXRoIGEge0BsaW5rICNSQVRJTkdfUEVSQ0VOVEFHRX0KKyAgICAgKiByYXRpbmcgc3R5bGUsIGFuZCBhIHJhdGluZyBvZiB0aGUgZ2l2ZW4gcGVyY2VudGFnZS4KKyAgICAgKiBAcGFyYW0gcGVyY2VudCB0aGUgdmFsdWUgb2YgdGhlIHJhdGluZworICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgcmF0aW5nIGlzIG91dCBvZiByYW5nZSwgYSBuZXcgUmF0aW5nIGluc3RhbmNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJhdGluZyBuZXdQZXJjZW50YWdlUmF0aW5nKGZsb2F0IHBlcmNlbnQpIHsKKyAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nKFJBVElOR19QRVJDRU5UQUdFLCBwZXJjZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgcmF0aW5nIHZhbHVlIGF2YWlsYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGluc3RhbmNlIHdhcyBub3QgY3JlYXRlZCB3aXRoIHtAbGluayAjbmV3VW5yYXRlZFJhdGluZyhpbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkKCkgeworICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlID49IDAuMGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByYXRpbmcgc3R5bGUuCisgICAgICogQHJldHVybiBvbmUgb2Yge0BsaW5rICNSQVRJTkdfSEVBUlR9LCB7QGxpbmsgI1JBVElOR19USFVNQl9VUF9ET1dOfSwKKyAgICAgKiAgICB7QGxpbmsgI1JBVElOR18zX1NUQVJTfSwge0BsaW5rICNSQVRJTkdfNF9TVEFSU30sIHtAbGluayAjUkFUSU5HXzVfU1RBUlN9LAorICAgICAqICAgIG9yIHtAbGluayAjUkFUSU5HX1BFUkNFTlRBR0V9LgorICAgICAqLworICAgIEBTdHlsZQorICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhdGluZyBpcyAiaGVhcnQgc2VsZWN0ZWQiLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmF0aW5nIGlzICJoZWFydCBzZWxlY3RlZCIsIGZhbHNlIGlmIHRoZSByYXRpbmcgaXMgImhlYXJ0IHVuc2VsZWN0ZWQiLAorICAgICAqICAgIGlmIHRoZSByYXRpbmcgc3R5bGUgaXMgbm90IHtAbGluayAjUkFUSU5HX0hFQVJUfSBvciBpZiBpdCBpcyB1bnJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYXJ0KCkgeworICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgcmF0aW5nIGlzICJ0aHVtYiB1cCIuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByYXRpbmcgaXMgInRodW1iIHVwIiwgZmFsc2UgaWYgdGhlIHJhdGluZyBpcyAidGh1bWIgZG93biIsCisgICAgICogICAgaWYgdGhlIHJhdGluZyBzdHlsZSBpcyBub3Qge0BsaW5rICNSQVRJTkdfVEhVTUJfVVBfRE9XTn0gb3IgaWYgaXQgaXMgdW5yYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXAoKSB7CisgICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGFyLWJhc2VkIHJhdGluZyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgcmF0aW5nIHZhbHVlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4wZiwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcmF0aW5nIHN0eWxlIGlzCisgICAgICogICAgbm90IHN0YXItYmFzZWQsIG9yIGlmIGl0IGlzIHVucmF0ZWQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmcoKSB7CisgICAgICAgIHN3aXRjaCAobVJhdGluZ1N0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfNF9TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICAgICAgaWYgKGlzUmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwZXJjZW50YWdlLWJhc2VkIHJhdGluZyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgcmF0aW5nIHZhbHVlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4wZiwgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcmF0aW5nIHN0eWxlIGlzCisgICAgICogICAgbm90IHBlcmNlbnRhZ2UtYmFzZWQsIG9yIGlmIGl0IGlzIHVucmF0ZWQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmcoKSB7CisgICAgICAgIGlmICgobVJhdGluZ1N0eWxlICE9IFJBVElOR19QRVJDRU5UQUdFKSB8fCAhaXNSYXRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzAxN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBIYW5kbGVzIHJlcXVlc3RzIHRvIGFkanVzdCBvciBzZXQgdGhlIHZvbHVtZSBvbiBhIHNlc3Npb24uIFRoaXMgaXMgYWxzbyB1c2VkCisgKiB0byBwdXNoIHZvbHVtZSB1cGRhdGVzIGJhY2sgdG8gdGhlIHNlc3Npb24uIFRoZSBwcm92aWRlciBtdXN0IGNhbGwKKyAqIHtAbGluayAjc2V0Q3VycmVudFZvbHVtZShpbnQpfSBlYWNoIHRpbWUgdGhlIHZvbHVtZSBiZWluZyBwcm92aWRlZCBjaGFuZ2VzLgorICogPHA+CisgKiBZb3UgY2FuIHNldCBhIHZvbHVtZSBwcm92aWRlciBvbiBhIHNlc3Npb24gYnkgY2FsbGluZworICoge0BsaW5rIE1lZGlhU2Vzc2lvbiNzZXRQbGF5YmFja1RvUmVtb3RlfS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFZvbHVtZVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQEludERlZih7Vk9MVU1FX0NPTlRST0xfRklYRUQsIFZPTFVNRV9DT05UUk9MX1JFTEFUSVZFLCBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURX0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnRyb2xUeXBlIHt9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdm9sdW1lIGlzIGZpeGVkIGFuZCBjYW4gbm90IGJlIG1vZGlmaWVkLiBSZXF1ZXN0cyB0byBjaGFuZ2Ugdm9sdW1lCisgICAgICogc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0NPTlRST0xfRklYRUQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHZvbHVtZSBjb250cm9sIHVzZXMgcmVsYXRpdmUgYWRqdXN0bWVudCB2aWEKKyAgICAgKiB7QGxpbmsgI29uQWRqdXN0Vm9sdW1lKGludCl9LiBBdHRlbXB0cyB0byBzZXQgdGhlIHZvbHVtZSB0byBhIHNwZWNpZmljCisgICAgICogdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0NPTlRST0xfUkVMQVRJVkUgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIHZvbHVtZSBjb250cm9sIHVzZXMgYW4gYWJzb2x1dGUgdmFsdWUuIEl0IG1heSBiZSBhZGp1c3RlZCB1c2luZworICAgICAqIHtAbGluayAjb25BZGp1c3RWb2x1bWUoaW50KX0gb3Igc2V0IGRpcmVjdGx5IHVzaW5nCisgICAgICoge0BsaW5rICNvblNldFZvbHVtZVRvKGludCl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFID0gMjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4Vm9sdW1lOworICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOworICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHZvbHVtZSBwcm92aWRlciBmb3IgaGFuZGxpbmcgdm9sdW1lIGV2ZW50cy4gWW91IG11c3Qgc3BlY2lmeQorICAgICAqIHRoZSB0eXBlIG9mIHZvbHVtZSBjb250cm9sLCB0aGUgbWF4aW11bSB2b2x1bWUgdGhhdCBjYW4gYmUgdXNlZCwgYW5kIHRoZQorICAgICAqIGN1cnJlbnQgdm9sdW1lIG9uIHRoZSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdm9sdW1lQ29udHJvbCBUaGUgbWV0aG9kIGZvciBjb250cm9sbGluZyB2b2x1bWUgdGhhdCBpcyB1c2VkIGJ5CisgICAgICogICAgICAgICAgICB0aGlzIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBtYXhWb2x1bWUgVGhlIG1heGltdW0gYWxsb3dlZCB2b2x1bWUuCisgICAgICogQHBhcmFtIGN1cnJlbnRWb2x1bWUgVGhlIGN1cnJlbnQgdm9sdW1lIG9uIHRoZSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIFZvbHVtZVByb3ZpZGVyKEBDb250cm9sVHlwZSBpbnQgdm9sdW1lQ29udHJvbCwgaW50IG1heFZvbHVtZSwgaW50IGN1cnJlbnRWb2x1bWUpIHsKKyAgICAgICAgbUNvbnRyb2xUeXBlID0gdm9sdW1lQ29udHJvbDsKKyAgICAgICAgbU1heFZvbHVtZSA9IG1heFZvbHVtZTsKKyAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdm9sdW1lIGNvbnRyb2wgdHlwZSB0aGF0IHRoaXMgdm9sdW1lIHByb3ZpZGVyIHVzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2b2x1bWUgY29udHJvbCB0eXBlIGZvciB0aGlzIHZvbHVtZSBwcm92aWRlcgorICAgICAqLworICAgIEBDb250cm9sVHlwZQorICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vm9sdW1lQ29udHJvbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250cm9sVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1heGltdW0gdm9sdW1lIHRoaXMgcHJvdmlkZXIgYWxsb3dzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbWF4IGFsbG93ZWQgdm9sdW1lLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TWF4Vm9sdW1lKCkgeworICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZvbHVtZS4gVGhpcyB3aWxsIGJlIHRoZSBsYXN0IHZhbHVlIHNldCBieQorICAgICAqIHtAbGluayAjc2V0Q3VycmVudFZvbHVtZShpbnQpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdm9sdW1lLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q3VycmVudFZvbHVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgc3lzdGVtIHRoYXQgdGhlIGN1cnJlbnQgdm9sdW1lIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbXVzdCBiZQorICAgICAqIGNhbGxlZCBldmVyeSB0aW1lIHRoZSB2b2x1bWUgY2hhbmdlcyB0byBlbnN1cmUgaXQgaXMgZGlzcGxheWVkIHByb3Blcmx5LgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRWb2x1bWUgVGhlIGN1cnJlbnQgdm9sdW1lIG9uIHRoZSBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q3VycmVudFZvbHVtZShpbnQgY3VycmVudFZvbHVtZSkgeworICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgY3VycmVudCBvdXRwdXQuCisgICAgICogQWZ0ZXIgdGhlIHZvbHVtZSBoYXMgYmVlbiBtb2RpZmllZCB7QGxpbmsgI3NldEN1cnJlbnRWb2x1bWV9IG11c3QgYmUKKyAgICAgKiBjYWxsZWQgdG8gbm90aWZ5IHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdm9sdW1lIFRoZSB2b2x1bWUgdG8gc2V0IHRoZSBvdXRwdXQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhpbnQgdm9sdW1lKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIGFkanVzdCB0aGUgdm9sdW1lIG9mIHRoZSBjdXJyZW50IG91dHB1dC4KKyAgICAgKiBEaXJlY3Rpb24gd2lsbCBiZSBvbmUgb2Yge0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfTE9XRVJ9LAorICAgICAqIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX1JBSVNFfSwge0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfU0FNRX0uCisgICAgICogQWZ0ZXIgdGhlIHZvbHVtZSBoYXMgYmVlbiBtb2RpZmllZCB7QGxpbmsgI3NldEN1cnJlbnRWb2x1bWV9IG11c3QgYmUKKyAgICAgKiBjYWxsZWQgdG8gbm90aWZ5IHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gY2hhbmdlIHRoZSB2b2x1bWUgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoaW50IGRpcmVjdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2VzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciB2b2x1bWVQcm92aWRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyZTA5NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9icm93c2UvTWVkaWFCcm93c2VyLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5icm93c2U7CisKK3BhcmNlbGFibGUgTWVkaWFCcm93c2VyLk1lZGlhSXRlbTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3Nlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWIxNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDExNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuYnJvd3NlOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYURlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQYXJjZWxlZExpc3RTbGljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuSU1lZGlhQnJvd3NlclNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLklNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKKy8qKgorICogQnJvd3NlcyBtZWRpYSBjb250ZW50IG9mZmVyZWQgYnkgYSBsaW5rIE1lZGlhQnJvd3NlclNlcnZpY2UuCisgKiA8cD4KKyAqIFRoaXMgb2JqZWN0IGlzIG5vdCB0aHJlYWQtc2FmZS4gQWxsIGNhbGxzIHNob3VsZCBoYXBwZW4gb24gdGhlIHRocmVhZCBvbiB3aGljaCB0aGUgYnJvd3NlcgorICogd2FzIGNvbnN0cnVjdGVkLgorICogPC9wPgorICogPGgzPlN0YW5kYXJkIEV4dHJhIERhdGE8L2gzPgorICoKKyAqIDxwPlRoZXNlIGFyZSB0aGUgY3VycmVudCBzdGFuZGFyZCBmaWVsZHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBleHRyYSBkYXRhIHZpYQorICoge0BsaW5rICNzdWJzY3JpYmUoU3RyaW5nLCBCdW5kbGUsIFN1YnNjcmlwdGlvbkNhbGxiYWNrKX0sCisgKiB7QGxpbmsgI3Vuc3Vic2NyaWJlKFN0cmluZywgU3Vic2NyaXB0aW9uQ2FsbGJhY2spfSwgYW5kCisgKiB7QGxpbmsgU3Vic2NyaXB0aW9uQ2FsbGJhY2sjb25DaGlsZHJlbkxvYWRlZChTdHJpbmcsIExpc3QsIEJ1bmRsZSl9LgorICoKKyAqIDx1bD4KKyAqICAgICA8bGk+IHtAbGluayAjRVhUUkFfUEFHRX0KKyAqICAgICA8bGk+IHtAbGluayAjRVhUUkFfUEFHRV9TSVpFfQorICogPC91bD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhQnJvd3NlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUJyb3dzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGFuIGludCBleHRyYSBmaWVsZCB0byBkZW5vdGUgdGhlIHBhZ2UgbnVtYmVyIHRvIHN1YnNjcmliZS4KKyAgICAgKiBUaGUgdmFsdWUgb2Yge0Bjb2RlIEVYVFJBX1BBR0V9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4KKyAgICAgKgorICAgICAqIEBzZWUgI0VYVFJBX1BBR0VfU0laRQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BBR0UgPSAiYW5kcm9pZC5tZWRpYS5icm93c2UuZXh0cmEuUEFHRSI7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGFuIGludCBleHRyYSBmaWVsZCB0byBkZW5vdGUgdGhlIG51bWJlciBvZiBtZWRpYSBpdGVtcyBpbiBhIHBhZ2UuCisgICAgICogVGhlIHZhbHVlIG9mIHtAY29kZSBFWFRSQV9QQUdFX1NJWkV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4KKyAgICAgKgorICAgICAqIEBzZWUgI0VYVFJBX1BBR0UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQUdFX1NJWkUgPSAiYW5kcm9pZC5tZWRpYS5icm93c2UuZXh0cmEuUEFHRV9TSVpFIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORyA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfU1RBVEVfQ09OTkVDVEVEID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9TVEFURV9TVVNQRU5ERUQgPSA0OworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtU2VydmljZUNvbXBvbmVudDsKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbVJvb3RIaW50czsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBTdWJzY3JpcHRpb24+IG1TdWJzY3JpcHRpb25zID0gbmV3IEFycmF5TWFwPD4oKTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEOworICAgIHByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIG1Sb290SWQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBNZWRpYVNlc3Npb24uVG9rZW4gbU1lZGlhU2Vzc2lvblRva2VuOworICAgIHByaXZhdGUgdm9sYXRpbGUgQnVuZGxlIG1FeHRyYXM7CisKKyAgICBwcml2YXRlIE1lZGlhU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uOworICAgIHByaXZhdGUgSU1lZGlhQnJvd3NlclNlcnZpY2UgbVNlcnZpY2VCaW5kZXI7CisgICAgcHJpdmF0ZSBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBtU2VydmljZUNhbGxiYWNrczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtZWRpYSBicm93c2VyIGZvciB0aGUgc3BlY2lmaWVkIG1lZGlhIGJyb3dzZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlQ29tcG9uZW50IFRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY29ubmVjdGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcGFyYW0gcm9vdEhpbnRzIEFuIG9wdGlvbmFsIGJ1bmRsZSBvZiBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyB0byBzZW5kCisgICAgICogdG8gdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZSB3aGVuIGNvbm5lY3RpbmcgYW5kIHJldHJpZXZpbmcgdGhlIHJvb3QgaWQKKyAgICAgKiBmb3IgYnJvd3NpbmcsIG9yIG51bGwgaWYgbm9uZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlIG1heSBhZmZlY3QKKyAgICAgKiB0aGUgaW5mb3JtYXRpb24gcmV0dXJuZWQgd2hlbiBicm93c2luZy4KKyAgICAgKiBAc2VlIGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlLkJyb3dzZXJSb290I0VYVFJBX1JFQ0VOVAorICAgICAqIEBzZWUgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLk1lZGlhQnJvd3NlclNlcnZpY2UuQnJvd3NlclJvb3QjRVhUUkFfT0ZGTElORQorICAgICAqIEBzZWUgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLk1lZGlhQnJvd3NlclNlcnZpY2UuQnJvd3NlclJvb3QjRVhUUkFfU1VHR0VTVEVECisgICAgICovCisgICAgcHVibGljIE1lZGlhQnJvd3NlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgc2VydmljZUNvbXBvbmVudCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgQnVuZGxlIHJvb3RIaW50cykgeworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmljZUNvbXBvbmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlIGNvbXBvbmVudCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbm5lY3Rpb24gY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVNlcnZpY2VDb21wb25lbnQgPSBzZXJ2aWNlQ29tcG9uZW50OworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgbVJvb3RIaW50cyA9IHJvb3RIaW50cyA9PSBudWxsID8gbnVsbCA6IG5ldyBCdW5kbGUocm9vdEhpbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjb25uZWN0aW9uIGNhbGxiYWNrIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBpbnZva2VkCisgICAgICogd2hlbiB0aGUgY29ubmVjdGlvbiBjb21wbGV0ZXMgb3IgZmFpbHMuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7CisgICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HICYmIG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdCgpIGNhbGxlZCB3aGlsZSBuZWl0aGVyIGRpc2Nvbm5lY3Rpbmcgbm9yICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZGlzY29ubmVjdGVkIChzdGF0ZT0iICsgZ2V0U3RhdGVMYWJlbChtU3RhdGUpICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORzsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORzsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBleHRyYSBjaGVjay4KKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1TZXJ2aWNlQ29ubmVjdGlvbiBzaG91bGQgYmUgbnVsbC4gSW5zdGVhZCBpdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzICIgKyBtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZUJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtU2VydmljZUJpbmRlciBzaG91bGQgYmUgbnVsbC4gSW5zdGVhZCBpdCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2VydmljZUJpbmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJtU2VydmljZUNhbGxiYWNrcyBzaG91bGQgYmUgbnVsbC4gSW5zdGVhZCBpdCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFCcm93c2VyU2VydmljZS5TRVJWSUNFX0lOVEVSRkFDRSk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChtU2VydmljZUNvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgTWVkaWFTZXJ2aWNlQ29ubmVjdGlvbigpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBib3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJvdW5kID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIGJpbmRpbmcgdG8gc2VydmljZSAiICsgbVNlcnZpY2VDb21wb25lbnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGVsbCB0aGVtIHRoYXQgaXQgZGlkbid0IHdvcmsuCisgICAgICAgICAgICAgICAgICAgIGZvcmNlQ2xvc2VDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkNvbm5lY3Rpb25GYWlsZWQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNvbm5lY3QuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdHMgZnJvbSB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlLgorICAgICAqIEFmdGVyIHRoaXMsIG5vIG1vcmUgY2FsbGJhY2tzIHdpbGwgYmUgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgLy8gSXQncyBvayB0byBjYWxsIHRoaXMgYW55IHN0YXRlLCBiZWNhdXNlIGFsbG93aW5nIHRoaXMgbGV0cyBhcHBzIG5vdCBoYXZlCisgICAgICAgIC8vIHRvIGNoZWNrIGlzQ29ubmVjdGVkKCkgdW5uZWNlc3NhcmlseS4gVGhleSB3b24ndCBhcHByZWNpYXRlIHRoZSBleHRyYQorICAgICAgICAvLyBhc3NlcnRpb25zIGZvciB0aGlzLiBXZSBkbyBldmVyeXRoaW5nIHdlIGNhbiBoZXJlIHRvIGdvIGJhY2sgdG8gYSBzYW5lIHN0YXRlLgorICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkc7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gY29ubmVjdCgpIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhpcy4gVGhlbiB3ZSB3aWxsIGRpc2Nvbm5lY3QgYW5kIHJlY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2VDYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIuZGlzY29ubmVjdChtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGRpc2Nvbm5lY3RpbmcgYW55d2F5LiBMb2csIGp1c3QgZm9yIHBvc3Rlcml0eSBidXQgaXQncyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgYmlnIHByb2JsZW0uCisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZW1vdGVFeGNlcHRpb24gZHVyaW5nIGNvbm5lY3QgZm9yICIgKyBtU2VydmljZUNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gbVN0YXRlOworICAgICAgICAgICAgICAgIGZvcmNlQ2xvc2VDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXRlIHdhcyBub3QgQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HLCBrZWVwIHRoZSBzdGF0ZSBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIG9wZXJhdGlvbiBjYW1lIGFmdGVyIGRpc2Nvbm5lY3QoKSBjYW4gYmUgaGFuZGxlZCBwcm9wZXJseS4KKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImRpc2Nvbm5lY3QuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTnVsbCBvdXQgdGhlIHZhcmlhYmxlcyBhbmQgdW5iaW5kIGZyb20gdGhlIHNlcnZpY2UuIFRoaXMgZG9lc24ndCBpbmNsdWRlCisgICAgICogY2FsbGluZyBkaXNjb25uZWN0IG9uIHRoZSBzZXJ2aWNlLCBiZWNhdXNlIHdlIG9ubHkgdHJ5IHRvIGRvIHRoYXQgaW4gdGhlCisgICAgICogY2xlYW4gc2h1dGRvd24gY2FzZXMuCisgICAgICogPHA+CisgICAgICogRXZlcnl3aGVyZSB0aGF0IGNhbGxzIHRoaXMgRVhDRVBUIGZvciBkaXNjb25uZWN0KCkgc2hvdWxkIGZvbGxvdyBpdCB3aXRoCisgICAgICogYSBjYWxsIHRvIG1DYWxsYmFjay5vbkNvbm5lY3Rpb25GYWlsZWQoKS4gRGlzY29ubmVjdCBkb2Vzbid0IGRvIHRoYXQgY2FsbGJhY2sKKyAgICAgKiBmb3IgYSBjbGVhbiBzaHV0ZG93biwgYnV0IGV2ZXJ5d2hlcmUgZWxzZSBpcyBhIGRpcnR5IHNodXRkb3duIGFuZCBzaG91bGQKKyAgICAgKiBub3RpZnkgdGhlIGFwcC4KKyAgICAgKiA8cD4KKyAgICAgKiBBbHNvLCBtU3RhdGUgc2hvdWxkIGJlIHVwZGF0ZWQgcHJvcGVybHkuIE1vc3RseSBpdCBzaG91bGQgYmUgQ09OTkVDVF9TVEFURV9ESUFDT05ORUNURUQKKyAgICAgKiBleGNlcHQgZm9yIGRpc2Nvbm5lY3QoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9yY2VDbG9zZUNvbm5lY3Rpb24oKSB7CisgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAidW5iaW5kU2VydmljZSBmYWlsZWQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN0YXRlID0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIG1TZXJ2aWNlQmluZGVyID0gbnVsbDsKKyAgICAgICAgbVNlcnZpY2VDYWxsYmFja3MgPSBudWxsOworICAgICAgICBtUm9vdElkID0gbnVsbDsKKyAgICAgICAgbU1lZGlhU2Vzc2lvblRva2VuID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgY29ubmVjdGVkIHRvIHRoZSBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworICAgICAgICByZXR1cm4gbVN0YXRlID09IENPTk5FQ1RfU1RBVEVfQ09OTkVDVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlcnZpY2UgY29tcG9uZW50IHRoYXQgdGhlIG1lZGlhIGJyb3dzZXIgaXMgY29ubmVjdGVkIHRvLgorICAgICAqLworICAgIHB1YmxpYyBATm9uTnVsbCBDb21wb25lbnROYW1lIGdldFNlcnZpY2VDb21wb25lbnQoKSB7CisgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0U2VydmljZUNvbXBvbmVudCgpIGNhbGxlZCB3aGlsZSBub3QgY29ubmVjdGVkIiArCisgICAgICAgICAgICAgICAgICAgICIgKHN0YXRlPSIgKyBtU3RhdGUgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU2VydmljZUNvbXBvbmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IGlkLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgcm9vdCBpZCBtYXkgYmVjb21lIGludmFsaWQgb3IgY2hhbmdlIHdoZW4gdGhlCisgICAgICogYnJvd3NlciBpcyBkaXNjb25uZWN0ZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbm90IGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgU3RyaW5nIGdldFJvb3QoKSB7CisgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0Um9vdCgpIGNhbGxlZCB3aGlsZSBub3QgY29ubmVjdGVkIChzdGF0ZT0iCisgICAgICAgICAgICAgICAgICAgICsgZ2V0U3RhdGVMYWJlbChtU3RhdGUpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVJvb3RJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFueSBleHRyYXMgZm9yIHRoZSBtZWRpYSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbm90IGNvbm5lY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIGlmICghaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0RXh0cmFzKCkgY2FsbGVkIHdoaWxlIG5vdCBjb25uZWN0ZWQgKHN0YXRlPSIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRTdGF0ZUxhYmVsKG1TdGF0ZSkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHNlc3Npb24gdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBicm93c2VyLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgc2Vzc2lvbiB0b2tlbiBtYXkgYmVjb21lIGludmFsaWQgb3IgY2hhbmdlIHdoZW4gdGhlCisgICAgICogYnJvd3NlciBpcyBkaXNjb25uZWN0ZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiB0b2tlbiBmb3IgdGhlIGJyb3dzZXIsIG5ldmVyIG51bGwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBub3QgY29ubmVjdGVkLgorICAgICAqLworICAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFTZXNzaW9uLlRva2VuIGdldFNlc3Npb25Ub2tlbigpIHsKKyAgICAgICAgaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRTZXNzaW9uVG9rZW4oKSBjYWxsZWQgd2hpbGUgbm90IGNvbm5lY3RlZCAoc3RhdGU9IgorICAgICAgICAgICAgICAgICAgICArIG1TdGF0ZSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1NZWRpYVNlc3Npb25Ub2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbXMgdGhhdCBhcmUgY29udGFpbmVkIHdpdGhpbgorICAgICAqIHRoZSBzcGVjaWZpZWQgaWQgYW5kIHN1YnNjcmliZXMgdG8gcmVjZWl2ZSB1cGRhdGVzIHdoZW4gdGhleSBjaGFuZ2UuCisgICAgICogPHA+CisgICAgICogVGhlIGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucyBpcyBtYWludGFpbmVkIGV2ZW4gd2hlbiBub3QgY29ubmVjdGVkIGFuZCBpcworICAgICAqIHJlc3RvcmVkIGFmdGVyIHRoZSByZWNvbm5lY3Rpb24uIEl0IGlzIG9rIHRvIHN1YnNjcmliZSB3aGlsZSBub3QgY29ubmVjdGVkCisgICAgICogYnV0IHRoZSByZXN1bHRzIHdpbGwgbm90IGJlIHJldHVybmVkIHVudGlsIHRoZSBjb25uZWN0aW9uIGNvbXBsZXRlcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIGlkIGlzIGFscmVhZHkgc3Vic2NyaWJlZCB3aXRoIGEgZGlmZmVyZW50IGNhbGxiYWNrIHRoZW4gdGhlIG5ldworICAgICAqIGNhbGxiYWNrIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgb25lIGFuZCB0aGUgY2hpbGQgZGF0YSB3aWxsIGJlCisgICAgICogcmVsb2FkZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgbGlzdCBvZiBjaGlsZHJlbgorICAgICAqICAgICAgICAgICAgd2lsbCBiZSBzdWJzY3JpYmVkLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgbGlzdCBvZiBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBTdWJzY3JpcHRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBzdWJzY3JpYmVJbnRlcm5hbChwYXJlbnRJZCwgbnVsbCwgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgd2l0aCBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lZGlhIGl0ZW1zCisgICAgICogdGhhdCBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGlkIGFuZCBzdWJzY3JpYmVzIHRvIHJlY2VpdmUgdXBkYXRlcworICAgICAqIHdoZW4gdGhleSBjaGFuZ2UuCisgICAgICogPHA+CisgICAgICogVGhlIGxpc3Qgb2Ygc3Vic2NyaXB0aW9ucyBpcyBtYWludGFpbmVkIGV2ZW4gd2hlbiBub3QgY29ubmVjdGVkIGFuZCBpcworICAgICAqIHJlc3RvcmVkIGFmdGVyIHRoZSByZWNvbm5lY3Rpb24uIEl0IGlzIG9rIHRvIHN1YnNjcmliZSB3aGlsZSBub3QgY29ubmVjdGVkCisgICAgICogYnV0IHRoZSByZXN1bHRzIHdpbGwgbm90IGJlIHJldHVybmVkIHVudGlsIHRoZSBjb25uZWN0aW9uIGNvbXBsZXRlcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIGlkIGlzIGFscmVhZHkgc3Vic2NyaWJlZCB3aXRoIGEgZGlmZmVyZW50IGNhbGxiYWNrIHRoZW4gdGhlIG5ldworICAgICAqIGNhbGxiYWNrIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgb25lIGFuZCB0aGUgY2hpbGQgZGF0YSB3aWxsIGJlCisgICAgICogcmVsb2FkZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgbGlzdCBvZiBjaGlsZHJlbgorICAgICAqICAgICAgICAgICAgd2lsbCBiZSBzdWJzY3JpYmVkLgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgbWVkaWEKKyAgICAgKiAgICAgICAgICAgIGJyb3dzZXIgc2VydmljZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlIG1heSBhZmZlY3QgdGhlCisgICAgICogICAgICAgICAgICBpbmZvcm1hdGlvbiByZXR1cm5lZCB3aGVuIGJyb3dzaW5nLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgbGlzdCBvZiBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBCdW5kbGUgb3B0aW9ucywKKyAgICAgICAgICAgIEBOb25OdWxsIFN1YnNjcmlwdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9wdGlvbnMgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzdWJzY3JpYmVJbnRlcm5hbChwYXJlbnRJZCwgbmV3IEJ1bmRsZShvcHRpb25zKSwgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuc3Vic2NyaWJlcyBmb3IgY2hhbmdlcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBpZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcXVlcnkgY2FsbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgaW52b2tlZCBmb3IgcmVzdWx0cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIGlkIG9uY2UgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBsaXN0IG9mIGNoaWxkcmVuCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHVuc3Vic2NyaWJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQpIHsKKyAgICAgICAgdW5zdWJzY3JpYmVJbnRlcm5hbChwYXJlbnRJZCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5zdWJzY3JpYmVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGlkIHRocm91Z2ggYSBjYWxsYmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcXVlcnkgY2FsbGJhY2sgd2lsbCBubyBsb25nZXIgYmUgaW52b2tlZCBmb3IgcmVzdWx0cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIGlkIG9uY2UgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIGlkIG9mIHRoZSBwYXJlbnQgbWVkaWEgaXRlbSB3aG9zZSBsaXN0IG9mIGNoaWxkcmVuCisgICAgICogICAgICAgICAgICB3aWxsIGJlIHVuc3Vic2NyaWJlZC4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayBzZW50IHRvIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2UgdG8gc3Vic2NyaWJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdW5zdWJzY3JpYmVJbnRlcm5hbChwYXJlbnRJZCwgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIHNwZWNpZmljIHtAbGluayBNZWRpYUl0ZW19IGZyb20gdGhlIGNvbm5lY3RlZCBzZXJ2aWNlLiBOb3QKKyAgICAgKiBhbGwgc2VydmljZXMgbWF5IHN1cHBvcnQgdGhpcywgc28gZmFsbGluZyBiYWNrIHRvIHN1YnNjcmliaW5nIHRvIHRoZQorICAgICAqIHBhcmVudCdzIGlkIHNob3VsZCBiZSB1c2VkIHdoZW4gdW5hdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgaWQgb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmUuCisgICAgICogQHBhcmFtIGNiIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHRoZSByZXN1bHQgb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0SXRlbShmaW5hbCBATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE5vbk51bGwgZmluYWwgSXRlbUNhbGxiYWNrIGNiKSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtZWRpYUlkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBjYW5ub3QgYmUgZW1wdHkuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNiID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNiIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIk5vdCBjb25uZWN0ZWQsIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgTWVkaWFJdGVtLiIpOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjYi5vbkVycm9yKG1lZGlhSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IFJlc3VsdFJlY2VpdmVyKG1IYW5kbGVyKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUmVjZWl2ZVJlc3VsdChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdERhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Q29kZSAhPSAwIHx8IHJlc3VsdERhdGEgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXJlc3VsdERhdGEuY29udGFpbnNLZXkoTWVkaWFCcm93c2VyU2VydmljZS5LRVlfTUVESUFfSVRFTSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Iub25FcnJvcihtZWRpYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIGl0ZW0gPSByZXN1bHREYXRhLmdldFBhcmNlbGFibGUoTWVkaWFCcm93c2VyU2VydmljZS5LRVlfTUVESUFfSVRFTSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiAhKGl0ZW0gaW5zdGFuY2VvZiBNZWRpYUl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIGNiLm9uRXJyb3IobWVkaWFJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2Iub25JdGVtTG9hZGVkKChNZWRpYUl0ZW0paXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZUJpbmRlci5nZXRNZWRpYUl0ZW0obWVkaWFJZCwgcmVjZWl2ZXIsIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlJlbW90ZSBlcnJvciBnZXR0aW5nIG1lZGlhIGl0ZW0uIik7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGNiLm9uRXJyb3IobWVkaWFJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3Vic2NyaWJlSW50ZXJuYWwoU3RyaW5nIHBhcmVudElkLCBCdW5kbGUgb3B0aW9ucywgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgLy8gQ2hlY2sgYXJndW1lbnRzLgorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFyZW50SWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBjYW5ub3QgYmUgZW1wdHkuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVXBkYXRlIG9yIGNyZWF0ZSB0aGUgc3Vic2NyaXB0aW9uLgorICAgICAgICBTdWJzY3JpcHRpb24gc3ViID0gbVN1YnNjcmlwdGlvbnMuZ2V0KHBhcmVudElkKTsKKyAgICAgICAgaWYgKHN1YiA9PSBudWxsKSB7CisgICAgICAgICAgICBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7CisgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5wdXQocGFyZW50SWQsIHN1Yik7CisgICAgICAgIH0KKyAgICAgICAgc3ViLnB1dENhbGxiYWNrKG1Db250ZXh0LCBvcHRpb25zLCBjYWxsYmFjayk7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIGNvbm5lY3RlZCwgdGVsbCB0aGUgc2VydmljZSB0aGF0IHdlIGFyZSB3YXRjaGluZy4gSWYgd2UgYXJlbid0IGNvbm5lY3RlZCwKKyAgICAgICAgLy8gdGhlIHNlcnZpY2Ugd2lsbCBiZSB0b2xkIHdoZW4gd2UgY29ubmVjdC4KKyAgICAgICAgaWYgKGlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5hZGRTdWJzY3JpcHRpb25EZXByZWNhdGVkKHBhcmVudElkLCBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLmFkZFN1YnNjcmlwdGlvbihwYXJlbnRJZCwgY2FsbGJhY2subVRva2VuLCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBpcyBjcmFzaGluZy4gV2Ugd2lsbCBkaXNjb25uZWN0LCBhbmQgdXBvbiByZWNvbm5lY3Qgd2Ugd2lsbAorICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVyZWdpc3Rlci4gU28gbm90aGluZyB0byBkbyBoZXJlLgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFN1YnNjcmlwdGlvbiBmYWlsZWQgd2l0aCBSZW1vdGVFeGNlcHRpb24gcGFyZW50SWQ9IiArIHBhcmVudElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bnN1YnNjcmliZUludGVybmFsKFN0cmluZyBwYXJlbnRJZCwgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgLy8gQ2hlY2sgYXJndW1lbnRzLgorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFyZW50SWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBjYW5ub3QgYmUgZW1wdHkuIik7CisgICAgICAgIH0KKworICAgICAgICBTdWJzY3JpcHRpb24gc3ViID0gbVN1YnNjcmlwdGlvbnMuZ2V0KHBhcmVudElkKTsKKyAgICAgICAgaWYgKHN1YiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGVsbCB0aGUgc2VydmljZSBpZiBuZWNlc3NhcnkuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLnJlbW92ZVN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQocGFyZW50SWQsIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VCaW5kZXIucmVtb3ZlU3Vic2NyaXB0aW9uKHBhcmVudElkLCBudWxsLCBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN1YnNjcmlwdGlvbkNhbGxiYWNrPiBjYWxsYmFja3MgPSBzdWIuZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IG9wdGlvbnNMaXN0ID0gc3ViLmdldE9wdGlvbnNMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhbGxiYWNrcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzLmdldChpKSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5yZW1vdmVTdWJzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZCwgY2FsbGJhY2subVRva2VuLCBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0xpc3QucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgaXMgY3Jhc2hpbmcuIFdlIHdpbGwgZGlzY29ubmVjdCwgYW5kIHVwb24gcmVjb25uZWN0IHdlIHdpbGwKKyAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVyZWdpc3Rlci4gU28gbm90aGluZyB0byBkbyBoZXJlLgorICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlU3Vic2NyaXB0aW9uIGZhaWxlZCB3aXRoIFJlbW90ZUV4Y2VwdGlvbiBwYXJlbnRJZD0iICsgcGFyZW50SWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Yi5pc0VtcHR5KCkgfHwgY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKHBhcmVudElkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBkZWJ1Z2dpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0YXRlTGFiZWwoaW50IHN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HIjsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCI7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RfU1RBVEVfQ09OTkVDVElORyI7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfU1RBVEVfQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ09OTkVDVF9TVEFURV9DT05ORUNURUQiOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX1NUQVRFX1NVU1BFTkRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNPTk5FQ1RfU1RBVEVfU1VTUEVOREVEIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOLyIgKyBzdGF0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2ssCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9vdCwgZmluYWwgTWVkaWFTZXNzaW9uLlRva2VuIHNlc3Npb24sIGZpbmFsIEJ1bmRsZSBleHRyYSkgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBoYXNuJ3QgYmVlbiBhIGRpc2Nvbm5lY3Qgb3IgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAvLyBTZXJ2aWNlQ29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudChjYWxsYmFjaywgIm9uQ29ubmVjdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdGhlbSB0byBjYWxsIHVzIHR3aWNlLgorICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ29ubmVjdCBmcm9tIHNlcnZpY2Ugd2hpbGUgbVN0YXRlPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldFN0YXRlTGFiZWwobVN0YXRlKSArICIuLi4gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUm9vdElkID0gcm9vdDsKKyAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uVG9rZW4gPSBzZXNzaW9uOworICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYTsKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNUX1NUQVRFX0NPTk5FQ1RFRDsKKworICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2VydmljZUNhbGxiYWNrcy5vbkNvbm5lY3QuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQoKTsKKworICAgICAgICAgICAgICAgIC8vIHdlIG1heSByZWNlaXZlIHNvbWUgc3Vic2NyaXB0aW9ucyBiZWZvcmUgd2UgYXJlIGNvbm5lY3RlZCwgc28gcmUtc3Vic2NyaWJlCisgICAgICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBub3cKKyAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3Vic2NyaXB0aW9uPiBzdWJzY3JpcHRpb25FbnRyeSA6IG1TdWJzY3JpcHRpb25zLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gc3Vic2NyaXB0aW9uRW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIFN1YnNjcmlwdGlvbiBzdWIgPSBzdWJzY3JpcHRpb25FbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBMaXN0PFN1YnNjcmlwdGlvbkNhbGxiYWNrPiBjYWxsYmFja0xpc3QgPSBzdWIuZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBvcHRpb25zTGlzdCA9IHN1Yi5nZXRPcHRpb25zTGlzdCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlci5hZGRTdWJzY3JpcHRpb24oaWQsIGNhbGxiYWNrTGlzdC5nZXQoaSkubVRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0xpc3QuZ2V0KGkpLCBtU2VydmljZUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGlzIGNyYXNoaW5nLiBXZSB3aWxsIGRpc2Nvbm5lY3QsIGFuZCB1cG9uIHJlY29ubmVjdCB3ZSB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSByZXJlZ2lzdGVyLiBTbyBub3RoaW5nIHRvIGRvIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkU3Vic2NyaXB0aW9uIGZhaWxlZCB3aXRoIFJlbW90ZUV4Y2VwdGlvbiBwYXJlbnRJZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIG9uQ29ubmVjdGlvbkZhaWxlZChmaW5hbCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFjaykgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm9uQ29ubmVjdEZhaWxlZCBmb3IgIiArIG1TZXJ2aWNlQ29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBoYXNuJ3QgYmVlbiBhIGRpc2Nvbm5lY3Qgb3IgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAvLyBTZXJ2aWNlQ29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudChjYWxsYmFjaywgIm9uQ29ubmVjdEZhaWxlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdGhlbSB0byBjYWxsIHVzIHR3aWNlLgorICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9DT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ29ubmVjdCBmcm9tIHNlcnZpY2Ugd2hpbGUgbVN0YXRlPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldFN0YXRlTGFiZWwobVN0YXRlKSArICIuLi4gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwCisgICAgICAgICAgICAgICAgZm9yY2VDbG9zZUNvbm5lY3Rpb24oKTsKKworICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlIGFwcC4KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0aW9uRmFpbGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBvbkxvYWRDaGlsZHJlbihmaW5hbCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFjaywKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgZmluYWwgTWVkaWFQYXJjZWxlZExpc3RTbGljZSBsaXN0LCBmaW5hbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgaGFzbid0IGJlZW4gYSBkaXNjb25uZWN0IG9yIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gU2VydmljZUNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnQoY2FsbGJhY2ssICJvbkxvYWRDaGlsZHJlbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTG9hZENoaWxkcmVuIGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQgKyAiIGlkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIGlzIHN0aWxsIHN1YnNjcmliZWQuCisgICAgICAgICAgICAgICAgZmluYWwgU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IG1TdWJzY3JpcHRpb25zLmdldChwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlIGFwcC4KKyAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgc3Vic2NyaXB0aW9uQ2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5nZXRDYWxsYmFjayhtQ29udGV4dCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lZGlhSXRlbT4gZGF0YSA9IGxpc3QgPT0gbnVsbCA/IG51bGwgOiBsaXN0LmdldExpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbkNhbGxiYWNrLm9uRXJyb3IocGFyZW50SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbkNhbGxiYWNrLm9uQ2hpbGRyZW5Mb2FkZWQocGFyZW50SWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25DYWxsYmFjay5vbkVycm9yKHBhcmVudElkLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25DYWxsYmFjay5vbkNoaWxkcmVuTG9hZGVkKHBhcmVudElkLCBkYXRhLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkxvYWRDaGlsZHJlbiBmb3IgaWQgdGhhdCBpc24ndCBzdWJzY3JpYmVkIGlkPSIgKyBwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB7QGNvZGUgY2FsbGJhY2t9IGlzIHRoZSBjdXJyZW50IFNlcnZpY2VDYWxsYmFja3MuIEFsc28gbG9ncyBpZiBpdCdzIG5vdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDdXJyZW50KElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrLCBTdHJpbmcgZnVuY05hbWUpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ2FsbGJhY2tzICE9IGNhbGxiYWNrIHx8IG1TdGF0ZSA9PSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcKKyAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVF9TVEFURV9ESVNDT05ORUNUSU5HICYmIG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgZnVuY05hbWUgKyAiIGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQgKyAiIHdpdGggbVNlcnZpY2VDb25uZWN0aW9uPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbVNlcnZpY2VDYWxsYmFja3MgKyAiIHRoaXM9IiArIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgU2VydmljZUNhbGxiYWNrcyBnZXROZXdTZXJ2aWNlQ2FsbGJhY2tzKCkgeworICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VDYWxsYmFja3ModGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIGludGVybmFsIHN0YXRlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgdm9pZCBkdW1wKCkgeworICAgICAgICBMb2cuZChUQUcsICJNZWRpYUJyb3dzZXIuLi4iKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtU2VydmljZUNvbXBvbmVudD0iICsgbVNlcnZpY2VDb21wb25lbnQpOworICAgICAgICBMb2cuZChUQUcsICIgIG1DYWxsYmFjaz0iICsgbUNhbGxiYWNrKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtUm9vdEhpbnRzPSIgKyBtUm9vdEhpbnRzKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtU3RhdGU9IiArIGdldFN0YXRlTGFiZWwobVN0YXRlKSk7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVNlcnZpY2VDb25uZWN0aW9uPSIgKyBtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICBMb2cuZChUQUcsICIgIG1TZXJ2aWNlQmluZGVyPSIgKyBtU2VydmljZUJpbmRlcik7CisgICAgICAgIExvZy5kKFRBRywgIiAgbVNlcnZpY2VDYWxsYmFja3M9IiArIG1TZXJ2aWNlQ2FsbGJhY2tzKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtUm9vdElkPSIgKyBtUm9vdElkKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiICBtTWVkaWFTZXNzaW9uVG9rZW49IiArIG1NZWRpYVNlc3Npb25Ub2tlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIGluZm9ybWF0aW9uIG9uIGEgc2luZ2xlIG1lZGlhIGl0ZW0gZm9yIHVzZSBpbiBicm93c2luZy9zZWFyY2hpbmcgbWVkaWEuCisgICAgICogTWVkaWFJdGVtcyBhcmUgYXBwbGljYXRpb24gZGVwZW5kZW50IHNvIHdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGV5IGNvbnRhaW4gdGhlCisgICAgICogcmlnaHQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFJdGVtIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1GbGFnczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYURlc2NyaXB0aW9uIG1EZXNjcmlwdGlvbjsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgICAgICBASW50RGVmKGZsYWc9dHJ1ZSwgdmFsdWUgPSB7IEZMQUdfQlJPV1NBQkxFLCBGTEFHX1BMQVlBQkxFIH0pCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZsYWdzIHsgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnOiBJbmRpY2F0ZXMgdGhhdCB0aGUgaXRlbSBoYXMgY2hpbGRyZW4gb2YgaXRzIG93bi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQlJPV1NBQkxFID0gMSA8PCAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnOiBJbmRpY2F0ZXMgdGhhdCB0aGUgaXRlbSBpcyBwbGF5YWJsZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBpZCBvZiB0aGlzIGl0ZW0gbWF5IGJlIHBhc3NlZCB0bworICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyLlRyYW5zcG9ydENvbnRyb2xzI3BsYXlGcm9tTWVkaWFJZChTdHJpbmcsIEJ1bmRsZSl9CisgICAgICAgICAqIHRvIHN0YXJ0IHBsYXlpbmcgaXQuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUExBWUFCTEUgPSAxIDw8IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBNZWRpYUl0ZW0gZm9yIHVzZSBpbiBicm93c2luZyBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVkaWEsIHdoaWNoIG11c3QgaW5jbHVkZSBhCisgICAgICAgICAqICAgICAgICAgICAgbWVkaWEgaWQuCisgICAgICAgICAqIEBwYXJhbSBmbGFncyBUaGUgZmxhZ3MgZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0oQE5vbk51bGwgTWVkaWFEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgQEZsYWdzIGludCBmbGFncykgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdGlvbiBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGRlc2NyaXB0aW9uLmdldE1lZGlhSWQoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdGlvbiBtdXN0IGhhdmUgYSBub24tZW1wdHkgbWVkaWEgaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTWVkaWFJdGVtKFBhcmNlbCBpbikgeworICAgICAgICAgICAgbUZsYWdzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gTWVkaWFEZXNjcmlwdGlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQobUZsYWdzKTsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbi53cml0ZVRvUGFyY2VsKG91dCwgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1lZGlhSXRlbXsiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgibUZsYWdzPSIpLmFwcGVuZChtRmxhZ3MpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIG1EZXNjcmlwdGlvbj0iKS5hcHBlbmQobURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxNZWRpYUl0ZW0+IENSRUFUT1IgPQorICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8TWVkaWFJdGVtPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtKGluKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFJdGVtW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtW3NpemVdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgZmxhZ3Mgb2YgdGhlIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQEZsYWdzIGludCBnZXRGbGFncygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXRlbSBpcyBicm93c2FibGUuCisgICAgICAgICAqIEBzZWUgI0ZMQUdfQlJPV1NBQkxFCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3dzYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19CUk9XU0FCTEUpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXRlbSBpcyBwbGF5YWJsZS4KKyAgICAgICAgICogQHNlZSAjRkxBR19QTEFZQUJMRQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQbGF5YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19QTEFZQUJMRSkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVkaWEuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbWVkaWEgaWQgaW4gdGhlIHtAbGluayBNZWRpYURlc2NyaXB0aW9ufSBmb3IgdGhpcyBpdGVtLgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YSNNRVRBREFUQV9LRVlfTUVESUFfSUQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldE1lZGlhSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uLmdldE1lZGlhSWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiByZWxhdGVkIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZva2VkIGFmdGVyIHtAbGluayBNZWRpYUJyb3dzZXIjY29ubmVjdCgpfSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlZCB3aGVuIHRoZSBjbGllbnQgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIG1lZGlhIGJyb3dzZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3Rpb25TdXNwZW5kZWQoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBtZWRpYSBicm93c2VyIGZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGlvbkZhaWxlZCgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrcyBmb3Igc3Vic2NyaXB0aW9uIHJlbGF0ZWQgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgeworICAgICAgICBCaW5kZXIgbVRva2VuOworCisgICAgICAgIHB1YmxpYyBTdWJzY3JpcHRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIG1Ub2tlbiA9IG5ldyBCaW5kZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbGlzdCBvZiBjaGlsZHJlbiBpcyBsb2FkZWQgb3IgdXBkYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBtZWRpYSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0uCisgICAgICAgICAqIEBwYXJhbSBjaGlsZHJlbiBUaGUgY2hpbGRyZW4gd2hpY2ggd2VyZSBsb2FkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuTG9hZGVkKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0+IGNoaWxkcmVuKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gaXMgbG9hZGVkIG9yIHVwZGF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgbWVkaWEgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtLgorICAgICAgICAgKiBAcGFyYW0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIHdoaWNoIHdlcmUgbG9hZGVkLgorICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHNlbnQgdG8gdGhlIG1lZGlhCisgICAgICAgICAqICAgICAgICAgICAgYnJvd3NlciBzZXJ2aWNlLiBUaGUgY29udGVudHMgb2YgdGhpcyBidW5kbGUgbWF5IGFmZmVjdCB0aGUKKyAgICAgICAgICogICAgICAgICAgICBpbmZvcm1hdGlvbiByZXR1cm5lZCB3aGVuIGJyb3dzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkxvYWRlZChATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsIEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtPiBjaGlsZHJlbiwKKyAgICAgICAgICAgICAgICBATm9uTnVsbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBpZCBkb2Vzbid0IGV4aXN0IG9yIG90aGVyIGVycm9ycyBpbiBzdWJzY3JpYmluZy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHRoaXMgaXMgY2FsbGVkLCB0aGUgc3Vic2NyaXB0aW9uIHJlbWFpbnMgdW50aWwge0BsaW5rIE1lZGlhQnJvd3NlciN1bnN1YnNjcmliZX0KKyAgICAgICAgICogY2FsbGVkLCBiZWNhdXNlIHNvbWUgZXJyb3JzIG1heSBoZWFsIHRoZW1zZWx2ZXMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBtZWRpYSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgY2hpbGRyZW4gY291bGQKKyAgICAgICAgICogICAgICAgICAgICBub3QgYmUgbG9hZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaWQgZG9lc24ndCBleGlzdCBvciBvdGhlciBlcnJvcnMgaW4gc3Vic2NyaWJpbmcuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiB0aGlzIGlzIGNhbGxlZCwgdGhlIHN1YnNjcmlwdGlvbiByZW1haW5zIHVudGlsIHtAbGluayBNZWRpYUJyb3dzZXIjdW5zdWJzY3JpYmV9CisgICAgICAgICAqIGNhbGxlZCwgYmVjYXVzZSBzb21lIGVycm9ycyBtYXkgaGVhbCB0aGVtc2VsdmVzLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgbWVkaWEgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlIGNoaWxkcmVuIGNvdWxkCisgICAgICAgICAqICAgICAgICAgICAgbm90IGJlIGxvYWRlZC4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGJ1bmRsZSBvZiBzZXJ2aWNlLXNwZWNpZmljIGFyZ3VtZW50cyBzZW50IHRvIHRoZSBtZWRpYQorICAgICAgICAgKiAgICAgICAgICAgIGJyb3dzZXIgc2VydmljZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQE5vbk51bGwgU3RyaW5nIHBhcmVudElkLCBATm9uTnVsbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIHJlY2VpdmluZyB0aGUgcmVzdWx0IG9mIHtAbGluayAjZ2V0SXRlbX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBJdGVtQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGl0ZW0gaGFzIGJlZW4gcmV0dXJuZWQgYnkgdGhlIGNvbm5lY3RlZCBzZXJ2aWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0aGF0IHdhcyByZXR1cm5lZCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1Mb2FkZWQoTWVkaWFJdGVtIGl0ZW0pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdGhlcmUgd2FzIGFuIGVycm9yIHJldHJpZXZpbmcgaXQgb3IgdGhlIGNvbm5lY3RlZCBzZXJ2aWNlIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgICAgKiB7QGxpbmsgI2dldEl0ZW19LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgbWVkaWEgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gd2hpY2ggY291bGQgbm90IGJlIGxvYWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZpY2VDb25uZWN0aW9uIHRvIHRoZSBvdGhlciBhcHAuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGZpbmFsIENvbXBvbmVudE5hbWUgbmFtZSwgZmluYWwgSUJpbmRlciBiaW5kZXIpIHsKKyAgICAgICAgICAgIHBvc3RPclJ1bihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlcnZpY2VDb25uZWN0aW9uLm9uU2VydmljZUNvbm5lY3RlZCBuYW1lPSIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiaW5kZXI9IiArIGJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHN0aWxsIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24sIGFuZCB0aGF0IHRoZXkgaGF2ZW4ndCBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzY29ubmVjdCgpLgorICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudCgib25TZXJ2aWNlQ29ubmVjdGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlaXIgYmluZGVyCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyID0gSU1lZGlhQnJvd3NlclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiaW5kZXIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1ha2UgYSBuZXcgbVNlcnZpY2VDYWxsYmFja3MgZWFjaCB0aW1lIHdlIGNvbm5lY3Qgc28gdGhhdCB3ZSBjYW4gZHJvcAorICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZXMgZnJvbSBwcmV2aW91cyBjb25uZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFja3MgPSBnZXROZXdTZXJ2aWNlQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfQ09OTkVDVElORzsKKworICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIGNvbm5lY3QsIHdoaWNoIGlzIGFzeW5jLiBXaGVuIHdlIGdldCBhIHJlc3BvbnNlIGZyb20gdGhhdCB3ZSB3aWxsCisgICAgICAgICAgICAgICAgICAgIC8vIHNheSB0aGF0IHdlJ3JlIGNvbm5lY3RlZC4KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXJ2aWNlQ2FsbGJhY2tzLm9uQ29ubmVjdC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQmluZGVyLmNvbm5lY3QobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbVJvb3RIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VDYWxsYmFja3MpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkLCB3aGljaCBpc24ndCBnb29kLiBCdXQgdGhlIGF1dG8tcmVjb25uZWN0IG9uIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRha2Ugb3ZlciBhbmQgd2Ugd2lsbCBjb21lIGJhY2suIFdlIHdpbGwgYWxzbyBnZXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvblNlcnZpY2VEaXNjb25uZWN0ZWQsIHdoaWNoIGhhcyBhbGwgdGhlIGNsZWFudXAgY29kZS4gU28gbGV0IHRoYXQgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGR1cmluZyBjb25uZWN0IGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlcnZpY2VDYWxsYmFja3Mub25Db25uZWN0Li4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGZpbmFsIENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgcG9zdE9yUnVuKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2VydmljZUNvbm5lY3Rpb24ub25TZXJ2aWNlRGlzY29ubmVjdGVkIG5hbWU9IiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRoaXM9IiArIHRoaXMgKyAiIG1TZXJ2aWNlQ29ubmVjdGlvbj0iICsgbVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgc3RpbGwgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiwgYW5kIHRoYXQgdGhleSBoYXZlbid0IGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAvLyBkaXNjb25uZWN0KCkuCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNDdXJyZW50KCJvblNlcnZpY2VEaXNjb25uZWN0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHdoYXQgd2Ugc2V0IGluIG9uU2VydmljZUNvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICBtU2VydmljZUJpbmRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2tzID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGVsbCB0aGUgYXBwIHRoYXQgaXQncyBzdXNwZW5kZWQuCisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RfU1RBVEVfU1VTUEVOREVEOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0aW9uU3VzcGVuZGVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcG9zdE9yUnVuKFJ1bm5hYmxlIHIpIHsKKyAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IG1IYW5kbGVyLmdldExvb3BlcigpLmdldFRocmVhZCgpKSB7CisgICAgICAgICAgICAgICAgci5ydW4oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IFNlcnZpY2VDb25uZWN0aW9uLiBBbHNvIGxvZ3MgaWYgaXQncyBub3QuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNDdXJyZW50KFN0cmluZyBmdW5jTmFtZSkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbiAhPSB0aGlzIHx8IG1TdGF0ZSA9PSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUX1NUQVRFX0RJU0NPTk5FQ1RJTkcgJiYgbVN0YXRlICE9IENPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG1TdGF0ZSwgYmVjYXVzZSBvdGhlcndpc2UgdGhpcyBsb2cgaXMgbm9pc3kuCisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgZnVuY05hbWUgKyAiIGZvciAiICsgbVNlcnZpY2VDb21wb25lbnQgKyAiIHdpdGggbVNlcnZpY2VDb25uZWN0aW9uPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TZXJ2aWNlQ29ubmVjdGlvbiArICIgdGhpcz0iICsgdGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2tzIGZyb20gdGhlIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VydmljZUNhbGxiYWNrcyBleHRlbmRzIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzLlN0dWIgeworICAgICAgICBwcml2YXRlIFdlYWtSZWZlcmVuY2U8TWVkaWFCcm93c2VyPiBtTWVkaWFCcm93c2VyOworCisgICAgICAgIHB1YmxpYyBTZXJ2aWNlQ2FsbGJhY2tzKE1lZGlhQnJvd3NlciBtZWRpYUJyb3dzZXIpIHsKKyAgICAgICAgICAgIG1NZWRpYUJyb3dzZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYUJyb3dzZXI+KG1lZGlhQnJvd3Nlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG90aGVyIHNpZGUgaGFzIGFja25vd2xlZGdlZCBvdXIgY29ubmVjdGlvbi4gVGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBmdW5jdGlvbgorICAgICAgICAgKiBhcmUgdGhlIGluaXRpYWwgZGF0YSBhcyByZXF1ZXN0ZWQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db25uZWN0KFN0cmluZyByb290LCBNZWRpYVNlc3Npb24uVG9rZW4gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYUJyb3dzZXIgbWVkaWFCcm93c2VyID0gbU1lZGlhQnJvd3Nlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJyb3dzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lZGlhQnJvd3Nlci5vblNlcnZpY2VDb25uZWN0ZWQodGhpcywgcm9vdCwgc2Vzc2lvbiwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb3RoZXIgc2lkZSBkb2VzIG5vdCBsaWtlIHVzLiBUZWxsIHRoZSBhcHAgdmlhIG9uQ29ubmVjdGlvbkZhaWxlZC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RGYWlsZWQoKSB7CisgICAgICAgICAgICBNZWRpYUJyb3dzZXIgbWVkaWFCcm93c2VyID0gbU1lZGlhQnJvd3Nlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJyb3dzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lZGlhQnJvd3Nlci5vbkNvbm5lY3Rpb25GYWlsZWQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ2hpbGRyZW4oU3RyaW5nIHBhcmVudElkLCBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIGxpc3QpIHsKKyAgICAgICAgICAgIG9uTG9hZENoaWxkcmVuV2l0aE9wdGlvbnMocGFyZW50SWQsIGxpc3QsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENoaWxkcmVuV2l0aE9wdGlvbnMoU3RyaW5nIHBhcmVudElkLCBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIGxpc3QsCisgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgICAgIE1lZGlhQnJvd3NlciBtZWRpYUJyb3dzZXIgPSBtTWVkaWFCcm93c2VyLmdldCgpOworICAgICAgICAgICAgaWYgKG1lZGlhQnJvd3NlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCcm93c2VyLm9uTG9hZENoaWxkcmVuKHRoaXMsIHBhcmVudElkLCBsaXN0LCBvcHRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YnNjcmlwdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdWJzY3JpcHRpb25DYWxsYmFjaz4gbUNhbGxiYWNrczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEJ1bmRsZT4gbU9wdGlvbnNMaXN0OworCisgICAgICAgIHB1YmxpYyBTdWJzY3JpcHRpb24oKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBtT3B0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrcy5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxCdW5kbGU+IGdldE9wdGlvbnNMaXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PFN1YnNjcmlwdGlvbkNhbGxiYWNrPiBnZXRDYWxsYmFja3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdWJzY3JpcHRpb25DYWxsYmFjayBnZXRDYWxsYmFjayhDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRDbGFzc0xvYWRlcihjb250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtT3B0aW9uc0xpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVkaWFCcm93c2VyVXRpbHMuYXJlU2FtZU9wdGlvbnMobU9wdGlvbnNMaXN0LmdldChpKSwgb3B0aW9ucykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFja3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0Q2FsbGJhY2soQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgb3B0aW9ucywgU3Vic2NyaXB0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zLnNldENsYXNzTG9hZGVyKGNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1PcHRpb25zTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChNZWRpYUJyb3dzZXJVdGlscy5hcmVTYW1lT3B0aW9ucyhtT3B0aW9uc0xpc3QuZ2V0KGkpLCBvcHRpb25zKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLnNldChpLCBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CisgICAgICAgICAgICBtT3B0aW9uc0xpc3QuYWRkKG9wdGlvbnMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXJVdGlscy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL2Jyb3dzZS9NZWRpYUJyb3dzZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDNlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvYnJvd3NlL01lZGlhQnJvd3NlclV0aWxzLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5icm93c2U7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVTYW1lT3B0aW9ucyhCdW5kbGUgb3B0aW9uczEsIEJ1bmRsZSBvcHRpb25zMikgeworICAgICAgICBpZiAob3B0aW9uczEgPT0gb3B0aW9uczIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMxID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKSA9PSAtMQorICAgICAgICAgICAgICAgICAgICAmJiBvcHRpb25zMi5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0VfU0laRSwgLTEpID09IC0xOworICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zMS5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0UsIC0xKSA9PSAtMQorICAgICAgICAgICAgICAgICAgICAmJiBvcHRpb25zMS5nZXRJbnQoTWVkaWFCcm93c2VyLkVYVFJBX1BBR0VfU0laRSwgLTEpID09IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMxLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpCisgICAgICAgICAgICAgICAgICAgID09IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpCisgICAgICAgICAgICAgICAgICAgICYmIG9wdGlvbnMxLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgPT0gb3B0aW9uczIuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEdXBsaWNhdGVkSXRlbXMoQnVuZGxlIG9wdGlvbnMxLCBCdW5kbGUgb3B0aW9uczIpIHsKKyAgICAgICAgaW50IHBhZ2UxID0gb3B0aW9uczEgPT0gbnVsbCA/IC0xIDogb3B0aW9uczEuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFLCAtMSk7CisgICAgICAgIGludCBwYWdlMiA9IG9wdGlvbnMyID09IG51bGwgPyAtMSA6IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpOworICAgICAgICBpbnQgcGFnZVNpemUxID0gb3B0aW9uczEgPT0gbnVsbCA/IC0xIDogb3B0aW9uczEuZ2V0SW50KE1lZGlhQnJvd3Nlci5FWFRSQV9QQUdFX1NJWkUsIC0xKTsKKyAgICAgICAgaW50IHBhZ2VTaXplMiA9IG9wdGlvbnMyID09IG51bGwgPyAtMSA6IG9wdGlvbnMyLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSk7CisKKyAgICAgICAgaW50IHN0YXJ0SW5kZXgxLCBzdGFydEluZGV4MiwgZW5kSW5kZXgxLCBlbmRJbmRleDI7CisgICAgICAgIGlmIChwYWdlMSA9PSAtMSB8fCBwYWdlU2l6ZTEgPT0gLTEpIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXgxID0gMDsKKyAgICAgICAgICAgIGVuZEluZGV4MSA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRJbmRleDEgPSBwYWdlU2l6ZTEgKiBwYWdlMTsKKyAgICAgICAgICAgIGVuZEluZGV4MSA9IHN0YXJ0SW5kZXgxICsgcGFnZVNpemUxIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWdlMiA9PSAtMSB8fCBwYWdlU2l6ZTIgPT0gLTEpIHsKKyAgICAgICAgICAgIHN0YXJ0SW5kZXgyID0gMDsKKyAgICAgICAgICAgIGVuZEluZGV4MiA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRJbmRleDIgPSBwYWdlU2l6ZTIgKiBwYWdlMjsKKyAgICAgICAgICAgIGVuZEluZGV4MiA9IHN0YXJ0SW5kZXgyICsgcGFnZVNpemUyIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydEluZGV4MSA8PSBzdGFydEluZGV4MiAmJiBzdGFydEluZGV4MiA8PSBlbmRJbmRleDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5kZXgxIDw9IGVuZEluZGV4MiAmJiBlbmRJbmRleDIgPD0gZW5kSW5kZXgxKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lBY3RpdmVTZXNzaW9uc0xpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5ZTRiZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lBY3RpdmVTZXNzaW9uc0xpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworCisvKioKKyAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb25zLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJQWN0aXZlU2Vzc2lvbnNMaXN0ZW5lciB7CisgICAgdm9pZCBvbkFjdGl2ZVNlc3Npb25zQ2hhbmdlZChpbiBMaXN0PE1lZGlhU2Vzc2lvbi5Ub2tlbj4gc2Vzc2lvbnMpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUNhbGxiYWNrLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JQ2FsbGJhY2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJiZmZhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSUNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworCisvKioKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUNhbGxiYWNrIHsKKyAgICB2b2lkIG9uTWVkaWFLZXlFdmVudERpc3BhdGNoZWRUb01lZGlhU2Vzc2lvbihpbiBLZXlFdmVudCBldmVudCwKKyAgICAgICAgICAgIGluIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uVG9rZW4pOworICAgIHZvaWQgb25NZWRpYUtleUV2ZW50RGlzcGF0Y2hlZFRvTWVkaWFCdXR0b25SZWNlaXZlcihpbiBLZXlFdmVudCBldmVudCwKKyAgICAgICAgICAgIGluIENvbXBvbmVudE5hbWUgbWVkaWFCdXR0b25SZWNlaXZlcik7CisKKyAgICB2b2lkIG9uQWRkcmVzc2VkUGxheWVyQ2hhbmdlZFRvTWVkaWFTZXNzaW9uKGluIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uVG9rZW4pOworICAgIHZvaWQgb25BZGRyZXNzZWRQbGF5ZXJDaGFuZ2VkVG9NZWRpYUJ1dHRvblJlY2VpdmVyKGluIENvbXBvbmVudE5hbWUgbWVkaWFCdXR0b25SZWNlaXZlcik7Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPbk1lZGlhS2V5TGlzdGVuZXIuYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lPbk1lZGlhS2V5TGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTk4ZWEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uTWVkaWFLZXlMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CisKKy8qKgorICogTGlzdGVuZXIgdG8gaGFuZGxlIG1lZGlhIGtleS4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSU9uTWVkaWFLZXlMaXN0ZW5lciB7CisgICAgdm9pZCBvbk1lZGlhS2V5KGluIEtleUV2ZW50IGV2ZW50LCBpbiBSZXN1bHRSZWNlaXZlciByZXN1bHQpOworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JT25Wb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I4MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworLyoqCisgKiBMaXN0ZW5lciB0byBoYW5kbGUgdm9sdW1lIGtleSBsb25nLXByZXNzLgorICogQGhpZGUKKyAqLworb25ld2F5IGludGVyZmFjZSBJT25Wb2x1bWVLZXlMb25nUHJlc3NMaXN0ZW5lciB7CisgICAgdm9pZCBvblZvbHVtZUtleUxvbmdQcmVzcyhpbiBLZXlFdmVudCBldmVudCk7Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjFjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbi5haWRsCkBAIC0wLDAgKzEsNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKKy8vaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgTWVkaWFTZXNzaW9uIGluIHRoZSBzeXN0ZW0uCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSVNlc3Npb24geworICAgIHZvaWQgc2VuZEV2ZW50KFN0cmluZyBldmVudCwgaW4gQnVuZGxlIGRhdGEpOworICAgIElTZXNzaW9uQ29udHJvbGxlciBnZXRDb250cm9sbGVyKCk7CisgICAgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpOworICAgIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKTsKKyAgICB2b2lkIHNldE1lZGlhQnV0dG9uUmVjZWl2ZXIoaW4gUGVuZGluZ0ludGVudCBtYnIpOworICAgIHZvaWQgc2V0TGF1bmNoUGVuZGluZ0ludGVudChpbiBQZW5kaW5nSW50ZW50IHBpKTsKKyAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgIC8vIFRoZXNlIGNvbW1hbmRzIGFyZSBmb3IgdGhlIFRyYW5zcG9ydFBlcmZvcm1lcgorICAgIHZvaWQgc2V0TWV0YWRhdGEoaW4gTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSwgbG9uZyBkdXJhdGlvbiwgU3RyaW5nIG1ldGFkYXRhRGVzY3JpcHRpb24pOworICAgIHZvaWQgc2V0UGxheWJhY2tTdGF0ZShpbiBQbGF5YmFja1N0YXRlIHN0YXRlKTsKKyAgICB2b2lkIHNldFF1ZXVlKGluIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgcXVldWUpOworICAgIHZvaWQgc2V0UXVldWVUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpOworICAgIHZvaWQgc2V0RXh0cmFzKGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc2V0UmF0aW5nVHlwZShpbnQgdHlwZSk7CisKKyAgICAvLyBUaGVzZSBjb21tYW5kcyByZWxhdGUgdG8gdm9sdW1lIGhhbmRsaW5nCisgICAgLy9UT0RPKGIvMTE5NzUxNTkyKTogRGVjaWRlIGlmIEF1ZGlvQXR0cmlidXRlcyBzaG91bGQgYmUgdXBkYXRlZC4KKyAgICAvL3ZvaWQgc2V0UGxheWJhY2tUb0xvY2FsKGluIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKTsKKyAgICB2b2lkIHNldFBsYXliYWNrVG9SZW1vdGUoaW50IGNvbnRyb2wsIGludCBtYXgpOworICAgIHZvaWQgc2V0Q3VycmVudFZvbHVtZShpbnQgY3VycmVudFZvbHVtZSk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNhbGxiYWNrLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbkNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MzM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworCisvKioKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSVNlc3Npb25DYWxsYmFjayB7CisgICAgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIGNiKTsKKyAgICB2b2lkIG9uTWVkaWFCdXR0b24oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBpbiBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQsCisgICAgICAgICAgICBpbnQgc2VxdWVuY2VOdW1iZXIsIGluIFJlc3VsdFJlY2VpdmVyIGNiKTsKKyAgICB2b2lkIG9uTWVkaWFCdXR0b25Gcm9tQ29udHJvbGxlcihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGluIEludGVudCBtZWRpYUJ1dHRvbkludGVudCk7CisKKyAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciB0aGUgVHJhbnNwb3J0UGVyZm9ybWVyCisgICAgdm9pZCBvblByZXBhcmUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25QcmVwYXJlRnJvbU1lZGlhSWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblByZXBhcmVGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUHJlcGFyZUZyb21VcmkoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUGxheShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblBsYXlGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uUGxheUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25QbGF5RnJvbVVyaShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25Ta2lwVG9UcmFjayhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGxvbmcgaWQpOworICAgIHZvaWQgb25QYXVzZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblN0b3AoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25OZXh0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIG9uUHJldmlvdXMoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgb25GYXN0Rm9yd2FyZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblJld2luZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBvblNlZWtUbyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGxvbmcgcG9zKTsKKyAgICB2b2lkIG9uUmF0ZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGluIFJhdGluZyByYXRpbmcpOworICAgIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uLCBpbiBCdW5kbGUgYXJncyk7CisKKyAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciB2b2x1bWUgaGFuZGxpbmcKKyAgICB2b2lkIG9uQWRqdXN0Vm9sdW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW50IGRpcmVjdGlvbik7CisgICAgdm9pZCBvblNldFZvbHVtZVRvKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgaW50IHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlci5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25Db250cm9sbGVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4OTdmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlci5haWRsCkBAIC0wLDAgKzEsODggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBhcmNlbGFibGVWb2x1bWVJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEludGVyZmFjZSB0byBNZWRpYVNlc3Npb25SZWNvcmQgaW4gdGhlIHN5c3RlbS4KKyAqIEBoaWRlCisgKi8KK2ludGVyZmFjZSBJU2Vzc2lvbkNvbnRyb2xsZXIgeworICAgIHZvaWQgc2VuZENvbW1hbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIGNiKTsKKyAgICBib29sZWFuIHNlbmRNZWRpYUJ1dHRvbihTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLCBpbiBLZXlFdmVudCBtZWRpYUJ1dHRvbik7CisgICAgdm9pZCByZWdpc3RlckNhbGxiYWNrTGlzdGVuZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYik7CisgICAgdm9pZCB1bnJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcihJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYik7CisgICAgYm9vbGVhbiBpc1RyYW5zcG9ydENvbnRyb2xFbmFibGVkKCk7CisgICAgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7CisgICAgU3RyaW5nIGdldFRhZygpOworICAgIFBlbmRpbmdJbnRlbnQgZ2V0TGF1bmNoUGVuZGluZ0ludGVudCgpOworICAgIGxvbmcgZ2V0RmxhZ3MoKTsKKyAgICBQYXJjZWxhYmxlVm9sdW1lSW5mbyBnZXRWb2x1bWVBdHRyaWJ1dGVzKCk7CisgICAgdm9pZCBhZGp1c3RWb2x1bWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBib29sZWFuIGFzU3lzdGVtU2VydmljZSwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKTsKKyAgICB2b2lkIHNldFZvbHVtZVRvKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW50IHZhbHVlLCBpbnQgZmxhZ3MpOworCisgICAgLy8gVGhlc2UgY29tbWFuZHMgYXJlIGZvciB0aGUgVHJhbnNwb3J0Q29udHJvbHMKKyAgICB2b2lkIHByZXBhcmUoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHByZXBhcmVGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwbGF5KFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLAorICAgICAgICAgICAgU3RyaW5nIHN0cmluZywgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwbGF5RnJvbVVyaShTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwKKyAgICAgICAgICAgIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc2tpcFRvUXVldWVJdGVtKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBsb25nIGlkKTsKKyAgICB2b2lkIHBhdXNlKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKTsKKyAgICB2b2lkIHN0b3AoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgbmV4dChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBwcmV2aW91cyhTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCBmYXN0Rm9yd2FyZChTdHJpbmcgcGFja2FnZU5hbWUsIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcik7CisgICAgdm9pZCByZXdpbmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpOworICAgIHZvaWQgc2Vla1RvKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBsb25nIHBvcyk7CisgICAgdm9pZCByYXRlKFN0cmluZyBwYWNrYWdlTmFtZSwgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBpbiBSYXRpbmcgcmF0aW5nKTsKKyAgICB2b2lkIHNlbmRDdXN0b21BY3Rpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICBTdHJpbmcgYWN0aW9uLCBpbiBCdW5kbGUgYXJncyk7CisgICAgTWVkaWFNZXRhZGF0YSBnZXRNZXRhZGF0YSgpOworICAgIFBsYXliYWNrU3RhdGUgZ2V0UGxheWJhY2tTdGF0ZSgpOworICAgIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgZ2V0UXVldWUoKTsKKyAgICBDaGFyU2VxdWVuY2UgZ2V0UXVldWVUaXRsZSgpOworICAgIEJ1bmRsZSBnZXRFeHRyYXMoKTsKKyAgICBpbnQgZ2V0UmF0aW5nVHlwZSgpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2suYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjYzRmNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL0lTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QYXJjZWxhYmxlVm9sdW1lSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgeworICAgIHZvaWQgb25FdmVudChTdHJpbmcgZXZlbnQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCk7CisKKyAgICAvLyBUaGVzZSBjYWxsYmFja3MgYXJlIGZvciB0aGUgVHJhbnNwb3J0Q29udHJvbGxlcgorICAgIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChpbiBQbGF5YmFja1N0YXRlIHN0YXRlKTsKKyAgICB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKGluIE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpOworICAgIHZvaWQgb25RdWV1ZUNoYW5nZWQoaW4gTWVkaWFQYXJjZWxlZExpc3RTbGljZSBxdWV1ZSk7CisgICAgdm9pZCBvblF1ZXVlVGl0bGVDaGFuZ2VkKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisgICAgdm9pZCBvbkV4dHJhc0NoYW5nZWQoaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvblZvbHVtZUluZm9DaGFuZ2VkKGluIFBhcmNlbGFibGVWb2x1bWVJbmZvIGluZm8pOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25NYW5hZ2VyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9JU2Vzc2lvbk1hbmFnZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc4YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vSVNlc3Npb25NYW5hZ2VyLmFpZGwKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklSZW1vdGVWb2x1bWVDb250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVNlc3Npb25Ub2tlbnNMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSU9uTWVkaWFLZXlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uSU9uVm9sdW1lS2V5TG9uZ1ByZXNzTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLklTZXNzaW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5JU2Vzc2lvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gdGhlIE1lZGlhU2Vzc2lvbk1hbmFnZXJTZXJ2aWNlCisgKiBAaGlkZQorICovCitpbnRlcmZhY2UgSVNlc3Npb25NYW5hZ2VyIHsKKyAgICBJU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW4gSVNlc3Npb25DYWxsYmFjayBjYiwgU3RyaW5nIHRhZywgaW50IHVzZXJJZCk7CisgICAgTGlzdDxJQmluZGVyPiBnZXRTZXNzaW9ucyhpbiBDb21wb25lbnROYW1lIGNvbXBOYW1lLCBpbnQgdXNlcklkKTsKKyAgICB2b2lkIGRpc3BhdGNoTWVkaWFLZXlFdmVudChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLCBpbiBLZXlFdmVudCBrZXlFdmVudCwKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdha2VMb2NrKTsKKyAgICB2b2lkIGRpc3BhdGNoVm9sdW1lS2V5RXZlbnQoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGFzU3lzdGVtU2VydmljZSwgaW4gS2V5RXZlbnQga2V5RXZlbnQsCisgICAgICAgICAgICBpbnQgc3RyZWFtLCBib29sZWFuIG11c2ljT25seSk7CisgICAgdm9pZCBkaXNwYXRjaEFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBzdWdnZXN0ZWRTdHJlYW0sIGludCBkZWx0YSwgaW50IGZsYWdzKTsKKyAgICB2b2lkIGFkZFNlc3Npb25zTGlzdGVuZXIoaW4gSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIgbGlzdGVuZXIsIGluIENvbXBvbmVudE5hbWUgY29tcE5hbWUsCisgICAgICAgICAgICBpbnQgdXNlcklkKTsKKyAgICB2b2lkIHJlbW92ZVNlc3Npb25zTGlzdGVuZXIoaW4gSUFjdGl2ZVNlc3Npb25zTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLy8gVGhpcyBpcyBmb3IgdGhlIHN5c3RlbSB2b2x1bWUgVUkgb25seQorICAgIHZvaWQgc2V0UmVtb3RlVm9sdW1lQ29udHJvbGxlcihpbiBJUmVtb3RlVm9sdW1lQ29udHJvbGxlciBydmMpOworCisgICAgLy8gRm9yIFBob25lV2luZG93TWFuYWdlciB0byBwcmVjaGVjayBtZWRpYSBrZXlzCisgICAgYm9vbGVhbiBpc0dsb2JhbFByaW9yaXR5QWN0aXZlKCk7CisKKyAgICB2b2lkIHNldENhbGxiYWNrKGluIElDYWxsYmFjayBjYWxsYmFjayk7CisgICAgdm9pZCBzZXRPblZvbHVtZUtleUxvbmdQcmVzc0xpc3RlbmVyKGluIElPblZvbHVtZUtleUxvbmdQcmVzc0xpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICB2b2lkIHNldE9uTWVkaWFLZXlMaXN0ZW5lcihpbiBJT25NZWRpYUtleUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8vIE1lZGlhU2Vzc2lvbjIKKyAgICBib29sZWFuIGlzVHJ1c3RlZChTdHJpbmcgY29udHJvbGxlclBhY2thZ2VOYW1lLCBpbnQgY29udHJvbGxlclBpZCwgaW50IGNvbnRyb2xsZXJVaWQpOworICAgIGJvb2xlYW4gY3JlYXRlU2Vzc2lvbjIoaW4gQnVuZGxlIHNlc3Npb25Ub2tlbik7CisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbjIoaW4gQnVuZGxlIHNlc3Npb25Ub2tlbik7CisgICAgTGlzdDxCdW5kbGU+IGdldFNlc3Npb25Ub2tlbnMoYm9vbGVhbiBhY3RpdmVTZXNzaW9uT25seSwgYm9vbGVhbiBzZXNzaW9uU2VydmljZU9ubHksCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUpOworCisgICAgdm9pZCBhZGRTZXNzaW9uVG9rZW5zTGlzdGVuZXIoaW4gSVNlc3Npb25Ub2tlbnNMaXN0ZW5lciBsaXN0ZW5lciwgaW50IHVzZXJJZCwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSk7CisgICAgdm9pZCByZW1vdmVTZXNzaW9uVG9rZW5zTGlzdGVuZXIoaW4gSVNlc3Npb25Ub2tlbnNMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHBhY2thZ2VOYW1lKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vTWVkaWFDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzYTAxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhQ29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQYXJjZWxlZExpc3RTbGljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFsbG93cyBhbiBhcHAgdG8gaW50ZXJhY3Qgd2l0aCBhbiBvbmdvaW5nIG1lZGlhIHNlc3Npb24uIE1lZGlhIGJ1dHRvbnMgYW5kCisgKiBvdGhlciBjb21tYW5kcyBjYW4gYmUgc2VudCB0byB0aGUgc2Vzc2lvbi4gQSBjYWxsYmFjayBtYXkgYmUgcmVnaXN0ZXJlZCB0bworICogcmVjZWl2ZSB1cGRhdGVzIGZyb20gdGhlIHNlc3Npb24sIHN1Y2ggYXMgbWV0YWRhdGEgYW5kIHBsYXkgc3RhdGUgY2hhbmdlcy4KKyAqIDxwPgorICogQSBNZWRpYUNvbnRyb2xsZXIgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCB7QGxpbmsgTWVkaWFTZXNzaW9uTWFuYWdlcn0gaWYgeW91CisgKiBob2xkIHRoZSAiYW5kcm9pZC5wZXJtaXNzaW9uLk1FRElBX0NPTlRFTlRfQ09OVFJPTCIgcGVybWlzc2lvbiBvciBhcmUgYW4KKyAqIGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIG9yIGJ5IGdldHRpbmcgYSB7QGxpbmsgTWVkaWFTZXNzaW9uLlRva2VufQorICogZGlyZWN0bHkgZnJvbSB0aGUgc2Vzc2lvbiBvd25lci4KKyAqIDxwPgorICogTWVkaWFDb250cm9sbGVyIG9iamVjdHMgYXJlIHRocmVhZC1zYWZlLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VWRU5UID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9QTEFZQkFDS19TVEFURSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfTUVUQURBVEEgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1ZPTFVNRSA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfUVVFVUUgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1FVRVVFX1RJVExFID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9FWFRSQVMgPSA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfREVTVFJPWUVEID0gODsKKworICAgIHByaXZhdGUgZmluYWwgSVNlc3Npb25Db250cm9sbGVyIG1TZXNzaW9uQmluZGVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gbVRva2VuOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIENhbGxiYWNrU3R1YiBtQ2JTdHViID0gbmV3IENhbGxiYWNrU3R1Yih0aGlzKTsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxNZXNzYWdlSGFuZGxlcj4gbUNhbGxiYWNrcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZUhhbmRsZXI+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNiUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBtVGFnOworCisgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc3BvcnRDb250cm9scyBtVHJhbnNwb3J0Q29udHJvbHM7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGZvciBjcmVhdGluZyBhIE1lZGlhQ29udHJvbGxlciBkaXJlY3RseSBmcm9tIGEgYmluZGVyLiBTaG91bGQgb25seQorICAgICAqIGJlIHVzZWQgYnkgZnJhbWV3b3JrIGNvZGUuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0LCBJU2Vzc2lvbkNvbnRyb2xsZXIgc2Vzc2lvbkJpbmRlcikgeworICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHRva2VuIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGV4dCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gbmV3IFRyYW5zcG9ydENvbnRyb2xzKCk7CisgICAgICAgIG1Ub2tlbiA9IG5ldyBNZWRpYVNlc3Npb24uVG9rZW4oc2Vzc2lvbkJpbmRlcik7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTWVkaWFDb250cm9sbGVyIGZyb20gYSBzZXNzaW9uJ3MgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGVyJ3MgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCwgQE5vbk51bGwgTWVkaWFTZXNzaW9uLlRva2VuIHRva2VuKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgdG9rZW4uZ2V0QmluZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHtAbGluayBUcmFuc3BvcnRDb250cm9sc30gaW5zdGFuY2UgdG8gc2VuZCB0cmFuc3BvcnQgYWN0aW9ucyB0bworICAgICAqIHRoZSBhc3NvY2lhdGVkIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdHJhbnNwb3J0IGNvbnRyb2xzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBATm9uTnVsbCBUcmFuc3BvcnRDb250cm9scyBnZXRUcmFuc3BvcnRDb250cm9scygpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc3BvcnRDb250cm9sczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSBzcGVjaWZpZWQgbWVkaWEgYnV0dG9uIGV2ZW50IHRvIHRoZSBzZXNzaW9uLiBPbmx5IG1lZGlhIGtleXMgY2FuCisgICAgICogYmUgc2VudCBieSB0aGlzIG1ldGhvZCwgb3RoZXIga2V5cyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5RXZlbnQgVGhlIG1lZGlhIGJ1dHRvbiBldmVudCB0byBkaXNwYXRjaC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBzZW50IHRvIHRoZSBzZXNzaW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50KEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIHJldHVybiBkaXNwYXRjaE1lZGlhQnV0dG9uRXZlbnRJbnRlcm5hbChmYWxzZSwga2V5RXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoZXMgdGhlIG1lZGlhIGJ1dHRvbiBldmVudCBhcyBzeXN0ZW0gc2VydmljZSB0byB0aGUgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBTaG91bGQgYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUGhvbmVXaW5kb3d9IHdoZW4gdGhlCisgICAgICogZm9yZWdyb3VuZCBhY3Rpdml0eSBkaWRuJ3QgY29uc3VtZSB0aGUga2V5IGZyb20gdGhlIGhhcmR3YXJlIGRldmljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5RXZlbnQgbWVkaWEga2V5IGV2ZW50CisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGV2ZW50IHdhcyBzZW50IHRvIHRoZSBzZXNzaW9uLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hNZWRpYUJ1dHRvbkV2ZW50QXNTeXN0ZW1TZXJ2aWNlKEBOb25OdWxsIEtleUV2ZW50IGtleUV2ZW50KSB7CisgICAgICAgIHJldHVybiBkaXNwYXRjaE1lZGlhQnV0dG9uRXZlbnRJbnRlcm5hbCh0cnVlLCBrZXlFdmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoTWVkaWFCdXR0b25FdmVudEludGVybmFsKGJvb2xlYW4gYXNTeXN0ZW1TZXJ2aWNlLAorICAgICAgICAgICAgQE5vbk51bGwgS2V5RXZlbnQga2V5RXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIktleUV2ZW50IG1heSBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICghS2V5RXZlbnQuaXNNZWRpYVNlc3Npb25LZXkoa2V5RXZlbnQuZ2V0S2V5Q29kZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL1RPRE8oYi8xMTk3NDg2NzgpOiBSZXNvbHZlIG1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSB0aHJvdWdoIHRoaXMgZmlsZS4KKyAgICAgICAgICAgIC8vIFRlbXBvcmFyaWxseSBpdCdzIHJlcGxhY2VkIHdpdGggIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIgZm9yIGNvbXBpbGluZy4KKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5zZW5kTWVkaWFCdXR0b24oIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsCisgICAgICAgICAgICAgICAgICAgIGFzU3lzdGVtU2VydmljZSwga2V5RXZlbnQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU3lzdGVtIGlzIGRlYWQuID0oCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoZXMgdGhlIHZvbHVtZSBidXR0b24gZXZlbnQgYXMgc3lzdGVtIHNlcnZpY2UgdG8gdGhlIHNlc3Npb24uCisgICAgICogPHA+CisgICAgICogU2hvdWxkIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBob25lV2luZG93fSB3aGVuIHRoZQorICAgICAqIGZvcmVncm91bmQgYWN0aXZpdHkgZGlkbid0IGNvbnN1bWUgdGhlIGtleSBmcm9tIHRoZSBoYXJkd2FyZSBkZXZpY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleUV2ZW50IHZvbHVtZSBrZXkgZXZlbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoVm9sdW1lQnV0dG9uRXZlbnRBc1N5c3RlbVNlcnZpY2UoQE5vbk51bGwgS2V5RXZlbnQga2V5RXZlbnQpIHsKKyAgICAgICAgc3dpdGNoIChrZXlFdmVudC5nZXRBY3Rpb24oKSkgeworICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5BQ1RJT05fRE9XTjogeworICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24gPSAwOworICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5RXZlbnQuZ2V0S2V5Q29kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVA6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBBdWRpb01hbmFnZXIuQURKVVNUX1JBSVNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEF1ZGlvTWFuYWdlci5BREpVU1RfTE9XRVI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9NVVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gQXVkaW9NYW5hZ2VyLkFESlVTVF9UT0dHTEVfTVVURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hZGp1c3RWb2x1bWUoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLCBBdWRpb01hbmFnZXIuRkxBR19TSE9XX1VJKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgYWRqdXN0Vm9sdW1lQnkiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gQXVkaW9NYW5hZ2VyLkZMQUdfUExBWV9TT1VORCB8IEF1ZGlvTWFuYWdlci5GTEFHX1ZJQlJBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgQXVkaW9NYW5hZ2VyLkZMQUdfRlJPTV9LRVk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuYWRqdXN0Vm9sdW1lKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCB0cnVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgYWRqdXN0Vm9sdW1lQnkiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgUGxheWJhY2tTdGF0ZSBvciBudWxsCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBQbGF5YmFja1N0YXRlIGdldFBsYXliYWNrU3RhdGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldFBsYXliYWNrU3RhdGUuIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBtZXRhZGF0YSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBNZWRpYU1ldGFkYXRhIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhIGdldE1ldGFkYXRhKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldE1ldGFkYXRhKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0TWV0YWRhdGEuIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBwbGF5IHF1ZXVlIGZvciB0aGlzIHNlc3Npb24gaWYgb25lIGlzIHNldC4gSWYgeW91IG9ubHkKKyAgICAgKiBjYXJlIGFib3V0IHRoZSBjdXJyZW50IGl0ZW0ge0BsaW5rICNnZXRNZXRhZGF0YSgpfSBzaG91bGQgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcGxheSBxdWV1ZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYVNlc3Npb24uUXVldWVJdGVtPiBnZXRRdWV1ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgcXVldWUgPSBtU2Vzc2lvbkJpbmRlci5nZXRRdWV1ZSgpOworICAgICAgICAgICAgaWYgKHF1ZXVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcXVldWUuZ2V0TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGdldFF1ZXVlLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcXVldWUgdGl0bGUgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIENoYXJTZXF1ZW5jZSBnZXRRdWV1ZVRpdGxlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldFF1ZXVlVGl0bGUoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRRdWV1ZVRpdGxlIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleHRyYXMgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuZ2V0RXh0cmFzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0RXh0cmFzIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByYXRpbmcgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIHNlc3Npb24uIE9uZSBvZjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX05PTkV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfSEVBUlR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfVEhVTUJfVVBfRE9XTn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR18zX1NUQVJTfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HXzRfU1RBUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfNV9TVEFSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19QRVJDRU5UQUdFfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHN1cHBvcnRlZCByYXRpbmcgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nVHlwZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlci5nZXRSYXRpbmdUeXBlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0UmF0aW5nVHlwZS4iLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBSYXRpbmcuUkFUSU5HX05PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZsYWdzIGZvciB0aGlzIHNlc3Npb24uIEZsYWdzIGFyZSBkZWZpbmVkIGluIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXQgb2YgZmxhZ3MgZm9yIHRoZSBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBATWVkaWFTZXNzaW9uLlNlc3Npb25GbGFncyBsb25nIGdldEZsYWdzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldEZsYWdzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgZ2V0RmxhZ3MuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHBsYXliYWNrIGluZm8gZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mbyBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBATnVsbGFibGUgUGxheWJhY2tJbmZvIGdldFBsYXliYWNrSW5mbygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhcmNlbGFibGVWb2x1bWVJbmZvIHJlc3VsdCA9IG1TZXNzaW9uQmluZGVyLmdldFZvbHVtZUF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvKHJlc3VsdC52b2x1bWVUeXBlLCByZXN1bHQuYXVkaW9BdHRycywgcmVzdWx0LmNvbnRyb2xUeXBlLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQubWF4Vm9sdW1lLCByZXN1bHQuY3VycmVudFZvbHVtZSk7CisKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRBdWRpb0luZm8uIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIGludGVudCBmb3IgbGF1bmNoaW5nIFVJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24gaWYgb25lCisgICAgICogZXhpc3RzLgorICAgICAqCisgICAgICogQHJldHVybiBBIHtAbGluayBQZW5kaW5nSW50ZW50fSB0byBsYXVuY2ggVUkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE51bGxhYmxlIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyLmdldExhdW5jaFBlbmRpbmdJbnRlbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBnZXRQZW5kaW5nSW50ZW50LiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRoaXMgaXMgY29ubmVjdGVkIHRvLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBjb25uZWN0ZWQgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFTZXNzaW9uLlRva2VuIGdldFNlc3Npb25Ub2tlbigpIHsKKyAgICAgICAgcmV0dXJuIG1Ub2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZvbHVtZSBvZiB0aGUgb3V0cHV0IHRoaXMgc2Vzc2lvbiBpcyBwbGF5aW5nIG9uLiBUaGUgY29tbWFuZCB3aWxsCisgICAgICogYmUgaWdub3JlZCBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0CisgICAgICoge0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX0FCU09MVVRFfS4gVGhlIGZsYWdzIGluCisgICAgICoge0BsaW5rIEF1ZGlvTWFuYWdlcn0gbWF5IGJlIHVzZWQgdG8gYWZmZWN0IHRoZSBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBsYXliYWNrSW5mbygpCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgaXQgdG8sIGJldHdlZW4gMCBhbmQgdGhlIHJlcG9ydGVkIG1heC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgZnJvbSB7QGxpbmsgQXVkaW9NYW5hZ2VyfSB0byBpbmNsdWRlIHdpdGggdGhlIHZvbHVtZQorICAgICAqICAgICAgICAgICAgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUbyhpbnQgdmFsdWUsIGludCBmbGFncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuc2V0Vm9sdW1lVG8oIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHZhbHVlLCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgc2V0Vm9sdW1lVG8uIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIHZvbHVtZSBvZiB0aGUgb3V0cHV0IHRoaXMgc2Vzc2lvbiBpcyBwbGF5aW5nIG9uLiBUaGUgZGlyZWN0aW9uCisgICAgICogbXVzdCBiZSBvbmUgb2Yge0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfTE9XRVJ9LAorICAgICAqIHtAbGluayBBdWRpb01hbmFnZXIjQURKVVNUX1JBSVNFfSwgb3Ige0BsaW5rIEF1ZGlvTWFuYWdlciNBREpVU1RfU0FNRX0uCisgICAgICogVGhlIGNvbW1hbmQgd2lsbCBiZSBpZ25vcmVkIGlmIHRoZSBzZXNzaW9uIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiB7QGxpbmsgVm9sdW1lUHJvdmlkZXIjVk9MVU1FX0NPTlRST0xfUkVMQVRJVkV9IG9yCisgICAgICoge0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX0FCU09MVVRFfS4gVGhlIGZsYWdzIGluCisgICAgICoge0BsaW5rIEF1ZGlvTWFuYWdlcn0gbWF5IGJlIHVzZWQgdG8gYWZmZWN0IHRoZSBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBsYXliYWNrSW5mbygpCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIGFkanVzdCB0aGUgdm9sdW1lIGluLgorICAgICAqIEBwYXJhbSBmbGFncyBBbnkgZmxhZ3MgdG8gcGFzcyB3aXRoIHRoZSBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFkanVzdFZvbHVtZSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgZmFsc2UsIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGFkanVzdFZvbHVtZUJ5LiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB1cGRhdGVzIGZyb20gdGhlIFNlc3Npb24uIFVwZGF0ZXMgd2lsbCBiZQorICAgICAqIHBvc3RlZCBvbiB0aGUgY2FsbGVyJ3MgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBvYmplY3QsIG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgZnJvbSB0aGUgc2Vzc2lvbi4gVXBkYXRlcyB3aWxsIGJlCisgICAgICogcG9zdGVkIG9uIHRoZSBzcGVjaWZpZWQgaGFuZGxlcidzIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIHBvc3QgdXBkYXRlcyBvbi4gSWYgbnVsbCB0aGUgY2FsbGVycyB0aHJlYWQKKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrLCBATnVsbGFibGUgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgYWRkQ2FsbGJhY2tMb2NrZWQoY2FsbGJhY2ssIGhhbmRsZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBjYWxsYmFjay4gSWYgYW4gdXBkYXRlIGhhcyBhbHJlYWR5IGJlZW4gcG9zdGVkCisgICAgICogeW91IG1heSBzdGlsbCByZWNlaXZlIGl0IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ2FsbGJhY2soQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZW1vdmVDYWxsYmFja0xvY2tlZChjYWxsYmFjayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIGdlbmVyaWMgY29tbWFuZCB0byB0aGUgc2Vzc2lvbi4gSXQgaXMgdXAgdG8gdGhlIHNlc3Npb24gY3JlYXRvcgorICAgICAqIHRvIGRlY2lkZSB3aGF0IGNvbW1hbmRzIGFuZCBwYXJhbWV0ZXJzIHRoZXkgd2lsbCBzdXBwb3J0LiBBcyBzdWNoLAorICAgICAqIGNvbW1hbmRzIHNob3VsZCBvbmx5IGJlIHNlbnQgdG8gc2Vzc2lvbnMgdGhhdCB0aGUgY29udHJvbGxlciBvd25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gc2VuZAorICAgICAqIEBwYXJhbSBhcmdzIEFueSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgd2l0aCB0aGUgY29tbWFuZAorICAgICAqIEBwYXJhbSBjYiBUaGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB0aGUgcmVzdWx0IG9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZENvbW1hbmQoQE5vbk51bGwgU3RyaW5nIGNvbW1hbmQsIEBOdWxsYWJsZSBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIEBOdWxsYWJsZSBSZXN1bHRSZWNlaXZlciBjYikgeworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY29tbWFuZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIuc2VuZENvbW1hbmQoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIGNvbW1hbmQsIGFyZ3MsIGNiKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkRlYWQgb2JqZWN0IGluIHNlbmRDb21tYW5kLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXNzaW9uIG93bmVyJ3MgcGFja2FnZSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcGFja2FnZSBuYW1lIG9mIG9mIHRoZSBzZXNzaW9uIG93bmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIGlmIChtUGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUgPSBtU2Vzc2lvbkJpbmRlci5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZWFkIG9iamVjdCBpbiBnZXRQYWNrYWdlTmFtZS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2Vzc2lvbidzIHRhZyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2Vzc2lvbidzIHRhZy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICBpZiAobVRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1UYWcgPSBtU2Vzc2lvbkJpbmRlci5nZXRUYWcoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGVhZCBvYmplY3QgaW4gZ2V0VGFnLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtVGFnOworICAgIH0KKworICAgIC8qCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBJU2Vzc2lvbkNvbnRyb2xsZXIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250cm9sc1NhbWVTZXNzaW9uKE1lZGlhQ29udHJvbGxlciBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXIuYXNCaW5kZXIoKSA9PSBvdGhlci5nZXRTZXNzaW9uQmluZGVyKCkuYXNCaW5kZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQ2FsbGJhY2tMb2NrZWQoQ2FsbGJhY2sgY2IsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBpZiAoZ2V0SGFuZGxlckZvckNhbGxiYWNrTG9ja2VkKGNiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJDYWxsYmFjayBpcyBhbHJlYWR5IGFkZGVkLCBpZ25vcmluZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VIYW5kbGVyIGhvbGRlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihoYW5kbGVyLmdldExvb3BlcigpLCBjYik7CisgICAgICAgIG1DYWxsYmFja3MuYWRkKGhvbGRlcik7CisgICAgICAgIGhvbGRlci5tUmVnaXN0ZXJlZCA9IHRydWU7CisKKyAgICAgICAgaWYgKCFtQ2JSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnJlZ2lzdGVyQ2FsbGJhY2tMaXN0ZW5lcigibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1Yik7CisgICAgICAgICAgICAgICAgbUNiUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkRlYWQgb2JqZWN0IGluIHJlZ2lzdGVyQ2FsbGJhY2siLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVDYWxsYmFja0xvY2tlZChDYWxsYmFjayBjYikgeworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1DYWxsYmFja3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIE1lc3NhZ2VIYW5kbGVyIGhhbmRsZXIgPSBtQ2FsbGJhY2tzLmdldChpKTsKKyAgICAgICAgICAgIGlmIChjYiA9PSBoYW5kbGVyLm1DYWxsYmFjaykgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgIGhhbmRsZXIubVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUNiUmVnaXN0ZXJlZCAmJiBtQ2FsbGJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnVucmVnaXN0ZXJDYWxsYmFja0xpc3RlbmVyKG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJEZWFkIG9iamVjdCBpbiByZW1vdmVDYWxsYmFja0xvY2tlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIHByaXZhdGUgTWVzc2FnZUhhbmRsZXIgZ2V0SGFuZGxlckZvckNhbGxiYWNrTG9ja2VkKENhbGxiYWNrIGNiKSB7CisgICAgICAgIGlmIChjYiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxsYmFjayBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBtQ2FsbGJhY2tzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBNZXNzYWdlSGFuZGxlciBoYW5kbGVyID0gbUNhbGxiYWNrcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoY2IgPT0gaGFuZGxlci5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcG9zdE1lc3NhZ2UoaW50IHdoYXQsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtQ2FsbGJhY2tzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5nZXQoaSkucG9zdCh3aGF0LCBvYmosIGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIHJlY2VpdmluZyB1cGRhdGVzIGZyb20gdGhlIHNlc3Npb24uIEEgQ2FsbGJhY2sgY2FuIGJlCisgICAgICogcmVnaXN0ZXJlZCB1c2luZyB7QGxpbmsgI3JlZ2lzdGVyQ2FsbGJhY2t9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHRoZSBzZXNzaW9uIGJlaW5nIGRlc3Ryb3llZC4gVGhlIHNlc3Npb24gaXMgbm8KKyAgICAgICAgICogbG9uZ2VyIHZhbGlkIGFmdGVyIHRoaXMgY2FsbCBhbmQgY2FsbHMgdG8gaXQgd2lsbCBiZSBpZ25vcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjdXN0b20gZXZlbnRzIHNlbnQgYnkgdGhlIHNlc3Npb24gb3duZXIgd2l0aG91dCBhCisgICAgICAgICAqIHNwZWNpZmllZCBpbnRlcmZhY2UuIENvbnRyb2xsZXJzIHNob3VsZCBvbmx5IGhhbmRsZSB0aGVzZSBmb3IKKyAgICAgICAgICogc2Vzc2lvbnMgdGhleSBvd24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgZnJvbSB0aGUgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgZXZlbnQsIG1heSBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRXZlbnQoQE5vbk51bGwgU3RyaW5nIGV2ZW50LCBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjaGFuZ2VzIGluIHBsYXliYWNrIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIG5ldyBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgc2Vzc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChATnVsbGFibGUgUGxheWJhY2tTdGF0ZSBzdGF0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IG1ldGFkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIGN1cnJlbnQgbWV0YWRhdGEgZm9yIHRoZSBzZXNzaW9uIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICogQHNlZSBNZWRpYU1ldGFkYXRhCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChATnVsbGFibGUgTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIGl0ZW1zIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1ZXVlIEEgbGlzdCBvZiBpdGVtcyBpbiB0aGUgY3VycmVudCBwbGF5IHF1ZXVlLiBJdCBzaG91bGQKKyAgICAgICAgICogICAgICAgICAgICBpbmNsdWRlIHRoZSBjdXJyZW50bHkgcGxheWluZyBpdGVtIGFzIHdlbGwgYXMgcHJldmlvdXMgYW5kCisgICAgICAgICAqICAgICAgICAgICAgdXBjb21pbmcgaXRlbXMgaWYgYXBwbGljYWJsZS4KKyAgICAgICAgICogQHNlZSBNZWRpYVNlc3Npb24uUXVldWVJdGVtCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblF1ZXVlQ2hhbmdlZChATnVsbGFibGUgTGlzdDxNZWRpYVNlc3Npb24uUXVldWVJdGVtPiBxdWV1ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBxdWV1ZSB0aXRsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYWxvbmcgd2l0aCB0aGUgcGxheSBxdWV1ZSBzdWNoIGFzCisgICAgICAgICAqICAgICAgICAgICAgICAiTm93IFBsYXlpbmciLiBNYXkgYmUgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRpdGxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25RdWV1ZVRpdGxlQ2hhbmdlZChATnVsbGFibGUgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlIHtAbGluayBNZWRpYVNlc3Npb259IGV4dHJhcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBUaGUgZXh0cmFzIHRoYXQgY2FuIGluY2x1ZGUgb3RoZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FeHRyYXNDaGFuZ2VkKEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIGNoYW5nZXMgdG8gdGhlIGF1ZGlvIGluZm8uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbmZvIFRoZSBjdXJyZW50IGF1ZGlvIGluZm8gZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQXVkaW9JbmZvQ2hhbmdlZChQbGF5YmFja0luZm8gaW5mbykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGZvciBjb250cm9sbGluZyBtZWRpYSBwbGF5YmFjayBvbiBhIHNlc3Npb24uIFRoaXMgYWxsb3dzIGFuIGFwcAorICAgICAqIHRvIHNlbmQgbWVkaWEgdHJhbnNwb3J0IGNvbW1hbmRzIHRvIHRoZSBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc3BvcnRDb250cm9scyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVHJhbnNwb3J0Q29udHJvbGxlciI7CisKKyAgICAgICAgcHJpdmF0ZSBUcmFuc3BvcnRDb250cm9scygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwcmVwYXJlIGl0cyBwbGF5YmFjay4gSW4gb3RoZXIgd29yZHMsIG90aGVyIHNlc3Npb25zIGNhbiBjb250aW51ZQorICAgICAgICAgKiB0byBwbGF5IGR1cmluZyB0aGUgcHJlcGFyYXRpb24gb2YgdGhpcyBzZXNzaW9uLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzcGVlZCB1cCB0aGUKKyAgICAgICAgICogc3RhcnQgb2YgdGhlIHBsYXliYWNrLiBPbmNlIHRoZSBwcmVwYXJhdGlvbiBpcyBkb25lLCB0aGUgc2Vzc2lvbiB3aWxsIGNoYW5nZSBpdHMgcGxheWJhY2sKKyAgICAgICAgICogc3RhdGUgdG8ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUEFVU0VEfS4gQWZ0ZXJ3YXJkcywge0BsaW5rICNwbGF5fSBjYW4gYmUgY2FsbGVkIHRvCisgICAgICAgICAqIHN0YXJ0IHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucHJlcGFyZSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwcmVwYXJlLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHByZXBhcmUgcGxheWJhY2sgZm9yIGEgc3BlY2lmaWMgbWVkaWEgaWQuIEluIG90aGVyIHdvcmRzLCBvdGhlcgorICAgICAgICAgKiBzZXNzaW9ucyBjYW4gY29udGludWUgdG8gcGxheSBkdXJpbmcgdGhlIHByZXBhcmF0aW9uIG9mIHRoaXMgc2Vzc2lvbi4gVGhpcyBtZXRob2QgY2FuIGJlCisgICAgICAgICAqIHVzZWQgdG8gc3BlZWQgdXAgdGhlIHN0YXJ0IG9mIHRoZSBwbGF5YmFjay4gT25jZSB0aGUgcHJlcGFyYXRpb24gaXMgZG9uZSwgdGhlIHNlc3Npb24KKyAgICAgICAgICogd2lsbCBjaGFuZ2UgaXRzIHBsYXliYWNrIHN0YXRlIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0uIEFmdGVyd2FyZHMsCisgICAgICAgICAqIHtAbGluayAjcGxheX0gY2FuIGJlIGNhbGxlZCB0byBzdGFydCBwbGF5YmFjay4gSWYgdGhlIHByZXBhcmF0aW9uIGlzIG5vdCBuZWVkZWQsCisgICAgICAgICAqIHtAbGluayAjcGxheUZyb21NZWRpYUlkfSBjYW4gYmUgZGlyZWN0bHkgY2FsbGVkIHdpdGhvdXQgdGhpcyBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZWRpYUlkIFRoZSBpZCBvZiB0aGUgcmVxdWVzdGVkIG1lZGlhLgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhcyB0aGF0IGNhbiBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWRpYSBpdGVtCisgICAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgcHJlcGFyZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWQoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtZWRpYUlkKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIG5vbi1lbXB0eSBTdHJpbmcgZm9yIHByZXBhcmVGcm9tTWVkaWFJZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucHJlcGFyZUZyb21NZWRpYUlkKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBtZWRpYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXBhcmUoIiArIG1lZGlhSWQgKyAiKS4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0IHRoYXQgdGhlIHBsYXllciBwcmVwYXJlIHBsYXliYWNrIGZvciBhIHNwZWNpZmljIHNlYXJjaCBxdWVyeS4gQW4gZW1wdHkgb3IgbnVsbAorICAgICAgICAgKiBxdWVyeSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHJlcXVlc3QgdG8gcHJlcGFyZSBhbnkgbXVzaWMuIEluIG90aGVyIHdvcmRzLCBvdGhlciBzZXNzaW9ucworICAgICAgICAgKiBjYW4gY29udGludWUgdG8gcGxheSBkdXJpbmcgdGhlIHByZXBhcmF0aW9uIG9mIHRoaXMgc2Vzc2lvbi4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgICogc3BlZWQgdXAgdGhlIHN0YXJ0IG9mIHRoZSBwbGF5YmFjay4gT25jZSB0aGUgcHJlcGFyYXRpb24gaXMgZG9uZSwgdGhlIHNlc3Npb24gd2lsbAorICAgICAgICAgKiBjaGFuZ2UgaXRzIHBsYXliYWNrIHN0YXRlIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0uIEFmdGVyd2FyZHMsCisgICAgICAgICAqIHtAbGluayAjcGxheX0gY2FuIGJlIGNhbGxlZCB0byBzdGFydCBwbGF5YmFjay4gSWYgdGhlIHByZXBhcmF0aW9uIGlzIG5vdCBuZWVkZWQsCisgICAgICAgICAqIHtAbGluayAjcGxheUZyb21TZWFyY2h9IGNhbiBiZSBkaXJlY3RseSBjYWxsZWQgd2l0aG91dCB0aGlzIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnkuCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgT3B0aW9uYWwgZXh0cmFzIHRoYXQgY2FuIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgICBhYm91dCB0aGUgcXVlcnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoCisgICAgICAgICAgICAgICAgLy8gSU5URU5UX0FDVElPTl9NRURJQV9QTEFZX0ZST01fU0VBUkNICisgICAgICAgICAgICAgICAgcXVlcnkgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucHJlcGFyZUZyb21TZWFyY2goIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHByZXBhcmUoIiArIHF1ZXJ5ICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgcHJlcGFyZSBwbGF5YmFjayBmb3IgYSBzcGVjaWZpYyB7QGxpbmsgVXJpfS4gSW4gb3RoZXIgd29yZHMsCisgICAgICAgICAqIG90aGVyIHNlc3Npb25zIGNhbiBjb250aW51ZSB0byBwbGF5IGR1cmluZyB0aGUgcHJlcGFyYXRpb24gb2YgdGhpcyBzZXNzaW9uLiBUaGlzIG1ldGhvZAorICAgICAgICAgKiBjYW4gYmUgdXNlZCB0byBzcGVlZCB1cCB0aGUgc3RhcnQgb2YgdGhlIHBsYXliYWNrLiBPbmNlIHRoZSBwcmVwYXJhdGlvbiBpcyBkb25lLCB0aGUKKyAgICAgICAgICogc2Vzc2lvbiB3aWxsIGNoYW5nZSBpdHMgcGxheWJhY2sgc3RhdGUgdG8ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUEFVU0VEfS4gQWZ0ZXJ3YXJkcywKKyAgICAgICAgICoge0BsaW5rICNwbGF5fSBjYW4gYmUgY2FsbGVkIHRvIHN0YXJ0IHBsYXliYWNrLiBJZiB0aGUgcHJlcGFyYXRpb24gaXMgbm90IG5lZWRlZCwKKyAgICAgICAgICoge0BsaW5rICNwbGF5RnJvbVVyaX0gY2FuIGJlIGRpcmVjdGx5IGNhbGxlZCB3aXRob3V0IHRoaXMgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHByZXBhcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmkoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IFVyaS5FTVBUWS5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIG5vbi1lbXB0eSBVcmkgZm9yIHByZXBhcmVGcm9tVXJpLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wcmVwYXJlRnJvbVVyaSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcHJlcGFyZSgiICsgdXJpICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgc3RhcnQgaXRzIHBsYXliYWNrIGF0IGl0cyBjdXJyZW50IHBvc2l0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcGxheSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucGxheSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1Yik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRXJyb3IgY2FsbGluZyBwbGF5LiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IHBsYXliYWNrIGZvciBhIHNwZWNpZmljIG1lZGlhIGlkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJZCBUaGUgaWQgb2YgdGhlIHJlcXVlc3RlZCBtZWRpYS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgdGhhdCBjYW4gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgKiAgICAgICAgICAgICAgIHRvIGJlIHBsYXllZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1lZGlhSWQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IGEgbm9uLWVtcHR5IFN0cmluZyBmb3IgcGxheUZyb21NZWRpYUlkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wbGF5RnJvbU1lZGlhSWQoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIG1lZGlhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcGxheSgiICsgbWVkaWFJZCArICIpLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0YXJ0IHBsYXliYWNrIGZvciBhIHNwZWNpZmljIHNlYXJjaCBxdWVyeS4KKyAgICAgICAgICogQW4gZW1wdHkgb3IgbnVsbCBxdWVyeSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHJlcXVlc3QgdG8gcGxheSBhbnkKKyAgICAgICAgICogbXVzaWMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5LgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhcyB0aGF0IGNhbiBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uCisgICAgICAgICAqICAgICAgICAgICAgICAgYWJvdXQgdGhlIHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2goU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aAorICAgICAgICAgICAgICAgIC8vIElOVEVOVF9BQ1RJT05fTUVESUFfUExBWV9GUk9NX1NFQVJDSAorICAgICAgICAgICAgICAgIHF1ZXJ5ID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnBsYXlGcm9tU2VhcmNoKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHBsYXkoIiArIHF1ZXJ5ICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgc3RhcnQgcGxheWJhY2sgZm9yIGEgc3BlY2lmaWMge0BsaW5rIFVyaX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgcmVxdWVzdGVkIG1lZGlhLgorICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhcyB0aGF0IGNhbiBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWRpYSBpdGVtCisgICAgICAgICAqICAgICAgICAgICAgICAgdG8gYmUgcGxheWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcGxheUZyb21VcmkoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IFVyaS5FTVBUWS5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIG5vbi1lbXB0eSBVcmkgZm9yIHBsYXlGcm9tVXJpLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5wbGF5RnJvbVVyaSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcGxheSgiICsgdXJpICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGxheSBhbiBpdGVtIHdpdGggYSBzcGVjaWZpYyBpZCBpbiB0aGUgcGxheSBxdWV1ZS4gSWYgeW91IHNwZWNpZnkgYW4KKyAgICAgICAgICogaWQgdGhhdCBpcyBub3QgaW4gdGhlIHBsYXkgcXVldWUsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9RdWV1ZUl0ZW0obG9uZyBpZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5za2lwVG9RdWV1ZUl0ZW0oIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIsIGlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHNraXBUb0l0ZW0oIiArIGlkICsgIikuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdCB0aGF0IHRoZSBwbGF5ZXIgcGF1c2UgaXRzIHBsYXliYWNrIGFuZCBzdGF5IGF0IGl0cyBjdXJyZW50CisgICAgICAgICAqIHBvc2l0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcGF1c2UoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnBhdXNlKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHBhdXNlLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgcGxheWVyIHN0b3AgaXRzIHBsYXliYWNrOyBpdCBtYXkgY2xlYXIgaXRzIHN0YXRlIGluCisgICAgICAgICAqIHdoYXRldmVyIHdheSBpcyBhcHByb3ByaWF0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnN0b3AoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgc3RvcC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNb3ZlIHRvIGEgbmV3IGxvY2F0aW9uIGluIHRoZSBtZWRpYSBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3MgUG9zaXRpb24gdG8gbW92ZSB0bywgaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLnNlZWtUbygibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgcG9zKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHNlZWtUby4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydCBmYXN0IGZvcndhcmRpbmcuIElmIHBsYXliYWNrIGlzIGFscmVhZHkgZmFzdCBmb3J3YXJkaW5nIHRoaXMKKyAgICAgICAgICogbWF5IGluY3JlYXNlIHRoZSByYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZmFzdEZvcndhcmQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmZhc3RGb3J3YXJkKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIGZhc3RGb3J3YXJkLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNraXAgdG8gdGhlIG5leHQgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLm5leHQoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgbmV4dC4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydCByZXdpbmRpbmcuIElmIHBsYXliYWNrIGlzIGFscmVhZHkgcmV3aW5kaW5nIHRoaXMgbWF5IGluY3JlYXNlCisgICAgICAgICAqIHRoZSByYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5yZXdpbmQoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcmV3aW5kLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNraXAgdG8gdGhlIHByZXZpb3VzIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91cygpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucHJldmlvdXMoIm1Db250ZXh0LmdldE9wUGFja2FnZU5hbWUoKSIsIG1DYlN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIGNhbGxpbmcgcHJldmlvdXMuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmF0ZSB0aGUgY3VycmVudCBjb250ZW50LiBUaGlzIHdpbGwgY2F1c2UgdGhlIHJhdGluZyB0byBiZSBzZXQgZm9yCisgICAgICAgICAqIHRoZSBjdXJyZW50IHVzZXIuIFRoZSBSYXRpbmcgdHlwZSBtdXN0IG1hdGNoIHRoZSB0eXBlIHJldHVybmVkIGJ5CisgICAgICAgICAqIHtAbGluayAjZ2V0UmF0aW5nVHlwZSgpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJhdGluZyBUaGUgcmF0aW5nIHRvIHNldCBmb3IgdGhlIGN1cnJlbnQgY29udGVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKFJhdGluZyByYXRpbmcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIucmF0ZSgibUNvbnRleHQuZ2V0T3BQYWNrYWdlTmFtZSgpIiwgbUNiU3R1YiwgcmF0aW5nKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciBjYWxsaW5nIHJhdGUuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VuZCBhIGN1c3RvbSBhY3Rpb24gYmFjayBmb3IgdGhlIHtAbGluayBNZWRpYVNlc3Npb259IHRvIHBlcmZvcm0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjdXN0b21BY3Rpb24gVGhlIGFjdGlvbiB0byBwZXJmb3JtLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSBmb3IgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICBjdXN0b20gYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUFjdGlvbihATm9uTnVsbCBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBjdXN0b21BY3Rpb24sCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDdXN0b21BY3Rpb24gY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kQ3VzdG9tQWN0aW9uKGN1c3RvbUFjdGlvbi5nZXRBY3Rpb24oKSwgYXJncyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VuZCB0aGUgaWQgYW5kIGFyZ3MgZnJvbSBhIGN1c3RvbSBhY3Rpb24gYmFjayBmb3IgdGhlIHtAbGluayBNZWRpYVNlc3Npb259IHRvIHBlcmZvcm0uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI3NlbmRDdXN0b21BY3Rpb24oUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uLCBCdW5kbGUgYXJncykKKyAgICAgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHtAbGluayBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbn0gYXMKKyAgICAgICAgICogICAgICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9ufSBmb3IgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICBjdXN0b20gYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUFjdGlvbihATm9uTnVsbCBTdHJpbmcgYWN0aW9uLCBATnVsbGFibGUgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ3VzdG9tQWN0aW9uIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5zZW5kQ3VzdG9tQWN0aW9uKCJtQ29udGV4dC5nZXRPcFBhY2thZ2VOYW1lKCkiLCBtQ2JTdHViLCBhY3Rpb24sIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZWFkIG9iamVjdCBpbiBzZW5kQ3VzdG9tQWN0aW9uLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgYW5kIGhvdyBhdWRpbyBpcyBoYW5kbGVkIGZvcgorICAgICAqIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2Vzc2lvbiB1c2VzIHJlbW90ZSBwbGF5YmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfUkVNT1RFID0gMjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXNzaW9uIHVzZXMgbG9jYWwgcGxheWJhY2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX0xPQ0FMID0gMTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZvbHVtZUNvbnRyb2w7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DdXJyZW50Vm9sdW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQbGF5YmFja0luZm8oaW50IHR5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywgaW50IGNvbnRyb2wsIGludCBtYXgsIGludCBjdXJyZW50KSB7CisgICAgICAgICAgICBtVm9sdW1lVHlwZSA9IHR5cGU7CisgICAgICAgICAgICBtQXVkaW9BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2wgPSBjb250cm9sOworICAgICAgICAgICAgbU1heFZvbHVtZSA9IG1heDsKKyAgICAgICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHR5cGUgb2YgcGxheWJhY2sgd2hpY2ggYWZmZWN0cyB2b2x1bWUgaGFuZGxpbmcuIE9uZSBvZjoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e0BsaW5rICNQTEFZQkFDS19UWVBFX0xPQ0FMfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgI1BMQVlCQUNLX1RZUEVfUkVNT1RFfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgdGhpcyBzZXNzaW9uIGlzIHVzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZvbHVtZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGZvciB0aGlzIHNlc3Npb24uIFRoZSBhdHRyaWJ1dGVzIHdpbGwgYWZmZWN0CisgICAgICAgICAqIHZvbHVtZSBoYW5kbGluZyBmb3IgdGhlIHNlc3Npb24uIFdoZW4gdGhlIHZvbHVtZSB0eXBlIGlzCisgICAgICAgICAqIHtAbGluayBQbGF5YmFja0luZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9IHRoZXNlIG1heSBiZSBpZ25vcmVkIGJ5IHRoZQorICAgICAgICAgKiByZW1vdGUgdm9sdW1lIGhhbmRsZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBdWRpb0F0dHJpYnV0ZXMgZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdHlwZSBvZiB2b2x1bWUgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkLiBPbmUgb2Y6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayBWb2x1bWVQcm92aWRlciNWT0xVTUVfQ09OVFJPTF9BQlNPTFVURX08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rIFZvbHVtZVByb3ZpZGVyI1ZPTFVNRV9DT05UUk9MX1JFTEFUSVZFfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgVm9sdW1lUHJvdmlkZXIjVk9MVU1FX0NPTlRST0xfRklYRUR9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB2b2x1bWUgY29udHJvbCB0aGF0IG1heSBiZSB1c2VkIHdpdGggdGhpcworICAgICAgICAgKiAgICAgICAgIHNlc3Npb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZUNvbnRyb2woKSB7CisgICAgICAgICAgICByZXR1cm4gbVZvbHVtZUNvbnRyb2w7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBtYXhpbXVtIHZvbHVtZSB0aGF0IG1heSBiZSBzZXQgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgbWF4aW11bSBhbGxvd2VkIHZvbHVtZSB3aGVyZSB0aGlzIHNlc3Npb24gaXMgcGxheWluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBjdXJyZW50IHZvbHVtZSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZvbHVtZSB3aGVyZSB0aGlzIHNlc3Npb24gaXMgcGxheWluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIENhbGxiYWNrU3R1YiBleHRlbmRzIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrLlN0dWIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFDb250cm9sbGVyPiBtQ29udHJvbGxlcjsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tTdHViKE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyKSB7CisgICAgICAgICAgICBtQ29udHJvbGxlciA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcj4oY29udHJvbGxlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCkgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19ERVNUUk9ZRUQsIG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoU3RyaW5nIGV2ZW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9zdE1lc3NhZ2UoTVNHX0VWRU5ULCBldmVudCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKFBsYXliYWNrU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgICAgIE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3N0TWVzc2FnZShNU0dfVVBEQVRFX1BMQVlCQUNLX1NUQVRFLCBzdGF0ZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19VUERBVEVfTUVUQURBVEEsIG1ldGFkYXRhLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblF1ZXVlQ2hhbmdlZChNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIHBhcmNlbGVkUXVldWUpIHsKKyAgICAgICAgICAgIExpc3Q8TWVkaWFTZXNzaW9uLlF1ZXVlSXRlbT4gcXVldWUgPSBwYXJjZWxlZFF1ZXVlID09IG51bGwgPyBudWxsIDogcGFyY2VsZWRRdWV1ZQorICAgICAgICAgICAgICAgICAgICAuZ2V0TGlzdCgpOworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19VUERBVEVfUVVFVUUsIHF1ZXVlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblF1ZXVlVGl0bGVDaGFuZ2VkKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19VUERBVEVfUVVFVUVfVElUTEUsIHRpdGxlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV4dHJhc0NoYW5nZWQoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19VUERBVEVfRVhUUkFTLCBleHRyYXMsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lSW5mb0NoYW5nZWQoUGFyY2VsYWJsZVZvbHVtZUluZm8gcHZpKSB7CisgICAgICAgICAgICBNZWRpYUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mbyBpbmZvID0gbmV3IFBsYXliYWNrSW5mbyhwdmkudm9sdW1lVHlwZSwgcHZpLmF1ZGlvQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICBwdmkuY29udHJvbFR5cGUsIHB2aS5tYXhWb2x1bWUsIHB2aS5jdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvc3RNZXNzYWdlKE1TR19VUERBVEVfVk9MVU1FLCBpbmZvLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgTWVzc2FnZUhhbmRsZXIoTG9vcGVyIGxvb3BlciwgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIGNiKSB7CisgICAgICAgICAgICAvL1RPRE86KGIvMTE5NTM5ODQ5KSBVbmNvbW1lbnQgYmVsb3cgbGluZSBhbmQgcmVzb2x2ZSB0aGUgZXJyb3IuCisgICAgICAgICAgICAvLyBzdXBlcihsb29wZXIsIG51bGwsIHRydWUpOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKCFtUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vzc2lvbkV2ZW50KChTdHJpbmcpIG1zZy5vYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfUExBWUJBQ0tfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3RhdGVDaGFuZ2VkKChQbGF5YmFja1N0YXRlKSBtc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX01FVEFEQVRBOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25NZXRhZGF0YUNoYW5nZWQoKE1lZGlhTWV0YWRhdGEpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfUVVFVUU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblF1ZXVlQ2hhbmdlZCgoTGlzdDxNZWRpYVNlc3Npb24uUXVldWVJdGVtPikgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9RVUVVRV9USVRMRToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUXVldWVUaXRsZUNoYW5nZWQoKENoYXJTZXF1ZW5jZSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9FWFRSQVM6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkV4dHJhc0NoYW5nZWQoKEJ1bmRsZSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9WT0xVTUU6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbkF1ZGlvSW5mb0NoYW5nZWQoKFBsYXliYWNrSW5mbykgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFU1RST1lFRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vzc2lvbkRlc3Ryb3llZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IHdoYXQsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2Uod2hhdCwgb2JqKTsKKyAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTdjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9NZWRpYVNlc3Npb24uYWlkbApAQCAtMCwwICsxLDE5IEBACisvKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK3BhcmNlbGFibGUgTWVkaWFTZXNzaW9uLlRva2VuOworcGFyY2VsYWJsZSBNZWRpYVNlc3Npb24uUXVldWVJdGVtOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vTWVkaWFTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzODQzZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL01lZGlhU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTU3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXIuUmVtb3RlVXNlckluZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5NZWRpYUJyb3dzZXJTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogQWxsb3dzIGludGVyYWN0aW9uIHdpdGggbWVkaWEgY29udHJvbGxlcnMsIHZvbHVtZSBrZXlzLCBtZWRpYSBidXR0b25zLCBhbmQKKyAqIHRyYW5zcG9ydCBjb250cm9scy4KKyAqIDxwPgorICogQSBNZWRpYVNlc3Npb24gc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiBhbiBhcHAgd2FudHMgdG8gcHVibGlzaCBtZWRpYSBwbGF5YmFjaworICogaW5mb3JtYXRpb24gb3IgaGFuZGxlIG1lZGlhIGtleXMuIEluIGdlbmVyYWwgYW4gYXBwIG9ubHkgbmVlZHMgb25lIHNlc3Npb24KKyAqIGZvciBhbGwgcGxheWJhY2ssIHRob3VnaCBtdWx0aXBsZSBzZXNzaW9ucyBjYW4gYmUgY3JlYXRlZCB0byBwcm92aWRlIGZpbmVyCisgKiBncmFpbiBjb250cm9scyBvZiBtZWRpYS4KKyAqIDxwPgorICogT25jZSBhIHNlc3Npb24gaXMgY3JlYXRlZCB0aGUgb3duZXIgb2YgdGhlIHNlc3Npb24gbWF5IHBhc3MgaXRzCisgKiB7QGxpbmsgI2dldFNlc3Npb25Ub2tlbigpIHNlc3Npb24gdG9rZW59IHRvIG90aGVyIHByb2Nlc3NlcyB0byBhbGxvdyB0aGVtIHRvCisgKiBjcmVhdGUgYSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSB0byBpbnRlcmFjdCB3aXRoIHRoZSBzZXNzaW9uLgorICogPHA+CisgKiBUbyByZWNlaXZlIGNvbW1hbmRzLCBtZWRpYSBrZXlzLCBhbmQgb3RoZXIgZXZlbnRzIGEge0BsaW5rIENhbGxiYWNrfSBtdXN0IGJlCisgKiBzZXQgd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrKENhbGxiYWNrKX0gYW5kIHtAbGluayAjc2V0QWN0aXZlKGJvb2xlYW4pCisgKiBzZXRBY3RpdmUodHJ1ZSl9IG11c3QgYmUgY2FsbGVkLgorICogPHA+CisgKiBXaGVuIGFuIGFwcCBpcyBmaW5pc2hlZCBwZXJmb3JtaW5nIHBsYXliYWNrIGl0IG11c3QgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0KKyAqIHRvIGNsZWFuIHVwIHRoZSBzZXNzaW9uIGFuZCBub3RpZnkgYW55IGNvbnRyb2xsZXJzLgorICogPHA+CisgKiBNZWRpYVNlc3Npb24gb2JqZWN0cyBhcmUgdGhyZWFkIHNhZmUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uIjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGZsYWcgb24gdGhlIHNlc3Npb24gdG8gaW5kaWNhdGUgdGhhdCBpdCBjYW4gaGFuZGxlIG1lZGlhIGJ1dHRvbgorICAgICAqIGV2ZW50cy4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIEFsbCBtZWRpYSBzZXNzaW9ucyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIG1lZGlhCisgICAgICogYnV0dG9uIGV2ZW50cyBub3cuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBTkRMRVNfTUVESUFfQlVUVE9OUyA9IDEgPDwgMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIGZsYWcgb24gdGhlIHNlc3Npb24gdG8gaW5kaWNhdGUgdGhhdCBpdCBoYW5kbGVzIHRyYW5zcG9ydAorICAgICAqIGNvbnRyb2wgY29tbWFuZHMgdGhyb3VnaCBpdHMge0BsaW5rIENhbGxiYWNrfS4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIEFsbCBtZWRpYSBzZXNzaW9ucyBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIHRyYW5zcG9ydAorICAgICAqIGNvbnRyb2xzIG5vdy4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFORExFU19UUkFOU1BPUlRfQ09OVFJPTFMgPSAxIDw8IDE7CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gb25seSBmbGFnIGZvciBhIHNlc3Npb24gdGhhdCBuZWVkcyB0byBoYXZlIHByaW9yaXR5IG92ZXIgYWxsIG90aGVyCisgICAgICogc2Vzc2lvbnMuIFRoaXMgZmxhZyBlbnN1cmVzIHRoaXMgc2Vzc2lvbiB3aWxsIHJlY2VpdmUgbWVkaWEgYnV0dG9uIGV2ZW50cworICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgb3JkZXJpbmcgaW4gdGhlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19FWENMVVNJVkVfR0xPQkFMX1BSSU9SSVRZID0gMSA8PCAxNjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9VSUQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QSUQgPSAtMTsKKworICAgIC8qKiBAaGlkZSAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBASW50RGVmKGZsYWcgPSB0cnVlLCB2YWx1ZSA9IHsKKyAgICAgICAgICAgIEZMQUdfSEFORExFU19NRURJQV9CVVRUT05TLAorICAgICAgICAgICAgRkxBR19IQU5ETEVTX1RSQU5TUE9SVF9DT05UUk9MUywKKyAgICAgICAgICAgIEZMQUdfRVhDTFVTSVZFX0dMT0JBTF9QUklPUklUWSB9KQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlc3Npb25GbGFncyB7IH0KKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhCaXRtYXBTaXplOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24uVG9rZW4gbVNlc3Npb25Ub2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIElTZXNzaW9uIG1CaW5kZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1N0dWIgbUNiU3R1YjsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgbUNhbGxiYWNrLiBTdXBwb3J0IGxpYiBhY2Nlc3NlcyB0aGlzIGJ5IHVzaW5nIHJlZmxlY3Rpb24uCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwcml2YXRlIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIgbUNhbGxiYWNrOworICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIgbVZvbHVtZVByb3ZpZGVyOworICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNlc3Npb24uIFRoZSBzZXNzaW9uIHdpbGwgYXV0b21hdGljYWxseSBiZSByZWdpc3RlcmVkIHdpdGgKKyAgICAgKiB0aGUgc3lzdGVtIGJ1dCB3aWxsIG5vdCBiZSBwdWJsaXNoZWQgdW50aWwge0BsaW5rICNzZXRBY3RpdmUoYm9vbGVhbikKKyAgICAgKiBzZXRBY3RpdmUodHJ1ZSl9IGlzIGNhbGxlZC4gWW91IG11c3QgY2FsbCB7QGxpbmsgI3JlbGVhc2UoKX0gd2hlbgorICAgICAqIGZpbmlzaGVkIHdpdGggdGhlIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZXNzaW9uLgorICAgICAqIEBwYXJhbSB0YWcgQSBzaG9ydCBuYW1lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCB0YWcsIFVzZXJIYW5kbGUubXlVc2VySWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzZXNzaW9uIGFzIHRoZSBzcGVjaWZpZWQgdXNlci4gVG8gY3JlYXRlIGEgc2Vzc2lvbiBhcyBhCisgICAgICogdXNlciBvdGhlciB0aGFuIHlvdXIgb3duIHlvdSBtdXN0IGhvbGQgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNJTlRFUkFDVF9BQ1JPU1NfVVNFUlNfRlVMTH0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHRvIGNyZWF0ZSB0aGUgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gdGFnIEEgc2hvcnQgbmFtZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICAqIEBwYXJhbSB1c2VySWQgVGhlIHVzZXIgaWQgdG8gY3JlYXRlIHRoZSBzZXNzaW9uIGFzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbihATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyB0YWcsIGludCB1c2VySWQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGFnKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgbU1heEJpdG1hcFNpemUgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIuZGltZW4uY29uZmlnX21lZGlhTWV0YWRhdGFCaXRtYXBNYXhTaXplKTsKKyAgICAgICAgbUNiU3R1YiA9IG5ldyBDYWxsYmFja1N0dWIodGhpcyk7CisgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9IChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy9UT0RPKGIvMTE5NzQ5ODYyKTogUmVzb2x2ZSBoaWRkZW4gQVBJIHVzYWdlLiBNZWRpYVNlc3Npb01hbmFnZXIjY3JlYXRlU2Vzc2lvbgorICAgICAgICAgICAgLy9tQmluZGVyID0gbWFuYWdlci5jcmVhdGVTZXNzaW9uKG1DYlN0dWIsIHRhZywgdXNlcklkKTsKKyAgICAgICAgICAgIG1CaW5kZXIgPSBudWxsOyAgLy9UT0RPOiByZW1vdmUgdGhpcy4KKyAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgVG9rZW4obUJpbmRlci5nZXRDb250cm9sbGVyKCkpOworICAgICAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyKGNvbnRleHQsIG1TZXNzaW9uVG9rZW4pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlbW90ZSBlcnJvciBjcmVhdGluZyBzZXNzaW9uLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgZm9yIHRoZSBNZWRpYVNlc3Npb24uIFRoaXMgaW5jbHVkZXMKKyAgICAgKiBtZWRpYSBidXR0b24gZXZlbnRzIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuIFRoZSBjYWxsZXIncyB0aHJlYWQgd2lsbCBiZQorICAgICAqIHVzZWQgdG8gcG9zdCB1cGRhdGVzLgorICAgICAqIDxwPgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0Q2FsbGJhY2soY2FsbGJhY2ssIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gcmVjZWl2ZSB1cGRhdGVzIGZvciB0aGUgTWVkaWFTZXNzaW9uLiBUaGlzIGluY2x1ZGVzCisgICAgICogbWVkaWEgYnV0dG9uIGV2ZW50cyBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgorICAgICAqIDxwPgorICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZWNlaXZlIHVwZGF0ZXMgb24uCisgICAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgdGhhdCBldmVudHMgc2hvdWxkIGJlIHBvc3RlZCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhATnVsbGFibGUgQ2FsbGJhY2sgY2FsbGJhY2ssIEBOdWxsYWJsZSBIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgdXBkYXRpbmcgdGhlIGNhbGxiYWNrLCBjbGVhciB0aGUgc2Vzc2lvbiBmcm9tIHRoZSBvbGQgb25lLgorICAgICAgICAgICAgICAgIG1DYWxsYmFjay5tQ2FsbGJhY2subVNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWxsYmFjay5tU2Vzc2lvbiA9IHRoaXM7CisgICAgICAgICAgICBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIG1zZ0hhbmRsZXIgPSBuZXcgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlcihoYW5kbGVyLmdldExvb3BlcigpLAorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBtc2dIYW5kbGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGludGVudCBmb3IgbGF1bmNoaW5nIFVJIGZvciB0aGlzIFNlc3Npb24uIFRoaXMgY2FuIGJlIHVzZWQgYXMgYQorICAgICAqIHF1aWNrIGxpbmsgdG8gYW4gb25nb2luZyBtZWRpYSBzY3JlZW4uIFRoZSBpbnRlbnQgc2hvdWxkIGJlIGZvciBhbgorICAgICAqIGFjdGl2aXR5IHRoYXQgbWF5IGJlIHN0YXJ0ZWQgdXNpbmcge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGkgVGhlIGludGVudCB0byBsYXVuY2ggdG8gc2hvdyBVSSBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eShATnVsbGFibGUgUGVuZGluZ0ludGVudCBwaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRMYXVuY2hQZW5kaW5nSW50ZW50KHBpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRmFpbHVyZSBpbiBzZXRMYXVuY2hQZW5kaW5nSW50ZW50LiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgcGVuZGluZyBpbnRlbnQgZm9yIHlvdXIgbWVkaWEgYnV0dG9uIHJlY2VpdmVyIHRvIGFsbG93IHJlc3RhcnRpbmcKKyAgICAgKiBwbGF5YmFjayBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBzdG9wcGVkLiBJZiB5b3VyIGFwcCBpcyBzdGFydGVkIGluCisgICAgICogdGhpcyB3YXkgYW4ge0BsaW5rIEludGVudCNBQ1RJT05fTUVESUFfQlVUVE9OfSBpbnRlbnQgd2lsbCBiZSBzZW50IHZpYQorICAgICAqIHRoZSBwZW5kaW5nIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnIgVGhlIHtAbGluayBQZW5kaW5nSW50ZW50fSB0byBzZW5kIHRoZSBtZWRpYSBidXR0b24gZXZlbnQgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFCdXR0b25SZWNlaXZlcihATnVsbGFibGUgUGVuZGluZ0ludGVudCBtYnIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0TWVkaWFCdXR0b25SZWNlaXZlcihtYnIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJGYWlsdXJlIGluIHNldE1lZGlhQnV0dG9uUmVjZWl2ZXIuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW55IGZsYWdzIGZvciB0aGUgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBUaGUgZmxhZ3MgdG8gc2V0IGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxhZ3MoQFNlc3Npb25GbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0RmxhZ3MoZmxhZ3MpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJGYWlsdXJlIGluIHNldEZsYWdzLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHNlc3Npb24ncyBhdWRpby4gVGhpcyB3aWxsIGFmZmVjdCB0aGUKKyAgICAgKiBzeXN0ZW0ncyB2b2x1bWUgaGFuZGxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gSWYKKyAgICAgKiB7QGxpbmsgI3NldFBsYXliYWNrVG9SZW1vdGV9IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBpdCB3aWxsIHN0b3AgcmVjZWl2aW5nCisgICAgICogdm9sdW1lIGNvbW1hbmRzIGFuZCB0aGUgc3lzdGVtIHdpbGwgYmVnaW4gc2VuZGluZyB2b2x1bWUgY2hhbmdlcyB0byB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCBzZXNzaW9ucyB1c2UgYXR0cmlidXRlcyBmb3IgbWVkaWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUge0BsaW5rIEF1ZGlvQXR0cmlidXRlc30gZm9yIHRoaXMgc2Vzc2lvbidzIGF1ZGlvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrVG9Mb2NhbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZSBudWxsIGZvciBsb2NhbCBwbGF5YmFjay4iKTsKKyAgICAgICAgfQorICAgICAgICAvL1RPRE8oYi8xMTk3NTE1OTIpOiBEZWNpZGUgaWYgQXVkaW9BdHRyaWJ1dGVzIHNob3VsZCBiZSB1cGRhdGVkLgorICAgICAgICAvKgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRQbGF5YmFja1RvTG9jYWwoYXR0cmlidXRlcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkZhaWx1cmUgaW4gc2V0UGxheWJhY2tUb0xvY2FsLiIsIGUpOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoaXMgc2Vzc2lvbiB0byB1c2UgcmVtb3RlIHZvbHVtZSBoYW5kbGluZy4gVGhpcyBtdXN0IGJlIGNhbGxlZAorICAgICAqIHRvIHJlY2VpdmUgdm9sdW1lIGJ1dHRvbiBldmVudHMsIG90aGVyd2lzZSB0aGUgc3lzdGVtIHdpbGwgYWRqdXN0IHRoZQorICAgICAqIGFwcHJvcHJpYXRlIHN0cmVhbSB2b2x1bWUgZm9yIHRoaXMgc2Vzc2lvbi4gSWYKKyAgICAgKiB7QGxpbmsgI3NldFBsYXliYWNrVG9Mb2NhbH0gd2FzIHByZXZpb3VzbHkgY2FsbGVkIHRoZSBzeXN0ZW0gd2lsbCBzdG9wCisgICAgICogaGFuZGxpbmcgdm9sdW1lIGNoYW5nZXMgZm9yIHRoaXMgc2Vzc2lvbiBhbmQgcGFzcyB0aGVtIHRvIHRoZSB2b2x1bWUKKyAgICAgKiBwcm92aWRlciBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdpbGwgaGFuZGxlIHZvbHVtZSBjaGFuZ2VzLiBNYXkKKyAgICAgKiAgICAgICAgICAgIG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBsYXliYWNrVG9SZW1vdGUoQE5vbk51bGwgVm9sdW1lUHJvdmlkZXIgdm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZvbHVtZVByb3ZpZGVyIG1heSBub3QgYmUgbnVsbCEiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKKyAgICAgICAgfQorICAgICAgICB2b2x1bWVQcm92aWRlci5zZXRDYWxsYmFjayhuZXcgVm9sdW1lUHJvdmlkZXIuQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciB2b2x1bWVQcm92aWRlcikgeworICAgICAgICAgICAgICAgIG5vdGlmeVJlbW90ZVZvbHVtZUNoYW5nZWQodm9sdW1lUHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRQbGF5YmFja1RvUmVtb3RlKHZvbHVtZVByb3ZpZGVyLmdldFZvbHVtZUNvbnRyb2woKSwKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0TWF4Vm9sdW1lKCkpOworICAgICAgICAgICAgbUJpbmRlci5zZXRDdXJyZW50Vm9sdW1lKHZvbHVtZVByb3ZpZGVyLmdldEN1cnJlbnRWb2x1bWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkZhaWx1cmUgaW4gc2V0UGxheWJhY2tUb1JlbW90ZS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiB0aGlzIHNlc3Npb24gaXMgY3VycmVudGx5IGFjdGl2ZSBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBjb21tYW5kcy4gSWYKKyAgICAgKiBzZXQgdG8gZmFsc2UgeW91ciBzZXNzaW9uJ3MgY29udHJvbGxlciBtYXkgbm90IGJlIGRpc2NvdmVyYWJsZS4gWW91IG11c3QKKyAgICAgKiBzZXQgdGhlIHNlc3Npb24gdG8gYWN0aXZlIGJlZm9yZSBpdCBjYW4gc3RhcnQgcmVjZWl2aW5nIG1lZGlhIGJ1dHRvbgorICAgICAqIGV2ZW50cyBvciB0cmFuc3BvcnQgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZlIFdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIGFjdGl2ZSBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICAgIGlmIChtQWN0aXZlID09IGFjdGl2ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldEFjdGl2ZShhY3RpdmUpOworICAgICAgICAgICAgbUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoVEFHLCAiRmFpbHVyZSBpbiBzZXRBY3RpdmUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYWN0aXZlIHN0YXRlIG9mIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbiBpcyBhY3RpdmUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhIHByb3ByaWV0YXJ5IGV2ZW50IHRvIGFsbCBNZWRpYUNvbnRyb2xsZXJzIGxpc3RlbmluZyB0byB0aGlzCisgICAgICogU2Vzc2lvbi4gSXQncyB1cCB0byB0aGUgQ29udHJvbGxlci9TZXNzaW9uIG93bmVyIHRvIGRldGVybWluZSB0aGUgbWVhbmluZworICAgICAqIG9mIGFueSBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEFueSBleHRyYXMgaW5jbHVkZWQgd2l0aCB0aGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kU2Vzc2lvbkV2ZW50KEBOb25OdWxsIFN0cmluZyBldmVudCwgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGV2ZW50KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXZlbnQgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZW5kRXZlbnQoZXZlbnQsIGV4dHJhcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkVycm9yIHNlbmRpbmcgZXZlbnQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiBhbiBhcHAgaGFzIGZpbmlzaGVkIHBlcmZvcm1pbmcgcGxheWJhY2suIElmCisgICAgICogcGxheWJhY2sgaXMgZXhwZWN0ZWQgdG8gc3RhcnQgYWdhaW4gc2hvcnRseSB0aGUgc2Vzc2lvbiBjYW4gYmUgbGVmdCBvcGVuLAorICAgICAqIGJ1dCBpdCBtdXN0IGJlIHJlbGVhc2VkIGlmIHlvdXIgYWN0aXZpdHkgb3Igc2VydmljZSBpcyBiZWluZyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuZGVzdHJveSgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJFcnJvciByZWxlYXNpbmcgc2Vzc2lvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHRva2VuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFwcHMgdG8gY3JlYXRlIGEKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIHNlc3Npb24uIFRoZSBvd25lciBvZgorICAgICAqIHRoZSBzZXNzaW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZWNpZGluZyBob3cgdG8gZGlzdHJpYnV0ZSB0aGVzZSB0b2tlbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBNZWRpYUNvbnRyb2xsZXIgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25Ub2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb250cm9sbGVyIGZvciB0aGlzIHNlc3Npb24uIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYXZvaWQKKyAgICAgKiBoYXZpbmcgdG8gY2FjaGUgeW91ciBvd24gY29udHJvbGxlciBpbiBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBBIGNvbnRyb2xsZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQE5vbk51bGwgTWVkaWFDb250cm9sbGVyIGdldENvbnRyb2xsZXIoKSB7CisgICAgICAgIHJldHVybiBtQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUgb2YgcGxheWJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1N0YXRlKEBOdWxsYWJsZSBQbGF5YmFja1N0YXRlIHN0YXRlKSB7CisgICAgICAgIG1QbGF5YmFja1N0YXRlID0gc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZihUQUcsICJEZWFkIG9iamVjdCBpbiBzZXRQbGF5YmFja1N0YXRlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBjdXJyZW50IG1ldGFkYXRhLiBOZXcgbWV0YWRhdGEgY2FuIGJlIGNyZWF0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhLkJ1aWxkZXJ9LiBUaGlzIG9wZXJhdGlvbiBtYXkgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0bworICAgICAqIHRoZSBzaXplIG9mIHRoZSBiaXRtYXAgdG8gcmVwbGFjZSBsYXJnZSBiaXRtYXBzIHdpdGggYSBzY2FsZWQgZG93biBjb3B5LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBuZXcgbWV0YWRhdGEKKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YS5CdWlsZGVyI3B1dEJpdG1hcAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgIGxvbmcgZHVyYXRpb24gPSAtMTsKKyAgICAgICAgaW50IGZpZWxkcyA9IDA7CisgICAgICAgIE1lZGlhRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgbWV0YWRhdGEgPSAobmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcihtZXRhZGF0YSwgbU1heEJpdG1hcFNpemUpKS5idWlsZCgpOworICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OKSkgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWVsZHMgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG1ldGFkYXRhLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1ldGFkYXRhRGVzY3JpcHRpb24gPSAic2l6ZT0iICsgZmllbGRzICsgIiwgZGVzY3JpcHRpb249IiArIGRlc2NyaXB0aW9uOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldE1ldGFkYXRhKG1ldGFkYXRhLCBkdXJhdGlvbiwgbWV0YWRhdGFEZXNjcmlwdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKFRBRywgIkRlYWQgb2JqZWN0IGluIHNldFBsYXliYWNrU3RhdGUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIHBsYXkgcXVldWUuIEl0IGlzIGFuIG9yZGVyZWQgbGlzdCBhbmQKKyAgICAgKiBzaG91bGQgY29udGFpbiB0aGUgY3VycmVudCBpdGVtLCBhbmQgcHJldmlvdXMgb3IgdXBjb21pbmcgaXRlbXMgaWYgdGhleQorICAgICAqIGV4aXN0LiBTcGVjaWZ5IG51bGwgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBwbGF5IHF1ZXVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBxdWV1ZSBzaG91bGQgYmUgb2YgcmVhc29uYWJsZSBzaXplLiBJZiB0aGUgcGxheSBxdWV1ZSBpcyB1bmJvdW5kZWQKKyAgICAgKiB3aXRoaW4geW91ciBhcHAsIGl0IGlzIGJldHRlciB0byBzZW5kIGEgcmVhc29uYWJsZSBhbW91bnQgaW4gYSBzbGlkaW5nCisgICAgICogd2luZG93IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVldWUgQSBsaXN0IG9mIGl0ZW1zIGluIHRoZSBwbGF5IHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlKEBOdWxsYWJsZSBMaXN0PFF1ZXVlSXRlbT4gcXVldWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0UXVldWUocXVldWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgTWVkaWFQYXJjZWxlZExpc3RTbGljZTxRdWV1ZUl0ZW0+KHF1ZXVlKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cud3RmKCJEZWFkIG9iamVjdCBpbiBzZXRRdWV1ZS4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIHBsYXkgcXVldWUuIFRoZSBVSSBzaG91bGQgZGlzcGxheSB0aGlzIHRpdGxlIGFsb25nCisgICAgICogd2l0aCB0aGUgcGxheSBxdWV1ZSBpdHNlbGYuCisgICAgICogZS5nLiAiUGxheSBRdWV1ZSIsICJOb3cgUGxheWluZyIsIG9yIGFuIGFsYnVtIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwbGF5IHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXVlVGl0bGUoQE51bGxhYmxlIENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJpbmRlci5zZXRRdWV1ZVRpdGxlKHRpdGxlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53dGYoIkRlYWQgb2JqZWN0IGluIHNldFF1ZXVlVGl0bGUuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0eWxlIG9mIHJhdGluZyB1c2VkIGJ5IHRoaXMgc2Vzc2lvbi4gQXBwcyB0cnlpbmcgdG8gc2V0IHRoZQorICAgICAqIHJhdGluZyBzaG91bGQgdXNlIHRoaXMgc3R5bGUuIE11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR19OT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HXzNfU1RBUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfNF9TVEFSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgUmF0aW5nI1JBVElOR181X1NUQVJTfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX0hFQVJUfTwvbGk+CisgICAgICogPGxpPntAbGluayBSYXRpbmcjUkFUSU5HX1BFUkNFTlRBR0V9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIFJhdGluZyNSQVRJTkdfVEhVTUJfVVBfRE9XTn08L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmF0aW5nVHlwZShAUmF0aW5nLlN0eWxlIGludCB0eXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldFJhdGluZ1R5cGUodHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiBzZXRSYXRpbmdUeXBlLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHNvbWUgZXh0cmFzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uIE5vIGFzc3VtcHRpb25zIHNob3VsZAorICAgICAqIGJlIG1hZGUgYXMgdG8gaG93IGEge0BsaW5rIE1lZGlhQ29udHJvbGxlcn0gd2lsbCBoYW5kbGUgdGhlc2UgZXh0cmFzLgorICAgICAqIEtleXMgc2hvdWxkIGJlIGZ1bGx5IHF1YWxpZmllZCAoZS5nLiBjb20uZXhhbXBsZS5NWV9FWFRSQSkgdG8gYXZvaWQgY29uZmxpY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dHJhcyBUaGUgZXh0cmFzIGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXh0cmFzKEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmluZGVyLnNldEV4dHJhcyhleHRyYXMpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnd0ZigiRGVhZCBvYmplY3QgaW4gc2V0RXh0cmFzLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29udHJvbGxlciBpbmZvcm1hdGlvbiB3aG8gc2VudCB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IFRoaXMgaXMgb25seSB2YWxpZCB3aGlsZSBpbiBhIHJlcXVlc3QgY2FsbGJhY2ssIHN1Y2ggYXMge0BsaW5rIENhbGxiYWNrI29uUGxheX0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3V0c2lkZSBvZiB7QGxpbmsgQ2FsbGJhY2t9IG1ldGhvZHMuCisgICAgICogQHNlZSBNZWRpYVNlc3Npb25NYW5hZ2VyI2lzVHJ1c3RlZEZvck1lZGlhQ29udHJvbChSZW1vdGVVc2VySW5mbykKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQE5vbk51bGwgUmVtb3RlVXNlckluZm8gZ2V0Q3VycmVudENvbnRyb2xsZXJJbmZvKCkgeworICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwgfHwgbUNhbGxiYWNrLm1DdXJyZW50Q29udHJvbGxlckluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgb2YgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIG1ldGhvZHMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm1DdXJyZW50Q29udHJvbGxlckluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBzeXN0ZW0gdGhhdCB0aGUgcmVtb3RlIHZvbHVtZSBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGlzIGhhbmRsaW5nIHZvbHVtZSBjaGFuZ2VzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5UmVtb3RlVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCB8fCBwcm92aWRlciAhPSBtVm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCB1cGRhdGUgZnJvbSBzdGFsZSB2b2x1bWUgcHJvdmlkZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CaW5kZXIuc2V0Q3VycmVudFZvbHVtZShwcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gbm90aWZ5Vm9sdW1lQ2hhbmdlZCIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0aGF0IHNlbnQgdGhlIGxhc3QgbWVkaWEgYnV0dG9uLCB0cmFuc3BvcnQgY29udHJvbCwgb3IKKyAgICAgKiBjb21tYW5kIGZyb20gY29udHJvbGxlcnMgYW5kIHRoZSBzeXN0ZW0uIFRoaXMgaXMgb25seSB2YWxpZCB3aGlsZSBpbiBhIHJlcXVlc3QgY2FsbGJhY2ssIHN1Y2gKKyAgICAgKiBhcyB7QGxpbmsgQ2FsbGJhY2sjb25QbGF5fS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgU3RyaW5nIGdldENhbGxpbmdQYWNrYWdlKCkgeworICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwgJiYgbUNhbGxiYWNrLm1DdXJyZW50Q29udHJvbGxlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5tQ3VycmVudENvbnRyb2xsZXJJbmZvLmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZShSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVQQVJFLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQcmVwYXJlRnJvbU1lZGlhSWQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BSRVBBUkVfTUVESUFfSUQsIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZUZyb21TZWFyY2goUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVQQVJFX1NFQVJDSCwgcXVlcnksIGV4dHJhcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUHJlcGFyZUZyb21VcmkoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUFJFUEFSRV9VUkksIHVyaSwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5KFJlbW90ZVVzZXJJbmZvIGNhbGxlcikgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BMQVksIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFBsYXlGcm9tTWVkaWFJZChSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUExBWV9NRURJQV9JRCwgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5RnJvbVNlYXJjaChSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1BMQVlfU0VBUkNILCBxdWVyeSwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQbGF5RnJvbVVyaShSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QTEFZX1VSSSwgdXJpLCBleHRyYXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFNraXBUb0l0ZW0oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBsb25nIGlkKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfU0tJUF9UT19JVEVNLCBpZCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUGF1c2UoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUEFVU0UsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFN0b3AoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfU1RPUCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoTmV4dChSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19ORVhULCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hQcmV2aW91cyhSZW1vdGVVc2VySW5mbyBjYWxsZXIpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QUkVWSU9VUywgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoRmFzdEZvcndhcmQoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfRkFTVF9GT1JXQVJELCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hSZXdpbmQoUmVtb3RlVXNlckluZm8gY2FsbGVyKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUkVXSU5ELCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTZWVrVG8oUmVtb3RlVXNlckluZm8gY2FsbGVyLCBsb25nIHBvcykgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX1NFRUtfVE8sIHBvcywgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoUmF0ZShSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFJhdGluZyByYXRpbmcpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19SQVRFLCByYXRpbmcsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaEN1c3RvbUFjdGlvbihSZW1vdGVVc2VySW5mbyBjYWxsZXIsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfQ1VTVE9NX0FDVElPTiwgYWN0aW9uLCBhcmdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hNZWRpYUJ1dHRvbihSZW1vdGVVc2VySW5mbyBjYWxsZXIsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCkgeworICAgICAgICBwb3N0VG9DYWxsYmFjayhjYWxsZXIsIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIuTVNHX01FRElBX0JVVFRPTiwgbWVkaWFCdXR0b25JbnRlbnQsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaE1lZGlhQnV0dG9uRGVsYXllZChSZW1vdGVVc2VySW5mbyBpbmZvLCBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQsCisgICAgICAgICAgICBsb25nIGRlbGF5KSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrRGVsYXllZChpbmZvLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQsIG51bGwsIGRlbGF5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hBZGp1c3RWb2x1bWUoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIHBvc3RUb0NhbGxiYWNrKGNhbGxlciwgQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfQURKVVNUX1ZPTFVNRSwgZGlyZWN0aW9uLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTZXRWb2x1bWVUbyhSZW1vdGVVc2VySW5mbyBjYWxsZXIsIGludCB2b2x1bWUpIHsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19TRVRfVk9MVU1FLCB2b2x1bWUsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaENvbW1hbmQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBTdHJpbmcgY29tbWFuZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZXN1bHRDYikgeworICAgICAgICBDb21tYW5kIGNtZCA9IG5ldyBDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlc3VsdENiKTsKKyAgICAgICAgcG9zdFRvQ2FsbGJhY2soY2FsbGVyLCBDYWxsYmFja01lc3NhZ2VIYW5kbGVyLk1TR19DT01NQU5ELCBjbWQsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0VG9DYWxsYmFjayhSZW1vdGVVc2VySW5mbyBjYWxsZXIsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICBwb3N0VG9DYWxsYmFja0RlbGF5ZWQoY2FsbGVyLCB3aGF0LCBvYmosIGRhdGEsIDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0VG9DYWxsYmFja0RlbGF5ZWQoUmVtb3RlVXNlckluZm8gY2FsbGVyLCBpbnQgd2hhdCwgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEsCisgICAgICAgICAgICBsb25nIGRlbGF5KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb3N0KGNhbGxlciwgd2hhdCwgb2JqLCBkYXRhLCBkZWxheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGNvbnNpZGVyZWQgYW4gYWN0aXZlIHBsYXliYWNrIHN0YXRlLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmVTdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX0ZBU1RfRk9SV0FSRElORzoKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9SRVdJTkRJTkc6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU0tJUFBJTkdfVE9fUFJFVklPVVM6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU0tJUFBJTkdfVE9fTkVYVDoKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkc6CisgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIG9uZ29pbmcgc2Vzc2lvbi4gVGhpcyBtYXkgYmUgcGFzc2VkIHRvIGFwcHMgYnkgdGhlIHNlc3Npb24KKyAgICAgKiBvd25lciB0byBhbGxvdyB0aGVtIHRvIGNyZWF0ZSBhIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IHRvIGNvbW11bmljYXRlIHdpdGgKKyAgICAgKiB0aGUgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRva2VuIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBJU2Vzc2lvbkNvbnRyb2xsZXIgbUJpbmRlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUb2tlbihJU2Vzc2lvbkNvbnRyb2xsZXIgYmluZGVyKSB7CisgICAgICAgICAgICBtQmluZGVyID0gYmluZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgZGVzdC53cml0ZVN0cm9uZ0JpbmRlcihtQmluZGVyLmFzQmluZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAxOworICAgICAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG1CaW5kZXIgPT0gbnVsbCkgPyAwIDogbUJpbmRlci5hc0JpbmRlcigpLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIFRva2VuIG90aGVyID0gKFRva2VuKSBvYmo7CisgICAgICAgICAgICBpZiAobUJpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLm1CaW5kZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUJpbmRlci5hc0JpbmRlcigpLmVxdWFscyhvdGhlci5tQmluZGVyLmFzQmluZGVyKCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgSVNlc3Npb25Db250cm9sbGVyIGdldEJpbmRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmluZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8VG9rZW4+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8VG9rZW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVG9rZW4gY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKElTZXNzaW9uQ29udHJvbGxlci5TdHViLmFzSW50ZXJmYWNlKGluLnJlYWRTdHJvbmdCaW5kZXIoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUb2tlbltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbltzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBtZWRpYSBidXR0b25zLCB0cmFuc3BvcnQgY29udHJvbHMsIGFuZCBjb21tYW5kcyBmcm9tIGNvbnRyb2xsZXJzCisgICAgICogYW5kIHRoZSBzeXN0ZW0uIEEgY2FsbGJhY2sgbWF5IGJlIHNldCB1c2luZyB7QGxpbmsgI3NldENhbGxiYWNrfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENhbGxiYWNrIHsKKworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtU2Vzc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIG1IYW5kbGVyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZzsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2soKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBjb250cm9sbGVyIGhhcyBzZW50IGEgY29tbWFuZCB0byB0aGlzIHNlc3Npb24uCisgICAgICAgICAqIFRoZSBvd25lciBvZiB0aGUgc2Vzc2lvbiBtYXkgaGFuZGxlIGN1c3RvbSBjb21tYW5kcyBidXQgaXMgbm90CisgICAgICAgICAqIHJlcXVpcmVkIHRvLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwuCisgICAgICAgICAqIEBwYXJhbSBjYiBBIHJlc3VsdCByZWNlaXZlciB0byB3aGljaCBhIHJlc3VsdCBtYXkgYmUgc2VudCBieSB0aGUgY29tbWFuZCwgbWF5IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgU3RyaW5nIGNvbW1hbmQsIEBOdWxsYWJsZSBCdW5kbGUgYXJncywKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCB0aGlzIHNlc3Npb24gaGFzIHRoZQorICAgICAgICAgKiBoaWdoZXN0IHByaW9yaXR5IG9yIGEgY29udHJvbGxlciBzZW5kcyBhIG1lZGlhIGJ1dHRvbiBldmVudCB0byB0aGUKKyAgICAgICAgICogc2Vzc2lvbi4gVGhlIGRlZmF1bHQgYmVoYXZpb3Igd2lsbCBjYWxsIHRoZSByZWxldmFudCBtZXRob2QgaWYgdGhlCisgICAgICAgICAqIGFjdGlvbiBmb3IgaXQgd2FzIHNldC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBpbnRlbnQgd2lsbCBiZSBvZiB0eXBlIHtAbGluayBJbnRlbnQjQUNUSU9OX01FRElBX0JVVFRPTn0gd2l0aCBhCisgICAgICAgICAqIEtleUV2ZW50IGluIHtAbGluayBJbnRlbnQjRVhUUkFfS0VZX0VWRU5UfQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFCdXR0b25JbnRlbnQgYW4gaW50ZW50IGNvbnRhaW5pbmcgdGhlIEtleUV2ZW50IGFzIGFuCisgICAgICAgICAqICAgICAgICAgICAgZXh0cmEKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZWRpYUJ1dHRvbkV2ZW50KEBOb25OdWxsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCkgeworICAgICAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGwgJiYgbUhhbmRsZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBJbnRlbnQuQUNUSU9OX01FRElBX0JVVFRPTi5lcXVhbHMobWVkaWFCdXR0b25JbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgS2V5RXZlbnQga2UgPSBtZWRpYUJ1dHRvbkludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoSW50ZW50LkVYVFJBX0tFWV9FVkVOVCk7CisgICAgICAgICAgICAgICAgaWYgKGtlICE9IG51bGwgJiYga2UuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TZXNzaW9uLm1QbGF5YmFja1N0YXRlOworICAgICAgICAgICAgICAgICAgICBsb25nIHZhbGlkQWN0aW9ucyA9IHN0YXRlID09IG51bGwgPyAwIDogc3RhdGUuZ2V0QWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtlLmdldEtleUNvZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfSEVBRFNFVEhPT0s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtlLmdldFJlcGVhdENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGxvbmctcHJlc3MgYXMgYSBzaW5nbGUgdGFwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBkb3VibGUgdGFwIGFzIHRoZSBuZXh0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja01lc3NhZ2VIYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLk1TR19QTEFZX1BBVVNFX0tFWV9ET1VCTEVfVEFQX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5UGF1c2VLZXlQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0tJUF9UT19ORVhUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNraXBUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXlQYXVzZUtleVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5kaXNwYXRjaE1lZGlhQnV0dG9uRGVsYXllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5nZXRDdXJyZW50Q29udHJvbGxlckluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1dHRvbkludGVudCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0RG91YmxlVGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFub3RoZXIga2V5IGlzIHByZXNzZWQgd2l0aGluIGRvdWJsZSB0YXAgdGltZW91dCwgY29uc2lkZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZyBwbGF5L3BhdXNlIGFzIGEgc2luZ2xlIHRhcCB0byBoYW5kbGUgbWVkaWEga2V5cyBpbiBvcmRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZWRpYVBsYXlQYXVzZUtleVNpbmdsZVRhcElmUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZS5nZXRLZXlDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9QTEFZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTUVESUFfTkVYVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NLSVBfVE9fTkVYVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNraXBUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0tJUF9UT19QUkVWSU9VUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNraXBUb1ByZXZpb3VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU1RPUCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX01FRElBX0ZBU1RfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbGlkQWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhc3RGb3J3YXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9NRURJQV9SRVdJTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWxpZEFjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1lZGlhUGxheVBhdXNlS2V5U2luZ2xlVGFwSWZQZW5kaW5nKCkgeworICAgICAgICAgICAgaWYgKCFtTWVkaWFQbGF5UGF1c2VLZXlQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheVBhdXNlS2V5UGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoQ2FsbGJhY2tNZXNzYWdlSGFuZGxlci5NU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VUKTsKKyAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU2Vzc2lvbi5tUGxheWJhY2tTdGF0ZTsKKyAgICAgICAgICAgIGxvbmcgdmFsaWRBY3Rpb25zID0gc3RhdGUgPT0gbnVsbCA/IDAgOiBzdGF0ZS5nZXRBY3Rpb25zKCk7CisgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IHN0YXRlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgc3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICBib29sZWFuIGNhblBsYXkgPSAodmFsaWRBY3Rpb25zICYgKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVlfUEFVU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWSkpICE9IDA7CisgICAgICAgICAgICBib29sZWFuIGNhblBhdXNlID0gKHZhbGlkQWN0aW9ucyAmIChQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZX1BBVVNFCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFKSkgIT0gMDsKKyAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgY2FuUGF1c2UpIHsKKyAgICAgICAgICAgICAgICBvblBhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgY2FuUGxheSkgeworICAgICAgICAgICAgICAgIG9uUGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwcmVwYXJlIHBsYXliYWNrLiBEdXJpbmcgdGhlIHByZXBhcmF0aW9uLCBhIHNlc3Npb24gc2hvdWxkCisgICAgICAgICAqIG5vdCBob2xkIGF1ZGlvIGZvY3VzIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHNlc3Npb25zIHBsYXkgc2VhbWxlc3NseS4gVGhlIHN0YXRlIG9mCisgICAgICAgICAqIHBsYXliYWNrIHNob3VsZCBiZSB1cGRhdGVkIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0gYWZ0ZXIgdGhlIHByZXBhcmF0aW9uIGlzCisgICAgICAgICAqIGRvbmUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmUoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHByZXBhcmUgZm9yIHBsYXlpbmcgYSBzcGVjaWZpYyBtZWRpYUlkIHRoYXQgd2FzIHByb3ZpZGVkCisgICAgICAgICAqIGJ5IHlvdXIgYXBwJ3Mge0BsaW5rIE1lZGlhQnJvd3NlclNlcnZpY2V9LiBEdXJpbmcgdGhlIHByZXBhcmF0aW9uLCBhIHNlc3Npb24gc2hvdWxkIG5vdAorICAgICAgICAgKiBob2xkIGF1ZGlvIGZvY3VzIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHNlc3Npb25zIHBsYXkgc2VhbWxlc3NseS4gVGhlIHN0YXRlIG9mIHBsYXliYWNrCisgICAgICAgICAqIHNob3VsZCBiZSB1cGRhdGVkIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0gYWZ0ZXIgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUuCisgICAgICAgICAqIFRoZSBwbGF5YmFjayBvZiB0aGUgcHJlcGFyZWQgY29udGVudCBzaG91bGQgc3RhcnQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAqIHtAbGluayAjb25QbGF5fS4gT3ZlcnJpZGUge0BsaW5rICNvblBsYXlGcm9tTWVkaWFJZH0gdG8gaGFuZGxlIHJlcXVlc3RzIGZvciBzdGFydGluZworICAgICAgICAgKiBwbGF5YmFjayB3aXRob3V0IHByZXBhcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlRnJvbU1lZGlhSWQoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcHJlcGFyZSBwbGF5YmFjayBmcm9tIGEgc2VhcmNoIHF1ZXJ5LiBBbiBlbXB0eSBxdWVyeQorICAgICAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG1heSBwcmVwYXJlIGFueSBtdXNpYy4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBhdHRlbXB0IHRvIG1ha2UgYQorICAgICAgICAgKiBzbWFydCBjaG9pY2UgYWJvdXQgd2hhdCB0byBwbGF5LiBEdXJpbmcgdGhlIHByZXBhcmF0aW9uLCBhIHNlc3Npb24gc2hvdWxkIG5vdCBob2xkIGF1ZGlvCisgICAgICAgICAqIGZvY3VzIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHNlc3Npb25zIHBsYXkgc2VhbWxlc3NseS4gVGhlIHN0YXRlIG9mIHBsYXliYWNrIHNob3VsZCBiZQorICAgICAgICAgKiB1cGRhdGVkIHRvIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BBVVNFRH0gYWZ0ZXIgdGhlIHByZXBhcmF0aW9uIGlzIGRvbmUuIFRoZSBwbGF5YmFjaworICAgICAgICAgKiBvZiB0aGUgcHJlcGFyZWQgY29udGVudCBzaG91bGQgc3RhcnQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayAjb25QbGF5fS4gT3ZlcnJpZGUKKyAgICAgICAgICoge0BsaW5rICNvblBsYXlGcm9tU2VhcmNofSB0byBoYW5kbGUgcmVxdWVzdHMgZm9yIHN0YXJ0aW5nIHBsYXliYWNrIHdpdGhvdXQgcHJlcGFyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tU2VhcmNoKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwcmVwYXJlIGEgc3BlY2lmaWMgbWVkaWEgaXRlbSByZXByZXNlbnRlZCBieSBhIFVSSS4KKyAgICAgICAgICogRHVyaW5nIHRoZSBwcmVwYXJhdGlvbiwgYSBzZXNzaW9uIHNob3VsZCBub3QgaG9sZCBhdWRpbyBmb2N1cyBpbiBvcmRlciB0byBhbGxvdworICAgICAgICAgKiBvdGhlciBzZXNzaW9ucyBwbGF5IHNlYW1sZXNzbHkuIFRoZSBzdGF0ZSBvZiBwbGF5YmFjayBzaG91bGQgYmUgdXBkYXRlZCB0bworICAgICAgICAgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9IGFmdGVyIHRoZSBwcmVwYXJhdGlvbiBpcyBkb25lLgorICAgICAgICAgKiBUaGUgcGxheWJhY2sgb2YgdGhlIHByZXBhcmVkIGNvbnRlbnQgc2hvdWxkIHN0YXJ0IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgKiB7QGxpbmsgI29uUGxheX0uIE92ZXJyaWRlIHtAbGluayAjb25QbGF5RnJvbVVyaX0gdG8gaGFuZGxlIHJlcXVlc3RzCisgICAgICAgICAqIGZvciBzdGFydGluZyBwbGF5YmFjayB3aXRob3V0IHByZXBhcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QcmVwYXJlRnJvbVVyaShVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIGJlZ2luIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBiZWdpbiBwbGF5YmFjayBmcm9tIGEgc2VhcmNoIHF1ZXJ5LiBBbgorICAgICAgICAgKiBlbXB0eSBxdWVyeSBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG1heSBwbGF5IGFueSBtdXNpYy4gVGhlCisgICAgICAgICAqIGltcGxlbWVudGF0aW9uIHNob3VsZCBhdHRlbXB0IHRvIG1ha2UgYSBzbWFydCBjaG9pY2UgYWJvdXQgd2hhdCB0bworICAgICAgICAgKiBwbGF5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5RnJvbVNlYXJjaChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcGxheSBhIHNwZWNpZmljIG1lZGlhSWQgdGhhdCB3YXMKKyAgICAgICAgICogcHJvdmlkZWQgYnkgeW91ciBhcHAncyB7QGxpbmsgTWVkaWFCcm93c2VyU2VydmljZX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlGcm9tTWVkaWFJZChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwbGF5IGEgc3BlY2lmaWMgbWVkaWEgaXRlbSByZXByZXNlbnRlZCBieSBhIFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheUZyb21VcmkoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBwbGF5IGFuIGl0ZW0gd2l0aCBhIGdpdmVuIGlkIGZyb20gdGhlCisgICAgICAgICAqIHBsYXkgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNraXBUb1F1ZXVlSXRlbShsb25nIGlkKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHBhdXNlIHBsYXliYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gc2tpcCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9OZXh0KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRlIHRvIGhhbmRsZSByZXF1ZXN0cyB0byBza2lwIHRvIHRoZSBwcmV2aW91cyBtZWRpYSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ta2lwVG9QcmV2aW91cygpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gZmFzdCBmb3J3YXJkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25GYXN0Rm9yd2FyZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgcmVxdWVzdHMgdG8gcmV3aW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25SZXdpbmQoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHN0b3AgcGxheWJhY2suCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGUgdG8gaGFuZGxlIHJlcXVlc3RzIHRvIHNlZWsgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbiBpbiBtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvcyBOZXcgcG9zaXRpb24gdG8gbW92ZSB0bywgaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPdmVycmlkZSB0byBoYW5kbGUgdGhlIGl0ZW0gYmVpbmcgcmF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByYXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0UmF0aW5nKEBOb25OdWxsIFJhdGluZyByYXRpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IHdhbnRzIGEge0BsaW5rIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9ufSB0byBiZQorICAgICAgICAgKiBwZXJmb3JtZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiB0aGF0IHdhcyBvcmlnaW5hbGx5IHNlbnQgaW4gdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAge0BsaW5rIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBPcHRpb25hbCBleHRyYXMgc3BlY2lmaWVkIGJ5IHRoZSB7QGxpbmsgTWVkaWFDb250cm9sbGVyfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQWN0aW9uKEBOb25OdWxsIFN0cmluZyBhY3Rpb24sIEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tTdHViIGV4dGVuZHMgSVNlc3Npb25DYWxsYmFjay5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbj4gbU1lZGlhU2Vzc2lvbjsKKworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tTdHViKE1lZGlhU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFJlbW90ZVVzZXJJbmZvIGNyZWF0ZVJlbW90ZVVzZXJJbmZvKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICBjYWxsZXIgIT0gbnVsbCA/IGNhbGxlci5hc0JpbmRlcigpIDogbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoQ29tbWFuZChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBhcmdzLCBjYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYUJ1dHRvbihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsIEludGVudCBtZWRpYUJ1dHRvbkludGVudCwKKyAgICAgICAgICAgICAgICBpbnQgc2VxdWVuY2VOdW1iZXIsIFJlc3VsdFJlY2VpdmVyIGNiKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaE1lZGlhQnV0dG9uKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Iuc2VuZChzZXF1ZW5jZU51bWJlciwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVkaWFCdXR0b25Gcm9tQ29udHJvbGxlcihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBJbnRlbnQgbWVkaWFCdXR0b25JbnRlbnQpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoTWVkaWFCdXR0b24oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdXR0b25JbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXBhcmUoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXBhcmVGcm9tTWVkaWFJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tU2VhcmNoKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFByZXBhcmVGcm9tU2VhcmNoKAorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByZXBhcmVGcm9tVXJpKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUHJlcGFyZUZyb21VcmkoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFBsYXkoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlGcm9tTWVkaWFJZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFBsYXlGcm9tTWVkaWFJZChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheUZyb21TZWFyY2goU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGxheUZyb21TZWFyY2goY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5RnJvbVVyaShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFBsYXlGcm9tVXJpKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNraXBUb1RyYWNrKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoU2tpcFRvSXRlbShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUGF1c2UoY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hTdG9wKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25OZXh0KFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoTmV4dChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJldmlvdXMoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hQcmV2aW91cyhjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFzdEZvcndhcmQoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlcikgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hGYXN0Rm9yd2FyZChjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmV3aW5kKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHBpZCwgaW50IHVpZCwKKyAgICAgICAgICAgICAgICBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoUmV3aW5kKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgbG9uZyBwb3MpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbiBzZXNzaW9uID0gbU1lZGlhU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmRpc3BhdGNoU2Vla1RvKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgcG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJhdGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLCBJU2Vzc2lvbkNvbnRyb2xsZXJDYWxsYmFjayBjYWxsZXIsCisgICAgICAgICAgICAgICAgUmF0aW5nIHJhdGluZykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hSYXRlKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwgcmF0aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgYXJncykgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uIHNlc3Npb24gPSBtTWVkaWFTZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzcGF0Y2hDdXN0b21BY3Rpb24oY3JlYXRlUmVtb3RlVXNlckluZm8ocGFja2FnZU5hbWUsIHBpZCwgdWlkLCBjYWxsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShTdHJpbmcgcGFja2FnZU5hbWUsIGludCBwaWQsIGludCB1aWQsCisgICAgICAgICAgICAgICAgSVNlc3Npb25Db250cm9sbGVyQ2FsbGJhY2sgY2FsbGVyLCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaEFkanVzdFZvbHVtZShjcmVhdGVSZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQsIGNhbGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lVG8oU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgcGlkLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIElTZXNzaW9uQ29udHJvbGxlckNhbGxiYWNrIGNhbGxlciwgaW50IHZhbHVlKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24gc2Vzc2lvbiA9IG1NZWRpYVNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5kaXNwYXRjaFNldFZvbHVtZVRvKGNyZWF0ZVJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgY2FsbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2luZ2xlIGl0ZW0gdGhhdCBpcyBwYXJ0IG9mIHRoZSBwbGF5IHF1ZXVlLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uCisgICAgICogb2YgdGhlIGl0ZW0gYW5kIGl0cyBpZCBpbiB0aGUgcXVldWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBRdWV1ZUl0ZW0gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaWQgaXMgcmVzZXJ2ZWQuIE5vIGl0ZW1zIGNhbiBiZSBleHBsaWNpdGx5IGFzc2lnbmVkIHRoaXMgaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX0lEID0gLTE7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYURlc2NyaXB0aW9uIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1JZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBNZWRpYVNlc3Npb24uUXVldWVJdGVtfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSB7QGxpbmsgTWVkaWFEZXNjcmlwdGlvbn0gZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICogQHBhcmFtIGlkIEFuIGlkZW50aWZpZXIgZm9yIHRoaXMgaXRlbS4gSXQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQorICAgICAgICAgKiAgICAgICAgICAgIHBsYXkgcXVldWUgYW5kIGNhbm5vdCBiZSB7QGxpbmsgI1VOS05PV05fSUR9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFF1ZXVlSXRlbShNZWRpYURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRlc2NyaXB0aW9uIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlkID09IFVOS05PV05fSUQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZCBjYW5ub3QgYmUgUXVldWVJdGVtLlVOS05PV05fSUQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFF1ZXVlSXRlbShQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IE1lZGlhRGVzY3JpcHRpb24uQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIG1JZCA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbURlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcXVldWUgaWQgZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGdldFF1ZXVlSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgbURlc2NyaXB0aW9uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZUxvbmcobUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxNZWRpYVNlc3Npb24uUXVldWVJdGVtPiBDUkVBVE9SID0KKyAgICAgICAgICAgICAgICBuZXcgQ3JlYXRvcjxNZWRpYVNlc3Npb24uUXVldWVJdGVtPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uLlF1ZXVlSXRlbSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24uUXVldWVJdGVtKHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24uUXVldWVJdGVtW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW1bc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1lZGlhU2Vzc2lvbi5RdWV1ZUl0ZW0geyIgKworICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbiArCisgICAgICAgICAgICAgICAgICAgICIsIElkPSIgKyBtSWQgKyAiIH0iOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFF1ZXVlSXRlbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlSXRlbSBpdGVtID0gKFF1ZXVlSXRlbSkgbzsKKyAgICAgICAgICAgIGlmIChtSWQgIT0gaXRlbS5tSWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMobURlc2NyaXB0aW9uLCBpdGVtLm1EZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZCB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY29tbWFuZDsKKyAgICAgICAgcHVibGljIGZpbmFsIEJ1bmRsZSBleHRyYXM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBSZXN1bHRSZWNlaXZlciBzdHViOworCisgICAgICAgIHB1YmxpYyBDb21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgZXh0cmFzLCBSZXN1bHRSZWNlaXZlciBzdHViKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICAgICAgdGhpcy5leHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICB0aGlzLnN0dWIgPSBzdHViOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDYWxsYmFja01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ09NTUFORCA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTUVESUFfQlVUVE9OID0gMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFID0gMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFX01FRElBX0lEID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVQQVJFX1NFQVJDSCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUFJFUEFSRV9VUkkgPSA2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVkgPSA3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVlfTUVESUFfSUQgPSA4OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BMQVlfU0VBUkNIID0gOTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QTEFZX1VSSSA9IDEwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NLSVBfVE9fSVRFTSA9IDExOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BBVVNFID0gMTI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1RPUCA9IDEzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX05FWFQgPSAxNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QUkVWSU9VUyA9IDE1OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZBU1RfRk9SV0FSRCA9IDE2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFV0lORCA9IDE3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFRUtfVE8gPSAxODsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19SQVRFID0gMTk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ1VTVE9NX0FDVElPTiA9IDIwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FESlVTVF9WT0xVTUUgPSAyMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfVk9MVU1FID0gMjI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VUID0gMjM7CisKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIFJlbW90ZVVzZXJJbmZvIG1DdXJyZW50Q29udHJvbGxlckluZm87CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrTWVzc2FnZUhhbmRsZXIoTG9vcGVyIGxvb3BlciwgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICAvL1RPRE86KGIvMTE5NTM5ODQ5KSBVbmNvbW1lbnQgYmVsb3cgbGluZSBhbmQgcmVzb2x2ZSB0aGUgZXJyb3IuCisgICAgICAgICAgICAvL3N1cGVyKGxvb3BlciwgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1DYWxsYmFjay5tSGFuZGxlciA9IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KFJlbW90ZVVzZXJJbmZvIGNhbGxlciwgaW50IHdoYXQsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhLCBsb25nIGRlbGF5TXMpIHsKKyAgICAgICAgICAgIFBhaXI8UmVtb3RlVXNlckluZm8sIE9iamVjdD4gb2JqV2l0aENhbGxlciA9IFBhaXIuY3JlYXRlKGNhbGxlciwgb2JqKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZSh3aGF0LCBvYmpXaXRoQ2FsbGVyKTsKKyAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOworICAgICAgICAgICAgaWYgKGRlbGF5TXMgPiAwKSB7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgZGVsYXlNcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgbUN1cnJlbnRDb250cm9sbGVySW5mbyA9ICgoUGFpcjxSZW1vdGVVc2VySW5mbywgT2JqZWN0PikgbXNnLm9iaikuZmlyc3Q7CisKKyAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyIHZwOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9ICgoUGFpcjxSZW1vdGVVc2VySW5mbywgT2JqZWN0PikgbXNnLm9iaikuc2Vjb25kOworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ09NTUFORDoKKyAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgb2JqOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db21tYW5kKGNtZC5jb21tYW5kLCBjbWQuZXh0cmFzLCBjbWQuc3R1Yik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01FRElBX0JVVFRPTjoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTWVkaWFCdXR0b25FdmVudCgoSW50ZW50KSBvYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUkVQQVJFOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BSRVBBUkVfTUVESUFfSUQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmVGcm9tTWVkaWFJZCgoU3RyaW5nKSBvYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUkVQQVJFX1NFQVJDSDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUHJlcGFyZUZyb21TZWFyY2goKFN0cmluZykgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJFUEFSRV9VUkk6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblByZXBhcmVGcm9tVXJpKChVcmkpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BMQVk6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUExBWV9NRURJQV9JRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheUZyb21NZWRpYUlkKChTdHJpbmcpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BMQVlfU0VBUkNIOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5RnJvbVNlYXJjaCgoU3RyaW5nKSBvYmosIG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QTEFZX1VSSToKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheUZyb21VcmkoKFVyaSkgb2JqLCBtc2cuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0tJUF9UT19JVEVNOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Ta2lwVG9RdWV1ZUl0ZW0oKExvbmcpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BBVVNFOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TVE9QOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX05FWFQ6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNraXBUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJFVklPVVM6CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblNraXBUb1ByZXZpb3VzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZBU1RfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uRmFzdEZvcndhcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVXSU5EOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25SZXdpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VFS19UTzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla1RvKChMb25nKSBvYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19SQVRFOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25TZXRSYXRpbmcoKFJhdGluZykgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ1VTVE9NX0FDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tQWN0aW9uKChTdHJpbmcpIG9iaiwgbXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FESlVTVF9WT0xVTUU6CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwID0gbVZvbHVtZVByb3ZpZGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cC5vbkFkanVzdFZvbHVtZSgoaW50KSBvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9WT0xVTUU6CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwID0gbVZvbHVtZVByb3ZpZGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2cC5vblNldFZvbHVtZVRvKChpbnQpIG9iaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUExBWV9QQVVTRV9LRVlfRE9VQkxFX1RBUF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suaGFuZGxlTWVkaWFQbGF5UGF1c2VLZXlTaW5nbGVUYXBJZlBlbmRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudENvbnRyb2xsZXJJbmZvID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QYXJjZWxhYmxlVm9sdW1lSW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjUwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QYXJjZWxhYmxlVm9sdW1lSW5mby5haWRsCkBAIC0wLDAgKzEsMTggQEAKKy8qIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuc2Vzc2lvbjsKKworcGFyY2VsYWJsZSBQYXJjZWxhYmxlVm9sdW1lSW5mbzsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BhcmNlbGFibGVWb2x1bWVJbmZvLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QYXJjZWxhYmxlVm9sdW1lSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OWM5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QYXJjZWxhYmxlVm9sdW1lSW5mby5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKgorICogQ29udmVuaWVuY2UgY2xhc3MgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gb2YgYQorICogc2Vzc2lvbi4gVGhlIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBpcyB7QGxpbmsgTWVkaWFDb250cm9sbGVyLlBsYXliYWNrSW5mb30uCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFBhcmNlbGFibGVWb2x1bWVJbmZvIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHVibGljIGludCB2b2x1bWVUeXBlOworICAgIHB1YmxpYyBBdWRpb0F0dHJpYnV0ZXMgYXVkaW9BdHRyczsKKyAgICBwdWJsaWMgaW50IGNvbnRyb2xUeXBlOworICAgIHB1YmxpYyBpbnQgbWF4Vm9sdW1lOworICAgIHB1YmxpYyBpbnQgY3VycmVudFZvbHVtZTsKKworICAgIHB1YmxpYyBQYXJjZWxhYmxlVm9sdW1lSW5mbyhpbnQgdm9sdW1lVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF1ZGlvQXR0cnMsIGludCBjb250cm9sVHlwZSwKKyAgICAgICAgICAgIGludCBtYXhWb2x1bWUsCisgICAgICAgICAgICBpbnQgY3VycmVudFZvbHVtZSkgeworICAgICAgICB0aGlzLnZvbHVtZVR5cGUgPSB2b2x1bWVUeXBlOworICAgICAgICB0aGlzLmF1ZGlvQXR0cnMgPSBhdWRpb0F0dHJzOworICAgICAgICB0aGlzLmNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7CisgICAgICAgIHRoaXMubWF4Vm9sdW1lID0gbWF4Vm9sdW1lOworICAgICAgICB0aGlzLmN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIHB1YmxpYyBQYXJjZWxhYmxlVm9sdW1lSW5mbyhQYXJjZWwgZnJvbSkgeworICAgICAgICB2b2x1bWVUeXBlID0gZnJvbS5yZWFkSW50KCk7CisgICAgICAgIGNvbnRyb2xUeXBlID0gZnJvbS5yZWFkSW50KCk7CisgICAgICAgIG1heFZvbHVtZSA9IGZyb20ucmVhZEludCgpOworICAgICAgICBjdXJyZW50Vm9sdW1lID0gZnJvbS5yZWFkSW50KCk7CisgICAgICAgIGF1ZGlvQXR0cnMgPSBBdWRpb0F0dHJpYnV0ZXMuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGZyb20pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQodm9sdW1lVHlwZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoY29udHJvbFR5cGUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1heFZvbHVtZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoY3VycmVudFZvbHVtZSk7CisgICAgICAgIGF1ZGlvQXR0cnMud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxQYXJjZWxhYmxlVm9sdW1lSW5mbz4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFBhcmNlbGFibGVWb2x1bWVJbmZvPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQYXJjZWxhYmxlVm9sdW1lSW5mbyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJjZWxhYmxlVm9sdW1lSW5mbyhpbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhcmNlbGFibGVWb2x1bWVJbmZvW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyY2VsYWJsZVZvbHVtZUluZm9bc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGxheWJhY2tTdGF0ZS5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL21lZGlhL3Nlc3Npb24vUGxheWJhY2tTdGF0ZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NzZlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmFpZGwKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS5zZXNzaW9uOworCitwYXJjZWxhYmxlIFBsYXliYWNrU3RhdGU7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvbWVkaWEvc2Vzc2lvbi9QbGF5YmFja1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0ZjlhZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9tZWRpYS9zZXNzaW9uL1BsYXliYWNrU3RhdGUuamF2YQpAQCAtMCwwICsxLDEwODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnNlc3Npb247CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uRHJhd2FibGVSZXM7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTG9uZ0RlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogUGxheWJhY2sgc3RhdGUgZm9yIGEge0BsaW5rIE1lZGlhU2Vzc2lvbn0uIFRoaXMgaW5jbHVkZXMgYSBzdGF0ZSBsaWtlCisgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QTEFZSU5HfSwgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24sCisgKiBhbmQgdGhlIGN1cnJlbnQgY29udHJvbCBjYXBhYmlsaXRpZXMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQbGF5YmFja1N0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQbGF5YmFja1N0YXRlIjsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQExvbmdEZWYoZmxhZz10cnVlLCB2YWx1ZT17QUNUSU9OX1NUT1AsIEFDVElPTl9QQVVTRSwgQUNUSU9OX1BMQVksIEFDVElPTl9SRVdJTkQsCisgICAgICAgICAgICBBQ1RJT05fU0tJUF9UT19QUkVWSU9VUywgQUNUSU9OX1NLSVBfVE9fTkVYVCwgQUNUSU9OX0ZBU1RfRk9SV0FSRCwgQUNUSU9OX1NFVF9SQVRJTkcsCisgICAgICAgICAgICBBQ1RJT05fU0VFS19UTywgQUNUSU9OX1BMQVlfUEFVU0UsIEFDVElPTl9QTEFZX0ZST01fTUVESUFfSUQsIEFDVElPTl9QTEFZX0ZST01fU0VBUkNILAorICAgICAgICAgICAgQUNUSU9OX1NLSVBfVE9fUVVFVUVfSVRFTSwgQUNUSU9OX1BMQVlfRlJPTV9VUkksIEFDVElPTl9QUkVQQVJFLAorICAgICAgICAgICAgQUNUSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCwgQUNUSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gsIEFDVElPTl9QUkVQQVJFX0ZST01fVVJJfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgcHVibGljIEBpbnRlcmZhY2UgQWN0aW9ucyB7fQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgc3RvcCBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1NUT1AgPSAxIDw8IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwYXVzZSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BBVVNFID0gMSA8PCAxOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcGxheSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BMQVkgPSAxIDw8IDI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSByZXdpbmQgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9SRVdJTkQgPSAxIDw8IDM7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwcmV2aW91cyBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1NLSVBfVE9fUFJFVklPVVMgPSAxIDw8IDQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBuZXh0IGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU0tJUF9UT19ORVhUID0gMSA8PCA1OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgZmFzdCBmb3J3YXJkIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fRkFTVF9GT1JXQVJEID0gMSA8PCA2OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgc2V0IHJhdGluZyBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1NFVF9SQVRJTkcgPSAxIDw8IDc7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBzZWVrIHRvIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fU0VFS19UTyA9IDEgPDwgODsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHBsYXkvcGF1c2UgdG9nZ2xlIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWV9QQVVTRSA9IDEgPDwgOTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHBsYXkgZnJvbSBtZWRpYSBpZCBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BMQVlfRlJPTV9NRURJQV9JRCA9IDEgPDwgMTA7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBwbGF5IGZyb20gc2VhcmNoIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUExBWV9GUk9NX1NFQVJDSCA9IDEgPDwgMTE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhpcyBzZXNzaW9uIHN1cHBvcnRzIHRoZSBza2lwIHRvIHF1ZXVlIGl0ZW0gY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9TS0lQX1RPX1FVRVVFX0lURU0gPSAxIDw8IDEyOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcGxheSBmcm9tIFVSSSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BMQVlfRlJPTV9VUkkgPSAxIDw8IDEzOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcHJlcGFyZSBjb21tYW5kLgorICAgICAqCisgICAgICogQHNlZSBCdWlsZGVyI3NldEFjdGlvbnMobG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQUNUSU9OX1BSRVBBUkUgPSAxIDw8IDE0OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoaXMgc2Vzc2lvbiBzdXBwb3J0cyB0aGUgcHJlcGFyZSBmcm9tIG1lZGlhIGlkIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0QWN0aW9ucyhsb25nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBBQ1RJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEID0gMSA8PCAxNTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHByZXBhcmUgZnJvbSBzZWFyY2ggY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QUkVQQVJFX0ZST01fU0VBUkNIID0gMSA8PCAxNjsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGlzIHNlc3Npb24gc3VwcG9ydHMgdGhlIHByZXBhcmUgZnJvbSBVUkkgY29tbWFuZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRBY3Rpb25zKGxvbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEFDVElPTl9QUkVQQVJFX0ZST01fVVJJID0gMSA8PCAxNzsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQEludERlZih7U1RBVEVfTk9ORSwgU1RBVEVfU1RPUFBFRCwgU1RBVEVfUEFVU0VELCBTVEFURV9QTEFZSU5HLCBTVEFURV9GQVNUX0ZPUldBUkRJTkcsCisgICAgICAgICAgICBTVEFURV9SRVdJTkRJTkcsIFNUQVRFX0JVRkZFUklORywgU1RBVEVfRVJST1IsIFNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICBTVEFURV9TS0lQUElOR19UT19QUkVWSU9VUywgU1RBVEVfU0tJUFBJTkdfVE9fTkVYVCwgU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTX0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0YXRlIHt9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHBsYXliYWNrIHN0YXRlIGFuZCBpbmRpY2F0ZXMgdGhhdCBubyBtZWRpYSBoYXMgYmVlbgorICAgICAqIGFkZGVkIHlldCwgb3IgdGhlIHBlcmZvcm1lciBoYXMgYmVlbiByZXNldCBhbmQgaGFzIG5vIGNvbnRlbnQgdG8gcGxheS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZShpbnQsIGxvbmcsIGZsb2F0KQorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZShpbnQsIGxvbmcsIGZsb2F0LCBsb25nKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHN0b3BwZWQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9TVE9QUEVEID0gMTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSBwYXVzZWQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9QQVVTRUQgPSAyOworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHBsYXlpbmcuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9QTEFZSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhpcyBpdGVtIGlzIGN1cnJlbnRseSBmYXN0IGZvcndhcmRpbmcuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9GQVNUX0ZPUldBUkRJTkcgPSA0OworCisgICAgLyoqCisgICAgICogU3RhdGUgaW5kaWNhdGluZyB0aGlzIGl0ZW0gaXMgY3VycmVudGx5IHJld2luZGluZy4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1JFV0lORElORyA9IDU7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgYnVmZmVyaW5nIGFuZCB3aWxsIGJlZ2luIHBsYXlpbmcKKyAgICAgKiB3aGVuIGVub3VnaCBkYXRhIGhhcyBidWZmZXJlZC4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0JVRkZFUklORyA9IDY7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgaW4gYW4gZXJyb3Igc3RhdGUuIFRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2Ugc2hvdWxkIGFsc28gYmUgc2V0IHdoZW4gZW50ZXJpbmcgdGhpcyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0VSUk9SID0gNzsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhlIGNsYXNzIGRvaW5nIHBsYXliYWNrIGlzIGN1cnJlbnRseSBjb25uZWN0aW5nIHRvIGEKKyAgICAgKiBuZXcgZGVzdGluYXRpb24uICBEZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIHlvdSBtYXkgcmV0dXJuIHRvIHRoZSBwcmV2aW91cworICAgICAqIHN0YXRlIHdoZW4gdGhlIGNvbm5lY3Rpb24gZmluaXNoZXMgb3IgZW50ZXIge0BsaW5rICNTVEFURV9OT05FfS4KKyAgICAgKiBJZiB0aGUgY29ubmVjdGlvbiBmYWlsZWQge0BsaW5rICNTVEFURV9FUlJPUn0gc2hvdWxkIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9DT05ORUNUSU5HID0gODsKKworICAgIC8qKgorICAgICAqIFN0YXRlIGluZGljYXRpbmcgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgc2tpcHBpbmcgdG8gdGhlIHByZXZpb3VzIGl0ZW0uCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9TS0lQUElOR19UT19QUkVWSU9VUyA9IDk7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHNraXBwaW5nIHRvIHRoZSBuZXh0IGl0ZW0uCisgICAgICoKKyAgICAgKiBAc2VlIEJ1aWxkZXIjc2V0U3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFURV9TS0lQUElOR19UT19ORVhUID0gMTA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmRpY2F0aW5nIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHNraXBwaW5nIHRvIGEgc3BlY2lmaWMgaXRlbSBpbgorICAgICAqIHRoZSBxdWV1ZS4KKyAgICAgKgorICAgICAqIEBzZWUgQnVpbGRlciNzZXRTdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX1NLSVBQSU5HX1RPX1FVRVVFX0lURU0gPSAxMTsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHZhbHVlIGZvciB0aGUgcG9zaXRpb24gdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIGlzIG5vdCBrbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgUExBWUJBQ0tfUE9TSVRJT05fVU5LTk9XTiA9IC0xOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0YXRlOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtUG9zaXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1CdWZmZXJlZFBvc2l0aW9uOworICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbVNwZWVkOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtQWN0aW9uczsKKyAgICBwcml2YXRlIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25zOworICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIG1FcnJvck1lc3NhZ2U7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1VcGRhdGVUaW1lOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtQWN0aXZlSXRlbUlkOworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisKKyAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUoaW50IHN0YXRlLCBsb25nIHBvc2l0aW9uLCBsb25nIHVwZGF0ZVRpbWUsIGZsb2F0IHNwZWVkLAorICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uLCBsb25nIHRyYW5zcG9ydENvbnRyb2xzLAorICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gY3VzdG9tQWN0aW9ucywgbG9uZyBhY3RpdmVJdGVtSWQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgZXJyb3IsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbVN0YXRlID0gc3RhdGU7CisgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICBtU3BlZWQgPSBzcGVlZDsKKyAgICAgICAgbVVwZGF0ZVRpbWUgPSB1cGRhdGVUaW1lOworICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbiA9IGJ1ZmZlcmVkUG9zaXRpb247CisgICAgICAgIG1BY3Rpb25zID0gdHJhbnNwb3J0Q29udHJvbHM7CisgICAgICAgIG1DdXN0b21BY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KGN1c3RvbUFjdGlvbnMpOworICAgICAgICBtQWN0aXZlSXRlbUlkID0gYWN0aXZlSXRlbUlkOworICAgICAgICBtRXJyb3JNZXNzYWdlID0gZXJyb3I7CisgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtU3RhdGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1Qb3NpdGlvbiA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIG1TcGVlZCA9IGluLnJlYWRGbG9hdCgpOworICAgICAgICBtVXBkYXRlVGltZSA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgbUFjdGlvbnMgPSBpbi5yZWFkTG9uZygpOworICAgICAgICBtQ3VzdG9tQWN0aW9ucyA9IGluLmNyZWF0ZVR5cGVkQXJyYXlMaXN0KEN1c3RvbUFjdGlvbi5DUkVBVE9SKTsKKyAgICAgICAgbUFjdGl2ZUl0ZW1JZCA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIG1FcnJvck1lc3NhZ2UgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICBtRXh0cmFzID0gaW4ucmVhZEJ1bmRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm9iID0gbmV3IFN0cmluZ0J1aWxkZXIoIlBsYXliYWNrU3RhdGUgeyIpOworICAgICAgICBib2IuYXBwZW5kKCJzdGF0ZT0iKS5hcHBlbmQobVN0YXRlKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBwb3NpdGlvbj0iKS5hcHBlbmQobVBvc2l0aW9uKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBidWZmZXJlZCBwb3NpdGlvbj0iKS5hcHBlbmQobUJ1ZmZlcmVkUG9zaXRpb24pOworICAgICAgICBib2IuYXBwZW5kKCIsIHNwZWVkPSIpLmFwcGVuZChtU3BlZWQpOworICAgICAgICBib2IuYXBwZW5kKCIsIHVwZGF0ZWQ9IikuYXBwZW5kKG1VcGRhdGVUaW1lKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBhY3Rpb25zPSIpLmFwcGVuZChtQWN0aW9ucyk7CisgICAgICAgIGJvYi5hcHBlbmQoIiwgY3VzdG9tIGFjdGlvbnM9IikuYXBwZW5kKG1DdXN0b21BY3Rpb25zKTsKKyAgICAgICAgYm9iLmFwcGVuZCgiLCBhY3RpdmUgaXRlbSBpZD0iKS5hcHBlbmQobUFjdGl2ZUl0ZW1JZCk7CisgICAgICAgIGJvYi5hcHBlbmQoIiwgZXJyb3I9IikuYXBwZW5kKG1FcnJvck1lc3NhZ2UpOworICAgICAgICBib2IuYXBwZW5kKCJ9Iik7CisgICAgICAgIHJldHVybiBib2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50KG1TdGF0ZSk7CisgICAgICAgIGRlc3Qud3JpdGVMb25nKG1Qb3NpdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtU3BlZWQpOworICAgICAgICBkZXN0LndyaXRlTG9uZyhtVXBkYXRlVGltZSk7CisgICAgICAgIGRlc3Qud3JpdGVMb25nKG1CdWZmZXJlZFBvc2l0aW9uKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobUFjdGlvbnMpOworICAgICAgICBkZXN0LndyaXRlVHlwZWRMaXN0KG1DdXN0b21BY3Rpb25zKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobUFjdGl2ZUl0ZW1JZCk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1FcnJvck1lc3NhZ2UsIGRlc3QsIDApOworICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1FeHRyYXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjay4gT25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICogPHVsPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfTk9ORX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU1RPUFBFRH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUExBWUlOR308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUEFVU0VEfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9GQVNUX0ZPUldBUkRJTkd9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1JFV0lORElOR308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfQlVGRkVSSU5HfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9FUlJPUn08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfQ09OTkVDVElOR308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fUFJFVklPVVN9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX05FWFR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX1FVRVVFX0lURU19PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIEBTdGF0ZQorICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtU3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGluIG1zLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBidWZmZXJlZCBwb3NpdGlvbiBpbiBtcy4gVGhpcyBpcyB0aGUgZmFydGhlc3QgcGxheWJhY2sKKyAgICAgKiBwb2ludCB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXNpbmcgb25seSBidWZmZXJlZAorICAgICAqIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJlZFBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBwbGF5YmFjayBzcGVlZCBhcyBhIG11bHRpcGxlIG9mIG5vcm1hbCBwbGF5YmFjay4gVGhpcworICAgICAqIHNob3VsZCBiZSBuZWdhdGl2ZSB3aGVuIHJld2luZGluZy4gQSB2YWx1ZSBvZiAxIG1lYW5zIG5vcm1hbCBwbGF5YmFjayBhbmQKKyAgICAgKiAwIG1lYW5zIHBhdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc3BlZWQgb2YgcGxheWJhY2suCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFBsYXliYWNrU3BlZWQoKSB7CisgICAgICAgIHJldHVybiBtU3BlZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IGFjdGlvbnMgYXZhaWxhYmxlIG9uIHRoaXMgc2Vzc2lvbi4gVGhpcyBzaG91bGQgdXNlIGEKKyAgICAgKiBiaXRtYXNrIG9mIHRoZSBhdmFpbGFibGUgYWN0aW9ucy4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU0tJUF9UT19QUkVWSU9VU308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1JFV0lORH08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVl9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QQVVTRX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1NUT1B9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9GQVNUX0ZPUldBUkR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX05FWFR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TRUVLX1RPfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU0VUX1JBVElOR308L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfUEFVU0V9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZX0ZST01fTUVESUFfSUR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QTEFZX0ZST01fU0VBUkNIfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU0tJUF9UT19RVUVVRV9JVEVNfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9GUk9NX1VSSX08L2xpPgorICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BSRVBBUkV9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fTUVESUFfSUR9PC9saT4KKyAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fU0VBUkNIfTwvbGk+CisgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUFJFUEFSRV9GUk9NX1VSSX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQEFjdGlvbnMKKyAgICBwdWJsaWMgbG9uZyBnZXRBY3Rpb25zKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGN1c3RvbSBhY3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBnZXRDdXN0b21BY3Rpb25zKCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbUFjdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgdXNlciByZWFkYWJsZSBlcnJvciBtZXNzYWdlLiBUaGlzIHNob3VsZCBiZSBzZXQgd2hlbiB0aGUgc3RhdGUgaXMKKyAgICAgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9FUlJPUn0uCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRFcnJvck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtRXJyb3JNZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZWxhcHNlZCByZWFsIHRpbWUgYXQgd2hpY2ggcG9zaXRpb24gd2FzIGxhc3QgdXBkYXRlZC4gSWYgdGhlCisgICAgICogcG9zaXRpb24gaGFzIG5ldmVyIGJlZW4gc2V0IHRoaXMgd2lsbCByZXR1cm4gMDsKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxhc3QgdGltZSB0aGUgcG9zaXRpb24gd2FzIHVwZGF0ZWQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdFBvc2l0aW9uVXBkYXRlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1VcGRhdGVUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaXRlbSBpbiB0aGUgcXVldWUuIElmIHRoZXJlIGlzIG5vCisgICAgICogcXVldWUgb3IgYSBxdWV1ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXNzaW9uIHRoaXMgd2lsbCBiZQorICAgICAqIHtAbGluayBNZWRpYVNlc3Npb24uUXVldWVJdGVtI1VOS05PV05fSUR9LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgaWQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaXRlbSBpbiB0aGUgcXVldWUgb3IKKyAgICAgKiAgICAgICAgIHtAbGluayBNZWRpYVNlc3Npb24uUXVldWVJdGVtI1VOS05PV05fSUR9LgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEFjdGl2ZVF1ZXVlSXRlbUlkKCkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZUl0ZW1JZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW55IGN1c3RvbSBleHRyYXMgdGhhdCB3ZXJlIHNldCBvbiB0aGlzIHBsYXliYWNrIHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZXh0cmFzIGZvciB0aGlzIHN0YXRlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzKCkgeworICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAbGluayBQbGF5YmFja1N0YXRlfSBzdGF0ZSBmb3IgdGhlIGdpdmVuCisgICAgICoge0BsaW5rIFJlbW90ZUNvbnRyb2xDbGllbnR9IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHJjY1N0YXRlIFRoZSBzdGF0ZSB1c2VkIGJ5IHtAbGluayBSZW1vdGVDb250cm9sQ2xpZW50fS4KKyAgICAgKiBAcmV0dXJuIFRoZSBlcXVpdmFsZW50IHN0YXRlIHVzZWQgYnkge0BsaW5rIFBsYXliYWNrU3RhdGV9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3RhdGVGcm9tUmNjU3RhdGUoaW50IHJjY1N0YXRlKSB7CisgICAgICAgIHN3aXRjaCAocmNjU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfQlVGRkVSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9CVUZGRVJJTkc7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9FUlJPUjsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfRkFTVF9GT1JXQVJESU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9GQVNUX0ZPUldBUkRJTkc7CisgICAgICAgICAgICAvL1JlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX05PTkUgaXMgaGlkZGVuCisgICAgICAgICAgICBjYXNlIDA6ICAvL1JlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX05PTkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX05PTkU7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9QTEFZSU5HOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9SRVdJTkRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1JFV0lORElORzsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU0tJUFBJTkdfQkFDS1dBUkRTOgorICAgICAgICAgICAgICAgIHJldHVybiBTVEFURV9TS0lQUElOR19UT19QUkVWSU9VUzsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU0tJUFBJTkdfRk9SV0FSRFM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1NLSVBQSU5HX1RPX05FWFQ7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIFJlbW90ZUNvbnRyb2xDbGllbnR9IHN0YXRlIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiB7QGxpbmsgUGxheWJhY2tTdGF0ZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHVzZWQgYnkge0BsaW5rIFBsYXliYWNrU3RhdGV9LgorICAgICAqIEByZXR1cm4gVGhlIGVxdWl2YWxlbnQgc3RhdGUgdXNlZCBieSB7QGxpbmsgUmVtb3RlQ29udHJvbENsaWVudH0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSY2NTdGF0ZUZyb21TdGF0ZShpbnQgc3RhdGUpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURV9CVUZGRVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX0JVRkZFUklORzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX0VSUk9SOworICAgICAgICAgICAgY2FzZSBTVEFURV9GQVNUX0ZPUldBUkRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX0ZBU1RfRk9SV0FSRElORzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfTk9ORToKKyAgICAgICAgICAgICAgICAvL1JlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX05PTkUgaXMgaGlkZGVuCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvL1JlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX05PTkU7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LlBMQVlTVEFURV9QTEFZSU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9SRVdJTkRJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1JFV0lORElORzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU0tJUFBJTkdfVE9fUFJFVklPVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1NLSVBQSU5HX0JBQ0tXQVJEUzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU0tJUFBJTkdfVE9fTkVYVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5QTEFZU1RBVEVfU0tJUFBJTkdfRk9SV0FSRFM7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuUExBWVNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldEFjdGlvbnNGcm9tUmNjQ29udHJvbEZsYWdzKGludCByY2NGbGFncykgeworICAgICAgICBsb25nIGFjdGlvbnMgPSAwOworICAgICAgICBsb25nIGZsYWcgPSAxOworICAgICAgICB3aGlsZSAoZmxhZyA8PSByY2NGbGFncykgeworICAgICAgICAgICAgaWYgKChmbGFnICYgcmNjRmxhZ3MpICE9IDApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb25zIHw9IGdldEFjdGlvbkZvclJjY0ZsYWcoKGludCkgZmxhZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbGFnID0gZmxhZyA8PCAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhY3Rpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UmNjQ29udHJvbEZsYWdzRnJvbUFjdGlvbnMobG9uZyBhY3Rpb25zKSB7CisgICAgICAgIGludCByY2NGbGFncyA9IDA7CisgICAgICAgIGxvbmcgYWN0aW9uID0gMTsKKyAgICAgICAgd2hpbGUgKGFjdGlvbiA8PSBhY3Rpb25zICYmIGFjdGlvbiA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAoKGFjdGlvbiAmIGFjdGlvbnMpICE9IDApIHsKKyAgICAgICAgICAgICAgICByY2NGbGFncyB8PSBnZXRSY2NGbGFnRm9yQWN0aW9uKGFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY3Rpb24gPSBhY3Rpb24gPDwgMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmNjRmxhZ3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRBY3Rpb25Gb3JSY2NGbGFnKGludCBmbGFnKSB7CisgICAgICAgIHN3aXRjaCAoZmxhZykgeworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BSRVZJT1VTOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fU0tJUF9UT19QUkVWSU9VUzsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9SRVdJTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9SRVdJTkQ7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUExBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1BMQVk7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUExBWV9QQVVTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1BMQVlfUEFVU0U7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUEFVU0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9QQVVTRTsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9TVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBBQ1RJT05fU1RPUDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9GQVNUX0ZPUldBUkQ7CisgICAgICAgICAgICBjYXNlIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfTkVYVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1NLSVBfVE9fTkVYVDsKKyAgICAgICAgICAgIGNhc2UgUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QT1NJVElPTl9VUERBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9TRUVLX1RPOworICAgICAgICAgICAgY2FzZSBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1JBVElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1NFVF9SQVRJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFJjY0ZsYWdGb3JBY3Rpb24obG9uZyBhY3Rpb24pIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IHRoZSBsb3dlciBzZXQgb2YgYWN0aW9ucyB0aGF0IGNhbiBtYXAgdG8gcmNjCisgICAgICAgIC8vIGZsYWdzLgorICAgICAgICBpbnQgdGVzdEFjdGlvbiA9IGFjdGlvbiA8IEludGVnZXIuTUFYX1ZBTFVFID8gKGludCkgYWN0aW9uIDogMDsKKyAgICAgICAgc3dpdGNoICh0ZXN0QWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9TS0lQX1RPX1BSRVZJT1VTOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BSRVZJT1VTOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fUkVXSU5EOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1JFV0lORDsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1BMQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUExBWTsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1BMQVlfUEFVU0U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlbW90ZUNvbnRyb2xDbGllbnQuRkxBR19LRVlfTUVESUFfUExBWV9QQVVTRTsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1BBVVNFOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1BBVVNFOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fU1RPUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9TVE9QOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fRkFTVF9GT1JXQVJEOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX0ZBU1RfRk9SV0FSRDsKKyAgICAgICAgICAgIGNhc2UgKGludCkgQUNUSU9OX1NLSVBfVE9fTkVYVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9ORVhUOworICAgICAgICAgICAgY2FzZSAoaW50KSBBQ1RJT05fU0VFS19UTzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3RlQ29udHJvbENsaWVudC5GTEFHX0tFWV9NRURJQV9QT1NJVElPTl9VUERBVEU7CisgICAgICAgICAgICBjYXNlIChpbnQpIEFDVElPTl9TRVRfUkFUSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBSZW1vdGVDb250cm9sQ2xpZW50LkZMQUdfS0VZX01FRElBX1JBVElORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxQbGF5YmFja1N0YXRlPiBDUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UGxheWJhY2tTdGF0ZT4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGxheWJhY2tTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja1N0YXRlKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGxheWJhY2tTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICoge0BsaW5rIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIEN1c3RvbUFjdGlvbnN9IGNhbiBiZSB1c2VkIHRvIGV4dGVuZCB0aGUgY2FwYWJpbGl0aWVzIG9mCisgICAgICogdGhlIHN0YW5kYXJkIHRyYW5zcG9ydCBjb250cm9scyBieSBleHBvc2luZyBhcHAgc3BlY2lmaWMgYWN0aW9ucyB0bworICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xsZXIgTWVkaWFDb250cm9sbGVyc30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDdXN0b21BY3Rpb24gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgbU5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1JY29uOworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2Uge0BsaW5rIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uLkJ1aWxkZXIjYnVpbGQoKX0uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBDaGFyU2VxdWVuY2UgbmFtZSwgaW50IGljb24sIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1BY3Rpb24gPSBhY3Rpb247CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXN0b21BY3Rpb24oUGFyY2VsIGluKSB7CisgICAgICAgICAgICBtQWN0aW9uID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgbU5hbWUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgbUljb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBtRXh0cmFzID0gaW4ucmVhZEJ1bmRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtQWN0aW9uKTsKKyAgICAgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1OYW1lLCBkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1JY29uKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUV4dHJhcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gQ1JFQVRPUgorICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uKHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbltzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgYWN0aW9uIG9mIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgYWN0aW9uIG9mIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgYWN0aW9uLiBlLmcuICJGYXZvcml0ZSIKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoaXMge0BsaW5rIEN1c3RvbUFjdGlvbn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgaWQgb2YgdGhlIGljb24gaW4gdGhlIHtAbGluayBNZWRpYVNlc3Npb24gTWVkaWFTZXNzaW9uJ3N9IHBhY2thZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHJlc291cmNlIGlkIG9mIHRoZSBpY29uIGluIHRoZSB7QGxpbmsgTWVkaWFTZXNzaW9uIE1lZGlhU2Vzc2lvbidzfSBwYWNrYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJY29uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JY29uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgZXh0cmFzIHdoaWNoIHByb3ZpZGUgYWRkaXRpb25hbCBhcHBsaWNhdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgICogYWN0aW9uLCBvciBudWxsIGlmIG5vbmUuIFRoZXNlIGFyZ3VtZW50cyBhcmUgbWVhbnQgdG8gYmUgY29uc3VtZWQgYnkgYQorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sbGVyfSBpZiBpdCBrbm93cyBob3cgdG8gaGFuZGxlIHRoZW0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT3B0aW9uYWwgYXJndW1lbnRzIGZvciB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkFjdGlvbjoiICsKKyAgICAgICAgICAgICAgICAgICAgIm1OYW1lPSciICsgbU5hbWUgKworICAgICAgICAgICAgICAgICAgICAiLCBtSWNvbj0iICsgbUljb24gKworICAgICAgICAgICAgICAgICAgICAiLCBtRXh0cmFzPSIgKyBtRXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBDdXN0b21BY3Rpb259IG9iamVjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUFjdGlvbjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIG1OYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUljb247CisgICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ3VzdG9tQWN0aW9ufSBidWlsZGVyIHdpdGggdGhlIGlkLCBuYW1lLCBhbmQgaWNvbiBzZXQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIG9mIHRoZSB7QGxpbmsgQ3VzdG9tQWN0aW9ufS4KKyAgICAgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LiBUaGlzIG5hbWUgd2lsbCBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAqICAgICAgICAgICAgIGFsb25nIHNpZGUgdGhlIGFjdGlvbiBpZiB0aGUgVUkgc3VwcG9ydHMgaXQuCisgICAgICAgICAgICAgKiBAcGFyYW0gaWNvbiBUaGUgaWNvbiByZXNvdXJjZSBpZCBvZiB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0uIFRoaXMgcmVzb3VyY2UgaWQKKyAgICAgICAgICAgICAqICAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0uIEl0IHdpbGwgYmUKKyAgICAgICAgICAgICAqICAgICAgICAgICAgIGRpc3BsYXllZCB3aXRoIHRoZSBjdXN0b20gYWN0aW9uIGlmIHRoZSBVSSBzdXBwb3J0cyBpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGFjdGlvbiwgQ2hhclNlcXVlbmNlIG5hbWUsIEBEcmF3YWJsZVJlcyBpbnQgaWNvbikgeworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgYW4gYWN0aW9uIHRvIGJ1aWxkIGEgQ3VzdG9tQWN0aW9uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIG5hbWUgdG8gYnVpbGQgYSBDdXN0b21BY3Rpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpY29uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhbiBpY29uIHJlc291cmNlIGlkIHRvIGJ1aWxkIGEgQ3VzdG9tQWN0aW9uLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWN0aW9uID0gYWN0aW9uOworICAgICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICBtSWNvbiA9IGljb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2V0IG9wdGlvbmFsIGV4dHJhcyBmb3IgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LiBUaGVzZSBleHRyYXMgYXJlIG1lYW50IHRvIGJlCisgICAgICAgICAgICAgKiBjb25zdW1lZCBieSBhIHtAbGluayBNZWRpYUNvbnRyb2xsZXJ9IGlmIGl0IGtub3dzIGhvdyB0byBoYW5kbGUgdGhlbS4KKyAgICAgICAgICAgICAqIEtleXMgc2hvdWxkIGJlIGZ1bGx5IHF1YWxpZmllZCAoZS5nLiAiY29tLmV4YW1wbGUuTVlfQVJHIikgdG8gYXZvaWQgY29sbGlzaW9ucy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gZXh0cmFzIE9wdGlvbmFsIGV4dHJhcyBmb3IgdGhlIHtAbGluayBDdXN0b21BY3Rpb259LgorICAgICAgICAgICAgICogQHJldHVybiB0aGlzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQnVpbGQgYW5kIHJldHVybiB0aGUge0BsaW5rIEN1c3RvbUFjdGlvbn0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBDdXN0b21BY3Rpb259IGluc3RhbmNlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgQ3VzdG9tQWN0aW9uIGJ1aWxkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tQWN0aW9uKG1BY3Rpb24sIG1OYW1lLCBtSWNvbiwgbUV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgUGxheWJhY2tTdGF0ZX0gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOworICAgICAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uOworICAgICAgICBwcml2YXRlIGxvbmcgbUJ1ZmZlcmVkUG9zaXRpb247CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVNwZWVkOworICAgICAgICBwcml2YXRlIGxvbmcgbUFjdGlvbnM7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1FcnJvck1lc3NhZ2U7CisgICAgICAgIHByaXZhdGUgbG9uZyBtVXBkYXRlVGltZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1BY3RpdmVJdGVtSWQgPSBNZWRpYVNlc3Npb24uUXVldWVJdGVtLlVOS05PV05fSUQ7CisgICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gaW5pdGlhbGx5IGVtcHR5IHN0YXRlIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIHRoZSBzYW1lIGluaXRpYWwgdmFsdWVzIGFzIHRob3NlIGluIHRoZSBmcm9tCisgICAgICAgICAqIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnJvbSBUaGUgc3RhdGUgdG8gdXNlIGZvciBpbml0aWFsaXppbmcgdGhlIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihQbGF5YmFja1N0YXRlIGZyb20pIHsKKyAgICAgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdGUgPSBmcm9tLm1TdGF0ZTsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiA9IGZyb20ubVBvc2l0aW9uOworICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb24gPSBmcm9tLm1CdWZmZXJlZFBvc2l0aW9uOworICAgICAgICAgICAgbVNwZWVkID0gZnJvbS5tU3BlZWQ7CisgICAgICAgICAgICBtQWN0aW9ucyA9IGZyb20ubUFjdGlvbnM7CisgICAgICAgICAgICBpZiAoZnJvbS5tQ3VzdG9tQWN0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1c3RvbUFjdGlvbnMuYWRkQWxsKGZyb20ubUN1c3RvbUFjdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUVycm9yTWVzc2FnZSA9IGZyb20ubUVycm9yTWVzc2FnZTsKKyAgICAgICAgICAgIG1VcGRhdGVUaW1lID0gZnJvbS5tVXBkYXRlVGltZTsKKyAgICAgICAgICAgIG1BY3RpdmVJdGVtSWQgPSBmcm9tLm1BY3RpdmVJdGVtSWQ7CisgICAgICAgICAgICBtRXh0cmFzID0gZnJvbS5tRXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjay4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwb3NpdGlvbiBtdXN0IGJlIGluIG1zIGFuZCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgcGxheWJhY2sKKyAgICAgICAgICogcG9zaXRpb24gd2l0aGluIHRoZSBpdGVtLiBJZiB0aGUgcG9zaXRpb24gaXMgdW5rbm93biB1c2UKKyAgICAgICAgICoge0BsaW5rICNQTEFZQkFDS19QT1NJVElPTl9VTktOT1dOfS4gV2hlbiBub3QgdXNpbmcgYW4gdW5rbm93bgorICAgICAgICAgKiBwb3NpdGlvbiB0aGUgdGltZSBhdCB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHVwZGF0ZWQgbXVzdCBiZSBwcm92aWRlZC4KKyAgICAgICAgICogSXQgaXMgb2theSB0byB1c2Uge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZSgpfSBpZiB0aGUKKyAgICAgICAgICogY3VycmVudCBwb3NpdGlvbiB3YXMganVzdCByZXRyaWV2ZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgc3BlZWQgaXMgYSBtdWx0aXBsZSBvZiBub3JtYWwgcGxheWJhY2sgYW5kIHNob3VsZCBiZSAwIHdoZW4KKyAgICAgICAgICogcGF1c2VkIGFuZCBuZWdhdGl2ZSB3aGVuIHJld2luZGluZy4gTm9ybWFsIHBsYXliYWNrIHNwZWVkIGlzIDEuMC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBzdGF0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfTk9ORX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NUT1BQRUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QTEFZSU5HfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUEFVU0VEfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfRkFTVF9GT1JXQVJESU5HfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfUkVXSU5ESU5HfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfQlVGRkVSSU5HfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfRVJST1J9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9DT05ORUNUSU5HfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fUFJFVklPVVN9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19ORVhUfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU0tJUFBJTkdfVE9fUVVFVUVfSVRFTX08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUgb2YgcGxheWJhY2suCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgaXRlbSBpbiBtcy4KKyAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3BlZWQgVGhlIGN1cnJlbnQgc3BlZWQgb2YgcGxheWJhY2sgYXMgYSBtdWx0aXBsZSBvZgorICAgICAgICAgKiAgICAgICAgICAgIG5vcm1hbCBwbGF5YmFjay4KKyAgICAgICAgICogQHBhcmFtIHVwZGF0ZVRpbWUgVGhlIHRpbWUgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9CisgICAgICAgICAqICAgICAgICAgICAgdGltZWJhc2UgdGhhdCB0aGUgcG9zaXRpb24gd2FzIHVwZGF0ZWQgYXQuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U3RhdGUoQFN0YXRlIGludCBzdGF0ZSwgbG9uZyBwb3NpdGlvbiwgZmxvYXQgcGxheWJhY2tTcGVlZCwKKyAgICAgICAgICAgICAgICBsb25nIHVwZGF0ZVRpbWUpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgbVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICBtVXBkYXRlVGltZSA9IHVwZGF0ZVRpbWU7CisgICAgICAgICAgICBtU3BlZWQgPSBwbGF5YmFja1NwZWVkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG11c3QgYmUgaW4gbXMgYW5kIGluZGljYXRlcyB0aGUgY3VycmVudCBwbGF5YmFjaworICAgICAgICAgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIGl0ZW0uIElmIHRoZSBwb3NpdGlvbiBpcyB1bmtub3duIHVzZQorICAgICAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1BPU0lUSU9OX1VOS05PV059LiBUaGUgdXBkYXRlIHRpbWUgd2lsbCBiZSBzZXQgdG8KKyAgICAgICAgICogdGhlIGN1cnJlbnQge0BsaW5rIFN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZSgpfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBzcGVlZCBpcyBhIG11bHRpcGxlIG9mIG5vcm1hbCBwbGF5YmFjayBhbmQgc2hvdWxkIGJlIDAgd2hlbgorICAgICAgICAgKiBwYXVzZWQgYW5kIG5lZ2F0aXZlIHdoZW4gcmV3aW5kaW5nLiBOb3JtYWwgcGxheWJhY2sgc3BlZWQgaXMgMS4wLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHN0YXRlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9OT05FfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjU1RBVEVfU1RPUFBFRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1BMQVlJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9QQVVTRUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9GQVNUX0ZPUldBUkRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9SRVdJTkRJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9CVUZGRVJJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9FUlJPUn08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0NPTk5FQ1RJTkd9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19QUkVWSU9VU308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX1NLSVBQSU5HX1RPX05FWFR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNTVEFURV9TS0lQUElOR19UT19RVUVVRV9JVEVNfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjay4KKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBpdGVtIGluIG1zLgorICAgICAgICAgKiBAcGFyYW0gcGxheWJhY2tTcGVlZCBUaGUgY3VycmVudCBzcGVlZCBvZiBwbGF5YmFjayBhcyBhIG11bHRpcGxlIG9mCisgICAgICAgICAqICAgICAgICAgICAgbm9ybWFsIHBsYXliYWNrLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFN0YXRlKEBTdGF0ZSBpbnQgc3RhdGUsIGxvbmcgcG9zaXRpb24sIGZsb2F0IHBsYXliYWNrU3BlZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdGF0ZShzdGF0ZSwgcG9zaXRpb24sIHBsYXliYWNrU3BlZWQsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGN1cnJlbnQgYWN0aW9ucyBhdmFpbGFibGUgb24gdGhpcyBzZXNzaW9uLiBUaGlzIHNob3VsZCB1c2UgYQorICAgICAgICAgKiBiaXRtYXNrIG9mIHBvc3NpYmxlIGFjdGlvbnMuCisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU0tJUF9UT19QUkVWSU9VU308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9SRVdJTkR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QQVVTRX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TVE9QfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX0ZBU1RfRk9SV0FSRH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TS0lQX1RPX05FWFR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU0VFS19UT308L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9TRVRfUkFUSU5HfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfUEFVU0V9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUExBWV9GUk9NX01FRElBX0lEfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfRlJPTV9TRUFSQ0h9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fU0tJUF9UT19RVUVVRV9JVEVNfTwvbGk+CisgICAgICAgICAqIDxsaT4ge0BsaW5rIFBsYXliYWNrU3RhdGUjQUNUSU9OX1BMQVlfRlJPTV9VUkl9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUFJFUEFSRX08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fTUVESUFfSUR9PC9saT4KKyAgICAgICAgICogPGxpPiB7QGxpbmsgUGxheWJhY2tTdGF0ZSNBQ1RJT05fUFJFUEFSRV9GUk9NX1NFQVJDSH08L2xpPgorICAgICAgICAgKiA8bGk+IHtAbGluayBQbGF5YmFja1N0YXRlI0FDVElPTl9QUkVQQVJFX0ZST01fVVJJfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBzZXQgb2YgYWN0aW9ucyBhbGxvd2VkLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEFjdGlvbnMoQEFjdGlvbnMgbG9uZyBhY3Rpb25zKSB7CisgICAgICAgICAgICBtQWN0aW9ucyA9IGFjdGlvbnM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBjdXN0b20gYWN0aW9uIHRvIHRoZSBwbGF5YmFjayBzdGF0ZS4gQWN0aW9ucyBjYW4gYmUgdXNlZCB0bworICAgICAgICAgKiBleHBvc2UgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHtAbGluayBNZWRpYUNvbnRyb2xsZXIKKyAgICAgICAgICogTWVkaWFDb250cm9sbGVyc30gYmV5b25kIHdoYXQgaXMgb2ZmZXJlZCBieSB0aGUgc3RhbmRhcmQgdHJhbnNwb3J0CisgICAgICAgICAqIGNvbnRyb2xzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogZS5nLiBzdGFydCBhIHJhZGlvIHN0YXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgaXRlbSBvciBza2lwIGFoZWFkIGJ5CisgICAgICAgICAqIDMwIHNlY29uZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb24gQW4gaWRlbnRpZmllciBmb3IgdGhpcyBhY3Rpb24uIEl0IGNhbiBiZSBzZW50IGJhY2sgdG8KKyAgICAgICAgICogICAgICAgICAgICB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvbn0gdGhyb3VnaAorICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMjc2VuZEN1c3RvbUFjdGlvbihTdHJpbmcsIEJ1bmRsZSl9LgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGUgYWN0aW9uLiBJZiB0ZXh0IGlzIHNob3duIHdpdGgKKyAgICAgICAgICogICAgICAgICAgICB0aGUgYWN0aW9uIG9yIHVzZWQgZm9yIGFjY2Vzc2liaWxpdHksIHRoaXMgaXMgd2hhdCBzaG91bGQKKyAgICAgICAgICogICAgICAgICAgICBiZSB1c2VkLgorICAgICAgICAgKiBAcGFyYW0gaWNvbiBUaGUgcmVzb3VyY2UgYWN0aW9uIG9mIHRoZSBpY29uIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZAorICAgICAgICAgKiAgICAgICAgICAgIGZvciB0aGUgYWN0aW9uLiBUaGUgcmVzb3VyY2Ugc2hvdWxkIGJlIGluIHRoZSBwYWNrYWdlIG9mCisgICAgICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBNZWRpYVNlc3Npb259LgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBTdHJpbmcgbmFtZSwgaW50IGljb24pIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRDdXN0b21BY3Rpb24obmV3IFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uKGFjdGlvbiwgbmFtZSwgaWNvbiwgbnVsbCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGN1c3RvbSBhY3Rpb24gdG8gdGhlIHBsYXliYWNrIHN0YXRlLiBBY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGV4cG9zZSBhZGRpdGlvbmFsCisgICAgICAgICAqIGZ1bmN0aW9uYWxpdHkgdG8ge0BsaW5rIE1lZGlhQ29udHJvbGxlciBNZWRpYUNvbnRyb2xsZXJzfSBiZXlvbmQgd2hhdCBpcyBvZmZlcmVkIGJ5IHRoZQorICAgICAgICAgKiBzdGFuZGFyZCB0cmFuc3BvcnQgY29udHJvbHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBbiBleGFtcGxlIG9mIGFuIGFjdGlvbiB3b3VsZCBiZSB0byBzdGFydCBhIHJhZGlvIHN0YXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgaXRlbQorICAgICAgICAgKiBvciB0byBza2lwIGFoZWFkIGJ5IDMwIHNlY29uZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjdXN0b21BY3Rpb24gVGhlIGN1c3RvbSBhY3Rpb24gdG8gYWRkIHRvIHRoZSB7QGxpbmsgUGxheWJhY2tTdGF0ZX0uCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ3VzdG9tQWN0aW9uKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGN1c3RvbUFjdGlvbikgeworICAgICAgICAgICAgaWYgKGN1c3RvbUFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbWF5IG5vdCBhZGQgYSBudWxsIEN1c3RvbUFjdGlvbiB0byBQbGF5YmFja1N0YXRlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1c3RvbUFjdGlvbnMuYWRkKGN1c3RvbUFjdGlvbik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGN1cnJlbnQgYnVmZmVyZWQgcG9zaXRpb24gaW4gbXMuIFRoaXMgaXMgdGhlIGZhcnRoZXN0CisgICAgICAgICAqIHBsYXliYWNrIHBvaW50IHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1c2luZworICAgICAgICAgKiBvbmx5IGJ1ZmZlcmVkIGNvbnRlbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJlZFBvc2l0aW9uIFRoZSBwb3NpdGlvbiBpbiBtcyB0aGF0IHBsYXliYWNrIGlzIGJ1ZmZlcmVkCisgICAgICAgICAqICAgICAgICAgICAgdG8uCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0QnVmZmVyZWRQb3NpdGlvbihsb25nIGJ1ZmZlcmVkUG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uID0gYnVmZmVyZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGl0ZW0gaW4gdGhlIHBsYXkgcXVldWUgYnkgc3BlY2lmeWluZyBpdHMgaWQuIFRoZQorICAgICAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHtAbGluayBNZWRpYVNlc3Npb24uUXVldWVJdGVtI1VOS05PV05fSUR9CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGFjdGl2ZSBpdGVtLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEFjdGl2ZVF1ZXVlSXRlbUlkKGxvbmcgaWQpIHsKKyAgICAgICAgICAgIG1BY3RpdmVJdGVtSWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIHVzZXIgcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4gVGhpcyBzaG91bGQgYmUgc2V0IHdoZW4gdGhlIHN0YXRlCisgICAgICAgICAqIGlzIHtAbGluayBQbGF5YmFja1N0YXRlI1NUQVRFX0VSUk9SfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIGZvciBkaXNwbGF5IHRvIHRoZSB1c2VyLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEVycm9yTWVzc2FnZShDaGFyU2VxdWVuY2UgZXJyb3IpIHsKKyAgICAgICAgICAgIG1FcnJvck1lc3NhZ2UgPSBlcnJvcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhbnkgY3VzdG9tIGV4dHJhcyB0byBiZSBpbmNsdWRlZCB3aXRoIHRoZSBwbGF5YmFjayBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4dHJhcyBUaGUgZXh0cmFzIHRvIGluY2x1ZGUuCisgICAgICAgICAqIEByZXR1cm4gdGhpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhbmQgcmV0dXJuIHRoZSB7QGxpbmsgUGxheWJhY2tTdGF0ZX0gaW5zdGFuY2Ugd2l0aCB0aGVzZQorICAgICAgICAgKiB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQSBuZXcgc3RhdGUgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGxheWJhY2tTdGF0ZSBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tTdGF0ZShtU3RhdGUsIG1Qb3NpdGlvbiwgbVVwZGF0ZVRpbWUsIG1TcGVlZCwgbUJ1ZmZlcmVkUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLCBtQ3VzdG9tQWN0aW9ucywgbUFjdGl2ZUl0ZW1JZCwgbUVycm9yTWVzc2FnZSwgbUV4dHJhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZS5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvSU1lZGlhQnJvd3NlclNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY0MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL2FwZXgvamF2YS9hbmRyb2lkL3NlcnZpY2UvbWVkaWEvSU1lZGlhQnJvd3NlclNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitwYWNrYWdlIGFuZHJvaWQuc2VydmljZS5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CisKKy8qKgorICogTWVkaWEgQVBJIGFsbG93cyBjbGllbnRzIHRvIGJyb3dzZSB0aHJvdWdoIGhpZXJhcmNoeSBvZiBhIHVzZXLigJlzIG1lZGlhIGNvbGxlY3Rpb24sCisgKiBwbGF5YmFjayBhIHNwZWNpZmljIG1lZGlhIGVudHJ5IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBub3cgcGxheWluZyBxdWV1ZS4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSU1lZGlhQnJvd3NlclNlcnZpY2UgeworICAgIHZvaWQgY29ubmVjdChTdHJpbmcgcGtnLCBpbiBCdW5kbGUgcm9vdEhpbnRzLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpOworICAgIHZvaWQgZGlzY29ubmVjdChJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpOworCisgICAgdm9pZCBhZGRTdWJzY3JpcHRpb25EZXByZWNhdGVkKFN0cmluZyB1cmksIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisgICAgdm9pZCByZW1vdmVTdWJzY3JpcHRpb25EZXByZWNhdGVkKFN0cmluZyB1cmksIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisKKyAgICB2b2lkIGdldE1lZGlhSXRlbShTdHJpbmcgdXJpLCBpbiBSZXN1bHRSZWNlaXZlciBjYiwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKKyAgICB2b2lkIGFkZFN1YnNjcmlwdGlvbihTdHJpbmcgdXJpLCBpbiBJQmluZGVyIHRva2VuLCBpbiBCdW5kbGUgb3B0aW9ucywKKyAgICAgICAgICAgIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcyk7CisgICAgdm9pZCByZW1vdmVTdWJzY3JpcHRpb24oU3RyaW5nIHVyaSwgaW4gSUJpbmRlciB0b2tlbiwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL0lNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzQ4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9JTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcy5haWRsCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBhcmNlbGVkTGlzdFNsaWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKKy8qKgorICogTWVkaWEgQVBJIGFsbG93cyBjbGllbnRzIHRvIGJyb3dzZSB0aHJvdWdoIGhpZXJhcmNoeSBvZiBhIHVzZXLigJlzIG1lZGlhIGNvbGxlY3Rpb24sCisgKiBwbGF5YmFjayBhIHNwZWNpZmljIG1lZGlhIGVudHJ5IGFuZCBpbnRlcmFjdCB3aXRoIHRoZSBub3cgcGxheWluZyBxdWV1ZS4KKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgeworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29ubmVjdGVkIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqIEBwYXJhbSByb290IFRoZSByb290IG1lZGlhIGlkIGZvciBicm93c2luZy4KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUge0BsaW5rIE1lZGlhU2Vzc2lvbi5Ub2tlbiBtZWRpYSBzZXNzaW9uIHRva2VufSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wKKyAgICAgKiAgICAgICAgIHRoZSBwbGF5YmFjayBvZiB0aGUgbWVkaWEgYXBwLgorICAgICAqIEBwYXJhbSBleHRyYSBFeHRyYXMgcmV0dXJuZWQgYnkgdGhlIG1lZGlhIHNlcnZpY2UuCisgICAgICovCisgICAgdm9pZCBvbkNvbm5lY3QoU3RyaW5nIHJvb3QsIGluIE1lZGlhU2Vzc2lvbi5Ub2tlbiBzZXNzaW9uLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uQ29ubmVjdEZhaWxlZCgpOworICAgIHZvaWQgb25Mb2FkQ2hpbGRyZW4oU3RyaW5nIG1lZGlhSWQsIGluIE1lZGlhUGFyY2VsZWRMaXN0U2xpY2UgbGlzdCk7CisgICAgdm9pZCBvbkxvYWRDaGlsZHJlbldpdGhPcHRpb25zKFN0cmluZyBtZWRpYUlkLCBpbiBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlIGxpc3QsCisgICAgICAgICAgICBpbiBCdW5kbGUgb3B0aW9ucyk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9NZWRpYUJyb3dzZXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvYXBleC9qYXZhL2FuZHJvaWQvc2VydmljZS9tZWRpYS9NZWRpYUJyb3dzZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2ZWMzNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9hcGV4L2phdmEvYW5kcm9pZC9zZXJ2aWNlL21lZGlhL01lZGlhQnJvd3NlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDg1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5zZXJ2aWNlLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGFyY2VsZWRMaXN0U2xpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5icm93c2UuTWVkaWFCcm93c2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3NlclV0aWxzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuc2VydmljZS5tZWRpYS5JTWVkaWFCcm93c2VyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnNlcnZpY2UubWVkaWEuSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBtZWRpYSBicm93c2VyIHNlcnZpY2VzLgorICogPHA+CisgKiBNZWRpYSBicm93c2VyIHNlcnZpY2VzIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gYnJvd3NlIG1lZGlhIGNvbnRlbnQgcHJvdmlkZWQgYnkgYW4gYXBwbGljYXRpb24KKyAqIGFuZCBhc2sgdGhlIGFwcGxpY2F0aW9uIHRvIHN0YXJ0IHBsYXlpbmcgaXQuIFRoZXkgbWF5IGFsc28gYmUgdXNlZCB0byBjb250cm9sIGNvbnRlbnQgdGhhdAorICogaXMgYWxyZWFkeSBwbGF5aW5nIGJ5IHdheSBvZiBhIHtAbGluayBNZWRpYVNlc3Npb259LgorICogPC9wPgorICoKKyAqIFRvIGV4dGVuZCB0aGlzIGNsYXNzLCB5b3UgbXVzdCBkZWNsYXJlIHRoZSBzZXJ2aWNlIGluIHlvdXIgbWFuaWZlc3QgZmlsZSB3aXRoCisgKiBhbiBpbnRlbnQgZmlsdGVyIHdpdGggdGhlIHtAbGluayAjU0VSVklDRV9JTlRFUkZBQ0V9IGFjdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqIDwvcD48cHJlPgorICogJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYUJyb3dzZXJTZXJ2aWNlIgorICogICAgICAgICAgYW5kcm9pZDpsYWJlbD0iJiM2NDtzdHJpbmcvc2VydmljZV9uYW1lIiA+CisgKiAgICAgJmx0O2ludGVudC1maWx0ZXI+CisgKiAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXJTZXJ2aWNlIiAvPgorICogICAgICZsdDsvaW50ZW50LWZpbHRlcj4KKyAqICZsdDsvc2VydmljZT4KKyAqIDwvcHJlPgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhQnJvd3NlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlclNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEludGVudH0gdGhhdCBtdXN0IGJlIGRlY2xhcmVkIGFzIGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5TRVJWSUNFX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9ICJhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXJTZXJ2aWNlIjsKKworICAgIC8qKgorICAgICAqIEEga2V5IGZvciBwYXNzaW5nIHRoZSBNZWRpYUl0ZW0gdG8gdGhlIFJlc3VsdFJlY2VpdmVyIGluIGdldEl0ZW0uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRURJQV9JVEVNID0gIm1lZGlhX2l0ZW0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCA9IDEgPDwgMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZMQUdfT05fTE9BRF9JVEVNX05PVF9JTVBMRU1FTlRFRCA9IDEgPDwgMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfRVJST1IgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX09LID0gMDsKKworICAgIC8qKiBAaGlkZSAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKKyAgICBASW50RGVmKGZsYWc9dHJ1ZSwgdmFsdWUgPSB7IFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCwKKyAgICAgICAgICAgIFJFU1VMVF9GTEFHX09OX0xPQURfSVRFTV9OT1RfSU1QTEVNRU5URUQgfSkKKyAgICBwcml2YXRlIEBpbnRlcmZhY2UgUmVzdWx0RmxhZ3MgeyB9CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPElCaW5kZXIsIENvbm5lY3Rpb25SZWNvcmQ+IG1Db25uZWN0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7CisgICAgcHJpdmF0ZSBDb25uZWN0aW9uUmVjb3JkIG1DdXJDb25uZWN0aW9uOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBTZXJ2aWNlQmluZGVyIG1CaW5kZXI7CisgICAgTWVkaWFTZXNzaW9uLlRva2VuIG1TZXNzaW9uOworCisgICAgLyoqCisgICAgICogQWxsIHRoZSBpbmZvIGFib3V0IGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25SZWNvcmQgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgU3RyaW5nIHBrZzsKKyAgICAgICAgaW50IHVpZDsKKyAgICAgICAgaW50IHBpZDsKKyAgICAgICAgQnVuZGxlIHJvb3RIaW50czsKKyAgICAgICAgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzOworICAgICAgICBCcm93c2VyUm9vdCByb290OworICAgICAgICBIYXNoTWFwPFN0cmluZywgTGlzdDxQYWlyPElCaW5kZXIsIEJ1bmRsZT4+PiBzdWJzY3JpcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbnMucmVtb3ZlKGNhbGxiYWNrcy5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXRpb24gaGFuZGxlciBmb3IgYXN5bmNocm9ub3VzIGNhbGxiYWNrIG1ldGhvZHMgaW4ge0BsaW5rIE1lZGlhQnJvd3NlclNlcnZpY2V9LgorICAgICAqIDxwPgorICAgICAqIEVhY2ggb2YgdGhlIG1ldGhvZHMgdGhhdCB0YWtlcyBvbmUgb2YgdGhlc2UgdG8gc2VuZCB0aGUgcmVzdWx0IG11c3QgY2FsbAorICAgICAqIHtAbGluayAjc2VuZFJlc3VsdH0gdG8gcmVzcG9uZCB0byB0aGUgY2FsbGVyIHdpdGggdGhlIGdpdmVuIHJlc3VsdHMuIElmIHRob3NlCisgICAgICogZnVuY3Rpb25zIHJldHVybiB3aXRob3V0IGNhbGxpbmcge0BsaW5rICNzZW5kUmVzdWx0fSwgdGhleSBtdXN0IGluc3RlYWQgY2FsbAorICAgICAqIHtAbGluayAjZGV0YWNofSBiZWZvcmUgcmV0dXJuaW5nLCBhbmQgdGhlbiBtYXkgY2FsbCB7QGxpbmsgI3NlbmRSZXN1bHR9IHdoZW4KKyAgICAgKiB0aGV5IGFyZSBkb25lLiBJZiBtb3JlIHRoYW4gb25lIG9mIHRob3NlIG1ldGhvZHMgaXMgY2FsbGVkLCBhbiBleGNlcHRpb24gd2lsbAorICAgICAqIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBzZWUgI29uTG9hZENoaWxkcmVuCisgICAgICogQHNlZSAjb25Mb2FkSXRlbQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBSZXN1bHQ8VD4geworICAgICAgICBwcml2YXRlIE9iamVjdCBtRGVidWc7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGV0YWNoQ2FsbGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbmRSZXN1bHRDYWxsZWQ7CisgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgICAgIHByaXZhdGUgaW50IG1GbGFnczsKKworICAgICAgICBSZXN1bHQoT2JqZWN0IGRlYnVnKSB7CisgICAgICAgICAgICBtRGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZW5kIHRoZSByZXN1bHQgYmFjayB0byB0aGUgY2FsbGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFJlc3VsdChUIHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKG1TZW5kUmVzdWx0Q2FsbGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VuZFJlc3VsdCgpIGNhbGxlZCB0d2ljZSBmb3I6ICIgKyBtRGVidWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbmRSZXN1bHRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgb25SZXN1bHRTZW50KHJlc3VsdCwgbUZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXRhY2ggdGhpcyBtZXNzYWdlIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZCBhbGxvdyB0aGUge0BsaW5rICNzZW5kUmVzdWx0fQorICAgICAgICAgKiBjYWxsIHRvIGhhcHBlbiBsYXRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaCgpIHsKKyAgICAgICAgICAgIGlmIChtRGV0YWNoQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGV0YWNoKCkgY2FsbGVkIHdoZW4gZGV0YWNoKCkgaGFkIGFscmVhZHkiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVlbiBjYWxsZWQgZm9yOiAiICsgbURlYnVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU2VuZFJlc3VsdENhbGxlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRldGFjaCgpIGNhbGxlZCB3aGVuIHNlbmRSZXN1bHQoKSBoYWQgYWxyZWFkeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWVuIGNhbGxlZCBmb3I6ICIgKyBtRGVidWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURldGFjaENhbGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzRG9uZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV0YWNoQ2FsbGVkIHx8IG1TZW5kUmVzdWx0Q2FsbGVkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRGbGFncyhAUmVzdWx0RmxhZ3MgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVzdWx0IGlzIHNlbnQsIGFmdGVyIGFzc2VydGlvbnMgYWJvdXQgbm90IGJlaW5nIGNhbGxlZCB0d2ljZQorICAgICAgICAgKiBoYXZlIGhhcHBlbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvblJlc3VsdFNlbnQoVCByZXN1bHQsIEBSZXN1bHRGbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VydmljZUJpbmRlciBleHRlbmRzIElNZWRpYUJyb3dzZXJTZXJ2aWNlLlN0dWIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBTdHJpbmcgcGtnLCBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworCisgICAgICAgICAgICBmaW5hbCBpbnQgcGlkID0gQmluZGVyLmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUGFja2FnZShwa2csIHVpZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlL3VpZCBtaXNtYXRjaDogdWlkPSIgKyB1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWNrYWdlPSIgKyBwa2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYiA9IGNhbGxiYWNrcy5hc0JpbmRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIG9sZCBzdWJzY3JpcHRpb25zLiBXZSBhcmUgZ2V0dGluZyBuZXcgb25lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5yZW1vdmUoYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uUmVjb3JkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnBrZyA9IHBrZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucGlkID0gcGlkOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51aWQgPSB1aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJvb3RIaW50cyA9IHJvb3RIaW50czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY2FsbGJhY2tzID0gY2FsbGJhY2tzOworCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJvb3QgPSBNZWRpYUJyb3dzZXJTZXJ2aWNlLnRoaXMub25HZXRSb290KHBrZywgdWlkLCByb290SGludHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1ckNvbm5lY3Rpb24gPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGV5IGRpZG4ndCByZXR1cm4gc29tZXRoaW5nLCBkb24ndCBhbGxvdyB0aGlzIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk5vIHJvb3QgZm9yIGNsaWVudCAiICsgcGtnICsgIiBmcm9tIHNlcnZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uQ29ubmVjdEZhaWxlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYWxsaW5nIG9uQ29ubmVjdEZhaWxlZCgpIGZhaWxlZC4gSWdub3JpbmcuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwa2c9IiArIHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbnMucHV0KGIsIGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmxpbmtUb0RlYXRoKGNvbm5lY3Rpb24sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uQ29ubmVjdChjb25uZWN0aW9uLnJvb3QuZ2V0Um9vdElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLCBjb25uZWN0aW9uLnJvb3QuZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbGxpbmcgb25Db25uZWN0KCkgZmFpbGVkLiBEcm9wcGluZyBjbGllbnQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwa2c9IiArIHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ucy5yZW1vdmUoYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdChmaW5hbCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUJpbmRlciBiID0gY2FsbGJhY2tzLmFzQmluZGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgb2xkIHN1YnNjcmlwdGlvbnMuIFdlIGFyZSBnZXR0aW5nIG5ldyBvbmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29ubmVjdGlvblJlY29yZCBvbGQgPSBtQ29ubmVjdGlvbnMucmVtb3ZlKGIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5jYWxsYmFja3MuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG9sZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhZGRTdWJzY3JpcHRpb25EZXByZWNhdGVkKFN0cmluZyBpZCwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAvLyBkby1ub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkU3Vic2NyaXB0aW9uKGZpbmFsIFN0cmluZyBpZCwgZmluYWwgSUJpbmRlciB0b2tlbiwgZmluYWwgQnVuZGxlIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQnJvd3NlclNlcnZpY2VDYWxsYmFja3MgY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElCaW5kZXIgYiA9IGNhbGxiYWNrcy5hc0JpbmRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHJlY29yZCBmb3IgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiA9IG1Db25uZWN0aW9ucy5nZXQoYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiYWRkU3Vic2NyaXB0aW9uIGZvciBjYWxsYmFjayB0aGF0IGlzbid0IHJlZ2lzdGVyZWQgaWQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQnJvd3NlclNlcnZpY2UudGhpcy5hZGRTdWJzY3JpcHRpb24oaWQsIGNvbm5lY3Rpb24sIHRva2VuLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVN1YnNjcmlwdGlvbkRlcHJlY2F0ZWQoU3RyaW5nIGlkLCBJTWVkaWFCcm93c2VyU2VydmljZUNhbGxiYWNrcyBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIC8vIGRvLW5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVTdWJzY3JpcHRpb24oZmluYWwgU3RyaW5nIGlkLCBmaW5hbCBJQmluZGVyIHRva2VuLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGIgPSBjYWxsYmFja3MuYXNCaW5kZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvbnMuZ2V0KGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZW1vdmVTdWJzY3JpcHRpb24gZm9yIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBpZD0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghTWVkaWFCcm93c2VyU2VydmljZS50aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihpZCwgY29ubmVjdGlvbiwgdG9rZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZW1vdmVTdWJzY3JpcHRpb24gY2FsbGVkIGZvciAiICsgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWNoIGlzIG5vdCBzdWJzY3JpYmVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRNZWRpYUl0ZW0oZmluYWwgU3RyaW5nIG1lZGlhSWQsIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUJyb3dzZXJTZXJ2aWNlQ2FsbGJhY2tzIGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQmluZGVyIGIgPSBjYWxsYmFja3MuYXNCaW5kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gbUNvbm5lY3Rpb25zLmdldChiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0TWVkaWFJdGVtIGZvciBjYWxsYmFjayB0aGF0IGlzbid0IHJlZ2lzdGVyZWQgaWQ9IiArIG1lZGlhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2FkSXRlbShtZWRpYUlkLCBjb25uZWN0aW9uLCByZWNlaXZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKyAgICAgICAgbUJpbmRlciA9IG5ldyBTZXJ2aWNlQmluZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKFNFUlZJQ0VfSU5URVJGQUNFLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbUJpbmRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZ2V0IHRoZSByb290IGluZm9ybWF0aW9uIGZvciBicm93c2luZyBieSBhIHBhcnRpY3VsYXIgY2xpZW50LgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIGNsaWVudCBwYWNrYWdlIGhhcyBwZXJtaXNzaW9uCisgICAgICogdG8gYWNjZXNzIGJyb3dzZSBtZWRpYSBpbmZvcm1hdGlvbiBiZWZvcmUgcmV0dXJuaW5nIHRoZSByb290IGlkOyBpdAorICAgICAqIHNob3VsZCByZXR1cm4gbnVsbCBpZiB0aGUgY2xpZW50IGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGlzCisgICAgICogaW5mb3JtYXRpb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudFBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGlzCisgICAgICogICAgICAgICAgICByZXF1ZXN0aW5nIGFjY2VzcyB0byBicm93c2UgbWVkaWEuCisgICAgICogQHBhcmFtIGNsaWVudFVpZCBUaGUgdWlkIG9mIHRoZSBhcHBsaWNhdGlvbiB3aGljaCBpcyByZXF1ZXN0aW5nIGFjY2VzcyB0bworICAgICAqICAgICAgICAgICAgYnJvd3NlIG1lZGlhLgorICAgICAqIEBwYXJhbSByb290SGludHMgQW4gb3B0aW9uYWwgYnVuZGxlIG9mIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIHRvIHNlbmQKKyAgICAgKiAgICAgICAgICAgIHRvIHRoZSBtZWRpYSBicm93c2VyIHNlcnZpY2Ugd2hlbiBjb25uZWN0aW5nIGFuZCByZXRyaWV2aW5nIHRoZQorICAgICAqICAgICAgICAgICAgcm9vdCBpZCBmb3IgYnJvd3NpbmcsIG9yIG51bGwgaWYgbm9uZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGJ1bmRsZSBtYXkgYWZmZWN0IHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCB3aGVuIGJyb3dzaW5nLgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBCcm93c2VyUm9vdH0gZm9yIGFjY2Vzc2luZyB0aGlzIGFwcCdzIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAc2VlIEJyb3dzZXJSb290I0VYVFJBX1JFQ0VOVAorICAgICAqIEBzZWUgQnJvd3NlclJvb3QjRVhUUkFfT0ZGTElORQorICAgICAqIEBzZWUgQnJvd3NlclJvb3QjRVhUUkFfU1VHR0VTVEVECisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEBOdWxsYWJsZSBCcm93c2VyUm9vdCBvbkdldFJvb3QoQE5vbk51bGwgU3RyaW5nIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgQE51bGxhYmxlIEJ1bmRsZSByb290SGludHMpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hpbGRyZW4gb2YgYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fQorICAgICAqIHdpdGggdGhlIGxpc3Qgb2YgY2hpbGRyZW4uIElmIGxvYWRpbmcgdGhlIGNoaWxkcmVuIHdpbGwgYmUgYW4gZXhwZW5zaXZlCisgICAgICogb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBhbm90aGVyIHRocmVhZCwKKyAgICAgKiB7QGxpbmsgUmVzdWx0I2RldGFjaCByZXN1bHQuZGV0YWNofSBtYXkgYmUgY2FsbGVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbQorICAgICAqIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGVuIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0KKyAgICAgKiBjYWxsZWQgd2hlbiB0aGUgbG9hZGluZyBpcyBjb21wbGV0ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW4gY2FzZSB0aGUgbWVkaWEgaXRlbSBkb2VzIG5vdCBoYXZlIGFueSBjaGlsZHJlbiwgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHR9CisgICAgICogd2l0aCBhbiBlbXB0eSBsaXN0LiBXaGVuIHRoZSBnaXZlbiB7QGNvZGUgcGFyZW50SWR9IGlzIGludmFsaWQsIGltcGxlbWVudGF0aW9ucyBtdXN0CisgICAgICogY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9IHdpdGgge0Bjb2RlIG51bGx9LCB3aGljaCB3aWxsIGludm9rZQorICAgICAqIHtAbGluayBNZWRpYUJyb3dzZXIuU3Vic2NyaXB0aW9uQ2FsbGJhY2sjb25FcnJvcn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgY2hpbGRyZW4gYXJlIHRvIGJlCisgICAgICogICAgICAgICAgICBxdWVyaWVkLgorICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFJlc3VsdCB0byBzZW5kIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHRvLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uTG9hZENoaWxkcmVuKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgIEBOb25OdWxsIFJlc3VsdDxMaXN0PE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+PiByZXN1bHQpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hpbGRyZW4gb2YgYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fQorICAgICAqIHdpdGggdGhlIGxpc3Qgb2YgY2hpbGRyZW4uIElmIGxvYWRpbmcgdGhlIGNoaWxkcmVuIHdpbGwgYmUgYW4gZXhwZW5zaXZlCisgICAgICogb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiBhbm90aGVyIHRocmVhZCwKKyAgICAgKiB7QGxpbmsgUmVzdWx0I2RldGFjaCByZXN1bHQuZGV0YWNofSBtYXkgYmUgY2FsbGVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbQorICAgICAqIHRoaXMgZnVuY3Rpb24sIGFuZCB0aGVuIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0KKyAgICAgKiBjYWxsZWQgd2hlbiB0aGUgbG9hZGluZyBpcyBjb21wbGV0ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSW4gY2FzZSB0aGUgbWVkaWEgaXRlbSBkb2VzIG5vdCBoYXZlIGFueSBjaGlsZHJlbiwgY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHR9CisgICAgICogd2l0aCBhbiBlbXB0eSBsaXN0LiBXaGVuIHRoZSBnaXZlbiB7QGNvZGUgcGFyZW50SWR9IGlzIGludmFsaWQsIGltcGxlbWVudGF0aW9ucyBtdXN0CisgICAgICogY2FsbCB7QGxpbmsgUmVzdWx0I3NlbmRSZXN1bHQgcmVzdWx0LnNlbmRSZXN1bHR9IHdpdGgge0Bjb2RlIG51bGx9LCB3aGljaCB3aWxsIGludm9rZQorICAgICAqIHtAbGluayBNZWRpYUJyb3dzZXIuU3Vic2NyaXB0aW9uQ2FsbGJhY2sjb25FcnJvcn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UgY2hpbGRyZW4gYXJlIHRvIGJlCisgICAgICogICAgICAgICAgICBxdWVyaWVkLgorICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIFJlc3VsdCB0byBzZW5kIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHRvLgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgc2VudCBmcm9tIHRoZSBtZWRpYQorICAgICAqICAgICAgICAgICAgYnJvd3Nlci4gVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHRocm91Z2ggdGhlIHJlc3VsdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgIGFmZmVjdGVkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGlzIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxvYWRDaGlsZHJlbihATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQsCisgICAgICAgICAgICBATm9uTnVsbCBSZXN1bHQ8TGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPj4gcmVzdWx0LCBATm9uTnVsbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICAvLyBUbyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdoZW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIE1lZGlhQnJvd3NlclNlcnZpY2UgZG9lc24ndAorICAgICAgICAvLyBvdmVycmlkZSBvbkxvYWRDaGlsZHJlbigpIHdpdGggb3B0aW9ucywgb25Mb2FkQ2hpbGRyZW4oKSB3aXRob3V0IG9wdGlvbnMgd2lsbCBiZSB1c2VkCisgICAgICAgIC8vIGluc3RlYWQsIGFuZCB0aGUgb3B0aW9ucyB3aWxsIGJlIGFwcGxpZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHJlc3VsdC5vblJlc3VsdFNlbnQoKS4KKyAgICAgICAgcmVzdWx0LnNldEZsYWdzKFJFU1VMVF9GTEFHX09QVElPTl9OT1RfSEFORExFRCk7CisgICAgICAgIG9uTG9hZENoaWxkcmVuKHBhcmVudElkLCByZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fS4gSWYKKyAgICAgKiBsb2FkaW5nIHRoZSBpdGVtIHdpbGwgYmUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiB7QGxpbmsgUmVzdWx0I2RldGFjaAorICAgICAqIHJlc3VsdC5kZXRhY2h9IG1heSBiZSBjYWxsZWQgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIGFuZAorICAgICAqIHRoZW4ge0BsaW5rIFJlc3VsdCNzZW5kUmVzdWx0IHJlc3VsdC5zZW5kUmVzdWx0fSBjYWxsZWQgd2hlbiB0aGUgaXRlbSBoYXMKKyAgICAgKiBiZWVuIGxvYWRlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbiB0aGUgZ2l2ZW4ge0Bjb2RlIGl0ZW1JZH0gaXMgaW52YWxpZCwgaW1wbGVtZW50YXRpb25zIG11c3QgY2FsbAorICAgICAqIHtAbGluayBSZXN1bHQjc2VuZFJlc3VsdCByZXN1bHQuc2VuZFJlc3VsdH0gd2l0aCB7QGNvZGUgbnVsbH0uCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgaW52b2tlIHtAbGluayBNZWRpYUJyb3dzZXIuSXRlbUNhbGxiYWNrI29uRXJyb3J9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGlkIGZvciB0aGUgc3BlY2lmaWMKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLm1lZGlhLmJyb3dzZS5NZWRpYUJyb3dzZXIuTWVkaWFJdGVtfS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBSZXN1bHQgdG8gc2VuZCB0aGUgaXRlbSB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxvYWRJdGVtKFN0cmluZyBpdGVtSWQsIFJlc3VsdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiByZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0LnNldEZsYWdzKFJFU1VMVF9GTEFHX09OX0xPQURfSVRFTV9OT1RfSU1QTEVNRU5URUQpOworICAgICAgICByZXN1bHQuc2VuZFJlc3VsdChudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRvIHNldCB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgc29vbiBhcyBwb3NzaWJsZSBkdXJpbmcgdGhlIHNlcnZpY2UncyBzdGFydHVwLgorICAgICAqIEl0IG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlcnZpY2UncyB7QGxpbmsgTWVkaWFTZXNzaW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uVG9rZW4oZmluYWwgTWVkaWFTZXNzaW9uLlRva2VuIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHRva2VuIG1heSBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHNlc3Npb24gdG9rZW4gaGFzIGFscmVhZHkgYmVlbiBzZXQuIik7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb24gPSB0b2tlbjsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvcjxDb25uZWN0aW9uUmVjb3JkPiBpdGVyID0gbUNvbm5lY3Rpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKXsKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlY29yZCBjb25uZWN0aW9uID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNhbGxiYWNrcy5vbkNvbm5lY3QoY29ubmVjdGlvbi5yb290LmdldFJvb3RJZCgpLCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yb290LmdldEV4dHJhcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbm5lY3Rpb24gZm9yICIgKyBjb25uZWN0aW9uLnBrZyArICIgaXMgbm8gbG9uZ2VyIHZhbGlkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vzc2lvbiB0b2tlbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQKKyAgICAgKiBvciBpZiBpdCBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYVNlc3Npb24uVG9rZW4gZ2V0U2Vzc2lvblRva2VuKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBoaW50cyBzZW50IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQge0BsaW5rIE1lZGlhQnJvd3Nlcn0uCisgICAgICogVGhlIHJvb3QgaGludHMgYXJlIHNlcnZpY2Utc3BlY2lmaWMgYXJndW1lbnRzIGluY2x1ZGVkIGluIGFuIG9wdGlvbmFsIGJ1bmRsZSBzZW50IHRvIHRoZQorICAgICAqIG1lZGlhIGJyb3dzZXIgc2VydmljZSB3aGVuIGNvbm5lY3RpbmcgYW5kIHJldHJpZXZpbmcgdGhlIHJvb3QgaWQgZm9yIGJyb3dzaW5nLCBvciBudWxsIGlmCisgICAgICogbm9uZS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYnVuZGxlIG1heSBhZmZlY3QgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHdoZW4gYnJvd3NpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3V0c2lkZSBvZiB7QGxpbmsgI29uR2V0Um9vdH0gb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI29uTG9hZENoaWxkcmVufSBvciB7QGxpbmsgI29uTG9hZEl0ZW19LgorICAgICAqIEBzZWUgTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9SRUNFTlQKKyAgICAgKiBAc2VlIE1lZGlhQnJvd3NlclNlcnZpY2UuQnJvd3NlclJvb3QjRVhUUkFfT0ZGTElORQorICAgICAqIEBzZWUgTWVkaWFCcm93c2VyU2VydmljZS5Ccm93c2VyUm9vdCNFWFRSQV9TVUdHRVNURUQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQnVuZGxlIGdldEJyb3dzZXJSb290SGludHMoKSB7CisgICAgICAgIGlmIChtQ3VyQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIG9mIG9uR2V0Um9vdCBvciIKKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uTG9hZENoaWxkcmVuIG9yIG9uTG9hZEl0ZW0gbWV0aG9kcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3VyQ29ubmVjdGlvbi5yb290SGludHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgQnVuZGxlKG1DdXJDb25uZWN0aW9uLnJvb3RIaW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnJvd3NlciBpbmZvcm1hdGlvbiB3aG8gc2VudCB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG91dHNpZGUgb2Yge0BsaW5rICNvbkdldFJvb3R9IG9yCisgICAgICogICAgICAgICAgICAge0BsaW5rICNvbkxvYWRDaGlsZHJlbn0gb3Ige0BsaW5rICNvbkxvYWRJdGVtfS4KKyAgICAgKiBAc2VlIE1lZGlhU2Vzc2lvbk1hbmFnZXIjaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKFJlbW90ZVVzZXJJbmZvKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZW1vdGVVc2VySW5mbyBnZXRDdXJyZW50QnJvd3NlckluZm8oKSB7CisgICAgICAgIGlmIChtQ3VyQ29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIG9mIG9uR2V0Um9vdCBvciIKKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uTG9hZENoaWxkcmVuIG9yIG9uTG9hZEl0ZW0gbWV0aG9kcyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVXNlckluZm8obUN1ckNvbm5lY3Rpb24ucGtnLCBtQ3VyQ29ubmVjdGlvbi5waWQsIG1DdXJDb25uZWN0aW9uLnVpZCwKKyAgICAgICAgICAgICAgICBtQ3VyQ29ubmVjdGlvbi5jYWxsYmFja3MuYXNCaW5kZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgYWxsIGNvbm5lY3RlZCBtZWRpYSBicm93c2VycyB0aGF0IHRoZSBjaGlsZHJlbiBvZgorICAgICAqIHRoZSBzcGVjaWZpZWQgcGFyZW50IGlkIGhhdmUgY2hhbmdlZCBpbiBzb21lIHdheS4KKyAgICAgKiBUaGlzIHdpbGwgY2F1c2UgYnJvd3NlcnMgdG8gZmV0Y2ggc3Vic2NyaWJlZCBjb250ZW50IGFnYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lZGlhIGl0ZW0gd2hvc2UKKyAgICAgKiBjaGlsZHJlbiBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZChATm9uTnVsbCBTdHJpbmcgcGFyZW50SWQpIHsKKyAgICAgICAgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkSW50ZXJuYWwocGFyZW50SWQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIGFsbCBjb25uZWN0ZWQgbWVkaWEgYnJvd3NlcnMgdGhhdCB0aGUgY2hpbGRyZW4gb2YKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhcmVudCBpZCBoYXZlIGNoYW5nZWQgaW4gc29tZSB3YXkuCisgICAgICogVGhpcyB3aWxsIGNhdXNlIGJyb3dzZXJzIHRvIGZldGNoIHN1YnNjcmliZWQgY29udGVudCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRJZCBUaGUgaWQgb2YgdGhlIHBhcmVudCBtZWRpYSBpdGVtIHdob3NlCisgICAgICogICAgICAgICAgICBjaGlsZHJlbiBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBidW5kbGUgb2Ygc2VydmljZS1zcGVjaWZpYyBhcmd1bWVudHMgdG8gc2VuZAorICAgICAqICAgICAgICAgICAgdG8gdGhlIG1lZGlhIGJyb3dzZXIuIFRoZSBjb250ZW50cyBvZiB0aGlzIGJ1bmRsZSBtYXkKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkKEBOb25OdWxsIFN0cmluZyBwYXJlbnRJZCwgQE5vbk51bGwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib3B0aW9ucyBjYW5ub3QgYmUgbnVsbCBpbiBub3RpZnlDaGlsZHJlbkNoYW5nZWQiKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlDaGlsZHJlbkNoYW5nZWRJbnRlcm5hbChwYXJlbnRJZCwgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZEludGVybmFsKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgZmluYWwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIGNhbm5vdCBiZSBudWxsIGluIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZCIpOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZm9yIChJQmluZGVyIGJpbmRlciA6IG1Db25uZWN0aW9ucy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvbnMuZ2V0KGJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxJQmluZGVyLCBCdW5kbGU+PiBjYWxsYmFja0xpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3Vic2NyaXB0aW9ucy5nZXQocGFyZW50SWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tMaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxJQmluZGVyLCBCdW5kbGU+IGNhbGxiYWNrIDogY2FsbGJhY2tMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1lZGlhQnJvd3NlclV0aWxzLmhhc0R1cGxpY2F0ZWRJdGVtcyhvcHRpb25zLCBjYWxsYmFjay5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2FkQ2hpbGRyZW4ocGFyZW50SWQsIGNvbm5lY3Rpb24sIGNhbGxiYWNrLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBvbmUgb2YgdGhlIG9uZXMgdGhhdCBpcyBvd25lZCBieSB0aGUgdWlkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGFja2FnZShTdHJpbmcgcGtnLCBpbnQgdWlkKSB7CisgICAgICAgIGlmIChwa2cgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcGFja2FnZXMgPSBwbS5nZXRQYWNrYWdlc0ZvclVpZCh1aWQpOworICAgICAgICBmaW5hbCBpbnQgTiA9IHBhY2thZ2VzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgaWYgKHBhY2thZ2VzW2ldLmVxdWFscyhwa2cpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIHN1YnNjcmlwdGlvbiBhbmQgaWYgaXQgaXMgYSBuZXcgc3Vic2NyaXB0aW9uIHNlbmQgdGhlIHJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFN1YnNjcmlwdGlvbihTdHJpbmcgaWQsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiwgSUJpbmRlciB0b2tlbiwKKyAgICAgICAgICAgIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIHN1YnNjcmlwdGlvbgorICAgICAgICBMaXN0PFBhaXI8SUJpbmRlciwgQnVuZGxlPj4gY2FsbGJhY2tMaXN0ID0gY29ubmVjdGlvbi5zdWJzY3JpcHRpb25zLmdldChpZCk7CisgICAgICAgIGlmIChjYWxsYmFja0xpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgY2FsbGJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChQYWlyPElCaW5kZXIsIEJ1bmRsZT4gY2FsbGJhY2sgOiBjYWxsYmFja0xpc3QpIHsKKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSBjYWxsYmFjay5maXJzdAorICAgICAgICAgICAgICAgICAgICAmJiBNZWRpYUJyb3dzZXJVdGlscy5hcmVTYW1lT3B0aW9ucyhvcHRpb25zLCBjYWxsYmFjay5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrTGlzdC5hZGQobmV3IFBhaXI8Pih0b2tlbiwgb3B0aW9ucykpOworICAgICAgICBjb25uZWN0aW9uLnN1YnNjcmlwdGlvbnMucHV0KGlkLCBjYWxsYmFja0xpc3QpOworICAgICAgICAvLyBzZW5kIHRoZSByZXN1bHRzCisgICAgICAgIHBlcmZvcm1Mb2FkQ2hpbGRyZW4oaWQsIGNvbm5lY3Rpb24sIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3Vic2NyaXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVTdWJzY3JpcHRpb24oU3RyaW5nIGlkLCBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24sIElCaW5kZXIgdG9rZW4pIHsKKyAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnN1YnNjcmlwdGlvbnMucmVtb3ZlKGlkKSAhPSBudWxsOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOworICAgICAgICBMaXN0PFBhaXI8SUJpbmRlciwgQnVuZGxlPj4gY2FsbGJhY2tMaXN0ID0gY29ubmVjdGlvbi5zdWJzY3JpcHRpb25zLmdldChpZCk7CisgICAgICAgIGlmIChjYWxsYmFja0xpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgSXRlcmF0b3I8UGFpcjxJQmluZGVyLCBCdW5kbGU+PiBpdGVyID0gY2FsbGJhY2tMaXN0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpeworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBpdGVyLm5leHQoKS5maXJzdCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tMaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zdWJzY3JpcHRpb25zLnJlbW92ZShpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBvbkxvYWRDaGlsZHJlbiBhbmQgdGhlbiBzZW5kIHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIGNvbm5lY3Rpb24uCisgICAgICogPHA+CisgICAgICogQ2FsbGVycyBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoaXMgY29ubmVjdGlvbiBpcyBzdGlsbCBjb25uZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1Mb2FkQ2hpbGRyZW4oZmluYWwgU3RyaW5nIHBhcmVudElkLCBmaW5hbCBDb25uZWN0aW9uUmVjb3JkIGNvbm5lY3Rpb24sCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBSZXN1bHQ8TGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPj4gcmVzdWx0CisgICAgICAgICAgICAgICAgPSBuZXcgUmVzdWx0PExpc3Q8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4+KHBhcmVudElkKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHZvaWQgb25SZXN1bHRTZW50KExpc3Q8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4gbGlzdCwgQFJlc3VsdEZsYWdzIGludCBmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbi5jYWxsYmFja3MuYXNCaW5kZXIoKSkgIT0gY29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOb3Qgc2VuZGluZyBvbkxvYWRDaGlsZHJlbiByZXN1bHQgZm9yIGNvbm5lY3Rpb24gdGhhdCBoYXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWVuIGRpc2Nvbm5lY3RlZC4gcGtnPSIgKyBjb25uZWN0aW9uLnBrZyArICIgaWQ9IiArIHBhcmVudElkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiBmaWx0ZXJlZExpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWcgJiBSRVNVTFRfRkxBR19PUFRJT05fTk9UX0hBTkRMRUQpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYXBwbHlPcHRpb25zKGxpc3QsIG9wdGlvbnMpIDogbGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVBhcmNlbGVkTGlzdFNsaWNlPE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0+IHBscyA9CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZExpc3QgPT0gbnVsbCA/IG51bGwgOiBuZXcgTWVkaWFQYXJjZWxlZExpc3RTbGljZTw+KGZpbHRlcmVkTGlzdCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jYWxsYmFja3Mub25Mb2FkQ2hpbGRyZW5XaXRoT3B0aW9ucyhwYXJlbnRJZCwgcGxzLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG90aGVyIHNpZGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY3Jhc2hpbmcuCisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbGxpbmcgb25Mb2FkQ2hpbGRyZW4oKSBmYWlsZWQgZm9yIGlkPSIgKyBwYXJlbnRJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWNrYWdlPSIgKyBjb25uZWN0aW9uLnBrZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1DdXJDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgb25Mb2FkQ2hpbGRyZW4ocGFyZW50SWQsIHJlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvbkxvYWRDaGlsZHJlbihwYXJlbnRJZCwgcmVzdWx0LCBvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VyQ29ubmVjdGlvbiA9IG51bGw7CisKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNEb25lKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uTG9hZENoaWxkcmVuIG11c3QgY2FsbCBkZXRhY2goKSBvciBzZW5kUmVzdWx0KCkiCisgICAgICAgICAgICAgICAgICAgICsgIiBiZWZvcmUgcmV0dXJuaW5nIGZvciBwYWNrYWdlPSIgKyBjb25uZWN0aW9uLnBrZyArICIgaWQ9IiArIHBhcmVudElkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiBhcHBseU9wdGlvbnMoTGlzdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiBsaXN0LAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbnMpIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaW50IHBhZ2UgPSBvcHRpb25zLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRSwgLTEpOworICAgICAgICBpbnQgcGFnZVNpemUgPSBvcHRpb25zLmdldEludChNZWRpYUJyb3dzZXIuRVhUUkFfUEFHRV9TSVpFLCAtMSk7CisgICAgICAgIGlmIChwYWdlID09IC0xICYmIHBhZ2VTaXplID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorICAgICAgICBpbnQgZnJvbUluZGV4ID0gcGFnZVNpemUgKiBwYWdlOworICAgICAgICBpbnQgdG9JbmRleCA9IGZyb21JbmRleCArIHBhZ2VTaXplOworICAgICAgICBpZiAocGFnZSA8IDAgfHwgcGFnZVNpemUgPCAxIHx8IGZyb21JbmRleCA+PSBsaXN0LnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvSW5kZXggPiBsaXN0LnNpemUoKSkgeworICAgICAgICAgICAgdG9JbmRleCA9IGxpc3Quc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0LnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUxvYWRJdGVtKFN0cmluZyBpdGVtSWQsIGZpbmFsIENvbm5lY3Rpb25SZWNvcmQgY29ubmVjdGlvbiwKKyAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIGZpbmFsIFJlc3VsdDxNZWRpYUJyb3dzZXIuTWVkaWFJdGVtPiByZXN1bHQgPQorICAgICAgICAgICAgICAgIG5ldyBSZXN1bHQ8TWVkaWFCcm93c2VyLk1lZGlhSXRlbT4oaXRlbUlkKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHZvaWQgb25SZXN1bHRTZW50KE1lZGlhQnJvd3Nlci5NZWRpYUl0ZW0gaXRlbSwgQFJlc3VsdEZsYWdzIGludCBmbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbi5jYWxsYmFja3MuYXNCaW5kZXIoKSkgIT0gY29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOb3Qgc2VuZGluZyBvbkxvYWRJdGVtIHJlc3VsdCBmb3IgY29ubmVjdGlvbiB0aGF0IGhhcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlZW4gZGlzY29ubmVjdGVkLiBwa2c9IiArIGNvbm5lY3Rpb24ucGtnICsgIiBpZD0iICsgaXRlbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoZmxhZyAmIFJFU1VMVF9GTEFHX09OX0xPQURfSVRFTV9OT1RfSU1QTEVNRU5URUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIuc2VuZChSRVNVTFRfRVJST1IsIG51bGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoS0VZX01FRElBX0lURU0sIGl0ZW0pOworICAgICAgICAgICAgICAgIHJlY2VpdmVyLnNlbmQoUkVTVUxUX09LLCBidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1DdXJDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgb25Mb2FkSXRlbShpdGVtSWQsIHJlc3VsdCk7CisgICAgICAgIG1DdXJDb25uZWN0aW9uID0gbnVsbDsKKworICAgICAgICBpZiAoIXJlc3VsdC5pc0RvbmUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib25Mb2FkSXRlbSBtdXN0IGNhbGwgZGV0YWNoKCkgb3Igc2VuZFJlc3VsdCgpIgorICAgICAgICAgICAgICAgICAgICArICIgYmVmb3JlIHJldHVybmluZyBmb3IgaWQ9IiArIGl0ZW1JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IHRoZSBicm93c2VyIHNlcnZpY2UgbmVlZHMgdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICogd2hlbiBmaXJzdCBjb25uZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCcm93c2VyUm9vdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJyb3dzZXIgc2VydmljZSBzaG91bGQgcmV0dXJuIGEKKyAgICAgICAgICogYnJvd3NlciByb290IGZvciByZWNlbnRseSBwbGF5ZWQgbWVkaWEgaXRlbXMuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPldoZW4gY3JlYXRpbmcgYSBtZWRpYSBicm93c2VyIGZvciBhIGdpdmVuIG1lZGlhIGJyb3dzZXIgc2VydmljZSwgdGhpcyBrZXkgY2FuIGJlCisgICAgICAgICAqIHN1cHBsaWVkIGFzIGEgcm9vdCBoaW50IGZvciByZXRyaWV2aW5nIG1lZGlhIGl0ZW1zIHRoYXQgYXJlIHJlY2VudGx5IHBsYXllZC4KKyAgICAgICAgICogSWYgdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZSBjYW4gcHJvdmlkZSBzdWNoIG1lZGlhIGl0ZW1zLCB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCByZXR1cm4KKyAgICAgICAgICogdGhlIGtleSBpbiB0aGUgcm9vdCBoaW50IHdoZW4ge0BsaW5rICNvbkdldFJvb3QoU3RyaW5nLCBpbnQsIEJ1bmRsZSl9IGlzIGNhbGxlZCBiYWNrLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGUgcm9vdCBoaW50IG1heSBjb250YWluIG11bHRpcGxlIGtleXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI0VYVFJBX09GRkxJTkUKKyAgICAgICAgICogQHNlZSAjRVhUUkFfU1VHR0VTVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9SRUNFTlQgPSAiYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLmV4dHJhLlJFQ0VOVCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsb29rdXAga2V5IGZvciBhIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJvd3NlciBzZXJ2aWNlIHNob3VsZCByZXR1cm4gYQorICAgICAgICAgKiBicm93c2VyIHJvb3QgZm9yIG9mZmxpbmUgbWVkaWEgaXRlbXMuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPldoZW4gY3JlYXRpbmcgYSBtZWRpYSBicm93c2VyIGZvciBhIGdpdmVuIG1lZGlhIGJyb3dzZXIgc2VydmljZSwgdGhpcyBrZXkgY2FuIGJlCisgICAgICAgICAqIHN1cHBsaWVkIGFzIGEgcm9vdCBoaW50IGZvciByZXRyaWV2aW5nIG1lZGlhIGl0ZW1zIHRoYXQgYXJlIGNhbiBiZSBwbGF5ZWQgd2l0aG91dCBhbgorICAgICAgICAgKiBpbnRlcm5ldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBJZiB0aGUgbWVkaWEgYnJvd3NlciBzZXJ2aWNlIGNhbiBwcm92aWRlIHN1Y2ggbWVkaWEgaXRlbXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHJldHVybgorICAgICAgICAgKiB0aGUga2V5IGluIHRoZSByb290IGhpbnQgd2hlbiB7QGxpbmsgI29uR2V0Um9vdChTdHJpbmcsIGludCwgQnVuZGxlKX0gaXMgY2FsbGVkIGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRoZSByb290IGhpbnQgbWF5IGNvbnRhaW4gbXVsdGlwbGUga2V5cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjRVhUUkFfUkVDRU5UCisgICAgICAgICAqIEBzZWUgI0VYVFJBX1NVR0dFU1RFRAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfT0ZGTElORSA9ICJhbmRyb2lkLnNlcnZpY2UubWVkaWEuZXh0cmEuT0ZGTElORSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsb29rdXAga2V5IGZvciBhIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJvd3NlciBzZXJ2aWNlIHNob3VsZCByZXR1cm4gYQorICAgICAgICAgKiBicm93c2VyIHJvb3QgZm9yIHN1Z2dlc3RlZCBtZWRpYSBpdGVtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+V2hlbiBjcmVhdGluZyBhIG1lZGlhIGJyb3dzZXIgZm9yIGEgZ2l2ZW4gbWVkaWEgYnJvd3NlciBzZXJ2aWNlLCB0aGlzIGtleSBjYW4gYmUKKyAgICAgICAgICogc3VwcGxpZWQgYXMgYSByb290IGhpbnQgZm9yIHJldHJpZXZpbmcgdGhlIG1lZGlhIGl0ZW1zIHN1Z2dlc3RlZCBieSB0aGUgbWVkaWEgYnJvd3NlcgorICAgICAgICAgKiBzZXJ2aWNlLiBUaGUgbGlzdCBvZiBtZWRpYSBpdGVtcyBwYXNzZWQgaW4ge0BsaW5rIGFuZHJvaWQubWVkaWEuYnJvd3NlLk1lZGlhQnJvd3Nlci5TdWJzY3JpcHRpb25DYWxsYmFjayNvbkNoaWxkcmVuTG9hZGVkKFN0cmluZywgTGlzdCl9CisgICAgICAgICAqIGlzIGNvbnNpZGVyZWQgb3JkZXJlZCBieSByZWxldmFuY2UsIGZpcnN0IGJlaW5nIHRoZSB0b3Agc3VnZ2VzdGlvbi4KKyAgICAgICAgICogSWYgdGhlIG1lZGlhIGJyb3dzZXIgc2VydmljZSBjYW4gcHJvdmlkZSBzdWNoIG1lZGlhIGl0ZW1zLCB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCByZXR1cm4KKyAgICAgICAgICogdGhlIGtleSBpbiB0aGUgcm9vdCBoaW50IHdoZW4ge0BsaW5rICNvbkdldFJvb3QoU3RyaW5nLCBpbnQsIEJ1bmRsZSl9IGlzIGNhbGxlZCBiYWNrLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGUgcm9vdCBoaW50IG1heSBjb250YWluIG11bHRpcGxlIGtleXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI0VYVFJBX1JFQ0VOVAorICAgICAgICAgKiBAc2VlICNFWFRSQV9PRkZMSU5FCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVUdHRVNURUQgPSAiYW5kcm9pZC5zZXJ2aWNlLm1lZGlhLmV4dHJhLlNVR0dFU1RFRCI7CisKKyAgICAgICAgZmluYWwgcHJpdmF0ZSBTdHJpbmcgbVJvb3RJZDsKKyAgICAgICAgZmluYWwgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIGJyb3dzZXIgcm9vdC4KKyAgICAgICAgICogQHBhcmFtIHJvb3RJZCBUaGUgcm9vdCBpZCBmb3IgYnJvd3NpbmcuCisgICAgICAgICAqIEBwYXJhbSBleHRyYXMgQW55IGV4dHJhcyBhYm91dCB0aGUgYnJvd3NlciBzZXJ2aWNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJyb3dzZXJSb290KEBOb25OdWxsIFN0cmluZyByb290SWQsIEBOdWxsYWJsZSBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAocm9vdElkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcm9vdCBpZCBpbiBCcm93c2VyUm9vdCBjYW5ub3QgYmUgbnVsbC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIG51bGwgZm9yIEJyb3dzZXJSb290IGluc3RlYWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSByb290IGlkIGZvciBicm93c2luZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdElkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBhbnkgZXh0cmFzIGFib3V0IHRoZSBicm93c2VyIHNlcnZpY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmY3MzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBLZWVwIGVudHJ5IHBvaW50IGZvciB1cGRhdGFibGUgSmF2YSBjbGFzc2VzCi0ta2VlcCBwdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgewotICAgcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSBpbml0aWFsaXplKGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmZDUxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjODI1Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZGRlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5Y2Q3NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5MmFkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3MDdlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMmQwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NWVlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFkMzQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZiNjVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU0ZjYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGZlYmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDMwNWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ZkZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM5ZGY3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMzNDRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTAzNDIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjNlNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBjMjVhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZkYjljMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NmMxMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2JmNDg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTExYjVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRlZDUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y3ZTBjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU1OGE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGExYTg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlhZWQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA2OGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M3NzdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA4Nzk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDJjOWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDJhYjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NmVhNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3OTBjNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDFkYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGQ1ODYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmI3NzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYzk4NDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjYxN2UxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWZlZjNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEwMDQ3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNWQ2YTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxMzQzMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODk5Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3OGUwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MmZjNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ODRlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwYWM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyMTA0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzA2Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyZDQ5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM5MzM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM1YTZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjYzM2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTE4MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2YTUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNWRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU0ZWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3MjRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2I0MTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMThhYmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MTEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYjE5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiYTNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM0ZDViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTU3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDM4NGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNjI5Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhYjY4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU3Zjc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzY2EzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWVjZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGQwYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYmUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0ZjFiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE4YjQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGMyYzAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmFlNDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGMyODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmOTMyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMWY2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZmYWZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJiZDg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2ExZjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzEwNjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYjgwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYmEwMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdmMmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY1NDc4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTVhZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGI3ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmU1NzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNWQ2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGZhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ZmUwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM0OGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFlOTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDIxOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzBmYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMmYyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg3MWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3ZjYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDFiMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmI2OTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlMTAxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzNTJjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzMmU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZiYTMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTNiNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGJiMjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1NzBmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNDAzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ0YmZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q2MDQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGQ1NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmM0OGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkOGY4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiOTBlNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzIzNGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q0NTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWNmNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDA4YjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYjNmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZThiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBmYzA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmExNmFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTk4Y2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NmQxNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MDQ1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZGIxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM4MjhhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNjYzczLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGNlZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDFiOWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMWRkMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNzhlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MyY2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M1YmVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWQwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTU5MjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4N2UyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwNmRiOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDIyNWJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY5N2RlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2VjMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODQwYmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NWUzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzN2M2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkYzEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NjE3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMzA3NzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWQ3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzhkNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MDM0OWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjdjNDYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmNlYmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEzMmE3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2MmNhMzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxMzEyNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMWUxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1ZTg3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiNDQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhN2UwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MzUzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NWMzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhM2JhNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVjYTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMxODNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY2YjM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVhOGZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWIxMzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTJiNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MGFhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZWZlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBjYzMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlNmZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODE2YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDI5MzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNWI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYTBmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzJhNjU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRlYmMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTc4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2Y5OTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmYWQ5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDhkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBmZDVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiNWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTFlZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzEwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxYzA4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE2YjMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU4ZmUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yjg0MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjQwNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjMThjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NzUzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI5MWIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFjNjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDRhNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTBhNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiMWYzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NTFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg2NjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI4MTgzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTNmMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWUxNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODM5MTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzNjYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NDRjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjM3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkMWRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU3MTA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjU5NmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2OGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMGRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUzOWU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjMTVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWViYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOTFjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNjZmOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVhMzRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJkZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWFhMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGJjYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmZmEwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmN2U1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFjNGRjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmE4NmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDEwOTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTZmMGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MDAxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MTU4MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk2MjA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY5NTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTFiZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZThmMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMmU5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWQyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBkNTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzYxYWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTNmODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDE2NmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlNTI3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMmE4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM3YWY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YzMWVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDlmNTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGViNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMGUxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MjVlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2ZTE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJmMWVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZmRjZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTliODE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWU0NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWNhODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjNzVkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiZDI3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJiMGFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxNGFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2ZlNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjJjMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjIxMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTdlM2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYwMWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkyOGQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmZDc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTcxYThjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhjYjZjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM4ODYzZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzMzUwMzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmE0ODU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2E2Nzg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOTVkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTcyODIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YwZjUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhODBkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzM5MzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjAyNTM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMjhmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDI3N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY1YmZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNWQ2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjRhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMwNjQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5MzI0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjE4ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNGU1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVmMDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVjNzU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1YzdmYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjg3ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdkMGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmYTcyYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTBlZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQ0MzU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NzdjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjdmMGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIxOWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1OTIxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yjc2YjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTk1MjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczMWE2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08bGF5ZXItbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9iYWNrZ3JvdW5kIj4KLSAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiMyNjAwMDAwMCIgLz4KLSAgICAgICAgPC9zaGFwZT4KLSAgICA8L2l0ZW0+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvc2Vjb25kYXJ5UHJvZ3Jlc3MiPgotICAgICAgICA8Y2xpcD4KLSAgICAgICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KLSAgICAgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzVDZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9wcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLTwvbGF5ZXItbGlzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzU5NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJvdmFsIiA+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgPHNpemUKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIgotICAgICAgICBhbmRyb2lkOndpZHRoPSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWY3MWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yMCwxMUg3LjgzbDUuNTksLTUuNTlMMTIsNGwtOCw4IDgsOCAxLjQxLC0xLjQxTDcuODMsMTNIMjB2LTJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjI4ZTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDEyaC0ydjNoLTN2Mmg1di01ek03LDloM0wxMCw3TDUsN3Y1aDJMNyw5ek0yMSwzTDMsM2MtMS4xLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC45LDIgMiwyaDE4YzEuMSwwIDIsLTAuOSAyLC0yTDIzLDVjMCwtMS4xIC0wLjksLTIgLTIsLTJ6TTIxLDE5LjAxTDMsMTkuMDFMMyw0Ljk5aDE4djE0LjAyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzEyYjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwzdjkuMjhjLTAuNDcsLTAuMTcgLTAuOTcsLTAuMjggLTEuNSwtMC4yOEM4LjAxLDEyIDYsMTQuMDEgNiwxNi41UzguMDEsMjEgMTAuNSwyMWMyLjMxLDAgNC4yLC0xLjc1IDQuNDUsLTRIMTVWNmg0VjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjcyMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2ZDE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNS40MSw3LjQxTDE0LDZsLTYsNiA2LDYgMS40MSwtMS40MUwxMC44MywxMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTAsNkw4LjU5LDcuNDEgMTMuMTcsMTJsLTQuNTgsNC41OUwxMCwxOGw2LC02eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWU2NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI1MTJkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iNTEyZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSI1MTIiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iNTEyIj4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNjE2MTYxIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNIDAgMCBIIDUxMiBWIDUxMiBIIDAgViAwIFoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM1MjUyNTIiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNTYsMTUxdjEyMy4xNGMtNi44OC00LjAyLTE0LjgyLTYuNDgtMjMuMzMtNi40OCBjLTI1Ljc4LDAtNDYuNjcsMjAuODgtNDYuNjcsNDYuNjdjMCwyNS43OCwyMC44OCw0Ni42Nyw0Ni42Nyw0Ni42N3M0Ni42Ny0yMC44OCw0Ni42Ny00Ni42N1YxOTcuNjdIMzI2VjE1MUgyNTZ6IiAvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZGYxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxncm91cD4KLSAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMjQsMjRIMFYwaDI0djI0eiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOS42IDEzLjVoLjRjLjIgMCAuNCwtLjEuNSwtLjJzLjIsLS4yLjIsLS40di0uMnMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNXMtLjEuMSwtLjIuMSwtLjEuMSwtLjEuMnYuMmgtMWMwLC0uMiAwLC0uMy4xLC0uNXMuMiwtLjMuMywtLjQuMywtLjIuNCwtLjIuNCwtLjEuNSwtLjFjLjIgMCAuNCAwIC42LjFzLjMuMS41LjIuMi4yLjMuNC4xLjMuMS41di4zcy0uMS4yLC0uMS4zLC0uMS4yLC0uMi4yLC0uMi4xLC0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQsLS4xLjVzLS4yLjMsLS4zLjQsLS4zLjIsLS41LjIsLS40LjEsLS42LjFjLS4yIDAsLS40IDAsLS41LC0uMXMtLjMsLS4xLC0uNSwtLjIsLS4yLC0uMiwtLjMsLS40LC0uMSwtLjQsLS4xLC0uNmguOHYuMnMuMS4xLjEuMi4xLjEuMi4xaC41cy4xLC0uMS4yLC0uMS4xLC0uMS4xLC0uMnYtLjVzLS4xLC0uMSwtLjEsLS4yLC0uMSwtLjEsLS4yLC0uMWgtLjZ2LS43em01LjcuN2MwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6TTQgMTNjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04aC0yYzAgMy4zLC0yLjcgNiwtNiA2cy02LC0yLjcsLTYsLTYgMi43LC02IDYsLTZ2NGw1LC01LC01LC01djRjLTQuNCAwLC04IDMuNiwtOCA4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjZiYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTcsMTRMNSwxNHY1aDV2LTJMNywxN3YtM3pNNSwxMGgyTDcsN2gzTDEwLDVMNSw1djV6TTE3LDE3aC0zdjJoNXYtNWgtMnYzek0xNCw1djJoM3YzaDJMMTksNWgtNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMDRlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNSwxNmgzdjNoMnYtNUw1LDE0djJ6TTgsOEw1LDh2Mmg1TDEwLDVMOCw1djN6TTE0LDE5aDJ2LTNoM3YtMmgtNXY1ek0xNiw4TDE2LDVoLTJ2NWg1TDE5LDhoLTN6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxZDc1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMQotMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45IC45MiBDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMSAuNDUgLTIuMQotMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2IC41OSAtLjg2IC41OSAtMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEKLTEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmUyMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjM0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjM0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkgNEg1Yy0xLjExIDAtMiAwLjktMiAydjEyYzAgMS4xIDAuODkgMiAyIDJoMTRjMS4xIDAgMi0wLjkgMi0yVjZjMC0xLjEtMC45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgMC41NS0wLjQ1IDEtMSAxaC0wLjc1djEuNWgtMS41VjE1SDE0Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXY0em0tMy41LTAuNWgydi0zaC0ydjN6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FmNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwxOUg1VjVoN1YzSDVjLTEuMTEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjg5LDIgMiwyaDE0YzEuMSwwIDIsLTAuOSAyLC0ydi03aC0ydjd6TTE0LDN2MmgzLjU5bC05LjgzLDkuODMgMS40MSwxLjQxTDE5LDYuNDFWMTBoMlYzaC03eiIvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGFhZWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3YyLjIxbDIuNDUsMi40NWMwLjAzLC0wLjIgMC4wNSwtMC40MSAwLjA1LC0wLjYzek0xOSwxMmMwLDAuOTQgLTAuMiwxLjgyIC0wLjU0LDIuNjRsMS41MSwxLjUxQzIwLjYzLDE0LjkxIDIxLDEzLjUgMjEsMTJjMCwtNC4yOCAtMi45OSwtNy44NiAtNywtOC43N3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxek00LjI3LDNMMyw0LjI3IDcuNzMsOUwzLDl2Nmg0bDUsNXYtNi43M2w0LjI1LDQuMjVjLTAuNjcsMC41MiAtMS40MiwwLjkzIC0yLjI1LDEuMTh2Mi4wNmMxLjM4LC0wLjMxIDIuNjMsLTAuOTUgMy42OSwtMS44MUwxOS43MywyMSAyMSwxOS43M2wtOSwtOUw0LjI3LDN6TTEyLDRMOS45MSw2LjA5IDEyLDguMThMMTIsNHoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JlMjI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIgMiw2LjQ4IDIsMTJzNC40OCwxMCAxMCwxMCAxMCwtNC40OCAxMCwtMTBTMTcuNTIsMiAxMiwyek0xMSwxNkw5LDE2TDksOGgydjh6TTE1LDE2aC0yTDEzLDhoMnY4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM5ZGVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTEwLDE2LjV2LTlsNiw0LjUgLTYsNC41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2ZDVkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJldmVuT2RkIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIsMiw2LjQ4LDIsMTJjMCw1LjUyLDQuNDgsMTAsMTAsMTBjNS41MiwwLDEwLTQuNDgsMTAtMTAKLUMyMiw2LjQ4LDE3LjUyLDIsMTIsMnoKLU0xOCwxMmMwLDMuMzEtMi42OSw2LTYsNmMtMy4zMSwwLTYtMi42OS02LTZoMmMwLDIuMjEsMS43OSw0LDQsNHM0LTEuNzksNC00cy0xLjc5LTQtNC00djNMOCw3bDQtNHYzCi1DMTUuMzEsNiwxOCw4LjY5LDE4LDEyeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ODZiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LC02IDYsLTYsLTIuNywtNiwtNkg0YzAgNC40IDMuNiA4IDggOHM4LC0zLjYgOCwtOCwtMy42LC04LC04LC04em0tMS4xIDExSDEwdi0zLjNMOSAxM3YtLjdsMS44LC0uNmguMVYxNnptNC4zLC0xLjhjMCAuMyAwIC42LC0uMS44bC0uMy42cy0uMy4zLC0uNS4zLC0uNC4xLC0uNi4xLC0uNCAwLC0uNiwtLjEsLS4zLC0uMiwtLjUsLS4zLC0uMiwtLjMsLS4zLC0uNiwtLjEsLS41LC0uMSwtLjh2LS43YzAsLS4zIDAsLS42LjEsLS44bC4zLC0uNnMuMywtLjMuNSwtLjMuNCwtLjEuNiwtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOSwtLjh2LS41cy0uMSwtLjIsLS4xLC0uMywtLjEsLS4xLC0uMiwtLjIsLS4yLC0uMSwtLjMsLS4xLC0uMiAwLC0uMy4xbC0uMi4ycy0uMS4yLC0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMywtLjFsLjIsLS4ycy4xLC0uMi4xLC0uM3YtMS41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWNiNmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwzSDVDMy44OSwzLDMsMy45LDMsNXYxNGMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY1QzIxLDMuOSwyMC4xLDMsMTksM3oKLU0xMyw5aDRjMC41NSwwLDEsMC40NSwxLDF2NCBjMCwwLjU1LTAuNDUsMS0xLDFoLTRWOXoKLU05LjUsMTMuNXYtMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMVYxMGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxdjFIOS41di0wLjVoLTJ2MUgxMAotYzAuNTUsMCwxLDAuNDUsMSwxVjE0YzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi0xaDEuNXYwLjVIOS41egotTTE0LjUsMTMuNWgydi0zaC0yVjEzLjV6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZWNjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS40MywxMi45OGMwLjA0LC0wLjMyIDAuMDcsLTAuNjQgMC4wNywtMC45OHMtMC4wMywtMC42NiAtMC4wNywtMC45OGwyLjExLC0xLjY1YzAuMTksLTAuMTUgMC4yNCwtMC40MiAwLjEyLC0wLjY0bC0yLC0zLjQ2Yy0wLjEyLC0wLjIyIC0wLjM5LC0wLjMgLTAuNjEsLTAuMjJsLTIuNDksMWMtMC41MiwtMC40IC0xLjA4LC0wLjczIC0xLjY5LC0wLjk4bC0wLjM4LC0yLjY1QzE0LjQ2LDIuMTggMTQuMjUsMiAxNCwyaC00Yy0wLjI1LDAgLTAuNDYsMC4xOCAtMC40OSwwLjQybC0wLjM4LDIuNjVjLTAuNjEsMC4yNSAtMS4xNywwLjU5IC0xLjY5LDAuOThsLTIuNDksLTFjLTAuMjMsLTAuMDkgLTAuNDksMCAtMC42MSwwLjIybC0yLDMuNDZjLTAuMTMsMC4yMiAtMC4wNywwLjQ5IDAuMTIsMC42NGwyLjExLDEuNjVjLTAuMDQsMC4zMiAtMC4wNywwLjY1IC0wLjA3LDAuOThzMC4wMywwLjY2IDAuMDcsMC45OGwtMi4xMSwxLjY1Yy0wLjE5LDAuMTUgLTAuMjQsMC40MiAtMC4xMiwwLjY0bDIsMy40NmMwLjEyLDAuMjIgMC4zOSwwLjMgMC42MSwwLjIybDIuNDksLTFjMC41MiwwLjQgMS4wOCwwLjczIDEuNjksMC45OGwwLjM4LDIuNjVjMC4wMywwLjI0IDAuMjQsMC40MiAwLjQ5LDAuNDJoNGMwLjI1LDAgMC40NiwtMC4xOCAwLjQ5LC0wLjQybDAuMzgsLTIuNjVjMC42MSwtMC4yNSAxLjE3LC0wLjU5IDEuNjksLTAuOThsMi40OSwxYzAuMjMsMC4wOSAwLjQ5LDAgMC42MSwtMC4yMmwyLC0zLjQ2YzAuMTIsLTAuMjIgMC4wNywtMC40OSAtMC4xMiwtMC42NGwtMi4xMSwtMS42NXpNMTIsMTUuNWMtMS45MywwIC0zLjUsLTEuNTcgLTMuNSwtMy41czEuNTcsLTMuNSAzLjUsLTMuNSAzLjUsMS41NyAzLjUsMy41IC0xLjU3LDMuNSAtMy41LDMuNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMjgxMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiwxOGw4LjUsLTZMNiw2djEyek0xNiw2djEyaDJWNmgtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRhMzE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiw2aDJ2MTJMNiwxOHpNOS41LDEybDguNSw2TDE4LDZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTcyN2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS41LDUuNXYxM2gtMTV2LTEzSDE5LjV6IE0xOSw0SDVDMy44OSw0LDMsNC45LDMsNnYxMmMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY2QzIxLDQuOSwyMC4xLDQsMTksNEwxOSw0eiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTExLDExSDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTgsMTFoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAsMC41NS0wLjQ1LDEtMSwxaC0zYy0wLjU1LDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxVjExeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTFjMDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDdIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCAwLjU1LTAuNDUgMS0xIDFIN2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXptNyAwaC0xLjV2LTAuNWgtMnYzaDJWMTNIMTh2MWMwIDAuNTUtMC40NSAxLTEgMWgtM2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmIyYjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTMsOXY2aDRsNSw1TDEyLDRMNyw5TDMsOXpNMTYuNSwxMmMwLC0xLjc3IC0xLjAyLC0zLjI5IC0yLjUsLTQuMDN2OC4wNWMxLjQ4LC0wLjczIDIuNSwtMi4yNSAyLjUsLTQuMDJ6TTE0LDMuMjN2Mi4wNmMyLjg5LDAuODYgNSwzLjU0IDUsNi43MXMtMi4xMSw1Ljg1IC01LDYuNzF2Mi4wNmM0LjAxLC0wLjkxIDcsLTQuNDkgNywtOC43N3MtMi45OSwtNy44NiAtNywtOC43N3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwZmYxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM3ZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWY3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjQxNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxZGZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyayIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2Q4NGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodCIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhjOGM3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUwZTBmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci0KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjN2VjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgaXMgdGhlIGNvcHkgb2YgQGRyYXdhYmxlL2FiY19kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrIGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2RhcmsiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjIzNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0IGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2xpZ2h0IiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjcyYmM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNmZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMThhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxZjAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0NWEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI3YTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMDhhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzZjZTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNGZkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWRiYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfYXVkaW90cmFja19saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmExNzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMC40IgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJmMjk4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgotICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGQzNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC41IgotICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiIC8+Ci0KLSAgICA8VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1Ii8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NmRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDdhNzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNTk1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSI+Ci0KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wcmV2IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmZ3ZCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTcwNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0IzMDBGRjAwIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX2ltYWdlIgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfdGV4dCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMWJiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZWE1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTI4ZDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2NoZWNrIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNDc4NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NThmMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2JhciIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhciI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkJhY2siLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNXNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfcmlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9leHRlcm5hbF9saW5rIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTBzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2xhdW5jaCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkxhdW5jaCIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8dmlldyBjbGFzcz0iY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nhc3QiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24iIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPC9SZWxhdGl2ZUxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jZW50ZXJfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9taW5pbWFsX2V4dHJhX3ZpZXciCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCi0gICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiPgotCi0gICAgICAgIDxTZWVrQmFyCi0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tY3YyX3NlZWtfYmFyX2Rlc2MiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjEwZHAiLz4KLQotICAgICAgICA8VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc19idWZmZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9idWZmZXJfdmlld19oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIwZHAiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2JhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0NGRwIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ib3R0b21fYmFyX2JhY2tncm91bmQiPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIj4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9za2lwX3RpbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JvdHRvbV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiA+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9jdXJyZW50IgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuQ3VycmVudCIvPgotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2ludGVycHVuY3QiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5JbnRlcnB1bmN0Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfZW5kIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuRW5kIi8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50RW5kPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhc2ljX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotCi0gICAgICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfcmVtYWluaW5nIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXRlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5NdXRlIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkNDIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Z1bGxzY3JlZW4iCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19yaWdodCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCIvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4dHJhX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotCi0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2N1c3RvbV9idXR0b25zIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZGVvX3F1YWxpdHkiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLlZpZGVvUXVhbGl0eSIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5ncyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uU2V0dGluZ3MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3ZlcmZsb3dfbGVmdCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjODBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL01pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OWUxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfdGl0bGUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfbGlzdCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVyPSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiIC8+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI5MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tcl9jaG9vc2VyX3NlYXJjaGluZyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgICAgICA8UHJvZ3Jlc3NCYXIgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRwIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmluZGV0ZXJtaW5hdGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlSG9yaXpvbnRhbCIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg4NzliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI1NmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiID4KLQotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2ljb24iCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIyNGRwIiAvPgotCi0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMWRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2Rlc2MiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDQ0NzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZXhwYW5kYWJsZV9hcmVhIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGlhbG9nX2FyZWEiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRGbG9hdGluZyI+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl90aXRsZV9iYXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjcyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgLz4KLSAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2Nsb3NlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jdXN0b21fY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kZWZhdWx0X2NvbnRyb2wiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvclByaW1hcnkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX21lZGlhX21haW5fY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPgotICAgICAgICAgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfcGxheWJhY2tfY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIgPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfcGxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfZGl2aWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmNlIGRpYWxvZydzIHRvcCBsYXlvdXQgbXJfZXhwYW5kYWJsZV9hcmVhIGlzIGNsaWNrYWJsZSwgaXQgcHJvcGFnYXRlcyBwcmVzc2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGl0cyBub24tY2xpY2thYmxlIGNoaWxkcmVuLiBTcGVjaWZ5IGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIiB0byBwcmV2ZW50IHZvbHVtZSBzbGlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBoYXZpbmcgZmFsc2UgcHJlc3NlZCBzdGF0ZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9ncm91cF9leHBhbmRfY29sbGFwc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9ncm91cF9saXN0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclN0eWxlPSJvdXRzaWRlT3ZlcmxheSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0ZyYW1lTGF5b3V0PgotICAgICAgICA8U2Nyb2xsVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25QYW5lbCIKLSAgICAgICAgICAgIHN0eWxlPSI/YXR0ci9idXR0b25CYXJTdHlsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxJbmRpY2F0b3JzPSJ0b3B8Ym90dG9tIj4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZHAiPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmV1dHJhbEJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmVnYXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjEiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhclBvc2l0aXZlQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICA8L2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0PgotICAgICAgICA8L1Njcm9sbFZpZXc+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5MDU4Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC92b2x1bWVfaXRlbV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2MGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9pdGVtX2ljb24iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgLz4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMwNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOmRpdmlkZXI9IkBudWxsIgotICAgIGFuZHJvaWQ6ZGl2aWRlckhlaWdodD0iMGRwIj4KLTwvTGlzdFZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWZjNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxncmFkaWVudAotICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiCi0gICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfZW5kIgotICAgICAgICBhbmRyb2lkOmFuZ2xlPSItMjcwIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzIzMGFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN0ZWxzZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVG9lc3RlbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbm9wcGllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVWl0c2FhaS1rbm9wcGllLiBPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlVpdHNhYWkta25vcHBpZS4gS29wcGVsIHRhbnMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVWl0c2FhaS1rbm9wcGllLiBHZWtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWFpIHVpdCBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlZpbmQgdGFucyB0b2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT250a29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSG91IG9wIHVpdHNhYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1hYWsgdG9lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BlZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkxhYXQgd2FnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlZvdSB1aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlZvdSBpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVta3Vuc3dlcmsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lZ2x5ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgaXMgZ2VraWVzIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmxpZ3RpbmcgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNhYWkgdGFucyBza2VybSB1aXQiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Yi14Yit4YuT4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGImOGIo+GIquGLq+GLjuGJvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGLqENhc3Qg4Yqg4Yud4Yir4YitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCDhiqDhi53hiKvhiK3hjaIg4YyN4YqV4YqZ4YqQ4Ym1IOGJsOGJi+GIreGMp+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDhiqDhi53hiKvhiK0g4Ymg4Yib4YyI4YqT4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhibDhjIjhipPhip3hibfhiI0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCDhiqDhi7XhiK3hjI0g4YuI4YuwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YiY4Yij4Yiq4Yur4YuO4Ym94YqVIOGJoOGIm+GMjeGKmOGJtSDhiIvhi60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YyN4YqV4YqZ4YqQ4Ym1IOGKoOGJi+GIreGMpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkNhc3Qg4Yib4Yu14Yio4YyNIOGKoOGJgeGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Yud4YyLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Yqg4Yyr4YuN4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhiIjhiqDhjY3hibMg4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Yqg4Yi14Y2LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhiLDhiaXhiLXhiaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhi6jhiqDhiI3hiaDhiJ0g4Yi14YqQLeGMpeGJoOGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhibDhipXhiLjhiKvhibPhib0g4Yuo4Yu14Yid4Y2FIOGImOGJhuGMo+GMoOGIquGLqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Yid4YqV4YidIOGIm+GIheGLsOGIqOGImOGIqOGMgyDhiqDhiI3hibDhiJjhiKjhjKDhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGIneGKleGInSDhiJjhiKjhjIMg4Yqg4Yut4YyI4Yqd4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhiJvhi6sg4YyI4Yy94YqVIOGJoOGImOGLjeGIsOGLtSDhiIvhi60iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmI5N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2KfZhNmG2LjYp9mFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itin2YTYo9is2YfYstipIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYstixINin2YTYpdix2LPYp9mELiDYrNin2LHZjSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itil2LHYs9in2YQg2KXZhNmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KzYp9ix2Y0g2KfZhNio2K3YqyDYudmGINij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KXZitmC2KfZgSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KXYutmE2KfZgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itiq2LTYutmK2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Itil2YrZgtin2YEg2YXYpNmC2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYpdmK2YLYp9mBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KrZiNiz2YrYuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2KrYtdi62YrYsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti12YjYsdipINin2YTYo9mE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iti02LHZiti3INiq2YXYsdmK2LEg2YXYs9iq2YjZiSDYp9mE2LXZiNiqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLZhNmFINmK2KrZhSDYp9iu2KrZitin2LEg2KPZiiDZiNiz2KfYpti3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLZhNinINiq2KrZiNmB2LEg2KPZiiDZhdi52YTZiNmF2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2KzYp9ix2Y0g2KXYsdiz2KfZhCDYp9mE2LTYp9i02KkiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzYwYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFtIGTDvHltyZlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbSBkw7x5bcmZc2kuIEJhxJ9sYW50xLEga8mZc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bGR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkJ1cmEgeWF5xLFtbGF5xLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYXh0YXLEsWzEsXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsW7EsSBryZlzaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW3EsSBkYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlFhcGFkxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmR1cnVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGF5YW5kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbMmZbmRpcmluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZxLHEn2NhbWxhxZ9kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gaW5jyZlzyZluyZl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTyZlzIGjJmXJtaSBkaXlpcmPJmXlpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIZcOnIGJpciBtZWRpYSBzZcOnaWxtyZl5aWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IsaPbMOnYXRhbiBtyZlsdW1hdCB5b3hkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbWxhbsSxciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjViZDZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSBQcmViYWNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgUHJlYmFjaS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIFByZWJhY2kuIFBvdmV6dWplIHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIFByZWJhY2kuIFBvdmV6YW4gamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlYmFjdWogbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJQcm9uYWxhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1c3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW1hIGl6YWJyYW5paCBtZWRpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pc3UgZG9zdHVwbmUgbmlrYWt2ZSBpbmZvcm1hY2lqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlYmFjdWplIHNlIGVrcmFuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM5MWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0ZbRgdGC0Y3QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCf0YDRi9C70LDQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQkNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0IbQtNC30LUg0L/QsNC00LrQu9GO0YfRjdC90L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCf0LDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GW0YDQsNCy0LDRhtGMINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0YjRg9C6INC/0YDRi9C70LDQtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC00LvRg9GH0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9GL0L3RltGG0Ywg0YLRgNCw0L3RgdC70Y/RhtGL0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/RgNCw0LnQs9GA0LDRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0YvQv9GL0L3RltGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQl9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JLQvtC60LvQsNC00LrQsCDQsNC70YzQsdC+0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9Cw0Z7Qt9GD0L3QvtC6INCz0YPRh9C90LDRgdGG0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGL0Y/RhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQhtC90YTQsNGA0LzQsNGG0YvRjyDQsNC00YHRg9GC0L3RltGH0LDQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvSDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTJkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQktGA0YrQt9C60LDRgtCwINC1INC/0YDQtdC60YDQsNGC0LXQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQodCy0YrRgNC30LLQsCDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCj0YHRgtCw0L3QvtCy0LXQvdCwINC1INCy0YDRitC30LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQtNCw0LLQsNC90LUg0LrRitC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLRitGA0YHRj9GCINGB0LUg0YPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrRgNCw0YLRj9Cy0LDQvdC1INC90LAg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/QuNGA0LDQvdC1INC90LAg0L/RgNC10LTQsNCy0LDQvdC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQsNGA0Y/QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0LrQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0L7RgdGC0LDQstGP0L3QtSDQvdCwINC/0LDRg9C30LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0LjRgNCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0YrQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC40LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LvQvtC20LrQsCDQvdCwINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C70YrQt9Cz0LDRhyDQt9CwINGB0LjQu9Cw0YLQsCDQvdCwINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0Y/QvNCwINC40LfQsdGA0LDQvdCwINC80YPQu9GC0LjQvNC10LTQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndGP0LzQsCDQvdCw0LvQuNGH0L3QsCDQuNC90YTQvtGA0LzQsNGG0LjRjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdGK0YIg0YHQtSDQv9GA0LXQtNCw0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNTkzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgprjgpr/gprjgp43gpp/gp4fgpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4Kas4Ka/4Kaa4KeN4Kab4Ka/4Kao4KeN4KaoIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeL4KaXIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeB4KaV4KeN4KakIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpo/gpqTgp4cg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCmoeCmv+CmreCmvuCmh+CmuOCml+CngeCmsuCmv+CmleCnhyDgppbgp4vgpoHgppzgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kaa4Ka+4Kay4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpqzgpr/gprDgpr7gpq4g4Kam4Ka/4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kal4Ka+4Kau4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kas4Kah4Ka8IOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Ka44KaZ4KeN4KaV4KeB4Kaa4Ka/4KakIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCmheCnjeCmr+CmvuCmsuCmrOCmvuCmriDgprbgp4jgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kat4Kay4Ka/4KaJ4KauIOCmuOCnjeCmsuCmvuCmh+CmoeCmvuCmsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KaV4KeL4Kao4KeLIOCmruCmv+CmoeCmv+Cmr+CmvOCmviDgpqjgpr/gprDgp43gpqzgpr7gpprgpqgg4KaV4Kaw4Ka+IOCmueCmr+CmvOCmqOCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KaV4KeL4Kao4KeLIOCmpOCmpeCnjeCmryDgpongpqrgprLgpqzgp43gpqcg4Kao4KeH4KaHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgprjgp43gppXgp43gprDgp4Dgpqgg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWM3NDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgemEgZW1pdGlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3ZlemFubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZWRhbiBtZWRpaiBuaWplIG9kYWJyYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbWEgZG9zdHVwbmloIGluZm9ybWFjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODVhY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzIGRcJ2VtZXRyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzIEVtZXQuIERlc2Nvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzIEVtZXQuIFNcJ2VzdMOgIGNvbm5lY3RhbnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzIEVtZXQuIENvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1ldCBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU1wnZXN0YW4gY2VyY2FudCBkaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25uZWN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkF0dXJhIGxcJ2VtaXNzacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUYW5jYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVlaXgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvc2EgZW4gcGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdHVyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkRlc3BsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXBsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hdGdlIGRlIGxcJ8OgbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGxsaXNjYW50IGRlIHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzXCdoYSBzZWxlY2Npb25hdCBjYXAgZml0eGVyIG11bHRpbcOoZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoaSBoYSBpbmZvcm1hY2nDsyBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWlzc2nDsyBkZSBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhODkyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphxZnDrXplbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gT2Rwb2plbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qb3bDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gUMWZaXBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJPZGVzw61sYXQgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIbGVkw6Fuw60gemHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2Rwb2ppdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3Rhdml0IG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2xZnDrXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQxZllaHLDoXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvemJhbGl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYmFsIGFsYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zdXZuw61rIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lYnlsYSB2eWJyw6FuYSDFvsOhZG7DoSBtw6lkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lanNvdSBrwqBkaXNwb3ppY2kgxb7DoWRuw6kgaW5mb3JtYWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJPZGVzw61sw6Fuw60gb2JzYWh1IG9icmF6b3ZreSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3YTc5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcC4gRm9yYmluZGVsc2VuIGVyIGFmYnJ1ZHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcC4gT3ByZXR0ZXIgZm9yYmluZGVsc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwLiBUaWxzbHV0dGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGVyIGVuaGVkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZicnlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBtZWQgYXQgY2FzdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU8OmdCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iTHlkc3R5cmtlc2t5ZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJJbmdlbiBtZWRpZXIgZXIgbWFya2VyZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRlciBlciBpbmdlbiB0aWxnw6ZuZ2VsaWdlIG9wbHlzbmluZ2VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa8Omcm1lbiBjYXN0ZXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmY1N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdlcsOkdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LVN5bWJvbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBOaWNodCB2ZXJidW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBWZXJiaW5kdW5nIHdpcmQgaGVyZ2VzdGVsbHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdHJlYW1lbiBhdWYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHZXLDpHRlIHdlcmRlbiBnZXN1Y2h0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJWZXJiaW5kdW5nIHRyZW5uZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdHJlYW1pbmcgYmVlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2NobGllw59lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IldpZWRlcmdlYmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzaWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTWF4aW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWluaW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtY292ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2NoaWViZXJlZ2xlciBmw7xyIGRpZSBMYXV0c3TDpHJrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iS2VpbmUgTWVkaWVuIGF1c2dld8OkaGx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLZWluZSBJbmZvcm1hdGlvbmVuIHZlcmbDvGdiYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkJpbGRzY2hpcm0gd2lyZCBnZXN0cmVhbXQuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmNjliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Is6jz43Pg8+EzrfOvM6xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Is6jz4XPg866zrXPhc6tz4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLOms6/z4XOvM+Azq8gQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863z4IuIM6Rz4DOv8+Dz4XOvc60zq3OuM63zrrOtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrcuIM6jz43Ovc60zrXPg863IM+DzrUgzrXOvs6tzrvOuc6+zrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzqPPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Is6czrXPhM6szrTOv8+Dzrcgz4POtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Is6Vz43Pgc61z4POtyDPg8+Fz4POus61z4XPjs69Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Is6Rz4DOv8+Dz43Ovc60zrXPg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4izpTOuc6xzrrOv8+Azq4gzrzOtc+EzqzOtM6/z4POt8+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLOms67zrXOr8+DzrnOvM6/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4izpHOvc6xz4DOsc+BzrHOs8+JzrPOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4izqDOsc+Nz4POtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Is6UzrnOsc66zr/PgM6uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4izpHOvc6sz4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4izqPPjc68z4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Is6Vzr7Pjs+Gz4XOu867zr8gzqzOu868z4DOv8+FzrwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4izqHPhc64zrzOuc+Dz4TOuc66z4wgzq3Ovc+EzrHPg863z4Igzq7Ph86/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Is6UzrXOvSDOrc+Hzr/Phc69IM61z4DOuc67zrXOs861zq8gzrzOrc+DzrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Is6UzrXOvSDPhc+AzqzPgc+Hzr/Phc69IM60zrnOsc64zq3Pg865zrzOtc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Is6czrXPhM6szrTOv8+Dzrcgzr/OuM+Mzr3Ot8+CIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3MDA3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCOU3lzdGVt4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjkRldmljZXPigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI/igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI7igI/igI/igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI/igI5DYXN0IGJ1dHRvbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjkNhc3QgYnV0dG9uLiBDb25uZWN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjkNhc3QgYnV0dG9uLiBDb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCOQ2FzdCB0b+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjkZpbmRpbmcgZGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI5EaXNjb25uZWN04oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCOU3RvcCBjYXN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI5DbG9zZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjlBsYXnigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjlBhdXNl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCOU3RvcOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjkV4cGFuZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCOQ29sbGFwc2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI7igI7igI/igI5BbGJ1bSBhcnTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOVm9sdW1lIHNsaWRlcuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOTm8gbWVkaWEgc2VsZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjk5vIGluZm8gYXZhaWxhYmxl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI5DYXN0aW5nIHNjcmVlbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFlYWQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChkZXNjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhbmRvKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgbGEgdHJhbnNtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDZXJyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbiBkZWwgw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzbGl6YW50ZSBkZWwgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2Ugc2VsZWNjaW9uw7MgbmluZ8O6biBjb250ZW5pZG8gbXVsdGltZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iU2luIGluZm9ybWFjacOzbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGllbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzMDA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIGRlIGVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBkZSBlbnZpYXIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW52aWFyIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGVudsOtbyBkZSBjb250ZW5pZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQb3J0YWRhIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlIHZvbHVtZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5nw7puIG1lZGlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoYXkgaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVudmlhbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMyMzViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlPDvHN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlNlYWRtZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDnGxla2FuZGVudXBwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5xsZWthbmRlbnVwcC4gw5xoZW5kdXMgb24ga2F0a2VzdGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw5xsZWthbmRtaW5lIHNlYWRtZXNzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlYWRtZXRlIG90c2ltaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGtlc3RhIMO8aGVuZHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGVhdGEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdWxnZW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFc2l0YW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBlYXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBlYXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTGFpZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkFoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWkga3VqdW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGVsaXR1Z2V2dXNlIGxpdWd1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVlZGlhdCBwb2xlIHZhbGl0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRlYXZlIHB1dWR1YiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYWFuaWt1dmEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExOWU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2FpbHVhayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklnb3JyaSBib3RvaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJZ29ydHpla28gYm90b2lhLiBEZXNrb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR6ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR1dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSWdvcnJpIGhvbmE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iR2FpbHVhayBiaWxhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNrb25la3RhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVdHppIGlnb3J0emVhcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikl0eGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFcnJlcHJvZHV6aXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iR2VsZGl0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlphYmFsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRvbGVzdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWFyZW4gYXphbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQm9sdW1lbmFyZW4gZ3JhZHVhdHphaWxlYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRXogZGEgaGF1dGF0dSBtdWx0aW1lZGlhLWVkdWtpcmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFeiBkYWdvIGluZm9ybWF6aW9yaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBhbnRhaWxhIGlnb3J0emVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjNzc5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz24zYs9iq2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiv2qnZhdmHINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYp9ix2KrYqNin2Lcg2YLYt9i5INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYr9ix2K3Yp9mEINmF2LHYqtio2LfigIzYs9in2LLbjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2YXYsdiq2KjYtyDYtNivIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LHYs9in2YQg2YXYrdiq2YjYpyDYqNmHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2b7bjNiv2Kcg2qnYsdiv2YYg2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfYsdiq2KjYp9i3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KrZiNmC2YEg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNiz2KrZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itm+2K7YtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXaqdirIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KrZiNmC2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqNiy2LHaryDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2qnZiNqG2qkg2qnYsdiv2YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYudqp2LMg2LHZiNuMINis2YTYryDYotmE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmE2LrYstmG2K/ZhyDZhduM2LLYp9mGINi12K/YpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2LHYs9in2YbZhyDYp9mG2KrYrtin2Kgg2YbYtNiv2Ycg2KfYs9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLYp9i32YTYp9i52KfYqiDYr9ixINiv2LPYqtix2LMg2YbbjNiz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiv2LHYrdin2YQg2YHYsdiz2KrYp9iv2YYg2LXZgdit2YciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODM0MzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSsOkcmplc3RlbG3DpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJMYWl0dGVldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtcGFpbmlrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtcGFpbmlrZS4gWWh0ZXlzIGthdGthaXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldMOkw6RuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtcGFpbmlrZS4gWWhkaXN0ZXR0eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdW9yYXRvaXN0b24ga29oZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFdHNpdMOkw6RuIGxhaXR0ZWl0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLYXRrYWlzZSB5aHRleXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJMb3BldGEgc3VvcmF0b2lzdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iVG9pc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJLZXNrZXl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQeXPDpHl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWFqZW5uYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGlpdmlzdMOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1pbiBrYW5zaWt1dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iw4TDpG5lbnZvaW1ha2t1dWRlbiBsaXVrdXPDpMOkZGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFaSB2YWxpdHR1YSBtZWRpYWEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWV0b2phIGVpIG9sZSBzYWF0YXZpbGxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTdW9yYXRvaXN0ZXRhYW4gbsOkeXR0w7bDpCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY5ODRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6htZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmVpbHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3V0b24gRGlmZnVzZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3V0b24gRGlmZnVzZXIuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZXhpb24gZW4gY291cnPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRGlmZnVzZXIgc3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmVjaGVyY2hlIGRcJ2FwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTZSBkw6ljb25uZWN0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcnLDqnRlciBsYSBkaWZmdXNpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlcm1lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXJyw6p0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEw6l2ZWxvcHBlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUsOpZHVpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZSBkZSBsXCdhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDdXJzZXVyIGRlIHLDqWdsYWdlIGR1IHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXVjdW4gbcOpZGlhIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkF1Y3VuZSBpbmZvcm1hdGlvbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJEaWZmdXNpb24gZGUgbFwnw6ljcmFuIGVuIGNvdXJzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMzMTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikljw7RuZSBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWPDtG5lIENhc3QuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWPDtG5lIENhc3QuIENvbm5leGlvbuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJY8O0bmUgQ2FzdC4gQ29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxz4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVjdHVyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnPigKYiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmMzNTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW1pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVtaXRpci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW1pdGlyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVyIGVtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJQZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJBbXBsaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb250cmFlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzcHJhemFibGUgZG8gdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOb24gc2Ugc2VsZWNjaW9uYXJvbiByZWN1cnNvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm9uIGhhaSBpbmZvcm1hY2nDs24gZGlzcG/DsWlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNpw7NuIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q1ZjNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCquOCqv+CquOCrjeCqn+CqriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqongqqrgqpXgqrDgqqPgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuN4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4KqV4Kqo4KuH4KqV4KuN4KqfIOCqpeCqiCDgqrDgqrngq43gqq/gq4HgqoIg4Kqb4KuHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCqhuCqqOCqviDgqqrgqrAg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCqieCqquCqleCqsOCqo+CriyDgqrbgq4vgqqfgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrgOCqjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCqteCqvuCqqOCrgeCqgiDgqrDgq4vgqpXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCqrOCqguCqpyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgqprgqrLgqr7gqrXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCqpeCri+CqreCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCqteCqv+CquOCrjeCqpOCrg+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCquOCqguCqleCrgeCqmuCqv+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqobgqrLgq43gqqzgqq4g4KqV4Kqy4Kq+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCqteCrieCqsuCrjeCqr+CrgeCqriDgqrjgq43gqrLgqr7gqofgqqHgqrAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCqleCri+CqiCDgqq7gq4DgqqHgqr/gqq/gqr4g4Kqq4Kq44KqC4KqmIOCqleCqsOCrh+CqsiDgqqjgqqXgq4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCqleCri+CqiCDgqq7gqr7gqrngqr/gqqTgq4Ag4KqJ4Kqq4Kqy4Kqs4KuN4KqnIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Kq44KuN4KqV4KuN4Kqw4KuA4Kqo4Kqo4KuHIOCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MmE1OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KS+4KSH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYsg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpIfgpLgg4KSq4KSwIOCkleCkvuCkuOCljeKAjeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpL7gpIfgpLgg4KSi4KWC4KSC4KSiIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpKjgpL4g4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkmuCksuCkvuCkj+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkm+Cli+Ckn+CkviDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleCli+CkiCDgpK7gpYDgpKHgpL/gpK/gpL4g4KSa4KSv4KSo4KS/4KSkIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCkleCli+CkiCDgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSu4KWM4KSc4KWC4KSmIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3gpJ8g4KS54KWLIOCksOCkueClgCDgpLngpYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDNlZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3VzdGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBlbWl0aXJhbmplLiBWZXphIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iR3VtYiB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6YW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2YXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWtjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYcW+aW1hbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBnbGFzbm/Eh3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamUgb2RhYnJhbiBuaWplZGFuIG1lZGlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqZSBuaXN1IGRvc3R1cG5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWl0aXJhbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmJkZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iUmVuZHN6ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRXN6a8O2esO2ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOBdGvDvGxkw6lzIGdvbWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDgXRrw7xsZMOpcyBnb21iLiBLYXBjc29sYXQgYm9udHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw4F0a8O8bGTDqXMgZ29tYi4gQ3NhdGxha296dGF0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw4F0a8O8bGTDqXMgaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRXN6a8O2esO2ayBrZXJlc8Opc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTGV2w6FsYXN6dMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IsOBdGvDvGxkw6lzIGxlw6FsbMOtdMOhc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkJlesOhcsOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlasOhdHN6w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTesO8bmV0ZWx0ZXTDqXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJMZcOhbGzDrXTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJLaWJvbnTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IsOWc3N6ZWNzdWvDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJMZW1lemJvcsOtdMOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhhbmdlcsWRc3phYsOhbHl6w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pbmNzIG3DqWRpYSBraXbDoWxhc3p0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pbmNzIGluZm9ybcOhY2nDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS8OpcGVybnnFkXRhcnRhbG9tIMOhdGvDvGxkw6lzZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjODJiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLVgNWh1bTVodWv1aHWgNWjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItWN1aHWgNaE1aXWgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVtiDVodW21bvVodW/1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1aHVriDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLUuNW21b/WgNWl1oQg1b3VodaA1oTVqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItWN1aHWgNaE1aXWgNWrINW41oDVuNW21bjWgtW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItSx1bbVu9Wh1b/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i1LTVodWk1aHWgNWl1oHVttWl1awg1bDVpdW81aHWgNWx1aHVr9W41oLVtNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLVk9Wh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i1YbVvtWh1aPVodaA1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLUtNWh1aTVodaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i1LTVodWk1aHWgNWl1oHVttWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLUuNW21aTVodaA1bHVodWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i1L/VuNWu1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i1LHVrNWi1bjVtNWrINW31aHVutWr1a8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i1YHVodW11bbVqyDVuNaC1arVo9W21bjWgtWp1bXVodW2INWv1aHWgNWj1aHVvtW41oDVq9W5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLVhNWl1aTVq9WhINaG1aHVtdWs1aXWgCDVudWl1bYg1ajVttW/1oDVvtWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItWP1aXVstWl1a/VuNaC1anVtdW41oLVttW21aXWgNWoINWw1aHVvdWh1bbVpdWs1asg1bnVpdW2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLUt9Wv1oDVodW21agg1bDVpdW81aHWgNWx1aHVr9W+1bjWgtW0INWnIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjI3NTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbmdrYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUb21ib2wgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRvbWJvbCBDYXN0LiBUZXJwdXR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVG9tYm9sIENhc3QuIE1lbmdodWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVG9tYm9sIENhc3QuIFRlcmh1YnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pc2lrYW4ga2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIZW50aWthbiBjYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1dGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMdWFza2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDaXV0a2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FtcHVsIGFsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJpbGFoIGdlc2VyIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlkYWsgYWRhIG1lZGlhIHlhbmcgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGlkYWsgYWRhIGluZm8geWFuZyB0ZXJzZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXNpIGxheWFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM1ZWE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IktlcmZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlTDpmtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIEFmdGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIFRlbmdpc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2VuZGEgw7p0IMOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTGVpdGHDsCBhw7AgdMOma2p1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZnRlbmdqYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3TDtsOwdmEgw7p0c2VuZGluZ3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikxva2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSGzDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0w7bDsHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iU3TDpmtrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWlubmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUGzDtnR1dW1zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhsasOzw7BzdHlya3NzbGXDsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVuZ2lubiBtacOwaWxsIHZhbGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRW5nYXIgdXBwbMO9c2luZ2FyIMOtIGJvw7BpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa2rDoXIgc2VuZHVyIMO6dCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2ZTNhYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHVsc2FudGUgVHJhc21ldHRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHVsc2FudGUgVHJhc21ldHRpLiBEaXNjb25uZXNzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzaW9uZSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYXNtZXR0aSBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmljZXJjYSBkaSBkaXNwb3NpdGl2aSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTY29sbGVnYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGkgdHJhc21pc3Npb25lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDaGl1ZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSaXByb2R1Y2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSW50ZXJyb21waSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkVzcGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbXByaW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQ29wZXJ0aW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRpc3Bvc2l0aXZvIGRpIHNjb3JyaW1lbnRvIGRlbCB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lc3N1biBjb250ZW51dG8gbXVsdGltZWRpYWxlIHNlbGV6aW9uYXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZXNzdW5hIGluZm9ybWF6aW9uZSBkaXNwb25pYmlsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhc21pc3Npb25lIGRlbGxvIHNjaGVybW8gaW4gY29yc28iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmIwY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i157Xoteo15vXqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157XoNeV16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteq15fXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157Xl9eV15HXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLXlNei15HXqNeUINeQ15wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLXnteX16TXqSDXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLXoNeq16ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLXlNek16HXpyDXkNeqINeU15TXoteR16jXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i16HXkteV16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLXlNek16LXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i15TXqdeU15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLXlNek16HXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IteU16jXl9eRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLXm9eV15XXpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itei15jXmdek16og15DXnNeR15XXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLXnteX15XXldefINei15XXptee15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itec15Ag16DXkdeX16jXlCDXnteT15nXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i15DXmdefINee15nXk9eiINeW157XmdefIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLXlNei15HXqNeqINee16HXmiDXnteq15HXptei16oiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDk3MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i44K344K544OG44OgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuerr+acqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuOCreODo+OCueODiOOCouOCpOOCs+ODsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprop6PpmaTmuIjjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2mua4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLjgq3jg6Pjgrnjg4jjgZnjgovjg4fjg5DjgqTjgrkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLnq6/mnKvjgpLmpJzntKLjgZfjgabjgYTjgb7jgZkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5o6l57aa44KS6Kej6ZmkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i44Kt44Oj44K544OI44KS5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLplonjgZjjgosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLlho3nlJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuS4gOaZguWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5oqY44KK44Gf44Gf44KAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i44Ki44Or44OQ44Og44Ki44O844OIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+OCueODqeOCpOODgOODvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i44Oh44OH44Kj44Ki44GM6YG45oqe44GV44KM44Gm44GE44G+44Gb44KTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmg4XloLHjgYzjgYLjgorjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IueUu+mdouOCkuOCreODo+OCueODiOOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhMDgxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhg6Hhg5jhg6Hhg6Lhg5Thg5vhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDkuGDkOGDl+GDmOGDqOGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg6Phg5rhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOQOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmOGDoSDhg5vhg53hg6vhg5jhg5Thg5Hhg5AuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YOZ4YOQ4YOV4YOo4YOY4YOg4YOY4YOhIOGDkuGDkOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGDk+GDkOGDruGDo+GDoOGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGDk+GDkOGDmeGDleGDoOGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YOe4YOQ4YOj4YOW4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YOS4YOQ4YOo4YOa4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhg6nhg5Dhg5nhg5Thg6rhg5Xhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhg5Dhg5rhg5Hhg53hg5vhg5jhg6Eg4YOS4YOQ4YOg4YOU4YOZ4YOQ4YOc4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGDruGDm+GDmOGDoSDhg6Hhg5rhg5Dhg5jhg5Phg5Thg6Dhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGDm+GDlOGDk+GDmOGDkCDhg5Dhg6Dhg6nhg5Thg6Phg5rhg5gg4YOQ4YOgIOGDkOGDoOGDmOGDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YOY4YOc4YOk4YOd4YOg4YOb4YOQ4YOq4YOY4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOu4YOU4YOa4YOb4YOY4YOh4YOQ4YOs4YOV4YOT4YOd4YOb4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOU4YOZ4YOg4YOQ4YOc4YOY4YOhIOGDkuGDkOGDk+GDkOGDquGDlOGDm+GDkCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkY2JiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQltKv0LnQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLSmtKx0YDRi9C70pPRi9C70LDRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDINGC0q/QudC80LXRgdGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDQkNC20YvRgNCw0YLRg9C70YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINKa0L7RgdGL0LvQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCa0LXQu9C10YHRltCz0LUg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLSmtKx0YDRi9C70pPRi9C70LDRgNC00Ysg0YLQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg9C00Ysg0YLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQmtGW0LTRltGA0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7Sm9GC0LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0YjQtdCx0LXRgNGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YvQsdGL0YEg0LTQtdKj0LPQtdC50ZbQvdGW0qMg0LbSr9Cz0ZbRgNGC0LrRltGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCV0YjQsdGW0YAg0YLQsNGB0YPRiNGLINGC0LDSo9C00LDQu9C80LDSk9Cw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItKa0L7QuyDQttC10YLRltC80LTRliDQsNKb0L/QsNGA0LDRgiDQttC+0psiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L3QtNGLINGC0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ3ODBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGelOGfkuGemuGeluGfkOGek+GfkuGekiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhnpThn4rhnrzhno/hnrvhnoThnoHhnrbhnp8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6U4Z624Z6T4Z6A4Z624Z6P4Z+L4Z6V4Z+S4Z6P4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6A4Z+G4Z6W4Z674Z6E4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnpfhn5LhnofhnrbhnpThn4vhnqDhnr7hnpkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Z6U4Z6J4Z+S4Z6H4Z684Z6T4Z6R4Z+FIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Z6A4Z+G4Z6W4Z674Z6E4Z6f4Z+S4Z6c4Z+C4Z6E4Z6a4Z6A4Z6n4Z6U4Z6A4Z6a4Z6O4Z+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGeleGfkuGeiuGetuGeheGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGeiOGelOGfi+Gel+GfkuGeh+GetuGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Z6U4Z634Z6RIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Z6F4Z624Z6A4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhnpXhn5LhnqLhnrbhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhnojhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhnpbhnoThn5LhnprhnrjhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGelOGehOGfkuGemuGeveGemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGen+GfkuGek+GetuGeiuGfg+Gen+Get+Gem+GfkuGelOGfiOGeouGetuGem+Gfi+GelOGfiuGeu+GemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhnprhnpThnrbhnprhnoDhnpjhn5Lhnprhnrfhno/hnp/hn4bhnqHhn4HhnoQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGeguGfkuGemOGetuGek+GegOGetuGemuGeh+GfkuGemuGevuGen+GemOGfgeGejOGfgOGekeGfgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Z6Y4Z634Z6T4Z6Y4Z624Z6T4Z6W4Z+Q4Z6P4Z+M4Z6Y4Z624Z6T4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhnoDhn4bhnpbhnrvhnoThnoHhnrbhnp/hnqLhn4HhnoDhn5LhnprhnoThn4siPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzdmZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LK44LK/4LK44LON4LKf4LKCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCyuOCyvuCyp+CyqOCyl+Cys+CzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LKy4LK+4LKX4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LKk4LKX4LOK4LKC4LKh4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCyh+CypuCyleCzjeCyleCzhiDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsrjgsr7gsqfgsqjgspfgsrPgsqjgs43gsqjgs4Eg4LK54LOB4LKh4LOB4LKV4LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4HgsrXgsr/gspXgs4Yg4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsq7gs4Hgsprgs43gsprgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsqrgs43gsrLgs4cg4LKu4LK+4LKh4LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsrXgsr/gsrDgsr7gsq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsrXgsr/gsrjgs43gsqTgsrDgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCyuOCyguCyleCzgeCymuCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCyhuCysuCzjeCyrOCyruCzjSDgspXgsrLgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LK14LK+4LKy4LON4LKv4LOC4LKu4LONIOCyuOCzjeCysuCziOCyoeCysOCzjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyp+CzjeCyr+CyriDgsobgsq/gs43gspXgs4bgsq7gsr7gsqHgsrLgsr7gspfgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsrngsr/gsqTgsr8g4LKy4LKt4LON4LKv4LK14LK/4LKy4LON4LKyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsqrgsrDgsqbgs4bgsq/gsqjgs43gsqjgs4Eg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg5M2E5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuyLnOyKpO2FnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLquLDquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLsoITshqEg67KE7Yq8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIO2VtOygnOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLsoITshqEg67KE7Yq8LiDsl7DqsrDrkKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i7KCE7Iah7ZWgIOq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuq4sOq4sOulvCDssL7ripQg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuyXsOqysCDtlbTsoJwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLsoITshqEg7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLri6vquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLsnqzsg50iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuydvOyLnOykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Iu2OvOy5mOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i7KCR6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i7JWo67KU7JWE7Yq4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuuzvOulqCDsiqzrnbzsnbTrjZQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuyEoO2Dne2VnCDrr7jrlJTslrQg7JeG7J2MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLsoJXrs7TqsIAg7JeG7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i7ZmU66m0IOyghOyGoSDspJEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODEzYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KLRg9GC0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotKv0LfQvNOp0LrRgtOp0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INCw0LbRi9GA0LDQvyDRgtGD0YDQsNGCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INGC0YPRgtCw0YjRg9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGL0L8g0YLRg9GA0LDRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotOp0LzTqdC90LrSr9Cz06kg0YfRi9Cz0LDRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotKv0LfQvNOp0LrRgtOp0YAg0LjQt9C00LXQu9Kv0q/QtNOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LbRi9GA0LDRgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGL0YjQuiDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0L3RgyDRgtC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQltCw0LHRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0YvQvdC00YvRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQotC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNC50YvQvyDQutOp0YDRgdOp0YLSr9KvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltGL0LnRi9GI0YLRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDQvNGD0LrQsNCx0LDRgdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItKu0L3QtNKvINC60LDRgtGD0YPQu9Cw0YLRg9GD0YfRgyDRgdGL0LTRi9GA0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JHQuNGAINC00LAg0LzQtdC00LjQsCDRhNCw0LnQuyDRgtCw0L3QtNCw0LvQs9Cw0L0g0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQrdGHINC80LDQsNC70YvQvNCw0YIg0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRi9C70YPRg9C00LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmMWUxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjEzMmRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjYxZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjE4ZHA8L2RpbWVuPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTczN2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC6peC6sOC6muC6u+C6miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguq3gurjgupvgurDguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgupvgurjgu4jguqHigIvguoTgurLigIvguqrigIvgupfgu4wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDguoHgurPguqXgurHguofgu4Dguorgurfgu4jguq3guqHgupXgu43gu4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDgu4Dguorgurfgu4jguq3guqHgupXgu43gu4jgu4HguqXgu4nguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZ4Lqr4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LqB4Lqz4Lql4Lqx4LqH4oCL4LqK4Lqt4LqB4oCL4Lqr4Lqy4oCL4Lqt4Lq44oCL4Lqb4Lqw4oCL4LqB4Lqt4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC6ouC6uOC6lOC6geC6suC6meC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Lqb4Lq04LqUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Lqr4Lq84Lq04LuJ4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLguqLgurjgupTguorgurvgu4jguqfguoTgurLguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLguqLgurjgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLguoLgurDguqvguo3gurLguo0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC6q+C6jeC7jeC7ieC6peC6u+C6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC7nOC7ieC6suC6m+C6u+C6geC6reC6sOC6peC6sOC6muC7jeC7ieC6siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgupXgurvguqfgupvgurHguprguqXgurDgupTgurHguprguqrgur3guociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC6muC7jeC7iOKAi+C7hOC6lOC7ieKAi+C7gOC6peC6t+C6reC6geKAi+C6oeC6teKAi+C7gOC6lOC6jeKAi+C7g+C6lOKAi+C7hOC6p+C7iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Lqa4LuN4LuI4oCL4Lqh4Lq14oCL4LqC4LuN4LuJ4oCL4Lqh4Lq54LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLguoHgurLgupnguqrgurvgu4jguofgup7gurLguprgu5zgu4ngurLguojgu40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDM2ZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLErnJlbmdpbmlhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlBlcmRhdmltbyBteWd0dWthcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlBlcmRhdmltbyBteWd0dWthcy4gQXRzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmdpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlBlcmRhdmltbyBteWd0dWthcy4gUHJpc2lqdW5ndGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUGVyZHVvdGkgxK8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSYW5kYW1pIMSvcmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0anVuZ3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3VzdGFiZHl0aSBwZXJkYXZpbcSFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJVxb5kYXJ5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlByaXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3VzdGFiZHl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IknFoXNrbGVpc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdXRyYXVrdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bW8gdmlyxaFlbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdhcnN1bW8gxaFsaWF1xb5pa2xpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVwYXNpcmlua3RhIGpva2lhIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSW5mb3JtYWNpamEgbmVwYXNpZWtpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQZXJkdW9kYW1hcyBla3JhbmFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQwNjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3TEk21hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkllcsSrY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQXByYWlkZXMgcG9nYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIHDEgXJ0cmF1a3RzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJBcHJhaWRlcyBwb2dhLiBOb3RpZWsgc2F2aWVub2p1bWEgaXp2ZWlkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBpenZlaWRvdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQXByYWlkxKvFoWFuYSB1eiBpZXLEq2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTm90aWVrIGllcsSrxI11IG1la2zEk8WhYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0dmllbm90Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXB0dXLEk3QgYXByYWlkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQWl6dsSTcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBdHNrYcWGb3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkFwdHVyxJN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJenbEk3JzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FrxLxhdXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWEgdsSBY2nFhsWhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNrYcS8dW1hIHNsxKtkbmlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOYXYgYXRsYXPEq3RpIG11bHRpdmlkZXMgZmFpbGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5hdiBwaWVlamFtYSBpbmZvcm3EgWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik5vdGllayBla3LEgW5hIGFwcmFpZGUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGVlMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC+0L/Rh9C10YLQviDQt9CwIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0JjRgdC60LvRg9GH0LXQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0KHQtSDQv9C+0LLRgNC30YPQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQn9C+0LLRgNC30LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCV0LzQuNGC0YPQstCw0Zgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCh0LUg0LHQsNGA0LDQsNGCINGD0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JjRgdC60LvRg9GH0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC+0L/RgNC4INCz0L4g0LXQvNC40YLRg9Cy0LDRmtC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQoNC10L/RgNC+0LTRg9GG0LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC+0L/RgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0L7QsdC10YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCa0L7RgNC40YbQsCDQvdCwINCw0LvQsdGD0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JvQuNC30LPQsNGHINC30LAg0ZjQsNGH0LjQvdCwINC90LAg0LfQstGD0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LUg0YHQtSDQuNC30LHRgNCw0L3QuCDQvNC10LTQuNGD0LzQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LAg0LTQvtGB0YLQsNC/0L3QuCDQuNC90YTQvtGA0LzQsNGG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdC+0YIg0YHQtSDQtdC80LjRgtGD0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MTRiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgtLjgtL/gtLjgtY3gtLHgtY3gtLHgtIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LSJ4LSq4LSV4LSw4LSj4LSZ4LWN4LSZ4LW+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LSf4LS+4LSq4LWN4LSq4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSa4LWN4LSa4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3igIzgtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LSV4LSj4LSV4LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSk4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC0h+C0pOC0v+C0suC1h+C0leC1jeC0leC1jSDgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4g4LSV4LSj4LWN4LSf4LWG4LSk4LWN4LSk4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC0teC0v+C0muC1jeC0m+C1h+C0puC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1vSDgtKjgtL/gtbzgtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC0heC0teC0uOC0vuC0qOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC0quC1jeC0suC1hyDgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC0pOC1veC0leC1jeC0leC0vuC0suC0giDgtKjgtL/gtbzgtKTgtY3gtKTgtYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgtKjgtL/gtLDgtY3igI3gtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtLXgtL/gtJXgtLjgtL/gtKrgtY3gtKrgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC0muC1geC0sOC1geC0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC0huC1veC0rOC0giDgtIbgtbzgtJ/gtY3gtJ/gtY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LS14LWL4LSz4LS/4LSv4LSCIOC0uOC1jeC0suC1iOC0oeC1vCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LSu4LWA4LSh4LS/4LSv4LSv4LWK4LSo4LWN4LSo4LWB4LSCIOC0pOC0v+C0sOC0nuC1jeC0nuC1huC0n+C1geC0pOC1jeC0pOC0v+C0n+C1jeC0n+C0v+C0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LS14LS/4LS14LSw4LSZ4LWN4LSZ4LSz4LWK4LSo4LWN4LSo4LWB4LSCIOC0suC0reC1jeC0r+C0ruC0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LS44LWN4oCM4LSV4LWN4LSw4LWA4LW7IOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4N2M5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLTqdGF06nTqdGA06nQvNC20q/Sr9C0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KHQsNC70YHQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7Qs9C00YHQvtC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCU0LDQvNC20YPRg9C70LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi06nRhdOp06nRgNOp0LzQtiDRhdCw0LnQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCh0LDQu9Cz0LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCU0LDQvNC20YPRg9C70LDRhdGL0LMg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCl0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0KLQvtCz0LvRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotKv0YAg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCU0Y3Qu9Cz0Y3RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KXRg9GA0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0KbQvtC80LPQuNC50L0g0LfRg9GA0LDQsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQlNGD0YPQvdGLINGC0q/QstGI0LjQvSDRgtCw0LDRgNGD0YPQu9Cw0LPRhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0K/QvNCw0YAg0Ycg0LzQtdC00LjQsCDRgdC+0L3Qs9C+0L7Qs9Kv0LkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCc0Y3QtNGN0Y3Qu9GN0Lsg0LHQsNC50YXQs9Kv0Lkg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JTRjdC70LPRjdGG0LjQudCzINC00LDQvNC20YPRg9C70LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYmViYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KWN4KS54KS+4KSH4KS44KWH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+CkoyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkoeCkv+CkuOCljeCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS+4KS14KSwIOCkleCkvuCkuOCljeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgg4KS24KWL4KSn4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpY3igI3gpJXgpKjgpYfgpJXgpY3igI3gpJ8g4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCko+ClhyDgpKXgpL7gpILgpKzgpLXgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKrgpY3gpLLgpYcg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLXgpL/gpLDgpL7gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKXgpL7gpILgpKzgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpYPgpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpYHgpJrgpL/gpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSF4KSy4KWN4KSs4KSuIOCkleCksuCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpY3gpLngpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSv4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpK7gpYDgpKHgpL/gpK/gpL4g4KSo4KS/4KS14KSh4KSy4KS+IOCkqOCkvuCkueClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSj4KSk4KWA4KS54KWAIOCkruCkvuCkueCkv+CkpOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWU0ODAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRhbmcgSGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0YW5nIGhhbnRhci4gU2FtYnVuZ2FuIGRpcHV0dXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dGFuZyBoYW50YXIuIE1lbnlhbWJ1bmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0YW5nIGhhbnRhci4gRGlzYW1idW5na2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkhhbnRhciBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJCZXJoZW50aSBtZW5naGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik1haW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktlbWJhbmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJ1bnR1aGthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNlbmkgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUGVsdW5jdXIga2VsYW50YW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IlRpYWRhIG1lZGlhIGRpcGlsaWgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik1ha2x1bWF0IHRpZGFrIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJNZW5naGFudGFyIHNrcmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNkODA1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGAheGAlOGAheGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhgIDhgKzhgIXhgLrhgJDhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCB4YCc4YCv4YCQ4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAmeGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAlOGAseGAnuGAiuGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCR4YCs4YC44YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIXhgIDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgg4YCb4YC+4YCs4YCW4YC94YCx4YCB4YC84YCE4YC64YC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGAhuGAgOGAuuGAnuGAveGAmuGAuuGAmeGAvuGAryDhgJbhgLzhgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgIHhgLzhgIThgLrhgLgg4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhgJXhgK3hgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhgJbhgL3hgIThgLfhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGAgeGAj+GAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGAluGAvOGAlOGAt+GAuuGAgeGAu+GAm+GAlOGAuuGBgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YCB4YCx4YCr4YCA4YC64YCe4YCt4YCZ4YC64YC44YCb4YCU4YC6Li4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YCh4YCa4YC64YCc4YC64YCY4YCZ4YC64YCV4YCv4YC2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGAoeGAnuGAtuGAoeGAkOGAreGAr+GAuOGAoeGAgOGAu+GAmuGAuuGAgeGAu+GAreGAlOGAuuGAnuGAiuGAt+GAuiDhgIbhgJzhgK3hgK/hgIDhgLrhgJLhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGAmeGAiuGAuuGAnuGAiuGAt+GAuuGAmeGAruGAkuGAruGAmeGAviDhgJnhgJvhgL3hgLHhgLjhgIHhgLvhgJrhgLrhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGAoeGAgeGAu+GAgOGAuuGAoeGAnOGAgOGAuiDhgJnhgJvhgJvhgL7hgK3hgJThgK3hgK/hgIThgLrhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGAkOGAiuGAuuGAuOGAluGAvOGAkOGAuuGAm+GAseGAuCDhgJnhgLvhgIDhgLrhgJThgL7hgKzhgJXhgLzhgIThgLoiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzY0YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWlrb25ldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnJha29ibGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEtvYmxlciB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwcGVuLiBUaWxrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTw7hrZXIgZXR0ZXIgZW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLb2JsZSBmcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wcCBjYXN0aW5nZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1a2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsbCBhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2V0dCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlV0dmlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlkZWJyeXRlciBmb3Igdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkR1IGhhciBpa2tlIHZhbGd0IG5vZW4gbWVkaWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmdlbiBpbmZvcm1hc2pvbiBlciB0aWxnamVuZ2VsaWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3RlciBza2plcm1lbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpKrgpY3gpLDgpKPgpL7gpLLgpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSJ4KSq4KSV4KSw4KSj4KS54KSw4KWCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkreCkr+CliyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkueClgeCkgeCkpuCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkr+CkuOCkruCkviBDYXN0IOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkr+CkqOCljeCkpOCljeCksOCkueCksOClgiDgpKrgpKTgpY3gpKTgpL4g4KSy4KSX4KS+4KSJ4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkteCkv+CkmuCljeCkm+Clh+CkpiDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJjYXN0aW5nIOCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSo4KWN4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkrOCknOCkvuCkieCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KS44KSC4KSV4KWN4KS34KS/4KSq4KWN4KSkIOCkquCkvuCksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KSt4KWL4KSy4KWN4KSv4KWB4KSu4KSV4KWLIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWB4KSo4KWIIOCkruCkv+CkoeCkv+Ckr+CkviDgpJrgpK/gpKgg4KSt4KSP4KSV4KWLIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCkieCkquCksuCkrOCljeCkpyDgpJvgpYjgpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOCkv+CkqCBjYXN0IOCkl+CksOCljeCkpuCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZjYyZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyYXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWNvb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIHZlcmJyb2tlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyBtYWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWljb29uLiBWZXJib25kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVuIG5hYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBcHBhcmF0ZW4gem9la2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ikxvc2tvcHBlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdGVuIHN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlNsdWl0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwZWxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iT25kZXJicmVrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWl0dm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYW1lbnZvdXdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaG9lcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVzY2h1aWZyZWdlbGFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkdlZW4gaW5mb3JtYXRpZSBiZXNjaGlrYmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2NoZXJtIGNhc3RlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1ZGY3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqLjgqL/gqLjgqJ/gqK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kih4Ki/4Ki14Ki+4KiI4Ki44Ki+4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCoj+CopeCphyDgqJXgqL7gqLjgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kih4KmA4Ki14Ki+4KiI4Ki44Ki+4KiCIOCoqOCpguCpsCDgqLLgqbHgqK3gqL/gqIYg4Kic4Ki+IOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuColeCovuCouOConyDgqJXgqLDgqKjgqL4g4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCoquCosuCphyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCosOCpi+ColeCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqLXgqL/gqLjgqKTgqL7gqLAg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KiQ4Kiy4Kis4KiuIOCohuCosOConyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqLXgqYzgqLLgqK/gqYLgqK4g4Ki44Kiy4Ki+4KiI4Kih4KiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqJXgqYvgqIgg4Ki14KmAIOCoruCpgOCooeCpgOCohiDgqKjgqLngqYDgqIIg4Kia4KmB4Kij4Ki/4KiGIOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KiV4KmL4KiIIOConOCovuCoo+ColeCovuCosOCpgCDgqIngqKrgqLLgqKzgqKcg4Kio4Ki54KmA4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqLjgqJXgqY3gqLDgqYDgqKgg4Kic4KmL4KmcIOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTJhNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyesSFZHplbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHJ6eWNpc2sgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUm96xYLEhWN6b25vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIMWBxIVjesSZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUG/FgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJ6ZXN5xYJhaiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlpuYWpkb3dhbmllIHVyesSFZHplxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2TFgsSFY3oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXRyenltYWogcHJ6ZXN5xYJhbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYW1rbmlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT2R0d8OzcnoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IldzdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvendpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ilp3acWEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2vFgmFka2EgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlN1d2FrIGfFgm/Fm25vxZtjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmllIHd5YnJhbm8gbXVsdGltZWRpw7N3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJCcmFrIGluZm9ybWFjamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByemVzecWCYW0gZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwYTYxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBUcmFuc21pdGlyLiBEZXNsaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBUcmFuc21pdGlyLiBBIGxpZ2FyLi4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBUcmFuc21pdGlyLiBMaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQSBsb2NhbGl6YXIgZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Fzc29jaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGFyYXIgYSB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVkdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbG8gZGUgZGVzbGl6ZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bSBzdXBvcnRlIG11bHRpbcOpZGlhIHNlbGVjaW9uYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQSB0cmFuc21pdGlyIG8gZWNyw6MiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzYxOWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmIyZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bveml0aXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBEZWNvbmVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIFNlIGNvbmVjdGVhesSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gQ29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJvaWVjdGHIm2kgcGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTZSBjYXV0xIMgZGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVjb25lY3RhyJtpLXbEgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik51IG1haSBwcm9pZWN0YcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iw45uY2hpZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZWRhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLDjm50cmVydXBlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iT3ByacibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4dGluZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlc3Ryw6JuZ2XIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJHcmFmaWNhIGFsYnVtdWx1aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlzb3IgcGVudHJ1IHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWNpdW4gZmnImWllciBtZWRpYSBzZWxlY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnUgc3VudCBkaXNwb25pYmlsZSBpbmZvcm1hyJtpaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2UgcHJvaWVjdGVhesSDIGVjcmFudWwiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDYyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC+0YLQutC70Y7Rh9C10L3Qvi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQsNC10YLRgdGPLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC/0L7QtNC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQktGL0LHQtdGA0LjRgtC1INGD0YHRgtGA0L7QudGB0YLQstC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtC40YHQuiDRg9GB0YLRgNC+0LnRgdGC0LLigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J7RgtC60LvRjtGH0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC10LrRgNCw0YLQuNGC0Ywg0YLRgNCw0L3RgdC70Y/RhtC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLQvtGB0L/RgNC+0LjQt9Cy0LXRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC+0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCg0LXQs9GD0LvRj9GC0L7RgCDQs9GA0L7QvNC60L7RgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNC40LDRhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JTQsNC90L3Ri9GFINC90LXRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiDRg9C00LDQu9C10L3QvdC+0LzRgyDQvNC+0L3QuNGC0L7RgNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVjZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC2tOC2r+C3iuC2sOC2reC3kuC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtovgtrTgt4/gtoLgtpwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uC4g4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2uOC3kuC2seC3iiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4IOC3g+C2uOC3iuC2tuC2seC3iuC2sCDgtprgtrvgtrEg4La94Lav4LeTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC3gOC3kuC2muC3j+C3geC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC2i+C2tOC3j+C2guC2nCDgt4Pgt5ngt4Dgt5PgtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC3gOC3kuC2muC3j+C3gSDgtprgt5Lgtrvgt5Pgtrgg4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LeA4LeD4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Law4LeP4LeA4Lax4La6IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LeA4LeS4La74LeP4La4IOC2nOC2seC3iuC3gOC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC2seC2reC2uyDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtq/gt5Lgtpwg4LeE4La74LeS4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgt4Tgtprgt5Tgt4XgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgtofgtr3gt4rgtrbgtrgg4Laa4La94LeP4LeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC3hOC2rCDgtrTgtrvgt5Lgtrjgt48g4LeD4LeK4La94La64LeS4Lap4La74La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtrjgt4/gtrDgt4rigI3gtrrgtrog4Lat4Led4La74LePIOC2seC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4La94La24LePIOC2nOC2rSDgt4Tgt5Dgtprgt5Ig4Lat4Lec4La74Lat4LeU4La74LeUIOC2seC3nOC2uOC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LeA4LeS4Laa4LeP4LeBIOC2reC3kuC2u+C2uiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YWExMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphcmlhZGVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjWlkbG8gcHJlbm9zdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNaWRsbyBwcmVub3N1LiBPZHBvamVuw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlww6FqYSBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVub3MgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIxL5hZGFqw7ogc2EgemFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvamnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3RhdmnFpSBwcmVuw6HFoWFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdnJpZcWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlaHJhxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJaYmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2Jyw6F6b2sgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc8O6dmHEjSBobGFzaXRvc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgc8O6IHZ5YnJhbsOpIMW+aWFkbmUgbcOpZGnDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmllIHPDuiBrwqBkaXNwb3rDrWNpaSDFvmlhZG5lIGluZm9ybcOhY2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmVuw6HFoWEgc2Egb2JyYXpvdmthIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E0Y2U0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJOYXByYXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFBvdmV6YXZhIGplIHByZWtpbmplbmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIHByZWR2YWphbmplLiBWenBvc3RhdmxqYW5qZSBwb3ZlemF2ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgdnpwb3N0YXZsamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlZHZhamFuamUgcHJlazoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJc2thbmplIG5hcHJhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHBvdmV6YXZvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXN0YXZpIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXByaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJhesWhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdHJuaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik5hc2xvdm5pY2EgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRyc25payB6YSBnbGFzbm9zdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmkgaXpicmFuZSBwcmVkc3Rhdm5vc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJQb2RhdGtpIG5pc28gbmEgdm9sam8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWR2YWphbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmUxMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQYWppc2pldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBzaGvDq3B1dHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIFBvIGxpZGhldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIEplIGkgbGlkaHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWV0byB0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlBvIGvDq3Jrb24gcGFqaXNqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTaGvDq3B1dGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJOZGFsbyB0cmFuc21ldGltaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1ieWxsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTHVhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1esOrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTmRhbG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJaZ2plcm9qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUGFsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iS29wZXJ0aW5hIGUgYWxidW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJScsOrc2hxaXTDq3NpIGkgdm9sdW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTnVrIHUgemdqb2RoIGFzbmrDqyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnVrIGplcGV0IGFzbmrDqyBpbmZvcm1hY2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUG8gdHJhbnNtZXRvbiBla3JhbmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFiYWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GA0LXRktCw0ZjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQktC10LfQsCDRmNC1INC/0YDQtdC60LjQvdGD0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9GD0ZjQtSDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfQsNC9INGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0J/RgNC10LHQsNGG0YPRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/RgNC+0L3QsNC70LDQttC10ZrQtSDRg9GA0LXRktCw0ZjQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutC40L3QuCDQstC10LfRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCX0LDRg9GB0YLQsNCy0Lgg0L/RgNC10LHQsNGG0LjQstCw0ZrQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9Cw0YPQt9C40YDQsNGYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQsNGD0YHRgtCw0LLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCf0YDQvtGI0LjRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodC60YPQv9C4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QvNC+0YIg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCa0LvQuNC30LDRhyDQt9CwINGY0LDRh9C40L3RgyDQt9Cy0YPQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndC10LzQsCDQuNC30LDQsdGA0LDQvdC40YUg0LzQtdC00LjRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC40YHRgyDQtNC+0YHRgtGD0L/QvdC1INC90LjQutCw0LrQstC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCf0YDQtdCx0LDRhtGD0ZjQtSDRgdC1INC10LrRgNCw0L0iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2QzZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXBwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXBwZW4uIEZyw6Vua29wcGxhZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwcGVuLiBBbnNsdXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RhIHRpbGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZXRhciBlZnRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvcHBsYSBmcsOlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlNsdXRhIGNhc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdMOkbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVsYSB1cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXZicnl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXTDtmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLb21wcmltZXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2tpdm9tc2xhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x5bXJlZ2xhZ2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2EgbWVkaWEgaGFyIHZhbHRzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXQgZmlubnMgaW5nZW4gaW5mb3JtYXRpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6RybWVuIGNhc3RhcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MmNiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJNZnVtbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJWaWZhYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IktpdHVmZSBjaGEga3V0dW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWVvbmRvbGV3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbmF1bmdhbmlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWV1bmdhbmlzaHdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlR1bWEga3dlbnllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSW5hdGFmdXRhIHZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9uZG9hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQWNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZ1bmdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQ2hlemEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlNpdGlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTaW1hbWlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYW51YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iS3VuamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW5hYSB5YSBhbGJhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2l0ZWxlemkgY2hhIHNhdXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIYWt1bmEgbWF1ZGh1aSB5YWxpeW9jaGFndWxpd2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ikhha3VuYSBtYWVsZXpvIHlhbGl5b3BhdGlrYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJbmF0dW1hIHNrcmluaSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQyMzQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj42MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj45MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YWI4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NTAlPC9pdGVtPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+NzAlPC9pdGVtPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk3OGYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCumuCuv+CuuOCvjeCun+CuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgrqTgrr/grrDgr4jgrq/grr/grp/gr4Eg4K6q4K6f4K+N4K6f4K6p4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6k4K+B4K6j4K+N4K6f4K6/4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6H4K6j4K+I4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCuh+CupOCuseCvjeCuleCvgSDgroXgrqngr4Hgrqrgr43grqrgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr4jgrqTgr40g4K6k4K+H4K6f4K+B4K6V4K6/4K6x4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCupOCviuCun+CusOCvjeCuquCviOCupOCvjSDgrqTgr4HgrqPgr43grp/grr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrrXgrqTgr4gg4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgrq7gr4Lgrp/gr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgrofgrq/grpXgr43grpXgr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCuh+Cun+CviOCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuteCupOCuseCvjeCuleCuvuCuqSDgrqrgr4rgrqTgr43grqTgrr7grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgrrXgrr/grrDgrr/grrXgrr7grpXgr43grpXgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCumuCvgeCusOCvgeCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCuhuCusuCvjeCuquCuruCvjSDgrobgrrDgr43grp/gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4K6S4K6y4K6/4K6v4K6z4K614K+BIOCuuOCvjeCusuCviOCun+CusOCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4K6u4K+A4K6f4K6/4K6v4K6+IOCujuCupOCvgeCuteCvgeCuruCvjSDgrqTgr4fgrrDgr43grqjgr43grqTgr4bgrp/gr4HgrpXgr43grpXgrqrgr43grqrgrp/grrXgrr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCupOCuleCuteCusuCvjSDgro7grqTgr4HgrrXgr4Hgrq7grr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCupOCuv+CusOCviOCur+CviCDgroXgrqngr4Hgrqrgr43grqrgr4HgrpXgrr/grrHgr4DgrrDgr43grpXgrrPgr40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzEyZTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LC44LC/4LC44LGN4LCf4LCu4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsL8g4LCs4LCf4LCo4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCwpuCxgOCwqOCwv+CwleCwvyDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LCC4LCh4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LCo4LGBIOCwleCwqOCxgeCwl+CxiuCwguCwn+Cxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LC+4LCo4LGN4LCo4LC/IOCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LCu4LGC4LC44LC/4LC14LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LCq4LGN4LCy4LGHIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LCq4LC+4LCc4LGNIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCwteCwv+CwuOCxjeCwpOCwsOCwv+CwguCwquCwnOCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LCV4LGB4LCm4LC/4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LCG4LCy4LGN4LCs4LCu4LGNIOCwhuCwsOCxjeCwn+CxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsLXgsL7gsLLgsY3gsK/gsYLgsK7gsY0g4LC44LGN4LCy4LCv4LC/4LCh4LCw4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsK7gsYDgsKHgsL/gsK/gsL4g4LCP4LCm4LGAIOCwjuCwguCwmuCxgeCwleCxi+CwrOCwoeCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LC44LCu4LC+4LCa4LC+4LCw4LCCIOCwheCwguCwpuCxgeCwrOCwvuCwn+CxgeCwsuCxiyDgsLLgsYfgsKbgsYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCwuOCxjeCwleCxjeCwsOCxgOCwqOCxjeKAjOCwqOCxgSDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE4YWU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC4o+C4sOC4muC4miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC4ouC4geC5gOC4peC4tOC4geC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LiB4Liz4Lil4Lix4LiH4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4reC5geC4peC5ieC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguYHguITguKrguJXguYzguYTguJvguKLguLHguIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguIHguLPguKXguLHguIfguITguYnguJnguKvguLLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lir4Lii4Li44LiU4LmB4LiE4Liq4LiV4LmMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLguJvguLTguJQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguYDguKXguYjguJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC4q+C4ouC4uOC4lOC4iuC4seC5iOC4p+C4hOC4o+C4suC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC4q+C4ouC4uOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC4guC4ouC4suC4oiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lii4Li44LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Lib4LiB4Lit4Lix4Lil4Lia4Lix4LmJ4LihIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC5geC4luC4muC5gOC4peC4t+C5iOC4reC4meC4m+C4o+C4seC4muC4o+C4sOC4lOC4seC4muC5gOC4quC4teC4ouC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LmE4Lih4LmI4LmE4LiU4LmJ4LmA4Lil4Li34Lit4LiB4Liq4Li34LmI4Lit4LmE4Lin4LmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguYTguKHguYjguKHguLXguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC4geC4s+C4peC4seC4h+C5geC4hOC4quC4leC5jOC4q+C4meC5ieC4suC4iOC4rSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiZTNkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iTWdhIERldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dHRvbiBuYSBJLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXR0b24gbmEgSS1jYXN0LiBOYWRpc2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dHRvbiBuYSBJLWNhc3QuIEt1bW9rb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5ha2Frb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkktY2FzdCBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik5hZ2hhaGFuYXAgbmcgbWdhIGRldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJJZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkloaW50byBhbmcgcGFnLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IklzYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iSS1wbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJLXBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSWhpbnRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUGFsYXdha2luIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJJLWNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNsaWRlciBuZyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IldhbGFuZyBwaW5pbGluZyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iV2FsYW5nIGF2YWlsYWJsZSBuYSBpbXBvcm1hc3lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS2luYS1jYXN0IGFuZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjYzOTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFubGEgZMO8xJ9tZXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFudMSxIGtlc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbsSxeW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbmTEsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLFnnVyYXlhIHlhecSxbmxhOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkNpaGF6bGFyIGJ1bHVudXlvciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxecSxIGtlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbsSxIGR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iS2FwYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyYWtsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEdXJkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9sZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkRhcmFsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYsO8bSBrYXBhxJ/EsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTZXMgZMO8emV5aSBrYXlkxLFybWEgw6d1YnXEn3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik1lZHlhIHNlw6dpbG1lZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJpbGdpIHlvayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFubGFuxLF5b3IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDM2NWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNC40YHRgtGA0L7RlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0JLRltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCf0ZbQtOKAmdGU0LTQvdCw0L3QvdGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GO0LLQsNGC0Lgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNC40YHRgtGA0L7Rl9CyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCS0ZbQtNC60LvRjtGH0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC40L/QuNC90LjRgtC4INGC0YDQsNC90YHQu9GP0YbRltGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCS0ZbQtNGC0LLQvtGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0LjQt9GD0L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J/RgNC40L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQvtC30LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LrQu9Cw0LTQuNC90LrQsCDQsNC70YzQsdC+0LzRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C+0LLQt9GD0L3QvtC6INCz0YPRh9C90L7RgdGC0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGW0LAt0YTQsNC50Lsg0L3QtSDQstC40LHRgNCw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LDRlCDQtNCw0L3QuNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGA0LDQvdGB0LvRj9GG0ZbRjyDQtdC60YDQsNC90LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmM1OTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPYs9m52YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KLZhNin2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2LrbjNixINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB2Ygg2LHbgdinINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsyDZhduM2rog2qnYp9iz2bkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYotmE2KfYqiDYqtmE2KfYtCDbgdmIINix24HbkiDbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2LrbjNixINmF2YbYs9mE2qkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLaqdin2LPZuSDaqdix2YbYpyDYqNmG2K8g2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItqG2YTYp9im24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXZiNmC2YjZgSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itix2YjaqduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLZvtq+24zZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYs9qp24zakduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYp9mE2KjZhSDYotix2bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YjYp9mE24zZiNmFINiz2YTYp9im24zaiNixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLaqdmI2KbbjCDZhduM2ojbjNinINmF2YbYqtiu2Kgg2YbbgduM2rog24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2qnZiNim24wg2YXYudmE2YjZhdin2Kog2K/Ys9iq24zYp9ioINmG24HbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYs9qp2LHbjNmGINqp2KfYs9m5INuB2Ygg2LHbgduMINuB25IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTA4MTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iVGl6aW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUXVyaWxtYWxhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFV6aWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5tb3FkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbmRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlF1eWlkYWdpZ2EgdHJhbnNsYXRzaXlhIHFpbGlzaDoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJRdXJpbG1hbGFybmkgdG9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlVsYW5pc2huaSB1emlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlRyYW5zbGF0c2l5YW5pIHRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWW9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQm9zaGxhc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlRv4oCYeHRhdGliIHR1cmlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IllveWlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWWln4oCYaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gbXVxb3Zhc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVG92dXNoIGJhbGFuZGxpZ2kgc2xheWRlcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik11bHRpbWVkaWEgdGFubGFtYWdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGVjaCBxYW5kYXkgbWHigJlsdW1vdCB5b+KAmHEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFubmkgdHJhbnNsYXRzaXlhIHFpbGlzaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OGNjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJI4buHIHRo4buRbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVGhp4bq/dCBi4buLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iTsO6dCB0cnV54buBbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mgbmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJOw7p0IHRydXnhu4FuLiDEkGFuZyBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJOw7p0IHRydXnhu4FuLiDEkMOjIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRydXnhu4FuIHThu5tpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4ixJBhbmcgdMOsbSB0aGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iROG7q25nIHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLEkMOzbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQaMOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVOG6oW0gZOG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iROG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTeG7nyBy4buZbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRodSBn4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuG6om5oIGLDrGEgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVGhhbmggdHLGsOG7o3Qgw6JtIGzGsOG7o25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLaMO0bmcgY8OzIHBoxrDGoW5nIHRp4buHbiBuw6BvIMSRxrDhu6NjIGNo4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iS2jDtG5nIGPDsyB0aMO0bmcgdGluIG7DoG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IsSQYW5nIHRydXnhu4FuIG3DoG4gaMOsbmgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMmQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757ufIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleWwhOaMiemSriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleWwhOaMiemSruOAguW3suaWreW8gOi/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5bCE5oyJ6ZKu44CC5q2j5Zyo6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleWwhOaMiemSruOAguW3sui/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXlsITliLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjmn6Xmib7orr7lpIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5bCEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLlhbPpl60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuaaguWBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxleW8gCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS26LW3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5LiT6L6R5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keWdlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YCJ5oup5Lu75L2V5aqS5L2TIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmsqHmnInku7vkvZXnm7jlhbPkv6Hmga8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleWwhOWxj+W5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZlNWMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vntbEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5pS+5oyJ6YiVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5pS+5oyJ6YiV44CC5bey6Kej6Zmk6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXmlL7mjInpiJXjgILmraPlnKjpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5pS+5oyJ6YiV44CC5bey6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleaUvuiHsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOWwi+aJvuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXmlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumXnOmWiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqr5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLblkIgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLlsIjovK/lsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5qG/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLlsJrmnKrpgbjmk4flqpLpq5QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Iuaykuacieips+e0sOizh+aWmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5pS+6J6i5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWZkZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXvvJvlt7LkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIle+8m+mAo+e3muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXvvJvlt7LpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+5YiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumBuOWPluS7u+S9leWqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ5Y+v55So55qE6LOH6KiKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDdjNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSXNpc3RpbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJbmtpbm9iaG8geWUtQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdW5xYW55dWxpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXlheGh1bnl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3V4aHVueWl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWthemEga3UtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSXRob2xhIGFtYWRpdmF5aXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik5xYW11bGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJNaXNhIHVrdXNha2F6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVmFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkRsYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJNaXNhIGlzaWtoYXNoYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTWlzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik53ZWJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJHb3FhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iVWJ1Y2lrbyBiZS1hbGJoYW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IklzaWxheWlkYSBzZXZvbHVtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXlpa2hvIGltaWRpeWEgZWtoZXRoaXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBbHVraG8gdWx3YXppIG9sdXRob2xha2FsYXlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJc2lrcmluaSBzb2t1c2FrYXphIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzMyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9InNwZWVkX211bHRpcGxpZWRfYnlfMTAwIj4KLSAgICAgICAgPGl0ZW0+MjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjUwPC9pdGVtPgotICAgICAgICA8aXRlbT43NTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTAwPC9pdGVtPgotICAgICAgICA8aXRlbT4xMjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjE1MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MjAwPC9pdGVtPgotICAgIDwvaW50ZWdlci1hcnJheT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3Mjg1Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lZGlhUm91dGVCdXR0b24iPgotICAgICAgICA8IS0tIFRoaXMgZHJhd2FibGUgaXMgYSBzdGF0ZSBsaXN0IHdoZXJlIHRoZSAiY2hlY2tlZCIgc3RhdGUKLSAgICAgICAgICAgICBpbmRpY2F0ZXMgYWN0aXZlIG1lZGlhIHJvdXRpbmcuICBDaGVja2FibGUgaW5kaWNhdGVzIGNvbm5lY3RpbmcKLSAgICAgICAgICAgICBhbmQgbm9uLWNoZWNrZWQgLyBub24tY2hlY2thYmxlIGluZGljYXRlcwotICAgICAgICAgICAgIHRoYXQgbWVkaWEgaXMgcGxheWluZyB0byB0aGUgbG9jYWwgZGV2aWNlIG9ubHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgPCEtLSBUaW50IHRvIGFwcGx5IHRvIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25UaW50IiBmb3JtYXQ9ImNvbG9yIiAvPgotCi0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluV2lkdGgiIC8+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0IiAvPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotCi0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVRoZW1lIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmMyOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8Y29sb3IgbmFtZT0iZ3JheSI+IzgwODA4MDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9IndoaXRlIj4jZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGVfb3BhY2l0eV83MCI+I0IzZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmxhY2tfb3BhY2l0eV83MCI+I0IzMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0idGl0bGVfYmFyX2dyYWRpZW50X3N0YXJ0Ij4jNTAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfZW5kIj4jMDAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJib3R0b21fYmFyX2JhY2tncm91bmQiPiM0MDIwMjAyMDwvY29sb3I+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3YjAyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gRGlhbG9nIHNpemUgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+MzIwZHA8L2RpbWVuPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+MzIwZHA8L2RpbWVuPgotCi0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjI4OGRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjY4ZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiPjE2ZHA8L2RpbWVuPgotICAgIDwhLS0gR3JvdXAgbGlzdCBleHBhbmQvY29sbGFwc2UgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgotICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIGluIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgb3V0IGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyI+MjAwPC9pbnRlZ2VyPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiPjE1MGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiPjM2ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSI+MjBkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjE4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xMnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xMHNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoIj4yMjVkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiPjU0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIj4zMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4yN2RwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xNnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEzc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3NldHRpbmdzX29mZnNldCI+OGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIj40ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3BhdXNlX2ljb25fc2l6ZSI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9pY29uX3NpemUiPjI4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfbWluaW1hbF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2ljb25fbWFyZ2luIj4xMGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSI+MjMyZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiPjE3NmRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSI+MmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+MTJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0Ij41ZHA8L2RpbWVuPgotICAgIDwhLS0gVE9ETzogYWRqdXN0IGJvdHRvbSBiYXIgdmlldyAtLT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5N2EzYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLQotICAgIDwhLS0gTmFtZSBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIHByaW9yIHRvIEplbGx5YmVhbi4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiPlN5c3RlbTwvc3RyaW5nPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgdXNlciByb3V0ZSBjYXRlZ29yeSBjcmVhdGVkIHdoZW4gcHVibGlzaGluZyByb3V0ZXMgdG8gdGhlIHN5c3RlbSBpbiBKZWxseWJlYW4gYW5kIGFib3ZlLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiPkRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gU3RyaW5nIHRvIGJlIHNob3duIGFzIGEgdG9vbHRpcCBvZiBNZWRpYVJvdXRlQnV0dG9uCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iPkNhc3QgYnV0dG9uPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hlbiBubyByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgZGV2aWNlLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyI+Q2FzdCBidXR0b24uIENvbm5lY3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIGEgcmVtb3RlIGRldmljZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiPkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gVGl0bGUgb2YgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIj5DYXN0IHRvPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRldmljZXMgaGF2ZSBiZWVuIGZvdW5kLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyI+RmluZGluZyBkZXZpY2VzPC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCI+RGlzY29ubmVjdDwvc3RyaW5nPgotCi0gICAgPCEtLSBCdXR0b24gdG8gc3RvcCBwbGF5YmFjayBhbmQgZGlzY29ubmVjdCBmcm9tIGEgbWVkaWEgcm91dGUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIj5TdG9wIGNhc3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBkaWFsb2cgY2xvc2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iPkNsb3NlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGxheSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5Ij5QbGF5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGF1c2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiPlBhdXNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgc3RvcCBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIj5TdG9wPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgZXhwYW5kIGJ1dHRvbi4gUHJlc3NpbmcgYnV0dG9uIHNob3dzIGdyb3VwIG1lbWJlcnMgb2YgYSBzZWxlY3RlZCByb3V0ZSBncm91cC4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCI+RXhwYW5kPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgY29sbGFwc2UgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gaGlkZXMgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiPkNvbGxhcHNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogYWxidW0gYXJ0IGJ1dHRvbi4gQ2xpY2tpbmcgb24gdGhlIGFsYnVtIGFydCB0YWtlcyB1c2VyIHRvIGEgcHJlZGVmaW5lZCBhY3Rpdml0eSBwZXIgbWVkaWEgYXBwLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCI+QWxidW0gYXJ0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogdm9sdW1lIHNsaWRlci4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiPlZvbHVtZSBzbGlkZXI8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gbWVkaWEgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBwbGF5YmFjay4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCI+Tm8gbWVkaWEgc2VsZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gdGl0bGUvZGVzY3JpcHRpb24gaGF2ZSBiZWVuIGZvdW5kIGZvciBhIGdpdmVuIHNvbmcvdmlkZW8uIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiPk5vIGluZm8gYXZhaWxhYmxlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiI+Q2FzdGluZyBzY3JlZW48L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNvbnRhaW5lciBpcyBub3QgdmFsaWQgZm9yIHByb2dyZXNzaXZlIGRvd25sb2FkL3BsYXliYWNrLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfdGV4dF9pbnZhbGlkX3Byb2dyZXNzaXZlX3BsYXliYWNrIj5UaGlzIHZpZGVvIGlzblwndCB2YWxpZCBmb3Igc3RyZWFtaW5nIHRvIHRoaXMgZGV2aWNlLjwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIEl0IGNhbiBiZSB1c2VkIGJ5IGFueSBhcHAuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X3Vua25vd24iPkNhblwndCBwbGF5IHRoaXMgdmlkZW8uPC9zdHJpbmc+Ci0gICAgPCEtLSBCdXR0b24gdG8gY2xvc2UgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl9idXR0b24iPk9LPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgc2tpcCB3YWl0IHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUiPgotICAgICAgICBZb3UgY2FuIHNraXAgQWQgaW4gPHhsaWZmOmcgaWQ9IndhaXRfdGltZSIgZXhhbXBsZT0iNSI+JTEkZDwveGxpZmY6Zz5zCi0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGFkIHRvdGFsIHJlbWFpbmluZyB0aW1lLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lIj4KLSAgICAgICAgQWQgwrcgPHhsaWZmOmcgaWQ9InJlbWFpbmluZ190aW1lIiBleGFtcGxlPSIxOjE1Ij4lMSRzPC94bGlmZjpnPiByZW1haW5pbmcKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGNhbiBwcmVzcyB0aGUgYnV0dG9uIHRvIGdvIHRvIGFuIGV4dGVybmFsIHdlYnNpdGUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCI+VmlzaXQgQWR2ZXJ0aXNlcjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdGV4dCI+Q2xvc2VkIGNhcHRpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0Ij5PZmY8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQiPkF1ZGlvIHRyYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQiPk5vbmU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfdGV4dCI+VmlkZW8gcXVhbGl0eTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQiPkF1dG88L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCI+SGVscCAmYW1wOyBmZWVkYmFjazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCI+UGxheWJhY2sgc3BlZWQ8L3N0cmluZz4KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcyI+Ci0gICAgICAgIDxpdGVtPjAuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjc1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Tm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbT4xLjI1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MS41eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Mng8L2l0ZW0+Ci0gICAgPC9zdHJpbmctYXJyYXk+Ci0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGZvciBkaXNwbGF5aW5nIHRpbWUuIFVzZWQgdG8gY2FsY3VsYXRlIHdoaWNoIHNpemUgbGF5b3V0IHRvIHVzZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyIj4wMDowMDowMDwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHN1YnRpdGxlIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJ0cmFja19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGF1ZGlvIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJhdWRpb19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gc29uZyB0aXRsZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCI+U29uZyB0aXRsZSB1bmtub3duPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gYXJ0aXN0IG5hbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0Ij5BcnRpc3QgdW5rbm93bjwvc3RyaW5nPgotCi0gICAgPCEtLUNvbnRlbnQgRGVzY3JpcHRpb25zIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9iYWNrX2J1dHRvbl9kZXNjIj5CYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2MiPlNlZSBtb3JlIGJ1dHRvbnM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2MiPkJhY2sgdG8gcHJldmlvdXMgYnV0dG9uIGxpc3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2Vla19iYXJfZGVzYyI+UGxheWJhY2sgcHJvZ3Jlc3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2MiPlNldHRpbmdzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2MiPlZpZGVvIFF1YWxpdHkgU2VsZWN0aW9uPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2NjX2lzX29uIj5TdWJ0aXRsZSBpcyBvbi4gQ2xpY2sgdG8gaGlkZSBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb2ZmIj5TdWJ0aXRsZSBpcyBvZmYuIENsaWNrIHRvIHNob3cgaXQuPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3JlcGxheV9idXR0b25fZGVzYyI+UmVwbGF5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3BsYXlfYnV0dG9uX2Rlc2MiPlBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MiPlBhdXNlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjIj5QcmV2aW91cyBtZWRpYTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9uZXh0X2J1dHRvbl9kZXNjIj5OZXh0IG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3Jld2luZF9idXR0b25fZGVzYyI+UmV3aW5kIGJ5IDEwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfZmZ3ZF9idXR0b25fZGVzYyI+R28gZm9yd2FyZCBieSAzMCBzZWNvbmRzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2xhdW5jaF9idXR0b25fZGVzYyI+TGF1bmNoIExpbms8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MiPk11dGVkLiBDbGljayB0byB1bm11dGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdW5tdXRlZF9idXR0b25fZGVzYyI+Q2xpY2sgdG8gTXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYyI+RnVsbCBzY3JlZW48L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjlhOGVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHJlc291cmNlcz4KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZm9yd2FyZF8zMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19yZXdpbmRfMTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91czwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfbmV4dDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mZndkX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcmV3aW5kX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjQ2ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1N0YXJ0Ij41ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+NWRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MzZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij4zNmRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uQmFjayI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfYXJyb3dfYmFjazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9iYWNrX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uTGF1bmNoIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19sYXVuY2g8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbGF1bmNoX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj40ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkN1cnJlbnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkludGVycHVuY3QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+wrc8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5FbmQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX2hvcml6b250YWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5DQyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2NjX2lzX29mZjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mdWxsc2NyZWVuPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93UmlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2V0dGluZ3M8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uTXV0ZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfdW5tdXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5Ij4KLSAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5PC9pdGVtPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml92aWRlb19xdWFsaXR5X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0LkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC40PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPnRvcHxjZW50ZXI8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuMzU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfHJpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLlRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY1PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0Ij4yNGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcnxsZWZ0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm9yaWVudGF0aW9uIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNjkwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2Rhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5MaWdodC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlRpdGxlIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5TdWJoZWFkIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkJvZHkxIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlOGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci08cmVzb3VyY2VzPgotICAgIDwhLS1qYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0iY2MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJmZndkIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibWVkaWFjb250cm9sbGVyX3Byb2dyZXNzIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibmV4dCIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InBhdXNlIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icHJldiIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InJldyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWUiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJ0aW1lX2N1cnJlbnQiIC8tLT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE3NTRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0Lk1lZGlhUm91dGVyLk1lZGlhUm91dGVCdXR0b248L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2Rhcms8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodENvbnRyb2xQYW5lbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBzdHlsZS9UaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuTGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY19tcl9idXR0b25fZ3JleTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQ8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodC5EYXJrQ29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5EYXJrPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcmsiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyazwvaXRlbT4KLQotICAgIDwvc3R5bGU+Ci0gICAgPHN0eWxlIG5hbWU9IlRoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2ggYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIxYTFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBVc2FnZSAnLiBydW5jdHMuc2gnCi0KLWZ1bmN0aW9uIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZSgpIHsKLSAgZWNobyAncnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzIFtvcHRpb25dOiBCdWlsZCwgZmxhc2ggZGV2aWNlLCcKLSAgZWNobyAnICAgICAgICAgICAgICBhbmQgcnVuIHN1YnNldCBvZiBDdHNNZWRpYVRlc3RDYXNlcyB0aGF0IE1lZGlhQ29tcG9uZW50cyBjb3ZlcnMuJwotICBlY2hvICcgICAgICAgICAgKldhcm5pbmcqIFRoaXMgYnlwYXNzZXMgQ1RTIHNldHVwIChlLmcuIGRvd25sb2FkIG1lZGlhIGNvbnRlbnRzIGZyb20gc2VydmVyKScKLSAgZWNobyAnICAgICAgICAgIEZvciBydW5uaW5nIENUUyBpbiBvZmZpY2lhbCB3YXksIHVzZSBhdGVzdCBvciBjdHMtdHJhZGVmZWQgJwotICBlY2hvICcgICAgIC1ofC0taGVscDogVGhpcyBoZWxwJwotICBlY2hvICcgICAgIC0tc2tpcDogU2tpcCBidWlsZCBhbmQgZmxhc2guIEp1c3QgcmVydW4tdGVzdHMnCi0gIGVjaG8gJyAgICAgLS1taW46IE9ubHkgcmVidWlsZCB0ZXN0cyBhbmQgdXBkYXRhYmxlIGxpYnJhcnkuJwotICBlY2hvICcgICAgIC0tdGVzdDogT25seSByZWJ1aWxkIHRlc3RzJwotICBlY2hvICcgICAgIC1zIFtkZXZpY2VfaWRdOiBTcGVjaWZ5IGEgZGV2aWNlIG5hbWUgdG8gcnVuIHRlc3QgYWdhaW5zdC4nCi0gIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZGVmaW5lICR7QURCSE9TVH0gaW5zdGVhZC4nCi0gIGVjaG8gJyAgICAgLXIgW2NvdW50XTogUmVwZWF0IHRlc3RzIGZvciBnaXZlbiBjb3VudC4gSXQgd2lsbCBzdG9wIHdoZW4gZmFpbHMuJwotICBlY2hvICcgICAgIC0taWdub3JlOiBLZWVwIHJlcGVhdGluZyB0ZXN0cyBldmVuIHdoZW4gaXQgZmFpbHMuJwotICBlY2hvICcgICAgIC10IFt0ZXN0XTogT25seSBydW4gdGhlIHNwZWNpZmljIHRlc3QuIENhbiBiZSBlaXRoZXIgYSBjbGFzcyBvciBhIG1ldGhvZC4nCi19Ci0KLWZ1bmN0aW9uIHJ1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cygpIHsKLSAgIyBFZGl0IGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBvdGhlciB0ZXN0cy4KLSAgIyBMaXN0IHVwIGxpYnMgYW5kIGFwa3MgaW4gdGhlIG1lZGlhX2FwaSBuZWVkZWQgZm9yIHRlc3RzLCBhbmQgcGxhY2UgdGVzdCB0YXJnZXQgYXQgdGhlIGxhc3QuCi0gIGxvY2FsIFRFU1RfUEFDS0FHRV9ESVI9KCJmcmFtZXdvcmtzL2F2L3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0IikKLSAgbG9jYWwgVEVTVF9QQUNLQUdFPSgiYW5kcm9pZC5tZWRpYS5jdHMiKQotICBsb2NhbCBCVUlMRF9UQVJHRVRTPSgiTWVkaWFDb21wb25lbnRzIiAiQ3RzTWVkaWFUZXN0Q2FzZXMiKQotICAjIERvbid0IGluY2x1ZGUgTWVkaWFDb21wb25lbnRzIC0tIGlmIHdlIHNpbXBseSBpbnN0YWxsIGl0LCBzeXN0ZW0gc2VydmVyCi0gICMgd291bGRuJ3QgdXNlIHRoZSBpbnN0YWxsZWQgb25lLgotICBsb2NhbCBJTlNUQUxMX1RBUkdFVFM9KCJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gIGxvY2FsIFRFU1RfUlVOTkVSPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICBsb2NhbCBERVBFTkRFTkNJRVM9KCJtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQiICJhbmRyb2lkLXN1cHBvcnQtdGVzdCIgImNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwiKQotICBsb2NhbCBERUZBVUxUX1RFU1RfVEFSR0VUPSIiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUJyb3dzZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUNvbnRyb2xsZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMl9QZXJtaXNzaW9uVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb25NYW5hZ2VyX01lZGlhU2Vzc2lvbjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLlNlc3Npb25Ub2tlbjJUZXN0IgotICBpZiBbWyAteiAiJHtBTkRST0lEX0JVSUxEX1RPUH0iIF1dOyB0aGVuCi0gICAgZWNobyAiTmVlZHMgdG8gbHVuY2ggYSB0YXJnZXQgZmlyc3QiCi0gICAgcmV0dXJuCi0gIGZpCi0KLSAgbG9jYWwgb2xkX3BhdGg9JHtPTERQV0R9Ci0gIHdoaWxlIHRydWU7IGRvCi0gICAgbG9jYWwgT1BUSU9OX1NLSVA9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9NSU49ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fUkVQRUFUX0NPVU5UPSIxIgotICAgIGxvY2FsIE9QVElPTl9JR05PUkU9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUX1RBUkdFVD0iJHtERUZBVUxUX1RFU1RfVEFSR0VUfSIKLSAgICBsb2NhbCBhZGJob3N0X2xvY2FsCi0gICAgd2hpbGUgKCggIiQjIiApKTsgZG8KLSAgICAgIGNhc2UgIiR7MX0iIGluCi0gICAgICAgIC1ofC0taGVscCkKLSAgICAgICAgICBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgICA7OwotICAgICAgICAtLXNraXApCi0gICAgICAgICAgT1BUSU9OX1NLSVA9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1taW4pCi0gICAgICAgICAgT1BUSU9OX01JTj0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLXRlc3QpCi0gICAgICAgICAgT1BUSU9OX1RFU1Q9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLXMpCi0gICAgICAgICAgc2hpZnQKLSAgICAgICAgICBhZGJob3N0X2xvY2FsPSR7MX0KLSAgICAgICAgICA7OwotICAgICAgICAtcikKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9SRVBFQVRfQ09VTlQ9IiR7MX0iCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1pZ25vcmUpCi0gICAgICAgICAgT1BUSU9OX0lHTk9SRT0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtdCkKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9URVNUX1RBUkdFVD0iJHsxfSIKLSAgICAgIGVzYWMKLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotCi0gICAgIyBCdWlsZCBhZGIgY29tbWFuZC4KLSAgICBsb2NhbCBhZGIKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGFkYmhvc3RfbG9jYWw9JHtBREJIT1NUfQotICAgIGZpCi0gICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCi0gICAgICBsb2NhbCBkZXZpY2VfY291bnQ9JChhZGIgZGV2aWNlcyB8IHNlZCAnL15bWzpzcGFjZTpdXSokL2QnIHwgd2MgLWwpCi0gICAgICBpZiBbWyAiJHtkZXZpY2VfY291bnR9IiAhPSAiMiIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiVG9vIG1hbnkgZGV2aWNlcy4gU3BlY2lmeSBhIGRldmljZS4iICYmIGJyZWFrCi0gICAgICBmaQotICAgICAgYWRiPSJhZGIiCi0gICAgZWxzZQotICAgICAgYWRiPSJhZGIgLXMgJHthZGJob3N0X2xvY2FsfSIKLSAgICBmaQotCi0gICAgbG9jYWwgdGFyZ2V0X2Rpcj0iJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtURVNUX1BBQ0tBR0VfRElSfSIKLSAgICAjbG9jYWwgVEVTVF9QQUNLQUdFPSQoc2VkIC1uICdzL14uKlxicGFja2FnZVxiPSJcKFthLXowLTlcLl0qXCkiLiokL1wxL3AnICR7dGFyZ2V0X2Rpcn0vQW5kcm9pZE1hbmlmZXN0LnhtbCkKLQotICAgIGlmIFtbICIke09QVElPTl9TS0lQfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQuCi0gICAgICBsb2NhbCBkZXBlbmRlbmN5Ci0gICAgICBsb2NhbCBidWlsZF9kZXBlbmRlbmN5PSIiCi0gICAgICBmb3IgZGVwZW5kZW5jeSBpbiAke0RFUEVOREVOQ0lFU1tAXX07IGRvCi0gICAgICAgIGlmIFtbICIke2RlcGVuZGVuY3l9IiA9PSAib3V0LyIqIF1dOyB0aGVuCi0gICAgICAgICAgaWYgW1sgISAtZiAke0FORFJPSURfQlVJTERfVE9QfS8ke2RlcGVuZGVuY3l9IF1dOyB0aGVuCi0gICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICBmaQotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgW1sgIiQoZmluZCAke09VVH0gLW5hbWUgJHtkZXBlbmRlbmN5fV9pbnRlcm1lZGlhdGVzIHwgd2MgLWwpIiA9PSAiMCIgXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgICBpZiBbWyAiJHtidWlsZF9kZXBlbmRlbmN5fSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkJ1aWxkaW5nIGRlcGVuZGVuY2llcy4gV2lsbCBvbmx5IHByaW50IHN0ZGVyci4iCi0gICAgICAgIG0gJHtERVBFTkRFTkNJRVNbQF19IC1qID4gL2Rldi9udWxsCi0gICAgICBmaQotCi0gICAgICAjIEJ1aWxkIHRlc3QgYXBrIGFuZCByZXF1aXJlZCBhcGsuCi0gICAgICBsb2NhbCBidWlsZF90YXJnZXRzCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0lOU1RBTExfVEFSR0VUU1tAXX0iCi0gICAgICBlbGlmIFtbICIke09QVElPTl9NSU59IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsc2UKLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSBkcm9pZCIKLSAgICAgIGZpCi0gICAgICBtICR7YnVpbGRfdGFyZ2V0c30gLWogfHwgYnJlYWsKLQotICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgIyBGbGFzaCBvbmx5IHdoZW4gbmVlZGVkCi0gICAgICAgIGxvY2FsIGRldmljZV9idWlsZF90eXBlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJ1aWxkLnR5cGUpIgotICAgICAgICBpZiBbWyAiJHtkZXZpY2VfYnVpbGRfdHlwZX0iID09ICJ1c2VyIiBdXTsgdGhlbgotICAgICAgICAgICMgVXNlciBidWlsZC4gQ2Fubm90IGFkYiBzeW5jCi0gICAgICAgICAgJHthZGJ9IHJlYm9vdCBib290bG9hZGVyCi0gICAgICAgICAgZmFzdGJvb3QgZmxhc2hhbGwKLSAgICAgICAgZWxzZQotICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgbG9jYWwgZGV2aWNlX3Zlcml0eV9tb2RlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJvb3QudmVyaXR5bW9kZSkiCi0gICAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX3Zlcml0eV9tb2RlfSIgIT0gImRpc2FibGVkIiBdXTsgdGhlbgotICAgICAgICAgICAgJHthZGJ9IGRpc2FibGUtdmVyaXR5Ci0gICAgICAgICAgICAke2FkYn0gcmVib290Ci0gICAgICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCi0gICAgICAgICAgICAke2FkYn0gcm9vdAotICAgICAgICAgIGZpCi0gICAgICAgICAgJHthZGJ9IHJlbW91bnQKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RvcAotICAgICAgICAgICR7YWRifSBzaGVsbCBzZXRwcm9wIGxvZy50YWcuTWVkaWFTZXNzaW9uU2VydmljZSBERUJVRwotICAgICAgICAgICR7YWRifSBzeW5jCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHN0YXJ0Ci0gICAgICAgIGZpCi0gICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgIyBFbnN1cmUgcGFja2FnZSBtYW5hZ2VyIGlzIGxvYWRlZC4KLSAgICAgICAgIyBUT0RPKGphZXdhbik6IEZpbmQgYmV0dGVyIHdheSB0byB3YWl0Ci0gICAgICAgIHNsZWVwIDE1Ci0gICAgICBmaQotCi0gICAgICAjIEluc3RhbGwgYXBrcwotICAgICAgbG9jYWwgaW5zdGFsbF9mYWlsZWQ9ImZhbHNlIgotICAgICAgZm9yIHRhcmdldCBpbiAke0lOU1RBTExfVEFSR0VUU1tAXX07IGRvCi0gICAgICAgIGxvY2FsIGFwa19wYXRoPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGspCi0gICAgICAgIGxvY2FsIGFwa19udW09JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwayB8IHdjIC1sKQotICAgICAgICBpZiBbWyAiJHthcGtfbnVtfSIgIT0gIjEiIF1dOyB0aGVuCi0gICAgICAgICAgZWNobyAiQ2Fubm90IGxvY2F0ZSBhICR7dGFyZ2V0fS5hcGsuIEZvdW5kICR7YXBrX251bX0gYXBrcyIgJiYgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgICAgZWNobyAiSW5zdGFsbGluZyAke3RhcmdldH0uYXBrLiBwYXRoPSR7YXBrX3BhdGh9IgotICAgICAgICAke2FkYn0gaW5zdGFsbCAtciAke2Fwa19wYXRofQotICAgICAgICBpZiBbWyAiJHs/fSIgIT0gIjAiIF1dOyB0aGVuCi0gICAgICAgICAgaW5zdGFsbF9mYWlsZWQ9InRydWUiCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2luc3RhbGxfZmFpbGVkfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkZhaWxlZCB0byBpbnN0YWxsLiBUZXN0IHdvdWxkbid0IHJ1bi4iCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBsb2NhbCB0ZXN0X3RhcmdldD0iIgotICAgIGlmIFtbIC1uICIke09QVElPTl9URVNUX1RBUkdFVH0iIF1dOyB0aGVuCi0gICAgICB0ZXN0X3RhcmdldD0iLWUgY2xhc3MgJHtPUFRJT05fVEVTVF9UQVJHRVR9IgotICAgIGZpCi0KLSAgICBsb2NhbCBpCi0gICAgbG9jYWwgdG1wZmlsZT0kKHRlbXBmaWxlKQotICAgIGZvciAoKGk9MTsgaSA8PSAke09QVElPTl9SRVBFQVRfQ09VTlR9OyBpKyspKTsgZG8KLSAgICAgIGVjaG8gIlJ1biB0ZXN0ICR7aX0vJHtPUFRJT05fUkVQRUFUX0NPVU5UfSIKLSAgICAgICR7YWRifSBzaGVsbCBhbSBpbnN0cnVtZW50ICR7dGVzdF90YXJnZXR9IC13ICR7VEVTVF9QQUNLQUdFfS8ke1RFU1RfUlVOTkVSfSA+JiAke3RtcGZpbGV9Ci0gICAgICBjYXQgJHt0bXBmaWxlfQotICAgICAgaWYgW1sgIiR7T1BUSU9OX0lHTk9SRX0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBpZiBbWyAtbiAiJChncmVwICR7dG1wZmlsZX0gLWUgJ0ZBSUxVUkVcfGNyYXNoZWQnKSIgXV07IHRoZW4KLSAgICAgICAgICAjIGFtIGluc3RydW1lbnQgZG9lc24ndCByZXR1cm4gZXJyb3IgY29kZSBzbyBuZWVkIHRvIGdyZXAgcmVzdWx0IG1lc3NhZ2UgaW5zdGVhZAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBybSAke3RtcGZpbGV9Ci0gICAgYnJlYWsKLSAgZG9uZQotfQotCi1lY2hvICJGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhZGRlZCB0byB5b3VyIGVudmlyb25tZW50OiIKLV9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg4YjcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFTZXNzaW9uMjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZnJvbSBNZWRpYVNlc3Npb24yIHRvIE1lZGlhQ29udHJvbGxlcjIuCi0gKiA8cD4KLSAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCi0gKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCi0gKi8KLS8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0vLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFDb250cm9sbGVyMiB7Ci0gICAgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpOwotICAgIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpOwotICAgIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoaW4gQnVuZGxlIHBsYXliYWNrSW5mbyk7Ci0gICAgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSk7Ci0gICAgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIGluIEJ1bmRsZSBleHRyYXMpOwotCi0gICAgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBpbiBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBpbiBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgcmVwZWF0TW9kZSwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpOwotCi0gICAgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KTsKLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChpbiBCdW5kbGUgY29tbWFuZHMpOwotCi0gICAgdm9pZCBvbkN1c3RvbUNvbW1hbmQoaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQnJvd3NlciBzZXBjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKGluIEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgaW4gQnVuZGxlIHJvb3RFeHRyYSk7Ci0gICAgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmVzdWx0KTsKLSAgICB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyByb290TWVkaWFJZCwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIGluIExpc3Q8QnVuZGxlPiByZXN1bHQsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQ0NjdkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhQ29udHJvbGxlcjIgdG8gTWVkaWFTZXNzaW9uMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0gLy8gICAgICAgICAgICAgICBOb3RlIHRoYXQgUGFyY2VsbGVkU2xpY2VMaXN0IGlzbid0IGEgZ29vZCBpZGVhIGZvciB0aGUgcHVycG9zZS4gKHNlZTogYi8zNzQ5MzY3NykKLW9uZXdheSBpbnRlcmZhY2UgSU1lZGlhU2Vzc2lvbjIgewotICAgIC8vIFRPRE8oamFld2FuKTogYWRkIG9uQ29tbWFuZCgpIHRvIHNlbmQgcHJpdmF0ZSBjb21tYW5kCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChQb3N0IFApIFdlIG1heSBjb25zaWRlciB0byBhZGQgYW5vdGhlciBiaW5kZXIganVzdCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAgICAvLyAgICAgICAgICAgICAgIG5vdCB0byBleHBvc2Ugb3RoZXIgbWV0aG9kcyB0byB0aGUgY29udHJvbGxlciB3aG9zZSBjb25uZWN0aW9uIHdhc24ndCBhY2NlcHRlZC4KLSAgICAvLyAgICAgICAgICAgICAgIEJ1dCB0aGlzIHdvdWxkIGJlIGVub3VnaCBmb3Igbm93IGJlY2F1c2UgaXQncyB0aGUgc2FtZSBhcyBleGlzdGluZwotICAgIC8vICAgICAgICAgICAgICAgTWVkaWFCcm93c2VyIGFuZCBNZWRpYUJyb3dzZXJTZXJ2aWNlLgotICAgIHZvaWQgY29ubmVjdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBjYWxsaW5nUGFja2FnZSk7Ci0gICAgdm9pZCByZWxlYXNlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0KLSAgICB2b2lkIHNldFZvbHVtZVRvKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHZhbHVlLCBpbnQgZmxhZ3MpOwotICAgIHZvaWQgYWRqdXN0Vm9sdW1lKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBpbiBCdW5kbGUgYXJncyk7Ci0gICAgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBjb21tYW5kLCBpbiBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIHZvaWQgcHJlcGFyZUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tVXJpKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbVNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbU1lZGlhSWQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZXRSYXRpbmcoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIHJhdGluZyk7Ci0KLSAgICB2b2lkIHNldFBsYXlsaXN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOwotICAgIHZvaWQgc2V0UmVwZWF0TW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIHNldFNodWZmbGVNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHNodWZmbGVNb2RlKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBsaWJyYXJ5IHNlcnZpY2Ugc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBnZXRMaWJyYXJ5Um9vdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSByb290SGludHMpOwotICAgIHZvaWQgZ2V0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkKTsKLSAgICB2b2lkIGdldENoaWxkcmVuKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgdW5zdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA5MDk5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFCcm93c2VyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyMkltcGwgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQnJvd3NlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlcjIiOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogY2hhbmdlLgotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBNZWRpYUJyb3dzZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjIpIHN1cGVyLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3RfaW1wbChCdW5kbGUgcm9vdEhpbnRzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRMaWJyYXJ5Um9vdChnZXRDb250cm9sbGVyU3R1YigpLCByb290SGludHMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnVuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW1faW1wbChTdHJpbmcgbWVkaWFJZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0SXRlbShnZXRDb250cm9sbGVyU3R1YigpLCBtZWRpYUlkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0Q2hpbGRyZW4oZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZWFyY2goZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHRfaW1wbChTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0U2VhcmNoUmVzdWx0KGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJvb3RIaW50cywgZmluYWwgU3RyaW5nIHJvb3RNZWRpYUlkLCBmaW5hbCBCdW5kbGUgcm9vdEV4dHJhKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldExpYnJhcnlSb290RG9uZShnZXRJbnN0YW5jZSgpLCByb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0SXRlbURvbmUoZ2V0SW5zdGFuY2UoKSwgbWVkaWFJZCwgaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldENoaWxkcmVuRG9uZShnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TZWFyY2hSZXN1bHRDaGFuZ2VkKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRTZWFyY2hSZXN1bHREb25lKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2hpbGRyZW5DaGFuZ2VkKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5MzY1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1Q7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLkNvbnRyb2xsZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlJlcGVhdE1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuU2h1ZmZsZU1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMlN0dWIgbUNvbnRyb2xsZXJTdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtVG9rZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyLkRlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKLQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSZWxlYXNlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAUmVwZWF0TW9kZSBpbnQgbVJlcGVhdE1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQFNodWZmbGVNb2RlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1QbGF5ZXJTdGF0ZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmxvYXQgbVBsYXliYWNrU3BlZWQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtQWxsb3dlZENvbW1hbmRzOwotCi0gICAgLy8gQXNzaWdubWVudCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBsb2NrIGhvbGQsIGJ1dCBzaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50Ci0gICAgLy8gcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIC8vIFBvc3RmaXggLUJpbmRlciBpcyBhZGRlZCB0byBleHBsaWNpdGx5IHNob3cgdGhhdCBpdCdzIHBvdGVudGlhbGx5IHJlbW90ZSBwcm9jZXNzIGNhbGwuCi0gICAgLy8gVGVjaG5pY2FsbHkgLUludGVyZmFjZSBpcyBtb3JlIGNvcnJlY3QsIGJ1dCBpdCBtYXkgbWlzcmVhZCB0aGF0IGl0J3MgaW50ZXJmYWNlICh2cyBjbGFzcykKLSAgICAvLyBzbyBsZXQncyBrZWVwIHRoaXMgcG9zdGZpeCB1bnRpbCB3ZSBmaW5kIGJldHRlciBwb3N0Zml4LgotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIHZvbGF0aWxlIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZXF1aXJlIHNlc3Npb24gYWN0aXZlbmVzcyBjaGFuZ2VkIGxpc3RlbmVyLCBiZWNhdXNlIGNvbnRyb2xsZXIgY2FuIGJlCi0gICAgLy8gICAgICAgICAgICAgICBhdmFpbGFibGUgd2hlbiB0aGUgc2Vzc2lvbidzIHBsYXllciBpcyBudWxsLgotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRva2VuIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ29udHJvbGxlclN0dWIgPSBuZXcgTWVkaWFDb250cm9sbGVyMlN0dWIodGhpcyk7Ci0gICAgICAgIG1Ub2tlbiA9IHRva2VuOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgbURlYXRoUmVjaXBpZW50ID0gKCkgLT4gewotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogTW9yZSBzYW5pdHkgY2hlY2tzLgotICAgICAgICBpZiAobVRva2VuLmdldFR5cGUoKSA9PSBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTikgewotICAgICAgICAgICAgLy8gU2Vzc2lvbgotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBzeXN0ZW0gc2VydmVyIChNZWRpYVNlc3Npb25TZXJ2aWNlKSB0aGF0IHdhbnRzIHRvIG1vbml0b3Igc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAvLyBEb24ndCBiaW5kIGlmIGFibGUuLgotICAgICAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBiaW5kZXIgaW4gdGhlIHNlc3Npb24gdG9rZW4gaW5zdGVhZCBvZiBiaW5kIGJ5IGl0cyBvd24uCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBob2xkcyB0aGUgYmluZGluZyB0byB0aGUgc2VydmljZSAqZm9yZXZlciogYW5kIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZXZlciBzdG9wLgotICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBzeXN0ZW0gc2VydmVyIHdhbnRzIHRvIGRpc3BhdGNoIG1lZGlhIGtleSBldmVudHMgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gYSBkZWFkIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN5c3RlbSBzZXJ2ZXIgYmluZHMgdG8gYSBzZXNzaW9uIHNlcnZpY2UuIFNob3VsZCB1bmJpbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2UuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgY29ubmVjdFRvU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIFNlcnZpY2UuIE5lZWRzIHRvIGdldCBmcmVzaCBiaW5kZXIgd2hlbmV2ZXIgY29ubmVjdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgIFNlc3Npb25Ub2tlbjJJbXBsIGltcGwgPSBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbik7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKSwgaW1wbC5nZXRTZXJ2aWNlTmFtZSgpKTsKLQotICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2UoKSBpbnN0ZWFkIG9mIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKSB0byBzdGFydCBzZXNzaW9uIHNlcnZpY2UgZm9yIHRocmVlCi0gICAgICAgIC8vIHJlYXNvbnMuCi0gICAgICAgIC8vIDEuIFByZXZlbnQgc2Vzc2lvbiBzZXJ2aWNlIG93bmVyJ3Mgc3RvcFNlbGYoKSBmcm9tIGRlc3Ryb3lpbmcgc2VydmljZS4KLSAgICAgICAgLy8gICAgV2l0aCB0aGUgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLCBzZXJ2aWNlJ3MgY2FsbCBvZiBzdG9wU2VsZigpIHdpbGwgdHJpZ2dlciBpbW1lZGlhdGUKLSAgICAgICAgLy8gICAgb25EZXN0cm95KCkgY2FsbHMgb24gdGhlIG1haW4gdGhyZWFkIGV2ZW4gd2hlbiBvbkNvbm5lY3QoKSBpcyBydW5uaW5nIGluIGFub3RoZXIKLSAgICAgICAgLy8gICAgdGhyZWFkLgotICAgICAgICAvLyAyLiBNaW5pbWl6ZSBBUElzIGZvciBkZXZlbG9wZXJzIHRvIHRha2UgY2FyZSBhYm91dC4KLSAgICAgICAgLy8gICAgV2l0aCBiaW5kU2VydmljZSgpLCBkZXZlbG9wZXJzIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQgU2VydmljZS5vbkJpbmQoKQotICAgICAgICAvLyAgICBidXQgU2VydmljZS5vblN0YXJ0Q29tbWFuZCgpIHNob3VsZCBiZSBhbHNvIHRha2VuIGNhcmUgYWJvdXQgd2l0aCB0aGUKLSAgICAgICAgLy8gICAgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLgotICAgICAgICAvLyAzLiBGdXR1cmUgc3VwcG9ydCBmb3IgVUktbGVzcyBwbGF5YmFjawotICAgICAgICAvLyAgICBJZiBhIHNlcnZpY2Ugd2FudHMgdG8ga2VlcCBydW5uaW5nLCBpdCBzaG91bGQgYmUgZWl0aGVyIGZvcmVncm91bmQgc2VydmljZSBvcgotICAgICAgICAvLyAgICBib3VuZGVkIHNlcnZpY2UuIEJ1dCB0aGVyZSBoYWQgYmVlbiByZXF1ZXN0IGZvciB0aGUgZmVhdHVyZSBmb3Igc3lzdGVtIGFwcHMKLSAgICAgICAgLy8gICAgYW5kIHVzaW5nIGJpbmRTZXJ2aWNlKCkgd2lsbCBiZSBiZXR0ZXIgZml0IHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpID09IFByb2Nlc3MuU1lTVEVNX1VJRCkgewotICAgICAgICAgICAgLy8gVXNlIGJpbmRTZXJ2aWNlQXNVc2VyKCkgZm9yIGJpbmRpbmcgZnJvbSBzeXN0ZW0gc2VydmljZSB0byBhdm9pZCBmb2xsb3dpbmcgd2FybmluZy4KLSAgICAgICAgICAgIC8vIENvbnRleHRJbXBsOiBDYWxsaW5nIGEgbWV0aG9kIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3aXRob3V0IGEgcXVhbGlmaWVkIHVzZXIKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlQXNVc2VyKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUsCi0gICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuZ2V0VXNlckhhbmRsZUZvclVpZChtVG9rZW4uZ2V0VWlkKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIHN1Y2Nlc3MiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0VG9TZXNzaW9uKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb25CaW5kZXIuY29ubmVjdChtQ29udHJvbGxlclN0dWIsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGNhbGwgY29ubmVjdGlvbiByZXF1ZXN0LiBGcmFtZXdvcmsgd2lsbCByZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGF1dG9tYXRpY2FsbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZSBmcm9tICIgKyBtVG9rZW4pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJldmVudCByZS1lbnRlcmFuY2UgZnJvbSB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNSZWxlYXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJTdHViLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFzQmluZGVyKCkudW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQsIDApOwotICAgICAgICAgICAgICAgIGJpbmRlci5yZWxlYXNlKG1Db250cm9sbGVyU3R1Yik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vLW9wLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKG1JbnN0YW5jZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YiBnZXRDb250cm9sbGVyU3R1YigpIHsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyU3R1YjsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFDb250cm9sbGVyMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgaXNuJ3QgYWxsb3dlZCB0by4KLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kQ29kZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyBzZXNzaW9uIGJpbmRlciBpZiB0aGUgY29udHJvbGxlciBjYW4gc2VuZCB0aGUgY29tbWFuZC4KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVySWZBYmxlKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIHRvIGNhbGwgY29tbWFuZCwgY29tbWFuZD0iICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhvbGQ/Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgZGlzY29ubmVjdGVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICByZXR1cm4gYmluZGVyICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1BsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9QcmV2aW91c0l0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvTmV4dEl0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGNvbW1hbmRDb2RlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZENvZGUsIGFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHlfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG9faW1wbChpbnQgdmFsdWUsIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRWb2x1bWVUbyhtQ29udHJvbGxlclN0dWIsIHZhbHVlLCBmbGFncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZV9pbXBsKGludCBkaXJlY3Rpb24sIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGp1c3RWb2x1bWUobUNvbnRyb2xsZXJTdHViLCBkaXJlY3Rpb24sIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpX2ltcGwoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkkpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVyaSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21VcmkobUNvbnRyb2xsZXJTdHViLCB1cmksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVNlYXJjaChtQ29udHJvbGxlclN0dWIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZF9pbXBsKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEKTsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21NZWRpYUlkKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmdfaW1wbChTdHJpbmcgbWVkaWFJZCwgUmF0aW5nMiByYXRpbmcpIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmF0aW5nIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSYXRpbmcobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCByYXRpbmcudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIGNiKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKGNvbW1hbmQpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlbmRDdXN0b21Db21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZC50b0J1bmRsZSgpLCBhcmdzLCBjYik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQobGlzdC5nZXQoaSkudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFBsYXlsaXN0KG1Db250cm9sbGVyU3R1YiwgYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXlsaXN0TWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtQ29udHJvbGxlclN0dWIsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmYXN0Rm9yd2FyZF9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCB0aGlzLiBOb3RlIHRoYXQgZmFzdCBmb3J3YXJkIGlzbid0IGEgdHJhbnNwb3J0IGNvbW1hbmQgYW55bW9yZQotICAgICAgICAvL3NlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChNZWRpYVNlc3Npb24yLkNPTU1BTkRfQ09ERV9TRVNTSU9OX0ZBU1RfRk9SV0FSRCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmV3aW5kX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCByZXdpbmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fUkVXSU5EKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicG9zaXRpb24gc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGFyZ3MucHV0TG9uZyhNZWRpYVNlc3Npb24yU3R1Yi5BUkdVTUVOVF9LRVlfUE9TSVRJT04sIHBvcyk7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE8sIGFyZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYWRkUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbW92ZVBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5yZXBsYWNlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRTaHVmZmxlTW9kZShtQ29udHJvbGxlclN0dWIsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSZXBlYXRNb2RlKG1Db250cm9sbGVyU3R1YiwgcmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllclN0YXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGxvbmcgdGltZURpZmYgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgbG9uZyBleHBlY3RlZFBvc2l0aW9uID0gbVBvc2l0aW9uTXMgKyAobG9uZykgKG1QbGF5YmFja1NwZWVkICogdGltZURpZmYpOwotICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cGVjdGVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBsYXliYWNrU3BlZWRfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1NwZWVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRNZWRpYUl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWVyU3RhdGVDaGFuZ2VzKGZpbmFsIGludCBzdGF0ZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWVyU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQobUluc3RhbmNlLCBzdGF0ZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lIHRvIHNlZWsgY29tcGxldGVkCi0gICAgdm9pZCBwdXNoUG9zaXRpb25DaGFuZ2VzKGZpbmFsIGxvbmcgZXZlbnRUaW1lTXMsIGZpbmFsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUG9zaXRpb25FdmVudFRpbWVNcyA9IGV2ZW50VGltZU1zOwotICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBwb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlZWtDb21wbGV0ZWQobUluc3RhbmNlLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoZmluYWwgZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja1NwZWVkQ2hhbmdlZChtSW5zdGFuY2UsIHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpeCB0aGlzIC0tIGl0J3Mgbm93IGJ1ZmZlcmVkIHN0YXRlCi0gICAgICAgICAgICAvL21DYWxsYmFjay5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKG1JbnN0YW5jZSwgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhmaW5hbCBQbGF5YmFja0luZm8gaW5mbykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja0luZm9DaGFuZ2VkKG1JbnN0YW5jZSwgaW5mbyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXlsaXN0Q2hhbmdlcyhmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3QgPSBwbGF5bGlzdDsKLSAgICAgICAgICAgIG1QbGF5bGlzdE1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQobUluc3RhbmNlLCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFJlcGVhdE1vZGVDaGFuZ2VzKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHJlcGVhdE1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkVycm9yKG1JbnN0YW5jZSwgZXJyb3JDb2RlLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICB2b2lkIG9uQ29ubmVjdGVkTm90TG9ja2VkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsCi0gICAgICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbywKLSAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWROb3RMb2NrZWQgc2Vzc2lvbkJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcgotICAgICAgICAgICAgICAgICAgICArICIsIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGNsb3NlID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsIHx8IGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiByZWplY3RlZC4KLSAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtSXNSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBiZSBub3RpZmllZCBhYm91dCB0aGUgY29ubmVjdGlvbiByZXN1bHQgbWFueSB0aW1lcy4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFByb2JhYmx5IGEgYnVnIG9yIG1hbGljaW91cyBhcHAuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRzID0gYWxsb3dlZENvbW1hbmRzOwotICAgICAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gcG9zaXRpb25FdmVudFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOwotICAgICAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uTXMgPSBidWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87Ci0gICAgICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBzZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciB0aGUgbG9jYWwgYmluZGVyIGlzIG5vLW9wLAotICAgICAgICAgICAgICAgICAgICAvLyBzbyBjYW4gYmUgdXNlZCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGRlYWRsb2NrLgotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGRpZWQgdG9vIGVhcmx5LiIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBjb21tYW5kcyB0byBwcmV2ZW50cyBpbGxlZ2FsIEFQSSBjYWxscy4KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG1heSB0cmlnZ2VyIENvbnRyb2xsZXJDYWxsYmFja3Mgd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAvLyBCdXQgaXQncyBoYXJkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyb2xsZXIgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gT25seSBub3RpZnkgYWJvdXQgdGhlCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGVkKG1JbnN0YW5jZSwgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNsb3NlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJpY2sgdG8gY2FsbCByZWxlYXNlKCkgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jawotICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGRldmVsb3BlcidzIGN1c3RvbSBsb2NrIHdpdGhpbiB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkuCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgZmluYWwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ3VzdG9tQ29tbWFuZCBjbWQ9IiArIGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLgotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tQ29tbWFuZChtSW5zdGFuY2UsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKG1JbnN0YW5jZSwgY29tbWFuZHMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChmaW5hbCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkN1c3RvbUxheW91dENoYW5nZWQobUluc3RhbmNlLCBsYXlvdXQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgYWx3YXlzIG1haW4tdGhyZWFkLgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlQ29ubmVjdGVkICIgKyBuYW1lICsgIiAiICsgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sKLSAgICAgICAgICAgIGlmICghbVRva2VuLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKG5hbWUuZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgbmFtZSArICIgd2FzIGNvbm5lY3RlZCwgYnV0IGV4cGVjdGVkIHBrZz0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpICsgIiB3aXRoIGlkPSIgKyBtVG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciA9IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKHNlc3Npb25CaW5kZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFRlbXBvcmFsIGxvc2Ugb2YgdGhlIGJpbmRpbmcgYmVjYXVzZSBvZiB0aGUgc2VydmljZSBjcmFzaC4gU3lzdGVtIHdpbGwgYXV0b21hdGljYWxseQotICAgICAgICAgICAgLy8gcmViaW5kLCBzbyBqdXN0IG5vLW9wLgotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZWFsbHk/IEVpdGhlciBkaXNjb25uZWN0IGNsZWFubHkgb3IKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gc2VydmljZSAiICsgbmFtZSArICIgaXMgZGlzY29ubmVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmluZGluZ0RpZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICAvLyBQZXJtYW5lbnQgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIHBhY2thZ2UgdXBkYXRlIG9yIHJlbW92ZWQuCi0gICAgICAgICAgICAvLyBUaGlzIFNlc3Npb25TZXJ2aWNlUmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCBhY2NvcmRpbmdseSwgYnV0IGZvcmdldCBzZXNzaW9uIGJpbmRlciBoZXJlCi0gICAgICAgICAgICAvLyBmb3Igc3VyZS4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm9JbXBsIGltcGxlbWVudHMgUGxheWJhY2tJbmZvUHJvdmlkZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwucGxheWJhY2tfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jb250cm9sX3R5cGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLm1heF92b2x1bWUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlRfVk9MVU1FID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jdXJyZW50X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fQVRUUklCVVRFUyA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuYXVkaW9fYXR0cnMiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUGxheWJhY2tJbmZvIG1JbnN0YW5jZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyczsKLQotICAgICAgICBwcml2YXRlIFBsYXliYWNrSW5mb0ltcGwoaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBwbGF5YmFja1R5cGU7Ci0gICAgICAgICAgICBtQXVkaW9BdHRycyA9IGF0dHJzOwotICAgICAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgICAgICBtTWF4Vm9sdW1lID0gbWF4OwotICAgICAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50OwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFBsYXliYWNrSW5mbyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9BdHRyczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXliYWNrSW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBCdW5kbGUgdG9CdW5kbGUoKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgbVBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT05UUk9MX1RZUEUsIG1Db250cm9sVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9NQVhfVk9MVU1FLCBtTWF4Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FLCBtQ3VycmVudFZvbHVtZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUywgbUF1ZGlvQXR0cnMpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gY3JlYXRlUGxheWJhY2tJbmZvKGludCBwbGF5YmFja1R5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbFR5cGUsIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrSW5mb0ltcGwocGxheWJhY2tUeXBlLCBhdHRycywgY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUGxheWJhY2tJbmZvIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lVHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZUNvbnRyb2wgPSBidW5kbGUuZ2V0SW50KEtFWV9DT05UUk9MX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IG1heFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX01BWF9WT0xVTUUpOwotICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRWb2x1bWUgPSBidW5kbGUuZ2V0SW50KEtFWV9DVVJSRU5UX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMgPSBidW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQbGF5YmFja0luZm8odm9sdW1lVHlwZSwgYXR0cnMsIHZvbHVtZUNvbnRyb2wsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmM1ZGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMlN0dWIgZXh0ZW5kcyBJTWVkaWFDb250cm9sbGVyMi5TdHViIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlcjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYUNvbnRyb2xsZXIySW1wbD4gbUNvbnRyb2xsZXI7Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YihNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlcjJJbXBsIGdldENvbnRyb2xsZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250cm9sbGVyIGlzIHJlbGVhc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUJyb3dzZXIySW1wbCBnZXRCcm93c2VyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgTWVkaWFCcm93c2VyMkltcGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMkltcGwpIGNvbnRyb2xsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoc3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUG9zaXRpb25DaGFuZ2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldmVudFRpbWVNcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGV2ZW50VGltZU1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwb3NpdGlvbk1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUG9zaXRpb25DaGFuZ2VzKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3BlZWRDaGFuZ2VkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoc3BlZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyZWRQb3NpdGlvbk1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBidWZmZXJlZFBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZSwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXlsaXN0QnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWxpc3RDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWxpc3QgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBwbGF5bGlzdEJ1bmRsZSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBpdGVtIGluIHBsYXlsaXN0Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5bGlzdENoYW5nZXMocGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VzKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUmVwZWF0TW9kZUNoYW5nZXMocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5YmFja0luZm9DaGFuZ2VkKEJ1bmRsZSBwbGF5YmFja0luZm8pIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvIGluZm8gPSBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKTsKLSAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5YmFja0luZm9DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWJhY2tJbmZvIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoc2h1ZmZsZU1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgc2h1ZmZsZU1vZGUsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGVkIGFmdGVyIE1lZGlhQ29udHJvbGxlcjIuY2xvc2UoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1CdW5kbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGVMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpdGVtTGlzdC5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25Db25uZWN0ZWROb3RMb2NrZWQoc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRHcm91cCksCi0gICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgICAgICBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgaXRlbUxpc3QsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25EaXNjb25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKExpc3Q8QnVuZGxlPiBjb21tYW5kQnV0dG9ubGlzdCkgewotICAgICAgICBpZiAoY29tbWFuZEJ1dHRvbmxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21MYXlvdXRDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZEJ1dHRvbmxpc3QiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZEJ1dHRvbmxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbW1hbmRCdXR0b24gYnV0dG9uID0gQ29tbWFuZEJ1dHRvbkltcGwuZnJvbUJ1bmRsZShjb21tYW5kQnV0dG9ubGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKGJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LmFkZChidXR0b24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21MYXlvdXRDaGFuZ2VkKGxheW91dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKEJ1bmRsZSBjb21tYW5kc0J1bmRsZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzID0gU2Vzc2lvbkNvbW1hbmRHcm91cDIuZnJvbUJ1bmRsZShjb21tYW5kc0J1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUNvbW1hbmQoQnVuZGxlIGNvbW1hbmRCdW5kbGUsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNZWRpYUJyb3dzZXIgc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgQnVuZGxlIHJvb3RFeHRyYSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgaXRlbUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldEl0ZW1Eb25lKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShpdGVtQnVuZGxlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldENoaWxkcmVuRG9uZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0Q2hpbGRyZW5Eb25lKHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uU2VhcmNoUmVzdWx0Q2hhbmdlZCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vblNlYXJjaFJlc3VsdENoYW5nZWQocXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0U2VhcmNoUmVzdWx0RG9uZSgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGl0ZW1CdW5kbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldFNlYXJjaFJlc3VsdERvbmUocXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkNoaWxkcmVuQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBhMGYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX0JST1dTQUJMRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfUExBWUFCTEU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZsYWdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotcHVibGljIGNsYXNzIE1lZGlhSXRlbTJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GTEFHUyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuZmxhZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVUQURBVEEgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLm1ldGFkYXRhIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VVSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLnV1aWQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOwotICAgIHByaXZhdGUgZmluYWwgVVVJRCBtVVVJRDsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgIC8vIEZyb20gdGhlIHB1YmxpYyBBUEkKLSAgICBwdWJsaWMgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgdGhpcyhtZWRpYUlkLCBkc2QsIG1ldGFkYXRhLCBmbGFncywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncywgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobWVkaWFJZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYWlkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWQgPSBtZWRpYUlkOwotICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkc2Q7Ci0gICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgbVVVSUQgPSAodXVpZCA9PSBudWxsKSA/IFVVSUQucmFuZG9tVVVJRCgpIDogdXVpZDsKLQotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFJdGVtMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lZGlhSXRlbTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFJdGVtMiBvdGhlciA9IChNZWRpYUl0ZW0yKSBvYmo7Ci0gICAgICAgIHJldHVybiBtVVVJRC5lcXVhbHMoKChNZWRpYUl0ZW0ySW1wbCkgb3RoZXIuZ2V0UHJvdmlkZXIoKSkubVVVSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIG9iamVjdCBhcyBhIGJ1bmRsZSB0byBzaGFyZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgYnVuZGxlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgbUlkKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfRkxBR1MsIG1GbGFncyk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfTUVUQURBVEEsIG1NZXRhZGF0YS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9VVUlELCBtVVVJRC50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHV1aWRTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9VVUlEKTsKLSAgICAgICAgcmV0dXJuIGZyb21CdW5kbGUoYnVuZGxlLCBVVUlELmZyb21TdHJpbmcodXVpZFN0cmluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBVVUlEfS4KLSAgICAgKiBJZiB7QGxpbmsgVVVJRH0KLSAgICAgKiBjYW4gYmUgbnVsbCBmb3IgY3JlYXRpbmcgbmV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHBhcmFtIHV1aWQgQSB7QGxpbmsgVVVJRH0gdG8gb3ZlcnJpZGUuIENhbiBiZSB7QGxpbmsgbnVsbH0gZm9yIG92ZXJyaWRlLgotICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgotICAgICAqLwotICAgIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGUoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSwgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gYnVuZGxlLmdldEJ1bmRsZShLRVlfTUVUQURBVEEpOwotICAgICAgICBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBidW5kbGUuZ2V0SW50KEtFWV9GTEFHUyk7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG51bGwsIG1ldGFkYXRhLCBmbGFncywgdXVpZCkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1lZGlhSXRlbTJ7Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgibUZsYWdzPSIpLmFwcGVuZChtRmxhZ3MpOwotICAgICAgICBzYi5hcHBlbmQoIiwgbU1ldGFkYXRhPSIpLmFwcGVuZChtTWV0YWRhdGEpOwotICAgICAgICBzYi5hcHBlbmQoJ30nKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBGbGFncyBpbnQgZ2V0RmxhZ3NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1GbGFnczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3dzYWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfQlJPV1NBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGxheWFibGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX1BMQVlBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1JZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYUlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATm9uTnVsbCBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZ2V0RGF0YVNvdXJjZURlc2NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgQEZsYWdzIGludCBtRmxhZ3M7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1NZWRpYUlkOwotICAgICAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKEJ1aWxkZXIgaW5zdGFuY2UsIGludCBmbGFncykgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkX2ltcGwoQE51bGxhYmxlIFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGF0YVNvdXJjZURlc2NfaW1wbChATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZGF0YVNvdXJjZURlc2MpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRhdGFTb3VyY2VEZXNjOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gKG1NZXRhZGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX01FRElBX0lEKSA6IG51bGw7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vICBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiBpdHMgc3VmZmljaWVudCAoZS5nLiBVc2UgVVVJRCBpbnN0ZWFkPykKLSAgICAgICAgICAgICAgICBpZCA9IChtTWVkaWFJZCAhPSBudWxsKSA/IG1NZWRpYUlkIDogdG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG1EYXRhU291cmNlRGVzYywgbU1ldGFkYXRhLCBtRmxhZ3MpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzNGNkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJCYXNlSW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uIG1MaWJyYXJ5U2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZV9pbXBsKCk7Ci0KLSAgICAgICAgLy8gRWZmZWN0aXZlbHkgZmluYWwKLSAgICAgICAgTWVkaWFTZXNzaW9uMiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBNZWRpYUxpYnJhcnlTZXNzaW9uLCBidXQgcmV0dXJuZWQgTWVkaWFTZXNzaW9uMiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MaWJyYXJ5U2Vzc2lvbiA9IChNZWRpYUxpYnJhcnlTZXNzaW9uKSBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFMaWJyYXJ5U2Vzc2lvblByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBTdHJpbmcgaWQsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHBsYXllciwgaWQsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyLCBzZXNzaW9uQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIC8vIERvbid0IHB1dCBhbnkgZXh0cmEgaW5pdGlhbGl6YXRpb24gaGVyZS4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgICAgICAgICAvLyBTeXN0ZW0gc2VydmljZSB3aWxsIHJlY29nbml6ZSB0aGlzIHNlc3Npb24gaW5zaWRlIG9mIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBhbmQgd291bGQKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhpcyBzZXNzaW9uIGFzc3VtaW5nIHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQuIEhvd2V2ZXIsIGlmIGFueQotICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gbG9naWMgaXMgaGVyZSwgY2FsbHMgZnJvbSB0aGUgc2VydmVyIHdvdWxkIGZhaWwuCi0gICAgICAgICAgICAvLyBzZWU6IE1lZGlhU2Vzc2lvbjJTdHViI2Nvbm5lY3QoKQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24gY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlc3Npb24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaykgc3VwZXIuZ2V0Q2FsbGJhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKGNvbnRyb2xsZXIsIHBhcmVudElkLCBpdGVtQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChjb250cm9sbGVyLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBzZXJ2aWNlLCBCdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uQ2FsbGJhY2tfaW1wbChjYWxsYmFja0V4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGlicmFyeVJvb3RJbXBsIGltcGxlbWVudHMgTGlicmFyeVJvb3RQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlicmFyeVJvb3QgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm9vdElkOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBMaWJyYXJ5Um9vdEltcGwoTGlicmFyeVJvb3QgaW5zdGFuY2UsIFN0cmluZyByb290SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvb3RJZCBzaG91bGRuJ3QgYmUgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVJvb3RJZCA9IHJvb3RJZDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm9vdElkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFjNTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJpdG1hcEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5Mb25nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuUmF0aW5nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuVGV4dEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFNZXRhZGF0YTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYU1ldGFkYXRhMkltcGwgaW1wbGVtZW50cyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTWV0YWRhdGEyIjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9MT05HID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfVEVYVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0JJVE1BUCA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1JBVElORyA9IDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0ZMT0FUID0gNDsKLSAgICBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBNRVRBREFUQV9LRVlTX1RZUEU7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUgPSBuZXcgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FVVEhPUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfV1JJVEVSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9JRCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQlRfRk9MREVSX1RZUEUsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRE9XTkxPQURfU1RBVFVTLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0RFU0NSSVBUSU9OX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RJVExFLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfV1JJVEVSLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FVVEhPUiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9DT01QT1NFUgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAQml0bWFwS2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0JJVE1BUF9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleQotICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9VUklfT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRfVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMkltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIodGhpcyk7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5X2ltcGwoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldE1lZGlhSWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5nZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX0lEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ19pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKGtleSwgMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgZ2V0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBSYXRpbmcyIHJhdGluZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoa2V5KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSByYXRpbmcKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBSYXRpbmcuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJhdGluZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEZsb2F0KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJpdG1hcCBnZXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCaXRtYXAgYm1wID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJtcCA9IG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShrZXkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgYml0bWFwCi0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgQml0bWFwLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibXA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhbiBidW5kbGUKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhbiBleHRyYSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc2l6ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFNZXRhZGF0YTIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIChidW5kbGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IE1lZGlhTWV0YWRhdGEySW1wbChidW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic291cmNlIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHNvdXJjZS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChpbnQgbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIodGhpcyk7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBtQnVuZGxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJ1bmRsZS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtcCA9IChCaXRtYXApIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYm1wLmdldEhlaWdodCgpID4gbWF4Qml0bWFwU2l6ZSB8fCBibXAuZ2V0V2lkdGgoKSA+IG1heEJpdG1hcFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wdXRCaXRtYXAoa2V5LCBzY2FsZUJpdG1hcChibXAsIG1heEJpdG1hcFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBDaGFyU2VxdWVuY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBTdHJpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0xPTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIGxvbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFJhdGluZ19pbXBsKEBSYXRpbmdLZXkgU3RyaW5nIGtleSwgUmF0aW5nMiB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfUkFUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBSYXRpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShrZXksIHZhbHVlLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXksIEJpdG1hcCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfQklUTUFQKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBCaXRtYXAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEZsb2F0X2ltcGwoQEZsb2F0S2V5IFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9GTE9BVCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgZmxvYXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEZsb2F0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTLCBidW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKG1CdW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEJpdG1hcCBzY2FsZUJpdG1hcChCaXRtYXAgYm1wLCBpbnQgbWF4U2l6ZSkgewotICAgICAgICAgICAgZmxvYXQgbWF4U2l6ZUYgPSBtYXhTaXplOwotICAgICAgICAgICAgZmxvYXQgd2lkdGhTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldEhlaWdodCgpOwotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgKGJtcC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChibXAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGJtcCwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDRlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5DYWxsYmFja0V4ZWN1dG9yOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFQbGF5bGlzdEFnZW50SW1wbCBpbXBsZW1lbnRzIE1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUGxheWxpc3RBZ2VudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBtSW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsKE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAotICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzLmdldChjYWxsYmFjaykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNhbGxiYWNrIGlzIGFscmVhZHkgYWRkZWQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBleGVjdXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5yZW1vdmUoY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0PSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFNodWZmbGVNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UmVwZWF0TW9kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW1faW1wbChATm9uTnVsbCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkc2Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIGlmIChpdGVtTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1MaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBpdGVtTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSA9PSBkc2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGdldENhbGxiYWNrcygpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY2FsbGJhY2tzLnB1dEFsbChtQ2FsbGJhY2tzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FsbGJhY2tzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNjA0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX0NVU1RPTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0ZvY3VzUmVxdWVzdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5TZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb24yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ly9Mb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJTdHViIG1TZXNzaW9uU3R1YjsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbVNlc3Npb25Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBtUGxheWxpc3RFdmVudENhbGxiYWNrOwotCi0gICAgLy8gbVBsYXllciBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgYW5kIHdlIHNob3VsZG4ndCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAvLyBub3IgbGVhdmUgbG9nIGFsd2F5cyBmb3IgdXNpbmcgbVBsYXllciB3aGVuIGl0J3MgbnVsbC4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgLy8gV2hlbiBhIE1lZGlhU2Vzc2lvbjIgaXMgY2xvc2VkLCB0aGVyZSBjb3VsZCBiZSBhIHBlbmRlZCBvcGVyYXRpb24gaW4gdGhlIHNlc3Npb24gY2FsbGJhY2sKLSAgICAvLyBleGVjdXRvciB0aGF0IG1heSB3YW50IHRvIGFjY2VzcyB0aGUgcGxheWVyLiBIZXJlJ3MgdGhlIHNhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIHRoYXQuCi0gICAgLy8KLSAgICAvLyAgIHB1YmxpYyB2b2lkIG9uRm9vKCkgewotICAgIC8vICAgICBpZiAobVBsYXllciA9PSBudWxsKSByZXR1cm47IC8vIGZpcnN0IGNoZWNrCi0gICAgLy8gICAgIG1TZXNzaW9uQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRvcigoKSAtPiB7Ci0gICAgLy8gICAgICAgLy8gRXJyb3IuIFNlc3Npb24gbWF5IGJlIGNsb3NlZCBhbmQgbVBsYXllciBjYW4gYmUgbnVsbCBoZXJlLgotICAgIC8vICAgICAgIG1QbGF5ZXIuZm9vKCk7Ci0gICAgLy8gICAgIH0pOwotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gQnkgYWRkaW5nIHByb3RlY3RpdmUgY29kZSwgd2UgY2FuIGFsc28gcHJvdGVjdCBBUElzIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBjbG9zZSgpCi0gICAgLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBwdXQgdm9sYXRpbGUgaGVyZT8KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXlsaXN0QWdlbnQgbVBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbVNlc3Npb25QbGF5bGlzdEFnZW50OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyMiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotCi0gICAgLyoqCi0gICAgICogQ2FuIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlciNidWlsZCgpfS4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwbGF5ZXIKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gcGxheWxpc3RBZ2VudAotICAgICAqIEBwYXJhbSB2b2x1bWVQcm92aWRlcgotICAgICAqIEBwYXJhbSBzZXNzaW9uQWN0aXZpdHkKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2tFeGVjdXRvcgotICAgICAqIEBwYXJhbSBjYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24ySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIFNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEtlZXAgb3RoZXIgcGFyYW1zLgotICAgICAgICBtSW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIEFyZ3VtZW50IGNoZWNrcyBhcmUgZG9uZSBieSBidWlsZGVyIGFscmVhZHkuCi0gICAgICAgIC8vIEluaXRpYWxpemUgZmluYWxzIGZpcnN0LgotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBjYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbkFjdGl2aXR5OwotICAgICAgICBtU2Vzc2lvblN0dWIgPSBuZXcgTWVkaWFTZXNzaW9uMlN0dWIodGhpcyk7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKHRoaXMpOwotICAgICAgICBtUGxheWxpc3RFdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKHRoaXMpOwotCi0gICAgICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGUgaWQgYW5kIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgU3RyaW5nIGxpYnJhcnlTZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgU3RyaW5nIHNlc3Npb25TZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgaWYgKHNlc3Npb25TZXJ2aWNlICE9IG51bGwgJiYgbGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX0xJQlJBUllfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbGlicmFyeVNlcnZpY2UsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTl9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBzZXNzaW9uU2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX1NFU1NJT04sCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG51bGwsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0KLSAgICAgICAgLy8gQXNrIHNlcnZlciBmb3IgdGhlIHNhbml0eSBjaGVjaywgYW5kIHN0YXJ0cwotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIG1ha2luZyBzZXNzaW9uIElEIHVuaXF1ZSAncGVyIHBhY2thZ2UnIGNhbm5vdCBiZSBkb25lIGluIGhlcmUuCi0gICAgICAgIC8vIFNlcnZlciBjYW4gb25seSBrbm93IGlmIHRoZSBwYWNrYWdlIGhhcyBhbm90aGVyIHByb2Nlc3MgYW5kIGhhcyBhbm90aGVyIHNlc3Npb24gd2l0aCB0aGUKLSAgICAgICAgLy8gc2FtZSBpZC4gTm90ZSB0aGF0ICdJRCBpcyB1bmlxdWUgcGVyIHBhY2thZ2UnIGlzIGltcG9ydGFudCBmb3IgY29udHJvbGxlciB0byBkaXN0aW5ndWlzaAotICAgICAgICAvLyBhIHNlc3Npb24gaW4gYW5vdGhlciBwYWNrYWdlLgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgaWYgKCFtYW5hZ2VyLmNyZWF0ZVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTZXNzaW9uIHdpdGggdGhlIHNhbWUgaWQgaXMgYWxyZWFkeSB1c2VkIGJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYW5vdGhlciBwcm9jZXNzLiBVc2UgTWVkaWFDb250cm9sbGVyMiBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzZXJ2aWNlQWN0aW9uLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VBY3Rpb24pOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gc2VydmljZXMgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoc2VydmljZUludGVudCwKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUlkID0gU2Vzc2lvblRva2VuMkltcGwuZ2V0U2Vzc2lvbklkKHNlcnZpY2VzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VJZCAhPSBudWxsICYmIFRleHRVdGlscy5lcXVhbHMoaWQsIHNlcnZpY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvLm5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllcihNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQsCi0gICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG9sZEFnZW50OwotICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbyA9IGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVQcm92aWRlciwgcGxheWVyLmdldEF1ZGlvQXR0cmlidXRlcygpKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgb2xkUGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG9sZEFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgaWYgKGFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQodGhpcywgbVBsYXllcik7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ec21IZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRHNtSGVscGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWdlbnQgPSBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IGFnZW50OwotICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyID0gdm9sdW1lUHJvdmlkZXI7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG9sZFBsYXllcikgewotICAgICAgICAgICAgcGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2tFeGVjdXRvciwgbVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWdlbnQgIT0gb2xkQWdlbnQpIHsKLSAgICAgICAgICAgIGFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIGlmIChvbGRBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkQWdlbnQudW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoaW5mbyk7Ci0gICAgICAgICAgICBub3RpZnlQbGF5ZXJVcGRhdGVkTm90TG9ja2VkKG9sZFBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXBlYXQgdGhlIHNhbWUgdGhpbmcgZm9yIHRoZSBwbGF5bGlzdCBhZ2VudC4KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMpIHsKLSAgICAgICAgUGxheWJhY2tJbmZvIGluZm87Ci0gICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtOwotICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBhdHRycy5nZXRWb2x1bWVDb250cm9sU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb01hbmFnZXIuVVNFX0RFRkFVTFRfU1RSRUFNX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWF5IGhhcHBlbiBpZiB0aGUgQXVkaW9BdHRyaWJ1dGVzIGRvZXNuJ3QgaGF2ZSB1c2FnZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIGl0IHRvIHRoZSBTVFJFQU1fTVVTSUMgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgYXVkaW8gbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcXVlcnlpbmcgdm9sdW1lIGxldmVsLgotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZm8gPSBNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsLmNyZWF0ZVBsYXliYWNrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzVm9sdW1lRml4ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKHN0cmVhbSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUgLyogQ29udHJvbFR5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDb250cm9sVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRNYXhWb2x1bWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0Q3VycmVudFZvbHVtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZV9pbXBsKCkgewotICAgICAgICAvLyBTdG9wIHN5c3RlbSBzZXJ2aWNlIGZyb20gbGlzdGVuaW5nIHRoaXMgc2Vzc2lvbiBmaXJzdC4KLSAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7Ci0gICAgICAgIG1hbmFnZXIuZGVzdHJveVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pOwotCi0gICAgICAgIGlmIChtU2Vzc2lvblN0dWIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbiBpcyBub3cgdW5hdmFpbGFibGUsIGlkPSIgKyBtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzZXNzaW9uIHN0dWIuCi0gICAgICAgICAgICBtU2Vzc2lvblN0dWIuZGVzdHJveU5vdExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXI7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWVyQmFzZSBnZXRQbGF5ZXJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBsYXllcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb25uZWN0ZWRDb250cm9sbGVyc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViLmdldENvbnRyb2xsZXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChBdWRpb0ZvY3VzUmVxdWVzdCBhZnIpIHsKLSAgICAgICAgLy8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wbGF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5yZXNldCgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTGF5b3V0X2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXlvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGF5b3V0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChjb250cm9sbGVyLCBsYXlvdXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgZm9sbG93cwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHNfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kcyBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZXRBbGxvd2VkQ29tbWFuZHMoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UGxheWxpc3QobGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LCBpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRQbGF5bGlzdEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wcmVwYXJlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5zZWVrVG8ocG9zKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBAUGxheWVyU3RhdGUgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJ1ZmZlcmVkUG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yX2ltcGwoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5RXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbChATm9uTnVsbCBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgewotICAgICAgICBpZiAoaGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhlbHBlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihoZWxwZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TZXNzaW9uUGxheWxpc3RBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LmNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gRW5mb3JjZXMgZGV2ZWxvcGVycyB0byBjYWxsIGFsbCB0aGUgbWV0aG9kcyBvbiB0aGUgaW5pdGlhbGx5IGdpdmVuIHRocmVhZAotICAgIC8vIGJlY2F1c2UgY2FsbHMgZnJvbSB0aGUgTWVkaWFDb250cm9sbGVyMiB3aWxsIGJlIHJ1biBvbiB0aGUgdGhyZWFkLgotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGFsbG93IGNhbGxzIGZyb20gdGhlIG11bHRpcGxlIHRocmVhZD8KLSAgICAvLyAgICAgICAgICAgICAgIEkgcHJlZmVyIHRoaXMgd2F5IGJlY2F1c2UgYWxsb3dpbmcgbXVsdGlwbGUgdGhyZWFkIG1heSBjYXNlIHRyaWNreSBpc3N1ZSBsaWtlCi0gICAgLy8gICAgICAgICAgICAgICBiLzYzNDQ2MzYwLiBJZiB0aGUge0BsaW5rICNzZXRQbGF5ZXIoKX0gd2l0aCB7QGNvZGUgbnVsbH0gY2FuIGJlIGNhbGxlZCBmcm9tCi0gICAgLy8gICAgICAgICAgICAgICBhbm90aGVyIHRocmVhZCwgdHJhbnNwb3J0IGNvbnRyb2xzIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdGhhdC4KLSAgICAvLyAgICAgICAgICAgICAgIFRoYXQncyBiYXNpY2FsbHkgdGhlIGRldmVsb3BlcidzIG1pc3Rha2UsIGJ1dCB0aGV5IGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQncwotICAgIC8vICAgICAgICAgICAgICAgaGFwcGVuaW5nIGJlaGluZCB1bnRpbCB3ZSB0ZWxsIHRoZW0gc28uCi0gICAgLy8gICAgICAgICAgICAgICBJZiBlbmZvcmNpbmcgY2FsbGxpbmcgdGhyZWFkIGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBjYW4gYWx0ZXJuYXRpdmVseSBwaWNrCi0gICAgLy8gICAgICAgICAgICAgICAxLiBBbGxvdyBjYWxscyBmcm9tIHJhbmRvbSB0aHJlYWRzIGZvciBhbGwgbWV0aG9kcy4KLSAgICAvLyAgICAgICAgICAgICAgIDIuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLCBleGNlcHQgZm9yIHRoZQotICAgIC8vICAgICAgICAgICAgICAgICAge0BsaW5rICNzZXRQbGF5ZXIoKX0uCi0gICAgdm9pZCBlbnN1cmVDYWxsaW5nVGhyZWFkKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBvciByZW1vdmUKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKG1IYW5kbGVyLmdldExvb3BlcigpICE9IExvb3Blci5teUxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSdW4gdGhpcyBvbiB0aGUgZ2l2ZW4gdGhyZWFkIik7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQobGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKHJlcGVhdE1vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQoTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIHBvc3QtUCkgRmluZCBiZXR0ZXIgd2F5IGZvciBwbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSAvLwotICAgICAgICAvLyAgICAgICAgICAgICAgIEluIHRoZW9yeSwgU2Vzc2lvbi5nZXRYWFgoKSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIFBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZCB3ZSBzaG91bGQgbm90aWZ5IGluZm9ybWF0aW9uIG9mIHRoZSBzZXNzaW9uLmdldFhYWCgpIGluc3RlYWQgb2YKLSAgICAgICAgLy8gICAgICAgICAgICAgICBwbGF5ZXIuZ2V0WFhYKCkKLSAgICAgICAgLy8gTm90aWZ5IHRvIGNvbnRyb2xsZXJzIGFzIHdlbGwuCi0gICAgICAgIGZpbmFsIGludCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpOwotICAgICAgICBpZiAoc3RhdGUgIT0gb2xkUGxheWVyLmdldFBsYXllclN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb24gPSBwbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiAhPSBvbGRQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQoY3VycmVudFRpbWVNcywgcG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgc3BlZWQgPSBwbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICBpZiAoc3BlZWQgIT0gb2xkUGxheWVyLmdldFBsYXliYWNrU3BlZWQoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKHNwZWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChidWZmZXJlZFBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcigpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXI7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5bGlzdEFnZW50IGdldFBsYXlsaXN0QWdlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgU2Vzc2lvbkNhbGxiYWNrIGdldENhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrOwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjJTdHViIGdldFNlc3Npb25TdHViKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViOwotICAgIH0KLQotICAgIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKLQotICAgICAgICBwcml2YXRlIE15UGxheWVyRXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXJyZW50TWVkaWFJdGVtQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYVByZXBhcmVkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uTWVkaWFQcmVwYXJlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXllclN0YXRlQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gc2Vzc2lvbi5nZXRQbGF5bGlzdEFnZW50KCk7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gYWdlbnQuZ2V0TWVkaWFJdGVtKGRzZCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGl0ZW0gZm9yIGRzZD0iICsgZHNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgbGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZEltcGwgaW1wbGVtZW50cyBDb21tYW5kUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ09ERQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jb21tYW5kX2NvZGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuY3VzdG9tX2NvbW1hbmQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmV4dHJhcyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29tbWFuZENvZGU7Ci0gICAgICAgIC8vIE5vbm51bGwgaWYgaXQncyBjdXN0b20gY29tbWFuZAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ3VzdG9tQ29tbWFuZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEltcGwoU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUNvbW1hbmRDb2RlID0gY29tbWFuZENvZGU7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgICBtRXh0cmFzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIEBOb25OdWxsIFN0cmluZyBhY3Rpb24sCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBDT01NQU5EX0NPREVfQ1VTVE9NOwotICAgICAgICAgICAgbUN1c3RvbUNvbW1hbmQgPSBhY3Rpb247Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZENvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q3VzdG9tQ29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBCdW5kbGUgaW5zdGFuY2UgZnJvbSB0aGUgQ29tbWFuZAotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT01NQU5EX0NPREUsIG1Db21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5ELCBtQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgQ29tbWFuZCBpbnN0YW5jZSBmcm9tIHRoZSBCdW5kbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjb2RlID0gY29tbWFuZC5nZXRJbnQoS0VZX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgICAgICBpZiAoY29kZSAhPSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY29kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXN0b21Db21tYW5kID0gY29tbWFuZC5nZXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQpOwotICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNvbW1hbmQyKGN1c3RvbUNvbW1hbmQsIGNvbW1hbmQuZ2V0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRJbXBsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbW1hbmRJbXBsIG90aGVyID0gKENvbW1hbmRJbXBsKSBvYmo7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbXBhcmUgQ29tbWFuZHMgd2l0aCB0aGUgZ2VuZXJhdGVkIFVVSUQsIGFzIHdlJ3JlIGRvaW5nIGZvciB0aGUgTUkyLgotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZSA9PSBvdGhlci5tQ29tbWFuZENvZGUKLSAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtQ3VzdG9tQ29tbWFuZCwgb3RoZXIubUN1c3RvbUNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICAgICAgcmV0dXJuICgobUN1c3RvbUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyBtQ3VzdG9tQ29tbWFuZC5oYXNoQ29kZSgpIDogMCkgKiBwcmltZSArIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudCBzZXQgb2Yge0BsaW5rIFNlc3Npb25Db21tYW5kMn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kR3JvdXBJbXBsIGltcGxlbWVudHMgQ29tbWFuZEdyb3VwUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXNlc3Npb24yLmNvbW1hbmRncm91cC5jb21tYW5kcyI7Ci0KLSAgICAgICAgLy8gUHJlZml4IGZvciBhbGwgY29tbWFuZCBjb2RlcwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERSA9ICJDT01NQU5EX0NPREVfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWVyQmFzZQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyA9ICJDT01NQU5EX0NPREVfUExBWUJBQ0tfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWxpc3RBZ2VudAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCA9ICJDT01NQU5EX0NPREVfUExBWUxJU1RfIjsKLQotICAgICAgICBwcml2YXRlIFNldDxTZXNzaW9uQ29tbWFuZDI+IG1Db21tYW5kcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtSW5zdGFuY2U7Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRHcm91cEltcGwoU2Vzc2lvbkNvbW1hbmRHcm91cDIgaW5zdGFuY2UsIE9iamVjdCBvdGhlcikgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlciBpbnN0YW5jZW9mIENvbW1hbmRHcm91cEltcGwpIHsKLSAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkQWxsKCgoQ29tbWFuZEdyb3VwSW1wbCkgb3RoZXIpLm1Db21tYW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbCgpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMuYWRkKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbFByZWRlZmluZWRDb21tYW5kc19pbXBsKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5YmFja0NvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUJBQ0spOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5bGlzdENvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUxJU1QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmRzV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKTogRG9uJ3QgdXNlIHJlZmxlY3Rpb24gZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgICAgICAgIGZpbmFsIEZpZWxkW10gZmllbGRzID0gTWVkaWFTZXNzaW9uMi5jbGFzcy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkKG5ldyBTZXNzaW9uQ29tbWFuZDIoZmllbGRzW2ldLmdldEludChudWxsKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCAiICsgZmllbGRzW2ldICsgIiBpbiBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbW1hbmRzLnJlbW92ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRzLmNvbnRhaW5zKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChpbnQgY29kZSkgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gQ09NTUFORF9DT0RFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZSBoYXNDb21tYW5kKENvbW1hbmQpIGZvciBjdXN0b20gY29tbWFuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gY29kZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBnZXRDb21tYW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobUNvbW1hbmRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBidW5kbGUgZnJvbSB0aGUgQ29tbWFuZEdyb3VwCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbW1hbmQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTLCBsaXN0KTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgQ29tbWFuZEdyb3VwIGZyb20gdGhlIGJ1bmRsZQotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8UGFyY2VsYWJsZT4gbGlzdCA9IGNvbW1hbmRzLmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTKTsKLSAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRHcm91cCA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyY2VsYWJsZSBwYXJjZWxhYmxlID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocGFyY2VsYWJsZSBpbnN0YW5jZW9mIEJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gKEJ1bmRsZSkgcGFyY2VsYWJsZTsKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZEdyb3VwLmFkZENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udHJvbGxlckluZm9JbXBsIGltcGxlbWVudHMgQ29udHJvbGxlckluZm9Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29udHJvbGxlckluZm8gbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNUcnVzdGVkOwotICAgICAgICBwcml2YXRlIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIG1Db250cm9sbGVyQmluZGVyOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVySW5mb0ltcGwoQ29udGV4dCBjb250ZXh0LCBDb250cm9sbGVySW5mbyBpbnN0YW5jZSwgaW50IHVpZCwKLSAgICAgICAgICAgICAgICBpbnQgcGlkLCBATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJCaW5kZXIgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgICAgIC8vIEFzayBzZXJ2ZXIgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyB0cnVzdGVkLgotICAgICAgICAgICAgLy8gQXBwIGNhbm5vdCBrbm93IHRoaXMgYmVjYXVzZSBhcHBzIGNhbm5vdCBxdWVyeSBlbmFibGVkIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciBmb3IKLSAgICAgICAgICAgIC8vIGFub3RoZXIgcGFja2FnZSwgYnV0IHN5c3RlbSBzZXJ2ZXIgY2FuIGRvLgotICAgICAgICAgICAgbUlzVHJ1c3RlZCA9IG1hbmFnZXIuaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKAotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VWlkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVpZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RydXN0ZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNUcnVzdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKChDb250cm9sbGVySW5mbykgb2JqKS5nZXRQcm92aWRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvbnRyb2xsZXJJbmZvIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIsIHVpZD0iICsgbVVpZCArICIsIHRydXN0ZWQ9IgotICAgICAgICAgICAgICAgICAgICArIG1Jc1RydXN0ZWQgKyAifSI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cm9sbGVySW5mb0ltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIG90aGVyID0gKENvbnRyb2xsZXJJbmZvSW1wbCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkuZXF1YWxzKG90aGVyLm1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udHJvbGxlckluZm8gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSUJpbmRlciBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBDb250cm9sbGVySW5mb0ltcGwgZnJvbShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbnRyb2xsZXJJbmZvSW1wbCkgY29udHJvbGxlci5nZXRQcm92aWRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kQnV0dG9uSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9SRVNfSUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmljb25fcmVzX2lkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNQTEFZX05BTUUKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmRpc3BsYXlfbmFtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5leHRyYXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmVuYWJsZWQiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZEJ1dHRvbiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmQyIG1Db21tYW5kOwotICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbkltcGwoQE51bGxhYmxlIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBpbnQgaWNvblJlc0lkLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZGlzcGxheU5hbWUsIEJ1bmRsZSBleHRyYXMsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXNJZDsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBDb21tYW5kQnV0dG9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUKLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGdldENvbW1hbmRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEljb25SZXNJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uUmVzSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0RGlzcGxheU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5ELCBtQ29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0lDT05fUkVTX0lELCBtSWNvblJlc0lkKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSwgbURpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgbUVuYWJsZWQpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBATnVsbGFibGUgQ29tbWFuZEJ1dHRvbiBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoYnVuZGxlLmdldEJ1bmRsZShLRVlfQ09NTUFORCkpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0SWNvblJlc0lkKGJ1bmRsZS5nZXRJbnQoS0VZX0lDT05fUkVTX0lELCAwKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldERpc3BsYXlOYW1lKGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRFeHRyYXMoYnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFsZm9ybWVkIG9yIHZlcnNpb24gbWlzbWF0Y2guIFJldHVybiBudWxsIGZvciBub3cuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIENvbW1hbmRCdXR0b259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldENvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0SWNvblJlc0lkX2ltcGwoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICAgICAgbUljb25SZXNJZCA9IHJlc0lkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXREaXNwbGF5TmFtZV9pbXBsKFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICYmIG1Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW5hYmxlZCBidXR0b24gbmVlZHMgQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGNvbnRyb2xsZXIgdG8gaW52b2tlIHRoZSBjb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBudWxsICYmIG1Db21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gQ09NTUFORF9DT0RFX0NVU1RPTQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1JY29uUmVzSWQgPT0gMCB8fCBUZXh0VXRpbHMuaXNFbXB0eShtRGlzcGxheU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXN0b20gY29tbWFuZHMgbmVlZHMgaWNvbiBhbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBuYW1lIHRvIGRpc3BsYXkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kQnV0dG9uSW1wbChtQ29tbWFuZCwgbUljb25SZXNJZCwgbURpc3BsYXlOYW1lLCBtRXh0cmFzLCBtRW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXJCYXNlSW1wbDxUIGV4dGVuZHMgTWVkaWFTZXNzaW9uMiwgQyBleHRlbmRzIFNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgQnVpbGRlckJhc2VQcm92aWRlcjxULCBDPiB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgICAgIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgICAgICBTdHJpbmcgbUlkOwotICAgICAgICBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICAgICAgQyBtQ2FsbGJhY2s7Ci0gICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICAgICAgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0Ci0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIHBsYXllciBpcyBhCi0gICAgICAgICAqICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbjJ9IG9yIHtAbGluayBNZWRpYUNvbnRyb2xsZXIyfS4KLSAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWxzbyBuZWVkIGV4ZWN1dG9yCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyQmFzZUltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICAgICAgLy8gRW5zdXJlIG5vbi1udWxsCi0gICAgICAgICAgICBtSWQgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RBZ2VudF9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICBpZiAocGxheWxpc3RBZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWxpc3RBZ2VudCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBwbGF5bGlzdEFnZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVByb3ZpZGVyX2ltcGwoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQWN0aXZpdHlfaW1wbChQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gcGk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWRfaW1wbChATm9uTnVsbCBTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25DYWxsYmFja19pbXBsKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBDIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGFic3RyYWN0IFQgYnVpbGRfaW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFTZXNzaW9uMiwgU2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChDb250ZXh0IGNvbnRleHQsIEJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gbUNvbnRleHQuZ2V0TWFpbkV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvbkNhbGxiYWNrKCkge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsKG1Db250ZXh0LCBtUGxheWVyLCBtSWQsIG1QbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIsIG1TZXNzaW9uQWN0aXZpdHksIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjU3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5NZWRpYUxpYnJhcnlTZXNzaW9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbnRyb2xsZXJJbmZvSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24yU3R1YiBleHRlbmRzIElNZWRpYVNlc3Npb24yLlN0dWIgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUE9TSVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfcG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX0lURU1fSU5ERVggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfaXRlbV9pbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUExBWUxJU1RfUEFSQU1TID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wbGF5bGlzdF9wYXJhbXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yU3R1YiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogUmVuYW1lLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8U2Vzc2lvbkNvbW1hbmQyPiBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0ID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8SUJpbmRlciwgQ29udHJvbGxlckluZm8+IG1Db250cm9sbGVycyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgU2V0PElCaW5kZXI+IG1Db25uZWN0aW5nQ29udHJvbGxlcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNlc3Npb25Db21tYW5kR3JvdXAyPiBtQWxsb3dlZENvbW1hbmRHcm91cE1hcCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlNYXA8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPENvbnRyb2xsZXJJbmZvLCBTZXQ8U3RyaW5nPj4gbVN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJTdHViKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBDb21tYW5kR3JvdXBJbXBsIGdyb3VwID0gbmV3IENvbW1hbmRHcm91cEltcGwoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5YmFja0NvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgZ3JvdXAuYWRkQWxsUGxheWxpc3RDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIFNldDxTZXNzaW9uQ29tbWFuZDI+IGNvbW1hbmRzID0gZ3JvdXAuZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogY29tbWFuZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5hcHBlbmQoY29tbWFuZC5nZXRDb21tYW5kQ29kZSgpLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95Tm90TG9ja2VkKCkgewotICAgICAgICBmaW5hbCBMaXN0PENvbnRyb2xsZXJJbmZvPiBsaXN0OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbi5jbGVhcigpOwotICAgICAgICAgICAgbGlzdCA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGNvbnRyb2xsZXJCaW5kZXIgPQotICAgICAgICAgICAgICAgICAgICAoKENvbnRyb2xsZXJJbmZvSW1wbCkgbGlzdC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayBob2xkIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJCaW5kZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBpcyBnb25lLiBTaG91bGQgYmUgZmluZSBiZWNhdXNlIHdlJ3JlIGRlc3Ryb3lpbmcuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCAmJiBERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZ2V0TGlicmFyeVNlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKCEoc2Vzc2lvbiBpbnN0YW5jZW9mIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlc3Npb24gaXNuJ3QgYSBsaWJyYXJ5IHNlc3Npb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSBzZXNzaW9uOwotICAgIH0KLQotICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgotICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBtQ29udHJvbGxlcnMuZ2V0KGNhbGxlci5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpcyBkaXNjb25uZWN0ZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0U2Vzc2lvbigpIGFscmVhZHkgbG9nZ2VkIGlmIHNlc3Npb24gaXMgY2xvc2VkLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm9JbXBsIGltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Db250cm9sbGVycy5nZXQoaW1wbC5nZXRJZCgpKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db25uZWN0aW5nQ29udHJvbGxlcnMuY29udGFpbnMoaW1wbC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsLmdldENvbnRyb2xsZXJCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlciArICIgaXNuJ3QgY29ubmVjdGVkIG5vciBjb25uZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBiaW5kZXIgaWYgdGhlIHNlc3Npb24gaXMgYWJsZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KLSAgICBwcml2YXRlIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZENvZGUpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5nZXQoY29tbWFuZENvZGUpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db21tYW5kUmVxdWVzdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFjY2VwdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJ1biByZWplY3RlZCBjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbW1hbmQgKGNvZGU9IiArIGNvbW1hbmRDb2RlICsgIikgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udHJvbGxlciArICIgd2FzIHJlamVjdGVkIGJ5ICIgKyBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Ccm93c2VyQ29tbWFuZChATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIHNlc3Npb24gPSBnZXRMaWJyYXJ5U2Vzc2lvbigpOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb25zaWRlciBjb21tYW5kIGNvZGUKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihzZXNzaW9uLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWxsKGludCBjb21tYW5kQ29kZSwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpLCBjb21tYW5kQ29kZSksIHJ1bm5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBjYWxsIHRoaXMgQVBJIGRpcmVjdGx5LiBVc2Ugbm90aWZ5KCkgaW5zdGVhZC4KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5SW50ZXJuYWwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsIHx8IGlDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVubmFibGUucnVuKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbnRyb2xsZXIudG9TdHJpbmcoKSArICIgaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb25Db250cm9sbGVyQ2xvc2VkKGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBpdCdzIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gb3IgRGVhZFN5c3RlbUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIFdlJ2QgYmV0dGVyIHRvIGxlYXZlIGxvZyBmb3IgdGhvc2UgY2FzZXMgYmVjYXVzZQotICAgICAgICAgICAgLy8gICAtIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gbWVhbnMgdGhhdCB3ZSBtYXkgbmVlZCB0byBmaXggb3VyIGNvZGUuCi0gICAgICAgICAgICAvLyAgICAgKGUuZy4gYWRkIHBhZ2luYXRpb24gb3Igc3BlY2lhbCB3YXkgdG8gZGVsaXZlciBCaXRtYXApCi0gICAgICAgICAgICAvLyAgIC0gRGVhZFN5c3RlbUV4Y2VwdGlvbiBtZWFucyB0aGF0IGVycm9ycyBhcm91bmQgaXQgY2FuIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJFeGNlcHRpb24gaW4gIiArIGNvbnRyb2xsZXIudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db250cm9sbGVyQ2xvc2VkKElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyKSB7Ci0gICAgICAgIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMucmVtb3ZlKGlDb250cm9sbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzaW5nICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uRGlzY29ubmVjdGVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBSURMIG1ldGhvZHMgZm9yIHNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBzZXNzaW9uLmdldENvbnRleHQoKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBuZXcgQ29udHJvbGxlckluZm8oY29udGV4dCwKLSAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpLCBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpLCBjYWxsaW5nUGFja2FnZSwgY2FsbGVyKTsKLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgLy8gS2VlcCBjb25uZWN0aW5nIGNvbnRyb2xsZXJzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaGVscHMgc2Vzc2lvbnMgdG8gY2FsbCBBUElzIGluIHRoZSBvbkNvbm5lY3QoKSAoZS5nLiBzZXRDdXN0b21MYXlvdXQoKSkKLSAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHBlbmRpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLmFkZChDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbykuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db25uZWN0KAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIC8vIERvbid0IHJlamVjdCBjb25uZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBmcm9tIHRydXN0ZWQgYXBwLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGZhaWwgdG8gcmV0cmlldmUgc2Vzc2lvbidzIGluZm9ybWF0aW9uIHRvIGRpc3BhdGNoCi0gICAgICAgICAgICAvLyBtZWRpYSBrZXlzIHRvLgotICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHQgPSBhbGxvd2VkQ29tbWFuZHMgIT0gbnVsbCB8fCBjb250cm9sbGVySW5mby5pc1RydXN0ZWQoKTsKLSAgICAgICAgICAgIGlmIChhY2NlcHQpIHsKLSAgICAgICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgY29udHJvbGxlckltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFjY2VwdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRydXN0ZWQgYXBwcywgc2VuZCBub24tbnVsbCBhbGxvd2VkIGNvbW1hbmRzIHRvIGtlZXAgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENvbW1hbmRzID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlckltcGwuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlckltcGwuZ2V0SWQoKSwgIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAucHV0KGNvbnRyb2xsZXJJbmZvLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiBjb25uZWN0aW9uIGlzIGFjY2VwdGVkLCBub3RpZnkgdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAgICAgLy8gSXQncyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW5ub3QgY2FsbCBzeW5jaHJvbm91cyBjYWxscyBiZXR3ZWVuIHNlc3Npb24vY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSdyZSBkb2luZyB0aGlzIGFmdGVyIHRoZSBvbkNvbm5lY3Rpb25DaGFuZ2VkKCksIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZQotICAgICAgICAgICAgICAgIC8vICAgICAgIHRoYXQgZXZlbnRzIGhlcmUgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZSBvbkNvbm5lY3RlZCgpIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyAgICAgICBJTWVkaWFDb250cm9sbGVyMiBpcyBvbmV3YXkgKGkuZS4gYXN5bmMgY2FsbCkgYW5kIFN0dWIgd2lsbAotICAgICAgICAgICAgICAgIC8vICAgICAgIHVzZSB0aHJlYWQgcG9sbCBmb3IgaW5jb21pbmcgY2FsbHMuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHBsYXllclN0YXRlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgcGxheWJhY2tJbmZvQnVuZGxlID0gKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQbGF5YmFja0luZm8oKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb24uZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5bGlzdCgpIDogbnVsbDsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3RCdW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBGaW5kIGEgd2F5IHRvIGF2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBpdGVtQnVuZGxlID0gaXRlbS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUuYWRkKGl0ZW1CdW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEb3VibGUgY2hlY2sgaWYgc2Vzc2lvbiBpcyBzdGlsbCB0aGVyZSwgYmVjYXVzZSBjbG9zZSgpIGNhbiBiZSBjYWxsZWQgaW4gYW5vdGhlcgotICAgICAgICAgICAgICAgIC8vIHRocmVhZC4KLSAgICAgICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25Db25uZWN0ZWQoTWVkaWFTZXNzaW9uMlN0dWIudGhpcywgYWxsb3dlZENvbW1hbmRzLnRvQnVuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRQb3NpdGlvbk1zLCBwbGF5YmFja0luZm9CdW5kbGUsIHJlcGVhdE1vZGUsIHNodWZmbGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlLCBzZXNzaW9uQWN0aXZpdHkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGhlcmUuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMucmVtb3ZlKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlamVjdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIG1heSBiZSBkaWVkIHByZW1hdHVyZWx5LgotICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYW4gaXNzdWUgYmVjYXVzZSB3ZSdsbCBpZ25vcmUgaXQgYW55d2F5LgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoY2FsbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUbyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIGludCB2YWx1ZSwgZmluYWwgaW50IGZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyID0gc2Vzc2lvbi5nZXRWb2x1bWVQcm92aWRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTZXQgbG9jYWwgc3RyZWFtIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIub25TZXRWb2x1bWVUbyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkanVzdCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vbkFkanVzdFZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgY29tbWFuZENvZGUsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVk6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUFJFUEFSRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE86Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZWVrVG8oYXJncy5nZXRMb25nKEFSR1VNRU5UX0tFWV9QT1NJVElPTikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlc2VuZCB1bmtub3duIChuZXcpIGNvbW1hbmRzIHRocm91Z2ggdGhlIGN1c3RvbSBjb21tYW5kLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSBjb21tYW5kQnVuZGxlLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3MsIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzZW5kQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXN0b21Db21tYW5kKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tTWVkaWFJZCgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21NZWRpYUlkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJhdGluZ0J1bmRsZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fU0VUX1JBVElORywKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmdCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nQnVuZGxlIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFJhdGluZzIgcmF0aW5nID0gUmF0aW5nMi5mcm9tQnVuZGxlKHJhdGluZ0J1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZXRSYXRpbmcoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBtZWRpYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVCwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UGxheWxpc3QoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgVVVJRCBpbiB0aGUgcGxheWxpc3QKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKHBsYXlsaXN0LmdldChpKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UGxheWxpc3QobGlzdCwgTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIG1ldGFkYXRhKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGEpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfQUREX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIGFkZFBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmFkZFBsYXlsaXN0SXRlbShpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKG1lZGlhSXRlbSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKG1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIHJlcGxhY2VQbGF5bGlzdEl0ZW0uCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfVE9fUExBWUxJU1RfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNraXBUb1BsYXlsaXN0SXRlbSgpOiBJZ25vcmluZyBudWxsIG1lZGlhSXRlbSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1BsYXlsaXN0SXRlbShNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfUFJFVl9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX05FWFRfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFJlcGVhdE1vZGUocmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3IgTGlicmFyeVNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGZpbmFsIExpYnJhcnlSb290IHJvb3QgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRMaWJyYXJ5Um9vdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldExpYnJhcnlSb290RG9uZShyb290SGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290ID09IG51bGwgPyBudWxsIDogcm9vdC5nZXRSb290SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldEV4dHJhcygpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRJdGVtKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1lZGlhSXRlbTIgcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0SXRlbShzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQpOwotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRJdGVtRG9uZShtZWRpYUlkLCByZXN1bHQgPT0gbnVsbCA/IG51bGwgOiByZXN1bHQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGFnZSwgZmluYWwgaW50IHBhZ2VTaXplLCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldENoaWxkcmVuKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0Q2hpbGRyZW4oKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhIGl0ZW1zICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBidW5kbGVMaXN0LCBleHRyYXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0U2VhcmNoUmVzdWx0KCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgbmVnYXRpdmUgcGFnZSAvIHBhZ2VTaXplLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWdlPSIgKyBwYWdlICsgIiBwYWdlU2l6ZT0iICsgcGFnZVNpemUgKyAiIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0U2VhcmNoUmVzdWx0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0U2VhcmNoUmVzdWx0KCkgc2hvdWxkbid0IHJldHVybiBtZWRpYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpdGVtcyBtb3JlIHRoYW4gcGFnZVNpemUuIHJlc3VsdC5zaXplKCk9IiArIHJlc3VsdC5zaXplKCkgKyAiIHBhZ2VTaXplPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZWRpYUl0ZW0yIGl0ZW0gOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbikgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU3Vic2NyaWJlKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIG9wdGlvbik7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9uID0gbVN1YnNjcmlwdGlvbnMuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnB1dChjb250cm9sbGVyLCBzdWJzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHBhcmVudElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInVuc3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uVW5zdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBwYXJlbnRJZCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVBJcyBmb3IgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgUG9zdC1QKSBOZWVkIGEgd2F5IHRvIGdldCBjb250cm9sbGVyIHdpdGggcGVybWlzc2lvbnMKLSAgICBwdWJsaWMgTGlzdDxDb250cm9sbGVySW5mbz4gZ2V0Q29udHJvbGxlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVycy5hZGQobUNvbnRyb2xsZXJzLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyczsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoaW50IHN0YXRlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUG9zaXRpb25DaGFuZ2VkKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja1NwZWVkQ2hhbmdlZChzcGVlZCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQoYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGxheW91dEJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9ICgoQ29tbWFuZEJ1dHRvbkltcGwpIGxheW91dC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0QnVuZGxlcy5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0QnVuZGxlcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QuZ2V0KGkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IHBsYXlsaXN0LmdldChpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RDaGFuZ2VkKGJ1bmRsZUxpc3QsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUmVwZWF0TW9kZUNoYW5nZWQocmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblNodWZmbGVNb2RlQ2hhbmdlZChzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gcGxheWJhY2tJbmZvKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPQotICAgICAgICAgICAgICAgICgoTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbCkgcGxheWJhY2tJbmZvLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja0luZm9DaGFuZ2VkKHBsYXliYWNrSW5mb0J1bmRsZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kcyhDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzLnRvQnVuZGxlKCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwgaWYgcmVzdWx0IHJlY2VpdmVyIGlzIgotICAgICAgICAgICAgICAgICAgICArICIgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncykgewotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmRCdW5kbGUsIGFyZ3MsIG51bGwpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25FcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKGNvbnRyb2xsZXIsIHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1YnNjcmliZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHN1YnNjcmlwdGlvbnMgPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PSBudWxsIHx8ICFzdWJzY3JpcHRpb25zLmNvbnRhaW5zKHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gTWlzYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgU2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBOb3RpZnlSdW5uYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2ViNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8vIFRPRE8oamFld2FuKTogTmVlZCBhIHRlc3QgZm9yIHNlc3Npb24gc2VydmljZSBpdHNlbGYuCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1QU2Vzc2lvblNlcnZpY2UiOyAvLyB0byBtZWV0IDIzIGNoYXIgbGltaXQgaW4gTG9nIHRhZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZSB0aGlzLiAoYi83NDA5NDYxMSkKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uU2VydmljZTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEludGVudCBtU3RhcnRTZWxmSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoIiArIGluc3RhbmNlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb24gb25VcGRhdGVOb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBVSSBsYXRlci4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGVfaW1wbCgpIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUluc3RhbmNlLmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICBtU3RhcnRTZWxmSW50ZW50ID0gbmV3IEludGVudChtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRDbGFzcygpKTsKLQotICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjIobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IGdldFNlc3Npb25UeXBlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHNlcnZpY2UsIGJ1dCB3YXMgIiArIHRva2VuLmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb24gPSBtSW5zdGFuY2Uub25DcmVhdGVTZXNzaW9uKHRva2VuLmdldElkKCkpOwotICAgICAgICBpZiAobVNlc3Npb24gPT0gbnVsbCB8fCAhdG9rZW4uZ2V0SWQoKS5lcXVhbHMobVNlc3Npb24uZ2V0VG9rZW4oKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gd2l0aCBpZCAiICsgdG9rZW4uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIGJ1dCBnb3QgIiArIG1TZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBoZXJlLgotICAgICAgICAvLyBtU2Vzc2lvbi5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrLCBtU2Vzc2lvbi5nZXRFeGVjdXRvcigpKTsKLSAgICB9Ci0KLSAgICBAVG9rZW5UeXBlIGludCBnZXRTZXNzaW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kX2ltcGwoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lZGlhU2Vzc2lvbjJJbXBsKSBtU2Vzc2lvbi5nZXRQcm92aWRlcigpKS5nZXRTZXNzaW9uU3R1YigpLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihpbnQgcGxheWVyU3RhdGUpIHsKLSAgICAgICAgTWVkaWFOb3RpZmljYXRpb24gbWVkaWFOb3RpZmljYXRpb24gPSBtSW5zdGFuY2Uub25VcGRhdGVOb3RpZmljYXRpb24oKTsKLSAgICAgICAgaWYgKG1lZGlhTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2gocGxheWVyU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGlmICghbUlzUnVubmluZ0ZvcmVncm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShtU3RhcnRTZWxmSW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZChtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9JRExFOgotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGlmIChtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RvcEZvcmVncm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgcGxheWVyLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTm90aWZpY2F0aW9uSW1wbCBpbXBsZW1lbnRzIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGludCBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0KLSAgICAgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uSW1wbChNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLAotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdGlmaWNhdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbklkID0gbm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm90aWZpY2F0aW9uSWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbiBnZXROb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTU4MTI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUmF0aW5nMi4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMi5TdHlsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5SYXRpbmcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUmF0aW5nMkltcGwgaW1wbGVtZW50cyBSYXRpbmcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmF0aW5nMiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUWUxFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi5zdHlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRSA9ICJhbmRyb2lkLm1lZGlhLnJhdGluZzIudmFsdWUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSYXRpbmcyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtUmF0aW5nU3R5bGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7Ci0KLSAgICBwcml2YXRlIFJhdGluZzJJbXBsKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUsIGZsb2F0IHJhdGluZykgewotICAgICAgICBtUmF0aW5nU3R5bGUgPSByYXRpbmdTdHlsZTsKLSAgICAgICAgbVJhdGluZ1ZhbHVlID0gcmF0aW5nOwotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUmF0aW5nMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiUmF0aW5nMjpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgotICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJhdGluZzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUmF0aW5nMkltcGwgb3RoZXIgPSAoUmF0aW5nMkltcGwpICgoUmF0aW5nMikgb2JqKS5nZXRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlID09IG90aGVyLm1SYXRpbmdTdHlsZQotICAgICAgICAgICAgICAgICYmIG1SYXRpbmdWYWx1ZSA9PSBvdGhlci5tUmF0aW5nVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1SYXRpbmdTdHlsZSwgbVJhdGluZ1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBSYXRpbmcyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoYnVuZGxlLmdldEludChLRVlfU1RZTEUpLCBidW5kbGUuZ2V0RmxvYXQoS0VZX1ZBTFVFKSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1NUWUxFLCBtUmF0aW5nU3R5bGUpOwotICAgICAgICBidW5kbGUucHV0RmxvYXQoS0VZX1ZBTFVFLCBtUmF0aW5nVmFsdWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX2ltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSkgewotICAgICAgICBzd2l0Y2gocmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX0hFQVJUOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfVEhVTUJfVVBfRE9XTjoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX1BFUkNFTlRBR0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChyYXRpbmdTdHlsZSwgUkFUSU5HX05PVF9SQVRFRCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3SGVhcnRSYXRpbmdfaW1wbChib29sZWFuIGhhc0hlYXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdUaHVtYlJhdGluZ19pbXBsKGJvb2xlYW4gdGh1bWJJc1VwKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1RIVU1CX1VQX0RPV04sIHRodW1iSXNVcCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX2ltcGwoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICBmbG9hdCBtYXhSYXRpbmcgPSBSQVRJTkdfTk9UX1JBVEVEOwotICAgICAgICBzd2l0Y2goc3RhclJhdGluZ1N0eWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDMuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDQuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDUuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcmF0aW5nIHN0eWxlICgiICsgc3RhclJhdGluZ1N0eWxlICsgIikgZm9yIGEgc3RhciByYXRpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHN0YXJSYXRpbmcgPCAwLjBmKSB8fCAoc3RhclJhdGluZyA+IG1heFJhdGluZykpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byBzZXQgb3V0IG9mIHJhbmdlIHN0YXItYmFzZWQgcmF0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZykuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1BFUkNFTlRBR0UsIHBlcmNlbnQpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWUgPj0gMC4wZjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJhdGluZ1N0eWxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzSGVhcnRfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfSEVBUlQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNUaHVtYlVwX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgc3dpdGNoIChtUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgICAgICBpZiAobUluc3RhbmNlLmlzUmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgaWYgKChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1BFUkNFTlRBR0UpIHx8ICFtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUwZDM0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYUl0ZW1TdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhU2Vzc2lvblN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuSXRlbUFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU2Vzc2lvbkFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU3RhdHVzQ2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1AUmVxdWlyZXNBcGkoYXBpID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5MT0xMSVBPUCkKLXB1YmxpYyBjbGFzcyBSb3V0ZVBsYXllciBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBMQVlCQUNLX0FDVElPTlMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRQotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTwotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQ7Ci0KLSAgICBwcml2YXRlIFJlbW90ZVBsYXliYWNrQ2xpZW50IG1DbGllbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBwcml2YXRlIFN0cmluZyBtSXRlbUlkOwotICAgIHByaXZhdGUgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjayA9IG5ldyBTdGF0dXNDYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgUm91dGVQbGF5ZXIoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgbUNsaWVudCA9IG5ldyBSZW1vdGVQbGF5YmFja0NsaWVudChjb250ZXh0LCByb3V0ZSk7Ci0gICAgICAgIG1DbGllbnQuc2V0U3RhdHVzQ2FsbGJhY2sobVN0YXR1c0NhbGxiYWNrKTsKLSAgICAgICAgbUNsaWVudC5zdGFydFNlc3Npb24obnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgIG1DbGllbnQucmVzdW1lKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgbUNsaWVudC5wYXVzZShudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIG1DbGllbnQuc2VlayhtSXRlbUlkLCBwb3MsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIG1DbGllbnQuc3RvcChudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXllckV2ZW50Q2FsbGJhY2soUGxheWVyRXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuVmlkZW8oRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1DbGllbnQucGxheShkc2QuZ2V0VXJpKCksICJ2aWRlby9tcDQiLCBudWxsLCAwLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBwbGF5SW50ZXJuYWwoZHNkLmdldFVyaSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsaWVudC5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQ2xpZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGxheUludGVybmFsKFVyaSB1cmkpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KHVyaSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2Vzc2lvblN0YXR1cyhTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJdGVtU3RhdHVzKFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIG1JdGVtSWQgPSBpdGVtSWQ7Ci0gICAgICAgIGlmIChpdGVtU3RhdHVzID09IG51bGwgfHwgbUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbUNhbGxiYWNrLm9uUGxheWVyU3RhdGVDaGFuZ2VkKGl0ZW1TdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTcwYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudCBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudCI7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfUExBWUxJU1QgPSAtMTsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTElEX0lURU1TID0gLTI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFBsYXlJdGVtIG1Fb3BQbGF5SXRlbSA9IG5ldyBQbGF5SXRlbShFTkRfT0ZfUExBWUxJU1QsIG51bGwpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNeVBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckNhbGxiYWNrOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotICAgIC8vIFRPRE86IENoZWNrIGlmIGhhdmluZyB0aGUgc2FtZSBpdGVtIGlzIG9rYXkgKGIvNzQwOTA3NDEpCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtU2h1ZmZsZWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWFwPE1lZGlhSXRlbTIsIERhdGFTb3VyY2VEZXNjPiBtSXRlbURzZE1hcCA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVNodWZmbGVNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXlJdGVtIG1DdXJyZW50OwotCi0gICAgLy8gQ2FsbGVkIG9uIHNlc3Npb24gY2FsbGJhY2sgZXhlY3V0b3IuCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIG1wYiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXllciAhPSBtcGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsICYmIG1DdXJyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGxheUl0ZW0gewotICAgICAgICBpbnQgc2h1ZmZsZWRJZHg7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZDsKLSAgICAgICAgTWVkaWFJdGVtMiBtZWRpYUl0ZW07Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4KSB7Ci0gICAgICAgICAgICB0aGlzKHNodWZmbGVkSWR4LCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICB0aGlzLnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQodGhpcy5tZWRpYUl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSBkc2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtICE9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKS5lcXVhbHMoZHNkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25QbGF5bGlzdEFnZW50KEBOb25OdWxsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb25JbXBsLAotICAgICAgICAgICAgQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAoc2Vzc2lvbkltcGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2Vzc2lvbkltcGwgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uSW1wbCA9IHNlc3Npb25JbXBsOwotICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICBtUGxheWVyQ2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKCk7Ci0gICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG1QbGF5ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtUGxheWxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAuY2xlYXIoKTsKLQotICAgICAgICAgICAgbVBsYXlsaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkQWxsKGxpc3QpOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG1NZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IGluZGV4OwotICAgICAgICAgICAgbVBsYXlsaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIGluIHJhbmRvbSBwb3NpdGlvbiBvZiBtU2h1ZmZsZWRMaXN0LgotICAgICAgICAgICAgICAgIHNodWZmbGVkSWR4ID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpLm5leHRJbnQobVNodWZmbGVkTGlzdC5zaXplKCkgKyAxKTsKLSAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QucmVtb3ZlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlsaXN0LnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1QbGF5bGlzdC5nZXQoaW5kZXgpKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5zZXQoc2h1ZmZsZWRJZHgsIGl0ZW0pOwotICAgICAgICAgICAgbVBsYXlsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBpdGVtLmVxdWFscyhtQ3VycmVudC5tZWRpYUl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKGl0ZW0pOwotICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50ID0gbmV3IFBsYXlJdGVtKHNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gcHJldiA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAtMSk7Ci0gICAgICAgICAgICBpZiAocHJldiAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IHByZXY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gbmV4dCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgIGlmIChuZXh0ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocmVwZWF0TW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgcmVwZWF0TW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgc3dpdGNoIChyZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgIT0gbnVsbCAmJiBtQ3VycmVudCAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgc2h1ZmZsZU1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgaW50IGdldEN1clNodWZmbGVkSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBoYXNWYWxpZEl0ZW0oKSA/IG1DdXJyZW50LnNodWZmbGVkSWR4IDogTk9fVkFMSURfSVRFTVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkSXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50ICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCk7Ci0gICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIGRzZCA9IG1JdGVtRHNkTWFwLmdldChpdGVtKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyID0gbURzbUhlbHBlcjsKLSAgICAgICAgaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBEbyBub3QgY2FsbCBvbkRhdGFTb3VyY2VNaXNzaW5nIHdpdGggdGhlIGxvY2sgKGIvNzQwOTA3NDEpLgotICAgICAgICAgICAgZHNkID0gaGVscGVyLm9uRGF0YVNvdXJjZU1pc3NpbmcobVNlc3Npb25JbXBsLmdldEluc3RhbmNlKCksIGl0ZW0pOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRzZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjb25zaWRlciB0byBjYWxsIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCBpbnNpZGUgKGIvNzQwOTA3NDEpCi0gICAgcHJpdmF0ZSBQbGF5SXRlbSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChpbnQgY3VyU2h1ZmZsZWRJZHgsIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgaW50IHNpemUgPSBtUGxheWxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPT0gRU5EX09GX1BMQVlMSVNUKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IChkaXJlY3Rpb24gPiAwKSA/IC0xIDogc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggKz0gZGlyZWN0aW9uOwotICAgICAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4IDwgMCB8fCBjdXJTaHVmZmxlZElkeCA+PSBtUGxheWxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09IHNpemUgLSAxKSA/IG51bGwgOiBtRW9wUGxheUl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSBjdXJTaHVmZmxlZElkeCA8IDAgPyBtUGxheWxpc3Quc2l6ZSgpIC0gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtU2h1ZmZsZWRMaXN0LmdldChjdXJTaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5SXRlbShjdXJTaHVmZmxlZElkeCwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCkgewotICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtQ3VycmVudC5tZWRpYUl0ZW0pOwotICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgLy8gQWRkZWQgYW4gaXRlbS4KLSAgICAgICAgICAgIG1DdXJyZW50LnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnQuc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobVNodWZmbGVkTGlzdC5zaXplKCkgLSAxLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50Lm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KG1DdXJyZW50LnNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIGlmIChyZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1DdXJyZW50Lm1lZGlhSXRlbSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCkgewotICAgICAgICBpZiAobUN1cnJlbnQgPT0gbnVsbCB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBsYXllci5nZXRDdXJyZW50RGF0YVNvdXJjZSgpICE9IG1DdXJyZW50LmRzZCkgewotICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG1DdXJyZW50LmRzZCk7Ci0gICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KG1SZXBlYXRNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IENhbGwgc2V0TmV4dERhdGFTb3VyY2UgKGIvNzQwOTA3NDEpCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKSB7Ci0gICAgICAgIG1TaHVmZmxlZExpc3QuY2xlYXIoKTsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5hZGRBbGwobVBsYXlsaXN0KTsKLSAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTAotICAgICAgICAgICAgICAgIHx8IG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKG1TaHVmZmxlZExpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2xhbXBzIHZhbHVlIHRvIFswLCBzaXplXQotICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBzaXplKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodmFsdWUgPiBzaXplKSA/IHNpemUgOiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2Y4YzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU2Vzc2lvblRva2VuMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVG9rZW4ySW1wbCBpbXBsZW1lbnRzIFNlc3Npb25Ub2tlbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VSUQgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi51aWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4ucGFja2FnZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnNlcnZpY2VfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fQklOREVSID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2Vzc2lvbl9iaW5kZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgIHByaXZhdGUgZmluYWwgQFRva2VuVHlwZSBpbnQgbVR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbkJpbmRlcjsKLQotICAgIC8qKgotICAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgdGhlIGxlZ2FjeSBzdXBwb3J0IChpLmUuIGJyb3dzZXIgY2FuIHRyeSBjb25uZWN0aW5nIHRvIGFueSBicm93c2VyCi0gICAgICogc2VydmljZSBpZiBpdCBrbm93cyB0aGUgc2VydmljZSBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4ySW1wbChDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHVpZCBpZiBpdCdzIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICh1aWQgPCAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVpZCA9IG1hbmFnZXIuZ2V0UGFja2FnZVVpZChwYWNrYWdlTmFtZSwgMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVWlkID0gdWlkOwotCi0gICAgICAgIC8vIEluZmVyIGlkIGFuZCB0eXBlIGZyb20gcGFja2FnZSBuYW1lIGFuZCBzZXJ2aWNlIG5hbWUKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgbXVsdGktdXNlci4KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UobWFuYWdlciwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggc2Vzc2lvbiBzZXJ2aWNlCi0gICAgICAgICAgICBtSWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIG1UeXBlID0gVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIgZG9lc24ndCBpbXBsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2Ugbm9yIGxpYnJhcnkgc2VydmljZS4gVXNlIHNlcnZpY2UncyBmdWxsIG5hbWUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIG1TZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgU2Vzc2lvblRva2VuMkltcGwoaW50IHVpZCwgaW50IHR5cGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIHNhbml0eSBjaGVjayAoYi83Mzg2Mzg2NSkKLSAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uVG9rZW4yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShQYWNrYWdlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc2VydmljZUludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChzZXJ2aWNlSW50ZXJmYWNlKTsKLSAgICAgICAgc2VydmljZUludGVudC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgLy8gVXNlIHF1ZXJ5SW50ZW50U2VydmljZXMgdG8gZmluZCBzZXJ2aWNlcyB3aXRoIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLgotICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHJlc29sdmVTZXJ2aWNlIHdpdGggaW50ZW50IHNwZWNpZmllZCBjbGFzcyBuYW1lLCBiZWNhdXNlIHJlc29sdmVTZXJ2aWNlCi0gICAgICAgIC8vIGlnbm9yZXMgYWN0aW9ucyBpZiBJbnRlbnQuc2V0Q2xhc3NOYW1lKCkgaXMgc3BlY2lmaWVkLgotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBsaXN0ID0gbWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKAotICAgICAgICAgICAgICAgIHNlcnZpY2VJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm5hbWUsIHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbklkKHJlc29sdmVJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvKSB7Ci0gICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5tZXRhRGF0YS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfTUVUQV9EQVRBLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1VaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJZF9pbXAoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCB1aWQgPSBidW5kbGUuZ2V0SW50KEtFWV9VSUQpOwotICAgICAgICBmaW5hbCBAVG9rZW5UeXBlIGludCB0eXBlID0gYnVuZGxlLmdldEludChLRVlfVFlQRSwgLTEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgICAgIGZpbmFsIElCaW5kZXIgc2Vzc2lvbkJpbmRlciA9IGJ1bmRsZS5nZXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSKTsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT046Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIHNlc3Npb25CaW5kZXIgZm9yIHNlc3Npb24sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiaW5kZXI9IiArIHNlc3Npb25CaW5kZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9TRVNTSU9OX1NFUlZJQ0U6Ci0gICAgICAgICAgICBjYXNlIFRZUEVfTElCUkFSWV9TRVJWSUNFOgotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBzZXJ2aWNlIG5lZWRzIHNlcnZpY2UgbmFtZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSB8fCBpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgbm9yIElEIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwodWlkLCB0eXBlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIGlkLAotICAgICAgICAgICAgICAgIHNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2Vzc2lvbkJpbmRlcikgOiBudWxsKQotICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfVUlELCBtVWlkKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfUEFDS0FHRV9OQU1FLCBtUGFja2FnZU5hbWUpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUsIG1TZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9UWVBFLCBtVHlwZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyICE9IG51bGwgPyBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpIDogbnVsbCk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLSAgICAgICAgcmV0dXJuIG1UeXBlCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtVWlkCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtUGFja2FnZU5hbWUuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobUlkLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1TZXJ2aWNlTmFtZSAhPSBudWxsID8gbVNlcnZpY2VOYW1lLmhhc2hDb2RlKCkgOiAwKSkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25Ub2tlbjIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgb3RoZXIgPSBmcm9tKChTZXNzaW9uVG9rZW4yKSBvYmopOwotICAgICAgICByZXR1cm4gbVVpZCA9PSBvdGhlci5tVWlkCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtUGFja2FnZU5hbWUsIG90aGVyLm1QYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1TZXJ2aWNlTmFtZSwgb3RoZXIubVNlcnZpY2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobUlkLCBvdGhlci5tSWQpCi0gICAgICAgICAgICAgICAgJiYgbVR5cGUgPT0gb3RoZXIubVR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICByZXR1cm4gIlNlc3Npb25Ub2tlbiB7cGtnPSIgKyBtUGFja2FnZU5hbWUgKyAiIGlkPSIgKyBtSWQgKyAiIHR5cGU9IiArIG1UeXBlCi0gICAgICAgICAgICAgICAgKyAiIHNlcnZpY2U9IiArIG1TZXJ2aWNlTmFtZSArICIgYmluZGVyPSIgKyBtU2Vzc2lvbkJpbmRlciArICJ9IjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2Vzc2lvblRva2VuMkltcGwgZnJvbShTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIHJldHVybiAoKFNlc3Npb25Ub2tlbjJJbXBsKSB0b2tlbi5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIyZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9SRUxBVElWRTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVm9sdW1lUHJvdmlkZXIySW1wbCBpbXBsZW1lbnRzIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZvbHVtZVByb3ZpZGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRyb2xUeXBlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0KLSAgICBwcml2YXRlIGludCBtQ3VycmVudFZvbHVtZTsKLSAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJJbXBsKFZvbHVtZVByb3ZpZGVyMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlcjIuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLCBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICBpZiAoY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfRklYRUQgJiYgY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgY29udHJvbFR5cGUgIiArIGNvbnRyb2xUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4Vm9sdW1lIDwgMCB8fCBjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXhWb2x1bWU9IiArIG1heFZvbHVtZSArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lID4gbWF4Vm9sdW1lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBncmVhdGVyIHRoYW4gbWF4Vm9sdW1lIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1Db250cm9sVHlwZSA9IGNvbnRyb2xUeXBlOwotICAgICAgICBtTWF4Vm9sdW1lID0gbWF4Vm9sdW1lOwotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDb250cm9sVHlwZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFZvbHVtZV9pbXBsKGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudFZvbHVtZSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOwotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZUNoYW5nZWQobUluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIHZvbHVtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25Wb2x1bWVDaGFuZ2VkKFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2VlYzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN0eWxlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVXBkYXRlQXBwZWFyYW5jZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIHNpbmNlIFAKLXB1YmxpYyBjbGFzcyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIgZXh0ZW5kcyBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIENlYTYwOENDV2lkZ2V0IG1DQ1dpZGdldDsKLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfTUlNRSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgcmV0dXJuIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgIGlmIChNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgaWYgKG1DQ1dpZGdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNDV2lkZ2V0ID0gbmV3IENlYTYwOENDV2lkZ2V0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2VhNjA4Q2FwdGlvblRyYWNrKG1DQ1dpZGdldCwgZm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWF0Y2hpbmcgZm9ybWF0OiAiICsgZm9ybWF0LnRvU3RyaW5nKCkpOwotICAgIH0KLX0KLQotY2xhc3MgQ2VhNjA4Q2FwdGlvblRyYWNrIGV4dGVuZHMgU3VidGl0bGVUcmFjayB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1BhcnNlciBtQ0NQYXJzZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1dpZGdldCBtUmVuZGVyaW5nV2lkZ2V0OwotCi0gICAgQ2VhNjA4Q2FwdGlvblRyYWNrKENlYTYwOENDV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCwgTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN1cGVyKGZvcm1hdCk7Ci0KLSAgICAgICAgbVJlbmRlcmluZ1dpZGdldCA9IHJlbmRlcmluZ1dpZGdldDsKLSAgICAgICAgbUNDUGFyc2VyID0gbmV3IENlYTYwOENDUGFyc2VyKG1SZW5kZXJpbmdXaWRnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpIHsKLSAgICAgICAgbUNDUGFyc2VyLnBhcnNlKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgewotICAgICAgICByZXR1cm4gbVJlbmRlcmluZ1dpZGdldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpIHsKLSAgICAgICAgLy8gT3ZlcnJpZGluZyB3aXRoIE5PLU9QLCBDQyByZW5kZXJpbmcgYnktcGFzc2VzIHRoaXMKLSAgICB9Ci19Ci0KLS8qKgotICogQWJzdHJhY3Qgd2lkZ2V0IGNsYXNzIHRvIHJlbmRlciBhIGNsb3NlZCBjYXB0aW9uIHRyYWNrLgotICovCi1hYnN0cmFjdCBjbGFzcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGV4dGVuZHMgVmlld0dyb3VwIGltcGxlbWVudHMgU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQgewotCi0gICAgaW50ZXJmYWNlIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKTsKLSAgICAgICAgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgc2NhbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhcHRpb25TdHlsZSBERUZBVUxUX0NBUFRJT05fU1RZTEUgPSBDYXB0aW9uU3R5bGUuREVGQVVMVDsKLQotICAgIC8qKiBDYXB0aW9uaW5nIG1hbmFnZXIsIHVzZWQgdG8gb2J0YWluIGFuZCB0cmFjayBjYXB0aW9uIHByb3BlcnRpZXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nTWFuYWdlciBtTWFuYWdlcjsKLQotICAgIC8qKiBDdXJyZW50IGNhcHRpb24gc3R5bGUuICovCi0gICAgcHJvdGVjdGVkIENhcHRpb25TdHlsZSBtQ2FwdGlvblN0eWxlOwotCi0gICAgLyoqIENhbGxiYWNrIGZvciByZW5kZXJpbmcgY2hhbmdlcy4gKi8KLSAgICBwcm90ZWN0ZWQgT25DaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgLyoqIENvbmNyZXRlIGxheW91dCBvZiBDQy4gKi8KLSAgICBwcm90ZWN0ZWQgQ2xvc2VkQ2FwdGlvbkxheW91dCBtQ2xvc2VkQ2FwdGlvbkxheW91dDsKLQotICAgIC8qKiBXaGV0aGVyIGEgY2FwdGlvbiBzdHlsZSBjaGFuZ2UgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotCi0gICAgICAgIC8vIENhbm5vdCByZW5kZXIgdGV4dCBvdmVyIHZpZGVvIHdoZW4gbGF5ZXIgdHlwZSBpcyBoYXJkd2FyZS4KLSAgICAgICAgc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9TT0ZUV0FSRSwgbnVsbCk7Ci0KLSAgICAgICAgbU1hbmFnZXIgPSAoQ2FwdGlvbmluZ01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7Ci0gICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZShtTWFuYWdlci5nZXRVc2VyU3R5bGUoKSk7Ci0KLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQgPSBjcmVhdGVDYXB0aW9uTGF5b3V0KGNvbnRleHQpOwotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShtTWFuYWdlci5nZXRGb250U2NhbGUoKSk7Ci0gICAgICAgIGFkZFZpZXcoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0KLSAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMod2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotCi0gICAgICAgIG1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgbGF5b3V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLmxheW91dChsLCB0LCByLCBiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW5hZ2VzIHdoZXRoZXIgdGhpcyByZW5kZXJlciBpcyBsaXN0ZW5pbmcgZm9yIGNhcHRpb24gc3R5bGUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0xpc3RlbmVyID0gbmV3IENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXNlclN0eWxlQ2hhbmdlZChDYXB0aW9uU3R5bGUgdXNlclN0eWxlKSB7Ci0gICAgICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUodXNlclN0eWxlKTsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZvbnRTY2FsZUNoYW5nZWQoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUoZm9udFNjYWxlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNMaXN0ZW5lciA9IGlzQXR0YWNoZWRUb1dpbmRvdygpICYmIGdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgIGlmIChtSGFzQ2hhbmdlTGlzdGVuZXIgIT0gbmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgbUhhc0NoYW5nZUxpc3RlbmVyID0gbmVlZHNMaXN0ZW5lcjsKLQotICAgICAgICAgICAgaWYgKG5lZWRzTGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBDQ1BhcnNlciBwcm9jZXNzZXMgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbiBkYXRhLgotICoKLSAqIEl0IGNhbGxzIGJhY2sgaW50byBPbkRpc3BsYXlDaGFuZ2VkTGlzdGVuZXIgdXBvbgotICogZGlzcGxheSBjaGFuZ2Ugd2l0aCBzdHlsZWQgdGV4dCBmb3IgcmVuZGVyaW5nLgotICoKLSAqLwotY2xhc3MgQ2VhNjA4Q0NQYXJzZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTFMgPSAzMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2VhNjA4Q0NQYXJzZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCA9IC0xOwotCi0gICAgLy8gRUlBLUNFQS02MDg6IFRhYmxlIDcwIC0gQ29udHJvbCBDb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQ0wgPSAweDIwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUyAgPSAweDIxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT0YgPSAweDIyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT04gPSAweDIzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVIgPSAweDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTIgPSAweDI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTMgPSAweDI2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTQgPSAweDI3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT04gPSAweDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSREMgPSAweDI5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUiAgPSAweDJhOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVEQgPSAweDJiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRE0gPSAweDJjOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiAgPSAweDJkOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTk0gPSAweDJlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0MgPSAweDJmOwotCi0gICAgLy8gVHJhbnNwYXJlbnQgU3BhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRTID0gJ1x1MDBBMCc7Ci0KLSAgICAvLyBDYXB0aW9uaW5nIE1vZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVU5LTk9XTiA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFJTlRfT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1JPTExfVVAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BPUF9PTiA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVEVYVCA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGludCBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgcHJpdmF0ZSBpbnQgbVJvbGxVcFNpemUgPSA0OwotICAgIHByaXZhdGUgaW50IG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOwotCi0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbU5vbkRpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKLSAgICBwcml2YXRlIENDTWVtb3J5IG1UZXh0TWVtID0gbmV3IENDTWVtb3J5KCk7Ci0KLSAgICBDZWE2MDhDQ1BhcnNlcihEaXNwbGF5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gQ0NEYXRhLmZyb21CeXRlQXJyYXkoZGF0YSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2NEYXRhW2ldLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlQ3RybENvZGUoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVUYWJPZmZzZXRzKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlUEFDQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZU1pZFJvd0NvZGUoY2NEYXRhW2ldKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKGNjRGF0YVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgRGlzcGxheUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cyk7Ci0gICAgICAgIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IGdldE1lbW9yeSgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBDQyBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBmb3IgY3VycmVudCBtb2RlCi0gICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgY2FzZSBNT0RFX1BPUF9PTjoKLSAgICAgICAgICAgIHJldHVybiBtTm9uRGlzcGxheTsKLSAgICAgICAgY2FzZSBNT0RFX1RFWFQ6Ci0gICAgICAgICAgICAvLyBUT0RPKGNoeik6IHN1cHBvcnQgb25seSBjYXB0aW9uIG1vZGUgZm9yIG5vdywKLSAgICAgICAgICAgIC8vIGluIHRleHQgbW9kZSwgZHVtcCBldmVyeXRoaW5nIHRvIHRleHQgbWVtLgotICAgICAgICAgICAgcmV0dXJuIG1UZXh0TWVtOwotICAgICAgICBjYXNlIE1PREVfUEFJTlRfT046Ci0gICAgICAgIGNhc2UgTU9ERV9ST0xMX1VQOgotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTG9nLncoVEFHLCAidW5yZWNvZ2luaXplZCBtb2RlOiAiICsgbU1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRGlzcGxheWFibGVDaGFycyhDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGlmICghY2NEYXRhLmlzRGlzcGxheWFibGVDaGFyKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4dGVuZGVkIGNoYXIgaW5jbHVkZXMgMSBhdXRvbWF0aWMgYmFja3NwYWNlCi0gICAgICAgIGlmIChjY0RhdGEuaXNFeHRlbmRlZENoYXIoKSkgewotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldE1lbW9yeSgpLndyaXRlVGV4dChjY0RhdGEuZ2V0RGlzcGxheVRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUEFJTlRfT04gfHwgbU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlTWlkUm93Q29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFN0eWxlQ29kZSBtID0gY2NEYXRhLmdldE1pZFJvdygpOwotICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZU1pZFJvd0NvZGUobSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBBQ0NvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBQQUMgcGFjID0gY2NEYXRhLmdldFBBQygpOwotCi0gICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLm1vdmVCYXNlbGluZVRvKHBhYy5nZXRSb3coKSwgbVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVQQUMocGFjKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUYWJPZmZzZXRzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaW50IHRhYnMgPSBjY0RhdGEuZ2V0VGFiT2Zmc2V0KCk7Ci0KLSAgICAgICAgaWYgKHRhYnMgPiAwKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS50YWIodGFicyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ3RybENvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgY3RybENvZGUgPSBjY0RhdGEuZ2V0Q3RybENvZGUoKTsKLQotICAgICAgICBpZiAobVByZXZDdHJsQ29kZSAhPSBJTlZBTElEICYmIG1QcmV2Q3RybENvZGUgPT0gY3RybENvZGUpIHsKLSAgICAgICAgICAgIC8vIGRpc2NhcmQgZG91YmxlIGN0cmwgY29kZXMgKGJ1dCBpZiB0aGVyZSdzIGEgM3JkIG9uZSwgd2Ugc3RpbGwgdGFrZSB0aGF0KQotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChjdHJsQ29kZSkgewotICAgICAgICBjYXNlIFJDTDoKLSAgICAgICAgICAgIC8vIHNlbGVjdCBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUzoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBERVI6Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5kZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJVMjoKLSAgICAgICAgY2FzZSBSVTM6Ci0gICAgICAgIGNhc2UgUlU0OgotICAgICAgICAgICAgbVJvbGxVcFNpemUgPSAoY3RybENvZGUgLSAweDIzKTsKLSAgICAgICAgICAgIC8vIGVyYXNlIG1lbW9yeSBpZiBjdXJyZW50bHkgaW4gb3RoZXIgc3R5bGUKLSAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZWxlY3Qgcm9sbC11cCBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1JPTExfVVA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT046Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJGbGFzaCBPbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkRDOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBhaW50LW9uIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUjoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgbVRleHRNZW0uZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJURDoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRURNOgotICAgICAgICAgICAgLy8gZXJhc2UgZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5yb2xsVXAobVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5jcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVOTToKLSAgICAgICAgICAgIC8vIGVyYXNlIG5vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVPQzoKLSAgICAgICAgICAgIC8vIHN3YXAgZGlzcGxheS9ub24tZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIHN3YXBNZW1vcnkoKTsKLSAgICAgICAgICAgIC8vIHN3aXRjaCB0byBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlZBTElEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJldkN0cmxDb2RlID0gY3RybENvZGU7Ci0KLSAgICAgICAgLy8gaGFuZGxlZAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlzcGxheSgpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlID0gbUxpc3RlbmVyLmdldENhcHRpb25TdHlsZSgpOwotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheUNoYW5nZWQobURpc3BsYXkuZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzd2FwTWVtb3J5KCkgewotICAgICAgICBDQ01lbW9yeSB0ZW1wID0gbURpc3BsYXk7Ci0gICAgICAgIG1EaXNwbGF5ID0gbU5vbkRpc3BsYXk7Ci0gICAgICAgIG1Ob25EaXNwbGF5ID0gdGVtcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHlsZUNvZGUgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFID0gMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9HUkVFTiA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQkxVRSA9IDI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQ1lBTiA9IDM7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfUkVEID0gNDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9ZRUxMT1cgPSA1OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX01BR0VOVEEgPSA2OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0lOVkFMSUQgPSA3OwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfSVRBTElDUyAgID0gMHgwMDAwMDAwMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9VTkRFUkxJTkUgPSAweDAwMDAwMDAyOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ29sb3JNYXAgPSB7Ci0gICAgICAgICAgICAiV0hJVEUiLCAiR1JFRU4iLCAiQkxVRSIsICJDWUFOIiwgIlJFRCIsICJZRUxMT1ciLCAiTUFHRU5UQSIsICJJTlZBTElEIgotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIGludCBtU3R5bGU7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sb3I7Ci0KLSAgICAgICAgc3RhdGljIFN0eWxlQ29kZSBmcm9tQnl0ZShieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKLSAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3R5bGVDb2RlKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUoaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1TdHlsZSA9IHN0eWxlOwotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSXRhbGljcygpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNVbmRlcmxpbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQoInsiKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQobUNvbG9yTWFwW21Db2xvcl0pOwotICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBJVEFMSUNTIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgVU5ERVJMSU5FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCJ9Iik7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBBQyBleHRlbmRzIFN0eWxlQ29kZSB7Ci0gICAgICAgIGZpbmFsIGludCBtUm93OwotICAgICAgICBmaW5hbCBpbnQgbUNvbDsKLQotICAgICAgICBzdGF0aWMgUEFDIGZyb21CeXRlcyhieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnRbXSByb3dUYWJsZSA9IHsxMSwgMSwgMywgMTIsIDE0LCA1LCA3LCA5fTsKLSAgICAgICAgICAgIGludCByb3cgPSByb3dUYWJsZVtkYXRhMSAmIDB4MDddICsgKChkYXRhMiAmIDB4MjApID4+IDUpOwotICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MTApICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpbmRlbnQgY29kZQotICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCBpbmRlbnQgKiA0LCBzdHlsZSwgQ09MT1JfV0hJVEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzdHlsZSBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIC0xLCBzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUEFDKGludCByb3csIGludCBjb2wsIGludCBzdHlsZSwgaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgbVJvdyA9IHJvdzsKLSAgICAgICAgICAgIG1Db2wgPSBjb2w7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSW5kZW50UEFDKCkgewotICAgICAgICAgICAgcmV0dXJuIChtQ29sID49IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFJvdygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm93OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyVkLCAlZH0sICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbVJvdywgbUNvbCwgc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdXRhYmxlIHZlcnNpb24gb2YgQmFja2dyb3VuZFNwYW4gdG8gZmFjaWxpdGF0ZSB0ZXh0IHJlbmRlcmluZyB3aXRoIGVkZ2Ugc3R5bGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBDaGFyYWN0ZXJTdHlsZQotICAgICAgICAgICAgaW1wbGVtZW50cyBVcGRhdGVBcHBlYXJhbmNlIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgICAgIHB1YmxpYyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKFRleHRQYWludCBkcykgewotICAgICAgICAgICAgZHMuYmdDb2xvciA9IG1Db2xvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENDTGluZUJ1aWxkZXIga2VlcHMgdHJhY2sgb2YgZGlzcGxheWFibGUgY2hhcnMsIGFzIHdlbGwgYXMKLSAgICAgKiBNaWRSb3cgc3R5bGVzIGFuZCBQQUNzLCBmb3IgYSBzaW5nbGUgbGluZSBvZiBDQyBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBJdCBnZW5lcmF0ZXMgc3R5bGVkIHRleHQgdmlhIGdldFN0eWxlZFRleHQoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtRGlzcGxheUNoYXJzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1NaWRSb3dTdHlsZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbVBBQ1N0eWxlczsKLQotICAgICAgICBDQ0xpbmVCdWlsZGVyKFN0cmluZyBzdHIpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07Ci0gICAgICAgICAgICBtUEFDU3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsIGNoKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0TWlkUm93QXQoaW50IGluZGV4LCBTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsICcgJyk7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBBQ0F0KGludCBpbmRleCwgUEFDIHBhYykgewotICAgICAgICAgICAgbVBBQ1N0eWxlc1tpbmRleF0gPSBwYWM7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmNoYXJBdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGVuZ3RoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcGx5U3R5bGVTcGFuKAotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCwKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAocy5pc0l0YWxpY3MoKSkgewotICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHlsZVNwYW4oYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZS5JVEFMSUMpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy5pc1VuZGVybGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVuZGVybGluZVNwYW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG1EaXNwbGF5Q2hhcnMpOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTEsIG5leHQgPSAwOwotICAgICAgICAgICAgaW50IHN0eWxlU3RhcnQgPSAtMTsKLSAgICAgICAgICAgIFN0eWxlQ29kZSBjdXJTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAobmV4dCA8IG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgbmV3U3R5bGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtTWlkUm93U3R5bGVzW25leHRdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgbWlkLXJvdyBzdHlsZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtTWlkUm93U3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBBQ1N0eWxlc1tuZXh0XSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHlsZVN0YXJ0IDwgMCB8fCBzdGFydCA8IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IFBBQyBzdHlsZSBjaGFuZ2UsIG9ubHkgaWY6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIG5vIHN0eWxlIHNldCwgb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc3R5bGUgc2V0LCBidXQgcHJldiBjaGFyIGlzIG5vbmUtZGlzcGxheWFibGUKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtUEFDU3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJTdHlsZSA9IG5ld1N0eWxlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwICYmIHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIG5ld1N0eWxlLCBzdHlsZVN0YXJ0LCBuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdHlsZVN0YXJ0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCkgIT0gVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZFN0YXJ0ID0gbURpc3BsYXlDaGFycy5jaGFyQXQoc3RhcnQpID09ICcgJyA/IHN0YXJ0IDogc3RhcnQgLSAxOwotICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRFbmQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0IC0gMSkgPT0gJyAnID8gbmV4dCA6IG5leHQgKyAxOwotICAgICAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkU3RhcnQsIGV4cGFuZGVkRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBjdXJTdHlsZSwgc3R5bGVTdGFydCwgZXhwYW5kZWRFbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5leHQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0eWxlZFRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENDTWVtb3J5IG1vZGVscyBhIGNvbnNvbGUtc3R5bGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ01lbW9yeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1CbGFua0xpbmU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQnVpbGRlcltdIG1MaW5lcyA9IG5ldyBDQ0xpbmVCdWlsZGVyW01BWF9ST1dTICsgMl07Ci0gICAgICAgIHByaXZhdGUgaW50IG1Sb3c7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db2w7Ci0KLSAgICAgICAgQ0NNZW1vcnkoKSB7Ci0gICAgICAgICAgICBjaGFyW10gYmxhbmsgPSBuZXcgY2hhcltNQVhfQ09MUyArIDJdOwotICAgICAgICAgICAgQXJyYXlzLmZpbGwoYmxhbmssIFRTKTsKLSAgICAgICAgICAgIG1CbGFua0xpbmUgPSBuZXcgU3RyaW5nKGJsYW5rKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXJhc2UoKSB7Ci0gICAgICAgICAgICAvLyBlcmFzZSBhbGwgbGluZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3cgPSBNQVhfUk9XUzsKLSAgICAgICAgICAgIG1Db2wgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkZXIoKSB7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2w7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddLmNoYXJBdChpKSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1Db2w7IGogPCBtTGluZXNbbVJvd10ubGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tqXS5zZXRDaGFyQXQoaiwgVFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRhYihpbnQgdGFicykgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBicygpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgtMSk7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KG1Db2wsIFRTKTsKLSAgICAgICAgICAgICAgICBpZiAobUNvbCA9PSBNQVhfQ09MUyAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3BlYyByZWNvbW1lbmRhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgY3Vyc29yIHdhcyBhdCBjb2wgMzIsIG1vdmUgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gY29sIDMxIGFuZCBlcmFzZSBib3RoIGNvbCAzMSYzMgotICAgICAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KE1BWF9DT0xTLCBUUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjcigpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhtUm93ICsgMSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJvbGxVcChpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1Sb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHN0YXJ0Um93ID0gbVJvdyAtIHdpbmRvd1NpemUgKyAxOwotICAgICAgICAgICAgaWYgKHN0YXJ0Um93IDwgMSkgewotICAgICAgICAgICAgICAgIHN0YXJ0Um93ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0Um93OyBpIDwgbVJvdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbUxpbmVzW2kgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IG1Sb3c7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBjbGVhciBiYXNlIHJvdwotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGNvbCAxLCBpbiBjYXNlIFBBQyBpcyBub3Qgc2VudAotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldENoYXJBdChtQ29sLCB0ZXh0LmNoYXJBdChpKSk7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZU1pZFJvd0NvZGUoU3R5bGVDb2RlIG0pIHsKLSAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0TWlkUm93QXQobUNvbCwgbSk7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUEFDKFBBQyBwYWMpIHsKLSAgICAgICAgICAgIGlmIChwYWMuaXNJbmRlbnRQQUMoKSkgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIHBhYy5nZXRDb2woKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRQQUNBdChtQ29sLCBwYWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFNwYW5uYWJsZVN0cmluZ0J1aWxkZXI+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PD4oTUFYX1JPV1MpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIHJvd3MuYWRkKG1MaW5lc1tpXSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tpXS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkgOiBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3dzLnRvQXJyYXkobmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbTUFYX1JPV1NdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgeCwgaW50IG1pbiwgaW50IG1heCkgewotICAgICAgICAgICAgcmV0dXJuIHggPCBtaW4gPyBtaW4gOiAoeCA+IG1heCA/IG1heCA6IHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUbyhpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAoY29sLCAxLCBNQVhfQ09MUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvUm93KGludCByb3cpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yQnlDb2woaW50IGNvbCkgewotICAgICAgICAgICAgbUNvbCA9IGNsYW1wKG1Db2wgKyBjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQmFzZWxpbmVUbyhpbnQgYmFzZVJvdywgaW50IHdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgIGlmIChtUm93ID09IGJhc2VSb3cpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2luZG93U2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgICAgICBpZiAoYmFzZVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gYmFzZVJvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBtUm93OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgbVJvdykgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBib3R0b20gdG8gdG9wIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGFjdHVhbFdpbmRvd1NpemUgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0b3AgdG8gYm90dG9tIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxXaW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xlYXIgcmVzdCBvZiB0aGUgcm93cwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBiYXNlUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IGJhc2VSb3cgKyAxOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ0NMaW5lQnVpbGRlciBnZXRMaW5lQnVmZmVyKGludCByb3cpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbcm93XSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW3Jvd10gPSBuZXcgQ0NMaW5lQnVpbGRlcihtQmxhbmtMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtTGluZXNbcm93XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NEYXRhIHBhcnNlcyB0aGUgcmF3IENDIGJ5dGUgcGFpciBpbnRvIGRpc3BsYXlhYmxlIGNoYXJzLAotICAgICAqIG1pc2MgY29udHJvbCBjb2RlcywgTWlkLVJvdyBvciBQcmVhbWJsZSBBZGRyZXNzIENvZGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDRGF0YSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ3RybENvZGVNYXAgPSB7Ci0gICAgICAgICAgICAiUkNMIiwgIkJTIiAsICJBT0YiLCAiQU9OIiwKLSAgICAgICAgICAgICJERVIiLCAiUlUyIiwgIlJVMyIsICJSVTQiLAotICAgICAgICAgICAgIkZPTiIsICJSREMiLCAiVFIiICwgIlJURCIsCi0gICAgICAgICAgICAiRURNIiwgIkNSIiAsICJFTk0iLCAiRU9DIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BlY2lhbENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAiXHUwMEFFIiwKLSAgICAgICAgICAgICJcdTAwQjAiLAotICAgICAgICAgICAgIlx1MDBCRCIsCi0gICAgICAgICAgICAiXHUwMEJGIiwKLSAgICAgICAgICAgICJcdTIxMjIiLAotICAgICAgICAgICAgIlx1MDBBMiIsCi0gICAgICAgICAgICAiXHUwMEEzIiwKLSAgICAgICAgICAgICJcdTI2NkEiLCAvLyBFaWdodGggbm90ZQotICAgICAgICAgICAgIlx1MDBFMCIsCi0gICAgICAgICAgICAiXHUwMEEwIiwgLy8gVHJhbnNwYXJlbnQgc3BhY2UKLSAgICAgICAgICAgICJcdTAwRTgiLAotICAgICAgICAgICAgIlx1MDBFMiIsCi0gICAgICAgICAgICAiXHUwMEVBIiwKLSAgICAgICAgICAgICJcdTAwRUUiLAotICAgICAgICAgICAgIlx1MDBGNCIsCi0gICAgICAgICAgICAiXHUwMEZCIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BhbmlzaENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAvLyBTcGFuaXNoIGFuZCBtaXNjIGNoYXJzCi0gICAgICAgICAgICAiXHUwMEMxIiwgLy8gQQotICAgICAgICAgICAgIlx1MDBDOSIsIC8vIEUKLSAgICAgICAgICAgICJcdTAwRDMiLCAvLyBJCi0gICAgICAgICAgICAiXHUwMERBIiwgLy8gTwotICAgICAgICAgICAgIlx1MDBEQyIsIC8vIFUKLSAgICAgICAgICAgICJcdTAwRkMiLCAvLyB1Ci0gICAgICAgICAgICAiXHUyMDE4IiwgLy8gb3BlbmluZyBzaW5nbGUgcXVvdGUKLSAgICAgICAgICAgICJcdTAwQTEiLCAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCi0gICAgICAgICAgICAiKiIsCi0gICAgICAgICAgICAiJyIsCi0gICAgICAgICAgICAiXHUyMDE0IiwgLy8gZW0gZGFzaAotICAgICAgICAgICAgIlx1MDBBOSIsIC8vIENvcHlyaWdodAotICAgICAgICAgICAgIlx1MjEyMCIsIC8vIFNlcnZpY2VtYXJrCi0gICAgICAgICAgICAiXHUyMDIyIiwgLy8gcm91bmQgYnVsbGV0Ci0gICAgICAgICAgICAiXHUyMDFDIiwgLy8gb3BlbmluZyBkb3VibGUgcXVvdGUKLSAgICAgICAgICAgICJcdTIwMUQiLCAvLyBjbG9zaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgLy8gRnJlbmNoCi0gICAgICAgICAgICAiXHUwMEMwIiwKLSAgICAgICAgICAgICJcdTAwQzIiLAotICAgICAgICAgICAgIlx1MDBDNyIsCi0gICAgICAgICAgICAiXHUwMEM4IiwKLSAgICAgICAgICAgICJcdTAwQ0EiLAotICAgICAgICAgICAgIlx1MDBDQiIsCi0gICAgICAgICAgICAiXHUwMEVCIiwKLSAgICAgICAgICAgICJcdTAwQ0UiLAotICAgICAgICAgICAgIlx1MDBDRiIsCi0gICAgICAgICAgICAiXHUwMEVGIiwKLSAgICAgICAgICAgICJcdTAwRDQiLAotICAgICAgICAgICAgIlx1MDBEOSIsCi0gICAgICAgICAgICAiXHUwMEY5IiwKLSAgICAgICAgICAgICJcdTAwREIiLAotICAgICAgICAgICAgIlx1MDBBQiIsCi0gICAgICAgICAgICAiXHUwMEJCIgotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Qcm90dWd1ZXNlQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFBvcnR1Z3Vlc2UKLSAgICAgICAgICAgICJcdTAwQzMiLAotICAgICAgICAgICAgIlx1MDBFMyIsCi0gICAgICAgICAgICAiXHUwMENEIiwKLSAgICAgICAgICAgICJcdTAwQ0MiLAotICAgICAgICAgICAgIlx1MDBFQyIsCi0gICAgICAgICAgICAiXHUwMEQyIiwKLSAgICAgICAgICAgICJcdTAwRjIiLAotICAgICAgICAgICAgIlx1MDBENSIsCi0gICAgICAgICAgICAiXHUwMEY1IiwKLSAgICAgICAgICAgICJ7IiwKLSAgICAgICAgICAgICJ9IiwKLSAgICAgICAgICAgICJcXCIsCi0gICAgICAgICAgICAiXiIsCi0gICAgICAgICAgICAiXyIsCi0gICAgICAgICAgICAifCIsCi0gICAgICAgICAgICAifiIsCi0gICAgICAgICAgICAvLyBHZXJtYW4gYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzQiLAotICAgICAgICAgICAgIlx1MDBFNCIsCi0gICAgICAgICAgICAiXHUwMEQ2IiwKLSAgICAgICAgICAgICJcdTAwRjYiLAotICAgICAgICAgICAgIlx1MDBERiIsCi0gICAgICAgICAgICAiXHUwMEE1IiwKLSAgICAgICAgICAgICJcdTAwQTQiLAotICAgICAgICAgICAgIlx1MjUwMiIsIC8vIHZlcnRpY2FsIGJhcgotICAgICAgICAgICAgIlx1MDBDNSIsCi0gICAgICAgICAgICAiXHUwMEU1IiwKLSAgICAgICAgICAgICJcdTAwRDgiLAotICAgICAgICAgICAgIlx1MDBGOCIsCi0gICAgICAgICAgICAiXHUyNTBDIiwgLy8gdG9wLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTEwIiwgLy8gdG9wLXJpZ2h0IGNvcm5lcgotICAgICAgICAgICAgIlx1MjUxNCIsIC8vIGxvd2VyLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE4IiwgLy8gbG93ZXItcmlnaHQgY29ybmVyCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIENDRGF0YVtdIGZyb21CeXRlQXJyYXkoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IG5ldyBDQ0RhdGFbZGF0YS5sZW5ndGggLyAzXTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjY0RhdGFbaV0gPSBuZXcgQ0NEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogM10sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMl0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2NEYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0NEYXRhKGJ5dGUgdHlwZSwgYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgewotICAgICAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICAgICAgbURhdGExID0gZGF0YTE7Ci0gICAgICAgICAgICBtRGF0YTIgPSBkYXRhMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDdHJsQ29kZSgpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTQgfHwgbURhdGExID09IDB4MWMpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICB9Ci0KLSAgICAgICAgU3R5bGVDb2RlIGdldE1pZFJvdygpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCBNaWQtcm93IGNvZGVzLCBpZ25vcmUKLSAgICAgICAgICAgIC8vIG9wdGlvbmFsIGJhY2tncm91bmQvZm9yZWdyb3VuZCBtaWQtcm93IGNvZGVzCi0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZUNvZGUuZnJvbUJ5dGUobURhdGEyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUEFDIGdldFBBQygpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExICYgMHg3MCkgPT0gMHgxMAotICAgICAgICAgICAgICAgICAgICAmJiAobURhdGEyICYgMHg0MCkgPT0gMHg0MAotICAgICAgICAgICAgICAgICAgICAmJiAoKG1EYXRhMSAmIDB4MDcpICE9IDAgfHwgKG1EYXRhMiAmIDB4MjApID09IDApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBQy5mcm9tQnl0ZXMobURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VGFiT2Zmc2V0KCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNyB8fCBtRGF0YTEgPT0gMHgxZikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjEgJiYgbURhdGEyIDw9IDB4MjMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyICYgMHgzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRGlzcGxheWFibGVDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzQmFzaWNDaGFyKCkgfHwgaXNTcGVjaWFsQ2hhcigpIHx8IGlzRXh0ZW5kZWRDaGFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGlzcGxheVRleHQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0QmFzaWNDaGFycygpOwotCi0gICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHIgPSAgZ2V0U3BlY2lhbENoYXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdHIgPSBnZXRFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBjdHJsQ29kZVRvU3RyaW5nKGludCBjdHJsQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIG1DdHJsQ29kZU1hcFtjdHJsQ29kZSAtIDB4MjBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFzaWNDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEKLSAgICAgICAgICAgICAgICAgICAgfHwgbURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2hhciBnZXRCYXNpY0NoYXIoYnl0ZSBkYXRhKSB7Ci0gICAgICAgICAgICBjaGFyIGM7Ci0gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBub24tQVNDSUkgb25lcwotICAgICAgICAgICAgc3dpdGNoIChkYXRhKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDJBOiBjID0gJ1x1MDBFMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1QzogYyA9ICdcdTAwRTknOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUU6IGMgPSAnXHUwMEVEJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVGOiBjID0gJ1x1MDBGMyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg2MDogYyA9ICdcdTAwRkEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0I6IGMgPSAnXHUwMEU3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdDOiBjID0gJ1x1MDBGNyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RDogYyA9ICdcdTAwRDEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0U6IGMgPSAnXHUwMEYxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdGOiBjID0gJ1x1MjU4OCc7IGJyZWFrOyAvLyBGdWxsIGJsb2NrCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogYyA9IChjaGFyKSBkYXRhOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNDaGFycygpIHsKLSAgICAgICAgICAgIGlmIChtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDIpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTEpKTsKLSAgICAgICAgICAgICAgICBpZiAobURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4N2YpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFNwZWNpYWxDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWNpYWxDaGFyTWFwW21EYXRhMiAtIDB4MzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuZGVkQ2hhcigpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwYW5pc2hDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgobURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm90dWd1ZXNlQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHI7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YTEgPCAweDEwICYmIG1EYXRhMiA8IDB4MTApIHsKLSAgICAgICAgICAgICAgICAvLyBOdWxsIFBhZCwgaWdub3JlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1OdWxsOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3RybENvZGUgPSBnZXRDdHJsQ29kZSgpOwotICAgICAgICAgICAgaWYgKGN0cmxDb2RlICE9IElOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXSVzIiwgbVR5cGUsIGN0cmxDb2RlVG9TdHJpbmcoY3RybENvZGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRhYk9mZnNldCA9IGdldFRhYk9mZnNldCgpOwotICAgICAgICAgICAgaWYgKHRhYk9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVRhYiVkIiwgbVR5cGUsIHRhYk9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBBQyBwYWMgPSBnZXRQQUMoKTsKLSAgICAgICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdUEFDOiAlcyIsIG1UeXBlLCBwYWMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0eWxlQ29kZSBtID0gZ2V0TWlkUm93KCk7Ci0gICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1NaWQtcm93OiAlcyIsIG1UeXBlLCBtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdRGlzcGxheWFibGU6ICVzICglMDJ4ICUwMngpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlLCBnZXREaXNwbGF5VGV4dCgpLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBXaWRnZXQgY2FwYWJsZSBvZiByZW5kZXJpbmcgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbnMuCi0gKi8KLWNsYXNzIENlYTYwOENDV2lkZ2V0IGV4dGVuZHMgQ2xvc2VkQ2FwdGlvbldpZGdldCBpbXBsZW1lbnRzIENlYTYwOENDUGFyc2VyLkRpc3BsYXlMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBtVGV4dEJvdW5kcyA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1EdW1teVRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCI7Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ0NMYXlvdXQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpIHsKLSAgICAgICAgKChDQ0xheW91dCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLnVwZGF0ZShzdHlsZWRUZXh0cyk7Ci0KLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25DaGFuZ2VkKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FwdGlvblN0eWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJveCBleHRlbmRzIFRleHRWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRk9OVF9QQURESU5HX1JBVElPID0gMC43NWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfT1VUTElORV9SQVRJTyA9IDAuMWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfU0hBRE9XX1JBVElPID0gMC4wNWY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbU91dGxpbmVXaWR0aDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93UmFkaXVzOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dPZmZzZXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVRleHRDb2xvciA9IENvbG9yLldISVRFOwotICAgICAgICBwcml2YXRlIGludCBtQmdDb2xvciA9IENvbG9yLkJMQUNLOwotICAgICAgICBwcml2YXRlIGludCBtRWRnZVR5cGUgPSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlQ29sb3IgPSBDb2xvci5UUkFOU1BBUkVOVDsKLQotICAgICAgICBDQ0xpbmVCb3goQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIpOwotICAgICAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIHNldFRleHRDb2xvcihDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBzZXRUeXBlZmFjZShUeXBlZmFjZS5NT05PU1BBQ0UpOwotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCAod2lsbCBiZSB1cGRhdGVkIGxhdGVyIGR1cmluZyBtZWFzdXJlKQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfb3V0bGluZV93aWR0aCk7Ci0gICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfcmFkaXVzKTsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19vZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgbVRleHRDb2xvciA9IGNhcHRpb25TdHlsZS5mb3JlZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtQmdDb2xvciA9IGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtRWRnZVR5cGUgPSBjYXB0aW9uU3R5bGUuZWRnZVR5cGU7Ci0gICAgICAgICAgICBtRWRnZUNvbG9yID0gY2FwdGlvblN0eWxlLmVkZ2VDb2xvcjsKLQotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgbVNoYWRvd09mZnNldCwgbVNoYWRvd09mZnNldCwgbUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgICAgICBmbG9hdCBmb250U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpICogRk9OVF9QQURESU5HX1JBVElPOwotICAgICAgICAgICAgc2V0VGV4dFNpemUoVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfUFgsIGZvbnRTaXplKTsKLQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IEVER0VfT1VUTElORV9SQVRJTyAqIGZvbnRTaXplICsgMS4wZjsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSBFREdFX1NIQURPV19SQVRJTyAqIGZvbnRTaXplICsgMS4wZjs7Ci0gICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gbVNoYWRvd1JhZGl1czsKLQotICAgICAgICAgICAgLy8gc2V0IGZvbnQgc2NhbGUgaW4gdGhlIFggZGlyZWN0aW9uIHRvIG1hdGNoIHRoZSByZXF1aXJlZCB3aWR0aAotICAgICAgICAgICAgc2V0U2NhbGVYKDEuMGYpOwotICAgICAgICAgICAgZ2V0UGFpbnQoKS5nZXRUZXh0Qm91bmRzKG1EdW1teVRleHQsIDAsIG1EdW1teVRleHQubGVuZ3RoKCksIG1UZXh0Qm91bmRzKTsKLSAgICAgICAgICAgIGZsb2F0IGFjdHVhbFRleHRXaWR0aCA9IG1UZXh0Qm91bmRzLndpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCByZXF1aXJlZFRleHRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBzZXRTY2FsZVgocmVxdWlyZWRUZXh0V2lkdGggLyBhY3R1YWxUZXh0V2lkdGgpOwotCi0gICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgYykgewotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1VOU1BFQ0lGSUVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkUKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVzZSBlZGdlIHN0eWxlcyBkb24ndCByZXF1aXJlIGEgc2Vjb25kIHBhc3MKLSAgICAgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfT1VUTElORSkgewotICAgICAgICAgICAgICAgIGRyYXdFZGdlT3V0bGluZShjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmFpc2VkIG9yIGRlcHJlc3NlZAotICAgICAgICAgICAgICAgIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VPdXRsaW5lKENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKLQotICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgUGFpbnQuSm9pbiBwcmV2aW91c0pvaW4gPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlSm9pbigpOwotICAgICAgICAgICAgZmxvYXQgcHJldmlvdXNXaWR0aCA9IHRleHRQYWludC5nZXRTdHJva2VXaWR0aCgpOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTF9BTkRfU1RST0tFKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKFBhaW50LkpvaW4uUk9VTkQpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKG1PdXRsaW5lV2lkdGgpOwotCi0gICAgICAgICAgICAvLyBEcmF3IG91dGxpbmUgYW5kIGJhY2tncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKHByZXZpb3VzSm9pbik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgocHJldmlvdXNXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0gICAgICAgICAgICAvLyBEcmF3IGZvcmVncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmFpc2VkID0gbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfUkFJU0VEOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yVXAgPSByYWlzZWQgPyBDb2xvci5XSElURSA6IG1FZGdlQ29sb3I7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JEb3duID0gcmFpc2VkID8gbUVkZ2VDb2xvciA6IENvbG9yLldISVRFOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgb2Zmc2V0ID0gbVNoYWRvd1JhZGl1cyAvIDJmOwotCi0gICAgICAgICAgICAvLyBEcmF3IGJhY2tncm91bmQgYW5kIHRleHQgd2l0aCBzaGFkb3cgdXAKLSAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIC1vZmZzZXQsIC1vZmZzZXQsIGNvbG9yVXApOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOwotCi0gICAgICAgICAgICAvLyBEcmF3IHRleHQgd2l0aCBzaGFkb3cgZG93bgotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgK29mZnNldCwgK29mZnNldCwgY29sb3JEb3duKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBzZXR0aW5ncwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kU3BhbnMoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSA9IChTcGFubmFibGUpIHRleHQ7Ci0gICAgICAgICAgICAgICAgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW5bXSBiZ1NwYW5zID0gc3Bhbm5hYmxlLmdldFNwYW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3Bhbm5hYmxlLmxlbmd0aCgpLCBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZ1NwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJnU3BhbnNbaV0uc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xheW91dCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSBDZWE2MDhDQ1BhcnNlci5NQVhfUk9XUzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0FGRV9BUkVBX1JBVElPID0gMC45ZjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJveFtdIG1MaW5lQm94ZXMgPSBuZXcgQ0NMaW5lQm94W01BWF9ST1dTXTsKLQotICAgICAgICBDQ0xheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LlNUQVJUKTsKLSAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldID0gbmV3IENDTGluZUJveChnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIGFkZFZpZXcobUxpbmVCb3hlc1tpXSwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0Q2FwdGlvblN0eWxlKGNhcHRpb25TdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IGZvbnRTY2FsZSkgewotICAgICAgICAgICAgLy8gSWdub3JlcyB0aGUgZm9udCBzY2FsZSBjaGFuZ2VzIG9mIHRoZSBzeXN0ZW0gd2lkZSBDQyBwcmVmZXJlbmNlLgotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGUoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHRleHRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0QnVmZmVyW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRUZXh0KHRleHRCdWZmZXJbaV0sIFRleHRWaWV3LkJ1ZmZlclR5cGUuU1BBTk5BQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIGludCBzYWZlV2lkdGggPSBnZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgc2FmZUhlaWdodCA9IGdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmIChzYWZlV2lkdGggKiAzID49IHNhZmVIZWlnaHQgKiA0KSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gc2FmZUhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gc2FmZVdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0KLSAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0ID0gc2FmZUhlaWdodCAvIE1BWF9ST1dTOwotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHRNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICBpbnQgbGluZVdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgIHNhZmVXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubWVhc3VyZShsaW5lV2lkdGhNZWFzdXJlU3BlYywgbGluZUhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICAgICAvLyBzYWZlIGNhcHRpb24gYXJlYQotICAgICAgICAgICAgaW50IHZpZXdQb3J0V2lkdGggPSByIC0gbDsKLSAgICAgICAgICAgIGludCB2aWV3UG9ydEhlaWdodCA9IGIgLSB0OwotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCwgc2FmZUhlaWdodDsKLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmICh2aWV3UG9ydFdpZHRoICogMyA+PSB2aWV3UG9ydEhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydEhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydEhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRXaWR0aDsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRXaWR0aCAqIDMgLyA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKLSAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgaW50IGxlZnQgPSAodmlld1BvcnRXaWR0aCAtIHNhZmVXaWR0aCkgLyAyOwotICAgICAgICAgICAgaW50IHRvcCA9ICh2aWV3UG9ydEhlaWdodCAtIHNhZmVIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5sYXlvdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIGkgLyBNQVhfUk9XUywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyBzYWZlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogKGkgKyAxKSAvIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzNmQ3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi0vLyBOb3RlOiBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gYW5kcm9pZC5tZWRpYS5NZWRpYVRpbWVQcm92aWRlci4KLXB1YmxpYyBpbnRlcmZhY2UgTWVkaWFUaW1lUHJvdmlkZXIgewotICAgIC8vIHdlIGRvIG5vdCBhbGxvdyBuZWdhdGl2ZSBtZWRpYSB0aW1lCi0gICAgLyoqCi0gICAgICogUHJlc2VudGF0aW9uIHRpbWUgdmFsdWUgaWYgbm8gdGltZWQgZXZlbnQgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTk9fVElNRSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGltZVVzIGlzCi0gICAgICogbm90IG5lZ2F0aXZlLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgZm9yIGEgdGltZWQgZXZlbnQKLSAgICAgKiBub3RpZmljYXRpb24gd2hlbiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgcmVhY2hlcyAoYmVjb21lcyBncmVhdGVyKSB0aGFuCi0gICAgICogdGhlIHZhbHVlIHNwZWNpZmllZC4gIFRoaXMgaGFwcGVucyBpbW1lZGlhdGVseSBpZiB0aGUgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICogaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGltZVVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVVcyBwcmVzZW50YXRpb24gdGltZSB0byBnZXQgdGltZWQgZXZlbnQgY2FsbGJhY2sgYXQgKG9yCi0gICAgICogICAgICAgICAgICAgICB7QGxpbmsgI05PX1RJTUV9KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUF0KGxvbmcgdGltZVVzLCBPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuICBJdAotICAgICAqIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgdG8gZ2V0IHNlZWsgYW5kIHN0b3Agbm90aWZpY2F0aW9ucy4gIElmIHRoZSBtZWRpYQotICAgICAqIGlzIHN0b3BwZWQsIHRoZSBsaXN0ZW5lciB3aWxsIGltbWVkaWF0ZWx5IHJlY2VpdmUgYSBzdG9wIG5vdGlmaWNhdGlvbi4KLSAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgcmVjZWl2ZSBhIHRpbWVkIGV2ZW50IG5vdGlmaWNhdG9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxOb3RpZmljYXRpb25zKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWNpc2UgICBXaGV0aGVyIGdldHRpbmcgYSBwcmVjaXNlIHRpbWUgaXMgaW1wb3J0YW50LiBUaGlzIGlzCi0gICAgICogICAgICAgICAgICAgICAgICBtb3JlIGNvc3RseS4KLSAgICAgKiBAcGFyYW0gbW9ub3RvbmljIFdoZXRoZXIgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgbW9ub3RvbmljOiB0aGF0IGlzLAotICAgICAqICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsYXN0IHJldHVybmVkIHRpbWUuICBEb24ndAotICAgICAqICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGlzIHRvIHRydWUuICBFLmcuIHRoaXMgaGFzIHVuZGVzaXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgY29uc2VxdWVuY2VzIGlmIHRoZSBtZWRpYSBpcyBzZWVrZWQgYmV0d2VlbiBjYWxscy4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbWVkaWEgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVVcyhib29sZWFuIHByZWNpc2UsIGJvb2xlYW4gbW9ub3RvbmljKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uTWVkaWFUaW1lTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlZ2lzdGVyZWQgdGltZSB3YXMgcmVhY2hlZCBuYXR1cmFsbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSB0aW1lIGNoYW5nZWQgZHVlIHRvIHNlZWtpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5YmFjayBzdG9wcGVkLiAgVGhpcyBpcyBub3QgY2FsbGVkIG9uIHBhdXNlLCBvbmx5Ci0gICAgICAgICAqIG9uIGZ1bGwgc3RvcCwgYXQgd2hpY2ggcG9pbnQgdGhlcmUgaXMgbm8gZnVydGhlciBjdXJyZW50IG1lZGlhIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU3RvcCgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDU1ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5UcmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVDb250cm9sbGVyIHNpbmNlIFAKLS8qKgotICogVGhlIHN1YnRpdGxlIGNvbnRyb2xsZXIgcHJvdmlkZXMgdGhlIGFyY2hpdGVjdHVyZSB0byBkaXNwbGF5IHN1YnRpdGxlcyBmb3IgYQotICogbWVkaWEgc291cmNlLiAgSXQgYWxsb3dzIHNwZWNpZnlpbmcgd2hpY2ggdHJhY2tzIHRvIGRpc3BsYXksIG9uIHdoaWNoIGFuY2hvcgotICogdG8gZGlzcGxheSB0aGVtLCBhbmQgYWxzbyBhbGxvd3MgYWRkaW5nIGV4dGVybmFsLCBvdXQtb2YtYmFuZCBzdWJ0aXRsZSB0cmFja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJ0aXRsZUNvbnRyb2xsZXIgewotICAgIHByaXZhdGUgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLSAgICBwcml2YXRlIFZlY3RvcjxSZW5kZXJlcj4gbVJlbmRlcmVyczsKLSAgICBwcml2YXRlIFZlY3RvcjxTdWJ0aXRsZVRyYWNrPiBtVHJhY2tzOwotICAgIHByaXZhdGUgU3VidGl0bGVUcmFjayBtU2VsZWN0ZWRUcmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmc7Ci0gICAgcHJpdmF0ZSBDYXB0aW9uaW5nTWFuYWdlciBtQ2FwdGlvbmluZ01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0hPVyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfSElERSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0VMRUNUX1RSQUNLID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSyA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIuQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IEhhbmRsZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0hPVzoKLSAgICAgICAgICAgICAgICBkb1Nob3coKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9ISURFOgotICAgICAgICAgICAgICAgIGRvSGlkZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9UUkFDSzoKLSAgICAgICAgICAgICAgICBkb1NlbGVjdFRyYWNrKChTdWJ0aXRsZVRyYWNrKW1zZy5vYmopOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyID0KLSAgICAgICAgbmV3IENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FbmFibGVkQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZUNoYW5nZWQoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgcHVibGljIFN1YnRpdGxlQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc3VidGl0bGUgY29udHJvbGxlciBmb3IgYSBtZWRpYSBwbGF5YmFjayBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0gICAgICogdGhlIE1lZGlhVGltZVByb3ZpZGVyIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyLAotICAgICAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbVRpbWVQcm92aWRlciA9IHRpbWVQcm92aWRlcjsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0KLSAgICAgICAgbVJlbmRlcmVycyA9IG5ldyBWZWN0b3I8UmVuZGVyZXI+KCk7Ci0gICAgICAgIG1TaG93aW5nID0gZmFsc2U7Ci0gICAgICAgIG1UcmFja3MgPSBuZXcgVmVjdG9yPFN1YnRpdGxlVHJhY2s+KCk7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlciA9Ci0gICAgICAgICAgICAoQ2FwdGlvbmluZ01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGF2YWlsYWJsZSBzdWJ0aXRsZSB0cmFja3MgZm9yIHRoaXMgbWVkaWEuIFRoZXNlIGluY2x1ZGUKLSAgICAgKiB0aGUgdHJhY2tzIGZvdW5kIGJ5IHtAbGluayBNZWRpYVBsYXllcn0gYXMgd2VsbCBhcyBhbnkgdHJhY2tzIGFkZGVkCi0gICAgICogbWFudWFsbHkgdmlhIHtAbGluayAjYWRkVHJhY2t9LgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrW10gZ2V0VHJhY2tzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgU3VidGl0bGVUcmFja1tdIHRyYWNrcyA9IG5ldyBTdWJ0aXRsZVRyYWNrW21UcmFja3Muc2l6ZSgpXTsKLSAgICAgICAgICAgIG1UcmFja3MudG9BcnJheSh0cmFja3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjawotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGdldFNlbGVjdGVkVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2suZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHN1YnRpdGxlIHRyYWNrLiAgQXMgYSByZXN1bHQsIHRoaXMgdHJhY2sgd2lsbCByZWNlaXZlCi0gICAgICogaW4tYmFuZCBkYXRhIGZyb20gdGhlIHtAbGluayBNZWRpYVBsYXllcn0uICBIb3dldmVyLCB0aGlzIGRvZXMKLSAgICAgKiBub3QgY2hhbmdlIHRoZSBzdWJ0aXRsZSB2aXNpYmlsaXR5LgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmFjayBUaGUgc3VidGl0bGUgdHJhY2sgdG8gc2VsZWN0LiAgVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgdHJhY2tzIGluIHtAbGluayAjZ2V0VHJhY2tzfS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyYWNrIHdhcyBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0VHJhY2soU3VidGl0bGVUcmFjayB0cmFjaykgewotICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCAmJiAhbVRyYWNrcy5jb250YWlucyh0cmFjaykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX1RSQUNLLCB0cmFjaykpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSB0cnVlOwotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gdHJhY2spIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IHRyYWNrOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobVRpbWVQcm92aWRlcik7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblN1YnRpdGxlVHJhY2tTZWxlY3RlZCh0cmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN1YnRpdGxlIHRyYWNrIGJhc2VkIG9uIHN5c3RlbSBwcmVmZXJlbmNlcywgb3IgbnVsbCwKLSAgICAgKiBpZiBubyBzdWNoIHRyYWNrIGV4aXN0cyBpbiB0aGlzIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBTdXBwb3J0cyBITFMtZmxhZ3M6IEFVVE9TRUxFQ1QsIEZPUkNFRCAmIERFRkFVTFQuCi0gICAgICoKLSAgICAgKiAxLiBJZiBjYXB0aW9uaW5nIGlzIGRpc2FibGVkLCBvbmx5IGNvbnNpZGVyIEZPUkNFRCB0cmFja3MuIE90aGVyd2lzZSwKLSAgICAgKiBjb25zaWRlciBhbGwgdHJhY2tzLCBidXQgcHJlZmVyIG5vbi1GT1JDRUQgb25lcy4KLSAgICAgKiAyLiBJZiB1c2VyIHNlbGVjdGVkICJEZWZhdWx0IiBjYXB0aW9uIGxhbmd1YWdlOgotICAgICAqICAgYS4gSWYgdGhlcmUgaXMgYSBjb25zaWRlcmVkIHRyYWNrIHdpdGggREVGQVVMVD15ZXMsIHJldHVybnMgdGhhdCB0cmFjawotICAgICAqICAgICAgKGZhdm9yIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbgotICAgICAqICAgICAgb25lIGRlZmF1bHQgdHJhY2tzLCBvciB0aGUgZmlyc3QgaW4gZ2VuZXJhbCBpZiBub25lIG9mIHRoZW0gYXJlIGluCi0gICAgICogICAgICB0aGUgY3VycmVudCBsYW5ndWFnZSkuCi0gICAgICogICBiLiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCBBVVRPU0VMRUNUPXllcyBpbiB0aGUgY3VycmVudAotICAgICAqICAgICAgbGFuZ3VhZ2UsIHJldHVybiB0aGF0IG9uZS4KLSAgICAgKiAgIGMuIElmIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRyYWNrcywgYW5kIG5vIGF1dG9zZWxlY3RhYmxlIHRyYWNrcyBpbiB0aGUKLSAgICAgKiAgICAgIGN1cnJlbnQgbGFuZ3VhZ2UsIHJldHVybiBudWxsLgotICAgICAqIDMuIElmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCB0aGUgY2FwdGlvbiBsYW5ndWFnZSwgc2VsZWN0IHRoYXQgb25lLiAgUHJlZmVyCi0gICAgICogdGhlIG9uZSB3aXRoIEFVVE9TRUxFQ1Q9bm8uCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIGZsYWdzIGFyZSBERUZBVUxUPW5vLCBBVVRPU0VMRUNUPXllcwotICAgICAqIGFuZCBGT1JDRUQ9bm8uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0RGVmYXVsdFRyYWNrKCkgewotICAgICAgICBTdWJ0aXRsZVRyYWNrIGJlc3RUcmFjayA9IG51bGw7Ci0gICAgICAgIGludCBiZXN0U2NvcmUgPSAtMTsKLQotICAgICAgICBMb2NhbGUgc2VsZWN0ZWRMb2NhbGUgPSBtQ2FwdGlvbmluZ01hbmFnZXIuZ2V0TG9jYWxlKCk7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBzZWxlY3RlZExvY2FsZTsKLSAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc2VsZWN0Rm9yY2VkID0gIW1DYXB0aW9uaW5nTWFuYWdlci5pc0VuYWJsZWQoKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgZm9yIChTdWJ0aXRsZVRyYWNrIHRyYWNrOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gdHJhY2suZ2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTEFOR1VBR0UpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZm9yY2VkID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9zZWxlY3QgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVCwgMSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzX2RlZmF1bHQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVCwgMCkgIT0gMDsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFuZ3VhZ2VNYXRjaGVzID0KLSAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygiIikgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldElTTzNMYW5ndWFnZSgpLmVxdWFscyhsYW5ndWFnZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgLy8gaXNfZGVmYXVsdCBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgY2FwdGlvbiBsYW5ndWFnZSBpcyAnZGVmYXVsdCcKLSAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAoZm9yY2VkID8gMCA6IDgpICsKLSAgICAgICAgICAgICAgICAgICAgKCgoc2VsZWN0ZWRMb2NhbGUgPT0gbnVsbCkgJiYgaXNfZGVmYXVsdCkgPyA0IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAoYXV0b3NlbGVjdCA/IDAgOiAyKSArIChsYW5ndWFnZU1hdGNoZXMgPyAxIDogMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0Rm9yY2VkICYmICFmb3JjZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgdHJlYXQgbnVsbCBsb2NhbGUvbGFuZ3VhZ2UgYXMgbWF0Y2hpbmcgYW55IGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgaWYgKChzZWxlY3RlZExvY2FsZSA9PSBudWxsICYmIGlzX2RlZmF1bHQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChsYW5ndWFnZU1hdGNoZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0IHx8IGZvcmNlZCB8fCBzZWxlY3RlZExvY2FsZSAhPSBudWxsKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RUcmFjayA9IHRyYWNrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZXN0VHJhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0KLSAgICAvKiogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0spKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIGlmIChtVHJhY2tJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAvLyBJZiB0cmFjayBzZWxlY3Rpb24gaXMgZXhwbGljaXQsIGJ1dCB2aXNpYmlsaXR5Ci0gICAgICAgICAgICAvLyBpcyBub3QsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNhcHRpb25pbmcgc2V0dGluZwotICAgICAgICAgICAgaWYgKCFtVmlzaWJpbGl0eUlzRXhwbGljaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAobUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5nZXRGb3JtYXQoKS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUsIDApICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TZWxlY3RlZFRyYWNrLmdldFRyYWNrVHlwZSgpID09IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4gaGF2ZSBhIGRlZmF1bHQgKGZvcmNlZCkgdHJhY2sgZXZlbiBpZiBjYXB0aW9uaW5nCi0gICAgICAgIC8vIGlzIG5vdCBlbmFibGVkLiAgVGhpcyBpcyBoYW5kbGVkIGJ5IGdldERlZmF1bHRUcmFjaygpLgotICAgICAgICAvLyBTaG93IHRoaXMgdHJhY2sgdW5sZXNzIHN1YnRpdGxlcyB3ZXJlIGV4cGxpY2l0bHkgaGlkZGVuLgotICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gZ2V0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZWxlY3RUcmFjayh0cmFjayk7Ci0gICAgICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBtdXN0IGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgaGlkZSgpOwotICAgICAgICBzZWxlY3RUcmFjayhudWxsKTsKLSAgICAgICAgbVRyYWNrcy5jbGVhcigpOwotICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcsIGV4dGVybmFsIHN1YnRpdGxlIHRyYWNrIHRvIHRoZSBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGFkZFRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgewotICAgICAgICAgICAgZm9yIChSZW5kZXJlciByZW5kZXJlcjogbVJlbmRlcmVycykgewotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5zdXBwb3J0cyhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSByZW5kZXJlci5jcmVhdGVUcmFjayhmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIuYWRkQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHN1YnRpdGxlIHRyYWNrLgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NIT1cpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TaG93KCkgewotICAgICAgICBtU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaWRlIHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfSElERSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0hpZGUoKSB7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgYSBzaW5nbGUgb3IgbXVsdGlwbGUgc3VidGl0bGUgdHlwZXMgaW4ge0BsaW5rCi0gICAgICogTWVkaWFQbGF5ZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSB3aGVuIGEgbmV3Ci0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIGlzIGRldGVjdGVkLCB0byBzZWUgaWYgaXQgc2hvdWxkIHVzZSB0aGlzIG9iamVjdCB0bwotICAgICAgICAgKiBwYXJzZSBhbmQgZGlzcGxheSB0aGlzIHN1YnRpdGxlIHRyYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYWNrIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICAgKiByZW5kZXJlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHMoTWVkaWFGb3JtYXQgZm9ybWF0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSBmb3IgZWFjaAotICAgICAgICAgKiBzdWJ0aXRsZSB0cmFjayB0aGF0IHdhcyBkZXRlY3RlZCBhbmQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIGNyZWF0ZSBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QuICBUaGlzIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZm9yIGVhY2ggdHJhY2sgdGhhdCB3YXMgZm91bmQuICBJZiB0aGUgdHJhY2sgaXMgc2VsZWN0ZWQgZm9yIGRpc3BsYXksCi0gICAgICAgICAqIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBwYXJzZSBhbmQgZGlzcGxheSB0aGUgdHJhY2sgZGF0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KLSAgICAgICAgICogQHJldHVybiBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UKLSAgICAgICAgICogYW5kIHJlbmRlciB0aGUgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdCBpbiB7QGxpbmsgTWVkaWFQbGF5ZXJ9LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbmRlcmVyIGEge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlcn0gb2JqZWN0IHRoYXQgYWRkcwotICAgICAqICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBpZiAoIW1SZW5kZXJlcnMuY29udGFpbnMocmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgYWRkZWQgcmVuZGVyZXJzIG92ZXJyaWRlIGV4aXN0aW5nIG9uZXMgKHRvIGFsbG93IHJlcGxhY2luZz8pCi0gICAgICAgICAgICAgICAgbVJlbmRlcmVycy5hZGQocmVuZGVyZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGVyZXJGb3IoTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidGl0bGUgYW5jaG9yLCBhbiBvYmplY3QgdGhhdCBpcyBhYmxlIHRvIGRpc3BsYXkgYSBzdWJ0aXRsZSByZW5kZXJlciwKLSAgICAgKiBlLmcuIGEgVmlkZW9WaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQW5jaG9yIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvciBzaG91bGQgdXNlIHRoZSBzdXBwbGllZCBzdWJ0aXRsZSByZW5kZXJpbmcgd2lkZ2V0LCBvcgotICAgICAgICAgKiBub25lIGlmIGl0IGlzIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbmNob3JzIHByb3ZpZGUgdGhlIGxvb3BlciBvbiB3aGljaCBhbGwgdHJhY2sgdmlzaWJpbGl0eSBjaGFuZ2VzCi0gICAgICAgICAqICh0cmFjay5zaG93L2hpZGUsIHNldFN1YnRpdGxlV2lkZ2V0KSB3aWxsIHRha2UgcGxhY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTG9vcGVyIGdldFN1YnRpdGxlTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmNob3IgbUFuY2hvcjsKLQotICAgIC8qKgotICAgICAqICBjYWxsZWQgZnJvbSBhbmNob3IncyBsb29wZXIgKGlmIGFueSwgYm90aCB3aGVuIHVuc2V0dGluZyBhbmQKLSAgICAgKiAgc2V0dGluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbmNob3IoQW5jaG9yIGFuY2hvcikgewotICAgICAgICBpZiAobUFuY2hvciA9PSBhbmNob3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmNob3IgPSBhbmNob3I7Ci0gICAgICAgIG1IYW5kbGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyKCksIG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChnZXRSZW5kZXJpbmdXaWRnZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmNob3JMb29wZXIoKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBhc3NlcnQgTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkKLSAgICAgICAgICAgICAgICA6ICJNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyBsb29wZXIiOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT25BbmNob3IoTWVzc2FnZSBtKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLmRpc3BhdGNoTWVzc2FnZShtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHN1YnRpdGxlIHRyYWNrIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdHJhY2sgc2VsZWN0ZWQgc3VidGl0bGUgdHJhY2sgb3IgbnVsbAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZVRyYWNrU2VsZWN0ZWQoU3VidGl0bGVUcmFjayB0cmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBtTGlzdGVuZXI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkwNjRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlVHJhY2sgc2luY2UgUAotLyoqCi0gKiBBIHN1YnRpdGxlIHRyYWNrIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbmQgZGlzcGxheWluZwotICogYW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygc3VidGl0bGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJ0aXRsZVRyYWNrIGltcGxlbWVudHMgTWVkaWFUaW1lUHJvdmlkZXIuT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVRyYWNrIjsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lTXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VGltZU1zOwotCi0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUnVubmFibGU7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlFbmRUaW1lID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7Ci0gICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5SUQgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLQotICAgIHByaXZhdGUgQ3VlTGlzdCBtQ3VlczsKLSAgICBmaW5hbCBwcml2YXRlIFZlY3RvcjxDdWU+IG1BY3RpdmVDdWVzID0gbmV3IFZlY3RvcjxDdWU+KCk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVZpc2libGU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBtRm9ybWF0OwotCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG1DdWVzID0gbmV3IEN1ZUxpc3QoKTsKLSAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7Ci0gICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIE1lZGlhRm9ybWF0IGdldEZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRhdGEoU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgbG9uZyBydW5JRCA9IGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIDE7Ci0gICAgICAgIG9uRGF0YShkYXRhLmdldERhdGEoKSwgdHJ1ZSAvKiBlb3MgKi8sIHJ1bklEKTsKLSAgICAgICAgc2V0UnVuRGlzY2FyZFRpbWVNcygKLSAgICAgICAgICAgICAgICBydW5JRCwKLSAgICAgICAgICAgICAgICAoZGF0YS5nZXRTdGFydFRpbWVVcygpICsgZGF0YS5nZXREdXJhdGlvblVzKCkpIC8gMTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgaW5wdXQgZGF0YSBmb3IgdGhlIHN1YnRpdGxlIHRyYWNrLiAgVGhlCi0gICAgICogY29tcGxldGUgc3VidGl0bGUgZm9yIGEgdHJhY2sgY2FuIGluY2x1ZGUgbXVsdGlwbGUgd2hvbGUgdW5pdHMKLSAgICAgKiAocnVucykuICBFYWNoIG9mIHRoZXNlIHVuaXRzIGNhbiBoYXZlIG11bHRpcGxlIHNlY3Rpb25zLiAgVGhlCi0gICAgICogY29udGVudHMgb2YgYSBydW4gYXJlIHN1Ym1pdHRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyLCB3aXRoIGVvcwotICAgICAqIGluZGljYXRpbmcgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLiAgQ2FsbHMgZnJvbSBkaWZmZXJlbnQKLSAgICAgKiBydW5zIG11c3Qgbm90IGJlIGludGVybWl4ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBzdWJ0aXRsZSBkYXRhIGJ5dGUgYnVmZmVyCi0gICAgICogQHBhcmFtIGVvcyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLgotICAgICAqIEBwYXJhbSBydW5JRCBtb3N0bHktdW5pcXVlIElEIGZvciB0aGlzIHJ1biBvZiBkYXRhLiAgU3VidGl0bGUgY3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIHJ1bklEIG9mIDAgYXJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqICAgICAgICAgICAgICBkaXNwbGF5LiAgQ3VlcyB3aXRoIHJ1bklEIG9mIH4wIGFyZSBkaXNjYXJkZWQKLSAgICAgKiAgICAgICAgICAgICAgb25seSBhdCB0aGUgZGVsZXRpb24gb2YgdGhlIHRyYWNrIG9iamVjdC4gIEN1ZXMKLSAgICAgKiAgICAgICAgICAgICAgd2l0aCBvdGhlciBydW5JRC1zIGFyZSBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgcnVuLCB3aGljaCBkZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBvZgotICAgICAqICAgICAgICAgICAgICBhbnkgb2YgaXRzIGN1ZXMgKHdpdGggdGhpcyBydW5JRCkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhZGRpbmcgdGhlIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LAotICAgICAqIGFzIHdlbGwgYXMgd2hlbiBzaG93aW5nIG9yIGhpZGluZyB0aGUgc3VidGl0bGUgdHJhY2ssIG9yIHdoZW4gdGhlIHZpZGVvCi0gICAgICogc3VyZmFjZSBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCB0aGF0IHJlbmRlcnMgdGhpcyBzdWJ0aXRsZSB0cmFjay4gRm9yIG1vc3QgcmVuZGVyZXJzCi0gICAgICogICAgICAgICB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgc2hhcmVkIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBmb3IgYWxsCi0gICAgICogICAgICAgICB0cmFja3Mgc3VwcG9ydGVkIGJ5IHRoYXQgcmVuZGVyZXIsIGFzIGF0IG1vc3Qgb25lIHN1YnRpdGxlIHRyYWNrCi0gICAgICogICAgICAgICBpcyB2aXNpYmxlIGF0IG9uZSB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZlIGN1ZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdWJ0aXRsZQotICAgICAqIHZpZXcgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKTsKLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVBY3RpdmVDdWVzKGJvb2xlYW4gcmVidWlsZCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgLy8gb3V0LW9mLW9yZGVyIHRpbWVzIG1lYW4gc2Vla2luZyBvciBuZXcgYWN0aXZlIGN1ZXMgYmVpbmcgYWRkZWQKLSAgICAgICAgLy8gKGR1cmluZyB0aGVpciBvd24gdGltZXNwYW4pCi0gICAgICAgIGlmIChyZWJ1aWxkIHx8IG1MYXN0VXBkYXRlVGltZU1zID4gdGltZU1zKSB7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdCA9Ci0gICAgICAgICAgICAgICAgbUN1ZXMuZW50cmllc0JldHdlZW4obUxhc3RVcGRhdGVUaW1lTXMsIHRpbWVNcykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFBhaXI8TG9uZywgQ3VlPiBldmVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBldmVudC5zZWNvbmQ7Ci0KLSAgICAgICAgICAgIGlmIChjdWUubUVuZFRpbWVNcyA9PSBldmVudC5maXJzdCkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBwYXN0IGN1ZXMKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJlbW92aW5nICIgKyBjdWUpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubVJ1bklEID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubVN0YXJ0VGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBjdWVzCi0gICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIHdpbGwgaGFwcGVuIGluIHN0YXJ0IG9yZGVyCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5hZGQoY3VlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGN1ZSBpcyBtb2RpZmllZAotICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXBsZXRlIGFueSBydW5zICovCi0gICAgICAgIHdoaWxlIChtUnVuc0J5RW5kVGltZS5zaXplKCkgPiAwICYmCi0gICAgICAgICAgICAgICBtUnVuc0J5RW5kVGltZS5rZXlBdCgwKSA8PSB0aW1lTXMpIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleCgwKTsgLy8gcmVtb3ZlcyBlbGVtZW50Ci0gICAgICAgIH0KLSAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpbnQgaXgpIHsKLSAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpOwotICAgICAgICB3aGlsZSAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgd2hpbGUgKGN1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgQ3VlIG5leHRDdWUgPSBjdWUubU5leHRJblJ1bjsKLSAgICAgICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY3VlID0gbmV4dEN1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5zQnlJRC5yZW1vdmUocnVuLm1SdW5JRCk7Ci0gICAgICAgICAgICBSdW4gbmV4dFJ1biA9IHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgcnVuLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuID0gbmV4dFJ1bjsKLSAgICAgICAgfQotICAgICAgICBtUnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyogcmVtb3ZlIGFsbCBjdWVzICh1bnRhbmdsZSBhbGwgY3Jvc3MtbGlua3MpICovCi0gICAgICAgIGludCBzaXplID0gbVJ1bnNCeUVuZFRpbWUuc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGl4ID0gc2l6ZSAtIDE7IGl4ID49IDA7IGl4LS0pIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdGFrZVRpbWUobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQWN0aXZlQ3VlcygpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJDbGVhcmluZyAiICsgbUFjdGl2ZUN1ZXMuc2l6ZSgpICsgIiBhY3RpdmUgY3VlcyIpOwotICAgICAgICBtQWN0aXZlQ3Vlcy5jbGVhcigpOwotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IC0xOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNjaGVkdWxlVGltZWRFdmVudHMoKSB7Ci0gICAgICAgIC8qIGdldCB0aW1lcyBmb3IgdGhlIG5leHQgZXZlbnQgKi8KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSBtQ3Vlcy5uZXh0VGltZUFmdGVyKG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2NoZWQgQCIgKyBtTmV4dFNjaGVkdWxlZFRpbWVNcyArICIgYWZ0ZXIgIiArIG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID49IDAgPwotICAgICAgICAgICAgICAgICAgICAgICAgKG1OZXh0U2NoZWR1bGVkVGltZU1zICogMTAwMCkgOiBNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLAotICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uVGltZWRFdmVudCAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKGZhbHNlLCB0aW1lTXMpOwotICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU2VlayAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TdG9wIik7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBpZiAobVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1WaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICBpZiAoIW1WaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDdWUoQ3VlIGN1ZSkgewotICAgICAgICBtQ3Vlcy5hZGQoY3VlKTsKLQotICAgICAgICBpZiAoY3VlLm1SdW5JRCAhPSAwKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChjdWUubVJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1biA9IG5ldyBSdW4oKTsKLSAgICAgICAgICAgICAgICBtUnVuc0J5SUQucHV0KGN1ZS5tUnVuSUQsIHJ1bik7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuLm1FbmRUaW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxpbmstdXAgY3VlcyBpbiB0aGUgc2FtZSBydW4KLSAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gcnVuLm1GaXJzdEN1ZTsKLSAgICAgICAgICAgIHJ1bi5tRmlyc3RDdWUgPSBjdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBhIGN1ZSBpcyBhZGRlZCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlLCBuZWVkIHRvIHJlZnJlc2ggdmlldwotICAgICAgICBsb25nIG5vd01zID0gLTE7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm93TXMgPSBtVGltZVByb3ZpZGVyLmdldEN1cnJlbnRUaW1lVXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBwcmVjaXNlICovLCB0cnVlIC8qIG1vbm90b25pYyAqLykgLyAxMDAwOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXMgaXQgd2UgYXJlIG5vdCBwbGF5aW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgKyAiIDw9ICIgKyBub3dNcyArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zICsgIiA+PSAiICsgbUxhc3RUaW1lTXMpOwotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgPD0gbm93TXMgJiYKLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB0cnVzdCBub3dNcywgc28gY2hlY2sgYW55IGN1ZSBzaW5jZSBsYXN0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMpIHsKLSAgICAgICAgICAgIGlmIChtUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3VidGl0bGVUcmFjayB0cmFjayA9IHRoaXM7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHRoZW5NcyA9IG5vd01zOwotICAgICAgICAgICAgbVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB3aXRoIHN5bmNocm9uaXplZCwgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gZG8gbXVsdGlwbGUgdXBkYXRlcyBhcyB0aGUgcnVubmFibGUgY291bGQgYmUgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nLgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUnVubmFibGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aGVuTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gZGVsYXkgdXBkYXRlIHNvIHdlIGRvbid0IHVwZGF0ZSB2aWV3IG9uIGV2ZXJ5IGN1ZS4gIFRPRE8gd2h5IDEwPwotICAgICAgICAgICAgaWYgKG1IYW5kbGVyLnBvc3REZWxheWVkKG1SdW5uYWJsZSwgMTAgLyogZGVsYXkgKi8pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzY2hlZHVsaW5nIHVwZGF0ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy53KFRBRywgImZhaWxlZCB0byBzY2hlZHVsZSBzdWJ0aXRsZSB2aWV3IHVwZGF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVZpc2libGUgJiYKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcyAmJgotICAgICAgICAgICAgICAgIChjdWUubVN0YXJ0VGltZU1zIDwgbU5leHRTY2hlZHVsZWRUaW1lTXMgfHwKLSAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPCAwKSkgewotICAgICAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lUHJvdmlkZXIoTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyID09IHRpbWVQcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBzdGF0aWMgY2xhc3MgQ3VlTGlzdCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3VlTGlzdCI7Ci0gICAgICAgIC8vIHNpbXBsaXN0aWMsIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbUN1ZXM7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZEV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoY3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigyKTsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5wdXQodGltZU1zLCBjdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vlcy5jb250YWlucyhjdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGR1cGxpY2F0ZSBjdWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChDdWUgY3VlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbm9uLXBvc2l0aXZlLWR1cmF0aW9uIGN1ZXMKLSAgICAgICAgICAgIGlmIChjdWUubVN0YXJ0VGltZU1zID49IGN1ZS5tRW5kVGltZU1zKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKCFhZGRFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIGxhc3RUaW1lTXMgPSBjdWUubVN0YXJ0VGltZU1zOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICBpZiAodGltZU1zID4gbGFzdFRpbWVNcyAmJiB0aW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoQ3VlIGN1ZSkgewotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPj4gZW50cmllc0JldHdlZW4oCi0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsYXN0VGltZU1zLCBmaW5hbCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4gPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2xpY2UgKCIgKyBsYXN0VGltZU1zICsgIiwgIiArIHRpbWVNcyArICJdPSIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5zdWJNYXAobGFzdFRpbWVNcyArIDEsIHRpbWVNcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIG5leHRUaW1lQWZ0ZXIobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPj4gdGFpbCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRhaWwgPSBtQ3Vlcy50YWlsTWFwKHRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgIGlmICh0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWwuZmlyc3RLZXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIW1Eb25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBQYWlyPExvbmcsIEN1ZT4gbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdEVudHJ5ID0gbmV3IFBhaXI8TG9uZywgQ3VlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zLCBtTGlzdEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIGlmICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEtleSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUxhc3RFbnRyeTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBhbGxvdyByZW1vdmluZyBlbmQgdGFncwotICAgICAgICAgICAgICAgIGlmIChtTGFzdExpc3RJdGVyYXRvciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVudHJ5LnNlY29uZC5tRW5kVGltZU1zICE9IG1MYXN0RW50cnkuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVuZC1jdWUKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdWVzLmdldChtTGFzdEVudHJ5LmZpcnN0KS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUobUxhc3RFbnRyeS5maXJzdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlc3Qgb2YgdGhlIGN1ZXMKLSAgICAgICAgICAgICAgICBDdWUgY3VlID0gbUxhc3RFbnRyeS5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRW50cnlJdGVyYXRvcihTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBjdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsIGN1ZXMgKyAiIik7Ci0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBjdWVzOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBuZXh0S2V5KCkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVtYWluaW5nQ3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMgPSBtUmVtYWluaW5nQ3Vlcy5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMuZ2V0KG1DdXJyZW50VGltZU1zKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLnRhaWxNYXAobUN1cnJlbnRUaW1lTXMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ3VycmVudFRpbWVNczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOwotICAgICAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtUmVtYWluaW5nQ3VlczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGFzdExpc3RJdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgUGFpcjxMb25nLEN1ZT4gbUxhc3RFbnRyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEN1ZUxpc3QoKSB7Ci0gICAgICAgICAgICBtQ3VlcyA9IG5ldyBUcmVlTWFwPExvbmcsIFZlY3RvcjxDdWU+PigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdWUgewotICAgICAgICBwdWJsaWMgbG9uZyBtU3RhcnRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nW10gbUlubmVyVGltZXNNczsKLSAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEOwotCi0gICAgICAgIHB1YmxpYyBDdWUgbU5leHRJblJ1bjsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWUobG9uZyB0aW1lTXMpIHsgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgKHdpdGggZGVmYXVsdCBlbmQgdGltZSkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bihsb25nIHJ1bklEKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lIHdpdGggZ2l2ZW4gZW5kIHRpbWUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSdW5EaXNjYXJkVGltZU1zKGxvbmcgcnVuSUQsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogd2hldGhlciB0aGlzIGlzIGEgdGV4dCB0cmFjayB3aG8gZmlyZXMgZXZlbnRzIGluc3RlYWQgZ2V0dGluZyByZW5kZXJlZCAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tUeXBlKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUCi0gICAgICAgICAgICAgICAgOiBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1biB7Ci0gICAgICAgIHB1YmxpYyBDdWUgbUZpcnN0Q3VlOwotICAgICAgICBwdWJsaWMgUnVuIG1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBSdW4gbVByZXZSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNcyA9IC0xOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQgPSAwOwotICAgICAgICBwcml2YXRlIGxvbmcgbVN0b3JlZEVuZFRpbWVNcyA9IC0xOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQnlFbmRUaW1lTXMoTG9uZ1NwYXJzZUFycmF5PFJ1bj4gcnVuc0J5RW5kVGltZSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCB2YWx1ZSBpZiBhbnkKLSAgICAgICAgICAgIGludCBpeCA9IHJ1bnNCeUVuZFRpbWUuaW5kZXhPZktleShtU3RvcmVkRW5kVGltZU1zKTsKLSAgICAgICAgICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGhpcyA9PSBydW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnNldFZhbHVlQXQoaXgsIG1OZXh0UnVuQXRFbmRUaW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZUF0RW5kVGltZU1zKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCBuZXcgdmFsdWUKLSAgICAgICAgICAgIGlmIChtRW5kVGltZU1zID49IDApIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gcnVuc0J5RW5kVGltZS5nZXQobUVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSB0aGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnB1dChtRW5kVGltZU1zLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtU3RvcmVkRW5kVGltZU1zID0gbUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0RW5kVGltZU1zKCkgewotICAgICAgICAgICAgUnVuIHByZXYgPSBtUHJldlJ1bkF0RW5kVGltZU1zOwotCi0gICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcy5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBwcmV2OwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciByZW5kZXJpbmcgc3VidGl0bGVzIG9udG8gYSBDYW52YXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJpbmdXaWRnZXQgewotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3MgY2FsbGJhY2ssIHdoaWNoIGlzIHVzZWQgdG8gc2VuZCB1cGRhdGVzIHdoZW4gdGhlCi0gICAgICAgICAqIHJlbmRlcmVkIGRhdGEgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB1cGRhdGUgY2FsbGJhY2sKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGNhbGxiYWNrKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3Mgc2l6ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIGluIHBpeGVscwotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBpbiBwaXhlbHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIGRyYXcgc3VidGl0bGVzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdmlzaWJsZSB0cnVlIGlmIHN1YnRpdGxlcyBzaG91bGQgYmUgZHJhd24sIGZhbHNlIG90aGVyd2lzZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW5kZXJzIHN1YnRpdGxlcyBvbnRvIGEge0BsaW5rIENhbnZhc30uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjIGNhbnZhcyBvbiB3aGljaCB0byByZW5kZXIgc3VidGl0bGVzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGRldGFjaGVkIGZyb20gYSB3aW5kb3cuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsYmFjayB1c2VkIHRvIHNlbmQgdXBkYXRlcyBhYm91dCBjaGFuZ2VzIHRvIHJlbmRlcmluZyBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkNoYW5nZWRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJpbmcgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAcGFyYW0gcmVuZGVyaW5nV2lkZ2V0IHRoZSB3aWRnZXQgd2hvc2UgZGF0YSBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmU1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5NZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXIuTGlicmFyeVJvb3RQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQnVpbGRlckJhc2VQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIuTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU3RhdGljUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLkxpYnJhcnlSb290SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuUmF0aW5nMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcySW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpRmFjdG9yeSBpbXBsZW1lbnRzIFN0YXRpY1Byb3ZpZGVyIHsKLSAgICBwcml2YXRlIEFwaUZhY3RvcnkoKSB7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RhdGljUHJvdmlkZXIgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBBcGlIZWxwZXIuaW5pdGlhbGl6ZSh1cGRhdGFibGVJbmZvKTsKLSAgICAgICAgcmV0dXJuIG5ldyBBcGlGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciBjcmVhdGVNZWRpYUNvbnRyb2xsZXIyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYUNvbnRyb2xsZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIENvbnRyb2xsZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQ29udHJvbGxlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQnJvd3NlcjIoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiwgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQnJvd3NlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgaW50IGNvbW1hbmRDb2RlLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmEpIHsKLSAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsICYmIGV4dHJhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsKGluc3RhbmNlLCBhY3Rpb24sIGV4dHJhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfTWVkaWFTZXNzaW9uMkNvbW1hbmQoQnVuZGxlIGNvbW1hbmQpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRHcm91cFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoCi0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsKGluc3RhbmNlLAotICAgICAgICAgICAgICAgIChvdGhlciA9PSBudWxsKSA/IG51bGwgOiBvdGhlci5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZEdyb3VwKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbC5mcm9tQnVuZGxlX2ltcGwoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29udHJvbGxlckluZm9Qcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29udHJvbGxlckluZm8oCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLCBpbnQgcGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBJSW50ZXJmYWNlIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UsIHVpZCwgcGlkLCBwYWNrYWdlTmFtZSwgKElNZWRpYUNvbnRyb2xsZXIyKSBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZEJ1dHRvbkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlckJhc2VQcm92aWRlcjxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IGNyZWF0ZU1lZGlhU2Vzc2lvbjJCdWlsZGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVNlc3Npb24yLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5CdWlsZGVySW1wbChjb250ZXh0LCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTIoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvblNlcnZpY2UyTWVkaWFOb3RpZmljYXRpb24oCi0gICAgICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLk1lZGlhTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgbm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTIoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhTGlicmFyeVNlc3Npb24sIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJCdWlsZGVyKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXIgaW5zdGFuY2UsIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuQnVpbGRlckltcGwoc2VydmljZSwgaW5zdGFuY2UsIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaWJyYXJ5Um9vdFByb3ZpZGVyIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyTGlicmFyeVJvb3QoCi0gICAgICAgICAgICBMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlSb290SW1wbChpbnN0YW5jZSwgcm9vdElkLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbFZpZXcyKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWRlb1ZpZXcyUHJvdmlkZXIgY3JlYXRlVmlkZW9WaWV3MigKLSAgICAgICAgICAgIFZpZGVvVmlldzIgaW5zdGFuY2UsIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlciwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICByZXR1cm4gbmV3IFZpZGVvVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yUHJvdmlkZXIgY3JlYXRlU2Vzc2lvblRva2VuMihDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIHVpZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZnJvbUJ1bmRsZV9TZXNzaW9uVG9rZW4yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhSXRlbTJCdWlsZGVyKE1lZGlhSXRlbTIuQnVpbGRlciBpbnN0YW5jZSwKLSAgICAgICAgICAgIGludCBmbGFncykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBmbGFncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9NZWRpYUl0ZW0yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciBjcmVhdGVWb2x1bWVQcm92aWRlcjIoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZVByb3ZpZGVyMkltcGwoaW5zdGFuY2UsIGNvbnRyb2xUeXBlLCBtYXhWb2x1bWUsIGN1cnJlbnRWb2x1bWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX01lZGlhTWV0YWRhdGEyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhTWV0YWRhdGEySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhTWV0YWRhdGEyQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSwgc291cmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBmcm9tQnVuZGxlX1JhdGluZzIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VW5yYXRlZFJhdGluZ19SYXRpbmcyKGludCByYXRpbmdTdHlsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VW5yYXRlZFJhdGluZ19pbXBsKHJhdGluZ1N0eWxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19SYXRpbmcyKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld0hlYXJ0UmF0aW5nX2ltcGwoaGFzSGVhcnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX1JhdGluZzIoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1RodW1iUmF0aW5nX2ltcGwodGh1bWJJc1VwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX1JhdGluZzIoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3U3RhclJhdGluZ19pbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19SYXRpbmcyKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1BlcmNlbnRhZ2VSYXRpbmdfaW1wbChwZXJjZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgY3JlYXRlTWVkaWFQbGF5bGlzdEFnZW50KE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGxheWxpc3RBZ2VudEltcGwoaW5zdGFuY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGJiNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFwaUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25JbmZvIHNVcGRhdGFibGVJbmZvOwotCi0gICAgQEd1YXJkZWRCeSgidGhpcyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhlbWUgc0xpYlRoZW1lOwotCi0gICAgcHJpdmF0ZSBBcGlIZWxwZXIoKSB7IH0KLQotICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQXBwbGljYXRpb25JbmZvIHVwZGF0YWJsZUluZm8pIHsKLSAgICAgICAgaWYgKHNVcGRhdGFibGVJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluaXRpYWxpemUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNVcGRhdGFibGVJbmZvID0gdXBkYXRhYmxlSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlcyBnZXRMaWJSZXNvdXJjZXMoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaWJUaGVtZShjb250ZXh0KS5nZXRSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRoZW1lIGdldExpYlRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoc0xpYlRoZW1lICE9IG51bGwpIHJldHVybiBzTGliVGhlbWU7Ci0KLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lU3luY2hyb25pemVkKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWVJZCkgewotICAgICAgICBUaGVtZSB0aGVtZSA9IGdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKHRoZW1lSWQsIHRydWUpOwotICAgICAgICByZXR1cm4gdGhlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0SW5mbGF0ZXIgZ2V0TGF5b3V0SW5mbGF0ZXIoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSkgewotICAgICAgICBpZiAodGhlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRMaWJUaGVtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCi0gICAgICAgIExheW91dEluZmxhdGVyIGxheW91dEluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5jbG9uZUluQ29udGV4dCgKLSAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSkpOwotICAgICAgICBsYXlvdXRJbmZsYXRlci5zZXRGYWN0b3J5MihuZXcgTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldygKLSAgICAgICAgICAgICAgICAgICAgVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIGlmIChNZWRpYVJvdXRlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQnV0dG9uKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoT3ZlcmxheUxpc3RWaWV3LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5TGlzdFZpZXcoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQnV0dG9uQmFyTGF5b3V0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25CYXJMYXlvdXQoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3BhY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNwYWNlKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobnVsbCwgbmFtZSwgY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGxheW91dEluZmxhdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIGdldExpYlRoZW1lKGNvbnRleHQpLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCkgewotICAgICAgICByZXR1cm4gaW5mbGF0ZUxpYkxheW91dChjb250ZXh0LCB0aGVtZSwgbGliUmVzSWQsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lLCBpbnQgbGliUmVzSWQsCi0gICAgICAgICAgICBATnVsbGFibGUgVmlld0dyb3VwIHJvb3QsIGJvb2xlYW4gYXR0YWNoVG9Sb290KSB7Ci0gICAgICAgIHRyeSAoWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldExheW91dChsaWJSZXNJZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXRJbmZsYXRlcihjb250ZXh0LCB0aGVtZSkuaW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dGFjaFRvUm9vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVGhlbWUgZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNMaWJUaGVtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oc1VwZGF0YWJsZUluZm8pLm5ld1RoZW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ2YWY2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMjQpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckFwaTI0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERldmljZVR5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZThkNDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciBkaXNwbGF5cyBhIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uIG1lZGlhIHJvdXRlIGJ1dHRvbn0KLSAqIGluIHRoZSBhcHBsaWNhdGlvbidzIHtAbGluayBBY3Rpb25CYXJ9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kCi0gKiB0byBjb250cm9sIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYnV0dG9uIHRoYXQgd2lsbAotICogYXBwZWFyIGluIHRoZSBhY3Rpb24gYmFyIG1lbnUuICBOb3RlIHRoYXQgaW5zdGVhZCBvZiBkaXNhYmxpbmcgdGhlIGJ1dHRvbgotICogd2hlbiBubyByb3V0ZXMgYXJlIGF2YWlsYWJsZSwgdGhlIGFjdGlvbiBwcm92aWRlciB3aWxsIGluc3RlYWQgbWFrZSB0aGUKLSAqIG1lbnUgaXRlbSBpbnZpc2libGUuICBJbiB0aGlzIHdheSwgdGhlIGJ1dHRvbiB3aWxsIG9ubHkgYmUgdmlzaWJsZSB3aGVuIGl0Ci0gKiBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gZGlzY292ZXIgYW5kIHNlbGVjdCBhIG1hdGNoaW5nIHJvdXRlLgotICogPC9wPgotICoKLSAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KLSAqIDxwPgotICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBhY3Rpb24gcHJvdmlkZXIsIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKLSAqIHtAbGluayBBcHBDb21wYXRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwPgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWZpbmUgYSBtZW51IHJlc291cmNlIHRvIGluY2x1ZGUgdGhlIHByb3ZpZGVyIGluIHRoZQotICogYWN0aW9uIGJhciBvcHRpb25zIG1lbnUuICBOb3RlIHRoYXQgdGhlIHN1cHBvcnQgbGlicmFyeSBhY3Rpb24gYmFyIHVzZXMgYXR0cmlidXRlcwotICogdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24ncyByZXNvdXJjZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGZyYW1ld29yaydzCi0gKiByZXNvdXJjZSBuYW1lc3BhY2UgdG8gY29uZmlndXJlIGVhY2ggaXRlbS4KLSAqIDwvcD48cHJlPgotICogJmx0O21lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICogICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byI+Ci0gKiAgICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZWRpYV9yb3V0ZV9tZW51X2l0ZW0iCi0gKiAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVkaWFfcm91dGVfbWVudV90aXRsZSIKLSAqICAgICAgICAgYXBwOnNob3dBc0FjdGlvbj0iYWx3YXlzIgotICogICAgICAgICBhcHA6YWN0aW9uUHJvdmlkZXJDbGFzcz0iYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiLz4KLSAqICZsdDsvbWVudT4KLSAqIDwvcHJlPjxwPgotICogVGhlbiBjb25maWd1cmUgdGhlIG1lbnUgYW5kIHNldCB0aGUgcm91dGUgc2VsZWN0b3IgZm9yIHRoZSBjaG9vc2VyLgotICogPC9wPjxwcmU+Ci0gKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFwcENvbXBhdEFjdGl2aXR5IHsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICoKLSAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gKgotICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gKiAgICAgfQotICoKLSAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcwotICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAqCi0gKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICoKLSAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KLSAqICAgICB9Ci0gKgotICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKLSAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAqICAgICB9Ci0gKgotICogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7Ci0gKgotICogICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5zYW1wbGVfbWVkaWFfcm91dGVyX21lbnUsIG1lbnUpOwotICoKLSAqICAgICAgICAgTWVudUl0ZW0gbWVkaWFSb3V0ZU1lbnVJdGVtID0gbWVudS5maW5kSXRlbShSLmlkLm1lZGlhX3JvdXRlX21lbnVfaXRlbSk7Ci0gKiAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgPQotICogICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIpTWVudUl0ZW1Db21wYXQuZ2V0QWN0aW9uUHJvdmlkZXIobWVkaWFSb3V0ZU1lbnVJdGVtKTsKLSAqICAgICAgICAgbWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAqICAgICAgICAgcmV0dXJuIHRydWU7Ci0gKiAgICAgfQotICoKLSAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAqICAgICB9Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpb25Qcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbUJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbiBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgYWN0aW9uIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBpcyBzdGlsbCBuZWVkZWQgYnkgdGhlIFVJLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIG1heSBsZWFrIGNhbGxiYWNrcyB1bnRpbCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLiAgVGhpcyBtYXkgcmVzdWx0IGluCi0gICAgICAgICAgICAvLyBtZWRpYSByb3V0ZSBwcm92aWRlcnMgZG9pbmcgbW9yZSB3b3JrIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBzaG9ydCB0ZXJtCi0gICAgICAgICAgICAvLyB3aGlsZSB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBvZiBpbnRlcmVzdCB0byB0aGUKLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLiAgVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgbmVlZCBzb21lCi0gICAgICAgICAgICAvLyBpbmRpY2F0aW9uIGZyb20gdGhlIGZyYW1ld29yayB0aGF0IGl0IGlzIGJlaW5nIGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpYWxvZ0ZhY3RvcnkgIT0gZmFjdG9yeSkgewotICAgICAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OwotCi0gICAgICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KGZhY3RvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCBtZWRpYSByb3V0ZSBidXR0b24sIG9yIG51bGwgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uIGdldE1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBtQnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGJ1dHRvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oZ2V0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlQWN0aW9uVmlldygpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAib25DcmVhdGVBY3Rpb25WaWV3OiB0aGlzIEFjdGlvblByb3ZpZGVyIGlzIGFscmVhZHkgYXNzb2NpYXRlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIndpdGggYSBtZW51IGl0ZW0uIERvbid0IHJldXNlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBpbnN0YW5jZXMhICIgKwotICAgICAgICAgICAgICAgICAgICAiQWJhbmRvbmluZyB0aGUgb2xkIG1lbnUgaXRlbS4uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1dHRvbiA9IG9uQ3JlYXRlTWVkaWFSb3V0ZUJ1dHRvbigpOwotICAgICAgICBtQnV0dG9uLnNldENoZWF0U2hlZXRFbmFibGVkKHRydWUpOwotICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KG1EaWFsb2dGYWN0b3J5KTsKLSAgICAgICAgbUJ1dHRvbi5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25QZXJmb3JtRGVmYXVsdEFjdGlvbigpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1CdXR0b24uc2hvd0RpYWxvZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXNJdGVtVmlzaWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoUm91dGUoKSB7Ci0gICAgICAgIHJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4gbVByb3ZpZGVyV2VhazsKLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXJDYWxsYmFjayhNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlcldlYWsgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXI+KHByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hSb3V0ZShNZWRpYVJvdXRlciByb3V0ZXIpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcldlYWsuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlZnJlc2hSb3V0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIucmVtb3ZlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU4YTYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5Ub29sdGlwQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBidXR0b24gYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kIHRvIGNvbnRyb2wgdGhlCi0gKiBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gdGhlIGRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgb3Igd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMgbm90Ci0gKiBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yKCkgc2VsZWN0b3J9LCB0aGUgYnV0dG9uIHdpbGwgYXBwZWFyIGluCi0gKiBhbiBpbmFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25uZWN0ZWQgdG8gYQotICogcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBDbGlja2luZyBvbiB0aGUgYnV0dG9uIG9wZW5zCi0gKiBhIHtAbGluayBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ30gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcm91dGUuCi0gKiBJZiBubyBub24tZGVmYXVsdCByb3V0ZXMgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGFuIGFjdGl2ZQotICogc2NhbiB0byBkaXNjb3ZlciBhbnkgbWF0Y2hpbmcgcm91dGVzLCB0aGVuIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIGNhbm5vdAotICogYmUgY2xpY2tlZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBub24tZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCB0aGUgYnV0dG9uIHdpbGwKLSAqIGFwcGVhciBpbiBhbiBhY3RpdmUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBjb25uZWN0ZWQKLSAqIHRvIGEgcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBUaGUgYnV0dG9uIG1heSBhbHNvIGFwcGVhcgotICogaW4gYW4gaW50ZXJtZWRpYXJ5IGNvbm5lY3Rpbmcgc3RhdGUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcKLSAqIHRvIHRoZSBkZXN0aW5hdGlvbiBidXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGRvaW5nIHNvLiAgSW4gZWl0aGVyIGNhc2UsIGNsaWNraW5nCi0gKiBvbiB0aGUgYnV0dG9uIG9wZW5zIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlcgotICogdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9IGZyb20gdGhlIDxjb2RlPmFuZHJvaWQuc3VwcG9ydC52NDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQnV0dG9uIGV4dGVuZHMgVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQnV0dG9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9PU0VSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBpbnQgbVJvdXRlQ2FsbGJhY2tGbGFnczsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gc1JlbW90ZUluZGljYXRvckNhY2hlID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KDIpOwotICAgIHByaXZhdGUgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVtb3RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDb25uZWN0aW5nOwotCi0gICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtQnV0dG9uVGludDsKLSAgICBwcml2YXRlIGludCBtTWluV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbU1pbkhlaWdodDsKLQotICAgIC8vIFRoZSBjaGVja2VkIHN0YXRlIGlzIHVzZWQgd2hlbiBjb25uZWN0ZWQgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tFRF9TVEFURV9TRVQgPSB7Ci0gICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2NoZWNrZWQKLSAgICB9OwotCi0gICAgLy8gVGhlIGNoZWNrYWJsZSBzdGF0ZSBpcyB1c2VkIHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tBQkxFX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2thYmxlCi0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIFIuYXR0ci5tZWRpYVJvdXRlQnV0dG9uU3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuY3JlYXRlVGhlbWVkQnV0dG9uQ29udGV4dChjb250ZXh0KSwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIFJlc291cmNlcy5UaGVtZSB0aGVtZSA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkubmV3VGhlbWUoKTsKLSAgICAgICAgdGhlbWUuYXBwbHlTdHlsZShNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCksIHRydWUpOwotICAgICAgICBUeXBlZEFycmF5IGEgPSB0aGVtZS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b24sIGRlZlN0eWxlQXR0ciwgMCk7Ci0KLSAgICAgICAgbUJ1dHRvblRpbnQgPSBhLmdldENvbG9yU3RhdGVMaXN0KFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fbWVkaWFSb3V0ZUJ1dHRvblRpbnQpOwotICAgICAgICBtTWluV2lkdGggPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluV2lkdGgsIDApOwotICAgICAgICBtTWluSGVpZ2h0ID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9hbmRyb2lkX21pbkhlaWdodCwgMCk7Ci0gICAgICAgIGludCByZW1vdGVJbmRpY2F0b3JSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2V4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUsIDApOwotICAgICAgICBhLnJlY3ljbGUoKTsKLQotICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSByZW1vdGVJbmRpY2F0b3JTdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNSZW1vdGVJbmRpY2F0b3JDYWNoZS5nZXQocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvclN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3JTdGF0ZS5uZXdEcmF3YWJsZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG5ldyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuZXhlY3V0ZU9uRXhlY3V0b3IoQXN5bmNUYXNrLlRIUkVBRF9QT09MX0VYRUNVVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIHNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKG1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpICYmIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPT0gZmxhZ3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtUm91dGVDYWxsYmFja0ZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2ssIGZsYWdzKTsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgcm91dGUgY2hvb3NlciBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMKLSAgICAgKiBub3QgbWF0Y2ggdGhlIHtAbGluayAjZ2V0Um91dGVTZWxlY3RvciBzZWxlY3Rvcn0sIHRoZW4gc2hvd3MgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqIE90aGVyd2lzZSwgc2hvd3MgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIHRvIG9mZmVyIHRoZSB1c2VyCi0gICAgICogYSBjaG9pY2UgdG8gZGlzY29ubmVjdCBmcm9tIHRoZSByb3V0ZSBvciBwZXJmb3JtIG90aGVyIGNvbnRyb2wgYWN0aW9ucwotICAgICAqIHN1Y2ggYXMgc2V0dGluZyB0aGUgcm91dGUncyB2b2x1bWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaWFsb2dGYWN0b3J5fQotICAgICAqIHRvIHByb3ZpZGUgYSBjdXN0b21pemVkIGRpYWxvZyBmYWN0b3J5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGlhbG9nIHdhcyBhY3R1YWxseSBzaG93bi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBhY3Rpdml0eSBpcyBub3QgYSBzdWJjbGFzcyBvZgotICAgICAqIHtAbGluayBGcmFnbWVudEFjdGl2aXR5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkgewotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRBY3Rpdml0eSgpLmdldEZyYWdtZW50TWFuYWdlcigpOwotICAgICAgICBpZiAoZm0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBGcmFnbWVudEFjdGl2aXR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgaWYgKHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgfHwgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlUYWcoQ0hPT1NFUl9GUkFHTUVOVF9UQUcpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG93RGlhbG9nKCk6IFJvdXRlIGNob29zZXIgZGlhbG9nIGFscmVhZHkgc2hvd2luZyEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGYgPQotICAgICAgICAgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeS5vbkNyZWF0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgICAgICAgICAgZi5zZXRSb3V0ZVNlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENIT09TRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY29udHJvbGxlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENPTlRST0xMRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7Ci0gICAgICAgIC8vIEdyb3NzIHdheSBvZiB1bndyYXBwaW5nIHRoZSBBY3Rpdml0eSBzbyB3ZSBjYW4gZ2V0IHRoZSBGcmFnbWVudE1hbmFnZXIKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICB3aGlsZSAoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHRXcmFwcGVyKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChBY3Rpdml0eSljb250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dCA9ICgoQ29udGV4dFdyYXBwZXIpY29udGV4dCkuZ2V0QmFzZUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHNob3dpbmcgYSB0b2FzdCB3aXRoIHRoZSBjb250ZW50IGRlc2NyaXB0b3Igb2YgdGhlCi0gICAgICogYnV0dG9uIHdoZW4gdGhlIGJ1dHRvbiBpcyBsb25nIHByZXNzZWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDaGVhdFNoZWV0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBUb29sdGlwQ29tcGF0LnNldFRvb2x0aXBUZXh0KHRoaXMsIGVuYWJsZQotICAgICAgICAgICAgICAgID8gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcubXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgOiBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7Ci0gICAgICAgIC8vIFNlbmQgdGhlIGFwcHJvcHJpYXRlIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFuZCBjYWxsIGxpc3RlbmVycwotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5wZXJmb3JtQ2xpY2soKTsKLSAgICAgICAgaWYgKCFoYW5kbGVkKSB7Ci0gICAgICAgICAgICBwbGF5U291bmRFZmZlY3QoU291bmRFZmZlY3RDb25zdGFudHMuQ0xJQ0spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaG93RGlhbG9nKCkgfHwgaGFuZGxlZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgIGZpbmFsIGludFtdIGRyYXdhYmxlU3RhdGUgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSArIDEpOwotCi0gICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBiZSBoYW5kbGluZyB0aGlzIG1vcmUgY29tcGxldGVseSwgYnV0IHRoZXNlCi0gICAgICAgIC8vIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGhlcmUuIENoZWNrYWJsZSBpcyB1c2VkIHRvIGV4cHJlc3MgdGhlIGNvbm5lY3RpbmcKLSAgICAgICAgLy8gZHJhd2FibGUgc3RhdGUgYW5kIGl0J3MgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY2hlY2sgZm9yIHRoZSBwdXJwb3NlcwotICAgICAgICAvLyBvZiBzdGF0ZSBzZWxlY3Rpb24gaGVyZS4KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1lcmdlRHJhd2FibGVTdGF0ZXMoZHJhd2FibGVTdGF0ZSwgQ0hFQ0tBQkxFX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0VEX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRyYXdhYmxlU3RhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50W10gbXlEcmF3YWJsZVN0YXRlID0gZ2V0RHJhd2FibGVTdGF0ZSgpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRTdGF0ZShteURyYXdhYmxlU3RhdGUpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIHVzZSBhcyB0aGUgcmVtb3RlIHJvdXRlIGluZGljYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShEcmF3YWJsZSBkKSB7Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuY2FuY2VsKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB1bnNjaGVkdWxlRHJhd2FibGUobVJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1CdXR0b25UaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkID0gRHJhd2FibGVDb21wYXQud3JhcChkLm11dGF0ZSgpKTsKLSAgICAgICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5zZXRUaW50TGlzdChkLCBtQnV0dG9uVGludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkLnNldENhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgZC5zZXRTdGF0ZShnZXREcmF3YWJsZVN0YXRlKCkpOwotICAgICAgICAgICAgZC5zZXRWaXNpYmxlKGdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlbW90ZUluZGljYXRvciA9IGQ7Ci0KLSAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93ICYmIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgQW5pbWF0aW9uRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEFuaW1hdGlvbkRyYXdhYmxlIGN1ckRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmlmeURyYXdhYmxlKERyYXdhYmxlIHdobykgewotICAgICAgICByZXR1cm4gc3VwZXIudmVyaWZ5RHJhd2FibGUod2hvKSB8fCB3aG8gPT0gbVJlbW90ZUluZGljYXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBqdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgc3VwZXIgdG8gaGFuZGxlIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KLSAgICAgICAgLy9zdXBlci5qdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKTsKLSAgICAgICAgaWYgKGdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5qdW1wVG9DdXJyZW50U3RhdGUoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBvdXIgb3duIHJlbW90ZSBpbmRpY2F0b3IuCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IE1hdGgubWF4KG1NaW5XaWR0aCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY1dpZHRoKCkgKyBnZXRQYWRkaW5nTGVmdCgpICsgZ2V0UGFkZGluZ1JpZ2h0KCkgOiAwKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KG1NaW5IZWlnaHQsIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKSArIGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKSA6IDApOwotCi0gICAgICAgIGludCBtZWFzdXJlZFdpZHRoOwotICAgICAgICBzd2l0Y2ggKHdpZHRoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSB3aWR0aFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IE1hdGgubWluKHdpZHRoU2l6ZSwgd2lkdGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0OwotICAgICAgICBzd2l0Y2ggKGhlaWdodE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuRVhBQ1RMWToKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHRTaXplLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihtZWFzdXJlZFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSBnZXRQYWRkaW5nTGVmdCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHRvcCA9IGdldFBhZGRpbmdUb3AoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdXaWR0aCA9IG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3SGVpZ2h0ID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3TGVmdCA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0IC0gZHJhd1dpZHRoKSAvIDI7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1RvcCA9IHRvcCArIChib3R0b20gLSB0b3AgLSBkcmF3SGVpZ2h0KSAvIDI7Ci0KLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Qm91bmRzKGRyYXdMZWZ0LCBkcmF3VG9wLAotICAgICAgICAgICAgICAgICAgICBkcmF3TGVmdCArIGRyYXdXaWR0aCwgZHJhd1RvcCArIGRyYXdIZWlnaHQpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZW1vdGUgPSAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Nvbm5lY3RpbmcgPSBpc1JlbW90ZSAmJiByb3V0ZS5pc0Nvbm5lY3RpbmcoKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1JlZnJlc2ggPSBmYWxzZTsKLSAgICAgICAgaWYgKG1SZW1vdGVBY3RpdmUgIT0gaXNSZW1vdGUpIHsKLSAgICAgICAgICAgIG1SZW1vdGVBY3RpdmUgPSBpc1JlbW90ZTsKLSAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcgIT0gaXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtSXNDb25uZWN0aW5nID0gaXNDb25uZWN0aW5nOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkc1JlZnJlc2gpIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHNldEVuYWJsZWQobVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuZWVkc1JlZnJlc2ggfHwgaXNDb25uZWN0aW5nKSAmJiAhY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVtb3RlICYmICFpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSByb3V0ZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBiZWZvcmUgdGhlIHZpZXcgaXMgYXR0YWNoZWQsIHNob3cgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAvLyBmcmFtZSBvZiB0aGUgY29ubmVjdGVkIGFuaW1hdGlvbiBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICBpZiAoY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zZWxlY3REcmF3YWJsZShjdXJEcmF3YWJsZS5nZXROdW1iZXJPZkZyYW1lcygpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotICAgICAgICBpbnQgcmVzSWQ7Ci0gICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3Rpbmc7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZDsKLSAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24oQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpLmdldFN0cmluZyhyZXNJZCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIERyYXdhYmxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNJZDsKLQotICAgICAgICBSZW1vdGVJbmRpY2F0b3JMb2FkZXIoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICBtUmVzSWQgPSByZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgRHJhd2FibGUgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0RHJhd2FibGUobVJlc0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICAgICAgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbGxlZChEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKLSAgICAgICAgICAgIGNhY2hlQW5kUmVzZXQocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjYWNoZUFuZFJlc2V0KERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLnB1dChtUmVzSWQsIHJlbW90ZUluZGljYXRvci5nZXRDb25zdGFudFN0YXRlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzY0ZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuQXBwQ29tcGF0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCi0gKiA8cD4KLSAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByb3V0ZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3Rvci4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUNob29zZXJEaWFsb2ciOwotCi0gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcm91dGUgbGlzdCBpbW1lZGlhdGVseSB0byBhdm9pZCB1bm5hdHVyYWwgZGlhbG9nIGNoYW5nZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ST1VURVNfREVMQVlfTVMgPSAzMDBMOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9ST1VURVMgPSAxOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbVJvdXRlczsKLSAgICBwcml2YXRlIFJvdXRlQWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0VmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZTsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9ST1VURVM6Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcygoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KSBtZXNzYWdlLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBmaWx0ZXIgdGhlIHNldCBvZiByb3V0ZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciBhbGwgcm91dGVzIGluIHRoZSBwcm92aWRlZCBsaXN0IGFuZAotICAgICAqIHJlbW92ZXMgdGhvc2UgZm9yIHdoaWNoIHtAbGluayAjb25GaWx0ZXJSb3V0ZX0gcmV0dXJucyBmYWxzZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVzIFRoZSBsaXN0IG9mIHJvdXRlcyB0byBmaWx0ZXIgaW4tcGxhY2UsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaWx0ZXJSb3V0ZXMoQE5vbk51bGwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBmb3IgKGludCBpID0gcm91dGVzLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0gICAgICAgICAgICBpZiAoIW9uRmlsdGVyUm91dGUocm91dGVzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGZvciBlbmFibGVkIG5vbi1kZWZhdWx0IHJvdXRlcyB0aGF0Ci0gICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHJvdXRlcwotICAgICAqIGRpZmZlcmVudGx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gY29uc2lkZXIsIG5ldmVyIG51bGwuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5pc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewotICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCB0aXRsZUlkKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZUlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2RpYWxvZykpOwotCi0gICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBuZXcgUm91dGVBZGFwdGVyKGdldENvbnRleHQoKSwgbVJvdXRlcyk7Ci0gICAgICAgIG1MaXN0VmlldyA9IChMaXN0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX2xpc3QpOwotICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlcik7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldEVtcHR5VmlldyhmaW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KSk7Ci0gICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3RpdGxlKTsKLQotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgoZ2V0Q29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoZXMgdGhlIGxpc3Qgb2Ygcm91dGVzIHRoYXQgYXJlIHNob3duIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoUm91dGVzKCkgewotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PihtUm91dGVyLmdldFJvdXRlcygpKTsKLSAgICAgICAgICAgIG9uRmlsdGVyUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJvdXRlcywgUm91dGVDb21wYXJhdG9yLnNJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtTGFzdFVwZGF0ZVRpbWUgPj0gVVBEQVRFX1JPVVRFU19ERUxBWV9NUykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcyhyb3V0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfVVBEQVRFX1JPVVRFUywgcm91dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VXBkYXRlVGltZSArIFVQREFURV9ST1VURVNfREVMQVlfTVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVSb3V0ZXMoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVJvdXRlcy5jbGVhcigpOwotICAgICAgICBtUm91dGVzLmFkZEFsbChyb3V0ZXMpOwotICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUm91dGVBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdFZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHRJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1Udkljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VyR3JvdXBJY29uOwotCi0gICAgICAgIHB1YmxpYyBSb3V0ZUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCByb3V0ZXMpOwotCi0gICAgICAgICAgICBUeXBlZEFycmF5IHN0eWxlZEF0dHJpYnV0ZXMgPSBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVUdkljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtRGVmYXVsdEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDApOwotICAgICAgICAgICAgbVR2SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMSk7Ci0gICAgICAgICAgICBtU3BlYWtlckljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDIpOwotICAgICAgICAgICAgbVNwZWFrZXJHcm91cEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDMpOwotICAgICAgICAgICAgc3R5bGVkQXR0cmlidXRlcy5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJdGVtKHBvc2l0aW9uKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlldyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfbGlzdF9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX25hbWUpOwotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDIgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9kZXNjKTsKLSAgICAgICAgICAgIHRleHQxLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHJvdXRlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nID0KLSAgICAgICAgICAgICAgICAgICAgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgJiYgIVRleHRVdGlscy5pc0VtcHR5KGRlc2NyaXB0aW9uKSkgewotICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5CT1RUT00pOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5zZXRFbmFibGVkKHJvdXRlLmlzRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2ljb24pOwotICAgICAgICAgICAgaWYgKGljb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGdldEljb25EcmF3YWJsZShyb3V0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIFVyaSBpY29uVXJpID0gcm91dGUuZ2V0SWNvblVyaSgpOwotICAgICAgICAgICAgaWYgKGljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbShpY29uVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBEcmF3YWJsZS5jcmVhdGVGcm9tU3RyZWFtKGlzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvYWQgIiArIGljb25VcmksIGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBGYWxscyBiYWNrLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgaXMgc3BlY2lmaWVkLCB1c2UgaXQuCi0gICAgICAgICAgICBzd2l0Y2ggKHJvdXRlLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9UVjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Udkljb247Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfU1BFQUtFUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VySWNvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBiZXN0IGd1ZXNzIGJhc2VkIG9uIG90aGVyIHJvdXRlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgc3BlYWtlcnMgY2FuIGJlIGdyb3VwZWQgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJHcm91cEljb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRJY29uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJvdXRlQ29tcGFyYXRvciBzSW5zdGFuY2UgPSBuZXcgUm91dGVDb21wYXJhdG9yKCk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbGhzLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcmhzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGhzLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJocy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNmIyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSAoTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cpZ2V0RGlhbG9nKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIG9uQ3JlYXRlQ2hvb3NlckRpYWxvZygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDaG9vc2VyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbURpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKGdldFJvdXRlU2VsZWN0b3IoKSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBjZmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWV9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fU1RPUDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhRGVzY3JpcHRpb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhTWV0YWRhdGFDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmdyYXBoaWNzLlBhbGV0dGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zbGF0ZUFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXcuT3ZlcmxheU9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgb3IgZGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQnV0dG9uCi0gKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgZXh0ZW5kcyBBbGVydERpYWxvZyB7Ci0gICAgLy8gVGFncyBzaG91bGQgYmUgbGVzcyB0aGFuIDI0IGNoYXJhY3RlcnMgbG9uZyAoc2VlIGRvY3MgZm9yIGFuZHJvaWQudXRpbC5Mb2cuaXNMb2dnYWJsZSgpKQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVDdHJsRGlhbG9nIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8vIFRpbWUgdG8gd2FpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHZvbHVtZSB3aGVuIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNlZWsgYmFyCi0gICAgLy8gdG8gYWxsb3cgdGhlIHJvdXRlIHByb3ZpZGVyIHRpbWUgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgYW5kIHB1Ymxpc2ggYSBuZXcKLSAgICAvLyByb3V0ZSBkZXNjcmlwdG9yLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMgPSA1MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTID0gKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMEwpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9ORVVUUkFMX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24zOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fU1RPUF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMTsKLQotICAgIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotCi0gICAgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNyZWF0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBpbnQgbURpYWxvZ0NvbnRlbnRXaWR0aDsKLQotICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tQ29udHJvbFZpZXc7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRGlzY29ubmVjdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcENhc3RpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheWJhY2tDb250cm9sQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUNsb3NlQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtRXhwYW5kYWJsZUFyZWFMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbURpYWxvZ0FyZWFMYXlvdXQ7Ci0gICAgRnJhbWVMYXlvdXQgbURlZmF1bHRDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUN1c3RvbUNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUFydFZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1Sb3V0ZU5hbWVUZXh0VmlldzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSB0cnVlOwotICAgIC8vIExheW91dCBmb3IgbWVkaWEgY29udHJvbGxlcnMgaW5jbHVkaW5nIHBsYXkvcGF1c2UgYnV0dG9uIGFuZCB0aGUgbWFpbiB2b2x1bWUgc2xpZGVyLgotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NZWRpYU1haW5Db250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgUmVsYXRpdmVMYXlvdXQgbVBsYXliYWNrQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtVm9sdW1lQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIFZpZXcgbURpdmlkZXJWaWV3OwotCi0gICAgT3ZlcmxheUxpc3RWaWV3IG1Wb2x1bWVHcm91cExpc3Q7Ci0gICAgVm9sdW1lR3JvdXBBZGFwdGVyIG1Wb2x1bWVHcm91cEFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkOwotICAgIHByaXZhdGUgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZDsKLSAgICBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwOwotICAgIFNlZWtCYXIgbVZvbHVtZVNsaWRlcjsKLSAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lciBtVm9sdW1lQ2hhbmdlTGlzdGVuZXI7Ci0gICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3A7Ci0gICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgU2Vla0Jhcj4gbVZvbHVtZVNsaWRlck1hcDsKLQotICAgIE1lZGlhQ29udHJvbGxlckNvbXBhdCBtTWVkaWFDb250cm9sbGVyOwotICAgIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIG1Db250cm9sbGVyQ2FsbGJhY2s7Ci0gICAgUGxheWJhY2tTdGF0ZUNvbXBhdCBtU3RhdGU7Ci0gICAgTWVkaWFEZXNjcmlwdGlvbkNvbXBhdCBtRGVzY3JpcHRpb247Ci0KLSAgICBGZXRjaEFydFRhc2sgbUZldGNoQXJ0VGFzazsKLSAgICBCaXRtYXAgbUFydEljb25CaXRtYXA7Ci0gICAgVXJpIG1BcnRJY29uVXJpOwotICAgIGJvb2xlYW4gbUFydEljb25Jc0xvYWRlZDsKLSAgICBCaXRtYXAgbUFydEljb25Mb2FkZWRCaXRtYXA7Ci0gICAgaW50IG1BcnRJY29uQmFja2dyb3VuZENvbG9yOwotCi0gICAgYm9vbGVhbiBtSGFzUGVuZGluZ1VwZGF0ZTsKLSAgICBib29sZWFuIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkOwotCi0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW5nOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZzsKLSAgICBpbnQgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zOwotCi0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLQotICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotICAgIFJ1bm5hYmxlIG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbUNvbnRyb2xsZXJDYWxsYmFjayA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wKTsKLSAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5saW5lYXJfb3V0X3Nsb3dfaW4pOwotICAgICAgICBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvciA9IEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQsIGFuZHJvaWQuUi5pbnRlcnBvbGF0b3IuZmFzdF9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHRoYXQgdGhpcyBkaWFsb2cgaXMgY29udHJvbGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBnZXRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ2V0R3JvdXAoKSB7Ci0gICAgICAgIGlmIChtUm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIG1Sb3V0ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyB0aGUgc3ViY2xhc3MgYW4gb3Bwb3J0dW5pdHkgdG8gY3JlYXRlIGEgdmlldyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBtZWRpYQotICAgICAqIGNvbnRyb2xzIGZvciB0aGUgY3VycmVudGx5IHBsYXlpbmcgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgVGhlIGRpYWxvZydzIHNhdmVkIGluc3RhbmNlIHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGNvbnRyb2wgdmlldywgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIGNvbnRyb2wgdmlldyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgZ2V0TWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXN0b21Db250cm9sVmlldzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB2b2x1bWUgc2xpZGVyIGFuZCB2b2x1bWUgY29udHJvbCB1c2luZyB0aGUgdm9sdW1lIGtleXMKLSAgICAgKiB3aGVuIHRoZSByb3V0ZSBzdXBwb3J0cyBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVDb250cm9sRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xFbmFibGVkICE9IGVuYWJsZSkgewotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xFbmFibGVkID0gZW5hYmxlOwotICAgICAgICAgICAgaWYgKG1DcmVhdGVkKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4gVGhlIGRpYWxvZwotICAgICAqIHdpbGwgbGlzdGVuIHRvIGNoYW5nZXMgb24gdGhpcyBzZXNzaW9uIGFuZCB1cGRhdGUgdGhlIFVJIGF1dG9tYXRpY2FsbHkgaW4KLSAgICAgKiByZXNwb25zZSB0byBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25Ub2tlbiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBzZXNzaW9uVG9rZW4pIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvblRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyQ29tcGF0KG1Db250ZXh0LCBzZXNzaW9uVG9rZW4pOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgY3JlYXRpbmcgbWVkaWEgY29udHJvbGxlciBpbiBzZXRNZWRpYVNlc3Npb24uIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgOiBtTWVkaWFDb250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgbVN0YXRlID0gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIGdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZVJlc291cmNlKGFuZHJvaWQuUi5jb2xvci50cmFuc3BhcmVudCk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKG1Db250ZXh0LCBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQobUNvbnRleHQpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuZXV0cmFsIGJ1dHRvbi4KLSAgICAgICAgZmluZFZpZXdCeUlkKEJVVFRPTl9ORVVUUkFMX1JFU19JRCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIENsaWNrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ2xpY2tMaXN0ZW5lcigpOwotCi0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2V4cGFuZGFibGVfYXJlYSk7Ci0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGlhbG9nX2FyZWEpOwotICAgICAgICBtRGlhbG9nQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIEVhdCB1bmhhbmRsZWQgdG91Y2ggZXZlbnRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW50IGNvbG9yID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRCdXR0b25UZXh0Q29sb3IobUNvbnRleHQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VGV4dENvbG9yKGNvbG9yKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24gPSBmaW5kVmlld0J5SWQoQlVUVE9OX1NUT1BfUkVTX0lEKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nKSk7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9uYW1lKTsKLSAgICAgICAgbUNsb3NlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY2xvc2UpOwotICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jdXN0b21fY29udHJvbCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2RlZmF1bHRfY29udHJvbCk7Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIHNlc3Npb24gYWN0aXZpdHkgd2hlbiBhIGNvbnRlbnQgaXRlbSAoYWxidW0gYXJ0LCB0aXRsZSBvciBzdWJ0aXRsZSkgaXMgY2xpY2tlZC4KLSAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIgb25DbGlja0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnNlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHBpICsgIiB3YXMgbm90IHNlbnQsIGl0IGhhZCBiZWVuIGNhbmNlbGVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtQXJ0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2FydCk7Ci0gICAgICAgIG1BcnRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihvbkNsaWNrTGlzdGVuZXIpOwotICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lcikuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9tZWRpYV9tYWluX2NvbnRyb2wpOwotICAgICAgICBtRGl2aWRlclZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX2RpdmlkZXIpOwotCi0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9wbGF5YmFja19jb250cm9sKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGUpOwotICAgICAgICBtU3VidGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9zdWJ0aXRsZSk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpOwotICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfY29udHJvbCk7Ci0gICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlciA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFRhZyhtUm91dGUpOwotICAgICAgICBtVm9sdW1lQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVm9sdW1lQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotCi0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfZ3JvdXBfbGlzdCk7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPigpOwotICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyID0gbmV3IFZvbHVtZUdyb3VwQWRhcHRlcihtVm9sdW1lR3JvdXBMaXN0LmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEFkYXB0ZXIobVZvbHVtZUdyb3VwQWRhcHRlcik7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZENvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtVm9sdW1lR3JvdXBMaXN0LCBnZXRHcm91cCgpICE9IG51bGwpOwotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldFZvbHVtZVNsaWRlckNvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSBtVm9sdW1lU2xpZGVyLCBtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KG1Sb3V0ZSwgbVZvbHVtZVNsaWRlcik7Ci0KLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24gPQotICAgICAgICAgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSk7Ci0gICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbG9hZEludGVycG9sYXRvcigpOwotICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zKTsKLSAgICAgICAgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zKTsKLQotICAgICAgICBtQ3VzdG9tQ29udHJvbFZpZXcgPSBvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5hZGRWaWV3KG1DdXN0b21Db250cm9sVmlldyk7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaW50IHdpZHRoID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChtQ29udGV4dCk7Ci0gICAgICAgIGdldFdpbmRvdygpLnNldExheW91dCh3aWR0aCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotCi0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIG1EaWFsb2dDb250ZW50V2lkdGggPSB3aWR0aCAtIGRlY29yVmlldy5nZXRQYWRkaW5nTGVmdCgpIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdSaWdodCgpOwotCi0gICAgICAgIFJlc291cmNlcyByZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0KTsKLQotICAgICAgICAvLyBGZXRjaCBhcnQgaWNvbnMgYWdhaW4gZm9yIGxheW91dCBjaGFuZ2VzIHRvIHJlc2l6ZSBpdCBhY2NvcmRpbmdseQotICAgICAgICBtQXJ0SWNvbkJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uVXJpID0gbnVsbDsKLSAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotCi0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZLCBtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUyk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihtUm91dGVyLmdldE1lZGlhU2Vzc2lvblRva2VuKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihudWxsKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KLSAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSB7Ci0gICAgICAgICAgICBtUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04gPyAtMSA6IDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZShib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gRGVmZXIgZGlhbG9nIHVwZGF0ZXMgaWYgYSB1c2VyIGlzIGFkanVzdGluZyBhIHZvbHVtZSBpbiB0aGUgbGlzdAotICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYXNQZW5kaW5nVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkIHw9IGFuaW1hdGU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtUm91dGUuaXNTZWxlY3RlZCgpIHx8IG1Sb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpKSB7Ci0gICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtQ3JlYXRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJvdXRlTmFtZVRleHRWaWV3LnNldFRleHQobVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFZpc2liaWxpdHkobVJvdXRlLmNhbkRpc2Nvbm5lY3QoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0SWNvbklzTG9hZGVkKSB7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChtQXJ0SWNvbkxvYWRlZEJpdG1hcCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBzZXQgYXJ0d29yayBpbWFnZSB3aXRoIHJlY3ljbGVkIGJpdG1hcDogIiArIG1BcnRJY29uTG9hZGVkQml0bWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0SW1hZ2VCaXRtYXAobUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldEJhY2tncm91bmRDb2xvcihtQXJ0SWNvbkJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCk7Ci0gICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaXRtYXBSZWN5Y2xlZChCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBiaXRtYXAgIT0gbnVsbCAmJiBiaXRtYXAuaXNSZWN5Y2xlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgKG1EZXNjcmlwdGlvbiAhPSBudWxsIHx8IG1TdGF0ZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgbWFpbiBtZWRpYSBjb250cm9sbGVyIHdoaWNoIGluY2x1ZGVzIHBsYXliYWNrIGNvbnRyb2wgYW5kIG1hc3RlcgotICAgICAqIHZvbHVtZSBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGJvb2xlYW4gc2hvd1BsYXliYWNrQ29udHJvbCkgewotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgfHwgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgaGVpZ2h0ICs9IG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdUb3AoKQotICAgICAgICAgICAgICAgICAgICArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdCb3R0b20oKTsKLSAgICAgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9ICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtVm9sdW1lQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgJiYgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtRGl2aWRlclZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGJvb2xlYW4gY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgewotICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhlIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcgb2YgdGhlIGNvbnRyb2wgbGF5b3V0IGFjY29yZGluZyB0byB0aGUgZGlzcGxheQotICAgICAgICAvLyBoZWlnaHQuCi0gICAgICAgIG1EaXZpZGVyVmlldy5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFCi0gICAgICAgICAgICAgICAgJiYgY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgJiYgIWNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpID8gVmlldy5HT05FIDogVmlldy5WSVNJQkxFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodChmaW5hbCBib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB0aGUgdXBkYXRlIHVudGlsIHRoZSBmaXJzdCBsYXlvdXQgaGFzIG9jY3VycmVkLCBhcyB3ZSBkb24ndCB5ZXQga25vdyB0aGUKLSAgICAgICAgLy8gb3ZlcmFsbCB2aXNpYmxlIGRpc3BsYXkgc2l6ZSBpbiB3aGljaCB0aGUgd2luZG93IHRoaXMgdmlldyBpcyBhdHRhY2hlZCB0byBoYXMgYmVlbgotICAgICAgICAvLyBwb3NpdGlvbmVkIGluLgotICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQucmVxdWVzdExheW91dCgpOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGluZykgewotICAgICAgICAgICAgICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChhbmltYXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGhlaWdodCBvZiB2aWV3cyBhbmQgaGlkZSBhcnR3b3JrIG9yIG1ldGFkYXRhIGlmIHNwYWNlIGlzIGxpbWl0ZWQuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gTWVhc3VyZSB0aGUgc2l6ZSBvZiB3aWRnZXRzIGFuZCBnZXQgdGhlIGhlaWdodCBvZiBtYWluIGNvbXBvbmVudHMuCi0gICAgICAgIGludCBvbGRIZWlnaHQgPSBnZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOwotICAgICAgICBkZWNvclZpZXcubWVhc3VyZSgKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgb2xkSGVpZ2h0KTsKLSAgICAgICAgaW50IGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSBpbnN0YW5jZW9mIEJpdG1hcERyYXdhYmxlKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYXJ0ID0gKChCaXRtYXBEcmF3YWJsZSkgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSkuZ2V0Qml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gZ2V0RGVzaXJlZEFydEhlaWdodChhcnQuZ2V0V2lkdGgoKSwgYXJ0LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRTY2FsZVR5cGUoYXJ0LmdldFdpZHRoKCkgPj0gYXJ0LmdldEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IEltYWdlVmlldy5TY2FsZVR5cGUuRklUX1hZIDogSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfQ0VOVEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBpbnQgdm9sdW1lR3JvdXBMaXN0Q291bnQgPSBtR3JvdXBNZW1iZXJSb3V0ZXMuc2l6ZSgpOwotICAgICAgICAvLyBTY2FsZSBkb3duIHZvbHVtZSBncm91cCBsaXN0IGl0ZW1zIGluIGxhbmRzY2FwZSBtb2RlLgotICAgICAgICBpbnQgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgPSBnZXRHcm91cCgpID09IG51bGwgPyAwIDoKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdldEdyb3VwKCkuZ2V0Um91dGVzKCkuc2l6ZSgpOwotICAgICAgICBpZiAodm9sdW1lR3JvdXBMaXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCArPSBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICAgICAgfQotICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IE1hdGgubWluKGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0LCBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0KTsKLSAgICAgICAgaW50IHZpc2libGVHcm91cExpc3RIZWlnaHQgPSBtSXNHcm91cEV4cGFuZGVkID8gZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgOiAwOwotCi0gICAgICAgIGludCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLSAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGRlY29yVmlldy5nZXRXaW5kb3dWaXNpYmxlRGlzcGxheUZyYW1lKHZpc2libGVSZWN0KTsKLSAgICAgICAgLy8gSGVpZ2h0IG9mIG5vbi1jb250cm9sIHZpZXdzIGluIGRlY29yIHZpZXcuCi0gICAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGl0bGUgYmFyLCBidXR0b24gYmFyLCBhbmQgZGlhbG9nJ3MgdmVydGljYWwgcGFkZGluZyB3aGljaCBzaG91bGQgYmUKLSAgICAgICAgLy8gYWx3YXlzIHNob3duLgotICAgICAgICBpbnQgbm9uQ29udHJvbFZpZXdIZWlnaHQgPSBtRGlhbG9nQXJlYUxheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgLSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgLy8gTWF4aW11bSBhbGxvd2VkIGhlaWdodCBmb3IgY29udHJvbHMgdG8gZml0IHNjcmVlbi4KLSAgICAgICAgaW50IG1heGltdW1Db250cm9sVmlld0hlaWdodCA9IHZpc2libGVSZWN0LmhlaWdodCgpIC0gbm9uQ29udHJvbFZpZXdIZWlnaHQ7Ci0KLSAgICAgICAgLy8gU2hvdyBhcnR3b3JrIGlmIGl0IGZpdHMgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIGFydFZpZXdIZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUFydFZpZXcsIGFydFZpZXdIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0KSArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgPj0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gdmlzaWJsZUdyb3VwTGlzdEhlaWdodCArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFNob3cgdGhlIHBsYXliYWNrIGNvbnRyb2wgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkobVBsYXliYWNrQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKTsKLSAgICAgICAgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodCgKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLQotICAgICAgICAvLyBMaW1pdCB0aGUgdm9sdW1lIGdyb3VwIGxpc3QgaGVpZ2h0IHRvIGZpdCB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPiBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIHZpc2libGVHcm91cExpc3RIZWlnaHQgLT0gKGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IC0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KTsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0cyB3aXRoIHRoZSBjb21wdXRlZCBoZWlnaHRzLgotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBpZiAoYW5pbWF0ZSkgewotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobURlZmF1bHRDb250cm9sTGF5b3V0LCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1haW5Db250cm9sbGVySGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyBNYXhpbWl6ZSB0aGUgd2luZG93IHNpemUgd2l0aCBhIHRyYW5zcGFyZW50IGxheW91dCBpbiBhZHZhbmNlIGZvciBzbW9vdGggYW5pbWF0aW9uLgotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUV4cGFuZGFibGVBcmVhTGF5b3V0LCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIHJlYnVpbGRWb2x1bWVHcm91cExpc3QoYW5pbWF0ZSk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQoVmlldyBpdGVtKSB7Ci0gICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgIHNldExheW91dEhlaWdodChjb250YWluZXIsIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0KTsKLSAgICAgICAgVmlldyBpY29uID0gaXRlbS5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IGljb24uZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLndpZHRoID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgaWNvbi5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbmltYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIFZpZXcgdmlldywgaW50IHRhcmdldEhlaWdodCkgewotICAgICAgICBmaW5hbCBpbnQgc3RhcnRWYWx1ZSA9IGdldExheW91dEhlaWdodCh2aWV3KTsKLSAgICAgICAgZmluYWwgaW50IGVuZFZhbHVlID0gdGFyZ2V0SGVpZ2h0OwotICAgICAgICBBbmltYXRpb24gYW5pbSA9IG5ldyBBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQgaW50ZXJwb2xhdGVkVGltZSwgVHJhbnNmb3JtYXRpb24gdCkgewotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBzdGFydFZhbHVlIC0gKGludCkgKChzdGFydFZhbHVlIC0gZW5kVmFsdWUpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KHZpZXcsIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgIGFuaW0uc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgfQotCi0gICAgdm9pZCBsb2FkSW50ZXJwb2xhdG9yKCkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0KLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID8gbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvciA6IG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWb2x1bWVDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKG1Sb3V0ZSkpIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0TWF4KG1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhtUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldFZpc2liaWxpdHkoZ2V0R3JvdXAoKSA9PSBudWxsID8gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgICAgICAgICA6IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IG51bGwgOiBnZXRHcm91cCgpLmdldFJvdXRlcygpOwotICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5jbGVhcigpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVEaWFsb2dIZWxwZXIubGlzdFVub3JkZXJlZEVxdWFscyhtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcykpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEhhc2hNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQm91bmRNYXAobVZvbHVtZUdyb3VwTGlzdCwgbVZvbHVtZUdyb3VwQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwID0gYW5pbWF0ZQotICAgICAgICAgICAgICAgICAgICA/IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbUJpdG1hcE1hcChtQ29udGV4dCwgbVZvbHVtZUdyb3VwTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyKSA6IG51bGw7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbXNBZGRlZChtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc1JlbW92ZWQobUdyb3VwTWVtYmVyUm91dGVzLAotICAgICAgICAgICAgICAgICAgICByb3V0ZXMpOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmFkZEFsbCgwLCBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMucmVtb3ZlQWxsKG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbUlzR3JvdXBFeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgKyBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXMocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtcyhmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAsCi0gICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCkgewotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zSW50ZXJuYWwocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbCgKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9PSBudWxsIHx8IG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBncm91cFNpemVEZWx0YSA9IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAtIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpOwotICAgICAgICBib29sZWFuIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnN0YXJ0QW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5wb3N0RGVsYXllZChtR3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIEFuaW1hdGUgdmlzaWJsZSBpdGVtcyBmcm9tIHByZXZpb3VzIHBvc2l0aW9ucyB0byBjdXJyZW50IHBvc2l0aW9ucyBleGNlcHQgcm91dGVzIGFkZGVkCi0gICAgICAgIC8vIGp1c3QgYmVmb3JlLiBBZGRlZCByb3V0ZXMgd2lsbCByZW1haW4gaGlkZGVuIHVudGlsIHRyYW5zbGF0ZSBhbmltYXRpb24gZmluaXNoZXMuCi0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgUmVjdCBwcmV2aW91c0JvdW5kcyA9IHByZXZpb3VzUm91dGVCb3VuZE1hcC5nZXQocm91dGUpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRUb3AgPSB2aWV3LmdldFRvcCgpOwotICAgICAgICAgICAgaW50IHByZXZpb3VzVG9wID0gcHJldmlvdXNCb3VuZHMgIT0gbnVsbCA/IHByZXZpb3VzQm91bmRzLnRvcAotICAgICAgICAgICAgICAgICAgICA6IChjdXJyZW50VG9wICsgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgKiBncm91cFNpemVEZWx0YSk7Ci0gICAgICAgICAgICBBbmltYXRpb25TZXQgYW5pbVNldCA9IG5ldyBBbmltYXRpb25TZXQodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RvcCA9IGN1cnJlbnRUb3A7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCBwcmV2aW91c1RvcCAtIGN1cnJlbnRUb3AsIDApOwotICAgICAgICAgICAgdHJhbnNsYXRpb25BbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKHRyYW5zbGF0aW9uQW5pbSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhbmltU2V0LnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgICAgICBwcmV2aW91c1JvdXRlQm91bmRNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCaXRtYXBNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGEgbWVtYmVyIHJvdXRlIGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlciwgaXQgY2FuIGJlIGVpdGhlciByZW1vdmVkIG9yIG1vdmVkIG91dCBvZiB0aGUKLSAgICAgICAgLy8gTGlzdFZpZXcgbGF5b3V0IGJvdW5kYXJ5LiBJbiB0aGlzIGNhc2UsIHVzZSB0aGUgcHJldmlvdXNseSBjYXB0dXJlZCBiaXRtYXBzIGZvcgotICAgICAgICAvLyBhbmltYXRpb24uCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IGl0ZW0KLSAgICAgICAgICAgICAgICA6IHByZXZpb3VzUm91dGVCaXRtYXBNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gaXRlbS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IGl0ZW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0QWxwaGFBbmltYXRpb24oMS4wZiwgMC4wZikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gZ3JvdXBTaXplRGVsdGEgKiBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodDsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihkZWx0YVkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIobmV3IE92ZXJsYXlPYmplY3QuT25BbmltYXRpb25FbmRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5hZGQocm91dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5hZGRPdmVybGF5T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCkgewotICAgICAgICBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbkludGVybmFsKCkgewotICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZmFkZUluQWRkZWRSb3V0ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZmluaXNoQW5pbWF0aW9uKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcpIHsKLSAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhZGVJbkFkZGVkUm91dGVzKCkgewotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMS4wZik7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbihib29sZWFuIGV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKGV4Y2VwdEFkZGVkUm91dGVzICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgdmlldy5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOwotICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMS4wZiwgMS4wZik7Ci0gICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgQW5pbWF0aW9uIHRyYW5zbGF0aW9uQW5pbSA9IG5ldyBUcmFuc2xhdGVBbmltYXRpb24oMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW1TZXQpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RvcEFuaW1hdGlvbkFsbCgpOwotICAgICAgICBpZiAoIWV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrQ29udHJvbExheW91dCgpIHsKLSAgICAgICAgaWYgKGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSkgewotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1RpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHN1YnRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFN1YnRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1N1YnRpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHN1YnRpdGxlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBzaG93VGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1N1YnRpdGxlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVJvdXRlLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpCi0gICAgICAgICAgICAgICAgICAgICE9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IG51bGwgfHwgbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdyAiTm8gbWVkaWEgc2VsZWN0ZWQiIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZSBwbGF5YmFjayBzdGF0ZS4KLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNUaXRsZSAmJiAhaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChoYXNUaXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1N1YnRpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoc2hvd1RpdGxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93U3VidGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfQlVGRkVSSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0ID0gbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRyYXdhYmxlQXR0ciA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGljb25EZXNjUmVzSWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVBhdXNlRHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BhdXNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVN0b3BEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGxheURyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFRoZW1lUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0LCBpY29uRHJhd2FibGVBdHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQuZ2V0UmVzb3VyY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KGljb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiAoQUNUSU9OX1BMQVkgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUEFVU0UgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgQUNUSU9OX1NUT1ApICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgJiYgcm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKQotICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExheW91dEhlaWdodChWaWV3IHZpZXcpIHsKLSAgICAgICAgcmV0dXJuIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0OwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldExheW91dEhlaWdodChWaWV3IHZpZXcsIGludCBoZWlnaHQpIHsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXJpRXF1YWxzKFVyaSB1cmkxLCBVcmkgdXJpMikgewotICAgICAgICBpZiAodXJpMSAhPSBudWxsICYmIHVyaTEuZXF1YWxzKHVyaTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh1cmkxID09IG51bGwgJiYgdXJpMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkZXNpcmVkIGFydCBoZWlnaHQgdG8gZml0IGludG8gY29udHJvbGxlciBkaWFsb2cuCi0gICAgICovCi0gICAgaW50IGdldERlc2lyZWRBcnRIZWlnaHQoaW50IG9yaWdpbmFsV2lkdGgsIGludCBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+PSBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICAgICAgLy8gRm9yIGxhbmRzY2FwZSBhcnQsIGZpdCB3aWR0aCB0byBkaWFsb2cgd2lkdGguCi0gICAgICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0IC8gb3JpZ2luYWxXaWR0aCArIDAuNWYpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBwb3J0cmFpdCBhcnQsIGZpdCBoZWlnaHQgdG8gMTY6OSByYXRpbyBjYXNlJ3MgaGVpZ2h0LgotICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIDkgLyAxNiArIDAuNWYpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCkgewotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwgfHwgIWlzSWNvbkNoYW5nZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmV0Y2hBcnRUYXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2suY2FuY2VsKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIG1GZXRjaEFydFRhc2sgPSBuZXcgRmV0Y2hBcnRUYXNrKCk7Ci0gICAgICAgIG1GZXRjaEFydFRhc2suZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBiaXRtYXAgbG9hZGVkIGJ5IEZldGNoQXJ0VGFzay4gV2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxvYWRlZCBiaXRtYXBzIGFyZSBhcHBsaWVkCi0gICAgICogdG8gYXJ0d29yaywgb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJMb2FkZWRCaXRtYXAoKSB7Ci0gICAgICAgIG1BcnRJY29uSXNMb2FkZWQgPSBmYWxzZTsKLSAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBudWxsOwotICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGEgbmV3IGFydCBpbWFnZSBpcyBkaWZmZXJlbnQgZnJvbSBhbiBvcmlnaW5hbCBhcnQgaW1hZ2UuIENvbXBhcmVzCi0gICAgICogQml0bWFwIG9iamVjdHMgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVzIFVSSXMgb25seSBpZiBiaXRtYXAgaXMgdW5jaGFuZ2VkIHdpdGgKLSAgICAgKiBhIG51bGwgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSWNvbkNoYW5nZWQoKSB7Ci0gICAgICAgIEJpdG1hcCBuZXdCaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICBVcmkgbmV3VXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgQml0bWFwIG9sZEJpdG1hcCA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uQml0bWFwIDogbUZldGNoQXJ0VGFzay5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBvbGRVcmkgPSBtRmV0Y2hBcnRUYXNrID09IG51bGwgPyBtQXJ0SWNvblVyaSA6IG1GZXRjaEFydFRhc2suZ2V0SWNvblVyaSgpOwotICAgICAgICBpZiAob2xkQml0bWFwICE9IG5ld0JpdG1hcCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQml0bWFwID09IG51bGwgJiYgIXVyaUVxdWFscyhvbGRVcmksIG5ld1VyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgU2Vla0JhciB2b2x1bWVTbGlkZXIgPSBtVm9sdW1lU2xpZGVyTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgdm9sdW1lID0gcm91dGUuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblJvdXRlVm9sdW1lQ2hhbmdlZCgpLCByb3V0ZS5nZXRWb2x1bWU6IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9sdW1lU2xpZGVyICE9IG51bGwgJiYgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyQ29tcGF0LkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIudW5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZUNvbXBhdCBzdGF0ZSkgewotICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IGlkID0gdi5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCB8fCBpZCA9PSBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVyLnVuc2VsZWN0KGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY29udHJvbF9wbGF5YmFja19jdHJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCAmJiBtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGxheTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgYWN0aW9uIGZvciBhY2Nlc3NpYmlsaXR5LgotICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlNYW5hZ2VyICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aW9uRGVzY1Jlc0lkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudENvbXBhdC5UWVBFX0FOTk9VTkNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoYWN0aW9uRGVzY1Jlc0lkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY2xvc2UpIHsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVN0b3BUcmFja2luZ1RvdWNoID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSGFzUGVuZGluZ1VwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIucmVtb3ZlQ2FsbGJhY2tzKG1TdG9wVHJhY2tpbmdUb3VjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICAvLyBEZWZlciByZXNldHRpbmcgbVZvbHVtZVNsaWRlclRvdWNoZWQgdG8gYWxsb3cgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBhIGxpdHRsZSB0aW1lIHRvIHNldHRsZSBpbnRvIGl0cyBuZXcgc3RhdGUgYW5kIHB1Ymxpc2ggdGhlIGZpbmFsCi0gICAgICAgICAgICAvLyB2b2x1bWUgdXBkYXRlLgotICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5wb3N0RGVsYXllZChtU3RvcFRyYWNraW5nVG91Y2gsIFZPTFVNRV9VUERBVEVfREVMQVlfTUlMTElTKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gKE1lZGlhUm91dGVyLlJvdXRlSW5mbykgc2Vla0Jhci5nZXRUYWcoKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Qcm9ncmVzc0NoYW5nZWQoKTogY2FsbGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUoIiArIHByb2dyZXNzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcm91dGUucmVxdWVzdFNldFZvbHVtZShwcm9ncmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUdyb3VwQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHsKLSAgICAgICAgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUdyb3VwQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBvYmplY3RzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCBvYmplY3RzKTsKLSAgICAgICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGZpbmFsIGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdiA9IExheW91dEluZmxhdGVyLmZyb20ocGFyZW50LmdldENvbnRleHQoKSkuaW5mbGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQodik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKHJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IHJvdXRlLmlzRW5hYmxlZCgpOwotCi0gICAgICAgICAgICAgICAgVGV4dFZpZXcgcm91dGVOYW1lID0gKFRleHRWaWV3KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICAgICAgICAgIHJvdXRlTmFtZS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Q29udGV4dCgpLCB2b2x1bWVTbGlkZXIsIG1Wb2x1bWVHcm91cExpc3QpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRUYWcocm91dGUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KHJvdXRlLCB2b2x1bWVTbGlkZXIpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRIaWRlVGh1bWIoIWlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0TWF4KHJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhyb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVZvbHVtZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgoMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcygxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW1hZ2VWaWV3IHZvbHVtZUl0ZW1JY29uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChJbWFnZVZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2l0ZW1faWNvbik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lSXRlbUljb24uc2V0QWxwaGEoaXNFbmFibGVkID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIG92ZXJsYXkgYml0bWFwIGV4aXN0cywgcmVhbCB2aWV3IHNob3VsZCByZW1haW4gaGlkZGVuIHVudGlsCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkobUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5jb250YWlucyhyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUm91dGVzIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB3aWxsIGJlIGludmlzaWJsZSB1bnRpbCBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgdi5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGZXRjaEFydFRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgQml0bWFwPiB7Ci0gICAgICAgIC8vIFNob3cgYW5pbWF0aW9uIG9ubHkgd2hlbiBmZXRjaGluZyB0YWtlcyBhIGxvbmcgdGltZS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTID0gMTIwTDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtSWNvbkJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbUljb25Vcmk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lTWlsbGlzOwotCi0gICAgICAgIEZldGNoQXJ0VGFzaygpIHsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQoYml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGZldGNoIHRoZSBnaXZlbiBhcnQgYml0bWFwIGJlY2F1c2UgaXQncyBhbHJlYWR5IHJlY3ljbGVkLiIpOwotICAgICAgICAgICAgICAgIGJpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSWNvbkJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1JY29uVXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvbkJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUV4ZWN1dGUoKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBhcmcpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1JY29uQml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnQgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW0gPSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShtSWNvblVyaSkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUXVlcnkgYXJ0IHNpemUuCi0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluSnVzdERlY29kZUJvdW5kcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm91dFdpZHRoID09IDAgfHwgb3B0aW9ucy5vdXRIZWlnaHQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8gcmVzdGFydCBhcnQgZGVjb2RpbmcuCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkIHRvIHJld2luZCB0aGUgc3RyZWFtLCB0cnkgdG8gcmVvcGVuIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBzaXplIHRvIGRlY29kZSB0aGUgYXJ0IGFuZCBwb3NzaWJseSByZXNpemUgaXQuCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXFIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KG9wdGlvbnMub3V0V2lkdGgsIG9wdGlvbnMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJhdGlvID0gb3B0aW9ucy5vdXRIZWlnaHQgLyByZXFIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5TYW1wbGVTaXplID0gTWF0aC5tYXgoMSwgSW50ZWdlci5oaWdoZXN0T25lQml0KHJhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcnQgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChhcnQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgdXNlIHJlY3ljbGVkIGJpdG1hcDogIiArIGFydCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwgJiYgYXJ0LmdldFdpZHRoKCkgPCBhcnQuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBQb3J0cmFpdCBhcnQgcmVxdWlyZXMgZG9taW5hbnQgY29sb3IgYXMgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgICAgICAgICAgICBQYWxldHRlIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZS5CdWlsZGVyKGFydCkubWF4aW11bUNvbG9yQ291bnQoMSkuZ2VuZXJhdGUoKTsKLSAgICAgICAgICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAwIDogcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmdldCgwKS5nZXRSZ2IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShCaXRtYXAgYXJ0KSB7Ci0gICAgICAgICAgICBtRmV0Y2hBcnRUYXNrID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25CaXRtYXAsIG1JY29uQml0bWFwKQotICAgICAgICAgICAgICAgICAgICB8fCAhT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25VcmksIG1JY29uVXJpKSkgewotICAgICAgICAgICAgICAgIG1BcnRJY29uQml0bWFwID0gbUljb25CaXRtYXA7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBhcnQ7Ci0gICAgICAgICAgICAgICAgbUFydEljb25VcmkgPSBtSWNvblVyaTsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVN0YXJ0VGltZU1pbGxpczsKLSAgICAgICAgICAgICAgICAvLyBMb2FkZWQgYml0bWFwIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgbmV4dCB1cGRhdGUKLSAgICAgICAgICAgICAgICB1cGRhdGUoZWxhcHNlZFRpbWVNaWxsaXMgPiBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUoVXJpIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHMoc2NoZW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0ZJTEUuZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbm4uc2V0Q29ubmVjdFRpbWVvdXQoQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRSZWFkVGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZDc0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgbURpYWxvZzsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICByZXR1cm4gbURpYWxvZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLmNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVhZjM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lZGlhIHJvdXRlCi0gKiBjaG9vc2VyIGFuZCBjb250cm9sbGVyIGRpYWxvZ3MgYXMgbmVlZGVkLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBwcm92aWRpbmcgYSBzdWJjbGFzcyBvZiB0aGUKLSAqIGRpYWxvZyBmYWN0b3J5IHRvIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbn0gdXNpbmcgdGhlCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbiNzZXREaWFsb2dGYWN0b3J5IHNldERpYWxvZ0ZhY3Rvcnl9IG1ldGhvZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBzRGVmYXVsdCA9IG5ldyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBzRGVmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFiZjdiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIGZyYW1ld29yayBzaG91bGQgc2V0IHRoZSBkaWFsb2cgd2lkdGggcHJvcGVybHksIGJ1dCBzb21laG93IGl0IGRvZXNuJ3Qgd29yaywgaGVuY2UKLSAgICAgKiBkdXBsaWNhdGluZyBhIHNpbWlsYXIgbG9naWMgaGVyZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyB3aWR0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXREaWFsb2dXaWR0aChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgYm9vbGVhbiBpc1BvcnRyYWl0ID0gbWV0cmljcy53aWR0aFBpeGVscyA8IG1ldHJpY3MuaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFZhbHVlKGlzUG9ydHJhaXQKLSAgICAgICAgICAgICAgICA/IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yCi0gICAgICAgICAgICAgICAgOiBSLmRpbWVuLm1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRElNRU5TSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RGltZW5zaW9uKG1ldHJpY3MpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0ZSQUNUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RnJhY3Rpb24obWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy53aWR0aFBpeGVscyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyByZWdhcmRsZXNzIG9mIG9yZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QxIEEgbGlzdAotICAgICAqIEBwYXJhbSBsaXN0MiBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgbGlzdDF9Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHR3byBsaXN0cyBoYXZlIGV4YWN0bHkgc2FtZSBpdGVtcyByZWdhcmRsZXNzIG9mIG9yZGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBsaXN0VW5vcmRlcmVkRXF1YWxzKExpc3Q8RT4gbGlzdDEsIExpc3Q8RT4gbGlzdDIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQxID0gbmV3IEhhc2hTZXQ8PihsaXN0MSk7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0MiA9IG5ldyBIYXNoU2V0PD4obGlzdDIpOwotICAgICAgICByZXR1cm4gc2V0MS5lcXVhbHMoc2V0Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYWZ0ZXItbGlzdCBidXQgYmVmb3JlLWxpc3QsIHdoaWNoIG1lYW5zIG5ld2x5IGFkZGVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIG5ld2x5IGFkZGVkIGl0ZW1zIHdoaWxlCi0gICAgICogY29tcGFyaW5nIHtAY29kZSBhZnRlcn0gdG8ge0Bjb2RlIGJlZm9yZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGdldEl0ZW1zQWRkZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGFmdGVyKTsKLSAgICAgICAgc2V0LnJlbW92ZUFsbChiZWZvcmUpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyBhbmQgcmV0dXJucyBhIHNldCBvZiBpdGVtcyB3aGljaCBleGlzdAotICAgICAqIGJlZm9yZS1saXN0IGJ1dCBhZnRlci1saXN0LCB3aGljaCBtZWFucyByZW1vdmVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIHJlbW92ZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNSZW1vdmVkKExpc3Q8RT4gYmVmb3JlLCBMaXN0PEU+IGFmdGVyKSB7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8PihiZWZvcmUpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGFmdGVyKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1SZWN0IG1hcCB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgbWVtYmVyCi0gICAgICogaXRlbXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIExpc3RWaWV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RWaWV3IEEgbGlzdCB2aWV3Ci0gICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYXJyYXkgYWRhcHRlciB3aGljaCBjb250YWlucyBhbiBhcnJheSBvZiBpdGVtcy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwIG9mIGl0ZW1zIGFuZCBib3VuZHMgb2YgdGhlaXIgdmlld3MgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgUmVjdD4gZ2V0SXRlbUJvdW5kTWFwKExpc3RWaWV3IGxpc3RWaWV3LAotICAgICAgICAgICAgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBSZWN0PiBpdGVtQm91bmRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJvdW5kTWFwLnB1dChpdGVtLAotICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdCh2aWV3LmdldExlZnQoKSwgdmlldy5nZXRUb3AoKSwgdmlldy5nZXRSaWdodCgpLCB2aWV3LmdldEJvdHRvbSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1Cb3VuZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1CaXRtYXBEcmF3YWJsZSBtYXAgd2hpY2ggc3RvcmVzIHNuYXBzaG90cwotICAgICAqIG9mIG1lbWJlciBpdGVtcyBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIHNuYXBzaG90cyBvZiB0aGVpciB2aWV3cyBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGdldEl0ZW1CaXRtYXBNYXAoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcsIEFycmF5QWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0gICAgICAgIEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGl0ZW1CaXRtYXBNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJpdG1hcE1hcC5wdXQoaXRlbSwgZ2V0Vmlld0JpdG1hcChjb250ZXh0LCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1CaXRtYXBNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRHJhd2FibGUgZ2V0Vmlld0JpdG1hcChDb250ZXh0IGNvbnRleHQsIFZpZXcgdmlldykgewotICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2aWV3LmdldFdpZHRoKCksIHZpZXcuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOwotICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCaXRtYXBEcmF3YWJsZShjb250ZXh0LmdldFJlc291cmNlcygpLCBiaXRtYXApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVlMTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGRpc2NvdmVyeSBmcmFnbWVudC4KLSAqIDxwPgotICogVGhpcyBmcmFnbWVudCB0YWtlcyBjYXJlIG9mIHJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sgZm9yIG1lZGlhIHJvdXRlIGRpc2NvdmVyeQotICogZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdGFydCBvblN0YXJ0KCl9IHBoYXNlCi0gKiBhbmQgcmVtb3ZpbmcgaXQgZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdG9wIG9uU3RvcCgpfSBwaGFzZS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIHJvdXRlIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcwotICogdG8gZGlzY292ZXIuICBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gb3ZlcnJpZGUge0BsaW5rICNvbkNyZWF0ZUNhbGxiYWNrfSB0bwotICogcHJvdmlkZSB0aGUge0BsaW5rIE1lZGlhUm91dGVyfSBjYWxsYmFjayB0byByZWdpc3Rlci4KLSAqIDwvcD48cD4KLSAqIE5vdGUgdGhhdCB0aGUgZGlzY292ZXJ5IGNhbGxiYWNrIG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBiZSBjb25uZWN0ZWQgd2l0aCBhbGwgdGhlCi0gKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXN9Ci0gKiB3aGlsZSBpdCBpcyByZWdpc3RlcmVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0TWVkaWFSb3V0ZXIoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICByZXR1cm4gbVJvdXRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVyKCkgewotICAgICAgICBpZiAobVJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShhcmdzLmdldEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30KLSAgICAgKiB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBjYWxsYmFjayBkb2VzIG5vdGhpbmcuICBUaGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgICogc3VwcGx5IGl0cyBvd24gY2FsbGJhY2suCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNhbGxiYWNrLCBvciBudWxsIGlmIG5vIGNhbGxiYWNrIHNob3VsZCBiZSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlci5DYWxsYmFjayBvbkNyZWF0ZUNhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgeyB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBwcmVwYXJlIHRoZSBjYWxsYmFjayBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9IGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVzaXJlZCBjYWxsYmFjayBmbGFncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICBtQ2FsbGJhY2sgPSBvbkNyZWF0ZUNhbGxiYWNrKCk7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGE5NWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkNvbnRleHRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLS8qKgotICogQ2hldnJvbi9DYXJldCBidXR0b24gdG8gZXhwYW5kL2NvbGxhcHNlIGdyb3VwIHZvbHVtZSBsaXN0IHdpdGggYW5pbWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24gewotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBBbmltYXRpb25EcmF3YWJsZSBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBTdHJpbmcgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb247Ci0gICAgZmluYWwgU3RyaW5nIG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb247Ci0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIE9uQ2xpY2tMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9leHBhbmQpOwotICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERyYXdhYmxlKFIuZHJhd2FibGUubXJfZ3JvdXBfY29sbGFwc2UpOwotCi0gICAgICAgIENvbG9yRmlsdGVyIGZpbHRlciA9IG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgZGVmU3R5bGVBdHRyKSwKLSAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwKTsKLSAgICAgICAgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCk7Ci0KLSAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuZ2V0RnJhbWUoMCkpOwotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUV4cGFuZEdyb3VwRGVzY3JpcHRpb24pOwotCi0gICAgICAgIHN1cGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgewotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25DbGljayh2aWV3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZDIwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLQotLyoqCi0gKiBWb2x1bWUgc2xpZGVyIHdpdGggc2hvd2luZywgaGlkaW5nLCBhbmQgYXBwbHlpbmcgYWxwaGEgc3VwcG9ydHMgdG8gdGhlIHRodW1iLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciBleHRlbmRzIFNlZWtCYXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EaXNhYmxlZEFscGhhOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1IaWRlVGh1bWI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtVGh1bWI7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0gICAgICAgIGludCBhbHBoYSA9IGlzRW5hYmxlZCgpID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpOwotCi0gICAgICAgIC8vIFRoZSB0aHVtYiBkcmF3YWJsZSBpcyBhIGNvbGxlY3Rpb24gb2YgZHJhd2FibGVzIGFuZCBpdHMgY3VycmVudCBkcmF3YWJsZXMgYXJlIGNoYW5nZWQgcGVyCi0gICAgICAgIC8vIHN0YXRlLiBBcHBseSB0aGUgY29sb3IgZmlsdGVyIGFuZCBhbHBoYSBvbiBldmVyeSBzdGF0ZSBjaGFuZ2UuCi0gICAgICAgIGlmIChtVGh1bWIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRodW1iLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0QWxwaGEoYWxwaGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgIGdldFByb2dyZXNzRHJhd2FibGUoKS5zZXRBbHBoYShhbHBoYSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGh1bWIoRHJhd2FibGUgdGh1bWIpIHsKLSAgICAgICAgbVRodW1iID0gdGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIHRodW1iLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhpZGVUaHVtYihib29sZWFuIGhpZGVUaHVtYikgewotICAgICAgICBpZiAobUhpZGVUaHVtYiA9PSBoaWRlVGh1bWIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGlkZVRodW1iID0gaGlkZVRodW1iOwotICAgICAgICBzdXBlci5zZXRUaHVtYihtSGlkZVRodW1iID8gbnVsbCA6IG1UaHVtYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdm9sdW1lIHNsaWRlciBjb2xvci4gVGhlIGNoYW5nZSB0YWtlcyBlZmZlY3QgbmV4dCB0aW1lIGRyYXdhYmxlIHN0YXRlIGlzIGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvbG9yIGNhbm5vdCBiZSB0cmFuc2x1Y2VudCwgb3RoZXJ3aXNlIHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhciB3aWxsIGJlIHNlZW4gdGhyb3VnaAotICAgICAqIHRoZSB0aHVtYi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIGlmIChtQ29sb3IgPT0gY29sb3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlZvbHVtZSBzbGlkZXIgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50OiAjIiArIEludGVnZXIudG9IZXhTdHJpbmcoY29sb3IpKTsKLSAgICAgICAgfQotICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2YwNDJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLkNvbG9yVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci0KLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9DT05UUkFTVCA9IDMuMGY7Ci0KLSAgICBASW50RGVmKHtDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQsIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORH0pCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDb250cm9sbGVyQ29sb3JUeXBlIHt9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCA9IDB4REUwMDAwMDA7IC8qIE9wYWNpdHkgb2YgODclICovCi0gICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQgPSBDb2xvci5XSElURTsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBBcHBseSBiYXNlIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOwotCi0gICAgICAgIC8vIEFwcGx5IGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUuCi0gICAgICAgIGludCBzdHlsZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgc3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGFyZSB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIHByZXBhcmUKLSAgICAgKiB0aGUgY29udGV4dCBhbmQgdGhlbWUgZm9yIGEgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgKHRoZSBsYXR0ZXIgbWV0aG9kIHJlbGllcyBvbiB0aGUKLSAgICAgKiBmb3JtZXIgbWV0aG9kIHRvIHByb3Blcmx5IHByZXBhcmUgdGhlIGNvbnRleHQpOgotICAgICAqICAgc3VwZXIoY29udGV4dCA9IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoY29udGV4dCwgdGhlbWUpLAotICAgICAqICAgICAgICAgICBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShjb250ZXh0KSk7Ci0gICAgICoKLSAgICAgKiBJdCB3aWxsIGFwcGx5IHRoZW1lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHN0eWxlIGxvb2t1cHMgd2lsbCBiZSBkb25lIGluIHJldmVyc2UpOgotICAgICAqICAgMSkgQ3VycmVudCB0aGVtZQotICAgICAqICAgMikgU3VwcGxpZWQgdGhlbWUKLSAgICAgKiAgIDMpIEJhc2UgTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICogICA0KSBDdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLCBpZiBwcm92aWRlZAotICAgICAqLwotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUsIGJvb2xlYW4gYWxlcnREaWFsb2cpIHsKLSAgICAgICAgLy8gMSkgQ3VycmVudCB0aGVtZSBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGNvbnRleHQKLQotICAgICAgICAvLyAyKSBJZiBubyB0aGVtZSBpcyBzdXBwbGllZCwgbG9vayBpdCB1cCBmcm9tIHRoZSBjb250ZXh0IChkaWFsb2dUaGVtZS9hbGVydERpYWxvZ1RoZW1lKQotICAgICAgICBpZiAodGhlbWUgPT0gMCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICFhbGVydERpYWxvZyA/IGFuZHJvaWQuUi5hdHRyLmRpYWxvZ1RoZW1lIDogYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dUaGVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICAgQXBwbHkgaXQKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKTsKLQotICAgICAgICAvLyAzKSBJZiBhIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUgaXMgcHJvdmlkZWQgdGhlbiBhcHBseSB0aGUgYmFzZSB0aGVtZQotICAgICAgICBpZiAoZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLgotICAgIHN0YXRpYyBpbnQgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIDQpIEFwcGx5IHRoZSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICAgIGludCB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyAzKSBObyBjdXN0b20gTWVkaWFSb3V0ZXIgdGhlbWUgd2FzIHByb3ZpZGVkIHNvIGFwcGx5IHRoZSBiYXNlIHRoZW1lIGluc3RlYWQKLSAgICAgICAgICAgIHRoZW1lID0gZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0gICAgLy8gRU5ELiBQcmV2aW91cyB0d28gbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4KLQotICAgIHN0YXRpYyBpbnQgZ2V0VGhlbWVSZXNvdXJjZShDb250ZXh0IGNvbnRleHQsIGludCBhdHRyKSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpID8gdmFsdWUucmVzb3VyY2VJZCA6IDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZsb2F0IGdldERpc2FibGVkQWxwaGEoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuZGlzYWJsZWRBbHBoYSwgdmFsdWUsIHRydWUpCi0gICAgICAgICAgICAgICAgPyB2YWx1ZS5nZXRGbG9hdCgpIDogMC41ZjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQENvbnRyb2xsZXJDb2xvclR5cGUgaW50IGdldENvbnRyb2xsZXJDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gMHhGRjAwMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQsIHByaW1hcnlDb2xvcikKLSAgICAgICAgICAgICAgICA+PSBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIHJldHVybiBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldEJ1dHRvblRleHRDb2xvcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JCYWNrZ3JvdW5kKTsKLQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChwcmltYXJ5Q29sb3IsIGJhY2tncm91bmRDb2xvcikgPCBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY29sb3JBY2NlbnQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGxvdy4KLSAgICAgICAgICAgIHJldHVybiBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQWNjZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbG9yOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFZpZXcgbWFpbkNvbnRyb2xzLCBWaWV3IGdyb3VwQ29udHJvbHMsIGJvb2xlYW4gaGFzR3JvdXApIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IHByaW1hcnlEYXJrQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeURhcmspOwotICAgICAgICBpZiAoaGFzR3JvdXAgJiYgZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBzaG93aW5nIGRhcmsgY29udHJvbHMgaW4gYSBwb3NzaWJseSBkYXJrIChpLmUuIHRoZSBwcmltYXJ5IGRhcmspLCBtb2RlbAotICAgICAgICAgICAgLy8gdGhlIHdoaXRlIGRpYWxvZyBhbmQgdXNlIHRoZSBwcmltYXJ5IGNvbG9yIGZvciB0aGUgZ3JvdXAgY29udHJvbHMuCi0gICAgICAgICAgICBwcmltYXJ5RGFya0NvbG9yID0gcHJpbWFyeUNvbG9yOwotICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIH0KLSAgICAgICAgbWFpbkNvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5Q29sb3IpOwotICAgICAgICBncm91cENvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5RGFya0NvbG9yKTsKLSAgICAgICAgLy8gQWxzbyBzdG9yZSB0aGUgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGhlIHZpZXcgdGFncy4gVGhleSBhcmUgdXNlZCBpbgotICAgICAgICAvLyBzZXRWb2x1bWVTbGlkZXJDb2xvcigpIGJlbG93LgotICAgICAgICBtYWluQ29udHJvbHMuc2V0VGFnKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0VGFnKHByaW1hcnlEYXJrQ29sb3IpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldFZvbHVtZVNsaWRlckNvbG9yKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciwgVmlldyBiYWNrZ3JvdW5kVmlldykgewotICAgICAgICBpbnQgY29udHJvbGxlckNvbG9yID0gZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApOwotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29udHJvbGxlckNvbG9yKSAhPSAweEZGKSB7Ci0gICAgICAgICAgICAvLyBDb21wb3NpdGUgd2l0aCB0aGUgYmFja2dyb3VuZCBpbiBvcmRlciBub3QgdG8gc2hvdyB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHRodW1iLgotICAgICAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IChpbnQpIGJhY2tncm91bmRWaWV3LmdldFRhZygpOwotICAgICAgICAgICAgY29udHJvbGxlckNvbG9yID0gQ29sb3JVdGlscy5jb21wb3NpdGVDb2xvcnMoY29udHJvbGxlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHZvbHVtZVNsaWRlci5zZXRDb2xvcihjb250cm9sbGVyQ29sb3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWdodFRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgLy8gVE9ETyhzdW5nc29vKTogU3dpdGNoIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5pc0xpZ2h0VGhlbWUKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuc3VwcG9ydC52Ny5hcHBjb21wYXQuUi5hdHRyLmlzTGlnaHRUaGVtZSwKLSAgICAgICAgICAgICAgICB2YWx1ZSwgdHJ1ZSkgJiYgdmFsdWUuZGF0YSAhPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRUaGVtZUNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlLCBpbnQgYXR0cikgewotICAgICAgICBpZiAoc3R5bGUgIT0gMCkgewotICAgICAgICAgICAgaW50W10gYXR0cnMgPSB7IGF0dHIgfTsKLSAgICAgICAgICAgIFR5cGVkQXJyYXkgdGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoc3R5bGUsIGF0dHJzKTsKLSAgICAgICAgICAgIGludCBjb2xvciA9IHRhLmdldENvbG9yKDAsIDApOwotICAgICAgICAgICAgdGEucmVjeWNsZSgpOwotICAgICAgICAgICAgaWYgKGNvbG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgaWYgKHZhbHVlLnJlc291cmNlSWQgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IodmFsdWUucmVzb3VyY2VJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmRhdGE7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBnZXRSb3V0ZXJUaGVtZUlkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgdGhlbWVJZDsKLSAgICAgICAgaWYgKGlzTGlnaHRUaGVtZShjb250ZXh0KSkgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRfRGFya0NvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRDb250cm9sUGFuZWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGVtZUlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkZWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIExpc3RWaWV3IHdoaWNoIGhhcyBhbiBhZGRpdGlvbmFsIG92ZXJsYXkgbGF5ZXIuIHtAbGluayBCaXRtYXBEcmF3YWJsZX0KLSAqIGNhbiBiZSBhZGRlZCB0byB0aGUgbGF5ZXIgYW5kIGNhbiBiZSBhbmltYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE92ZXJsYXlMaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8T3ZlcmxheU9iamVjdD4gbU92ZXJsYXlPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3ZlcmxheU9iamVjdChPdmVybGF5T2JqZWN0IG9iamVjdCkgewotICAgICAgICBtT3ZlcmxheU9iamVjdHMuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGFsbCBhbmltYXRpb25zIG9mIG9iamVjdHMgaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0LmlzQW5pbWF0aW9uU3RhcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnN0YXJ0QW5pbWF0aW9uKGdldERyYXdpbmdUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wQW5pbWF0aW9uQWxsKCkgewotICAgICAgICBmb3IgKE92ZXJsYXlPYmplY3Qgb2JqZWN0IDogbU92ZXJsYXlPYmplY3RzKSB7Ci0gICAgICAgICAgICBvYmplY3Quc3RvcEFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtT3ZlcmxheU9iamVjdHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8T3ZlcmxheU9iamVjdD4gaXQgPSBtT3ZlcmxheU9iamVjdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBvYmplY3QuZ2V0Qml0bWFwRHJhd2FibGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYml0bWFwLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QudXBkYXRlKGdldERyYXdpbmdUaW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdCB0byBiZSBzaG93biBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlPYmplY3QgewotICAgICAgICBwcml2YXRlIEJpdG1hcERyYXdhYmxlIG1CaXRtYXA7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUN1cnJlbnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgUmVjdCBtQ3VycmVudEJvdW5kczsKLSAgICAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1TdGFydFJlY3Q7Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZWx0YVk7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVN0YXJ0QWxwaGEgPSAxLjBmOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1FbmRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uU3RhcnRlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvbkVuZGVkOwotICAgICAgICBwcml2YXRlIE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0KEJpdG1hcERyYXdhYmxlIGJpdG1hcCwgUmVjdCBzdGFydFJlY3QpIHsKLSAgICAgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7Ci0gICAgICAgICAgICBtU3RhcnRSZWN0ID0gc3RhcnRSZWN0OwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMgPSBuZXcgUmVjdChzdGFydFJlY3QpOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBiaXRtYXAgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEJpdG1hcERyYXdhYmxlIHRoYXQgdGhpcyBvYmplY3QgaGFzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJpdG1hcERyYXdhYmxlIGdldEJpdG1hcERyYXdhYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RhcnRlZCBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaGFzIHN0YXJ0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQW5pbWF0aW9uU3RhcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciB2YXJ5aW5nIGFscGhhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRBbHBoYSBTdGFydGluZyBhbHBoYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiwgd2hlcmUgMS4wIG1lYW5zCi0gICAgICAgICAqIGZ1bGx5IG9wYXF1ZSBhbmQgMC4wIG1lYW5zIGZ1bGx5IHRyYW5zcGFyZW50LgotICAgICAgICAgKiBAcGFyYW0gZW5kQWxwaGEgRW5kaW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbHBoYUFuaW1hdGlvbihmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgbVN0YXJ0QWxwaGEgPSBzdGFydEFscGhhOwotICAgICAgICAgICAgbUVuZEFscGhhID0gZW5kQWxwaGE7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuaW1hdGlvbiBmb3IgbW92aW5nIG9iamVjdHMgdmVydGljYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhWSBEaXN0YW5jZSB0byBtb3ZlIGluIHBpeGVscy4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihpbnQgZGVsdGFZKSB7Ci0gICAgICAgICAgICBtRGVsdGFZID0gZGVsdGFZOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgbGFzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgdGhpcyBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlcnBvbGF0b3IgVGhlIGludGVycG9sYXRvciB3aGljaCBkZWZpbmVzIHRoZSBhY2NlbGVyYXRpb24gY3VydmUKLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKLSAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCaW5kcyBhbiBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgYW5pbWF0aW9uIGVuZCBsaXN0ZW5lciB0byBiZSBub3RpZmllZC4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIoT25BbmltYXRpb25FbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgc2V0cyB0aGUgc3RhcnQgdGltZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIHRvIGJlIHNldCBpbiBNaWxsaXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKGxvbmcgc3RhcnRUaW1lKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gc3RhcnRUaW1lOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3RvcHMgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgY3VycmVudCBib3VuZHMgYW5kIGFscGhhIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQ3VycmVudCB0aW1lLmluIG1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGxvbmcgY3VycmVudFRpbWUpIHsKLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25FbmRlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRUaW1lID0gKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyAoZmxvYXQpIG1EdXJhdGlvbjsKLSAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgbm9ybWFsaXplZFRpbWUpKTsKLSAgICAgICAgICAgIGlmICghbUlzQW5pbWF0aW9uU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gMC4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGludGVycG9sYXRlZFRpbWUgPSAobUludGVycG9sYXRvciA9PSBudWxsKSA/IG5vcm1hbGl6ZWRUaW1lCi0gICAgICAgICAgICAgICAgICAgIDogbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKG5vcm1hbGl6ZWRUaW1lKTsKLSAgICAgICAgICAgIGludCBkZWx0YVkgPSAoaW50KSAobURlbHRhWSAqIGludGVycG9sYXRlZFRpbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMudG9wID0gbVN0YXJ0UmVjdC50b3AgKyBkZWx0YVk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy5ib3R0b20gPSBtU3RhcnRSZWN0LmJvdHRvbSArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50QWxwaGEgPSBtU3RhcnRBbHBoYSArIChtRW5kQWxwaGEgLSBtU3RhcnRBbHBoYSkgKiBpbnRlcnBvbGF0ZWRUaW1lOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25TdGFydGVkICYmIG5vcm1hbGl6ZWRUaW1lID49IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtSXNBbmltYXRpb25FbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAhbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYW5pbWF0aW9uIGxpc3RlbmVyIHRoYXQgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25BbmltYXRpb25FbmRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE5vdGlmaWVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzOWJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNykKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuTXIxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRQcmVzZW50YXRpb25EaXNwbGF5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHdhcwotICAgICAgICAgICAgLy8gYWRkZWQgaW4gQVBJIDE3LiBIb3dldmVyLCBzb21lIGZhY3RvcnkgcmVsZWFzZXMgb2YgSkIgTVIxIG1pc3NlZCBpdC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFByZXNlbnRhdGlvbkRpc3BsYXkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGdldCBwcmVzZW50YXRpb24gZGlzcGxheSBmb3IgdGhlIHJvdXRlLiIsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgdmVyc2lvbiBvZiBNZWRpYVJvdXRlci5hZGRDYWxsYmFjaygpIHRoYXQgYWNjZXB0cyBhCi0gICAgICogZmxhZyB0byBwZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIGRvZXMgbm90IGV4aXN0IGluIEpCIE1SMSBzbyB3ZSBuZWVkIHRvIGZvcmNlCi0gICAgICogd2lmaSBkaXNwbGF5IHNjYW5zIGRpcmVjdGx5IHRocm91Z2ggdGhlIERpc3BsYXlNYW5hZ2VyLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICAvLyBUaW1lIGJldHdlZW4gd2lmaSBkaXNwbGF5IHNjYW5zIHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcgaW4gbWlsbGlzZWNvbmRzLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwgPSAxNTAwMDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyIG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2NhbldpZmlEaXNwbGF5c01ldGhvZDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXM7Ci0KLSAgICAgICAgcHVibGljIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IChEaXNwbGF5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRElTUExBWV9TRVJWSUNFKTsKLSAgICAgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNjYW5XaWZpRGlzcGxheXNNZXRob2QgPSBEaXNwbGF5TWFuYWdlci5jbGFzcy5nZXRNZXRob2QoInNjYW5XaWZpRGlzcGxheXMiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMoaW50IHJvdXRlVHlwZXMpIHsKLSAgICAgICAgICAgIC8vIE9uIEpCIE1SMSwgdGhlcmUgaXMgbm8gQVBJIHRvIHNjYW4gd2lmaSBkaXNwbGF5IHJvdXRlcy4KLSAgICAgICAgICAgIC8vIEluc3RlYWQgd2UgbXVzdCBtYWtlIGEgZGlyZWN0IGNhbGwgaW50byB0aGUgRGlzcGxheU1hbmFnZXIgdG8gc2NhbgotICAgICAgICAgICAgLy8gd2lmaSBkaXNwbGF5cyBvbiB0aGlzIHZlcnNpb24gYnV0IG9ubHkgd2hlbiBsaXZlIHZpZGVvIHJvdXRlcyBhcmUgcmVxdWVzdGVkLgotICAgICAgICAgICAgLy8gU2VlIGFsc28gdGhlIEplbGx5YmVhbk1yMkltcGwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAvLyBUaGlzIHdhcyBmaXhlZCBpbiBKQiBNUjIgYnkgYWRkaW5nIGEgbmV3IG92ZXJsb2FkIG9mIGFkZENhbGxiYWNrKCkgdG8KLSAgICAgICAgICAgIC8vIGVuYWJsZSBhY3RpdmUgc2Nhbm5pbmcgb24gcmVxdWVzdC4KLSAgICAgICAgICAgIGlmICgocm91dGVUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cyBiZWNhdXNlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkRpc3BsYXlNYW5hZ2VyLnNjYW5XaWZpRGlzcGxheXMoKSBtZXRob2QgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub3QgYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZC5pbnZva2UobURpc3BsYXlNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQodGhpcywgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBpc0Nvbm5lY3RpbmcoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIElzQ29ubmVjdGluZ1dvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3RhdHVzQ29kZU1ldGhvZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0KLSAgICAgICAgcHVibGljIElzQ29ubmVjdGluZ1dvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmllbGQgc3RhdHVzQ29ubmVjdGluZ0ZpZWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldEZpZWxkKCJTVEFUVVNfQ09OTkVDVElORyIpOwotICAgICAgICAgICAgICAgIG1TdGF0dXNDb25uZWN0aW5nID0gc3RhdHVzQ29ubmVjdGluZ0ZpZWxkLmdldEludChudWxsKTsKLSAgICAgICAgICAgICAgICBtR2V0U3RhdHVzQ29kZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcy5nZXRNZXRob2QoImdldFN0YXR1c0NvZGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpZiAobUdldFN0YXR1c0NvZGVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXNDb2RlID0gKEludGVnZXIpbUdldFN0YXR1c0NvZGVNZXRob2QuaW52b2tlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSBub3QgY29ubmVjdGluZy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2tQcm94eTxUPiB7Ci0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDM1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgxOCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIyIHsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IGNhbGxiYWNrT2JqLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmosIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzQ29ubmVjdGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI1OWI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMTYpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbiI7Ci0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgPSAweDgwOwotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTID0gMHgxMDA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfT1VUX0JMVUVUT09USCA9IDB4ODAgfCAweDEwMCB8IDB4MjAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX0FVRElPID0gMHgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfTElWRV9WSURFTyA9IDB4MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX1VTRVIgPSAweDAwODAwMDAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1JPVVRFX1RZUEVTID0KLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8KLSAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9ST1VURVJfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBvdXQuYWRkKHJvdXRlci5nZXRSb3V0ZUF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2F0ZWdvcmllcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Q2F0ZWdvcnlDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldENhdGVnb3J5QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0ZWRSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZSkgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0U2VsZWN0ZWRSb3V0ZSh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuc2VsZWN0Um91dGUodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVJvdXRlQ2F0ZWdvcnkoT2JqZWN0IHJvdXRlck9iaiwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLCBib29sZWFuIGlzR3JvdXBhYmxlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVSb3V0ZUNhdGVnb3J5KG5hbWUsIGlzR3JvdXBhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnJlbW92ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFjayhWb2x1bWVDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZUNhbGxiYWNrUHJveHk8Vm9sdW1lQ2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBjaGVja1JvdXRlZFRvQmx1ZXRvb3RoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXVkaW9NYW5hZ2VyIGF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBhdWRpb01hbmFnZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgImdldERldmljZXNGb3JTdHJlYW0iLCBpbnQuY2xhc3MpOwotICAgICAgICAgICAgaW50IGRldmljZSA9IChJbnRlZ2VyKSBtZXRob2QuaW52b2tlKGF1ZGlvTWFuYWdlciwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICByZXR1cm4gKGRldmljZSAmIERFVklDRV9PVVRfQkxVRVRPT1RIKSAhPSAwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldFN0YXR1cyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDYXRlZ29yeShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRDYXRlZ29yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0SWNvbkRyYXdhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1R5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1N0cmVhbShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZU1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFRhZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWcoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgdGFnKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRUYWcodGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRHcm91cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXAoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVPYmogaW5zdGFuY2VvZiBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlR3JvdXAgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRHcm91cGVkUm91dGVzKE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cClncm91cE9iajsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdyb3VwLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGdyb3VwLmdldFJvdXRlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIG5hbWUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXR1cyhPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBzdGF0dXMpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqLCBEcmF3YWJsZSBpY29uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0SWNvbkRyYXdhYmxlKGljb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmosIGludCB0eXBlKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tUeXBlKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaiwgaW50IHN0cmVhbSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFBsYXliYWNrU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZU1heChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVNYXgodm9sdW1lTWF4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUhhbmRsaW5nKHZvbHVtZUhhbmRsaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVDYWxsYmFjayhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB2b2x1bWVDYWxsYmFja09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Wb2x1bWVDYWxsYmFjayl2b2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVtb3RlQ29udHJvbENsaWVudChPYmplY3Qgcm91dGVPYmosIE9iamVjdCByY2NPYmopIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRSZW1vdGVDb250cm9sQ2xpZW50KAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50KXJjY09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ2F0ZWdvcnkgewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCBjYXRlZ29yeU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldE5hbWUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFJvdXRlcyhvdXQpOwotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXBhYmxlKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5pc0dyb3VwYWJsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgZm9yIGxpbWl0YXRpb25zIG9mIHNlbGVjdFJvdXRlKCkgb24gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxlY3RSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2VsZWN0Um91dGVJbnRNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVJbnRNZXRob2QgPSBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RSb3V0ZUludCIsIGludC5jbGFzcywgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKLQotICAgICAgICAgICAgaW50IHJvdXRlVHlwZXMgPSByb3V0ZS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgUk9VVEVfVFlQRV9VU0VSKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi11c2VyIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAvLyBPbiBKQiBhbmQgSkIgTVIxLCB0aGUgc2VsZWN0Um91dGUoKSBBUEkgb25seSBzdXBwb3J0cyBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHVzZXIgcm91dGVzLiAgU28gaW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBoaWRkZW4gc2VsZWN0Um91dGVJbnQoKQotICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBvbiB0aGVzZSB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBsaW1pdGF0aW9uIHdhcyByZW1vdmVkIGluIEpCIE1SMi4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlSW50TWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZC5pbnZva2Uocm91dGVyLCB0eXBlcywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBzdWNjZXNzIQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIHBsYXRmb3JtIGlzIG1pc3NpbmcgdGhlIHNlbGVjdFJvdXRlSW50KCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1ldGhvZC4gIE1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRGVmYXVsdCBoYW5kbGluZy4KLSAgICAgICAgICAgIHJvdXRlci5zZWxlY3RSb3V0ZSh0eXBlcywgcm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBnZXREZWZhdWx0Um91dGUoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgMTYgfHwgQnVpbGQuVkVSU0lPTi5TREtfSU5UID4gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5jbGFzcy5nZXRNZXRob2QoImdldFN5c3RlbUF1ZGlvUm91dGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kLmludm9rZShyb3V0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCB0aGUgbWV0aG9kIG9yIGl0IGRvZXMgbm90IHdvcmsuCi0gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHJvdXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLSAgICAgICAgICAgIHJldHVybiByb3V0ZXIuZ2V0Um91dGVBdCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBUIG1DYWxsYmFjazsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgaW50IHR5cGUsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZCh0eXBlLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAsIGludCBpbmRleCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVHcm91cGVkKHJvdXRlLCBncm91cCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVVuZ3JvdXBlZChyb3V0ZSwgZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFZvbHVtZUNhbGxiYWNrUHJveHk8VCBleHRlbmRzIFZvbHVtZUNhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVTZXRSZXF1ZXN0KHJvdXRlLCB2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KHJvdXRlLCBkaXJlY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDllNzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIG1lZGlhIGNvbnRyb2wgaW50ZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBkZWNsYXJlcyBhIHNldCBvZiBzdGFuZGFyZCBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIGFuZCBhY3Rpb25zIHRoYXQKLSAqIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGlkZW50aWZ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgbWVkaWEgcm91dGVzIGFuZCBjb250cm9sIHRoZW0uCi0gKiA8L3A+Ci0gKgotICogPGgzPk1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXM8L2gzPgotICogPHA+Ci0gKiBNZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIHNwZWNpZnkgbWVhbnMgYnkgd2hpY2ggYXBwbGljYXRpb25zIGNhbgotICogc2VuZCBtZWRpYSB0byB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZS4gIENhdGVnb3JpZXMgYXJlIHNvbWV0aW1lcyByZWZlcnJlZAotICogdG8gYXMgZGVzY3JpYmluZyAidHlwZXMiIG9yICJraW5kcyIgb2Ygcm91dGVzLgotICogPC9wPjxwPgotICogRm9yIGV4YW1wbGUsIGlmIGEgcm91dGUgc3VwcG9ydHMgdGhlIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFjayBjYXRlZ29yeX0sCi0gKiB0aGVuIGFuIGFwcGxpY2F0aW9uIGNhbiBhc2sgaXQgdG8gcGxheSBtZWRpYSByZW1vdGVseSBieSBzZW5kaW5nIGEKLSAqIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBpbnRlbnQgd2l0aCB0aGUgVXJpIG9mIHRoZQotICogbWVkaWEgY29udGVudCB0byBwbGF5LiAgU3VjaCBhIHJvdXRlIG1heSB0aGVuIGJlIHJlZmVycmVkIHRvIGFzCi0gKiBhICJyZW1vdGUgcGxheWJhY2sgcm91dGUiIGJlY2F1c2UgaXQgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzLiAgSXQgaXMgY29tbW9uCi0gKiBmb3IgYSByb3V0ZSB0byBzdXBwb3J0IG11bHRpcGxlIGNhdGVnb3JpZXMgb2YgcmVxdWVzdHMgYXQgdGhlIHNhbWUgdGltZSwgc3VjaCBhcwotICogbGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlby4KLSAqIDwvcD48cD4KLSAqIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgcm91dGUgY2F0ZWdvcmllcyBhcmUgZGVmaW5lZC4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX0FVRElPIExpdmUgYXVkaW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgYXVkaW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIGF1ZGlvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIHNwZWFrZXJzCi0gKiBhbmQgQmx1ZXRvb3RoIGhlYWRzZXRzLgotICogPGxpPntAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBMaXZlIHZpZGVvfTogVGhlIHJvdXRlIHN1cHBvcnRzIHN0cmVhbWluZyBsaXZlIHZpZGVvCi0gKiBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiAgTGl2ZSB2aWRlbyByb3V0ZXMgaW5jbHVkZSBsb2NhbCBkaXNwbGF5cwotICogYW5kIHdpcmVsZXNzIGRpc3BsYXlzIHRoYXQgc3VwcG9ydCBtaXJyb3JpbmcgYW5kCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9LiAgTGl2ZSB2aWRlbyByb3V0ZXMgdHlwaWNhbGx5IGFsc28KLSAqIHN1cHBvcnQgbGl2ZSBhdWRpbyBjYXBhYmlsaXRpZXMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfTogVGhlIHJvdXRlIHN1cHBvcnRzIHNlbmRpbmcKLSAqIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyBmb3IgbWVkaWEgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24uICBUaGUgY29udGVudCB0byBiZQotICogcGxheWVkIGlzIGlkZW50aWZpZWQgYnkgYSBVcmkgYW5kIG1pbWUtdHlwZS4KLSAqIDwvdWw+PHA+Ci0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGRlZmluZSBjdXN0b20gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBvZiB0aGVpciBvd24gaW4KLSAqIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBvbmVzLiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHZhcmlldHkKLSAqIG9mIGZlYXR1cmVzIHRvIGFwcGxpY2F0aW9ucyB0aGF0IHJlY29nbml6ZSBhbmQga25vdyBob3cgdG8gdXNlIHRoZW0uICBGb3IgZXhhbXBsZSwKLSAqIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWlnaHQgZGVmaW5lIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGluZGljYXRlIHRoYXQgaXRzIHJvdXRlcwotICogc3VwcG9ydCBhIHNwZWNpYWwgZGV2aWNlLXNwZWNpZmljIGNvbnRyb2wgaW50ZXJmYWNlIGluIGFkZGl0aW9uIHRvIG90aGVyCi0gKiBzdGFuZGFyZCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHdoaWNoIGNhdGVnb3JpZXMgYSByb3V0ZSBzdXBwb3J0cyBieSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5fQotICogb3Ige0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0Q29udHJvbEZpbHRlcnN9Ci0gKiBtZXRob2RzLiAgQXBwbGljYXRpb25zIGNhbiBhbHNvIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHJvdXRlcyB0aGF0IHRoZXkgd2FudCB0byB1c2UgYnkKLSAqIGNyZWF0aW5nIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfSB0aGF0IGNvbnRhaW4gdGhlIGRlc2lyZWQKLSAqIGNhdGVnb3JpZXMgYW5kIGFyZSB1c2VkIHRvIGZpbHRlciByb3V0ZXMgaW4gc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgbWVkaWEgcm91dGVyIEFQSS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9uczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgc3BlY2lmeSBwYXJ0aWN1bGFyIGZ1bmN0aW9ucyB0aGF0IGFwcGxpY2F0aW9ucwotICogY2FuIGFzayB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZSB0byBwZXJmb3JtLiAgTWVkaWEgcm91dGUgY29udHJvbCByZXF1ZXN0cwotICogdGFrZSB0aGUgZm9ybSBvZiBpbnRlbnRzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gb3RoZXIgaW50ZW50cyB1c2VkIHRvIHN0YXJ0IGFjdGl2aXRpZXMKLSAqIG9yIHNlbmQgYnJvYWRjYXN0cy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWVkaWEgY29udHJvbCBpbnRlbnRzIGFyZSBkaXJlY3RlZCB0bwotICogcm91dGVzIHJhdGhlciB0aGFuIGFjdGl2aXR5IG9yIGJyb2FkY2FzdCByZWNlaXZlciBjb21wb25lbnRzLgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSByb3V0ZSBjb250cm9sIGludGVudCBzcGVjaWZpZXMgYW4gYWN0aW9uLCBhIGNhdGVnb3J5IGFuZCBzb21lIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gKiB0aGF0IGFyZSBzdXBwbGllZCBhcyBleHRyYXMuICBBcHBsaWNhdGlvbnMgc2VuZCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIHJvdXRlcyB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IE1lZGlhUm91dGVyLlJvdXRlSW5mby5zZW5kQ29udHJvbFJlcXVlc3R9Ci0gKiBtZXRob2QgYW5kIHJlY2VpdmUgcmVzdWx0cyB2aWEgYSBjYWxsYmFjay4KLSAqIDwvcD48cD4KLSAqIEFsbCBtZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMKLSAqIHRoYXQgc3VwcG9ydCB0aGVtLiAgVGh1cyBvbmx5IHJlbW90ZSBwbGF5YmFjayByb3V0ZXMgbWF5IHBlcmZvcm0gcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGFjdGlvbiBzcGVjaWZpZXMgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoZSBhY3Rpb24gYmVsb25ncywKLSAqIHRoZSBwYXJhbWV0ZXJzIGl0IHJlcXVpcmVzLCBhbmQgdGhlIHJlc3VsdHMgaXQgcmV0dXJucy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlbyByb3V0ZXM8L2gzPgotICogPHA+Ci0gKiB7QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb30gYW5kIHtAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfQotICogcm91dGVzIHByZXNlbnQgbWVkaWEgdXNpbmcgc3RhbmRhcmQgc3lzdGVtIGludGVyZmFjZXMgc3VjaCBhcyBhdWRpbyBzdHJlYW1zLAotICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb25zfSBvciBkaXNwbGF5IG1pcnJvcmluZy4gIFRoZXNlIHJvdXRlcyBhcmUKLSAqIHRoZSBlYXNpZXN0IHRvIHVzZSBiZWNhdXNlIGFwcGxpY2F0aW9ucyBzaW1wbHkgcmVuZGVyIGNvbnRlbnQgbG9jYWxseSBvbiB0aGUgZGV2aWNlCi0gKiBhbmQgdGhlIHN5c3RlbSBzdHJlYW1zIGl0IHRvIHRoZSByb3V0ZSBkZXN0aW5hdGlvbiBhdXRvbWF0aWNhbGx5LgotICogPC9wPjxwPgotICogSW4gbW9zdCBjYXNlcywgYXBwbGljYXRpb25zIGNhbiBzdHJlYW0gY29udGVudCB0byBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlcyBpbgotICogdGhlIHNhbWUgd2F5IHRoZXkgd291bGQgcGxheSB0aGUgY29udGVudCBsb2NhbGx5IHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbi4gIEhvd2V2ZXIsCi0gKiBhcHBsaWNhdGlvbnMgbWF5IGFsc28gYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiBtb3JlIHNvcGhpc3RpY2F0ZWQgZmVhdHVyZXMgc3VjaAotICogYXMgc2Vjb25kLXNjcmVlbiBwcmVzZW50YXRpb24gQVBJcyB0aGF0IGFyZSBwYXJ0aWN1bGFyIHRvIHRoZXNlIHJvdXRlcy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UmVtb3RlIHBsYXliYWNrIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIFJlbW90ZSBwbGF5YmFja30gcm91dGVzIHByZXNlbnQgbWVkaWEgcmVtb3RlbHkKLSAqIGJ5IHBsYXlpbmcgY29udGVudCBmcm9tIGEgVXJpLgotICogVGhlc2Ugcm91dGVzIGRlc3RpbmF0aW9ucyB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBmZXRjaGluZyBhbmQgcmVuZGVyaW5nIGNvbnRlbnQKLSAqIG9uIHRoZWlyIG93bi4gIEFwcGxpY2F0aW9ucyBkbyBub3QgcmVuZGVyIHRoZSBjb250ZW50IHRoZW1zZWx2ZXM7IGluc3RlYWQsIGFwcGxpY2F0aW9ucwotICogc2VuZCBjb250cm9sIHJlcXVlc3RzIHRvIGluaXRpYXRlIHBsYXksIHBhdXNlLCByZXN1bWUsIG9yIHN0b3AgbWVkaWEgaXRlbXMgYW5kIHJlY2VpdmUKLSAqIHN0YXR1cyB1cGRhdGVzIGFzIHRoZXkgY2hhbmdlIHN0YXRlLgotICogPC9wPgotICoKLSAqIDxoND5TZXNzaW9uczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggcmVtb3RlIG1lZGlhIHBsYXliYWNrIGFjdGlvbiBpcyBjb25kdWN0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHNlc3Npb24uCi0gKiBTZXNzaW9ucyBhcmUgdXNlZCB0byBwcmV2ZW50IGFwcGxpY2F0aW9ucyBmcm9tIGFjY2lkZW50YWxseSBpbnRlcmZlcmluZyB3aXRoIG9uZQotICogYW5vdGhlciBiZWNhdXNlIGF0IG1vc3Qgb25lIHNlc3Npb24gY2FuIGJlIHZhbGlkIGF0IGEgdGltZS4KLSAqIDwvcD48cD4KLSAqIEEgc2Vzc2lvbiBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9uIGFjdGlvbn0KLSAqIGFuZCB0ZXJtaW5hdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbiBhY3Rpb259IHdoZW4gdGhlCi0gKiByb3V0ZSBwcm92aWRlcyBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMuCi0gKiA8L3A+PHA+Ci0gKiBFeHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgd2FzIGFkZGVkIGluIGEgbGF0ZXIgcmV2aXNpb24gb2YgdGhlIHByb3RvY29sIHNvIG5vdAotICogYWxsIHJvdXRlcyBzdXBwb3J0IGl0LiAgSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiB0aGVuIGltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBtYXkgc3RpbGwgYmUgdXNlZC4gIEltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudAotICogcmVsaWVzIG9uIHRoZSB1c2Ugb2YgdGhlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gYW5kIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0KLSAqIGFjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2lkZS1lZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiBpZiBub25lIGlzIHByb3ZpZGVkCi0gKiBhcyBhcmd1bWVudC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCB0aGUgcHJldmlvdXMgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCBhbmQgYW55IG9uZ29pbmcKLSAqIG1lZGlhIHBsYXliYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIHBlcmZvcm1lZC4gIEFueSBhdHRlbXB0Ci0gKiB0byB1c2UgYW4gaW52YWxpZGF0ZWQgc2Vzc2lvbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIChQcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKLSAqIGFyZSBlbmNvdXJhZ2VkIHRvIGFnZ3Jlc3NpdmVseSBkaXNjYXJkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnZhbGlkYXRlZCBzZXNzaW9ucwotICogc2luY2UgaXQgaXMgbm8gbG9uZ2VyIG9mIHVzZS4pCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIHNlc3Npb24gaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBzZXNzaW9uIGlkIHRoYXQgbWF5IGJlIHVzZWQgdG8gY29udHJvbAotICogdGhlIHNlc3Npb24gdXNpbmcgYWN0aW9ucyBzdWNoIGFzIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIGVuZCBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5NZWRpYSBpdGVtczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc3VjY2Vzc2Z1bCB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uCi0gKiByZXR1cm5zIGEgdW5pcXVlIG1lZGlhIGl0ZW0gaWQgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIG1vbml0b3IgYW5kIGNvbnRyb2wKLSAqIHBsYXliYWNrLiAgVGhlIG1lZGlhIGl0ZW0gaWQgbWF5IGJlIHBhc3NlZCB0byBvdGhlciBhY3Rpb25zIHN1Y2ggYXMKLSAqIHtAbGluayAjQUNUSU9OX1NFRUsgc2Vla30gb3Ige0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfS4gIEl0IHdpbGwgYWxzbyBhcHBlYXIKLSAqIGFzIGEgcGFyYW1ldGVyIGluIHN0YXR1cyB1cGRhdGUgYnJvYWRjYXN0cyB0byBpZGVudGlmeSB0aGUgYXNzb2NpYXRlZCBwbGF5YmFjayByZXF1ZXN0LgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSBpdGVtIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC4gIFRoZXJlZm9yZSBtZWRpYSBpdGVtCi0gKiBpZHMgYXJlIG9ubHkgZXZlciB1c2VkIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbiBpZHMuICBNZWRpYSBpdGVtIGlkcyBhcmUgbWVhbmluZ2xlc3MKLSAqIG9uIHRoZWlyIG93bi4gIFdoZW4gdGhlIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQsIGFsbCBvZiBpdHMgbWVkaWEgaXRlbXMgYXJlIGFsc28KLSAqIGludmFsaWRhdGVkLgotICogPC9wPgotICoKLSAqIDxoND5UaGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBFYWNoIHNlc3Npb24gaGFzIGl0cyBvd24gcGxheWJhY2sgcXVldWUgdGhhdCBjb25zaXN0cyBvZiB0aGUgbWVkaWEgaXRlbXMgdGhhdAotICogYXJlIHBlbmRpbmcsIHBsYXlpbmcsIGJ1ZmZlcmluZyBvciBwYXVzZWQuICBJdGVtcyBhcmUgYWRkZWQgdG8gdGhlIHF1ZXVlIHdoZW4KLSAqIGEgcGxheWJhY2sgcmVxdWVzdCBpcyBpc3N1ZWQuICBJdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB3aGVuIHRoZXkgYXJlIG5vCi0gKiBsb25nZXIgZWxpZ2libGUgZm9yIHBsYXliYWNrIChlbnRlciB0ZXJtaW5hbCBzdGF0ZXMpLgotICogPC9wPjxwPgotICogQXMgZGVzY3JpYmVkIGluIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBjbGFzcywgbWVkaWEgaXRlbXMgaW5pdGlhbGx5Ci0gKiBzdGFydCBpbiBhIHBlbmRpbmcgc3RhdGUsIHRyYW5zaXRpb24gdG8gdGhlIHBsYXlpbmcgKG9yIGJ1ZmZlcmluZyBvciBwYXVzZWQpIHN0YXRlCi0gKiBkdXJpbmcgcGxheWJhY2ssIGFuZCBlbmQgaW4gYSBmaW5pc2hlZCwgY2FuY2VsZWQsIGludmFsaWRhdGVkIG9yIGVycm9yIHN0YXRlLgotICogT25jZSB0aGUgY3VycmVudCBpdGVtIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlLCBwbGF5YmFjayBwcm9jZWVkcyBvbiB0byB0aGUKLSAqIG5leHQgaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgYnkgY2hlY2tpbmcKLSAqIHdoZXRoZXIgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgcm91dGUncyBjb250cm9sIGZpbHRlcgotICogdXNpbmcge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0IFJvdXRlSW5mby5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcm91dGUgcHJvbWlzZXMKLSAqIHRvIGFsbG93IGF0IGxlYXN0IHR3byBpdGVtcyAocG9zc2libHkgbW9yZSkgdG8gYmUgZW5xdWV1ZWQgYXQgYSB0aW1lLiAgRW5xdWV1ZWQgaXRlbXMgcGxheQotICogYmFjayB0byBiYWNrIG9uZSBhZnRlciB0aGUgb3RoZXIgYXMgdGhlIHByZXZpb3VzIGl0ZW0gY29tcGxldGVzLiAgSWRlYWxseSB0aGVyZSBzaG91bGQKLSAqIGJlIG5vIGF1ZGlibGUgcGF1c2UgYmV0d2VlbiBpdGVtcyBmb3Igc3RhbmRhcmQgYXVkaW8gY29udGVudCB0eXBlcy4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcm91dGUsIHRoZW4gdGhlIHF1ZXVlCi0gKiBlZmZlY3RpdmVseSBjb250YWlucyBhdCBtb3N0IG9uZSBpdGVtIGF0IGEgdGltZS4gIEVhY2ggcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YKLSAqIGNsZWFyaW5nIHRoZSBxdWV1ZSBhbmQgcmVzZXR0aW5nIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIG5leHQgaXRlbSBpcyBwbGF5ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PkltcGFjdCBvZiBwYXVzZSwgcmVzdW1lLCBzdG9wIGFuZCBwbGF5IGFjdGlvbnMgb24gdGhlIHBsYXliYWNrIHF1ZXVlPC9oND4KLSAqIDxwPgotICogVGhlIHBhdXNlLCByZXN1bWUgYW5kIHN0b3AgYWN0aW9ucyBhZmZlY3QgdGhlIHNlc3Npb24ncyB3aG9sZSBxdWV1ZS4gIFBhdXNlIGNhdXNlcwotICogdGhlIHBsYXliYWNrIHF1ZXVlIHRvIGJlIHN1c3BlbmRlZCBubyBtYXR0ZXIgd2hpY2ggaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAqIFJlc3VtZSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBwYXVzZS4gIFN0b3AgY2xlYXJzIHRoZSBxdWV1ZSBhbmQgYWxzbyByZXNldHMKLSAqIHRoZSBwYXVzZSBmbGFnIGp1c3QgbGlrZSByZXN1bWUuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgZWFybGllciwgdGhlIHBsYXkgYWN0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZQotICogYW5kIGNvbXBsZXRlbHkgcmVzZXR0aW5nIGl0cyBzdGF0ZSAobGlrZSB0aGUgc3RvcCBhY3Rpb24pIHRoZW4gZW5xdWV1aW5nIGEKLSAqIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4gIFBsYXkgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQKLSAqIHRvIHN0b3AgZm9sbG93ZWQgYnkgYW4gYWN0aW9uIHRvIGVucXVldWUgYW4gaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBwbGF5IGFjdGlvbiBpcyBhbHNvIHNwZWNpYWwgaW4gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHNlc3Npb25zLgotICogQW4gYXBwbGljYXRpb24gd2l0aCBzaW1wbGUgbmVlZHMgbWF5IGZpbmQgdGhhdCBpdCBvbmx5IG5lZWRzIHRvIHVzZSBwbGF5Ci0gKiAoYW5kIG9jY2FzaW9uYWxseSBzdG9wKSB0byBjb250cm9sIHBsYXliYWNrLgotICogPC9wPgotICoKLSAqIDxoND5SZXNvbHZpbmcgY29uZmxpY3RzIGJldHdlZW4gYXBwbGljYXRpb25zPC9oND4KLSAqIDxwPgotICogV2hlbiBhbiBhcHBsaWNhdGlvbiBoYXMgYSB2YWxpZCBzZXNzaW9uLCBpdCBpcyBlc3NlbnRpYWxseSBpbiBjb250cm9sIG9mIHJlbW90ZSBwbGF5YmFjawotICogb24gdGhlIHJvdXRlLiAgTm8gb3RoZXIgYXBwbGljYXRpb24gY2FuIHZpZXcgb3IgbW9kaWZ5IHRoZSByZW1vdGUgcGxheWJhY2sgc3RhdGUKLSAqIG9mIHRoYXQgYXBwbGljYXRpb24ncyBzZXNzaW9uIHdpdGhvdXQga25vd2luZyBpdHMgaWQuCi0gKiA8L3A+PHA+Ci0gKiBIb3dldmVyLCBvdGhlciBhcHBsaWNhdGlvbnMgY2FuIHBlcmZvcm0gYWN0aW9ucyB0aGF0IGhhdmUgdGhlIGVmZmVjdCBvZiBzdG9wcGluZwotICogcGxheWJhY2sgYW5kIGludmFsaWRhdGluZyB0aGUgY3VycmVudCBzZXNzaW9uLiAgV2hlbiB0aGlzIG9jY3VycywgdGhlIGZvcm1lciBhcHBsaWNhdGlvbgotICogd2lsbCBiZSBpbmZvcm1lZCB0aGF0IGl0IGhhcyBsb3N0IGNvbnRyb2wgYnkgd2F5IG9mIGluZGl2aWR1YWwgbWVkaWEgaXRlbSBzdGF0dXMKLSAqIHVwZGF0ZSBicm9hZGNhc3RzIHRoYXQgaW5kaWNhdGUgdGhhdCBpdHMgcXVldWVkIG1lZGlhIGl0ZW1zIGhhdmUgYmVjb21lCi0gKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfS4gIFRoaXMgYnJvYWRjYXN0Ci0gKiBpbXBsaWVzIHRoYXQgcGxheWJhY2sgd2FzIHRlcm1pbmF0ZWQgYWJub3JtYWxseSBieSBhbiBleHRlcm5hbCBjYXVzZS4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBzaG91bGQgaGFuZGxlIGNvbmZsaWN0cyBjb25zZXJ2YXRpdmVseSB0byBhbGxvdyBvdGhlciBhcHBsaWNhdGlvbnMgdG8KLSAqIHNtb290aGx5IGFzc3VtZSBjb250cm9sIG92ZXIgdGhlIHJvdXRlLiAgV2hlbiBhIGNvbmZsaWN0IG9jY3VycywgdGhlIGN1cnJlbnRseSBwbGF5aW5nCi0gKiBhcHBsaWNhdGlvbiBzaG91bGQgcmVsZWFzZSBpdHMgc2Vzc2lvbiBhbmQgYWxsb3cgdGhlIG5ldyBhcHBsaWNhdGlvbiB0byB1c2UgdGhlCi0gKiByb3V0ZSB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIHVzZXIgaW50ZXJ2ZW5lcyB0byB0YWtlIG92ZXIgdGhlIHJvdXRlIGFnYWluIGFuZCBiZWdpbgotICogYSBuZXcgcGxheWJhY2sgc2Vzc2lvbi4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+QmFzaWMgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYmFzaWMgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IGFsbCByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcy4gIFRoZXNlIGFjdGlvbnMgZm9ybSB0aGUgYmFzaXMgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbAotICogYW5kIGFyZSByZXF1aXJlZCBpbiBhbGwgaW1wbGVtZW50YXRpb25zLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QTEFZIFBsYXl9OiBTdGFydHMgcGxheWluZyBjb250ZW50IHNwZWNpZmllZCBieSBhIGdpdmVuIFVyaQotICogYW5kIHJldHVybnMgYSBuZXcgbWVkaWEgaXRlbSBpZCB0byBkZXNjcmliZSB0aGUgcmVxdWVzdC4gIEltcGxpY2l0bHkgY3JlYXRlcyBhIG5ldwotICogc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlkIHdhcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU0VFSyBTZWVrfTogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBvZiBhIHNwZWNpZmljIG1lZGlhIGl0ZW0uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBHZXQgc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbQotICogaW5jbHVkaW5nIHRoZSBpdGVtJ3MgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBhbmQgcHJvZ3Jlc3MuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUEFVU0UgUGF1c2V9OiBQYXVzZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFU1VNRSBSZXN1bWV9OiBSZXN1bWVzIHBsYXliYWNrIG9mIHRoZSBxdWV1ZS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TVE9QIFN0b3B9OiBTdG9wcyBwbGF5YmFjaywgY2xlYXJzIHRoZSBxdWV1ZSwgYW5kIHJlc2V0cyB0aGUKLSAqIHBhdXNlIHN0YXRlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+UXVldWUgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgcXVldWUgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgcXVldWluZyBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX0VOUVVFVUUgRW5xdWV1ZX06IEVucXVldWVzIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9SRU1PVkUgUmVtb3ZlfTogUmVtb3ZlcyBhIHNwZWNpZmllZCBtZWRpYSBpdGVtIGZyb20gdGhlIHF1ZXVlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+U2Vzc2lvbiBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBzZXNzaW9uIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcyB0aGF0IG9mZmVyIG9wdGlvbmFsIHNlc3Npb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT04gU3RhcnQgc2Vzc2lvbn06IFN0YXJ0cyBhIG5ldyBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTIEdldCBzZXNzaW9uIHN0YXR1c306IEdldHMgdGhlIHN0YXR1cyBvZiBhIHNlc3Npb24uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5EX1NFU1NJT04gRW5kIHNlc3Npb259OiBFbmRzIGEgc2Vzc2lvbiBleHBsaWNpdGx5LgotICogPC91bD4KLSAqCi0gKiA8aDQ+SW1wbGVtZW50YXRpb24gbm90ZTwvaDQ+Ci0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIG11c3QgaW1wbGVtZW50IDxlbT5hbGw8L2VtPiBvZiB0aGUKLSAqIGRvY3VtZW50ZWQgYWN0aW9ucywgcGFyYW1ldGVycyBhbmQgcmVzdWx0cy4gIE5vdGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGZyb20KLSAqIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIGNsaWVudCBvZiB0aGUgcHJvdG9jb2wuICBJbiBwYXJ0aWN1bGFyLCB3aGVuZXZlciBhIHBhcmFtZXRlcgotICogaXMgZGVzY3JpYmVkIGFzIGJlaW5nICJvcHRpb25hbCIsIGl0IGlzIG9ubHkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGNsaWVudC4KLSAqIENvbXBsaWFudCBtZWRpYSByb3V0ZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBwcm90b2NvbCBtdXN0IHN1cHBvcnQgYWxsCi0gKiBvZiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkIGhlcmVpbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbEludGVudCB7Ci0gICAgLyogUm91dGUgY2F0ZWdvcmllcy4gKi8KLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgYXVkaW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgYXVkaW8gcm91dGluZyB3aWxsIGFsbG93IHRoZSBtZWRpYSBhdWRpbyBzdHJlYW0KLSAgICAgKiB0byBiZSBzZW50IHRvIHN1cHBvcnRlZCBkZXN0aW5hdGlvbnMuICBUaGlzIGNhbiBpbmNsdWRlIGludGVybmFsIHNwZWFrZXJzIG9yCi0gICAgICogYXVkaW8gamFja3Mgb24gdGhlIGRldmljZSBpdHNlbGYsIEEyRFAgZGV2aWNlcywgYW5kIG1vcmUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIGF1ZGlvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyByb3V0aW5nIGlzIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBBbGwgYXVkaW8gcGxheWVkIG9uIHRoZSBtZWRpYSBzdHJlYW0gd2lsbCBiZSByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIGF1ZGlvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTElWRV9BVURJTyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5MSVZFX0FVRElPIjsKLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgdmlkZW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgdmlkZW8gcm91dGluZyB3aWxsIGFsbG93IGEgbWlycm9yZWQgdmVyc2lvbgotICAgICAqIG9mIHRoZSBkZXZpY2UncyBwcmltYXJ5IGRpc3BsYXkgb3IgYSBjdXN0b21pemVkCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkCi0gICAgICogZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIGEgbGl2ZSB2aWRlbyByb3V0ZSBpcyBzZWxlY3RlZCwgYXVkaW8gYW5kIHZpZGVvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQKLSAgICAgKiB0byB0aGUgYXBwbGljYXRpb24uICBCeSBkZWZhdWx0LCBhdWRpbyBhbmQgdmlkZW8gaXMgcm91dGVkIHRvIHRoZSBzZWxlY3RlZAotICAgICAqIGRlc3RpbmF0aW9uLiAgRm9yIGNlcnRhaW4gbGl2ZSB2aWRlbyByb3V0ZXMsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyB1c2UgYQotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gUHJlc2VudGF0aW9ufSB0byByZXBsYWNlIHRoZSBtaXJyb3JlZCB2aWV3Ci0gICAgICogb24gdGhlIGV4dGVybmFsIGRpc3BsYXkgd2l0aCBkaWZmZXJlbnQgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgbGl2ZSB2aWRlbyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICogQHNlZSBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX1ZJREVPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfVklERU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogUmVtb3RlIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcm91dGluZyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHNlbmQKLSAgICAgKiByZXF1ZXN0cyB0byBwbGF5IGNvbnRlbnQgcmVtb3RlbHkgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVtb3RlIHBsYXliYWNrIHJvdXRlcyBkZXN0aW5hdGlvbnMgb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBsb2NhbCBkZXZpY2UuCi0gICAgICogV2hlbiBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjb250cm9sIHRoZSBjb250ZW50Ci0gICAgICogcGxheWluZyBvbiB0aGUgZGVzdGluYXRpb24gYnkgc2VuZGluZyBtZWRpYSBjb250cm9sIGFjdGlvbnMgdG8gdGhlIHJvdXRlLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGZyb20gdGhlIHJvdXRlIHJlZ2FyZGluZwotICAgICAqIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgcmVtb3RlIHBsYXliYWNrIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LlJFTU9URV9QTEFZQkFDSyI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCBpbmRpdmlkdWFsIGl0ZW1zLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQbGF5IG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBzdGFydCBwbGF5aW5nIGNvbnRlbnQgd2l0aAotICAgICAqIHRoZSB7QGxpbmsgVXJpfSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBJbnRlbnR9J3Mge0BsaW5rIEludGVudCNnZXREYXRhKCkgZGF0YSB1cml9LgotICAgICAqIFRoZSBhY3Rpb24gcmV0dXJucyBhIG1lZGlhIHNlc3Npb24gaWQgYW5kIG1lZGlhIGl0ZW0gaWQgd2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgKiB0byBjb250cm9sIHBsYXliYWNrIHVzaW5nIG90aGVyIHJlbW90ZSBwbGF5YmFjayBhY3Rpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBPbmNlIGluaXRpYXRlZCwgcGxheWJhY2sgb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHdpbGwgYmUgbWFuYWdlZCBpbmRlcGVuZGVudGx5Ci0gICAgICogYnkgdGhlIGRlc3RpbmF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhcyB0aGUgc3RhdGUKLSAgICAgKiBvZiB0aGUgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgZGF0YSB1cmkgc3BlY2lmaWVzIGFuIEhUVFAgb3IgSFRUUFMgc2NoZW1lLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBpcwotICAgICAqIHJlc3BvbnNpYmxlIGZvciBmb2xsb3dpbmcgSFRUUCByZWRpcmVjdHMgdG8gYSByZWFzb25hYmxlIGRlcHRoIG9mIGF0IGxlYXN0IDMKLSAgICAgKiBsZXZlbHMgYXMgbWlnaHQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgYSB3ZWIgYnJvd3Nlci4gIElmIGFuIEhUVFAgZXJyb3IKLSAgICAgKiBvY2N1cnMsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIHNob3VsZCBzZW5kIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMgdXBkYXRlfQotICAgICAqIGJhY2sgdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfQotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjZ2V0UGxheWJhY2tTdGF0ZSgpIHBsYXliYWNrIHN0YXRlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+T25lIGl0ZW0gYXQgYSB0aW1lPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIHN1Y2Nlc3NmdWwgcGxheSBhY3Rpb24gPGVtPnJlcGxhY2VzPC9lbT4gdGhlIHByZXZpb3VzIHBsYXkgYWN0aW9uLgotICAgICAqIElmIGFuIGl0ZW0gaXMgYWxyZWFkeSBwbGF5aW5nLCB0aGVuIGl0IGlzIGNhbmNlbGVkLCB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlCi0gICAgICogaXMgY2xlYXJlZCBhbmQgdGhlIG5ldyBpdGVtIGJlZ2lucyBwbGF5aW5nIGltbWVkaWF0ZWx5IChyZWdhcmRsZXNzIG9mCi0gICAgICogd2hldGhlciB0aGUgcHJldmlvdXNseSBwbGF5aW5nIGl0ZW0gaGFkIGJlZW4gcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudCB0byB7QGxpbmsgI0FDVElPTl9TVE9QIHN0b3B9IGZvbGxvd2VkIGJ5IGFuIGFjdGlvbgotICAgICAqIHRvIGVucXVldWUgYSBuZXcgbWVkaWEgaXRlbSB0byBiZSBwbGF5ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlNlc3Npb25zPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJlcXVlc3QgaGFzIHRoZSBlZmZlY3Qgb2YgaW1wbGljaXRseSBjcmVhdGluZyBhIG1lZGlhIHNlc3Npb24gd2hlbmV2ZXIgdGhlCi0gICAgICogYXBwbGljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSB0aGUge0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEIHNlc3Npb24gaWR9IHBhcmFtZXRlci4KLSAgICAgKiBCZWNhdXNlIHRoZXJlIGNhbiBvbmx5IGJlIGF0IG1vc3Qgb25lIHZhbGlkIHNlc3Npb24gYXQgYSB0aW1lLCBjcmVhdGluZyBhIG5ldyBzZXNzaW9uCi0gICAgICogaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBpbnZhbGlkYXRpbmcgYW55IGV4aXN0aW5nIHNlc3Npb25zIGFuZCB0aGVpciBtZWRpYSBpdGVtcywKLSAgICAgKiB0aGVuIGhhbmRsaW5nIHRoZSBwbGF5YmFjayByZXF1ZXN0IHdpdGggYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllcyBhbiBpbnZhbGlkIHNlc3Npb24gaWQsIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYXNzdW1lIHRoYXQgaXRzIHNlc3Npb24KLSAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQuICBUbyBvYnRhaW4gYSBuZXcgc2Vzc2lvbiwgdGhlIGFwcGxpY2F0aW9uIG1heSB0cnkgYWdhaW4KLSAgICAgKiBhbmQgb21pdCB0aGUgc2Vzc2lvbiBpZCBwYXJhbWV0ZXIuICBIb3dldmVyLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkCi0gICAgICogb25seSByZXRyeSByZXF1ZXN0cyBkdWUgdG8gYW4gZXhwbGljaXQgYWN0aW9uIHBlcmZvcm1lZCBieSB0aGUgdXNlciwKLSAgICAgKiBzdWNoIGFzIHRoZSB1c2VyIGNsaWNraW5nIG9uIGEgInBsYXkiIGJ1dHRvbiBpbiB0aGUgVUksIHNpbmNlIGFub3RoZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBtYXkgYmUgdHJ5aW5nIHRvIHRha2UgY29udHJvbCBvZiB0aGUgcm91dGUgYW5kIHRoZSBmb3JtZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IHRvIHN0YXkgb3V0IG9mIGl0cyB3YXkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb25zLCBxdWV1ZXMgYW5kIG1lZGlhIGl0ZW1zLCBwbGVhc2UgcmVmZXIgdG8gdGhlCi0gICAgICogY2xhc3MgZG9jdW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdG8gd2hpY2ggdGhlIHBsYXliYWNrIHJlcXVlc3QgYmVsb25ncy4gIElmIG9taXR0ZWQsIGEgbmV3IHNlc3Npb24KLSAgICAgKiBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwKLSAgICAgKiBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9NRVRBREFUQX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIG1ldGFkYXRhIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoZSBjb250ZW50IHN1Y2ggYXMgdGhlIHRpdGxlIG9mIGEgc29uZy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdGhhdCB3YXMgYWZmZWN0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYmUgYSBuZXcgc2Vzc2lvbiBpbgotICAgICAqIHRoZSBjYXNlIHdoZXJlIG5vIHNlc3Npb24gaWQgd2FzIHN1cHBsaWVkIGFzIGEgcGFyYW1ldGVyLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgYW4gb3BhcXVlIHN0cmluZyBpZGVudGlmaWVyCi0gICAgICogdG8gdXNlIHRvIHJlZmVyIHRvIHRoZSBtZWRpYSBpdGVtIGluIHN1YnNlcXVlbnQgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9LgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHN0YXR1cyBvZgotICAgICAqIHRoZSBuZXcgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGFuCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgaXRlbSBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiBwbGF5YmFjayBzdGFydHMgb3IKLSAgICAgKiBzdG9wcy4gIFRoZSByZWNlaXZlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGNoYW5nZXMuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSByZXRyaWV2ZSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIG5lY2Vzc2FyeQotICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfSByZXF1ZXN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIGEgc2Vzc2lvbiBpZCB3YXMgcHJvdmlkZWQgYnV0IGlzIHVua25vd24gb3IKLSAgICAgKiBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBpdGVtIFVyaSBvciBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYKLSAgICAgKiBhbnkgb3RoZXIgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIE1lZGlhUm91dGVyIG1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICogTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgICogaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbFJlcXVlc3QoaW50ZW50KSkgewotICAgICAqICAgICBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICogICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAqICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHN1Y2NlZWRlZC4KLSAgICAgKiAgICAgICAgICAgICAvLyBQbGF5YmFjayBtYXkgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcmV0dXJuZWQgc2Vzc2lvbiBhbmQgaXRlbSBpZC4KLSAgICAgKiAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAqICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICogICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKGRhdGEuZ2V0QnVuZGxlKAotICAgICAqICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICogICAgICAgICAgICAgLy8gLi4uCi0gICAgICogICAgICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQhCi0gICAgICogICAgICAgICB9Ci0gICAgICogICAgIH07Ci0gICAgICogICAgIHJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgKiB9PC9wcmU+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BMQVkgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBMQVkiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbnF1ZXVlIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIHdvcmtzIGp1c3QgbGlrZSB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IGV4Y2VwdCB0aGF0IGl0IGRvZXMKLSAgICAgKiBub3QgY2xlYXIgdGhlIHF1ZXVlIG9yIHJlc2V0IHRoZSBwYXVzZSBzdGF0ZSB3aGVuIGl0IGVucXVldWVzIHRoZQotICAgICAqIG5ldyBtZWRpYSBpdGVtIGludG8gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIFRoaXMgYWN0aW9uIG9ubHkKLSAgICAgKiBlbnF1ZXVlcyBhIG1lZGlhIGl0ZW0gd2l0aCBubyBvdGhlciBzaWRlLWVmZmVjdHMgb24gdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5IGFuZCB0aGVuIHRoZSBpdGVtIHdpbGwgcGxheSBpbW1lZGlhdGVseQotICAgICAqIChhc3N1bWluZyB0aGUgcXVldWUgaXMgbm90IHBhdXNlZCkuICBPdGhlcndpc2UsIHRoZSBpdGVtIHdpbGwgcGxheQotICAgICAqIGFmdGVyIGFsbCBlYXJsaWVyIGl0ZW1zIGluIHRoZSBxdWV1ZSBoYXZlIGZpbmlzaGVkIG9yIGJlZW4gcmVtb3ZlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGVucXVldWUgYWN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMganVzdCBsaWtlIHBsYXkuCi0gICAgICogSXRzIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMgYXJlIGFsc28gdGhlIHNhbWUuICBPbmx5IHRoZSBxdWV1aW5nIGJlaGF2aW9yCi0gICAgICogaXMgZGlmZmVyZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VOUVVFVUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkVOUVVFVUUiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZWVrIG1lZGlhIGl0ZW0gdG8gYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBtb2RpZnkgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24KLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIG9ubHkgYWZmZWN0cyB0aGUgcGxheWJhY2sgcG9zaXRpb24gb2YgdGhlIG1lZGlhIGl0ZW07IG5vdCBpdHMgcGxheWJhY2sgc3RhdGUuCi0gICAgICogSWYgdGhlIHBsYXliYWNrIHF1ZXVlIGlzIHBhdXNlZCwgdGhlbiBzZWVraW5nIHNldHMgdGhlIHBvc2l0aW9uIGJ1dCB0aGUgaXRlbQotICAgICAqIHJlbWFpbnMgcGF1c2VkLiAgTGlrZXdpc2UgaWYgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlbiBzZWVraW5nIHdpbGwgY2F1c2UgcGxheWJhY2sKLSAgICAgKiB0byBqdW1wIHRvIHRoZSBuZXcgcG9zaXRpb24gYW5kIGNvbnRpbnVlIHBsYXlpbmcgZnJvbSB0aGF0IHBvaW50LiAgSWYgdGhlIGl0ZW0gaGFzCi0gICAgICogbm90IHlldCBzdGFydGVkIHBsYXlpbmcsIHRoZW4gdGhlIG5ldyBwbGF5YmFjayBwb3NpdGlvbiBpcyByZW1lbWJlcmVkIGJ5IHRoZQotICAgICAqIHF1ZXVlIGFuZCB1c2VkIGFzIHRoZSBpdGVtJ3MgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIHdoZW4gcGxheWJhY2sgZXZlbnR1YWxseSBiZWdpbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBtZWRpYSBpdGVtJ3MgcGxheWJhY2sgcG9zaXRpb24gaXMgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBzZWVrLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTn0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcKLSAgICAgKiBjb250ZW50IHBvc2l0aW9uIGZvciBwbGF5YmFjayBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20KLSAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBjb250ZW50IHBvc2l0aW9uIGlzIGludmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtCi0gICAgICogaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VFSyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VFSyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBpdGVtIHBsYXliYWNrIHN0YXR1cwotICAgICAqIGFuZCBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgcGxheWJhY2sgc3RhdHVzIGFuZCBwcm9ncmVzcwotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBxdWVyeS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NUQVRVUyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFJlbW92ZSBtZWRpYSBpdGVtIGZyb20gc2Vzc2lvbidzIHF1ZXVlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHJlbW92ZSB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0KLSAgICAgKiBmcm9tIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUuICBJZiB0aGUgY3VycmVudCBpdGVtIGlzIHJlbW92ZWQsIHRoZW4KLSAgICAgKiBwbGF5YmFjayB3aWxsIHByb2NlZWQgdG8gdGhlIG5leHQgbWVkaWEgaXRlbSAoYXNzdW1pbmcgdGhlIHF1ZXVlIGhhcyBub3QgYmVlbgotICAgICAqIHBhdXNlZCkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcGF1c2Ugc3RhdGUgb2YgdGhlIHF1ZXVlLiAgSWYgdGhlIHF1ZXVlIHdhcyBwYXVzZWQKLSAgICAgKiB0aGVuIGl0IHJlbWFpbnMgcGF1c2VkIChldmVuIGlmIGl0IGlzIG5vdyBlbXB0eSkgdW50aWwgYSByZXN1bWUsIHN0b3Agb3IgcGxheQotICAgICAqIGFjdGlvbiBpcyBpc3N1ZWQgdGhhdCBjYXVzZXMgdGhlIHBhdXNlIHN0YXRlIHRvIGJlIGNsZWFyZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gcmVtb3ZlLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtIGlzIGluIGEgdGVybWluYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUKLSAgICAgKiBubyBsb25nZXIgaW4gdGhlIHF1ZXVlKS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVNT1ZFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5SRU1PVkUiOwotCi0gICAgLyogUmVtb3RlIHBsYXliYWNrIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHdob2xlIHBsYXliYWNrIHF1ZXVlLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQYXVzZSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcGF1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBwYXVzZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFVU0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBBVVNFIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVzdW1lIG1lZGlhIHBsYXliYWNrICh1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcmVzdW1lZC4KLSAgICAgKiBSZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiB7QGxpbmsgI0FDVElPTl9QQVVTRX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHJlc3VtZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRVNVTUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFU1VNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0b3AgbWVkaWEgcGxheWJhY2sgKGNsZWFyIHF1ZXVlIGFuZCB1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0b3AgcGxheWJhY2ssIGNhbmNlbCBhbmQgcmVtb3ZlCi0gICAgICogYWxsIG1lZGlhIGl0ZW1zIGZyb20gdGhlIHNlc3Npb24ncyBtZWRpYSBpdGVtIHF1ZXVlIGFuZCwgcmVzZXQgdGhlIHF1ZXVlJ3MKLSAgICAgKiBwYXVzZSBzdGF0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudAotICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzIG9mIGVhY2ggaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgc3RvcHBlZCAoY2xlYXJlZCBhbmQgdW5wYXVzZWQpLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RPUCA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RPUCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0YXJ0IHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IHNlc3Npb24KLSAgICAgKiBhbmQgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gIFRoZSBuZXcgc2Vzc2lvbiBpbml0aWFsbHkgaGFzIGFuIGVtcHR5IHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUKLSAgICAgKiBpcyBzZW50IHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzCi0gICAgICogb2YgZWFjaCBpdGVtLiAgVGhlIHByZXZpb3VzIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSBuZXcgc2Vzc2lvbgotICAgICAqIHRha2VzIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tCi0gICAgICogdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBzdGFydGVkIGJ5IHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIGJyYW5kIG5ldyBzZXNzaW9uCi0gICAgICogZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgcHJldmlvdXNseSBjcmVhdGVkIHNlc3Npb25zLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEKLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgc2Vzc2lvbiBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiB0aGUgc2Vzc2lvbidzCi0gICAgICogcXVldWUgaXMgcGF1c2VkIG9yIHJlc3VtZWQgb3Igd2hlbiB0aGUgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkIG9yIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+Q3VzdG9tIG1lc3NhZ2VzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYW55IG1lc3NhZ2VzIHRvIHNlbmQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayAjRVhUUkFfTUVTU0FHRX0gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBUlRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RBUlRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBzZXNzaW9uIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB3aG9zZSBzdGF0dXMgaXMgdG8gYmUgcmV0cmlldmVkLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKLSAgICAgKiBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NFU1NJT05fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogRW5kIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBlbmQgdGhlIHNwZWNpZmllZCBzZXNzaW9uLgotICAgICAqIFRoZSBzZXNzaW9uIGJlY29tZXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCB0aGUgcm91dGUgY2Vhc2VzIHRvIGJlIHVuZGVyIGNvbnRyb2wKLSAgICAgKiBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiB0aGUgc2Vzc2lvbiBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI1NFU1NJT05fU1RBVEVfRU5ERUR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudCB0bwotICAgICAqIHRoZSBzZXNzaW9uJ3Mgc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQWRkaXRpb25hbGx5LCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB0byBlbmQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiBJbiBvdGhlciB3b3JkcywgaXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byBlbmQgYSBzZXNzaW9uIG90aGVyIHRoYW4gdGhlCi0gICAgICogY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5EX1NFU1NJT04iOwotCi0gICAgLyoqCi0gICAgICogQ3VzdG9tIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZW5kIHtAbGluayAjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJvdXRlIHRvIGhhbmRsZSBhIG1lc3NhZ2UgZGVzY3JpYmVkIGJ5IEVYVFJBX01FU1NBR0UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHdpbGwgaGFuZGxlIHRoaXMgbWVzc2FnZS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgdG8gc2VuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiBBbnkgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogQW55IGVycm9yIG1lc3NhZ2VzIGRlZmluZWQgYnkgZWFjaCBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRU5EX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNFTkRfTUVTU0FHRSI7Ci0KLSAgICAvKiBFeHRyYXMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAqLwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGlkZW50aWZpZXMgdGhlIHJlbW90ZSBwbGF5YmFjayBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBVc2VkIHdpdGggdmFyaW91cyBhY3Rpb25zIHRvIHNwZWNpZnkgdGhlIGlkIG9mIHRoZSBtZWRpYSBzZXNzaW9uIHRvIGJlIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX0lEID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX0lEIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBzdGF0dXMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSBtZWRpYSBzZXNzaW9uIGFjdGlvbnMgc3VjaCBhcyB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSwKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9QQVVTRX0sIGFuZCB7QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX1NUQVRVUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059IHRvIHNwZWNpZnkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKLSAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyB1cGRhdGVkIHN0YXR1cy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIHNlc3Npb24gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgbWVzc2FnZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGhhcyBhIG1lc3NhZ2UgdG8gc2VuZCwgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyBtZXNzYWdlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgZnJvbQotICAgICAqIHRoZSBzZXNzaW9uIGFzIGEgYnVuZGxlIG9iamVjdC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvcGFxdWUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSB7QGxpbmsgI0FDVElPTl9QTEFZfSBvcgotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRoYXQgcmVwcmVzZW50cyB0aGUgbWVkaWEgaXRlbSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZQotICAgICAqIHBsYXliYWNrIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBpdGVtIGluIHF1ZXN0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIGl0ZW0gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1BMQVl9LAotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9LCB7QGxpbmsgI0FDVElPTl9TRUVLfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBMb25nIGV4dHJhOiBNZWRpYSBpdGVtIGNvbnRlbnQgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgdGhlCi0gICAgICogc3RhcnRpbmcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRUVLfSB0byBzZXQgYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9QT1NJVElPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gbWV0YWRhdGEuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgbWV0YWRhdGEKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRlbnQgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIG1ldGFkYXRhIGtleS12YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gICAgICogaW4ge0BsaW5rIE1lZGlhSXRlbU1ldGFkYXRhfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9NRVRBREFUQSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9NRVRBREFUQSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IEhUVFAgcmVxdWVzdAotICAgICAqIGhlYWRlcnMgdG8gYmUgaW5jbHVkZWQgd2hlbiBmZXRjaGluZyB0byB0aGUgY29udGVudCBpbmRpY2F0ZWQgYnkgdGhlIG1lZGlhCi0gICAgICogaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCBvdGhlcgotICAgICAqIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciBzZXBhcmF0ZWx5IGZyb20gdGhlIG1lZGlhIGl0ZW0ncyBkYXRhIFVyaS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSFRUUF9IRUFERVJTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5IVFRQX0hFQURFUlMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkKLSAgICAgKiBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCBhIHBhcnRpY3VsYXIKLSAgICAgKiBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuZXZlciB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCi0gICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBpdGVtIGJlbG9uZ3MsIHRoZSBzZXNzaW9uIHN0YXR1cywgdGhlIGl0ZW0ncyBpZAotICAgICAqIGFuZCB0aGUgaXRlbSdzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgc2FtZSBwZW5kaW5nIGludGVudCBhbmQgYnJvYWRjYXN0IHJlY2VpdmVyIG1heSBiZSBzaGFyZWQgYnkgYW55IG51bWJlciBvZgotICAgICAqIG1lZGlhIGl0ZW1zIHNpbmNlIHRoZSBicm9hZGNhc3QgaW50ZW50IGluY2x1ZGVzIHRoZSBtZWRpYSBzZXNzaW9uIGlkCi0gICAgICogYW5kIG1lZGlhIGl0ZW0gaWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mIHRoZQotICAgICAqIG1lZGlhIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIGl0ZW0gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRU5EX01FU1NBR0V9LCBhbmQgaW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiBtZXNzYWdlIHJlY2VpdmVyc30gdG8gZGVzY3JpYmUgYSBtZXNzYWdlIGJldHdlZW4gYQotICAgICAqIHNlc3Npb24gYW5kIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuTUVTU0FHRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGV4dHJhOiBFcnJvciBjb2RlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCBhbGwgbWVkaWEgY29udHJvbCByZXF1ZXN0cyB0byBkZXNjcmliZSB0aGUgY2F1c2Ugb2YgYW4gZXJyb3IuCi0gICAgICogVGhpcyBleHRyYSBtYXkgYmUgb21pdHRlZCB3aGVuIHRoZSBlcnJvciBpcyB1bmtub3duLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgb25lIG9mOiB7QGxpbmsgI0VSUk9SX1VOS05PV059LCB7QGxpbmsgI0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTn0sCi0gICAgICoge0BsaW5rICNFUlJPUl9JTlZBTElEX1NFU1NJT05fSUR9LCB7QGxpbmsgI0VSUk9SX0lOVkFMSURfSVRFTV9JRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VSUk9SX0NPREUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuRVJST1JfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOS05PV04gPSAwOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgc2Vzc2lvbiBpZCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9TRVNTSU9OX0lEID0gMjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBpdGVtIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0lURU1fSUQgPSAzOwotCi0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xJbnRlbnQoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyZGRiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgbWV0YWRhdGEgYWJvdXQgYSBtZWRpYSBpdGVtIGFzIGEge0BsaW5rIEJ1bmRsZX0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIE1lZGlhIGl0ZW0gbWV0YWRhdGEgaXMgZGVzY3JpYmVkIGFzIGEgYnVuZGxlIG9mIGtleS92YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gKiBpbiB0aGlzIGNsYXNzLiAgVGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHZhbHVlIGFzc29jaWF0ZWQKLSAqIHdpdGggZWFjaCBrZXkuCi0gKiA8L3A+PHA+Ci0gKiBBbiBhcHBsaWNhdGlvbiBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsIGN1c3RvbSBtZXRhZGF0YSBrZXlzIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUKLSAqIHRoYXQgdGhleSB3aWxsIGJlIHJlY29nbml6ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtTWV0YWRhdGEgewotICAgIC8qCi0gICAgICogTm90ZTogTWVkaWFNZXRhZGF0YVJldHJpZXZlciBhbHNvIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIGtleXMgdGhhdCBjYW4gYmUKLSAgICAgKiByZXRyaWV2ZWQgZnJvbSBhIGNvbnRlbnQgc3RyZWFtIGFsdGhvdWdoIHRoZSByZXByZXNlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQgaGVyZQotICAgICAqIHNpbmNlIHdlIGFyZSBzZW5kaW5nIHRoZSBkYXRhIHRvIGEgcmVtb3RlIGVuZHBvaW50LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW1NZXRhZGF0YSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSBhcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQWxidW0gdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnR3b3JrIFVyaS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgVVJJIGZvciBhbiBpbWFnZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSwKLSAgICAgKiBzdWNoIGFzIGFsYnVtIG9yIGNvdmVyIGFydC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVFdPUktfVVJJID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUV09SS19VUkkiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXJ0aXN0IG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEF1dGhvciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVVEhPUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFVVEhPUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBDb21wb3NlciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTVBPU0VSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUE9TRVIiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogVHJhY2sgdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogWWVhciBvZiBwdWJsaWNhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciB5ZWFyIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1lFQVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ZRUFSIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBUcmFjayBudW1iZXIgKHN1Y2ggYXMgYSB0cmFjayBvbiBhIENEKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciB0cmFjayBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkFDS19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5UUkFDS19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IERpc2MgbnVtYmVyIHdpdGhpbiBhIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgZGlzYyBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNDX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU0NfTlVNQkVSIjsKLQotICAgIC8qKgotICAgICAqIExvbmcga2V5OiBJdGVtIHBsYXliYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSA8Y29kZT5sb25nPC9jb2RlPiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZHVyYXRpb24gbWV0YWRhdGEgaXMgb25seSBhIGhpbnQgdG8gZW5hYmxlIGEgcmVtb3RlIG1lZGlhIHBsYXllciB0bwotICAgICAqIGd1ZXNzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudCBiZWZvcmUgaXQgYWN0dWFsbHkgb3BlbnMgdGhlIG1lZGlhIHN0cmVhbS4KLSAgICAgKiBUaGUgcmVtb3RlIG1lZGlhIHBsYXllciBzaG91bGQgc3RpbGwgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29udGVudCBkdXJhdGlvbiBmcm9tCi0gICAgICogdGhlIG1lZGlhIHN0cmVhbSBpdHNlbGYgaW5kZXBlbmRlbnQgb2YgdGhlIHZhbHVlIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBieSB0aGlzIGtleS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RVUkFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRFVSQVRJT04iOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVhMmQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuVGltZVV0aWxzOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcGxheWJhY2sgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogQXMgYSBtZWRpYSBpdGVtIGlzIHBsYXllZCwgaXQgdHJhbnNpdGlvbnMgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIHN0YXRlcyBpbmNsdWRpbmc6Ci0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkcgcGVuZGluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HIGJ1ZmZlcmluZ30sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BMQVlJTkcgcGxheWluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEIHBhdXNlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0ZJTklTSEVEIGZpbmlzaGVkfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSwgYW5kCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfS4gIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUKLSAqIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFdoaWxlIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZSBwbGF5YmFjayBzdGF0dXMgbWF5IGFsc28gaW5jbHVkZSBwcm9ncmVzcyBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlIHtAbGluayAjZ2V0Q29udGVudFBvc2l0aW9uIGNvbnRlbnQgcG9zaXRpb259IGFuZAotICoge0BsaW5rICNnZXRDb250ZW50RHVyYXRpb24gY29udGVudCBkdXJhdGlvbn0gYWx0aG91Z2ggbm90IGFsbCByb3V0ZSBkZXN0aW5hdGlvbnMKLSAqIHdpbGwgcmVwb3J0IGl0LgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBwbGF5YmFjayBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheWJhY2sgcmVxdWVzdH0uICBOb3RlIHRoYXQKLSAqIHRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBtYWpvciBzdGF0dXMgY2hhbmdlcyBzdWNoIGFzIGEKLSAqIHRyYW5zaXRpb24gZnJvbSBwbGF5aW5nIHRvIGZpbmlzaGVkLgotICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAqIFRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIG1pbm9yIHByb2dyZXNzIHVwZGF0ZXMgc3VjaCBhcwotICogY2hhbmdlcyB0byBwbGF5YmFjayBwb3NpdGlvbiBvciBkdXJhdGlvbi4gIElmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBtb25pdG9yCi0gKiBwbGF5YmFjayBwcm9ncmVzcywgdGhlbiBpdCBtdXN0IHVzZSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1cyByZXF1ZXN0fSB0byBwb2xsIGZvciBjaGFuZ2VzCi0gKiBwZXJpb2RpY2FsbHkgYW5kIGVzdGltYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBwbGF5aW5nLiAgTm90ZSB0aGF0IHRoZXJlIG1heQotICogYmUgYSBzaWduaWZpY2FudCBwb3dlciBpbXBhY3QgdG8gcG9sbGluZyBzbyB0aGUgYXBwbGljYXRpb24gaXMgYWR2aXNlZCBvbmx5Ci0gKiB0byBwb2xsIHdoZW4gdGhlIHNjcmVlbiBpcyBvbiBhbmQgbmV2ZXIgbW9yZSB0aGFuIGFib3V0IG9uY2UgZXZlcnkgNSBzZWNvbmRzIG9yIHNvLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbVN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RBVEUgPSAicGxheWJhY2tTdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9QT1NJVElPTiA9ICJjb250ZW50UG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfRFVSQVRJT04gPSAiY29udGVudER1cmF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBlbmRpbmcuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaGFzIG5vdCB5ZXQgc3RhcnRlZCBwbGF5YmFjayBidXQgd2lsbCBiZSBwbGF5ZWQgZXZlbnR1YWxseS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEVORElORyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUExBWUlORyA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGF1c2VkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHBsYXliYWNrIG9mIHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHBhdXNlZC4gIFBsYXliYWNrIGNhbiBiZQotICAgICAqIHJlc3VtZWQgdXNpbmcgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEFVU0VEID0gMjsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBCdWZmZXJpbmcgb3Igc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgYmVlbiB0ZW1wb3JhcmlseSBpbnRlcnJ1cHRlZAotICAgICAqIHRvIGZldGNoIG1vcmUgY29udGVudC4gIFBsYXliYWNrIHdpbGwgY29udGludWUgYXV0b21hdGljYWxseQotICAgICAqIHdoZW4gZW5vdWdoIGNvbnRlbnQgaGFzIGJlZW4gYnVmZmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORyA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogRmluaXNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gcGxheWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGZpbmlzaGVkIG5vcm1hbGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGZpbmlzaGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9GSU5JU0hFRCA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogQ2FuY2VsZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBieSB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbi4gIEl0ZW1zIG1heSBiZSBjYW5jZWxlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB1c2luZwotICAgICAqIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0gYWN0aW9uIG9yIGJ5IGlzc3VpbmcKLSAgICAgKiBhbm90aGVyIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gYWN0aW9uIHRoYXQgaGFzIHRoZQotICAgICAqIHNpZGUtZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBjYW5jZWxlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgPSA1OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBwZXJtYW5lbnRseSBhbmQgaW52b2x1bnRhcmlseS4KLSAgICAgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgaW52YWxpZGF0ZWQgYW5kIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHRoZSBzZXNzaW9uIHRvIHdoaWNoIGl0IGJlbG9uZ3Mgd2FzIGludmFsaWRhdGVkCi0gICAgICogKHR5cGljYWxseSBieSBhbm90aGVyIGFwcGxpY2F0aW9uIHRha2luZyBjb250cm9sIG9mIHRoZSByb3V0ZSkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gaW52YWxpZGF0aW9uIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBnZW5lcmFsbHkgd2FpdCBmb3IgdGhlIHVzZXIKLSAgICAgKiB0byBwZXJmb3JtIGFuIGV4cGxpY2l0IGFjdGlvbiwgc3VjaCBhcyBjbGlja2luZyBvbiBhIHBsYXkgYnV0dG9uIGluIHRoZSBVSSwKLSAgICAgKiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbWVkaWEgc2Vzc2lvbiB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGludGVycnVwdGluZwotICAgICAqIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBtYXkgaGF2ZSBqdXN0IHN0YXJ0ZWQgdXNpbmcgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgPSA2OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBsYXliYWNrIGhhbHRlZCBvciBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlcyBvZiBlcnJvcnMgYXJlIG5vIG5ldHdvcmsgY29ubmVjdGl2aXR5IHdoZW4gYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBjb250ZW50Ci0gICAgICogZnJvbSBhIHNlcnZlciwgb3IgZXhwaXJlZCB1c2VyIGNyZWRlbnRpYWxzIHdoZW4gdHJ5aW5nIHRvIHBsYXkgc3Vic2NyaXB0aW9uLWJhc2VkCi0gICAgICogY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBtZWRpYSBpdGVtIGluIHRoZSBlcnJvciBzdGF0ZSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sCi0gICAgICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0VSUk9SID0gNzsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHRoYXQgd2FzIGVuY291bnRlcmVkIHdoZW4gdGhlIGNvbnRlbnQKLSAgICAgKiB3YXMgcmVxdWVzdGVkIGFmdGVyIGFsbCByZWRpcmVjdHMgd2VyZSBmb2xsb3dlZC4gIFRoaXMga2V5IG9ubHkgbmVlZHMgdG8KLSAgICAgKiBzcGVjaWZpZWQgd2hlbiB0aGUgY29udGVudCB1cmkgdXNlcyB0aGUgSFRUUCBvciBIVFRQUyBzY2hlbWUgYW5kIGFuIGVycm9yCi0gICAgICogb2NjdXJyZWQuICBUaGlzIGtleSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29udGVudCB3YXMgYWJsZSB0byBiZSBwbGF5ZWQKLSAgICAgKiBzdWNjZXNzZnVsbHk7IHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVwb3J0IGEgMjAwIChPSykgc3RhdHVzIGNvZGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGUsIHN1Y2ggYXMgNDAxIChVbmF1dGhvcml6ZWQpLAotICAgICAqIDQwNCAoTm90IEZvdW5kKSwgb3IgNTAwIChTZXJ2ZXIgRXJyb3IpLCBvciAwIGlmIG5vbmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfU1RBVFVTX0NPREUgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfU1RBVFVTX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZXJlIHJldHVybmVkIHdoZW4gdGhlIGNvbnRlbnQgd2FzCi0gICAgICogcmVxdWVzdGVkIGZyb20gdGhlIG5ldHdvcmsuICBUaGUgaGVhZGVycyBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIGNvbnRlbnQgb3IgYW55IGVycm9ycyBjb25kaXRpb25zIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZQotICAgICAqIHRyeWluZyB0byBmZXRjaCB0aGUgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9IVFRQX1JFU1BPTlNFX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfUkVTUE9OU0VfSEVBREVSUyI7Ci0KLSAgICBNZWRpYUl0ZW1TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwbGF5YmFjayBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkd9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEfSwKLSAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0JVRkZFUklOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEfSwKLSAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RBVEUsIFBMQVlCQUNLX1NUQVRFX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCB0byBiZSBwbGF5ZWQgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mCi0gICAgICogbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudER1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYUl0ZW1TdGF0dXN7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJ0aW1lc3RhbXA9Iik7Ci0gICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIGdldFRpbWVzdGFtcCgpLCByZXN1bHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgbXMgYWdvIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdGF0ZT0iKS5hcHBlbmQocGxheWJhY2tTdGF0ZVRvU3RyaW5nKGdldFBsYXliYWNrU3RhdGUoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnRQb3NpdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudFBvc2l0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnREdXJhdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBsYXliYWNrU3RhdGVUb1N0cmluZyhpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBlbmRpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9CVUZGRVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJidWZmZXJpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBhdXNlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmluaXNoZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9DQU5DRUxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImNhbmNlbGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHBsYXliYWNrU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbVN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhSXRlbVN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1N0YXRlIFRoZSBpdGVtIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRUaW1lc3RhbXAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOwotICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShwbGF5YmFja1N0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgaXRlbSBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0YXRlKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RBVEUsIHBsYXliYWNrU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRlbnRQb3NpdGlvbihsb25nIHBvc2l0aW9uTWlsbGlzZWNvbmRzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzZWNvbmRzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIKLSAgICAgICAgICogb2YgbWlsbGlzZWNvbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudER1cmF0aW9uKGxvbmcgZHVyYXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9EVVJBVElPTiwgZHVyYXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBtZWRpYSBpdGVtIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhSXRlbVN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjODRmYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSByb3V0ZS4KLSAqIDxwPgotICogRWFjaCByb3V0ZSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGFuIG9wYXF1ZSBpZCBzdHJpbmcuICBUaGlzIHRva2VuCi0gKiBtYXkgdGFrZSBhbnkgZm9ybSBhcyBsb25nIGFzIGl0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEZXNjcmlwdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJpZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR1JPVVBfTUVNQkVSX0lEUyA9ICJncm91cE1lbWJlcklkcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJuYW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDUklQVElPTiA9ICJzdGF0dXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lDT05fVVJJID0gImljb25VcmkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OTkVDVElORyA9ICJjb25uZWN0aW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU9OX1NUQVRFID0gImNvbm5lY3Rpb25TdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9GSUxURVJTID0gImNvbnRyb2xGaWx0ZXJzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0gInBsYXliYWNrVHlwZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RSRUFNID0gInBsYXliYWNrU3RyZWFtIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfVFlQRSA9ICJkZXZpY2VUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfTUFYID0gInZvbHVtZU1heCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX0hBTkRMSU5HID0gInZvbHVtZUhhbmRsaW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCA9ICJwcmVzZW50YXRpb25EaXNwbGF5SWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9ESVNDT05ORUNUID0gImNhbkRpc2Nvbm5lY3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFVFRJTkdTX0lOVEVOVCA9ICJzZXR0aW5nc0ludGVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlOX0NMSUVOVF9WRVJTSU9OID0gIm1pbkNsaWVudFZlcnNpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9DTElFTlRfVkVSU0lPTiA9ICJtYXhDbGllbnRWZXJzaW9uIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICBNZWRpYVJvdXRlRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PEludGVudEZpbHRlcj4gY29udHJvbEZpbHRlcnMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gY29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAqIGJ5IHRoZSBwcm92aWRlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBNZW1iZXJJZHMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX05BTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9ERVNDUklQVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgU3RyaW5nIGljb25VcmkgPSBtQnVuZGxlLmdldFN0cmluZyhLRVlfSUNPTl9VUkkpOwotICAgICAgICByZXR1cm4gaWNvblVyaSA9PSBudWxsID8gbnVsbCA6IFVyaS5wYXJzZShpY29uVXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9FTkFCTEVELCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGNvbm5lY3RpbmcuCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NPTk5FQ1RJTkcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfQ09OTkVDVElPTl9TVEFURSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBjYW4gbm9ybWFsbHkgYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2sgd2hlbgotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugb24gdGhlIHJvdXRlIGlzIGNvbm5lY3RlZCB0byB0d28gb3IgbW9yZSBzb3VyY2UKLSAgICAgKiBkZXZpY2VzLiBUaGUgcm91dGUgcHJvdmlkZXIgc2hvdWxkIHVwZGF0ZSB0aGUgcm91dGUgaW1tZWRpYXRlbHkgd2hlbiB0aGUKLSAgICAgKiBudW1iZXIgb2YgY29ubmVjdGVkIGRldmljZXMgY2hhbmdlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVG8gc3BlY2lmeSB0aGF0IHRoZSByb3V0ZSBzaG91bGQgZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHVzZQotICAgICAqIHtAbGluayBNZWRpYVJvdXRlciN1bnNlbGVjdChpbnQpfSB3aXRoCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NBTl9ESVNDT05ORUNULCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiB7QGxpbmsgSW50ZW50U2VuZGVyfSBmb3Igc3RhcnRpbmcgYSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcwotICAgICAqIHJvdXRlLiBUaGUgYWN0aXZpdHkgbWF5IGhhdmUgc3BlY2lmaWMgcm91dGUgc2V0dGluZ3Mgb3IgZ2VuZXJhbCBzZXR0aW5ncwotICAgICAqIGZvciB0aGUgY29ubmVjdGVkIGRldmljZSBvciByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEludGVudFNlbmRlcn0gdG8gc3RhcnQgYSBzZXR0aW5ncyBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZW50U2VuZGVyIGdldFNldHRpbmdzQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFBhcmNlbGFibGUoS0VZX1NFVFRJTkdTX0lOVEVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEludGVudEZpbHRlcj4gZ2V0Q29udHJvbEZpbHRlcnMoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgdm9pZCBlbnN1cmVDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBtQnVuZGxlLjxJbnRlbnRGaWx0ZXI+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09OVFJPTF9GSUxURVJTKTsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IENvbGxlY3Rpb25zLjxJbnRlbnRGaWx0ZXI+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RyZWFtKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX0RFVklDRV9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX01BWCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoCi0gICAgICAgICAgICAgICAgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lELCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgcm91dGUgZGVzY3JpcHRvci4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNaW5DbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl9TVEFSVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNYXhDbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01BWF9DTElFTlRfVkVSU0lPTiwgSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgZGVzY3JpcHRvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdldElkKCkpCi0gICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIHx8IG1Db250cm9sRmlsdGVycy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZURlc2NyaXB0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJpZD0iKS5hcHBlbmQoZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ3JvdXBNZW1iZXJJZHM9IikuYXBwZW5kKGdldEdyb3VwTWVtYmVySWRzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWU9IikuYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb249IikuYXBwZW5kKGdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGljb25Vcmk9IikuYXBwZW5kKGdldEljb25VcmkoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNFbmFibGVkPSIpLmFwcGVuZChpc0VuYWJsZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNDb25uZWN0aW5nPSIpLmFwcGVuZChpc0Nvbm5lY3RpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvblN0YXRlPSIpLmFwcGVuZChnZXRDb25uZWN0aW9uU3RhdGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udHJvbEZpbHRlcnM9IikuYXBwZW5kKEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sRmlsdGVycygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrVHlwZT0iKS5hcHBlbmQoZ2V0UGxheWJhY2tUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrU3RyZWFtPSIpLmFwcGVuZChnZXRQbGF5YmFja1N0cmVhbSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXZpY2VUeXBlPSIpLmFwcGVuZChnZXREZXZpY2VUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZT0iKS5hcHBlbmQoZ2V0Vm9sdW1lKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZU1heD0iKS5hcHBlbmQoZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZUhhbmRsaW5nPSIpLmFwcGVuZChnZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IikuYXBwZW5kKGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1pbkNsaWVudFZlcnNpb249IikuYXBwZW5kKGdldE1pbkNsaWVudFZlcnNpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWF4Q2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWF4Q2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Hcm91cE1lbWJlcklkczsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoZGVzY3JpcHRvci5tQnVuZGxlKTsKLQotICAgICAgICAgICAgZGVzY3JpcHRvci5lbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oZGVzY3JpcHRvci5tQ29udHJvbEZpbHRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgICAgICogaWRlbnRpZmllciBmb3IgdGhlIHJvdXRlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcm91dGVzIG9mZmVyZWQKLSAgICAgICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgaWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGdyb3VwIG1lbWJlciBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZChTdHJpbmcgZ3JvdXBNZW1iZXJJZCkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ3JvdXBNZW1iZXJJZCBtdXN0IG5vdCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUdyb3VwTWVtYmVySWRzLmNvbnRhaW5zKGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVySWRzLmFkZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIGdyb3VwIG1lbWJlciBpZHMgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwTWVtYmVySWRzKENvbGxlY3Rpb248U3RyaW5nPiBncm91cE1lbWJlcklkcykgewotICAgICAgICAgICAgaWYgKGdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZ3JvdXBNZW1iZXJJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEdyb3VwTWVtYmVySWQoZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX05BTUUsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgVVJJIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+Y29udGVudCAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0NPTlRFTlR9KTwvbGk+Ci0gICAgICAgICAqIDxsaT5hbmRyb2lkLnJlc291cmNlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRX0pCi0gICAgICAgICAqIDwvbGk+Ci0gICAgICAgICAqIDxsaT5maWxlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfRklMRX0pPC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvblVyaShVcmkgaWNvblVyaSkgewotICAgICAgICAgICAgaWYgKGljb25VcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImljb25VcmkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lDT05fVVJJLCBpY29uVXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBlbmFibGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogRGlzYWJsZWQgcm91dGVzIHJlcHJlc2VudCByb3V0ZXMgdGhhdCBhIHJvdXRlIHByb3ZpZGVyIGtub3dzIGFib3V0LCBzdWNoIGFzIHBhaXJlZAotICAgICAgICAgKiBXaWZpIERpc3BsYXkgcmVjZWl2ZXJzLCBidXQgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdCB5ZXQKLSAgICAgICAgICogcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGluZyhib29sZWFuIGNvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgY29ubmVjdGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGNvbm5lY3Rpb24gc3RhdGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uU3RhdGUgVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbm5lY3Rpb25TdGF0ZShpbnQgY29ubmVjdGlvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfQ09OTkVDVElPTl9TVEFURSwgY29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q2FuRGlzY29ubmVjdChib29sZWFuIGNhbkRpc2Nvbm5lY3QpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGNhbkRpc2Nvbm5lY3QpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbiBpbnRlbnQgc2VuZGVyIGZvciBsYXVuY2hpbmcgdGhlIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2V0dGluZ3NBY3Rpdml0eShJbnRlbnRTZW5kZXIgaXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5ULCBpcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVyIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sRmlsdGVyKEludGVudEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbHRlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ29udHJvbEZpbHRlcnMuY29udGFpbnMoZmlsdGVyKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXJzKENvbGxlY3Rpb248SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVycyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRyb2xGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1R5cGUgVGhlIHBsYXliYWNrIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tUeXBlKGludCBwbGF5YmFja1R5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBwbGF5YmFja1R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0cmVhbShpbnQgcGxheWJhY2tTdHJlYW0pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVFJFQU0sIHBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcmVjZWl2ZXIgZGV2aWNlIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2VUeXBlIFRoZSByZWNlaXZlIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9UVn0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERldmljZVR5cGUoaW50IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9ERVZJQ0VfVFlQRSwgZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZU1heChpbnQgdm9sdW1lTWF4KSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX01BWCwgdm9sdW1lTWF4KTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3Mgdm9sdW1lIGhhbmRsaW5nLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lSGFuZGxpbmcgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZUhhbmRsaW5nKGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywgdm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChpbnQgcHJlc2VudGF0aW9uRGlzcGxheUlkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIHByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1pbkNsaWVudFZlcnNpb24oaW50IG1pblZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04sIG1pblZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGhpZ2hlciB0aGFuIHRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoaXMgcm91dGUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNYXhDbGllbnRWZXJzaW9uKGludCBtYXhWZXJzaW9uKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBtYXhWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMsIG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUywgbUdyb3VwTWVtYmVySWRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IobUJ1bmRsZSwgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTYyN2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIG1lZGlhIHJvdXRlciB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyCi0gKiBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElWRV9TQ0FOID0gImFjdGl2ZVNjYW4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGFjdGl2ZVNjYW4gVHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBib29sZWFuIGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOLCBhY3RpdmVTY2FuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9TRUxFQ1RPUikpOwotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZVNjYW4oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc2NvdmVyeSByZXF1ZXN0IGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yLmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qgb3RoZXIgPSAoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmVxdWFscyhvdGhlci5nZXRTZWxlY3RvcigpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc0FjdGl2ZVNjYW4oKSA9PSBvdGhlci5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuaGFzaENvZGUoKSBeIChpc0FjdGl2ZVNjYW4oKSA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkRpc2NvdmVyeVJlcXVlc3R7IHNlbGVjdG9yPSIpLmFwcGVuZChnZXRTZWxlY3RvcigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVTY2FuPSIpLmFwcGVuZChpc0FjdGl2ZVNjYW4oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSB1c2VkIHRvIHB1Ymxpc2ggYWRkaXRpb25hbCBtZWRpYSByb3V0ZXMgZm9yCi0gKiB1c2Ugd2l0aGluIGFuIGFwcGxpY2F0aW9uLiAgTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBhbHNvIGJlIGRlY2xhcmVkCi0gKiBhcyBhIHNlcnZpY2UgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyB0byBhbGwgYXBwbGljYXRpb25zCi0gKiBpbiB0aGUgc3lzdGVtLgotICogPHA+Ci0gKiBUaGUgcHVycG9zZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHRvIGRpc2NvdmVyIG1lZGlhIHJvdXRlcyB0aGF0IHNhdGlzZnkKLSAqIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgcHVibGlzaCBhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcn0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJvdXRlIGJ5IGNhbGxpbmcKLSAqIHtAbGluayAjc2V0RGVzY3JpcHRvcn0gdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ2FsbGJhY2t9LgotICogPC9wPjxwPgotICogVGhlIHByb3ZpZGVyIHNob3VsZCB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgYnkgaW1wbGVtZW50aW5nCi0gKiB7QGxpbmsgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWR9IGFuZCB1cGRhdGluZyB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IGl0IGlzCi0gKiBhdHRlbXB0aW5nIHRvIGRpc2NvdmVyLiAgSXQgc2hvdWxkIGFsc28gaGFuZGxlIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMgc3VjaAotICogYXMgdm9sdW1lIGNoYW5nZXMgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudHN9Ci0gKiBieSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcn0gdG8gcmV0dXJuIGEge0BsaW5rIFJvdXRlQ29udHJvbGxlcn0KLSAqIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gKiA8L3A+PHA+Ci0gKiBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBiZSB1c2VkIHByaXZhdGVseSB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2luZ2xlCi0gKiBhcHBsaWNhdGlvbiBwcm9jZXNzIGJ5IGNhbGxpbmcge0BsaW5rIE1lZGlhUm91dGVyI2FkZFByb3ZpZGVyIE1lZGlhUm91dGVyLmFkZFByb3ZpZGVyfQotICogdG8gYWRkIGl0IHRvIHRoZSBsb2NhbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9LiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBtYXkgYWxzbyBiZSBtYWRlCi0gKiBhdmFpbGFibGUgZ2xvYmFsbHkgdG8gYWxsIGFwcGxpY2F0aW9ucyBieSByZWdpc3RlcmluZyBhIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlfQotICogaW4gdGhlIHByb3ZpZGVyJ3MgbWFuaWZlc3QuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZWdpc3RlcmVkCi0gKiBhcyBhIHNlcnZpY2UsIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIG1lZGlhIHJvdXRlciBBUEkgd2lsbCBiZSBhYmxlIHRvCi0gKiBkaXNjb3ZlciBhbmQgdXNlZCB0aGUgcHJvdmlkZXIncyByb3V0ZXMgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBlbHNlLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCA9IDI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySGFuZGxlciBtSGFuZGxlciA9IG5ldyBQcm92aWRlckhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVyTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBnZXRDbGFzcygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGhhbmRsZXIgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gbUhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBzb21lIG1ldGFkYXRhIGFib3V0IHRoZSBwcm92aWRlcidzIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlck1ldGFkYXRhIGdldE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHVzZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhbGxiYWNrKEBOdWxsYWJsZSBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBkaXNjb3ZlcnkgcmVxdWVzdCB3aGljaCBpbmZvcm1zIHRoZSBwcm92aWRlciBhYm91dCB0aGUKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRpc2NvdmVyeSByZXF1ZXN0IHRvIGluZm9ybSB0aGUgcHJvdmlkZXIgYWJvdXQgdGhlIGtpbmRzIG9mCi0gICAgICogcm91dGVzIHRoYXQgaXRzIGNsaWVudHMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKE9iamVjdHNDb21wYXQuZXF1YWxzKG1EaXNjb3ZlcnlSZXF1ZXN0LCByZXF1ZXN0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICBpZiAoIW1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSkgewotICAgICAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpIHsKLSAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQobURpc2NvdmVyeVJlcXVlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gdGhlIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBkaXNjb3ZlcnkgcmVxdWVzdH0KLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuZXZlciBhbiBhcHBsaWNhdGlvbnMgY2FsbHMge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrfSB0byByZWdpc3RlcgotICAgICAqIGEgY2FsbGJhY2ssIGl0IGFsc28gcHJvdmlkZXMgYSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdAotICAgICAqIGl0IGlzIGludGVyZXN0ZWQgaW4uICBUaGUgbWVkaWEgcm91dGVyIGNvbWJpbmVzIGFsbCBvZiB0aGVzZSBzZWxlY3RvcnMgdG9nZXRoZXIKLSAgICAgKiB0byBnZW5lcmF0ZSBhIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdH0gYW5kIG5vdGlmaWVzIGVhY2ggcHJvdmlkZXIgd2hlbiBhIGNoYW5nZQotICAgICAqIG9jY3VycyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlzY292ZXJ5UmVxdWVzdH0gd2hpY2ggcG9zdHMgYSBtZXNzYWdlIHRvIGludm9rZQotICAgICAqIHRoaXMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIGV4YW1pbmUgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfQotICAgICAqIGluIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCdzIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHRvIGRldGVybWluZSB3aGF0Ci0gICAgICoga2luZHMgb2Ygcm91dGVzIGl0IHNob3VsZCB0cnkgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIHBlcmZvcm0gYWN0aXZlCi0gICAgICogb3IgcGFzc2l2ZSBzY2Fucy4gIEluIG1hbnkgY2FzZXMsIHRoZSBwcm92aWRlciBtYXkgYmUgYWJsZSB0byBzYXZlIHBvd2VyIGJ5Ci0gICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0aGUgc2VsZWN0b3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2F0ZWdvcmllcyB0aGF0IGl0IHN1cHBvcnRzCi0gICAgICogYW5kIGl0IGNhbiB0aGVyZWZvcmUgYXZvaWQgcGVyZm9ybWluZyBhbnkgc2NhbnMgYXQgYWxsLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChATnVsbGFibGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQKLSAgICAgKiB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLiAgV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBieSByZWdpc3RlcmluZyBhIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAc2VlIENhbGxiYWNrI29uRGVzY3JpcHRvckNoYW5nZWQKLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZAotICAgICAqIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gYWJvdXQgdGhlIGNoYW5nZSB0byB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSB1cGRhdGVkIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlc2NyaXB0b3IoQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSBmYWxzZTsKLQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsIG1EZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZSB3aGljaCBpcyBhCi0gICAgICogbWVtYmVyIG9mIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSBtZW1iZXIgcm91dGUuCi0gICAgICogQHBhcmFtIHJvdXRlR3JvdXBJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSBncm91cC4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzY3JpYmVzIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlck1ldGFkYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotCi0gICAgICAgIFByb3ZpZGVyTWV0YWRhdGEoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tcG9uZW50TmFtZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBjb21wb25lbnQgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXJNZXRhZGF0YXsgY29tcG9uZW50TmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBjb250cm9sIG92ZXIgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgb2J0YWlucyBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcm91dGUgd2hlbmV2ZXIgaXQgbmVlZHMKLSAgICAgKiB0byBjb250cm9sIGEgcm91dGUuICBXaGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBtZWRpYSByb3V0ZXIgaW52b2tlcwotICAgICAqIHRoZSB7QGxpbmsgI29uU2VsZWN0fSBtZXRob2Qgb2YgaXRzIHJvdXRlIGNvbnRyb2xsZXIuICBXaGlsZSBzZWxlY3RlZCwKLSAgICAgKiB0aGUgbWVkaWEgcm91dGVyIG1heSBjYWxsIG90aGVyIG1ldGhvZHMgb2YgdGhlIHJvdXRlIGNvbnRyb2xsZXIgdG8KLSAgICAgKiByZXF1ZXN0IHRoYXQgaXQgcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgdG8gdGhlIHJvdXRlLiAgV2hlbiBhIHJvdXRlIGlzCi0gICAgICogdW5zZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzIHRoZSB7QGxpbmsgI29uVW5zZWxlY3R9IG1ldGhvZCBvZiBpdHMKLSAgICAgKiByb3V0ZSBjb250cm9sbGVyLiAgV2hlbiB0aGUgbWVkaWEgcm91dGUgbm8gbG9uZ2VyIG5lZWRzIHRoZSByb3V0ZSBjb250cm9sbGVyCi0gICAgICogaXQgd2lsbCBpbnZva2UgdGhlIHtAbGluayAjb25SZWxlYXNlfSBtZXRob2QgdG8gYWxsb3cgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZXJlIG1heSBiZSBtdWx0aXBsZSByb3V0ZSBjb250cm9sbGVycyBzaW11bHRhbmVvdXNseSBhY3RpdmUgZm9yIHRoZQotICAgICAqIHNhbWUgcm91dGUuICBFYWNoIHJvdXRlIGNvbnRyb2xsZXIgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgcm91dGUgY29udHJvbGxlciBhcmUgYXN5bmNocm9ub3VzIGFuZAotICAgICAqIHJlc3VsdHMgYXJlIGNvbW11bmljYXRlZCB2aWEgY2FsbGJhY2tzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWxlYXNlcyB0aGUgcm91dGUgY29udHJvbGxlciwgYWxsb3dpbmcgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZSBhbmQgcHJvdmlkZXMgYSByZWFzb24uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIGNhbGxzIHtAbGluayAjb25VbnNlbGVjdCgpfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm1zIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0Ci0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IG9uIGJlaGFsZiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaW50ZW5kcyB0byBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwKLSAgICAgICAgICogaW52b2tlIHRoZSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkLiAgRmFsc2UgaWYgdGhlIGNvbnRyb2xsZXIgd2lsbCBub3QKLSAgICAgICAgICogaGFuZGxlIHRoZSByZXF1ZXN0IGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aGVuIHJvdXRlIGluZm9ybWF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9yIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHByb3ZpZGVyIGFuZCBpdHMgcm91dGVzIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgdGhhdCBjaGFuZ2VkLCBuZXZlciBudWxsLgotICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgbmV3IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByb3ZpZGVySGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEZXNjcmlwdG9yQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgYW5kIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPVVRFUyA9ICJyb3V0ZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgcm91dGVzIHRoYXQgdGhpcyBwcm92aWRlciBoYXMgcHVibGlzaGVkLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVzKCkgewotICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiByb3V0ZUJ1bmRsZXMgPSBtQnVuZGxlLjxCdW5kbGU+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZUJ1bmRsZXMgPT0gbnVsbCB8fCByb3V0ZUJ1bmRsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IENvbGxlY3Rpb25zLjxNZWRpYVJvdXRlRGVzY3JpcHRvcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVCdW5kbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oY291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChNZWRpYVJvdXRlRGVzY3JpcHRvci5mcm9tQnVuZGxlKHJvdXRlQnVuZGxlcy5nZXQoaSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYW5kIGFsbCBvZiB0aGUgcm91dGVzIHRoYXQKLSAgICAgKiBpdCBjb250YWlucyBoYXZlIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgdmVyaWZpY2F0aW9uIGlzIGRlZXAuICBJZiB0aGUgcHJvdmlkZXIgZGVzY3JpcHRvciBpcyBrbm93biB0byBiZQotICAgICAqIHZhbGlkIHRoZW4gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHtAbGluayAjaXNWYWxpZH0gb24gZWFjaCBvZiBpdHMgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVSb3V0ZXMoKTsKLSAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gbVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCB8fCAhcm91dGUuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInJvdXRlcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldFJvdXRlcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZVJvdXRlcygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KGRlc2NyaXB0b3IubVJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUm91dGUoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgZGVzY3JpcHRvciBhbHJlYWR5IGFkZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiByb3V0ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIEJ1aWxkZXIgc2V0Um91dGVzKENvbGxlY3Rpb248TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgewotICAgICAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsIHx8IHJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnJlbW92ZShLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8Pihyb3V0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlQnVuZGxlcy5hZGQobVJvdXRlcy5nZXQoaSkuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTLCByb3V0ZUJ1bmRsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKG1CdW5kbGUsIG1Sb3V0ZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTkzNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wgewotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmljZS4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBjbGllbnQgdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVHSVNURVIgPSAxOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogVW5yZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOUkVHSVNURVIgPSAyOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogQ3JlYXRlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9ST1VURV9JRCA6IHJvdXRlIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIgPSAzOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUmVsZWFzZSByb3V0ZSBjb250cm9sbGVyLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSID0gNDsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFTEVDVF9ST1VURSA9IDU7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFID0gNjsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNldCByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSA9IDc7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVcGRhdGUgcm91dGUgdm9sdW1lLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGRlbHRhIGludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUgPSA4OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gb2JqICAgICA6IG1lZGlhIGNvbnRyb2wgaW50ZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QgPSA5OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0cyB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiBkaXNjb3ZlcnkgcmVxdWVzdCBidW5kbGUsIG9yIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUID0gMTA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9JRCA9ICJyb3V0ZUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQID0gInJvdXRlR3JvdXBJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVk9MVU1FID0gInZvbHVtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OID0gInVuc2VsZWN0UmVhc29uIjsKLQotICAgIC8qCi0gICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIHRvIHRoZSBjbGllbnQuCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGFueSB1bnJlY29nbml6ZWQgb3IgbWFsZm9ybWVkIHJlcXVlc3QuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSA9IDA7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBzdWNjZXNzZnVsIG1lc3NhZ2UuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUyA9IDE7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogc2VydmVyIHZlcnNpb24KLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQgPSAyOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZXNzIHJlc3VsdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCA9IDM7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IGZhaWx1cmUgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKiAtIFNFUlZJQ0VfREFUQV9FUlJPUjogZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQgPSA0OwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgY2hhbmdlZC4gICh1bnNvbGljaXRlZCBldmVudCkKLSAgICAgKiAtIGFyZzEgICAgOiByZXNlcnZlZCAoMCkKLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RBVEFfRVJST1IgPSAiZXJyb3IiOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIGNsaWVudCB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHYyNC4xLjAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBjbGllbnQgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9DVVJSRU5UID0gQ0xJRU5UX1ZFUlNJT05fMjsKLQotICAgIC8qCi0gICAgICogUmVjb2duaXplZCBzZXJ2ZXIgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IHNlcnZpY2UgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCA9IFNFUlZJQ0VfVkVSU0lPTl8xOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9TVEFSVCA9IENMSUVOVF9WRVJTSU9OXzE7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NlbmdlciBvYmplY3QgaXMgdmFsaWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lc3NlbmdlciBjb25zdHJ1Y3RvciBhbmQgdW5wYXJjZWxpbmcgY29kZSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIHRoZQotICAgICAqIHByb3ZpZGVkIElCaW5kZXIgaXMgYSB2YWxpZCBJTWVzc2VuZ2VyIG9iamVjdC4gIEFzIGEgcmVzdWx0LCBpdCdzIHBvc3NpYmxlCi0gICAgICogZm9yIGEgcGVlciB0byBzZW5kIGFuIGludmFsaWQgSUJpbmRlciB0aGF0IHdpbGwgcmVzdWx0IGluIGNyYXNoZXMgZG93bnN0cmVhbS4KLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgbWVzc2VuZ2VyIGlzIGluIGEgdmFsaWQgc3RhdGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtZXNzZW5nZXIgIT0gbnVsbCAmJiBtZXNzZW5nZXIuZ2V0QmluZGVyKCkgIT0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzZW5nZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBiaW5kZXIgaW50ZXJmYWNlIG90aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIElNZXNzZW5nZXIgdGhlbiB0aGUgY2FsbCB0byBnZXRCaW5kZXIoKSB3aWxsIGNyYXNoIHdpdGggYW4gTlBFLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2RlMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICogPHA+Ci0gKiBBIG1lZGlhIHJvdXRlciB3aWxsIGJpbmQgdG8gbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgd2hlbiBhIGNhbGxiYWNrIGlzIGFkZGVkIHZpYQotICoge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2ssIGludCl9IHdpdGggYSBkaXNjb3ZlcnkKLSAqIGZsYWc6IHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSwKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0sIG9yCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSwgYW5kIHdpbGwgdW5iaW5kIHdoZW4gdGhlIGNhbGxiYWNrCi0gKiBpcyByZW1vdmVkIHZpYSB7QGxpbmsgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soTWVkaWFSb3V0ZXIuQ2FsbGJhY2spfS4KLSAqIDwvcD48cD4KLSAqIFRvIGltcGxlbWVudCB5b3VyIG93biBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLCBleHRlbmQgdGhpcyBjbGFzcyBhbmQKLSAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyfSBtZXRob2QgdG8gcmV0dXJuIGFuCi0gKiBpbnN0YW5jZSBvZiB5b3VyIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9LgotICogPC9wPjxwPgotICogRGVjbGFyZSB5b3VyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgaW4geW91ciBhcHBsaWNhdGlvbiBtYW5pZmVzdAotICogbGlrZSB0aGlzOgotICogPC9wPgotICogPHByZT4KLSAqICAgJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIgotICogICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbXlfbWVkaWFfcm91dGVfcHJvdmlkZXJfc2VydmljZSI+Ci0gKiAgICAgICAmbHQ7aW50ZW50LWZpbHRlcj4KLSAqICAgICAgICAgICAmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIiAvPgotICogICAgICAgJmx0Oy9pbnRlbnQtZmlsdGVyPgotICogICAmbHQ7L3NlcnZpY2U+Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJTcnYiOyAvLyBtYXguIDIzIGNoYXJzCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+IG1DbGllbnRzID0gbmV3IEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7Ci0gICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjazsKLQotICAgIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0U7Ci0KLSAgICAvKgotICAgICAqIFByaXZhdGUgbWVzc2FnZXMgdXNlZCBpbnRlcm5hbGx5LiAgKFllcywgeW91IGNhbiByZW51bWJlciB0aGVzZS4pCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlKCkgewotICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICAgICAgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc3lzdGVtIHdoZW4gaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UsIG9yIG51bGwgaWYKLSAgICAgKiB0aGlzIHNlcnZpY2UgaGFzIGRlY2lkZWQgbm90IHRvIG9mZmVyIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE1lZGlhUm91dGVQcm92aWRlciBvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldE1lZGlhUm91dGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhTRVJWSUNFX0lOVEVSRkFDRSkpIHsKLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyUGFja2FnZSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBwcm92aWRlciB3aG9zZSBwYWNrYWdlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJuYW1lIG9mIHRoZSBzZXJ2aWNlLiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlIGNhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9ubHkgZXhwb3J0IGl0cyBvd24gbWVkaWEgcm91dGUgcHJvdmlkZXJzLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm92aWRlciBwYWNrYWdlIG5hbWU6ICIgKyBwcm92aWRlclBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiAgU2VydmljZSBwYWNrYWdlIG5hbWU6ICIgKyBnZXRQYWNrYWdlTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVNZXNzZW5nZXIuZ2V0QmluZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25VbmJpbmQoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24gPj0gQ0xJRU5UX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBuZXcgQ2xpZW50UmVjb3JkKG1lc3NlbmdlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUmVnaXN0ZXJlZCwgdmVyc2lvbj0iICsgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtUHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfUkVHSVNURVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubVZlcnNpb24pLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnJlZ2lzdGVyQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFVucmVnaXN0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBvbkJpbmRlckRpZWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogQmluZGVyIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsaWVudC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkLCBjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciBjcmVhdGVkLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcm91dGVJZD0iICsgcm91dGVJZCArICIsIHJvdXRlR3JvdXBJZD0iICsgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbGllbnQucmVsZWFzZVJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciByZWxlYXNlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHNlbGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVW5zZWxlY3RSb3V0ZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdChyZWFzb24pOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHVuc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXRSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB2b2x1bWUgY2hhbmdlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgdm9sdW1lPSIgKyB2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVXBkYXRlUm91dGVWb2x1bWUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSB1cGRhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBkZWx0YT0iICsgZGVsdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUm91dGVDb250cm9sUmVxdWVzdChmaW5hbCBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBmaW5hbCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgZmluYWwgaW50IGNvbnRyb2xsZXJJZCwgZmluYWwgSW50ZW50IGludGVudCkgewotICAgICAgICBmaW5hbCBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGludGVudD0iICsgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBlcnJvcj0iICsgZXJyb3IgKyAiLCBkYXRhPSIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRDbGllbnQobWVzc2VuZ2VyKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IsIGVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBkZWxpdmVyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2V0RGlzY292ZXJ5UmVxdWVzdChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWxseUNoYW5nZWQgPSBjbGllbnQuc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogU2V0IGRpc2NvdmVyeSByZXF1ZXN0LCByZXF1ZXN0PSIgKyByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjdHVhbGx5Q2hhbmdlZD0iICsgYWN0dWFsbHlDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3Q9IiArIG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZW5kRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgc2VuZFJlcGx5KGNsaWVudC5tTWVzc2VuZ2VyLCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKGRlc2NyaXB0b3IsIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZW50IGRlc2NyaXB0b3IgY2hhbmdlIGV2ZW50LCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBCdW5kbGUgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgaW50IGNsaWVudFZlcnNpb24pIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoZGVzY3JpcHRvcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Um91dGVzKG51bGwpOwotICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogZGVzY3JpcHRvci5nZXRSb3V0ZXMoKSkgewotICAgICAgICAgICAgaWYgKGNsaWVudFZlcnNpb24gPj0gcm91dGUuZ2V0TWluQ2xpZW50VmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICYmIGNsaWVudFZlcnNpb24gPD0gcm91dGUuZ2V0TWF4Q2xpZW50VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKS5hc0J1bmRsZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gdXBkYXRlQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKLSAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgY29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgc2VsZWN0b3JCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gbUNsaWVudHMuZ2V0KGkpLm1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoIXJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5pc0VtcHR5KCkgfHwgcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTY2FuIHw9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoY29tcG9zaXRlLmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlci5hZGRTZWxlY3RvcihyZXF1ZXN0LmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvckJ1aWxkZXIuYnVpbGQoKSwgYWN0aXZlU2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCwgY29tcG9zaXRlKSkgewotICAgICAgICAgICAgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QgPSBjb21wb3NpdGU7Ci0gICAgICAgICAgICBtUHJvdmlkZXIuc2V0RGlzY292ZXJ5UmVxdWVzdChjb21wb3NpdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xpZW50UmVjb3JkIGdldENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBtQ2xpZW50cy5nZXQoaW5kZXgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZmluZENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNsaWVudC5oYXNNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY0ZhaWx1cmUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSwgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZEdlbmVyaWNTdWNjZXNzKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MsIHJlcXVlc3RJZCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kUmVwbHkoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHdoYXQsCi0gICAgICAgICAgICBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7Ci0gICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgZGllZC4KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvICIgKyBnZXRDbGllbnRJZChtZXNzZW5nZXIpLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldENsaWVudElkKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgcmV0dXJuICJDbGllbnQgY29ubmVjdGlvbiAiICsgbWVzc2VuZ2VyLmdldEJpbmRlcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQUklWQVRFX01TR19DTElFTlRfRElFRDoKLSAgICAgICAgICAgICAgICAgICAgb25CaW5kZXJEaWVkKChNZXNzZW5nZXIpbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpZW50UmVjb3JkIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwdWJsaWMgZmluYWwgTWVzc2VuZ2VyIG1NZXNzZW5nZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+KCk7Ci0KLSAgICAgICAgcHVibGljIENsaWVudFJlY29yZChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgdmVyc2lvbikgewotICAgICAgICAgICAgbU1lc3NlbmdlciA9IG1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMudmFsdWVBdChpKS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotCi0gICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7Ci0KLSAgICAgICAgICAgIHNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzZW5nZXIoTWVzc2VuZ2VyIG90aGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKSA9PSBvdGhlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCwKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmluZGV4T2ZLZXkoY29udHJvbGxlcklkKSA8IDApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZUdyb3VwSWQgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbVByb3ZpZGVyLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgZ2V0Um91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW5zIG9uIGEgYmluZGVyIHRocmVhZC4KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShQUklWQVRFX01TR19DTElFTlRfRElFRCwgbU1lc3Nlbmdlcikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGllbnRJZChtTWVzc2VuZ2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlCi0gICAgICogdG8gcHJldmVudCB0aGUgc2VydmljZSBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIG9uZSBvZiB0aGUgY2xpZW50cyBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgc2VydmVyJ3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBjbGllbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlPiBtU2VydmljZVJlZjsKLQotICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICBtU2VydmljZVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+KHNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBtc2cucmVwbHlUbzsKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKHdoYXQsIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGdldENsaWVudElkKG1lc3NlbmdlcikgKyAiOiBNZXNzYWdlIGZhaWxlZCwgd2hhdD0iICsgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgYXJnPSIgKyBhcmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvYmo9IiArIG9iaiArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljRmFpbHVyZShtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSWdub3JpbmcgbWVzc2FnZSB3aXRob3V0IHZhbGlkIHJlcGx5IG1lc3Nlbmdlci4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlJFR0lTVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByb3V0ZUlkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlR3JvdXBJZCA9IGRhdGEuZ2V0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZWxlY3RSb3V0ZShtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uID0gZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhLmdldEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHJlYXNvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0Um91dGVWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCB2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VcGRhdGVSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJvdXRlQ29udHJvbFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCAoSW50ZW50KW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5mcm9tQnVuZGxlKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNldERpc2NvdmVyeVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmlzVmFsaWQoKSA/IHJlcXVlc3QgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2OWIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2Ygcm91dGVzIHRoYXQgYXBwbGljYXRpb25zIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIgYW5kIHVzZS4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+RXhhbXBsZTwvaDM+Ci0gKiA8cHJlPgotICogTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgLmJ1aWxkKCk7Ci0gKgotICogTWVkaWFSb3V0ZXIgcm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gKiByb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxiYWNrLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZVNlbGVjdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0NBVEVHT1JJRVMgPSAiY29udHJvbENhdGVnb3JpZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBMaXN0PFN0cmluZz4gbUNvbnRyb2xDYXRlZ29yaWVzOwotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgdGhhdCB3aWxsIG5vdCBtYXRjaCBhbnkgcm91dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFSb3V0ZVNlbGVjdG9yIEVNUFRZID0gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihuZXcgQnVuZGxlKCksIG51bGwpOwotCi0gICAgTWVkaWFSb3V0ZVNlbGVjdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8U3RyaW5nPiBjb250cm9sQ2F0ZWdvcmllcykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBjb250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSBpbiB0aGUgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGNhdGVnb3JpZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb250cm9sQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsIHx8IG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNhdGVnb3J5IGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udHJvbENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5nZXQoaSkuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9sIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgbGlzdCBvZiBjb250cm9sIGZpbHRlcnMgdG8gY29uc2lkZXIuCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKExpc3Q8SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2F0ZWdvcnlDb3VudCA9IG1Db250cm9sQ2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnlDb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGZpbHRlckNvdW50ID0gZmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3J5Q291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQ2F0ZWdvcnkobUNvbnRyb2xDYXRlZ29yaWVzLmdldChqKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBiZSBleGFtaW5lZC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zQWxsKHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgZG9lcyBub3Qgc3BlY2lmeSBhbnkgY2FwYWJpbGl0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnMobnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlU2VsZWN0b3IpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBvdGhlciA9IChNZWRpYVJvdXRlU2VsZWN0b3IpbzsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBvdGhlci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5lcXVhbHMob3RoZXIubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVNlbGVjdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiY29udHJvbENhdGVnb3JpZXM9IikuYXBwZW5kKAotICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sQ2F0ZWdvcmllcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGZyb21CdW5kbGUoQE51bGxhYmxlIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgYnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBzZWxlY3RvciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3Rpbmcgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWxlY3Rvci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yeX0gdG8gdGhlIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gYWRkIHRvIHRoZSBzZXQgb2YgZGVzaXJlZCBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfS4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3JpZXMgVGhlIGxpc3QgY2F0ZWdvcmllcyB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yaWVzKEBOb25OdWxsIENvbGxlY3Rpb248U3RyaW5nPiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcmllcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3J5KGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIHRoZSBjb250ZW50cyBvZiBhbiBleGlzdGluZyBtZWRpYSByb3V0ZSBzZWxlY3RvciB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUgYWRkZWQuCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3JpZXMoc2VsZWN0b3IuZ2V0Q29udHJvbENhdGVnb3JpZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBidWlsZCgpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMDUyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkFjdGl2aXR5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuVm9sdW1lUHJvdmlkZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUHJvdmlkZXJNZXRhZGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTWVkaWFSb3V0ZXIgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIHRoZSByb3V0aW5nIG9mIG1lZGlhIGNoYW5uZWxzCi0gKiBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZSB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy4KLSAqIDxwPgotICogQSBNZWRpYVJvdXRlciBpbnN0YW5jZSBpcyByZXRyaWV2ZWQgdGhyb3VnaCB7QGxpbmsgI2dldEluc3RhbmNlfS4gIEFwcGxpY2F0aW9ucwotICogY2FuIHF1ZXJ5IHRoZSBtZWRpYSByb3V0ZXIgYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBhbmQgaXRzIGNhcGFiaWxpdGllcwotICogdG8gZGV0ZXJtaW5lIGhvdyB0byBzZW5kIGNvbnRlbnQgdG8gdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uICBBcHBsaWNhdGlvbnMgY2FuCi0gKiBhbHNvIHtAbGluayBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IHNlbmQgY29udHJvbCByZXF1ZXN0c30gdG8gdGhlIHJvdXRlCi0gKiB0byBhc2sgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9ucwotICogc3VjaCBhcyBwbGF5aW5nIG1lZGlhLgotICogPC9wPjxwPgotICogU2VlIGFsc28ge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBhbiBhcHBsaWNhdGlvbgotICogY2FuIHB1Ymxpc2ggbmV3IG1lZGlhIHJvdXRlcyB0byB0aGUgbWVkaWEgcm91dGVyLgotICogPC9wPjxwPgotICogVGhlIG1lZGlhIHJvdXRlciBBUEkgaXMgbm90IHRocmVhZC1zYWZlOyBhbGwgaW50ZXJhY3Rpb25zIHdpdGggaXQgbXVzdCBiZQotICogZG9uZSBmcm9tIHRoZSBtYWluIHRocmVhZCBvZiB0aGUgcHJvY2Vzcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlciI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHJlYXNvbiB0aGUgcm91dGUKLSAgICAgKiB3YXMgdW5zZWxlY3RlZCBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9VTktOT1dOID0gMDsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBkaXNjb25uZWN0IGJ1dHRvbiB0byBkaXNjb25uZWN0IGFuZCBrZWVwIHBsYXlpbmcuCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVEZXNjcmlwdG9yI2NhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKLSAgICAgKiB0aGUgc3RvcCBjYXN0aW5nIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA9IDI7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHNlbGVjdGVkCi0gICAgICogYSBkaWZmZXJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQgPSAzOwotCi0gICAgLy8gTWFpbnRhaW5zIGdsb2JhbCBtZWRpYSByb3V0ZXIgc3RhdGUgZm9yIHRoZSBwcm9jZXNzLgotICAgIC8vIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgaW4gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoKSBiZWZvcmUgYW55Ci0gICAgLy8gTWVkaWFSb3V0ZXIgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIHNvIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUKLSAgICAvLyB2YWxpZCB3aGVuZXZlciBhbnkgaW5zdGFuY2UgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgc3RhdGljIEdsb2JhbE1lZGlhUm91dGVyIHNHbG9iYWw7Ci0KLSAgICAvLyBDb250ZXh0LWJvdW5kIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1DYWxsYmFja1JlY29yZHMgPSBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgQEludERlZihmbGFnID0gdHJ1ZSwKLSAgICAgICAgICAgIHZhbHVlID0gewotICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4sCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlksCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgIH0KLSAgICApCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDYWxsYmFja0ZsYWdzIHt9Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogQWN0aXZlbHkgc2NhbiBmb3Igcm91dGVzIHdoaWxlIHRoaXMgY2FsbGJhY2sKLSAgICAgKiBpcyByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIGFjdGl2ZWx5IHNjYW4gZm9yIG5ldwotICAgICAqIHJvdXRlcy4gIENlcnRhaW4gcm91dGVzLCBzdWNoIGFzIHdpZmkgZGlzcGxheSByb3V0ZXMsIG1heSBub3QgYmUgZGlzY292ZXJhYmxlCi0gICAgICogZXhjZXB0IHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcuICBUaGlzIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgcm91dGUgcGlja2VyCi0gICAgICogZGlhbG9nIGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlciB0byBlbnN1cmUgdGhhdCB0aGUgcm91dGUgaW5mb3JtYXRpb24gaXMKLSAgICAgKiB1cCB0byBkYXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBY3RpdmUgc2Nhbm5pbmcgbWF5IGNvbnN1bWUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgcG93ZXIgYW5kIG1heSBoYXZlIGludHJ1c2l2ZQotICAgICAqIGVmZmVjdHMgb24gd2lyZWxlc3MgY29ubmVjdGl2aXR5LiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0IGFjdGl2ZSBzY2FubmluZwotICAgICAqIG9ubHkgYmUgcmVxdWVzdGVkIHdoZW4gaXQgaXMgYWN0dWFsbHkgbmVlZGVkIHRvIHNhdGlzZnkgYSB1c2VyIHJlcXVlc3QgdG8KLSAgICAgKiBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbmV3IHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGZsYWcgaW1wbGllcyB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGJ1dCBwZXJmb3JtaW5nCi0gICAgICogYWN0aXZlIHNjYW5zIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgdGhhbiBhIG5vcm1hbCBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOID0gMSA8PCAwOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IERvIG5vdCBmaWx0ZXIgcm91dGUgZXZlbnRzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IGFueQotICAgICAqIHJvdXRlIGV2ZW4gaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIGNhbGxiYWNrJ3MgZmlsdGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTID0gMSA8PCAxOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV4Y2VwdCBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgdHJ5IHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiBBbHRob3VnaCByb3V0ZSBkaXNjb3ZlcnkgaXMgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50LCBjaGVja2luZyBmb3IgbmV3IHJvdXRlcyBtYXkKLSAgICAgKiByZXN1bHQgaW4gc29tZSBuZXR3b3JrIGFjdGl2aXR5IGFuZCBjb3VsZCBzbG93bHkgZHJhaW4gdGhlIGJhdHRlcnkuICBUaGVyZWZvcmUKLSAgICAgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgc3BlY2lmeSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IHdoZW4KLSAgICAgKiB0aGV5IGFyZSBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kIGFuZCB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCB0aGUKLSAgICAgKiBvcHRpb24gb2YgY29ubmVjdGluZyB0byBuZXcgcm91dGVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHR5cGljYWxseSBhZGQgYSBjYWxsYmFjayB1c2luZyB0aGlzIGZsYWcgaW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGFjdGl2aXR5J3N9IHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnR9Ci0gICAgICogbWV0aG9kIGFuZCByZW1vdmUgaXQgaW4gdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wfSBtZXRob2QuCi0gICAgICogVGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudH0gZnJhZ21lbnQgbWF5Ci0gICAgICogYWxzbyBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnCi0gICAgICogd2lsbCBiZSBpZ25vcmVkLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZID0gMSA8PCAyOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV2ZW4gb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcwotICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgotICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKLSAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4gIFJlZmVyIHRvCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkgPSAxIDw8IDM7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBJZ25vcmUgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtYXRjaGluZyBub24tZGVmYXVsdCByb3V0ZSBpcyBhdmFpbGFibGUuCi0gICAgICogVGhpcyBjb25zdHJhaW50IG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIG9mZmVyIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZwotICAgICAqIHRvIHRoZSB1c2VyLiAgVGhlcmUgaXMgbm8gcG9pbnQgb2ZmZXJpbmcgdGhlIGNob29zZXIgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogbm9uLWRlZmF1bHQgY2hvaWNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUgPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBSZXF1aXJlIGFuIGFjdHVhbCByb3V0ZSB0byBiZSBtYXRjaGVkLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCByZXR1cm4gdHJ1ZQotICAgICAqIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZiBkaXNjb3ZlcnkgaXMgbm90IGluCi0gICAgICogcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8KLSAgICAgKiBzYXZlIHJlc291cmNlcyBieSByZW1vdmluZyB0aGUgbmVlZCB0byBwZXJmb3JtIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uCi0gICAgICoge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCBvbmx5IHJldHVybiB0cnVlIGlmCi0gICAgICogYSBtYXRjaGluZyByb3V0ZSBoYXMgYWN0dWFsbHkgYmVlbiBkaXNjb3ZlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIID0gMSA8PCAxOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlcn0gaW5zdGFuY2UsIHN1Y2ggYXMgYnkgc3RvcmluZyB0aGUgaW5zdGFuY2UgaW4gYSBmaWVsZCBvZgotICAgICAqIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0byBlbnN1cmUgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHJlbWFpbnMgYWxpdmUKLSAgICAgKiBhcyBsb25nIGFzIHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBpdHMgZmVhdHVyZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgc3VwcG9ydCBsaWJyYXJ5IG9ubHkgaG9sZHMgYSB7QGxpbmsgV2Vha1JlZmVyZW5jZSB3ZWFrIHJlZmVyZW5jZX0KLSAgICAgKiB0byBlYWNoIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4gIFdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZXIgaW5zdGFuY2UsIGFsbCBvZiBpdHMgY2FsbGJhY2tzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcm91dGUgZGlzY292ZXJ5Ci0gICAgICogd2lsbCBubyBsb25nZXIgYmUgcGVyZm9ybWVkIG9uIGl0cyBiZWhhbGYuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGVyIGluc3RhbmNlIGZvciB0aGUgY29udGV4dC4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGhvbGQKLSAgICAgKiBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgYXMgbG9uZyBhcyBpdCBpcyBpbiB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlciBnZXRJbnN0YW5jZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgc0dsb2JhbCA9IG5ldyBHbG9iYWxNZWRpYVJvdXRlcihjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXIoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IGN1cnJlbnRseSBrbm93biB0bwotICAgICAqIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyByb3V0ZSBwcm92aWRlcnN9Ci0gICAgICogY3VycmVudGx5IGtub3duIHRvIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0UHJvdmlkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN5c3RlbSBhbHdheXMgcHJvdmlkZXMgYSBkZWZhdWx0IHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJsdWV0b290aCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgYmx1ZXRvb3RoIHJvdXRlLCBpZiBleGlzdCwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgcm91dGUncwotICAgICAqIHtAbGluayBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgbWVkaWEgY29udHJvbCBpbnRlbnQgZmlsdGVyc30gdG8gYXNzZXNzIHRoZQotICAgICAqIGNhcGFiaWxpdGllcyBvZiB0aGUgcm91dGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIHB1YmxpYyBib29sZWFuIHBsYXlNb3ZpZSgpIHsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqCi0gICAgICogICAgIC8vIEZpcnN0IHRyeSB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIGludGVyZmFjZSwgaWYgc3VwcG9ydGVkLgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogICAgICAgICAvLyBUcnkgdG8gc2VuZCBpdCB0aGUgVXJpIG9mIHRoZSBtb3ZpZSB0byBwbGF5LgotICAgICAqICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgKiAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgICAgICAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbnVsbCk7Ci0gICAgICogICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNlbnQgdGhlIHJlcXVlc3QgdG8gcGxheSB0aGUgbW92aWUKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIElmIHJlbW90ZSBwbGF5YmFjayB3YXMgbm90IHBvc3NpYmxlLCB0aGVuIHBsYXkgbG9jYWxseS4KLSAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIGxpdmUgdmlkZW8gc3RyZWFtaW5nLgotICAgICAqICAgICAgICAgLy8gUHJlcGFyZSB0byBwbGF5IGNvbnRlbnQgbG9jYWxseSBpbiBhIHdpbmRvdyBvciBpbiBhIHByZXNlbnRhdGlvbi4KLSAgICAgKiAgICAgICAgIHJldHVybiBwbGF5TW92aWVJbldpbmRvdygpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gTmVpdGhlciBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkLCBzbyB3ZSBjYW4ndCBwbGF5IHRoZSBtb3ZpZSB0byB0aGlzIHJvdXRlLgotICAgICAqICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLCBvdGhlcndpc2UKLSAgICAgKiBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCByZXR1cm5zIGl0LiBJZiB0aGVyZSBpcyBvbmUgbGl2ZSBhdWRpbyByb3V0ZQotICAgICAqICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKSwgaXQgd2lsbCBiZSBzZWxlY3RlZCBpbnN0ZWFkIG9mIGRlZmF1bHQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUKLSAgICAgKiBuZXdseSBzZWxlY3RlZCBkZWZhdWx0IHJvdXRlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVNlbGVjdG9yCi0gICAgICogQHNlZSBSb3V0ZUluZm8jbWF0Y2hlc1NlbGVjdG9yCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIHVwZGF0ZVNlbGVjdGVkUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVTZWxlY3RlZFJvdXRlOiAiICsgc2VsZWN0b3IpOwotICAgICAgICB9Ci0gICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAoIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBzZWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZWxlY3RSb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnNlbGVjdHMgdGhlIGN1cnJlbnQgcm91bmQgYW5kIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgaW5zdGVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhc29uIGdpdmVuIG11c3QgYmUgb25lIG9mOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBkaXNjb25uZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgaWYgKHJlYXNvbiA8IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOIHx8Ci0gICAgICAgICAgICAgICAgcmVhc29uID4gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJlYXNvbiB0byB1bnNlbGVjdCByb3V0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIC8vIENob29zZSB0aGUgZmFsbGJhY2sgcm91dGUgaWYgaXQncyBub3QgYWxyZWFkeSBzZWxlY3RlZC4KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgIFJvdXRlSW5mbyBmYWxsYmFja1JvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgIGlmIChzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSAhPSBmYWxsYmFja1JvdXRlKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKGZhbGxiYWNrUm91dGUsIHJlYXNvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCksIHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSByb3V0ZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcm91dGVzIHRoYXQgbWF0Y2ggdGhlCi0gICAgICogc2VsZWN0b3IgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIElmIHRoZQotICAgICAqIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuCi0gICAgICogdGhlIG1ldGhvZCB3aWxsIG9ubHkgY29uc2lkZXIgbm9uLWRlZmF1bHQgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgbWV0aG9kCi0gICAgICogd2lsbCByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYKLSAgICAgKiBkaXNjb3ZlcnkgaXMgbm90IGluIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4KLSAgICAgKiBVc2Uge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfSB0byByZXF1aXJlIGFuIGFjdHVhbCBtYXRjaC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgYSByb3V0ZSBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZS4gTWF5IGJlIHplcm8gb3Igc29tZSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gYW5kCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9LgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoaW5nIHJvdXRlIG1heSBiZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIHJldHVybiBzR2xvYmFsLmlzUm91dGVBdmFpbGFibGUoc2VsZWN0b3IsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKLSAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfSB3aXRob3V0IGZsYWdzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBhZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZWxlY3RvciBkZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0bwotICAgICAqIGRpc2NvdmVyLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UKLSAgICAgKiBsaXZlIGF1ZGlvIHJvdXRlcyB0aGVuIGl0IHNob3VsZCBpbmNsdWRlIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJTyBsaXZlIGF1ZGlvIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3J5fQotICAgICAqIGluIGl0cyBzZWxlY3RvciB3aGVuIGl0IGFkZHMgYSBjYWxsYmFjayB0byB0aGUgbWVkaWEgcm91dGVyLgotICAgICAqIFRoZSBzZWxlY3RvciBtYXkgaW5jbHVkZSBhbnkgbnVtYmVyIG9mIGNhdGVnb3JpZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gdGhlIHNlbGVjdG9yIGlzIGFkZGVkIHRvCi0gICAgICogdGhlIHNldCBvZiBzZWxlY3RvcnMgYmVpbmcgbW9uaXRvcmVkIGJ5IHRoZSBjYWxsYmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQnkgZGVmYXVsdCwgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3Qgcm91dGVzCi0gICAgICogdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLiAgRXZlbnQgZmlsdGVyaW5nIG1heSBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nCi0gICAgICogdGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30gZmxhZyB3aGVuIHRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSBtZXRob2QgdG8gZGV0ZXJtaW5lCi0gICAgICogd2hldGhlciBpcyBpdCBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIHJvdXRlIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzCi0gICAgICogYW5kIHRoZXJlZm9yZSB3aGV0aGVyIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoaWxlIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIGlzIGluIHRoZSBmb3JlZ3JvdW5kIHRvIHJlcXVlc3QgdGhhdCBwYXNzaXZlIGRpc2NvdmVyeSBiZSBwZXJmb3JtZWQgaWYgdGhlcmUgYXJlCi0gICAgICogc3VmZmljaWVudCByZXNvdXJjZXMgdG8gYWxsb3cgY29udGludW91cyBwYXNzaXZlIGRpc2NvdmVyeS4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnIHdpbGwgYmUKLSAgICAgKiBpZ25vcmVkIHRvIGNvbnNlcnZlIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbgotICAgICAqIHBhc3NpdmUgZGlzY292ZXJ5IGFic29sdXRlbHkgbXVzdCBiZSBwZXJmb3JtZWQsIGV2ZW4gb24gbG93LVJBTSBkZXZpY2VzLgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBpcyBzaG93aW5nIHRvIGNvbmZpcm0gdGhlIHByZXNlbmNlIG9mIGF2YWlsYWJsZQotICAgICAqIHJvdXRlcyB0aGF0IHRoZSB1c2VyIG1heSBjb25uZWN0IHRvLiAgVGhpcyBmbGFnIG1heSB1c2Ugc3Vic3RhbnRpYWxseSBtb3JlCi0gICAgICogcG93ZXIuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgKgotICAgICAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAqCi0gICAgICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gICAgICogICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOwotICAgICAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICAgICAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gICAgICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICAgICAqCi0gICAgICogICAgICAgICBtZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLnVwZGF0ZVNlbGVjdGVkUm91dGUobVNlbGVjdG9yKTsKLSAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICAgICAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICogICAgICAgICAvLyBJbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyBhcyBuZWVkZWQuCi0gICAgICogICAgIH0KLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCi0gICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLgotICAgICAqIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2Yge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQENhbGxiYWNrRmxhZ3MgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZENhbGxiYWNrOiBzZWxlY3Rvcj0iICsgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYWxsYmFjaz0iICsgY2FsbGJhY2sgKyAiLCBmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2FsbGJhY2tSZWNvcmQgcmVjb3JkOwotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZWNvcmQgPSBuZXcgQ2FsbGJhY2tSZWNvcmQodGhpcywgY2FsbGJhY2spOwotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG1DYWxsYmFja1JlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoKGZsYWdzICYgfnJlY29yZC5tRmxhZ3MpICE9IDApIHsKLSAgICAgICAgICAgIHJlY29yZC5tRmxhZ3MgfD0gZmxhZ3M7Ci0gICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVjb3JkLm1TZWxlY3Rvci5jb250YWlucyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJlY29yZC5tU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIocmVjb3JkLm1TZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdG9yKHNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZU5lZWRlZCkgewotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suICBJdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGV2ZW50cyBhYm91dAotICAgICAqIGNoYW5nZXMgdG8gbWVkaWEgcm91dGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlQ2FsbGJhY2s6IGNhbGxiYWNrPSIgKyBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kQ2FsbGJhY2tSZWNvcmQoQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlY29yZHMuZ2V0KGkpLm1DYWxsYmFjayA9PSBjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIGFkZC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5hZGRQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIHJlbW92ZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50IHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lCi0gICAgICogb2YgdGhlIHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZW1vdGUgY29udHJvbCBjbGllbnQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB0aGUgYXVkaW8gbWFuYWdlciB1c2luZyB0aGUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3JlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudAotICAgICAqIEF1ZGlvTWFuYWdlci5yZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnR9IG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0gdG8gcmVnaXN0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgewotICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fQotICAgICAqICAgICAgICAgICAgdG8gdW5yZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCi0gICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyBtZWRpYSBzZXNzaW9ucy4gU2V0IHRoZQotICAgICAqIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24gVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9ufSB0bwotICAgICAqICAgICAgICAgICAgdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3QgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uOiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbihtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb21wYXQgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIHtAbGluayBNZWRpYVNlc3Npb25Db21wYXR9LgotICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uQ29tcGF0OiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbkNvbXBhdChtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldE1lZGlhU2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IGNhbGxzIGludG8gdGhlIG1lZGlhIHJvdXRlciBhcmUgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgotICAgICAqIEl0IHBheXMgdG8gYmUgYSBsaXR0bGUgcGFyYW5vaWQgd2hlbiBnbG9iYWwgc3RhdGUgaW52YXJpYW50cyBhcmUgYXQgcmlzay4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBjaGVja0NhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSAhPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgbXVzdCBvbmx5IGJlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYWNjZXNzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZXF1YWwoVCBhLCBUIGIpIHsKLSAgICAgICAgcmV0dXJuIGEgPT0gYiB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIG1lZGlhIHJvdXRlIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfQotICAgICAqIHtAbGluayAjZ2V0Q29udHJvbEZpbHRlcnMgaW50ZW50IGZpbHRlcnN9IHRoYXQgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKLSAgICAgKiByb3V0ZSBhbmQgdGhlIG1hbm5lciBpbiB3aGljaCBpdCBpcyB1c2VkIGFuZCBjb250cm9sbGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJJbmZvIG1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0b3JJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotICAgICAgICBwcml2YXRlIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrU3RyZWFtOwotICAgICAgICBwcml2YXRlIGludCBtRGV2aWNlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lTWF4OwotICAgICAgICBwcml2YXRlIERpc3BsYXkgbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FOwotICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotCi0gICAgICAgIEBJbnREZWYoe0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBDb25uZWN0aW9uU3RhdGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORyA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQgPSAyOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1RZUEVfTE9DQUwsUExBWUJBQ0tfVFlQRV9SRU1PVEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1R5cGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcGxheWJhY2sgdHlwZSwgImxvY2FsIiwgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYQotICAgICAgICAgKiBpcyBoYXBwZW5pbmcgb24gdGhlIHNhbWUgZGV2aWNlIChlLmcuIGEgcGhvbmUsIGEgdGFibGV0KSBhcyB3aGVyZSBpdCBpcwotICAgICAgICAgKiBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9MT0NBTCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcGxheWJhY2sgdHlwZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZyBvbgotICAgICAgICAgKiBhIGRpZmZlcmVudCBkZXZpY2UgKGkuZS4gdGhlIHJlbW90ZSBkZXZpY2UpIHRoYW4gd2hlcmUgaXQgaXMgY29udHJvbGxlZCBmcm9tLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfUkVNT1RFID0gMTsKLQotICAgICAgICBASW50RGVmKHtERVZJQ0VfVFlQRV9VTktOT1dOLCBERVZJQ0VfVFlQRV9UViwgREVWSUNFX1RZUEVfU1BFQUtFUiwgREVWSUNFX1RZUEVfQkxVRVRPT1RIfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgRGV2aWNlVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgdHlwZSBpcyB1bmtub3duLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9VTktOT1dOID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKLSAgICAgICAgICogb24gYSBUVi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVFYgPSAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1NQRUFLRVIgPSAyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIGJsdWV0b290aCBkZXZpY2Ugc3VjaCBhcyBhIGJsdWV0b290aCBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9CTFVFVE9PVEggPSAzOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1ZPTFVNRV9GSVhFRCxQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1ZvbHVtZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgZml4ZWQsIGkuZS4gaXQgY2Fubm90IGJlCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbSB0aGlzIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBmaXhlZCBwbGF5YmFjayB2b2x1bWUgaXMgYSByZW1vdGUgcGxheWVyLAotICAgICAgICAgKiBwbGF5aW5nIG92ZXIgSERNSSB3aGVyZSB0aGUgdXNlciBwcmVmZXJzIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvbiB0aGUgSERNSSBzaW5rLCByYXRoZXIKLSAgICAgICAgICogdGhhbiBhdHRlbnVhdGUgYXQgdGhlIHNvdXJjZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9GSVhFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyB2YXJpYWJsZSBhbmQgY2FuIGJlIGNvbnRyb2xsZWQKLSAgICAgICAgICogZnJvbSB0aGlzIG9iamVjdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkIGluZGljYXRpbmcgbm8gcHJlc2VudGF0aW9uIGRpc3BsYXkgaXMgYXNzb2NpYXRlZAotICAgICAgICAgKiB3aXRoIHRoZSByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUgPSAtMTsKLQotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9HRU5FUkFMID0gMSA8PCAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9WT0xVTUUgPSAxIDw8IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZID0gMSA8PCAyOwotCi0gICAgICAgIC8vIFNob3VsZCBtYXRjaCB0byBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FLgotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7Ci0KLSAgICAgICAgUm91dGVJbmZvKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBtVW5pcXVlSWQgPSB1bmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm92aWRlciBvZiB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb3ZpZGVySW5mbyBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSB1bmlxdWUgaWQgZnVuY3Rpb25zIGFzIGEgc3RhYmxlIGlkZW50aWZpZXIgYnkgd2hpY2ggdGhlIHJvdXRlIGlzIGtub3duLgotICAgICAgICAgKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIGlkIGFzIGEgdG9rZW4gdG8gcmVtZW1iZXIgdGhlCi0gICAgICAgICAqIHNlbGVjdGVkIHJvdXRlIGFjcm9zcyByZXN0YXJ0cyBvciB0byBjb21tdW5pY2F0ZSBpdHMgaWRlbnRpdHkgdG8gYSBzZXJ2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUsIG5ldmVyIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIGEgbWVkaWEgcm91dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgcHJlc2VudGVkCi0gICAgICAgICAqIHRvIHVzZXJzIHdobyBtYXkgc2VsZWN0IHRoaXMgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkIGFuZCBtYXkgYmUgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QKLSAgICAgICAgICogeWV0IHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCi0gICAgICAgICAqIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3Ige0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICAgICAqLwotICAgICAgICBAQ29ubmVjdGlvblN0YXRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0U2VsZWN0ZWRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldERlZmF1bHRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRCbHVldG9vdGhSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZXZpY2VTcGVha2VyKCkgewotICAgICAgICAgICAgaW50IGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKLSAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfYXVkaW9fcm91dGVfbmFtZSIsICJzdHJpbmciLCAiYW5kcm9pZCIpOwotICAgICAgICAgICAgcmV0dXJuIGlzRGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICYmIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRUZXh0KGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQpLmVxdWFscyhtTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyB0aGF0Ci0gICAgICAgICAqIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZSBhbmQgdGhlIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0aGF0Ci0gICAgICAgICAqIGl0IHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnRlbnQgZmlsdGVycyB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRoYXQKLSAgICAgICAgICogdGhpcyByb3V0ZSBzdXBwb3J0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sUmVxdWVzdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKiBkZXNjcmliZWQgYnkgYSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUgY2FwYWJpbGl0aWVzIHRvIGNoZWNrLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoZXNDb250cm9sRmlsdGVycyhtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yaWVzIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZQotICAgICAgICAgKiBzdWNoIGFzIHdoZXRoZXIgaXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyBzdHJlYW1pbmcgb3IgcmVtb3RlIHBsYXliYWNrLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAotICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGNhdGVnb3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeSBhbmQgYWN0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBhY3Rpb25zIGRlc2NyaWJlIHNwZWNpZmljIHJlcXVlc3RzIHRoYXQgYW4gYXBwbGljYXRpb24KLSAgICAgICAgICogY2FuIGFzayBhIHJvdXRlIHRvIHBlcmZvcm0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEBwYXJhbSBhY3Rpb24gQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGFjdGlvbgotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGFjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbEFjdGlvbihATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnksIEBOb25OdWxsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG1Db250cm9sRmlsdGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShjYXRlZ29yeSkgJiYgZmlsdGVyLmhhc0FjdGlvbihhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW50ZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBzR2xvYmFsLmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLm1hdGNoKGNvbnRlbnRSZXNvbHZlciwgaW50ZW50LCB0cnVlLCBUQUcpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbmRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0IHRvIGJlIHBlcmZvcm1lZAotICAgICAgICAgKiBhc3luY2hyb25vdXNseSBieSB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQotICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgQ29udHJvbCByZXF1ZXN0cwotICAgICAgICAgKiBzZW50IHRvIHVuc2VsZWN0ZWQgcm91dGVzIHdpbGwgZmFpbC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIHtAbGluayBDb250cm9sUmVxdWVzdENhbGxiYWNrfSB0byBpbnZva2Ugd2l0aCB0aGUgcmVzdWx0Ci0gICAgICAgICAqIG9mIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlc3VsdCBpcyByZXF1aXJlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIHNHbG9iYWwuc2VuZENvbnRyb2xSZXF1ZXN0KHRoaXMsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVFlQRV9MT0NBTH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tUeXBlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYXVkaW8gc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgI0RFVklDRV9UWVBFX1RWfSBvciB7QGxpbmsgI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VUeXBlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgewotICAgICAgICAgICAgaWYgKGlzRGVmYXVsdCgpIHx8IG1EZXZpY2VUeXBlID09IERFVklDRV9UWVBFX0JMVUVUT09USCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHBsYXRmb3JtIHZlcnNpb24gMjMgb3IgYmVsb3cgd2hlcmUgdGhlIHN5c3RlbSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgZG9lc24ndCBzcGVjaWZ5IGRldmljZSB0eXBlIGZvciBibHVldG9vdGggbWVkaWEgcm91dGVzLgotICAgICAgICAgICAgcmV0dXJuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgICAgICYmIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByb3V0ZSBpcyBzZWxlY3RhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIHN0aWxsIHZhbGlkIGFuZCBlbmFibGVkLgotICAgICAgICAgICAgLy8gVGhlIHJvdXRlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IHRvIG51bGwgd2hlbiB0aGUgcm91dGUgaXMgcmVtb3ZlZC4KLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvciAhPSBudWxsICYmIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcihNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5nZXRNZXRhZGF0YSgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgQFBsYXliYWNrVm9sdW1lCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdm9sdW1lIGZvciB0aGlzIHJvdXRlLiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5Ci0gICAgICAgICAqIGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAqIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZU1heDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyByb3V0ZSBzdXBwb3J0cyBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaW50ZXJydXB0aW5nCi0gICAgICAgICAqIHBsYXliYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBjYW4gZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLAotICAgICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbkRpc2Nvbm5lY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgYSB2b2x1bWUgY2hhbmdlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldFZvbHVtZU1heH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0U2V0Vm9sdW1lKHRoaXMsIE1hdGgubWluKG1Wb2x1bWVNYXgsIE1hdGgubWF4KDAsIHZvbHVtZSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0VXBkYXRlVm9sdW1lKHRoaXMsIGRlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRGlzcGxheX0gdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gc2hvdwotICAgICAgICAgKiBhIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IG9uIGFuIGV4dGVybmFsIGRpc3BsYXkgd2hlbiB0aGlzIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5IGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICogc2VsZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseSBvZiB0aGUgcm91dGUKLSAgICAgICAgICogYmVpbmcgc2VsZWN0ZWQgb3IgdW5zZWxlY3RlZC4gIEZvciBleGFtcGxlLCB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogb2YgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIG1heSBjaGFuZ2Ugd2hlbiBhbiBleHRlcm5hbCBIRE1JIGRpc3BsYXkgaXMgY29ubmVjdGVkCi0gICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBldmVuIHRob3VnaCB0aGUgcm91dGUgaXRzZWxmIGhhcyBub3QgY2hhbmdlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgZGlzcGxheSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhlIHJvdXRlIG9yIGlmIHRoZSBkaXNwbGF5IGlzIG5vdCByZWFkeSB0byBzaG93IFVJIHlldC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogdXNpbmcgdGhlIHtAbGluayBDYWxsYmFjayNvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWR9IGNhbGxiYWNrIGFuZAotICAgICAgICAgKiBzaG93IG9yIGRpc21pc3MgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IGFjY29yZGluZ2x5IHdoZW4gdGhlIGRpc3BsYXkKLSAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgb3IgaXMgcmVtb3ZlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGZvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30gcm91dGVzLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSB0byB1c2Ugd2hlbiB0aGlzIHJvdXRlIGlzCi0gICAgICAgICAqIHNlbGVjdGVkIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTwotICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkID49IDAgJiYgbVByZXNlbnRhdGlvbkRpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gc0dsb2JhbC5nZXREaXNwbGF5KG1QcmVzZW50YXRpb25EaXNwbGF5SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIGV4dHJhIHByb3BlcnRpZXMgYWJvdXQgdGhpcyByb3V0ZSB0aGF0IHdlcmUgc3VwcGxpZWQKLSAgICAgICAgICogYnkgaXRzIG1lZGlhIHJvdXRlIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NJbnRlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzSW50ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhpcyBtZWRpYSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZSh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZUluZm97IHVuaXF1ZUlkPSIgKyBtVW5pcXVlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyBtTmFtZQotICAgICAgICAgICAgICAgICAgICArICIsIGRlc2NyaXB0aW9uPSIgKyBtRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBpY29uVXJpPSIgKyBtSWNvblVyaQotICAgICAgICAgICAgICAgICAgICArICIsIGVuYWJsZWQ9IiArIG1FbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGluZz0iICsgbUNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW9uU3RhdGU9IiArIG1Db25uZWN0aW9uU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYW5EaXNjb25uZWN0PSIgKyBtQ2FuRGlzY29ubmVjdAotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrVHlwZT0iICsgbVBsYXliYWNrVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrU3RyZWFtPSIgKyBtUGxheWJhY2tTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VUeXBlPSIgKyBtRGV2aWNlVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZUhhbmRsaW5nPSIgKyBtVm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWU9IiArIG1Wb2x1bWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVNYXg9IiArIG1Wb2x1bWVNYXgKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IiArIG1QcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXM9IiArIG1FeHRyYXMKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXR0aW5nc0ludGVudD0iICsgbVNldHRpbmdzSW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcHJvdmlkZXJQYWNrYWdlTmFtZT0iICsgbVByb3ZpZGVyLmdldFBhY2thZ2VOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIH0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB1cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtTmFtZSwgZGVzY3JpcHRvci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobURlc2NyaXB0aW9uLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtSWNvblVyaSwgZGVzY3JpcHRvci5nZXRJY29uVXJpKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JY29uVXJpID0gZGVzY3JpcHRvci5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAhPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW5nICE9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmcgPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25TdGF0ZSAhPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5lcXVhbHMoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZEFsbChkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVHlwZSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU3RyZWFtICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTdHJlYW0gPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlVHlwZSAhPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSA9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZUhhbmRsaW5nICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lSGFuZGxpbmcgPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZSAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWUgPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYXggIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWF4ID0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkICE9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRXh0cmFzLCBkZXNjcmlwdG9yLmdldEV4dHJhcygpKSkgewotICAgICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZGVzY3JpcHRvci5nZXRFeHRyYXMoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtU2V0dGluZ3NJbnRlbnQsIGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NJbnRlbnQgPSBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1DYW5EaXNjb25uZWN0ICE9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbkRpc2Nvbm5lY3QgPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldERlc2NyaXB0b3JJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcklkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIEBoaWRlICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSByb3V0ZSB0aGF0IGNvbnNpc3RzIG9mIG11bHRpcGxlIG90aGVyIHJvdXRlcyBpbiBhIGdyb3VwLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlR3JvdXAgZXh0ZW5kcyBSb3V0ZUluZm8gewotICAgICAgICBwcml2YXRlIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgUm91dGVHcm91cChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgc3VwZXIocHJvdmlkZXIsIGRlc2NyaXB0b3JJZCwgdW5pcXVlSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRSb3V0ZUNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlIGluIHRoaXMgZ3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggdG8gZmV0Y2gKLSAgICAgICAgICogQHJldHVybiBUaGUgcm91dGUgYXQgaW5kZXgKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGVBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzLmdldChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobVJvdXRlcy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMgPSBkZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGdyb3VwTWVtYmVySWRzLnNpemUoKSAhPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBzR2xvYmFsLmdldFVuaXF1ZUlkKGdldFByb3ZpZGVyKCksIGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIGdyb3VwTWVtYmVyID0gc0dsb2JhbC5nZXRSb3V0ZSh1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlcy5hZGQoZ3JvdXBNZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhbVJvdXRlcy5jb250YWlucyhncm91cE1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzID0gcm91dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VkID8gQ0hBTkdFX0dFTkVSQUwgOiAwKSB8IHN1cGVyLnVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgb2JqZWN0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMKLSAgICAgKiBwdWJsaXNoZWQgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVySW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc291cmNlc05vdEF2YWlsYWJsZTsKLQotICAgICAgICBQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXJJbnN0YW5jZSA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJJbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRDb21wb25lbnROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLSAgICAgICAgICAgIGlmIChtUmVzb3VyY2VzID09IG51bGwgJiYgIW1SZXNvdXJjZXNOb3RBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IHNHbG9iYWwuZ2V0UHJvdmlkZXJDb250ZXh0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvYnRhaW4gcmVzb3VyY2VzIGZvciByb3V0ZSBwcm92aWRlciBwYWNrYWdlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXNOb3RBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlUHJvdmlkZXJJbmZveyBwYWNrYWdlTmFtZT0iICsgZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBldmVudHMgYWJvdXQgbWVkaWEgcm91dGluZyBjaGFuZ2VzLgotICAgICAqIEFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuCi0gICAgICogPHA+Ci0gICAgICogQSBDYWxsYmFjayB3aWxsIG9ubHkgcmVjZWl2ZSBldmVudHMgcmVsZXZhbnQgdG8gcm91dGVzIHRoYXQgdGhlIGNhbGxiYWNrCi0gICAgICogd2FzIHJlZ2lzdGVyZWQgZm9yIHVubGVzcyB0aGUge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9Ci0gICAgICogZmxhZyB3YXMgc3BlY2lmaWVkIGluIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI3JlbW92ZUNhbGxiYWNrKENhbGxiYWNrKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogRm9yIGRldGFpbGVkIHJlYXNvbiwgb3ZlcnJpZGUge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfQotICAgICAgICAgKiBpbnN0ZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZH0uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcmVhc29uIHByb3ZpZGVkIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiBhZGRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHZvbHVtZSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSB2b2x1bWUgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZXMuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgYmVjb21lcwotICAgICAgICAgKiBhdmFpbGFibGUsIGlzIHJlbW92ZWQgb3IgaGFzIGNoYW5nZXMgdG8gc29tZSBvZiBpdHMgcHJvcGVydGllcyAoc3VjaCBhcyBpdHMgc2l6ZSkuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2UgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sUmVxdWVzdENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXN1bHQgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgRXJyb3IgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxsYmFja1JlY29yZCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAgICBwdWJsaWMgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgICAgcHVibGljIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIENhbGxiYWNrUmVjb3JkKE1lZGlhUm91dGVyIHJvdXRlciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSByb3V0ZXI7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclJvdXRlRXZlbnQoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHbG9iYWwgc3RhdGUgZm9yIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogPHA+Ci0gICAgICogTWVkaWEgcm91dGVzIGFuZCBtZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIGdsb2JhbCB0byB0aGUgcHJvY2VzczsgdGhlaXIKLSAgICAgKiBzdGF0ZSBhbmQgdGhlIGJ1bGsgb2YgdGhlIG1lZGlhIHJvdXRlciBpbXBsZW1lbnRhdGlvbiBsaXZlcyBoZXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBHbG9iYWxNZWRpYVJvdXRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuU3luY0NhbGxiYWNrLAotICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuQ2FsbGJhY2sgewotICAgICAgICBmaW5hbCBDb250ZXh0IG1BcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPj4gbVJvdXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBTdHJpbmc+IG1VbmlxdWVJZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UHJvdmlkZXJJbmZvPiBtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQ+IG1SZW1vdGVDb250cm9sQ2xpZW50cyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm8gPQotICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbygpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyQ2FsbGJhY2sgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgICAgICBmaW5hbCBDYWxsYmFja0hhbmRsZXIgbUNhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlckNvbXBhdCBtRGlzcGxheU1hbmFnZXI7Ci0gICAgICAgIGZpbmFsIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBtU3lzdGVtUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTG93UmFtOwotCi0gICAgICAgIHByaXZhdGUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgUm91dGVJbmZvIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXI7Ci0gICAgICAgIC8vIEEgbWFwIGZyb20gcm91dGUgZGVzY3JpcHRvciBJRCB0byBSb3V0ZUNvbnRyb2xsZXIgZm9yIHRoZSBtZW1iZXIgcm91dGVzIGluIHRoZSBjdXJyZW50bHkKLSAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgZ3JvdXAuCi0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUm91dGVDb250cm9sbGVyPiBtUm91dGVDb250cm9sbGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvblJlY29yZCBtTWVkaWFTZXNzaW9uOwotICAgICAgICBNZWRpYVNlc3Npb25Db21wYXQgbVJjY01lZGlhU2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQgbUNvbXBhdFNlc3Npb247Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIgbVNlc3Npb25BY3RpdmVMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2ZUNoYW5nZWQoKSB7Ci0gICAgICAgICAgICAgICAgaWYobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgR2xvYmFsTWVkaWFSb3V0ZXIoQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSBEaXNwbGF5TWFuYWdlckNvbXBhdC5nZXRJbnN0YW5jZShhcHBsaWNhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgbUxvd1JhbSA9IEFjdGl2aXR5TWFuYWdlckNvbXBhdC5pc0xvd1JhbURldmljZSgKLSAgICAgICAgICAgICAgICAgICAgKEFjdGl2aXR5TWFuYWdlcilhcHBsaWNhdGlvbkNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGUgcHJvdmlkZXIgZm9yIGludGVyb3BlcmF0aW5nIHdpdGgKLSAgICAgICAgICAgIC8vIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLiAgVGhpcyBvbmUgaXMgc3BlY2lhbCBhbmQgcmVjZWl2ZXMKLSAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIgPSBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIub2J0YWluKGFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgICAgIGFkZFByb3ZpZGVyKG1TeXN0ZW1Qcm92aWRlcik7Ci0KLSAgICAgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciByb3V0ZXMgcHVibGlzaGVkIGJ5IHJlZ2lzdGVyZWQgbWVkaWEgcm91dGUKLSAgICAgICAgICAgIC8vIHByb3ZpZGVyIHNlcnZpY2VzLgotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIgPSBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoCi0gICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3V0ZXIubUNvbnRleHQgPT0gY29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdXRlciA9IG5ldyBNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1Sb3V0ZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4ocm91dGVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb250ZXh0IGdldFByb3ZpZGVyQ29udGV4dChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgQ29udGV4dC5DT05URVhUX1JFU1RSSUNURUQpOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheShkaXNwbGF5SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtUm91dGVDb250cm9sbGVyTWFwLmdldChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZShTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIGluZm8gOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8ubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gZGVmYXVsdCByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJvdXRlLCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAoIW1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgcmVtb3ZlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLm1FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgZGlzYWJsZWQgcm91dGU6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKHJvdXRlLCB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPbiBsb3ctUkFNIGRldmljZXMsIGRvIG5vdCByZWx5IG9uIGFjdHVhbCBkaXNjb3ZlcnkgcmVzdWx0cyB1bmxlc3MgYXNrZWQgdG8uCi0gICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCkgPT0gMCAmJiBtTG93UmFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IGV4aXN0aW5nIHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBsb29rIGxpa2Ugd2UgY2FuIGZpbmQgYSBtYXRjaGluZyByb3V0ZSByaWdodCBub3cuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrIHNlbGVjdG9ycyBhbmQgYWN0aXZlIHNjYW4gZmxhZ3MuCi0gICAgICAgICAgICBib29sZWFuIGRpc2NvdmVyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tSZWNvcmQgY2FsbGJhY2sgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFNlbGVjdG9yKGNhbGxiYWNrLm1TZWxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsgLy8gcGVyZm9ybSBhY3RpdmUgc2NhbiBpbXBsaWVzIHJlcXVlc3QgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSBkaXNjb3ZlciA/IGJ1aWxkZXIuYnVpbGQoKSA6IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5lcXVhbHMoc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmlzQWN0aXZlU2NhbigpID09IGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSAmJiAhYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvciwgYWN0aXZlU2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGVkIGRpc2NvdmVyeSByZXF1ZXN0OiAiICsgbURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpc2NvdmVyICYmICFhY3RpdmVTY2FuICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3JjaW5nIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uIGEgbG93LVJBTSBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInN5c3RlbSBwZXJmb3JtYW5jZSBtYXkgYmUgYWZmZWN0ZWQuICBQbGVhc2UgY29uc2lkZXIgdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSBpbnN0ZWFkIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXJzLgotICAgICAgICAgICAgZmluYWwgaW50IHByb3ZpZGVyQ291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgYWRkZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0FEREVELCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBSZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhtUHJvdmlkZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgLy8gNC4gU2V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBVbnJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDIuIENsZWFyIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMy4gRGVsZXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBSZW1vdmUgdGhlIHByb3ZpZGVyIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIHJlbW92ZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX1JFTU9WRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZSA9PSBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm92aWRlckNvbnRlbnRzKFByb3ZpZGVySW5mbyBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnVwZGF0ZURlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3Rpbmcgcm91dGVzIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgb2YgdGhlaXIgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gcm91dGVEZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGluZyByb3V0ZSBncm91cCdzIGNvbnRlbnRzIHJlcXVpcmVzIGFsbCBtZW1iZXIgcm91dGVzJyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ3JvdXBzIHRvIHRoZSBsaXN0cyBhbmQgdXBkYXRlIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IGFkZGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IHVwZGF0ZWRHcm91cHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yID0gcm91dGVEZXNjcmlwdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gcm91dGVEZXNjcmlwdG9yLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNvdXJjZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSByb3V0ZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gYXNzaWduUm91dGVVbmlxdWVJZChwcm92aWRlciwgaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXAgPSByb3V0ZURlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBpc0dyb3VwID8gbmV3IFJvdXRlR3JvdXAocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3V0ZUluZm8ocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuYWRkKHRhcmdldEluZGV4KyssIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGFkZGl0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3Jpbmcgcm91dGUgZGVzY3JpcHRvciB3aXRoIGR1cGxpY2F0ZSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBSZW9yZGVyIHRoZSByb3V0ZSB3aXRoaW4gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChwcm92aWRlci5tUm91dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVXBkYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGNoYW5nZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5ldyBhbmQvb3IgZXhpc3RpbmcgZ3JvdXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiBhZGRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHBhaXIuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IHVwZGF0ZWRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHBhaXIuc2Vjb25kKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGludmFsaWQgcHJvdmlkZXIgZGVzY3JpcHRvcjogIiArIHByb3ZpZGVyRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEaXNwb3NlIGFsbCByZW1haW5pbmcgcm91dGVzIHRoYXQgZG8gbm90IGhhdmUgbWF0Y2hpbmcgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIERlbGV0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gUmVtb3ZlIHRoZSByb3V0ZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgbm90aWZ5IGNsaWVudHMgYWJvdXQgcm91dGVzIHRoYXQgd2VyZSByZW1vdmVkLgotICAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgdXBkYXRpbmcgdGhlIHNlbGVjdGVkIHJvdXRlIHRvIGVuc3VyZQotICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgb2JzZXJ2ZXMgdGhlIG5ldyByb3V0ZQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHJlbW92YWwgc2luY2UgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcmVtb3ZlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9SRU1PVkVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGNoYW5nZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0NIQU5HRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShSb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKGNoYW5nZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfR0VORVJBTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1ZPTFVNRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHZvbHVtZSBjaGFuZ2VkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlVW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIC8vIEFsdGhvdWdoIHJvdXRlIGRlc2NyaXB0b3IgaWRzIGFyZSB1bmlxdWUgd2l0aGluIGEgcHJvdmlkZXIsIGl0J3MKLSAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSB0d28gcHJvdmlkZXJzIHdpdGggdGhlIHNhbWUgcGFja2FnZSBuYW1lLgotICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG11c3QgZGVkdXBlIHRoZSBjb21wb3NpdGUgaWQuCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50TmFtZSArICI6IiArIHJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQodW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJFaXRoZXIgIiArIHJvdXRlRGVzY3JpcHRvcklkICsgIiBpc24ndCB1bmlxdWUgaW4gIiArIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9yIHdlJ3JlIHRyeWluZyB0byBhc3NpZ24gYSB1bmlxdWUgSUQgZm9yIGFuIGFscmVhZHkgYWRkZWQgcm91dGUiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVbmlxdWVJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCB1bmlxdWVJZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQobmV3VW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCBuZXdVbmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdVbmlxdWVJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUm91dGVCeVVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkTWFwLmdldChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlICE9IG51bGwgJiYgIW1EZWZhdWx0Um91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgZGVmYXVsdCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1EZWZhdWx0Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBkZWZhdWx0IHJvdXRlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiAhbUJsdWV0b290aFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGJsdWV0b290aCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGJsdWV0b290aCByb3V0ZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwgfHwgIW1TZWxlY3RlZFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVW5zZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUgYmVjYXVzZSBpdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoY2hvb3NlRmFsbGJhY2tSb3V0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzZWxlY3RlZCByb3V0ZSBpcyBhIHJvdXRlIGdyb3VwLCBzZWxlY3QvdW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGFkZGVkL3JlbW92ZWQgcm91dGUgbWVtYmVycy4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgZGVzY3JpcHRvciBJRHMgZm9yIHRoZSBuZXcgcm91dGUgZ3JvdXAuCi0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGlkU2V0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWRTZXQuYWRkKHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgcmVtb3ZlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4+IGl0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWRTZXQuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSBhZGRlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuY29udGFpbnNLZXkocm91dGUubURlc2NyaXB0b3JJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQocm91dGUubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayBpbmZvIGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGNob29zZUZhbGxiYWNrUm91dGUoKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHJvdXRlIGlzIHJlbW92ZWQgb3Igbm8gbG9uZ2VyIHNlbGVjdGFibGUsCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldmVydCB0byBhIGxpdmUgYXVkaW8gcm91dGUgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgIC8vIG9uZSAodXN1YWxseSBCbHVldG9vdGggQTJEUCkuICBGYWlsaW5nIHRoYXQsIHVzZQotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUgIT0gbURlZmF1bHRSb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgICAgICAgICAgICAgICAgJiYgIXJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbURlZmF1bHRSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLm1EZXNjcmlwdG9ySWQuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5ERUZBVUxUX1JPVVRFX0lEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGxvZ2dpbmcgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCB8fCAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgcm91dGUuaXNEZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBjYWxsU3RhY2sgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsU3RhY2tbM10gaXMgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IGNhbGxTdGFjay5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCBjYWxsZXIgPSBjYWxsU3RhY2tbaV07Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjYWxsZXIuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TWV0aG9kTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldExpbmVOdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFNlbGVjdGVkUm91dGVJbnRlcm5hbCBpcyBjYWxsZWQgd2hpbGUgc0dsb2JhbCBpcyBudWxsOiBwa2dOYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgd2hpbGUgYSBCVCByb3V0ZSBpcyBhdmFpbGFibGU6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHVuc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSArICIgcmVhc29uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1VOU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgOiBtUm91dGVDb250cm9sbGVyTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBzZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHIgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHIubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgLy8gU3lzdGVtIHJvdXRlIGlzIHNlbGVjdGVkLCBkbyBub3Qgc3luYyB0aGUgcm91dGUgd2Ugc2VsZWN0ZWQgYmVmb3JlLgotICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGludCBwcm92aWRlckluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhtU3lzdGVtUHJvdmlkZXIpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHByb3ZpZGVySW5kZXgpOwotICAgICAgICAgICAgICAgIGludCByb3V0ZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5nZXQocm91dGVJbmRleCkuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQ29udHJvbENsaWVudHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3Qgc2Vzc2lvbikgewotICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgc2Vzc2lvbikgewotICAgICAgICAgICAgbUNvbXBhdFNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uLnJlbW92ZU9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5hZGRPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KHNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uUmVjb3JkIG1lZGlhU2Vzc2lvblJlY29yZCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG1lZGlhU2Vzc2lvblJlY29yZDsKLSAgICAgICAgICAgIGlmIChtZWRpYVNlc3Npb25SZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFTZXNzaW9uLmdldFRva2VuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db21wYXRTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBhdFNlc3Npb24uZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgPT0gcmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0gPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tUeXBlID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC51cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gZ2V0RGVmYXVsdFJvdXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU2VsZWN0ZWRSb3V0ZSA9PSBnZXRCbHVldG9vdGhSb3V0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbCByb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFR5cGUgPSBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY29uZmlndXJlVm9sdW1lKGNvbnRyb2xUeXBlLCBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlci5DYWxsYmFjayB7Ci0gICAgICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IocHJvdmlkZXIsIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25SZWNvcmQgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgbU1zQ29tcGF0OwotCi0gICAgICAgICAgICBwcml2YXRlIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgbUNvbnRyb2xUeXBlOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXJDb21wYXQgbVZwQ29tcGF0OwotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBNZWRpYVNlc3Npb25Db21wYXQuZnJvbU1lZGlhU2Vzc2lvbihtQXBwbGljYXRpb25Db250ZXh0LCBtZWRpYVNlc3Npb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb25Db21wYXQpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBtZWRpYVNlc3Npb25Db21wYXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZVZvbHVtZShAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgICAgIGlmIChtVnBDb21wYXQgIT0gbnVsbCAmJiBjb250cm9sVHlwZSA9PSBtQ29udHJvbFR5cGUgJiYgbWF4ID09IG1NYXhWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBjaGFuZ2VkIGNvbnRyb2wgdHlwZSBvciBtYXgganVzdCBzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBjdXJyZW50IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQuc2V0Q3VycmVudFZvbHVtZShjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IHByb3ZpZGVyIGFuZCB1cGRhdGUKLSAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbmV3IFZvbHVtZVByb3ZpZGVyQ29tcGF0KGNvbnRyb2xUeXBlLCBtYXgsIGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhmaW5hbCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoZmluYWwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb1JlbW90ZShtVnBDb21wYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb0xvY2FsKG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Nc0NvbXBhdC5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZAotICAgICAgICAgICAgICAgIGltcGxlbWVudHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgbVJjY0NvbXBhdDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdCA9IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQub2J0YWluKG1BcHBsaWNhdGlvbkNvbnRleHQsIHJjYyk7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmNjQ29tcGF0LmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRQbGF5YmFja0luZm8obVBsYXliYWNrSW5mbyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbVRlbXBDYWxsYmFja1JlY29yZHMgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfTUFTSyA9IDB4ZmYwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9ST1VURSA9IDB4MDEwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9QUk9WSURFUiA9IDB4MDIwMDsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0FEREVEID0gTVNHX1RZUEVfUk9VVEUgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1JFTU9WRUQgPSBNU0dfVFlQRV9ST1VURSB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgMzsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNDsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA1OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1NFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA2OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1VOU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDc7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9BRERFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9SRU1PVkVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAyOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0NIQU5HRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDM7Ci0KLSAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShtc2csIG9iaikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaiwgaW50IGFyZykgewotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UobXNnLCBvYmopOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSA9IGFyZzsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMTsKLQotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1TR19ST1VURV9DSEFOR0VECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTZWxlY3RlZFJvdXRlKCkuZ2V0SWQoKS5lcXVhbHMoKChSb3V0ZUluZm8pIG9iaikuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIHN5c3RlbSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcih3aGF0LCBvYmopOwotCi0gICAgICAgICAgICAgICAgLy8gSW52b2tlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgY2FsbGJhY2tzIGJlZm9yZSBpbnZva2luZyB0aGVtIGluIGNhc2UgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIG9yIHJlbW92ZWQgZHVyaW5nIGRpc3BhdGNoLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuYWRkQWxsKHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWxsYmFja0NvdW50ID0gbVRlbXBDYWxsYmFja1JlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sobVRlbXBDYWxsYmFja1JlY29yZHMuZ2V0KGkpLCB3aGF0LCBvYmosIGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIoaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVBZGRlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVSZW1vdmVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUNoYW5nZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVNlbGVjdGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2VDYWxsYmFjayhDYWxsYmFja1JlY29yZCByZWNvcmQsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIgcm91dGVyID0gcmVjb3JkLm1Sb3V0ZXI7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2sgPSByZWNvcmQubUNhbGxiYWNrOwotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCAmIE1TR19UWVBFX01BU0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9ST1VURTogewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUm91dGVJbmZvIHJvdXRlID0gKFJvdXRlSW5mbylvYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZC5maWx0ZXJSb3V0ZUV2ZW50KHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVBZGRlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVTZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVU5TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1BST1ZJREVSOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlckluZm8gcHJvdmlkZXIgPSAoUHJvdmlkZXJJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0FEREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQWRkZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJSZW1vdmVkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQ2hhbmdlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDY1OTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIGEgbWVkaWEgc2Vzc2lvbiBpcyBjcmVhdGVkLCBpdCBpcyBpbml0aWFsbHkgaW4gdGhlCi0gKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFIGFjdGl2ZX0gc3RhdGUuICBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGVuZHMKLSAqIG5vcm1hbGx5LCBpdCB0cmFuc2l0aW9ucyB0byB0aGUge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEIGVuZGVkfSBzdGF0ZS4KLSAqIElmIHRoZSBtZWRpYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGR1ZSB0byBhbm90aGVyIHNlc3Npb24gZm9yY2libHkgdGFraW5nCi0gKiBjb250cm9sIG9mIHRoZSByb3V0ZSwgdGhlbiBpdCB0cmFuc2l0aW9ucyB0byB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gc3RhdGUuCi0gKiBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHN0YXRlIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFRvIG1vbml0b3Igc2Vzc2lvbiBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc2Vzc2lvbiBzdGFydCByZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25TdGF0dXMgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fU1RBVEUgPSAic2Vzc2lvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9RVUVVRV9QQVVTRUQgPSAicXVldWVQYXVzZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBBY3RpdmUuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gaXMgYWN0aXZlIGFuZCBpbiBjb250cm9sIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9BQ1RJVkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiBzdGF0ZTogRW5kZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gd2FzIGVuZGVkIG5vcm1hbGx5IHVzaW5nIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufSBhY3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgdGVybWluYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9FTkRFRCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBJbnZhbGlkYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgaW52YWxpZGF0ZWQgaW52b2x1bnRhcmlseSBkdWUgdG8KLSAgICAgKiBhbm90aGVyIHNlc3Npb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCA9IDI7Ci0KLSAgICBNZWRpYVNlc3Npb25TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gc3RhdGUuICBPbmUgb2Yge0BsaW5rICNTRVNTSU9OX1NUQVRFX0FDVElWRX0sCi0gICAgICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEfSwgb3Ige0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlc3Npb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1ZVBhdXNlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfUVVFVUVfUEFVU0VEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhU2Vzc2lvblN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uU3RhdGU9IikuYXBwZW5kKHNlc3Npb25TdGF0ZVRvU3RyaW5nKGdldFNlc3Npb25TdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcXVldWVQYXVzZWQ9IikuYXBwZW5kKGlzUXVldWVQYXVzZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2Vzc2lvblN0YXRlVG9TdHJpbmcoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImFjdGl2ZSI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfRU5ERUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmRlZCI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc2Vzc2lvblN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVNlc3Npb25TdGF0dXMgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25TdGF0dXMoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3RzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGFzIHRoZQotICAgICAgICAgKiByZWZlcmVuY2UgdGltZXN0YW1wLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXRlIFRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVNlc3Npb25TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNlc3Npb25TdGF0ZShpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfU0VTU0lPTl9TVEFURSwgc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcXVldWUgaXMgcGF1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UXVldWVQYXVzZWQoYm9vbGVhbiBxdWV1ZVBhdXNlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQsIHF1ZXVlUGF1c2VkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgb2JqZWN0fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TdGF0dXMgYnVpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhtQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU0ZTI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfUk9VVEVfSUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfVU5SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX0NVUlJFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9EQVRBX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9WRVJTSU9OXzE7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuaXNWYWxpZFJlbW90ZU1lc3NlbmdlcjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNYWludGFpbnMgYSBjb25uZWN0aW9uIHRvIGEgcGFydGljdWxhciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclByb3h5IjsgIC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TGlzdDxDb250cm9sbGVyPigpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQm91bmQ7Ci0gICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1BY3RpdmVDb25uZWN0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGlvblJlYWR5OwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0LCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEoY29tcG9uZW50TmFtZSkpOwotCi0gICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgbVByaXZhdGVIYW5kbGVyID0gbmV3IFByaXZhdGVIYW5kbGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsIEBOb25OdWxsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb3V0ZUdyb3VwSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVHcm91cElkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQ29ubmVjdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIgPSAoc2VydmljZSAhPSBudWxsID8gbmV3IE1lc3NlbmdlcihzZXJ2aWNlKSA6IG51bGwpOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucmVnaXN0ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGhpcyArICI6IFNlcnZpY2UgcmV0dXJuZWQgaW52YWxpZCBtZXNzZW5nZXIgYmluZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlIGNvbm5lY3Rpb24gIiArIG1Db21wb25lbnROYW1lLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50TmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTdGFydGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0b3BwaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWJpbmRJZkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IG51bGwgJiYgc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCaW5kaW5nKCkgewotICAgICAgICBpZiAoc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICBiaW5kKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRCaW5kKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBCaW5kIHdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiBoYXMgYW4gYWN0aXZlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoaXMgcHJvdmlkZXIncyByb3V0ZXMgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIW1Db250cm9sbGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmQoKSB7Ci0gICAgICAgIGlmICghbUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEludGVudCBzZXJ2aWNlID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLnNldENvbXBvbmVudChtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Cb3VuZCA9IGdldENvbnRleHQoKS5iaW5kU2VydmljZShzZXJ2aWNlLCB0aGlzLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICAgICAgICAgIGlmICghbUJvdW5kICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVuYmluZCgpIHsKLSAgICAgICAgaWYgKG1Cb3VuZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogVW5iaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Cb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnVuYmluZFNlcnZpY2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMgPSBkZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gcm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUuZ2V0SWQoKS5lcXVhbHMocm91dGVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmFkZChjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25SZWFkeShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9IGdldERpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgZXJyb3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgY29ubmVjdGlvbiBlcnJvciAtICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBEZXNjcmlwdG9yIGNoYW5nZWQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGRldGFjaENvbnRyb2xsZXJzRnJvbUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db250cm9sbGVyUmVsZWFzZWQoQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgIGNvbnRyb2xsZXIuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaENvbnRyb2xsZXJzVG9Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuZ2V0KGkpLmRldGFjaENvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm91dGVHcm91cElkOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGE7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1Db25uZWN0aW9uOwotICAgICAgICBwcml2YXRlIGludCBtQ29udHJvbGxlcklkOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgICAgICBtUm91dGVJZCA9IHJvdXRlSWQ7Ci0gICAgICAgICAgICBtUm91dGVHcm91cElkID0gcm91dGVHcm91cElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSBjb25uZWN0aW9uLmNyZWF0ZVJvdXRlQ29udHJvbGxlcihtUm91dGVJZCwgbVJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdTZXRWb2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1NldFZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaENvbm5lY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgICAgIG9uQ29udHJvbGxlclJlbGVhc2VkKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0KCkgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnVuc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCwgcmVhc29uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCB2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1NldFZvbHVtZSA9IHZvbHVtZTsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udXBkYXRlVm9sdW1lKG1Db250cm9sbGVySWQsIGRlbHRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSArPSBkZWx0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uLnNlbmRDb250cm9sUmVxdWVzdChtQ29udHJvbGxlcklkLCBpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbiBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjZWl2ZUhhbmRsZXIgbVJlY2VpdmVIYW5kbGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLQotICAgICAgICBwcml2YXRlIGludCBtTmV4dFJlcXVlc3RJZCA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0Q29udHJvbGxlcklkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVNlcnZpY2VWZXJzaW9uOyAvLyBub24temVybyB3aGVuIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZQotCi0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8Q29udHJvbFJlcXVlc3RDYWxsYmFjaz4gbVBlbmRpbmdDYWxsYmFja3MgPQotICAgICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPigpOwotCi0gICAgICAgIHB1YmxpYyBDb25uZWN0aW9uKE1lc3NlbmdlciBzZXJ2aWNlTWVzc2VuZ2VyKSB7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3NlbmdlciA9IHNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgICAgICBtUmVjZWl2ZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobVJlY2VpdmVIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IG1OZXh0UmVxdWVzdElkKys7Ci0gICAgICAgICAgICBpZiAoIXNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVHSVNURVIsCi0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgIENMSUVOVF9WRVJTSU9OX0NVUlJFTlQsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5SRUdJU1RFUiwgMCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbFBlbmRpbmdDYWxsYmFja3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmFpbFBlbmRpbmdDYWxsYmFja3MoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGVuZGluZ0NhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnZhbHVlQXQoaSkub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNGYWlsdXJlKGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkVycm9yKHRoaXMsICJSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY1N1Y2Nlc3MoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblJlZ2lzdGVyZWQoaW50IHJlcXVlc3RJZCwgaW50IHNlcnZpY2VWZXJzaW9uLAotICAgICAgICAgICAgICAgIEJ1bmRsZSBkZXNjcmlwdG9yQnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VWZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVxdWVzdElkID09IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQKLSAgICAgICAgICAgICAgICAgICAgJiYgc2VydmljZVZlcnNpb24gPj0gU0VSVklDRV9WRVJTSU9OXzEpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gMDsKLSAgICAgICAgICAgICAgICBtU2VydmljZVZlcnNpb24gPSBzZXJ2aWNlVmVyc2lvbjsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5mcm9tQnVuZGxlKGRlc2NyaXB0b3JCdW5kbGUpKTsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25SZWFkeSh0aGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRGVzY3JpcHRvckNoYW5nZWQoQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gIT0gMCkgewotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZChpbnQgcmVxdWVzdElkLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3RGYWlsZWQoaW50IHJlcXVlc3RJZCwgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGllZChDb25uZWN0aW9uLnRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQgPSBtTmV4dENvbnRyb2xsZXJJZCsrOwotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCwgcm91dGVJZCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUm91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdFJvdXRlKGludCBjb250cm9sbGVySWQsIGludCByZWFzb24pIHsKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBleHRyYXMucHV0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwgcmVhc29uKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCBkZWx0YSk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZW5kQ29udHJvbFJlcXVlc3QoaW50IGNvbnRyb2xsZXJJZCwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpbnQgcmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmIChzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBjb250cm9sbGVySWQsIGludGVudCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5wdXQocmVxdWVzdElkLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgMCwgcmVxdWVzdCAhPSBudWxsID8gcmVxdWVzdC5hc0J1bmRsZSgpIDogbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFJlcXVlc3QoaW50IHdoYXQsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgICAgICBtc2cud2hhdCA9IHdoYXQ7Ci0gICAgICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICAgICAgbXNnLm9iaiA9IG9iajsKLSAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICAgICAgbXNnLnJlcGx5VG8gPSBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuc2VuZChtc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2aWNlIGRpZWQuCi0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAod2hhdCAhPSBDTElFTlRfTVNHX1VOUkVHSVNURVIpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byBzZXJ2aWNlLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uCi0gICAgICogdG8gcHJldmVudCB0aGUgY2xpZW50IGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2UgdGhlIHNlcnZpY2UgaXMgaG9sZGluZyBhbgotICAgICAqIGFjdGl2ZSByZWZlcmVuY2UgdG8gdGhlIGNsaWVudCdzIG1lc3Nlbmdlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBoYW5kbGVyIHNob3VsZCBub3QgYmUgdXNlZCB0byBoYW5kbGUgYW55IG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhvc2UKLSAgICAgKiB0aGF0IGNvbWUgZnJvbSB0aGUgc2VydmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPENvbm5lY3Rpb24+IG1Db25uZWN0aW9uUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4oY29ubmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvblJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKGNvbm5lY3Rpb24sIHdoYXQsIHJlcXVlc3RJZCwgYXJnLCBvYmosIGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVW5oYW5kbGVkIG1lc3NhZ2UgZnJvbSBzZXJ2ZXI6ICIgKyBtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NNZXNzYWdlKENvbm5lY3Rpb24gY29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY0ZhaWx1cmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5vbkdlbmVyaWNTdWNjZXNzKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19SRUdJU1RFUkVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vblJlZ2lzdGVyZWQocmVxdWVzdElkLCBhcmcsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkRlc2NyaXB0b3JDaGFuZ2VkKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IChkYXRhID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoU0VSVklDRV9EQVRBX0VSUk9SKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0RmFpbGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGVycm9yLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFmNjQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogV2F0Y2hlcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgdG8gYmUgaW5zdGFsbGVkLgotICogQWRkcyBhIHByb3ZpZGVyIHRvIHRoZSBtZWRpYSByb3V0ZXIgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzZXJ2aWNlLgotICoKLSAqIEBzZWUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+IG1Qcm92aWRlcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZzsKLQotICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcihDb250ZXh0IGNvbnRleHQsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0NIQU5HRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVQTEFDRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVTVEFSVEVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7Ci0gICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlciwgZmlsdGVyLCBudWxsLCBtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgIC8vIFNjYW4gcGFja2FnZXMuCi0gICAgICAgICAgICAvLyBBbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcmVzdGFydGluZyBwcm92aWRlcnMgaWYgbmVlZGVkLgotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtU2NhblBhY2thZ2VzUnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKG1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtU2NhblBhY2thZ2VzUnVubmFibGUpOwotCi0gICAgICAgICAgICAvLyBTdG9wIGFsbCBwcm92aWRlcnMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2NhblBhY2thZ2VzKCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGZvciBhbGwgbmV3IHNlcnZpY2VzLgotICAgICAgICAvLyBSZW9yZGVyIHRoZSBsaXN0IHNvIHRoYXQgcHJvdmlkZXJzIGxlZnQgYXQgdGhlIGVuZCB3aWxsIGJlIHRoZSBvbmVzIHRvIHJlbW92ZS4KLSAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgIGZvciAoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gOiBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsIDApKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc291cmNlSW5kZXggPSBmaW5kUHJvdmlkZXIoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQodGFyZ2V0SW5kZXgrKywgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suYWRkUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPj0gdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsgLy8gcmVzdGFydCB0aGUgcHJvdmlkZXIgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlYmluZElmRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAobVByb3ZpZGVycywgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSBwcm92aWRlcnMgZm9yIG1pc3Npbmcgc2VydmljZXMuCi0gICAgICAgIGlmICh0YXJnZXRJbmRleCA8IG1Qcm92aWRlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIuaGFzQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1TY2FuUGFja2FnZXNSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVNjYW5QYWNrYWdlc1J1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKLSAgICAgICAgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjY0NDliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGZlYXR1cmVzIG9mIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gKgotICogSGlkZGVuIGZvciBub3cgYnV0IHdlIG1pZ2h0IHdhbnQgdG8gbWFrZSB0aGlzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBmdXR1cmUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJjYzsKLSAgICBwcm90ZWN0ZWQgVm9sdW1lQ2FsbGJhY2sgbVZvbHVtZUNhbGxiYWNrOwotCi0gICAgcHJvdGVjdGVkIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJjYyA9IHJjYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgb2J0YWluKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgcmNjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCwgcmNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUmNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mb3JtYXRpb24uCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB0byBhdHRhY2ggdG8gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmZvIFRoZSBwbGF5YmFjayBpbmZvcm1hdGlvbi4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZSByZXF1ZXN0cyBmcm9tIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHZvbHVtZSBjYWxsYmFjayB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Wb2x1bWVDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxheWJhY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm8gewotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZTsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVNYXg7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lSGFuZGxpbmcgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrU3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLSAgICAgICAgcHVibGljIGludCBwbGF5YmFja1R5cGUgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdm9sdW1lIHVwZGF0ZXMgYXJlIHJlcXVlc3RlZCBieSB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBzaG91bGQgYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiBBbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGUgdm9sdW1lIGlzIHRvIGJlIGluY3JlYXNlZAotICAgICAgICAgKiAocG9zaXRpdmUgdmFsdWUpIG9yIGRlY3JlYXNlZCAobmVnYXRpdmUgdmFsdWUpLgotICAgICAgICAgKiBGb3IgYnVuZGxlZCBjaGFuZ2VzLCB0aGUgYWJzb2x1dGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbmdlcwotICAgICAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIGUuZy4gKzMgY29ycmVzcG9uZHMgdG8gdGhyZWUgInZvbHVtZSB1cCIgY2hhbmdlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBmb3IgdGhlIHJvdXRlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbmV3IHZvbHVtZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkLAotICAgICAgICAgKiBhbHdheXMgYmV0d2VlbiAwIGFuZCB0aGUgdmFsdWUgc2V0IGJ5IHtAbGluayBQbGF5YmFja0luZm8jdm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KLSAgICAgKiBEb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gZm9yIEplbGx5YmVhbi4KLSAgICAgKgotICAgICAqIFRoZSBiYXNpYyBpZGVhIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gYXR0YWNoIHRoZSBSQ0MgdG8gYSBVc2VyUm91dGVJbmZvCi0gICAgICogaW4gb3JkZXIgdG8gaG9vayB1cCBzdHJlYW0gbWV0YWRhdGEgYW5kIHZvbHVtZSBjYWxsYmFja3MgYmVjYXVzZSB0aGVyZSBpcyBubwotICAgICAqIG90aGVyIEFQSSBhdmFpbGFibGUgdG8gZG8gc28gaW4gdGhpcyBwbGF0Zm9ybSB2ZXJzaW9uLiAgVGhlIFVzZXJSb3V0ZUluZm8gaXRzZWxmCi0gICAgICogaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBNZWRpYVJvdXRlciBzbyBpdCBpcyB0cmFuc3BhcmVudCB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZU9iajsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWdpc3RlcmVkOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcmNjKTsKLQotICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgIiIsIGZhbHNlKTsKLSAgICAgICAgICAgIG1Vc2VyUm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWUpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lTWF4KTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1R5cGUpOwotCi0gICAgICAgICAgICBpZiAoIW1SZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2sobVVzZXJSb3V0ZU9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKHRoaXMpKSk7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRSZW1vdGVDb250cm9sQ2xpZW50KG1Vc2VyUm91dGVPYmosIG1SY2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgZnJhbWV3b3JrIG5ldmVyIHVucmVnaXN0ZXJzIGl0cyB2b2x1bWUgb2JzZXJ2ZXIgZnJvbQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNlcnZpY2Ugc28gdGhlIFVzZXJSb3V0ZUluZm8gb2JqZWN0IG1heSBsZWFrIGFsb25nIHdpdGgKLSAgICAgICAgICAgIC8vIGFueSBjYWxsYmFja3MgdGhhdCB3ZSBhdHRhY2ggdG8gaXQuICBVc2UgYSB3ZWFrIHJlZmVyZW5jZSB0byBwcmV2ZW50Ci0gICAgICAgICAgICAvLyB0aGUgdm9sdW1lIGNhbGxiYWNrIGZyb20gaG9sZGluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byBhbnl0aGluZyBpbXBvcnRhbnQuCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4gbUltcGxXZWFrOwotCi0gICAgICAgICAgICBwdWJsaWMgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKEplbGx5YmVhbkltcGwgaW1wbCkgewotICAgICAgICAgICAgICAgIG1JbXBsV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPEplbGx5YmVhbkltcGw+KGltcGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lVXBkYXRlUmVxdWVzdChkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgSmVsbHliZWFuSW1wbCBpbXBsID0gbUltcGxXZWFrLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgaW1wbC5tVm9sdW1lQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbXBsLm1Wb2x1bWVDYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUxNDk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHBsYXlpbmcgbWVkaWEgb24gcmVtb3RlIHJvdXRlcyB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBkZWZpbmVkIGJ5IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnR9LgotICogPHA+Ci0gKiBUaGUgY2xpZW50IG1haW50YWlucyBzZXNzaW9uIHN0YXRlIGFuZCBvZmZlcnMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSBmb3IgaXNzdWluZwotICogcmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgaW50ZW50cyB0byBhIHNpbmdsZSByb3V0ZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVBsYXliYWNrQ2xpZW50IHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVQbGF5YmFja0NsaWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgZmluYWwgQWN0aW9uUmVjZWl2ZXIgbUFjdGlvblJlY2VpdmVyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbU1lc3NhZ2VQZW5kaW5nSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2s7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmc7Ci0KLSAgICBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBTdGF0dXNDYWxsYmFjayBtU3RhdHVzQ2FsbGJhY2s7Ci0gICAgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGZvciBhIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSBtZWRpYSByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVtb3RlUGxheWJhY2tDbGllbnQoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJvdXRlID0gcm91dGU7Ci0KLSAgICAgICAgSW50ZW50RmlsdGVyIGFjdGlvbkZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKTsKLSAgICAgICAgbUFjdGlvblJlY2VpdmVyID0gbmV3IEFjdGlvblJlY2VpdmVyKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQWN0aW9uUmVjZWl2ZXIsIGFjdGlvbkZpbHRlcik7Ci0KLSAgICAgICAgSW50ZW50IGl0ZW1TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgaXRlbVN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIGl0ZW1TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBzZXNzaW9uU3RhdHVzSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIHNlc3Npb25TdGF0dXNJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBzZXNzaW9uU3RhdHVzSW50ZW50LCAwKTsKLQotICAgICAgICBJbnRlbnQgbWVzc2FnZUludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtZXNzYWdlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbU1lc3NhZ2VQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgbWVzc2FnZUludGVudCwgMCk7Ci0gICAgICAgIGRldGVjdEZlYXR1cmVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLCB0aGVuIG5vbmUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKLSAgICAgKiBvZmZlcmVkIGJ5IHRoZSBjbGllbnQgd2lsbCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBhY3Rpb25zOiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgc2Vla30sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBwYXVzZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcmVtb3RlIHBsYXliYWNrIGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgZmVhdHVyZXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZywgdGhlbiBhdCBtb3N0IG9uZSBtZWRpYSBpdGVtIGNhbiBiZSBwbGF5ZWQKLSAgICAgKiBhdCBhIHRpbWUgYW5kIHRoZSB7QGxpbmsgI2VucXVldWV9IG1ldGhvZCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIHJlbW92ZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHF1ZXVpbmcgaXMgc3VwcG9ydGVkLiAgSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9Ci0gICAgICogaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWluZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQsIHRoZW4gdGhlIHNlc3Npb24gd2lsbAotICAgICAqIG5vdCBiZSBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBtZWRpYSBpdGVtIGlzIHBsYXllZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgZ2V0IHNlc3Npb24gc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIG1lc3NhZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbn0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFIHNlbmQgbWVzc2FnZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgotICAgICAqIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfSBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdpbmdTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gaWQgaWYgdGhlcmUgaXMgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXNzaW9uIGlkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyB1c3VhbGx5IG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzZXNzaW9uIGlkIGV4cGxpY2l0bHkgc2luY2UKLSAgICAgKiBpdCBpcyBjcmVhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygb3RoZXIgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjcGxheX0sIHtAbGluayAjZW5xdWV1ZX0sIGFuZCB7QGxpbmsgI3N0YXJ0U2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgbmV3IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1TZXNzaW9uSWQsIHNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaWQgaXMgbm93OiAiICsgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25TZXNzaW9uQ2hhbmdlZChzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgY3VycmVudGx5IGhhcyBhIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogRXF1aXZhbGVudCB0byBjaGVja2luZyB3aGV0aGVyIHtAbGluayAjZ2V0U2Vzc2lvbklkfSByZXR1cm5zIGEgbm9uLW51bGwgcmVzdWx0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25JZCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIHdoZW4gdGhlIHN0YXRlIG9mCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgb3IgbWVkaWEgaXRlbXMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUKLSAgICAgKiBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhlIHNlc3Npb24gaXMgY3JlYXRlZCBvciBhbnkgcGxheQotICAgICAqIGNvbW1hbmRzIGFyZSBpc3N1ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0NhbGxiYWNrKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1TdGF0dXNDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIG1lc3NhZ2VzIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgZnJvbQotICAgICAqIG1lZGlhIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc2V0LiAgTWF5IGJlIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsYmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyKE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGxheSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogQ2xlYXJzIHRoZSBxdWV1ZSBhbmQgc3RhcnRzIHBsYXlpbmcgdGhlIG5ldyBpdGVtIGltbWVkaWF0ZWx5LiAgSWYgdGhlIHF1ZXVlCi0gICAgICogd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB0aGVuIGl0IGlzIHJlc3VtZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBBQ1RJT05fUExBWX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gcGxheS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGxheShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGVucXVldWUgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIEVucXVldWVzIGEgbmV3IGl0ZW0gdG8gcGxheS4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gd2lsbAotICAgICAqIHJlbWFpbiBwYXVzZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBBQ1RJT05fRU5RVUVVRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gZW5xdWV1ZS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHBsYXlPckVucXVldWUoY29udGVudFVyaSwgbWltZVR5cGUsIG1ldGFkYXRhLCBwb3NpdGlvbk1pbGxpcywKLSAgICAgICAgICAgICAgICBleHRyYXMsIGNhbGxiYWNrLCBNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5T3JFbnF1ZXVlKFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGVudFVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkpIHsKLSAgICAgICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwotICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoY29udGVudFVyaSwgbWltZVR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX01FVEFEQVRBLCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTWlsbGlzICE9IDApIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBudWxsLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc2VlayB0byBhIG5ldyBwb3NpdGlvbiBpbiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogU2Vla3MgdG8gYSBuZXcgcG9zaXRpb24uICBJZiB0aGUgcXVldWUgd2FzIHByZXZpb3VzbHkgcGF1c2VkIHRoZW4gaXQKLSAgICAgKiByZW1haW5zIHBhdXNlZCBidXQgdGhlIGl0ZW0ncyBuZXcgcG9zaXRpb24gaXMgc3RpbGwgcmVtZW1iZXJlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLIEFDVElPTl9TRUVLfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBuZXcgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAotICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFS30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlZWsoU3RyaW5nIGl0ZW1JZCwgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFRUspOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgQUNUSU9OX0dFVF9TVEFUVVN9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdHVzKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlbW92ZSBhIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgQUNUSU9OX1JFTU9WRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgaXRlbUlkLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgcGxheWJhY2sgaXMgYWxyZWFkeSBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBBQ1RJT05fUEFVU0V9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0V9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGF1c2UoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlc3VtZSAodW5wYXVzZSkgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBub3QgcGF1c2VkCi0gICAgICogdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIEFDVElPTl9SRVNVTUV9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN1bWUoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRVNVTUUpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdG9wIG1lZGlhIHBsYXliYWNrIGFuZCBjbGVhciB0aGUgbWVkaWEgcGxheWJhY2sgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeQotICAgICAqIGVtcHR5IHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AgQUNUSU9OX1NUT1B9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUH0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc3RhcnQgYSBuZXcgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbXVzdCB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHJlcXVlc3QKLSAgICAgKiBpcyBjb21wbGV0ZSBiZWZvcmUgaXNzdWluZyBvdGhlciByZXF1ZXN0cyB0aGF0IGFmZmVjdCB0aGUgc2Vzc2lvbi4gIElmIHRoaXMKLSAgICAgKiByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwgdGhlbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBBQ1RJT05fU1RBUlRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUQVJUX1NFU1NJT04pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiwgbU1lc3NhZ2VQZW5kaW5nSW50ZW50KTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgbWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGJ1bmRsZSBtZXNzYWdlIGRlbm90aW5nIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0UKLSAgICAgKiBAc2VlICNpc01lc3NhZ2luZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKEJ1bmRsZSBtZXNzYWdlLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLSAgICAgICAgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFTkRfTUVTU0FHRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgbWVzc2FnZSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFNlc3Npb25TdGF0dXMoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5kIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgdGhpcyByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsCi0gICAgICogdGhlIHtAbGluayAjZ2V0U2Vzc2lvbklkIHNlc3Npb24gaWQgcHJvcGVydHl9IHdpbGwgYmUgc2V0IHRvIG51bGwgYWZ0ZXIKLSAgICAgKiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIEFDVElPTl9FTkRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTn0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kU2Vzc2lvbihCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1JdGVtQWN0aW9uKGZpbmFsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLCBmaW5hbCBTdHJpbmcgaXRlbUlkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQsIGl0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KGl0ZW1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1TdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1TdGF0dXM9IiArIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWRSZXN1bHQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVNlc3Npb25BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwgZmluYWwgU3RyaW5nIHNlc3Npb25JZCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsIGZpbmFsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICB9Ci0gICAgICAgIGxvZ1JlcXVlc3QoaW50ZW50KTsKLSAgICAgICAgbVJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRvcHRTZXNzaW9uKHNlc3Npb25JZFJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWRSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlc3Npb25JZFJlc3VsdC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbklkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVJbnZhbGlkUmVzdWx0KGludGVudCwgY2FsbGJhY2ssIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGludGVudCwgY2FsbGJhY2ssIGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZG9wdFNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlc3Npb25JZChzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVJbnZhbGlkUmVzdWx0KEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgaW52YWxpZCByZXN1bHQgZGF0YSBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTiwgZGF0YSk7Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVFcnJvcihJbnRlbnQgaW50ZW50LCBBY3Rpb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgZmluYWwgaW50IGNvZGU7Ci0gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvZGUgPSBkYXRhLmdldEludChNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfRVJST1JfQ09ERSwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV04pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSA9IE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgZXJyb3IgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICsgIjogZXJyb3I9IiArIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29kZT0iICsgY29kZQotICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBjb2RlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0ZWN0RmVhdHVyZXMoKSB7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sgPSByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUEFVU0UpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RPUCk7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUXVldWluZyA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVNT1ZFKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudCA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nID0gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiByb3V0ZVN1cHBvcnRzQWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZS5zdXBwb3J0c0NvbnRyb2xBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSywgYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpIHsKLSAgICAgICAgZm9yIChJbnRlbnRGaWx0ZXIgZmlsdGVyIDogbVJvdXRlLmdldENvbnRyb2xGaWx0ZXJzKCkpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2spIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUXVldWluZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgKyAic2Vzc2lvbiBtYW5hZ2VtZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZNZXNzYWdlTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChtU2Vzc2lvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgaW5mZXJNaXNzaW5nUmVzdWx0KFN0cmluZyByZXF1ZXN0LCBTdHJpbmcgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUmVzdWx0IGlzIG1pc3NpbmcuCi0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QuZXF1YWxzKHJlc3VsdCkpIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3QgZGlkbid0IHNwZWNpZnkgYSB2YWx1ZSBvciByZXN1bHQgbWF0Y2hlcyByZXF1ZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAvLyBSZXN1bHQgY29uZmxpY3RzIHdpdGggcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSZXF1ZXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZW5kaW5nIHJlcXVlc3Q6ICIgKyBpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBidW5kbGVUb1N0cmluZyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnNpemUoKTsgLy8gZm9yY2UgYnVuZGxlIHRvIGJlIHVucGFyY2VsbGVkCi0gICAgICAgICAgICByZXR1cm4gYnVuZGxlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFjdGlvblJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQiOwotCi0gICAgICAgIEFjdGlvblJlY2VpdmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBudWxsIHx8ICFzZXNzaW9uSWQuZXF1YWxzKG1TZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAid2l0aCBtaXNzaW5nIG9yIGludmFsaWQgc2Vzc2lvbiBpZDogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBpZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgaXRlbSBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtSWQ9IiArIGl0ZW1JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vbkl0ZW1TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMsIGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBtZWRpYSBzdGF0dXMgY2FsbGJhY2sgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJtaXNzaW5nIHNlc3Npb24gc3RhdHVzLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHNlc3Npb24gc3RhdHVzIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgbWVzc2FnZSBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyLm9uTWVzc2FnZVJlY2VpdmVkKHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX01FU1NBR0UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lZGlhIHN0YXR1cyB1cGRhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0gY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICAgICAqIEBwYXJhbSBpdGVtU3RhdHVzIFRoZSBpdGVtIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzZSBjYWxsYmFjayB0eXBlIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25DYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGNvZGUgVGhlIGVycm9yIGNvZGUsIG9yIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVJST1JfVU5LTk9XTn0gaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGVycm9yIGRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgaW50IGNvZGUsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBpdGVtcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEl0ZW1BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBzZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNlc3Npb25BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1lZGlhIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgcmVjZWl2ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoU3RyaW5nIHNlc3Npb25JZCwgQnVuZGxlIG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4NDkxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByb3V0ZXMgZm9yIGJ1aWx0LWluIHN5c3RlbSBkZXN0aW5hdGlvbnMgc3VjaCBhcyB0aGUgbG9jYWwgZGlzcGxheQotICogYW5kIHNwZWFrZXIuICBPbiBKZWxseWJlYW4gYW5kIG5ld2VyIHBsYXRmb3JtIHJlbGVhc2VzLCBxdWVyaWVzIHRoZSBmcmFtZXdvcmsKLSAqIE1lZGlhUm91dGVyIGZvciBmcmFtZXdvcmstcHJvdmlkZWQgcm91dGVzIGFuZCByZWdpc3RlcnMgbm9uLWZyYW1ld29yay1wcm92aWRlZAotICogcm91dGVzIGFzIHVzZXIgcm91dGVzLgotICovCi1hYnN0cmFjdCBjbGFzcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFX0lEID0gIkRFRkFVTFRfUk9VVEUiOwotCi0gICAgcHJvdGVjdGVkIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEobmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLAotICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgb2J0YWluKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDI0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFwaTI0SW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIySW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTcpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIxSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgYWRkZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHJlbW92ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgY2hhbmdlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFja3MgaW50byB0aGUgbWVkaWEgcm91dGVyIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTeW5jQ2FsbGJhY2sgewotICAgICAgICB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBMZWdhY3lJbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVFJFQU0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IENPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMuYWRkKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgbVZvbHVtZUNoYW5nZVJlY2VpdmVyOwotICAgICAgICBpbnQgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IC0xOwotCi0gICAgICAgIHB1YmxpYyBMZWdhY3lJbXBsKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciA9IG5ldyBWb2x1bWVDaGFuZ2VSZWNlaXZlcigpOwotCi0gICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVZvbHVtZUNoYW5nZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKFZvbHVtZUNoYW5nZVJlY2VpdmVyLlZPTFVNRV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgIG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVmYXVsdFJvdXRlID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUk9VVEVfSUQsIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3N5c3RlbV9yb3V0ZV9uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xGaWx0ZXJzKENPTlRST0xfRklMVEVSUykKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrU3RyZWFtKFBMQVlCQUNLX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrVHlwZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZUhhbmRsaW5nKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVNYXgobWF4Vm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG1MYXN0UmVwb3J0ZWRWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuYWRkUm91dGUoZGVmYXVsdFJvdXRlKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVJZC5lcXVhbHMoREVGQVVMVF9ST1VURV9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgY2xhc3MgRGVmYXVsdFJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNYXRoLm1pbihtYXhWb2x1bWUsIE1hdGgubWF4KDAsIHZvbHVtZSArIGRlbHRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBWb2x1bWVDaGFuZ2VSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgICAgIC8vIFRoZXNlIGNvbnN0YW50cyBjb21lIGZyb20gQXVkaW9NYW5hZ2VyLgotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9MVU1FX0NIQU5HRURfQUNUSU9OID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuVk9MVU1FX0NIQU5HRURfQUNUSU9OIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSA9Ci0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSI7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFZPTFVNRV9DSEFOR0VEX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0cmVhbVR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1UeXBlID09IFBMQVlCQUNLX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lID49IDAgJiYgdm9sdW1lICE9IG1MYXN0UmVwb3J0ZWRWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxNikKLSAgICBzdGF0aWMgY2xhc3MgSmVsbHliZWFuSW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjaywgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0KLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0KLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN5bmNDYWxsYmFjayBtU3luY0NhbGxiYWNrOwotCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVZvbHVtZUNhbGxiYWNrT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUm91dGVUeXBlczsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUFjdGl2ZVNjYW47Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1DYWxsYmFja1JlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gZnJhbWV3b3JrIHJvdXRlcyB0byBzdXBwb3J0IGxpYnJhcnkgcm91dGVzLgotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUgdGFnIGZpZWxkIGZvciB0aGlzIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgcHVibGlzaGVkIGl0cyBvd24gdXNlciByb3V0ZXMgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgYW5kIGFscmVhZHkKLSAgICAgICAgLy8gdXNlZCB0aGUgdGFnIGZvciBpdHMgb3duIHB1cnBvc2VzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPiBtU3lzdGVtUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMgdG8gZnJhbWV3b3JrIHJvdXRlcy4KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+IG1Vc2VyUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4oKTsKLQotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCBtU2VsZWN0Um91dGVXb3JrYXJvdW5kOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sgPSBzeW5jQ2FsbGJhY2s7Ci0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tPYmogPSBjcmVhdGVDYWxsYmFja09iaigpOwotICAgICAgICAgICAgbVZvbHVtZUNhbGxiYWNrT2JqID0gY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKTsKLQotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lKSwgZmFsc2UpOwotCi0gICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZUlkKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUm91dGVDb250cm9sbGVyKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpbnQgbmV3Um91dGVUeXBlcyA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG5ld0FjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSByZXF1ZXN0LmdldFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGNhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3QWN0aXZlU2NhbiA9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSBuZXdSb3V0ZVR5cGVzIHx8IG1BY3RpdmVTY2FuICE9IG5ld0FjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICBtUm91dGVUeXBlcyA9IG5ld1JvdXRlVHlwZXM7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW4gPSBuZXdBY3RpdmVTY2FuOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaikpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVzKCkgewotICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgcm91dGVPYmogOiBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRSb3V0ZXMobVJvdXRlck9iaikpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopIDwgMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGFzc2lnblJvdXRlSWQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaiwgaWQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZUlkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gVE9ETzogVGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgc2hvdWxkIHN1cHBseSBhIHVuaXF1ZSByb3V0ZSBpZCB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBjYW4gdXNlIGhlcmUuICBGb3Igbm93IHdlIHVzZSBhIGhhc2ggb2YgdGhlIHJvdXRlIG5hbWUgYW5kIHRha2UgY2FyZQotICAgICAgICAgICAgLy8gdG8gZGVkdXBlIGl0LgotICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmF1bHQgPSAoZ2V0RGVmYXVsdFJvdXRlKCkgPT0gcm91dGVPYmopOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gaXNEZWZhdWx0ID8gREVGQVVMVF9ST1VURV9JRCA6Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiUk9VVEVfJTA4eCIsIGdldFJvdXRlTmFtZShyb3V0ZU9iaikuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoaWQpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCBpZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKG5ld0lkKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0lkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShuZXdWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVPYmogIT0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCB1c2VyUm91dGVSZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHVzZXJSb3V0ZVJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlclJvdXRlUmVjb3JkLm1Sb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSByb3V0ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHdlIHdpbGwgc2VsZWN0IGl0IGluc3RlYWQgd2hlbiB0aGUgcm91dGUgaXMgYWRkZWQuCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sub25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gd2hlbiBhIHJvdXRlIGlzIHVuc2VsZWN0ZWQuCi0gICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmopOwotICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgVXNlclJvdXRlUmVjb3JkKHJvdXRlLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyb3V0ZU9iaiwgcmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJvdXRlT2JqLCBtVm9sdW1lQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBtVXNlclJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRVc2VyUm91dGUobVJvdXRlck9iaiwgcm91dGVPYmopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3bHkgYWRkZWQgcm91dGUgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICAvLyByb3V0ZSBpbiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciB0aGVuIGVuc3VyZSBpdCBpcyBzZWxlY3RlZCBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKCFyb3V0ZS5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZU9iaiA9PSByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVVzZXJSb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VyUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGUgPT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVzZXJSb3V0ZVJlY29yZCBnZXRVc2VyUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBPYmplY3QgdGFnID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFRhZyhyb3V0ZU9iaik7Ci0gICAgICAgICAgICByZXR1cm4gdGFnIGluc3RhbmNlb2YgVXNlclJvdXRlUmVjb3JkID8gKFVzZXJSb3V0ZVJlY29yZCl0YWcgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgcmVjcmVhdGUgdGhlIHJvdXRlIGRlc2NyaXB0b3Igd2hlbiBtYWtpbmcgYW55IGNoYW5nZXMKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgaW1tdXRhYmxlIG9uY2UgcHVibGlzaGVkLgotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQsIGdldFJvdXRlTmFtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0gICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Um91dGVOYW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gUm91dGVzIHNob3VsZCBub3QgaGF2ZSBudWxsIG5hbWVzIGJ1dCBpdCBtYXkgaGFwcGVuIGZvciBiYWRseSBjb25maWd1cmVkCi0gICAgICAgICAgICAvLyB1c2VyIHJvdXRlcy4gIFdlIHRvbGVyYXRlIHRoaXMgYnkgdXNpbmcgYW4gZW1wdHkgbmFtZSBzdHJpbmcgaGVyZSBidXQKLSAgICAgICAgICAgIC8vIHN1Y2ggdW5uYW1lZCByb3V0ZXMgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB1cHN0cmVhbQotICAgICAgICAgICAgLy8gKHdpdGggYSBsb2cgbWVzc2FnZSBzbyB3ZSBjYW4gdHJhY2sgZG93biB0aGUgcHJvYmxlbSkuCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmFtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXROYW1lKHJvdXRlT2JqLCBnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBpbnQgc3VwcG9ydGVkVHlwZXMgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tTdHJlYW0ocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVNYXgocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZUhhbmRsaW5nKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IDApIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQuc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZC5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCkubVJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZVJlY29yZCB7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1Sb3V0ZURlc2NyaXB0b3I7IC8vIGFzc2lnbmVkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uCi0KLSAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmosIFN0cmluZyBpZCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgICAgIG1Sb3V0ZURlc2NyaXB0b3JJZCA9IGlkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyCi0gICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlQ29udHJvbGxlcihPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUobVJvdXRlT2JqLCB2b2x1bWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0VXBkYXRlVm9sdW1lKG1Sb3V0ZU9iaiwgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmVsbHliZWFuIE1SMSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE3KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMUltcGwgZXh0ZW5kcyBKZWxseWJlYW5JbXBsCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCBtQWN0aXZlU2Nhbldvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIxSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkgbmV3UHJlc2VudGF0aW9uRGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IChuZXdQcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3UHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSA6IC0xKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGlmICghTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmlzRW5hYmxlZChyZWNvcmQubVJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RpbmcocmVjb3JkKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29ubmVjdGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGlzcGxheSBwcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQocHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVDYWxsYmFjaygpOwotCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIGdldEhhbmRsZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQuc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMobUFjdGl2ZVNjYW4gPyBtUm91dGVUeXBlcyA6IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZC5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTgpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIySW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMUltcGwgewotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIySW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5nZXREZXNjcmlwdGlvbihyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuVXNlclJvdXRlSW5mby5zZXREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCi0gICAgICAgICAgICAgICAgICAgIHwgKG1BY3RpdmVTY2FuID8gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOIDogMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBpMjQgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgyNCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcGkyNEltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjJJbXBsIHsKLSAgICAgICAgcHVibGljIEFwaTI0SW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGV2aWNlVHlwZShNZWRpYVJvdXRlckFwaTI0LlJvdXRlSW5mby5nZXREZXZpY2VUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJhYWYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPgotCi08Ym9keT4KLQotPHA+Q29udGFpbnMgQVBJcyB0aGF0IGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMgYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UKLSAgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjQ3MWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQmFzZUxheW91dCBleHRlbmRzIFZpZXdHcm91cEltcGwgewotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVByaXZhdGVQcm92aWRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1NYXRjaFBhcmVudENoaWxkcmVuID0gbmV3IEFycmF5TGlzdDw+KDEpOwotCi0gICAgcHVibGljIEJhc2VMYXlvdXQoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIgPSBzdXBlclByb3ZpZGVyOwotICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyID0gcHJpdmF0ZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKExheW91dFBhcmFtcyBscCkgewotICAgICAgICBpZiAobHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBscDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4gPQotICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYykgIT0gVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZOwotICAgICAgICBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5jbGVhcigpOwotCi0gICAgICAgIGludCBtYXhIZWlnaHQgPSAwOwotICAgICAgICBpbnQgbWF4V2lkdGggPSAwOwotICAgICAgICBpbnQgY2hpbGRTdGF0ZSA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLCB3aWR0aE1lYXN1cmVTcGVjLCAwLCBoZWlnaHRNZWFzdXJlU3BlYywgMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSArIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbik7Ci0gICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA9IGNoaWxkU3RhdGUgfCBjaGlsZC5nZXRNZWFzdXJlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVNYXRjaFBhcmVudENoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBY2NvdW50IGZvciBwYWRkaW5nIHRvbwotICAgICAgICBtYXhXaWR0aCArPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBtYXhIZWlnaHQgKz0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpKTsKLSAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgbVByaXZhdGVQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBmb3JlZ3JvdW5kJ3MgbWluaW11bSBoZWlnaHQgYW5kIHdpZHRoCi0gICAgICAgIGZpbmFsIERyYXdhYmxlIGRyYXdhYmxlID0gbUluc3RhbmNlLmdldEZvcmVncm91bmQoKTsKLSAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpKTsKLSAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGRyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIuc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbCgKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhXaWR0aCwgd2lkdGhNZWFzdXJlU3BlYywgY2hpbGRTdGF0ZSksCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlc29sdmVTaXplQW5kU3RhdGUobWF4SGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUgPDwgVmlldy5NRUFTVVJFRF9IRUlHSFRfU1RBVEVfU0hJRlQpKTsKLQotICAgICAgICBjb3VudCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoTWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgoMCwgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIC0gZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMod2lkdGhNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC53aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyA9IFZpZXcuTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMoaGVpZ2h0TWVhc3VyZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC50b3BNYXJnaW4gKyBscC5ib3R0b21NYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKGNoaWxkV2lkdGhNZWFzdXJlU3BlYywgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dF9pbXBsKGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRMZWZ0ID0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50UmlnaHQgPSByaWdodCAtIGxlZnQgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRUb3AgPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKTsKLSAgICAgICAgZmluYWwgaW50IHBhcmVudEJvdHRvbSA9IGJvdHRvbSAtIHRvcCAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1JbnN0YW5jZS5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGludCBjaGlsZExlZnQ7Ci0gICAgICAgICAgICAgICAgaW50IGNoaWxkVG9wOwotCi0gICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFyZW50TGVmdCArIChwYXJlbnRSaWdodCAtIHBhcmVudExlZnQgLSB3aWR0aCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gLSBscC5yaWdodE1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkVG9wID0gcGFyZW50VG9wICsgKHBhcmVudEJvdHRvbSAtIHBhcmVudFRvcCAtIGhlaWdodCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiAtIGxwLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dChjaGlsZExlZnQsIGNoaWxkVG9wLCBjaGlsZExlZnQgKyB3aWR0aCwgY2hpbGRUb3AgKyBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ0xlZnQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdUb3AoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ0JvdHRvbSgpICsgMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZmMTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbFZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbFZpZXcyIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sVmlldzIgbUluc3RhbmNlOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiA9ICJmdWxsU2NyZWVuIjsKLQotICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgY29uc3RhbnRzIHRvIHB1YmxpYyBhcGkgdG8gc3VwcG9ydCBjdXN0b20gdmlkZW8gdmlldy4KLSAgICAvLyBUT0RPOiBDb21iaW5lIHRoZXNlIGNvbnN0YW50cyBpbnRvIG9uZSByZWdhcmRpbmcgVHJhY2tJbmZvLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZJREVPX1RSQUNLX0NPVU5UID0gIlZpZGVvVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fVFJBQ0tfQ09VTlQgPSAiQXVkaW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCA9ICJTdWJ0aXRsZVRyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NQRUVEID0gIlBsYXliYWNrU3BlZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYID0gIlNlbGVjdGVkQXVkaW9JbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVggPSAiU2VsZWN0ZWRTdWJ0aXRsZUluZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMgPSAiVXBkYXRlVHJhY2tTdGF0dXMiOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSBpbnRlZ3JhdGluZyB3aXRoIE1lZGlhU2Vzc2lvbjIgJiBNZWRpYU1ldGFkYXRhMgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQgPSAiTWVkaWFUeXBlQWR2ZXJ0aXNlbWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMgPSAiVXBkYXRlTWVkaWFUeXBlU3RhdHVzIjsKLQotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNob3cgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TSE9XX1NVQlRJVExFID0gInNob3dTdWJ0aXRsZSI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gaGlkZSBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0hJREVfU1VCVElUTEUgPSAiaGlkZVN1YnRpdGxlIjsKLSAgICAvLyBUT0RPOiByZW1vdmUgb25jZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgcmV2aXNlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4gPSAic2V0RnVsbHNjcmVlbiI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2VsZWN0IGF1ZGlvIHRyYWNrIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLID0gIlNlbGVjdFRyYWNrIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZXQgcGxheWJhY2sgc3BlZWQgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQgPSAiU2V0UGxheWJhY2tTcGVlZCI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gbXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01VVEU9ICJNdXRlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byB1bm11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTk1VVEUgPSAiVW5tdXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfSEVMUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFkgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX01BSU4gPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWCA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9ERUZBVUxUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9NVVNJQyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfQURWRVJUSVNFTUVOVCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QUk9HUkVTUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVdJTkRfVElNRV9NUyA9IDEwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX1RJTUVfTVMgPSAzMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURfU0tJUF9XQUlUX1RJTUVfTVMgPSA1MDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9OT05fRVhJU1RFTlQgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRU1QVFkgPSAiIjsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMgbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgaW50IG1EdXJhdGlvbjsKLSAgICBwcml2YXRlIGludCBtUHJldlN0YXRlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb1RyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUF1ZGlvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtU3VidGl0bGVUcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc01vZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTcGVlZEluZGV4OwotICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoOwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc1dpbmRvd01hcmdpbjsKLSAgICBwcml2YXRlIGludCBtTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1TaXplVHlwZTsKLSAgICBwcml2YXRlIGxvbmcgbVBsYXliYWNrQWN0aW9uczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURyYWdnaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNGdWxsU2NyZWVuOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dFeHBhbmRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3RvcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlSXNFbmFibGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2Vla0F2YWlsYWJsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWR2ZXJ0aXNlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXV0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVWFVwZGF0ZTsKLQotICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVJvb3Q7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1BZEV4dGVybmFsTGluazsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CYWNrQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtUm91dGVCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DZW50ZXJWaWV3OwotICAgIHByaXZhdGUgVmlldyBtVHJhbnNwb3J0Q29udHJvbHM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheVBhdXNlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZmd2RCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUmV3QnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU5leHRCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUHJldkJ1dHRvbjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NaW5pbWFsRXh0cmFWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKLSAgICBwcml2YXRlIFByb2dyZXNzQmFyIG1Qcm9ncmVzczsKLSAgICBwcml2YXRlIFZpZXcgbVByb2dyZXNzQnVmZmVyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhckxlZnRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1UaW1lVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1FbmRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUN1cnJlbnRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkU2tpcFZpZXc7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1Gb3JtYXRCdWlsZGVyOwotICAgIHByaXZhdGUgRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyUmlnaHRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1CYXNpY0NvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1FeHRyYUNvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DdXN0b21CdXR0b25zOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVN1YnRpdGxlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZ1bGxTY3JlZW5CdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25SaWdodDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvbkxlZnQ7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTXV0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1WaWRlb1F1YWxpdHlCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU2V0dGluZ3NCdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRSZW1haW5pbmdWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3Ci0gICAgcHJpdmF0ZSBMaXN0VmlldyBtU2V0dGluZ3NMaXN0VmlldzsKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1TZXR0aW5nc1dpbmRvdzsKLSAgICBwcml2YXRlIFNldHRpbmdzQWRhcHRlciBtU2V0dGluZ3NBZGFwdGVyOwotICAgIHByaXZhdGUgU3ViU2V0dGluZ3NBZGFwdGVyIG1TdWJTZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzTWFpblRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NTdWJUZXh0c0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1TZXR0aW5nc0ljb25JZHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUF1ZGlvVHJhY2tMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1WaWRlb1F1YWxpdHlMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1QbGF5YmFja1NwZWVkVGV4dExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEZsb2F0PiBtUGxheWJhY2tTcGVlZExpc3Q7Ci0KLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzJJbXBsKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgLy8gSW5mbGF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBmcm9tIFhNTAotICAgICAgICBtUm9vdCA9IG1ha2VDb250cm9sbGVyVmlldygpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtUm9vdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uVG9rZW5faW1wbChTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25GdWxsU2NyZWVuTGlzdGVuZXJfaW1wbChNZWRpYUNvbnRyb2xWaWV3Mi5PbkZ1bGxTY3JlZW5MaXN0ZW5lciBsKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcl9pbXBsKE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xzID0gY29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpOwotICAgICAgICAgICAgLy8gU2V0IG1NZXRhZGF0YSBhbmQgbVBsYXliYWNrU3RhdGUgdG8gZXhpc3RpbmcgTWVkaWFTZXNzaW9uIHZhcmlhYmxlcyBzaW5jZSB0aGV5IG1heQotICAgICAgICAgICAgLy8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1Db250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLQotICAgICAgICAgICAgbUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdXR0b25WaXNpYmlsaXR5X2ltcGwoaW50IGJ1dHRvbiwgaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIG1lbWJlciB2YXJpYWJsZXMgZm9yIEZhc3QtRm9yd2FyZC9QcnZpb3VzL1Jld2luZCBidXR0b25zIHRvIHNhdmUgdmlzaWJpbGl0eSBpbgotICAgICAgICAvLyBvcmRlciB0byBwcmV2ZW50IGJlaW5nIG92ZXJyaWRlbiBpbnNpZGUgdXBkYXRlTGF5b3V0KCkuCi0gICAgICAgIHN3aXRjaCAoYnV0dG9uKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QTEFZX1BBVVNFOgotICAgICAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgY2FuUGF1c2UoKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRkZXRDoKLSAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUkVXOgotICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX05FWFQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QUkVWOgotICAgICAgICAgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsICYmIG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZVTExfU0NSRUVOOgotICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fT1ZFUkZMT1c6Ci0gICAgICAgICAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9NVVRFOgotICAgICAgICAgICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU0VUVElOR1M6Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGxheUJ1dHRvbkZvY3VzX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhQ29udHJvbFZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgcmVtb3ZlZD8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2hlbiB0aGlzIHZpZXcncyB3aWR0aCBjaGFuZ2VzIGluIG9yZGVyIHRvIGF2b2lkIGFueSBVSSBvdmVybGFwIGJldHdlZW4KLSAgICAgICAgLy8gdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAgICBpZiAobVByZXZXaWR0aCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkgfHwgbU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgLy8gRGlzbWlzcyBTZXR0aW5nc1dpbmRvdyBpZiBpdCBpcyBzaG93aW5nLgotICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLQotICAgICAgICAgICAgLy8gVGhlc2Ugdmlld3MgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICAgICAgICAgICAgaWYgKG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpID09IDAgfHwgbVRpbWVWaWV3LmdldFdpZHRoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGN1cnJXaWR0aCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgV2luZG93TWFuYWdlciBtYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7Ci0gICAgICAgICAgICBQb2ludCBzY3JlZW5TaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCA9IHNjcmVlblNpemUueDsKLSAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0gICAgICAgICAgICBpbnQgZnVsbEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfaWNvbl9zaXplKTsKLSAgICAgICAgICAgIGludCBlbWJlZGRlZEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgQWR2ZXJ0aXNlbWVudCBNb2RlLgotICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDQuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDQ7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVVhVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25lLXRpbWUgb3BlcmF0aW9uIGZvciBNdXNpYyBtZWRpYSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnJlbW92ZVZpZXcobU11dGVCdXR0b24pOwotICAgICAgICAgICAgICAgICAgICBtRXh0cmFDb250cm9scy5hZGRWaWV3KG1NdXRlQnV0dG9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDMuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDM7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICBtUHJldkhlaWdodCA9IGN1cnJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLgotICAgICAgICAvLyBVcGRhdGUgdGl0bGUgYmFyIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmxhcCBiZXR3ZWVuIHRpdGxlIHZpZXcgYW5kIHRoZSByaWdodAotICAgICAgICAvLyBzaWRlIG9mIHRoZSB0aXRsZSBiYXIuCi0gICAgICAgIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBzdXBlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0KLSAgICAgICAgLy8gVE9ETzogTWVyZ2UgdGhlIGJlbG93IGNvZGUgd2l0aCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkuCi0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotCi0gICAgICAgIGlmIChpc1Zpc2libGUpIHsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBtUm91dGVTZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBpZiAobVJvdXRlU2VsZWN0b3IgIT0gbnVsbCAmJiAhbVJvdXRlU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFkpOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlpbmcoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgbVBsYXliYWNrU3RhdGUuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRCdWZmZXJQZXJjZW50YWdlKCkgewotICAgICAgICBpZiAobUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvcyA9IG1QbGF5YmFja1N0YXRlLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiAoYnVmZmVyZWRQb3MgPT0gLTEpID8gLTEgOiAoaW50KSAoYnVmZmVyZWRQb3MgKiAxMDAgLyBtRHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5QYXVzZSgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtCYWNrd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrRm9yd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmlldyB0aGF0IGhvbGRzIHRoZSB3aWRnZXRzIHRoYXQgY29udHJvbCBwbGF5YmFjay4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY3JlYXRlIHRoZWlyIG93bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgdmlldy4KLSAgICAgKiBAaGlkZSBUaGlzIGRvZXNuJ3Qgd29yayBhcyBhZHZlcnRpc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXdHcm91cCBtYWtlQ29udHJvbGxlclZpZXcoKSB7Ci0gICAgICAgIFZpZXdHcm91cCByb290ID0gKFZpZXdHcm91cCkgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tZWRpYV9jb250cm9sbGVyKTsKLSAgICAgICAgaW5pdENvbnRyb2xsZXJWaWV3KHJvb3QpOwotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENvbnRyb2xsZXJWaWV3KFZpZXdHcm91cCB2KSB7Ci0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgICAgIG1UaXRsZUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfdGV4dCk7Ci0gICAgICAgIG1BZEV4dGVybmFsTGluayA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfZXh0ZXJuYWxfbGluayk7Ci0gICAgICAgIG1CYWNrQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYWNrKTsKLSAgICAgICAgaWYgKG1CYWNrQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQmFja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICBtUm91dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNhc3QpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgIG1DZW50ZXJWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5jZW50ZXJfdmlldyk7Ci0gICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3ID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC5taW5pbWFsX2V4dHJhX3ZpZXcpOwotICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIG1NaW5pbWFsRXh0cmFWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBpbnQgaWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKLSAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotICAgICAgICBwYXJhbXMuc2V0TWFyZ2lucygwLCAoaWNvblNpemUgKyBtYXJnaW5TaXplICogMikgKiAoLTEpLCAwLCAwKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgICAgICBtUHJvZ3Jlc3MgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzKTsKLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVByb2dyZXNzIGluc3RhbmNlb2YgU2Vla0JhcikgewotICAgICAgICAgICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVNlZWtMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFByb2dyZXNzRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzcykpOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0TWF4KE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByb2dyZXNzQnVmZmVyID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzc19idWZmZXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldwotICAgICAgICBtQm90dG9tQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldwotICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgIG1UaW1lVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZSk7Ci0gICAgICAgIG1FbmRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2VuZCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9jdXJyZW50KTsKLSAgICAgICAgbUFkU2tpcFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3NraXBfdGltZSk7Ci0gICAgICAgIG1Gb3JtYXRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIobUZvcm1hdEJ1aWxkZXIsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgICAgICBtQm90dG9tQmFyUmlnaHRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgbUJhc2ljQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhc2ljX2NvbnRyb2xzKTsKLSAgICAgICAgbUV4dHJhQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmV4dHJhX2NvbnRyb2xzKTsKLSAgICAgICAgbUN1c3RvbUJ1dHRvbnMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmN1c3RvbV9idXR0b25zKTsKLSAgICAgICAgbVN1YnRpdGxlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zdWJ0aXRsZSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gVE9ETzogU2hvdyBGdWxsc2NyZWVuIGJ1dHRvbiB3aGVuIG9ubHkgaXQgaXMgcG9zc2libGUuCi0gICAgICAgIH0KLSAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X3JpZ2h0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dSaWdodExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19sZWZ0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbkxlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93TGVmdExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtTXV0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXV0ZSk7Ci0gICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU11dGVCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNldHRpbmdzQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zZXR0aW5ncyk7Ci0gICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQudmlkZW9fcXVhbGl0eSk7Ci0gICAgICAgIGlmIChtVmlkZW9RdWFsaXR5QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1WaWRlb1F1YWxpdHlMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUFkUmVtYWluaW5nVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfcmVtYWluaW5nKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICAgICAgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQuc2V0dGluZ3NfbGlzdCk7Ci0gICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU2V0dGluZ3NBZGFwdGVyKG1TZXR0aW5nc01haW5UZXh0c0xpc3QsIG1TZXR0aW5nc1N1YlRleHRzTGlzdCwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCk7Ci0gICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU3ViU2V0dGluZ3NBZGFwdGVyKG51bGwsIDApOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKG1TZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIpOwotCi0gICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCk7Ci0gICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luID0gKC0xKSAqIG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9zZXR0aW5nc19vZmZzZXQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cgPSBuZXcgUG9wdXBXaW5kb3cobVNldHRpbmdzTGlzdFZpZXcsIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIHBhdXNlIG9yIHNlZWsgYnV0dG9ucyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBwYXVzZWQgb3Igc2Vla2VkLgotICAgICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIHRvIGJlIGEgTWVkaWFQbGF5ZXJDb250cm9sRXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmICFjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbyBpcyBhZGQgYSBjYW5TZWVrIHRvIHRoZSBNZWRpYVBsYXllckNvbnRyb2wgaW50ZXJmYWNlOwotICAgICAgICAgICAgLy8gdGhpcyBzY2hlbWUgY2FuIGJyZWFrIHRoZSBjYXNlIHdoZW4gYXBwbGljYXRpb25zIHdhbnQgdG8gYWxsb3cgc2VlayB0aHJvdWdoIHRoZQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgYmFyIGJ1dCBkaXNhYmxlIGZvcndhcmQvYmFja3dhcmQgYnV0dG9ucy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBIb3dldmVyLCBjdXJyZW50bHkgdGhlIGZsYWdzIFNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFLCBTRUVLX0ZPUldBUkRfQVZBSUxBQkxFLAotICAgICAgICAgICAgLy8gYW5kIFNFRUtfQVZBSUxBQkxFIGFyZSBhbGwgKHVuKXNldCB0b2dldGhlcjsgYXMgc3VjaCB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBhcmlzZSBpbiBleGlzdGluZyBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4KSB7Ci0gICAgICAgICAgICAvLyBXZSB3ZXJlIGdpdmVuIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UsIHRoYXQgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAvLyB0aGUgY2FuUGF1c2UvY2FuU2Vla1hZWiBtZXRob2RzLiBUaGlzIGlzIE9LLCBpdCBqdXN0IG1lYW5zIHdlCi0gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG1lZGlhIGNhbiBiZSBwYXVzZWQgYW5kIHNlZWtlZCwgYW5kIHNvIHdlIGRvbid0IGRpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBidXR0b25zLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtVXBkYXRlUHJvZ3Jlc3MgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNTaG93aW5nID0gbUluc3RhbmNlLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgICAgICBpZiAoIW1EcmFnZ2luZyAmJiBpc1Nob3dpbmcgJiYgaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdERlbGF5ZWQobVVwZGF0ZVByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyAtIChwb3MgJSBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRm9yVGltZShpbnQgdGltZU1zKSB7Ci0gICAgICAgIGludCB0b3RhbFNlY29uZHMgPSB0aW1lTXMgLyAxMDAwOwotCi0gICAgICAgIGludCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7Ci0gICAgICAgIGludCBtaW51dGVzID0gKHRvdGFsU2Vjb25kcyAvIDYwKSAlIDYwOwotICAgICAgICBpbnQgaG91cnMgPSB0b3RhbFNlY29uZHMgLyAzNjAwOwotCi0gICAgICAgIG1Gb3JtYXRCdWlsZGVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgaWYgKGhvdXJzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJTAyZDolMDJkIiwgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHNldFByb2dyZXNzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xsZXIgPT0gbnVsbCB8fCBtRHJhZ2dpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAwOwotICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAoaW50KSAoTUFYX1BST0dSRVNTICogKGxvbmcpIGN1cnJlbnRQb3NpdGlvbiAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmIGN1cnJlbnRQb3NpdGlvbiAhPSBtRHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRQcm9ncmVzcyhwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIpOwotICAgICAgICAgICAgLy8gSWYgdGhlIG1lZGlhIGlzIGEgbG9jYWwgZmlsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSBidWZmZXIsIHNvIHNldCBzZWNvbmRhcnkKLSAgICAgICAgICAgIC8vIHByb2dyZXNzIHRvIG1heGltdW0uCi0gICAgICAgICAgICBpZiAoZ2V0QnVmZmVyUGVyY2VudGFnZSgpIDwgMCkgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhNQVhfUFJPR1JFU1MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoZ2V0QnVmZmVyUGVyY2VudGFnZSgpICogMTApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbmRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FbmRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShtRHVyYXRpb24pKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShjdXJyZW50UG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgZmlyc3QgNSBzZWNvbmRzIG9mIHRoZQotICAgICAgICAgICAgLy8gYWR2ZXJ0aXNlbWVudC4KLSAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA8PSBBRF9TS0lQX1dBSVRfVElNRV9NUykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBza2lwVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEX1NLSVBfV0FJVF9USU1FX01TIC0gY3VycmVudFBvc2l0aW9uKSAvIDEwMDAgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFRleHQoc2tpcFRpbWVUZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoZSBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFJlbWFpbmluZ1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24gPCAwKSA/IDAgOiAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVtYWluaW5nVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRm9yVGltZShyZW1haW5pbmdUaW1lKSk7Ci0gICAgICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRUZXh0KHJlbWFpbmluZ1RpbWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpIHsKLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGF1c2UoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvbnRyb2xzLnBsYXkoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBhcmUgdHdvIHNjZW5hcmlvcyB0aGF0IGNhbiB0cmlnZ2VyIHRoZSBzZWVrYmFyIGxpc3RlbmVyIHRvIHRyaWdnZXI6Ci0gICAgLy8KLSAgICAvLyBUaGUgZmlyc3QgaXMgdGhlIHVzZXIgdXNpbmcgdGhlIHRvdWNocGFkIHRvIGFkanVzdCB0aGUgcG9zaXRpdG9uIG9mIHRoZQotICAgIC8vIHNlZWtiYXIncyB0aHVtYi4gSW4gdGhpcyBjYXNlIG9uU3RhcnRUcmFja2luZ1RvdWNoIGlzIGNhbGxlZCBmb2xsb3dlZCBieQotICAgIC8vIGEgbnVtYmVyIG9mIG9uUHJvZ3Jlc3NDaGFuZ2VkIG5vdGlmaWNhdGlvbnMsIGNvbmNsdWRlZCBieSBvblN0b3BUcmFja2luZ1RvdWNoLgotICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGZpZWxkICJtRHJhZ2dpbmciIHRvIHRydWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZ2dpbmcKLSAgICAvLyBzZXNzaW9uIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBwb3NpdGlvbiBpbiBjYXNlIG9mIG9uZ29pbmcgcGxheWJhY2suCi0gICAgLy8KLSAgICAvLyBUaGUgc2Vjb25kIHNjZW5hcmlvIGludm9sdmVzIHRoZSB1c2VyIG9wZXJhdGluZyB0aGUgc2Nyb2xsIGJhbGwsIGluIHRoaXMKLSAgICAvLyBjYXNlIHRoZXJlIFdPTidUIEJFIG9uU3RhcnRUcmFja2luZ1RvdWNoL29uU3RvcFRyYWNraW5nVG91Y2ggbm90aWZpY2F0aW9ucywKLSAgICAvLyB3ZSB3aWxsIHNpbXBseSBhcHBseSB0aGUgdXBkYXRlZCBwb3NpdGlvbiB3aXRob3V0IHN1c3BlbmRpbmcgcmVndWxhciB1cGRhdGVzLgotICAgIHByaXZhdGUgZmluYWwgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgbVNlZWtMaXN0ZW5lciA9IG5ldyBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJhZ2dpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBCeSByZW1vdmluZyB0aGVzZSBwZW5kaW5nIHByb2dyZXNzIG1lc3NhZ2VzIHdlIG1ha2Ugc3VyZQotICAgICAgICAgICAgLy8gdGhhdCBhKSB3ZSB3b24ndCB1cGRhdGUgdGhlIHByb2dyZXNzIHdoaWxlIHRoZSB1c2VyIGFkanVzdHMKLSAgICAgICAgICAgIC8vIHRoZSBzZWVrYmFyIGFuZCBiKSBvbmNlIHRoZSB1c2VyIGlzIGRvbmUgZHJhZ2dpbmcgdGhlIHRodW1iCi0gICAgICAgICAgICAvLyB3ZSB3aWxsIHBvc3Qgb25lIG9mIHRoZXNlIG1lc3NhZ2VzIHRvIHRoZSBxdWV1ZSBhZ2FpbiBhbmQKLSAgICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgbWVzc2FnZSBxdWV1ZWQgdXAuCi0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdG9wcGVkLiBJbiB0aGlzIGNhc2UsIHVwZGF0ZSB0aGUgcGF1c2UgYnV0dG9uIHRvCi0gICAgICAgICAgICAvLyBzaG93IHRoZSBwbGF5IGltYWdlIGluc3RlYWQgb2YgdGhlIHJlcGxheSBpbWFnZS4KLSAgICAgICAgICAgIGlmIChtSXNTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgYmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gcHJvZ3JhbW1hdGljYWxseSBnZW5lcmF0ZWQgY2hhbmdlcyB0bwotICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyBiYXIncyBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IChpbnQpICgoKGxvbmcpIG1EdXJhdGlvbiAqIHByb2dyZXNzKSAvIE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3NpdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURyYWdnaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHByb2dyZXNzIGlzIHByb3Blcmx5IHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgICAgIC8vIHRoZSBjYWxsIHRvIHNob3coKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhpcyBiZWNhdXNlIGl0IGlzIGEKLSAgICAgICAgICAgIC8vIG5vLW9wIGlmIHdlIGFyZSBhbHJlYWR5IHNob3dpbmcuCi0gICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVBsYXlQYXVzZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUmV3TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpIC0gUkVXSU5EX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZmd2RMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgKyBGT1JXQVJEX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU5leHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvTmV4dCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVByZXZMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvUHJldmlvdXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1CYWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1WaWRlb1F1YWxpdHlMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtVmlkZW9RdWFsaXR5TGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZ1bGxTY3JlZW5MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRW50ZXJpbmdGdWxsU2NyZWVuID0gIW1Jc0Z1bGxTY3JlZW47Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZS1hcnJhbmdlIHRoZSBidXR0b24gbGF5b3V0cyBhY2NvcmRpbmcgdG8gdGhlIFVYLgotICAgICAgICAgICAgaWYgKGlzRW50ZXJpbmdGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGFyZ3MucHV0Qm9vbGVhbihBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiwgaXNFbnRlcmluZ0Z1bGxTY3JlZW4pOwotICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfRlVMTFNDUkVFTiwgYXJncywgbnVsbCk7Ci0KLSAgICAgICAgICAgIG1Jc0Z1bGxTY3JlZW4gPSBpc0VudGVyaW5nRnVsbFNjcmVlbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93TGVmdExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1NdXRlQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaWYgKCFtSXNNdXRlKSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXRlZF9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgIG1Jc011dGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfTVVURSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfdW5tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfVU5NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX01BSU47Ci0gICAgICAgICAgICBtU2V0dGluZ3NBZGFwdGVyLnNldFN1YlRleHRzKG1TZXR0aW5nc1N1YlRleHRzTGlzdCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyCi0gICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgc3dpdGNoIChtU2V0dGluZ3NNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX01BSU46Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1BdWRpb1RyYWNrTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVBsYXliYWNrU3BlZWRUZXh0TGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3BlZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0hFTFApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwgcG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTcGVlZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRGbG9hdChLRVlfUExBWUJBQ0tfU1BFRUQsIG1QbGF5YmFja1NwZWVkTGlzdC5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVELCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfSEVMUDoKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsIHBvc2l0aW9uIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb24sIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfSElERV9TVUJUSVRMRSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb2ZmLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb2ZmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWToKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvIHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUR1cmF0aW9uKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gKGludCkgbU1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSB0aXRsZSBiYXIgaXMgbWFkZSB1cCBvZiB0d28gc2VwYXJhdGUgTGluZWFyTGF5b3V0cy4gSWYgdGhlIHN1bSBvZiB0aGUgdHdvIGJhcnMgYXJlCi0gICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHRpdGxlIGJhciwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsZWZ0IGJhciAod2hpY2ggbWFrZXMgdGhlCi0gICAgLy8gVGV4dFZpZXcgdGhhdCBjb250YWlucyB0aGUgdGl0bGUgb2YgdGhlIG1lZGlhIGZpbGUgc2hyaW5rKS4KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHRpdGxlQmFyV2lkdGggPSBtVGl0bGVCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgVmlldyBsZWZ0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9sZWZ0KTsKLSAgICAgICAgICAgIFZpZXcgcmlnaHRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgIGludCBsZWZ0QmFyV2lkdGggPSBsZWZ0QmFyLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgcmlnaHRCYXJXaWR0aCA9IHJpZ2h0QmFyLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBsZWZ0QmFyLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPiB0aXRsZUJhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gdGl0bGVCYXJXaWR0aCAtIHJpZ2h0QmFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gbGVmdEJhcldpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoIDwgdGl0bGVCYXJXaWR0aCAmJiBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggIT0gMCkgewotICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmdEJhci5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAobU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZVRleHQgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBhcnRpc3RUZXh0ID0gIiI7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKSkgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGl0bGUgZm9yIEVtYmVkZGVkIHNpemUgdHlwZQotICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlVGV4dCArICIgLSAiICsgYXJ0aXN0VGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0byB0cnVlIHRvIHVwZGF0ZSBsYXlvdXQgaW5zaWRlIG9uTWVhc3VyZSgpCi0gICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRDb2xvckZpbHRlcihSLmNvbG9yLmdyYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoaW50IG1heEljb25Db3VudCwgaW50IGZ1bGxJY29uU2l6ZSwgaW50IGVtYmVkZGVkSWNvblNpemUsCi0gICAgICAgICAgICAgaW50IG1hcmdpblNpemUsIGludCBjdXJyV2lkdGgsIGludCBjdXJySGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgaW50IGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZnVsbEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZW1iZWRkZWRJY29uU2l6ZSAqIG1heEljb25Db3VudAotICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKLSAgICAgICAgaW50IGZ1bGxXaWR0aCA9IG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpICsgbVRpbWVWaWV3LmdldFdpZHRoKCkKLSAgICAgICAgICAgICAgICArIGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgZW1iZWRkZWRXaWR0aCA9IG1UaW1lVmlldy5nZXRXaWR0aCgpICsgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgc2NyZWVuTWF4TGVuZ3RoID0gTWF0aC5tYXgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGZ1bGxXaWR0aCA+IHNjcmVlbk1heExlbmd0aCkgewotICAgICAgICAgICAgLy8gVE9ETzogc2NyZWVuIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBuZWVkZWQgZm9yIEZ1bGwgc2l6ZS4KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNGdWxsU2l6ZSA9IChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgPyAoY3VycldpZHRoID09IHNjcmVlbk1heExlbmd0aCkgOgotICAgICAgICAgICAgICAgIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpOwotCi0gICAgICAgIGlmIChpc0Z1bGxTaXplKSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZW1iZWRkZWRXaWR0aCA8PSBjdXJyV2lkdGgpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRU1CRURERUQpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfTUlOSU1BTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX01JTklNQUwpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoaW50IHNpemVUeXBlKSB7Ci0gICAgICAgIG1TaXplVHlwZSA9IHNpemVUeXBlOwotICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgdGltZVZpZXdQYXJhbXMgPQotICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIG1UaW1lVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICBzd2l0Y2ggKG1TaXplVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRU1CRURERUQ6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRiwgUi5pZC5ib3R0b21fYmFyX2xlZnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0ZVTEw6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5mdWxsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzLCAwKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YsIFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfTUlOSU1BTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1NaW5pbWFsRXh0cmFWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG51bGwpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVWaWV3LnNldExheW91dFBhcmFtcyh0aW1lVmlld1BhcmFtcyk7Ci0KLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzRnVsbFNjcmVlbikgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoaW50IGxheW91dElkKSB7Ci0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucGF1c2UpOwotICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVBsYXlQYXVzZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRmZ3ZEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZmZ3ZCk7Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZmd2RMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1SZXdCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnJldyk7Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1SZXdMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMKLSAgICAgICAgbU5leHRCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm5leHQpOwotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1OZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmV2QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcmV2KTsKLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUHJldkxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKSB7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCkpOwotCi0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcylbUExBWUJBQ0tfU1BFRURfMXhfSU5ERVhdKTsKLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZChSRVNPVVJDRV9FTVBUWSk7Ci0KLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2F1ZGlvdHJhY2spOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQpOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19oZWxwKTsKLQotICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKLQotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQpKTsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZFRleHRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcykpKTsKLSAgICAgICAgLy8gU2VsZWN0IHRoZSAiMXgiIHNwZWVkIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gUExBWUJBQ0tfU1BFRURfMXhfSU5ERVg7Ci0KLSAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKLSAgICAgICAgaW50W10gc3BlZWRzID0gbVJlc291cmNlcy5nZXRJbnRBcnJheShSLmFycmF5LnNwZWVkX211bHRpcGxpZWRfYnlfMTAwKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gKGZsb2F0KSBzcGVlZHNbaV0gLyAxMDAuMGY7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QuYWRkKHNwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5U2V0dGluZ3NXaW5kb3coQmFzZUFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICAvLyBTZXQgQWRhcHRlcgotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotCi0gICAgICAgIC8vIFNldCB3aWR0aCBvZiB3aW5kb3cKLSAgICAgICAgaW50IGl0ZW1XaWR0aCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggOiBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2V0V2lkdGgoaXRlbVdpZHRoKTsKLQotICAgICAgICAvLyBDYWxjdWxhdGUgaGVpZ2h0IG9mIHdpbmRvdyBhbmQgc2hvdwotICAgICAgICBpbnQgaXRlbUhlaWdodCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0IDogbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgICAgIGludCB0b3RhbEhlaWdodCA9IGFkYXB0ZXIuZ2V0Q291bnQoKSAqIGl0ZW1IZWlnaHQ7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zaG93QXNEcm9wRG93bihtSW5zdGFuY2UsIG1TZXR0aW5nc1dpbmRvd01hcmdpbiwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gLSB0b3RhbEhlaWdodCwgR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LlJJR0hUKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBzdGF0ZTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIHBhdXNlIGJ1dHRvbiBkZXBlbmRpbmcgb24gcGxheWJhY2sgc3RhdGUgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIHJlYXNvbnM6Ci0gICAgICAgICAgICAvLyAgIDEpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgYXBwIGN1c3RvbWl6ZXMgcGxheWJhY2sgc3RhdGUgYmVoYXZpb3Igd2hlbiBhcHAKLSAgICAgICAgICAgIC8vICAgICAgYWN0aXZpdHkgaXMgcmVzdW1lZC4KLSAgICAgICAgICAgIC8vICAgMikgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSB0aGUgbWVkaWEgZmlsZSByZWFjaGVzIGVuZCBvZiBkdXJhdGlvbi4KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpICE9IG1QcmV2U3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVBsYXliYWNrQWN0aW9ucyAhPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBsb25nIG5ld0FjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQWN0aW9ucyA9IG5ld0FjdGlvbnM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBidXR0b25zIGlmIGN1c3RvbSBhY3Rpb25zIGFyZSBwcmVzZW50LgotICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gY3VzdG9tQWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEN1c3RvbUFjdGlvbnMoKTsKLSAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBhY3Rpb24gOiBjdXN0b21BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlQnV0dG9uIGJ1dHRvbiA9IG5ldyBJbWFnZUJ1dHRvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogQXR0cmlidXRlU2V0ICovLCAwIC8qIFN0eWxlICovKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQXBwbHkgUi5zdHlsZS5Cb3R0b21CYXJCdXR0b24gdG8gdGhpcyBidXR0b24gdXNpbmcgbGlicmFyeSBjb250ZXh0LgotICAgICAgICAgICAgICAgICAgICAvLyBSZWZlciBDb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50IChpbnQgZGVmU3R5bGVSZXMpIG9mIFZpZXcuamF2YQotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0SW1hZ2VSZXNvdXJjZShhY3Rpb24uZ2V0SWNvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRvb2x0aXBUZXh0KGFjdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uU3RyaW5nID0gYWN0aW9uLmdldEFjdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgd2UgYXJlIGp1c3Qgc2VuZGluZyBleHRyYXMgdGhhdCBjYW1lIGZyb20gc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBpdCB0aGUgcmlnaHQgYmVoYXZpb3I/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlbmRDdXN0b21BY3Rpb24oYWN0aW9uU3RyaW5nLCBhY3Rpb24uZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5hZGRWaWV3KGJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB1cGRhdGVBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRXZlbnQoU3RyaW5nIGV2ZW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfVklERU9fVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBhdWRpbyB0cmFja3MsIGFuZCB0aGlzIGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbgotICAgICAgICAgICAgICAgICAgICAvLyByZWZsZWN0ZWQgaW50byB0aGUgU2V0dGluZ3Mgd2luZG93IHlldCwgYXV0b21hdGljYWxseSBjaGVjayB0aGUgZmlyc3QgdHJhY2suCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIEF1ZGlvIFRyYWNrIHNlbGVjdGlvbiB3aWxsIGJlIGRlZmF1bHRlZCB0byAiTm9uZSIuCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9BVURJT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRleHQgYWJvdXQgdHJhY2sgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHN1YiB0ZXh0IGluc2lkZSB0aGUgU2V0dGluZ3Mgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuZ2V0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0NvdW50ID09IDAgJiYgbUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGUgPSBNRURJQV9UWVBFX01VU0lDOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV9vZmZfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3VidGl0bGVUcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdTdGF0dXMgPSBleHRyYXMuZ2V0Qm9vbGVhbihLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgIT0gbUlzQWR2ZXJ0aXNlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlzQWR2ZXJ0aXNlbWVudCA9IG5ld1N0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtSWNvbklkczsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU1haW5UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YlRleHRzOwotCi0gICAgICAgIHB1YmxpYyBTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IG1haW5UZXh0cywgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzdWJUZXh0cywKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgTGlzdDxJbnRlZ2VyPiBpY29uSWRzKSB7Ci0gICAgICAgICAgICBtTWFpblRleHRzID0gbWFpblRleHRzOwotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBtSWNvbklkcyA9IGljb25JZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKLSAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOwotICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobU1haW5UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbU1haW5UZXh0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobU1haW5UZXh0cyA9PSBudWxsKSA/IDAgOiBtTWFpblRleHRzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKLSAgICAgICAgICAgIFZpZXcgcm93OwotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgbWFpblRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubWFpbl90ZXh0KTsKLSAgICAgICAgICAgIFRleHRWaWV3IHN1YlRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuc3ViX3RleHQpOwotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOwotCi0gICAgICAgICAgICAvLyBTZXQgbWFpbiB0ZXh0Ci0gICAgICAgICAgICBtYWluVGV4dFZpZXcuc2V0VGV4dChtTWFpblRleHRzLmdldChwb3NpdGlvbikpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgc3ViIHRleHQgYW5kIGNlbnRlciB0aGUgbWFpbiB0ZXh0IGlmIHN1YiB0ZXh0cyBkbyBub3QgZXhpc3QgYXQgYWxsIG9yIHRoZSBzdWIKLSAgICAgICAgICAgIC8vIHRleHQgYXQgdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIGVtcHR5LgotICAgICAgICAgICAgaWYgKG1TdWJUZXh0cyA9PSBudWxsIHx8IG1TdWJUZXh0cy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBzdWIgdGV4dC4KLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRUZXh0KG1TdWJUZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIG1haW4gaWNvbiBhbmQgc2V0IHZpc2liaWxpdHkgdG8gZ29uZSBpZiBpY29ucyBhcmUgc2V0IHRvIG51bGwgb3IgdGhlIGljb24gYXQKLSAgICAgICAgICAgIC8vIHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBzZXQgdG8gUkVTT1VSQ0VfTk9OX0VYSVNURU5ULgotICAgICAgICAgICAgaWYgKG1JY29uSWRzID09IG51bGwgfHwgbUljb25JZHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9OT05fRVhJU1RFTlQpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IG1haW4gaWNvbi4KLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUobUljb25JZHMuZ2V0KHBvc2l0aW9uKSwgbnVsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBleHRlbmQgdGhpcyBjbGFzcyBmcm9tIFNldHRpbmdzQWRhcHRlcgotICAgIHByaXZhdGUgY2xhc3MgU3ViU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGV4dHM7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DaGVja1Bvc2l0aW9uOwotCi0gICAgICAgIHB1YmxpYyBTdWJTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IHRleHRzLCBpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7Ci0gICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgaWYgKG1UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVRleHRzLmdldChwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1UZXh0cyA9PSBudWxsKSA/IDAgOiBtVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgY2hlY2tWaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmNoZWNrKTsKLQotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbUNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBjaGVja1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHMoTGlzdDxTdHJpbmc+IHRleHRzKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENoZWNrUG9zaXRpb24oaW50IGNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjJjZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyLkFuY2hvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKLQotY2xhc3MgU3VidGl0bGVWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBBbmNob3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVWaWV3IjsKLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IG1TdWJ0aXRsZVdpZGdldDsKLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldC5PbkNoYW5nZWRMaXN0ZW5lciBtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyOwotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KSB7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgPT0gc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXR0YWNoZWRUb1dpbmRvdyA9IGlzQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRPbkNoYW5nZWRMaXN0ZW5lcihudWxsKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVXaWRnZXQgPSBzdWJ0aXRsZVdpZGdldDsKLQotICAgICAgICBpZiAoc3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKLSAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKSB7Ci0gICAgICAgIHJldHVybiBMb29wZXIuZ2V0TWFpbkxvb3BlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZ2V0UGFkZGluZ0xlZnQoKSwgZ2V0UGFkZGluZ1RvcCgpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFN1YnRpdGxlVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzkyZTg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0KLWNsYXNzIFZpZGVvU3VyZmFjZVZpZXcgZXh0ZW5kcyBTdXJmYWNlVmlldyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1N1cmZhY2VWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLSAgICBwcml2YXRlIFN1cmZhY2VIb2xkZXIgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXIgPSBudWxsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIpOwotICAgICAgICBpZiAobXAgPT0gbnVsbCB8fCAhaGFzQXZhaWxhYmxlU3VyZmFjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0RGlzcGxheShtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1NVUkZBQ0VWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCAmJiBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjawotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInN1cmZhY2VDcmVhdGVkOiBtU3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyICsgIiwgbmV3IGhvbGRlcjogIiArIGhvbGRlcik7Ci0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gaG9sZGVyOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZWN0IHJlY3QgPSBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNoYW5nZWQodGhpcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIC8vIEFmdGVyIHdlIHJldHVybiBmcm9tIHRoaXMgd2UgY2FuJ3QgdXNlIHRoZSBzdXJmYWNlIGFueSBtb3JlCi0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VEZXN0cm95ZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSB0aGUgd2F5IHRvIG1vdmUgb25NZWFzdXJlKCkgY29kZSBpbnRvIEZyYW1lTGF5b3V0LgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFN1cmZhY2VWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGEzYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVc7Ci0KLUBSZXF1aXJlc0FwaSgyNikKLWNsYXNzIFZpZGVvVGV4dHVyZVZpZXcgZXh0ZW5kcyBUZXh0dXJlVmlldwotICAgICAgICBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1RleHR1cmVWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOwotICAgIHByaXZhdGUgU3VyZmFjZSBtU3VyZmFjZTsKLSAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgICAgIHNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgbm90IHJlYWR5LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1wLnNldFN1cmZhY2UobVN1cmZhY2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKLSAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9URVhUVVJFVklFVzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKLSAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKLSAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKG1TdXJmYWNlVGV4dHVyZSAhPSBudWxsICYmICFtU3VyZmFjZVRleHR1cmUuaXNSZWxlYXNlZCgpICYmIG1TdXJmYWNlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlCi0gICAgICAgICAgICAgICAgKyAiLCBuZXcgc3VyZmFjZTogIiArIHN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gc3VyZmFjZVRleHR1cmU7Ci0gICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVTaXplQ2hhbmdlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCk7ICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIGl0IHNob3VsZCBiZSBjYWxsZWQgaGVyZT8KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlVXBkYXRlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7Ci0gICAgICAgIC8vIG5vLW9wCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOwotICAgICAgICBtU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFRleHR1cmVWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Mjc5ZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMkltcGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5QbGF5YmFja1BhcmFtczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkVGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZGVvVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmdyYXBoaWNzLnBhbGV0dGUuUGFsZXR0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Sb3V0ZVBsYXllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5DbG9zZWRDYXB0aW9uUmVuZGVyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhQ29udHJvbEludGVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgVmlkZW9WaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3MlByb3ZpZGVyLCBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVmlldzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TSE9XX0NPTlRST0xMRVJfSU5URVJWQUxfTVMgPSAyMDAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWRlb1ZpZXcyIG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FUlJPUiA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSRUQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEFVU0VEID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQUNLX0lOREVYID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WQUxJRF9TUEVFRCA9IDBmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKLSAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKLQotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cmlidXRlczsKLSAgICBwcml2YXRlIGludCBtQXVkaW9Gb2N1c1R5cGUgPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOOyAvLyBsZWdhY3kgZm9jdXMgZ2FpbgotCi0gICAgcHJpdmF0ZSBQYWlyPEV4ZWN1dG9yLCBWaWRlb1ZpZXcyLk9uQ3VzdG9tQWN0aW9uTGlzdGVuZXI+IG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZDsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXcyLk9uRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1DdXJyZW50VmlldzsKLSAgICBwcml2YXRlIFZpZGVvVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OwotICAgIHByaXZhdGUgVmlkZW9TdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7Ci0KLSAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7Ci0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRHNkOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sVmlldzIgbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbU1lZGlhU2Vzc2lvbjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtTWVkaWFDb250cm9sbGVyOwotICAgIHByaXZhdGUgTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1lZGlhTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIG1SZXRyaWV2ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVXBkYXRlTWVkaWFUeXBlOwotICAgIHByaXZhdGUgQnVuZGxlIG1NZWRpYVR5cGVEYXRhOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZTsKLQotICAgIC8vIFRPRE86IG1vdmUgbXVzaWMgdmlldyBpbnNpZGUgU3VyZmFjZVZpZXcvVGV4dHVyZVZpZXcgb3IgaW1wbGVtZW50IFZpZGVvVmlld0ludGVyZmFjZS4KLSAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIFZpZXcgbU11c2ljVmlldzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1NdXNpY0FsYnVtRHJhd2FibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljVGl0bGVUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIG1NdXNpY0FydGlzdFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc011c2ljTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbURvbWluYW50Q29sb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotCi0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlLkJ1aWxkZXIgbVN0YXRlQnVpbGRlcjsKLSAgICBwcml2YXRlIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25MaXN0OwotICAgIHByaXZhdGUgaW50IG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlOwotICAgIHByaXZhdGUgbG9uZyBtU2Vla1doZW5QcmVwYXJlZDsgIC8vIHJlY29yZGluZyB0aGUgc2VlayBwb3NpdGlvbiB3aGlsZSBwcmVwYXJpbmcKLQotICAgIHByaXZhdGUgaW50IG1WaWRlb1dpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb0hlaWdodDsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1WaWRlb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXVkaW9UcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdWJ0aXRsZVRyYWNrPj4gbVN1YnRpdGxlVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgU3VidGl0bGVDb250cm9sbGVyIG1TdWJ0aXRsZUNvbnRyb2xsZXI7Ci0KLSAgICAvLyBzZWxlY3RlZCB2aWRlby9hdWRpby9zdWJ0aXRsZSB0cmFjayBpbmRleCBhcyBNZWRpYVBsYXllcjIgcmV0dXJucwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotCi0gICAgcHJpdmF0ZSBTdWJ0aXRsZVZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlRW5hYmxlZDsKLQotICAgIHByaXZhdGUgZmxvYXQgbVNwZWVkOwotICAgIC8vIFRPRE86IFJlbW92ZSBtRmFsbGJhY2tTcGVlZCB3aGVuIGludGVncmF0aW9uIHdpdGggTWVkaWFQbGF5ZXIyJ3MgbmV3IHNldFBsYXliYWNrUGFyYW1zKCkuCi0gICAgLy8gUmVmZXI6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMW56QWZuczZpMmhKM1JrYVVyZTNRTVQ2d3NEZWRKNU9OTGlBX09PQkZGWDgvZWRpdAotICAgIHByaXZhdGUgZmxvYXQgbUZhbGxiYWNrU3BlZWQ7ICAvLyBrZWVwIHRoZSBvcmlnaW5hbCBzcGVlZCBiZWZvcmUgJ3BhdXNlJyBpcyBjYWxsZWQuCi0gICAgcHJpdmF0ZSBmbG9hdCBtVm9sdW1lTGV2ZWxGbG9hdDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lTGV2ZWw7Ci0KLSAgICBwcml2YXRlIGxvbmcgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbU1lZGlhUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLSAgICBwcml2YXRlIFJvdXRlUGxheWVyIG1Sb3V0ZVBsYXllcjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbVJvdXRlckNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIGxvY2FsIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBuZXcgUm91dGVQbGF5ZXIobUluc3RhbmNlLmdldENvbnRleHQoKSwgcm91dGUpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5zZXRQbGF5ZXJFdmVudENhbGxiYWNrKG5ldyBSb3V0ZVBsYXllci5QbGF5ZXJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQnVpbGRlciBwc0J1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0QWN0aW9ucyhSb3V0ZVBsYXllci5QTEFZQkFDS19BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpdGVtU3RhdHVzLmdldENvbnRlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtU3RhdHVzLmdldFBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BFTkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX05PTkUsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcsIHBvc2l0aW9uLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HLCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHBiU3RhdGUgPSBwc0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShwYlN0YXRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIG1tQnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1tQnVpbGRlci5wdXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU3RhdHVzLmdldENvbnRlbnREdXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEobW1CdWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVtb3RlIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZSAhPSBudWxsICYmIG1Sb3V0ZVBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhc29uICE9IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVzdW1lIGxvY2FsIHBsYXliYWNrICAoaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIG9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgVmlkZW9WaWV3MkltcGwoVmlkZW9WaWV3MiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgbVZpZGVvV2lkdGggPSAwOwotICAgICAgICBtVmlkZW9IZWlnaHQgPSAwOwotICAgICAgICBtU3BlZWQgPSAxLjBmOwotICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gSU5WQUxJRF9UUkFDS19JTkRFWDsKLSAgICAgICAgLy8gVE9ETzogYWRkIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoaXMgdmFsdWUuCi0gICAgICAgIG1TaG93Q29udHJvbGxlckludGVydmFsTXMgPSBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUzsKLQotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLQotICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTUVESUEpCi0gICAgICAgICAgICAgICAgLnNldENvbnRlbnRUeXBlKEF1ZGlvQXR0cmlidXRlcy5DT05URU5UX1RZUEVfTU9WSUUpLmJ1aWxkKCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RGb2N1cygpOwotCi0gICAgICAgIC8vIFRPRE86IHRyeSB0byBrZWVwIGEgc2luZ2xlIGNoaWxkIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbHdheXMgaGF2aW5nIGJvdGguCi0gICAgICAgIG1UZXh0dXJlVmlldyA9IG5ldyBWaWRlb1RleHR1cmVWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtU3VyZmFjZVZpZXcgPSBuZXcgVmlkZW9TdXJmYWNlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1UZXh0dXJlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdXJmYWNlVmlldyk7Ci0KLSAgICAgICAgbVN1YnRpdGxlVmlldyA9IG5ldyBTdWJ0aXRsZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0QmFja2dyb3VuZENvbG9yKDApOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtU3VidGl0bGVWaWV3KTsKLQotICAgICAgICBib29sZWFuIGVuYWJsZUNvbnRyb2xWaWV3ID0gKGF0dHJzID09IG51bGwpIHx8IGF0dHJzLmdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAiZW5hYmxlQ29udHJvbFZpZXciLCB0cnVlKTsKLSAgICAgICAgaWYgKGVuYWJsZUNvbnRyb2xWaWV3KSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldyA9IG5ldyBNZWRpYUNvbnRyb2xWaWV3MihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdWJ0aXRsZUVuYWJsZWQgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVTdWJ0aXRsZSIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUT0RPOiBDaG9vc2UgVGV4dHVyZVZpZXcgd2hlbiBTdXJmYWNlVmlldyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICAgICAgLy8gQ2hvb3NlIHN1cmZhY2UgdmlldyBieSBkZWZhdWx0Ci0gICAgICAgIGludCB2aWV3VHlwZSA9IChhdHRycyA9PSBudWxsKSA/IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXCi0gICAgICAgICAgICAgICAgOiBhdHRycy5nZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAidmlld1R5cGUiLCBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVyk7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHN1cmZhY2VWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZpZXdUeXBlIGF0dHJpYnV0ZSBpcyB0ZXh0dXJlVmlldy4iKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhQ29udHJvbFZpZXcyX2ltcGwoTWVkaWFDb250cm9sVmlldzIgbWVkaWFDb250cm9sVmlldywgbG9uZyBpbnRlcnZhbE1zKSB7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbWVkaWFDb250cm9sVmlldzsKLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IGludGVydmFsTXM7Ci0gICAgICAgIC8vIFRPRE86IENhbGwgTWVkaWFDb250cm9sVmlldzIuc2V0Um91dGVTZWxlY3RvciBvbmx5IHdoZW4gY2FzdCBhdmFpbGFsYmUuCi0gICAgICAgICgoTWVkaWFDb250cm9sVmlldzJJbXBsKSBtTWVkaWFDb250cm9sVmlldy5nZXRQcm92aWRlcigpKS5zZXRSb3V0ZVNlbGVjdG9yKG1Sb3V0ZVNlbGVjdG9yKTsKLQotICAgICAgICBpZiAobUluc3RhbmNlLmlzQXR0YWNoZWRUb1dpbmRvdygpKSB7Ci0gICAgICAgICAgICBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyIGdldE1lZGlhQ29udHJvbGxlcl9pbXBsKCkgewotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZWRpYVNlc3Npb24gaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzIgZ2V0TWVkaWFDb250cm9sVmlldzJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRNZWRpYU1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFNZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYU1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gVE9ETzogaW50ZWdyYXRlIHRoaXMgd2l0aCBNZWRpYVNlc3Npb24yI01lZGlhSXRlbTIKLSAgICAgICAgbU1lZGlhTWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgd2Vic2l0ZSBsaW5rCi0gICAgICAgIG1NZWRpYVR5cGVEYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBib29sZWFuIGlzQWQgPSBtZXRhZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICBmYWxzZSA6IG1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQpICE9IDA7Ci0gICAgICAgIG1NZWRpYVR5cGVEYXRhLnB1dEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5ULCBpc0FkKTsKLQotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMsIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXRlciBpbnNpZGUgT25QcmVwYXJlZExpc3RlbmVyIGFmdGVyIE1lZGlhU2Vzc2lvbiBpcyBpbml0aWFsaXplZC4KLSAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlRW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChlbmFibGUgIT0gbVN1YnRpdGxlRW5hYmxlZCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IGVuYWJsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YnRpdGxlRW5hYmxlZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1YnRpdGxlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiByZW1vdmUgc2V0U3BlZWRfaW1wbCBvbmNlIE1lZGlhQ29udHJvbGxlcjIgaXMgcmVhZHkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3BlZWRfaW1wbChmbG9hdCBzcGVlZCkgewotICAgICAgICBpZiAoc3BlZWQgPD0gMC4wZikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgc3BlZWQgKCIgKyBzcGVlZCArICIpIGlzIGlnbm9yZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVNwZWVkID0gc3BlZWQ7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChpbnQgZm9jdXNHYWluKSB7Ci0gICAgICAgIGlmIChmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORQotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdWRpbyBmb2N1cyB0eXBlICIgKyBmb2N1c0dhaW4pOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0ZvY3VzVHlwZSA9IGZvY3VzR2FpbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG51bGwgQXVkaW9BdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9QYXRoX2ltcGwoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKFVyaS5wYXJzZShwYXRoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRWaWRlb1VyaSh1cmksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvVXJpX2ltcGwoVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmksIGhlYWRlcnMsIG51bGwpOwotICAgICAgICBtSW5zdGFuY2Uuc2V0RGF0YVNvdXJjZShidWlsZGVyLmJ1aWxkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhSXRlbV9pbXBsKE1lZGlhSXRlbTIgbWVkaWFJdGVtKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZV9pbXBsKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBtRHNkID0gZHNkOwotICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IDA7Ci0gICAgICAgIG9wZW5WaWRlbyhkc2QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdUeXBlX2ltcGwoaW50IHZpZXdUeXBlKSB7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFZpZGVvVmlld0ludGVyZmFjZSB0YXJnZXRWaWV3OwotICAgICAgICBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN3aXRjaGluZyB0byBUZXh0dXJlVmlldyIpOwotICAgICAgICAgICAgdGFyZ2V0VmlldyA9IG1UZXh0dXJlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFN1cmZhY2VWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVN1cmZhY2VWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB2aWV3IHR5cGU6ICIgKyB2aWV3VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgKChWaWV3KSB0YXJnZXRWaWV3KS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIHRhcmdldFZpZXcudGFrZU92ZXIobUN1cnJlbnRWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21BY3Rpb25zX2ltcGwoCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBhY3Rpb25MaXN0LAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZCA9IG5ldyBQYWlyPD4oZXhlY3V0b3IsIGxpc3RlbmVyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWJhY2sgYnVpbGRlciBpbiBvcmRlciB0byBjbGVhciBleGlzdGluZyB0aGUgY3VzdG9tIGFjdGlvbnMuCi0gICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBudWxsOwotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIGwpIHsKLSAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSBNZWRpYVNlc3Npb24KLSAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24obUluc3RhbmNlLmdldENvbnRleHQoKSwgIlZpZGVvVmlldzJNZWRpYVNlc3Npb24iKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRDYWxsYmFjayhuZXcgTWVkaWFTZXNzaW9uQ2FsbGJhY2soKSk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0QWN0aXZlKHRydWUpOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIG1NZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtTWVkaWFSb3V0ZXIuc2V0TWVkaWFTZXNzaW9uKG1NZWRpYVNlc3Npb24pOwotICAgICAgICBtTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVJvdXRlU2VsZWN0b3IsIG1Sb3V0ZXJDYWxsYmFjayk7Ci0gICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYWZ0ZXIgbW92aW5nIE1lZGlhU2Vzc2lvbiBjcmVhdGluZyBjb2RlIGluc2lkZSBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgewotICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBleHRyYWN0QXVkaW9NZXRhZGF0YSgpOwotICAgICAgICAgICAgaWYgKG1OZWVkVXBkYXRlTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgICAgICAgICBtTmVlZFVwZGF0ZU1lZGlhVHlwZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIG1NZWRpYVNlc3Npb24ucmVsZWFzZSgpOwotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbnVsbDsKLSAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBWaWRlb1ZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVG91Y2hFdmVudCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgbU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSB8fCBtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICAvLyBUT0RPOiBUZXN0IHRvdWNoIGV2ZW50IGhhbmRsaW5nIGxvZ2ljIHRob3JvdWdobHkgYW5kIHNpbXBsaWZ5IHRoZSBsb2dpYy4KLSAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAobUlzTXVzaWNNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiA9IHJldHJpZXZlT3JpZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmZ1bGxfbGFuZHNjYXBlX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9wb3J0cmFpdF9tdXNpYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRU1CRURERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBuZXcgbUZhZGVPdXQgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOwotICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLlN1cmZhY2VMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZUNyZWF0ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgd2lkdGgvaGVpZ2h0OiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VEZXN0cm95ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gY2FsbCByZXF1ZXN0TGF5b3V0IGhlcmU/Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ2hhbmdlZCgpLiB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGFrZU92ZXJEb25lKCkuIE5vdyBjdXJyZW50IHZpZXcgaXM6ICIgKyB2aWV3KTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZpZXcgPSB2aWV3OwotICAgICAgICBpZiAobVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lci5vblZpZXdUeXBlQ2hhbmdlZChtSW5zdGFuY2UsIHZpZXcuZ2V0Vmlld1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoTWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgLy8gR2V0IE1lZGlhQ29udHJvbGxlciBmcm9tIE1lZGlhU2Vzc2lvbiBhbmQgc2V0IGl0IGluc2lkZSBNZWRpYUNvbnRyb2xWaWV3Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldENvbnRyb2xsZXIobU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCkpOwotCi0gICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1NZWRpYUNvbnRyb2xWaWV3LCBwYXJhbXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCB8fCBtUm91dGVQbGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9JRExFCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWRUb1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUExBWUlORwotICAgICAgICAgICAgICAgICYmIG1UYXJnZXRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HOwotICAgIH0KLQotICAgIC8vIENyZWF0ZXMgYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgYW5kIHByZXBhcmUgcGxheWJhY2suCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgVXJpIHVyaSA9IGRzZC5nZXRVcmkoKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gZHNkLmdldFVyaUhlYWRlcnMoKTsKLSAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhkc2QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgewotICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBoYXZlIGEgZm9jdXMgbGlzdGVuZXIKLSAgICAgICAgICAgIEF1ZGlvRm9jdXNSZXF1ZXN0IGZvY3VzUmVxdWVzdDsKLSAgICAgICAgICAgIGZvY3VzUmVxdWVzdCA9IG5ldyBBdWRpb0ZvY3VzUmVxdWVzdC5CdWlsZGVyKG1BdWRpb0ZvY3VzVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIucmVxdWVzdEF1ZGlvRm9jdXMoZm9jdXNSZXF1ZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKTogY3JlYXRpbmcgbmV3IE1lZGlhUGxheWVyMiBpbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcjJJbXBsKCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3LmFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1JbnN0YW5jZS5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBBZGQgdGltZWx5IGZpcmluZyBsb2dpYyBmb3IgbW9yZSBhY2N1cmF0ZSBzeW5jIGJldHdlZW4gQ0MgYW5kIHZpZGVvIGZyYW1lCi0gICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyID0gbmV3IFN1YnRpdGxlQ29udHJvbGxlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIucmVnaXN0ZXJSZW5kZXJlcihuZXcgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKGNvbnRleHQpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2V0QW5jaG9yKChTdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yKSBtU3VidGl0bGVWaWV3KTsKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKGV4ZWN1dG9yLCBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2spOwotCi0gICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKGRzZCk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU3VidGl0bGVEYXRhTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHRoZSB0YXJnZXQgc3RhdGUgaGVyZSBlaXRoZXIsIGJ1dCBwcmVzZXJ2ZSB0aGUKLSAgICAgICAgICAgIC8vIHRhcmdldCBzdGF0ZSB0aGF0IHdhcyB0aGVyZSBiZWZvcmUuCi0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmUoKTsKLQotICAgICAgICAgICAgLy8gU2F2ZSBmaWxlIG5hbWUgYXMgdGl0bGUgc2luY2UgdGhlIGZpbGUgbWF5IG5vdCBoYXZlIGEgdGl0bGUgTWV0YWRhdGEuCi0gICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBzY2hlbWUuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKLSAgICAgICAgICAgIG1SZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmkpOwotCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW4gY29udGVudDogIiArIHVyaSwgZXgpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2sub25FcnJvcihtTWVkaWFQbGF5ZXIsIGRzZCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX1VOS05PV04sIE1lZGlhUGxheWVyMi5NRURJQV9FUlJPUl9JTyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlc2V0IHRoZSBtZWRpYSBwbGF5ZXIgaW4gYW55IHN0YXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0UGxheWVyKCkgewotICAgICAgICBpZiAobU1lZGlhUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyMiBwbGF5ZXIgPSBtTWVkaWFQbGF5ZXI7Ci0gICAgICAgICAgICBuZXcgQXN5bmNUYXNrPE1lZGlhUGxheWVyMiwgVm9pZCwgVm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFZvaWQgZG9JbkJhY2tncm91bmQoTWVkaWFQbGF5ZXIyLi4uIHBsYXllcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IE5QRSB3aGlsZSBNZWRpYVBsYXllcjIuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAvL3BsYXllcnNbMF0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suU0VSSUFMX0VYRUNVVE9SLCBwbGF5ZXIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIC8vbVBlbmRpbmdTdWJ0aXRsZVRyYWNrcy5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hYmFuZG9uQXVkaW9Gb2N1cyhudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIGlmIChtU3RhdGVCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXIgZm9yIHRoaXMgc3RyZWFtCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtTWVkaWFQbGF5ZXIuZ2V0TWV0YWRhdGEoTWVkaWFQbGF5ZXIyLk1FVEFEQVRBX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLkJZUEFTU19NRVRBREFUQV9GSUxURVIpOwotCi0gICAgICAgICAgICAvLyBBZGQgUGxheSBhY3Rpb24gYXMgZGVmYXVsdAotICAgICAgICAgICAgbG9uZyBwbGF5YmFja0FjdGlvbnMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZOwotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0ZPUldBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEFjdGlvbnMocGxheWJhY2tBY3Rpb25zKTsKLQotICAgICAgICAgICAgaWYgKG1DdXN0b21BY3Rpb25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IG1DdXN0b21BY3Rpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuYWRkQ3VzdG9tQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0U3RhdGUoZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSwKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1TcGVlZCk7Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIE1lZGlhUGxheWVyMi5nZXRCdWZmZXJlZFBvc2l0aW9uKCkgb25jZSBpdCBpcwotICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQuCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgLyAxMDAuMCAqIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgUGxheWJhY2tTdGF0ZSBmb3IgTWVkaWFTZXNzaW9uCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU3RhdGVCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHN3aXRjaCAobUN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1GYWRlT3V0ID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIC8vIFRPRE86IERlY2lkZSB3aGF0IHRvIHNob3cgd2hlbiB0aGUgc3RhdGUgaXMgbm90IGluIHBsYXliYWNrIHN0YXRlCi0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyA9PSBudWxsIHx8ICFpc0luUGxheWJhY2tTdGF0ZSgpCi0gICAgICAgICAgICAgICAgfHwgKG1Jc011c2ljTWVkaWFUeXBlICYmIG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGlmIChtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zICE9IDAKLSAgICAgICAgICAgICYmICFtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNUb3VjaEV4cGxvcmF0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5wb3N0RGVsYXllZChtRmFkZU91dCwgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVNwZWVkKCkgewotICAgICAgICBQbGF5YmFja1BhcmFtcyBwYXJhbXMgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCk7Ci0gICAgICAgIGlmIChtU3BlZWQgIT0gcGFyYW1zLmdldFNwZWVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLnNldFNwZWVkKG1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBtU3BlZWQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBsYXliYWNrUGFyYW1zIGhhcyB1bnN1cHBvcnRlZCB2YWx1ZTogIiArIGUpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCByZXZpc2UgdGhpcyBwYXJ0IGFmdGVyIGludGVncmF0aW5nIHdpdGggTVAyLgotICAgICAgICAgICAgICAgIC8vIElmIG1TcGVlZCBoYWQgYW4gaWxsZWdhbCB2YWx1ZSBmb3Igc3BlZWQgcmF0ZSwgc3lzdGVtIHdpbGwgZGV0ZXJtaW5lIGJlc3QKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGluZyAoc2VlIFBsYXliYWNrUGFyYW1zLkFVRElPX0ZBTExCQUNLX01PREVfREVGQVVMVCkuCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIHByZS1NUDIgcmV0dXJucyAwLjBmIHdoZW4gaXQgaXMgcGF1c2VkLiBJbiB0aGlzIGNhc2UsIFZpZGVvVmlldzIgd2lsbAotICAgICAgICAgICAgICAgIC8vIHVzZSBtRmFsbGJhY2tTcGVlZCBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIGZsb2F0IGZhbGxiYWNrU3BlZWQgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCkuZ2V0U3BlZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tTcGVlZCA+IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBmYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU3BlZWQgPSBtRmFsbGJhY2tTcGVlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrKCkgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbyA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHJldHVybiBwbGF5YmFja0luZm8gIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHBsYXliYWNrSW5mby5nZXRQbGF5YmFja1R5cGUoKSA9PSBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShib29sZWFuIHNlbGVjdCkgewotICAgICAgICBpZiAoIWlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc2VsZWN0aW9uIGR5bmFtaWMKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLmZpcnN0OwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2VsZWN0VHJhY2sobVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldCgwKS5zZWNvbmQpOwotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLmRlc2VsZWN0VHJhY2sobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUcmFja3MoKSB7Ci0gICAgICAgIExpc3Q8TWVkaWFQbGF5ZXIyLlRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1NZWRpYVBsYXllci5nZXRUcmFja0luZm8oKTsKLSAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZXNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCB0cmFja1R5cGUgPSB0cmFja0luZm9zLmdldChpKS5nZXRUcmFja1R5cGUoKTsKLSAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcy5hZGQoaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUKLSAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKLSAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gbVN1YnRpdGxlQ29udHJvbGxlci5hZGRUcmFjayh0cmFja0luZm9zLmdldChpKS5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmFkZChuZXcgUGFpcjw+KGksIHRyYWNrKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFNlbGVjdCBmaXJzdCB0cmFja3MgYXMgZGVmYXVsdAotICAgICAgICBpZiAobVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID09IDAgJiYgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1Jc011c2ljTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1ZJREVPX1RSQUNLX0NPVU5ULCBtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9BVURJT19UUkFDS19DT1VOVCwgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQsIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShtU3VidGl0bGVFbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIC8vIEdldCBhbmQgc2V0IGR1cmF0aW9uIGFuZCB0aXRsZSB2YWx1ZXMgYXMgTWVkaWFNZXRhZGF0YSBmb3IgTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCAmJiBtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlRJVExFKSkgewotICAgICAgICAgICAgbVRpdGxlID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZXRhZGF0YS5USVRMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1UaXRsZSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0TG9uZygKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0QXVkaW9NZXRhZGF0YSgpIHsKLSAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLQotICAgICAgICBieXRlW10gYWxidW0gPSBtUmV0cmlldmVyLmdldEVtYmVkZGVkUGljdHVyZSgpOwotICAgICAgICBpZiAoYWxidW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGFsYnVtLCAwLCBhbGJ1bS5sZW5ndGgpOwotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShiaXRtYXApOwotCi0gICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggdmlzdWFsaXplcgotICAgICAgICAgICAgUGFsZXR0ZS5nZW5lcmF0ZUFzeW5jKGJpdG1hcCwgbmV3IFBhbGV0dGUuUGFsZXR0ZUFzeW5jTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW5lcmF0ZWQoUGFsZXR0ZSBwYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBkb21pbmFudCBjb2xvciBmb3IgZGVmYXVsdCBhbGJ1bSBpbWFnZS4KLSAgICAgICAgICAgICAgICAgICAgbURvbWluYW50Q29sb3IgPSBwYWxldHRlLmdldERvbWluYW50Q29sb3IoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXVzaWNWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NdXNpY1ZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1Eb21pbmFudENvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19kZWZhdWx0X2FsYnVtX2ltYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1RJVExFKTsKLSAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXNpY1RpdGxlVGV4dCA9IHRpdGxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFydGlzdCA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgIGlmIChhcnRpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IGFydGlzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NdXNpY0FydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VuZCB0aXRsZSBhbmQgYXJ0aXN0IHN0cmluZyB0byBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCwgbU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICAvLyBEaXNwbGF5IEVtYmVkZGVkIG1vZGUgYXMgZGVmYXVsdAotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtU3VyZmFjZVZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtVGV4dHVyZVZpZXcpOwotICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZXRyaWV2ZU9yaWVudGF0aW9uKCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBpbnQgd2lkdGggPSBkbS53aWR0aFBpeGVsczsKLSAgICAgICAgaW50IGhlaWdodCA9IGRtLmhlaWdodFBpeGVsczsKLQotICAgICAgICByZXR1cm4gKGhlaWdodCA+IHdpZHRoKSA/Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCA6Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVNdXNpY1ZpZXcoaW50IGxheW91dElkKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1NdXNpY1ZpZXcpOwotCi0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgdi5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotCi0gICAgICAgIEltYWdlVmlldyBhbGJ1bVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFsYnVtKTsKLSAgICAgICAgaWYgKGFsYnVtVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbGJ1bVZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTXVzaWNBbGJ1bURyYXdhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IHRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOwotICAgICAgICBpZiAodGl0bGVWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpdGxlVmlldy5zZXRUZXh0KG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXh0VmlldyBhcnRpc3RWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hcnRpc3QpOwotICAgICAgICBpZiAoYXJ0aXN0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhcnRpc3RWaWV3LnNldFRleHQobU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXVzaWNWaWV3ID0gdjsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU11c2ljVmlldywgMCk7Ci0gICAgfQotCi0gICAgT25TdWJ0aXRsZURhdGFMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlRGF0YShNZWRpYVBsYXllcjIgbXAsIFN1YnRpdGxlRGF0YSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdWJ0aXRsZURhdGEoKTogZ2V0VHJhY2tJbmRleDogIiArIGRhdGEuZ2V0VHJhY2tJbmRleCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2V0Q3VycmVudFBvc2l0aW9uOiAiICsgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRTdGFydFRpbWVVcygpOiAiICsgZGF0YS5nZXRTdGFydFRpbWVVcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGlmZjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhLmdldFN0YXJ0VGltZVVzKCkvMTAwMCAtIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtcywgZ2V0RHVyYXRpb25VcygpOiAiICsgZGF0YS5nZXREdXJhdGlvblVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGRhdGEuZ2V0VHJhY2tJbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZWxlY3RlZCB0cmFjayBpbmRleDogIiArIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+IHAgOiBtU3VidGl0bGVUcmFja0luZGljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmZpcnN0ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHAuc2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLm9uRGF0YShkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIG1NZWRpYVBsYXllcjJDYWxsYmFjayA9Ci0gICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZpZGVvU2l6ZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IHNpemU6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSBtcC5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IG1WaWRlb1NpemU6IiArIG1WaWRlb1dpZHRoICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvV2lkdGggIT0gMCAmJiBtVmlkZW9IZWlnaHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aW1lZCB0ZXh0IHJlbGF0ZWQgY29kZSBsYXRlciBvbmNlIHJlbGV2YW50IFJlbmRlcmVyIGlzIGRlZmluZWQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVkVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBUaW1lZFRleHQgdGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGltZWRUZXh0OiAiICsgdGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QcmVwYXJlZChtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29tcGxldGlvbihtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25CdWZmZXJpbmdVcGRhdGUobXAsIGRzZCwgZXh0cmEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgZnJhbWV3b3JrRXJyLCBpbnQgaW1wbEVycikgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiAiICsgZnJhbWV3b3JrRXJyICsgIiwiICsgaW1wbEVycik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTyAmJiBzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgc2V0IHBsYXliYWNrIHN0YXRlIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc2VuZCBUcmFja0luZm9zIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBNZWRpYVNlc3Npb24gd2hlbiBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBtU2Vla1doZW5QcmVwYXJlZCBtYXkgYmUgY2hhbmdlZCBhZnRlciBzZWVrVG8oKSBjYWxsCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vla1RvUG9zaXRpb24gPSBtU2Vla1doZW5QcmVwYXJlZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtUb1Bvc2l0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zZWVrVG8oc2Vla1RvUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggIT0gMCAmJiB2aWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSBtVmlkZW9XaWR0aCB8fCB2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT25QcmVwYXJlZExpc3RlbmVyKCkgOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZGVvIHNpemU6ICIgKyB2aWRlb1dpZHRoICsgIi8iICsgdmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBtSW5zdGFuY2UuZ2V0V2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIHZpZGVvIHNpemUgeWV0LCBidXQgc2hvdWxkIHN0YXJ0IGFueXdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2aWRlbyBzaXplIG1pZ2h0IGJlIHJlcG9ydGVkIHRvIHVzIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgcGVyY2VudCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50OwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZUluZGV4ID0gYXJncy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVFJBQ0tfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KHN1YnRpdGxlSW5kZXgpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZVRyYWNrSW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHN1YnRpdGxlVHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfRlVMTFNDUkVFTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIub25GdWxsU2NyZWVuUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ2V0Qm9vbGVhbihNZWRpYUNvbnRyb2xWaWV3MkltcGwuQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb0luZGV4ID0gYXJncy5nZXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9JbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvVHJhY2tJbmRleCA9IG1BdWRpb1RyYWNrSW5kaWNlcy5nZXQoYXVkaW9JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gYXVkaW9UcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2VsZWN0VHJhY2sobVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IGFyZ3MuZ2V0RmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfUExBWUJBQ0tfU1BFRUQsIElOVkFMSURfU1BFRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkICE9IElOVkFMSURfU1BFRUQgJiYgc3BlZWQgIT0gbVNwZWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFNwZWVkKHNwZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX01VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTGV2ZWwgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfVU5NVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgbVZvbHVtZUxldmVsLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLmZpcnN0LmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLnNlY29uZC5vbkN1c3RvbUFjdGlvbihhY3Rpb24sIGV4dHJhcykpOwotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSAmJiAobUN1cnJlbnRWaWV3Lmhhc0F2YWlsYWJsZVN1cmZhY2UoKSB8fCBtSXNNdXNpY01lZGlhVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBsYXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBseVNwZWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QYXVzZSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TZWVrVG8ocG9zKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKHBvcywgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gcG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uU3RvcCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGQ0N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbnRlcmZhY2UgVmlkZW9WaWV3SW50ZXJmYWNlIHsKLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIHRoZSB2aWV3J3Mgc3VyZmFjZSB0byB0aGUgZ2l2ZW4gTWVkaWFQbGF5ZXIyIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1wIE1lZGlhUGxheWVyMgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBzdWNjZXNzZnVsbHkgYXNzaWduZWQsIGZhbHNlIGlmIG5vdC4gSXQgd2lsbCBmYWlsIHRvIGFzc2lnbgotICAgICAqICAgICAgICAgaWYgYW55IG9mIE1lZGlhUGxheWVyMiBvciBzdXJmYWNlIGlzIHVuYXZhaWxhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKTsKLSAgICB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCk7Ci0gICAgaW50IGdldFZpZXdUeXBlKCk7Ci0gICAgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotCi0gICAgLyoqCi0gICAgICogVGFrZXMgb3ZlciBvbGRWaWV3LiBJdCBtZWFucyB0aGF0IHRoZSBNZWRpYVBsYXllcjIgd2lsbCBzdGFydCByZW5kZXJpbmcgb24gdGhpcyB2aWV3LgotICAgICAqIFRoZSB2aXNpYmlsaXR5IG9mIG9sZFZpZXcgd2lsbCBiZSBzZXQgYXMge0BsaW5rIFZpZXcuR09ORX0uIElmIHRoZSB2aWV3IGRvZXNuJ3QgaGF2ZSBhCi0gICAgICogTWVkaWFQbGF5ZXIyIGluc3RhbmNlIG9yIGl0cyBzdXJmYWNlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzIGRlZmVycmVkIHVudGlsCi0gICAgICogYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgaXMgc2V0IGJ5IHtAbGluayAjc2V0TWVkaWFQbGF5ZXJ9IG9yIGl0cyBzdXJmYWNlIGJlY29tZXMgYXZhaWxhYmxlLgotICAgICAqIHtAbGluayBTdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzCi0gICAgICogZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbGRWaWV3IFRoZSB2aWV3IHRoYXQgTWVkaWFQbGF5ZXIyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcgb24uCi0gICAgICovCi0gICAgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHZpZXcncyBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpbnN0YW5jZSBvZiBWaWRlb1ZpZXdJbnRlcmZhY2UgY2FsbHMgdGhlc2Ugc3VyZmFjZSBub3RpZmljYXRpb24gbWV0aG9kcyBhY2NvcmRpbmdseSBpZgotICAgICAqIGEgbGlzdGVuZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCB2aWEge0BsaW5rICNzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyKX0uCi0gICAgICovCi0gICAgaW50ZXJmYWNlIFN1cmZhY2VMaXN0ZW5lciB7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldyk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDY4MjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cEltcGwgaW1wbGVtZW50cyBWaWV3R3JvdXBQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKLQotICAgIHB1YmxpYyBWaWV3R3JvdXBJbXBsKFZpZXdHcm91cCBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVHJhY2tiYWxsRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlX2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRmluaXNoSW5mbGF0ZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTGF5b3V0X2ltcGwoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoaW50IG1lYXN1cmVkV2lkdGgsIGludCBtZWFzdXJlZEhlaWdodCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5jaGVja0xheW91dFBhcmFtc19pbXBsKHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5zaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKFZpZXcgY2hpbGQsCi0gICAgICAgIGludCBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCBpbnQgd2lkdGhVc2VkLCBpbnQgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGludCBoZWlnaHRVc2VkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoY2hpbGQsCi0gICAgICAgICAgICAgICAgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgd2lkdGhVc2VkLCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaGVpZ2h0VXNlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkZmQyYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKLSAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCi0gICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBqdW5pdAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHNUZXN0Ci0KLUxPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IgOj0gTWVkaWFDb21wb25lbnRzCi0KLUxPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCi0KLUxPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NTI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudGVzdHMiPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIEFQSSBUZXN0Ij4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDwhLS0KLSAgICBUbyBydW4gdGhlIHRlc3RzIHVzZSB0aGUgY29tbWFuZDoKLSAgICAiYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQubWVkaWEudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIHRlc3QiIC8+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMDg0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIFRlc3RzIHtAbGluayBTZXNzaW9uUGxheWxpc3RBZ2VudH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9USU1FX01TID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SRVBFQVRfTU9ERSA9IC0xMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0hVRkZMRV9NT0RFID0gLTEwMDsKLQotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIEV4ZWN1dG9yIG1IYW5kbGVyRXhlY3V0b3I7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbUFnZW50OwotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRGF0YVNvdXJjZUhlbHBlcjsKLSAgICBwcml2YXRlIE15UGxheWxpc3RFdmVudENhbGxiYWNrIG1FdmVudENhbGxiYWNrOwotCi0gICAgcHVibGljIGNsYXNzIE15UGxheWxpc3RFdmVudENhbGxiYWNrIGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdENoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkOwotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jazsKLQotICAgICAgICBwdWJsaWMgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soT2JqZWN0IHdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtV2FpdExvY2sgPSB3YWl0TG9jazsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNeURhdGFTb3VyY2VIZWxwZXIgaW1wbGVtZW50cyBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBvbkRhdGFTb3VyY2VNaXNzaW5nKE1lZGlhU2Vzc2lvbjIgc2Vzc2lvbiwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRNZWRpYUlkKCkuY29udGFpbnMoIldJVEhPVVRfRFNEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGdldENvbnRleHQoKSwgVXJpLnBhcnNlKCJkc2Q6Ly90ZXN0IikpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKGl0ZW0uZ2V0TWVkaWFJZCgpKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNb2NrUGxheWVyIGV4dGVuZHMgTWVkaWFQbGF5ZXJCYXNlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUbyhsb25nIHBvcykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEJ1ZmZlcmluZ1N0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlcyhMaXN0PERhdGFTb3VyY2VEZXNjPiBkc2RzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIGdldEN1cnJlbnREYXRhU291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbG9vcEN1cnJlbnQoYm9vbGVhbiBsb29wKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tTcGVlZChmbG9hdCBzcGVlZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWVyVm9sdW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKEV4ZWN1dG9yIGUsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV4bWFrZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleG1ha2VyL2lzc3Vlcy9kZXRhaWw/aWQ9MgotICAgICAgICAvLyBEZXhtYWtlciBpcyB1c2VkIGJ5IG1vY2tpdG8uCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZGV4bWFrZXIuZGV4Y2FjaGUiLCBtQ29udGV4dC5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlNlc3Npb25QbGF5bGlzdEFnZW50Iik7Ci0gICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IChydW5uYWJsZSkgLT4gewotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChydW5uYWJsZSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVBsYXllciA9IG1vY2soTW9ja1BsYXllci5jbGFzcyk7Ci0gICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4gewotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IChQbGF5ZXJFdmVudENhbGxiYWNrKSBhcmdzWzFdOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0pLndoZW4obVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gbW9jayhNZWRpYVNlc3Npb24ySW1wbC5jbGFzcyk7Ci0gICAgICAgIG1EYXRhU291cmNlSGVscGVyID0gbmV3IE15RGF0YVNvdXJjZUhlbHBlcigpOwotICAgICAgICBtQWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQobVNlc3Npb25JbXBsLCBtUGxheWVyKTsKLSAgICAgICAgbUFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIobURhdGFTb3VyY2VIZWxwZXIpOwotICAgICAgICBtRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhtV2FpdExvY2spOwotICAgICAgICBtQWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUhhbmRsZXJFeGVjdXRvciwgbUV2ZW50Q2FsbGJhY2spOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRTaHVmbGxlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgc2h1ZmZsZU1vZGUgPSBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShJTlZBTElEX1NIVUZGTEVfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0UmVwZWF0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgcmVwZWF0TW9kZSA9IG1BZ2VudC5nZXRSZXBlYXRNb2RlKCk7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKElOVkFMSURfUkVQRUFUX01PREUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDEwOwotICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdCgxMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSwgbUFnZW50LmdldFBsYXlsaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNraXBJdGVtcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QbGF5bGlzdEl0ZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0ocGxheWxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dEl0ZW0KLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IDA7IGN1clBsYXlQb3MgPCBsaXN0U2l6ZSAtIDE7ICsrY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyArIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMTsgY3VyUGxheVBvcyA+IDA7IC0tY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cyB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dCB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxLCBuZXh0UGxheVBvcyA9IDAKLSAgICAgICAgLy8gVGVzdCBuZXh0IHBsYXkgcG9zIGFmdGVyIHNldHRpbmcgcmVwZWF0IG1vZGUgbm9uZS4KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gNTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBUZXN0IGFkZCBpdGVtOiBbMCAoY3VyKSwgMSwgMiwgMywgNF0gLT4gWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbV81ID0gZ2VuZXJhdGVNZWRpYUl0ZW0oNSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIC8vIE1vdmUgY3VycmVudDogWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdIC0+IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XQotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XSAtPiBbMCwgMSwgMiAoY3VyKSwgMywgNF0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgaXRlbTogWzAsIDEsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIHByZXZpb3VzSXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgbmV4dCBpdGVtOiBbMCwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgbmV4dEl0ZW0gPSBwbGF5bGlzdC5nZXQoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobmV4dEl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgaXRlbTogWzAsIDIgKGN1ciksIDRdIC0+IFswLCAyIChjdXIpLCA1XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBNb3ZlIGxhc3QgYW5kIHJlbW92ZSB0aGUgbGFzdCBpdGVtOiBbMCwgMiAoY3VyKSwgNV0gLT4gWzAsIDIsIDUgKGN1cildIC0+IFswLCAyIChjdXIpXQotICAgICAgICBNZWRpYUl0ZW0yIGxhc3RJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShsYXN0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCBpdGVtcwotICAgICAgICBmb3IgKGludCBpID0gcGxheWxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RXaXRoSW52YWxpZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBBZGQgaXRlbTogWzAgKGN1ciksIDFdIC0+IFswIChjdXIpLCAzIChub19kc2QpLCAxXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMiA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcCB0byBuZXh0IGl0ZW06ICBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzAsIDIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIHByZXZpb3VzIGl0ZW06IFswLCAyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFsyIChub19kc2QpLCAxIChjdXIpXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzIgKG5vX2RzZCldCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gQWRkIGludmFsaWQgaXRlbTogWzIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMCA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDApOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgdmFsaWQgaXRlbTogWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAxLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMSA9IGdlbmVyYXRlTWVkaWFJdGVtKDEpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIHZhbGlkIGl0ZW0gd2l0aCBhbiBpbnZhbGlkIGl0ZW06Ci0gICAgICAgIC8vIFswIChub19kc2QpLCAxIChjdXIpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMyAobm9fZHNkKSwgMiAobm9fZHNkKV0KLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTMgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygzKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnNldCgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0zKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdEFmdGVyT25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgdmVyaWZ5KG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOwotCi0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGludCBsaXN0U2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQoZ2VuZXJhdGVNZWRpYUl0ZW0oaSkpOwotICAgICAgICB9Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UGxheWxpc3QoaXRlbXMsIG51bGwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGxheWxpc3RFcXVhbHMoTGlzdDxNZWRpYUl0ZW0yPiBleHBlY3RlZCwgTGlzdDxNZWRpYUl0ZW0yPiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaXplKCksIGFjdHVhbC5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkLmdldChpKS5lcXVhbHMoYWN0dWFsLmdldChpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF9XSVRIT1VUX0RTRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbShpbnQga2V5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfIiArIGtleSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9PV05FUlMgYi9wYWNrYWdlcy9PV05FUlMKaW5kZXggYmJjNGNlZi4uM2I5ZmQyYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvT1dORVJTCisrKyBiL3BhY2thZ2VzL09XTkVSUwpAQCAtMSw2ICsxLDkgQEAKIGFrZXJzdGVuQGdvb2dsZS5jb20KIGR3a2FuZ0Bnb29nbGUuY29tCitoZG1vb25AZ29vZ2xlLmNvbQoraW5zdW5AZ29vZ2xlLmNvbQogamFld2FuQGdvb2dsZS5jb20KK2ppbnBhcmtAZ29vZ2xlLmNvbQogbWFyY29uZUBnb29nbGUuY29tCiBzdW5nc29vQGdvb2dsZS5jb20KIHdqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA3NDE5ZTY0Li5jMGFhNDc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMiwyNCArMiw2IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwCi0KLSMgRklYTUUgTW92ZSB0aGlzIGxpYnJhcnkgdG8gZnJhbWV3b3Jrcy9uYXRpdmUKLUxPQ0FMX01PRFVMRSA6PSBsaWJzZXJ2aWNldXRpbGl0eQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmJpbmRlcgotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKICAgICBBdWRpb0ZsaW5nZXIuY3BwICAgICAgICAgICAgXAogICAgIFRocmVhZHMuY3BwICAgICAgICAgICAgICAgICBcCkBAIC0zMSw3ICsxMyw4IEBACiAgICAgUGF0Y2hQYW5lbC5jcHAgICAgICAgICAgICAgIFwKICAgICBTdGF0ZVF1ZXVlLmNwcCAgICAgICAgICAgICAgXAogICAgIEJ1ZkxvZy5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgVHlwZWRMb2dnZXIuY3BwCisgICAgVHlwZWRMb2dnZXIuY3BwICAgICAgICAgICAgIFwKKyAgICBOQkFJT19UZWUuY3BwICAgICAgICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKQEAgLTUzLDEzICszNiwxMyBAQAogICAgIGxpYm5iYWlvIFwKICAgICBsaWJuYmxvZyBcCiAgICAgbGlicG93ZXJtYW5hZ2VyIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGlibWVkaWF1dGlscyBcCiAgICAgbGlibWVtdW5yZWFjaGFibGUgXAogICAgIGxpYm1lZGlhX2hlbHBlcgogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjcHVzdGF0cyBcCisgICAgbGlic25kZmlsZSBcCiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKQEAgLTgyLDYgKzY1LDcgQEAKIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9TQU5JVElaRSA6PSBpbnRlZ2VyX292ZXJmbG93CiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBiZGQzOWM2Li4yNmY3NmMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KQEAgLTQ3LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAKQEAgLTU2LDcgKzU2LDYgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTY0LDggKzYzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKIC8vI2RlZmluZSBCVUZMT0dfTkRFQlVHIDAKQEAgLTEwMCwxNyArOTksNiBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZTsKIAotCi0jaWZkZWYgVEVFX1NJTksKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua0lucHV0RW5hYmxlZCA9IGZhbHNlOwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IGZhbHNlOwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rVHJhY2tFbmFibGVkID0gZmFsc2U7Ci0KLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRGcmFtZXMgPSBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdDsKLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rT3V0cHV0RnJhbWVzID0ga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0ZyYW1lcyA9IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0OwotI2VuZGlmCi0KIC8vIEluIG9yZGVyIHRvIGF2b2lkIGludmFsaWRhdGluZyBvZmZsb2FkZWQgdHJhY2tzIGVhY2ggdGltZSBhIFZpc3VhbGl6ZXIgaXMgdHVybmVkIG9uIGFuZCBvZmYKIC8vIHdlIGRlZmluZSBhIG1pbmltdW0gdGltZSBkdXJpbmcgd2hpY2ggYSBnbG9iYWwgZWZmZWN0IGlzIGNvbnNpZGVyZWQgZW5hYmxlZC4KIHN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5HbG9iYWxFZmZlY3RFbmFibGV0aW1lTnMgPSBzZWNvbmRzKDcyMDApOwpAQCAtMTYwLDYgKzE0OCw3IEBACiAgICAgICBtVG90YWxNZW1vcnkoMCksCiAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUoa01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVBhdGNoUGFuZWwodGhpcyksCiAgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CiAgICAgLy8gdW5zaWduZWQgaW5zdGVhZCBvZiBhdWRpb191bmlxdWVfaWRfdXNlX3QsIGJlY2F1c2UgKysgb3BlcmF0b3IgaXMgdW5hdmFpbGFibGUgZm9yIGVudW0KQEAgLTE2OCw3ICsxNTcsNiBAQAogICAgICAgICBtTmV4dFVuaXF1ZUlkc1t1c2VdID0gQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7CiAgICAgfQogCi0gICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNvbnN0IGJvb2wgZG9Mb2cgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgZmFsc2UpOwogICAgIGlmIChkb0xvZykgewogICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLApAQCAtMTg1LDI3ICsxNzMsNiBAQAogICAgIG1FZmZlY3RzRmFjdG9yeUhhbCA9IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKTsKIAogICAgIG1NZWRpYUxvZ05vdGlmaWVyLT5ydW4oIk1lZGlhTG9nTm90aWZpZXIiKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIjAiKTsKLSAgICBpbnQgZGVidWdnYWJsZSA9IGF0b2kodmFsdWUpOwotICAgIGludCB0ZWVFbmFibGVkID0gMDsKLSAgICBpZiAoZGVidWdnYWJsZSkgewotICAgICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJhZi50ZWUiLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgdGVlRW5hYmxlZCA9IGF0b2kodmFsdWUpOwotICAgIH0KLSAgICAvLyBGSVhNRSBzeW1ib2xpYyBjb25zdGFudHMgaGVyZQotICAgIGlmICh0ZWVFbmFibGVkICYgMSkgewotICAgICAgICBtVGVlU2lua0lucHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgMikgewotICAgICAgICBtVGVlU2lua091dHB1dEVuYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDQpIHsKLSAgICAgICAgbVRlZVNpbmtUcmFja0VuYWJsZWQgPSB0cnVlOwotICAgIH0KLSNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6b25GaXJzdFJlZigpCkBAIC0yMjYsOCArMTkzLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1QYXRjaFBhbmVsID0gbmV3IFBhdGNoUGFuZWwodGhpcyk7Ci0KICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOwogCiAgICAgZ0F1ZGlvRmxpbmdlciA9IHRoaXM7CkBAIC0zNDEsNyArMzA2LDcgQEAKICAgICAgICAgKnNlc3Npb25JZCA9IGFjdHVhbFNlc3Npb25JZDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGlvLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgfQpAQCAtNDc4LDcgKzQ0Myw3IEBACiAgICAgICAgICAgICBtSGFyZHdhcmVMb2NrLnVubG9jaygpOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CisgICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKICAgICAgICAgaWYgKCFsb2NrZWQpIHsKQEAgLTUzNCwxMiArNDk5LDIyIEBACiAgICAgICAgICAgICBkZXYtPmR1bXAoZmQpOwogICAgICAgICB9CiAKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAvLyBkdW1wIHRoZSBzZXJpYWxseSBzaGFyZWQgcmVjb3JkIHRlZSBzaW5rCi0gICAgICAgIGlmIChtUmVjb3JkVGVlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIGR1bXBUZWUoZmQsIG1SZWNvcmRUZWVTb3VyY2UsIEFVRElPX0lPX0hBTkRMRV9OT05FLCAnQycpOwotICAgICAgICB9Ci0jZW5kaWYKKyAgICAgICAgbVBhdGNoUGFuZWwuZHVtcChmZCk7CisKKyAgICAgICAgLy8gZHVtcCBleHRlcm5hbCBzZXRQYXJhbWV0ZXJzCisgICAgICAgIGF1dG8gZHVtcExvZ2dlciA9IFtmZF0oU2ltcGxlTG9nJiBsb2dnZXIsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzIHNldFBhcmFtZXRlcnM6XG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGxvZ2dlci5kdW1wKGZkLCAiICAgICIgLyogcHJlZml4ICovKTsKKyAgICAgICAgfTsKKyAgICAgICAgZHVtcExvZ2dlcihtUmVqZWN0ZWRTZXRQYXJhbWV0ZXJMb2csICJSZWplY3RlZCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1BcHBTZXRQYXJhbWV0ZXJMb2csICJBcHAiKTsKKyAgICAgICAgZHVtcExvZ2dlcihtU3lzdGVtU2V0UGFyYW1ldGVyTG9nLCAiU3lzdGVtIik7CisKKyAgICAgICAgLy8gZHVtcCBoaXN0b3JpY2FsIHRocmVhZHMgaW4gdGhlIGxhc3QgMTAgc2Vjb25kcworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB0aHJlYWRMb2cgPSBtVGhyZWFkTG9nLmR1bXBUb1N0cmluZygKKyAgICAgICAgICAgICAgICAiSGlzdG9yaWNhbCBUaHJlYWQgTG9nICIsIDAgLyogbGluZXMgKi8sCisgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpIC0gMTAgKiA2MCAqIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICB3cml0ZShmZCwgdGhyZWFkTG9nLmNfc3RyKCksIHRocmVhZExvZy5zaXplKCkpOwogCiAgICAgICAgIEJVRkxPR19SRVNFVDsKIApAQCAtNTQ3LDYgKzUyMiwxMCBAQAogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIE5CQUlPX1RlZSBkdW1wIGlzIHNhZmUgdG8gY2FsbCBvdXRzaWRlIG9mIEFGIGxvY2suCisgICAgICAgIE5CQUlPX1RlZTo6ZHVtcEFsbChmZCwgIl9EVU1QIik7CisjZW5kaWYKICAgICAgICAgLy8gYXBwZW5kIGEgY29weSBvZiBtZWRpYS5sb2cgaGVyZSBieSBmb3J3YXJkaW5nIGZkIHRvIGl0LCBidXQgZG9uJ3QgYXR0ZW1wdAogICAgICAgICAvLyB0byBsb29rdXAgdGhlIHNlcnZpY2UgaWYgaXQncyBub3QgcnVubmluZywgYXMgaXQgd2lsbCBibG9jayBmb3IgYSBzZWNvbmQKICAgICAgICAgaWYgKHNNZWRpYUxvZ1NlcnZpY2VBc0JpbmRlciAhPSAwKSB7CkBAIC02NjYsNyArNjQ1LDcgQEAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC03NjcsNiArNzQ2LDcgQEAKICAgICAgICAgb3V0cHV0LmFmRnJhbWVDb3VudCA9IHRocmVhZC0+ZnJhbWVDb3VudCgpOwogICAgICAgICBvdXRwdXQuYWZTYW1wbGVSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiAgICAgICAgIG91dHB1dC5hZkxhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOworICAgICAgICBvdXRwdXQucG9ydElkID0gcG9ydElkOwogCiAgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCiAgICAgICAgIC8vIGZvciBhIHRyYWNrIHRvIGJlIGNyZWF0ZWQKQEAgLTgxMyw3ICs3OTMsNyBAQAogCiBFeGl0OgogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIG91dHB1dC5vdXRwdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQub3V0cHV0SWQsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgfQogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKQEAgLTEwNzgsOSArMTA1OCw5IEBACiAgICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBpbnZhbGlkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCAmJiBjYWxsZXIgIT0gZ2V0cGlkX2NhY2hlZCkgewotICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgcGlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXIsIHN0cmVhbSk7CisgICAgY29uc3QgdWlkX3QgY2FsbGVyVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmICFpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsKKyAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIHVpZCAlZCBjYW5ub3QgdXNlIGludGVybmFsIHN0cmVhbSB0eXBlICVkIiwgY2FsbGVyVWlkLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCkBAIC0xMTgwLDYgKzExNjAsMjMgQEAKICAgICB9CiB9CiAKKy8vIGZvcndhcmRBdWRpb0h3U3luY1RvRG93bnN0cmVhbVBhdGNoZXNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6Zm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCkKK3sKKyAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgaWYgKG1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXModXBTdHJlYW0sICZzd1BhdGNoZXMpICE9IE9LKSByZXR1cm47CisgICAgQUxPR1ZfSUYoIXN3UGF0Y2hlcy5lbXB0eSgpLCAiJXMgZm91bmQgJXp1IGRvd25zdHJlYW0gcGF0Y2hlcyBmb3Igc3RyZWFtIElEICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzd1BhdGNoZXMuc2l6ZSgpLCB1cFN0cmVhbSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBzd1BhdGNoIDogc3dQYXRjaGVzKSB7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBkb3duU3RyZWFtID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHN3UGF0Y2guZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSk7CisgICAgICAgIGlmIChkb3duU3RyZWFtICE9IE5VTEwgJiYgKHVzZVRocmVhZCA9PSBudWxscHRyIHx8IHVzZVRocmVhZChkb3duU3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGRvd25TdHJlYW0tPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KIC8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQogLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgpAQCAtMTIwMCwyMyArMTE5NywzOSBAQAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwKICAgICB9OwogCi0gICAgLy8gbXVsdGl1c2VyIGZyaWVuZGx5IGFwcCBJRCBjaGVjayBmb3IgcmVxdWVzdHMgY29taW5nIGZyb20gYXVkaW9zZXJ2ZXIKLSAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoY2FsbGluZ1VpZCkgPT0gQUlEX0FVRElPU0VSVkVSKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgICAgICByZXR1cm47IC8vIG5vIG5lZWQgdG8gZmlsdGVyIGlmIGF1ZGlvc2VydmVyLgogICAgIH0KIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7CiAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICBBdWRpb1BhcmFtZXRlciByZWplY3RlZFBhcmFtOwogICAgIGZvciAoYXV0byYga2V5IDoga1Jlc2VydmVkUGFyYW1ldGVycykgewogICAgICAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IGZpbHRlcmluZyBrZXkgJXMgdmFsdWUgJXMgZnJvbSB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCksIGNhbGxpbmdVaWQpOworICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKICAgICAgICAgfQogICAgIH0KKyAgICBsb2dGaWx0ZXJlZFBhcmFtZXRlcnMocGFyYW0uc2l6ZSgpICsgcmVqZWN0ZWRQYXJhbS5zaXplKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkUGFyYW0uc2l6ZSgpLCByZWplY3RlZFBhcmFtLnRvU3RyaW5nKCksIGNhbGxpbmdVaWQpOwogICAgIGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6bG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKSB7CisgICAgYXV0byBwcmVmaXggPSBTdHJpbmc4Ojpmb3JtYXQoIlVJRCAlNWQiLCBjYWxsaW5nVWlkKTsKKyAgICBhdXRvIHN1ZmZpeCA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWNlaXZlZDogJXMiLCBvcmlnaW5hbEtWUFNpemUsIG9yaWdpbmFsS1ZQcy5jX3N0cigpKTsKKyAgICBpZiAocmVqZWN0ZWRLVlBTaXplICE9IDApIHsKKyAgICAgICAgYXV0byBlcnJvciA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWplY3RlZDogJXMiLCByZWplY3RlZEtWUFNpemUsIHJlamVjdGVkS1ZQcy5jX3N0cigpKTsKKyAgICAgICAgQUxPR1coIiVzOiAlcywgJXMsICVzIiwgX19mdW5jX18sIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgICAgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZy5sb2coIiVzLCAlcywgJXMiLCBwcmVmaXguY19zdHIoKSwgZXJyb3IuY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8mIGxvZ2dlciA9IChpc1NlcnZpY2VVaWQoY2FsbGluZ1VpZCkgPyBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nIDogbUFwcFNldFBhcmFtZXRlckxvZyk7CisgICAgICAgIGxvZ2dlci5sb2coIiVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoKTogaW8gJWQsIGtleXZhbHVlICVzLCBjYWxsaW5nIHBpZCAlZCBjYWxsaW5nIHVpZCAlZCIsCkBAIC0xMjk2LDcgKzEzMDksOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CkBAIC0xNjM2LDcgKzE2NTEsNyBAQAogICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTE3NTEsNiArMTc2Niw3IEBACiAKICAgICBvdXRwdXQuY2JsayA9IHJlY29yZFRyYWNrLT5nZXRDYmxrKCk7CiAgICAgb3V0cHV0LmJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOworICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CiAKICAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOwpAQCAtMTg1NCw2ICsxODcwLDEwIEBACiAKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CisgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwKSB7CisgICAgICAgIC8vIEFuIE1TRCBtb2R1bGUgaXMgaW5zZXJ0ZWQgYmVmb3JlIGhhcmR3YXJlIG1vZHVsZXMgaW4gb3JkZXIgdG8gbWl4IGVuY29kZWQgc3RyZWFtcy4KKyAgICAgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxBdWRpb0h3RGV2aWNlOjpGbGFncz4oZmxhZ3MgfCBBdWRpb0h3RGV2aWNlOjpBSFdEX0lTX0lOU0VSVCk7CisgICAgfQogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpIG5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX01PRFVMRSk7CiAgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKGhhbmRsZSwgbmFtZSwgZGV2LCBmbGFncykpOwpAQCAtMTg4NSw3ICsxOTA1LDcgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICh1aWQgIT0gQUlEX1NZU1RFTSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTkzMCw2ICsxOTUwLDI4IEBACiAgICAgcmV0dXJuIG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoX19mdW5jX18pOworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Cit9CisKIGF1ZGlvX2h3X3N5bmNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xOTc1LDcgKzIwMTcsMTAgQEAKICAgICAgICAgaWYgKHNlc3Npb25zICYgVGhyZWFkQmFzZTo6VFJBQ0tfU0VTU0lPTikgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUh3QXZTeW5jKSwgdmFsdWUpOwotICAgICAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDIxLDcgKzIwNjYsMTAgQEAKICAgICAgICAgQUxPR1YoInNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sIGZvdW5kIElEICVkIGZvciBzZXNzaW9uICVkIiwgc3luY0lkLCBzZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHN5bmNJZCk7Ci0gICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKKyAgICAgICAgdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpIHsgcmV0dXJuIHRocmVhZC0+dXNlc0h3QXZTeW5jKCk7IH0pOwogICAgIH0KIH0KIApAQCAtMjExMSw2ICsyMTU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbU9wZW5lZChvdXRId0RldiwgKm91dHB1dCk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgICAgICB9CiAgICAgfQpAQCAtMjIwOSw2ICsyMjU4LDggQEAKICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkICE9IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKIAorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wocGxheWJhY2tUaHJlYWQpOworCiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUikgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKQEAgLTIyNDAsMTIgKzIyOTEsMTQgQEAKICAgICAgICAgICAgIGlmIChtbWFwVGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wobW1hcFRocmVhZCk7CiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShvdXRwdXQpOwogICAgICAgICAgICAgQUxPR0QoImNsb3NpbmcgbW1hcFRocmVhZCAlcCIsIG1tYXBUaHJlYWQuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7CiAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfQ0xPU0VELCBpb0Rlc2MpOworICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1DbG9zZWQob3V0cHV0KTsKICAgICB9CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKICAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KQEAgLTIyNzQsNyArMjMyNyw3IEBACiAgICAgZGVsZXRlIG91dDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVBsYXliYWNrVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKICAgICB0aHJlYWQtPmV4aXQoKTsKQEAgLTIzNTAsNiArMjQwMyw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8vIFNvbWUgZmxhZ3MgYXJlIHNwZWNpZmljIHRvIGZyYW1ld29yayBhbmQgbXVzdCBub3QgbGVhayB0byB0aGUgSEFMLgorICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MgJiB+QVVESU9fSU5QVVRfRlJBTUVXT1JLX0ZMQUdTKTsKKwogICAgIC8vIEF1ZGlvIFBvbGljeSBjYW4gcmVxdWVzdCBhIHNwZWNpZmljIGhhbmRsZSBmb3IgaGFyZHdhcmUgaG90d29yZC4KICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIG5vdCB0byByZS1vcGVuIGFuIGFscmVhZHkgb3BlbmVkIGlucHV0LgogICAgIC8vIEl0IGlzIHRvIHVzZSBhIHByZS1hc3NpZ25lZCBJL08gaGFuZGxlLgpAQCAtMjQwNyw1NSArMjQ2Myw2IEBACiAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgICAgICB9IGVsc2UgewotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAvLyBUcnkgdG8gcmUtdXNlIG1vc3QgcmVjZW50bHkgdXNlZCBQaXBlIHRvIGFyY2hpdmUgYSBjb3B5IG9mIGlucHV0IGZvciBkdW1wc3lzLAotICAgICAgICAgICAgLy8gb3IgKHJlLSljcmVhdGUgaWYgY3VycmVudCBQaXBlIGlzIGlkbGUgYW5kIGRvZXMgbm90IG1hdGNoIHRoZSBuZXcgZm9ybWF0Ci0gICAgICAgICAgICBzcDxOQkFJT19TaW5rPiB0ZWVTaW5rOwotICAgICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAgICAgVEVFX1NJTktfTk8sICAgIC8vIGRvbid0IGNvcHkgaW5wdXQKLSAgICAgICAgICAgICAgICBURUVfU0lOS19ORVcsICAgLy8gY29weSBpbnB1dCB1c2luZyBhIG5ldyBwaXBlCi0gICAgICAgICAgICAgICAgVEVFX1NJTktfT0xELCAgIC8vIGNvcHkgaW5wdXQgdXNpbmcgYW4gZXhpc3RpbmcgcGlwZQotICAgICAgICAgICAgfSBraW5kOwotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MoaGFsY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSwgaGFsY29uZmlnLmZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoIW1UZWVTaW5rSW5wdXRFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmsgPT0gMCkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rLT5nZXRTdHJvbmdDb3VudCgpICE9IDEpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgbVJlY29yZFRlZVNpbmstPmZvcm1hdCgpKSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19PTEQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTkVXOiB7Ci0gICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rSW5wdXRGcmFtZXMsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKLSAgICAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICBtUmVjb3JkVGVlU291cmNlID0gcGlwZVJlYWRlcjsKLSAgICAgICAgICAgICAgICB0ZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRFRV9TSU5LX09MRDoKLSAgICAgICAgICAgICAgICB0ZWVTaW5rID0gbVJlY29yZFRlZVNpbms7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRFRV9TSU5LX05POgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCiAgICAgICAgICAgICAvLyBTdGFydCByZWNvcmQgdGhyZWFkCiAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQgcmVxdWlyZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZSBpbmRpY2F0aW9uIHRvIGZvcndhcmQgdG8gYXVkaW8KICAgICAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKQEAgLTI0NjUsOSArMjQ3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXREZXZpY2VfbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgbVJlY29yZFRocmVhZHMuYWRkKCppbnB1dCwgdGhyZWFkKTsKICAgICAgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgKmlucHV0LCB0aHJlYWQuZ2V0KCkpOwpAQCAtMjQ5Niw2ICsyNTAwLDggQEAKICAgICAgICAgaWYgKHJlY29yZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpICVkIiwgaW5wdXQpOwogCisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChyZWNvcmRUaHJlYWQpOworCiAgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGVmZmVjdCBjaGFpbnMsIGl0IG1lYW5zIHRoYXQgYSBjbGllbnQgc3RpbGwgaG9sZHMgYSBoYW5kbGUKICAgICAgICAgICAgIC8vIG9uIGF0IGxlYXN0IG9uZSBlZmZlY3QuIFdlIG11c3QgZWl0aGVyIG1vdmUgdGhlIGNoYWluIHRvIGFuIGV4aXN0aW5nIHRocmVhZCB3aXRoIHRoZQogICAgICAgICAgICAgLy8gc2FtZSBzZXNzaW9uIElEIG9yIHB1dCBpdCBhc2lkZSBpbiBjYXNlIGEgbmV3IHJlY29yZCB0aHJlYWQgaXMgb3BlbmVkIGZvciBhCkBAIC0yNTM4LDYgKzI1NDQsNyBAQAogICAgICAgICAgICAgaWYgKG1tYXBUaHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CkBAIC0yNTY3LDcgKzI1NzQsNyBAQAogICAgIGRlbGV0ZSBpbjsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQogewogICAgIG1SZWNvcmRUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOwogICAgIGNsb3NlSW5wdXRGaW5pc2godGhyZWFkKTsKQEAgLTI2MDUsNyArMjYxMiw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkLCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKLSAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiBpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsgLy8gY2hlY2sgbXVzdCBtYXRjaCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoKQogICAgICAgICBjYWxsZXIgPSBwaWQ7CiAgICAgfQogCkBAIC0yNjM5LDcgKzI2NDcsOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKLSAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiBpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsgLy8gY2hlY2sgbXVzdCBtYXRjaCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKQogICAgICAgICBjYWxsZXIgPSBwaWQ7CiAgICAgfQogICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CkBAIC0yNjU2LDkgKzI2NjUsMTAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIG1lZGlhc2VydmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBzZXNzaW9uIGJlaW5nIHJlbGVhc2VkIHdhcyBhY3F1aXJlZAorICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgYXVkaW9zZXJ2ZXIgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHNlc3Npb24gYmVpbmcgcmVsZWFzZWQgd2FzIGFjcXVpcmVkCiAgICAgLy8gb24gYmVoYWxmIG9mIGEgcHJvY2VzcyBub3QgaW4gbm90aWZpY2F0aW9uIGNsaWVudHMgYW5kIHdlIGlnbm9yZSB0aGUgd2FybmluZy4KLSAgICBBTE9HV19JRihjYWxsZXIgIT0gZ2V0cGlkX2NhY2hlZCwgInNlc3Npb24gaWQgJWQgbm90IGZvdW5kIGZvciBwaWQgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CisgICAgQUxPR1dfSUYoIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSwKKyAgICAgICAgICAgICJzZXNzaW9uIGlkICVkIG5vdCBmb3VuZCBmb3IgcGlkICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6aXNTZXNzaW9uQWNxdWlyZWRfbChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKQpAQCAtMjczMyw2ICsyNzQzLDE3IEBACiAgICAgcmV0dXJuOwogfQogCisvLyBkdW1wVG9UaHJlYWRMb2dfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCkKK3sKKyAgICBhdWRpb191dGlsczo6RmRUb1N0cmluZyBmZFRvU3RyaW5nOworICAgIGNvbnN0IGludCBmZCA9IGZkVG9TdHJpbmcuZmQoKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICB0aHJlYWQtPmR1bXAoZmQsIHt9IC8qIGFyZ3MgKi8pOworICAgICAgICBtVGhyZWFkTG9nLmxvZ3MoLTEgLyogdGltZSAqLywgZmRUb1N0cmluZy5nZXRTdHJpbmdBbmRDbG9zZSgpKTsKKyAgICB9Cit9CisKIC8vIGNoZWNrVGhyZWFkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlICpBdWRpb0ZsaW5nZXI6OmNoZWNrVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0CiB7CkBAIC0yOTM4LDE2ICsyOTU5LDc0IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3QKIHsKKyAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwVHlwZVV1aWQgPT0gTlVMTCB8fCBkZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihwVXVpZCwgZGVzY3JpcHRvcik7Ci0gICAgfSBlbHNlIHsKKworICAgIGlmICghbUVmZmVjdHNGYWN0b3J5SGFsLmdldCgpKSB7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KLX0KIAorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQocFV1aWQpKSB7CisgICAgICAgIC8vIElmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yIGZyb20gdGhhdC4KKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKKyAgICB9IGVsc2UgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVHlwZVV1aWQpKSB7CisgICAgICAgIC8vIElmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluc3RlYWQuCisKKyAgICAgICAgLy8gVXNlIGEgdGVtcG9yYXJ5IGRlc2NyaXB0b3IgdG8gYXZvaWQgbW9kaWZ5aW5nIHxkZXNjcmlwdG9yfCBpbiB0aGUgZmFpbHVyZSBjYXNlLgorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgIGRlc2MuZmxhZ3MgPSAwOyAvLyBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcKKworICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgcXVlcnlOdW1iZXJFZmZlY3RzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCkgZXJyb3IgJWQgZnJvbSBGYWN0b3J5SGFsIGdldERlc2NyaXB0b3IiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCBwVHlwZVV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKmRlc2NyaXB0b3IgPSBkZXNjOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmVmZXJyZWQgZmxhZyBvciB0aGlzIGRlc2NyaXB0b3IgbWF0Y2hlcyB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgc3VjY2VzcyEgSWYgdGhpcyBkZXNjcmlwdG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIHByZWZlcnJlZAorICAgICAgICAgICAgICAgIC8vIGZsYWcsIGNvbnRpbnVlIGVudW1lcmF0aW9uIGluIGNhc2UgYSBiZXR0ZXIgbWF0Y2hpbmcgdmVyc2lvbiBvZiB0aGlzCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlLiBOb3RlIHRoYXQgdGhpcyBtZWFucyBpZiBubyBlZmZlY3Qgd2l0aCBhCisgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBmbGFnIGlzIGZvdW5kLCB0aGUgZGVzY3JpcHRvciByZXR1cm5lZCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gbGFzdCBlZmZlY3QgdGhhdCBhdCBsZWFzdCBoYWQgYSBtYXRjaGluZyB0eXBlIHV1aWQgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFR5cGVGbGFnID09IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyB8fAorICAgICAgICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gcHJlZmVycmVkVHlwZUZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpOiBFZmZlY3Qgbm90IGZvdW5kIGJ5IHR5cGUuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVpdGhlciB1dWlkIG9yIHR5cGUgdXVpZCBtdXN0IGJlIG5vbi1udWxsIFVVSURzLiIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQogCiBzcDxJRWZmZWN0PiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUVmZmVjdCgKICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCkBAIC0yOTY2LDcgKzMwNDUsNyBAQAogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmIChwaWQgPT0gLTEgfHwgIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXX0lGKHBpZCAhPSAtMSAmJiBwaWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCkBAIC0yOTg5LDggKzMwNjgsOCBAQAogICAgIH0KIAogICAgIC8vIFNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgcmVzZXJ2ZWQgZm9yIG91dHB1dCBzdGFnZSBlZmZlY3RzCi0gICAgLy8gdGhhdCBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIChydW5uaW5nIGluIHNhbWUgcHJvY2VzcykKLSAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFICYmIGdldHBpZF9jYWNoZWQgIT0gcGlkKSB7CisgICAgLy8gdGhhdCBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSAmJiAhaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CkBAIC0zMDAxLDYwICszMDgwLDE1IEBACiAgICAgfQogCiAgICAgewotICAgICAgICBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKCZwRGVzYy0+dXVpZCkpIHsKLSAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJmRlc2MpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0R2V0RGVzY3JpcHRvciIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAvLyBvZiB0aGUgcmVxdWlyZWQgdHlwZSBpbiBlZmZlY3QgZmFjdG9yeQotICAgICAgICAgICAgaWYgKEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKCZwRGVzYy0+dHlwZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgbm8gZWZmZWN0IHR5cGUiKTsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkOwotICAgICAgICAgICAgZC5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgewotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoaSwgJmRlc2MpOwotICAgICAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeUVmZmVjdCIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCAmcERlc2MtPnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBtYXRjaGluZyB0eXBlIGZvdW5kIHNhdmUgZWZmZWN0IGRlc2NyaXB0b3IuIElmIHRoZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIDAgYW5kIHRoZSBlZmZlY3QgaXMgbm90IGF1eGlsaWFyeSwgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAvLyBhbiBhdXhpbGlhcnkgdmVyc2lvbiBvZiB0aGlzIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGQgPSBkZXNjOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvciBzYW1lIGVmZmVjdCB0eXBlLCBjaG9zZSBhdXhpbGlhcnkgdmVyc2lvbiBvdmVyIGluc2VydCB2ZXJzaW9uIGlmCi0gICAgICAgICAgICAvLyBjb25uZWN0IHRvIG91dHB1dCBtaXggKENvbXBsaWFuY2UgdG8gT3BlblNMIEVTKQotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKLSAgICAgICAgICAgICAgICAgICAgKGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IGQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIEdldCB0aGUgZnVsbCBlZmZlY3QgZGVzY3JpcHRvciBmcm9tIHRoZSB1dWlkL3R5cGUuCisgICAgICAgIC8vIElmIHRoZSBzZXNzaW9uIGlzIHRoZSBvdXRwdXQgbWl4LCBwcmVmZXIgYW4gYXV4aWxpYXJ5IGVmZmVjdCwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIG5vIHByZWZlcmVuY2UuCisgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGUgPSAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgOiBFRkZFQ1RfRkxBR19UWVBFX01BU0spOworICAgICAgICBsU3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZwRGVzYy0+dHlwZSwgcHJlZmVycmVkVHlwZSwgJmRlc2MpOworICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIGdldEVmZmVjdERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0cyBvbiBhIHNlc3Npb24gZGlmZmVyZW50IGZyb20gMCAob3V0cHV0IG1peCkKQEAgLTMzNzAsMTM2ICszNDA0LDYgQEAKIH0KIAogCi1zdHJ1Y3QgRW50cnkgewotI2RlZmluZSBURUVfTUFYX0ZJTEVOQU1FIDMyIC8vICVZJW0lZCVIJU0lU18lZC53YXYgPSA0KzIrMisyKzIrMisxKzErNCsxID0gMjEKLSAgICBjaGFyIG1GaWxlTmFtZVtURUVfTUFYX0ZJTEVOQU1FXTsKLX07Ci0KLWludCBjb21wYXJFbnRyeShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IEVudHJ5ICopIHAxKS0+bUZpbGVOYW1lLCAoKGNvbnN0IEVudHJ5ICopIHAyKS0+bUZpbGVOYW1lKTsKLX0KLQotI2lmZGVmIFRFRV9TSU5LCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KQotewotICAgIE5CQUlPX1NvdXJjZSAqdGVlU291cmNlID0gc291cmNlLmdldCgpOwotICAgIGlmICh0ZWVTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyAud2F2IHJvdGF0aW9uCi0gICAgICAgIC8vIFRoZXJlIGlzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIGlmIDIgdGhyZWFkcyBjYWxsIHRoaXMgc2ltdWx0YW5lb3VzbHkuCi0gICAgICAgIC8vIFRoZXkgd291bGQgYm90aCB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5LCBidXQgdGhlIHJlc3VsdCB3b3VsZCBzaW1wbHkgYmUKLSAgICAgICAgLy8gZmFpbHVyZXMgYXQgdW5saW5rKCkgd2hpY2ggYXJlIGlnbm9yZWQuICBJdCdzIGFsc28gdW5saWtlbHkgc2luY2UKLSAgICAgICAgLy8gbm9ybWFsbHkgZHVtcHN5cyBpcyBvbmx5IGRvbmUgYnkgYnVncmVwb3J0IG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgICAgY2hhciB0ZWVQYXRoW1BBVEhfTUFYXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKLSAgICAgICAgc2l6ZV90IHRlZVBhdGhMZW4gPSBzdHJsZW4odGVlUGF0aCk7Ci0gICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKLSAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwotICAgICAgICBpZiAoZGlyICE9IE5VTEwpIHsKLSNkZWZpbmUgVEVFX01BWF9TT1JUIDIwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIHNvcnQKLSNkZWZpbmUgVEVFX01BWF9LRUVQIDEwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAKLSAgICAgICAgICAgIHN0cnVjdCBFbnRyeSBlbnRyaWVzW1RFRV9NQVhfU09SVF07Ci0gICAgICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cnlDb3VudCA8IFRFRV9NQVhfU09SVCkgewotICAgICAgICAgICAgICAgIGVycm5vID0gMDsgLy8gY2xlYXIgZXJybm8gYmVmb3JlIHJlYWRkaXIoKSB0byB0cmFjayBwb3RlbnRpYWwgZXJyb3JzLgotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgInRlZSByZWFkZGlyKCkgZmFpbHVyZSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uIC53YXYgZmlsZSBlbnRyaWVzCi0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4ocmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuIDw9IDQgfHwgbmFtZUxlbiA+PSBURUVfTUFYX0ZJTEVOQU1FIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJnJlc3VsdC0+ZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCByZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKLSAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7Ci0gICAgICAgICAgICAgICAgcXNvcnQoZW50cmllcywgZW50cnlDb3VudCwgc2l6ZW9mKEVudHJ5KSwgY29tcGFyRW50cnkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDb3VudCAtIFRFRV9NQVhfS0VFUDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSgmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgZW50cmllc1tpXS5tRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAodm9pZCkgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byByb3RhdGUgdGVlcyBpbiAlLipzOiAlc1xuIiwgKGludCkgdGVlUGF0aExlbiwgdGVlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciB0ZWVUaW1lWzE2XTsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotICAgICAgICBzdHJ1Y3QgdG0gdG07Ci0gICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7Ci0gICAgICAgIHN0cmZ0aW1lKHRlZVRpbWUsIHNpemVvZih0ZWVUaW1lKSwgIiVZJW0lZCVIJU0lUyIsICZ0bSk7Ci0gICAgICAgIHNucHJpbnRmKCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBzaXplb2YodGVlUGF0aCkgLSB0ZWVQYXRoTGVuLCAiJXNfJWRfJWMud2F2IiwgdGVlVGltZSwgaWQsCi0gICAgICAgICAgICAgICAgc3VmZml4KTsKLSAgICAgICAgLy8gaWYgMiBkdW1wc3lzIGFyZSBkb25lIHdpdGhpbiAxIHNlY29uZCwgYW5kIHJvdGF0aW9uIGRpZG4ndCB3b3JrLCB0aGVuIGRpc2NhcmQgMm5kCi0gICAgICAgIGludCB0ZWVGZCA9IG9wZW4odGVlUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19OT0ZPTExPVywgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgICAgICBpZiAodGVlRmQgPj0gMCkgewotICAgICAgICAgICAgLy8gRklYTUUgdXNlIGxpYnNuZGZpbGUKLSAgICAgICAgICAgIGNoYXIgd2F2SGVhZGVyWzQ0XTsKLSAgICAgICAgICAgIG1lbWNweSh3YXZIZWFkZXIsCi0gICAgICAgICAgICAgICAgIlJJRkZcMFwwXDBcMFdBVkVmbXQgXDIwXDBcMFwwXDFcMFwyXDBcMTA0XDI1NFwwXDBcMFwwXDBcMFw0XDBcMjBcMGRhdGFcMFwwXDBcMCIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHRlZVNvdXJjZS0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMjJdID0gY2hhbm5lbENvdW50OyAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNF0gPSBzYW1wbGVSYXRlOyAgICAgICAgIC8vIHNhbXBsZSByYXRlCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjVdID0gc2FtcGxlUmF0ZSA+PiA4OwotICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGZyYW1lU2l6ZTsgICAgICAgICAgLy8gYmxvY2sgYWxpZ25tZW50Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzNdID0gZnJhbWVTaXplID4+IDg7Ci0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgd2F2SGVhZGVyLCBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICAgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOwotI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIHBlciBJL08gb3BlcmF0aW9uCi0gICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoVEVFX1NJTktfUkVBRCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gVEVFX1NJTktfUkVBRDsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbCA9IHRlZVNvdXJjZS0+cmVhZChidWZmZXIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBib29sIHdhc0ZpcnN0UmVhZCA9IGZpcnN0UmVhZDsKLSAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA9PSAoc3NpemVfdCkgT1ZFUlJVTiAmJiB3YXNGaXJzdFJlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhY3R1YWwgPD0gKHNzaXplX3QpY291bnQpOwotICAgICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCBidWZmZXIsIGFjdHVhbCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gYWN0dWFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBmcmFtZVNpemUgLSA4OwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNDAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBmcmFtZVNpemU7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBjbG9zZSh0ZWVGZCk7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCBjcmVhdGUgZmlsZSB3aXRoIHRlbXBvcmFyeSBuYW1lIGFuZCB0aGVuIHJlbmFtZSB0byBmaW5hbCBpZiBub24tZW1wdHkuCi0gICAgICAgICAgICBpZiAodG90YWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIGNyZWF0ZSB0ZWUgJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDk2M2E4N2QuLjZjNjk4ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC02Miw3ICs2NCwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL0xpbmVhck1hcC5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9GZFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU2ltcGxlTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvVGltZXN0YW1wVmVyaWZpZXIuaD4KIAogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCkBAIC03MSw2ICs3Niw3IEBACiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKICNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgogI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTIwMiw2ICsyMDgsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KApAQCAtMzU3LDE2ICszNjUsMTcgQEAKICAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgewogICAgICAgICBzd2l0Y2ggKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gRkNDXzI7IC8vIHN0ZXJlbyBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBIYXB0aWMgY2hhbm5lbCBtYXNrIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWF4Q2hhbm5lbENvdW50ID0ga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTIDogRkNDXzI7CisgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBtYXhDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgotICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfcG9zaXRpb25fbWFza19pc19vdXRfY2Fub25pY2FsKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYOgogICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CkBAIC00MTYsNiArNDI1LDExIEBACiAgICAgdm9pZCBkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgU2ltcGxlTG9nIG1UaHJlYWRMb2d7MTZ9OyAvLyAxNiBUaHJlYWQgaGlzdG9yeSBsaW1pdAorCisgICAgY2xhc3MgVGhyZWFkQmFzZTsKKyAgICB2b2lkIGR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpOworCiAgICAgLy8gLS0tIENsaWVudCAtLS0KICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgpAQCAtNTQwLDYgKzU1NCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwpAQCAtNjc1LDYgKzY5MCw5IEBACiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwogCiAgICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCA9IG51bGxwdHIpOwogCiAgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLApAQCAtNzkxLDQ0ICs4MDksMTkgQEAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCk7CiAgICAgdm9pZCAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woUGxheWJhY2tUaHJlYWQgKnRocmVhZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQotICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiBtUmVjb3JkVGVlU291cmNlOwotI2VuZGlmCisgICAgdm9pZCAgICAgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKTsKIAogcHVibGljOgotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyB0ZWUgc2luaywgaWYgZW5hYmxlZCBieSBwcm9wZXJ0eSwgYWxsb3dzIGR1bXBzeXMgdG8gd3JpdGUgbW9zdCByZWNlbnQgYXVkaW8gdG8gLndhdiBmaWxlCi0gICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KTsKLQotICAgIC8vIHdoZXRoZXIgdGVlIHNpbmsgaXMgZW5hYmxlZCBieSBwcm9wZXJ0eQotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rSW5wdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rT3V0cHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua1RyYWNrRW5hYmxlZDsKLQotICAgIC8vIHJ1bnRpbWUgY29uZmlndXJlZCBzaXplIG9mIGVhY2ggdGVlIHNpbmsgcGlwZSwgaW4gZnJhbWVzCi0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua0lucHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtPdXRwdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua1RyYWNrRnJhbWVzOwotCi0gICAgLy8gY29tcGlsZS10aW1lIGRlZmF1bHQgc2l6ZSBvZiB0ZWUgc2luayBwaXBlcywgaW4gZnJhbWVzCi0gICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSNlbmRpZgotCiAgICAgLy8gVGhlc2UgbWV0aG9kcyByZWFkIHZhcmlhYmxlcyBhdG9taWNhbGx5IHdpdGhvdXQgbUxvY2ssCiAgICAgLy8gdGhvdWdoIHRoZSB2YXJpYWJsZXMgYXJlIHVwZGF0ZWQgd2l0aCBtTG9jay4KICAgICBib29sICAgIGlzTG93UmFtRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTG93UmFtRGV2aWNlOyB9CkBAIC04NDMsMTAgKzgzNiwxNSBAQAogCiAgICAgbnNlY3NfdCBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZTsgIC8vIHdoZW4gYSBnbG9iYWwgZWZmZWN0IHdhcyBsYXN0IGVuYWJsZWQKIAotICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOworICAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFBhdGNoUGFuZWwgbVBhdGNoUGFuZWw7CiAgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1FZmZlY3RzRmFjdG9yeUhhbDsKIAotICAgIGJvb2wgICAgICAgIG1TeXN0ZW1SZWFkeTsKKyAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKworICAgIFNpbXBsZUxvZyAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbUFwcFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2c7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCmluZGV4IGViODI2YzYuLmQ0Mjk5YjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaApAQCAtMzUsNiArMzUsOSBAQAogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKKyAgICAgICAgLy8gTWVhbnMgdGhhdCB0aGlzIGlzbid0IGEgdGVybWluYWwgbW9kdWxlLCBhbmQgc29mdHdhcmUgcGF0Y2hlcworICAgICAgICAvLyBhcmUgdXNlZCB0byB0cmFuc3BvcnQgYXVkaW8gZGF0YSBmdXJ0aGVyLgorICAgICAgICBBSFdEX0lTX0lOU0VSVCAgICAgICAgICAgICAgPSAweDQsCiAgICAgfTsKIAogICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKQEAgLTU1LDYgKzU4LDEwIEBACiAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgfQogCisgICAgYm9vbCBpc0luc2VydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0lTX0lOU0VSVCkpOworICAgIH0KKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGIzZjVlZmQuLjZhYjYzNjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA5LDggKzMwOSw4IEBACiAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBlZmZlY3QgYnVmZmVycyB3aXRob3V0IGFuIGludGVybWVkaWFyeSBlZmZlY3QgcHJvY2Vzcy4KICAgICAvLyBUT0RPOiBjb25zaWRlciBpbXBsZW1lbnRpbmcgY2hhbm5lbCBjb252ZXJzaW9uLgogICAgIGNvbnN0IHNpemVfdCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCA9Ci0gICAgICAgICAgICBpbkNoYW5uZWxDb3VudCAhPSBvdXRDaGFubmVsQ291bnQgPyAwCi0gICAgICAgICAgICAgICAgICAgIDogb3V0Q2hhbm5lbENvdW50ICogc3RkOjptaW4oCisgICAgICAgICAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCA/IDAKKyAgICAgICAgICAgICAgICAgICAgOiBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICogc3RkOjptaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CiAgICAgY29uc3QgYXV0byBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCA9IFt0aGlzLCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudF0oKSB7CkBAIC00ODAsNyArNDgwLDEyIEBACiAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW5wdXQgb250byBvdXRwdXQKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUNoYWluLnByb21vdGUoKTsKICAgICAgICAgaWYgKGNoYWluLmdldCgpICE9IG51bGxwdHIgJiYgY2hhaW4tPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgewotICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKKyAgICAgICAgICAgIC8vIHNpbWlsYXIgaGFuZGxpbmcgd2l0aCBkYXRhX2J5cGFzcyBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgICBjb3B5SW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTg1OSw3ICsxODY0LDcgQEAKICAgICBib29sIGxvY2tlZCA9IG1DYmxrICE9IE5VTEwgJiYgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtQ2Jsay0+bG9jayk7CiAKICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJcdFx0XHQlNWQgICAgJTVkICAlM3MgICAgJTNzICAlNXUgICU1dVxuIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVByaW9yaXR5LAogICAgICAgICAgICAgbUhhc0NvbnRyb2wgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICBsb2NrZWQgPyAieWVzIiA6ICJubyIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAppbmRleCBkMDYzNzcyLi5kZDg0YmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KQEAgLTE2MSw3ICsxNjIsMjEgQEAKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CiAgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbUNvbW1hbmQ7Ci0gICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gY3VycmVudC0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBwYXRjaEJ1ZmZlcjsKKworICAgIGlmIChmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSAwKSB7CisgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSB+MDsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IGl0IGRvZXNuJ3QgY2F1c2UgYW55IGlzc3VlcyBpZiB3ZSBqdXN0IGdldCBhIHNtYWxsIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gYnVmZmVyIGZyb20gdGhlIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRCkgLyomJiBpc1dhcm0qLykgewogICAgICAgICBBTE9HX0FTU0VSVChtSW5wdXRTb3VyY2UgIT0gTlVMTCk7CkBAIC0xNzYsNiArMTkxLDcgQEAKICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQgPSBtVG90YWxOYXRpdmVGcmFtZXNSZWFkOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzUmVhZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRFcnJvcnMrKzsKICAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGUgPSAwOwpAQCAtMTkzLDExICsyMDksMTggQEAKICAgICAgICAgfQogICAgICAgICBpZiAobVJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKICAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1QaXBlU2luay0+d3JpdGUobVJlYWRCdWZmZXIsIG1SZWFkQnVmZmVyU3RhdGUpOwotICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgotICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCi0gICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCiAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBjdXJyZW50LT5tQ2JsazsKLSAgICAgICAgICAgIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgIGlmIChmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIGZhc3QgdHJhY2sgaXMgYSBwYXRjaCByZWNvcmQsIHVwZGF0ZSB0aGUgY2JsayBieQorICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgcmVsZWFzZUJ1ZmZlcigpLgorICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQocGF0Y2hCdWZmZXIucmF3LCBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlYWRCdWZmZXIsIG1Gb3JtYXQubUZvcm1hdCwgZnJhbWVzV3JpdHRlbiAqIG1Gb3JtYXQubUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayAhPSBOVUxMICYmIGZyYW1lc1dyaXR0ZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgorICAgICAgICAgICAgICAgIC8vICAgICAgIFRvIGhhbmRsZSBtdWx0aXBsZSBjbGllbnRzIHRoaXMgY291bGQgYmUgY29udmVydGVkIHRvIGFuIGFycmF5LAorICAgICAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShmcmFtZXNXcml0dGVuICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CiAgICAgICAgICAgICAgICAgY2Jsay0+bVNlcnZlciArPSBmcmFtZXNXcml0dGVuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKaW5kZXggOWJjYTJkNC4uZDI4NzIzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCkBAIC0zNyw2ICszOCwxMCBAQAogICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgY2FwdHVyZSBidWZmZXIKICAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOyAgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCiAKKyAgICBhdWRpb19mb3JtYXRfdCAgbUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IG51bGxwdHI7ICAgLy8gYSByZWZlcmVuY2UgdG8gYSBwYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIGluIGZhc3QgbW9kZQorCiAgICAgLy8gRXh0ZW5kcyBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQKICAgICBzdGF0aWMgY29uc3QgQ29tbWFuZAogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFsc28gcHJvY2VzcyBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFuZCBjYW4gYmUgIm9yImVkOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCA3OWJiOWZlLi5mMzI4NTc3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMzIsMTMgKzMyLDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAjZW5kaWYKLSNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlci5oPgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIlR5cGVkTG9nZ2VyLmgiCkBAIC00Nyw3ICs0OCw4IEBACiAKIC8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjpzSW5pdGlhbDsKIAotRmFzdE1peGVyOjpGYXN0TWl4ZXIoKSA6IEZhc3RUaHJlYWQoImN5Y2xlX21zIiwgImxvYWRfdXMiKSwKK0Zhc3RNaXhlcjo6RmFzdE1peGVyKGF1ZGlvX2lvX2hhbmRsZV90IHBhcmVudElvSGFuZGxlKQorICAgIDogRmFzdFRocmVhZCgiY3ljbGVfbXMiLCAibG9hZF91cyIpLAogICAgIC8vIG1GYXN0VHJhY2tOYW1lcwogICAgIC8vIG1HZW5lcmF0aW9ucwogICAgIG1PdXRwdXRTaW5rKE5VTEwpLApAQCAtNjYsOCArNjgsMTEgQEAKICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKDApLAogICAgIC8vIHRpbWVzdGFtcAogICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApLCAgIC8vIHRoZSA9IDAgaXMgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKLSAgICBtTWFzdGVyTW9ubyhmYWxzZSkKKyAgICBtTWFzdGVyTW9ubyhmYWxzZSksCisgICAgbVRocmVhZElvSGFuZGxlKHBhcmVudElvSGFuZGxlKQogeworICAgICh2b2lkKW1UaHJlYWRJb0hhbmRsZTsgLy8gcHJldmVudCB1bnVzZWQgd2FybmluZywgc2VlIEMrKzE3IFtbbWF5YmVfdW51c2VkXV0KKwogICAgIC8vIEZJWE1FIHBhc3Mgc0luaXRpYWwgYXMgcGFyYW1ldGVyIHRvIGJhc2UgY2xhc3MgY29uc3RydWN0b3IsIGFuZCBtYWtlIGl0IHN0YXRpYyBsb2NhbAogICAgIG1QcmV2aW91cyA9ICZzSW5pdGlhbDsKICAgICBtQ3VycmVudCA9ICZzSW5pdGlhbDsKQEAgLTE1NSwyMCArMTYwLDI0IEBACiAgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG1PdXRwdXRTaW5rR2VuKSB7CiAgICAgICAgIG1PdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7CiAgICAgICAgIG1PdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47CisgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBjdXJyZW50LT5tU2lua0NoYW5uZWxNYXNrOwogICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCkgewogICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShtRm9ybWF0KTsKICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNpbmtDaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKTsKIAotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQKLSAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IG1TaW5rQ2hhbm5lbENvdW50IC0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICAgICAgfQogICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtMTkxLDYgKzIwMCwxMCBAQAogICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KICAgICAgICAgICAgIG1NaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIC8vIEZJWE1FIFNlZSB0aGUgb3RoZXIgRklYTUUgYXQgRmFzdE1peGVyOjpzZXROQkxvZ1dyaXRlcigpCisgICAgICAgICAgICBOQkxvZzo6dGhyZWFkX3BhcmFtc190IHBhcmFtczsKKyAgICAgICAgICAgIHBhcmFtcy5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBMT0dfVEhSRUFEX1BBUkFNUyhwYXJhbXMpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbWl4ZXJGcmFtZVNpemUgKiBmcmFtZUNvdW50OwpAQCAtMjIwLDYgKzIzMywxMCBAQAogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7CiAgICAgICAgIG1GYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwogICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICBtVGVlLnNldChtRm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX09VVFBVVF9USFJFQUQpOworICAgICAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpICsgIl9GIik7CisjZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOwogICAgIH0KQEAgLTI3Niw2ICsyOTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpIQVBUSUNfRU5BQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpOwogICAgICAgICAgICAgICAgIG1NaXhlci0+ZW5hYmxlKG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKQEAgLTMxMiw2ICszMzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6SEFQVElDX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwpAQCAtMzI4LDEzICszNDksMjQgQEAKIHsKICAgICAvLyBUT0RPOiBwYXNzIGFuIElEIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGljaCB0aW1lIHNlcmllcyB3ZSB3YW50IHRvIHdyaXRlIHRvIGluIE5CTG9nLmNwcAogICAgIC8vIE9yOiBwYXNzIGJvdGggb2YgdGhlc2UgaW50byBhIHNpbmdsZSBjYWxsIHdpdGggYSBib29sZWFuCi0gICAgaWYgKG1Jc1dhcm0pIHsKLSAgICAgICAgTE9HX0hJU1RfVFMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKLSAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwogICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKKworICAgIGlmIChtSXNXYXJtKSB7CisgICAgICAgIC8vIExvZ2dpbmcgdGltZXN0YW1wcyBmb3IgRmFzdE1peGVyIGlzIGN1cnJlbnRseSBkaXNhYmxlZCB0byBtYWtlIG1lbW9yeSByb29tIGZvciBsb2dnaW5nCisgICAgICAgIC8vIG90aGVyIHN0YXRpc3RpY3MgaW4gRmFzdE1peGVyLgorICAgICAgICAvLyBUbyByZS1lbmFibGUsIGRlbGV0ZSB0aGUgI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUyBsaW5lcyAoYW5kIHRoZSAjZW5kaWYgbGluZXMpLgorI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUworICAgICAgICBMT0dfSElTVF9UUygpOworI2VuZGlmCisgICAgICAgIC8vQUxPR0QoIkVyaWMgRmFzdE1peGVyOjpvbldvcmsoKSBtSXNXYXJtIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHVtcFN0YXRlLT5tVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAvLyBTZWUgY29tbWVudCBpbiBpZiBibG9jay4KKyNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKKyAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7CisjZW5kaWYKKyAgICB9CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG1Db21tYW5kOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKQEAgLTQ0NSwxMSArNDc3LDE3IEBACiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCkpOwogICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKLSAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKLSAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgLy8gV2hlbiB0aGVyZSBhcmUgaGFwdGljIGNoYW5uZWxzLCB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkLgorICAgICAgICAgICAgLy8gTWFrZSB0aGUgc2FtcGxlIGRhdGEgZnVsbHkgaW50ZXJsZWF2ZWQgaGVyZS4KKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQXVkaW9DaGFubmVsQ291bnQsIGJ1ZmZlciwgbVNpbmtDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdC5tRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQXVkaW9DaGFubmVsQ291bnQsIG1Gb3JtYXQubUZvcm1hdCkpOwogICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICBtVGVlLndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisjZW5kaWYKICAgICAgICAgLy8gRklYTUUgd3JpdGUoKSBpcyBub24tYmxvY2tpbmcgYW5kIGxvY2stZnJlZSBmb3IgYSBwcm9wZXJseSBpbXBsZW1lbnRlZCBOQkFJTyBzaW5rLAogICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCiAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKQEAgLTQ3MCwzNSArNTA4LDQ5IEBACiAgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAogCi0gICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gbG9jYWwKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICBpZiAobUlzV2FybSkgeworICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyBsb2NhbAorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIHNlcnZlciAtIGtlcm5lbCB0aW1lIGRpZmZlcmVuY2UgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIGxhdGVuY3kgaWYgd2UgaGF2ZSB2YWxpZCBpbmZvLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkICogMTAwMCAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgIExPR19MQVRFTkNZKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmV0Y2ggc2VydmVyIHRpbWUgaWYgd2UgY2FuJ3QgZ2V0IHRpbWVzdGFtcAotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGtlcm5lbCBjYWNoZWQgcG9zaXRpb24gYXMgdGhpcyBtYXkgZ2V0IHJhcGlkbHkgc3RhbGUKLSAgICAgICAgICAgIC8vIGlmIHdlIG5ldmVyIGdldCBhIG5ldyB2YWxpZCB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IC0xOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZldGNoIHNlcnZlciB0aW1lIGlmIHdlIGNhbid0IGdldCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBrZXJuZWwgY2FjaGVkIHBvc2l0aW9uIGFzIHRoaXMgbWF5IGdldCByYXBpZGx5IHN0YWxlCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgbmV2ZXIgZ2V0IGEgbmV3IHZhbGlkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAppbmRleCAyMzVkMjNmLi4xZDMzMmUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsNyArMzMsOSBAQAogY2xhc3MgRmFzdE1peGVyIDogcHVibGljIEZhc3RUaHJlYWQgewogCiBwdWJsaWM6Ci0gICAgICAgICAgICBGYXN0TWl4ZXIoKTsKKyAgICAvKiogRmFzdE1peGVyIGNvbnN0cnVjdG9yIHRha2VzIGFzIHBhcmFtIHRoZSBwYXJlbnQgTWl4ZXJUaHJlYWQncyBpbyBoYW5kbGUgKGlkKQorICAgICAgICBmb3IgcHVycG9zZXMgb2YgaWRlbnRpZmljYXRpb24uICovCisgICAgZXhwbGljaXQgRmFzdE1peGVyKGF1ZGlvX2lvX2hhbmRsZV90IHRocmVhZElvSGFuZGxlKTsKICAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKTsKIAogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSogc3EoKTsKQEAgLTczLDYgKzc2LDggQEAKICAgICBzaXplX3QgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZTsKICAgICBhdWRpb19mb3JtYXRfdCAgbU1peGVyQnVmZmVyRm9ybWF0OyAvLyBtaXhlciBvdXRwdXQgZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXygxNl9CSVR8RkxPQVQpLgogCisgICAgdWludDMyX3QgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudDsgLy8gYXVkaW8gY2hhbm5lbCBjb3VudCwgZXhjbHVkZXMgaGFwdGljIGNoYW5uZWxzLgorCiAgICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtTWl4ZXJCdWZmZXJTdGF0ZTsKICAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsKICAgICB1bnNpZ25lZCAgICAgICAgbVNhbXBsZVJhdGU7CkBAIC04Nyw2ICs5MiwxMSBAQAogICAgIC8vIGFjY2Vzc2VkIHdpdGhvdXQgbG9jayBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZHMuCiAgICAgc3RkOjphdG9taWNfYm9vbCBtTWFzdGVyTW9ubzsKICAgICBzdGQ6OmF0b21pY19pbnRfZmFzdDY0X3QgbUJvb3R0aW1lT2Zmc2V0OworCisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVRocmVhZElvSGFuZGxlOyAvLyBwYXJlbnQgdGhyZWFkIGlkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICBtVGVlOworI2VuZGlmCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCAyZTRmYjhjLi5hNDJlMDljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKQEAgLTY4LDIxICs2OCwyMiBAQAogICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtcyBsYXRlbmN5PSUuMmYgbXNcbiIsCiAgICAgICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhtQ29tbWFuZCksIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCi0gICAgICAgICAgICAgICAgbWl4UGVyaW9kU2VjICogMWUzKTsKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMsIG1MYXRlbmN5TXMpOworICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAgICAgLy8gZmluZCB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcwotICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7Ci0gICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKKyAgICBjb25zdCB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOworICAgIGNvbnN0IHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CiAgICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwogCiAgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG47CiAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKLSAgICBuID0gbiAmIDB4RkZGRjsKKyAgICBuICY9IDB4RkZGRjsKIAogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwpAQCAtOTAsOSArOTEsOSBAQAogICAgIH0KICAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKICAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IHdhbGwsIGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IGtIeiwgbG9hZE1IejsKICAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7CiAjZW5kaWYKICAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCkBAIC0xMDcsMTggKzEwOCwxOCBAQAogICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOwogICAgICAgICB9Ci0gICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHdhbGwuYWRkKHdhbGxOcyk7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07Ci0gICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyAgICAgICAgbG9hZE5zLmFkZChzYW1wbGVMb2FkTnMpOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwogICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwogICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOworICAgICAgICAgICAga0h6LmFkZChzYW1wbGVDcHVrSHogPj4gNCk7CiAgICAgICAgICAgICBpZiAoc2FtcGxlQ3B1a0h6ID09IHByZXZpb3VzQ3B1a0h6KSB7CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lZ2FjeWNsZXMgPSAoZG91YmxlKSBzYW1wbGVMb2FkTnMgKiAoZG91YmxlKSAoc2FtcGxlQ3B1a0h6ID4+IDQpICogMWUtMTI7CiAgICAgICAgICAgICAgICAgZG91YmxlIGFkak1IeiA9IG1lZ2FjeWNsZXMgLyBtaXhQZXJpb2RTZWM7ICAvLyBfbm90XyB3YWxsTnMgKiAxZTkKLSAgICAgICAgICAgICAgICBsb2FkTUh6LnNhbXBsZShhZGpNSHopOworICAgICAgICAgICAgICAgIGxvYWRNSHouYWRkKGFkak1Ieik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CkBAIC0xMjYsNDIgKzEyNyw0MiBAQAogICAgIH0KICAgICBpZiAobikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXROKCkgKiBtaXhQZXJpb2RTZWMpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE1lYW4oKSoxZS02LCB3YWxsLmdldE1pbigpKjFlLTYsIHdhbGwuZ2V0TWF4KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0TWVhbigpKjFlLTMsIGxvYWROcy5nZXRNaW4oKSoxZS0zLCBsb2FkTnMuZ2V0TWF4KCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLmdldFN0ZERldigpKjFlLTMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwogICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAga0h6LmdldE1lYW4oKSoxZS0zLCBrSHouZ2V0TWluKCkqMWUtMywga0h6LmdldE1heCgpKjFlLTMsIGtIei5nZXRTdGREZXYoKSoxZS0zKTsKICAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCiAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5nZXRNZWFuKCksIGxvYWRNSHouZ2V0TWluKCksIGxvYWRNSHouZ2V0TWF4KCksIGxvYWRNSHouZ2V0U3RkRGV2KCkpOwogI2VuZGlmCiAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKICAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0CiAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7CisgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbGVmdCwgcmlnaHQ7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CisgICAgICAgICAgICBsZWZ0LmFkZCh0YWlsW2ldKTsKKyAgICAgICAgICAgIHJpZ2h0LmFkZCh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICIKICAgICAgICAgICAgICAgICAgICAgIig+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIGxlZnQuZ2V0TWVhbigpKjFlLTYsIGxlZnQuZ2V0TWluKCkqMWUtNiwgbGVmdC5nZXRNYXgoKSoxZS02LCBsZWZ0LmdldFN0ZERldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldE1lYW4oKSoxZS02LCByaWdodC5nZXRNaW4oKSoxZS02LCByaWdodC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAppbmRleCA4ZWYzMWQxLi45YjkxY2JjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1RpbWVzdGFtcFZlcmlmaWVyLmg+CiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgpAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCiAKKyAgICBkb3VibGUgICBtTGF0ZW5jeU1zID0gMC47ICAgLy8gbWVhc3VyZWQgbGF0ZW5jeSwgZGVmYXVsdCBvZiAwIGlmIG5vIHZhbGlkIHRpbWVzdGFtcCByZWFkLgogICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQogICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CiAgICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKQEAgLTc0LDYgKzc2LDkgQEAKICAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKICAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCiAgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworICAgIC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90IC8qIGZyYW1lIGNvdW50ICovLCBpbnQ2NF90IC8qIHRpbWUgbnMgKi8+IG1UaW1lc3RhbXBWZXJpZmllcjsKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCAzNmQ4ZWVmLi5iOTg4NDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKIEZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCiAgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQorICAgIG1GcmFtZUNvdW50KDApCiB7CiAgICAgaW50IG9rID0gcHRocmVhZF9vbmNlKCZzTWF4RmFzdFRyYWNrc09uY2UsIHNNYXhGYXN0VHJhY2tzSW5pdCk7CiAgICAgaWYgKG9rICE9IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggMmJlMWU5MS4uOWQyYTczMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICBtQ2hhbm5lbE1hc2s7ICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX01PTk8gb3IgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAvLyB0cmFjayBmb3JtYXQKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbjsgICAgIC8vIGluY3JlbWVudCB3aGVuIGFueSBmaWVsZCBpcyBhc3NpZ25lZAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaGFwdGljIHBsYXliYWNrIGlzIGVuYWJsZWQgb3Igbm90CiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCkBAIC02OSw2ICs3MCw5IEBACiAgICAgTkJBSU9fU2luayogbU91dHB1dFNpbms7ICAgIC8vIEhBTCBvdXRwdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIGludCAgICAgICAgIG1PdXRwdXRTaW5rR2VuOyAvLyBpbmNyZW1lbnQgd2hlbiBtT3V0cHV0U2luayBpcyBhc3NpZ25lZAogICAgIHNpemVfdCAgICAgIG1GcmFtZUNvdW50OyAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IG1peCBidWZmZXIKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOyAvLyBJZiBub3QgQVVESU9fQ0hBTk5FTF9OT05FLCBzcGVjaWZpZXMgc2luayBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzayB3aGVuIGl0IGNhbm5vdCBiZSBkaXJlY3RseSBjYWxjdWxhdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIGNvdW50CiAKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCkBAIC03Nyw5ICs4MSw2IEBACiAgICAgICAgIFdSSVRFID0gMHgxMCwgICAgICAgICAgIC8vIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAgICAgICAgIE1JWF9XUklURSA9IDB4MTg7ICAgICAgIC8vIG1peCB0cmFja3MgYW5kIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAKLSAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKLSAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLQogICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAppbmRleCBkYzE1NDg3Li4wNGIzMmMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtNjUsOCArNjYsNiBAQAogICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCiAgICAgbVdhcm11cEN5Y2xlcygwKSwKICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzKDApLAotICAgIC8vIG1EdW1teU5CTG9nV3JpdGVyCi0gICAgbU5CTG9nV3JpdGVyKCZtRHVtbXlOQkxvZ1dyaXRlciksCiAgICAgbVRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCiAKICAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLApAQCAtOTMsNyArOTIsNyBAQAogewogICAgIC8vIExPR1Qgbm93IHdvcmtzIGV2ZW4gaWYgdGxOQkxvZ1dyaXRlciBpcyBudWxscHRyLCBidXQgd2UncmUgY29uc2lkZXJpbmcgY2hhbmdpbmcgdGhhdCwKICAgICAvLyBzbyB0aGlzIGluaXRpYWxpemF0aW9uIHBlcm1pdHMgYSBmdXR1cmUgY2hhbmdlIHRvIHJlbW92ZSB0aGUgY2hlY2sgZm9yIG51bGxwdHIuCi0gICAgdGxOQkxvZ1dyaXRlciA9ICZtRHVtbXlOQkxvZ1dyaXRlcjsKKyAgICB0bE5CTG9nV3JpdGVyID0gbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgZm9yICg7OykgewogCiAgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKQEAgLTEyMyw5ICsxMjIsOSBAQAogCiAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKICAgICAgICAgICAgIG1EdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogbUR1bW15RHVtcFN0YXRlOwotICAgICAgICAgICAgbU5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgICAgICAgICBzZXROQkxvZ1dyaXRlcihtTkJMb2dXcml0ZXIpOyAgIC8vIEZhc3RNaXhlciBpbmZvcm1zIGl0cyBBdWRpb01peGVyLCBGYXN0Q2FwdHVyZSBpZ25vcmVzCi0gICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbU5CTG9nV3JpdGVyOworICAgICAgICAgICAgdGxOQkxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+bU5CTG9nV3JpdGVyIDogbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CisgICAgICAgICAgICBzZXROQkxvZ1dyaXRlcih0bE5CTG9nV3JpdGVyKTsgLy8gRmFzdE1peGVyIGluZm9ybXMgaXRzIEF1ZGlvTWl4ZXIsIEZhc3RDYXB0dXJlIGlnbm9yZXMKIAogICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgKG5vbi1pZGxlKSBzdGF0ZS4KICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzdGF0ZSBxdWV1ZSBvbmx5IGd1YXJhbnRlZXMgYWNjZXNzIHRvIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0YXRlcy4KQEAgLTI2MCw2ICsyNTksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2FybSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1NZWFzdXJlZFdhcm11cFRzOwogICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bVdhcm11cEN5Y2xlcyA9IG1XYXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxZTMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKiAxZS02KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19XQVJNVVBfVElNRShtZWFzdXJlZFdhcm11cE1zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IC0xOwpAQCAtMjcwLDYgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tVW5kZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfVU5ERVJSVU4oYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbmV3VHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG1PdmVycnVuTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSWdub3JlTmV4dE92ZXJydW4pIHsKQEAgLTI3OSw2ICsyODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvdmVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfT1ZFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBtaW5pbXVtIGN5Y2xlIHRpbWUuIEl0OgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gY29tcGVuc2F0ZXMgZm9yIGFuIGF1ZGlvIEhBTCB3aXRoIGppdHRlciBkdWUgdG8gc2FtcGxlIHJhdGUgY29udmVyc2lvbgpAQCAtMzM5LDYgKzM0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIExPR19XT1JLX1RJTUUobW9ub3RvbmljTnMpOwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKaW5kZXggMmE3MTQxNC4uM2Y2YjIwNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCkBAIC03OCwxMiArNzgsMTEgQEAKICAgICB1bnNpZ25lZCAgICAgICAgbUNvbGRHZW47ICAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KICAgICBib29sICAgICAgICAgICAgbUlzV2FybTsgICAgICAgIC8vIHRydWUgbWVhbnMgcmVhZHkgdG8gbWl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3QgICAgICAgIG1XYXJtdXBDeWNsZXM7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyBkdXJpbmcgd2FybXVwIHBoYXNlCi0gICAgdWludDMyX3QgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKLSAgICBOQkxvZzo6V3JpdGVyICAgbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgTkJMb2c6OldyaXRlciogIG1OQkxvZ1dyaXRlcjsgICAvLyBhbHdheXMgbm9uLW51bGxwdHI6IHJlYWwgTkJMb2c6OldyaXRlciogb3IgJm1EdW1teU5CTG9nV3JpdGVyCi0gICAgc3RhdHVzX3QgICAgICAgIG1UaW1lc3RhbXBTdGF0dXM7CisgICAgc3RydWN0IHRpbWVzcGVjICAgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCisgICAgdWludDMyX3QgICAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzOyAgICAvLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgY3ljbGVzIGluIHJhbmdlCisgICAgY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4gbUR1bW15TkJMb2dXcml0ZXJ7bmV3IE5CTG9nOjpXcml0ZXIoKX07CisgICAgc3RhdHVzX3QgICAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKIAogICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsKICAgICBib29sICAgICAgICAgICAgbUF0dGVtcHRlZFdyaXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKaW5kZXggNmY1NDZjMy4uOTY4ZDVhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CkBAIC0zOSw4ICs0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICAgc3RhdGljIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA4M2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAKQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CQUlPX1RlZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKKworLy8gRW5hYmxlZCB3aXRoIFRFRV9TSU5LIGluIENvbmZpZ3VyYXRpb24uaAorI2lmZGVmIFRFRV9TSU5LCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyBUZWUgZmlsZW5hbWVzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgorCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfQ19yZWFzb24ud2F2IiBSZWNvcmRUaHJlYWQKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9NX3JlYXNvbi53YXYiIE1peGVyVGhyZWFkIChOb3JtYWwpCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfRl9yZWFzb24ud2F2IiBNaXhlclRocmVhZCAoRmFzdCkKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9UcmFja0lkX1JfcmVhc29uLndhdiIgUmVjb3JkVHJhY2sKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9UcmFja0lkX1RyYWNrTmFtZV9UX3JlYXNvbi53YXYiIFBsYXliYWNrVHJhY2sKKworIHdoZXJlIERhdGUgPSBZWVlZbW1kZF9ISE1NU1NfTVNFQworCisgd2hlcmUgUmVhc29uID0gWyBEVE9SIHwgRFVNUCB8IFJFTU9WRSBdCisKKyBFeGFtcGxlczoKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzAzOF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMjE4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8zNzhfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0N182Ml9DX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDhfNjJfNTlfUl9EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ5XzEzX0ZfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODQyXzEyNV82Ml81OV9SX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODQyXzE2OF82Ml9DX0RUT1Iud2F2CisqLworCitzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9QUkVGSVhbXSA9ICJhZnRlZV8iOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfRElSRUNUT1JZW10gPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlciI7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBERUZBVUxUX1RIUkVBRFBPT0xfU0laRSA9IDg7CisKKy8qKiBBdWRpb0ZpbGVIYW5kbGVyIG1hbmFnZXMgdGVtcG9yYXJ5IGF1ZGlvIHdhdiBmaWxlcyB3aXRoIGEgbGVhc3QgcmVjZW50bHkgY3JlYXRlZAorICAgIHJldGVudGlvbiBwb2xpY3kuCisKKyAgICBUaGUgdGVtcG9yYXJ5IGZpbGVuYW1lcyBhcmUgc3lzdGVtYXRpY2FsbHkgZ2VuZXJhdGVkLiBBIGNvbW1vbiBmaWxlbmFtZSBwcmVmaXgsCisgICAgc3RvcmFnZSBkaXJlY3RvcnksIGFuZCBjb25jdXJyZW5jeSBwb29sIGFyZSBwYXNzZWQgaW4gb24gY3JlYXRpbmcgdGhlIG9iamVjdC4KKworICAgIFRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBieSAiY3JlYXRlIiwgd2hpY2ggcmV0dXJucyBhIGZpbGVuYW1lIGdlbmVyYXRlZCBieQorCisgICAgcHJlZml4ICsgMTQgY2hhciBkYXRlICsgc3VmZml4CisKKyAgICBUT0RPIE1vdmUgdG8gYXVkaW9fdXRpbHMuCisgICAgVE9ETyBBdm9pZCBwb2ludGluZyB0d28gQXVkaW9GaWxlSGFuZGxlcnMgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBwcmVmaXgKKyAgICBhcyB3ZSBkb24ndCBoYXZlIGEgcHJlZml4IHNwZWNpZmljIGxvY2sgZmlsZS4gKi8KKworY2xhc3MgQXVkaW9GaWxlSGFuZGxlciB7CitwdWJsaWM6CisKKyAgICBBdWRpb0ZpbGVIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnksIHNpemVfdCBwb29sKQorICAgICAgICA6IG1UaHJlYWRQb29sKHBvb2wpCisgICAgICAgICwgbVByZWZpeChwcmVmaXgpCisgICAgeworICAgICAgICAodm9pZClzZXREaXJlY3RvcnkoZGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBmaWxlbmFtZSBvZiBjcmVhdGVkIGF1ZGlvIGZpbGUsIGVsc2UgZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuICovCisgICAgc3RkOjpzdHJpbmcgY3JlYXRlKAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpOworCitwcml2YXRlOgorICAgIC8qKiBzZXRzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gdGhpcyBpcyBjdXJyZW50bHkgcHJpdmF0ZSB0byBhdm9pZCBjb25mdXNpb24KKyAgICAgICAgd2hlbiBjaGFuZ2luZyB3aGlsZSBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIG9jY3VycmluZyAoaXQncyBva2F5LCBidXQKKyAgICAgICAgd2Vha2x5IHN5bmNocm9uaXplZCkuICovCisgICAgc3RhdHVzX3Qgc2V0RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpOworCisgICAgLyoqIGNsZWFucyBjdXJyZW50IGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgZG9uZS4gKi8KKyAgICBzdGF0dXNfdCBjbGVhbihzdGQ6OnN0cmluZyAqZGlyID0gbnVsbHB0cik7CisKKyAgICAvKiogY3JlYXRlcyBhbiBhdWRpbyBmaWxlIGZyb20gYSByZWFkZXIgZnVuY3RvciBwYXNzZWQgaW4uICovCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWwoCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKKworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0b3J5VmFsaWQoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSkgeworICAgICAgICByZXR1cm4gZGlyZWN0b3J5LnNpemUoKSA+IDAgJiYgZGlyZWN0b3J5WzBdID09ICcvJzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICAgICAgY2hhciBmaWxlVGltZVtzaXplb2YoIllZWVltbWRkX0hITU1TU19cMCIpXTsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgICAgICBzdHJ1Y3QgdG0gdG07CisgICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyZnRpbWUoZmlsZVRpbWUsIHNpemVvZihmaWxlVGltZSksICIlWSVtJWRfJUglTSVTXyIsICZ0bSkgPT0gMCwKKyAgICAgICAgICAgICJpbmNvcnJlY3QgZmlsZVRpbWUgYnVmZmVyIik7CisgICAgICAgIGNoYXIgbXNlY1s0XTsKKyAgICAgICAgKHZvaWQpc25wcmludGYobXNlYywgc2l6ZW9mKG1zZWMpLCAiJTAzZCIsIChpbnQpKHR2LnR2X3VzZWMgLyAxMDAwKSk7CisgICAgICAgIHJldHVybiBtUHJlZml4ICsgZmlsZVRpbWUgKyBtc2VjICsgc3VmZml4ICsgIi53YXYiOworICAgIH0KKworICAgIGJvb2wgaXNNYW5hZ2VkRmlsZW5hbWUoY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICBjb25zdGV4cHIgc2l6ZV90IEZJTEVOQU1FX0xFTl9EQVRFID0gNCArIDIgKyAyIC8vICVZJW0lZCUKKyAgICAgICAgICAgICsgMSArIDIgKyAyICsgMiAvLyBfSCVNJVMKKyAgICAgICAgICAgICsgMSArIDM7IC8vX01TRUMKKyAgICAgICAgY29uc3Qgc2l6ZV90IHByZWZpeExlbiA9IG1QcmVmaXguc2l6ZSgpOworICAgICAgICBjb25zdCBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihuYW1lKTsKKworICAgICAgICAvLyByZWplY3Qgb24gc2l6ZSwgcHJlZml4LCBhbmQgLndhdgorICAgICAgICBpZiAobmFtZUxlbiA8IHByZWZpeExlbiArIEZJTEVOQU1FX0xFTl9EQVRFICsgNCAvKiAud2F2ICovCisgICAgICAgICAgICAgfHwgc3RybmNtcChuYW1lLCBtUHJlZml4LmNfc3RyKCksIHByZWZpeExlbikgIT0gMAorICAgICAgICAgICAgIHx8IHN0cmNtcChuYW1lICsgbmFtZUxlbiAtIDQsICIud2F2IikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsaWRhdGUgZGF0ZSBwb3J0aW9uCisgICAgICAgIGNvbnN0IGNoYXIgKmRhdGUgPSBuYW1lICsgcHJlZml4TGVuOworICAgICAgICByZXR1cm4gc3RkOjphbGxfb2YoZGF0ZSwgZGF0ZSArIDgsIGlzZGlnaXQpCisgICAgICAgICAgICAmJiBkYXRlWzhdID09ICdfJworICAgICAgICAgICAgJiYgc3RkOjphbGxfb2YoZGF0ZSArIDksIGRhdGUgKyAxNSwgaXNkaWdpdCkKKyAgICAgICAgICAgICYmIGRhdGVbMTVdID09ICdfJworICAgICAgICAgICAgJiYgc3RkOjphbGxfb2YoZGF0ZSArIDE2LCBkYXRlICsgMTksIGlzZGlnaXQpOworICAgIH0KKworICAgIC8vIHlldCBhbm90aGVyIFRocmVhZFBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgY2xhc3MgVGhyZWFkUG9vbCB7CisgICAgcHVibGljOgorICAgICAgICBUaHJlYWRQb29sKHNpemVfdCBzaXplKQorICAgICAgICAgICAgOiBtVGhyZWFkUG9vbFNpemUoc2l6ZSkKKyAgICAgICAgeyB9CisKKyAgICAgICAgLyoqIGxhdW5jaGVzIHRhc2sgIm5hbWUiIHdpdGggYXNzb2NpYXRlZCBmdW5jdGlvbiAiZnVuYyIuCisgICAgICAgICAgICBpZiB0aGUgdGhyZWFkcG9vbCBpcyBleGhhdXN0ZWQsIGl0IHdpbGwgbGF1bmNoIG9uIGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgc3RhdHVzX3QgbGF1bmNoKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGZ1bmMpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+Pj4gbUZ1dHVyZXM7IC8vIEdVQVJERURfQlkobUxvY2spCisKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1UaHJlYWRQb29sU2l6ZTsKKyAgICB9IG1UaHJlYWRQb29sOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByZWZpeDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6c3RyaW5nIG1EaXJlY3Rvcnk7ICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPiBtRmlsZXM7IC8vIEdVQVJERURfQlkobUxvY2spICBzb3J0ZWQgbGlzdCBvZiBmaWxlcyBieSBjcmVhdGlvbiB0aW1lCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBGUkFNRVNfUEVSX1JFQUQgPSAxMDI0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IE1BWF9GSUxFU19SRUFEID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBNQVhfRklMRVNfS0VFUCA9IDMyOworfTsKKworLyogc3RhdGljICovCit2b2lkIE5CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6ZHVtcFRlZSgKKyAgICAgICAgaW50IGZkLCBjb25zdCBOQkFJT19TaW5rU291cmNlICZzaW5rU291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KQoreworICAgIC8vIFNpbmdsZXRvbi4gQ29uc3RydWN0ZWQgdGhyZWFkLXNhZmUgb24gZmlyc3QgY2FsbCwgbmV2ZXIgZGVzdHJveWVkLgorICAgIHN0YXRpYyBBdWRpb0ZpbGVIYW5kbGVyIGF1ZGlvRmlsZUhhbmRsZXIoCisgICAgICAgICAgICBERUZBVUxUX1BSRUZJWCwgREVGQVVMVF9ESVJFQ1RPUlksIERFRkFVTFRfVEhSRUFEUE9PTF9TSVpFKTsKKworICAgIGF1dG8gJnNvdXJjZSA9IHNpbmtTb3VyY2Uuc2Vjb25kOworICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHNvdXJjZS0+Zm9ybWF0KCk7CisgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gYXVkaW9GaWxlSGFuZGxlci5jcmVhdGUoCisgICAgICAgICAgICAvLyB0aGlzIGZ1bmN0b3IgbXVzdCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIHN0YWNrCisgICAgICAgICAgICBbZmlyc3RSZWFkLCBzaW5rU291cmNlXSAodm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVzKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byAmc291cmNlID0gc2lua1NvdXJjZS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsUmVhZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxSZWFkID09IChzc2l6ZV90KU9WRVJSVU4gJiYgZmlyc3RSZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNoZWNrIG9uY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFJlYWQgPSBzb3VyY2UtPnJlYWQoYnVmZmVyLCBmcmFtZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVhZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsUmVhZDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KSwKKyAgICAgICAgICAgIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KSwKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0LAorICAgICAgICAgICAgc3VmZml4KTsKKworICAgIGlmIChmZCA+PSAwICYmIGZpbGVuYW1lLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgInRlZSB3cm90ZSB0byAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK05CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6TkJBSU9fU2lua1NvdXJjZSBOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6Om1ha2VTaW5rU291cmNlKAorICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgc2l6ZV90IGZyYW1lcywgYm9vbCAqZW5hYmxlZCkKK3sKKyAgICBpZiAoRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdC5tRm9ybWF0KSkgeworICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUoZnJhbWVzLCBmb3JtYXQpOworICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgQUxPR1coInBpcGUgZmFpbHVyZSB0byBuZWdvdGlhdGU6ICV6ZCIsIGluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOworICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJwaXBlUmVhZGVyIGZhaWx1cmUgdG8gbmVnb3RpYXRlOiAlemQiLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgKmVuYWJsZWQgPSB0cnVlOworICAgICAgICByZXR1cm4ge3BpcGUsIHBpcGVSZWFkZXJ9OworICAgIH0KK2V4aXQ6CisgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgKmVuYWJsZWQgPSBmYWxzZTsKKyAgICByZXR1cm4ge251bGxwdHIsIG51bGxwdHJ9OworfQorCitzdGQ6OnN0cmluZyBBdWRpb0ZpbGVIYW5kbGVyOjpjcmVhdGUoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGdlbmVyYXRlRmlsZW5hbWUoc3VmZml4KTsKKworICAgIGlmIChtVGhyZWFkUG9vbC5sYXVuY2goc3RkOjpzdHJpbmcoImNyZWF0ZSAiKSArIGZpbGVuYW1lLAorICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gY3JlYXRlSW50ZXJuYWwocmVhZGVyLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgZmlsZW5hbWUpOyB9KQorICAgICAgICAgICAgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OnNldERpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KQoreworICAgIGlmICghaXNEaXJlY3RvcnlWYWxpZChkaXJlY3RvcnkpKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgc3RkOjpmaWxlc3lzdGVtIGluIEMrKzE3CisgICAgRElSICpkaXIgPSBvcGVuZGlyKGRpcmVjdG9yeS5jX3N0cigpKTsKKworICAgIGlmIChkaXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBvcGVuIGRpcmVjdG9yeSAlcyIsIF9fZnVuY19fLCBkaXJlY3RvcnkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IHRvUmVtb3ZlID0gMDsKKyAgICBkZWNsdHlwZShtRmlsZXMpIGZpbGVzOworCisgICAgd2hpbGUgKGZpbGVzLnNpemUoKSA8IE1BWF9GSUxFU19SRUFEKSB7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVycm5vICE9IDAsICIlczogcmVhZGRpciBmYWlsdXJlICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBpcyBpdCBhIG1hbmFnZWQgZmlsZW5hbWU/CisgICAgICAgIGlmICghaXNNYW5hZ2VkRmlsZW5hbWUocmVzdWx0LT5kX25hbWUpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmaWxlcy5lbXBsYWNlX2JhY2socmVzdWx0LT5kX25hbWUpOworICAgIH0KKyAgICAodm9pZCljbG9zZWRpcihkaXIpOworCisgICAgLy8gT1BUSU1JWkFUSU9OOiB3ZSBkb24ndCBuZWVkIHRvIHN0YXQgZWFjaCBmaWxlLCB0aGUgZmlsZW5hbWVzIG5hbWVzIGFyZQorICAgIC8vIGFscmVhZHkgKHJvdWdobHkpIG9yZGVyZWQgYnkgY3JlYXRpb24gZGF0ZS4gIHdlIHVzZSBzdGQ6OmRlcXVlIGluc3RlYWQKKyAgICAvLyBvZiBzdGQ6OnNldCBmb3IgZmFzdGVyIGluc2VydGlvbiBhbmQgc29ydGluZyB0aW1lcy4KKworICAgIGlmIChmaWxlcy5zaXplKCkgPiBNQVhfRklMRVNfS0VFUCkgeworICAgICAgICAvLyByZW1vdmVkIGZpbGVzIGNhbiB1c2UgYSBwYXJ0aXRpb24gKG5vIG5lZWQgdG8gZG8gYSBmdWxsIHNvcnQpLgorICAgICAgICB0b1JlbW92ZSA9IGZpbGVzLnNpemUoKSAtIE1BWF9GSUxFU19LRUVQOworICAgICAgICBzdGQ6Om50aF9lbGVtZW50KGZpbGVzLmJlZ2luKCksIGZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSAtIDEsIGZpbGVzLmVuZCgpKTsKKyAgICB9CisKKyAgICAvLyBrZXB0IGZpbGVzIG11c3QgYmUgc29ydGVkLgorICAgIHN0ZDo6c29ydChmaWxlcy5iZWdpbigpICsgdG9SZW1vdmUsIGZpbGVzLmVuZCgpKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKworICAgICAgICBtRGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgICAgICBtRmlsZXMgPSBzdGQ6Om1vdmUoZmlsZXMpOworICAgIH0KKworICAgIGlmICh0b1JlbW92ZSA+IDApIHsgLy8gbGF1bmNoIGEgY2xlYW4gaW4gYmFja2dyb3VuZC4KKyAgICAgICAgKHZvaWQpbVRocmVhZFBvb2wubGF1bmNoKAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJjbGVhbmluZyAiKSArIGRpcmVjdG9yeSwgW3RoaXNdKCkgeyByZXR1cm4gY2xlYW4oKTsgfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6Y2xlYW4oc3RkOjpzdHJpbmcgKmRpcmVjdG9yeSkKK3sKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmlsZXNUb1JlbW92ZTsKKyAgICBzdGQ6OnN0cmluZyBkaXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworCisgICAgICAgIGlmICghaXNEaXJlY3RvcnlWYWxpZChtRGlyZWN0b3J5KSkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAgICAgZGlyID0gbURpcmVjdG9yeTsKKyAgICAgICAgaWYgKG1GaWxlcy5zaXplKCkgPiBNQVhfRklMRVNfS0VFUCkgeworICAgICAgICAgICAgc2l6ZV90IHRvUmVtb3ZlID0gbUZpbGVzLnNpemUoKSAtIE1BWF9GSUxFU19LRUVQOworCisgICAgICAgICAgICAvLyB1c2UgbW92ZSBhbmQgZXJhc2UgdG8gZWZmaWNpZW50bHkgdHJhbnNmZXIgc3RkOjpzdHJpbmcKKyAgICAgICAgICAgIHN0ZDo6bW92ZShtRmlsZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgbUZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGZpbGVzVG9SZW1vdmUpKTsKKyAgICAgICAgICAgIG1GaWxlcy5lcmFzZShtRmlsZXMuYmVnaW4oKSwgbUZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkaXJwID0gZGlyICsgIi8iOworICAgIC8vIHJlbW92ZSBmaWxlcyBvdXRzaWRlIG9mIGxvY2sgZm9yIGJldHRlciBjb25jdXJyZW5jeS4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJmZpbGUgOiBmaWxlc1RvUmVtb3ZlKSB7CisgICAgICAgICh2b2lkKXVubGluaygoZGlycCArIGZpbGUpLmNfc3RyKCkpOworICAgIH0KKworICAgIC8vIHJldHVybiB0aGUgZGlyZWN0b3J5IGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoZGlyZWN0b3J5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmRpcmVjdG9yeSA9IGRpcjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpUaHJlYWRQb29sOjpsYXVuY2goCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGZ1bmMpCit7CisgICAgaWYgKG1UaHJlYWRQb29sU2l6ZSA+IDEpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1GdXR1cmVzLnNpemUoKSA+PSBtVGhyZWFkUG9vbFNpemUpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IG1GdXR1cmVzLmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVzLmVuZCgpOykgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4gJmZ1dHVyZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKCFmdXR1cmUudmFsaWQoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDApKSA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZnV0dXJlICVzIHJlYWR5IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1GdXR1cmVzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGZ1dHVyZSAlcyBub3QgcmVhZHkiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtRnV0dXJlcy5zaXplKCkgPCBtVGhyZWFkUG9vbFNpemUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGVmZXJyZWQgY2FsbGluZyAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUZ1dHVyZXMuZW1wbGFjZV9iYWNrKG5hbWUsIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBmdW5jKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBpbW1lZGlhdGUgY2FsbGluZyAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBmdW5jKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OmNyZWF0ZUludGVybmFsKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSkKK3sKKyAgICAvLyBBdHRlbXB0IHRvIGNob29zZSB0aGUgYmVzdCBtYXRjaGluZyBmaWxlIGZvcm1hdC4KKyAgICAvLyBXZSBjYW4gY2hvb3NlIGFueSBzZl9mb3JtYXQKKyAgICAvLyBidXQgd3JpdGVGb3JtYXQgbXVzdCBiZSBvbmUgb2YgMTYsIDMyLCBmbG9hdAorICAgIC8vIGR1ZSB0byBzZl93cml0ZWYgY29tcGF0aWJpbGl0eS4KKyAgICBpbnQgc2ZfZm9ybWF0OworICAgIGF1ZGlvX2Zvcm1hdF90IHdyaXRlRm9ybWF0OworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNXzE2IGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfUENNXzMyOworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV8zMiBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9GTE9BVDsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV9GTE9BVCBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyBoYW5kbGUgYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoKSBmb3JtYXRzLgorICAgICAgICAvLyBoYW5kbGUgY29tcHJlc3NlZCBmb3JtYXRzIGFzIHNpbmdsZSBieXRlIGZpbGVzLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjbGVhbigmZGlyZWN0b3J5KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIHN0ZDo6c3RyaW5nIGRpclByZWZpeCA9IGRpcmVjdG9yeSArICIvIjsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSBkaXJQcmVmaXggKyBmaWxlbmFtZTsKKworICAgIC8qIGNvbnN0ICovIFNGX0lORk8gaW5mbyA9IHsKKyAgICAgICAgLmZyYW1lcyA9IDAsCisgICAgICAgIC5zYW1wbGVyYXRlID0gKGludClzYW1wbGVSYXRlLAorICAgICAgICAuY2hhbm5lbHMgPSAoaW50KWNoYW5uZWxDb3VudCwKKyAgICAgICAgLmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBzZl9mb3JtYXQsCisgICAgfTsKKyAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4ocGF0aC5jX3N0cigpLCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoRlJBTUVTX1BFUl9SRUFEICogc3RkOjptYXgoCisgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHdyaXRlRm9ybWF0KSwgLy9vdXRwdXQgZnJhbWVzaXplCisgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKTsgLy8gaW5wdXQgZnJhbWVzaXplCisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHNmX2Nsb3NlKHNmKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsUmVhZCA9IHJlYWRlcihidWZmZXIsIEZSQU1FU19QRVJfUkVBRCk7CisgICAgICAgIGlmIChhY3R1YWxSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBpbnB1dCBmb3JtYXQgdG8gd3JpdGVGb3JtYXQgYXMgbmVlZGVkLgorICAgICAgICBpZiAoZm9ybWF0ICE9IHdyaXRlRm9ybWF0KSB7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHdyaXRlRm9ybWF0LCBidWZmZXIsIGZvcm1hdCwgYWN0dWFsUmVhZCAqIGluZm8uY2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCByZWFsbHlXcml0dGVuOworICAgICAgICBzd2l0Y2ggKHdyaXRlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX3Nob3J0KHNmLCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfaW50KHNmLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9mbG9hdChzZiwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6ICVzIHdyaXRlRm9ybWF0OiAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgd3JpdGVGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhbGx5V3JpdHRlbiA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogJXMgd3JpdGUgZXJyb3I6ICV6ZCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCByZWFsbHlXcml0dGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRvdGFsICs9IHJlYWxseVdyaXR0ZW47CisgICAgICAgIGlmIChyZWFsbHlXcml0dGVuIDwgYWN0dWFsUmVhZCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiAlcyB3cml0ZSBzaG9ydCBjb3VudDogJXpkIDwgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCByZWFsbHlXcml0dGVuLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNmX2Nsb3NlKHNmKTsKKyAgICBmcmVlKGJ1ZmZlcik7CisgICAgaWYgKHRvdGFsID09IDApIHsKKyAgICAgICAgKHZvaWQpdW5saW5rKHBhdGguY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgLy8gU3VjY2VzczogYWRkIG91ciBuYW1lIHRvIG1hbmFnZWQgZmlsZXMuCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAvLyB3ZWFrIHN5bmNocm9uaXphdGlvbiAtIG9ubHkgdXBkYXRlIG1GaWxlcyBpZiB0aGUgZGlyZWN0b3J5IGhhc24ndCBjaGFuZ2VkLgorICAgICAgICBpZiAobURpcmVjdG9yeSA9PSBkaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIG1GaWxlcy5lbXBsYWNlX2JhY2soZmlsZW5hbWUpOyAgLy8gYWRkIHRvIHRoZSBlbmQgdG8gcHJlc2VydmUgc29ydC4KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7IC8vIHJldHVybiBmdWxsIHBhdGgKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gVEVFX1NJTksKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ4Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRW5hYmxlZCB3aXRoIFRFRV9TSU5LIGluIENvbmZpZ3VyYXRpb24uaAorI2lmbmRlZiBBTkRST0lEX05CQUlPX1RFRV9ICisjZGVmaW5lIEFORFJPSURfTkJBSU9fVEVFX0gKKworI2lmZGVmIFRFRV9TSU5LCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhlIE5CQUlPX1RlZSB1c2VzIHRoZSBOQkFJTyBQaXBlIGFuZCBQaXBlUmVhZGVyIGZvciBub25ibG9ja2luZworICogZGF0YSBjb2xsZWN0aW9uLCBmb3IgZXZlbnR1YWwgZHVtcCB0byBsb2cgZmlsZXMuCisgKiBTZWUgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcgZm9yIGhvdyB0bworICogZW5hYmxlIGJ5IHJvLmRlYnVnZ2FibGUgYW5kIGFmLnRlZSBwcm9wZXJ0aWVzLgorICoKKyAqIFRoZSB3cml0ZSgpIGludG8gdGhlIE5CQUlPX1RlZSBpcyB0aGVyZWZvcmUgbm9uYmxvY2tpbmcsCisgKiBidXQgY2hhbmdpbmcgTkJBSU9fVGVlIGZvcm1hdHMgd2l0aCBzZXQoKSBjYW5ub3QgYmUgZG9uZSBkdXJpbmcgYSB3cml0ZSgpOworICogdXN1YWxseSB0aGUgY2FsbGVyIGFscmVhZHkgaW1wbGVtZW50cyB0aGlzIG11dHVhbCBleGNsdXNpb24uCisgKgorICogQWxsIG90aGVyIGNhbGxzIGV4Y2VwdCBzZXQoKSB2cyB3cml0ZSgpIG1heSBvY2N1ciBhdCBhbnkgdGltZS4KKyAqCisgKiBkdW1wKCkgZGlzcnVwdGlvbiBpcyBtaW5pbWl6ZWQgdG8gdGhlIGNhbGxlciBzaW5jZSBzeXN0ZW0gY2FsbHMgYXJlIGV4ZWN1dGVkCisgKiBpbiBhbiBhc3luY2hyb25vdXMgdGhyZWFkICh3aGVuIHBvc3NpYmxlKS4KKyAqCisgKiBDdXJyZW50bHkgdGhlIE5CQUlPX1RlZSBpcyAiaGFyZHdpcmVkIiBmb3IgQXVkaW9GbGluZ2VyIHN1cHBvcnQuCisgKgorICogU29tZSBBdWRpb0ZsaW5nZXIgc3BlY2lmaWMgbm90ZXM6CisgKgorICogMSkgVGVlcyBjYXB0dXJlIG9ubHkgbGluZWFyIFBDTSBkYXRhLgorICogMikgVGVlcyB3aXRob3V0IGFueSBkYXRhIHdyaXR0ZW4gYXJlIGNvbnNpZGVyZWQgZW1wdHkgYW5kIGRvIG5vdCBnZW5lcmF0ZQorICogICAgYW55IG91dHB1dCBmaWxlcy4KKyAqIDIpIE9uY2UgYSBUZWUgZHVtcHMgZGF0YSwgaXQgaXMgY29uc2lkZXJlZCAiZW1wdGllZCIgYW5kIG5ldyBkYXRhCisgKiAgICBuZWVkcyB0byBiZSB3cml0dGVuIGJlZm9yZSBhbm90aGVyIFRlZSBmaWxlIGlzIGdlbmVyYXRlZC4KKyAqIDMpIFRlZSBmaWxlIGZvcm1hdCBpcworICogICAgV0FWIGludGVnZXIgUENNIDE2IGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgKiAgICBXQVYgaW50ZWdlciBQQ00gMzIgYml0IGZvciBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULCBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULgorICogICAgV0FWIGZsb2F0IFBDTSAzMiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQuCisgKgorICogSW5wdXRfVGhyZWFkOgorICogMSkgQ2FwdHVyZSBidWZmZXIgaXMgdGVlZCB3aGVuIHJlYWQgZnJvbSB0aGUgSEFMLCBiZWZvcmUgcmVzYW1wbGluZyBmb3IgdGhlIEF1ZGlvUmVjb3JkCisgKiAgICBjbGllbnQuCisgKgorICogT3V0cHV0X1RocmVhZDoKKyAqIDEpIE1peGVyVGhyZWFkcyB3aWxsIHRlZSBhdCB0aGUgRmFzdE1peGVyIG91dHB1dCAoaWYgaXQgaGFzIG9uZSkgb3IgYXQgdGhlCisgKiAgICBOb3JtYWxNaXhlciBvdXRwdXQgKGlmIG5vIEZhc3RNaXhlcikuCisgKiAyKSBEdXBsaWNhdGluZ1RocmVhZHMgZG8gbm90IHRlZSBhbnkgbWl4ZWQgZGF0YS4gQXBwbHkgYSB0ZWUgb24gdGhlIGRvd25zdHJlYW0gT3V0cHV0VHJhY2sKKyAqICAgIG9yIG9uIHRoZSB1cHN0cmVhbSBwbGF5YmFjayBUcmFja3MuCisgKiAzKSBEaXJlY3RUaHJlYWRzIGFuZCBPZmZsb2FkVGhyZWFkcyBkbyBub3QgdGVlIGFueSBkYXRhLiBUaGUgdXBzdHJlYW0gdHJhY2sKKyAqICAgIChpZiBsaW5lYXIgUENNIGZvcm1hdCkgbWF5IGJlIHRlZWQgdG8gZGlzY292ZXIgZGF0YS4KKyAqIDQpIE1tYXBUaHJlYWRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIFRyYWNrczoKKyAqIDEpIFJlY29yZFRyYWNrcyBhbmQgcGxheWJhY2sgVHJhY2tzIHRlZSBhcyBkYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gb3IKKyAqICAgIHJlYWQgZnJvbSB0aGUgc2hhcmVkIGNsaWVudC1zZXJ2ZXIgdHJhY2sgYnVmZmVyIGJ5IHRoZSBhc3NvY2lhdGVkIFRocmVhZHMuCisgKiAyKSBUaGUgbWVjaGFuaXNtIGlzIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyIHJlbGVhc2UoKSBzbyBsYXJnZSBzdGF0aWMgVHJhY2sKKyAqICAgIHBsYXliYWNrIG1heSBub3Qgc2hvdyBhbnkgVGVlIGRhdGEgZGVwZW5kaW5nIG9uIHdoZW4gaXQgaXMgcmVsZWFzZWQuCisgKiAzKSBXaGVuIGEgdHJhY2sgYmVjb21lcyBpbmFjdGl2ZSwgdGhlIFRocmVhZCB3aWxsIHRyaWdnZXIgYSBkdW1wLgorICovCisKK2NsYXNzIE5CQUlPX1RlZSB7CitwdWJsaWM6CisgICAgLyogVEVFX0ZMQUcgaXMgdXNlZCBpbiBzZXQoKSBhbmQgbXVzdCBtYXRjaCB0aGUgZmxhZ3MgZm9yIHRoZSBhZi50ZWUgcHJvcGVydHkKKyAgICAgICBnaXZlbiBpbiBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZworICAgICovCisgICAgZW51bSBURUVfRkxBRyB7CisgICAgICAgIFRFRV9GTEFHX05PTkUgPSAwLAorICAgICAgICBURUVfRkxBR19JTlBVVF9USFJFQUQgPSAoMSA8PCAwKSwgIC8vIHRyZWF0IGFzIGEgVGVlIGZvciBpbnB1dCAoQ2FwdHVyZSkgVGhyZWFkcworICAgICAgICBURUVfRkxBR19PVVRQVVRfVEhSRUFEID0gKDEgPDwgMSksIC8vIHRyZWF0IGFzIGEgVGVlIGZvciBvdXRwdXQgKFBsYXliYWNrKSBUaHJlYWRzCisgICAgICAgIFRFRV9GTEFHX1RSQUNLID0gKDEgPDwgMiksICAgICAgICAgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIHRyYWNrcyAoUmVjb3JkIGFuZCBQbGF5YmFjaykKKyAgICB9OworCisgICAgTkJBSU9fVGVlKCkKKyAgICAgICAgOiBtVGVlKHN0ZDo6bWFrZV9zaGFyZWQ8TkJBSU9fVGVlSW1wbD4oKSkKKyAgICB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkuYWRkKG1UZWUpOworICAgIH0KKworICAgIH5OQkFJT19UZWUoKSB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkucmVtb3ZlKG1UZWUpOworICAgICAgICBkdW1wKC0xLCAiX0RUT1IiKTsgLy8gbG9nIGFueSBkYXRhIHJlbWFpbmluZyBpbiBUZWUuCisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIHNldCBpcyB1c2VkIGZvciBkZWZlcnJlZCBjb25maWd1cmF0aW9uIG9mIFRlZS4KKyAgICAgKgorICAgICAqICBNYXkgYmUgY2FsbGVkIGFueXRpbWUgZXhjZXB0IGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gZm9ybWF0IE5CQUlPX0Zvcm1hdCB1c2VkIHRvIG9wZW4gTkJBSU8gcGlwZXMKKyAgICAgKiBccGFyYW0gZmxhZ3MgKGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nKQorICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX05PTkUgdG8gYnlwYXNzIGFmLnRlZSBwcm9wZXJ0eSBjaGVja3MgKGRlZmF1bHQpOworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX0lOUFVUX1RIUkVBRCB0byBjaGVjayBhZi50ZWUgaWYgaW5wdXQgdGhyZWFkIGxvZ2dpbmcgc2V0OworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX09VVFBVVF9USFJFQUQgdG8gY2hlY2sgYWYudGVlIGlmIG91dHB1dCB0aHJlYWQgbG9nZ2luZyBzZXQ7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfVFJBQ0sgdG8gY2hlY2sgYWYudGVlIGlmIHRyYWNrIGxvZ2dpbmcgc2V0LgorICAgICAqIFxwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyB0byBvcGVuIHRoZSBOQkFJTyBwaXBlIChzZXQgdG8gMCB0byB1c2UgZGVmYXVsdCkuCisgICAgICoKKyAgICAgKiBccmV0dXJuCisgICAgICogICAgICAgICAtIE5PX0VSUk9SIG9uIHN1Y2Nlc3MgKG9yIGZvcm1hdCB1bmNoYW5nZWQpCisgICAgICogICAgICAgICAtIEJBRF9WQUxVRSBpZiBmb3JtYXQgb3IgZmxhZ3MgaW52YWxpZC4KKyAgICAgKiAgICAgICAgIC0gUEVSTUlTU0lPTl9ERU5JRUQgaWYgZmxhZ3Mgbm90IGFsbG93ZWQgYnkgYWYudGVlCisgICAgICovCisKKyAgICBzdGF0dXNfdCBzZXQoY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsCisgICAgICAgICAgICBURUVfRkxBRyBmbGFncyA9IFRFRV9GTEFHX05PTkUsIHNpemVfdCBmcmFtZXMgPSAwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGVlLT5zZXQoZm9ybWF0LCBmbGFncywgZnJhbWVzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBURUVfRkxBRyBmbGFncyA9IFRFRV9GTEFHX05PTkUsIHNpemVfdCBmcmFtZXMgPSAwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGVlLT5zZXQoRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCksIGZsYWdzLCBmcmFtZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiB3cml0ZSBkYXRhIHRvIHRoZSB0ZWUuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGwgaXMgbG9jayBmcmVlIChhcyBzaGFyZWQgcG9pbnRlciBhbmQgTkJBSU8gaXMgbG9jayBmcmVlKTsKKyAgICAgKiBtYXkgYmUgY2FsbGVkIHNpbXVsdGFuZW91cyB0byBhbGwgbWV0aG9kcyBleGNlcHQgc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gYnVmZmVyIHRvIHdyaXRlIHRvIHBpcGUuCisgICAgICogXHBhcmFtIGZyYW1lQ291bnQgaW4gZnJhbWVzIGFzIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHBhc3NlZCB0byBzZXQoKQorICAgICAqLworCisgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZUNvdW50KSBjb25zdCB7CisgICAgICAgIG1UZWUtPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgfQorCisgICAgLyoqIHNldHMgVGVlIGlkIHN0cmluZyB3aGljaCBpZGVudGlmaWVzIHRoZSBnZW5lcmF0ZWQgZmlsZSAoc2hvdWxkIGJlIHVuaXF1ZSkuICovCisgICAgdm9pZCBzZXRJZChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+c2V0SWQoaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBkdW1wIHRoZSBhdWRpbyBjb250ZW50IHdyaXR0ZW4gdG8gdGhlIFRlZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgZHVtcGVkIGZpbGVuYW1lIGZvciBsb2dnaW5nLCB1c2UgLTEgdG8gaWdub3JlLgorICAgICAqIFxwYXJhbSByZWFzb24gc3RyaW5nIHN1ZmZpeCB0byBhcHBlbmQgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLgorICAgICAqLworICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24gPSAiIikgY29uc3QgeworICAgICAgICBtVGVlLT5kdW1wKGZkLCByZWFzb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBkdW1wIGFsbCBUZWVzIGN1cnJlbnRseSBhbGl2ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgZHVtcGVkIGZpbGVuYW1lIGZvciBsb2dnaW5nLCB1c2UgLTEgdG8gaWdub3JlLgorICAgICAqIFxwYXJhbSByZWFzb24gc3RyaW5nIHN1ZmZpeCB0byBhcHBlbmQgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGR1bXBBbGwoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uID0gIiIpIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5kdW1wKGZkLCByZWFzb24pOworICAgIH0KKworcHJpdmF0ZToKKworICAgIC8qKiBUaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVlIC0gdGhlIGxpZmV0aW1lIGlzIHRocm91Z2gKKyAgICAgICAgYSBzaGFyZWQgcG9pbnRlciBzbyBkZXN0cnVjdGlvbiBvZiB0aGUgTkJBSU9fVGVlIGNvbnRhaW5lciBtYXkgcHJvY2VlZAorICAgICAgICBldmVuIHRob3VnaCBkdW1waW5nIGlzIG9jY3VycmluZy4gKi8KKyAgICBjbGFzcyBOQkFJT19UZWVJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IHNldChjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgVEVFX0ZMQUcgZmxhZ3MsIHNpemVfdCBmcmFtZXMpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgdGVlQ29uZmlnID0gcHJvcGVydHlfZ2V0X2Jvb2woInJvLmRlYnVnZ2FibGUiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICA/IHByb3BlcnR5X2dldF9pbnQzMigiYWYudGVlIiwgMCkgOiAwOworCisgICAgICAgICAgICAvLyBjaGVjayB0aGUgdHlwZSBvZiBUZWUKKyAgICAgICAgICAgIGNvbnN0IFRFRV9GTEFHIHR5cGUgPSBURUVfRkxBRygKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiAoVEVFX0ZMQUdfSU5QVVRfVEhSRUFEIHwgVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCB8IFRFRV9GTEFHX1RSQUNLKSk7CisKKyAgICAgICAgICAgIC8vIHBhcmFtZXRlciBmbGFncyBjYW4ndCBzZWxlY3QgbXVsdGlwbGUgdHlwZXMuCisgICAgICAgICAgICBpZiAoX19idWlsdGluX3BvcGNvdW50KHR5cGUpID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHR5cGUgaXMgc2V0LCB3ZSBjaGVjayB0byBzZWUgaWYgaXQgaXMgcGVybWl0dGVkIGJ5IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBpZiAodHlwZSAhPSAwICYmICh0eXBlICYgdGVlQ29uZmlnKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXRlcm1pbmUgbnVtYmVyIG9mIGZyYW1lcyBmb3IgVGVlCisgICAgICAgICAgICBpZiAoZnJhbWVzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25zaWRlciB2YXJ5aW5nIGZyYW1lIGNvdW50IGJhc2VkIG9uIHR5cGUuCisgICAgICAgICAgICAgICAgZnJhbWVzID0gREVGQVVMVF9URUVfRlJBTUVTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgbWluaW11bSBudW1iZXIgb2YgZnJhbWVzPworCisgICAgICAgICAgICAvLyBkb24ndCBkbyBhbnl0aGluZyBpZiBmb3JtYXQgYW5kIGZyYW1lcyBhcmUgdGhlIHNhbWUuCisgICAgICAgICAgICBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtRm9ybWF0KSAmJiBmcmFtZXMgPT0gbUZyYW1lcykgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBhdXRvIHNpbmtzb3VyY2UgPSBtYWtlU2lua1NvdXJjZShmb3JtYXQsIGZyYW1lcywgJmVuYWJsZWQpOworCisgICAgICAgICAgICAvLyBlbmFibGVkIGlzIHNldCBpZiBtYWtlU2lua1NvdXJjZSBpcyBzdWNjZXNzZnVsLgorICAgICAgICAgICAgLy8gTm90ZTogYXMgbWVudGlvbmVkIGluIE5CQUlPX1RlZTo6c2V0KCksIGRvbid0IGNhbGwgc2V0KCkgd2hpbGUgd3JpdGUoKSBpcworICAgICAgICAgICAgLy8gb25nb2luZy4KKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OyAvLyBjb3VsZCBnZXQgdGhpcyBmcm9tIHRoZSBTaW5rLgorICAgICAgICAgICAgICAgIG1GcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICAgICAgICAgbVNpbmtTb3VyY2UgPSBzdGQ6Om1vdmUoc2lua3NvdXJjZSk7CisgICAgICAgICAgICAgICAgbUVuYWJsZWQuc3RvcmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhUmVhZHkuZXhjaGFuZ2UoZmFsc2UpKSByZXR1cm47CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBOQkFJT19TaW5rU291cmNlIHNpbmtTb3VyY2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBtSWQgKyByZWFzb247CisgICAgICAgICAgICAgICAgc2lua1NvdXJjZSA9IG1TaW5rU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRlZShmZCwgc2lua1NvdXJjZSwgc3VmZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgaWYgKCFtRW5hYmxlZC5sb2FkKCkgfHwgZnJhbWVDb3VudCA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAodm9pZCltU2lua1NvdXJjZS5maXJzdC0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1EYXRhUmVhZHkuc3RvcmUodHJ1ZSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRSSUNLWTogV2UgbmVlZCB0byBrZWVwIHRoZSBOQkFJT19TaW5rIGFuZCBOQkFJT19Tb3VyY2UgYm90aCBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIC8vIGJlY2F1c2UgUGlwZVJlYWRlciBob2xkcyBhIG5ha2VkIHJlZmVyZW5jZSAobm90IGEgc3Ryb25nIG9yIHdlYWsgcG9pbnRlcikgdG8gUGlwZS4KKyAgICAgICAgdXNpbmcgTkJBSU9fU2lua1NvdXJjZSA9IHN0ZDo6cGFpcjxzcDxOQkFJT19TaW5rPiwgc3A8TkJBSU9fU291cmNlPj47CisKKyAgICAgICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IE5CQUlPX1NpbmtTb3VyY2UmIHNpbmtTb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOworCisgICAgICAgIHN0YXRpYyBOQkFJT19TaW5rU291cmNlIG1ha2VTaW5rU291cmNlKAorICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBzaXplX3QgZnJhbWVzLCBib29sICplbmFibGVkKTsKKworICAgICAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IERFRkFVTFRfVEVFX0ZSQU1FUyA9IDB4MjAwMDAwOworCisgICAgICAgIC8vIGF0b21pYyBzdGF0dXMgY2hlY2tpbmcKKyAgICAgICAgc3RkOjphdG9taWM8Ym9vbD4gbUVuYWJsZWR7ZmFsc2V9OworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtRGF0YVJlYWR5e2ZhbHNlfTsKKworICAgICAgICAvLyBsb2NrZWQgZHVtcCBpbmZvcm1hdGlvbgorICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1JZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIFRFRV9GTEFHIG1GbGFncyA9IFRFRV9GTEFHX05PTkU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIE5CQUlPX0Zvcm1hdCBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7ICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIHNpemVfdCBtRnJhbWVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIE5CQUlPX1NpbmtTb3VyY2UgbVNpbmtTb3VyY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgfTsKKworICAgIC8qKiBSdW5uaW5nVGVlcyB0cmFja3MgY3VycmVudCBydW5uaW5nIHRlZXMgZm9yIGR1bXAgcHVycG9zZXMuCisgICAgICAgIEl0IGlzIGltcGxlbWVudGVkIHRvIGhhdmUgbWluaW1hbCBsb2NrZWQgcmVnaW9ucywgdG8gYmUgdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlci4gKi8KKyAgICBjbGFzcyBSdW5uaW5nVGVlcyB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIGFkZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gJnRlZSkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKCFtVGVlcy5lbXBsYWNlKHRlZSkuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVwIGFscmVhZHkgZXhpc3RzIGluIG1UZWVzIiwgX19mdW5jX18sIHRlZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbW92ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gJnRlZSkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKG1UZWVzLmVyYXNlKHRlZSkgIT0gMSwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiAlcCBkb2Vzbid0IGV4aXN0IGluIG1UZWVzIiwgX19mdW5jX18sIHRlZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4+IHRlZXM7IC8vIHNhZmUgc25hcHNob3Qgb2YgdGVlcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgdGVlcy5pbnNlcnQodGVlcy5lbmQoKSwgbVRlZXMuYmVnaW4oKSwgbVRlZXMuZW5kKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0ZWUgOiB0ZWVzKSB7CisgICAgICAgICAgICAgICAgdGVlLT5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4+IG1UZWVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIH07CisKKyAgICAvLyBzaW5nbGV0b24KKyAgICBzdGF0aWMgUnVubmluZ1RlZXMgJmdldFJ1bm5pbmdUZWVzKCkgeworICAgICAgICBzdGF0aWMgUnVubmluZ1RlZXMgcnVubmluZ1RlZXM7CisgICAgICAgIHJldHVybiBydW5uaW5nVGVlczsKKyAgICB9CisKKyAgICAvLyBUaGUgTkJBSU8gVGVlSW1wbCBtYXkgaGF2ZSBsaWZldGltZSBsb25nZXIgdGhhbiBOQkFJT19UZWUgaWYKKyAgICAvLyBSdW5uaW5nVGVlczo6ZHVtcCgpIGlzIGJlaW5nIGNhbGxlZCBzaW11bHRhbmVvdXMgdG8gfk5CQUlPX1RlZSgpLgorICAgIC8vIFRoaXMgaXMgYWxsb3dlZCBmb3IgbWF4aW11bSBjb25jdXJyZW5jeS4KKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gbVRlZTsKK307IC8vIE5CQUlPX1RlZQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBURUVfU0lOSworI2VuZGlmIC8vICFBTkRST0lEX05CQUlPX1RFRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggZTVjYjhhMi4uNTM4YTBlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjQsOCArMjQsOSBAQAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQ5LDExMSArNTAsNzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOwogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmdldEF1ZGlvUG9ydChwb3J0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIAotCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwucmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKIH0KIAotCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoOjpnZXRMYXRlbmN5TXNfbChkb3VibGUgKmxhdGVuY3lNcykgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvJiBpdGVyID0gbVBhdGNoUGFuZWwubVBhdGNoZXMuZmluZChtUGF0Y2hIYW5kbGUpOworICAgIGlmIChpdGVyICE9IG1QYXRjaFBhbmVsLm1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQuZ2V0TGF0ZW5jeU1zKGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLS8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLQotQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlcikKLXsKLX0KLQotQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjp+UGF0Y2hQYW5lbCgpCi17CiB9CiAKIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzIik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQogewotICAgIEFMT0dWKCJnZXRBdWRpb1BvcnQiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwogICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCi0gICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAKLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyA9PSAwICYmIHBhdGNoLT5udW1fc291cmNlcyAhPSAyKSB8fAotICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpIHx8IChwYXRjaC0+bnVtX3NpbmtzID09IDAgJiYgcGF0Y2gtPm51bV9zb3VyY2VzICE9IDIpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIGxpbWl0IG51bWJlciBvZiBzb3VyY2VzIHRvIDEgZm9yIG5vdyBvciAyIHNvdXJjZXMgZm9yIHNwZWNpYWwgY3Jvc3MgaHcgbW9kdWxlIGNhc2UuCkBAIC0xNjMsODEgKzEzMCw3MyBAQAogICAgIH0KIAogICAgIGlmICgqaGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgKmhhbmRsZSAhPSAwICYmIGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBpZiAoKmhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsICpoYW5kbGUpOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IG1QYXRjaGVzW2luZGV4XS0+bUhhbEhhbmRsZTsKLSAgICAgICAgICAgICAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSByZW1vdmVkIHBhdGNoIGlmIGFwcGxpY2FibGUKLSAgICAgICAgICAgICAgICAvLyAxKSBpZiBhIHNvZnR3YXJlIHBhdGNoIGlzIHByZXNlbnQsIHJlbGVhc2UgdGhlIHBsYXliYWNrIGFuZCBjYXB0dXJlIHRocmVhZHMgYW5kCi0gICAgICAgICAgICAgICAgLy8gdHJhY2tzIGNyZWF0ZWQuIFRoaXMgd2lsbCBhbHNvIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gSEFMIHBhdGNoZXMKLSAgICAgICAgICAgICAgICBpZiAoKHJlbW92ZWRQYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSkgewotICAgICAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gMikgaWYgdGhlIG5ldyBwYXRjaCBhbmQgb2xkIHBhdGNoIHNvdXJjZSBvciBzaW5rIGFyZSBkZXZpY2VzIGZyb20gZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgLy8gaHcgbW9kdWxlcywgIGNsZWFyIHRoZSBhdWRpbyBIQUwgcGF0Y2hlcyBub3cgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAvLyBieSBjYWxsIHRvIGNyZWF0ZV9hdWRpb19wYXRjaCgpIGJlbG93IHdoaWNoIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IEhXIG1vZHVsZQotICAgICAgICAgICAgICAgIGlmIChoYWxIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhdGNoLT5udW1fc2lua3MgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBvbiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwKTogdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNwZWNpYWwgcGF0Y2hlcyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBidXQganVzdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSwgc3lzdGVtYXRpY2FsbHkgY2xlYXIgdGhlIEhBTCBwYXRjaC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zaW5rcyBjYW5ub3QgYmUgMCBoZXJlIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbEhhbmRsZSB3b3VsZCBiZSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGh3TW9kdWxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChoYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKCpoYW5kbGUpOworICAgICAgICBpZiAoaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgX19mdW5jX18sICpoYW5kbGUpOworICAgICAgICAgICAgUGF0Y2ggJnJlbW92ZWRQYXRjaCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSByZW1vdmVkIHBhdGNoIGlmIGFwcGxpY2FibGUKKyAgICAgICAgICAgIC8vIDEpIGlmIGEgc29mdHdhcmUgcGF0Y2ggaXMgcHJlc2VudCwgcmVsZWFzZSB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUgdGhyZWFkcyBhbmQKKyAgICAgICAgICAgIC8vIHRyYWNrcyBjcmVhdGVkLiBUaGlzIHdpbGwgYWxzbyByZWxlYXNlIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIEhBTCBwYXRjaGVzCisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gMikgaWYgdGhlIG5ldyBwYXRjaCBhbmQgb2xkIHBhdGNoIHNvdXJjZSBvciBzaW5rIGFyZSBkZXZpY2VzIGZyb20gZGlmZmVyZW50CisgICAgICAgICAgICAvLyBodyBtb2R1bGVzLCAgY2xlYXIgdGhlIGF1ZGlvIEhBTCBwYXRjaGVzIG5vdyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgdXBkYXRlZAorICAgICAgICAgICAgLy8gYnkgY2FsbCB0byBjcmVhdGVfYXVkaW9fcGF0Y2goKSBiZWxvdyB3aGljaCB3aWxsIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBIVyBtb2R1bGUKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJm9sZFBhdGNoID0gcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoOworICAgICAgICAgICAgICAgIGlmIChvbGRQYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkgeworICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IG9sZFBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChvbGRQYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgb24gKHBhdGNoLT5udW1fc2lua3MgPT0gMCk6IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBub3QgaGFwcGVuIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNwZWNpYWwgcGF0Y2hlcyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBidXQganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlLCBzeXN0ZW1hdGljYWxseSBjbGVhciB0aGUgSEFMIHBhdGNoLgorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoLm51bV9zaW5rcyBjYW5ub3QgYmUgMCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUgd291bGQgYmUgQVVESU9fUEFUQ0hfSEFORExFX05PTkUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IG9sZFBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gZmluZEh3RGV2aWNlQnlNb2R1bGUoaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIGlmIChod0RldmljZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBhdGNoZXMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygqaGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIFBhdGNoICpuZXdQYXRjaCA9IG5ldyBQYXRjaChwYXRjaCk7CisgICAgUGF0Y2ggbmV3UGF0Y2h7KnBhdGNofTsKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaW5zZXJ0ZWRNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiAKICAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmICghYXVkaW9Id0RldmljZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBpZiBjb25uZWN0aW9uIHRvIGEgbWl4IG9yIGFjcm9zcyBIVyBtb2R1bGVzCiAgICAgICAgICAgICAgICAgaWYgKChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0Lm1peC5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgbXVsdGlwbGUgc2lua3MgZm9yIG1peCBvciBhY3Jvc3MgbW9kdWxlcyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyByZWplY3QgY29ubmVjdGlvbiB0byBkaWZmZXJlbnQgc2luayB0eXBlcwogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBwYXRjaC0+c2lua3NbMF0udHlwZSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTI1NiwzOCArMjE1LDUyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyAhPSAwICYmIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5od19tb2R1bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNvdXJjZSBjb21iaW5hdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbm5vdCBnZXQgcGxheWJhY2sgdGhyZWFkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGlzIHJldXNlZCwgc28gaXQgaXMgbm90IGNsb3NlZCB3aGVuIHBhdGNoIGlzIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSwgZmFsc2UgLypjbG9zZVRocmVhZCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zaW5rc1swXS5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHBhdGNoLT5zaW5rc1swXS5mbGFncy5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CkBAIC0yOTcsNDcgKzI3MCw1MyBAQAogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQobmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+Zm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mbGFncy5pbnB1dCA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woc3JjTW9kdWxlLAorICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woc3JjTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVJlY29yZC5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxSZWNvcmRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXdQYXRjaC5jcmVhdGVDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRNb2R1bGUgPSBhdWRpb0h3RGV2aWNlLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1Niw5ICszMzUsOSBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmNNb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9CkBAIC0zNjYsOCArMzQ1LDggQEAKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CkBAIC0zNzksMjEgKzM1OCwyMSBAQAogICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gYXVkaW9mbGluZ2VyLT5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IG1BdWRpb0ZsaW5nZXIucHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgewogICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpdHlwZSk7CiAKLSAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CkBAIC00MDMsMjk1ICszODIsNDE1IEBACiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogZXhpdDoKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgQUxPR1YoIiVzKCkgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBhdWRpb2ZsaW5nZXItPm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1BBVENIKTsKLSAgICAgICAgbmV3UGF0Y2gtPm1IYW5kbGUgPSAqaGFuZGxlOwotICAgICAgICBuZXdQYXRjaC0+bUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKLSAgICAgICAgbVBhdGNoZXMuYWRkKG5ld1BhdGNoKTsKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsICpoYW5kbGUsIGhhbEhhbmRsZSk7CisgICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOworICAgICAgICBuZXdQYXRjaC5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOworICAgICAgICBtUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgc3RkOjptb3ZlKG5ld1BhdGNoKSkpOworICAgICAgICBpZiAoaW5zZXJ0ZWRNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoaW5zZXJ0ZWRNb2R1bGUsICpoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlcygpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgX19mdW5jX18sICpoYW5kbGUsIGhhbEhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoKTsKLSAgICAgICAgZGVsZXRlIG5ld1BhdGNoOworICAgICAgICBuZXdQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCkKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6On5QYXRjaCgpCit7CisgICAgQUxPR0VfSUYoaXNTb2Z0d2FyZSgpLCAiU29mdHdhcmUgcGF0Y2ggY29ubmVjdGlvbnMgbGVha2VkICVkICVkIiwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNyZWF0ZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKQogewogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBzdWJQYXRjaDsKLSAgICBzdWJQYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgc3ViUGF0Y2guc291cmNlc1swXSA9IGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMF07Ci0gICAgc3ViUGF0Y2gubnVtX3NpbmtzID0gMTsKLQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNpbmtzWzBdKTsKLSAgICBzdWJQYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobUF1ZGlvUGF0Y2guc291cmNlc1swXSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhtUmVjb3JkLnRocmVhZCgpLCB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDIH0pLnBhdGNoKCksCisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZVB0cigpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1SZWNvcmQuaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCi0gICAgaWYgKGF1ZGlvUGF0Y2gtPm51bV9zaW5rcyAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHN1YlBhdGNoLnNpbmtzWzBdID0gYXVkaW9QYXRjaC0+c2lua3NbMF07Ci0gICAgICAgIHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NpbmtzICE9IDApIHsKKyAgICAgICAgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1QbGF5YmFjay50aHJlYWQoKSkuYWRkU2luayhtQXVkaW9QYXRjaC5zaW5rc1swXSkucGF0Y2goKSwKKyAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlUHRyKCkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAogICAgIC8vIHVzZSBhIHBzZXVkbyBMQ00gYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lY291bnQKLSAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBtUGxheWJhY2sudGhyZWFkKCktPmZyYW1lQ291bnQoKTsKICAgICBpbnQgcGxheWJhY2tTaGlmdCA9IF9fYnVpbHRpbl9jdHoocGxheWJhY2tGcmFtZUNvdW50KTsKLSAgICBzaXplX3QgcmVjb3JkRnJhbWVjb3VudCA9IHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCk7Ci0gICAgaW50IHNoaWZ0ID0gX19idWlsdGluX2N0eihyZWNvcmRGcmFtZWNvdW50KTsKKyAgICBzaXplX3QgcmVjb3JkRnJhbWVDb3VudCA9IG1SZWNvcmQudGhyZWFkKCktPmZyYW1lQ291bnQoKTsKKyAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lQ291bnQpOwogICAgIGlmIChwbGF5YmFja1NoaWZ0IDwgc2hpZnQpIHsKICAgICAgICAgc2hpZnQgPSBwbGF5YmFja1NoaWZ0OwogICAgIH0KLSAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZWNvdW50KSA+PiBzaGlmdDsKLSAgICBBTE9HVigiY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZWNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCi0gICAgICAgICAgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZWNvdW50LCBmcmFtZUNvdW50KTsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZUNvdW50KSA+PiBzaGlmdDsKKyAgICBBTE9HVigiJXMoKSBwbGF5ZnJhbWVDb3VudCAlenUgcmVjb3JkRnJhbWVDb3VudCAlenUgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVDb3VudCwgZnJhbWVDb3VudCk7CiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHJlY29yZCB0cmFjayB0byBjYXB0dXJlIGZyb20gcmVjb3JkIHRocmVhZAotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbENvdW50KCk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsTWFzaygpOwotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBtUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxNYXNrKCk7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1QbGF5YmFjay50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1QbGF5YmFjay50aHJlYWQoKS0+Zm9ybWF0KCk7CiAKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwKKyAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCA9IG1SZWNvcmQudGhyZWFkKCktPmZvcm1hdCgpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShpbnB1dEZvcm1hdCkpIHsKKyAgICAgICAgLy8gVGhlIHBsYXliYWNrVGhyZWFkIGZvcm1hdCB3aWxsIHNheSBQQ00gZm9yIElFQzYxOTM3IHBhY2tldGl6ZWQgc3RyZWFtLgorICAgICAgICAvLyBVc2UgcmVjb3JkVGhyZWFkIGZvcm1hdC4KKyAgICAgICAgZm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgaW5wdXRGbGFncyA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmZsYWdzLmlucHV0IDogQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGlmIChzYW1wbGVSYXRlID09IG1SZWNvcmQudGhyZWFkKCktPnNhbXBsZVJhdGUoKSAmJgorICAgICAgICAgICAgaW5DaGFubmVsTWFzayA9PSBtUmVjb3JkLnRocmVhZCgpLT5jaGFubmVsTWFzaygpICYmCisgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLT5mYXN0VHJhY2tBdmFpbGFibGUoKSAmJgorICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS0+aGFzRmFzdENhcHR1cmUoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBmYXN0IHRyYWNrIGlmIHRoZSByZWNvcmQgdGhyZWFkIGhhcyBmYXN0IGNhcHR1cmUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgLy8gT25seSBlbmFibGUgZmFzdCBtb2RlIHdoZW4gdGhlcmUgaXMgbm8gcmVzYW1wbGUgbmVlZGVkLgorICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChpbnB1dEZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGYXN0IG1vZGUgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGNhc2UuCisgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGlucHV0RmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9CisgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gdGVtcFJlY29yZFRyYWNrID0gbmV3IChzdGQ6Om5vdGhyb3cpIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVJlY29yZC5jaGVja1RyYWNrKHRlbXBSZWNvcmRUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+YWRkUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1BdWRpb1BhdGNoLnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgbUF1ZGlvUGF0Y2guc2lua3NbMF0uZmxhZ3Mub3V0cHV0IDogQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUEFUQ0g7CisgICAgaWYgKG1BdWRpb1BhdGNoLm51bV9zb3VyY2VzID09IDIgJiYgbUF1ZGlvUGF0Y2guc291cmNlc1sxXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgLy8gInJldXNlIG9uZSBleGlzdGluZyBvdXRwdXQgbWl4IiBjYXNlCisgICAgICAgIHN0cmVhbVR5cGUgPSBtQXVkaW9QYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW07CisgICAgfQorICAgIGlmIChtUGxheWJhY2sudGhyZWFkKCktPmhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGZhc3QgdHJhY2sgaWYgdGhlIHBsYXliYWNrIHRocmVhZCBoYXMgZmFzdCBtaXhlciB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICBvdXRwdXRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dEZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgfQogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1BhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0sCisgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IHRlbXBQYXRjaFRyYWNrID0gbmV3IChzdGQ6Om5vdGhyb3cpIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay50aHJlYWQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVBsYXliYWNrLmNoZWNrVHJhY2sodGVtcFBhdGNoVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwogCiAgICAgLy8gdGllIHBsYXliYWNrIGFuZCByZWNvcmQgdHJhY2tzIHRvZ2V0aGVyCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hUcmFjay5nZXQoKSk7Ci0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFJlY29yZC5nZXQoKSk7CisgICAgbVJlY29yZC5zZXRUcmFja0FuZFBlZXIodGVtcFJlY29yZFRyYWNrLCB0ZW1wUGF0Y2hUcmFjay5nZXQoKSk7CisgICAgbVBsYXliYWNrLnNldFRyYWNrQW5kUGVlcih0ZW1wUGF0Y2hUcmFjaywgdGVtcFJlY29yZFRyYWNrLmdldCgpKTsKIAogICAgIC8vIHN0YXJ0IGNhcHR1cmUgYW5kIHBsYXliYWNrCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgQVVESU9fU0VTU0lPTl9OT05FKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0YXJ0KCk7CisgICAgbVJlY29yZC50cmFjaygpLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOworICAgIG1QbGF5YmFjay50cmFjaygpLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuOworICAgIEFMT0dWKCIlcygpIG1SZWNvcmQuaGFuZGxlICVkIG1QbGF5YmFjay5oYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7CisgICAgbVJlY29yZC5zdG9wVHJhY2soKTsKKyAgICBtUGxheWJhY2suc3RvcFRyYWNrKCk7CisgICAgbVJlY29yZC5jbG9zZUNvbm5lY3Rpb25zKHBhbmVsKTsKKyAgICBtUGxheWJhY2suY2xvc2VDb25uZWN0aW9ucyhwYW5lbCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmdldExhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcykgY29uc3QKK3sKKyAgICBpZiAoIWlzU29mdHdhcmUoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byByZWNvcmRUcmFjayA9IG1SZWNvcmQuY29uc3RfdHJhY2soKTsKKyAgICBpZiAocmVjb3JkVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgYXV0byBwbGF5YmFja1RyYWNrID0gbVBsYXliYWNrLmNvbnN0X3RyYWNrKCk7CisgICAgaWYgKHBsYXliYWNrVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgLy8gTGF0ZW5jeSBpbmZvcm1hdGlvbiBmb3IgdHJhY2tzIG1heSBiZSBjYWxsZWQgd2l0aG91dCBvYnRhaW5pbmcKKyAgICAvLyB0aGUgdW5kZXJseWluZyB0aHJlYWQgbG9jay4KKyAgICAvLworICAgIC8vIFdlIHVzZSByZWNvcmQgc2VydmVyIGxhdGVuY3kgKyBwbGF5YmFjayB0cmFjayBsYXRlbmN5IChnZW5lcmFsbHkgc21hbGxlciB0aGFuIHRoZQorICAgIC8vIHJldmVyc2UgZHVlIHRvIGludGVybmFsIGJpYXNlcykuCisgICAgLy8KKyAgICAvLyBUT0RPOiBpcyB0aGlzIHN0YWJsZSBlbm91Z2g/IENvbnNpZGVyIGEgUGF0Y2hUcmFjayBzeW5jaHJvbml6ZWQgdmVyc2lvbiBvZiB0aGlzLgorCisgICAgLy8gRm9yIFBDTSB0cmFja3MgZ2V0IHNlcnZlciBsYXRlbmN5LgorICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKHJlY29yZFRyYWNrLT5mb3JtYXQoKSkpIHsKKyAgICAgICAgZG91YmxlIHJlY29yZFNlcnZlckxhdGVuY3lNcywgcGxheWJhY2tUcmFja0xhdGVuY3lNczsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5nZXRTZXJ2ZXJMYXRlbmN5TXMoJnJlY29yZFNlcnZlckxhdGVuY3lNcykgPT0gT0sKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RyYWNrLT5nZXRUcmFja0xhdGVuY3lNcygmcGxheWJhY2tUcmFja0xhdGVuY3lNcykgPT0gT0spIHsKKyAgICAgICAgICAgICpsYXRlbmN5TXMgPSByZWNvcmRTZXJ2ZXJMYXRlbmN5TXMgKyBwbGF5YmFja1RyYWNrTGF0ZW5jeU1zOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgJWQgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlLCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIC8vIFNlZSBpZiBrZXJuZWwgbGF0ZW5jaWVzIGFyZSBhdmFpbGFibGUuCisgICAgLy8gSWYgc28sIGRvIGEgZnJhbWUgZGlmZiBhbmQgdGltZSBkaWZmZXJlbmNlIGNvbXB1dGF0aW9uIHRvIGVzdGltYXRlCisgICAgLy8gdGhlIHRvdGFsIHBhdGNoIGxhdGVuY3kuIFRoaXMgcmVxdWlyZXMgdGhhdCBmcmFtZSBjb3VudHMgYXJlIHJlcG9ydGVkIGJ5IHRoZQorICAgIC8vIEhBTCBhcmUgbWF0Y2hlZCBwcm9wZXJseSBpbiB0aGUgY2FzZSBvZiByZWNvcmQgb3ZlcnJ1bnMgYW5kIHBsYXliYWNrIHVuZGVycnVucy4KKyAgICBUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OkZyYW1lVGltZSByZWNvcmRGVHt9LCBwbGF5RlR7fTsKKyAgICByZWNvcmRUcmFjay0+Z2V0S2VybmVsRnJhbWVUaW1lKCZyZWNvcmRGVCk7CisgICAgcGxheWJhY2tUcmFjay0+Z2V0S2VybmVsRnJhbWVUaW1lKCZwbGF5RlQpOworICAgIGlmIChyZWNvcmRGVC50aW1lTnMgPiAwICYmIHBsYXlGVC50aW1lTnMgPiAwKSB7CisgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEaWZmID0gcmVjb3JkRlQuZnJhbWVzIC0gcGxheUZULmZyYW1lczsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZk5zID0gcmVjb3JkRlQudGltZU5zIC0gcGxheUZULnRpbWVOczsKIAotICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RvcCgpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdG9wKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOwotICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5kZWxldGVQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKyAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcGF0Y2ggdHJhY2sgYW5kIHBhdGNoIHJlY29yZCBoYXZlIGEgbGFyZ2UgdGltZSBkaXNwYXJpdHkgYmVjYXVzZQorICAgICAgICAvLyBvbmUgdGhyZWFkIHJ1bnMgYnV0IGFub3RoZXIgaXMgc3RvcHBlZC4gIFdlIGFyYml0cmFyaWx5IGNob29zZSB0aGUgbWF4aW11bSB0aW1lc3RhbXAKKyAgICAgICAgLy8gdGltZSBkaWZmZXJlbmNlIGJhc2VkIG9uIGhvdyBvZnRlbiB3ZSBleHBlY3QgdGhlIHRpbWVzdGFtcHMgdG8gdXBkYXRlIGluIG5vcm1hbCBvcGVyYXRpb24KKyAgICAgICAgLy8gKHR5cGljYWwgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiA1MCBtcykuCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoZSB0aW1lc3RhbXBzIGFyZW4ndCBzYW1wbGVkIGNsb3NlIGVub3VnaCwgdGhlIHBhdGNoIGxhdGVuY3kgaXMgbm90CisgICAgICAgIC8vIGNvbnNpZGVyZWQgdmFsaWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIGJhc2VkIG9uIG1vcmUgZXhwZXJpbWVudHMuCisgICAgICAgIGNvbnN0ZXhwciBpbnQ2NF90IG1heFZhbGlkVGltZURpZmZOcyA9IDIwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgaWYgKHN0ZDo6YWJzKHRpbWVEaWZmTnMpIDwgbWF4VmFsaWRUaW1lRGlmZk5zKSB7CisgICAgICAgICAgICAqbGF0ZW5jeU1zID0gZnJhbWVEaWZmICogMWUzIC8gcmVjb3JkVHJhY2stPnNhbXBsZVJhdGUoKQorICAgICAgICAgICAgICAgICAgIC0gdGltZURpZmZOcyAqIDFlLTY7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZUlucHV0SW50ZXJuYWxfbChwYXRjaC0+bVJlY29yZFRocmVhZCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgbnVtIHNvdXJjZXMgPT0gMiB3ZSBhcmUgcmV1c2luZyBhbiBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgc28gd2UgZG8gbm90IGNsb3NlIGl0Ci0gICAgICAgIGlmIChwYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgIT0gMikgewotICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZU91dHB1dEludGVybmFsX2wocGF0Y2gtPm1QbGF5YmFja1RocmVhZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2suY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgfQogCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitTdHJpbmc4IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmR1bXAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbXlIYW5kbGUpIGNvbnN0Cit7CisgICAgLy8gVE9ETzogQ29uc2lkZXIgdGFibGUgZHVtcCBmb3JtIGZvciBwYXRjaGVzLCBqdXN0IGxpa2UgdHJhY2tzLgorICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJQYXRjaCAlZDogdGhyZWFkICVwID0+IHRocmVhZCAlcCIsCisgICAgICAgICAgICBteUhhbmRsZSwgbVJlY29yZC5jb25zdF90aHJlYWQoKS5nZXQoKSwgbVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLmdldCgpKTsKKworICAgIC8vIGFkZCBsYXRlbmN5IGlmIGl0IGV4aXN0cworICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgaWYgKGdldExhdGVuY3lNcygmbGF0ZW5jeU1zKSA9PSBPSykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGxhdGVuY3k6ICUuMmxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKLSAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2ggaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19mdW5jX18sIGhhbmRsZSk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgc2l6ZV90IGluZGV4OwogCi0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gbVBhdGNoZXMuc2l6ZSgpKSB7CisgICAgYXV0byBpdGVyID0gbVBhdGNoZXMuZmluZChoYW5kbGUpOworICAgIGlmIChpdGVyID09IG1QYXRjaGVzLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07Ci0gICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOworICAgIFBhdGNoICZyZW1vdmVkUGF0Y2ggPSBpdGVyLT5zZWNvbmQ7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZwYXRjaCA9IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaDsKIAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaDsKLQotICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgeworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAmc3JjID0gcGF0Y2guc291cmNlc1swXTsKKyAgICBzd2l0Y2ggKHNyYy50eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogewotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gZmluZEh3RGV2aWNlQnlNb2R1bGUoc3JjLmV4dC5kZXZpY2UuaHdfbW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChod0RldmljZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjLmV4dC5kZXZpY2UuaHdfbW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAotICAgICAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7CisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gcGF0Y2guc2lua3NbMF0uZXh0Lm1peC5oYW5kbGU7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwgX19mdW5jX18sIGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGZpbmRId0RldmljZUJ5TW9kdWxlKHNyYy5leHQubWl4Lmh3X21vZHVsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyYy5leHQubWl4Lmh3X21vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHNyYy5leHQubWl4LmhhbmRsZTsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwgX19mdW5jX18sIGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7CisgICAgbVBhdGNoZXMuZXJhc2UoaXRlcik7CisgICAgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoaGFuZGxlKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi0KIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcyIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0CiB7Ci0gICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZyIpOwotCi0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIGlmIChtb2R1bGUuc2Vjb25kLnN0cmVhbXMuY291bnQoc3RyZWFtKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRjaEhhbmRsZSA6IG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHBhdGNoX2l0ZXIgPSBtUGF0Y2hlcy5maW5kKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hfaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRjaCAmcGF0Y2ggPSBwYXRjaF9pdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoZXMtPmVtcGxhY2VfYmFjaygqdGhpcywgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gubVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLT5pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLm1SZWNvcmQuY29uc3RfdGhyZWFkKCktPmlkKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTdGFsZSBwYXRjaCBoYW5kbGUgaW4gdGhlIGNhY2hlOiAlZCIsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CisgICAgLy8gVGhlIHN0cmVhbSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBvZiBpbnNlcnRlZCBtb2R1bGVzLgorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CiAKLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlOwotICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGU7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtT3BlbmVkKAorICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCit7CisgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgbUluc2VydGVkTW9kdWxlc1thdWRpb0h3RGV2aWNlLT5oYW5kbGUoKV0uc3RyZWFtcy5pbnNlcnQoc3RyZWFtKTsKICAgICB9Cit9CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCit7CisgICAgZm9yIChhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIG1vZHVsZS5zZWNvbmQuc3RyZWFtcy5lcmFzZShzdHJlYW0pOworICAgIH0KK30KKworQXVkaW9Id0RldmljZSogQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpCit7CisgICAgaWYgKG1vZHVsZSA9PSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHJldHVybiBudWxscHRyOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic2V0QXVkaW9Qb3J0Q29uZmlnKCkgYmFkIGh3IG1vZHVsZSAlZCIsIG1vZHVsZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dXKCIlcygpIGJhZCBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKK30KKworc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpCit7CisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUobW9kdWxlKTsKKyAgICByZXR1cm4gYXVkaW9Id0RldmljZSA/IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCkgOiBudWxscHRyOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6YWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgbUluc2VydGVkTW9kdWxlc1ttb2R1bGVdLnN3X3BhdGNoZXMuaW5zZXJ0KGhhbmRsZSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIGZvciAoYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMuZXJhc2UoaGFuZGxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHBhdGNoUGFuZWxEdW1wOworICAgIGNvbnN0IGNoYXIgKmluZGVudCA9ICIgICI7CisKKyAgICAvLyBPbmx5IGR1bXAgc29mdHdhcmUgcGF0Y2hlcy4KKyAgICBib29sIGhlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlclByaW50ZWQpIHsKKyAgICAgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5Tb2Z0d2FyZSBwYXRjaGVzOlxuIjsKKyAgICAgICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBpdGVyLnNlY29uZC5kdW1wKGl0ZXIuZmlyc3QpLnN0cmluZygpKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBpZiAoIW1vZHVsZS5zZWNvbmQuc3RyZWFtcy5lbXB0eSgpIHx8ICFtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKCFoZWFkZXJQcmludGVkKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAgKz0gIlxuVHJhY2tlZCBpbnNlcnRlZCBtb2R1bGVzOlxuIjsKKyAgICAgICAgICAgICAgICBoZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzggbW9kdWxlRHVtcCA9IFN0cmluZzg6OmZvcm1hdCgiTW9kdWxlICVkOiBJL08gaGFuZGxlczogIiwgbW9kdWxlLmZpcnN0KTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbW9kdWxlLnNlY29uZC5zdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmRGb3JtYXQoIiVkICIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZCgiOyBTVyBQYXRjaGVzOiAiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2ggOiBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZEZvcm1hdCgiJWQgIiwgcGF0Y2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAuYXBwZW5kRm9ybWF0KCIlcyVzXG4iLCBpbmRlbnQsIG1vZHVsZUR1bXAuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFwYXRjaFBhbmVsRHVtcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgd3JpdGUoZmQsIHBhdGNoUGFuZWxEdW1wLnN0cmluZygpLCBwYXRjaFBhbmVsRHVtcC5zaXplKCkpOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKaW5kZXggZDM3YzBkMy4uMmQ5YmQ4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCkBAIC0xOSwxMyArMTksMzMgQEAKICAgICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBmcm9tIEF1ZGlvRmxpbmdlci5oCiAjZW5kaWYKIAotY2xhc3MgUGF0Y2hQYW5lbCA6IHB1YmxpYyBSZWZCYXNlIHsKKworLy8gUGF0Y2hQYW5lbCBpcyBjb25jZWFsZWQgd2l0aGluIEF1ZGlvRmxpbmdlciwgdGhlaXIgbGlmZXRpbWVzIGFyZSB0aGUgc2FtZS4KK2NsYXNzIFBhdGNoUGFuZWwgewogcHVibGljOgorICAgIGNsYXNzIFNvZnR3YXJlUGF0Y2ggeworICAgICAgcHVibGljOgorICAgICAgICBTb2Z0d2FyZVBhdGNoKGNvbnN0IFBhdGNoUGFuZWwgJnBhdGNoUGFuZWwsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHBsYXliYWNrVGhyZWFkSGFuZGxlLCBhdWRpb19pb19oYW5kbGVfdCByZWNvcmRUaHJlYWRIYW5kbGUpCisgICAgICAgICAgICAgICAgOiBtUGF0Y2hQYW5lbChwYXRjaFBhbmVsKSwgbVBhdGNoSGFuZGxlKHBhdGNoSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZEhhbmRsZShwbGF5YmFja1RocmVhZEhhbmRsZSksCisgICAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkSGFuZGxlKHJlY29yZFRocmVhZEhhbmRsZSkge30KKyAgICAgICAgU29mdHdhcmVQYXRjaChjb25zdCBTb2Z0d2FyZVBhdGNoJikgPSBkZWZhdWx0OworICAgICAgICBTb2Z0d2FyZVBhdGNoJiBvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVQYXRjaCYpID0gZGVmYXVsdDsKIAotICAgIGNsYXNzIFBhdGNoOworICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCB1bmRlciBBdWRpb0ZsaW5nZXI6Om1Mb2NrCisgICAgICAgIHN0YXR1c190IGdldExhdGVuY3lNc19sKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldFBsYXliYWNrVGhyZWFkSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBsYXliYWNrVGhyZWFkSGFuZGxlOyB9OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRSZWNvcmRUaHJlYWRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkVGhyZWFkSGFuZGxlOyB9OworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgUGF0Y2hQYW5lbCAmbVBhdGNoUGFuZWw7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVBsYXliYWNrVGhyZWFkSGFuZGxlOworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtUmVjb3JkVGhyZWFkSGFuZGxlOworICAgIH07CiAKLSAgICBleHBsaWNpdCBQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcik7Ci0gICAgdmlydHVhbCB+UGF0Y2hQYW5lbCgpOworICAgIGV4cGxpY2l0IFBhdGNoUGFuZWwoQXVkaW9GbGluZ2VyKiBhdWRpb0ZsaW5nZXIpIDogbUF1ZGlvRmxpbmdlcigqYXVkaW9GbGluZ2VyKSB7fQogCiAgICAgLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTQ1LDQ2ICs2NSwxNDQgQEAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyk7CiAKLSAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAvLyBSZXRyaWV2ZXMgYWxsIGN1cnJlbnRseSBlc3RyYWJsaXNoZWQgc29mdHdhcmUgcGF0Y2hlcyBmb3IgYSBzdHJlYW0KKyAgICAvLyBvcGVuZWQgb24gYW4gaW50ZXJtZWRpYXRlIG1vZHVsZS4KKyAgICBzdGF0dXNfdCBnZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNvZnR3YXJlUGF0Y2g+ICpwYXRjaGVzKSBjb25zdDsKIAotICAgIHN0YXR1c190IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKTsKLSAgICB2b2lkIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpOworICAgIC8vIE5vdGlmaWVzIHBhdGNoIHBhbmVsIGFib3V0IGFsbCBvcGVuZWQgYW5kIGNsb3NlZCBzdHJlYW1zLgorICAgIHZvaWQgbm90aWZ5U3RyZWFtT3BlbmVkKEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSk7CisgICAgdm9pZCBub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OworCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRocmVhZFR5cGUsIHR5cGVuYW1lIFRyYWNrVHlwZT4KKyAgICBjbGFzcyBFbmRwb2ludCB7CisgICAgcHVibGljOgorICAgICAgICBFbmRwb2ludCgpID0gZGVmYXVsdDsKKyAgICAgICAgRW5kcG9pbnQoRW5kcG9pbnQmJiBvdGhlcikgeyAqdGhpcyA9IHN0ZDo6bW92ZShvdGhlcik7IH0KKyAgICAgICAgRW5kcG9pbnQmIG9wZXJhdG9yPShFbmRwb2ludCYmIG90aGVyKSB7CisgICAgICAgICAgICBBTE9HRV9JRihtSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAiQSBub24gZW1wdHkgUGF0Y2ggRW5kcG9pbnQgbGVha2VkLCBoYW5kbGUgJWQiLCBtSGFuZGxlKTsKKyAgICAgICAgICAgICp0aGlzID0gb3RoZXI7CisgICAgICAgICAgICBvdGhlci5tSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBjaGVja1RyYWNrKFRyYWNrVHlwZSAqdHJhY2tPck51bGwpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICh0cmFja09yTnVsbCA9PSBudWxscHRyKSByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrT3JOdWxsLT5pbml0Q2hlY2soKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisgICAgICAgIHNwPFRocmVhZFR5cGU+IHRocmVhZCgpIHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8VHJhY2tUeXBlPiB0cmFjaygpIHsgcmV0dXJuIG1UcmFjazsgfQorICAgICAgICBzcDxjb25zdCBUaHJlYWRUeXBlPiBjb25zdF90aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CisgICAgICAgIHNwPGNvbnN0IFRyYWNrVHlwZT4gY29uc3RfdHJhY2soKSBjb25zdCB7IHJldHVybiBtVHJhY2s7IH0KKworICAgICAgICB2b2lkIGNsb3NlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpIHsKKyAgICAgICAgICAgIGlmIChtSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgcGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKG1IYW5kbGUpOworICAgICAgICAgICAgICAgIG1IYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVRocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhtVHJhY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNsb3NlVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmVsLT5tQXVkaW9GbGluZ2VyLmNsb3NlVGhyZWFkSW50ZXJuYWxfbChtVGhyZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QqIGhhbmRsZVB0cigpIHsgcmV0dXJuICZtSGFuZGxlOyB9CisgICAgICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZFR5cGU+JiB0aHJlYWQsIGJvb2wgY2xvc2VUaHJlYWQgPSB0cnVlKSB7CisgICAgICAgICAgICBtVGhyZWFkID0gdGhyZWFkOworICAgICAgICAgICAgbUNsb3NlVGhyZWFkID0gY2xvc2VUaHJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRUcmFja0FuZFBlZXIoY29uc3Qgc3A8VHJhY2tUeXBlPiYgdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZEJhc2U6OlBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcGVlcikgeworICAgICAgICAgICAgbVRyYWNrID0gdHJhY2s7CisgICAgICAgICAgICBtVGhyZWFkLT5hZGRQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICBtVHJhY2stPnNldFBlZXJQcm94eShwZWVyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHN0b3BUcmFjaygpIHsgaWYgKG1UcmFjaykgbVRyYWNrLT5zdG9wKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEVuZHBvaW50KGNvbnN0IEVuZHBvaW50JikgPSBkZWZhdWx0OworICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KGNvbnN0IEVuZHBvaW50JikgPSBkZWZhdWx0OworCisgICAgICAgIHNwPFRocmVhZFR5cGU+IG1UaHJlYWQ7CisgICAgICAgIGJvb2wgbUNsb3NlVGhyZWFkID0gdHJ1ZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzcDxUcmFja1R5cGU+IG1UcmFjazsKKyAgICB9OwogCiAgICAgY2xhc3MgUGF0Y2ggewogICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCkgOgotICAgICAgICAgICAgbUF1ZGlvUGF0Y2goKnBhdGNoKSwgbUhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCi0gICAgICAgICAgICBtSGFsSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbVJlY29yZFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7fQotICAgICAgICB+UGF0Y2goKSB7fQorICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoKSA6IG1BdWRpb1BhdGNoKHBhdGNoKSB7fQorICAgICAgICB+UGF0Y2goKTsKKyAgICAgICAgUGF0Y2goY29uc3QgUGF0Y2gmKSA9IGRlbGV0ZTsKKyAgICAgICAgUGF0Y2goUGF0Y2gmJikgPSBkZWZhdWx0OworICAgICAgICBQYXRjaCYgb3BlcmF0b3I9KGNvbnN0IFBhdGNoJikgPSBkZWxldGU7CisgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oUGF0Y2gmJikgPSBkZWZhdWx0OwogCisgICAgICAgIHN0YXR1c190IGNyZWF0ZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKTsKKyAgICAgICAgdm9pZCBjbGVhckNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKTsKKyAgICAgICAgYm9vbCBpc1NvZnR3YXJlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1SZWNvcmQuaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLmhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOyB9CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGF0ZW5jeSBvZiB0aGUgcGF0Y2ggKGZyb20gcmVjb3JkIHRvIHBsYXliYWNrKS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdDsKKworICAgICAgICBTdHJpbmc4IGR1bXAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbXlIYW5kbGUpIGNvbnN0OworCisgICAgICAgIC8vIE5vdGUgdGhhdCBhdWRpb19wYXRjaDo6aWQgaXMgb25seSB1bmlxdWUgd2l0aGluIGEgSEFMIG1vZHVsZQogICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICAgICAgICAgIG1BdWRpb1BhdGNoOwotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYW5kbGU7CiAgICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gSEFMIHBhdGNoIGhhbmRsZSBwcmVzZW50IG9ubHkgd2hlbiB0aGUgYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbEhhbmRsZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIC8vIGJlbG93IG1lbWJlcnMgYXJlIHVzZWQgYnkgYSBzb2Z0d2FyZSBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIGEgc291cmNlIGRldmljZSBmcm9tIGEKICAgICAgICAgLy8gZ2l2ZW4gYXVkaW8gSFcgbW9kdWxlIHRvIGEgc2luayBkZXZpY2Ugb24gYW4gb3RoZXIgYXVkaW8gSFcgbW9kdWxlLgotICAgICAgICAvLyBwbGF5YmFjayB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIGlmCi0gICAgICAgIC8vIG5vIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBjYW4gYmUgdXNlZCBieSB0aGUgc29mdHdhcmUgcGF0Y2gKLSAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWQ7Ci0gICAgICAgIC8vIGF1ZGlvIHRyYWNrIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gIG1QYXRjaFRyYWNrOwotICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlQXVkaW9QYXRjaCgpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+ICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWQ7Ci0gICAgICAgIC8vIGF1ZGlvIHJlY29yZCBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gICBtUGF0Y2hSZWNvcmQ7Ci0gICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQuCi0gICAgICAgIC8vIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1SZWNvcmRQYXRjaEhhbmRsZTsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGU7Ci0KKyAgICAgICAgLy8gdGhlIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY3JlYXRlQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJDb25uZWN0aW9ucygpCisgICAgICAgIC8vIHBsYXliYWNrIHRocmVhZCBpcyBjcmVhdGVkIGlmIG5vIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBjYW4gYmUgdXNlZAorICAgICAgICAvLyBjb25uZWN0cyBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCisgICAgICAgIEVuZHBvaW50PFBsYXliYWNrVGhyZWFkLCBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gbVBsYXliYWNrOworICAgICAgICAvLyBjb25uZWN0cyBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQKKyAgICAgICAgRW5kcG9pbnQ8UmVjb3JkVGhyZWFkLCBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiBtUmVjb3JkOwogICAgIH07CiAKLXByaXZhdGU6Ci0gICAgY29uc3Qgd3A8QXVkaW9GbGluZ2VyPiAgICAgIG1BdWRpb0ZsaW5nZXI7Ci0gICAgU29ydGVkVmVjdG9yIDxQYXRjaCAqPiAgICAgIG1QYXRjaGVzOworICAgIEF1ZGlvSHdEZXZpY2UqIGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSk7CisgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBmaW5kSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKKyAgICB2b2lkIGFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcygKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgdm9pZCByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcyhhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgQXVkaW9GbGluZ2VyICZtQXVkaW9GbGluZ2VyOworICAgIHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaD4gbVBhdGNoZXM7CisKKyAgICAvLyBUaGlzIG1hcCBhbGxvd3MgZ29pbmcgZnJvbSBhIHRocmVhZCB0byAiZG93bnN0cmVhbSIgc29mdHdhcmUgcGF0Y2hlcworICAgIC8vIHdoZW4gYSBwcm9jZXNzaW5nIG1vZHVsZSBpbnNlcnRlZCBpbiBiZXR3ZWVuLiBFeGFtcGxlOgorICAgIC8vCisgICAgLy8gIGZyb20gbWFwIHZhbHVlLnN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwIGtleQorICAgIC8vICBbTWl4ZXIgdGhyZWFkXSAtLT4gW1ZpcnR1YWwgb3V0cHV0IGRldmljZV0gLS0+IFtQcm9jZXNzaW5nIG1vZHVsZV0gLS0tXAorICAgIC8vICAgICAgIFtIYXJ3YXJlIG1vZHVsZV0gPC0tIFtQaHlzaWNhbCBvdXRwdXQgZGV2aWNlXSA8LS0gW1MvVyBQYXRjaF0gPC0tLworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFwIHZhbHVlLnN3X3BhdGNoZXMKKyAgICAvLworICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBtaXhlciB0aHJlYWQgdG8gbG9vayB1cCB0aGUgdGhyZWFkcyBvZiB0aGUgc29mdHdhcmUgcGF0Y2gKKyAgICAvLyBmb3IgcHJvcGFnYXRpbmcgdGltaW5nIGluZm8sIHBhcmFtZXRlcnMsIGV0Yy4KKyAgICAvLworICAgIC8vIFRoZSBjdXJyZW50IGFzc3VtcHRpb25zIGFyZToKKyAgICAvLyAgIDEpIFRoZSBwcm9jZXNzaW5nIG1vZHVsZSBhY3RzIGFzIGEgbWl4ZXIgd2l0aCBzZXZlcmFsIG91dHB1dHMgd2hpY2gKKyAgICAvLyAgICAgIHJlcHJlc2VudCBkaWZmZXJlbnRseSBkb3dubWl4ZWQgYW5kIC8gb3IgZW5jb2RlZCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQorICAgIC8vICAgICAgbWl4ZWQgc3RyZWFtLiBUaGVyZSBpcyBubyAxOjEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGUgaW5wdXQgc3RyZWFtcworICAgIC8vICAgICAgYW5kIHRoZSBzb2Z0d2FyZSBwYXRjaGVzLCBidXQgcmF0aGVyIGEgTjpOIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4KKyAgICAvLyAgICAgIGEgZ3JvdXAgb2Ygc3RyZWFtcyBhbmQgYSBncm91cCBvZiBwYXRjaGVzLgorICAgIC8vICAgMikgVGhlcmUgYXJlIG9ubHkgYSBjb3VwbGUgb2YgaW5zZXJ0ZWQgcHJvY2Vzc2luZyBtb2R1bGVzIGluIHRoZSBzeXN0ZW0sCisgICAgLy8gICAgICBzbyB3aGVuIGxvb2tpbmcgZm9yIGEgc3RyZWFtIG9yIHBhdGNoIGhhbmRsZSB3ZSBjYW4gaXRlcmF0ZSBvdmVyCisgICAgLy8gICAgICBhbGwgbW9kdWxlcy4KKyAgICBzdHJ1Y3QgTW9kdWxlQ29ubmVjdGlvbnMgeworICAgICAgICBzdGQ6OnNldDxhdWRpb19pb19oYW5kbGVfdD4gc3RyZWFtczsKKyAgICAgICAgc3RkOjpzZXQ8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+IHN3X3BhdGNoZXM7CisgICAgfTsKKyAgICBzdGQ6Om1hcDxhdWRpb19tb2R1bGVfaGFuZGxlX3QsIE1vZHVsZUNvbm5lY3Rpb25zPiBtSW5zZXJ0ZWRNb2R1bGVzOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggYTc4YmU5OS4uZDlmNTcwZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCkBAIC01MSwxMiArNTEsNiBAQAogCiAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgZGVzdHJveSgpOwotICAgICAgICAgICAgaW50ICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXROYW1lKGludCBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTmFtZSA+PSAwICYmIG5hbWUgPj0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyBib3RoIG9sZCBuYW1lICVkIGFuZCBuZXcgbmFtZSAlZCBhcmUgdmFsaWQiLCBfX2Z1bmNfXywgbU5hbWUsIG5hbWUpOwotICAgICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIH0KIAogICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogCkBAIC02NSwxMiArNTksMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTdGF0aWMoKSBjb25zdCB7IHJldHVybiAgbVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKICAgICAgICAgICAgIGludDMyX3QgICAgICphdXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtQXV4QnVmZmVyOyB9CkBAIC04Nyw2ICs4NCwxMCBAQAogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwOyB9CiAKKyAgICAgICAgICAgIGRvdWJsZSAgICAgIGJ1ZmZlckxhdGVuY3lNcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdGF0aWMoKSA/IDAuIDogVHJhY2tCYXNlOjpidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogLy8gaW1wbGVtZW50IHZvbHVtZSBoYW5kbGluZy4KICAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLApAQCAtMTExLDYgKzExMiwxNCBAQAogICAgIC8qKiBDb3B5IHRoZSB0cmFjayBtZXRhZGF0YSBpbiB0aGUgcHJvdmlkZWQgaXRlcmF0b3IuIFRocmVhZCBzYWZlLiAqLwogICAgIHZpcnR1YWwgdm9pZCAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0OwogCisgICAgICAgICAgICAvKiogUmV0dXJuIGhhcHRpYyBwbGF5YmFjayBvZiB0aGUgdHJhY2sgaXMgZW5hYmxlZCBvciBub3QsIHVzZWQgaW4gbWl4ZXIuICovCisgICAgICAgICAgICBib29sICAgIGdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7IH0KKyAgICAgICAgICAgIC8qKiBTZXQgaGFwdGljIHBsYXliYWNrIG9mIHRoZSB0cmFjayBpcyBlbmFibGVkIG9yIG5vdCwgc2hvdWxkIGJlCisgICAgICAgICAgICAgKiAgc2V0IGFmdGVyIHF1ZXJ5IG9yIGdldCBjYWxsYmFjayBmcm9tIHZpYnJhdG9yIHNlcnZpY2UgKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGJvb2wgaGFwdGljUGxheWJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogICAgIC8vIGZvciBudW1lcm91cwogICAgIGZyaWVuZCBjbGFzcyBQbGF5YmFja1RocmVhZDsKQEAgLTE0MCw3ICsxNDksNyBAQAogICAgIGJvb2wgaXNSZXN1bWVQZW5kaW5nKCk7CiAgICAgdm9pZCByZXN1bWVBY2soKTsKICAgICB2b2lkIHVwZGF0ZVRyYWNrRnJhbWVJbmZvKGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzaW5rRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOworICAgICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTE3MSw3ICsxODAsNiBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsKICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICptTWFpbkJ1ZmZlcjsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CkBAIC0xODgsNiArMTk2LDggQEAKIAogICAgIHNwPG1lZGlhOjpWb2x1bWVIYW5kbGVyPiAgbVZvbHVtZUhhbmRsZXI7IC8vIGhhbmRsZXMgbXVsdGlwbGUgVm9sdW1lU2hhcGVyIGNvbmZpZ3MgYW5kIG9wZXJhdGlvbnMKIAorICAgIGJvb2wgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgaGFwdGljIHBsYXliYWNrIGVuYWJsZWQgb3Igbm90CisKIHByaXZhdGU6CiAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgZm9yIGZhc3QgdHJhY2tzLCBhbmQgc2hvdWxkIGJlIGluIGEgc3ViY2xhc3MKICAgICBpbnQgICAgICAgICAgICAgICAgIG1GYXN0SW5kZXg7IC8vIGluZGV4IHdpdGhpbiBGYXN0TWl4ZXJTdGF0ZTo6bUZhc3RUcmFja3NbXTsKQEAgLTIzMyw3ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uID0gQVVESU9fU0VTU0lPTl9OT05FKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIGJvb2wgICAgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgYnVmZmVyUXVldWVFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJRdWV1ZS5zaXplKCkgPT0gMDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CiAgICAgY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KQEAgLTI0MSw2ICsyNTEsMTggQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3Qgb3ZlcnJpZGU7CiAgICAgLyoqIFNldCB0aGUgbWV0YWRhdGFzIG9mIHRoZSB1cHN0cmVhbSB0cmFja3MuIFRocmVhZCBzYWZlLiAqLwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWV0YWRhdGFzKGNvbnN0IFNvdXJjZU1ldGFkYXRhcyYgbWV0YWRhdGFzKTsKKyAgICAvKiogcmV0dXJucyBjbGllbnQgdGltZXN0YW1wIHRvIHRoZSB1cHN0cmVhbSBkdXBsaWNhdGluZyB0aHJlYWQuICovCisgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICBnZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgLSBrZXJuZWwgZGlmZmVyZW5jZSBpcyBub3QgdHJ1ZSBsYXRlbmN5IHdoZW4gZHJhaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gbVNlcnZlclByb3h5LT5pc0RyYWluZWQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG1DbGllbnRQcm94eS0+Z2V0VGltZXN0YW1wKCZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3MsIHRoZSB0aW1lc3RhbXAgTE9DQVRJT05fU0VSVkVSIGFuZCBMT0NBVElPTl9LRVJORUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIHdpbGwgYmUgcHJvcGVybHkgZmlsbGVkLiBJZiBnZXRUaW1lc3RhbXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuc3VjY2Vzc2Z1bCwgdGhlbiBhIGRlZmF1bHQgaW5pdGlhbGl6ZWQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdpdGggbVRpbWVOc1tdIGZpbGxlZCB3aXRoIC0xJ3MpIGlzIHJldHVybmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgICAgICAgICAgICBvYnRhaW5CdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCkBAIC0yNTcsNiArMjc5LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZTsKICAgICBEdXBsaWNhdGluZ1RocmVhZCogY29uc3QgICAgbVNvdXJjZVRocmVhZDsgLy8gZm9yIHdhaXRUaW1lTXMoKSBpbiB3cml0ZSgpCiAgICAgc3A8QXVkaW9UcmFja0NsaWVudFByb3h5PiAgIG1DbGllbnRQcm94eTsKKwogICAgIC8qKiBBdHRyaWJ1dGVzIG9mIHRoZSBzb3VyY2UgdHJhY2tzLgogICAgICAqCiAgICAgICogVGhpcyBtZW1iZXIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIG1UcmFja01ldGFkYXRhc011dGV4IHRha2VuLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IGZjMmRiYmIuLjg1ZjU0NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgIHNldE92ZXJmbG93KCkgeyBib29sIHRtcCA9IG1PdmVyZmxvdzsgbU92ZXJmbG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bXA7IH0KIAotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwpAQCAtNjMsMTIgKzYzLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKTsKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQogCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IGlmICghaXNQYXRjaFRyYWNrKCkpIG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgIHN0YXRpYyAgYm9vbCAgICAgICAgY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpID09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgIC8vIGZvciBtU3RhdGUKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI2N2VhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0KLS8qIFdoZW4gcGVyZm9ybWluZyBwZXJtaXNzaW9uIGNoZWNrcyB3ZSBkbyBub3QgdXNlIHBlcm1pc3Npb24gY2FjaGUgZm9yCi0gKiBydW50aW1lIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIGRhbmdlcm91cykgYXMgdGhleSBtYXkgY2hhbmdlIGF0Ci0gKiBydW50aW1lLiBBbGwgb3RoZXIgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgbm9ybWFsIGFuZCBkYW5nZXJvdXMpCi0gKiBjYW4gYmUgY2FjaGVkIGFzIHRoZXkgbmV2ZXIgY2hhbmdlLiBPZiBjb3Vyc2UgYWxsIHBlcm1pc3Npb24gY2hlY2tlZAotICogaGVyZSBhcmUgcGxhdGZvcm0gZGVmaW5lZC4KLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwotCi0vLyBOb3QgdmFsaWQgdW50aWwgaW5pdGlhbGl6ZWQgYnkgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdG9yLiAgSXQgd291bGQgaGF2ZSB0byBiZQotLy8gcmUtaW5pdGlhbGl6ZWQgaWYgdGhlIHByb2Nlc3MgY29udGFpbmluZyBBdWRpb0ZsaW5nZXIgc2VydmljZSBmb3JrcyAod2hpY2ggaXQgZG9lc24ndCkuCi0vLyBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gdmFsaWRhdGUgYmluZGVyIGludGVyZmFjZSBjYWxscyB3aXRoaW4gYXVkaW9zZXJ2ZXIKLS8vIChlLmcuIEF1ZGlvUG9saWN5TWFuYWdlciB0byBBdWRpb0ZsaW5nZXIpLgotcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLQotLy8gQSB0cnVzdGVkIGNhbGxpbmcgVUlEIG1heSBzcGVjaWZ5IHRoZSBjbGllbnQgVUlEIGFzIHBhcnQgb2YgYSBiaW5kZXIgaW50ZXJmYWNlIGNhbGwuCi0vLyBvdGhlcndpc2UgdGhlIGNhbGxpbmcgVUlEIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsaWVudCBVSUQuCi1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKSB7Ci0gICAgc3dpdGNoICh1aWQpIHsKLSAgICBjYXNlIEFJRF9NRURJQToKLSAgICBjYXNlIEFJRF9BVURJT1NFUlZFUjoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKLSAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOwotICAgIH0KLSAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgotICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCi0gICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCi0gICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucwotICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KLSAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKLSAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCi0gICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKLSAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKLSAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKLSAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZwotICAgIH0KLSAgICByZXR1cm4gcGFja2FnZXNbMF07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290KHVpZF90IHVpZCkgewotICAgIC8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgdW5mb3JrZWQgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgotICAgIHJldHVybiB1aWQgPT0gQUlEX1JPT1QgfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUiA7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybiB0cnVlOwotCi0gICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCi0gICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCi0gICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCi0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBpZiAoc3RhcnQpIHsKLSAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCi0gICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhcHBPcHMubm90ZU9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyBmYWxzZSk7Ci19Ci0KLWJvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gdHJ1ZSk7Ci19Ci0KLXZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKLSAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKLSAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCi0gICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuOwotCi0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAotICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7Ci0gICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOwotICAgIGFwcE9wcy5maW5pc2hPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpOwotfQotCi1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7Ci0KLSAgICBpZiAob2spIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7Ci0gICAgfQotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIGR1bXBBbGxvd2VkKCkgewotICAgIC8vIGRvbid0IG9wdGltaXplIGZvciBzYW1lIHBpZCwgc2luY2UgbWVkaWFzZXJ2ZXIgbmV2ZXIgZHVtcHMgaXRzZWxmCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7Ci0gICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQotICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1YWRhMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWV4dGVybiBwaWRfdCBnZXRwaWRfY2FjaGVkOwotYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCk7Ci1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLXZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Ci1ib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKLWJvb2wgZHVtcEFsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IGMyMzIwYmMuLmM2OTQxYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KQEAgLTM2LDYgKzM4LDcgQEAKIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KQEAgLTYyLDggKzY1LDggQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTcxLDcgKzc0LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAKQEAgLTIwMCw3ICsyMDMsNyBAQAogLy8gSW5pdGlhbGx5IHRoaXMgaGVhcCBpcyB1c2VkIHRvIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIGZvciAiZmFzdCIgQXVkaW9SZWNvcmQuCiAvLyBFdmVudHVhbGx5IGl0IHdpbGwgYmUgdGhlIHNpbmdsZSBidWZmZXIgdGhhdCBGYXN0Q2FwdHVyZSB3cml0ZXMgaW50byB2aWEgSEFMIHJlYWQoKSwKIC8vIGFuZCB0aGF0IGFsbCAiZmFzdCIgQXVkaW9SZWNvcmQgY2xpZW50cyByZWFkIGZyb20uICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNpemUgY2FuIGJlIHNtYWxsLgotc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweEQwMDA7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzMzLDkgKzMzNiw5IEBACiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiBwcml2YXRlOgogICAgIFRocmVhZENwdVVzYWdlIG1DcHVVc2FnZTsgICAgICAgICAgIC8vIGluc3RhbnRhbmVvdXMgdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtV2NTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucwogCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUh6U3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiBjeWNsZXMKIAogICAgIGludCBtQ3B1TnVtOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCdzIGN1cnJlbnQgQ1BVIG51bWJlcgogICAgIGludCBtQ3B1a0h6OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW5jeSBvZiB0aHJlYWQncyBjdXJyZW50IENQVSBpbiBrSHoKQEAgLTM2MSw3ICszNjQsNyBAQAogCiAgICAgLy8gcmVjb3JkIHNhbXBsZSBmb3Igd2FsbCBjbG9jayBzdGF0aXN0aWNzCiAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgIG1XY1N0YXRzLnNhbXBsZSh3Y05zKTsKKyAgICAgICAgbVdjU3RhdHMuYWRkKHdjTnMpOwogICAgIH0KIAogICAgIC8vIGdldCB0aGUgY3VycmVudCBDUFUgbnVtYmVyCkBAIC0zODAsMjYgKzM4MywyNiBAQAogCiAgICAgLy8gaWYgbm8gY2hhbmdlIGluIENQVSBudW1iZXIgb3IgZnJlcXVlbmN5LCB0aGVuIHJlY29yZCBzYW1wbGUgZm9yIGN5Y2xlIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQgJiYgbUNwdWtIeiA+IDApIHsKLSAgICAgICAgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKLSAgICAgICAgbUh6U3RhdHMuc2FtcGxlKGN5Y2xlcyk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7CisgICAgICAgIG1IelN0YXRzLmFkZChjeWNsZXMpOwogICAgIH0KIAotICAgIHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5uKCk7CisgICAgY29uc3QgdW5zaWduZWQgbiA9IG1XY1N0YXRzLmdldE4oKTsKICAgICAvLyBtQ3B1VXNhZ2UuZWxhcHNlZCgpIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgY2FsbCBpdCBldmVyeSBsb29wCiAgICAgaWYgKChuICYgMTI3KSA9PSAxKSB7Ci0gICAgICAgIGxvbmcgbG9uZyBlbGFwc2VkID0gbUNwdVVzYWdlLmVsYXBzZWQoKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOwogICAgICAgICBpZiAoZWxhcHNlZCA+PSBERUJVR19DUFVfVVNBR0UgKiAxMDAwMDAwMDAwTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOwotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gbVdjU3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5taW5pbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLm1heGltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcCA9IGVsYXBzZWQgLyAoZG91YmxlKSBuOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wMWsgPSBwZXJMb29wICogMC4wMDE7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbiA9IG1XY1N0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXYgPSBtV2NTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5pbXVtID0gbVdjU3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLmdldE1heCgpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNZWFuKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuZ2V0U3RkRGV2KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4Q3ljbGVzID0gbUh6U3RhdHMuZ2V0TWF4KCk7CiAgICAgICAgICAgICBtQ3B1VXNhZ2UucmVzZXRFbGFwc2VkKCk7CiAgICAgICAgICAgICBtV2NTdGF0cy5yZXNldCgpOwogICAgICAgICAgICAgbUh6U3RhdHMucmVzZXQoKTsKQEAgLTc0OSw2ICs3NTIsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihtYXNrKTsKIAogICAgIHN3aXRjaCAocmVwcmVzZW50YXRpb24pIHsKKyAgICAvLyBUcmF2ZWwgYWxsIHNpbmdsZSBiaXQgY2hhbm5lbCBtYXNrIHRvIGNvbnZlcnQgY2hhbm5lbCBtYXNrIHRvIHN0cmluZy4KICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKICAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7CkBAIC03NjksNiArNzczLDEwIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCkgcy5hcHBlbmQoInRvcC1zaWRlLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQikgcy5hcHBlbmQoImhhcHRpYy1CLCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSBzLmFwcGVuZCgiaGFwdGljLUEsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7CkBAIC03ODMsNiArNzkxLDEyIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQ0VOVEVSKSBzLmFwcGVuZCgiY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZUKSBzLmFwcGVuZCgidG9wLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfUklHSFQpIHMuYXBwZW5kKCJ0b3AtcmlnaHQsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkspIHMuYXBwZW5kKCJ2b2ljZS11cGxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKQEAgLTg0NSw2ICs4NTksMTYgQEAKICAgICBkcHJpbnRmKGZkLCAiICBJbnB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtSW5EZXZpY2UsIGRldmljZXNUb1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCBzb3VyY2VUb1N0cmluZyhtQXVkaW9Tb3VyY2UpKTsKIAorICAgIC8vIER1bXAgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgIGlmIChtVHlwZSA9PSBSRUNPUkQKKyAgICAgICAgICAgIHx8IG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBzdGF0czogJXNcbiIsIG1UaW1lc3RhbXBWZXJpZmllci50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgY29ycmVjdGVkOiAlc1xuIiwgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpID8gInllcyIgOiAibm8iKTsKKyAgICB9CisKICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgIH0KQEAgLTE1MTksNyArMTU0Myw3IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewogICAgIGNvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CiAgICAgY29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1JZDsKQEAgLTE1NzEsNiArMTU5NSw5IEBACiAgICAgLS1tQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CiAgICAgLy8gbUxhdGVzdEFjdGl2ZVRyYWNrIGlzIG5vdCBjbGVhcmVkIGV2ZW4gaWYgaXMgdGhlIHNhbWUgYXMgdHJhY2suCiAgICAgbUhhc0NoYW5nZWQgPSB0cnVlOworI2lmZGVmIFRFRV9TSU5LCisgICAgdHJhY2stPmR1bXBUZWUoLTEgLyogZmQgKi8sICJfUkVNT1ZFIik7CisjZW5kaWYKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKQEAgLTE3MDksMTAgKzE3MzYsMjEgQEAKICAgICAgICAgaWYgKG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmNhblNldE1hc3Rlck11dGUoKSkgewogICAgICAgICAgICAgbU1hc3Rlck11dGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbU91dHB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOwogICAgIH0KIAogICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAorICAgIC8vIFRPRE86IFdlIG1heSBhbHNvIG1hdGNoIG9uIGFkZHJlc3MgYXMgd2VsbCBhcyBkZXZpY2UgdHlwZSBmb3IKKyAgICAvLyBBVURJT19ERVZJQ0VfT1VUX0JVUywgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgaWYgKHR5cGUgPT0gTUlYRVIgfHwgdHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXByb3BlcnR5X2dldF9pbnQ2NCgKKyAgICAgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9vdXRwdXRfZGV2aWNlcyIsCisgICAgICAgICAgICAgICAgKGludDY0X3QpKG1Jc01zZERldmljZSA/IEFVRElPX0RFVklDRV9PVVRfQlVTIC8vIHR1cm4gb24gYnkgZGVmYXVsdCBmb3IgTVNECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFVRElPX0RFVklDRV9OT05FKSk7CisgICAgfQorCiAgICAgLy8gKysgb3BlcmF0b3IgZG9lcyBub3QgY29tcGlsZQogICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7CiAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKHN0cmVhbSArIDEpKSB7CkBAIC0xNzczLDcgKzE4MTEsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtMTc5Myw3ICsxODMxLDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC0xODEwLDYgKzE4NDgsMTEgQEAKIHsKICAgICBkdW1wQmFzZShmZCwgYXJncyk7CiAKKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbXV0ZTogJXNcbiIsIG1NYXN0ZXJNdXRlID8gIm9uIiA6ICJvZmYiKTsKKyAgICBpZiAobUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBIYXB0aWMgY2hhbm5lbCBtYXNrOiAlI3ggKCVzKVxuIiwgbUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUhhcHRpY0NoYW5uZWxNYXNrLCB0cnVlIC8qIG91dHB1dCAqLykuY19zdHIoKSk7CisgICAgfQogICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBmcmFtZSBjb3VudDogJXp1XG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgZHByaW50ZihmZCwgIiAgTGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLAogICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKQEAgLTE4ODAsMTEgKzE5MjMsMTcgQEAKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0gbU91dHB1dC0+ZmxhZ3M7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgcmVxdWVzdGVkRmxhZ3MgPSAqZmxhZ3M7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKworICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCAmJiBjaGVja0lNZW1vcnkoc2hhcmVkQnVmZmVyKSAhPSBOT19FUlJPUikgeworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQogCiAgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOworICAgIHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CiAKICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIEZBU1QgZmxhZyBjb25zaWRlcmVkIE9LIGlmIGZhc3QgbWl4ZXIgaXMgcHJlc2VudAogICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgewpAQCAtMTkwNSw3ICsxOTU0LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgogICAgICAgICAgICAgLy8gVE9ETzogZXh0cmFjdCBhcyBhIGRhdGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0IGNoZWNrcyB0aGF0IGEgY29tcHV0YXRpb25hbGx5CiAgICAgICAgICAgICAvLyBleHBlbnNpdmUgZG93bm1peGVyIGlzIG5vdCByZXF1aXJlZDogaXNGYXN0T3V0cHV0Q2hhbm5lbENvbnZlcnNpb24oKQotICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzayB8fAorICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IChtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spIHx8CiAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfHwKICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAmJiBtQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPICovKSkgJiYKQEAgLTIxNzQsNDggKzIyMjMsMTcgQEAKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2tzPFQ+OjphZGQoY29uc3Qgc3A8VD4gJnRyYWNrKQotewotICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gc2V0IG5hbWUgZm9yIHRyYWNrIHdoZW4gYWRkaW5nLgotICAgICAgICBpbnQgbmFtZTsKLSAgICAgICAgaWYgKG1VbnVzZWRUcmFja05hbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG5hbWUgPSBtVHJhY2tzLnNpemUoKSAtIDE7IC8vIG5ldyBuYW1lIHswIC4uLiBzaXplLTF9LgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV1c2Ugc21hbGxlc3QgbmFtZSBmb3IgZGVsZXRlZCB0cmFjay4KLSAgICAgICAgICAgIGF1dG8gaXQgPSBtVW51c2VkVHJhY2tOYW1lcy5iZWdpbigpOwotICAgICAgICAgICAgbmFtZSA9ICppdDsKLSAgICAgICAgICAgICh2b2lkKW1VbnVzZWRUcmFja05hbWVzLmVyYXNlKGl0KTsKLSAgICAgICAgfQotICAgICAgICB0cmFjay0+c2V0TmFtZShuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJjYW5ub3QgYWRkIHRyYWNrIik7Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2tzPFQ+OjpyZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKQogewotICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gaW52YWxpZGF0ZSBuYW1lIHdoZW4gcmVtb3ZpbmcgZnJvbSBtVHJhY2tzLgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPCAwLCAiaW52YWxpZCBuYW1lICVkIGZvciB0cmFjayBvbiBtVHJhY2tzIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsKKyAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrSWRzKSB7CiAgICAgICAgICAgICAvLyBXZSBjYW4ndCBkaXJlY3RseSBhY2Nlc3MgbUF1ZGlvTWl4ZXIgc2luY2UgdGhlIGNhbGxlciBtYXkgYmUgb3V0c2lkZSBvZiB0aHJlYWRMb29wLgotICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgYWRkIHRvIG1EZWxldGVkVHJhY2tOYW1lcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAorICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgYWRkIHRvIG1EZWxldGVkVHJhY2tJZHMgd2hpY2ggaXMgc29sZWx5IHVzZWQgZm9yIG1BdWRpb01peGVyIHVwZGF0ZSwKICAgICAgICAgICAgIC8vIHRvIGJlIGhhbmRsZWQgd2hlbiBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkgbmV4dCBjaGFuZ2VzIG1BdWRpb01peGVyLgotICAgICAgICAgICAgbURlbGV0ZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7CisgICAgICAgICAgICBtRGVsZXRlZFRyYWNrSWRzLmVtcGxhY2UodHJhY2tJZCk7CiAgICAgICAgIH0KLQotICAgICAgICBtVW51c2VkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOwotICAgICAgICB0cmFjay0+c2V0TmFtZShUOjpUUkFDS19OQU1FX1BFTkRJTkcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA+PSAwLAotICAgICAgICAgICAgICAgICJ2YWxpZCBuYW1lICVkIGZvciB0cmFjayBub3QgaW4gbVRyYWNrcyAocmV0dXJuZWQgJXpkKSIsIG5hbWUsIGluZGV4KTsKICAgICB9CiAgICAgcmV0dXJuIGluZGV4OwogfQpAQCAtMjMwMywxNSArMjMyMSwxMyBAQAogICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBUcmFja0Jhc2U6OnRyYWNrX3N0YXRlIHN0YXRlID0gdHJhY2stPm1TdGF0ZTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAvLyBhYm9ydCB0cmFjayB3YXMgc3RvcHBlZC9wYXVzZWQgd2hpbGUgd2UgcmVsZWFzZWQgdGhlIGxvY2sKICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSB0cmFjay0+bVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTIzNDAsNiArMjM1NiwxNyBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCA/IFRyYWNrOjpGU19GSUxMRUQgOiBUcmFjazo6RlNfRklMTElORzsKICAgICAgICAgfQogCisgICAgICAgIC8vIERpc2FibGUgYWxsIGhhcHRpYyBwbGF5YmFjayBmb3IgYWxsIG90aGVyIGFjdGl2ZSB0cmFja3Mgd2hlbiBoYXB0aWMgcGxheWJhY2sgaXMgc3VwcG9ydGVkCisgICAgICAgIC8vIGFuZCB0aGUgdHJhY2sgY29udGFpbnMgaGFwdGljIGNoYW5uZWxzLiBFbmFibGUgaGFwdGljIHBsYXliYWNrIGZvciBjdXJyZW50IHRyYWNrLgorICAgICAgICAvLyBUT0RPOiBSZXF1ZXN0IGFjdHVhbCBoYXB0aWMgcGxheWJhY2sgc3RhdHVzIGZyb20gdmlicmF0b3Igc2VydmljZQorICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgdC0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKwogICAgICAgICB0cmFjay0+bVJlc2V0RG9uZSA9IGZhbHNlOwogICAgICAgICB0cmFjay0+bVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gMDsKICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwpAQCAtMjQwNSw2ICsyNDMyLDE0IEBACiAgICAgcmV0dXJuIFN0cmluZzgoKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtT3V0cHV0ID09IG51bGxwdHIgfHwgbU91dHB1dC0+c3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtT3V0cHV0LT5zdHJlYW0tPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIHsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkIiwgdGhpcywgZXZlbnQpOwpAQCAtMjQ2Miw2ICsyNDk3LDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyByZWplY3Qgb3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzCiAgICAgaWYgKChtRHJhaW5TZXF1ZW5jZSAmIDEpICYmIChzZXF1ZW5jZSA9PSBtRHJhaW5TZXF1ZW5jZSkpIHsKKyAgICAgICAgLy8gUmVnaXN0ZXIgZGlzY29udGludWl0eSB3aGVuIEhXIGRyYWluIGlzIGNvbXBsZXRlZCBiZWNhdXNlIHRoYXQgY2FuIGNhdXNlCisgICAgICAgIC8vIHRoZSB0aW1lc3RhbXAgZnJhbWUgcG9zaXRpb24gdG8gcmVzZXQgdG8gMCBmb3IgZGlyZWN0IGFuZCBvZmZsb2FkIHRocmVhZHMuCisgICAgICAgIC8vIChPdXQgb2Ygc2VxdWVuY2UgcmVxdWVzdHMgYXJlIGlnbm9yZWQsIHNpbmNlIHRoZSBkaXNjb250aW51aXR5IHdvdWxkIGJlIGhhbmRsZWQKKyAgICAgICAgLy8gZWxzZXdoZXJlLCBlLmcuIGluIGZsdXNoKS4KKyAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKICAgICAgICAgbURyYWluU2VxdWVuY2UgJj0gfjE7CiAgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwogICAgIH0KQEAgLTI2MTQsNiArMjY1NCwxMSBAQAogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbUNoYW5uZWxNYXNrICY9IH5tSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKwogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50CiAgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgpAQCAtMjc4MSwyNCArMjgyNiwxOCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcygKICAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgLy8gTWlzY2VsbGFuZW91cyB0cmFjayBjbGVhbnVwIHdoZW4gcmVtb3ZlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCwKKyAgICAvLyBjYWxsZWQgd2l0aG91dCBUaHJlYWQgbG9jayBidXQgc3luY2hyb25pemVkIHdpdGggdGhyZWFkTG9vcCBwcm9jZXNzaW5nLgogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKLSAgICAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQotICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0b3ApOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQorICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7CiAgICAgICAgIH0KICAgICB9CisjZWxzZQorICAgICh2b2lkKXRyYWNrc1RvUmVtb3ZlOyAvLyBzdXBwcmVzcyB1bnVzZWQgd2FybmluZworI2VuZGlmCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2hlY2tTaWxlbnRNb2RlX2woKQpAQCAtMjg1MCw2ICsyODg5LDkgQEAKICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+IDApIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplOworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgICBtVGVlLndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIGZyYW1lc1dyaXR0ZW4pOworI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOwogICAgICAgICB9CkBAIC0yOTg5LDcgKzMwMzEsNyBAQAogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKICAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKLSAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCksCiAgICAgICAgICAgICAgICAgICAgICZoYWxJbkJ1ZmZlcik7CkBAIC0zMTY3LDYgKzMyMDksMTYgQEAKIAogICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKKyAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcyBzaG91bGQgcmVzZXQgZnJhbWUgY291bnQgdG8gemVybyBvbiBzdG9wL2ZsdXNoCisgICAgLy8gVE9ETzogYWRkIGNvbmZpcm1hdGlvbiBjaGVja3M6CisgICAgLy8gMSkgRElSRUNUIHRocmVhZHMgYW5kIGxpbmVhciBQQ00gZm9ybWF0IHJlYWxseSByZXNldHMgdG8gMD8KKyAgICAvLyAyKSBJcyBmcmFtZSBjb3VudCByZWFsbHkgdmFsaWQgaWYgbm90IGxpbmVhciBwY20/CisgICAgLy8gMykgQXJlIGFsbCA2NCBiaXRzIG9mIHBvc2l0aW9uIHJldHVybmVkLCBub3QganVzdCBsb3dlc3QgMzIgYml0cz8KKyAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLnNldERpc2NvbnRpbnVpdHlNb2RlKG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7CisgICAgfQorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKwogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7CiAgICAgICAgIC8vIExvZyBtZXJnZSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkIGR1cmluZyBBdWRpb0ZsaW5nZXIgYmluZGVyIHRyYW5zYWN0aW9ucywgYnV0CkBAIC0zMTc3LDYgKzMyMjksNDkgQEAKIAogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAorICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfQlVTLCBjaGVjayBmb3IgZG93bnN0cmVhbSBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOiB3ZSBhY2Nlc3Mgb3V0RGV2aWNlKCkgb3V0c2lkZSBvZiBtTG9jay4KKyAgICAgICAgaWYgKGlzTXNkRGV2aWNlKCkgJiYgKG91dERldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApIHsKKyAgICAgICAgICAgIC8vIEhlcmUsIHdlIHRyeSBmb3IgdGhlIEFGIGxvY2ssIGJ1dCBkbyBub3QgYmxvY2sgb24gaXQgYXMgdGhlIGxhdGVuY3kKKyAgICAgICAgICAgIC8vIGlzIG1vcmUgaW5mb3JtYXRpb25hbC4KKyAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tTG9jay50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBkb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRmxpbmdlci0+bVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhpZCgpLCAmc3dQYXRjaGVzKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3dQYXRjaGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN3UGF0Y2hlc1swXS5nZXRMYXRlbmN5TXNfbCgmbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IHN3UGF0Y2hlc1swXS5nZXRQYXRjaEhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBkb3duc3RyZWFtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGRvd25zdHJlYW0gbGF0ZW5jeSAod2UgYXNzdW1lIGEgbWF4IHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvdXQgb2YgcmFuZ2UgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgbWluTGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWluTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhdGVuY3lNcyA+IG1heExhdGVuY3kpIGxhdGVuY3lNcyA9IG1heExhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgLy8gb3VyIGRldmljZSBpcyBubyBsb25nZXIgQVVESU9fREVWSUNFX09VVF9CVVMsIHJlc2V0IHBhdGNoIGhhbmRsZSBhbmQgc3RhdHMuCisgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKIAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTMxOTAsMTYgKzMyODUsNTEgQEAKICAgICAgICAgICAgICAgICBsb2dTdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBDb2xsZWN0IHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgUGxheWJhY2sgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeyAvLyBubyBpbmRlbnRhdGlvbgogICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCiAgICAgICAgICAgICAvLyBhbmQgYXNzb2NpYXRlIHdpdGggdGhlIHNpbmsgZnJhbWVzIHdyaXR0ZW4gb3V0LiAgV2UgbmVlZAogICAgICAgICAgICAgLy8gdGhpcyB0byBjb252ZXJ0IHRoZSBzaW5rIHRpbWVzdGFtcCB0byB0aGUgdHJhY2sgdGltZXN0YW1wLgogICAgICAgICAgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgRHVwbGljYXRpbmdUaHJlYWQgbWF5IG5vdCBoYXZlIGEgbU5vcm1hbFNpbmsuCisgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woJnRpbWVzdGFtcCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBEb3duc3RyZWFtIGxhdGVuY3kgb25seSBhZGRlZCBpZiB0aW1lc3RhbXAgY29ycmVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsgLy8gd2UgaGF2ZSBsYXRlbmN5IGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGludDY0X3QobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBtYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TdXNwZW5kZWRGcmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBmZXRjaCB0aGUgdGltZXN0YW1wIGhlcmUgYmVjYXVzZSBvZnRlbiB0aGUgZG93bnN0cmVhbQogICAgICAgICAgICAgICAgIC8vIHNpbmsgd2lsbCBibG9jayB3aGlsZSB3cml0aW5nLgotICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAotICAgICAgICAgICAgICAgICh2b2lkKSBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHZhbGlkIGtlcm5lbCBwb3NpdGlvbiBpbiBjYXNlIHdlIGFyZSBpbiB1bmRlcnJ1bgogICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbm9ybWFsIG1peGVyIHBlcmlvZCBpcyB0aGUgc2FtZSBhcyB0aGUgZmFzdCBtaXhlciBwZXJpb2QsIG9yIHRoZXJlCkBAIC0zMjI4LDcgKzMzNTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKICAgICAgICAgICAgIC8vIGV2ZW4gYWZ0ZXIgc3RhbmRieSgpIGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB0cmFjayBmcmFtZQogICAgICAgICAgICAgLy8gdG8gc2luayBmcmFtZSBtYXBwaW5nLgpAQCAtMzI1NiwxMCArMzM4OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdC0+dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmIChtVHlwZSAuLi4gKSB7IC8vIG5vIGluZGVudGF0aW9uCiAjaWYgMAogICAgICAgICAgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKICAgICAgICAgICAgIGlmICh6ICUgMTAwID09IDApIHsKQEAgLTMzMDAsNyArMzQzNSw3IEBACiAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAorICAgICAgICAgICAgaWYgKChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSAmJiBzeXN0ZW1UaW1lKCkgPiBtU3RhbmRieVRpbWVOcykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIHB1dCBhdWRpbyBoYXJkd2FyZSBpbnRvIHN0YW5kYnkgYWZ0ZXIgc2hvcnQgZGVsYXkKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU3RhbmRieV9sKCkpIHsKQEAgLTMzMTQsNyArMzQ0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGFib3V0IHRvIHdhaXQsIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCkBAIC0zMzk1LDcgKzM1MzAsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIHNpbmsgYW5kIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkanVzdCBjaGFubmVscyBhcyB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIGlmICghbUVmZmVjdEJ1ZmZlclZhbGlkICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQ2hhbm5lbENvdW50LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBmb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbUN1cnJlbnRXcml0ZUxlbmd0aDsKQEAgLTM0MzksNyArMzU4NCwxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBtRm9ybWF0LCBtRWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworICAgICAgICAgICAgLy8gVGhlIHNhbXBsZSBkYXRhIGlzIHBhcnRpYWxseSBpbnRlcmxlYXZlZCB3aGVuIGhhcHRpYyBjaGFubmVscyBleGlzdCwKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRqdXN0IGNoYW5uZWxzIGhlcmUuCisgICAgICAgICAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKG1TaW5rQnVmZmVyLCBtQ2hhbm5lbENvdW50LCBtU2lua0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBtRm9ybWF0KSAqIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgpAQCAtMzYwNSwyNCArMzc1OCw0MSBAQAogLy8gcmVtb3ZlVHJhY2tzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVtb3ZlVHJhY2tzX2woY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZW1vdmVUcmFja3NfbCByZW1vdmluZyB0cmFjayBvbiBzZXNzaW9uICVkIiwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGNoYWluLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKLSAgICAgICAgICAgIH0KKyAgICBib29sIGVuYWJsZWRIYXB0aWNUcmFja3NSZW1vdmVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVtb3ZpbmcgdHJhY2sgb24gc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogc3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrLT5pZCgpLCBjaGFpbi5nZXQoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGFuIGV4dGVybmFsIGNsaWVudCB0cmFjaywgaW5mb3JtIEFQTSB3ZSdyZSBubyBsb25nZXIgYWN0aXZlLCBhbmQgcmVtb3ZlIGlmIG5lZWRlZC4KKyAgICAgICAgLy8gV2UgZG8gdGhpcyB1bmRlciBsb2NrIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGNvbnNpc3RlbnQgaWYgdGhlIFRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG91ciB0cmFja3MgdmVjdG9yCisgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKKyAgICAgICAgfQorICAgICAgICBlbmFibGVkSGFwdGljVHJhY2tzUmVtb3ZlZCB8PSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCk7CisgICAgfQorICAgIC8vIElmIHRoZSB0aHJlYWQgc3VwcG9ydHMgaGFwdGljIHBsYXliYWNrIGFuZCB0aGUgdHJhY2sgcGxheWluZyBoYXB0aWMgZGF0YSB3YXMgcmVtb3ZlZCwKKyAgICAvLyBlbmFibGUgaGFwdGljIHBsYXliYWNrIG9uIHRoZSBmaXJzdCBhY3RpdmUgdHJhY2sgdGhhdCBjb250YWlucyBoYXB0aWMgY2hhbm5lbHMuCisgICAgLy8gVE9ETzogUXVlcnkgdmlicmF0b3Igc2VydmljZSB0byBrbm93IHdoaWNoIHRyYWNrIHNob3VsZCBlbmFibGUgaGFwdGljIHBsYXliYWNrLgorICAgIGlmIChlbmFibGVkSGFwdGljVHJhY2tzUmVtb3ZlZCAmJiBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgIGZvciAoYXV0byAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgIGlmICh0LT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAgICAgdC0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApCkBAIC0zNjM5LDYgKzM4MDksMTUgQEAKICAgICAgICAgdWludDY0X3QgcG9zaXRpb242NDsKICAgICAgICAgaWYgKG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKCZwb3NpdGlvbjY0LCAmdGltZXN0YW1wLm1UaW1lKSA9PSBPSykgewogICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9ICh1aW50MzJfdClwb3NpdGlvbjY0OworICAgICAgICAgICAgaWYgKG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcG9zaXRpb25PZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXRNZWFuKCkgKiBtU2FtcGxlUmF0ZSAqIDFlLTMpOworICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbk9mZnNldCA+IHRpbWVzdGFtcC5tUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiAtPSBwb3NpdGlvbk9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNzc3LDEyICszOTU2LDE2IEBACiAgICAgZGVzdHJveVRyYWNrX2wodHJhY2spOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKICAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICBpZiAobU91dHB1dCAmJiBtT3V0cHV0LT5mbGFncyAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gbU91dHB1dC0+ZmxhZ3M7CisgICAgfQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zODE0LDcgKzM5OTcsOCBAQAogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MoCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICNpZiAhTE9HX05ERUJVRwogICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKQEAgLTM4NTYsMTYgKzQwNDAsMTQgQEAKICAgICAgICAgICAgIC8vIGNoYW5nZSBvdXIgU2luayBmb3JtYXQgdG8gYWNjZXB0IG91ciBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uCiAgICAgICAgICAgICBtRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKLSNlbmRpZgorCiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgogICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlI3ggdG8gJSN4IiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwpAQCAtMzg3Nyw3ICs0MDU5LDcgQEAKICAgICAgICAgTW9ub1BpcGUgKm1vbm9QaXBlID0gbmV3IE1vbm9QaXBlKG1Ob3JtYWxGcmFtZUNvdW50ICogNCwgZm9ybWF0LCB0cnVlIC8qd3JpdGVDYW5CbG9jayovKTsKICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwogICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0jaWYgIUxPR19OREVCVUcgfHwgZGVmaW5lZChURUVfU0lOSykKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICBzc2l6ZV90IGluZGV4ID0KICNlbHNlCiAgICAgICAgICh2b2lkKQpAQCAtMzg4OCwyNSArNDA3MCw4IEBACiAgICAgICAgICAgICAgICAgKG1vbm9QaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgIG1QaXBlU2luayA9IG1vbm9QaXBlOwogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7Ci0gICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTaW5rID0gdGVlU2luazsKLSAgICAgICAgICAgIFBpcGVSZWFkZXIgKnRlZVNvdXJjZSA9IG5ldyBQaXBlUmVhZGVyKCp0ZWVTaW5rKTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHRlZVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgLy8gY3JlYXRlIGZhc3QgbWl4ZXIgYW5kIGNvbmZpZ3VyZSBpdCBpbml0aWFsbHkgd2l0aCBqdXN0IG9uZSBmYXN0IHRyYWNrIGZvciBvdXIgc3VibWl4Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKCk7CisgICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKG1JZCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgICAgIHNxLT5zZXRPYnNlcnZlckR1bXAoJm1TdGF0ZVF1ZXVlT2JzZXJ2ZXJEdW1wKTsKQEAgLTM5MTcsOCArNDA4MiwxMCBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMzkyNiwyNCArNDA5MywzMCBAQAogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmsgPSBtT3V0cHV0U2luay5nZXQoKTsKICAgICAgICAgc3RhdGUtPm1PdXRwdXRTaW5rR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKKyAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKKyAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU7CiAgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CiAgICAgICAgIC8vbUZhc3RNaXhlckZ1dGV4ID0gMDsKICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0TWl4ZXJGdXRleDsKICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0TWl4ZXJEdW1wU3RhdGU7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgc3RhdGUtPm1UZWVTaW5rID0gbVRlZVNpbmsuZ2V0KCk7Ci0jZW5kaWYKICAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdE1peGVyTG9nU2l6ZSwgIkZhc3RNaXhlciIpOwogICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RNaXhlck5CTG9nV3JpdGVyLmdldCgpOwogICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CiAKKyAgICAgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgaW5mbzsKKyAgICAgICAgaW5mby5pZCA9IG1JZDsKKyAgICAgICAgaW5mby50eXBlID0gTkJMb2c6OkZBU1RNSVhFUjsKKyAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyLT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsKKwogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBtaXhlcgogICAgICAgICBtRmFzdE1peGVyLT5ydW4oIkZhc3RNaXhlciIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0TWl4ZXItPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdE1peGVyKTsKIAogI2lmZGVmIEFVRElPX1dBVENIRE9HCkBAIC0zOTUyLDkgKzQxMjUsMTQgQEAKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnNldER1bXAoJm1BdWRpb1dhdGNoZG9nRHVtcCk7CiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5ydW4oIkF1ZGlvV2F0Y2hkb2ciLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICB0aWQgPSBtQXVkaW9XYXRjaGRvZy0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAjZW5kaWYKLQorICAgIH0gZWxzZSB7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gT25seSB1c2UgdGhlIE1peGVyVGhyZWFkIHRlZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgIG1UZWUuc2V0KG1PdXRwdXRTaW5rLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19PVVRQVVRfVEhSRUFEKTsKKyAgICAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfTSIpOworI2VuZGlmCiAgICAgfQogCiAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CkBAIC00MDE4LDEyICs0MTk2LDYgQEAKICAgICByZXR1cm4gbGF0ZW5jeTsKIH0KIAotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQotewotICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyh0cmFja3NUb1JlbW92ZSk7Ci19Ci0KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgLy8gRklYTUUgd2Ugc2hvdWxkIG9ubHkgZG8gb25lIHB1c2ggcGVyIGN5Y2xlOyBjb25maXJtIHRoaXMgaXMgdHJ1ZQpAQCAtNDIyMiwxNCArNDM5NCwxNCBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bWl4ZXJfc3RhdGUgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKAogICAgICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSkKIHsKLSAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIG5hbWVzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcwotICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKFt0aGlzXShpbnQgbmFtZSkgewotICAgICAgICAvLyBmb3IgZWFjaCBuYW1lLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCi0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveShuYW1lKTsKKyAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIGlkcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKKyAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tJZHMoW3RoaXNdKGludCB0cmFja0lkKSB7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrSWQsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KHRyYWNrSWQpOwogICAgICAgICB9CiAgICAgfSk7Ci0gICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja05hbWVzKCk7CisgICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja0lkcygpOwogCiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZApAQCAtNDI3MCw2ICs0NDQyLDM4IEBACiAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCiAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgogCisgICAgLy8gRGVmZXJyZWRPcGVyYXRpb25zIGhhbmRsZXMgc3RhdGlzdGljcyBhZnRlciBzZXR0aW5nIG1peGVyU3RhdHVzLgorICAgIGNsYXNzIERlZmVycmVkT3BlcmF0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBEZWZlcnJlZE9wZXJhdGlvbnMobWl4ZXJfc3RhdGUgKm1peGVyU3RhdHVzKQorICAgICAgICAgICAgOiBtTWl4ZXJTdGF0dXMobWl4ZXJTdGF0dXMpIHsgfQorCisgICAgICAgIC8vIHdoZW4gbGVhdmluZyBzY29wZSwgdGFsbHkgZnJhbWVzIHByb3Blcmx5LgorICAgICAgICB+RGVmZXJyZWRPcGVyYXRpb25zKCkgeworICAgICAgICAgICAgLy8gVGFsbHkgdW5kZXJydW4gZnJhbWVzIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IG1peGluZyAoTUlYRVJfVFJBQ0tTX1JFQURZKQorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIHdoZW4gdGhlIHVuZGVycnVuIG9jY3Vycy4KKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEZhc3RUcmFja3MgYW5kIE5vcm1hbFRyYWNrcyBoZXJlLgorICAgICAgICAgICAgaWYgKCptTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1bmRlcnJ1biA6IG1VbmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5maXJzdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRhbGx5VW5kZXJydW5GcmFtZXMoKSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSB0cmFjayBjb3VudGVycworICAgICAgICAvLyB3aXRoIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gZnJhbWVzIGZvciBhIHBhcnRpY3VsYXIgbWl4ZXIgcGVyaW9kLgorICAgICAgICAvLyBXZSBkZWZlciB0YWxseWluZyB1bnRpbCB3ZSBrbm93IHRoZSBmaW5hbCBtaXhlciBzdGF0dXMuCisgICAgICAgIHZvaWQgdGFsbHlVbmRlcnJ1bkZyYW1lcyhzcDxUcmFjaz4gdHJhY2ssIHNpemVfdCB1bmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgbVVuZGVycnVuRnJhbWVzLmVtcGxhY2VfYmFjayh0cmFjaywgdW5kZXJydW5GcmFtZXMpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBtaXhlcl9zdGF0ZSAqIGNvbnN0IG1NaXhlclN0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNwPFRyYWNrPiwgc2l6ZV90Pj4gbVVuZGVycnVuRnJhbWVzOworICAgIH0gZGVmZXJyZWRPcGVyYXRpb25zKCZtaXhlclN0YXR1cyk7IC8vIGltcGxpY2l0IG5lc3RlZCBzY29wZSBmb3IgdmFyaWFibGUgY2FwdHVyZQorCisgICAgYm9vbCBub0Zhc3RIYXB0aWNUcmFjayA9IHRydWU7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV07CiAKQEAgLTQyNzgsNiArNDQ4Miw5IEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBmYXN0IHRyYWNrcwogICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBub0Zhc3RIYXB0aWNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJdCdzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgKHRob3VnaCB1bmxpa2VseSkgZm9yIGEgZmFzdCB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgICAgICAvLyBhbmQgdGhlbiByZW1vdmVkIHdpdGhpbiB0aGUgc2FtZSBub3JtYWwgbWl4IGN5Y2xlLiAgVGhpcyBpcyBub3QgYSBwcm9ibGVtLCBhcwpAQCAtNDMwNCwxMyArNDUxMSwxNCBAQAogICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucyA9IHVuZGVycnVuczsKICAgICAgICAgICAgIC8vIGRvbid0IGNvdW50IHVuZGVycnVucyB0aGF0IG9jY3VyIHdoaWxlIHN0b3BwaW5nIG9yIHBhdXNpbmcKICAgICAgICAgICAgIC8vIG9yIHN0b3BwZWQgd2hpY2ggY2FuIG9jY3VyIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQgd2hpbGUgYWN0aXZlCisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKCEodHJhY2stPmlzU3RvcHBpbmcoKSB8fCB0cmFjay0+aXNQYXVzaW5nKCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICByZWNlbnRVbmRlcnJ1bnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgZmFzdCBtaXhlciB3aWxsIHB1bGwgJiBtaXggcGFydGlhbCBidWZmZXJzLCBidXQgd2UgY291bnQgYXMgYSBmdWxsIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMocmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IHJlY2VudFVuZGVycnVucyAqIG1GcmFtZUNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgYWNjb3VudCBmb3IgRmFzdFRyYWNrIHVuZGVycnVucy4KKyAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBub3JtYWwgdHJhY2tzLAogICAgICAgICAgICAgLy8gd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGZvciBmYXN0IHRyYWNrcy4KQEAgLTQ0MDIsNiArNDYxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gdnA7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gdHJhY2stPm1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gdHJhY2stPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayB8PSAxIDw8IGo7CiAgICAgICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CkBAIC00NDQ3LDYgKzQ2NTYsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBBdm9pZHMgYSBtaXNsZWFkaW5nIGRpc3BsYXkgaW4gZHVtcHN5cwogICAgICAgICAgICAgICAgIHRyYWNrLT5tT2JzZXJ2ZWRVbmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtNDQ1NiwxOSArNDY2OSwyMSBAQAogCiAgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgdHJhY2sgaXMgYWRkZWQgd2Ugd2FpdAogICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAotICAgICAgICBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAKICAgICAgICAgLy8gaWYgYW4gYWN0aXZlIHRyYWNrIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIEF1ZGlvTWl4ZXIsIGNyZWF0ZSBpdC4KLSAgICAgICAgaWYgKCFtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7CisgICAgICAgIC8vIHVzZSB0aGUgdHJhY2tJZCBhcyB0aGUgQXVkaW9NaXhlciBuYW1lLgorICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb01peGVyLT5jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCk6IEF1ZGlvTWl4ZXIgY2Fubm90IGNyZWF0ZSB0cmFjayglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7IC8vIGNvbnNpZGVyIGl0IGRlYWQuCiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC00NDg5LDcgKzQ3MDQsNyBAQAogICAgICAgICAvLyBUT0RPOiBPTkxZIFVTRUQgRk9SIExFR0FDWSBSRVNBTVBMRVJTLCByZW1vdmUgd2hlbiB0aGV5IGFyZSByZW1vdmVkLgogICAgICAgICAvLyBhZGQgZnJhbWVzIGFscmVhZHkgY29uc3VtZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQgYnkgdGhlIHJlc2FtcGxlcgogICAgICAgICAvLyBiZWNhdXNlIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcwotICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrLT5uYW1lKCkpOworICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrSWQpOwogCiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lcyA9IDE7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSAmJgpAQCAtNDUwMSwxMyArNDcxNiwxMyBAQAogICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewogICAgICAgICAgICAgLy8gSSB3aXNoIHdlIGhhZCBmb3JtYXR0ZWQgdHJhY2UgbmFtZXMKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRyYWNlTmFtZSgiblJkeSIpOwotICAgICAgICAgICAgdHJhY2VOYW1lICs9IHN0ZDo6dG9fc3RyaW5nKHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgdHJhY2VOYW1lICs9IHN0ZDo6dG9fc3RyaW5nKHRyYWNrSWQpOwogICAgICAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUuY19zdHIoKSwgZnJhbWVzUmVhZHkpOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZnJhbWVzUmVhZHkgPj0gbWluRnJhbWVzKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10gb24gdGhyZWFkICVwIiwgbmFtZSwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCB0cmFja0lkLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKIAogICAgICAgICAgICAgbWl4ZWRUcmFja3MrKzsKIApAQCAtNDUyNCw5ICs0NzM5LDkgQEAKICAgICAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cmFja3NXaXRoRWZmZWN0Kys7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInByZXBhcmVUcmFja3NfbCgpOiB0cmFjayAlZCBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInByZXBhcmVUcmFja3NfbCgpOiB0cmFjayglZCkgYXR0YWNoZWQgdG8gZWZmZWN0IGJ1dCBubyBjaGFpbiBmb3VuZCBvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlc3Npb24gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTQ1MzksNyArNDc1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsIEF1ZGlvTWl4ZXI6OlJFU0VULCBOVUxMKTsKICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gLTEuMDsKICAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCBub3QgbWFrZSBhIGRlY2lzaW9uIGJhc2VkIG9uIG1TZXJ2ZXIKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2Jsay0+bVNlcnZlciAhPSAwKSB7CkBAIC00NjM1LDI0ICs0ODUwLDI1IEBACiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCB0cmFjayk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKHRyYWNrSWQpOwogCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmNoYW5uZWxNYXNrKCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KShtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spKTsKICAgICAgICAgICAgIC8vIGxpbWl0IHRyYWNrIHNhbXBsZSByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxlIHJhdGUsIHdoaWNoIGNoYW5nZXMgYXQgcmUtY29uZmlndXJhdGlvbgogICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYOwogICAgICAgICAgICAgdWludDMyX3QgcmVxU2FtcGxlUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CkBAIC00NjYyLDE0ICs0ODc4LDE0IEBACiAgICAgICAgICAgICAgICAgcmVxU2FtcGxlUmF0ZSA9IG1heFNhbXBsZVJhdGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRJTUVTVFJFVENILAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlBMQVlCQUNLX1JBVEUsCiAgICAgICAgICAgICAgICAgJnBsYXliYWNrUmF0ZSk7CkBAIC00NjkwLDI5ICs0OTA2LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgdHJhY2stPm1haW5CdWZmZXIoKT8KICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+YXV4QnVmZmVyKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKTsKIAogICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXM7CkBAIC00NzI1LDEzICs0OTQ1LDEzIEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZGVzaXJlZEZyYW1lcyAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzZWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayglcCkgdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLCBmcmFtZXNSZWFkeSwgZGVzaXJlZEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayglZCkgdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IGRlc2lyZWRGcmFtZXM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZlcnJlZE9wZXJhdGlvbnMudGFsbHlVbmRlcnJ1bkZyYW1lcyh0cmFjaywgdW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBjbGVhciBlZmZlY3QgY2hhaW4gaW5wdXQgYnVmZmVyIGlmIGFuIGFjdGl2ZSB0cmFjayB1bmRlcnJ1bnMgdG8gYXZvaWQgc2VuZGluZwogICAgICAgICAgICAgLy8gcHJldmlvdXMgYXVkaW8gYnVmZmVyIGFnYWluIHRvIGVmZmVjdHMKQEAgLTQ3NDAsNyArNDk2MCw3IEBACiAgICAgICAgICAgICAgICAgY2hhaW4tPmNsZWFySW5wdXRCdWZmZXIoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0gb24gdGhyZWFkICVwIiwgbmFtZSwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW05PVCBSRUFEWV0gb24gdGhyZWFkICVwIiwgdHJhY2tJZCwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CiAgICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNUZXJtaW5hdGVkKCkgfHwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBlZCgpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25zdW1lZCBhbGwgdGhlIGJ1ZmZlcnMgb2YgdGhpcyB0cmFjay4KQEAgLTQ3NTksNyArNDk3OSw4IEBACiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsIG5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC00NzcyLDEzICs0OTkzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUobmFtZSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZSh0cmFja0lkKTsKICAgICAgICAgfQogCiAgICAgICAgIH0gICAvLyBsb2NhbCB2YXJpYWJsZSBzY29wZSB0byBhdm9pZCBnb3RvIHdhcm5pbmcKIAogICAgIH0KIAorICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FICYmIHNxICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBmYXN0IHRyYWNrIHBsYXlpbmcgaGFwdGljIGFuZCBGYXN0TWl4ZXIgZXhpc3RzLAorICAgICAgICAvLyBlbmFibGluZyB0aGUgZmlyc3QgRmFzdFRyYWNrLCB3aGljaCBwcm92aWRlcyBtaXhlZCBkYXRhIGZyb20gbm9ybWFsCisgICAgICAgIC8vIHRyYWNrcywgdG8gcGxheSBoYXB0aWMgZGF0YS4KKyAgICAgICAgRmFzdFRyYWNrICpmYXN0VHJhY2sgPSAmc3RhdGUtPm1GYXN0VHJhY2tzWzBdOworICAgICAgICBpZiAoZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IG5vRmFzdEhhcHRpY1RyYWNrKSB7CisgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBub0Zhc3RIYXB0aWNUcmFjazsKKyAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBQdXNoIHRoZSBuZXcgRmFzdE1peGVyIHN0YXRlIGlmIG5lY2Vzc2FyeQogICAgIGJvb2wgcGF1c2VBdWRpb1dhdGNoZG9nID0gZmFsc2U7CiAgICAgaWYgKGRpZE1vZGlmeSkgewpAQCAtNDgzMyw5ICs1MDY1LDkgQEAKICAgICAvLyBvZiBwcmVwYXJlVHJhY2tzX2woKTsgdGhpcyByZWxlYXNlcyBhbnkgb3V0c3RhbmRpbmcgYnVmZmVyIGJhY2sgdG8gdGhlIHRyYWNrLgogICAgIC8vIFNlZSBhbHNvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkZXN0cm95VHJhY2tfbCgpLgogICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiAqdHJhY2tzVG9SZW1vdmUpIHsKLSAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOwotICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2tJZCwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUwMDQsMTcgKzUyMzYsMTcgQEAKICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBBdWRpb01peGVyIGNhbm5vdCBjcmVhdGUgdHJhY2soJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KQEAgLTUwMzAsNiArNTI2MiwxMiBAQAogICAgIGRwcmludGYoZmQsICIgIFRocmVhZCB0aHJvdHRsZSB0aW1lIChtc2Vjcyk6ICV1XG4iLCBtVGhyZWFkVGhyb3R0bGVUaW1lTXMpOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAlc1xuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKS5jX3N0cigpKTsKICAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKKyAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsTWl4ZXIgbGF0ZW5jeSBtczogJS4ybGZcbiIsIGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsTWl4ZXIgbGF0ZW5jeSBtczogdW5hdmFpbFxuIik7CisgICAgfQogCiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciB0aHJlYWQgJXAgdGlkPSVkIiwgbUZhc3RNaXhlci5nZXQoKSwgbUZhc3RNaXhlci0+Z2V0VGlkKCkpOwpAQCAtNTAzOCw5ICs1Mjc2LDkgQEAKICAgICAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdE1peGVyRHVtcFN0YXRlKG1GYXN0TWl4ZXJEdW1wU3RhdGUpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdE1peGVyRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RNaXhlckR1bXBTdGF0ZT4obUZhc3RNaXhlckR1bXBTdGF0ZSk7CiAgICAgICAgIGNvcHktPmR1bXAoZmQpOwotICAgICAgICBkZWxldGUgY29weTsKIAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgLy8gU2ltaWxhciBmb3Igc3RhdGUgcXVldWUKQEAgLTUwNjEsMTIgKzUyOTksNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlclxuIik7CiAgICAgfQotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBXcml0ZSB0aGUgdGVlIG91dHB1dCB0byBhIC53YXYgZmlsZQotICAgIGR1bXBUZWUoZmQsIG1UZWVTb3VyY2UsIG1JZCwgJ00nKTsKLSNlbmRpZgotCiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpIGNvbnN0CkBAIC01MjUzLDcgKzU0ODUsNyBAQAogICAgICAgICBpZiAoKHRyYWNrLT5mcmFtZXNSZWFkeSgpID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzU3RvcHBpbmdfMigpICYmICF0cmFjay0+aXNTdG9wcGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKQEAgLTUzMjksNyArNTU2MSw3IEBACiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGxhc3QgdHJhY2sgc3RhcnRlZCBmb3IgbWl4ZXIgc3RhdGUgY29udHJvbAogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTU1NjgsNiArNTgwMCw3IEBACiAgICAgbU91dHB1dC0+Zmx1c2goKTsKICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKICAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsgLy8gRElSRUNUIGFuZCBPRkZMT0FERUQgZmx1c2ggcmVzZXRzIGZyYW1lIGNvdW50LgogfQogCiBpbnQ2NF90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgewpAQCAtNTgxMSw3ICs2MDQ0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTU4NTUsNyArNjA4OCw3IEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgYnVmZmVyIGNhbiBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvIHNvIHdlIG11c3QKQEAgLTU5MDIsNiArNjEzNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGV4cGxpY2l0IGRyYWluIG5vdGlmaWNhdGlvbiB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBkaXNjb250aW51aXR5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKCFsYXN0KSBvciB0aGUgdXBjb21pbmcgKGxhc3QpIHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBza2lwcGluZyB0aGUgZGlzY29udGludWl0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwpAQCAtNTkyMyw4ICs2MTY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC02MDY3LDcgKzYzMDgsMjIgQEAKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFdyaXR0ZW4gPSBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisKKyAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGZpcnN0IE91dHB1dFRyYWNrIGZvciB0aW1lc3RhbXAgYW5kIGZyYW1lIGNvdW50aW5nLgorCisgICAgICAgIC8vIFRoZSB0aHJlYWRMb29wKCkgZ2VuZXJhbGx5IGFzc3VtZXMgd3JpdGluZyBhIGZ1bGwgc2luayBidWZmZXIgc2l6ZSBhdCBhIHRpbWUuCisgICAgICAgIC8vIEhlcmUsIHdlIGNvcnJlY3QgZm9yIHdyaXRlRnJhbWVzIG9mIDAgKGEgc3RvcCkgb3IgdW5kZXJydW5zIGJlY2F1c2UKKyAgICAgICAgLy8gd2UgYWx3YXlzIGNsYWltIHN1Y2Nlc3MuCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgY29ycmVjdGlvbiA9IG1TaW5rQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemUgLSBhY3R1YWxXcml0dGVuOworICAgICAgICAgICAgQUxPR0RfSUYoY29ycmVjdGlvbiAhPSAwICYmIHdyaXRlRnJhbWVzICE9IDAsCisgICAgICAgICAgICAgICAgICAgICIlczogd3JpdGVGcmFtZXM6JXUgIGFjdHVhbFdyaXR0ZW46JXpkICBjb3JyZWN0aW9uOiV6ZCAgbUZyYW1lc1dyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3cml0ZUZyYW1lcywgYWN0dWFsV3JpdHRlbiwgY29ycmVjdGlvbiwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7CisgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiAtPSBjb3JyZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogUmVwb3J0IGNvcnJlY3Rpb24gZm9yIHRoZSBvdGhlciBvdXRwdXQgdHJhY2tzIGFuZCBzaG93IGluIHRoZSBkdW1wLgogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CkBAIC02MDkyLDcgKzYzNDgsNyBAQAogICAgICAgICBzcyA8PCAiOiI7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtT3V0cHV0VHJhY2tzKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSB0cmFjay0+dGhyZWFkKCkucHJvbW90ZSgpOwotICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+bmFtZSgpIDw8ICIgOiAiOworICAgICAgICAgICAgc3MgPDwgIiAoIiA8PCB0cmFjay0+aWQoKSA8PCAiIDogIjsKICAgICAgICAgICAgIGlmICh0aHJlYWQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNzIDw8IHRocmVhZC5nZXQoKSA8PCAiLCAiIDw8IHRocmVhZC0+aWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02MjMyLDkgKzY0ODgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQsIHN5c3RlbVJlYWR5KSwKICAgICBtSW5wdXQoaW5wdXQpLApAQCAtNjI0Miw5ICs2NDk1LDYgQEAKICAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKLSNpZmRlZiBURUVfU0lOSwotICAgICwgbVRlZVNpbmsodGVlU2luaykKLSNlbmRpZgogICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAogICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCiAgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CkBAIC02MjYxLDggKzY1MTEsMjAgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAorICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CisgICAgfQorCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9pbnB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfSU5fQlVTIC8vIHR1cm4gb24gYnkgZGVmYXVsdCBmb3IgTVNECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKwogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzb3VyY2UgZm9yIHRoZSBIQUwgaW5wdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbUlucHV0U291cmNlID0gbmV3IEF1ZGlvU3RyZWFtSW5Tb3VyY2UoaW5wdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwpAQCAtNjM1OSw3ICs2NjIxLDcgQEAKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQogICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdENhcHR1cmUpOwogI2lmZGVmIEFVRElPX1dBVENIRE9HCiAgICAgICAgIC8vIEZJWE1FCkBAIC02MzY3LDYgKzY2MjksMTAgQEAKIAogICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0KG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCksIE5CQUlPX1RlZTo6VEVFX0ZMQUdfSU5QVVRfVEhSRUFEKTsKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9DIik7CisjZW5kaWYKIGZhaWxlZDogOwogCiAgICAgLy8gRklYTUUgbU5vcm1hbFNvdXJjZQpAQCAtNjQ5NCw2ICs2NzYwLDcgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTSU5HOgogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNFRDsKICAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBzaXplLS07CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjUxNSwxMiArNjc4MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBhbGxTdG9wcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRTogICAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBpZGxlCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNFRDogIC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgcGF1c2VkCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUT1BQRUQ6IC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgZGVzdHJveWVkL3Rlcm1pbmF0ZWQKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmV4cGVjdGVkIGFjdGl2ZVRyYWNrU3RhdGUgJWQiLCBhY3RpdmVUcmFja1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IFVuZXhwZWN0ZWQgYWN0aXZlIHRyYWNrIHN0YXRlOiVkLCBpZDolZCwgdHJhY2tzOiV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFjdGl2ZVRyYWNrU3RhdGUsIGFjdGl2ZVRyYWNrLT5pZCgpLCBzaXplKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBhY3RpdmVUcmFja3MuYWRkKGFjdGl2ZVRyYWNrKTsKQEAgLTY1NDUsNyArNjgxMiw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHNsZWVwIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgdHJhY2tzIHRvIHByb2Nlc3MKLSAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNsZWVwVXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjU5Niw2ICs2ODYzLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBhYnAgPSAoZmFzdFRyYWNrICE9IDAgJiYgZmFzdFRyYWNrLT5pc1BhdGNoVHJhY2soKSkgPworICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEF1ZGlvQnVmZmVyUHJvdmlkZXIqPihmYXN0VHJhY2suZ2V0KCkpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IGFicCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBhYnA7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQgPSBmYXN0VHJhY2sgPT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCA6IGZhc3RUcmFjay0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNxLT5lbmQoZGlkTW9kaWZ5KTsKICAgICAgICAgICAgIGlmIChkaWRNb2RpZnkpIHsKICAgICAgICAgICAgICAgICBzcS0+cHVzaChibG9jayk7CkBAIC02NjIxLDggKzY4OTYsNyBAQAogCiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKIAogICAgICAgICAgICAgLy8gVGhlIGF1ZGlvIGZpZm8gcmVhZCgpIHJldHVybnMgT1ZFUlJVTiBvbiBvdmVyZmxvdywgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIKICAgICAgICAgICAgIC8vIHRvIHRoZSBmdWxsIGJ1ZmZlciBwb2ludCAoY2xlYXJpbmcgdGhlIG92ZXJmbG93IGNvbmRpdGlvbikuICBVcG9uIE9WRVJSVU4gZXJyb3IsCkBAIC02Njg0LDggKzY5NTgsMjQgQEAKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBrZXJuZWwgc3RhdHMKICAgICAgICAgaWYgKG1QaXBlU291cmNlLmdldCgpID09IG51bGxwdHIgLyogZG9uJ3Qgb2J0YWluIGZvciBGYXN0Q2FwdHVyZSwgY291bGQgYmxvY2sgKi8pIHsKICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24sIHRpbWU7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gbUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSkgPT0gTk9fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgdGltZSA+IG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZChwb3NpdGlvbiwgdGltZSwgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZSA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHRpbWU7CiAgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gZ2VuZXJhbCByZWNvcmQgYnVmZmVycyBzaG91bGQgdGVuZCB0byBiZSBlbXB0eSBpbgpAQCAtNjY5Myw2ICs2OTgzLDggQEAKICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgIC8vIEFsc28sIGl0IGlzIG5vdCBhZHZhbnRhZ2VvdXMgdG8gY2FsbCBnZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uIGR1cmluZyB0aGUgcmVhZAogICAgICAgICAgICAgICAgIC8vIGFzIHRoZSByZWFkIG9idGFpbnMgYSBsb2NrLCBwcmV2ZW50aW5nIHRoZSB0aW1lc3RhbXAgY2FsbCBmcm9tIGV4ZWN1dGluZy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGltZXN0YW1wIGluZm9ybWF0aW9uCkBAIC02NzA4LDEwICs3MDAwLDExIEBACiAgICAgICAgICAgICBnb3RvIHVubG9jazsKICAgICAgICAgfQogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CisgICAgICAgIG1GcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CiAKLSAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgICAgICAodm9pZCltVGVlLndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOworI2VuZGlmCiAgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCB3ZSBub3cgY29ycmVjdCBmb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuCiAgICAgICAgIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIHJlYXI7CkBAIC02NzY5LDkgKzcwNjIsMzMgQEAKICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBtaW4oZnJhbWVzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25GcmFtZXNQb3NzaWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIG1TYW1wbGVSYXRlLCBhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpKTsKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjayBidWZmZXIKLSAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsIGZyYW1lc091dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gUmVjb3JkQnVmZmVyQ29udmVydGVyIHVzZWQgZm9yIGRpcmVjdCBzdHJlYW1zLiBQYXNzCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmFpZ2h0IGZyb20gUmVjb3JkVGhyZWFkIGJ1ZmZlciB0byBSZWNvcmRUcmFjayBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LICYmIGJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKGJ1ZmZlci5mcmFtZUNvdW50ICE9IGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCkgcmVhZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKCV6dSB2cyAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ1ZmZlci5mcmFtZUNvdW50LCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgYnVmZmVyLnJhdywgYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgY2Fubm90IGZpbGwgcmVxdWVzdCwgc3RhdHVzOiAlZCwgZnJhbWVDb3VudDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBidWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjaworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKQEAgLTY5NDIsNiArNzI1OSwxMiBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpICYmICgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIG9uIGFuIGVuY29kZWQgc3RyZWFtIHJlcXVpcmVzIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtNzEwNyw4ICs3NDMwLDE0IEBACiAgICAgewogICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgYSByZW5kZXp2b3VzIGJldHdlZW4gYmluZGVyIHRocmVhZCBleGVjdXRpbmcgc3RhcnQoKSBhbmQgUmVjb3JkVGhyZWFkCiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IHN0b3BwZWQgeWV0IChtb3ZlZCB0byBQQVVTRUQgYW5kIG5vdCBpbiBtQWN0aXZlVHJhY2tzKQorICAgICAgICAgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gc3RhcnRJbnB1dCgpLgogICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTcxMjUsMTcgKzc0NTQsMzQgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZDsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSwgJnNpbGVuY2VkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgeworICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOworICAgICAgICAgICAgICAgICAgICAvLyBTVEFSVElOR18yIGZvcmNlcyBkZXN0cm95IHRvIGNhbGwgc3RvcElucHV0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBtU3RhdGU6JWQgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAvLyBTb21lb25lIGVsc2UgaGFzIGNoYW5nZWQgc3RhdGUsIGxldCB0aGVtIHRha2Ugb3ZlciwKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtU3RhdGUgaW4gdGhlIG5ldyBzdGF0ZS4KKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlJ3JlIG9rLCBidXQgcGVyaGFwcyBzdGFydElucHV0IGhhcyBmYWlsZWQKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBzdGFydElucHV0IGZhaWxlZCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBBY3RpdmVUcmFja3MgaWYgU1RBUlRJTkdfMSBhbmQgdmFsaWQsIHNvIHJlbW92ZSBmcm9tIEFjdGl2ZVRyYWNrcywKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpbiBTVEFSVElOR18xLCBzbyBkZXN0cm95KCkgd2lsbCBub3QgY2FsbCBzdG9wSW5wdXQuCiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RhcnQgZXJyb3IgJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWNvcmRUcmFjay0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIENhdGNoIHVwIHdpdGggY3VycmVudCBidWZmZXIgaW5kaWNlcyBpZiB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLgogICAgICAgICAvLyBUaGlzIGlzIHdoYXQgbWFrZXMgYSBuZXcgY2xpZW50IGRpc2NhcmQgYWxsIGJ1ZmZlcmVkIGRhdGEuICBJZiB0aGUgdHJhY2sncyBtUnNtcEluRnJvbnQKQEAgLTcxNDMsMjYgKzc0ODksMTUgQEAKICAgICAgICAgLy8gc2VlIHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YSBiZWZvcmUgaXQgY2FsbGVkIHN0YXJ0KCksIGJ1dCB3aXRoIGdyZWF0ZXIgcmlzayBvZiBvdmVycnVuLgogCiAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCi0gICAgICAgIHJlY29yZFRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5yZXNldCgpOworICAgICAgICBpZiAoIXJlY29yZFRyYWNrLT5pc0RpcmVjdCgpKSB7CisgICAgICAgICAgICAvLyBjbGVhciBhbnkgY29udmVydGVyIHN0YXRlIGFzIG5ldyBkYXRhIHdpbGwgYmUgZGlzY29udGludW91cworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIH0KICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKICAgICAgICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdGFydAogICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiUmVjb3JkIGZhaWxlZCB0byBzdGFydCIpOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBzdGFydEVycm9yOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotCi1zdGFydEVycm9yOgotICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCkpOwotICAgIH0KLSAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgIC8vIEZJWE1FIEkgd29uZGVyIHdoeSB3ZSBkbyBub3QgcmVzZXQgdGhlIHN0YXRlIGhlcmU/Ci0gICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3luY1N0YXJ0RXZlbnRDYWxsYmFjayhjb25zdCB3cDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTcxODEsMjQgKzc1MTYsMjYgQEAKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0b3AoUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIHsKICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdG9wIik7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAvLyBpZiB3ZSdyZSBpbnZhbGlkLCB3ZSBjYW4ndCBiZSBvbiB0aGUgQWN0aXZlVHJhY2tzLgogICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCB8fCByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIC8vIG5vdGUgdGhhdCB0aHJlYWRMb29wIG1heSBzdGlsbCBiZSBwcm9jZXNzaW5nIHRoZSB0cmFjayBhdCB0aGlzIHBvaW50IFt3aXRob3V0IGxvY2tdCiAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0lORzsKLSAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0b3AKLSAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKLSAgICAvLyBkbyBub3Qgd2FpdCBmb3IgbVN0YXJ0U3RvcENvbmQgaWYgZXhpdGluZwotICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOworCisgICAgd2hpbGUgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HICYmICFyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7IC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAorICAgICAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKICAgICB9Ci0gICAgLy8gRklYTUUgaW5jb3JyZWN0IHVzYWdlIG9mIHdhaXQ6IG5vIGV4cGxpY2l0IHByZWRpY2F0ZSBvciBsb29wCi0gICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7Ci0gICAgLy8gaWYgd2UgaGF2ZSBiZWVuIHJlc3RhcnRlZCwgcmVjb3JkVHJhY2sgaXMgaW4gbUFjdGl2ZVRyYWNrcyBoZXJlCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkgfHwgbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKKworICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0VEKSB7IC8vIHN1Y2Nlc3NmdWwgc3RvcAogICAgICAgICBBTE9HVigiUmVjb3JkIHN0b3BwZWQgT0siKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgLy8gZG9uJ3QgaGFuZGxlIGFueXRoaW5nIC0gd2UndmUgYmVlbiBpbnZhbGlkYXRlZCBvciByZXN0YXJ0ZWQgYW5kIGluIGEgZGlmZmVyZW50IHN0YXRlCisgICAgQUxPR1dfSUYoIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgc3RvcCwgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC03MzAwLDcgKzc2MzcsOCBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBpbnB1dCAhPSBOVUxMID8gaW5wdXQtPmZsYWdzIDogQVVESU9fSU5QVVRfRkxBR19OT05FOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtSW46ICVwIGZsYWdzICUjeCAoJXMpXG4iLAogICAgICAgICAgICAgaW5wdXQsIGZsYWdzLCBpbnB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOwotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgZHByaW50ZihmZCwgIiAgRnJhbWVzIHJlYWQ6ICVsbGRcbiIsIChsb25nIGxvbmcpbUZyYW1lc1JlYWQpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KIApAQCAtNzMwOSw2ICs3NjQ3LDE0IEBACiAgICAgICAgICh2b2lkKWlucHV0LT5zdHJlYW0tPmR1bXAoZmQpOwogICAgIH0KIAorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBSZWNvcmRUcmFjazo6Y2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKQorICAgICAgICAgICAgPyAtIG1UaW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKG1TYW1wbGVSYXRlKSA6IDAuOworICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsUmVjb3JkIGxhdGVuY3kgbXM6ICUuMmxmXG4iLCBsYXRlbmN5TXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vcm1hbFJlY29yZCBsYXRlbmN5IG1zOiB1bmF2YWlsXG4iKTsKKyAgICB9CisKICAgICBkcHJpbnRmKGZkLCAiICBGYXN0IGNhcHR1cmUgdGhyZWFkOiAlc1xuIiwgaGFzRmFzdENhcHR1cmUoKSA/ICJ5ZXMiIDogIm5vIik7CiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbGFibGU6ICVzXG4iLCBtRmFzdFRyYWNrQXZhaWwgPyAieWVzIiA6ICJubyIpOwogCkBAIC03MzE2LDkgKzc2NjIsOSBAQAogICAgIC8vIHdoaWxlIHdlIGFyZSBkdW1waW5nIGl0LiAgSXQgbWF5IGJlIGluY29uc2lzdGVudCwgYnV0IGl0IHdvbid0IG11dGF0ZSEKICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgY29uc3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdENhcHR1cmVEdW1wU3RhdGUobUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdENhcHR1cmVEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxGYXN0Q2FwdHVyZUR1bXBTdGF0ZT4obUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKICAgICBjb3B5LT5kdW1wKGZkKTsKLSAgICBkZWxldGUgY29weTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC03MzMyLDcgKzc2NzgsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTczNTIsNyArNzY5OCw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtNzY0NywxMCArNzk5MywxNSBAQAogewogICAgIHN0YXR1c190IHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoJm1TYW1wbGVSYXRlLCAmbUNoYW5uZWxNYXNrLCAmbUhBTEZvcm1hdCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciByZXRyaWV2aW5nIGF1ZGlvIHByb3BlcnRpZXMgZnJvbSBIQUw6ICVkIiwgcmVzdWx0KTsKLSAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPiBGQ0NfOCwgIkhBTCBjaGFubmVsIGNvdW50ICVkID4gJWQiLCBtQ2hhbm5lbENvdW50LCBGQ0NfOCk7CiAgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSwgIkhBTCBmb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgbUZvcm1hdCk7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBGQ0NfOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2FuIGhhdmUgbW9yZSB0aGF0IEZDQ184IGNoYW5uZWxzIGluIGVuY29kZWQgc3RyZWFtcy4KKyAgICAgICAgQUxPR0koIkhBTCBmb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgbUZvcm1hdCk7CisgICAgfQogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRGcmFtZVNpemUoJm1GcmFtZVNpemUpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBmcmFtZSBzaXplIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7CiAgICAgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEJ1ZmZlclNpemUoJm1CdWZmZXJTaXplKTsKQEAgLTc3NTUsNyArODEwNiw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQogewogICAgIC8vIG9ubHkgb25lIGNoYWluIHBlciBpbnB1dCB0aHJlYWQKLSAgICBpZiAobUVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkpIHsKICAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC03ODYwLDI0ICs4MjExLDI4IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVRyYWNrcy5hZGQocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKICAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtQXVkaW9Tb3VyY2U7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc5NjQsNyArODMxOSw3IEBACiAgICAgfQogICAgIC8vIFRoaXMgd2lsbCBkZWNyZW1lbnQgcmVmZXJlbmNlcyBhbmQgbWF5IGNhdXNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIHRocmVhZC4KICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgfQpAQCAtODA3NiwyMSArODQzMSwyMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGJvb2wgc2lsZW5jZWQgPSBmYWxzZTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQocG9ydElkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCk7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyBhYm9ydCBpZiBzdGFydCBpcyByZWplY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlcgogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBzdGFydCByZWplY3RlZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9CkBAIC04MTAxLDIxICs4NDU1LDIxIEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPworICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0cHV0KCksIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CisKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICAvLyBmb3JjZSB2b2x1bWUgdXBkYXRlIHdoZW4gYSBuZXcgdHJhY2sgaXMgYWRkZWQKICAgICAgICAgbUhhbFZvbEZsb2F0ID0gLTEuMGY7Ci0gICAgfSBlbHNlIGlmICghc2lsZW5jZWQpIHsKLSAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNTaWxlbmNlZF9sKCkgJiYgdHJhY2stPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCi0gICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKKyAgICB9IGVsc2UgaWYgKCF0cmFjay0+aXNTaWxlbmNlZF9sKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgaWYgKHQtPmlzU2lsZW5jZWRfbCgpICYmIHQtPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCisgICAgICAgICAgICAgICAgdC0+aW52YWxpZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KLSAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLCBwb3J0SWQpOwogCi0gICAgdHJhY2stPnNldFNpbGVuY2VkX2woc2lsZW5jZWQpOwogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwogICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC04MTYyLDggKzg1MTYsOCBAQAogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dCh0cmFjay0+cG9ydElkKCkpOwpAQCAtODE4OCw3ICs4NTQyLDcgQEAKICAgICBpZiAobUhhbFN0cmVhbSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgIGlmICghbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtSGFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC04NDU5LDkgKzg4MTMsOSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwogICAgICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUF1ZGlvSHdEZXYtPmhhbmRsZSgpOwpAQCAtODYyNiw3ICs4OTgwLDcgQEAKICAgICBkcHJpbnRmKGZkLCAiICBBdHRyaWJ1dGVzOiBjb250ZW50IHR5cGUgJWQgdXNhZ2UgJWQgc291cmNlICVkXG4iLAogICAgICAgICAgICAgbUF0dHIuY29udGVudF90eXBlLCBtQXR0ci51c2FnZSwgbUF0dHIuc291cmNlKTsKICAgICBkcHJpbnRmKGZkLCAiICBTZXNzaW9uOiAlZCBwb3J0IElkOiAlZFxuIiwgbVNlc3Npb25JZCwgbVBvcnRJZCk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIGNsaWVudHNcbiIpOwogICAgIH0KIH0KQEAgLTg2MzksNyArODk5Myw3IEBACiAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CkBAIC04ODQ1LDYgKzkxOTksMTUgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1PdXRwdXQgJiYgbU91dHB1dC0+ZmxhZ3MgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLm91dHB1dCA9IG1PdXRwdXQtPmZsYWdzOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgTW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CkBAIC04ODY3LDcgKzkyMzAsMTMgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6ZXhpdFN0YW5kYnkoKQogewotICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgIHsKKyAgICAgICAgLy8gbUlucHV0IG1pZ2h0IGhhdmUgYmVlbiBjbGVhcmVkIGJ5IGNsZWFySW5wdXQoKQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5zdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE1tYXBUaHJlYWQ6OmV4aXRTdGFuZGJ5KCk7CiB9CiAKQEAgLTg5MzUsNCArOTMwNCwxMyBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtSW5wdXQgJiYgbUlucHV0LT5mbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5pbnB1dCA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCBlYTI5NDU1Li5lOGIyMTU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTI4MSw3ICsyODEsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwogCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCkBAIC0zOTMsNiArMzkzLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGJyb2FkY2FzdF9sKCk7CiAKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc01zZERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc01zZERldmljZTsgfQorCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKIHByb3RlY3RlZDoKQEAgLTQzNCw2ICs0NDAsMTIgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vIF9fdW51c2VkKSB7IH0KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB3aXRoaW4gdGhlIHRocmVhZExvb3AgdG8gb2J0YWluIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwuCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG1FZmZlY3RDaGFpbnMKIAogICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVfdCAgICAgICAgICAgIG1UeXBlOwpAQCAtNDkzLDEwICs1MDUsMTcgQEAKICAgICAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtTkJMb2dXcml0ZXI7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5OwogICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICAgICAgIG1UaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8IC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzTXNkRGV2aWNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgLy8gQSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIGV2YWx1YXRlZCBieSB0aGUgdGhyZWFkIGxvb3AgaGFzIGNoYW5nZWQgYW5kCiAgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBub3Qgd2FpdCBmb3IgYXN5bmMgd3JpdGUgY2FsbGJhY2sgaW4gdGhlIHRocmVhZCBsb29wIGJlZm9yZSBldmFsdWF0aW5nIGl0CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVNpZ25hbFBlbmRpbmc7CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgICAgIE5CQUlPX1RlZSAgICAgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3MgaXMgYSBzb3J0ZWQgdmVjdG9yIG9mIHRyYWNrIHR5cGUgVCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZlIHRyYWNrcyBvZiB0aHJlYWRMb29wKCkgdG8gYmUgY29uc2lkZXJlZCBieSB0aGUgbG9ja2VkIHByZXBhcmUgcG9ydGlvbi4KICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3Mgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlIFRocmVhZEJhc2UgbG9jayBoZWxkLgpAQCAtNTQzLDYgKzU2Miw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPFQ+JiBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NDUsNyArNjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBsYXliYWNrVGhyZWFkKCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwpAQCAtNzg0LDcgKzgwNiw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBhc3luY2hyb25vdXMgc2lnbmFsIHdhaXQgdGltZS4KICAgICB2aXJ0dWFsICAgICBpbnQ2NF90ICAgICBjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3QgeyByZXR1cm4gSU5UNjRfTUFYOyB9CkBAIC04MDEsNiArODIzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVHJhY2tzLnNpemUoKSA8IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgJiBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZSkgJiYgcG9wY291bnQoZGV2aWNlKSA+IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogcHJvdGVjdGVkOgogICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwpAQCAtODgwLDYgKzkwNywxMSBAQAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbjsKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuOyAvLyBub3QgcmVzZXQgb24gc3RhbmRieQogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZEZyYW1lczsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKKworICAgIC8vIG1IYXB0aWNDaGFubmVsTWFzayBhbmQgbUhhcHRpY0NoYW5uZWxDb3VudCB3aWxsIG9ubHkgYmUgdmFsaWQgd2hlbiB0aGUgdGhyZWFkIHN1cHBvcnQKKyAgICAvLyBoYXB0aWMgcGxheWJhY2suCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gMDsKIHByaXZhdGU6CiAgICAgLy8gbU1hc3Rlck11dGUgaXMgaW4gYm90aCBQbGF5YmFja1RocmVhZCBhbmQgaW4gQXVkaW9GbGluZ2VyLiAgV2hlbiBhCiAgICAgLy8gUGxheWJhY2tUaHJlYWQgbmVlZHMgdG8gZmluZCBvdXQgaWYgbWFzdGVyLW11dGVkLCBpdCBjaGVja3MgaXQncyBsb2NhbApAQCAtOTM1LDE2ICs5NjcsMTkgQEAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAotICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyBuYW1lcyBmb3IgYWxsIHRyYWNrcwotICAgIC8vIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIFRocmVhZC4KKyAgICAvLyBUaGUgVHJhY2tzIGNsYXNzIG1hbmFnZXMgdHJhY2tzIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIFRocmVhZC4KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICBjbGFzcyBUcmFja3MgewogICAgIHB1YmxpYzoKLSAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja05hbWVzKSA6Ci0gICAgICAgICAgICBtU2F2ZURlbGV0ZWRUcmFja05hbWVzKHNhdmVEZWxldGVkVHJhY2tOYW1lcykgeyB9CisgICAgICAgIFRyYWNrcyhib29sIHNhdmVEZWxldGVkVHJhY2tJZHMpIDoKKyAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrSWRzKHNhdmVEZWxldGVkVHJhY2tJZHMpIHsgfQogCiAgICAgICAgIC8vIFNvcnRlZFZlY3RvciBtZXRob2RzCi0gICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8VD4gJnRyYWNrKTsKKyAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spIHsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmFkZCh0cmFjayk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImNhbm5vdCBhZGQgdHJhY2siKTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQogICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlKGNvbnN0IHNwPFQ+ICZ0cmFjayk7CiAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwpAQCAtOTY1LDI4ICsxMDAwLDE5IEBACiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5lbmQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCAgICAgICAgICBwcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gbURlbGV0ZWRUcmFja05hbWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBtRGVsZXRlZFRyYWNrTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZihuYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHNpemVfdCAgICAgICAgICBwcm9jZXNzRGVsZXRlZFRyYWNrSWRzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGludCB0cmFja0lkIDogbURlbGV0ZWRUcmFja0lkcykgeworICAgICAgICAgICAgICAgIGYodHJhY2tJZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBtRGVsZXRlZFRyYWNrSWRzLnNpemUoKTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja05hbWVzKCkgeyBtRGVsZXRlZFRyYWNrTmFtZXMuY2xlYXIoKTsgfQorICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tJZHMoKSB7IG1EZWxldGVkVHJhY2tJZHMuY2xlYXIoKTsgfQogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgLy8gVHJhY2sgbmFtZXMgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCi0gICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tOYW1lczsgLy8gdHJ1ZSB0byBlbmFibGUgdHJhY2tpbmcKLSAgICAgICAgc3RkOjpzZXQ8aW50PiBtRGVsZXRlZFRyYWNrTmFtZXM7Ci0KLSAgICAgICAgLy8gRmFzdCBsb29rdXAgb2YgcHJldmlvdXNseSBkZWxldGVkIHRyYWNrIG5hbWVzIGZvciByZXVzZS4KLSAgICAgICAgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgZGVjaXNpb24gKGFjdHVhbGx5IGFueSBub24tbmVnYXRpdmUKLSAgICAgICAgLy8gaW50ZWdlciB0aGF0IGlzbid0IGluIG1UcmFja3NbKl0tPm5hbWVzKCkgY291bGQgYmUgdXNlZCkgLSB3ZSBhdHRlbXB0Ci0gICAgICAgIC8vIHRvIHVzZSB0aGUgc21hbGxlc3QgcG9zc2libGUgYXZhaWxhYmxlIG5hbWUuCi0gICAgICAgIHN0ZDo6c2V0PGludD4gbVVudXNlZFRyYWNrTmFtZXM7CisgICAgICAgIC8vIFRyYWNrcyBwZW5kaW5nIGRlbGV0aW9uIGZvciBNSVhFUiB0eXBlIHRocmVhZHMKKyAgICAgICAgY29uc3QgYm9vbCBtU2F2ZURlbGV0ZWRUcmFja0lkczsgLy8gdHJ1ZSB0byBlbmFibGUgdHJhY2tpbmcKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBtRGVsZXRlZFRyYWNrSWRzOwogCiAgICAgICAgIFNvcnRlZFZlY3RvcjxzcDxUPj4gbVRyYWNrczsgLy8gd3JhcHBlZCBTb3J0ZWRWZWN0b3IuCiAgICAgfTsKQEAgLTEwNTYsMTYgKzEwODIsMTMgQEAKICAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtUGlwZVNpbms7CiAgICAgLy8gVGhlIGN1cnJlbnQgc2luayBmb3IgdGhlIG5vcm1hbCBtaXhlciB0byB3cml0ZSBpdCdzIChzdWIpbWl4LCBtT3V0cHV0U2luayBvciBtUGlwZVNpbmsKICAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtTm9ybWFsU2luazsKLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIEZvciBkdW1wc3lzCi0gICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbVRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiAgICAgICAgbVRlZVNvdXJjZTsKLSNlbmRpZgogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TY3JlZW5TdGF0ZTsgICAvLyBjYWNoZWQgY29weSBvZiBnU2NyZWVuU3RhdGUKICAgICAvLyBUT0RPOiBhZGQgY29tbWVudCBhbmQgYWRqdXN0IHNpemUgYXMgbmVlZGVkCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAga0Zhc3RNaXhlckxvZ1NpemUgPSA4ICogMTAyNDsKICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXI7CiAKKyAgICAvLyBEb3duc3RyZWFtIHBhdGNoIGxhdGVuY3ksIGF2YWlsYWJsZSBpZiBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMC4KKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNc3swLjk5OX07CiAKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCA9IDA7CkBAIC0xMTIxLDcgKzExNDQsNiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc3RhbmRieSgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfbWl4KCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyhjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgY29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdDsKIAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMTE1NCw2ICsxMTc2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUZhc3RNaXhlckR1bXBTdGF0ZS5tVHJhY2tzW2Zhc3RJbmRleF0ubVVuZGVycnVuczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAoKnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgc2V0TWFzdGVyTW9ub19sKGJvb2wgbW9ubykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNb25vLnN0b3JlKG1vbm8pOwpAQCAtMTE3NCw2ICsxMjA0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5EaXJlY3RPdXRwdXRUaHJlYWQoKTsKIAorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKQEAgLTEyMTEsNiArMTI0MywyMyBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICB2aXJ0dWFsICAgICBpbnQ2NF90ICAgICBjb21wdXRlV2FpdFRpbWVOc19sKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIERJUkVDVCBhbmQgT0ZGTE9BRCB0aHJlYWRzLCBxdWVyeSB0aGUgb3V0cHV0IHNpbmsgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVwb3NpdGlvbjY0OworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cG9zaXRpb242NCwgJnRpbWUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKGludDY0X3QpdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQogfTsKIAogY2xhc3MgT2ZmbG9hZFRocmVhZCA6IHB1YmxpYyBEaXJlY3RPdXRwdXRUaHJlYWQgewpAQCAtMTMxOCw2ICsxMzY3LDIyIEBACiAgICAgU29ydGVkVmVjdG9yIDwgc3A8T3V0cHV0VHJhY2s+ID4gIG1PdXRwdXRUcmFja3M7CiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU91dHB1dFRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBmb3J3YXJkIHRoZSBmaXJzdCBPdXRwdXRUcmFjaydzIGtlcm5lbCBpbmZvcm1hdGlvbiBmb3IgdGltZXN0YW1wLgorICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgdHJhY2tUaW1lc3RhbXAgPQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0VHJhY2tzWzBdLT5nZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpOworICAgICAgICAgICAgaWYgKHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPiAwKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsgIC8vIGRpc2NhcmQgc2VydmVyIHRpbWVzdGFtcCAtIHRoYXQncyBpZ25vcmVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiB9OwogCiAvLyByZWNvcmQgdGhyZWFkCkBAIC0xMzc2LDkgKzE0NDEsNiBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCi0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHZpcnR1YWwgICAgIH5SZWNvcmRUaHJlYWQoKTsKIApAQCAtMTQyNSw3ICsxNDg3LDcgQEAKICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gZG8gaXQncyBwYXJ0IG9mIHRoZSBzdG9wcGluZyBwcm9jZXNzCiAgICAgICAgICAgICBib29sICAgICAgICBzdG9wKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKICAgICAgICAgICAgIHZpcnR1YWwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdDsKIApAQCAtMTQzOSw4ICsxNTAxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKQEAgLTE0NjEsNyArMTUyMyw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwpAQCAtMTQ4MSw2ICsxNTQzLDEzIEBACiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgICAgICAgICAgYm9vbCAgICAgICAgZmFzdFRyYWNrQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RUcmFja0F2YWlsOyB9CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHBvcGNvdW50IGZvciBleGFjdGx5IG9uZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2lucHV0X2RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkRldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIHByaXZhdGU6CiAgICAgICAgICAgICAvLyBFbnRlciBzdGFuZGJ5IGlmIG5vdCBhbHJlYWR5IGluIHN0YW5kYnksIGFuZCBzZXQgbVN0YW5kYnkgZmxhZwogICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CkBAIC0xNTA4LDggKzE1NzcsNiBAQAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblJlYXI7ICAgIC8vIGxhc3QgZmlsbGVkIGZyYW1lICsgMQogCiAgICAgICAgICAgICAvLyBGb3IgZHVtcHN5cwotICAgICAgICAgICAgY29uc3Qgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgbVRlZVNpbms7Ci0KICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CiAKICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZApAQCAtMTU1Miw2ICsxNjE5LDggQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbDsgICAgLy8gdHJ1ZSBpZiBmYXN0IHRyYWNrIGF2YWlsYWJsZQogICAgICAgICAgICAgLy8gY29tbW9uIHN0YXRlIHRvIGFsbCByZWNvcmQgdGhyZWFkcwogICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCAgICAgICAgICAgICAgICAgICAgbUJ0TnJlY1N1c3BlbmRlZDsKKworICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWQgPSAwOyAgICAvLyBjb250aW51b3VzIHJ1bm5pbmcgY291bnRlci4KIH07CiAKIGNsYXNzIE1tYXBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQpAQCAtMTYwNCw3ICsxNjczLDcgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgdmlydHVhbCAgICAgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtSGFsU3RyZWFtOyB9CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKQEAgLTE2MjcsNyArMTY5Niw3IEBACiAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgVUlEIHJlY29yZHMgc2lsZW5jZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCBfX3VudXNlZCwgYm9vbCBzaWxlbmNlZCBfX3VudXNlZCkge30KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTY4OCw2ICsxNzU3LDggQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwpAQCAtMTcxNiw2ICsxNzg3LDggQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgbUlucHV0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNjZmI2OWYuLmM5NDYzOWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTI1LDEzICsyNSwxMyBAQAogcHVibGljOgogICAgIGVudW0gdHJhY2tfc3RhdGUgewogICAgICAgICBJRExFLAotICAgICAgICBGTFVTSEVELAorICAgICAgICBGTFVTSEVELCAgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBFRCwKICAgICAgICAgLy8gbmV4dCAyIHN0YXRlcyBhcmUgY3VycmVudGx5IHVzZWQgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgIC8vIGFuZCBvZmZsb2FkZWQgdHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBJTkdfMSwgICAgIC8vIHdhaXRpbmcgZm9yIGZpcnN0IHVuZGVycnVuCiAgICAgICAgIFNUT1BQSU5HXzIsICAgICAvLyB3YWl0aW5nIGZvciBwcmVzZW50YXRpb24gY29tcGxldGUKLSAgICAgICAgUkVTVU1JTkcsCisgICAgICAgIFJFU1VNSU5HLCAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBBQ1RJVkUsCiAgICAgICAgIFBBVVNJTkcsCiAgICAgICAgIFBBVVNFRCwKQEAgLTU0LDExICs1NCw2IEBACiAgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBUUkFDS19OQU1FX1BFTkRJTkcgPSAtMSwKLSAgICAgICAgVFJBQ0tfTkFNRV9GQUlMVVJFID0gLTIsCi0gICAgfTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIG1BdHRyLApAQCAtOTEsNiArODYsNyBAQAogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQogICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KQEAgLTEwMCw2ICs5NiwxMDYgQEAKIAogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICB2b2lkICAgICAgICAgZHVtcFRlZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24pIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlZS5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHRoZSBidWZmZXIgY29udGVudHMgc2l6ZSBjb252ZXJ0ZWQgdG8gdGltZSBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAqIGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHN0cmVhbWluZyB0cmFja3MuIFRoZSByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IKKyAgICAgICAgICAgICAqIFBDTSBzdGF0aWMgdHJhY2tzIGFuZCBub3QgZGVmaW5lZCBmb3Igbm9uLVBDTSB0cmFja3MuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLgorICAgICAgICAgICAgICovCisgICAgdmlydHVhbCBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCkgKiAxMDAwIC8gc2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSB0cmFjayBzdXBwb3J0cyBzZXJ2ZXIgbGF0ZW5jeSBjb21wdXRhdGlvbi4KKyAgICAgICAgICAgICAqIFRoaXMgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgdHJhY2sgbGlmZXRpbWUuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgY29uc3QgeyByZXR1cm4gbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQ7IH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSBzZXJ2ZXIgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFjaworICAgICAgICAgICAgICogdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4gIFRoaXMgaXMgdGhlIHRpbWUgZm9yIHRoZSBuZXh0IGZyYW1lIGluIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqIHdyaXR0ZW4gb3IgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRoZSBkZXZpY2Ugc291cmNlIG9yIHNpbmsuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIHNlcnZlciB0aHJlYWQgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNvdXJjZS9zaW5rLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFNlcnZlckxhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRocmVhZCBsb2NrIGlzIGFjcXVpcmVkLCB0aGVzZSBhdG9taWNzIGFyZSBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLCBjb25zaWRlcmVkIGEgYmVuaWduIHJhY2UuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgc2VydmVyTGF0ZW5jeU1zID0gbVNlcnZlckxhdGVuY3lNcy5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckxhdGVuY3lNcyA9PSAwLikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJvbVRyYWNrID0gbVNlcnZlckxhdGVuY3lGcm9tVHJhY2subG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIGNvbXB1dGVzIHRoZSB0b3RhbCBjbGllbnQgbGF0ZW5jeSBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCB0cmFja3MKKyAgICAgICAgICAgICAqIGZvciB0aGUgbmV4dCBjbGllbnQgYXBwIGFjY2VzcyB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlOyBpLmUuIHRoZQorICAgICAgICAgICAgICogc2VydmVyIGxhdGVuY3kgcGx1cyB0aGUgYnVmZmVyIGxhdGVuY3kuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIHRocmVhZCBsb2NrLCBidXQgbGF0ZW5jeU1zIGFuZCBmcm9tVHJhY2sKKyAgICAgICAgICAgICAqIG1heSBiZSBub3QgYmUgc3luY2hyb25pemVkLiBGb3IgZXhhbXBsZSBQYXRjaFBhbmVsIG1heSBub3Qgb2J0YWluIHRoZQorICAgICAgICAgICAgICogdGhyZWFkIGxvY2sgYmVmb3JlIGNhbGxpbmcuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHBhcmFtIGxhdGVuY3lNcyBvbiBzdWNjZXNzIGlzIHNldCB0byB0aGUgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlCisgICAgICAgICAgICAgKiAgICAgICAgbmV4dCBmcmFtZSB3cml0dGVuL3JlYWQgYnkgdGhlIGNsaWVudCBhcHAgdG8vZnJvbSB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgZGV2aWNlIHNpbmsvc291cmNlLgorICAgICAgICAgICAgICogXHBhcmFtIGZyb21UcmFjayBvbiBzdWNjZXNzIGlzIHNldCB0byB0cnVlIGlmIGxhdGVuY3kgd2FzIGNvbXB1dGVkIGRpcmVjdGx5CisgICAgICAgICAgICAgKiAgICAgICAgZnJvbSB0aGUgdHJhY2sgdGltZXN0YW1wOyBvdGhlcndpc2Ugc2V0IHRvIGZhbHNlIGlmIGxhdGVuY3kgd2FzCisgICAgICAgICAgICAgKiAgICAgICAgZXN0aW1hdGVkIGZyb20gdGhlIHNlcnZlciB0aW1lc3RhbXAuCisgICAgICAgICAgICAgKiAgICAgICAgZnJvbVRyYWNrIG1heSBiZSBudWxscHRyIG9yIG9taXR0ZWQgaWYgbm90IHJlcXVpcmVkLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxyZXR1cm5zIE9LIG9yIElOVkFMSURfT1BFUkFUSU9OIG9uIGZhaWx1cmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRyYWNrTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTZXJ2ZXJMYXRlbmN5TXMoJnNlcnZlckxhdGVuY3lNcywgZnJvbVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXMgKyBidWZmZXJMYXRlbmN5TXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBleHRlcm5hbC4KKyAgICAgICAgICAgc3RydWN0IEZyYW1lVGltZSB7CisgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lczsKKyAgICAgICAgICAgICAgIGludDY0X3QgdGltZU5zOworICAgICAgICAgICB9OworCisgICAgICAgICAgIC8vIEtlcm5lbEZyYW1lVGltZSBpcyB1cGRhdGVkIHBlciAibWl4IiBwZXJpb2QgZXZlbiBmb3Igbm9uLXBjbSB0cmFja3MuCisgICAgICAgICAgIHZvaWQgICAgICAgICBnZXRLZXJuZWxGcmFtZVRpbWUoRnJhbWVUaW1lICpmdCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZ0ID0gbUtlcm5lbEZyYW1lVGltZS5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICBpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0xMTEsOCArMjA3LDYgQEAKICAgICAvLyBidXQgcHV0dGluZyBpdCBpbiBUcmFja0Jhc2UgYXZvaWRzIHRoZSBjb21wbGV4aXR5IG9mIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICB2aXJ0dWFsIHNpemVfdCAgZnJhbWVzUmVhZHkoKSBjb25zdCB7IHJldHVybiBTSVpFX01BWDsgfQogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KQEAgLTIwOCwxMyArMzAyLDE5IEBACiAgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNPdXQ7CiAgICAgc3A8U2VydmVyUHJveHk+ICAgICBtU2VydmVyUHJveHk7CiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7Ci0gICAgc3A8TkJBSU9fU2luaz4gICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgIG1UZWVTb3VyY2U7CisjaWZkZWYgVEVFX1NJTksKKyAgICBOQkFJT19UZWUgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOwogICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KICAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgLy8gdW5pcXVlIElEIGZvciB0aGlzIHRyYWNrIHVzZWQgYnkgYXVkaW8gcG9saWN5CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQorCisgICAgYm9vbCAgICAgICAgICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2t7fTsgLy8gbGF0ZW5jeSBmcm9tIHRyYWNrIG9yIHNlcnZlciB0aW1lc3RhbXAuCisgICAgc3RkOjphdG9taWM8ZG91YmxlPiBtU2VydmVyTGF0ZW5jeU1ze307ICAgICAgICAvLyBsYXN0IGxhdGVuY3kgcHVzaGVkIGZyb20gc2VydmVyIHRocmVhZC4KKyAgICBzdGQ6OmF0b21pYzxGcmFtZVRpbWU+IG1LZXJuZWxGcmFtZVRpbWV7fTsgICAgIC8vIGxhc3QgZnJhbWUgdGltZSBvbiBrZXJuZWwgc2lkZS4KIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDZkMjVmYjkuLjlhN2YxZjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU2LDYgKzU2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tCYXNlIgogCiBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBuZXh0VHJhY2tJZCA9IDU1OwogCkBAIC0xMDIsOSArMTA0LDEwIEBACiAgICAgICAgIG1Jc0ludmFsaWQoZmFsc2UpCiB7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgY2xpZW50VWlkID09IEFVRElPX1VJRF9JTlZBTElEKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IEFVRElPX1VJRF9JTlZBTElEICYmIGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwogICAgICAgICBjbGllbnRVaWQgPSBjYWxsaW5nVWlkOwogICAgIH0KICAgICAvLyBjbGllbnRVaWQgY29udGFpbnMgdGhlIHVpZCBvZiB0aGUgYXBwIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdHJhY2ssIHNvIHdlIGNhbiBibGFtZQpAQCAtMTQ0LDcgKzE0Nyw3IEBACiAgICAgICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKHNpemUpOwogICAgICAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAogICAgICAgICAgICAgICAgIChtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKICAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTIsNyArMTU1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtQ2JsayA9IChhdWRpb190cmFja19jYmxrX3QgKikgbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAobUNibGsgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY2LDcgKzE2OSw4IEBACiAgICAgICAgICAgICBpZiAocm9IZWFwID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKGJ1ZmZlclNpemUpKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyID0gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHJvSGVhcCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvSGVhcC0+ZHVtcCgiYnVmZmVyIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjA1LDI3ICsyMDksMTIgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCBfX2Z1bmNfXywgbUlkLCAoaW50KWFsbG9jKTsKICAgICAgICAgfQogICAgICAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CiAKICNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoRm9ybWF0X2lzVmFsaWQocGlwZUZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtUcmFja0ZyYW1lcywgcGlwZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7cGlwZUZvcm1hdH07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7Ci0gICAgICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBtVGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHBpcGVSZWFkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVRlZS5zZXQoc2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgZm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX1RSQUNLKTsKICNlbmRpZgogCiAgICAgfQpAQCAtMjQ0LDkgKzIzMyw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjp+VHJhY2tCYXNlKCkKIHsKLSNpZmRlZiBURUVfU0lOSwotICAgIGR1bXBUZWUoLTEsIG1UZWVTb3VyY2UsIG1JZCwgJ1QnKTsKLSNlbmRpZgogICAgIC8vIGRlbGV0ZSB0aGUgcHJveHkgYmVmb3JlIGRlbGV0aW5nIHRoZSBzaGFyZWQgbWVtb3J5IGl0IHJlZmVycyB0bywgdG8gYXZvaWQgZGFuZ2xpbmcgcmVmZXJlbmNlCiAgICAgbVNlcnZlclByb3h5LmNsZWFyKCk7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKQEAgLTI3NCw5ICsyNjAsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICNpZmRlZiBURUVfU0lOSwotICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgfQorICAgIG1UZWUud3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAjZW5kaWYKIAogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwpAQCAtMjk2LDYgKzI4MCw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKQEAgLTM0MCw2ICszMjYsMTAgQEAKICAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKQEAgLTM2OCw2ICszNTgsOCBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2siCiAKIC8vIFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKApAQCAtMzk3LDcgKzM4OSw2IEBACiAgICAgLy8gbVJldHJ5Q291bnQgaW5pdGlhbGl6ZWQgbGF0ZXIgd2hlbiBuZWVkZWQKICAgICBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksCiAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgbU5hbWUoVFJBQ0tfTkFNRV9GQUlMVVJFKSwgIC8vIHNldCB0byBUUkFDS19OQU1FX1BFTkRJTkcgb24gY29uc3RydWN0b3Igc3VjY2Vzcy4KICAgICBtTWFpbkJ1ZmZlcih0aHJlYWQtPnNpbmtCdWZmZXIoKSksCiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKQEAgLTQxNyw4ICs0MDgsOCBAQAogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoJWQpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNCw3ICs0MjUsNyBAQAogICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAKICAgICBpZiAoIXRocmVhZC0+aXNUcmFja0FsbG93ZWRfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCkpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQpAQCAtNDUzLDEyICs0NDQsMTggQEAKICAgICAgICAgbUZhc3RJbmRleCA9IGk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQotICAgIG1OYW1lID0gVFJBQ0tfTkFNRV9QRU5ESU5HOworCisgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUgorICAgICAgICAgICAgfHwgdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkpOworI2VuZGlmCiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp+VHJhY2soKQogewotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6VHJhY2sgZGVzdHJ1Y3RvciIpOworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKIAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIHdvdWxkIGNsZWFyIG1TaGFyZWRCdWZmZXIsCiAgICAgLy8gYnV0IGl0IHdpbGwgbm90IHB1c2ggdGhlIGRlY3JlbWVudGVkIHJlZmVyZW5jZSBjb3VudCwKQEAgLTQ3Miw3ICs0NjksNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0CiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgeworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbUNibGsgPT0gbnVsbHB0cikgewogICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC00OTgsMTggKzQ5NSwyMCBAQAogICAgICAgICAgICAgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtVGhyZWFkSW9IYW5kbGUsIG1TdHJlYW1UeXBlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgfQogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCi0gICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKLSAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgotICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKLSAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVHlwZSAgICAgSWQgQWN0aXZlIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgUyAgRmxhZ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiU1QgVXNnIENUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRyBkYiAgTCBkQiAgUiBkQiAgVlMgZEIgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKQEAgLTUxOCw3ICs1MTcsNyBAQAogICAgIHN3aXRjaCAobVR5cGUpIHsKICAgICBjYXNlIFRZUEVfREVGQVVMVDoKICAgICBjYXNlIFRZUEVfT1VUUFVUOgotICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc1N0YXRpYygpKSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnUyc7IC8vIHN0YXRpYwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJhY2tUeXBlID0gJyAnOyAvLyBub3JtYWwKQEAgLTUzMiwxMyArNTMxLDkgQEAKICAgICB9CiAKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfUEVORElORykgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBwZW5kIiwgdHJhY2tUeXBlKTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBmYWlsIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVkICVjICU2ZCIsIG1GYXN0SW5kZXgsIHRyYWNrVHlwZSwgbUlkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgJWMgJTZkIiwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0KIAogICAgIGNoYXIgbm93SW5VbmRlcnJ1bjsKQEAgLTU5MywyMiArNTg4LDI3IEBACiAgICAgICAgICAgICA/ICdyJyAvKiBidWZmZXIgcmVkdWNlZCAqLzogYnVmZmVyU2l6ZUluRnJhbWVzID4gbUZyYW1lQ291bnQKICAgICAgICAgICAgICAgICAgICAgPyAnZScgLyogZXJyb3IgKi8gOiAnICcgLyogaWRlbnRpY2FsICovOwogCi0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTdzICU2dSAlN3UgJTJzIDB4JTAzWCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICU1LjJnICU1LjJnICU1LjJnJWMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDh6WCAlMDh6WFxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICUzeCAlMnggIgorICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJnICU1LjJnICU1LjJnICU1LjJnJWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1IiwKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgc2FtcGxlUmF0ZSgpLAogCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1BdHRyLnVzYWdlLAorICAgICAgICAgICAgbUF0dHIuY29udGVudF90eXBlLAorCisgICAgICAgICAgICAyMC4wICogbG9nMTAobUZpbmFsVm9sdW1lKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQpAQCAtNjIxLDExICs2MjEsMjEgQEAKICAgICAgICAgICAgIGZpbGxpbmdTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1biwKLSAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCwKLQotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIgICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMAogICAgICAgICAgICAgKTsKKworICAgIGlmIChpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICBib29sIGZyb21UcmFjazsKKyAgICAgICAgaWYgKGdldFRyYWNrTGF0ZW5jeU1zKCZsYXRlbmN5TXMsICZmcm9tVHJhY2spID09IE9LKSB7CisgICAgICAgICAgICAvLyBTaG93IGxhdGVuY3kgaW4gbXNlYywgZm9sbG93ZWQgYnkgJ3QnIGlmIGZyb20gdHJhY2sgdGltZXN0YW1wICh0aGUgbW9zdCBhY2N1cmF0ZSkKKyAgICAgICAgICAgIC8vIG9yICdrJyBpZiBlc3RpbWF0ZWQgZnJvbSBrZXJuZWwgYmVjYXVzZSB0cmFjayBmcmFtZXMgaGF2ZW4ndCBiZWVuIHByZXNlbnRlZCB5ZXQuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJTcuMmxmICVjIiwgbGF0ZW5jeU1zLCBmcm9tVHJhY2sgPyAndCcgOiAnaycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTEwcyIsIG1DYmxrLT5tU2VydmVyICE9IDAgPyAidW5hdmFpbCIgOiAibmV3Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC02NDMsOCArNjUzLDggQEAKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgYnVmZmVyLT5yYXcgPSBidWYubVJhdzsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDAgJiYgIWlzU3RvcHBpbmcoKSAmJiAhaXNTdG9wcGVkKCkgJiYgIWlzUGF1c2VkKCkpIHsKLSAgICAgICAgQUxPR1YoInVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKQEAgLTY4Miw2ICs2OTIsMTMgQEAKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgIC8vIFdlIGRvIG5vdCBzZXQgZHJhaW5lZCBoZXJlLCBhcyBGYXN0VHJhY2sgdGltZXN0YW1wIG1heSBub3QgZ28gdG8gdmVyeSBsYXN0IGZyYW1lLgorCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5LgorICAgIC8vIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdGhlIHNlcnZlciBsYXRlbmN5IG1heSBiZSBwYXNzZWQgaW4gYnkgRmFzdE1peGVyCisgICAgLy8gYXMgYSBjb25zdGFudCBmb3IgYWxsIGFjdGl2ZSBGYXN0VHJhY2tzLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSk7CisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodHJ1ZSk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgpAQCAtNzEwLDggKzcyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC03MzcsMTQgKzc1NCwxNyBAQAogICAgICAgICAgICAgaWYgKG1SZXN1bWVUb1N0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFwcGVuZWQgd2UgbmVlZCB0byByZXN1bWUgdG8gU1RPUFBJTkdfMQogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFNUT1BQSU5HXzEgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFNUT1BQSU5HXzEgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFJFU1VNSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IFBBVVNFRCA9PiBSRVNVTUlORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgQUxPR1YoIj8gPT4gQUNUSVZFICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogPyA9PiBBQ1RJVkUgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gc3RhdGVzIHRvIHJlc2V0IHBvc2l0aW9uIGluZm8gZm9yIG5vbi1vZmZsb2FkZWQvZGlyZWN0IHRyYWNrcwpAQCAtNzk1LDcgKzgxNSw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0b3AoKQogewotICAgIEFMT0dWKCJzdG9wKCVkKSwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBjYWxsaW5nIHBpZCAlZCIsIF9fZnVuY19fLCBtSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKQEAgLTgxOSwxNSArODM5LDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2UoKQogewotICAgIEFMT0dWKCJwYXVzZSglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04NDYsNyArODY2LDggQEAKICAgICAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgIGNhc2UgUkVTVU1JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTSU5HOwotICAgICAgICAgICAgQUxPR1YoIkFDVElWRS9SRVNVTUlORyA9PiBQQVVTSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC04NTgsNyArODc5LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Zmx1c2goKQogewotICAgIEFMT0dWKCJmbHVzaCglZCkiLCBtTmFtZSk7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04ODAsMTEgKzkwMSwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoImZsdXNoOiBvZmZsb2FkIGZsdXNoIik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBvZmZsb2FkIGZsdXNoIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgICAgICByZXNldCgpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgfHwgbVN0YXRlID09IFNUT1BQSU5HXzIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmx1c2hlZCBpbiBTVE9QUElOR18xIG9yIDIgc3RhdGUsIGNoYW5nZSBzdGF0ZSB0byBBQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CiAgICAgICAgICAgICB9CiAKQEAgLTk0OSw3ICs5NzEsNyBAQAogewogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogdGhyZWFkIGlzIGRlYWQiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8CiAgICAgICAgICAgICAgICAgICAgICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgewpAQCAtOTU5LDYgKzk4MSwxOSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsCisgICAgICAgIGludCBwcm9ncmFtSWQpIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fCAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKKyAgICAgICAgRGlyZWN0T3V0cHV0VGhyZWFkICpkaXJlY3RPdXRwdXRUaHJlYWQgPSBzdGF0aWNfY2FzdDxEaXJlY3RPdXRwdXRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpOworICAgICAgICByZXR1cm4gZGlyZWN0T3V0cHV0VGhyZWFkLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKQEAgLTk2OSw4ICsxMDA0LDEwIEBACiAgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T3B0aW9uRmxhZyBvcHRpb25GbGFnCiAgICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb24tPmdldE9wdGlvbkZsYWdzKCk7CiAgICAgICAgIGlmICgob3B0aW9uRmxhZyAmIFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T1BUSU9OX0ZMQUdfQ0xPQ0tfVElNRSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIHRyYWNrcyBkbyBub3Qgc3VwcG9ydCBmcmFtZSBjb3VudGVkIFZvbHVtZVNoYXBlciwiCi0gICAgICAgICAgICAgICAgICAgICIgdXNpbmcgY2xvY2sgdGltZSBpbnN0ZWFkIiwgaXNPZmZsb2FkZWQoKSA/ICJPZmZsb2FkIiA6ICJEaXJlY3QiKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6ICVzIHRyYWNrcyBkbyBub3Qgc3VwcG9ydCBmcmFtZSBjb3VudGVkIFZvbHVtZVNoYXBlciwiCisgICAgICAgICAgICAgICAgICAgICIgdXNpbmcgY2xvY2sgdGltZSBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgaXNPZmZsb2FkZWQoKSA/ICJPZmZsb2FkIiA6ICJEaXJlY3QiKTsKICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKCpjb25maWd1cmF0aW9uKTsKICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24tPnNldE9wdGlvbkZsYWdzKAogICAgICAgICAgICAgICAgIFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T3B0aW9uRmxhZyhvcHRpb25GbGFnCkBAIC05ODUsNyArMTAyMiw3IEBACiAgICAgICAgIC8vIFNpZ25hbCB0aHJlYWQgdG8gZmV0Y2ggbmV3IHZvbHVtZS4KICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIHRocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgfQogICAgIH0KQEAgLTExMDUsMTEgKzExNDIsMTQgQEAKICAgICAvLyB0byBkZXRlY3Qgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwbGF5ZWQuIEluIHRoaXMgY2FzZSBmcmFtZXNXcml0dGVuIGlzbid0CiAgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgZG9lc24ndCBhbHdheXMgcmVmbGVjdCB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgaW4gdGhlIGgvdwogICAgIC8vIGJ1ZmZlcnMsIHBhcnRpY3VsYXJseSBpZiBhIHRyYWNrIGhhcyBiZWVuIHBhdXNlZCBhbmQgcmVzdW1lZCBkdXJpbmcgZHJhaW5pbmcKLSAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgIEFMT0dWKCIlcyglZCk6IHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgZnJhbWVzV3JpdHRlbiAlbGxkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgKGxvbmcgbG9uZylmcmFtZXNXcml0dGVuKTsKICAgICBpZiAobVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID09IDApIHsKICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gZnJhbWVzV3JpdHRlbiArIGF1ZGlvSGFsRnJhbWVzOwotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDogbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgYXVkaW9IYWxGcmFtZXMgJXp1IiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDoiCisgICAgICAgICAgICAgICAgIiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIGF1ZGlvSGFsRnJhbWVzKTsKICAgICB9CiAKQEAgLTExNzUsNyArMTIxNSw4IEBACiAgICAgaWYgKGlzVGVybWluYXRlZCgpIHx8IG1TdGF0ZSA9PSBQQVVTRUQgfHwKICAgICAgICAgICAgICgoZnJhbWVzUmVhZHkoKSA9PSAwKSAmJiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TdGF0ZSA9PSBTVE9QUEVEKSkpKSB7Ci0gICAgICAgIEFMT0dXKCJUcmFjazo6c2V0U3luY0V2ZW50KCkgaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IGluIGludmFsaWQgc3RhdGUgJWQgb24gc2Vzc2lvbiAlZCAlcyBtb2RlLCBmcmFtZXNSZWFkeSAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtU3RhdGUsIG1TZXNzaW9uSWQsIChtU2hhcmVkQnVmZmVyICE9IDApID8gInN0YXRpYyIgOiAic3RyZWFtIiwgZnJhbWVzUmVhZHkoKSk7CiAgICAgICAgIGV2ZW50LT5jYW5jZWwoKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI0Niw3ICsxMjg3LDE3IEBACiAvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApIHsKKyAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZVN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVTdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy91cGRhdGUgZnJhbWUgbWFwCiAgICAgbUZyYW1lTWFwLnB1c2godHJhY2tGcmFtZXNSZWxlYXNlZCwgc2lua0ZyYW1lc1dyaXR0ZW4pOwogCkBAIC0xMjU1LDYgKzEzMDYsNyBAQAogICAgIC8vIE91ciB0aW1lc3RhbXBzIGFyZSBvbmx5IHVwZGF0ZWQgd2hlbiB0aGUgdHJhY2sgaXMgb24gdGhlIFRocmVhZCBhY3RpdmUgbGlzdC4KICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRyYWNrcyBhcmUgbm90IHJlbW92ZWQgYmVmb3JlIGZ1bGwgZHJhaW4uCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lU3RhbXA7CisgICAgYm9vbCBkcmFpbmVkID0gdHJ1ZTsgLy8gZGVmYXVsdCBhc3N1bWUgZHJhaW5lZCwgaWYgbm8gc2VydmVyIGluZm8gZm91bmQKICAgICBib29sIGNoZWNrZWQgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWCAtIDE7CiAgICAgICAgICAgICBpID49IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7IC0taSkgewpAQCAtMTI2MywyMSArMTMxNSwzMCBAQAogICAgICAgICAgICAgbG9jYWwubVBvc2l0aW9uW2ldID0gbUZyYW1lTWFwLmZpbmRYKGxvY2FsLm1Qb3NpdGlvbltpXSk7CiAgICAgICAgICAgICAvLyBjaGVjayBkcmFpbiBzdGF0ZSBmcm9tIHRoZSBsYXRlc3Qgc3RhZ2UgaW4gdGhlIHBpcGVsaW5lLgogICAgICAgICAgICAgaWYgKCFjaGVja2VkICYmIGkgPD0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPj0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgZHJhaW5lZCA9IGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICghY2hlY2tlZCkgeyAvLyBubyBzZXJ2ZXIgaW5mbywgYXNzdW1lIGRyYWluZWQuCi0gICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQodHJ1ZSk7Ci0gICAgfQorCisgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZChkcmFpbmVkKTsKICAgICAvLyBTZXQgY29ycmVjdGlvbiBmb3IgZmx1c2hlZCBmcmFtZXMgdGhhdCBhcmUgbm90IGFjY291bnRlZCBmb3IgaW4gcmVsZWFzZWQuCiAgICAgbG9jYWwubUZsdXNoZWQgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCk7CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9ICFkcmFpbmVkOworICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lU3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok91dHB1dFRyYWNrIgogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6T3V0cHV0VHJhY2soCiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCkBAIC0xMjk5LDkgKzEzNjAsOSBAQAogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKLSAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrIGNvbnN0cnVjdG9yIG1DYmxrICVwLCBtQnVmZmVyICVwLCAiCisgICAgICAgIEFMT0dWKCIlcygpOiBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgogICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1DYmxrLCBtQnVmZmVyLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1DaGFubmVsTWFzayk7CiAgICAgICAgIC8vIHNpbmNlIGNsaWVudCBhbmQgc2VydmVyIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLAogICAgICAgICAvLyB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYm90aCBzaWRlcwpAQCAtMTMxMSw3ICsxMzcyLDggQEAKICAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTZW5kTGV2ZWwoMC4wKTsKICAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgfQogfQogCkBAIC0xMzQyLDcgKzE0MDQsNyBAQAogICAgIG1BY3RpdmUgPSBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6d3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKQorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6d3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKQogewogICAgIEJ1ZmZlciAqcEluQnVmZmVyOwogICAgIEJ1ZmZlciBpbkJ1ZmZlcjsKQEAgLTEzNzMsOCArMTQzNSw5IEBACiAgICAgICAgICAgICBuc2Vjc190IHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9idGFpbkJ1ZmZlcigmbU91dEJ1ZmZlciwgd2FpdFRpbWVMZWZ0TXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3V0cHV0IGJ1ZmZlcnM7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCltVGhyZWFkSW9IYW5kbGUsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyRnVsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDEwLDggKzE0NzMsOSBAQAogICAgICAgICAgICAgICAgIGlmIChwSW5CdWZmZXIgIT0gJmluQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwSW5CdWZmZXI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgcmVsZWFzZWQgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNDI5LDExICsxNDkzLDE0IEBACiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5yYXcgPSBwSW5CdWZmZXItPm1CdWZmZXI7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogdGhyZWFkICVkIGFkZGluZyBvdmVyZmxvdyBidWZmZXIgJXp1IiwgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAvLyBhdWRpbyBkYXRhIGlzIGNvbnN1bWVkIChzdG9yZWQgbG9jYWxseSk7IHNldCBmcmFtZUNvdW50IHRvIDAuCisgICAgICAgICAgICAgICAgaW5CdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdmVyZmxvdyBidWZmZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB0aHJlYWQgJWQgbm8gbW9yZSBvdmVyZmxvdyBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gZXJyb3IgZm9yIHRoaXMuCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQ0LDcgKzE1MTEsNyBAQAogICAgICAgICBzdG9wKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIG91dHB1dEJ1ZmZlckZ1bGw7CisgICAgcmV0dXJuIGZyYW1lcyAtIGluQnVmZmVyLmZyYW1lQ291bnQ7ICAvLyBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkLgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0CkBAIC0xNDk2LDYgKzE1NjMsMTAgQEAKICAgICB9CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFRyYWNrIgorCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpQYXRjaFRyYWNrKFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLApAQCAtMTUwOSw3ICsxNTgwLDcgQEAKICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCi0gICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBBSURfQVVESU9TRVJWRVIsIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwpAQCAtMTUxNyw4ICsxNTg4LDggQEAKICAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwogICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CiAKLSAgICBBTE9HVigiUGF0Y2hUcmFjayAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgQUxPR1YoIiVzKCVkKTogc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOwogfQpAQCAtMTUyOCw3ICsxNTk5LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2s6OnN0YXJ0KGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMTU0MiwxMSArMTYxMywxMSBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOwotICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlBhdGNoVHJhY2soKSAlcCBnZXROZXh0QnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXMoJWQpOiBnZXROZXh0QnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CkBAIC0xNTU3LDcgKzE2MjgsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE1OTIsNyArMTY2Myw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlc3RhcnRJZkRpc2FibGVkKCkKIHsKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncykgJiBDQkxLX0RJU0FCTEVEKSB7Ci0gICAgICAgIEFMT0dXKCJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIik7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICBzdGFydCgpOwogICAgIH0KIH0KQEAgLTE2MDAsNiArMTY3MSw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFJlY29yZAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZEhhbmRsZSIKIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OlJlY29yZEhhbmRsZSgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spCkBAIC0xNjE1LDcgKzE2ODgsNyBAQAogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbikgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICBtUmVjb3JkVHJhY2stPnN0YXJ0KChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90KWV2ZW50LCAoYXVkaW9fc2Vzc2lvbl90KSB0cmlnZ2VyU2Vzc2lvbikpOwogfQpAQCAtMTYyNiwxOCArMTY5OSwyMCBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdG9wX25vbnZpcnR1YWwoKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RvcCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgbVJlY29yZFRyYWNrLT5zdG9wKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZFRyYWNrIgogCiAvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCkBAIC0xNjcyLDE4ICsxNzQ3LDIwIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKLSAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxNYXNrLCB0aHJlYWQtPm1Gb3JtYXQsIHRocmVhZC0+bVNhbXBsZVJhdGUsCi0gICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKLSAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAvLyBJZiBub3QsIGRvbid0IGNvbnRpbnVlIHdpdGggY29uc3RydWN0aW9uLgotICAgIC8vCi0gICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCi0gICAgLy8gZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYnV0IGEgcGVuZGluZyBvciBmdXR1cmUgZGV2aWNlIGNoYW5nZSB3b3VsZCBtYWtlCi0gICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgotICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKCFpc0RpcmVjdCgpKSB7CisgICAgICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAorICAgICAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxNYXNrLCB0aHJlYWQtPm1Gb3JtYXQsIHRocmVhZC0+bVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAgICAvLyBJZiBub3QsIGRvbid0IGNvbnRpbnVlIHdpdGggY29uc3RydWN0aW9uLgorICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRldmljZSwgYnV0IGEgcGVuZGluZyBvciBmdXR1cmUgZGV2aWNlIGNoYW5nZSB3b3VsZCBtYWtlCisgICAgICAgIC8vIHRoZSByZWNvcmQgdHJhY2sgY29uZmlndXJhdGlvbiB2YWxpZC4KKyAgICAgICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIiwgX19mdW5jX18sIG1JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKICAgICBtU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKQEAgLTE2OTQsMTIgKzE3NzEsMjAgQEAKICAgICBpZiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IG9ubHkgTm9ybWFsIFJlY29yZCBoYXMgdGltZXN0YW1wcyAoRmFzdCBSZWNvcmQgZG9lcyBub3QpLgorICAgICAgICBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCA9IGNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZChtRm9ybWF0LCBmbGFncyk7CiAgICAgfQorI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKQorICAgICAgICAgICAgKyAiXyIgKyBzdGQ6OnRvX3N0cmluZyhtSWQpCisgICAgICAgICAgICArICJfUiIpOworI2VuZGlmCiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6flJlY29yZFRyYWNrKCkKIHsKLSAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXI7CiAgICAgZGVsZXRlIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH0KQEAgLTE3NTYsMTcgKzE4NDEsMzQgQEAKICAgICAvLyBzZWUgY29tbWVudHMgYXQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogICAgIHNwPFJlY29yZFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsKLSAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKLSAgICAgICAgfQorICAgICAgICB0cmFja19zdGF0ZSBwcmlvclN0YXRlID0gbVN0YXRlOwogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKKyAgICAgICAgICAgIHByaW9yU3RhdGUgPSBtU3RhdGU7CisgICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOyAvLyBtb3ZlIG1TdGF0ZSB0byBTVE9QUEVELCB0ZXJtaW5hdGUKKyAgICAgICAgfQorICAgICAgICAvLyBBUE0gcG9ydGlkL2NsaWVudCBtYW5hZ2VtZW50IGRvbmUgb3V0c2lkZSBvZiBsb2NrLgorICAgICAgICAvLyBOT1RFOiBpZiB0aHJlYWQgZG9lc24ndCBleGlzdCwgdGhlIGlucHV0IGRlc2NyaXB0b3IgcHJvYmFibHkgZG9lc24ndCBlaXRoZXIuCisgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgc3dpdGNoIChwcmlvclN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEFDVElWRTogICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIHN0aWxsIGFjdGl2ZQorICAgICAgICAgICAgY2FzZSBTVEFSVElOR18yOiAvLyBpbnZhbGlkYXRlZC9zdGFydC1hYm9ydGVkIGFmdGVyIHN0YXJ0SW5wdXQgc3VjY2Vzc2Z1bGx5IGNhbGxlZAorICAgICAgICAgICAgY2FzZSBQQVVTSU5HOiAgICAvLyBpbnZhbGlkYXRlZCB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIHN0b3AoKSBwYXVzaW5nIChzdGlsbCBhY3RpdmUpCisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVEFSVElOR18xOiAvLyBpbnZhbGlkYXRlZC9zdGFydC1hYm9ydGVkIGFuZCBzdGFydElucHV0IG5vdCBzdWNjZXNzZnVsCisgICAgICAgICAgICBjYXNlIFBBVVNFRDogICAgIC8vIE9LLCBub3QgYWN0aXZlCisgICAgICAgICAgICBjYXNlIElETEU6ICAgICAgIC8vIE9LLCBub3QgYWN0aXZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RPUFBFRDogICAgLy8gdW5leHBlY3RlZCAoZGVzdHJveWVkKQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IGludmFsaWQgcHJpb3Igc3RhdGU6ICVkIiwgX19mdW5jX18sIG1JZCwgcHJpb3JTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTc4MywzMSArMTg4NSw1MCBAQAogfQogCiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgICBTZXJ2ZXIgRnJtQ250IFNpbFxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQWN0aXZlICAgICBJZCBDbGllbnQgU2Vzc2lvbiBQb3J0IElkICBTICBGbGFncyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlIFNvdXJjZSAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBTZXJ2ZXIgRnJtQ250IEZybVJkeSBTaWwlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpID8gIiAgIExhdGVuY3kiIDogIiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2dSAlN3UgJTJzIDB4JTAzWCAiCi0gICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCi0gICAgICAgICAgICAiJTA4WCAlNnp1ICUzY1xuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNmQgJTZ1ICU3dSAlN3UgICUycyAweCUwM1ggIgorICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgJTZYICIKKyAgICAgICAgICAgICIlMDhYICU2enUgJTZ6dSAlM2MiLAogICAgICAgICAgICAgaXNGYXN0VHJhY2soKSA/ICdGJyA6ICcgJywKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgbUlkLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICBtQXR0ci5zb3VyY2UsCiAKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCisgICAgICAgICAgICBtU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpLAogICAgICAgICAgICAgaXNTaWxlbmNlZCgpID8gJ3MnIDogJ24nCiAgICAgICAgICAgICApOworICAgIGlmIChpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICBib29sIGZyb21UcmFjazsKKyAgICAgICAgaWYgKGdldFRyYWNrTGF0ZW5jeU1zKCZsYXRlbmN5TXMsICZmcm9tVHJhY2spID09IE9LKSB7CisgICAgICAgICAgICAvLyBTaG93IGxhdGVuY3kgaW4gbXNlYywgZm9sbG93ZWQgYnkgJ3QnIGlmIGZyb20gdHJhY2sgdGltZXN0YW1wICh0aGUgbW9zdCBhY2N1cmF0ZSkKKyAgICAgICAgICAgIC8vIG9yICdrJyBpZiBlc3RpbWF0ZWQgZnJvbSBrZXJuZWwgKHVzdWFsbHkgZm9yIGRlYnVnZ2luZykuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJTcuMmxmICVjIiwgbGF0ZW5jeU1zLCBmcm9tVHJhY2sgPyAndCcgOiAnaycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTEwcyIsIG1DYmxrLT5tU2VydmVyICE9IDAgPyAidW5hdmFpbCIgOiAibmV3Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtMTgzNyw2ICsxOTU4LDE2IEBACiAgICAgICAgIGludDY0X3QgdHJhY2tGcmFtZXNSZWxlYXNlZCwgaW50NjRfdCBzb3VyY2VGcmFtZXNSZWFkLAogICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZXN0YW1wKQogeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lc3RhbXA7CiAKICAgICAvLyBDb252ZXJ0IEhBTCBmcmFtZXMgdG8gc2VydmVyLXNpZGUgdHJhY2sgZnJhbWVzIGF0IHRyYWNrIHNhbXBsZSByYXRlLgpAQCAtMTg1MCw2ICsxOTgxLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9IHRydWU7IC8vIHVzZSB0cmFjayB1bmxlc3MgZGVidWdnaW5nLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSAtICh1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpKTsKKworICAgIG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNrLnN0b3JlKHVzZVRyYWNrVGltZXN0YW1wKTsKKyAgICBtU2VydmVyTGF0ZW5jeU1zLnN0b3JlKGxhdGVuY3lNcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCkBAIC0xODY0LDYgKzIwMDQsMTAgQEAKICAgICB9CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFJlY29yZCIKKwogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC0xODc1LDcgKzIwMTksOCBAQAogICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsCiAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3IgcGF0Y2ggdHJhY2sgKi8sCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgQUlEX0FVRElPU0VSVkVSLAorICAgICAgICAgICAgICAgIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCiB7CiAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KQEAgLTE4ODMsOCArMjAyOCw4IEBACiAgICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKICAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwogCi0gICAgQUxPR1YoIlBhdGNoUmVjb3JkICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICBBTE9HVigiJXMoJWQpOiBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7CiB9CkBAIC0xODk3LDEyICsyMDQyLDEyIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CiAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICJQYXRjaFJlY29yZCgpICVwIG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgICAgICAgICAgICIlcyglZCk6IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwpAQCAtMTkxMyw3ICsyMDU4LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CkBAIC0xOTMyLDcgKzIwNzcsOSBAQAogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCi0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpNbWFwVHJhY2siCiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpNbWFwVHJhY2soVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCkBAIC0xOTQwLDEzICsyMDg3LDE0IEBACiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIGJvb2wgaXNPdXQsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIChzaXplX3QpMCAvKiBmcmFtZUNvdW50ICovLAogICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qIGlzT3V0ICovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGlzT3V0LAogICAgICAgICAgICAgICAgICAgQUxMT0NfTk9ORSwKICAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKSwKICAgICAgICAgbVBpZChwaWQpLCBtU2lsZW5jZWQoZmFsc2UpLCBtU2lsZW5jZWROb3RpZmllZChmYWxzZSkKQEAgLTE5NjMsNyArMjExMSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50IF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTE5OTQsMTkgKzIxNDIsMjggQEAKIHsKIH0KIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBTZXNzaW9uICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IFNlc3Npb24gUG9ydCBJZCAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSBGbGFncyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0KCkgPyAiVXNnIENUIjogIlNvdXJjZSIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUgX191bnVzZWQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlMDhYICUwOFggJTZ1XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTd1ICUwOFggJTA4WCAlNnUgMHglMDNYICIsCiAgICAgICAgICAgICBtUGlkLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICBtQXR0ci5mbGFncyk7CisgICAgaWYgKGlzT3V0KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTN4ICUyeCIsIG1BdHRyLnVzYWdlLCBtQXR0ci5jb250ZW50X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2eCIsIG1BdHRyLnNvdXJjZSk7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggMzhjM2MwMi4uNmVmMTliZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTk3LDggKzk3LDQyIEBACiAjZGVmaW5lIExPR19BVURJT19TVEFURSgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKICAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0FVRElPX1NUQVRFLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKKy8vIExvZyB0aGUgZGlmZmVyZW5jZSBiZXd0ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMgd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssCisvLyBkaXZpZGVkIGJ5IHRoZSBzYW1wbGUgcmF0ZS4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfTEFURU5DWShtcykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX0xBVEVOQ1k+KG1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBvdmVycnVuIGV2ZW50IG5hbm9zZWNvbmQgdGltZXN0YW1wLiBQYXJhbWV0ZXIgbnMgaXMgYW4gaW50NjRfdC4KKyNkZWZpbmUgTE9HX09WRVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9PVkVSUlVOPihucyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgaW5mby4gVGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgdHlwZSwgZnJhbWVDb3VudCwgYW5kIHNhbXBsZVJhdGUuCisvLyBQYXJhbWV0ZXIgdHlwZSBpcyB0aHJlYWRfaW5mb190IGFzIGRlZmluZWQgaW4gTkJMb2cuaC4KKyNkZWZpbmUgTE9HX1RIUkVBRF9JTkZPKGluZm8pIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IFwKKyAgICAgICAgaWYgKHggIT0gbnVsbHB0cikgeC0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfSU5GTz4oaW5mbyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX1RIUkVBRF9QQVJBTVMocGFyYW1zKSBkbyB7TkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IFwKKyAgICAgICAgaWYgKHggIT0gbnVsbHB0cikgeC0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfUEFSQU1TPihwYXJhbXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHVuZGVycnVuIGV2ZW50IG5hbm9zZWNvbmQgdGltZXN0YW1wLiBQYXJhbWV0ZXIgbnMgaXMgYW4gaW50NjRfdC4KKyNkZWZpbmUgTE9HX1VOREVSUlVOKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfVU5ERVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCB3YXJtdXAgdGltZSBpbiBtaWxsaXNlY29uZHMuIFBhcmFtZXRlciBtcyBpcyBvZiB0eXBlIGRvdWJsZS4KKyNkZWZpbmUgTE9HX1dBUk1VUF9USU1FKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfV0FSTVVQX1RJTUU+KG1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIGEgdHlwZWQgZW50cnkgdGhhdCByZXByZXNlbnRzIGEgdGhyZWFkJ3Mgd29yayB0aW1lIGluIG5hbm9zZWNvbmRzLgorLy8gUGFyYW1ldGVyIG5zIHNob3VsZCBiZSBvZiB0eXBlIHVpbnQzMl90LgorI2RlZmluZSBMT0dfV09SS19USU1FKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfV09SS19USU1FPihucyk7IH0gd2hpbGUgKDApCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgeworLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bER1bW15TkJMb2dXcml0ZXIgYW5kIHRoZW4KKy8vIGluaXRpYWxpemUgYmVsb3cgdGxOQkxvZ1dyaXRlciB0byAmdGxEdW1teU5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bworLy8gY2hlY2sgZm9yIG51bGxwdHIgZXZlcnkgdGltZS4gQWxzbyByZWR1Y2VzIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyBsb2dnaW5nIG1hY3JvIGFib3ZlCisvLyBlYWNoIHRpbWUgd2Ugd2FudCB0byBsb2cgYSBuZXcgdHlwZS4KIGV4dGVybiB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciAqdGxOQkxvZ1dyaXRlcjsKIH0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IGQyOWNhZTEuLmJmYTFiNWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMTMsNyArMTMsNiBAQAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTIyLDExICsyMSwxNSBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliYXVkaW9jbGllbnQgXAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCiAgICAgbGlibWVkaWFfaGVscGVyIFwKICAgICBsaWJtZWRpYW1ldHJpY3MgXAotICAgIGxpYmVmZmVjdHNjb25maWcKKyAgICBsaWJtZWRpYXV0aWxzIFwKKyAgICBsaWJlZmZlY3RzY29uZmlnIFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CisKK0xPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwpAQCAtNzQsNyArNzcsNyBAQAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcworICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKQEAgLTgyLDkgKzg1LDkgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwogCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJpY3V1YyBsaWJ4bWwyCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmhpZGxiYXNlIGxpYmljdXVjIGxpYnhtbDIKIAoraWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKIExPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIGVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogCkBAIC0xMTEsNyArMTE0LDggQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKaW5kZXggNDgxMmIxZi4uYWQxMmE5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC02NSwyMCArNjUsNiBAQAogICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAotICAgIGVudW0gewotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSA9IDAsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMID0gKDEgPDwgMCksICAgICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGNhbGwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUgPSAoMSA8PCAxKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGFub3RoZXIgY2FwdHVyZQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCA9ICgxIDw8IDIpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBob3R3b3JkCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUID0gKDEgPDwgMyksICAgLy8gcHJlLWVtcHRlZCBzb21lb25lCi0gICAgICAgICAgICAgICAgLy8gTkI6IHByZWVtcHQgaXMgbWFya2VkIG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIG90aGVycyBhcmUgb24gZmFpbGluZyBjYWxscwotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCA9ICgxIDw8IDQpLAotCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwgPSAoQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgLSAxKSwKLSAgICB9OwotCi0gICAgdHlwZWRlZiB1aW50MzJfdCBjb25jdXJyZW5jeV90eXBlX19tYXNrX3Q7Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CiAgICAgLy8KQEAgLTEyNCwxNyArMTEwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCkBAIC0xNDcsMTYgKzEyNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gcmVsZWFzZXMgdGhlIGlucHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vCiAgICAgLy8gdm9sdW1lIGNvbnRyb2wgZnVuY3Rpb25zCkBAIC0yMDYsNiArMTgxLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzNSw5ICsyMTIsOSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwpAQCAtMjUxLDcgKzIyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOwogfTsKIAogCkBAIC0zMjQsMTEgKzMwMyw2IEBACiAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKIAotICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZwotICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKSA9IDA7Ci0KICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CiAKQEAgLTM1OCwxMCArMzMyLDEzIEBACiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiB9OwogCiBleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDQgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2U4ZTMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5tawotIwotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCmluZGV4IGQzODk2N2UuLmY4YTFjZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKIAogZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKKyAgICBTVFJBVEVHWV9OT05FID0gLTEsCiAgICAgU1RSQVRFR1lfTUVESUEsCiAgICAgU1RSQVRFR1lfUEhPTkUsCiAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCBmYzAxMmEyLi41Y2NjOGZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTM0LDYgKzEzNCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKaW5kZXggOWJkNjhlMS4uMzBiMDA0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmgKQEAgLTMyLDE0ICszMiw2IEBACiAjZGVmaW5lIE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UIEZDQ184CiAKIC8qKgotICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCi0gKiBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0cygpCi0gKi8KLSNkZWZpbmUgQVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVh8XAotICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVTfEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikKLQotCi0vKioKICAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgd2hlcmUgbWF0Y2hpbmcgaW5wdXRzL291dHB1dHMgb24gZGV2aWNlCiAgKiB0eXBlIGFsb25lIGlzIG5vdCBlbm91Z2g6IHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdG9vCiAgKi8KQEAgLTY4LDIzICs2MCw2IEBACiB9CiAKIC8qKgotICogQ2hlY2sgaWYgdGhlIGlucHV0IGRldmljZSBnaXZlbiBpcyBjb25zaWRlcmVkIGFzIGEgdmlydHVhbCBkZXZpY2UuCi0gKgotICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY29uc2lkZXIKLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBhIHZpcnR1YWwgb25lLCBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc192aXJ0dWFsX2lucHV0X2RldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgewotICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgogICogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCiAgKiB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlcgogICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI0OTczCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9HYWluLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BhdGNoLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BvcnQuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1JvdXRlLmNwcCIsCisgICAgICAgICJzcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0RldmljZURlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvSHdNb2R1bGUuY3BwIiwKKyAgICAgICAgInNyYy9JT1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9TZXJpYWxpemVyLmNwcCIsCisgICAgICAgICJzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAiLAorICAgICAgICAic3JjL1R5cGVDb252ZXJ0ZXIuY3BwIiwKKyAgICAgICAgInNyYy9Wb2x1bWVDdXJ2ZS5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJpY3V1YyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYm1lZGlhIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9wb2xpY3ljb21tb24iXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWU2ODcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9HYWluLmNwcCBcCi0gICAgc3JjL0h3TW9kdWxlLmNwcCBcCi0gICAgc3JjL0lPUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1BvcnQuY3BwIFwKLSAgICBzcmMvQXVkaW9Qcm9maWxlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUm91dGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIFwKLSAgICBzcmMvQXVkaW9QYXRjaC5jcHAgXAotICAgIHNyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgXAotICAgIHNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIFwKLSAgICBzcmMvU2Vzc2lvblJvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Wb2x1bWVDdXJ2ZS5jcHAgXAotICAgIHNyYy9UeXBlQ29udmVydGVyLmNwcCBcCi0gICAgc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYm1lZGlhCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMgXAotICAgIHN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIFwKLQotaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfU1JDX0ZJTEVTICs9IHNyYy9TZXJpYWxpemVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmljdXVjIGxpYnhtbDIKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZXh0ZXJuYWwvbGlieG1sMi9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbgotCi1lbHNlCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgXAotICAgIHNyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0dhaW5zLmNwcAotCi1lbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAppbmRleCBmODZlNzVhLi5hOTQ4ZWE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKQEAgLTM4LDcgKzM4LDcgQEAKIGNsYXNzIEF1ZGlvUm91dGVWZWN0b3IgOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUm91dGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKaW5kZXggNGFjNTA4Zi4uOTk2MzQ3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsNyArNTQsNyBAQAogICAgIGludCBnZXRNYXhSYW1wSW5NcygpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1heF9yYW1wX21zOyB9CiAKICAgICAvLyBUT0RPOiByZW1vdmUgZHVtcCBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiAgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKICAgICBzdGF0dXNfdCBjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTQxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIEkvTyBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGV4dAorICogY2FuIGJlIHF1ZXJpZWQgYW5kIHVwZGF0ZWQuCisgKi8KK2NsYXNzIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UoKSB7fTsKKworICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAppbmRleCBiMjVkNmQ0Li5mYTliYTBiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaApAQCAtMTYsMzYgKzE2LDM4IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgiCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlICJBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSU9Qcm9maWxlOwogY2xhc3MgQXVkaW9NaXg7CitjbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKIAogLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gaW5wdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBpbnB1dAogLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgaW5wdXQuCi1jbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgorY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgICwgcHVibGljIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4KIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7Ci0gICAgdWludDMyX3QgZ2V0T3BlblJlZkNvdW50KCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICAgICAgICBtSW9IYW5kbGU7ICAgICAgIC8vIGlucHV0IGhhbmRsZQotICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgIG1EZXZpY2U7ICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8KLSAgICBBdWRpb01peCAgICAgICAgICAgICAgICAgICAgICAqbVBvbGljeU1peDsgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgY29uc3Qgc3A8SU9Qcm9maWxlPiAgICAgICAgICAgbVByb2ZpbGU7ICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBpbnB1dCBoYW5kbGUKKyAgICBhdWRpb19kZXZpY2VzX3QgICAgIG1EZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCisgICAgQXVkaW9NaXggICAgICAgICAgICAqbVBvbGljeU1peCA9IG51bGxwdHI7ICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwpAQCAtNTUsMjMgKzU3LDE4IEBACiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gZ2V0UHJlZW1wdGVkU2Vzc2lvbnMoKSBjb25zdDsKICAgICBib29sIGhhc1ByZWVtcHRlZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwogICAgIHZvaWQgY2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOwotICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50ID4gMDsgfQogICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0OwotICAgIHN0YXR1c190IGFkZEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKTsKLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gZ2V0QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdDsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEF1ZGlvU2Vzc2lvbnMoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBzaXplX3QgZ2V0QXVkaW9TZXNzaW9uQ291bnQoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpOworICAgIGludDMyX3QgYWN0aXZlQ291bnQoKSB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQ7IH0KKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3Q7CisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTgwLDE4ICs3NywyOCBAQAogICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCk7CiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZC4KLSAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgxKQorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKQogICAgIHN0YXR1c190IHN0YXJ0KCk7CiAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQKLSAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpCiAgICAgdm9pZCBzdG9wKCk7CiAgICAgdm9pZCBjbG9zZSgpOwogCi1wcml2YXRlOgotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgIG1QYXRjaEhhbmRsZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7Ci0gICAgLy8gYXVkaW8gc2Vzc2lvbnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dAotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gICAgICAgIG1TZXNzaW9uczsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgZ2V0Q2xpZW50c0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSwKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQsIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+CisgICAgdm9pZCBhZGRDbGllbnQoY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gJmNsaWVudCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorCisgICAgdm9pZCB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CisKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIC8vIEJlY2F1c2UgYSBwcmVlbXB0aWJsZSBjYXB0dXJlIHNlc3Npb24gY2FuIHByZWVtcHQgYW5vdGhlciBvbmUsIHdlIGVuZCB1cCBpbiBhbiBlbmRsZXNzIGxvb3AKICAgICAvLyBzaXR1YXRpb24gd2VyZSBlYWNoIHNlc3Npb24gaXMgYWxsb3dlZCB0byByZXN0YXJ0IGFmdGVyIGJlaW5nIHByZWVtcHRlZCwKICAgICAvLyB0aHVzIHByZWVtcHRpbmcgdGhlIG90aGVyIG9uZSB3aGljaCByZXN0YXJ0cyBhbmQgc28gb24uCkBAIC05OSw3ICsxMDYsOSBAQAogICAgIC8vIGEgcGFydGljdWxhciBpbnB1dCBzdGFydGVkIGFuZCBwcmV2ZW50IHByZWVtcHRpb24gb2YgdGhpcyBhY3RpdmUgaW5wdXQgYnkgdGhpcyBzZXNzaW9uLgogICAgIC8vIFdlIGFsc28gaW5oZXJpdCBzZXNzaW9ucyBmcm9tIHRoZSBwcmVlbXB0ZWQgaW5wdXQgdG8gYXZvaWQgYSAzIHdheSBwcmVlbXB0aW9uIGxvb3AgZXRjLi4uCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVByZWVtcHRlZFNlc3Npb25zOwotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICBpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKIH07CiAKIGNsYXNzIEF1ZGlvSW5wdXRDb2xsZWN0aW9uIDoKQEAgLTExOSwxMSArMTI4LDE1IEBACiAgICAgICogT25seSBjb25zaWRlcnMgaW5wdXRzIGZyb20gcGh5c2ljYWwgZGV2aWNlcyAoZS5nLiBtYWluIG1pYywgaGVhZHNldCBtaWMpIHdoZW4KICAgICAgKiBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCiAgICAgICovCi0gICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoKTsKIAogICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDVlNWQzOGIuLmVkOTk1ZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTE4LDEzICsxOCwxNCBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgIkF1ZGlvU291cmNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM1LDE0ICszNiwxNSBAQAogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgotY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCitjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsIHB1YmxpYyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgICwgcHVibGljIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5BdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgICAgICAgIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwpAQCAtNTksNyArNjEsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgc3RyZWFtIGFjdGl2ZSBjb3VudCBhbmQgbUFjdGl2ZUNsaWVudHMgb25seS4KKyAgICAgKiBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgY2xpZW50LT5hY3RpdmUoKSBzdGF0ZSBvciB0aGUgb3V0cHV0IGRlc2NyaXB0b3IncworICAgICAqIGdsb2JhbCBhY3RpdmUgY291bnQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgaW50IGRlbHRhKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUFjdGl2ZUNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1BY3RpdmVDb3VudFtzdHJlYW1dOyB9CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBjbGllbnQtPmFjdGl2ZSgpIHN0YXRlIGFuZCB0aGUgb3V0cHV0IGRlc2NyaXB0b3IncyBnbG9iYWwgYWN0aXZlIGNvdW50LAorICAgICAqIGFsb25nIHdpdGggdGhlIHN0cmVhbSBhY3RpdmUgY291bnQgYW5kIG1BY3RpdmVDbGllbnRzLgorICAgICAqIFRoZSBjbGllbnQgbXVzdCBiZSBwcmV2aW91c2x5IGFkZGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFkZENsaWVudCgpLgorICAgICAqLworICAgICAgICAgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CiAKICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTczLDIyICs5MCw1NiBAQAogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH07Ci0gICAgdm9pZCBzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsgbVBhdGNoSGFuZGxlID0gaGFuZGxlOyB9OworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAotICAgIHNwPEF1ZGlvUG9ydD4gICAgICAgbVBvcnQ7Ci0gICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwotICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgVHJhY2tDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBTVFJBVEVHWV9OT05FLCBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAvLyBvdmVycmlkZSBDbGllbnRNYXBIYW5kbGVyIHRvIGFib3J0IHdoZW4gcmVtb3ZpbmcgYSBjbGllbnQgd2hlbiBhY3RpdmUuCisgICAgdm9pZCByZW1vdmVDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBjbGllbnQgPSBnZXRDbGllbnQocG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnQuZ2V0KCkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBub25leGlzdGVudCBjbGllbnQgcG9ydElkICVkIiwgX19mdW5jX18sIG1JZCwgcG9ydElkKTsKKyAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCB3aGVuIGEgY2xpZW50IGlzIHJlbW92ZWQsIHdlIGNvdWxkIHJlbW92ZSBpdHMKKyAgICAgICAgLy8gYXNzb2NpYXRlZCBhY3RpdmUgY291bnQgYnkgY2FsbGluZyBjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudCgpLAorICAgICAgICAvLyBidXQgdGhhdCB3b3VsZCBiZSBoaWRpbmcgYSBwcm9ibGVtLCBzbyB3ZSBsb2cgZmF0YWwgaW5zdGVhZC4KKyAgICAgICAgYXV0byBpdDIgPSBtQWN0aXZlQ2xpZW50cy5maW5kKGNsaWVudCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQyICE9IG1BY3RpdmVDbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCkgcmVtb3ZpbmcgY2xpZW50IHBvcnRJZCAlZCB3aGljaCBpcyBhY3RpdmUgKGNvdW50ICV6dSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHBvcnRJZCwgaXQyLT5zZWNvbmQpOworICAgICAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OnJlbW92ZUNsaWVudChwb3J0SWQpOworICAgIH0KKworICAgIHVzaW5nIEFjdGl2ZUNsaWVudE1hcCA9IHN0ZDo6bWFwPHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4sIHNpemVfdCAvKiBjb3VudCAqLz47CisgICAgLy8gcmVxdWlyZWQgZm9yIGR1cGxpY2F0aW5nIHRocmVhZAorICAgIGNvbnN0IEFjdGl2ZUNsaWVudE1hcCYgZ2V0QWN0aXZlQ2xpZW50cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVDbGllbnRzOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7IC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bwogICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOwotICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCi0gICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgICAgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCiAgICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKLSAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbUNsaWVudEludGVyZmFjZTsKKyAgICBBdWRpb01peCAqbVBvbGljeU1peCA9IG51bGxwdHI7ICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogCiBwcm90ZWN0ZWQ6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgIGNvbnN0IHNwPEF1ZGlvUG9ydD4gbVBvcnQ7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCisgICAgdWludDMyX3QgbUFjdGl2ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgYWN0aXZlIG9uIHRoaXMgb3V0cHV0CisgICAgdWludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZlIGNvdW50CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgLy8gVGhlIEFjdGl2ZUNsaWVudE1hcCBzaG93cyB0aGUgY2xpZW50cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIHN0cmVhbXMgY291bnRzCisgICAgLy8gYW5kIG1heSBpbmNsdWRlIHVwc3RyZWFtIGNsaWVudHMgZnJvbSBhIGR1cGxpY2F0aW5nIHRocmVhZC4KKyAgICAvLyBDb21wYXJlIHdpdGggdGhlIENsaWVudE1hcCAobUNsaWVudHMpIHdoaWNoIGFyZSBleHRlcm5hbCBBdWRpb1RyYWNrIGNsaWVudHMgb2YgdGhlCisgICAgLy8gb3V0cHV0IGRlc2NyaXB0b3IgKGFuZCBkbyBub3QgY291bnQgaW50ZXJuYWwgUGF0Y2hUcmFja3MpLgorICAgIEFjdGl2ZUNsaWVudE1hcCBtQWN0aXZlQ2xpZW50czsKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgpAQCAtOTksOCArMTUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Td0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOwpAQCAtMTA5LDcgKzE1OSw4IEBACiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAgICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDEoKSB7IHJldHVybiBtT3V0cHV0MTsgfQogICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gbU91dHB1dDI7IH0KLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CisgICAgICAgICAgICB2b2lkIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGludCBkZWx0YSkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCkBAIC0xMjcsMTAgKzE3OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CiAgICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIGNoYW5nZVJlZkNvdW50KDEpOworICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBzZXRDbGllbnRBY3RpdmUodHJ1ZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGFydCgpOwogICAgICAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpOworICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShmYWxzZSk7CiAgICAgICAgICAgICB2b2lkIHN0b3AoKTsKICAgICAgICAgICAgIHZvaWQgY2xvc2UoKTsKICAgICAgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCkBAIC0xNDEsMjMgKzE5MiwyMSBAQAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50Ci0gICAgdWludDMyX3QgbUdsb2JhbFJlZkNvdW50OyAgLy8gbm9uLXN0cmVhbS1zcGVjaWZpYyByZWYgY291bnQKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgogY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKIHsKIHB1YmxpYzoKLSAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCisgICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKQEAgLTE3MCw3ICsyMTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogCi0gICAgY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBtU291cmNlOworICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1Tb3VyY2U7CiAKIH07CiAKQEAgLTIyNCw3ICsyNzMsOSBAQAogCiAgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogY2xhc3MgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gOgpAQCAtMjM4LDcgKzI4OSw3IEBACiAgICAgICovCiAgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKaW5kZXggYzFjM2YzYy4uMDg0M2ZlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMwLDcgKzMxLDcgQEAKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwpAQCAtNDcsNyArNDgsNyBAQAogCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCA0M2Y2ZWQ2Li41MDk5ZWJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMTYsNiArMTYsOSBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CkBAIC0yOCw3ICszMSw2IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM4LDE2ICs0MCwyNCBAQAogICAgIEF1ZGlvUG9saWN5Q29uZmlnKEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqdm9sdW1lcyA9IG51bGxwdHIpCiAgICAgICAgIDogbUh3TW9kdWxlcyhod01vZHVsZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKGF2YWlsYWJsZU91dHB1dERldmljZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKSwKLSAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMoZGVmYXVsdE91dHB1dERldmljZXMpLAorICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXModm9sdW1lcyksCiAgICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpCiAgICAge30KIAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRTb3VyY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBmaWxlOworICAgIH0KKwogICAgIHZvaWQgc2V0Vm9sdW1lcyhjb25zdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICZ2b2x1bWVzKQogICAgIHsKICAgICAgICAgaWYgKG1Wb2x1bWVDdXJ2ZXMgIT0gbnVsbHB0cikgewpAQCAtMTAwLDUxICsxMTAsODggQEAKIAogICAgIHZvaWQgc2V0RGVmYXVsdE91dHB1dERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdERldmljZSkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IGRlZmF1bHREZXZpY2U7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gZGVmYXVsdERldmljZTsKICAgICB9CiAKLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlczsgfQorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7IH0KIAogICAgIHZvaWQgc2V0RGVmYXVsdCh2b2lkKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKLSAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgbVNvdXJjZSA9ICJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCI7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOwotICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CiAKLSAgICAgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwgMiAvKmhhbFZlcnNpb25NYWpvciovKTsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOwogCiAgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGU7CiAgICAgICAgIG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwogICAgICAgICBvdXRQcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKICAgICAgICAgb3V0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDQxMDApKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG91dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpOwogICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUob3V0UHJvZmlsZSk7CiAKICAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGU7CiAgICAgICAgIGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKICAgICAgICAgaW5Qcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CisgICAgICAgIGluUHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOwogICAgICAgICBpblByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZWZhdWx0SW5wdXREZXZpY2UpOwogICAgICAgICBtb2R1bGUtPmFkZElucHV0UHJvZmlsZShpblByb2ZpbGUpOwogCi0gICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKKyAgICB9CisKKyAgICAvLyBTdXJyb3VuZCBmb3JtYXRzLCB3aXRoIGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3ViZm9ybWF0cyB0aGF0IGFyZSBlcXVpdmFsZW50IGZyb20gdXNlcnMnIFBPVi4KKyAgICB1c2luZyBTdXJyb3VuZEZvcm1hdHMgPSBzdGQ6OnVub3JkZXJlZF9tYXA8YXVkaW9fZm9ybWF0X3QsIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4+OworCisgICAgY29uc3QgU3Vycm91bmRGb3JtYXRzICZnZXRTdXJyb3VuZEZvcm1hdHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1TdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXRTdXJyb3VuZEZvcm1hdHMoY29uc3QgU3Vycm91bmRGb3JtYXRzICZzdXJyb3VuZEZvcm1hdHMpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0gc3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0geworICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUU19IRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQUNfTEMsIHsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwgQVVESU9fRk9STUFUX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFfX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDM19KT0MsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUM0LCB7fX19OwogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtU291cmNlOwogICAgIEh3TW9kdWxlQ29sbGVjdGlvbiAmbUh3TW9kdWxlczsgLyoqPCBDb2xsZWN0aW9uIG9mIE1vZHVsZSwgd2l0aCBQcm9maWxlcywgaS5lLiBNaXggUG9ydHMuICovCiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlczsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqbVZvbHVtZUN1cnZlczsKICAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCiAgICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KICAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgogICAgIGJvb2wgbUlzU3BlYWtlckRyY0VuYWJsZWQ7CisgICAgU3Vycm91bmRGb3JtYXRzIG1TdXJyb3VuZEZvcm1hdHM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCmluZGV4IDhmYzZmZTkuLjk2YzAwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCkBAIC00Myw3ICs0Myw3IEBACiAKICAgICB2b2lkIHNldE1peChBdWRpb01peCAmbWl4KTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgQXVkaW9NaXggICAgbU1peDsgICAgICAgICAgICAgICAgICAgLy8gQXVkaW8gcG9saWN5IG1peCBkZXNjcmlwdG9yCkBAIC04MCw3ICs4MCw3IEBACiAKICAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAppbmRleCAwOWE4NmRkLi5iYjljYWQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCkBAIC0xMTYsNiArMTE2LDcgQEAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlOyB9CiAKICAgICBib29sIHVzZUlucHV0Q2hhbm5lbE1hc2soKSBjb25zdAogICAgIHsKQEAgLTEzMiwxNiArMTMzLDE3IEBACiAgICAgdm9pZCBhZGRSb3V0ZShjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIHsgbVJvdXRlcy5hZGQocm91dGUpOyB9CiAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmZ2V0Um91dGVzKCkgY29uc3QgeyByZXR1cm4gbVJvdXRlczsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisKICAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpIGNvbnN0OwogCiAgICAgQXVkaW9HYWluQ29sbGVjdGlvbiBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKLSAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KIAogcHJpdmF0ZToKICAgICB2b2lkIHBpY2tDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpIGNvbnN0OwogICAgIHZvaWQgcGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcmF0ZSxjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVzKSBjb25zdDsKIAorICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQogICAgIFN0cmluZzggIG1OYW1lOwogICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOwpAQCAtMTUzLDkgKzE1NSw2IEBACiBjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qb3J0Q29uZmlnKCk7Ci0gICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KLQogICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtMTY1LDEwICsxNjQsMTEgQEAKICAgICAgICAgcmV0dXJuIChvdGhlciAhPSAwKSAmJgogICAgICAgICAgICAgICAgIChvdGhlci0+Z2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpID09IGdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSk7CiAgICAgfQotICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7Ci0gICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOworICAgIHVuc2lnbmVkIGludCBtU2FtcGxpbmdSYXRlID0gMHU7CisgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW4gPSB7IC5pbmRleCA9IC0xIH07CisgICAgdW5pb24gYXVkaW9faW9fZmxhZ3MgbUZsYWdzID0geyBBVURJT19JTlBVVF9GTEFHX05PTkUgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAppbmRleCA4NzQxYzY2Li5iNTg4ZDU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCkBAIC0xNiw5MSArMTYsODQgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAicG9saWN5LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdHlwZWRlZiBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IFNhbXBsZVJhdGVWZWN0b3I7Ci10eXBlZGVmIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gQ2hhbm5lbHNWZWN0b3I7CiB0eXBlZGVmIFZlY3RvcjxhdWRpb19mb3JtYXRfdD4gRm9ybWF0VmVjdG9yOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCk7Citib29sIG9wZXJhdG9yPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJpZ2h0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAobGVmdFtpbmRleF0gIT0gcmlnaHRbaW5kZXhdKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvciE9IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCit7CisgICAgcmV0dXJuICEobGVmdCA9PSByaWdodCk7Cit9CisKK2NsYXNzIENoYW5uZWxzVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4KK3sKK3B1YmxpYzoKKyAgICBDaGFubmVsc1ZlY3RvcigpID0gZGVmYXVsdDsKKyAgICBDaGFubmVsc1ZlY3Rvcihjb25zdCBDaGFubmVsc1ZlY3RvciYpID0gZGVmYXVsdDsKKyAgICBDaGFubmVsc1ZlY3Rvcihjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBzdikgOgorICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190Pihzdikge30KKyAgICBDaGFubmVsc1ZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworCisgICAgLy8gQXBwbGllcyBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luIHRvIGFsbCBlbGVtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgIENoYW5uZWxzVmVjdG9yIGFzSW5NYXNrKCkgY29uc3Q7CisgICAgLy8gQXBwbGllcyBhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0IHRvIGFsbCBlbGVtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgIENoYW5uZWxzVmVjdG9yIGFzT3V0TWFzaygpIGNvbnN0OworfTsKIAogY2xhc3MgQXVkaW9Qcm9maWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgotICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKSA6Ci0gICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpCi0gICAgewotICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFza3MpOwotICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQoc2FtcGxpbmdSYXRlKTsKLSAgICB9CisgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gY3JlYXRlRnVsbER5bmFtaWMoKTsKIAorICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywgdWludDMyX3Qgc2FtcGxpbmdSYXRlKTsKICAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6Ci0gICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCi0gICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pCi0gICAge30KKyAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbik7CiAKICAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0KLSAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOwotICAgICAgICB9Ci0gICAgfQogICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZnZXRDaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFza3M7IH0KLQotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzID0gc2FtcGxlUmF0ZXM7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmZ2V0U2FtcGxlUmF0ZXMoKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlczsgfQorICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcyk7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcyk7CiAKKyAgICB2b2lkIGNsZWFyKCk7CiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gaGFzVmFsaWRGb3JtYXQoKSAmJiBoYXNWYWxpZFJhdGVzKCkgJiYgaGFzVmFsaWRDaGFubmVscygpOyB9Ci0KLSAgICB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAorICAgIGJvb2wgc3VwcG9ydHNDaGFubmVscyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtQ2hhbm5lbE1hc2tzLmluZGV4T2YoY2hhbm5lbHMpID49IDA7CiAgICAgfQotICAgIGlubGluZSBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGluZ1JhdGVzLmluZGV4T2YocmF0ZSkgPj0gMDsKLSAgICB9CisgICAgYm9vbCBzdXBwb3J0c1JhdGUodWludDMyX3QgcmF0ZSkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOyB9CiAKICAgICBzdGF0dXNfdCBjaGVja0V4YWN0KHVpbnQzMl90IHJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnVwZGF0ZWRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7CiAKQEAgLTExOSw3ICsxMTIsNyBAQAogCiAgICAgYm9vbCBpc0R5bmFtaWMoKSB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgU3RyaW5nOCAgbU5hbWU7CkBAIC0xMzYsMjEzICsxMjksNDggQEAKIGNsYXNzIEF1ZGlvUHJvZmlsZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Qcm9maWxlPiA+CiB7CiBwdWJsaWM6Ci0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKLSAgICB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBWZWN0b3I6OmFkZChwcm9maWxlKTsKLSAgICAgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KLSAgICAgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKLSAgICAgICAgLy8gW10oY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDEsIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQyKSB7Ci0gICAgICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKLSAgICAgICAgLy8gfQotICAgICAgICBzb3J0KGNvbXBhcmVGb3JtYXRzKTsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQorICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpOwogICAgIC8vIFRoaXMgQVBJIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIG9uY2UgcmV0cmlldmluZyBjYXBhYmlsaXRpZXMKICAgICAvLyBmb3IgYSBwcm9maWxlIHdpdGggZHluYW1pYyBmb3JtYXQsIHJhdGUgYW5kIGNoYW5uZWxzIGF0dHJpYnV0ZXMKLSAgICBzc2l6ZV90IGFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHZhbGlkIHByb2ZpbGUgdG8gYWRkOgotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgc2V0Rm9ybWF0cyhGb3JtYXRWZWN0b3IoZm9ybWF0cykpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiBwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0U2FtcGxlUmF0ZXNGb3IocHJvZmlsZVRvQWRkLT5nZXRTYW1wbGVSYXRlcygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIHNldENoYW5uZWxzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0Q2hhbm5lbHMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb2ZpbGUgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBzaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlID0gaXRlbUF0KHByb2ZpbGVJbmRleCk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBzZXQgdGhlIGZvcm1hdCBhcyBkeW5hbWljIHRvIGFsbG93IHJlbW92YWwKLSAgICAgICAgcmV0dXJuIGFkZChwcm9maWxlVG9BZGQpOwotICAgIH0KLQotICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGhhc1ZhbGlkUHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0VmFsaWRQcm9maWxlKCkgIT0gMDsgfQorICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKTsKIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVByb2ZpbGUodWludDMyX3QgJnNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgJmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpIGNvbnN0OworICAgIHZvaWQgY2xlYXJQcm9maWxlcygpOworICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhpcyBwcm9maWxlIHZlY3RvciBjb250YWlucyBpbnB1dCBwcm9maWxlcywKKyAgICAvLyBmaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGNvbmZpZyBmcm9tICdvdXRwdXRQcm9maWxlcycsIGFjY29yZGluZyB0bworICAgIC8vIHRoZSBnaXZlbiBwcmVmZXJlbmNlcyBmb3IgYXVkaW8gZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcy4KKyAgICAvLyBOb3RlOiBzdGQ6OnZlY3RvcnMgYXJlIHVzZWQgYmVjYXVzZSBzcGVjaWFsaXplZCBjb250YWluZXJzIGZvciBmb3JtYXRzCisgICAgLy8gICAgICAgYW5kIGNoYW5uZWxzIGNhbiBiZSBzb3J0ZWQgYW5kIHVzZSB0aGVpciBvd24gb3JkZXJpbmcuCisgICAgc3RhdHVzX3QgZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+JiBwcmVmZXJyZWRGb3JtYXRzLCAvLyBvcmRlcjogbW9zdCBwcmVmIC0+IGxlYXN0IHByZWYKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBib29sIHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZSAqYmVzdE91dHB1dENvbmZpZykgY29uc3Q7CiAKLSAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Ci0gICAgewotICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0czsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdHMuYWRkKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBwb3J0ZWRGb3JtYXRzOwotICAgIH0KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3Q7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CiAKLSAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmlzRHluYW1pYygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0Zvcm1hdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCkgIT0gMDsgfQorICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CiAKICAgICAvLyBPbmUgYXVkaW8gcHJvZmlsZSB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIGZvcm1hdCBzdXBwb3J0ZWQgYnkgQXVkaW8gSEFMCi0gICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCi0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKLSAgICAgICAgaWYgKGR5bmFtaWNGb3JtYXRQcm9maWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7Ci0gICAgICAgICAgICBhZGQocHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cyk7CiAKLSAgICB2b2lkIGNsZWFyUHJvZmlsZXMoKQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IHNpemUoKTsgaSAhPSAwOyApIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotICAgIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDgpOwotICAgICAgICB9Ci0gICAgfQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCmluZGV4IDZiMjRmZGUuLjAzNTdmZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaApAQCAtNDYsNyArNDYsMjAgQEAKIAogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBpcyBzdXBwb3J0ZWQgYnkgYSBSb3V0ZSBkZWNsYXJlZCBpbgorICAgICAqIHRoZSBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBJZiB0aGUgcGF0Y2ggaXMgc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IGFuIEF1ZGlvSEFMICh3aGljaCBzdXBwb3J0cyBvZiBjb3Vyc2UgUm91dGluZyBBUEkgMy4wKSwKKyAgICAgKiBhdWRpb3BvbGljeSB3aWxsIG5vdCByZXF1ZXN0IEF1ZGlvRmxpbmdlciB0byB1c2UgYSBzb2Z0d2FyZSBicmlkZ2UgdG8gcmVhbGl6ZSBhIHBhdGNoCisgICAgICogYmV0d2VlbiAyIHBvcnRzLgorICAgICAqIEBwYXJhbSBzcmNQb3J0IChha2EgdGhlIHNvdXJjZSkgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBkc3RQb3J0IChha2EgdGhlIHNpbmspIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF1ZGlvIHJvdXRlIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHNpbmsgYW5kIHRoZSBzb3VyY2UsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgQXVkaW9Qb3J0VmVjdG9yIG1Tb3VyY2VzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDUyNDdkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8udWlkOyB9Ci0gICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQotICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQotICAgIHZvaWQgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQotICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQotICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwotICAgIHVpbnQzMl90IGFjdGl2ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZUNvdW50OyB9IDsKLQotICAgIHVpbnQzMl90IGNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpOwotICAgIHVpbnQzMl90IGNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSk7Ci0KLSAgICB2b2lkIHNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1SZWNvcmRDbGllbnRJbmZvOwotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwotICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKLSAgICBib29sIG1TaWxlbmNlZDsKLSAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKLSAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwotICAgIEF1ZGlvTWl4KiBtUG9saWN5TWl4OyAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlKiBtQ2xpZW50SW50ZXJmYWNlOwotICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogbUluZm9Qcm92aWRlcjsKLX07Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gOgotICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxBdWRpb1Nlc3Npb24+ID4sCi0gICAgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIHN0YXR1c190IGFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcik7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmVTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIHVpbnQzMl90IGdldE9wZW5Db3VudCgpIGNvbnN0OwotCi0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBnZXRBY3RpdmVTZXNzaW9ucygpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdDsKLSAgICBib29sIGhhc0FjdGl2ZVNlc3Npb24oKSBjb25zdDsKLSAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0gICAgYXVkaW9fc291cmNlX3QgZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0KLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzN2ZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW5wdXQgZGVzY3JpcHRvcnMgdG8gaW1wbGVtZW50IHNvIGRlcGVuZGVudCBhdWRpbyBzZXNzaW9ucyBjYW4gcXVlcnkgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZWlyIGNvbnRleHQKLSAqLwotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKCkge307Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0ID0gMDsKLQotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyKCkge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0ID0gMDs7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTBmNDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0jaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOwotY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOwotCi1jbGFzcyBBdWRpb1NvdXJjZURlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIDoKLSAgICAgICAgbURldmljZShkZXZpY2UpLCBtQXR0cmlidXRlcygqYXR0cmlidXRlcyksIG1VaWQodWlkKSB7fQotICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hEZXNjLT5tSGFuZGxlOyB9Ci0KLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlOwotICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsKLSAgICB1aWRfdCBtVWlkOwotICAgIHNwPEF1ZGlvUGF0Y2g+IG1QYXRjaERlc2M7Ci0gICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKLSAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OwotfTsKLQotY2xhc3MgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIDoKLSAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gPgotewotcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODcwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIlJvdXRpbmdTdHJhdGVneS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCkgOgorICAgICAgICBtUG9ydElkKHBvcnRJZCksIG1VaWQodWlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgbUNvbmZpZyhjb25maWcpLCBtUHJlZmVycmVkRGV2aWNlSWQocHJlZmVycmVkRGV2aWNlSWQpLCBtQWN0aXZlKGZhbHNlKSB7fQorICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZDsgfTsKKyAgICB2b2lkIHNldFByZWZlcnJlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZUlkID0gcHJlZmVycmVkRGV2aWNlSWQ7CisgICAgfTsKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CisgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAgLy8gdW5pcXVlIElkIGZvciB0aGlzIGNsaWVudAorICAgIGNvbnN0IHVpZF90IG1VaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOyAvLyB1c2FnZS4uLgorICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgbUNvbmZpZzsKKyAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1QcmVmZXJyZWREZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgYm9vbCBtQWN0aXZlOworfTsKKworY2xhc3MgVHJhY2tDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkKSwKKyAgICAgICAgbVN0cmVhbShzdHJlYW0pLCBtU3RyYXRlZ3koc3RyYXRlZ3kpLCBtRmxhZ3MoZmxhZ3MpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3koKSBjb25zdCB7IHJldHVybiBtU3RyYXRlZ3k7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRBcHBTdGF0ZShhcHBfc3RhdGVfdCBhcHBTdGF0ZSkgeyBtQXBwU3RhdGUgPSBhcHBTdGF0ZTsgfQorICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlKCkgeyByZXR1cm4gbUFwcFN0YXRlOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbUFwcFN0YXRlID09IEFQUF9TVEFURV9JRExFOyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkRWZmZWN0czsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3QgYm9vbCBtSXNTb3VuZFRyaWdnZXI7CisgICAgICAgICAgYXBwX3N0YXRlX3QgbUFwcFN0YXRlOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBUcmFja0NsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYygpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2M7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9OworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Td091dHB1dDsgfQorICAgIHZvaWQgc2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCk7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbUh3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChjb25zdCBzcDxUPiAmY2xpZW50KSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gY2xpZW50LT5wb3J0SWQoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUNsaWVudHMuZW1wbGFjZShwb3J0SWQsIGNsaWVudCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGF0dGVtcHRpbmcgdG8gYWRkIGNsaWVudCB0aGF0IGFscmVhZHkgZXhpc3RzIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgfQorICAgIHNwPFQ+IGdldENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBpZiAoaXQgPT0gbUNsaWVudHMuZW5kKCkpIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ID09IG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGNsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0LT5zZWNvbmQtPmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IHJlbW92aW5nIGNsaWVudCBzdGlsbCBhY3RpdmUhIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgICh2b2lkKW1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVscGVyIHR5cGVzCisgICAgdXNpbmcgQ2xpZW50TWFwID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8VD4+OworICAgIHVzaW5nIENsaWVudE1hcEl0ZXJhdG9yID0gdHlwZW5hbWUgQ2xpZW50TWFwOjpjb25zdF9pdGVyYXRvcjsgIC8vIENsaWVudE1hcCBpcyBjb25zdCBxdWFsaWZpZWQKKyAgICBjbGFzcyBDbGllbnRJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDbGllbnRJdGVyYWJsZShjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+ICZyZWYpIDogbUNsaWVudE1hcEhhbmRsZXIocmVmKSB7IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIHRyYWl0cworICAgICAgICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHNwPFQ+OworICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgICAgICAgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHNwPFQ+KjsgICAgLy8gTm90ZTogY29uc3QKKyAgICAgICAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHNwPFQ+JjsgIC8vIE5vdGU6IGNvbnN0CisKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBDbGllbnRNYXBJdGVyYXRvciAmaXQpIDogbUl0KGl0KSB7IH0KKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgLyogcHJlZml4ICovICAgICB7ICsrbUl0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciogKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yLT4oKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9IC8vIGFzIGlmIHNwPD4KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcmF0b3ImIHJocykge3JldHVybiBtSXQgLSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ID09IHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgIT0gcmhzLm1JdDsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQ2xpZW50TWFwSXRlcmF0b3IgbUl0OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuYmVnaW4oKX07IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuZW5kKCl9OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+JiBtQ2xpZW50TWFwSGFuZGxlcjsgLy8gaXRlcmF0aW5nIGRvZXMgbm90IG1vZGlmeSBtYXAuCisgICAgfTsKKworICAgIC8vIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJhbmdlLWJhc2VkLWZvciB0byBlbnVtZXJhdGUgY2xpZW50cy4KKyAgICAvLyB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IGFsbG93IG1vZGlmaWNhdGlvbiwgaXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkuCisgICAgQ2xpZW50SXRlcmFibGUgZ2V0Q2xpZW50SXRlcmFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDbGllbnRJdGVyYWJsZXsqdGhpc307CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENsaWVudE1hcCBtYXBzIGEgcG9ydElkIHRvIGEgY2xpZW50IGRlc2NyaXB0b3IgKGJvdGggdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBvdGhlcikuCisgICAgQ2xpZW50TWFwIG1DbGllbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ODU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENvbmZpZ1BhcnNpbmdVdGlscwotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+ICZwcmltYXJ5TW9kdWxlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLmQwMjEyM2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMzEsMTIgKzMxLDE4IEBACiBwdWJsaWM6CiAgICAgIC8vIE5vdGUgdGhhdCBlbXB0eSBuYW1lIHJlZmVycyBieSBjb252ZW50aW9uIHRvIGEgZ2VuZXJpYyBkZXZpY2UuCiAgICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKIAogICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCB7IHJldHVybiBtVGFnTmFtZTsgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZTsgfQorICAgIFN0cmluZzggYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1BZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIHsgbUFkZHJlc3MgPSBhZGRyZXNzOyB9CisKKyAgICBjb25zdCBGb3JtYXRWZWN0b3ImIGVuY29kZWRGb3JtYXRzKCkgY29uc3QgeyByZXR1cm4gbUVuY29kZWRGb3JtYXRzOyB9CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwogCkBAIC01MSw0MCArNTcsMTE2IEBACiAgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlID0gZmFsc2UpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAgICAgdm9pZCBsb2coKSBjb25zdDsKLQotICAgIFN0cmluZzggbUFkZHJlc3M7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICBTdHJpbmc4IG1BZGRyZXNzeyIifTsKICAgICBTdHJpbmc4IG1UYWdOYW1lOyAvLyBVbmlxdWUgaHVtYW4gcmVhZGFibGUgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UgcG9ydCBmb3VuZCBpbiBjb25mIGZpbGUuCiAgICAgYXVkaW9fZGV2aWNlc190ICAgICBtRGV2aWNlVHlwZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKLQotZnJpZW5kIGNsYXNzIERldmljZVZlY3RvcjsKKyAgICBGb3JtYXRWZWN0b3IgICAgICAgIG1FbmNvZGVkRm9ybWF0czsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiB9OwogCiBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPHNwPERldmljZURlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisgICAgZXhwbGljaXQgRGV2aWNlVmVjdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSA6IERldmljZVZlY3RvcigpCisgICAgeworICAgICAgICBhZGQoaXRlbSk7CisgICAgfQogCiAgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwogICAgIHZvaWQgYWRkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCBpbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdDsKIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgLy8gSWYgJ2FkZHJlc3MnIGlzIGVtcHR5LCBhIGRldmljZSB3aXRoIGEgbm9uLWVtcHR5IGFkZHJlc3MgbWF5IGJlIHJldHVybmVkCisgICAgLy8gaWYgdGhlcmUgaXMgbm8gZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCAndHlwZScgYW5kIGVtcHR5IGFkZHJlc3MuCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZhZGRyZXNzID0ge30pIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0RGV2aWNlRnJvbUlkCisgICAgICogQHBhcmFtIGlkIG9mIHRoZSBEZXZpY2VEZXNjcmlwdG9yIHRvIHNlYWNoIChha2EgUG9ydCBoYW5kbGUpLgorICAgICAqIEByZXR1cm4gRGV2aWNlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHBvcnQgaWQgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlLiBJZiB0aGUgaWQgaXMKKyAgICAgKiBlcXVhbCB0byBBVURJT19QT1JUX0hBTkRMRV9OT05FLCBpdCBhbHNvIHJldHVybnMgYSBudWxscHRyLgorICAgICAqLwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisgICAgYm9vbCBjb250YWlucyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QgeyByZXR1cm4gaW5kZXhPZihpdGVtKSA+PSAwOyB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQXRMZWFzdE9uZQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYXQgbGlzdCBvbmUgb2YgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBdExlYXN0T25lKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY29udGFpbnNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRldmljZXMgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERldmljZVZlY3RvciBjb250YWlucyBhbGwgdGhlIGRldmljZXMgZnJvbSB0aGUgZ2l2ZW4gdmVjdG9yCisgICAgICovCisgICAgYm9vbCBjb250YWluc0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBmaWx0ZXIgdGhlIGRldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29sbGVjdGlvbiBhZ2FpbnN0IGFub3RoZXIgY29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRvIGZpbHRlciBhZ2FpbnN0CisgICAgICogQHJldHVybgorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtZXJnZSB0d28gdmVjdG9ycy4gQXMgU29ydGVkVmVjdG9yIEltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5IChpdCBkb2VzIG5vdCBjaGVjayB0aGUgc2l6ZQorICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IsIG9ubHkgb2YgdGhlIHNvdXJjZSwgaXQgcHJvdmlkZXMgYSBzYWZlIGltcGxlbWVudGF0aW9uCisgICAgICogQHBhcmFtIGRldmljZXMgc291cmNlIGRldmljZSB2ZWN0b3IgdG8gbWVyZ2Ugd2l0aAorICAgICAqIEByZXR1cm4gc2l6ZSBvZiB0aGUgbWVyZ2VkIHZlY3Rvci4KKyAgICAgKi8KKyAgICBzc2l6ZV90IG1lcmdlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKKyAgICB7CisgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZChkZXZpY2VzKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNvcnRlZFZlY3Rvcjo6bWVyZ2UoZGV2aWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIG9wZXJhdG9yID09IERldmljZVZlY3RvciBhcmUgZXF1YWxzIGlmIGFsbCB0aGUgRGV2aWNlRGVzY3JpcHRvciBjYW4gYmUgZm91bmQgKGFrYQorICAgICAqIERldmljZURlc2NyaXB0b3Igd2l0aCBzYW1lIHR5cGUgYW5kIGFkZHJlc3MpIGFuZCB0aGUgdmVjdG9yIGhhcyBzYW1lIHNpemUuCisgICAgICogQHBhcmFtIHJpZ2h0IERldmljZVZlY3RvciB0byBjb21wYXJlIHRvLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByaWdodCBjb250YWlucyB0aGUgc2FtZSBkZXZpY2UgYW5kIGhhcyB0aGUgc2FtZSBzaXplLgorICAgICAqLworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXZpY2VWZWN0b3IgJnJpZ2h0KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAocmlnaHQuaW5kZXhPZihkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShyaWdodCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAppbmRleCAwNDgzMWM2Li4yZGMzM2FiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTIxLDE1ICsyMSwxNiBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CiAKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECiAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwogICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwogICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KQEAgLTQ1LDEyICs0NiwxNCBAQAogICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKICAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZ2V0RWZmZWN0KGludCBpZCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgYm9vbCAgICAgaXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCkgY29uc3Q7Ci0gICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjI5YTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyZWFtRGVzY3JpcHRvcjsKLQotY2xhc3MgR2FpbnMKLXsKLXB1YmxpYyA6Ci0gICAgc3RhdGljIGZsb2F0IHZvbEluZGV4VG9EYihjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKLQotICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFyaW5nQWlkVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlcyBwZXIgc3RyZWFtIGFuZCBkZXZpY2UgY2F0ZWdvcnkuIFNlZSBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW0RFVklDRV9DQVRFR09SWV9DTlRdOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaAppbmRleCBjYjlmNDllLi4yYjU3ZmE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaApAQCAtODEsOCArODEsMTkgQEAKICAgICAgICAgcmV0dXJuIG1Qb3J0cy5maW5kQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIDIgcG9ydHMgYmVsb2dpbmcgdG8gdGhpcyBId01vZHVsZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSBhIEh3TW9kdWxlLiBUaGUgcG9ydHMgYW5kIHRoZSByb3V0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKKyAgICAgKiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBId01vZHVsZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKwogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC0xMDcsOSArMTE4LDkgQEAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkcmVzcyA9IHRydWUpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkZHJlc3MgPSB0cnVlKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAppbmRleCA2N2FjOWJjLi5jYTZjYTU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCkBAIC0zNSw3ICszNSw3IEBACiBwdWJsaWM6CiAgICAgSU9Qcm9maWxlKGNvbnN0IFN0cmluZzggJm5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCiAgICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpLAotICAgICAgICAgIG1heE9wZW5Db3VudCgocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSA/IDEgOiAwKSwKKyAgICAgICAgICBtYXhPcGVuQ291bnQoMSksCiAgICAgICAgICAgY3VyT3BlbkNvdW50KDApLAogICAgICAgICAgIG1heEFjdGl2ZUNvdW50KDEpLAogICAgICAgICAgIGN1ckFjdGl2ZUNvdW50KDApIHt9CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKICAgICB2b2lkIGxvZygpOwogCiAgICAgYm9vbCBoYXNTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gIW1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKTsgfQpAQCAtODgsNyArODgsNyBAQAogCiAgICAgYm9vbCBzdXBwb3J0RGV2aWNlQWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcyA9PSBhZGRyZXNzOworICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXNbMF0tPmFkZHJlc3MoKSA9PSBhZGRyZXNzOwogICAgIH0KIAogICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZiBkZXZpY2VUeXBlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCmluZGV4IGUxZjZiMDguLjc1MGRhNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0ID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCmluZGV4IDI5ZGU4NDguLjQ4YzQxNDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaApAQCAtMTcsMjIzICsxNyw5IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi1zdHJ1Y3QgX3htbE5vZGU7Ci1zdHJ1Y3QgX3htbERvYzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQXVkaW9HYWluVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtb2RlW107IC8qKjwgZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLwotICAgICAgICAvKiogY29udHJvbGxlZCBjaGFubmVscywgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGFubmVsTWFza1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtaW5WYWx1ZU1CW107IC8qKjwgbWluIHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhWYWx1ZU1CW107IC8qKjwgbWF4IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0VmFsdWVNQltdOyAvKio8IGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0ZXBWYWx1ZU1CW107IC8qKjwgc3RlcCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluUmFtcE1zW107IC8qKjwgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heFJhbXBNc1tdOyAvKio8IC5uZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUCAqLwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvR2FpbiBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvR2FpbkNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBHYWluIGhhcyBubyBjaGlsZAotfTsKLQotLy8gQSBwcm9maWxlIHNlY3Rpb24gY29udGFpbnMgYSBuYW1lLCAgb25lIGF1ZGlvIGZvcm1hdCBhbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCi0vLyBhbmQgY2hhbm5lbCBtYXNrcyBmb3IgdGhpcyBmb3JtYXQKLXN0cnVjdCBBdWRpb1Byb2ZpbGVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2FtcGxpbmdSYXRlc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tzW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxBdWRpb1Byb2ZpbGU+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb1Byb2ZpbGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci19OwotCi1zdHJ1Y3QgTWl4UG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGZsYWdzW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1heE9wZW5Db3VudFtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhBY3RpdmVDb3VudFtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIElPUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIElPUHJvZmlsZUNvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMKLX07Ci0KLXN0cnVjdCBEZXZpY2VQb3J0VHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0YWdOYW1lW107IC8qKjwgIDxkZXZpY2UgdGFnIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHR5cGVbXTsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlW107IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvbGVTb3VyY2VbXTsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgYWRkcmVzc1tdOyAvKio8IG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0LiAqLwotICAgIH07Ci0gICAgdHlwZWRlZiBEZXZpY2VEZXNjcmlwdG9yIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgRGV2aWNlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotICAgIC8vIENoaWxkcmVuIGFyZTogR2FpblRyYWl0cyAob3B0aW9ubmFsKQotfTsKLQotc3RydWN0IFJvdXRlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPHJvdXRlIHR5cGU+OiBtaXggb3IgbXV4LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlTWl4W107IC8qKjwgdHlwZSBhdHRyaWJ1dGUgbWl4IHZhbHVlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzaW5rW107IC8qKjwgPHNpbms6IGludm9sdmVkIGluIHRoaXMgcm91dGU+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzb3VyY2VzW107IC8qKjwgc291cmNlczogYWxsIHNvdXJjZSB0aGF0IGNhbiBiZSBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlLiAqLwotICAgIH07Ci0gICAgdHlwZWRlZiBBdWRpb1JvdXRlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxBdWRpb1JvdXRlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgSHdNb2R1bGUgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCk7Ci19OwotCi1zdHJ1Y3QgTW9kdWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZVRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEh3TW9kdWxlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxFbGVtZW50PiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgSHdNb2R1bGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cyBhbmQgcm91dGVUcmFpdHMKLSAgICAvLyBOZWVkIHRvIGNhbGwgZGVzZXJpYWxpemUgb24gZWFjaCBjaGlsZAotfTsKLQotc3RydWN0IEdsb2JhbENvbmZpZ1RyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3BlYWtlckRyY0VuYWJsZWRbXTsKLSAgICB9OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IF94bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLXN0cnVjdCBWb2x1bWVUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2b2x1bWVQb2ludFRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdHJlYW1bXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGV2aWNlQ2F0ZWdvcnlbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcmVmZXJlbmNlW107Ci0gICAgfTsKLQotICAgIHR5cGVkZWYgVm9sdW1lQ3VydmUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPFZvbHVtZUN1cnZlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLQotICAgIC8vIE5vIENoaWxkCi19OwotCi1jbGFzcyBQb2xpY3lTZXJpYWxpemVyCi17Ci1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByb290TmFtZTsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2ZXJzaW9uQXR0cmlidXRlOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBnTWFqb3I7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01pbm9yOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0KLXB1YmxpYzoKLSAgICBQb2xpY3lTZXJpYWxpemVyKCk7Ci0gICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqc3RyLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLQotcHJpdmF0ZToKLSAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7Ci0KLSAgICBzdGQ6OnN0cmluZyBtUm9vdEVsZW1lbnROYW1lOwotICAgIHN0ZDo6c3RyaW5nIG1WZXJzaW9uOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMKLX07CitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShjb25zdCBjaGFyICpmaWxlTmFtZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiNDQ0MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKLWNsYXNzIERldmljZVZlY3RvcjsKLQotY2xhc3MgU2Vzc2lvblJvdXRlIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAvLyBGb3IgSW5wdXQgKFNvdXJjZSkgcm91dGVzLCB1c2UgU1RSRUFNX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUpZm9yIHRoZQotICAgIC8vIHN0cmVhbVR5cGUgYXJndW1lbnQKLSAgICBzdGF0aWMgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBTVFJFQU1fVFlQRV9OQSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwotCi0gICAgLy8gRm9yIE91dHB1dCAoU2luaykgcm91dGVzLCB1c2UgU09VUkNFX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUiKSBmb3IgdGhlCi0gICAgLy8gc291cmNlIGFyZ3VtZW50Ci0KLSAgICBzdGF0aWMgY29uc3QgYXVkaW9fc291cmNlX3QgU09VUkNFX1RZUEVfTkEgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLQotICAgIFNlc3Npb25Sb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICAgICAgOiBtVWlkKHVpZCksCi0gICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IoZGV2aWNlRGVzY3JpcHRvciksCi0gICAgICAgICAgbVJlZkNvdW50KDApLAotICAgICAgICAgIG1BY3Rpdml0eUNvdW50KDApLAotICAgICAgICAgIG1DaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICAgICAgICBtU291cmNlKHNvdXJjZSkKLSAgICB7fQotCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogcHJlZml4KTsKLQotICAgIGJvb2wgaXNBY3RpdmVPckNoYW5nZWQoKSB7Ci0gICAgICAgIHJldHVybiAobURldmljZURlc2NyaXB0b3IgIT0gMCkgJiYgKG1DaGFuZ2VkIHx8IChtQWN0aXZpdHlDb3VudCA+IDApKTsKLSAgICB9Ci0KLSAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbVNlc3Npb247Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yOwotCi0gICAgLy8gInJlZmVyZW5jZSIgY291bnRpbmcKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgIC8vICsvLSBvbiByZWZlcmVuY2VzCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50OyAvLyArLy0gb24gc3RhcnQvc3RvcAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbmdlZDsKLSAgICAvLyBmb3Igb3V0cHV0cwotICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgICBtU3RyZWFtVHlwZTsKLSAgICAvLyBmb3IgaW5wdXRzCi0gICAgY29uc3QgYXVkaW9fc291cmNlX3QgICAgICAgIG1Tb3VyY2U7Ci19OwotCi1jbGFzcyBTZXNzaW9uUm91dGVNYXA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPFNlc3Npb25Sb3V0ZT4gPgotewotcHVibGljOgotICAgIC8vIFRoZXNlIGNvbnN0YW50cyBpZGVudGlmeSB0aGUgU2Vzc2lvblJvdXRNYXAgYXMgaG9sZGluZyBFSVRIRVIgaW5wdXQgcm91dGVzLAotICAgIC8vIG9yIG91dHB1dCByb3V0ZXMuICBBbiBlcnJvciB3aWxsIG9jY3VyIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBTZXNzaW9uUm91dGUKLSAgICAvLyBvYmplY3Qgd2l0aCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1fVFlQRV9OQSAoaS5lLiBhbiBpbnB1dCBTZXNzaW9uUm91dGUpIHRvIGEKLSAgICAvLyBTZXNzaW9uUm91dE1hcCB0aGF0IGlzIG1hcmtlZCBmb3Igb3V0cHV0IChpLmUuIG1NYXBUeXBlID09IFNFU1NJT05fUk9VVEVfTUFQX09VVFBVVCkKLSAgICAvLyBhbmQgc2ltaWxhcmx5ICBmb3Igb3V0cHV0IFNlc3Npb25Sb3V0ZXMgYW5kIElucHV0IFNlc3Npb25Sb3V0ZU1hcHMuCi0gICAgdHlwZWRlZiBlbnVtCi0gICAgewotICAgICAgICBNQVBUWVBFX0lOUFVUID0gMCwKLSAgICAgICAgTUFQVFlQRV9PVVRQVVQgPSAxCi0gICAgfSBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3Q7Ci0KLSAgICBleHBsaWNpdCBTZXNzaW9uUm91dGVNYXAoc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1hcFR5cGUpIDoKLSAgICAgICAgbU1hcFR5cGUobWFwVHlwZSkKLSAgICB7fQotCi0gICAgYm9vbCBoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICB2b2lkIHJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIGludCBpbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBpbnQgZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgYm9vbCBnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7IC8vIGFsc28gY2xlYXJzIHRoZSBjaGFuZ2VkIGZsYWcKLSAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlRGV2aWNlcyk7Ci0gICAgLy8gU3BlY2lmeSBhbiBPdXRwdXQoU2luaykgcm91dGUgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BIGluIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudC4KLSAgICAvLyBTcGVjaWZ5IGFuIElucHV0KFNvdXJjZSkgcm91dCBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6QVVESU9fU1RSRUFNX0RFRkFVTFQKLSAgICAvLyBpbiB0aGUgc3RyZWFtVHlwZSBhcmd1bWVudC4KLSAgICB2b2lkIGFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotCi1wcml2YXRlOgotICAgIC8vIFVzZWQgdG8gbWFyayBhIFNlc3Npb25Sb3V0ZSBhcyBmb3IgZWl0aGVyIGlucHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9JbnB1dCkKLSAgICAvLyBvciBvdXRwdXRzIChtTWFwVHlwZSA9PSBrU2Vzc2lvblJvdXRlTWFwX091dHB1dCkKLSAgICBjb25zdCBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3QgbU1hcFR5cGU7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiMTAzNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKLWNsYXNzIFN0cmVhbURlc2NyaXB0b3IKLXsKLXB1YmxpYzoKLSAgICBTdHJlYW1EZXNjcmlwdG9yKCk7Ci0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7Ci0gICAgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KLSAgICB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7Ci0gICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KTsKLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpOwotICAgIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgICAgIHJldHVybiBtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpID49IDA7Ci0gICAgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCk7Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9DTlRdOwotICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KLSAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCi0gICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLwotICAgIGJvb2wgbUNhbkJlTXV0ZWQ7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KLX07Ci0KLS8qKgotICogc3RyZWFtIGRlc2NyaXB0b3JzIGNvbGxlY3Rpb24gZm9yIHZvbHVtZSBjb250cm9sCi0gKi8KLWNsYXNzIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBTdHJlYW1EZXNjcmlwdG9yPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWF4KCk7Ci0gICAgfQotICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgdmlydHVhbCB2b2lkIHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCk7Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB2b2lkIHNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0OwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKTsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAppbmRleCA2M2MxOWQxLi42YjA0NzZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKQEAgLTIzLDI2ICsyMywxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBEZXZpY2VDYXRlZ29yeVRyYWl0cwotewotICAgIHR5cGVkZWYgZGV2aWNlX2NhdGVnb3J5IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgTWl4VHlwZVRyYWl0cwotewotICAgIHR5cGVkZWYgaW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFJvdXRlRmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSdWxlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiB1aW50MzJfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Oworc3RydWN0IFJ1bGVUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdFRyYWl0czx1aW50MzJfdD4ge307Cit1c2luZyBEZXZpY2VDYXRlZ29yeVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8ZGV2aWNlX2NhdGVnb3J5PjsKK3N0cnVjdCBNaXhUeXBlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8aW50MzJfdD4ge307CitzdHJ1Y3QgUm91dGVGbGFnVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwogCiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8RGV2aWNlQ2F0ZWdvcnlUcmFpdHM+IERldmljZUNhdGVnb3J5Q29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPE1peFR5cGVUcmFpdHM+IE1peFR5cGVDb252ZXJ0ZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCmluZGV4IDNlNmIyYjQuLjc2ZWMxOTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC01OSw3ICs1OSw3IEBACiAKICAgICBmbG9hdCB2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0OwogCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKnJlc3VsdCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgU29ydGVkVmVjdG9yPEN1cnZlUG9pbnQ+IG1DdXJ2ZVBvaW50czsKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoZGV2aWNlKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAogICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCiAgICAgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAppbmRleCBjYTY3Yjg3Li5jOTBhNTgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcApAQCAtMzUsMjIgKzM1LDE2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgNCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgNCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKaW5kZXggMTkzZDRhNi4uMjcyNTg3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCkBAIC05OCwzMiArOTgsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb0dhaW46OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggMWUwNjQwYy4uMGJjODhhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsMjIgKzE3LDIwIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9JbnB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8cG9saWN5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Jb0hhbmRsZSgwKSwKLSAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLAotICAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQorICAgIDogbVByb2ZpbGUocHJvZmlsZSkKKyAgICAsICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKICAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgIHByb2ZpbGUtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKQEAgLTUwLDE5ICs0OCwzNyBAQAogICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRPcGVuUmVmQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0T3BlbkNvdW50KCk7Ci19Ci0KIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwogfQogCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aW5wdXRTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fc291cmNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNvdXJjZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKKworICAgIGZvciAoYm9vbCBhY3RpdmVPbmx5IDogeyB0cnVlLCBmYWxzZSB9KSB7CisgICAgICAgIGludDMyX3QgdG9wUHJpb3JpdHkgPSAtMTsKKyAgICAgICAgYXBwX3N0YXRlX3QgdG9wU3RhdGUgPSBBUFBfU1RBVEVfSURMRTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwX3N0YXRlX3QgY3VyU3RhdGUgPSBjbGllbnQtPmFwcFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoY3VyU3RhdGUgPj0gdG9wU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGNsaWVudC0+c291cmNlKCkpOworICAgICAgICAgICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHRvcFByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNsaWVudC0+c291cmNlKCk7CisgICAgICAgICAgICAgICAgICAgIHRvcFByaW9yaXR5ID0gY3VyUHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvcFN0YXRlID0gY3VyU3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNvdXJjZTsKIH0KIAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC04Myw3ICs5OSw3IEBACiAgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBpbnB1dFNvdXJjZSgpOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IHNvdXJjZSgpOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKQEAgLTExOCw1NyArMTM0LDI3IEBACiAgICAgbVByZWVtcHRlZFNlc3Npb25zLmNsZWFyKCk7CiB9CiAKLWJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbnMuaGFzQWN0aXZlU2Vzc2lvbigpOwotfQotCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLQotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJgorICAgICAgICAgICAgKChjbGllbnQtPnNvdXJjZSgpID09IHNvdXJjZSkgfHwKKyAgICAgICAgICAgICAgICAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCisgICAgICAgICAgICAgICAgICAgIChjbGllbnQtPnNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsKLSAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBzZXNzaW9ucyBhcmUgbm90IG1peGVkCi0gICAgLy8gb24gYSBnaXZlbiBpbnB1dAotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVBdCgwKS0+aXNTb3VuZFRyaWdnZXIoKTsKLX0KLQotc3A8QXVkaW9TZXNzaW9uPiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLX0KLQotQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnM7CisgICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgY2xpZW50cyBhcmUgbm90IG1peGVkIG9uIGEgZ2l2ZW4gaW5wdXQKKyAgICAvLyBzbyBjaGVjayBvbmx5IGZpcnN0IGNsaWVudAorICAgIGlmIChnZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9uQ291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5hZGRTZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbiwgLypBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqL3RoaXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6cmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5yZW1vdmVTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBnZXRDbGllbnRJdGVyYWJsZSgpLmJlZ2luKCktPmlzU291bmRUcmlnZ2VyKCk7CiB9CiAKIGF1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0CkBAIC0xNzksNyArMTY1LDExIEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOwotICAgIG1TZXNzaW9ucy5vblNlc3Npb25JbmZvVXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGF1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0CkBAIC0yMzksNyArMjI5LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0YXJ0KCkKIHsKLSAgICBpZiAoZ2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CiAgICAgICAgIGlmICghbVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewogICAgICAgICAgICAgQUxPR0koIiVzIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZCIsIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjY2LDM4ICsyNTYsMTc4IEBACiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7CiAgICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKKyAgICAgICAgLy8gIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBjbGllbnRzCiAgICAgICAgIC8vIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCiAgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKICAgICAgICAgfQogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIHsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjphZGRDbGllbnQoY2xpZW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKS0+bVNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA+IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA+IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBtU2Vzc2lvbnMuZHVtcChmZCwgMSk7CisgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBpbnQgZXZlbnQgPSBhY3RpdmUgPyBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDogUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOworICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oZXZlbnQsIGNsaWVudCk7CisKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbigKKyAgICBpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCit7CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXNzaW9uQ29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCByZWNvcmRDbGllbnRJbmZve2NsaWVudC0+dWlkKCksIGNsaWVudC0+c2Vzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5zb3VyY2UoKSwgY2xpZW50LT5wb3J0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTaWxlbmNlZCgpfTsKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IGdldENvbmZpZygpOworCisgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0czsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlZmZlY3RzTGlzdCA9IGNsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNsaWVudEVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdHNMaXN0LnZhbHVlQXQoaSktPm1EZXNjKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOworICAgIGVmZmVjdHNMaXN0ID0gZ2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHNMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdHMucHVzaF9iYWNrKGVmZmVjdHNMaXN0LnZhbHVlQXQoaSktPm1EZXNjKTsKKyAgICB9CisKKyAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZyZWNvcmRDbGllbnRJbmZvLCAmc2Vzc2lvbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RWZmZWN0cywgJmNvbmZpZywgZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoSGFuZGxlLCBzb3VyY2UoKSk7Cit9CisKK1JlY29yZENsaWVudFZlY3RvciBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q2xpZW50c0ZvclNlc3Npb24oCisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPnNlc3Npb24oKSA9PSBzZXNzaW9uKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0Cit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmICgoIWFjdGl2ZU9ubHkgfHwgY2xpZW50LT5hY3RpdmUoKSkKKyAgICAgICAgICAgICYmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgfHwgc291cmNlID09IGNsaWVudC0+c291cmNlKCkpCisgICAgICAgICAgICAmJiAoIXByZWZlcnJlZERldmljZU9ubHkgfHwgY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9CisKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGdldENsaWVudHNGb3JTZXNzaW9uKChhdWRpb19zZXNzaW9uX3QpZWZmZWN0LT5tU2Vzc2lvbik7CisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGNsaWVudEVmZmVjdCA9IGNsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKS5nZXRFZmZlY3QoZWZmZWN0LT5tSWQpOworICAgICAgICBib29sIGNoYW5nZWQgPSAoZW5hYmxlZCAmJiBjbGllbnRFZmZlY3QgPT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICB8fCAoIWVuYWJsZWQgJiYgY2xpZW50RWZmZWN0ICE9IG51bGxwdHIpOworICAgICAgICBjbGllbnQtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICBpZiAoY2hhbmdlZCAmJiBjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0VmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0Cit7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZW5hYmxlZEVmZmVjdHM7CisgICAgLy8gcmVwb3J0IGVmZmVjdHMgZm9yIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIHNvdXJjZSBhcyBhcHBsaWVkIHRvIGFsbCBjbGllbnRzCisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPQorICAgICAgICBjbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBzb3VyY2UoKSwgZmFsc2UgLypwcmVmZXJyZWREZXZpY2VPbmx5Ki8pOworICAgIGlmIChjbGllbnRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZW5hYmxlZEVmZmVjdHMgPSBjbGllbnRzWzBdLT5nZXRFbmFibGVkRWZmZWN0cygpOworICAgIH0KKyAgICByZXR1cm4gZW5hYmxlZEVmZmVjdHM7Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpIHsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGNsaWVudHNMaXN0KGZhbHNlIC8qYWN0aXZlT25seSovKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgd2FzU2lsZW5jZWQgPSBjbGllbnQtPmlzU2lsZW5jZWQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgd2FzU2lsZW5jZWQgIT0gY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgSUQ6ICVkXG4iLCBnZXRJZCgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOworICAgIGdldEVuYWJsZWRFZmZlY3RzKCkuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKIH0KIAogYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMzM2LDE1ICs0NjYsMTMgQEAKICAgICByZXR1cm4gY291bnQ7CiB9CiAKLVZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCitWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoKQogewogICAgIFZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fAotICAgICAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkgewogICAgICAgICAgICAgYWN0aXZlSW5wdXRzLmFkZChpbnB1dERlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzU4LDIwICs0ODYsMzUgQEAKICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAorc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRJbnB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiAwOworfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5tSW9IYW5kbGUgPT0gZWZmZWN0LT5tSW8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggOTliNDVjOC4uOTc1MDRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0zNCwxMiArMzQsMTIgQEAKIAogQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKQorICAgIDogbVBvcnQocG9ydCkKKyAgICAsIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKKyAgICAgICAgbUFjdGl2ZUNvdW50W2ldID0gMDsKICAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7CiAgICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOwogICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOwpAQCAtNTUsMTEgKzU1LDI4IEBACiAgICAgfQogfQogCithdWRpb19jb25maWdfYmFzZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKK3sKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHsgLnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZSwgLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIC5mb3JtYXQgPSBtRm9ybWF0IH07CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVBvcnQuZ2V0KCkgIT0gbnVsbHB0ciA/IG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIH0KIAorYXVkaW9fcGF0Y2hfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QYXRjaEhhbmRsZTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7Cit9CisKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JZDsKQEAgLTg2LDE3ICsxMDMsNzggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKIHsKLSAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAotICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICBpZiAoZGVsdGEgPT0gMCkgcmV0dXJuOworICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnRbc3RyZWFtXSkgPCAwKSB7CisgICAgICAgIC8vIGFueSBtaXNtYXRjaGVkIGFjdGl2ZSBjb3VudCB3aWxsIGFib3J0LgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIHN0cmVhbSBjb3VudCAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBkZWx0YSwgbUFjdGl2ZUNvdW50W3N0cmVhbV0pOworICAgICAgICAvLyBtQWN0aXZlQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIC8vIHJldHVybjsKKyAgICB9CisgICAgbUFjdGl2ZUNvdW50W3N0cmVhbV0gKz0gZGVsdGE7CisKKyAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgIG1BY3RpdmVDbGllbnRzW2NsaWVudF0gKz0gZGVsdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmVDbGllbnRzLmZpbmQoY2xpZW50KTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmVDbGllbnRzLmVuZCgpKSB7IC8vIGNsaWVudCBub3QgZm91bmQhCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgaW5hY3RpdmUgY2xpZW50IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kIDwgLWRlbHRhKSB7IC8vIGludmFsaWQgZGVsdGEhCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNsaWVudCBjb3VudCAlenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT50b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEsIGl0LT5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQgKz0gZGVsdGE7CisgICAgICAgIGlmIChpdC0+c2Vjb25kID09IDApIHsKKyAgICAgICAgICAgICh2b2lkKW1BY3RpdmVDbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCIlcyBzdHJlYW0gJWQsIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW0sIG1BY3RpdmVDb3VudFtzdHJlYW1dKTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gb3V0cHV0IGRlc2NyaXB0b3IiLCBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSk7CisKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaWdub3JlZCBhY3RpdmU6ICVkLCBjdXJyZW50IHN0cmVhbSBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgYWN0aXZlLCBtQWN0aXZlQ291bnRbY2xpZW50LT5zdHJlYW0oKV0pOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOwotICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICBjb25zdCBpbnQgZGVsdGEgPSBhY3RpdmUgPyAxIDogLTE7CisgICAgY2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY2xpZW50LCBkZWx0YSk7CisKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxSZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA9IDE7CisgICAgfQorICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKKworICAgIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA+IDApKSB7CisgICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA+IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOwogfQogCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CkBAIC0xMjAsNyArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0CiB7Ci0gICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICBpZiAobUFjdGl2ZUNvdW50W3N0cmVhbV0gIT0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGluUGFzdE1zID09IDApIHsKQEAgLTE4NCwzMiArMjYyLDQ1IEBACiAgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK1RyYWNrQ2xpZW50VmVjdG9yIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5LCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTk9ORSB8fCBzdHJhdGVneSA9PSBjbGllbnQtPnN0cmF0ZWd5KCkpCisgICAgICAgICAgICAmJiAoIXByZWZlcnJlZERldmljZU9ubHkgfHwgY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSkpIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIG1JZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlMDh4XG4iLCBkZXZpY2UoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBHbG9iYWwgYWN0aXZlIGNvdW50OiAldVxuIiwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICBkc3QtPmFwcGVuZCgiIFN0cmVhbSB2b2x1bWUgYWN0aXZlQ291bnQgbXV0ZUNvdW50XG4iKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgICAgJTAyZFxuIiwKKyAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgc3RyZWFtQWN0aXZlQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSksIG1NdXRlQ291bnRbaV0pOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmIChtQWN0aXZlQ2xpZW50cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBhY3RpdmUgKHN0cmVhbSkgY2xpZW50czpcbiIpOworICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFBhaXIgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBSZWZjb3VudDogJXp1IiwgY2xpZW50UGFpci5zZWNvbmQpOworICAgICAgICAgICAgY2xpZW50UGFpci5maXJzdC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCIgXG4iKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsb2coY29uc3QgY2hhciogaW5kZW50KQpAQCAtMjIzLDMwICszMTQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCiAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksIG1MYXRlbmN5KDApLAotICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1Qb2xpY3lNaXgoTlVMTCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwKICAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksCi0gICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKSwgbUdsb2JhbFJlZkNvdW50KDApCisgICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPmdldEZsYWdzKCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CiB9CiAKIGF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKQEAgLTI4OSw0MSArMzcwLDE3IEBACiAgICAgfQogfQogCi12b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQogewogICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjbGllbnQsIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDItPmNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KGNsaWVudCwgZGVsdGEpOwogICAgIH0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotCi0gICAgLy8gaGFuZGxlIHN0cmVhbS1pbmRlcGVuZGVudCByZWYgY291bnQKLSAgICB1aW50MzJfdCBvbGRHbG9iYWxSZWZDb3VudCA9IG1HbG9iYWxSZWZDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltR2xvYmFsUmVmQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGdsb2JhbFJlZkNvdW50ICVkIiwgZGVsdGEsIG1HbG9iYWxSZWZDb3VudCk7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUdsb2JhbFJlZkNvdW50ICs9IGRlbHRhOwotICAgIH0KLSAgICBpZiAoKG9sZEdsb2JhbFJlZkNvdW50ID09IDApICYmIChtR2xvYmFsUmVmQ291bnQgPiAwKSkgewotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAoKG9sZEdsb2JhbFJlZkNvdW50ID4gMCkgJiYgKG1HbG9iYWxSZWZDb3VudCA9PSAwKSkgewotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0gICAgfQorICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlU3RyZWFtQWN0aXZlQ291bnQoY2xpZW50LCBkZWx0YSk7CiB9CiAKLQogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CkBAIC00OTksNyArNTU2LDcgQEAKIAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOwotICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKQorICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShmYWxzZSkKICAgICAgICAgLy8gYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc3RyZWFtcyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQogICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewogICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CkBAIC01MzQsMjcgKzU5MSwxOCBAQAogfQogCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgotSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKK0h3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5tRGV2aWNlLCBjbGllbnRJbnRlcmZhY2UpLAorICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+c3JjRGV2aWNlKCksIGNsaWVudEludGVyZmFjZSksCiAgICAgICBtU291cmNlKHNvdXJjZSkKIHsKIH0KIAotc3RhdHVzX3QgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU291cmNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1Tb3VyY2UtPmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJTb3VyY2U6XG4iKTsKKyAgICBtU291cmNlLT5kdW1wKGRzdCwgMCwgMCk7CiB9CiAKIGF1ZGlvX2RldmljZXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCkBAIC01NjYsMTMgKzYxNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnQocG9ydCk7CiB9CiAKIApAQCAtNjUwLDggKzY5OCw4IEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7CisgICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCkgIT0gTlVMTCkpIHsKKyAgICAgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlId01vZHVsZSA9IHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5nZXRNb2R1bGUoKTsKICAgICAgICAgVmVjdG9yIDxzcDxJT1Byb2ZpbGU+PiBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlId01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewpAQCAtNjk4LDcgKzc0Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpcykhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTcxMywyMSArNzYxLDI0IEBACiAgICAgcmV0dXJuIGRldmljZXM7CiB9CiAKLQotc3RhdHVzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAorc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiAwOworfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogLy8gSHdBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KQEAgLTc1MSw3ICs4MDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgeworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPnN0cmVhbUFjdGl2ZUNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KXMpICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzU5LDIwICs4MTAsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBhOWZlNDhkLi5jZDFjMmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMzQsNTMgKzM0LDI5IEBACiB7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CitzdGF0aWMgdm9pZCBkdW1wUGF0Y2hFbmRwb2ludHMoCisgICAgICAgIFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY291bnQsIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICpjZmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICZjZmcgPSBjZmdzW2ldOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICBbJXMgJWRdICIsIHNwYWNlcywgIiIsIHByZWZpeCwgaSArIDEpOworICAgICAgICBpZiAoY2ZnLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgICAgICAgICAgZGV2aWNlVG9TdHJpbmcobVBhdGNoLnNvdXJjZXNbaV0uZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7CisgICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIkRldmljZSBJRCAlZCAlcyIsIGNmZy5pZCwgZGV2aWNlLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQorfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQYXRjaCAlZDogb3duZXIgdWlkICU0ZCwgaGFuZGxlICUyZCwgYWYgaGFuZGxlICUyZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIGluZGV4ICsgMSwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLApAQCAtMTYxLDE2ICsxMzcsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQYXRjaGVzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCAwODkzMGYxLi4zY2Y4MDE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC01Miw2NCArNTIsNTUgQEAKICAgICByZXR1cm4gJm1NaXg7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb1BvbGljeU1peDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIHN0ZDo6c3RyaW5nIG1peFR5cGVMaXRlcmFsOwogICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peC5tTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7CiAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXgubU1peFR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgIHN0ZDo6c3RyaW5nIHJvdXRlRmxhZ0xpdGVyYWw7CiAgICAgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKG1NaXgubVJvdXRlRmxhZ3MsIHJvdXRlRmxhZ0xpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgRmxhZ3M6ICVzXG4iLCBzcGFjZXMsICIiLCByb3V0ZUZsYWdMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwogICAgIGRldmljZVRvU3RyaW5nKG1NaXgubURldmljZVR5cGUsIGRldmljZUxpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpbnQgaW5kZXhDcml0ZXJpb24gPSAwOwogICAgIGZvciAoY29uc3QgYXV0byAmY3JpdGVyaW9uIDogbU1peC5tQ3JpdGVyaWEpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBDcml0ZXJpb24gJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaW5kZXhDcml0ZXJpb24rKyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOworCiAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVzYWdlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICAgICAgaWYgKG1NaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VMaXRlcmFsOwogICAgICAgICAgICAgaWYgKCFTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1Tb3VyY2UsIHNvdXJjZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBzb3VyY2VMaXRlcmFsLmNfc3RyKCkpOworCiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVaWQ6JWRcbiIsIHNwYWNlcyArIDQsICIiLCBjcml0ZXJpb24ubVZhbHVlLm1VaWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgcnVsZUxpdGVyYWw7CiAgICAgICAgIGlmICghUnVsZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tUnVsZSwgcnVsZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXyxjcml0ZXJpb24ubVJ1bGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSdWxlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgcnVsZUxpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpyZWdpc3Rlck1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBBdWRpb01peCBtaXgsCkBAIC0zNDksMTQgKzM0MCwxMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZyBsb2coIlxuQXVkaW8gUG9saWN5IE1peDpcbiIpOwotICAgIHdyaXRlKGZkLCBsb2cuY19zdHIoKSwgbG9nLnNpemUoKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUG9saWN5IE1peDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAppbmRleCBkODU1NjJlLi4xOWRkZTZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTM1NCwyNiArMzU0LDE4IEBACiAgICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOwogfQogCi12b2lkIEF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgaWYgKCFtTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBtUHJvZmlsZXMuZHVtcChmZCwgc3BhY2VzKTsKKyAgICAgICAgbVByb2ZpbGVzLmR1bXAoZHN0LCBzcGFjZXMpOwogCiAgICAgICAgIGlmIChtR2FpbnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKKyAgICAgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4NiwyMiArMzc4LDEyIEBACiAKIC8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KIAotQXVkaW9Qb3J0Q29uZmlnOjpBdWRpb1BvcnRDb25maWcoKQotewotICAgIG1TYW1wbGluZ1JhdGUgPSAwOwotICAgIG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZykpOwotICAgIG1HYWluLmluZGV4ID0gLTE7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQogewotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWcgPSB7IC5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2sgfTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogCiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKQEAgLTQyNSw2ICs0MDcsOSBAQAogICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewogICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKICAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgeworICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOworICAgIH0KIAogZXhpdDoKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC00MzYsMzMgKzQyMSwzOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHVwZGF0ZUZpZWxkKAorICAgICAgICBjb25zdCBUJiBwb3J0Q29uZmlnRmllbGQsIFQgYXVkaW9fcG9ydF9jb25maWc6Oipwb3J0X2NvbmZpZ19maWVsZCwKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnLAorICAgICAgICB1bnNpZ25lZCBpbnQgY29uZmlnTWFzaywgVCBkZWZhdWx0VmFsdWUpCit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSB7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IG51bGxwdHIpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgY29uZmlnTWFzaykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gc3JjQ29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IHBvcnRDb25maWdGaWVsZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKwogdm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9CisgICAgdXBkYXRlRmllbGQobVNhbXBsaW5nUmF0ZSwgJmF1ZGlvX3BvcnRfY29uZmlnOjpzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSwgMHUpOworICAgIHVwZGF0ZUZpZWxkKG1DaGFubmVsTWFzaywgJmF1ZGlvX3BvcnRfY29uZmlnOjpjaGFubmVsX21hc2ssCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUFVRElPX0NIQU5ORUxfTk9ORSk7CisgICAgdXBkYXRlRmllbGQobUZvcm1hdCwgJmF1ZGlvX3BvcnRfY29uZmlnOjpmb3JtYXQsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRk9STUFULCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwogICAgIGlmICgoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pICYmIGF1ZGlvcG9ydCAhPSBOVUxMKSB7CiAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOwpAQCAtNDc4LDYgKzQ2OCw5IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKICAgICB9CisKKyAgICB1cGRhdGVGaWVsZChtRmxhZ3MsICZhdWRpb19wb3J0X2NvbmZpZzo6ZmxhZ3MsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MsIHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH0pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAppbmRleCBmZDZmYzFjLi5hNjQ1ZTAyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKQEAgLTE0LDIwICsxNCwxMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKwogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUHJvZmlsZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorQ2hhbm5lbHNWZWN0b3IgQ2hhbm5lbHNWZWN0b3I6OmFzSW5NYXNrKCkgY29uc3QKK3sKKyAgICBDaGFubmVsc1ZlY3RvciBpbk1hc2tWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGFubmVsIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oY2hhbm5lbCkgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgICAgICBpbk1hc2tWZWN0b3IuYWRkKGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oY2hhbm5lbCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbk1hc2tWZWN0b3I7Cit9CisKK0NoYW5uZWxzVmVjdG9yIENoYW5uZWxzVmVjdG9yOjphc091dE1hc2soKSBjb25zdAoreworICAgIENoYW5uZWxzVmVjdG9yIG91dE1hc2tWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvJiBjaGFubmVsIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQoY2hhbm5lbCkgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgICAgICBvdXRNYXNrVmVjdG9yLmFkZChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0TWFza1ZlY3RvcjsKK30KKworYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKK3sKKyAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKKyAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOworfQorCitzdGF0aWMgQXVkaW9Qcm9maWxlKiBjcmVhdGVGdWxsRHluYW1pY0ltcGwoKQoreworICAgIEF1ZGlvUHJvZmlsZSogZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAorICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKKy8vIHN0YXRpYworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkKK3sKKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IGNyZWF0ZUZ1bGxEeW5hbWljSW1wbCgpOworICAgIHJldHVybiBkeW5hbWljUHJvZmlsZTsKK30KKworQXVkaW9Qcm9maWxlOjpBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKSA6CisgICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpCit7CisgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2tzKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5hZGQoc2FtcGxpbmdSYXRlKTsKK30KKworQXVkaW9Qcm9maWxlOjpBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKKyAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikge30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OnNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OnNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKQoreworICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcyA9IHNhbXBsZVJhdGVzOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OmNsZWFyKCkKK3sKKyAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrRXhhY3QodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0CiB7CkBAIC0zOSwyNyArMTMxLDYgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKLXsKLSAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKLXsKLSAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgotICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOwotfQotCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3QKIHsKQEAgLTE4Miw0NyArMjUzLDc5IEBACiAgICAgcmV0dXJuIGJlc3RNYXRjaCA+IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKIH0KIAotdm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMlcyVzXG4iLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA/ICJbZHluYW1pYyBjaGFubmVsc10iIDogIiIsCiAgICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWw7CiAgICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcobUZvcm1hdCwgZm9ybWF0TGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSk7CiAgICAgfQogICAgIGlmICghbVNhbXBsaW5nUmF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQogCiAgICAgaWYgKCFtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK3NzaXplX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gVmVjdG9yOjphZGQocHJvZmlsZSk7CisgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KKyAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgorICAgIC8vIFtdKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgeworICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKKyAgICAvLyB9CisgICAgc29ydChjb21wYXJlRm9ybWF0cyk7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQoreworICAgIC8vIENoZWNrIHZhbGlkIHByb2ZpbGUgdG8gYWRkOgorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7CisgICAgICAgIGZvcm1hdHMuYWRkKHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldFNhbXBsZVJhdGVzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0U2FtcGxlUmF0ZXMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldENoYW5uZWxzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0Q2hhbm5lbHMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb2ZpbGUgdG8gYXZvaWQgZHVwbGljYXRlcworICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSA9IGl0ZW1BdChwcm9maWxlSW5kZXgpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgICAgICByZXR1cm4gcHJvZmlsZUluZGV4OworICAgICAgICB9CisgICAgfQorICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gc2V0IHRoZSBmb3JtYXQgYXMgZHluYW1pYyB0byBhbGxvdyByZW1vdmFsCisgICAgcmV0dXJuIGFkZChwcm9maWxlVG9BZGQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKQEAgLTI4MSw2ICszODQsMjI4IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNsZWFyUHJvZmlsZXMoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSBzaXplKCk7IGkgIT0gMDsgKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICAgICAgcmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcm9maWxlLT5jbGVhcigpOworICAgIH0KK30KKworLy8gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycyBhbmQgdGhlIGNvbnRlbnRzIG9mICdvcmRlcicuCisvLyBUaGUgcmVzdWx0IGlzIG9yZGVyZWQgYWNjb3JkaW5nIHRvICdvcmRlcicuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBPcmRlcj4KK3N0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKAorICAgICAgICBjb25zdCBUJiBpbnB1dDEsIGNvbnN0IFQmIGlucHV0MiwgY29uc3QgT3JkZXImIG9yZGVyKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDF7aW5wdXQxLmJlZ2luKCksIGlucHV0MS5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gc2V0MntpbnB1dDIuYmVnaW4oKSwgaW5wdXQyLmVuZCgpfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBjb21tb247CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKHNldDEuYmVnaW4oKSwgc2V0MS5lbmQoKSwgc2V0Mi5iZWdpbigpLCBzZXQyLmVuZCgpLAorICAgICAgICAgICAgc3RkOjppbnNlcnRlcihjb21tb24sIGNvbW1vbi5iZWdpbigpKSk7CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byYgZSA6IG9yZGVyKSB7CisgICAgICAgIGlmIChjb21tb24uZmluZChlKSAhPSBjb21tb24uZW5kKCkpIHJlc3VsdC5wdXNoX2JhY2soZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEludGVyc2VjdCB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycywgcmV0dXJuIGNvbW1vbiBlbGVtZW50cyBhY2NvcmRpbmcgdG8gJ2NvbXAnIG9yZGVyaW5nLgorLy8gJ2NvbXAnIGlzIGEgY29tcGFyYXRvciBmdW5jdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmU+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIENvbXBhcmUgY29tcCkKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUsIENvbXBhcmU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKSwgY29tcH07CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihyZXN1bHQpLCBjb21wKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmZpbmRCZXN0TWF0Y2hpbmdPdXRwdXRDb25maWcoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiYgcHJlZmVycmVkRm9ybWF0cywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBib29sIHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZSAqYmVzdE91dHB1dENvbmZpZykgY29uc3QKK3sKKyAgICBhdXRvIGZvcm1hdHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihnZXRTdXBwb3J0ZWRGb3JtYXRzKCksCisgICAgICAgICAgICBvdXRwdXRQcm9maWxlcy5nZXRTdXBwb3J0ZWRGb3JtYXRzKCksIHByZWZlcnJlZEZvcm1hdHMpOworICAgIC8vIFBpY2sgdGhlIGJlc3QgY29tcGF0aWJsZSBwcm9maWxlLgorICAgIGZvciAoY29uc3QgYXV0byYgZiA6IGZvcm1hdHMpIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBpbnB1dFByb2ZpbGUgPSBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBvdXRwdXRQcm9maWxlID0gb3V0cHV0UHJvZmlsZXMuZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoZik7CisgICAgICAgIGlmIChpbnB1dFByb2ZpbGUgPT0gbnVsbHB0ciB8fCBvdXRwdXRQcm9maWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2hhbm5lbHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCkuYXNPdXRNYXNrKCksCisgICAgICAgICAgICAgICAgb3V0cHV0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMpOworICAgICAgICBpZiAoY2hhbm5lbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBzYW1wbGVSYXRlcyA9IHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMgPworICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z3JlYXRlcjx0eXBlbmFtZSBTYW1wbGVSYXRlVmVjdG9yOjp2YWx1ZV90eXBlPigpKSA6CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0QW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBvdXRwdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPHR5cGVuYW1lIFNhbXBsZVJhdGVWZWN0b3I6OnZhbHVlX3R5cGU+KCkpOworICAgICAgICBpZiAoc2FtcGxlUmF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzKCkgZm91bmQgY2hhbm5lbCBtYXNrICUjeCBhbmQgc2FtcGxlIHJhdGUgJWQgZm9yIGZvcm1hdCAlI3guIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKmNoYW5uZWxzLmJlZ2luKCksICpzYW1wbGVSYXRlcy5iZWdpbigpLCBmKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+Zm9ybWF0ID0gZjsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+c2FtcGxlX3JhdGUgPSAqc2FtcGxlUmF0ZXMuYmVnaW4oKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gKmNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzVmFsaWQoKSAmJiBpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworRm9ybWF0VmVjdG9yIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Cit7CisgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRGb3JtYXRzLmFkZChpdGVtQXQoaSktPmdldEZvcm1hdCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3VwcG9ydGVkRm9ybWF0czsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQoreworICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCisgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOworICAgIGlmIChkeW5hbWljRm9ybWF0UHJvZmlsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKKyAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7CisgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpOworICAgICAgICBhZGQocHJvZmlsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDgpOworICAgIH0KK30KKworc3A8QXVkaW9Qcm9maWxlPiBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0U2FtcGxlUmF0ZXNGb3IoCisgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCisgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7CisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcHJvZmlsZSB3aXRoIHNhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZworICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKIGludCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCmluZGV4IDc5YWQxZjcuLjc5ZjA5MTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwCkBAIC0yNCwyOSArMjQsMzIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkCiB7CiAKLXZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit2b2lkIEF1ZGlvUm91dGU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBUeXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4Iik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKICAgICBpZiAobVNvdXJjZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZXM6IFxuIiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzIFxuIiwgc3BhY2VzICsgNCwgIiIsIG1Tb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7Cit9CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK2Jvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdAoreworICAgIGlmIChtU2luayA9PSAwIHx8IGRzdFBvcnQgPT0gMCB8fCBkc3RQb3J0ICE9IG1TaW5rKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBzaW5rcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZzb3VyY2VQb3J0IDogbVNvdXJjZXMpIHsKKyAgICAgICAgaWYgKHNvdXJjZVBvcnQgPT0gc3JjUG9ydCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBzb3VyY2VzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBzb3VyY2VQb3J0LT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkYTQ2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9TZXNzaW9uIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUF1ZGlvU2Vzc2lvbjo6QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAotICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAotICAgIG1PcGVuQ291bnQoMSksIG1BY3RpdmVDb3VudCgwKSwgbVBvbGljeU1peChwb2xpY3lNaXgpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCi0gICAgbUluZm9Qcm92aWRlcihOVUxMKQotewotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpCi17Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbU9wZW5Db3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGRlbHRhICVkLCBvcGVuIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbU9wZW5Db3VudCk7Ci0gICAgICAgIG1PcGVuQ291bnQgPSAodWludDMyX3QpKC1kZWx0YSk7Ci0gICAgfQotICAgIG1PcGVuQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1PcGVuQ291bnQpOwotICAgIHJldHVybiBtT3BlbkNvdW50OwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSkKLXsKLSAgICBjb25zdCB1aW50MzJfdCBvbGRBY3RpdmVDb3VudCA9IG1BY3RpdmVDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbUFjdGl2ZUNvdW50KTsKLSAgICAgICAgbUFjdGl2ZUNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtQWN0aXZlQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIGFjdGl2ZSBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgbUFjdGl2ZUNvdW50KTsKLSAgICBpbnQgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkU7Ci0KLSAgICBpZiAoKG9sZEFjdGl2ZUNvdW50ID09IDApICYmIChtQWN0aXZlQ291bnQgPiAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQ7Ci0gICAgfSBlbHNlIGlmICgob2xkQWN0aXZlQ291bnQgPiAwKSAmJiAobUFjdGl2ZUNvdW50ID09IDApKSB7Ci0gICAgICAgIGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOwotICAgIH0KLQotICAgIGlmIChldmVudCAhPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkUpIHsKLSAgICAgICAgLy8gRHluYW1pYyBwb2xpY3kgY2FsbGJhY2s6Ci0gICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCkgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2s6Ci0gICAgICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogcHJvdmlkZXIgPSBtSW5mb1Byb3ZpZGVyOwotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZyA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRDb25maWcoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1BY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKLSAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCi0gICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgotICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgotICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6c2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgbUluZm9Qcm92aWRlciA9IHByb3ZpZGVyOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1BY3RpdmVDb3VudCA+IDApIHsKLSAgICAgICAgLy8gcmVzZW5kIHRoZSBjYWxsYmFjayBhZnRlciByZXF1ZXJ5aW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgaW5mbyBwcm92aWRlcgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8udWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsZTogJWRcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuc2FtcGxlX3JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFzazogJTA4eFxuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaXMgc291bmR0cmlnZ2VyOiAlc1xuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtSXNTb3VuZFRyaWdnZXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvcGVuIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbU9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWN0aXZlIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCBhbHJlYWR5IGluIiwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgYXVkaW9TZXNzaW9uLT5zZXRJbmZvUHJvdmlkZXIocHJvdmlkZXIpOwotICAgIGFkZChzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgIEFMT0dWKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCAgY2xpZW50ICVkIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6cmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbW92ZVNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCIsIHNlc3Npb24pOwotICAgIHZhbHVlQXQoaW5kZXgpLT5zZXRJbmZvUHJvdmlkZXIoTlVMTCk7Ci0gICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRPcGVuQ291bnQoKSBjb25zdAotewotICAgIHVpbnQzMl90IG9wZW5Db3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBvcGVuQ291bnQgKz0gdmFsdWVBdChpKS0+b3BlbkNvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiBvcGVuQ291bnQ7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdAotewotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVTZXNzaW9ucy5hZGQodmFsdWVBdChpKS0+c2Vzc2lvbigpLCB2YWx1ZUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlU2Vzc2lvbnM7Ci19Ci0KLXNpemVfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdAotewotICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgIT0gMDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICBhdWRpb1Nlc3Npb24gPSB2YWx1ZUF0KGkpOwotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAoKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBzb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgotICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmlzU291bmRUcmlnZ2VyKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gcHJpb3JpdHkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gY3VyUHJpb3JpdHk7Ci0gICAgICAgICAgICBzb3VyY2UgPSBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFNlc3Npb25zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzNlNTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Tb3VyY2VEZXNjcmlwdG9yIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8SHdNb2R1bGUuaD4KLSNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxBdWRpb1NvdXJjZURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8SU9Qcm9maWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1TdHJlYW06ICVkXG4iLCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtRGV2aWNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1EZXZpY2UtPmR1bXAoZmQsIDIgLCAwKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gc291cmNlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBTb3VyY2UgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNjRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE1fQ2xpZW50RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjpzdHJpbmcgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCAiUG9ydElkOiAiIDw8IG1Qb3J0SWQgPDwgIiBTZXNzaW9uSWQ6ICIgPDwgbVNlc3Npb25JZCA8PCAiIFVpZDogIiA8PCBtVWlkOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNDbGllbnQgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQb3J0IElkOiAlZCBTZXNzaW9uIElkOiAlZCBVSUQ6ICVkXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Qb3J0SWQsIG1TZXNzaW9uSWQsIG1VaWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEZvcm1hdDogJTA4eCBTYW1wbGluZyByYXRlOiAlZCBDaGFubmVsczogJTA4eFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICBtQ29uZmlnLmZvcm1hdCwgbUNvbmZpZy5zYW1wbGVfcmF0ZSwgbUNvbmZpZy5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKK30KKwordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0cmVhbTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1TdHJlYW0sIG1GbGFncyk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgPDwgIiBTdHJlYW06ICIgPDwgbVN0cmVhbTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVNvdXJjZSwgbUZsYWdzKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyArIDIgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworfQorCitTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsCisgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywKKyAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBzcmNEZXZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCBBVURJT19PVVRQVVRfRkxBR19OT05FKSwKKyAgICAgICAgbVBhdGNoRGVzYyhwYXRjaERlc2MpLCBtU3JjRGV2aWNlKHNyY0RldmljZSkKK3sKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KQoreworICAgIG1Td091dHB1dCA9IHN3T3V0cHV0OworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpCit7CisgICAgbUh3T3V0cHV0ID0gaHdPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBEZXZpY2U6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBtU3JjRGV2aWNlLT5kdW1wKGRzdCwgMiwgMCk7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gc291cmNlczpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgIH0KK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTA1ZjUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkNvbmZpZ1BhcnNpbmdVdGlscyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBhdWRpb1BvcnQudXNlSW5wdXRDaGFubmVsTWFzaygpKTsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNb2RlKEdhaW5Nb2RlQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrOwotICAgICAgICAgICAgaWYgKGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBtYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhtYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBtYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhtYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5WYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9ERUZBVUxUX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9TVEVQX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRTdGVwVmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWluUmFtcEluTXMoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhSYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWRHYWluKCkgYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwKLSAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAotICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKLQotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1ZGlvUG9ydC5tR2FpbnMuYWRkKGdhaW4pOwotfQotCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW5zKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBsb2FkQXVkaW9Qb3J0R2Fpbihub2RlLCBhdWRpb1BvcnQsIGluZGV4KyspOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZERldmljZURlc2NyaXB0b3JHYWlucyhjbm9kZSAqcm9vdCwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZURlc2MpCi17Ci0gICAgbG9hZEF1ZGlvUG9ydEdhaW5zKHJvb3QsICpkZXZpY2VEZXNjKTsKLSAgICBpZiAoZGV2aWNlRGVzYy0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgZGV2aWNlRGVzYy0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZkZXZpY2VEZXNjLT5tR2Fpbik7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVEZXZpY2UoY25vZGUgKnJvb3QsIERldmljZVZlY3RvciAmZGV2aWNlcykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEFQTV9ERVZJQ0VfVFlQRSkgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgdHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKLSAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgewotICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIFN0cmluZzgocm9vdC0+bmFtZSkpOwotCi0gICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9BRERSRVNTKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZyhub2RlLT52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGVWZWN0b3IoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgbG9hZERldmljZURlc2NyaXB0b3JHYWlucyhub2RlLCBkZXZpY2VEZXNjKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZERldmljZSgpIGFkZGluZyBkZXZpY2UgdGFnIChsaXRlcmFsIHR5cGUpICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwKLSAgICAgICAgICBkZXZpY2VEZXNjLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLQotICAgIGRldmljZXMuYWRkKGRldmljZURlc2MpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCByb2xlKTsKLQotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzOwotICAgIFNhbXBsZVJhdGVWZWN0b3Igc2FtcGxlUmF0ZXM7Ci0gICAgQ2hhbm5lbHNWZWN0b3IgY2hhbm5lbHM7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgc3RyY21wKG5vZGUtPnZhbHVlLCBEWU5BTUlDX1ZBTFVFX1RBRykgIT0gMCkgewotICAgICAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxTYW1wbGVSYXRlVHJhaXRzPihub2RlLT52YWx1ZSwgc2FtcGxlUmF0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBkZXZpY2VzLCBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldFN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEF1ZGlvUG9ydEdhaW5zKG5vZGUsICpwcm9maWxlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNSYXRlKHNhbXBsZVJhdGVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGF1ZGlvUHJvZmlsZXMuYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSByZWFzb24sIGZvciBlYWNoIGZvcm1hdCwgY3JlYXRlcyBhIHByb2ZpbGUgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgLy8gY29sbGVjdGlvbiBvZiByYXRlIGFuZCBjaGFubmVscy4KLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KGZvcm1hdHNbaV0gPT0gZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljQ2hhbm5lbHMoY2hhbm5lbHMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXMuYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvZmlsZS0+c2V0QXVkaW9Qcm9maWxlcyhhdWRpb1Byb2ZpbGVzKTsKLSAgICBBTE9HV19JRighcHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpLCAibG9hZCVzKCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIsCi0gICAgICAgICAgICAgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/ICJJbnB1dCIgOiAiT3V0cHV0Iik7Ci0gICAgaWYgKHByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICBBTE9HVigibG9hZCVzKCkgYWRkaW5nIFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKLSAgICAgICAgICAgICAgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/ICJJbnB1dCIgOiAiT3V0cHV0IiwKLSAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSwgcHJvZmlsZS0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgIHJldHVybiBtb2R1bGUtPmFkZFByb2ZpbGUocHJvZmlsZSk7Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgREVWSUNFU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGRldmljZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlRGV2aWNlKG5vZGUsIGRldmljZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGUtPnNldERlY2xhcmVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlUHJvZmlsZShub2RlLCBtb2R1bGUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlUHJvZmlsZShub2RlLCBtb2R1bGUsIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbG9hZE1vZHVsZUdsb2JhbENvbmZpZyhyb290LCBtb2R1bGUsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBBVURJT19IV19NT0RVTEVfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZXMoKSBsb2FkaW5nIG1vZHVsZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKG5vZGUtPm5hbWUpOwotICAgICAgICBpZiAobG9hZEh3TW9kdWxlKG5vZGUsIG1vZHVsZSwgY29uZmlnKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaHdNb2R1bGVzLmFkZChtb2R1bGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlc0Zyb21UYWcoY29uc3QgY2hhciAqdGFnLCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGVjbGFyZWREZXZpY2VzKQotewotICAgIGNoYXIgKnRhZ0xpdGVyYWwgPSBzdHJuZHVwKHRhZywgc3RybGVuKHRhZykpOwotICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayh0YWdMaXRlcmFsLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlOwotICAgICAgICAgICAgaWYgKGRldmljZUZyb21TdHJpbmcoZGV2VGFnLCB0eXBlKSkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQml0ID0gdHlwZSAmIEFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgICAgICAgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHlwZSkgewotICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHNpbmdsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5CaXQgfCAoMSA8PCAoMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgJj0gfnNpbmdsZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldiA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHNpbmdsZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZURlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7Ci0gICAgfQotICAgIGZyZWUodGFnTGl0ZXJhbCk7Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZE1vZHVsZUdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7Ci0gICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKLSAgICAgICAgICAgIGxvYWREZXZpY2VzRnJvbVRhZyhub2RlLT52YWx1ZSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZU91dHB1dERldmljZXMoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgICAgIGRldmljZUZyb21TdHJpbmcobm9kZS0+dmFsdWUsIGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldERlZmF1bHRPdXRwdXREZXZpY2UoZGVmYXVsdE91dHB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtRGVmYXVsdE91dHB1dERldmljZSAlMDh4IiwgZGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIGRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgICAgIGNvbmZpZy5hZGRBdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7Ci0gICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOwotICAgICAgICAgICAgbW9kdWxlLT5zZXRIYWxWZXJzaW9uKG1ham9yLCBtaW5vcik7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCBtYWpvciwgbWlub3IpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+JiBwcmltYXJ5TW9kdWxlKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKFNQRUFLRVJfRFJDX0VOQUJMRURfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBib29sIHNwZWFrZXJEcmNFbmFibGVkOwotICAgICAgICAgICAgaWYgKHV0aWxpdGllczo6Y29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihub2RlLT52YWx1ZSwgc3BlYWtlckRyY0VuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIHNwZWFrZXJEcmNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U3BlYWtlckRyY0VuYWJsZWQoc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIHByaW1hcnlNb2R1bGUsIGNvbmZpZyk7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoY29uc3QgY2hhciAqcGF0aCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgSHdNb2R1bGVDb2xsZWN0aW9uIGh3TW9kdWxlczsKLSAgICBsb2FkSHdNb2R1bGVzKHJvb3QsIGh3TW9kdWxlcywgY29uZmlnKTsKLQotICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uLCBhdHRhY2hlZCB0byBwcmltYXJ5LgotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgY29uZmlnLCBod01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKLQotICAgIGNvbmZpZy5zZXRId01vZHVsZXMoaHdNb2R1bGVzKTsKLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IDE5YzIwNjIuLjA0Y2JjZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC0yNiwxNCArMjYsMjUgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgOgorICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIEZvcm1hdFZlY3Rvcnt9LCB0YWdOYW1lKQoreworfQorCitEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSA6CiAgICAgQXVkaW9Qb3J0KFN0cmluZzgoIiIpLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSksCi0gICAgbUFkZHJlc3MoIiIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbURldmljZVR5cGUodHlwZSksIG1JZCgwKQorICAgIG1UYWdOYW1lKHRhZ05hbWUpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKQogewogICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHx8IHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYICkgewogICAgICAgICBtQWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKICAgICB9CisgICAgLyogRklYTUU6IHJlYWQgZnJvbSBBUE0gY29uZmlnIGZpbGUgKi8KKyAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKKyAgICAgICAgbUVuY29kZWRGb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOworICAgIH0KIH0KIAogYXVkaW9fcG9ydF9oYW5kbGVfdCBEZXZpY2VEZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CkBAIC0xMjEsNzAgKzEzMiw3OCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKLSAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIHJlbW92ZShkZXZpY2UpOworICAgIH0KK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwogfQogCithdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VUeXBlcyB8PSBkZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKIHNwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIiB8fCBpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmFkZHJlc3MoKSA9PSBhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgXCIlc1wiIGZvdW5kICVwIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCkpOwogICAgIHJldHVybiBkZXZpY2U7CiB9CiAKIHNwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0CiB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgewotICAgICAgICBpZiAoZGV2aWNlLT5nZXRJZCgpID09IGlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIGlmIChpZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQogCi1EZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKICAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKLSAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+bURldmljZVR5cGUpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+dHlwZSgpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1clR5cGUgPSBpdGVtQXQoaSktPnR5cGUoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgICAgICBpZiAoKGlzT3V0cHV0ID09IGN1cklzT3V0cHV0KSAmJiAoKHR5cGUgJiBjdXJUeXBlKSAhPSAwKSkgewogICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKICAgICAgICAgICAgIHR5cGUgJj0gfmN1clR5cGU7Ci0gICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoKSBmb3IgdHlwZSAleCBmb3VuZCAlcCIsCi0gICAgICAgICAgICAgICAgICBpdGVtQXQoaSktPnR5cGUoKSwgaXRlbUF0KGkpLmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlQWRkcigKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgewotICAgICAgICBpZiAoZGV2aWNlLT50eXBlKCkgPT0gdHlwZSAmJiBkZXZpY2UtPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjolcygpIGZvciB0eXBlICUwOHggZm91bmQgJXAiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGRldmljZXM7CkBAIC0yMDAsMjAgKzIxOSwxNSBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0dXNfdCBEZXZpY2VWZWN0b3I6OmR1bXAoaW50IGZkLCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSAlcyBkZXZpY2VzOlxuIiwgc3BhY2VzLCAiIiwgdGFnLnN0cmluZygpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIHNwYWNlcyArIDIsIGksIHZlcmJvc2UpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC0yNDYsMTkgKzI2MCwxOCBAQAogICAgIC8vIHdpdGhvdXQgdGhlIHRlc3Q/CiAgICAgLy8gVGhpcyBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQgdG8gTk9UIGJlIHRydWUgKGF0IHN0YXJ0IHVwKQogICAgIC8vIEFMT0dfQVNTRVJUKG1Nb2R1bGUgIT0gTlVMTCk7Ci0gICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9Ci0gICAgICAgICAgICBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXRIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCkpOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogewotICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CisgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJTA4eCIsIG1JZCwgbURldmljZVR5cGUpOwogICAgIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQocG9ydCk7CiAgICAgcG9ydC0+aWQgPSBtSWQ7CiAgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwogICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+Z2V0SGFuZGxlKCk7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCkpOwogfQogCkBAIC0yNzAsNDIgKzI4Myw3MyBAQAogICAgIHBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKIH0KIAotc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4ICsgMSk7CiAgICAgaWYgKG1JZCAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwogICAgIH0KICAgICBpZiAoIW1UYWdOYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHRhZyBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVRhZ05hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHRhZyBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVRhZ05hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwogICAgIGlmIChkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9CiAgICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIHNwYWNlcywgdmVyYm9zZSk7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK3N0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3I6OnRvU3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzc3RyZWFtOworICAgIHNzdHJlYW0gPDwgInR5cGU6MHgiIDw8IHN0ZDo6aGV4IDw8IHR5cGUoKSA8PCAiLEA6IiA8PCBtQWRkcmVzczsKKyAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgaWYgKGlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4geyJBVURJT19ERVZJQ0VfTk9ORSJ9OworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSB7InsifTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKKyAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0ICsgIn0iOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmaWx0ZXJlZERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpbHRlcmVkRGV2aWNlczsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuICFmaWx0ZXIoZGV2aWNlcykuaXNFbXB0eSgpOworfQorCitib29sIERldmljZVZlY3Rvcjo6Y29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICByZXR1cm4gZmlsdGVyKGRldmljZXMpLnNpemUoKSA9PSBkZXZpY2VzLnNpemUoKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2coKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKICAgICBkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlKTsKLSAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglWDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLCBkZXZpY2UuY19zdHIoKSwKKyAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglMDhYOiVzLCBhZGRyOiVzIiwgbUlkLCAgbURldmljZVR5cGUsIGRldmljZS5jX3N0cigpLAogICAgICAgICAgIG1BZGRyZXNzLnN0cmluZygpKTsKIAogICAgIEF1ZGlvUG9ydDo6bG9nKCIgICIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAppbmRleCA3YjIzNDFlLi40MGM0OWU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApAQCAtMjIsMjUgKzIyLDEzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0kvTzogJWRcbiIsIHNwYWNlcywgIiIsIG1Jbyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1N0cmF0ZWd5OiAlZFxuIiwgc3BhY2VzLCAiIiwgbVN0cmF0ZWd5KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzU2Vzc2lvbjogJWRcbiIsIHNwYWNlcywgIiIsIG1TZXNzaW9uKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzTmFtZTogJXNcbiIsIHNwYWNlcywgIiIsICBtRGVzYy5uYW1lKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwogfQogCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6RWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKSA6CkBAIC01Nyw2ICs0NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKIHsKKyAgICBpZiAoZ2V0RWZmZWN0KGlkKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBlZmZlY3QgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7CkBAIC03Miw2ICs2NSw3IEBACiAKICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKICAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBlZmZlY3REZXNjLT5tSWQgPSBpZDsKICAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKICAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7CiAgICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOwpAQCAtODIsMTggKzc2LDIzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCitzcDxFZmZlY3REZXNjcmlwdG9yPiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0KGludCBpZCkgY29uc3QKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IGdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewogICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCiAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwpAQCAtMTE5LDYgKzExOCwxNCBAQAogICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKIH0KIAorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWx1ZUF0KGluZGV4KS0+bUVuYWJsZWQ7Cit9CiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQpAQCAtMTUwLDcgKzE1Nyw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1ib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpCitib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gdmFsdWVBdChpKTsKQEAgLTE3NCwyNCArMTgxLDIyIEBACiAgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKIH0KIAotc3RhdHVzX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKQordm9pZCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0IsIE1heCBtZW1vcnkgdXNlZDogJWQgS0JcbiIsCi0gICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5LCBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICJcbiUqc1RvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCAiCisgICAgICAgICAgICAiVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCLCBNYXggbWVtb3J5IHVzZWQ6ICVkIEtCXG4iLAorICAgICAgICAgICAgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIChmbG9hdCkgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLyAxMCwKKyAgICAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnksCisgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRWZmZWN0czpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRWZmZWN0ICVkOlxuIiwgc3BhY2VzLCAiIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDdhMTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6R2FpbnMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLS8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jZGVmaW5lIEFMT0dWViBBTE9HVgotI2Vsc2UKLSNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpbmNsdWRlICJHYWlucy5oIgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5naW5lZGVmYXVsdAotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNDkuNWZ9LCB7MzMsIC0zMy41Zn0sIHs2NiwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0yMS4wZn0sIHsxMDAsIC0xMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI5LjdmfSwgezMzLCAtMjAuMWZ9LCB7NjYsIC0xMC4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKLS8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCi0vLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KLS8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNC4wZn0sIHszMywgLTI0LjBmfSwgezY2LCAtMTUuMGZ9LCB7MTAwLCAtNi4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtMjQuMGZ9LCB7MzMsIC0xNi4wZn0sIHs2NiwgLTguMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHszMywgLTY4LjBmfSwgezY2LCAtMzQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHsxLCAtOTYuMGZ9LCB7MiwgLTk2LjBmfSwgezEwMCwgLTk2LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIDAuMGZ9LCB7MSwgMC4wZn0sIHsyLCAwLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTEyOC4wZn0sIHsyMCwgLTgwLjBmfSwgezYwLCAtNDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7Ci0gICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7ICAvLyBBVURJT19TVFJFQU1fRFRNRgotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCi0gICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9QQVRDSAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotfTsKLQotLy9zdGF0aWMKLWZsb2F0IEdhaW5zOjp2b2xJbmRleFRvRGIoY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4LCBpbnQgaW5kZXhJblVpKQotewotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLSBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4OwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBpbmRleE1pbikpIC8gKGluZGV4TWF4IC0gaW5kZXhNaW4pOwotCi0gICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcwotICAgIGludCBzZWdtZW50ID0gMDsKLSAgICBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleCkgeyAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUxXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUyXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDE7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMjsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgfQotCi0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbikgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGRlY2liZWxzLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbik7Ci0KLSAgICByZXR1cm4gZGVjaWJlbHM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBhZWY3ZGJlLi44MGFmODhkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIGRldkRlc2MtPnNldEFkZHJlc3MoYWRkcmVzcyk7CiAgICAgcHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRldkRlc2MpOwogCiAgICAgcmV0dXJuIGFkZE91dHB1dFByb2ZpbGUocHJvZmlsZSk7CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlKSk7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgZGV2RGVzYy0+c2V0QWRkcmVzcyhhZGRyZXNzKTsKICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2RGVzYyk7CiAKICAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHglMDh4IiwKQEAgLTIxOCwzNyArMjE4LDM2IEBACiAgICAgbUhhbmRsZSA9IGhhbmRsZTsKIH0KIAotdm9pZCBId01vZHVsZTo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Citib29sIEh3TW9kdWxlOjpzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnJvdXRlIDogbVJvdXRlcykgeworICAgICAgICBpZiAocm91dGUtPnN1cHBvcnRzUGF0Y2goc3JjUG9ydCwgZHN0UG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwordm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7CiAgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gb3V0cHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBkc3QtPmFwcGVuZCgiICAtIGlucHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkRlY2xhcmVkIiksICAyLCB0cnVlKTsKLSAgICBtUm91dGVzLmR1bXAoZmQsIDIpOworICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkRlY2xhcmVkIiksIDIsIHRydWUpOworICAgIG1Sb3V0ZXMuZHVtcChkc3QsIDIpOwogfQogCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKQEAgLTI3OCw5ICsyNzcsMTAgQEAKIHNwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkZHJlc3MpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCAhbWF0Y2hBZGRyZXNzKSA/CisgICAgICAgICAgICBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAogICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKQEAgLTI4OCwzNyArMjg4LDI1IEBACiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogKnRoaXMpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIGFkZHJlc3MpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtYXRjaEFkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgIGlmIChkZXZpY2VEZXNjKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlRGVzYzsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwogICAgIGRldkRlc2MtPnNldE5hbWUoU3RyaW5nOChkZXZpY2VfbmFtZSkpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBkZXZEZXNjLT5zZXRBZGRyZXNzKGFkZHJlc3MpOwogICAgIHJldHVybiBkZXZEZXNjOwogfQogCi1zdGF0dXNfdCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAppbmRleCBmYmMyMzg0Li4zNzg4MjQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpJT1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCkBAIC02NiwxOSArNjcsMjMgQEAKICAgICBhdWRpb19mb3JtYXRfdCBteVVwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbXlVcGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKICAgICB1aW50MzJfdCBteVVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHsKKyAgICAgICAgLmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQUxMICYgfkFVRElPX1BPUlRfQ09ORklHX0dBSU4sCisgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrLAorICAgICAgICAuZm9ybWF0ID0gZm9ybWF0LAorICAgIH07CiAgICAgaWYgKGlzUmVjb3JkVGhyZWFkKQogICAgIHsKLSAgICAgICAgaWYgKGNoZWNrQ29tcGF0aWJsZUF1ZGlvUHJvZmlsZSgKKyAgICAgICAgaWYgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoJmNvbmZpZykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tDb21wYXRpYmxlQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG15VXBkYXRlZFNhbXBsaW5nUmF0ZSwgbXlVcGRhdGVkQ2hhbm5lbE1hc2ssIG15VXBkYXRlZEZvcm1hdCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWcgPSB7Ci0gICAgICAgICAgICAuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEwgJiB+QVVESU9fUE9SVF9DT05GSUdfR0FJTiwKLSAgICAgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgIC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIC5mb3JtYXQgPSBmb3JtYXQsCi0gICAgICAgIH07CiAgICAgICAgIGlmIChjaGVja0V4YWN0QXVkaW9Qcm9maWxlKCZjb25maWcpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTEwOCwxNiArMTEzLDExIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3ZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCA0KTsKIAotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CiAgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsOwogICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKICAgICAgICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKQEAgLTEyNSwyMSArMTI1LDE0IEBACiAgICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwogICAgIH0KICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKLQotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggYTI1MzExMy4uMTE1NDY1NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTE3LDI0MSArMTcsNDQxIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6U2VyaWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGlzdHJlYW0+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOworI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBDb25zaWRlciBmaW5kaW5nIGFuIGFsdGVybmF0aXZlIGZvciB1c2luZyBISURMIGNvZGUuCit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIHNwPEU+IEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24tPmFkZChlbGVtZW50KSA+PSAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCBTdGRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICBhdXRvIHBhaXIgPSBjb2xsZWN0aW9uLT5pbnNlcnQoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBwYWlyLnNlY29uZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3N0cnVjdCBBdWRpb0dhaW5UcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9HYWluLCBBdWRpb0dhaW5Db2xsZWN0aW9uPgogewotICAgIHhtbENoYXIgKnhtbFZhbHVlID0geG1sR2V0UHJvcChjdXIsIChjb25zdCB4bWxDaGFyKilhdHRyaWJ1dGUpOwotICAgIGlmICh4bWxWYWx1ZSA9PSBOVUxMKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2FpbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1vZGUgPSAibW9kZSI7CisgICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2sgPSAiY2hhbm5lbF9tYXNrIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5WYWx1ZU1CID0gIm1pblZhbHVlTUIiOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhWYWx1ZU1CID0gIm1heFZhbHVlTUIiOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbHVlTUIgPSAiZGVmYXVsdFZhbHVlTUIiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0ZXBWYWx1ZU1CID0gInN0ZXBWYWx1ZU1CIjsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluUmFtcE1zID0gIm1pblJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhSYW1wTXMgPSAibWF4UmFtcE1zIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gY2hpbGRyZW4KK307CisKKy8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0CitzdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUHJvZmlsZSwgQXVkaW9Qcm9maWxlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInByb2ZpbGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzYW1wbGluZ1JhdGVzID0gInNhbXBsaW5nUmF0ZXMiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICJmb3JtYXQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrcyA9ICJjaGFubmVsTWFza3MiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNaXhQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPElPUHJvZmlsZSwgSU9Qcm9maWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtaXhQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmbGFncyA9ICJmbGFncyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4T3BlbkNvdW50ID0gIm1heE9wZW5Db3VudCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cworfTsKKworc3RydWN0IERldmljZVBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8RGV2aWNlRGVzY3JpcHRvciwgRGV2aWNlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImRldmljZVBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSAidGFnTmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICAvKiogb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYWRkcmVzcyA9ICJhZGRyZXNzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMgKG9wdGlvbmFsKQorfTsKKworc3RydWN0IFJvdXRlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUm91dGUsIEF1ZGlvUm91dGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicm91dGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZU1peCA9ICJtaXgiOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzaW5rID0gInNpbmsiOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KKyAgICAgICAgLyoqIHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzb3VyY2VzID0gInNvdXJjZXMiOworICAgIH07CisKKyAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1vZHVsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxId01vZHVsZSwgSHdNb2R1bGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1vZHVsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJoYWxWZXJzaW9uIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cywgYW5kIHJvdXRlVHJhaXRzCisgICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKK307CisKK3N0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNwZWFrZXJEcmNFbmFibGVkID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7Cit9OworCitzdHJ1Y3QgVm9sdW1lVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPFZvbHVtZUN1cnZlLCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZvbHVtZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlVGFnID0gInJlZmVyZW5jZSI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZXZpY2VDYXRlZ29yeSA9ICJkZXZpY2VDYXRlZ29yeSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlID0gInJlZiI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlTmFtZSA9ICJuYW1lIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gQ2hpbGRyZW4KK307CisKK3N0cnVjdCBTdXJyb3VuZFNvdW5kVHJhaXRzCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAic3Vycm91bmRTb3VuZCI7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisgICAgLy8gQ2hpbGRyZW46IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMKK307CisKK3N0cnVjdCBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzIDogcHVibGljIFN0ZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cz4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJmb3JtYXQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJmb3JtYXRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3ViZm9ybWF0cyA9ICJzdWJmb3JtYXRzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitjbGFzcyBQb2xpY3lTZXJpYWxpemVyCit7CitwdWJsaWM6CisgICAgUG9saWN5U2VyaWFsaXplcigpIDogbVZlcnNpb257c3RkOjp0b19zdHJpbmcoZ01ham9yKSArICIuIiArIHN0ZDo6dG9fc3RyaW5nKGdNaW5vcil9CisgICAgeworICAgICAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLCByb290TmFtZSk7CisgICAgfQorICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWFqb3IgPSAxOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWlub3IgPSAwOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCisKKyAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKKworICAgIC8vIENoaWxkcmVuOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMsIFN1cnJvdW5kU291bmRUcmFpdHMgKG9wdGlvbmFsKQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgdm9pZCAoKnhtbERlbGV0ZXIpKFQqIHQpOwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBhdXRvIHhtbERlbGV0ZXI8eG1sRG9jPiA9IHhtbEZyZWVEb2M7CisvLyBodHRwOi8vYi8xMTEwNjcyNzcgLSBBZGQgYmFjayBjb25zdGV4cHIgd2hlbiB3ZSBzd2l0Y2ggdG8gQysrMTcuCit0ZW1wbGF0ZSA8PgorYXV0byB4bWxEZWxldGVyPHhtbENoYXI+ID0gW10oeG1sQ2hhciAqcykgeyB4bWxGcmVlKHMpOyB9OworCisvKiogQHJldHVybiBhIHVuaXF1ZV9wdHIgd2l0aCB0aGUgY29ycmVjdCBkZWxldGVyIGZvciB0aGUgbGlieG1sMiBvYmplY3QuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBhdXRvIG1ha2VfeG1sVW5pcXVlKFQgKnQpIHsKKyAgICAvLyBXcmFwIGRlbGV0ZXIgaW4gbGFtYmRhIHRvIGVuYWJsZSBlbXB0eSBiYXNlIG9wdGltaXphdGlvbgorICAgIGF1dG8gZGVsZXRlciA9IFtdKFQgKnQpIHsgeG1sRGVsZXRlcjxUPih0KTsgfTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQsIGRlY2x0eXBlKGRlbGV0ZXIpPnt0LCBkZWxldGVyfTsKK30KKworc3RkOjpzdHJpbmcgZ2V0WG1sQXR0cmlidXRlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3QgY2hhciAqYXR0cmlidXRlKQoreworICAgIGF1dG8geG1sVmFsdWUgPSBtYWtlX3htbFVuaXF1ZSh4bWxHZXRQcm9wKGN1ciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oYXR0cmlidXRlKSkpOworICAgIGlmICh4bWxWYWx1ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9Ci0gICAgc3RyaW5nIHZhbHVlKChjb25zdCBjaGFyKil4bWxWYWx1ZSk7Ci0gICAgeG1sRnJlZSh4bWxWYWx1ZSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oeG1sVmFsdWUuZ2V0KCkpKTsKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKLXVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwotCi1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTZXJpYWxpemVyOjpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U2VyaWFsaXplcjo6dmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKLWNvbnN0IHVpbnQzMl90IFBvbGljeVNlcmlhbGl6ZXI6OmdNYWpvciA9IDE7Ci1jb25zdCB1aW50MzJfdCBQb2xpY3lTZXJpYWxpemVyOjpnTWlub3IgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VFbGVtZW50TmFtZSA9ICJyZWZlcmVuY2UiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lID0gIm5hbWUiOwotCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+Ci1zdGF0aWMgdm9pZCBnZXRSZWZlcmVuY2UoY29uc3QgX3htbE5vZGUgKnJvb3QsIGNvbnN0IF94bWxOb2RlIComcmVmTm9kZSwgY29uc3Qgc3RyaW5nICZyZWZOYW1lKQorY29uc3QgeG1sTm9kZSogZ2V0UmVmZXJlbmNlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlZk5hbWUpCiB7Ci0gICAgY29uc3QgX3htbE5vZGUgKmNvbCA9IHJvb3Q7Ci0gICAgd2hpbGUgKGNvbCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNvbC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKLSAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciA9IGNvbC0+Y2hpbGRyZW47Ci0gICAgICAgICAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWdSZWZlcmVuY2VFbGVtZW50TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUpOworICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1ci0+Y2hpbGRyZW47IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnJlZmVyZW5jZVRhZykpKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBUcmFpdDo6QXR0cmlidXRlczo6cmVmZXJlbmNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZOYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5vZGUgPSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbCA9IGNvbC0+bmV4dDsKICAgICB9Ci0gICAgcmV0dXJuOworICAgIHJldHVybiBOVUxMOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+Ci1zdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAqY29sbGVjdGlvbiwKKyAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKIHsKLSAgICBjb25zdCB4bWxOb2RlICpyb290ID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoeG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpICYmCi0gICAgICAgICAgICAgICAgeG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKLSAgICAgICAgICAgIHJvb3QgPSByb290LT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IE5VTEw7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgfSBlbHNlIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGN1cjsKICAgICAgICAgfQotICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJvb3Q7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgewotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgewotICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJFbGVtZW50IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmRlc2VyaWFsaXplKGRvYywgY2hpbGQsIGVsZW1lbnQsIHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5hZGQoZWxlbWVudCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBlbGVtZW50IHRvICVzIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0Ojpjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVsZW1lbnQgPSBUcmFpdDo6ZGVzZXJpYWxpemUoY2hpbGQsIHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKGVsZW1lbnQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICAgICAgfQotICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgQXVkaW9HYWluVHJhaXRzOjp0YWcgPSAiZ2FpbiI7Ci1jb25zdCBjaGFyICpjb25zdCBBdWRpb0dhaW5UcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAiZ2FpbnMiOwotCi1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bW9kZVtdID0gIm1vZGUiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrW10gPSAiY2hhbm5lbF9tYXNrIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CW10gPSAibWluVmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWF4VmFsdWVNQltdID0gIm1heFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CW10gPSAiZGVmYXVsdFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CW10gPSAic3RlcFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1pblJhbXBNc1tdID0gIm1pblJhbXBNcyI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWF4UmFtcE1zW10gPSAibWF4UmFtcE1zIjsKLQotc3RhdHVzX3QgQXVkaW9HYWluVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewogICAgIHN0YXRpYyB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgZ2FpbiA9IG5ldyBFbGVtZW50KGluZGV4KyssIHRydWUpOworICAgIEVsZW1lbnQgZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgrKywgdHJ1ZSk7CiAKLSAgICBzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptb2RlKTsKKyAgICBzdGQ6OnN0cmluZyBtb2RlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bW9kZSk7CiAgICAgaWYgKCFtb2RlLmVtcHR5KCkpIHsKICAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobW9kZSkpOwogICAgIH0KIAotICAgIHN0cmluZyBjaGFubmVsc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOworICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrKTsKICAgICBpZiAoIWNoYW5uZWxzTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjaGFubmVsc0xpdGVyYWwpKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CKTsKICAgICBpbnQzMl90IG1pblZhbHVlTUI7CiAgICAgaWYgKCFtaW5WYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5WYWx1ZU1CTGl0ZXJhbCwgbWluVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluVmFsdWVJbk1iKG1pblZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1heFZhbHVlTUIpOwogICAgIGludDMyX3QgbWF4VmFsdWVNQjsKICAgICBpZiAoIW1heFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFZhbHVlTUJMaXRlcmFsLCBtYXhWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIobWF4VmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOwogICAgIGludDMyX3QgZGVmYXVsdFZhbHVlTUI7CiAgICAgaWYgKCFkZWZhdWx0VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oZGVmYXVsdFZhbHVlTUJMaXRlcmFsLCBkZWZhdWx0VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0RGVmYXVsdFZhbHVlSW5NYihkZWZhdWx0VmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIHN0ZXBWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgc3RlcFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3RlcFZhbHVlTUIpOwogICAgIHVpbnQzMl90IHN0ZXBWYWx1ZU1COwogICAgIGlmICghc3RlcFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKHN0ZXBWYWx1ZU1CTGl0ZXJhbCwgc3RlcFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoc3RlcFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBtaW5SYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblJhbXBNcyk7CisgICAgc3RkOjpzdHJpbmcgbWluUmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1pblJhbXBNcyk7CiAgICAgdWludDMyX3QgbWluUmFtcE1zOwogICAgIGlmICghbWluUmFtcE1zTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5SYW1wTXNMaXRlcmFsLCBtaW5SYW1wTXMpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblJhbXBJbk1zKG1pblJhbXBNcyk7CiAgICAgfQogCi0gICAgc3RyaW5nIG1heFJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4UmFtcE1zKTsKKyAgICBzdGQ6OnN0cmluZyBtYXhSYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWF4UmFtcE1zKTsKICAgICB1aW50MzJfdCBtYXhSYW1wTXM7CiAgICAgaWYgKCFtYXhSYW1wTXNMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFJhbXBNc0xpdGVyYWwsIG1heFJhbXBNcykpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4UmFtcEluTXMobWF4UmFtcE1zKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgQUxPR1YoIiVzOiBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAogICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKIAotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChnYWluLT5nZXRNb2RlKCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZ2FpbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvUHJvZmlsZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7Ci1jb25zdCBjaGFyICpjb25zdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OnRhZyA9ICJwcm9maWxlIjsKLQotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzW10gPSAic2FtcGxpbmdSYXRlcyI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6Zm9ybWF0W10gPSAiZm9ybWF0IjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3NbXSA9ICJjaGFubmVsTWFza3MiOwotCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPEF1ZGlvUHJvZmlsZVRyYWl0czo6RWxlbWVudD4gQXVkaW9Qcm9maWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIHNhbXBsaW5nUmF0ZXMgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2FtcGxpbmdSYXRlcyk7Ci0gICAgc3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpmb3JtYXQpOwotICAgIHN0cmluZyBjaGFubmVscyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOworICAgIHN0ZDo6c3RyaW5nIHNhbXBsaW5nUmF0ZXMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpmb3JtYXQpOworICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzKTsKIAotICAgIHByb2ZpbGUgPSBuZXcgRWxlbWVudChmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCAiLCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZyhzYW1wbGluZ1JhdGVzLCAiLCIpKTsKKyAgICBFbGVtZW50IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCisgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCAiLCIpLAorICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgIiwiKSk7CiAKICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGdEeW5hbWljRm9ybWF0KTsKICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMocHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKS5pc0VtcHR5KCkpOwogICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkuaXNFbXB0eSgpKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBNaXhQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1peFBvcnRzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OnRhZyA9ICJtaXhQb3J0IjsKLQotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6ZmxhZ3NbXSA9ICJmbGFncyI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudFtdID0gIm1heE9wZW5Db3VudCI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50W10gPSAibWF4QWN0aXZlQ291bnQiOwotCi1zdGF0dXNfdCBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwgUHRyRWxlbWVudCAmbWl4UG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48TWl4UG9ydFRyYWl0czo6RWxlbWVudD4gTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY2hpbGQsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBSb2xlPSVzIiwgX19GVU5DVElPTl9fLCByb2xlLmNfc3RyKCkpOwotICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gcm9sZSA9PSAic291cmNlIiA/IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX2Z1bmNfXywgcm9sZS5jX3N0cigpKTsKKyAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KKyAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAotICAgIG1peFBvcnQgPSBuZXcgRWxlbWVudChTdHJpbmc4KG5hbWUuY19zdHIoKSksIHBvcnRSb2xlKTsKKyAgICBFbGVtZW50IG1peFBvcnQgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgobmFtZS5jX3N0cigpKSwgcG9ydFJvbGUpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGRvYywgY2hpbGQsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjaGlsZCwgJnByb2ZpbGVzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3AgPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKLSAgICAgICAgcHJvZmlsZXMuYWRkKGR5bmFtaWNQcm9maWxlKTsKKyAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgfQogICAgIG1peFBvcnQtPnNldEF1ZGlvUHJvZmlsZXMocHJvZmlsZXMpOwogCi0gICAgc3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpmbGFncyk7CisgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmZsYWdzKTsKICAgICBpZiAoIWZsYWdzLmVtcHR5KCkpIHsKICAgICAgICAgLy8gU291cmNlIHJvbGUKICAgICAgICAgaWYgKHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKQEAgLTI2MSw1MiArNDYxLDQ2IEBACiAgICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc3RyaW5nIG1heE9wZW5Db3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4T3BlbkNvdW50KTsKKyAgICBzdGQ6OnN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CiAgICAgaWYgKCFtYXhPcGVuQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4T3BlbkNvdW50LCBtaXhQb3J0LT5tYXhPcGVuQ291bnQpOwogICAgIH0KLSAgICBzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKKyAgICBzdGQ6OnN0cmluZyBtYXhBY3RpdmVDb3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnQpOwogICAgIGlmICghbWF4QWN0aXZlQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4QWN0aXZlQ291bnQsIG1peFBvcnQtPm1heEFjdGl2ZUNvdW50KTsKICAgICB9CiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW4KICAgICBBdWRpb0dhaW5UcmFpdHM6OkNvbGxlY3Rpb24gZ2FpbnM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oZG9jLCBjaGlsZCwgZ2FpbnMsIE5VTEwpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGNoaWxkLCAmZ2FpbnMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbWl4UG9ydC0+c2V0R2FpbnMoZ2FpbnMpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBtaXhQb3J0OwogfQogCi1jb25zdCBjaGFyICpjb25zdCBEZXZpY2VQb3J0VHJhaXRzOjp0YWcgPSAiZGV2aWNlUG9ydCI7Ci1jb25zdCBjaGFyICpjb25zdCBEZXZpY2VQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gImRldmljZVBvcnRzIjsKLQotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjp0YWdOYW1lW10gPSAidGFnTmFtZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjphZGRyZXNzW10gPSAiYWRkcmVzcyI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVTb3VyY2VbXSA9ICJzb3VyY2UiOwotCi1zdGF0dXNfdCBEZXZpY2VQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZkZXZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxEZXZpY2VQb3J0VHJhaXRzOjpFbGVtZW50PiBEZXZpY2VQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dGFnTmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dGFnTmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6dGFnTmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnRhZ05hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0eXBlKTsKICAgICBpZiAodHlwZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIHR5cGUgZm9yICVzIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHR5cGUgZm9yICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnJvbGUsIHJvbGUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnJvbGUsIHJvbGUuY19zdHIoKSk7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSAocm9sZSA9PSBBdHRyaWJ1dGVzOjpyb2xlU291cmNlKSA/CiAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCkBAIC0zMTQsMzM4ICs1MDgsMzY0IEBACiAgICAgaWYgKCFkZXZpY2VGcm9tU3RyaW5nKHR5cGVOYW1lLCB0eXBlKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgfHwKICAgICAgICAgICAgICghYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSkgJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKSB7Ci0gICAgICAgIEFMT0dXKCIlczogYmFkIHR5cGUgJTA4eCIsIF9fRlVOQ1RJT05fXywgdHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dXKCIlczogYmFkIHR5cGUgJTA4eCIsIF9fZnVuY19fLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgZGV2aWNlRGVzYyA9IG5ldyBFbGVtZW50KHR5cGUsIFN0cmluZzgobmFtZS5jX3N0cigpKSk7CisgICAgRWxlbWVudCBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChuYW1lLmNfc3RyKCkpKTsKIAotICAgIHN0cmluZyBhZGRyZXNzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjphZGRyZXNzKTsKICAgICBpZiAoIWFkZHJlc3MuZW1wdHkoKSkgewotICAgICAgICBBTE9HVigiJXM6IGFkZHJlc3M9JXMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXM6IGFkZHJlc3M9JXMgZm9yICVzIiwgX19mdW5jX18sIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgZGV2aWNlRGVzYy0+c2V0QWRkcmVzcyhTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSkpOwogICAgIH0KIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIHJvb3QsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjdXIsICZwcm9maWxlcywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwIDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVzLmFkZChkeW5hbWljUHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgIH0KICAgICBkZXZpY2VEZXNjLT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAogICAgIC8vIERlc2VyaWFsaXplIEF1ZGlvR2FpbiBjaGlsZHJlbgotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKLSAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIGRldmljZURlc2MtPmdldE5hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjdXIsICZkZXZpY2VEZXNjLT5tR2FpbnMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsIF9fZnVuY19fLAorICAgICAgICAgIGRldmljZURlc2MtPmdldE5hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+YWRkcmVzcygpLnN0cmluZygpKTsKKyAgICByZXR1cm4gZGV2aWNlRGVzYzsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgUm91dGVUcmFpdHM6OnRhZyA9ICJyb3V0ZSI7Ci1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOwotCi1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlTWl4W10gPSAibWl4IjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNpbmtbXSA9ICJzaW5rIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNvdXJjZXNbXSA9ICJzb3VyY2VzIjsKLQotCi1zdGF0dXNfdCBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KQorUmV0dXJuPFJvdXRlVHJhaXRzOjpFbGVtZW50PiBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7Ci0gICAgc3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgc3RkOjpzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6dHlwZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCByb3V0ZVR5cGUgPSAodHlwZSA9PSBBdHRyaWJ1dGVzOjp0eXBlTWl4KSA/CiAgICAgICAgICAgICAgICAgQVVESU9fUk9VVEVfTUlYIDogQVVESU9fUk9VVEVfTVVYOwogCi0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOwotICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChyb3V0ZVR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOworICAgIEVsZW1lbnQgcm91dGUgPSBuZXcgQXVkaW9Sb3V0ZShyb3V0ZVR5cGUpOwogCi0gICAgc3RyaW5nIHNpbmtBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNpbmspOworICAgIHN0ZDo6c3RyaW5nIHNpbmtBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c2luayk7CiAgICAgaWYgKHNpbmtBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c2luayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c2luayk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIENvbnZlcnQgU2luayBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIHNwPEF1ZGlvUG9ydD4gc2luayA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChzaW5rQXR0ci5jX3N0cigpKSk7CiAgICAgaWYgKHNpbmsgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBzaW5rQXR0ci5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBzaW5rIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fZnVuY19fLCBzaW5rQXR0ci5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgZWxlbWVudC0+c2V0U2luayhzaW5rKTsKKyAgICByb3V0ZS0+c2V0U2luayhzaW5rKTsKIAotICAgIHN0cmluZyBzb3VyY2VzQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VzQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOwogICAgIGlmIChzb3VyY2VzQXR0ci5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICAvLyBUb2tlbml6ZSBhbmQgQ29udmVydCBTb3VyY2VzIG5hbWUgdG8gcG9ydCBwb2ludGVyCiAgICAgQXVkaW9Qb3J0VmVjdG9yIHNvdXJjZXM7Ci0gICAgY2hhciAqc291cmNlc0xpdGVyYWwgPSBzdHJuZHVwKHNvdXJjZXNBdHRyLmNfc3RyKCksIHN0cmxlbihzb3VyY2VzQXR0ci5jX3N0cigpKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHNvdXJjZXNMaXRlcmFsLCAiLCIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHNvdXJjZXNMaXRlcmFse3N0cm5kdXAoCisgICAgICAgICAgICAgICAgc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKX07CisgICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHNvdXJjZXNMaXRlcmFsLmdldCgpLCAiLCIpOwogICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewogICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewogICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSBjdHgtPmZpbmRQb3J0QnlUYWdOYW1lKFN0cmluZzgoZGV2VGFnKSk7CiAgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNvdXJjZSBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIGRldlRhZyk7Ci0gICAgICAgICAgICAgICAgZnJlZShzb3VyY2VzTGl0ZXJhbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNvdXJjZSBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX2Z1bmNfXywgZGV2VGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc291cmNlcy5hZGQoc291cmNlKTsKICAgICAgICAgfQogICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgIiwiKTsKICAgICB9Ci0gICAgZnJlZShzb3VyY2VzTGl0ZXJhbCk7CiAKLSAgICBzaW5rLT5hZGRSb3V0ZShlbGVtZW50KTsKKyAgICBzaW5rLT5hZGRSb3V0ZShyb3V0ZSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gc291cmNlcy5pdGVtQXQoaSk7Ci0gICAgICAgIHNvdXJjZS0+YWRkUm91dGUoZWxlbWVudCk7CisgICAgICAgIHNvdXJjZS0+YWRkUm91dGUocm91dGUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTb3VyY2VzKHNvdXJjZXMpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByb3V0ZS0+c2V0U291cmNlcyhzb3VyY2VzKTsKKyAgICByZXR1cm4gcm91dGU7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZXNUYWcgPSAiYXR0YWNoZWREZXZpY2VzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnID0gImRlZmF1bHRPdXRwdXREZXZpY2UiOwotCi1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OnRhZyA9ICJtb2R1bGUiOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOwotCi1jb25zdCBjaGFyIE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBNb2R1bGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnZlcnNpb25bXSA9ICJoYWxWZXJzaW9uIjsKLQotc3RhdHVzX3QgTW9kdWxlVHJhaXRzOjpkZXNlcmlhbGl6ZSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKK1JldHVybjxNb2R1bGVUcmFpdHM6OkVsZW1lbnQ+IE1vZHVsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIHVpbnQzMl90IHZlcnNpb25NYWpvciA9IDAsIHZlcnNpb25NaW5vciA9IDA7Ci0gICAgc3RyaW5nIHZlcnNpb25MaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnZlcnNpb24pOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb25MaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dmVyc2lvbik7CiAgICAgaWYgKCF2ZXJzaW9uTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIHNzY2FuZih2ZXJzaW9uTGl0ZXJhbC5jX3N0cigpLCAiJXUuJXUiLCAmdmVyc2lvbk1ham9yLCAmdmVyc2lvbk1pbm9yKTsKLSAgICAgICAgQUxPR1YoIiVzOiBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgQUxPR1YoIiVzOiBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgIF9fZnVuY19fLAogICAgICAgICAgICAgICB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NYWpvcik7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwogCi0gICAgbW9kdWxlID0gbmV3IEVsZW1lbnQobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CisgICAgRWxlbWVudCBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CiAKICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbnM6IEF1ZGlvIE1peCBQb3J0LCBBdWRpbyBEZXZpY2UgUG9ydHMgKFNvdXJjZS9TaW5rKSwgQXVkaW8gUm91dGVzCiAgICAgTWl4UG9ydFRyYWl0czo6Q29sbGVjdGlvbiBtaXhQb3J0czsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TWl4UG9ydFRyYWl0cz4oZG9jLCByb290LCBtaXhQb3J0cywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1peFBvcnRUcmFpdHM+KGN1ciwgJm1peFBvcnRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0UHJvZmlsZXMobWl4UG9ydHMpOwogCiAgICAgRGV2aWNlUG9ydFRyYWl0czo6Q29sbGVjdGlvbiBkZXZpY2VQb3J0czsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248RGV2aWNlUG9ydFRyYWl0cz4oZG9jLCByb290LCBkZXZpY2VQb3J0cywgTlVMTCk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGN1ciwgJmRldmljZVBvcnRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZVBvcnRzKTsKIAogICAgIFJvdXRlVHJhaXRzOjpDb2xsZWN0aW9uIHJvdXRlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGRvYywgcm9vdCwgcm91dGVzLCBtb2R1bGUuZ2V0KCkpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxSb3V0ZVRyYWl0cz4oY3VyLCAmcm91dGVzLCBtb2R1bGUuZ2V0KCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXRSb3V0ZXMocm91dGVzKTsKIAotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkcmVuID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChjaGlsZHJlbiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyk7Ci0gICAgICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkQXR0YWNoZWREZXZpY2VUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbENoYXIgKmF0dGFjaGVkRGV2aWNlID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilhdHRhY2hlZERldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoKGNvbnN0IGNoYXIqKWF0dGFjaGVkRGV2aWNlKSk7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZHJlbiA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZHJlbiAhPSBOVUxMOworICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGRBdHRhY2hlZERldmljZXNUYWcpKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcyBmb3VuZCIsIF9fZnVuY19fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOworICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkQXR0YWNoZWREZXZpY2VUYWcpKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGF0dGFjaGVkRGV2aWNlID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC0+ZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0YWNoZWREZXZpY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkRGV2aWNlLmdldCgpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hZGRBdmFpbGFibGVEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoYXR0YWNoZWREZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkgewotICAgICAgICAgICAgeG1sQ2hhciAqZGVmYXVsdE91dHB1dERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKSk7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgIGF1dG8gZGVmYXVsdE91dHB1dERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLT5kb2MsIGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlZmF1bHRPdXRwdXREZXZpY2UuZ2V0KCkpKSk7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSAwICYmIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgY3R4LT5zZXREZWZhdWx0T3V0cHV0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZGVmYXVsdCBpcyAlMDh4IiwgX19GVU5DVElPTl9fLCBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZhdWx0IGlzICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sRnJlZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLT5uZXh0OwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1vZHVsZTsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgR2xvYmFsQ29uZmlnVHJhaXRzOjp0YWcgPSAiZ2xvYmFsQ29uZmlndXJhdGlvbiI7Ci0KLWNvbnN0IGNoYXIgR2xvYmFsQ29uZmlnVHJhaXRzOjpBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZFtdID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOwotCi0KLXN0YXR1c190IEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQorc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdGFnKSkgewotICAgICAgICAgICAgc3RyaW5nIHNwZWFrZXJEcmNFbmFibGVkID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHRhZykpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzcGVha2VyRHJjRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkKTsKICAgICAgICAgICAgIGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZDsKICAgICAgICAgICAgIGlmICghc3BlYWtlckRyY0VuYWJsZWQuZW1wdHkoKSAmJgotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG88c3RyaW5nLCBib29sPihzcGVha2VyRHJjRW5hYmxlZCwgaXNTcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgYm9vbD4oc3BlYWtlckRyY0VuYWJsZWQsIGlzU3BlYWtlckRyY0VuYWJsZWQpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5zZXRTcGVha2VyRHJjRW5hYmxlZChpc1NwZWFrZXJEcmNFbmFibGVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6dGFnID0gInZvbHVtZSI7Ci1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7Ci1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnID0gInBvaW50IjsKLQotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OnN0cmVhbVtdID0gInN0cmVhbSI7Ci1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnlbXSA9ICJkZXZpY2VDYXRlZ29yeSI7Ci1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6cmVmZXJlbmNlW10gPSAicmVmIjsKLQotc3RhdHVzX3QgVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPFZvbHVtZVRyYWl0czo6RWxlbWVudD4gVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0cmVhbSk7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwogICAgIGlmIChzdHJlYW1UeXBlTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwogICAgIGlmICghU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1UeXBlTGl0ZXJhbCwgc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgc3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOwogICAgIGlmIChkZXZpY2VDYXRlZ29yeUxpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnk7CiAgICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGRldmljZUNhdGVnb3J5KSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5LAorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnksCiAgICAgICAgICAgICAgIGRldmljZUNhdGVnb3J5TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAKLSAgICBzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyZWZlcmVuY2UpOwotICAgIGNvbnN0IF94bWxOb2RlICpyZWYgPSBOVUxMOworICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyZWZlcmVuY2UpOworICAgIGNvbnN0IHhtbE5vZGUgKnJlZiA9IE5VTEw7CiAgICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZ2V0UmVmZXJlbmNlPFZvbHVtZVRyYWl0cz4ocm9vdC0+cGFyZW50LCByZWYsIHJlZmVyZW5jZU5hbWUpOworICAgICAgICByZWYgPSBnZXRSZWZlcmVuY2U8Vm9sdW1lVHJhaXRzPihjdXItPnBhcmVudCwgcmVmZXJlbmNlTmFtZSk7CiAgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGRldmljZUNhdGVnb3J5LCBzdHJlYW1UeXBlKTsKKyAgICBFbGVtZW50IHZvbEN1cnZlID0gbmV3IFZvbHVtZUN1cnZlKGRldmljZUNhdGVnb3J5LCBzdHJlYW1UeXBlKTsKIAotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpwb2ludERlZmluaXRpb24gPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOzsKLSAgICAgICAgICAgIGlmIChwb2ludERlZmluaXRpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJlZmVyZW5jZU5hbWUuZW1wdHkoKSA/IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgICBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih2b2x1bWVQb2ludFRhZykpKSB7CisgICAgICAgICAgICBhdXRvIHBvaW50RGVmaW5pdGlvbiA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5kb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgIGlmIChwb2ludERlZmluaXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24pOwotICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+IHBvaW50OwotICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQzMl90PiA+KChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24sIHBvaW50LCAiLCIpOworICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0YWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50RGVmaW5pdGlvbi5nZXQoKSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcG9pbnQ7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludDMyX3Q+PigKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnREZWZpbml0aW9uLmdldCgpKSwgcG9pbnQsICIsIik7CiAgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19GVU5DVElPTl9fLCB2b2x1bWVQb2ludFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgdm9sdW1lUG9pbnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludERlZmluaXRpb24uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudC0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7Ci0gICAgICAgICAgICB4bWxGcmVlKHBvaW50RGVmaW5pdGlvbik7CisgICAgICAgICAgICB2b2xDdXJ2ZS0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHZvbEN1cnZlOworfQorCitzdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+c2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOworCisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFN1cnJvdW5kRm9ybWF0cyhmb3JtYXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVBvbGljeVNlcmlhbGl6ZXI6OlBvbGljeVNlcmlhbGl6ZXIoKSA6IG1Sb290RWxlbWVudE5hbWUocm9vdE5hbWUpCitSZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgIG9zcyA8PCBnTWFqb3IgPDwgIi4iIDw8IGdNaW5vcjsKLSAgICBtVmVyc2lvbiA9IG9zcy5zdHIoKTsKLSAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0RnJvbVN0cmluZyhmb3JtYXRMaXRlcmFsKTsKKyAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAlcyIsIF9fZnVuY19fLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihmb3JtYXQsIENvbGxlY3Rpb246Om1hcHBlZF90eXBle30pOworCisgICAgc3RkOjpzdHJpbmcgc3ViZm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdWJmb3JtYXRzKTsKKyAgICBpZiAoc3ViZm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgcmV0dXJuIHBhaXI7CisgICAgRm9ybWF0VmVjdG9yIHN1YmZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhzdWJmb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHN1YmZvcm1hdHMpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBwYWlyLnNlY29uZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgc3ViZm9ybWF0ICV4IHRvIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywgc3ViZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhaXI7CiB9CiAKLXN0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpOwotICAgIGlmIChkb2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKKyAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jLmdldCgpKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKLSAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICB9CiAKLSAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKSkgIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4ocm9vdE5hbWUpKSkgIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19mdW5jX18sIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3QtPm5hbWUpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIHZlcnNpb25BdHRyaWJ1dGUpOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgdmVyc2lvbkF0dHJpYnV0ZSk7CiAgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHZlcnNpb24gIT0gbVZlcnNpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwKICAgICAgICAgICAgICAgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gTGV0cyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihkb2MsIGN1ciwgbW9kdWxlcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGNvbmZpZy0+c2V0SHdNb2R1bGVzKG1vZHVsZXMpOwogCiAgICAgLy8gZGVzZXJpYWxpemUgdm9sdW1lIHNlY3Rpb24KICAgICBWb2x1bWVUcmFpdHM6OkNvbGxlY3Rpb24gdm9sdW1lczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIGN1ciwgdm9sdW1lcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldFZvbHVtZXModm9sdW1lcyk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4ocm9vdCwgJnZvbHVtZXMsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBjb25maWctPnNldFZvbHVtZXModm9sdW1lcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY3VyLCBjb25maWcpOworICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKIAotICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCisgICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDY1MjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE1fU2Vzc2lvblJvdXRlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotdm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCi17Ci0gICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCi0gICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKLSAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKLX0KLQotLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Ci19Ci0KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBpZiAoaW5kZXhPZktleShzZXNzaW9uKSA+PSAwKSB7Ci0gICAgICAgIGlmICh2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6cmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBBTE9HX0FTU0VSVChyb3V0ZS0+bVJlZkNvdW50ID4gMCk7Ci0gICAgICAgIC0tcm91dGUtPm1SZWZDb3VudDsKLSAgICAgICAgaWYgKHJvdXRlLT5tUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6aW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIHJldHVybiByb3V0ZSAhPSAwID8gKysocm91dGUtPm1BY3Rpdml0eUNvdW50KSA6IC0xOwotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjpkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDAgJiYgcm91dGUtPm1BY3Rpdml0eUNvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gLS0ocm91dGUtPm1BY3Rpdml0eUNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6bG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pCi17Ci0gICAgQUxPR0koIiVzIC0tLS0iLCBjYXB0aW9uKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLQotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjQ5ZmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLVN0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQotICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKLXsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBjdXJyZW50IHN0cmVhbSdzIGluZGV4IHRvIG1JbmRleE1heCBzbyB2b2x1bWUgaXNuJ3QgMCBpbgotICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBKYXZhIGxheWVyIGRvZXNuJ3QgY2FsbCBpbnRvIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSB0bwotICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2b2x1bWUuCi0gICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgbUluZGV4TWF4KTsKLX0KLQotaW50IFN0cmVhbURlc2NyaXB0b3I6OmdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci17Ci0gICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgfQotICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpCi17Ci0gICAgbUluZGV4Q3VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikKLXsKLSAgICBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpCi17Ci0gICAgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi1TdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQotewotICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnksIHBvaW50KTsKLX0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKHZvbEluZGV4TWluKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KHZvbEluZGV4TWF4KTsKLX0KLQotZmxvYXQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdAotewotICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSB2YWx1ZUF0KHN0cmVhbSk7Ci0gICAgcmV0dXJuIEdhaW5zOjp2b2xJbmRleFRvRGIoc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGNhdGVnb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWluKCksIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluVWkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotewotICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgewotICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtLCBpbmRleE1pbik7Ci0gICAgc2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtLCBpbmRleE1heCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcwotICAgIGlmIChpc1NwZWFrZXJEcmNFbmFibGVkKSB7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1NZU1RFTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9SSU5HLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9NVVNJQywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgIH0KLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKLXsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KHN0cmVhbURzdCwgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW3N0cmVhbVNyY11bal0pOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcAppbmRleCBhYzNmMWJjLi42MjBmMzYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCkBAIC02OCw4MSArNjgsNTYgQEAKICAgICByZXR1cm4gZGVjaWJlbHM7CiB9CiAKLXZvaWQgVm9sdW1lQ3VydmU6OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIHsiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmQoIiB7Iik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiKCUzZCwgJTVkKSIsCisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIoJTNkLCAlNWQpIiwKICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7CisgICAgICAgIGRzdC0+YXBwZW5kKGkgPT0gKG1DdXJ2ZVBvaW50cy5zaXplKCkgLSAxKSA/ICIgfVxuIiA6ICIsICIpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAotdm9pZCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW06OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3ZvaWQgVm9sdW1lQ3VydmVzRm9yU3RyZWFtOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBpZiAoIWN1cnZlUG9pbnRzKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAorICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCiAgICAgICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsIG1JbmRleEN1ci5rZXlBdChpKSwgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUwNHggOiAlMDJkLCAiLCBtSW5kZXhDdXIua2V5QXQoaSksIG1JbmRleEN1ci52YWx1ZUF0KGkpKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdExpdGVyYWw7CiAgICAgICAgIERldmljZUNhdGVnb3J5Q29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgZGV2aWNlQ2F0TGl0ZXJhbCk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyAlcyA6IiwKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlcyA6IiwKICAgICAgICAgICAgICAgICAgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogfQogCi1zdGF0dXNfdCBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgZHN0LT5hcHBlbmQoIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgZHN0LT5hcHBlbmQoCiAgICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICUwMnp1ICAgICAgIiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSkuZHVtcChkc3QpOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5Wb2x1bWUgQ3VydmVzIGZvciBVc2UgQ2FzZXMgKGFrYSBTdHJlYW0gdHlwZXMpIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsOwogICAgICAgICBTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgc3RyZWFtVHlwZUxpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KAogICAgICAgICAgICAgICAgICAiICVzICglMDJ6dSk6IEN1cnZlIHBvaW50cyBmb3IgZGV2aWNlIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLAogICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlTGl0ZXJhbC5jX3N0cigpLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQsIDIsIHRydWUpOworICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZHN0LCAyLCB0cnVlKTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IGE3NWYxY2IuLjQyYzUyZGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTg1LDYgKzE4NSw5IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIApAQCAtMTk1LDQgKzE5OCwxMCBAQAogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE3YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEfEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c3Vycm91bmRTb3VuZD4KKyAgPCEtLSBFYWNoIG9mIHRoZSBsaXN0ZWQgZm9ybWF0cyBnZXRzIGFuIGVudHJ5IGluIFN1cnJvdW5kIFNldHRpbmdzIGRpYWxvZyBvbiBUViBkZXZpY2VzLgorICAgICAgIFRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgRU5DT0RJTkdfLi4uIGNvbnRhbnQgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC5qYXZhLAorICAgICAgIGFuZCBhIGRpc3BsYXkgbmFtZSBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LnRvRGlzcGxheU5hbWUuIEZvciB0aGUgZm9ybWF0cyB0aGF0IGRvbid0CisgICAgICAgbmVlZCBhIGRlZGljYXRlZCBTdXJyb25kIFNldHRpbmdzIGRpYWxvZyBlbnRyeSwgYSBzdWJmb3JtYXRzIGxpc3QgaGFzIHRvIGJlIHVzZWQuIC0tPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzNfSk9DIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRFRTX0hEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FBQ19MQyIgc3ViZm9ybWF0cz0iQVVESU9fRk9STUFUX0FBQ19IRV9WMSBBVURJT19GT1JNQVRfQUFDX0hFX1YyIEFVRElPX0ZPUk1BVF9BQUNfRUxEIEFVRElPX0ZPUk1BVF9BQUNfWEhFIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDNCIgLz4KKyAgPC9mb3JtYXRzPgorPC9zdXJyb3VuZFNvdW5kPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKaW5kZXggMzZlMGY0Mi4uYjEyOGEzOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0xMCw3ICsxMCw2IEBACiAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQgXAogCiBMT0NBTF9TUkNfRklMRVM6PSBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKaW5kZXggZTg2YWU1Zi4uNjkzOTVmMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0zMTUsNyArMzE1LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IG91dHB1dHMuZ2V0UHJpbWFyeU91dHB1dCgpOwogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKIAogICAgICAgICAgICAgLy8gVE9ETzogZ2V0UHJpbWFyeU91dHB1dCByZXR1cm4gb25seSBkZXZpY2VzIGZyb20gZmlyc3QgbW9kdWxlIGluCiAgICAgICAgICAgICAvLyBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwsIGhlYXJpbmcgYWlkIGlzIG5vdCB0aGVyZSwgYnV0IGl0J3MKQEAgLTQxMCw4ICs0MTAsNyBAQAogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CiAKLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQotICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KKyAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlCiAgICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCiAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCkBAIC00ODQsNyArNDgzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOwogICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKQEAgLTY3MSw5ICs2NzAsOCBAQAogICAgICAgICBpZiAoKGdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCiAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKLSAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpCi0gICAgICAgICAgICAgICAgICAgICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCAyM2NjMDJlLi5hYTIwNWYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgpAQCAtNDMsMTQgKzQ1LDExIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxhdWRpb19wb2xpY3lfY29uZi5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgotI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0jaW5jbHVkZSA8Q29uZmlnUGFyc2luZ1V0aWxzLmg+Ci0jaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8U2VyaWFsaXplci5oPgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxwb2xpY3kuaD4KQEAgLTY1LDI1ICs2NCwxNSBAQAogLy8gbWVkaWEgLyBub3RpZmljYXRpb24gLyBzeXN0ZW0gdm9sdW1lLgogY29uc3RleHByIGZsb2F0IElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREIgPSAzLmY7CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0vLyBBcnJheSBvZiBhbGwgc3Vycm91bmQgZm9ybWF0cy4KLXN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBTVVJST1VORF9GT1JNQVRTW10gPSB7Ci0gICAgQVVESU9fRk9STUFUX0FDMywKLSAgICBBVURJT19GT1JNQVRfRV9BQzMsCi0gICAgQVVESU9fRk9STUFUX0RUUywKLSAgICBBVURJT19GT1JNQVRfRFRTX0hELAotICAgIEFVRElPX0ZPUk1BVF9BQUNfTEMsCi0gICAgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwKLSAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DLAotfTsKLS8vIEFycmF5IG9mIGFsbCBBQUMgZm9ybWF0cy4gV2hlbiBBQUMgaXMgZW5hYmxlZCBieSB1c2VycywgYWxsIEFBQyBmb3JtYXRzIHNob3VsZCBiZSBlbmFibGVkLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IEFBQ19GT1JNQVRTW10gPSB7Ci0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsCi0gICAgQVVESU9fRk9STUFUX0FBQ19FTEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19YSEUsCi19OworLy8gQ29tcHJlc3NlZCBmb3JtYXRzIGZvciBNU0QgbW9kdWxlLCBvcmRlcmVkIGZyb20gbW9zdCBwcmVmZXJyZWQgdG8gbGVhc3QgcHJlZmVycmVkLgorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBjb21wcmVzc2VkRm9ybWF0c09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzEsIEFVRElPX0ZPUk1BVF9NQVRfMl8wLCBBVURJT19GT1JNQVRfRV9BQzMsCisgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIH19OworLy8gQ2hhbm5lbCBtYXNrcyBmb3IgTVNEIG1vZHVsZSwgM0QgPiAyRCA+IDFEIG9yZGVyaW5nIChtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQpLgorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBzdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIH19OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgpAQCAtMTYwLDEzICsxNDksMTMgQEAKIAogICAgICAgICAgICAgLy8gQmVmb3JlIGNoZWNraW5nIG91dHB1dHMsIGJyb2FkY2FzdCBjb25uZWN0IGV2ZW50IHRvIGFsbG93IEhBTCB0byByZXRyaWV2ZSBkeW5hbWljCiAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIG9uIG5ld2x5IGNvbm5lY3RlZCBkZXZpY2VzIChpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIG91dHB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+YWRkcmVzcygpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKIAogICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YWRkcmVzcygpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKQEAgLTE4OSwxMiArMTc4LDEyIEBACiAgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKIAogICAgICAgICAgICAgLy8gU2VuZCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+YWRkcmVzcygpKTsKIAogICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwogCi0gICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+YWRkcmVzcygpKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCiAgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOwpAQCAtMjA1LDMxICsxOTQsMzEgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCi0gICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0Ci0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7Ci0gICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKFsmXSgpIHsKKyAgICAgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjaGVjayBBMkRQIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAotICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0pOwogCi0gICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOwogICAgICAgICB9CisgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBtc2RPdXREZXZpY2UgPSBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CkBAIC0yMzcsNyArMjI2LDggQEAKICAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKICAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KLSAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIWRlc2MtPmlzRHVwbGljYXRlZCgpCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IChtc2RPdXREZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgbXNkT3V0RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlc2MtPmlzRHVwbGljYXRlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKQEAgLTI3NSwxMSArMjY1LDExIEBACiAKICAgICAgICAgICAgIC8vIEJlZm9yZSBjaGVja2luZyBpbnRwdXRzLCBicm9hZGNhc3QgY29ubmVjdCBldmVudCB0byBhbGxvdyBIQUwgdG8gcmV0cmlldmUgZHluYW1pYwogICAgICAgICAgICAgLy8gcGFyYW1ldGVycyBvbiBuZXdseSBjb25uZWN0ZWQgZGV2aWNlcyAoaW5zdGVhZCBvZiBvcGVuaW5nIHRoZSBpbnB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgaW5wdXRzLCBkZXZEZXNjLT5hZGRyZXNzKCkpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hZGRyZXNzKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIApAQCAtMzA0LDkgKzI5NCw5IEBACiAgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOwogCiAgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAKLSAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPmFkZHJlc3MoKSk7CiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKIAogICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCkBAIC00ODEsMzMgKzQ3MSwyNiBAQAogCiBzcDxBdWRpb1BhdGNoPiBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZVRlbGVwaG9ueVBhdGNoKAogICAgICAgICBib29sIGlzUngsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYzsKICAgICBpZiAoaXNSeCkgewotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zaW5rc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhmaW5kRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UpKS4KKyAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZmluZERldmljZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjID0gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UodHhTb3VyY2VEZXZpY2VEZXNjID0gZmluZERldmljZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UpKS4KKyAgICAgICAgICAgICAgICBhZGRTaW5rKGZpbmREZXZpY2UobUF2YWlsYWJsZU91dHB1dERldmljZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSk7CiAgICAgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IGlzUnggPyBkZXZpY2UgOiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWDsKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG91dHB1dERldmljZSwgbU91dHB1dHMpOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwogICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIHRhcmdldCBkZXZpY2UKICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKICAgICAgICAgICAgICAgICAiJXMoKSAlI3ggZGV2aWNlIG91dHB1dCAlZCBpcyBkdXBsaWNhdGVkIiwgX19mdW5jX18sIG91dHB1dERldmljZSwgb3V0cHV0KTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0ggfSk7CiAgICAgfQogCiAgICAgaWYgKCFpc1J4KSB7CkBAIC01MTcsMzggKzUwMCw0OSBAQAogICAgICAgICAvLyBzeW1tZXRyaWMgdG8gdGhlIG9uZSBpbiBzdGFydElucHV0KCkKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewogICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHR4U291cmNlRGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlQWN0aXZlQ2xpZW50cyhhY3RpdmVEZXNjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CiAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAogICAgICAgICAgICAgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOwogICAgIHNwPEF1ZGlvUGF0Y2g+IGF1ZGlvUGF0Y2g7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgYXVkaW9QYXRjaCA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCBtVWlkQ2FjaGVkKTsKICAgICAgICAgYXVkaW9QYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwogICAgICAgICBhdWRpb1BhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKICAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUGF0Y2g7CiB9CiAKLXNwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kRGV2aWNlKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0IHsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKICAgICAgICAgICAgICIlcygpIHNlbGVjdGVkIGRldmljZSB0eXBlICUjeCBpcyBub3QgaW4gZGV2aWNlcyBsaXN0IiwgX19mdW5jX18sIGRldmljZSk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgIGRldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Ci0gICAgcmV0dXJuIGRldmljZURlc2M7CisgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2QgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICByZXR1cm4gbW9kICE9IDAgPyBkZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKG1vZC0+Z2V0SGFuZGxlKCkpIDogQVVESU9fREVWSUNFX05PTkU7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0RldmljZU9mTW9kdWxlKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0IHsKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShtb2R1bGVJZCk7CisgICAgaWYgKG1vZHVsZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpCisgICAgICAgICAgICAgICAgLmluZGV4T2YoZGV2RGVzYykgIT0gTkFNRV9OT1RfRk9VTkQKKyAgICAgICAgICAgICAgICB8fCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC01NjIsMTQgKzU1Niw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8vIE9wZW5zOiBjYW4gdGhlc2UgbGluZSBiZSBleGVjdXRlZCBhZnRlciB0aGUgc3dpdGNoIG9mIHZvbHVtZSBjdXJ2ZXM/Pz8KLSAgICAvLyBpZiBsZWF2aW5nIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZmFsc2UsIHRydWUpOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RvcHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KQEAgLTU4Miw5ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgICAgfHwgKGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgcGhvbmUgc3RhdGUKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIGludCBkZWxheU1zID0gMDsKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKQEAgLTY0OCwxNCArNjM0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KQEAgLTY5MCw5ICs2NzAsNyBAQAogICAgICAgICAgICAgKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAvLyB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMgaGFuZGxlZCBieSBzeXN0ZW0gVUkKQEAgLTczNCwyMiArNzEyLDI1IEBACiAgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKIH0KIAotLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbwotLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisvLyBGaW5kIGFuIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuIFdoZW4gImRpcmVjdE9ubHkiIGlzIHNldCwgcmVzdHJpY3QKKy8vIHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvck91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQogewotICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgotICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KLSAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8Ci0gICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7Ci0gICAgZmxhZ3MgPQotICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgaWYgKGRpcmVjdE9ubHkpIHsKKyAgICAgICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCisgICAgICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CisgICAgICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7CisgICAgICAgIGZsYWdzID0KKyAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CiAKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CiAKQEAgLTc2Niw3ICs3NDcsOSBAQAogICAgICAgICAgICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSkgPT0gMCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eSB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKKyAgICAgICAgICAgIGlmICghZGlyZWN0T25seSkgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyBmb3IgZGlyZWN0IG91dHB1dHMsIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkKKyAgICAgICAgICAgIC8vIHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQogICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzkxLDEyICs3NzQsMTQ5IEBACiAgICAgLy8gYW5kIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoKS4KIAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAKICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZSAlMDh4LCBvdXRwdXQgJWQiLCBzdHJlYW0sIGRldmljZSwgb3V0cHV0KTsKICAgICByZXR1cm4gb3V0cHV0OwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QgKmRzdEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSkKK3sKKyAgICBpZiAoc3JjQXR0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMoc3JjQXR0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgc3JjQXR0ci0+dXNhZ2UsIHNyY0F0dHItPmNvbnRlbnRfdHlwZSwgc3JjQXR0ci0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHNyY0F0dHItPnRhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqZHN0QXR0ciA9ICpzcmNBdHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzcmNTdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHNyY1N0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhzcmNTdHJlYW0sIGRzdEF0dHIpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0ckludChhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkKQoreworICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzOworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3k7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fZGV2aWNlc190IG1zZERldmljZSA9CisgICAgICAgICAgICBnZXRNb2R1bGVEZXZpY2VUeXBlcyhtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXMocmVzdWx0QXR0ciwgYXR0ciwgKnN0cmVhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIEFMT0dWKCIlcyB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCisgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgIHJlc3VsdEF0dHItPnVzYWdlLCByZXN1bHRBdHRyLT5jb250ZW50X3R5cGUsIHJlc3VsdEF0dHItPnRhZ3MsIHJlc3VsdEF0dHItPmZsYWdzLAorICAgICAgICAgIHNlc3Npb24sIHJlcXVlc3RlZERldmljZUlkKTsKKworICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQocmVzdWx0QXR0cik7CisKKyAgICBzdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cihyZXN1bHRBdHRyKTsKKworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBleHBsaWNpdCByb3V0aW5nIChlZy4gc2V0UHJlZmVycmVkRGV2aWNlKQorICAgIGlmIChyZXF1ZXN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHJlcXVlc3RlZERldmljZUlkKTsKKyAgICAgICAgZGV2aWNlID0gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIG5vIGV4cGxpY3Qgcm91dGUsIGlzIHRoZXJlIGEgbWF0Y2hpbmcgZHluYW1pYyBwb2xpY3kgdGhhdCBhcHBsaWVzPworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKCpyZXN1bHRBdHRyLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChkZXNjICE9IDAsICJJbnZhbGlkIGRlc2MgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yQXR0ciIpOworICAgICAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChyZXN1bHRBdHRyKTsKKyAgICAgICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICBBdWRpb01peCAqbWl4ID0gZGVzYy0+bVBvbGljeU1peDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShtaXgtPm1EZXZpY2VUeXBlLCBtaXgtPm1EZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gZGV2aWNlRGVzYyAhPSAwID8gZGV2aWNlRGVzYy0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBBTE9HVigiJXMgcmV0dXJucyBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgKm91dHB1dCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvLyBWaXJ0dWFsIHNvdXJjZXMgbXVzdCBhbHdheXMgYmUgZHluYW1pY2FseSBvciBleHBsaWNpdGx5IHJvdXRlZAorICAgICAgICBpZiAocmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKworICAgIGlmICgocmVzdWx0QXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICAvLyBTZXQgaW5jYWxsIG11c2ljIG9ubHkgaWYgZGV2aWNlIHdhcyBleHBsaWNpdGx5IHNldCwgYW5kIGZhbGxiYWNrIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMKKyAgICAvLyBjaG9zZW4gYnkgdGhlIGVuZ2luZSBpZiBub3QuCisgICAgLy8gRklYTUU6IHByb3ZpZGUgYSBtb3JlIGdlbmVyaWMgYXBwcm9hY2ggd2hpY2ggaXMgbm90IGRldmljZSBzcGVjaWZpYyBhbmQgbW92ZSB0aGlzIGJhY2sKKyAgICAvLyB0byBnZXRPdXRwdXRGb3JEZXZpY2UuCisgICAgLy8gVE9ETzogUmVtb3ZlIGNoZWNrIG9mIEFVRElPX1NUUkVBTV9NVVNJQyBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZWQgb24gdGhlIGFwcCBzaWRlLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKKyAgICAgICAgKCpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDIHx8IHJlc3VsdEF0dHItPnVzYWdlID09IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04pICYmCisgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgIGlzSW5DYWxsKCkpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGRldmNlIHR5cGUgZGlyZWN0bHkgZnJvbSB0aGUgZW5naW5lIHRvIGJ5cGFzcyBwcmVmZXJyZWQgcm91dGUgbG9naWMKKyAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCIlcyBkZXZpY2UgMHgleCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgIgorICAgICAgICAgICJmbGFncyAlI3giLAorICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKKworICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBpZiAobXNkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UobXNkRGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICAgICAgaWYgKCpvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2V0TXNkUGF0Y2goZGV2aWNlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1YoIiVzKCkgVXNpbmcgTVNEIGRldmljZSAweCV4IGluc3RlYWQgb2YgZGV2aWNlIDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgZGV2aWNlID0gbXNkRGV2aWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBnZXRGaXJzdERldmljZUlkKG91dHB1dERldmljZXMpOworCisgICAgQUxPR1YoIiVzIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCBfX2Z1bmNfXywgKm91dHB1dCwgKnNlbGVjdGVkRGV2aWNlSWQpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC04MDcsOTUgKzkyNywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOwotICAgIGlmIChhdHRyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgewotICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBhdHRyLT50YWdzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcyA9ICphdHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgqc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCAqc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKCpzdHJlYW0sICZhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihhdHRyaWJ1dGVzLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGRlc2MgIT0gMCwgIkludmFsaWQgZGVzYyByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JBdHRyIik7Ci0gICAgICAgIGlmICghYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoY29uZmlnLT5mb3JtYXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKLSAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IgotICAgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncywKLSAgICAgICAgICAgIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkKTsKLQotICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotCi0gICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtT3V0cHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sICpzdHJlYW0sIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEsIGRldmljZURlc2MsIHVpZCk7Ci0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLQotICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgIH0KLQotICAgIC8vIFNldCBpbmNhbGwgbXVzaWMgb25seSBpZiBkZXZpY2Ugd2FzIGV4cGxpY2l0bHkgc2V0LCBhbmQgZmFsbGJhY2sgdG8gdGhlIGRldmljZSB3aGljaCBpcwotICAgIC8vIGNob3NlbiBieSB0aGUgZW5naW5lIGlmIG5vdC4KLSAgICAvLyBGSVhNRTogcHJvdmlkZSBhIG1vcmUgZ2VuZXJpYyBhcHByb2FjaCB3aGljaCBpcyBub3QgZGV2aWNlIHNwZWNpZmljIGFuZCBtb3ZlIHRoaXMgYmFjawotICAgIC8vIHRvIGdldE91dHB1dEZvckRldmljZS4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCi0gICAgICAgICpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmCi0gICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCi0gICAgICAgIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCAiCi0gICAgICAgICAgImZsYWdzICUjeCIsCi0gICAgICAgICAgZGV2aWNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7Ci0KLSAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7Ci0gICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBhdHRyLCBzdHJlYW0sIHVpZCwKKyAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAKLSAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICpzZWxlY3RlZERldmljZUlkID0gb3V0cHV0RGV2aWNlcy5zaXplKCkgPiAwID8gb3V0cHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZyA9IHsuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzayB9OworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwogCi0gICAgQUxPR1YoIiAgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCAqb3V0cHV0LCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnREZXNjID0KKyAgICAgICAgbmV3IFRyYWNrQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsIHNlc3Npb24sIHJlc3VsdEF0dHIsIGNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCwgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJhdGVneUZvckF0dHIoJnJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFncyk7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcigqb3V0cHV0KTsKKyAgICBvdXRwdXREZXNjLT5hZGRDbGllbnQoY2xpZW50RGVzYyk7CisKKyAgICBBTE9HVigiJXMgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCBmb3IgcG9ydCBJRCAlZCIsCisgICAgICAgICAgX19mdW5jX18sICpvdXRwdXQsIHJlcXVlc3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTkzMiw3ICs5OTAsOCBAQAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICAqZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19UVFM7CiAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKLSAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICAgICAgICAgKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQykgPT0gMCkgewogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKICAgICAgICAgQUxPR1YoIlNldCBWb0lQIGFuZCBEaXJlY3Qgb3V0cHV0IGZsYWdzIGZvciBQQ00gZm9ybWF0Iik7CkBAIC05NTgsMTEgKzEwMTcsMTIgQEAKIAogICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MpOworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICB9CiAKICAgICBpZiAocHJvZmlsZSAhPSAwKSB7CkBAIC05OTEsOSArMTA1MSwyNSBAQAogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICBEZXZpY2VWZWN0b3Igb3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKG91dHB1dERldmljZXMpOworCisgICAgICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQorICAgICAgICAvLyBNU0QgcGF0Y2ggdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmstPmV4dC5kZXZpY2UudHlwZSAmIGRldmljZSkgIT0gQVVESU9fREVWSUNFX05PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CiAKQEAgLTEwMTYsOCArMTA5Miw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CiAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbiA9IHNlc3Npb247CiAKQEAgLTEwNDgsNyArMTEyMiw4IEBACiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgY29uZmlnLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQogICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgogICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKQEAgLTEwNTcsMTcgKzExMzIsMTcwIEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gMCkgeworICAgICAgICBEZXZpY2VWZWN0b3IgbXNkSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgIG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpOworICAgICAgICBpZiAoIW1zZElucHV0RGV2aWNlcy5pc0VtcHR5KCkpIHJldHVybiBtc2RJbnB1dERldmljZXMuaXRlbUF0KDApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RQYXRjaGVzKCkgY29uc3QgeworICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXM7CisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSAhPSAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXM7ICsraikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlID0gJnBhdGNoLT5tUGF0Y2guc291cmNlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+ZXh0LmRldmljZS5od19tb2R1bGUgPT0gbXNkTW9kdWxlLT5nZXRIYW5kbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtc2RQYXRjaGVzLmFkZEF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1zZFBhdGNoZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcihhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICBib29sIGh3QXZTeW5jLCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua0NvbmZpZykgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8SHdNb2R1bGU+IGRldmljZU1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKG91dHB1dERldmljZSk7CisgICAgaWYgKGRldmljZU1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgbW9kdWxlIGZvciAlI3giLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMgPSBtc2RNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKKyAgICBpZiAoaW5wdXRQcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gaW5wdXQgcHJvZmlsZXMgZm9yIE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBkZXZpY2VNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgaWYgKG91dHB1dFByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBvdXRwdXQgcHJvZmlsZXMgZm9yIGRldmljZSAlI3giLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKKyAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBtc2RQcm9maWxlcy5hcHBlbmRWZWN0b3IoaW5Qcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBkZXZpY2VQcm9maWxlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkpIHsKKyAgICAgICAgICAgIGRldmljZVByb2ZpbGVzLmFwcGVuZFZlY3RvcihvdXRQcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBiZXN0U2lua0NvbmZpZzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtc2RQcm9maWxlcy5maW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGRldmljZVByb2ZpbGVzLAorICAgICAgICAgICAgY29tcHJlc3NlZEZvcm1hdHNPcmRlciwgc3Vycm91bmRDaGFubmVsTWFza3NPcmRlciwgdHJ1ZSAvKnByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMqLywKKyAgICAgICAgICAgICZiZXN0U2lua0NvbmZpZyk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRCgiJXMoKSBubyBtYXRjaGluZyBwcm9maWxlcyBmb3VuZCBmb3IgZGV2aWNlOiAlI3gsIGh3QXZTeW5jOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dERldmljZSwgaHdBdlN5bmMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBzaW5rQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIHNpbmtDb25maWctPmNoYW5uZWxfbWFzayA9IGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICBzaW5rQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gRm9yIGVuY29kZWQgc3RyZWFtcyBmb3JjZSBkaXJlY3QgZmxhZyB0byBwcmV2ZW50IGRvd25zdHJlYW0gbWl4aW5nLgorICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgc291cmNlQ29uZmlnLT5zYW1wbGVfcmF0ZSA9IGJlc3RTaW5rQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIC8vIFNwZWNpZnkgZXhhY3QgY2hhbm5lbCBtYXNrIHRvIHByZXZlbnQgZ3Vlc3NpbmcgYnkgYml0IGNvdW50IGluIFBhdGNoUGFuZWwuCisgICAgc291cmNlQ29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGJlc3RTaW5rQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgc291cmNlQ29uZmlnLT5mb3JtYXQgPSBiZXN0U2lua0NvbmZpZy5mb3JtYXQ7CisgICAgLy8gQ29weSBpbnB1dCBzdHJlYW0gZGlyZWN0bHkgd2l0aG91dCBhbnkgcHJvY2Vzc2luZyAoZS5nLiByZXNhbXBsaW5nKS4KKyAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworICAgIGlmIChod0F2U3luYykgeworICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0IHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PigKKyAgICAgICAgICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0IHwgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUgfAorICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLIHwgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUIHwgQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgc2lua0NvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgc291cmNlQ29uZmlnLT5jb25maWdfbWFzayB8PSBjb25maWdfbWFzazsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1BhdGNoQnVpbGRlciBBdWRpb1BvbGljeU1hbmFnZXI6OmJ1aWxkTXNkUGF0Y2goYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSkgY29uc3QKK3sKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UoZ2V0TXNkQXVkaW9JbkRldmljZSgpKS4KKyAgICAgICAgICAgIGFkZFNpbmsoZmluZERldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgb3V0cHV0RGV2aWNlKSk7CisgICAgYXVkaW9fcG9ydF9jb25maWcgc291cmNlQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNvdXJjZXNbMF07CisgICAgYXVkaW9fcG9ydF9jb25maWcgc2lua0NvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zaW5rc1swXTsKKyAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoZXRoZXIgTVNEIG1vZHVsZSBoYXMgSFdfQVZfU1lOQyBmbGFnIHNldCBpbiB0aGUgQVAgY29uZmlnIGZpbGUuCisgICAgLy8gRm9yIG5vdywgd2UganVzdCBmb3JjZWZ1bGx5IHRyeSB3aXRoIEh3QXZTeW5jIGZpcnN0LgorICAgIHN0YXR1c190IHJlcyA9IGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3Iob3V0cHV0RGV2aWNlLCB0cnVlIC8qaHdBdlN5bmMqLywKKyAgICAgICAgICAgICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKSA9PSBOT19FUlJPUiA/IE5PX0VSUk9SIDoKKyAgICAgICAgICAgIGdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgZmFsc2UgLypod0F2U3luYyovLCAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBGb3VuZCBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIGVuY29kZWQgYXVkaW8uIFJlLWNyZWF0ZSBQYXRjaEJ1aWxkZXIgd2l0aCB0aGlzIGNvbmZpZy4KKyAgICAgICAgcmV0dXJuIChQYXRjaEJ1aWxkZXIoKSkuYWRkU291cmNlKHNvdXJjZUNvbmZpZykuYWRkU2luayhzaW5rQ29uZmlnKTsKKyAgICB9CisgICAgQUxPR1YoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZSBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgorICAgICAgICAgICAgIiBzdXBwb3J0aW5nIFBDTSBmb3JtYXQgY29udmVyc2lvbi4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RQYXRjaChhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlKSB7CisgICAgQUxPR1YoIiVzKCkgZm9yIG91dHB1dERldmljZSAlI3giLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlKTsKKyAgICBpZiAob3V0cHV0RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIFVzZSBtZWRpYSBzdHJhdGVneSBmb3IgdW5zcGVjaWZpZWQgb3V0cHV0IGRldmljZS4gVGhpcyBzaG91bGQgb25seQorICAgICAgICAvLyBvY2N1ciBvbiBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKS4gRGV2aWNlIGNvbm5lY3Rpb24gZXZlbnRzIG1heQorICAgICAgICAvLyB0aGVyZWZvcmUgaW52YWxpZGF0ZSBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzLgorICAgICAgICBvdXRwdXREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXIgPSBidWlsZE1zZFBhdGNoKG91dHB1dERldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCA9IHBhdGNoQnVpbGRlci5wYXRjaCgpOworICAgIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgaWYgKCFtc2RQYXRjaGVzLmlzRW1wdHkoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1zZFBhdGNoZXMuc2l6ZSgpID4gMSwKKyAgICAgICAgICAgICAgICAiVGhlIGN1cnJlbnQgTVNEIHByb3RvdHlwZSBvbmx5IHN1cHBvcnRzIG9uZSBvdXRwdXQgcGF0Y2giKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3VycmVudFBhdGNoID0gbXNkUGF0Y2hlcy52YWx1ZUF0KDApOworICAgICAgICBpZiAoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJmN1cnJlbnRQYXRjaC0+bVBhdGNoLCBwYXRjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChjdXJyZW50UGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIC0xIC8qaW5kZXgqLywgbnVsbHB0ciAvKnBhdGNoSGFuZGxlKi8sCisgICAgICAgICAgICBwYXRjaCwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIE1TRCBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIEFMT0dJX0lGKHN0YXR1cyA9PSBOT19FUlJPUiwgIiVzKCkgUGF0Y2ggY3JlYXRlZCBmcm9tIE1TRF9JTiB0byAiCisgICAgICAgICAgICJkZXZpY2U6JSN4IChmb3JtYXQ6JSN4IGNoYW5uZWxzOiUjeCBzYW1wbGVyYXRlOiVkKSIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLCBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkKIHsKICAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKICAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlKCkpLgogICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgotICAgIC8vIDE6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncwotICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgLy8gMzogdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgLy8gNDogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorICAgIC8vIDE6IHRoZSBvdXRwdXQgc3VwcG9ydGluZyBoYXB0aWMgcGxheWJhY2sgd2hlbiByZXF1ZXN0aW5nIGhhcHRpYyBwbGF5YmFjaworICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncworICAgIC8vIDM6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCisgICAgLy8gNDogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gNTogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAogCiAgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTA3NywxOCArMTMwNSw0NiBAQAogICAgIH0KIAogICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7CisgICAgY29uc3Qgc2l6ZV90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGbGFncyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvclByaW1hcnkgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGb3JtYXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdEZvckZsYWdzID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAKKyAgICAvLyBGbGFncyB3aGljaCBtdXN0IGJlIHByZXNlbnQgb24gYm90aCB0aGUgcmVxdWVzdCBhbmQgdGhlIHNlbGVjdGVkIG91dHB1dAorICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrTWFuZGF0ZWRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKTsKKwogICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBoYXB0aWMgb3V0cHV0IGlmIHByZXNlbnQuCisgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGhhcHRpYyBvdXRwdXQsIHNhbWUgYXVkaW8gZm9ybWF0IGFuZCBzYW1wbGUgcmF0ZSBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICBpZiAoaGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBmaXJzdCBvdXRwdXQgdGhhdAorICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgaGFwdGljIHBsYXliYWNrLgorICAgICAgICAgICAgICAgIGlmIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpID49IGhhcHRpY0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIGhhcHRpYyBjaGFubmVsIGlzIG5vdCBzcGVjaWZpZWQsIHNraXAgaGFwdGljIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoa01hbmRhdGVkRmxhZ3MgJiBmbGFncykgIT0KKyAgICAgICAgICAgICAgICAoa01hbmRhdGVkRmxhZ3MgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQogICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CkBAIC0xMTM2LDY3ICsxMzkyLDMyIEBACiAgICAgcmV0dXJuIG91dHB1dHNbMF07CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAotICAgICAgICAgIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5zdGFydCgpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1PdXRwdXRSb3V0ZXMuaW5jUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLQotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2U7Ci0gICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7Ci0gICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4OwotICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKTsKLSAgICAgICAgaWYgKChwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IHBvbGljeU1peC0+bURldmljZVR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1PdXRwdXRSb3V0ZXMuZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBpZiAobmV3RGV2aWNlICE9IG91dHB1dERlc2MtPmRldmljZSgpKSB7Ci0gICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIH0KLQotICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOwotCi0gICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBuZXdEZXZpY2UsIGFkZHJlc3MsICZkZWxheU1zKTsKKyAgICB1aW50MzJfdCBkZWxheU1zOworICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIGNsaWVudCwgJmRlbGF5TXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4Ci0gICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBwb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgfQotCiAgICAgaWYgKGRlbGF5TXMgIT0gMCkgewogICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgIH0KQEAgLTEyMDQsMTYgKzE0MjUsMTUgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVsYXlNcykKIHsKICAgICAvLyBjYW5ub3Qgc3RhcnQgcGxheWJhY2sgb2YgU1RSRUFNX1RUUyBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIGJlaW5nIHVzZWQKICAgICB1aW50MzJfdCBiZWFjb25NdXRlTGF0ZW5jeSA9IDA7CiAKICAgICAqZGVsYXlNcyA9IDA7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOwogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwogICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoQVVESU9fU1RSRUFNX1RUUyAvKnN0cmVhbVRvSWdub3JlKi8pKSB7CkBAIC0xMjMxLDYgKzE0NTEsMTkgQEAKICAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgIChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKIAorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgIHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXg7CisgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOworICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgeworICAgICAgICAgICAgZGV2aWNlID0gcG9saWN5TWl4LT5tRGV2aWNlVHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIHJlcXVpcmVzTXV0ZUNoZWNrIGlzIGZhbHNlIHdoZW4gd2UgY2FuIGJ5cGFzcyBtdXRlIHN0cmF0ZWd5LgogICAgIC8vIEl0IGNvdmVycyBhIGNvbW1vbiBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gbWF0ZXJpYWxseSBhY3RpdmUgYXVkaW8KICAgICAvLyBhbmQgbXV0aW5nIHdvdWxkIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBkZWxheSBhbmQgZHJvcHBlZCBhdWRpby4KQEAgLTEyNDAsMTMgKzE0NzMsMjAgQEAKICAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgogICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKICAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQotICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7CisgICAgb3V0cHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSk7CisKKyAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoZGV2aWNlICE9IG91dHB1dERlc2MtPmRldmljZSgpKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CiAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgIH0KIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxIHx8IGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChvdXRwdXREZXNjLT5zdHJlYW1BY3RpdmVDb3VudChzdHJlYW0pID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwpAQCAtMTI5OSwxMSArMTUzOSw2IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGVXYWl0TXMgPQogICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2UsIGZvcmNlLCAwLCBOVUxMLCBhZGRyZXNzLCByZXF1aXJlc011dGVDaGVjayk7CiAKLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIG91dHB1dERlc2MtPmRldmljZSgpKSwKQEAgLTEzMzcsNTMgKzE1NzIsMzQgQEAKICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CiAgICAgfQogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4CisgICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSAmJiBwb2xpY3lNaXggIT0gTlVMTCAmJgorICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgewotICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RvcHBlZCBvbiBhCi0gICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJvdXRpbmc/Ci0gICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOwotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKLSAgICAgICAgaW50IGFjdGl2aXR5Q291bnQgPSBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGUoc2Vzc2lvbikgJiYgKGFjdGl2aXR5Q291bnQgPT0gMCkpOwotCi0gICAgICAgIGlmIChmb3JjZURldmljZVVwZGF0ZSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiApIHsKICAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwpAQCAtMTM5MSwyNCArMTYwNywzOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KQogewogICAgIC8vIGFsd2F5cyBoYW5kbGUgc3RyZWFtIHN0b3AsIGNoZWNrIHdoaWNoIHN0cmVhbSB0eXBlIGlzIHN0b3BwaW5nCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOworCiAgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwogCi0gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KKyAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoc3RyZWFtKSA+IDApIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPnN0cmVhbUFjdGl2ZUNvdW50KHN0cmVhbSkgPT0gMSkgeworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQorICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBBVURJT19JT19IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IHRydWU7CisgICAgICAgIH0KIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKICAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKLSAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7CisgICAgICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKIAogICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+c3RyZWFtQWN0aXZlQ291bnQoc3RyZWFtKSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7CiAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCkBAIC0xNDU5LDM1ICsxNjg5LDQxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIC8vIElmIGFuIG91dHB1dCBkZXNjcmlwdG9yIGlzIGNsb3NlZCBkdWUgdG8gYSBkZXZpY2Ugcm91dGluZyBjaGFuZ2UsCisgICAgICAgIC8vIHRoZW4gdGhlcmUgYXJlIHJhY2UgY29uZGl0aW9ucyB3aXRoIHJlbGVhc2VPdXRwdXQgZnJvbSB0cmFja3MKKyAgICAgICAgLy8gdGhhdCBtYXkgYmUgZGVzdHJveWVkICh3aXRoIG5vIFBsYXliYWNrVGhyZWFkKSBvciBhIFBsYXliYWNrVGhyZWFkCisgICAgICAgIC8vIGRlc3Ryb3llZCBzaG9ydGx5IHRoZXJlYWZ0ZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIEhlcmUgd2UganVzdCBsb2cgYSB3YXJuaW5nLCBpbnN0ZWFkIG9mIGEgZmF0YWwgZXJyb3IuCisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gUm91dGluZwotICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgeworICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgewogICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmICgtLWRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgewotICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIHN0b3BPdXRwdXQoKSBuZWVkcyB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIGJlZm9yZSByZWxlYXNlT3V0cHV0KCkKKyAgICAvLyBvdGhlcndpc2UgdGhlcmUgbWF5IGJlIGluYWNjdXJhdGUgc3RyZWFtIHJlZmVyZW5jZSBjb3VudHMuCisgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudCBiZWxvdy4KKyAgICBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQocG9ydElkKTsKIH0KIAotCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTE1MDksMTcgKzE3NDUsMjMgQEAKICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKICAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2M7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50RGVzYzsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcjsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworCisgICAgLy8gVGhlIHN1cHBsaWVkIHBvcnRJZCBtdXN0IGJlIEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICBpZiAoKnBvcnRJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KIAogICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKLSAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbW1hcCBjYXB0dXJlOiBpZiBhbiBpbnB1dCBJTyBoYW5kbGUgaXMgc3BlY2lmaWVkLCB3ZSByZXVzZSB0aGlzIGlucHV0IGlmCiAgICAgLy8gcG9zc2libGUKQEAgLTE1MzIsOCArMTc3NCw4IEBACiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKKyAgICAgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dERlc2MtPmdldENsaWVudHNGb3JTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sICppbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTU0MiwyOSArMTc4NCwyOCBAQAogICAgICAgICAvLyBUaGUgc2Vjb25kIGNhbGwgaXMgZm9yIHRoZSBmaXJzdCBhY3RpdmUgY2xpZW50IGFuZCBzZXRzIHRoZSBVSUQuIEFueSBmdXJ0aGVyIGNhbGwKICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYSBuZXcgY2xpZW50IGFuZCBpcyBvbmx5IHBlcm1pdHRlZCBmcm9tIHRoZSBzYW1lIFVJRC4KICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IFVJRCBpcyBzaWxlbmNlZCwgYWxsb3cgYSBuZXcgVUlEIGNvbm5lY3Rpb24gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgVUlECi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9TZXNzaW9uLT51aWQoKSAhPSB1aWQpIHsKLSAgICAgICAgICAgIGlmICghYXVkaW9TZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3Igc2Vzc2lvbiAlZCB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBtYXAgaXMgb3JkZXJlZCBieSBrZXkgdmFsdWVzIChwb3J0SWQpIGFuZCBwb3J0SWRzIGFyZSBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbHkuIFNvIHRoZSBmaXJzdCBjbGllbnQgaW4gdGhpcyBsaXN0IGlzIHRoZSBvbmUgb3BlbmVkIGJ5IGF1ZGlvIGZsaW5nZXIKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBtbWFwIHN0cmVhbSBpcyBjcmVhdGVkIGFuZCBzaG91bGQgYmUgaWdub3JlZCBhcyBpdCBkb2VzIG5vdCBjb3JyZXNwb25kCisgICAgICAgICAgICAgICAgLy8gdG8gYW4gYWN0dWFsIGNsaWVudAorICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gKmNsaWVudHMuY2JlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1aWQgIT0gY2xpZW50LT51aWQoKSAmJiAhY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIGNsaWVudCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsIGNsaWVudC0+cG9ydElkKCksIGNsaWVudC0+dWlkKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwotICAgICAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShpbnB1dERlc2MtPm1EZXZpY2UpOwotICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgICAgIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZGV2aWNlID0gaW5wdXREZXNjLT5tRGV2aWNlOwogCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTU3MiwxMyArMTgxMyw2IEBACiAKICAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwogCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBwb3J0IElECi0gICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICB9Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOwotCiAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCiAgICAgICAgICAgICBzdHJuY21wKGF0dHItPnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKCphdHRyLCAmcG9saWN5TWl4KTsKQEAgLTE1ODksNyArMTgyMywxMSBAQAogICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBkZXZpY2VEZXNjLT50eXBlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgJnBvbGljeU1peCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMTYxOCw3ICsxODU2LDcgQEAKIAogICAgIH0KIAotICAgICppbnB1dCA9IGdldElucHV0Rm9yRGV2aWNlKGRldmljZSwgYWRkcmVzcywgc2Vzc2lvbiwgdWlkLCBpbnB1dFNvdXJjZSwKKyAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIGFkZHJlc3MsIHNlc3Npb24sIGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKICAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC0xNjI2LDE3ICsxODY0LDI3IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworZXhpdDoKIAotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGdldEZpcnN0RGV2aWNlSWQoaW5wdXREZXZpY2VzKTsKKworICAgIGlzU291bmRUcmlnZ2VyID0gaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbikgPiAwOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgY2xpZW50RGVzYyA9IG5ldyBSZWNvcmRDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXR0ciwgKmNvbmZpZywgcmVxdWVzdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsZmxhZ3MsIGlzU291bmRUcmlnZ2VyKTsKKyAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKCppbnB1dCk7CisgICAgaW5wdXREZXNjLT5hZGRDbGllbnQoY2xpZW50RGVzYyk7CisKKyAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgcmV0dXJucyBpbnB1dCAlZCB0eXBlICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLAorICAgICAgICAgICAgKmlucHV0LCAqaW5wdXRUeXBlLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnBvcnRJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiAKIGVycm9yOgotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjQ0LDcgKzE4OTIsNiBAQAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC0xNzA2LDg2ICsxOTUzLDQxIEBACiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IG5ldyBBdWRpb1Nlc3Npb24oc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICAvLyByZXVzZSBhbiBvcGVuIGlucHV0IGlmIHBvc3NpYmxlCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IHJldXNlZElucHV0RGVzYzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIC8vIHJldXNlIGlucHV0IGlmOgotICAgICAgICAvLyAtIGl0IHNoYXJlcyB0aGUgc2FtZSBwcm9maWxlCi0gICAgICAgIC8vICAgICAgQU5ECi0gICAgICAgIC8vIC0gaXQgaXMgbm90IGEgcmVyb3V0ZSBzdWJtaXggaW5wdXQKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpczogbm90IHVzZWQgZm9yIHNvdW5kIHRyaWdnZXIKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgT1IKLSAgICAgICAgLy8gICAgICAgICAgdXNlZCBmb3Igc291bmQgdHJpZ2dlciBhbmQgYWxsIGNsaWVudHMgdXNlIHRoZSBzYW1lIHNlc3Npb24gSUQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSAmJgotICAgICAgICAgICAgKGlzU291bmRUcmlnZ2VyID09IGRlc2MtPmlzU291bmRUcmlnZ2VyKCkpICYmCi0gICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFzID0gZGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGFzICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdW5tYXRjaGluZyBwcm9wZXJ0aWVzIG9uIHNhbWUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGlmIChhcy0+bWF0Y2hlcyhhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgcmVjb3JkIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgIHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBzb3VuZCB0cmlnZ2VyLCByZXVzZSBpbnB1dCBpZiB1c2VkIGJ5IG90aGVyIHNvdW5kIHRyaWdnZXIgb24gc2FtZSBzZXNzaW9uCisgICAgICAgICAgICAvLyBlbHNlCisgICAgICAgICAgICAvLyAgICByZXVzZSBpbnB1dCBpZiBhY3RpdmUgY2xpZW50IGFwcCBpcyBub3QgaW4gSURMRSBzdGF0ZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QoKTsKKyAgICAgICAgICAgIGJvb2wgZG9DbG9zZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU291bmRUcmlnZ2VyICE9IGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU291bmRUcmlnZ2VyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBjbGllbnQtPnNlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgY2xpZW50LT5hcHBTdGF0ZSgpICE9IEFQUF9TVEFURV9JRExFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvQ2xvc2UgPSB0cnVlOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXVzZSB0aGUgYWxyZWFkeSBvcGVuZWQgaW5wdXQgc3RyZWFtIG9uIHRoaXMgcHJvZmlsZSBpZjoKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBjYXB0dXJlIHNvdXJjZSBpcyBiYWNrZ3JvdW5kIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBwYXRoIHJlcXVlc3RlZCBjb25maWd1cmF0aW9ucyBtYXRjaCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IHNvdXJjZSBwcmlvcml0eSBpcyBsZXNzIHRoYW4gdGhlIGhpZ2hlc3Qgc291cmNlIHByaW9yaXR5IG9uIHRoaXMgaW5wdXQKLSAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gY2Fubm90IGJlIHJldXNlZCwgY2xvc2UgaXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBwcm9maWxlIGZvciB0aGUgbmV3IGNsaWVudCBzbyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGF0aCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY29uZmlnLT5jaGFubmVsX21hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgY29uZmlnLT5mb3JtYXQpKSAmJgotICAgICAgICAgICAgICAgICAgICAoc291cmNlX3ByaW9yaXR5KGRlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShmYWxzZSAvKmFjdGl2ZU9ubHkqLykpIDwKLSAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wcmlvcml0eShpbnB1dFNvdXJjZSkpKSkgewotICAgICAgICAgICAgICAgIHJldXNlZElucHV0RGVzYyA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZG9DbG9zZSkgeworICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQoZGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiByZXVzaW5nIGlucHV0ICVkIiwgX19GVU5DVElPTl9fLCBtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmV1c2VkSW5wdXREZXNjICE9IDApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBzZXNzaW9ucyA9IHJldXNlZElucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyhmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBjdXJyZW50U2Vzc2lvbiA9IHNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgc3RvcElucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgfQotCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKICAgICBhdWRpb19jb25maWdfdCBsQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwpAQCAtMTc5NCw5ICsxOTk2LDkgQEAKICAgICBsQ29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CiAKICAgICBpZiAoYWRkcmVzcyA9PSAiIikgewotICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgICAgICAvLyB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcyA6IFN0cmluZzgoIiIpOworICAgICAgICBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGlucHV0RGV2aWNlcyk7CiAgICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKCZsQ29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsCkBAIC0xODE3LDcgKzIwMTksNiBAQAogICAgIH0KIAogICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKLSAgICBpbnB1dERlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwogCiAgICAgYWRkSW5wdXQoaW5wdXQsIGlucHV0RGVzYyk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwpAQCAtMTgyNSwzODkgKzIwMjYsMTc4IEBACiAgICAgcmV0dXJuIGlucHV0OwogfQogCi0vL3N0YXRpYwotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VycmVudFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgcmV0dXJuIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHx8Ci0gICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKTsKLX0KKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYywKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKQotewotICAgIC8vIERvIG5vdCBhbGxvdyBjYXB0dXJlIGlmIGFuIGFjdGl2ZSB2b2ljZSBjYWxsIGlzIHVzaW5nIGEgc29mdHdhcmUgcGF0Y2ggYW5kCi0gICAgLy8gdGhlIGNhbGwgVFggc291cmNlIGRldmljZSBpcyBvbiB0aGUgc2FtZSBIVyBtb2R1bGUuCi0gICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKLSAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoCi0gICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwICYmCi0gICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gc3RhcnRpbmcgY29uY3VycmVudCBjYXB0dXJlIGlzIGVuYWJsZWQgaWY6Ci0gICAgLy8gMSkgY2FwdHVyaW5nIGZvciByZS1yb3V0aW5nCi0gICAgLy8gMikgY2FwdHVyaW5nIGZvciBIT1RXT1JEIHNvdXJjZQotICAgIC8vIDMpIGNhcHR1cmluZyBmb3IgRk0gVFVORVIgc291cmNlCi0gICAgLy8gMykgQWxsIG90aGVyIGFjdGl2ZSBjYXB0dXJlcyBhcmUgZWl0aGVyIGZvciByZS1yb3V0aW5nIG9yIEhPVFdPUkQKLQotICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpIHx8Ci0gICAgICAgICAgICBpc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZUlucHV0IDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShhY3RpdmVJbnB1dC0+aW5wdXRTb3VyY2UodHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGFjdGl2ZUlucHV0LT5tRGV2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZJWE1FOiByZW1vdmUgd2hlbiBjb25jdXJyZW50IGNhcHR1cmUgaXMgcmVhZHkuIFRoaXMgaXMgYSBoYWNrIHRvIHdvcmsgYXJvdW5kIGJ1ZyBiLzYzMDgzNTM3LgotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSB7Ci0gICAgaWYgKCFtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKSB7Ci0gICAgICAgIGJvb2wgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IGZhbHNlOwotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IDA7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKiBuTW9kdWxlcyA9IE5VTEw7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhuTW9kdWxlcywgJm51bU1vZHVsZXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG51bU1vZHVsZXMgIT0gMCkgewotICAgICAgICAgICAgbk1vZHVsZXMgPSAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IqKSBjYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXMsIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOwotICAgICAgICAgICAgaWYgKG5Nb2R1bGVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgLy8gV2UgZmFpbGVkIHRvIG1hbGxvYyB0aGUgYnVmZmVyLCBzbyBqdXN0IHNheSBubyBmb3Igbm93LCBhbmQgaG9wZSB0aGF0IHdlIGhhdmUgbW9yZQotICAgICAgICAgICAgICAvLyByYW0gdGhlIG5leHQgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIG1vZHVsZSBkZXNjcmlwdG9ycyIpOwotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1cyA9IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMobk1vZHVsZXMsICZudW1Nb2R1bGVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU1vZHVsZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlICY9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vZHVsZXNbaV0ucHJvcGVydGllcy5jb25jdXJyZW50X2NhcHR1cmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShuTW9kdWxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotICAgICAgICBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCAqY29uY3VycmVuY3kpCi17Ci0KLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGlucHV0OiVkLCBzZXNzaW9uOiVkLCBzaWxlbmNlZDolZCwgY29uY3VycmVuY3k6JWQpIiwKLSAgICAgICAgICAgIGlucHV0LCBzZXNzaW9uLCBzaWxlbmNlZCwgKmNvbmN1cnJlbmN5KTsKLQotICAgICpjb25jdXJyZW5jeSA9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0vLyBGSVhNRTogZGlzYWJsZSBjb25jdXJyZW50IGNhcHR1cmUgdW50aWwgVUkgaXMgcmVhZHkKLSNpZiAwCi0gICAgaWYgKCFpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGlucHV0RGVzYywgYXVkaW9TZXNzaW9uKSkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdGFydGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEw7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBjbGllbnQtPnNlc3Npb24oKTsKKworICAgIEFMT0dWKCIlcyBpbnB1dDolZCwgc2Vzc2lvbjolZCkiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBzZXNzaW9uKTsKKworICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPnN0YXJ0KCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcygpICE9IDApIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgIH0KLSNlbHNlCi0gICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7Ci0gICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBjYWxsIGluIHByb2dyZXNzIiwgaW5wdXQpOwotICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPj4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLQotICAgICAgICAvLyBJZiBhIFVJRCBpcyBpZGxlIGFuZCByZWNvcmRzIHNpbGVuY2UgYW5kIGFub3RoZXIgbm90IHNpbGVuY2VkIHJlY29yZGluZyBzdGFydHMKLSAgICAgICAgLy8gZnJvbSBhbm90aGVyIFVJRCAoaWRsZSBvciBhY3RpdmUpIHdlIHN0b3AgdGhlIGN1cnJlbnQgaWRsZSBVSUQgcmVjb3JkaW5nIGluCi0gICAgICAgIC8vIGZhdm9yIG9mIHRoZSBuZXcgb25lIC0gIlRoZXJlIGNhbiBiZSBvbmx5IG9uZSIgVE0KLSAgICAgICAgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldElkKCkgPT0gaW5wdXREZXNjLT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucygKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24tPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb25JZCA9IGFjdGl2ZVNlc3Npb24tPnNlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBzdG9wcGluZyBzaWxlbmNlZCBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhY3RpdmVTb3VyY2UgPSBhY3RpdmVEZXNjLT5pbnB1dFNvdXJjZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNQcmVlbXB0ZWRTZXNzaW9uKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQgZm9yIEhPVFdPUkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZmFpbGVkIGZvciBIT1RXT1JEOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNvdW5kIHRyaWdnZXIgc2Vzc2lvbiBzdXBwb3J0cyBjb25jdXJyZW50IGNhcHR1cmUgaWYgdGhlCi0gICAgICAgIC8vIGlucHV0IGlzIGFsc28gYSBzb3VuZCB0cmlnZ2VyIGlucHV0LiBPdGhlcndpc2UsIHdlIHNob3VsZCBwcmVlbXB0IGFueSBob3R3b3JkIHN0cmVhbQotICAgICAgICAvLyB0aGF0J3MgcnVubmluZy4KLSAgICAgICAgY29uc3QgYm9vbCBhbGxvd0NvbmN1cnJlbnRXaXRoU291bmRUcmlnZ2VyID0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSA/IHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKSA6IGZhbHNlOwotCi0gICAgICAgIC8vIGlmIGNhcHR1cmUgaXMgYWxsb3dlZCwgcHJlZW1wdCBjdXJyZW50bHkgYWN0aXZlIEhPVFdPUkQgY2FwdHVyZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogYWN0aXZlSW5wdXRzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciAmJiBhY3RpdmVEZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwotICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFByZWVtcHRlZFNlc3Npb25zKHNlc3Npb25zKTsKLSAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgZm9yIEhPVFdPUkQgcHJlZW1wdGluZyBIT1RXT1JEIGlucHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gTWFrZSBzdXJlIHdlIHN0YXJ0IHdpdGggdGhlIGNvcnJlY3Qgc2lsZW5jZSBzdGF0ZQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOwotCi0gICAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKKyAgLy8gaW5jcmVtZW50IGFjdGl2aXR5IGNvdW50IGJlZm9yZSBjYWxsaW5nIGdldE5ld0lucHV0RGV2aWNlKCkgYmVsb3cgYXMgb25seSBhY3RpdmUgc2Vzc2lvbnMKICAgICAvLyBhcmUgY29uc2lkZXJlZCBmb3IgZGV2aWNlIHNlbGVjdGlvbgotICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgorICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CisgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAKLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDEgfHwgbUlucHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7Ci0gICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKGlucHV0RGVzYy0+YWN0aXZlQ291bnQoKSAgPT0gMSkgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKLSAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKLSAgICAgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOworICAgIEFMT0dWKCIlcyBpbnB1dCAlZCBzb3VyY2UgPSAlZCBleGl0IiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5zb3VyY2UoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmICghY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RvcHBlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgtMSk7CisgICAgaW5wdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+c3RvcCgpOwotICAgICAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBpbnB1dERlc2MtPm1EZXZpY2U7Ci0gICAgICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOworICAgIGlucHV0RGVzYy0+c3RvcCgpOworICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7CisKKyAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCisgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOwogCi0gICAgLy8gUm91dGluZwotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICBBTE9HVigiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0KTsKIAotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKyAgICBpbnB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOwogCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBvbiBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoLTEpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5yZW1vdmVBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0RGVzYy0+Z2V0T3BlblJlZkNvdW50KCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgIGlmIChpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCIlcyglZCkgJXp1IGNsaWVudHMgcmVtYWluaW5nIiwgX19mdW5jX18sIHBvcnRJZCwgaW5wdXREZXNjLT5nZXRDbGllbnRDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGNsb3NlSW5wdXQoaW5wdXQpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCIpOworICAgIEFMT0dWKCIlcyBleGl0IiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWN0aXZlQ2xpZW50cyhjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0KQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXQtPmNsaWVudHNMaXN0KHRydWUpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGNsb3NlQ2xpZW50KGNsaWVudC0+cG9ydElkKCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIHN0b3BJbnB1dChwb3J0SWQpOworICAgIHJlbGVhc2VJbnB1dChwb3J0SWQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7CkBAIC0yMjI0LDcgKzIyMTQsNiBAQAogICAgICAgICB9CiAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICB9Ci0gICAgbUlucHV0Um91dGVzLmNsZWFyKCk7CiAgICAgbUlucHV0cy5jbGVhcigpOwogICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwpAQCAtMjI5MywxMSArMjI4MiwxMCBAQAogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBkZXNjLT5kZXZpY2UoKTsKICAgICAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIShzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pIHx8IGlzSW5DYWxsKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKQEAgLTIzMTUsMTMgKzIzMDMsMTUgQEAKICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gcmVzY2FsZSBpbmRleCBiZWZvcmUgYXBwbHlpbmcgdG8gY3VyU3RyZWFtIGFzIHJhbmdlcyBtYXkgYmUgZGlmZmVyZW50IGZvcgorICAgICAgICAgICAgLy8gc3RyZWFtIGFuZCBjdXJTdHJlYW0KKyAgICAgICAgICAgIGludCBpZHggPSByZXNjYWxlVm9sdW1lSW5kZXgoaW5kZXgsIHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgICAgIGlmIChhcHBseVZvbHVtZSkgewogICAgICAgICAgICAgICAgIC8vRklYTUU6IHdvcmthcm91bmQgZm9yIHRydW5jYXRlZCB0b3VjaCBzb3VuZHMKICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIHZvbHVtZSBjaGFuZ2UgZm9yIHN5c3RlbSBzdHJlYW0gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzCiAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBzeXN0ZW0gVUkKICAgICAgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpZHgsIGRlc2MsIGN1ckRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pID8gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKTsKICAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKQEAgLTI0NDEsNiArMjQzMSwzMyBAQAogICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUVmZmVjdHMuZ2V0RWZmZWN0KGlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdHMuaXNFZmZlY3RFbmFibGVkKGlkKSkgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVkIGVuYWJsZWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgc2V0RWZmZWN0RW5hYmxlZChpZCwgZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSBtRWZmZWN0cy5nZXRFZmZlY3QoaWQpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtSW5wdXRzLnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CkBAIC0yNTAwLDEyICsyNTE3LDEzIEBACiAgICAgc3A8SHdNb2R1bGU+IHJTdWJtaXhNb2R1bGU7CiAgICAgLy8gZXhhbWluZSBlYWNoIG1peCdzIHJvdXRlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEF1ZGlvTWl4IG1peCA9IG1peGVzW2ldOwogICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLIG9yIE1JWF9ST1VURV9GTEFHX1JFTkRFUiwgbm90IHRoZSBjb21iaW5hdGlvbgotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfQUxMKSA9PSBNSVhfUk9VVEVfRkxBR19BTEwpIHsKKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19BTEwpID09IE1JWF9ST1VURV9GTEFHX0FMTCkgewogICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewogICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOwogICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewogICAgICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKApAQCAtMjUxOCwxNSArMjUzNiwyMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4LCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXgubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CiAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgogICAgICAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KICAgICAgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CkBAIC0yNTM2LDcgKzI1NTksNyBAQAogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwogCi0gICAgICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOwpAQCAtMjU0NSw5ICsyNTY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gbWl4ZXNbaV0ubURldmljZVR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gbWl4Lm1EZXZpY2VUeXBlOwogICAgICAgICAgICAgQUxPR1YoIiByZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgUkVOREVSLCBkZXY9MHglWCBhZGRyPSVzIiwKICAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwogCkBAIC0yNTYwLDcgKzI1ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS50eXBlID09IGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdHJuY21wKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCBhZGRyZXNzLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCBkZXNjKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peCwgZGVzYykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRPdXRwdXQgPSB0cnVlOwpAQCAtMjYzOCw1NyArMjY2MSw2MiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3RleHByIHNpemVfdCBhdWRpb0Zvcm1hdFByZWZpeExlbiA9IHNpemVvZigiQVVESU9fRk9STUFUXyIpOworICAgIGZvciAoY29uc3QgYXV0byYgZm10IDogbU1hbnVhbFN1cnJvdW5kRm9ybWF0cykgeworICAgICAgICBpZiAoaSsrICE9IDApIGRzdC0+YXBwZW5kKCIsICIpOworICAgICAgICBzdGQ6OnN0cmluZyBzZm10OworICAgICAgICBGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKGZtdCwgc2ZtdCk7CisgICAgICAgIGRzdC0+YXBwZW5kKHNmbXQuc2l6ZSgpID49IGF1ZGlvRm9ybWF0UHJlZml4TGVuID8KKyAgICAgICAgICAgICAgICBzZm10LmNfc3RyKCkgKyBhdWRpb0Zvcm1hdFByZWZpeExlbiAtIDEgOiBzZm10LmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CisgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyKiBmb3JjZVVzZXNbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0geworICAgICAgICAiY29tbXVuaWNhdGlvbnMiLCAibWVkaWEiLCAicmVjb3JkIiwgImRvY2siLCAic3lzdGVtIiwKKyAgICAgICAgIkhETUkgc3lzdGVtIGF1ZGlvIiwgImVuY29kZWQgc3Vycm91bmQgb3V0cHV0IiwgInZpYnJhdGUgcmluZ2luZyIgfTsKKyAgICBmb3IgKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBpID0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOworICAgICAgICAgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpID0gKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCkoKGludClpICsgMSkpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZVZhbHVlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoaSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9yY2UgdXNlIGZvciAlczogJWQiLCBmb3JjZVVzZXNbaV0sIGZvcmNlVXNlVmFsdWUpOworICAgICAgICBpZiAoaSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQgJiYKKyAgICAgICAgICAgICAgICBmb3JjZVVzZVZhbHVlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIiAoTUFOVUFMOiAiKTsKKyAgICAgICAgICAgIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoZHN0KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29uZmlnIHNvdXJjZTogJXNcbiIsIG1Db25maWcuZ2V0U291cmNlKCkuY19zdHIoKSk7IC8vIGdldENvbmZpZyBub3QgY29uc3QKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlc0FsbC5kdW1wKGRzdCk7CisgICAgbU91dHB1dHMuZHVtcChkc3QpOworICAgIG1JbnB1dHMuZHVtcChkc3QpOworICAgIG1Wb2x1bWVDdXJ2ZXMtPmR1bXAoZHN0KTsKKyAgICBtRWZmZWN0cy5kdW1wKGRzdCk7CisgICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGRzdCk7CisgICAgbVBvbGljeU1peGVzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9Tb3VyY2VzLmR1bXAoZHN0KTsKK30KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKGludCBmZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLAotICAgICAgICAgICAgIGhhc1ByaW1hcnlPdXRwdXQoKSA/IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHN0ZDo6c3RyaW5nIHN0YXRlTGl0ZXJhbDsKLSAgICBBdWRpb01vZGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSwgc3RhdGVMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVzXG4iLCBzdGF0ZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAotICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBtZWRpYSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciByZWNvcmQgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBzeXN0ZW0gJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGhkbWkgc3lzdGVtIGF1ZGlvICVkXG4iLAotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBlbmNvZGVkIHN1cnJvdW5kIG91dHB1dCAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgVFRTIG91dHB1dCAlc1xuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICJhdmFpbGFibGUiIDogIm5vdCBhdmFpbGFibGUiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQorICAgIGR1bXAoJnJlc3VsdCk7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgb3V0cHV0IikpOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOwotICAgIG1Id01vZHVsZXNBbGwuZHVtcChmZCk7Ci0gICAgbU91dHB1dHMuZHVtcChmZCk7Ci0gICAgbUlucHV0cy5kdW1wKGZkKTsKLSAgICBtVm9sdW1lQ3VydmVzLT5kdW1wKGZkKTsKLSAgICBtRWZmZWN0cy5kdW1wKGZkKTsKLSAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZmQpOwotICAgIG1Qb2xpY3lNaXhlcy5kdW1wKGZkKTsKLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjcwOSwxMiArMjczNyw5IEBACiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAotICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7Ci0gICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7CisgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KQEAgLTI3MzMsOSArMjc1OCwxMiBAQAogICAgIH0KIAogICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCi0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKLSAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgewotICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICBjb25zdCBpbnQgbWluX2R1cmF0aW9uX3NlY3MgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIC0xIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworICAgIGlmIChtaW5fZHVyYXRpb25fc2VjcyA+PSAwKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IG1pbl9kdXJhdGlvbl9zZWNzICogMTAwMDAwMExMKSB7CisgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtaW5fZHVyYXRpb25fc2Vjcyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgewpAQCAtMjc1NSwxNSArMjc4MywzNCBAQAogCiAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCiAgICAgLy8gQVVESU9fREVWSUNFX05PTkUKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOwogICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRfZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsIG91dHB1dF9mbGFncyk7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOworICAgIEFMT0dWKCIlcygpIHByb2ZpbGUgJXNmb3VuZCB3aXRoIG5hbWU6ICVzLCAiCisgICAgICAgICJzYW1wbGUgcmF0ZTogJXUsIGZvcm1hdDogMHgleCwgY2hhbm5lbF9tYXNrOiAweCV4LCBvdXRwdXQgZmxhZ3M6IDB4JXgiLAorICAgICAgICBfX0ZVTkNUSU9OX18sIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiLAorICAgICAgICAocHJvZmlsZSAhPSAwID8gcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpIDogIm51bGwiKSwKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI4NzIsOCArMjkxOSw3IEBACiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdwpAQCAtMjk0Niw3ICsyOTkyLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hZGRyZXNzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCkBAIC0zMDAzLDcgKzMwNDksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKQEAgLTMwNjYsOCArMzExMiwxMCBAQAogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgogICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAorICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wIGJ1dCBubyByb3V0ZSBoYXMgYmVlbiBkZWNsYXJlZCBiZXR3ZWVuIGRldmljZXMKICAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2VEZXNjKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIChzcmNEZXZpY2VEZXNjLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3JjRGV2aWNlRGVzYy0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlRGVzYywgc2lua0RldmljZURlc2MpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBkZXZpY2UgZm9yIG5vdyB0byBzaW1wbGlmeSBvdXRwdXQgc2VsZWN0aW9uIGxvZ2ljCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzA3Niw5ICszMTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+dHlwZSgpLCBtT3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKQEAgLTMwOTIsMjggKzMxMzgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZnJvbSByb3V0aW5nIGNhcGFiaWxpdGllcyBpbiBjb25maWcgZmlsZSBhbmQgb3RoZXIgY29uZmxpY3RpbmcgcGF0Y2hlcwogCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmbmV3UGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJm5ld1BhdGNoLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIGluZGV4LCBoYW5kbGUsICZuZXdQYXRjaCwgMCwgdWlkLCAmcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzI0NiwxMCArMzI3MiwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZyA9IHt9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWcgPSB7fTsKICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOwogICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOwogICAgIH0KQEAgLTMzMTAsMTIgKzMzMzYsMTIgQEAKIHsKICAgICAvLyByZW1vdmUgb3V0cHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKICAgICBTb3J0ZWRWZWN0b3I8cm91dGluZ19zdHJhdGVneT4gYWZmZWN0ZWRTdHJhdGVnaWVzOwotICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbU91dHB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLmFkZChnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3koY2xpZW50LT5zdHJlYW0oKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzMyNiwxMiArMzM1MiwxMiBAQAogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc291cmNlX3Q+IGFmZmVjdGVkU291cmNlczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1JbnB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAocm91dGUtPm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQocm91dGUtPm1Tb3VyY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgY2xpZW50LT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgIGFmZmVjdGVkU291cmNlcy5hZGQoY2xpZW50LT5zb3VyY2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzM5LDcgKzMzNjUsNyBAQAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzVG9DbG9zZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+aW5wdXRTb3VyY2UoKSkgPj0gMCkgeworICAgICAgICBpZiAoYWZmZWN0ZWRTb3VyY2VzLmluZGV4T2YoaW5wdXREZXNjLT5zb3VyY2UoKSkgPj0gMCkgewogICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5hZGQoaW5wdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM1MSw4ICszMzc3LDggQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvU291cmNlcyh1aWRfdCB1aWQpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tVWlkID09IHVpZCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+dWlkKCkgPT0gdWlkKSB7CiAgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlcy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzcwLDIwICszMzk2LDIzIEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7Ci0gICAgQUxPR1YoIiVzIHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOwotICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBhcmd1bWVudDogc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotCiAgICAgaWYgKHNvdXJjZS0+cm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8CiAgICAgICAgICAgICBzb3VyY2UtPnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBBTE9HVigiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOworICAgICAgICBBTE9HVygiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0zMzkxLDUzICszNDIwLDY0IEBACiAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZS0+ZXh0LmRldmljZS5hZGRyZXNzKSk7CiAgICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVigiJXMgc291cmNlLT5leHQuZGV2aWNlLnR5cGUgJTA4eCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgQUxPR1coIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9Ci0gICAgICAgICAgICBuZXcgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKHNyY0RldmljZURlc2MsIGF0dHJpYnV0ZXMsIHVpZCk7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaDsKKyAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBkdW1teVBhdGNoID0ge307CiAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJmR1bW15UGF0Y2gsIHVpZCk7Ci0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYyA9IHBhdGNoRGVzYzsKKworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQorICAgICAgICBuZXcgU291cmNlQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsICphdHRyaWJ1dGVzLCBwYXRjaERlc2MsIHNyY0RldmljZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChhdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyYXRlZ3lGb3JBdHRyKGF0dHJpYnV0ZXMpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpLCBzb3VyY2VEZXNjKTsKLSAgICAgICAgKmhhbmRsZSA9IHNvdXJjZURlc2MtPmdldEhhbmRsZSgpOworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZCgqcG9ydElkLCBzb3VyY2VEZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAKICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBoYXZlIG9uZSBwYXRjaCBwZXIgc291cmNlLgogICAgIGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0gc291cmNlRGVzYy0+bURldmljZTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPSBzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKTsKIAogICAgIGF1ZGlvX2RldmljZXNfdCBzaW5rRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUpOwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShzaW5rRGV2aWNlLCBTdHJpbmc4KCIiKSk7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tUGF0Y2g7CiAKLSAgICBpZiAoc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpID09Ci0gICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMyAmJgorICAgIGlmIChzcmNEZXZpY2VEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlRGVzYykgJiYKKyAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldE1vZHVsZVZlcnNpb25NYWpvcigpID49IDMgJiYKKyAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2VEZXNjLCBzaW5rRGV2aWNlRGVzYykgJiYKICAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBBTE9HVigiJXMgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dWKCIlcyBEZXZpY2UgdG8gRGV2aWNlIHJvdXRlIHN1cHBvcnRlZCBieSA+PTMuMCBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvLyBUT0RPOiBtYXkgZXhwbGljaXRseSBzcGVjaWZ5IHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBIVyBvciBTVyBwYXRjaAogICAgICAgICAvLyAgIGNyZWF0ZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgLy8gICBjcmVhdGUgSHdvdXRwdXQgYW5kIGFkZCB0byBtSHdPdXRwdXRzCiAgICAgfSBlbHNlIHsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNvdXJjZURlc2MtPmNvbmZpZygpLnNhbXBsZV9yYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gc291cmNlRGVzYy0+Y29uZmlnKCkuY2hhbm5lbF9tYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gc291cmNlRGVzYy0+Y29uZmlnKCkuZm9ybWF0OworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywgJnN0cmVhbSwgc291cmNlRGVzYy0+dWlkKCksICZjb25maWcsICZmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zNDU3LDUxICszNDk3LDU2IEBACiAgICAgICAgIC8vIGJlIGNvbm5lY3RlZCBhcyB3ZWxsIGFzIHRoZSBzdHJlYW0gdHlwZSBmb3Igdm9sdW1lIGNvbnRyb2wKICAgICAgICAgLy8gLSB0aGUgc2luayBpcyBkZWZpbmVkIGJ5IHdoYXRldmVyIG91dHB1dCBkZXZpY2UgaXMgY3VycmVudGx5IHNlbGVjdGVkIGZvciB0aGUgb3V0cHV0CiAgICAgICAgIC8vIHRob3VnaCB3aGljaCB0aGlzIHBhdGNoIGlzIHJvdXRlZC4KLSAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9IDA7Ci0gICAgICAgIHBhdGNoLT5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1swXSwgTlVMTCk7Ci0gICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1sxXSwgTlVMTCk7Ci0gICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLAorICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNyY0RldmljZURlc2MpLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBzdHJlYW0gfSk7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgIEFMT0dWKCIlcyBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1QYXRjaCA9ICpwYXRjaEJ1aWxkZXIucGF0Y2goKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChzb3VyY2VEZXNjLT5wb3J0SWQoKSkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBwb3J0SWQgaGFzIGFscmVhZHkgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXREZXNjIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKKwogICAgICAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLSAgICAgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBzaW5rRGV2aWNlLCBOVUxMLCAmZGVsYXlNcyk7CisgICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHNvdXJjZURlc2MsICZkZWxheU1zKTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwogICAgICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSwgc291cmNlRGVzYy0+bVBhdGNoRGVzYyk7CisgICAgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTQ5LDUwICszNTk0LDYgQEAKICAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKSB7Ci0gICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFN0cmluZzggcmVwbHk7Ci0gICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGlvSGFuZGxlLCBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSk7Ci0gICAgQUxPR1YoIiVzOiBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsIF9fRlVOQ1RJT05fXywgcmVwbHkuc3RyaW5nKCkpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKLSAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAotICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksIHJlcGx5KSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBmb3JtYXQsIGJhaWxpbmcgb3V0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGZvcm1hdCA6IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKSkgewotICAgICAgICAvLyBPbmx5IEFVRElPX0ZPUk1BVF9BQUNfTEMgd2lsbCBiZSB1c2VkIGluIFNldHRpbmdzIFVJIGZvciBhbGwgQUFDIGZvcm1hdHMuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBBQUNfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUNfTEM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBleGlzdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gZm9ybWF0c1tpXSkgewotICAgICAgICAgICAgICAgIGV4aXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChTVVJST1VORF9GT1JNQVRTW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhpc3QgJiYgaXNTdXJyb3VuZEZvcm1hdCkgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCkBAIC0zNjAyLDE2NCArMzYwMyw5OSBAQAogICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRTdXJyb3VuZEZvcm1hdHMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAiLAotICAgICAgICAgICAgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKLQotICAgIC8vIE9ubHkgcmV0dXJuIHZhbHVlIGlmIHRoZXJlIGlzIEhETUkgb3V0cHV0LgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCByZXBvcnRlZCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiAKICAgICBzaXplX3QgZm9ybWF0c1dyaXR0ZW4gPSAwOwogICAgIHNpemVfdCBmb3JtYXRzTWF4ID0gKm51bVN1cnJvdW5kRm9ybWF0czsKLSAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gMDsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdHM7IC8vIFVzZXMgcHJpbWFyeSBzdXJyb3VuZCBmb3JtYXRzIG9ubHkKICAgICBpZiAocmVwb3J0ZWQpIHsKLSAgICAgICAgLy8gT25seSBnZXQgc3Vycm91bmQgZm9ybWF0cyB3aGljaCBhcmUgcmVwb3J0ZWQgYnkgZGV2aWNlLgotICAgICAgICAvLyBGaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9IRE1JOwotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7Ci0gICAgICAgIGJvb2wgcmVwb3J0ZWRGb3JtYXRGb3VuZCA9IGZhbHNlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzLgotICAgICAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCi0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0hETUkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBqOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBvdXRwdXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0cy5pdGVtQXQoaiksIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTWF4IE91dHB1dCBudW1iZXIgJXUgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bWF4T3BlbkNvdW50LCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXQsIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgLy8gUmV0dXJuIGZvcm1hdHMgZnJvbSBhbGwgZGV2aWNlIHByb2ZpbGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgYnkKKyAgICAgICAgLy8gY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOworICAgICAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHMgPQorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkuZ2V0U3VwcG9ydGVkRm9ybWF0cygpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChzdXBwb3J0ZWRGb3JtYXRzW2pdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpci5zZWNvbmQuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBvcnRlZEZvcm1hdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChTVVJST1VORF9GT1JNQVRTW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IGZvcm1hdHMuc2l6ZSgpOworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQ6IGZvcm1hdHMpIHsKICAgICAgICAgaWYgKGZvcm1hdHNXcml0dGVuIDwgZm9ybWF0c01heCkgewotICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdHNbaV07Ci0gICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChmb3JtYXRzW2ldID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5maW5kKEFBQ19GT1JNQVRTW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKGZvcmNlVXNlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUw6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGZvcm1hdCkgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbVN1cnJvdW5kRm9ybWF0cy5maW5kKGZvcm1hdHNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUjoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBBVVRPIG9yIEFMV0FZUyA9PiB0cnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtmb3JtYXRzV3JpdHRlbisrXSA9IGZvcm1hdEVuYWJsZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKCpudW1TdXJyb3VuZEZvcm1hdHMpKys7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKLSAgICAvLyBDaGVjayBpZiBhdWRpbyBmb3JtYXQgaXMgYSBzdXJyb3VuZCBmb3JtYXRzLgotICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBTVVJST1VORF9GT1JNQVRTW2ldKSB7Ci0gICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghaXNTdXJyb3VuZEZvcm1hdCkgeworICAgIEFMT0dWKCIlcygpIGZvcm1hdCAweCVYIGVuYWJsZWQgJWQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworICAgIGNvbnN0IGF1dG8mIGZvcm1hdEl0ZXIgPSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmZpbmQoYXVkaW9Gb3JtYXQpOworICAgIGlmIChmb3JtYXRJdGVyID09IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZm9ybWF0IDB4JVggaXMgbm90IGEga25vd24gc3Vycm91bmQgZm9ybWF0IiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBNQU5VQUwuCi0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAotICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7Ci0gICAgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpICE9CisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgbm90IGluIG1hbnVhbCBtb2RlIGZvciBzdXJyb3VuZCBzb3VuZCBmb3JtYXQgc2VsZWN0aW9uIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgZW5hYmxlZCkKLSAgICAgICAgICAgIHx8IChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpID09IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgIWVuYWJsZWQpKSB7CisgICAgaWYgKChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGF1ZGlvRm9ybWF0KSAhPSAwKSA9PSBlbmFibGVkKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiB0aGVyZSBpcyBIRE1JIG91dHB1dCBhdmFpbGFibGUuCi0gICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IHN1cnJvdW5kRm9ybWF0c0JhY2t1cChtTWFudWFsU3Vycm91bmRGb3JtYXRzKTsKICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViRm9ybWF0IDogZm9ybWF0SXRlci0+c2Vjb25kKSB7CisgICAgICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lcmFzZShzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2M7CiAgICAgYm9vbCBwcm9maWxlVXBkYXRlZCA9IGZhbHNlOwotICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5hZGRyZXNzKCk7CiAgICAgICAgIFN0cmluZzggbmFtZSA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5nZXROYW1lKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLApAQCAtMzc3NCwxMSArMzcxMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQotICAgIERldmljZVZlY3RvciBoZG1pSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgLy8gRklYTUU6IFdoeSBkb2luZyB0aGlzIGZvciBpbnB1dCBIRE1JIGRldmljZXMgaWYgd2UgZG9uJ3QgYXVnbWVudCB0aGVpciByZXBvcnRlZCBmb3JtYXRzPworICAgIERldmljZVZlY3RvciBoZG1pSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgLy8gU2ltdWxhdGUgcmVjb25uZWN0aW9uIHRvIHVwZGF0ZSBlbmFibGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMuCi0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5hZGRyZXNzKCk7CiAgICAgICAgIFN0cmluZzggbmFtZSA9IGhkbWlJbnB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKQEAgLTM3OTQsNjkgKzM3MzEsNjcgQEAKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQogCi0gICAgLy8gVW5kbyB0aGUgc3Vycm91bmQgZm9ybWF0cyBjaGFuZ2UgZHVlIHRvIG5vIGF1ZGlvIHByb2ZpbGVzIHVwZGF0ZWQuCiAgICAgaWYgKCFwcm9maWxlVXBkYXRlZCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBBTE9HVygiJXMoKSBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLCB1bmRvaW5nIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIiwgX19mdW5jX18pOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzID0gc3RkOjptb3ZlKHN1cnJvdW5kRm9ybWF0c0JhY2t1cCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHByb2ZpbGVVcGRhdGVkID8gTk9fRVJST1IgOiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQogewotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6c2V0UmVjb3JkU2lsZW5jZWQodWlkOiVkLCBzaWxlbmNlZDolZCkiLCB1aWQsIHNpbGVuY2VkKTsKKyAgICBBTE9HVigiJXModWlkOiVkLCBzdGF0ZTolZCkiLCBfX2Z1bmNfXywgdWlkLCBzdGF0ZSk7CiAKLSAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLnZhbHVlQXQoaik7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU2Vzc2lvbi0+dWlkKCkgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbi0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0RGVzYy0+Y2xpZW50c0xpc3QoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgIGlmICh1aWQgPT0gY2xpZW50LT51aWQoKSkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IGF1ZGlvUG9ydDsKKyAgICAgICAgICAgIG91dFByb2ZpbGUtPnRvQXVkaW9Qb3J0KCZhdWRpb1BvcnQpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1BvcnQubnVtX2NoYW5uZWxfbWFza3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdWRpb1BvcnQuY2hhbm5lbF9tYXNrc1tpXSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQoreworICAgIEFMT0dWKCIlcyBwb3J0IElkICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKICAgICBpZiAocGF0Y2hEZXNjID09IDApIHsKICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbm8gcGF0Y2ggd2l0aCBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKICAgICBpZiAoc3dPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHN0cmVhbSwgZmFsc2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc291cmNlRGVzYyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN3T3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICB9CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKICAgICB9IGVsc2UgewotICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bUh3T3V0cHV0LnByb21vdGUoKTsKKyAgICAgICAgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPmh3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgICAgICBpZiAoaHdPdXRwdXREZXNjICE9IDApIHsKICAgICAgICAgICAvLyAgIHJlbGVhc2UgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgLy8gICBjbG9zZSBId291dHB1dCBhbmQgcmVtb3ZlIGZyb20gbUh3T3V0cHV0cwpAQCAtMzg2NywxNSArMzgwMiwxNSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCitzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc291cmNlU3RyYXRlZ3kgPQotICAgICAgICAgICAgICAgIChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzb3VyY2VTdHJhdGVneSA9IGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChzb3VyY2VTdHJhdGVneSA9PSBzdHJhdGVneSAmJiBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgewogICAgICAgICAgICAgc291cmNlID0gc291cmNlRGVzYzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzg5Miw3ICszODI3LDYgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb24rKzsKIH0KIAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIC8vIFRyZWJsaXplZCBhdWRpbyBwb2xpY3kgeG1sIGNvbmZpZyB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvbmZpZ0xvY2F0aW9uTGlzdFtdID0KICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvc3lzdGVtL2V0YyJ9OwpAQCAtMzkxMyw0MyArMzg0NywzNSBAQAogCiAgICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKICAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldCA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgJmNvbmZpZyk7CiAgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnNldFNvdXJjZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLSNlbmRpZgogCiBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmZvclRlc3RpbmcqLykKICAgICA6Ci0gICAgbVVpZENhY2hlZChnZXR1aWQoKSksCisgICAgbVVpZENhY2hlZChBSURfQVVESU9TRVJWRVIpLCAvLyBubyBuZWVkIHRvIGNhbGwgZ2V0dWlkKCksIHRoZXJlJ3Mgb25seSBvbmUgb2YgdXMgcnVubmluZy4KICAgICBtcENsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCiAgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKICAgICBtVm9sdW1lQ3VydmVzKG5ldyBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkpLAogICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCiAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgc3RhdGljX2Nhc3Q8Vm9sdW1lQ3VydmVzQ29sbGVjdGlvbio+KG1Wb2x1bWVDdXJ2ZXMuZ2V0KCkpKSwKLSNlbHNlCi0gICAgbVZvbHVtZUN1cnZlcyhuZXcgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKSksCi0gICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKSwKLSNlbmRpZgogICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAogICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCiAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKICAgICBtQmVhY29uTXV0ZWQoZmFsc2UpLAogICAgIG1UdHNPdXRwdXRBdmFpbGFibGUoZmFsc2UpLAogICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKLSAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpLAotICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoZmFsc2UpCisgICAgbU11c2ljRWZmZWN0T3V0cHV0KEFVRElPX0lPX0hBTkRMRV9OT05FKQogewogfQogCkBAIC0zOTYwLDEzICszODg2LDE2IEBACiAgICAgaW5pdGlhbGl6ZSgpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7Ci0jZWxzZQotICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKKy8vICBUaGlzIGNoZWNrIGlzIHRvIGNhdGNoIGFueSBsZWdhY3kgcGxhdGZvcm0gdXBkYXRpbmcgdG8gUSB3aXRob3V0IGhhdmluZworLy8gIHN3aXRjaGVkIHRvIFhNTCBzaW5jZSBpdHMgZGVwcmVjYXRpb24gb24gTy4KKy8vIFRPRE86IGFmdGVyIFEgcmVsZWFzZSwgcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGZsYWcgYXMgWE1MIGlzIG5vdyB0aGUgb25seQorLy8gICAgICAgIG9wdGlvbiBhbmQgYWxsIGxlZ2FjeSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gWE1MLgorI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCisjZXJyb3IgQXVkaW8gcG9saWN5IG5vIGxvbmdlciBzdXBwb3J0cyBsZWdhY3kgLmNvbmYgY29uZmlndXJhdGlvbiBmb3JtYXQKICNlbmRpZgorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKKyAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKICAgICAgICAgZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOwogICAgIH0KQEAgLTQwNDAsOSArMzk2OSw5IEBACiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAorICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSk7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBnZXRGaXJzdERldmljZUFkZHJlc3MoZGV2aWNlc0ZvclR5cGUpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKQEAgLTQwOTQsMTAgKzQwMjMsOSBAQAogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2socHJvZmlsZVR5cGUpOwogICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGlucHV0RGV2aWNlcyk7CiAgICAgICAgICAgICBBTE9HVigiICBmb3IgaW5wdXQgZGV2aWNlIDB4JXggdXNpbmcgYWRkcmVzcyAlcyIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgIEFMT0dFX0lGKGlucHV0RGV2aWNlcy5zaXplKCkgPT0gMCwgIklucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIpOwogCkBAIC00MTU5LDExICs0MDg3LDExIEBACiAgICAgfQogICAgIC8vIElmIG1pY3JvcGhvbmVzIGFkZHJlc3MgaXMgZW1wdHksIHNldCBpdCBhY2NvcmRpbmcgdG8gZGV2aWNlIHR5cGUKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JPVFRPTV9NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKSA9IFN0cmluZzgoQVVESU9fQk9UVE9NX01JQ1JPUEhPTkVfQUREUkVTUyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKSA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDE5NCw3ICs0MTIyLDcgQEAKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKLSAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtNDMzMiw3ICs0MjYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVBdWRpb1Byb2ZpbGVzKGRldmljZSwgb3V0cHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoZGV2RGVzYywgb3V0cHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOwogICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgbWlzc2luZyBwYXJhbSIpOwogICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwpAQCAtNDU0MCw3ICs0NDY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoZGV2aWNlLCBpbnB1dCwgcHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVBdWRpb1Byb2ZpbGVzKGRldkRlc2MsIGlucHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOwogICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOwogICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwpAQCAtNDYyNiwxMCArNDU1NCw5IEBACiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOworICAgICAgICAgICAgY29uc3QgYm9vbCB3YXNBY3RpdmUgPSBvdXRwdXREZXNjMi0+aXNBY3RpdmUoKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50UGFpciA6IGR1cE91dHB1dERlc2MtPmdldEFjdGl2ZUNsaWVudHMoKSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VTdHJlYW1BY3RpdmVDb3VudChjbGllbnRQYWlyLmZpcnN0LCAtY2xpZW50UGFpci5zZWNvbmQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gc3RvcCgpIHdpbGwgYmUgYSBubyBvcCBpZiB0aGUgb3V0cHV0IGlzIHN0aWxsIGFjdGl2ZSBidXQgaXMgbmVlZGVkIGluIGNhc2UgYWxsCiAgICAgICAgICAgICAvLyBhY3RpdmUgc3RyZWFtcyByZWZjb3VudHMgd2hlcmUgY2xlYXJlZCBhYm92ZQpAQCAtNDY1OCw2ICs0NTg1LDIyIEBACiAKICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisKKyAgICAvLyBNU0QgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHRvIHN1cHBvcnQgYSBub24tTVNEIGRpcmVjdCBvdXRwdXQuIFJlc2V0IE1TRCBwYXRjaCBpZgorICAgIC8vIG5vIGRpcmVjdCBvdXRwdXRzIGFyZSBvcGVuLgorICAgIGlmIChtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpICE9IDApIHsKKyAgICAgICAgYm9vbCBkaXJlY3RPdXRwdXRPcGVuID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0c1tpXS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0T3V0cHV0T3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7CisgICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ2NzIsNiArNDYxNSw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKQEAgLTQ2ODIsNiArNDYyNiwxMiBAQAogCiAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKKyAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgIH0KIH0KIAogU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoCkBAIC00NzAzLDE4ICs0NjUzLDE3IEBACiAgICAgcmV0dXJuIG91dHB1dHM7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCkKIHsKLSAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIGlmIChvbk91dHB1dHNDaGVja2VkICE9IG51bGxwdHIgJiYgb25PdXRwdXRzQ2hlY2tlZCgpKSBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSAhPSAwKSB7CisgICAgICAgIHNldE1zZFBhdGNoKCk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCkBAIC00NzQyLDcgKzQ2OTEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCF2ZWN0b3JzRXF1YWwoc3JjT3V0cHV0cyxkc3RPdXRwdXRzKSkgeworICAgIGlmIChzcmNPdXRwdXRzICE9IGRzdE91dHB1dHMpIHsKICAgICAgICAgLy8gZ2V0IG1heGltdW0gbGF0ZW5jeSBvZiBhbGwgc291cmNlIG91dHB1dHMgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG11dGUgdGltZSBndWFyYW50ZWVpbmcKICAgICAgICAgLy8gYXVkaW8gZnJvbSBpbnZhbGlkYXRlZCB0cmFja3Mgd2lsbCBiZSByZW5kZXJlZCB3aGVuIHVubXV0aW5nCiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOwpAQCAtNDc2MSw3ICs0NzEwLDcgQEAKICAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOwogICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLCBuZXdEZXZpY2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2UgPQorICAgICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlID0KICAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChzcmNPdXQsIHN0cmF0ZWd5KTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gMCl7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CkBAIC00ODQ2LDExICs0Nzk1LDQxIEBACiAgICAgfQogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRQcmVmZXJyZWREZXZpY2UoCisgICAgICAgIElvRGVzY3JpcHRvciYgZGVzYywgRmlsdGVyIGZpbHRlciwgYm9vbCYgYWN0aXZlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpCit7CisgICAgYXV0byBhY3RpdmVDbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7CisgICAgYXV0byBhY3RpdmVDbGllbnRzV2l0aFJvdXRlID0KKyAgICAgICAgZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLywgZmlsdGVyLCB0cnVlIC8qcHJlZmVycmVkRGV2aWNlKi8pOworICAgIGFjdGl2ZSA9IGFjdGl2ZUNsaWVudHMuc2l6ZSgpID4gMDsKKyAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZUNsaWVudHMuc2l6ZSgpID09IGFjdGl2ZUNsaWVudHNXaXRoUm91dGUuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VzLmdldERldmljZUZyb21JZChhY3RpdmVDbGllbnRzV2l0aFJvdXRlWzBdLT5wcmVmZXJyZWREZXZpY2VJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJb0NvbGxlY3Rpb24sIGNsYXNzIEZpbHRlcj4KK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZFByZWZlcnJlZERldmljZSgKKyAgICAgICAgSW9Db2xsZWN0aW9uJiBpb0NvbGxlY3Rpb24sIEZpbHRlciBmaWx0ZXIsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpb0NvbGxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byBkZXNjID0gaW9Db2xsZWN0aW9uLnZhbHVlQXQoaSk7CisgICAgICAgIGJvb2wgYWN0aXZlOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjdXJEZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKGRlc2MsIGZpbHRlciwgYWN0aXZlLCBkZXZpY2VzKTsKKyAgICAgICAgaWYgKGFjdGl2ZSAmJiBjdXJEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGN1ckRldmljZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0KICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CkBAIC00ODYxLDE4ICs0ODQwLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhbiBhY3RpdmUgc3RyZWFtIG9uIHRoaXMgb3V0cHV0IGFuZAotICAgIC8vIHVzZSBpdCBpbiBwcmlvcml0eSBiZWZvcmUgYW55IG90aGVyIHJ1bGUKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0KLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShvdXRwdXREZXNjLCBTVFJBVEVHWV9OT05FLCBhY3RpdmUsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VEZXNjLT50eXBlKCk7CiAgICAgfQogCiAgICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgpAQCAtNDg5OCwxMyArNDg3MiwxNCBAQAogICAgIC8vIEZJWE1FOiBleHRlbmQgdXNlIG9mIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoKSB0byBhbGwgc3RyYXRlZ2llcwogICAgIC8vIHdpdGggYSByZWZpbmVkIHJ1bGUgY29uc2lkZXJpbmcgbXV0dWFsbHkgZXhjbHVzaXZlIGRldmljZXMgKHVzaW5nIHNhbWUgYmFja2VuZCkKICAgICAvLyBhcyBvcHBvc2VkIHRvIGFsbCBzdHJlYW1zIG9uIHRoZSBzYW1lIGF1ZGlvIEhBTCBtb2R1bGUuCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCiAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CiAgICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8CiAgICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKG91dHB1dERlc2MsIFNUUkFURUdZX1BIT05FKSkgewogICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKICAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKQEAgLTQ5NDAsOSArNDkxNSwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0RGVzYywgQVVESU9fU09VUkNFX0RFRkFVTFQsIGFjdGl2ZSwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgIH0KKwogICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucwogICAgIC8vIEFVRElPX0RFVklDRV9OT05FLCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+c291cmNlKCk7CiAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7CiAgICAgICAgIHNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgIH0KQEAgLTQ5NjksNiArNDk1Myw3IEBACiAgICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBhY3RpdmVEZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7CiAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewpAQCAtNDk3NywxNSArNDk2MiwyMCBAQAogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQogICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBjdXJEZXZpY2VzIHw9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgICAgIGFjdGl2ZURldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGV2aWNlcyB8PSBjdXJEZXZpY2VzOwogICAgIH0KIAorICAgIC8vIEZhdm9yIGRldmljZXMgc2VsZWN0ZWQgb24gYWN0aXZlIHN0cmVhbXMgaWYgYW55IHRvIHJlcG9ydCBjb3JyZWN0IGRldmljZSBpbiBjYXNlIG9mCisgICAgLy8gZXhwbGljaXQgZGV2aWNlIHNlbGVjdGlvbgorICAgIGlmIChhY3RpdmVEZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOworICAgIH0KICAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCiAgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewpAQCAtNTAwMSwxNiArNDk5MSwxNiBAQAogICAgIHJldHVybiBtRW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKK3JvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7CiAgICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwogICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOworICAgICAgICByZXR1cm4gU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwogICAgIH0KICAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CiAgICAgfQogICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CkBAIC01MDg2LDE3ICs1MDc2LDExIEBACiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYSBzdHJlYW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgIC8vIHNwZWNpZmllZCBzdHJhdGVneSBhbmQgdXNlIGl0IGluIHByaW9yaXR5IG92ZXIgZGVmYXVsdCByb3V0aW5nIHJ1bGVzLgotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Um91dGVzLmdldEFjdGl2ZURldmljZUZvclN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZmluZFByZWZlcnJlZERldmljZShtT3V0cHV0cywgc3RyYXRlZ3ksIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlRGVzYyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VEZXNjLT50eXBlKCk7CiAgICAgfQogCiAgICAgaWYgKGZyb21DYWNoZSkgewpAQCAtNTI2Niw2OCArNTI1MCwyMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwogICAgICAgICBpZiAoKGFkZHJlc3MgPT0gTlVMTCkgfHwgKHN0cmxlbihhZGRyZXNzKSA9PSAwKSkgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICAgICAgaWYgKGRldmljZURlc2MpIGRldmljZUxpc3QuYWRkKGRldmljZURlc2MpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7CisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGRldmljZUxpc3Quc2l6ZSgpIDw9IEFVRElPX1BBVENIX1BPUlRTX01BWCwgIlRvbyBtYW55IHNpbmsgcG9ydHMiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogZGV2aWNlTGlzdCkgeworICAgICAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGRldmljZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCi0gICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIG91dHB1dERlc2MuZ2V0KCksIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBkZWxheU1zKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTM3MSw1MyArNTMwOCwyMSBAQAogICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgewogICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CiAKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOwogICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoaW5wdXREZXNjLAogICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgogICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAotICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgICAgICAgICBbaW5wdXREZXNjXShjb25zdCBQYXRjaEJ1aWxkZXI6Om1peF91c2VjYXNlX3QmIHVzZWNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdXNlY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmICFpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgfSkuCiAgICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93Ci0gICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGRldmljZUxpc3QuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIGlucHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIDApOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01NTA2LDYgKzU0MTEsMTUgQEAKIGF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCiB7CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShtSW5wdXRzLCBpbnB1dFNvdXJjZSwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlRGVzYy0+dHlwZSgpOworICAgIH0KKworCiAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgYXVkaW9fZGV2aWNlc190IHNlbGVjdGVkRGV2aWNlRnJvbU1peCA9CiAgICAgICAgICAgIG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgYXZhaWxhYmxlRGV2aWNlVHlwZXMsIHBvbGljeU1peCk7CkBAIC01NTE4LDIwICs1NDMyLDcgQEAKIAogYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCiB7Ci0gICAgLy8gUm91dGluZwotICAgIC8vIFNjYW4gdGhlIHdob2xlIFJvdXRlTWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4cGxpY2l0IHJvdXRlOgotICAgIC8vIGlmIHRoZSBpbnB1dCBzb3VyY2UgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKLSAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCi0gICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCi0gICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtSW5wdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKLSAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKLSAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpICYmCi0gICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewotICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKIH0KIAogZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtNTU1MSw4ICs1NDUyLDggQEAKICAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEQiAtIDQgPiB2b2x1bWVEQiA/IHJpbmdWb2x1bWVEQiAtIDQgOiB2b2x1bWVEQjsKICAgICB9CiAKLSAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIGVhcnBpZWNlIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQotICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgJiYKKyAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQorICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJgogICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgc3dpdGNoIChzdHJlYW0pIHsKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgpAQCAtNTU2NCw5ICs1NDY1LDkgQEAKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTogewogICAgICAgICAgICAgaW50IHZvaWNlVm9sdW1lSW5kZXggPQotICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKKyAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgZGV2aWNlKTsKICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG1heFZvaWNlVm9sRGIgPQotICAgICAgICAgICAgICAgIGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvaWNlVm9sdW1lSW5kZXgsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpCisgICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgZGV2aWNlKQogICAgICAgICAgICAgICAgICsgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQjsKICAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1heFZvaWNlVm9sRGIpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSgpIHN0cmVhbSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHN0cmVhbSAlZCBhdCB2b2w9JWYiLApAQCAtNTYzNyw2ICs1NTM4LDIxIEBACiAgICAgcmV0dXJuIHZvbHVtZURCOwogfQogCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNjYWxlVm9sdW1lSW5kZXgoaW50IHNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3JjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0U3RyZWFtKQoreworICAgIGlmIChzcmNTdHJlYW0gPT0gZHN0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiBzcmNJbmRleDsKKyAgICB9CisgICAgZmxvYXQgbWluU3JjID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHNyY1N0cmVhbSk7CisgICAgZmxvYXQgbWF4U3JjID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHNyY1N0cmVhbSk7CisgICAgZmxvYXQgbWluRHN0ID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKGRzdFN0cmVhbSk7CisgICAgZmxvYXQgbWF4RHN0ID0gKGZsb2F0KW1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KGRzdFN0cmVhbSk7CisKKyAgICByZXR1cm4gKGludCkobWluRHN0ICsgKChzcmNJbmRleCAtIG1pblNyYykgKiAobWF4RHN0IC0gbWluRHN0KSkgLyAobWF4U3JjIC0gbWluU3JjKSk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLApAQCAtNTc2Myw1NSArNTY3OSw2IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKLXsKLSAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAotICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCi0gICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90Ci0gICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQotICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKLSAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1QcmltYXJ5T3V0cHV0OwotICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKLSAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOwotICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiBhdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKIHsKICAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCkBAIC01ODI1LDM5ICs1NjkyLDcgQEAKICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9UVFM7CiAgICAgfQogCi0gICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9CisgICAgcmV0dXJuIGF1ZGlvX3VzYWdlX3RvX3N0cmVhbV90eXBlKGF0dHItPnVzYWdlKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQpAQCAtNTkwMiw3ICs1NzM3LDcgQEAKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7CiAgICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCisgICAgICAgICAgICAgICAgKFNUUkFURUdZX05PTkUgPT0gc3RyYXRlZ3kpKSAmJgogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTU5NDIsMTAgKzU3NzcsMTAgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bURldmljZS0+ZXF1YWxzKGRldmljZURlc2MpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+cG9ydElkKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01OTczLDEyNyArNTgwOCw2MSBAQAogICAgIH0KIH0KIAotLy8gTW9kaWZ5IHRoZSBsaXN0IG9mIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgc3VwcG9ydGVkLgotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbHRlclN1cnJvdW5kRm9ybWF0cyhGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKLSAgICBGb3JtYXRWZWN0b3IgJmZvcm1hdHMgPSAqZm9ybWF0c1B0cjsKLSAgICAvLyBUT0RPIFNldCB0aGlzIGJhc2VkIG9uIENvbmZpZyBwcm9wZXJ0aWVzLgotICAgIGNvbnN0IGJvb2wgYWx3YXlzRm9yY2VBQzMgPSB0cnVlOwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kRm9ybWF0cygKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cikgeworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZW5mb3JjZWRTdXJyb3VuZCgKKyAgICAgICAgICAgIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuYmVnaW4oKSwgZGV2RGVzYy0+ZW5jb2RlZEZvcm1hdHMoKS5lbmQoKSk7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBhbGxTdXJyb3VuZDsgIC8vIEEgZmxhdCBzZXQgb2YgYWxsIGtub3duIHN1cnJvdW5kIGZvcm1hdHMKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgIGFsbFN1cnJvdW5kLmluc2VydChwYWlyLmZpcnN0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJmb3JtYXQgOiBwYWlyLnNlY29uZCkgYWxsU3Vycm91bmQuaW5zZXJ0KHN1YmZvcm1hdCk7CisgICAgfQogCiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKICAgICBBTE9HRCgiJXM6IGZvcmNlZCB1c2UgPSAlZCIsIF9fRlVOQ1RJT05fXywgZm9yY2VVc2UpOworICAgIC8vIFRoaXMgaXMgdGhlIHJlc3VsdGluZyBzZXQgb2YgZm9ybWF0cyBkZXBlbmRpbmcgb24gdGhlIHN1cnJvdW5kIG1vZGU6CisgICAgLy8gICAnYWxsIHN1cnJvdW5kJyA9IGFsbFN1cnJvdW5kCisgICAgLy8gICAnZW5mb3JjZWQgc3Vycm91bmQnID0gZW5mb3JjZWRTdXJyb3VuZCBbbWF5IGluY2x1ZGUgSUVDNjkxMzcgd2hpY2ggaXNuJ3QgcmF3IHN1cnJvdW5kIGZtdF0KKyAgICAvLyAgICdub24tc3Vycm91bmQnID0gbm90IGluICdhbGwgc3Vycm91bmQnIGFuZCBub3QgaW4gJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vICAgJ21hbnVhbCBzdXJyb3VuZCcgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzCisgICAgLy8gQVVUTzogICBmb3JtYXRzIHYgJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vIEFMV0FZUzogZm9ybWF0cyB2ICdhbGwgc3Vycm91bmQnIHYgJ2VuZm9yY2VkIHN1cnJvdW5kJworICAgIC8vIE5FVkVSOiAgZm9ybWF0cyBeICdub24tc3Vycm91bmQnCisgICAgLy8gTUFOVUFMOiBmb3JtYXRzIF4gKCdub24tc3Vycm91bmQnIHYgJ21hbnVhbCBzdXJyb3VuZCcgdiAoSUVDNjkxMzcgXiAnZW5mb3JjZWQgc3Vycm91bmQnKSkKIAotICAgIC8vIElmIE1BTlVBTCwga2VlcCB0aGUgc3VwcG9ydGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgYXMgY3VycmVudCBlbmFibGVkIG9uZXMuCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRTZXQ7CisgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTAorICAgICAgICAgICAgfHwgZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsKKyAgICAgICAgLy8gZm9ybWF0U2V0IGlzIChmb3JtYXRzIF4gJ25vbi1zdXJyb3VuZCcpCisgICAgICAgIGZvciAoYXV0byBmb3JtYXRJdGVyID0gZm9ybWF0c1B0ci0+YmVnaW4oKTsgZm9ybWF0SXRlciAhPSBmb3JtYXRzUHRyLT5lbmQoKTsgKytmb3JtYXRJdGVyKSB7CisgICAgICAgICAgICBpZiAoYWxsU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDAgJiYgZW5mb3JjZWRTdXJyb3VuZC5jb3VudCgqZm9ybWF0SXRlcikgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoKmZvcm1hdEl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChmb3JtYXRzUHRyLT5iZWdpbigpLCBmb3JtYXRzUHRyLT5lbmQoKSk7CisgICAgfQorICAgIGZvcm1hdHNQdHItPmNsZWFyKCk7ICAvLyBSZS1maWxsZWQgZnJvbSB0aGUgZm9ybWF0U2V0IGF0IHRoZSBlbmQuCisKICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7Ci0gICAgICAgIGZvcm1hdHMuY2xlYXIoKTsKLSAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1cnJvdW5kRm9ybWF0cy5iZWdpbigpOyBpdCAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZCgqaXQpOworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuYmVnaW4oKSwgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lbmQoKSk7CisgICAgICAgIC8vIEVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlIGlmIGl0J3MgZW5mb3JjZWQgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICBpZiAoZW5mb3JjZWRTdXJyb3VuZC5jb3VudChBVURJT19GT1JNQVRfSUVDNjE5MzcpICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKICAgICAgICAgfQotICAgICAgICAvLyBBbHdheXMgZW5hYmxlIElFQzYxOTM3IHdoZW4gaW4gTUFOVUFMIG1vZGUuCi0gICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgfSBlbHNlIHsgLy8gTkVWRVIsIEFVVE8gb3IgQUxXQVlTCi0gICAgICAgIC8vIEFuYWx5emUgb3JpZ2luYWwgc3VwcG9ydCBmb3IgdmFyaW91cyBmb3JtYXRzLgotICAgICAgICBib29sIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoc3NpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgKHNzaXplX3QpZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgQUxXQVlTLCByZW1vdmUgYWxsIG90aGVyIHN1cnJvdW5kIGZvcm1hdHMgaGVyZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3aWxsIGFkZCB0aGVtIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEluZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfSUVDNjE5Mzc6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7IC8vIEFVVE8gb3IgQUxXQVlTCisgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKKyAgICAgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoYWxsU3Vycm91bmQuYmVnaW4oKSwgYWxsU3Vycm91bmQuZW5kKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW9kaWZ5IGZvcm1hdHMgYmFzZWQgb24gc3Vycm91bmQgcHJlZmVyZW5jZXMuCi0gICAgICAgIC8vIElmIE5FVkVSLCByZW1vdmUgc3VwcG9ydCBmb3Igc3Vycm91bmQgZm9ybWF0cy4KLSAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7Ci0gICAgICAgICAgICBpZiAoc3VwcG9ydHNBQzMgfHwgc3VwcG9ydHNPdGhlclN1cnJvdW5kIHx8IHN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vycm91bmQgc291bmQgcmVsYXRlZCBmb3JtYXRzLgotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleCsrOyAvLyBrZWVwIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIEFVVE8gb3IgQUxXQVlTCi0gICAgICAgICAgICAvLyBNb3N0IFRWcyBzdXBwb3J0IEFDMyBldmVuIGlmIHRoZXkgZG8gbm90IHJlcG9ydCBpdCBpbiB0aGUgRURJRC4KLSAgICAgICAgICAgIGlmICgoYWx3YXlzRm9yY2VBQzMgfHwgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykpCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0FDMykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9BQzMpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgQUxXQVlTLCBhZGQgc3VwcG9ydCBmb3IgcmF3IHN1cnJvdW5kIGZvcm1hdHMgaWYgYWxsIGFyZSBtaXNzaW5nLgotICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgaWYgYW55IG9mIHRoZXNlIGZvcm1hdHMgYXJlIHJlcG9ydGVkIGJ5IHRoZSBIQUwKLSAgICAgICAgICAgIC8vIHRoZW4gdGhlIHJlcG9ydCBpcyB2YWxpZCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KLSAgICAgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRV9BQzMpOwotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9EVFMpOwotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9EVFNfSEQpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBJRUM2MTkzNyBpZiBhbnkgcmF3IHN1cnJvdW5kIHN1cHBvcnRlZC4KLSAgICAgICAgICAgIC8vIFRoZSBIQUwgY291bGQgZG8gdGhpcyBidXQgYWRkIGl0IGhlcmUsIGp1c3QgaW4gY2FzZS4KLSAgICAgICAgICAgIGlmICgoc3VwcG9ydHNBQzMgfHwgc3VwcG9ydHNPdGhlclN1cnJvdW5kKSAmJiAhc3VwcG9ydHNJRUM2MTkzNykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCByZXBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHRvIGVuYWJsZWQgc3Vycm91bmQgZm9ybWF0cy4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdHNbZm9ybWF0SW5kZXhdOwotICAgICAgICAgICAgICAgIHN3aXRjaChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQ19MQzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDM19KT0M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChlbmZvcmNlZFN1cnJvdW5kLmJlZ2luKCksIGVuZm9yY2VkU3Vycm91bmQuZW5kKCkpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdCA6IGZvcm1hdFNldCkgeworICAgICAgICBmb3JtYXRzUHRyLT5wdXNoKGZvcm1hdCk7CiAgICAgfQogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cikgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKICAgICBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzID0gKmNoYW5uZWxNYXNrc1B0cjsKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwpAQCAtNjEyMywxNiArNTg5MiwxNyBAQAogICAgICAgICAvLyBJZiBub3QgdGhlbiBhZGQgNS4xIHN1cHBvcnQuCiAgICAgICAgIGlmICghc3VwcG9ydHM1ZG90MSkgewogICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKLSAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIE1BTlVBTCBvciBBTFdBWVMsIHNvIGFkZGluZyBjaGFubmVsTWFzayBmb3IgNS4xIHN1cnJvdW5kIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpCiB7CiAgICAgU3RyaW5nOCByZXBseTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogCiAgICAgLy8gRm9ybWF0IE1VU1QgYmUgY2hlY2tlZCBmaXJzdCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgQXVkaW9Qcm9maWxlCiAgICAgaWYgKHByb2ZpbGVzLmhhc0R5bmFtaWNGb3JtYXQoKSkgewpAQCAtNjE0Niw4ICs1OTE2LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKLSAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kRm9ybWF0cygmZm9ybWF0cyk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGRldkRlc2MsICZmb3JtYXRzKTsKICAgICAgICAgfQogICAgICAgICBwcm9maWxlcy5zZXRGb3JtYXRzKGZvcm1hdHMpOwogICAgIH0KQEAgLTYxNzksOCArNTk1MCw5IEBACiAgICAgICAgICAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHJlcGx5KSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcocmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0RldmljZU9mTW9kdWxlKGRldkRlc2MsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjE4OCw0ICs1OTYwLDU4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoCisgICAgICAgICAgICBwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgPworICAgICAgICAgICAgKnBhdGNoSGFuZGxlIDogaW9EZXNjcmlwdG9yLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKAorICAgICAgICAgICAgY2FsbGVyLCBpbmRleCwgcGF0Y2hIYW5kbGUsIHBhdGNoLCBkZWxheU1zLCBtVWlkQ2FjaGVkLCAmcGF0Y2hEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlvRGVzY3JpcHRvci0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpCit7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dWKCIlcygpIEFGOjpjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICBjYWxsZXIsIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoLCB1aWQpOworICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoRGVzY1B0cikgKnBhdGNoRGVzY1B0ciA9IHBhdGNoRGVzYzsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDQ4ZTA0NzIuLjM1ZGQ4N2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KQEAgLTM4LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxBdWRpb1Byb2ZpbGUuaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KQEAgLTQ2LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+CiAjaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTE4LDE1ICsxMjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTEzOCwxNiArMTM0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKICAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKQEAgLTE2Miw3ICsxNTMsNyBAQAogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisgICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKIAogICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKQEAgLTE3MywxNCArMTY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7Ci0gICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKQEAgLTE5MywxMCArMTc4LDE3IEBACiAKICAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgICAgIC8vIGhlbHBlcnMgZm9yIGR1bXAoaW50IGZkKQorICAgICAgICB2b2lkIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoU3RyaW5nOCAqZHN0KSBjb25zdDsKKyAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CisKKyAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIG92ZXJyaWRlOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKTsKIAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKKwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTIyOSw5ICsyMjEsOSBAQAogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTI0Nyw3ICsyMzksOSBAQAogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CiAKIHByb3RlY3RlZDoKICAgICAgICAgLy8gQSBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaW5pdGlhbGl6YXRpb24gcHJvY2VzcywKQEAgLTM1Myw2ICszNDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIC8vIHJlc2NhbGUgdm9sdW1lIGluZGV4IGZyb20gc3JjU3RyZWFtIHdpdGhpbiByYW5nZSBvZiBkc3RTdHJlYW0KKyAgICAgICAgaW50IHJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3RTdHJlYW0pOwogICAgICAgICAvLyBjaGVjayB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgcGVybWl0dGVkLCBjb21wdXRlIGFuZCBzZW5kIG5ldyB2b2x1bWUgdG8gYXVkaW8gaGFyZHdhcmUKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCkBAIC0zNjgsNyArMzY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FKTsKIAogICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSB0aGUgc3RyZWFtIG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0CiAgICAgICAgIHZvaWQgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTM3NywxMCArMzc1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOwogCi0gICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgd2hpbGUgaW4gY2FsbDogbXV0ZSBzdHJlYW1zIG9yIHJlcGxhY2UgYnkKLSAgICAgICAgLy8gYSBzcGVjaWFsIHRvbmUgaW4gdGhlIGRldmljZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uCi0gICAgICAgIHZvaWQgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKTsKLQogICAgICAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOwogCiAgICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbApAQCAtNDEwLDYgKzQwNCwxMiBAQAogICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KICAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAorICAgICAgICAvLyBydW5zIGFsbCB0aGUgY2hlY2tzIHJlcXVpcmVkIGZvciBhY2NvbW9kYXRpbmcgY2hhbmdlcyBpbiBkZXZpY2VzIGFuZCBvdXRwdXRzCisgICAgICAgIC8vIGlmICdvbk91dHB1dHNDaGVja2VkJyBjYWxsYmFjayBpcyBwcm92aWRlZCwgaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG91dHB1dHMKKyAgICAgICAgLy8gY2hlY2sgdmlhICdjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMnLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAndHJ1ZScsCisgICAgICAgIC8vIEEyRFAgc3VzcGVuZCBzdGF0dXMgaXMgcmVjaGVja2VkLgorICAgICAgICB2b2lkIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCA9IG51bGxwdHIpOworCiAgICAgICAgIC8vIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciBhbGwgc3RyYXRlZ2llcy4KICAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHB1dCBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kKICAgICAgICAgLy8gY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgpAQCAtNDIyLDYgKzQyMiwxNCBAQAogICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQogICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKIAorICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbmRQcmVmZXJyZWREZXZpY2UoSW9EZXNjcmlwdG9yJiBkZXNjLCBGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYWN0aXZlLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBJb0NvbGxlY3Rpb24sIGNsYXNzIEZpbHRlcj4KKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZFByZWZlcnJlZERldmljZShJb0NvbGxlY3Rpb24mIGlvQ29sbGVjdGlvbiwgRmlsdGVyIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcyk7CisKICAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gb3V0cHV0IGZvciBjdXJyZW50IHN0YXRlCiAgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcwogICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KQEAgLTQ1MSw4ICs0NTksNiBAQAogCiAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKTsKLSAgICAgICAgYm9vbCB2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpOwogCiAgICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgogICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKQEAgLTQ2Myw4ICs0NjksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CiAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCk7CiAgICAgICAgIC8vIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayBhcmUgaW4vb3V0IGFuZCBzbyBtYXkgYmUgbW9kaWZpZWQKICAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKQEAgLTQ3MiwxMSArNDgwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190JiBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7Ci0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogCkBAIC01MDEsMjQgKzUxMCwzNiBAQAogICAgICAgICAgICAgaWYgKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGdldEZpcnN0RGV2aWNlSWQgb2YgdGhlIERldmljZSBWZWN0b3IKKyAgICAgICAgICogQHJldHVybiBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZW1wdHksIGl0IHJldHVybnMgdGhlIGZpcnN0IGRldmljZSBJZCwKKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgICAgICAgKi8KKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRGaXJzdERldmljZUlkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChkZXZpY2VzLnNpemUoKSA+IDApID8gZGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChkZXZpY2VzLnNpemUoKSA+IDApID8gZGV2aWNlcy5pdGVtQXQoMCktPmFkZHJlc3MoKSA6IFN0cmluZzgoIiIpOwogICAgICAgICB9CiAKICAgICAgICAgdWludDMyX3QgdXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zID0gMCk7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcyk7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZERldmljZSgKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TW9kdWxlRGV2aWNlVHlwZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CisgICAgICAgIGJvb2wgaXNEZXZpY2VPZk1vZHVsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0OwogCi0gICAgICAgIC8vIGlmIGFyZ3VtZW50ICJkZXZpY2UiIGlzIGRpZmZlcmVudCBmcm9tIEFVRElPX0RFVklDRV9OT05FLCAgc3RhcnRTb3VyY2UoKSB3aWxsIGZvcmNlCi0gICAgICAgIC8vIHRoZSByZS1ldmFsdWF0aW9uIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RvcFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUpOworICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpOwogCiAgICAgICAgIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXModWlkX3QgdWlkKTsKQEAgLTUyNiwyNSArNTQ3LDIzIEBACiAKICAgICAgICAgc3RhdHVzX3QgaGFzUHJpbWFyeU91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1QcmltYXJ5T3V0cHV0ICE9IDA7IH0KIAotICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7Ci0gICAgICAgIHN0YXR1c190IGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKKyAgICAgICAgc3RhdHVzX3QgY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKKyAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKIAotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOwogCiAgICAgICAgIHZvaWQgY2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzYyk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvU291cmNlcyh1aWRfdCB1aWQpOwogCi0gICAgICAgIHN0YXRpYyBib29sIGlzQ29uY3VycmVudFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwotCi0gICAgICAgIGJvb2wgaXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYywKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotCiAgICAgICAgIHN0YXRpYyBib29sIHN0cmVhbXNNYXRjaEZvcnZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTIpOwogCi0gICAgICAgIHVpZF90IG1VaWRDYWNoZWQ7CisgICAgICAgIHZvaWQgY2xvc2VBY3RpdmVDbGllbnRzKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXQpOworICAgICAgICB2b2lkIGNsb3NlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgICAgICBjb25zdCB1aWRfdCBtVWlkQ2FjaGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBSURfQVVESU9TRVJWRVIKICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1QcmltYXJ5T3V0cHV0OyAgICAgLy8gcHJpbWFyeSBvdXRwdXQgZGVzY3JpcHRvcgogICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKQEAgLTU1OCw5ICs1NzcsNiBAQAogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOyAvLyBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCiAgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgIC8vIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcwogCi0gICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtT3V0cHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9PVVRQVVQpOwotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbUlucHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9JTlBVVCk7Ci0KICAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CiAgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTApAQCAtNTg0LDcgKzYwMCw3IEBACiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKIAogICAgICAgICBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtSHdPdXRwdXRzOwotICAgICAgICBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKKyAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwogCiAgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKICAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKQEAgLTYwOCwxNyArNjI0LDI2IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlLgogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKm1FbmdpbmU7CiAKLSAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkLgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZCBtYW51YWxseS4gVGFrZW4gaW50byBhY2NvdW50IHdoZW4KKyAgICAgICAgLy8gImVuY29kZWQgc3Vycm91bmQiIGlzIGZvcmNlZCBpbnRvICJtYW51YWwiIG1vZGUuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbU1hbnVhbFN1cnJvdW5kRm9ybWF0czsKIHByaXZhdGU6CiAgICAgICAgIC8vIEFkZCBvciByZW1vdmUgQUMzIERUUyBlbmNvZGluZ3MgYmFzZWQgb24gdXNlciBwcmVmZXJlbmNlcy4KLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKTsKLSAgICAgICAgdm9pZCBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKTsKKyAgICAgICAgdm9pZCBtb2RpZnlTdXJyb3VuZEZvcm1hdHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7CisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CiAKLSAgICAgICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRm9ybWF0cyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKTsKKyAgICAgICAgLy8gU3VwcG9ydCBmb3IgTXVsdGktU3RyZWFtIERlY29kZXIgKE1TRCkgbW9kdWxlCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORSk7CiAKICAgICAgICAgLy8gSWYgYW55LCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzIG9mIGFuIEF1ZGlvIFByb2ZpbGVzIGNvbGxlY3Rpb24KLSAgICAgICAgdm9pZCB1cGRhdGVBdWRpb1Byb2ZpbGVzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpOwogCiAgICAgICAgIC8vIE5vdGlmeSB0aGUgcG9saWN5IGNsaWVudCBvZiBhbnkgY2hhbmdlIG9mIGRldmljZSBzdGF0ZSB3aXRoIEFVRElPX0lPX0hBTkRMRV9OT05FLApAQCAtNjQzLDYgKzY2OCwyMSBAQAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgLyppbiovLAogICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CiAgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGdldCBhdWRpb19hdHRyaWJ1dGVzX3QgZnJvbSBlaXRoZXIgYSBzb3VyY2UgYXVkaW9fYXR0cmlidXRlc190CisgICAgICAgIC8vIG9yIGF1ZGlvX3N0cmVhbV90eXBlX3QsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0QXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqZHN0QXR0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0pOworICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGNhbGxlZCBieSBnZXRPdXRwdXRGb3JBdHRyKCkgYW5kIGNvbm5lY3RBdWRpb1NvdXJjZS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0ckludChhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZSgKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtNjU0LDcgKzY5NCw2IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKQEAgLTY4NCwxMCArNzIzLDE4IEBACiAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCksIChpbnQpbU1hc3Rlck1vbm8pOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIGJvb2wgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpOwotICAgICAgICBib29sIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotICAgICAgICBib29sIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7CisgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlICppb0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gKnBhdGNoRGVzY1B0cik7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGIwNjRmOGMuLmQ4MjYxOTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTE1NSwxNyArMTU1LDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0b3BUb25lKCkKLXsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpCiB7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSwgZGVsYXlfbXMpOwpAQCAtMjIwLDEyICsyMDksMTcgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiB9CiAKIGF1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCA0YTFjYWI0Li4yOWIwNTYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0yMyw3ICsyMyw5IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNDb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTMxLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMxNyw2ICszMTgsMjAxIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogTnVsbCB1dWlkIG9yIHR5cGUgdXVpZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gSE9UV09SRCBhbmQgRk1fVFVORVIgYXJlIHR3byBzcGVjaWFsIGNhc2Ugc291cmNlcyA+IE1BWC4KKyAgICBpZiAoc291cmNlIDwgQVVESU9fU09VUkNFX0RFRkFVTFQgfHwKKyAgICAgICAgICAgIChzb3VyY2UgPiBBVURJT19TT1VSQ0VfTUFYICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUikpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogVW5zdXBwb3J0ZWQgc291cmNlIHR5cGUgJWQiLCBzb3VyY2UpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgfHV1aWR8IG9yIHx0eXBlfCBjb3JyZXNwb25kcyB0byBhbiBlZmZlY3Qgb24gdGhlIHN5c3RlbS4KKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IgPSB7fTsKKyAgICBzdGF0dXNfdCByZXMgPSBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIHV1aWQsIHR5cGUsIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IEZhaWxlZCB0byBmaW5kIGVmZmVjdCBkZXNjcmlwdG9yIG1hdGNoaW5nIHV1aWQvdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBPbmx5IHByZS1wcm9jZXNzaW5nIGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHNvdXJjZSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRGVzaXJlZCBlZmZlY3QgY2Fubm90IGJlIGF0dGFjaGVkICIKKyAgICAgICAgICAgICAgImFzIGEgc291cmNlIGRlZmF1bHQgZWZmZWN0LiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBGaW5kIHRoZSBFZmZlY3REZXNjVmVjdG9yIGZvciB0aGUgZ2l2ZW4gc291cmNlIHR5cGUsIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LgorICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoc291cmNlKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIE5vIGVmZmVjdHMgZm9yIHRoaXMgc291cmNlIHR5cGUgeWV0LgorICAgICAgICBkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICAgICAgbUlucHV0U291cmNlcy5hZGQoc291cmNlLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZWZmZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHZlY3Rvci4KKyAgICByZXMgPSBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoaWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogZmFpbGVkIHRvIGdldCBuZXcgdW5pcXVlIGlkLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCisKKyAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZXRyb2FjdGl2ZWx5IGF0dGFjaCB0byBhbnkgZXhpc3Rpbmcgc291cmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLyBUaGlzIHJlcXVpcmVzIHRyYWNraW5nIHRoZSBzb3VyY2UgdHlwZSBvZiBlYWNoIHNlc3Npb24gaWQgaW4gYWRkaXRpb24gdG8gd2hhdCBpcworICAgIC8vIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gYXVkaW9fdXNhZ2VfdG9fc3RyZWFtX3R5cGUodXNhZ2UpOworCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHx1dWlkfCBvciB8dHlwZXwgY29ycmVzcG9uZHMgdG8gYW4gZWZmZWN0IG9uIHRoZSBzeXN0ZW0uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgc3RhdHVzX3QgcmVzID0gQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICB1dWlkLCB0eXBlLCBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCwgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgaW5zZXJ0IGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHN0cmVhbSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IERlc2lyZWQgZWZmZWN0IGNhbm5vdCBiZSBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICJhcyBhIHN0cmVhbSBkZWZhdWx0IGVmZmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gRmluZCB0aGUgRWZmZWN0RGVzY1ZlY3RvciBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW0pOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzdHJlYW0gdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtT3V0cHV0U3RyZWFtcy5hZGQoc3RyZWFtLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGVmZmVjdCBhbmQgYWRkIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgcmVzID0gQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IGZhaWxlZCB0byBnZXQgbmV3IHVuaXF1ZSBpZC4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgorCisgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmV0cm9hY3RpdmVseSBhdHRhY2ggdG8gYW55IGV4aXN0aW5nIHN0cmVhbXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgLy8gVGhpcyByZXF1aXJlcyB0cmFja2luZyB0aGUgc3RyZWFtIHR5cGUgb2YgZWFjaCBzZXNzaW9uIGlkIGluIGFkZGl0aW9uIHRvIHdoYXQgaXMKKyAgICAvLyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQuCisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc291cmNlIHR5cGUuCisgICAgc2l6ZV90IG51bVNvdXJjZXMgPSBtSW5wdXRTb3VyY2VzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNvdXJjZXM7ICsraSkgeworICAgICAgICAvLyBDaGVjayBlYWNoIGVmZmVjdCBmb3IgZWFjaCBzb3VyY2UuCisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IqIGRlc2NWZWN0b3IgPSBtSW5wdXRTb3VyY2VzW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzb3VyY2VzIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc3RyZWFtIHR5cGUuCisgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJlYW1zOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc3RyZWFtLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbU91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIGZvciAoYXV0byBkZXNjID0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuYmVnaW4oKTsgZGVzYyAhPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lbmQoKTsgKytkZXNjKSB7CisgICAgICAgICAgICBpZiAoKCpkZXNjKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmVtb3ZlIGZyb20gYW55IHN0cmVhbXMgdGhlIGVmZmVjdCB3YXMgYXR0YWNoZWQgdG8uCisgICAgICAgICAgICAgICAgZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZXJhc2UoZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWF0Y2gsIHNvIHJldHVybiBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFZmZlY3Qgd2Fzbid0IGZvdW5kLCBzbyBpdCdzIGJlZW4gdHJpdmlhbGx5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogdm9pZCBBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdFZlY3Rvcjo6c2V0UHJvY2Vzc29yRW5hYmxlZChib29sIGVuYWJsZWQpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAppbmRleCA2MjMxODBlLi42YWQwMWY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKQEAgLTY0LDcgKzY0LDYgQEAKICAgICBzdGF0dXNfdCByZWxlYXNlSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbik7CiAKLQogICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZWZmZWN0IGRlc2NyaXB0b3JzIGZvciBkZWZhdWx0IG91dHB1dCBlZmZlY3RzCiAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGF1ZGlvU2Vzc2lvbgogICAgIHN0YXR1c190IHF1ZXJ5RGVmYXVsdE91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCkBAIC04MiwxOCArODEsNjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzb3VyY2VzIG9mIHR5cGUgfHNvdXJjZXwuCisgICAgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvLyBBZGQgdGhlIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IGVmZmVjdHMgZm9yIHN0cmVhbXMgb2YgYSBnaXZlbiB1c2FnZS4KKyAgICBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgc291cmNlIGVmZmVjdCBmcm9tIHdoZXJldmVyIGl0J3MgYXR0YWNoZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgc3RyZWFtIGVmZmVjdCBmcm9tIHdoZXJldmVyIGl0J3MgYXR0YWNoZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKIHByaXZhdGU6CiAKICAgICAvLyBjbGFzcyB0byBzdG9yZSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWZmZWN0cyBhbmQgaXRzIHBhcmFtZXRlcnMKICAgICAvLyBhcyBkZWZpbmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZgogICAgIGNsYXNzIEVmZmVjdERlc2MgewogICAgIHB1YmxpYzoKLSAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90JiB0eXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAobmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCkgeyB9CisgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZVV1aWQodHlwZVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eShwcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICBtSWQoaWQpIHsgfQorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdERlc2MobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkVGRkVDVF9VVUlEX05VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7IH0KICAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBFZmZlY3REZXNjJiBvcmlnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAob3JpZy5tTmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQob3JpZy5tVXVpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGVVdWlkKG9yaWcubVR5cGVVdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9yaWcubU9wUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQob3JpZy5tVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkob3JpZy5tUHJpb3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkKG9yaWcubUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5IG1QYXJhbXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG9yaWcubVBhcmFtcy5zaXplKCk7IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqb3JpZ1BhcmFtID0gb3JpZy5tUGFyYW1zW2tdOwpAQCAtMTE2LDcgKzE1NywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNoYXIgKm1OYW1lOworICAgICAgICBlZmZlY3RfdXVpZF90IG1UeXBlVXVpZDsKKyAgICAgICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CiAgICAgICAgIGVmZmVjdF91dWlkX3QgbVV1aWQ7CisgICAgICAgIGludDMyX3QgbVByaW9yaXR5OworICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBtSWQ7CiAgICAgICAgIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4gbVBhcmFtczsKICAgICB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggNzMzN2YwNC4uNDM5NzY0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMTcsMTIgKzE3LDEyIEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5SW50ZWZhY2VJbXBsIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTgzLDcgKzE4Myw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgICAgICAhbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkLCB1aWQpKSB7CiAgICAgICAgIC8vIElmIHRoZSBhcHAgdHJpZXMgdG8gcGxheSBtdXNpYyB0aHJvdWdoIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGFuZCBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbgogICAgICAgICAvLyB0aGUgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgb3V0cHV0IGRldmljZS4KLSAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dCgqb3V0cHV0LCAqc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dCgqcG9ydElkKTsKICAgICAgICAgZmxhZ3MgPSBvcmlnaW5hbEZsYWdzOwogICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwpAQCAtMjA4LDkzICsyMDgsMTE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKICAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNwIDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgbmV3IEF1ZGlvUGxheWJhY2tDbGllbnQoKmF0dHIsICpvdXRwdXQsIHVpZCwgcGlkLCBzZXNzaW9uLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnN0cmVhbSk7CisgICAgICAgIG1BdWRpb1BsYXliYWNrQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKKyAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gc3RyZWFtCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIH0KICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQocG9ydElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChwb3J0SWQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCIpOworICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBzdHJlYW0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cygKKyAgICAgICAgICAgIGNsaWVudC0+aW8sIGNsaWVudC0+c3RyZWFtLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIH0KICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wT3V0cHV0KHBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChwb3J0SWQpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworICAgIG1BdWRpb1JlY29yZENsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOworCiAgICAgLy8gY2FsbGVkIGZyb20gaW50ZXJuYWwgdGhyZWFkOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQotICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtMzIwLDcgKzM0Myw3IEBACiAKICAgICBib29sIHVwZGF0ZVBpZCA9IChwaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRih1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCB1aWQpOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwpAQCAtMzk4LDE3ICs0MjEsMTMgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewogICAgICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCpwb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgb3BQYWNrYWdlTmFtZSwgc2Vzc2lvbik7Ci0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNDb25jdXJyZW50ID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlID0gZmFsc2U7IC8vVE9ETyA6IHVwZGF0ZSBmcm9tIEFQTS0+Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgY2xpZW50LT5kZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkLCBvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAKQEAgLTQzNSwyMyArNDU0LDYgQEAKICAgICByZXR1cm4gcmF3YnVmZmVyOwogfQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db25jdXJyZW5jeVN0cmluZygKLSAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSkKLXsKLSAgICBjaGFyIGJ1ZmZlcls2NF07IC8vIG92ZXJzaXplZAotICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyVzJXMlcyIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwpPyAiLGNhbGwiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKT8gIixjYXB0dXJlIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCk/ICIsaG90d29yZCI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQpPyAiLHByZWVtcHQiOiIiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLG5vbmUiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJmJ1ZmZlclsxXTsKLX0KLQogc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgc3RkOjpzdHJpbmcgdHlwZVN0cjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0ID0ge307CkBAIC00NjMsNyArNDY1LDcgQEAKICAgICByZXR1cm4gdHlwZVN0cjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sICpzaWxlbmNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDg2LDE4ICs0ODgsMTYgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIC8vIElmIFVJRCBpbmFjdGl2ZSBpdCByZWNvcmRzIHNpbGVuY2UgdW50aWwgYmVjb21pbmcgYWN0aXZlCi0gICAgKnNpbGVuY2VkID0gIW1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKGNsaWVudC0+dWlkKSAmJiAhY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2U7Ci0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kgPQotICAgICAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOworCisgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICB7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbiwgKnNpbGVuY2VkLCAmY29uY3VycmVuY3kpOworICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KHBvcnRJZCk7CiAKICAgICB9CiAKQEAgLTUwNiw3ICs1MDYsNiBAQAogCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lbXSA9ICJhdWRpb3BvbGljeSI7CiAKLSAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJlYXNvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucmVhc29uIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVN0YXR1c1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuc3RhdHVzIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RQa2dbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3QucGtnIjsKQEAgLTUyMyw2MSArNTIyLDQ5IEBACiAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0F1ZGlvUG9saWN5KTsKICAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgewogCi0gICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJlYXNvbiwgYXVkaW9Db25jdXJyZW5jeVN0cmluZyhjb25jdXJyZW5jeSkuY19zdHIoKSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lTdGF0dXMsIHN0YXR1cyk7CiAKICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7Ci0gICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbiwgY2xpZW50LT5zZXNzaW9uKTsKLQorICAgICAgICAgICAgaWYgKGNsaWVudC0+b3BQYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywgc3RkOjp0b19zdHJpbmcoY2xpZW50LT51aWQpLmNfc3RyKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgICAgICAgICAga0F1ZGlvUG9saWN5UnFzdERldmljZSwgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChjbGllbnQtPmRldmljZUlkKS5jX3N0cigpKTsKIAotICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aG8gaXMgYWN0aXZlCi0gICAgICAgICAgICAvLyBOQjogbWlnaHQgdGhlIG90aGVyIHBhcnR5IGhhdmUgZ2l2ZW4gdXAgdGhlIG1pY3JvcGhvbmUgc2luY2UgdGhlbj8gaG93IHN1cmUuCi0gICAgICAgICAgICAvLyBwZXJoYXBzIGNvdWxkIGhhdmUgZ2l2ZW4gdXAgb24gaXQuCi0gICAgICAgICAgICAvLyB3ZSBob2xkIG1Mb2NrLCBzbyBwZXJoYXBzIHdlJ3JlIHNhZmUgZm9yIHRoaXMgbG9vcGluZwotICAgICAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICE9IEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSkgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPmFjdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhlIGxhc3Qgb2YgdGhlIGNsaWVudHMgbWFya2VkIGFjdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKG90aGVyLT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocG9ydElkID09IG1BdWRpb1JlY29yZENsaWVudHMua2V5QXQoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBvdGhlciA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXItPmFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKG90aGVyLT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyLT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KG90aGVyLT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uLCBvdGhlci0+c2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KG90aGVyLT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKG90aGVyLT51aWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQob3RoZXItPmRldmljZUlkKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZWxmcmVjb3JkKCk7CiAgICAgICAgICAgICBkZWxldGUgaXRlbTsKICAgICAgICAgICAgIGl0ZW0gPSBOVUxMOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvbmN1cnJlbmN5ICYgfkF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydElucHV0KCk6IGludmFsaWQgY29uY3VycmVuY3kgdHlwZSAlZCIsIChpbnQpY29uY3VycmVuY3kpOwotCi0gICAgICAgIC8vIGVuZm9yY2UgcGVybWlzc2lvbiAoaWYgYW55KSByZXF1aXJlZCBmb3IgZWFjaCB0eXBlIG9mIGNvbmN1cnJlbmN5Ci0gICAgICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCkgewotICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBpbmNhbGwgY2FwdHVyZSBwZXJtaXNzaW9uCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGNvbmN1cnJlbnQgY2FwdHVyZSBwZXJtaXNzaW9uCi0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICB9CiAKQEAgLTU4OSw2ICs1NzYsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKQEAgLTU5OCwxMSArNTg2LDE0IEBACiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CiAKICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOworCisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIC8vIGZpbmlzaCB0aGUgcmVjb3JkaW5nIGFwcCBvcAogICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC02MjAsNiArNjExLDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyByZWxlYXNpbmcgYWN0aXZlIGNsaWVudCBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgICAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworICAgICAgICB9CisKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7CiAgICAgfQogICAgIGlmIChjbGllbnQgPT0gMCkgewpAQCAtNjI3LDE1ICs2MjYsMTUgQEAKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGNsaWVudC0+aW8sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlucHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgY2xpZW50LT5pbyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgfQogfQogCkBAIC04MDMsMjcgKzgwMiwxMDAgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cygKICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKIGJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtODM3LDYgKzkwOSwxNyBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtOTU1LDI2ICsxMDM4LDI2IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSwKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEwMzYsNCArMTExOSwyOSBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBc3Npc3RhbnRVaWQodWlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBMTF5VWlkcyh1aWRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCIlcywgbUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZjNjZGRjMy4uNDE2ODE3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KQEAgLTM1LDE2ICszNCwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CkBAIC03MCw4ICs2OCw2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCi0gICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAogICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCkBAIC04OSwxMSArODUsMTMgQEAKIAogICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwogICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworCisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCiB7Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOwogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+ZXhpdCgpOwogCkBAIC0xMDUsNiArMTAzLDkgQEAKIAogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiAgICAgbVVpZFBvbGljeS5jbGVhcigpOworCisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kuY2xlYXIoKTsKIH0KIAogLy8gQSBub3RpZmljYXRpb24gY2xpZW50IGlzIGFsd2F5cyByZWdpc3RlcmVkIGJ5IEF1ZGlvU3lzdGVtIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzCkBAIC0xMTgsMTMgKzExOSwxNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKLSAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCBwaWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCwgcGlkKTsKIAotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodG9rZW4sIG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwpAQCAtMTM2LDIyICsxNDEsMzMgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHVpZCktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOwogfQogCiAvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCkKIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHVpZCk7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odG9rZW4pOwogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIGJvb2wgaGFzU2FtZVVpZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgaGFzU2FtZVVpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgJiYgIWhhc1NhbWVVaWQpIHsKICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIGJpbmRlciBkZWF0aCBub3RpZmljYXRpb246IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlUmVzb3VyY2VzRm9yVWlkKHVpZCk7CiAgICAgICAgIH0KQEAgLTE5OSwyMiArMjE1LDM0IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTIzOSw4ICsyNjcsOSBAQAogCiBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtUGlkKHBpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKQogewogfQpAQCAtMjU0LDcgKzI4Myw3IEBACiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBrZWVwKHRoaXMpOwogICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkKTsKKyAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQsIG1QaWQpOwogICAgIH0KIH0KIApAQCAtMjc1LDE5ICszMDQsMjQgQEAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKAogICAgICAgICBjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0zMjUsMjQgKzM1OSwxNjggQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG9uZXMgVGhyZWFkOiAlcFxuIiwgbVRvbmVQbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVwZGF0ZVVpZFN0YXRlcygpCiB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewotICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnVwZGF0ZVVpZFN0YXRlc19sKCkKK3sKKy8vICAgIEdvIG92ZXIgYWxsIGFjdGl2ZSBjbGllbnRzIGFuZCBhbGxvdyBjYXB0dXJlIChkb2VzIG5vdCBmb3JjZSBzaWxlbmNlKSBpbiB0aGUKKy8vICAgIGZvbGxvd2luZyBjYXNlczoKKy8vICAgIFRoZSBjbGllbnQgaXMgdGhlIGFzc2lzdGFudAorLy8gICAgICAgIEFORCBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgb24gVE9QCisvLyAgICAgICAgICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgICAgICBPUiB1c2VzIFZPSUNFX1JFQ09HTklUSU9OIEFORCBpcyBvbiBUT1AgT1IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICAgICAgICAgT1IgdXNlcyBIT1RXT1JECisvLyAgICAgICAgICAgIEFORCB0aGVyZSBpcyBubyBwcml2YWN5IHNlbnNpdGl2ZSBhY3RpdmUgY2FwdHVyZQorLy8gICAgT1IgVGhlIGNsaWVudCBpcyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRAorLy8gICAgT1IgQW55IG90aGVyIGNsaWVudAorLy8gICAgICAgIEFORCBUaGUgYXNzaXN0YW50IGlzIG5vdCBvbiBUT1AKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZXJlIGlzIG5vIHByaXZhY3kgc2Vuc2l0aXZlIGFjdGl2ZSBjYXB0dXJlCisvL1RPRE86IG1hbWFuYWdlIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgYWNjb3JkaW5nIHRvIHVzZSBjYXNlIHByaW9yaXR5CisKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gdG9wQWN0aXZlOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKyAgICBuc2Vjc190IHRvcFN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0U3RhcnROcyA9IDA7CisgICAgbnNlY3NfdCBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gMDsKKyAgICBib29sIGlzQTExeU9uVG9wID0gbVVpZFBvbGljeS0+aXNBMTF5T25Ub3AoKTsKKyAgICBib29sIGlzQXNzaXN0YW50T25Ub3AgPSBmYWxzZTsKKyAgICBib29sIGlzU2Vuc2l0aXZlQWN0aXZlID0gZmFsc2U7CisKKyAgICAvLyBpZiBTZW5zb3IgUHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIHJlY29yZGluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIGNvbnRpbnVlOworICAgICAgICBpZiAoaXNQcml2YWN5U2Vuc2l0aXZlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcykgeworICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNTZW5zaXRpdmVBY3RpdmUgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChtVWlkUG9saWN5LT5nZXRVaWRTdGF0ZShjdXJyZW50LT51aWQpID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1ApIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IHRvcFN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICB0b3BBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIHRvcFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U3RhcnROcykgeworICAgICAgICAgICAgbGF0ZXN0QWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgIGxhdGVzdFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0b3BBY3RpdmUgPT0gbnVsbHB0ciAmJiBsYXRlc3RBY3RpdmUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRvcEFjdGl2ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGxhdGVzdEFjdGl2ZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBpZiAoIWN1cnJlbnQtPmFjdGl2ZSkgY29udGludWU7CisKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2U7CisgICAgICAgIGJvb2wgaXNPblRvcCA9IGN1cnJlbnQgPT0gdG9wQWN0aXZlOworICAgICAgICBib29sIGlzTGF0ZXN0ID0gY3VycmVudCA9PSBsYXRlc3RBY3RpdmU7CisgICAgICAgIGJvb2wgaXNMYXRlc3RTZW5zaXRpdmUgPSBjdXJyZW50ID09IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKyAgICAgICAgYm9vbCBmb3JjZUlkbGUgPSB0cnVlOworICAgICAgICBpZiAobVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudC0+dWlkKSkgeworICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCgoKGlzT25Ub3AgfHwgaXNMYXRlc3QpICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFpc1NlbnNpdGl2ZUFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIGlmICgoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYKKyAgICAgICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7CisgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWlzQXNzaXN0YW50T25Ub3AgJiYgKGlzT25Ub3AgfHwgaXNMYXRlc3QpICYmCisgICAgICAgICAgICAgICAgKCFpc1NlbnNpdGl2ZUFjdGl2ZSB8fCBpc0xhdGVzdFNlbnNpdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPyBBUFBfU1RBVEVfSURMRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIHNldEFwcFN0YXRlX2woY3VycmVudC0+dWlkLCBBUFBfU1RBVEVfSURMRSk7CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK2FwcF9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6YXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKSB7CisgICAgc3dpdGNoIChhbVN0YXRlKSB7CisgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuIEFQUF9TVEFURV9JRExFOworICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDoKKyAgICAgICAgcmV0dXJuIEFQUF9TVEFURV9UT1A7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBUFBfU1RBVEVfRk9SRUdST1VORDsKK30KKworLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNQcml2YWN5U2Vuc2l0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFwcFN0YXRlKHVpZCwgc3RhdGUpOwogICAgIH0KICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZikgeworICAgICAgICBib29sIHNpbGVuY2VkID0gc3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7CiAgICAgICAgIGFmLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKICAgICB9CiB9CkBAIC0zNjIsOSArNTQwLDYgQEAKICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZHVtcChmZCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1Ub25lUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZHVtcChmZCk7Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgewogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+ZHVtcChmZCk7CkBAIC01MDUsNyArNjgwLDggQEAKICAgICBBY3Rpdml0eU1hbmFnZXIgYW07CiAgICAgYW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCiAgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFLAorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ1NUQVRFLAogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCiAgICAgICAgICAgICBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CiAgICAgc3RhdHVzX3QgcmVzID0gYW0ubGlua1RvRGVhdGgodGhpcyk7CkBAIC01MTQsNiArNjkwLDcgQEAKICAgICAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIlVpZFBvbGljeTo6cmVnaXN0ZXJTZWxmIGxpbmtUb0RlYXRoIGZhaWxlZDogJWQiLCByZXMpOworCiAgICAgICAgIGFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKICAgICB9CiB9CkBAIC01MzIsOCArNzA5LDcgQEAKICAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuIHRydWU7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpjaGVja1JlZ2lzdGVyZWQoKSB7CiAgICAgYm9vbCBuZWVkVG9SZXJlZ2lzdGVyID0gZmFsc2U7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNTQzLDEwMyArNzE5LDIxMyBAQAogICAgICAgICAvLyBMb29rcyBsaWtlIEFjdGl2aXR5TWFuYWdlciBoYXMgZGllZCBwcmV2aW91c2x5LCBhdHRlbXB0IHRvIHJlLXJlZ2lzdGVyLgogICAgICAgICByZWdpc3RlclNlbGYoKTsKICAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgY2hlY2tSZWdpc3RlcmVkKCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhdXRvIG92ZXJyaWRlSXRlciA9IG1PdmVycmlkZVVpZHMuZmluZCh1aWQpOwogICAgICAgICBpZiAob3ZlcnJpZGVJdGVyICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUl0ZXItPnNlY29uZC5maXJzdDsKICAgICAgICAgfQogICAgICAgICAvLyBJbiBhbiBhYnNlbnNlIG9mIHRoZSBBY3Rpdml0eU1hbmFnZXIsIGFzc3VtZSBldmVyeXRoaW5nIHRvIGJlIGFjdGl2ZS4KICAgICAgICAgaWYgKCFtT2JzZXJ2ZXJSZWdpc3RlcmVkKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgYXV0byBjYWNoZUl0ZXIgPSBtQ2FjaGVkVWlkcy5maW5kKHVpZCk7CiAgICAgICAgIGlmIChjYWNoZUl0ZXIgIT0gbUNhY2hlZFVpZHMuZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZC5maXJzdDsKICAgICAgICAgfQogICAgIH0KICAgICBBY3Rpdml0eU1hbmFnZXIgYW07CiAgICAgYm9vbCBhY3RpdmUgPSBhbS5pc1VpZEFjdGl2ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1DYWNoZWRVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIGJvb2w+KHVpZCwgYWN0aXZlKSk7CisgICAgICAgIG1DYWNoZWRVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLCBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikpKTsKICAgICB9CiAgICAgcmV0dXJuIGFjdGl2ZTsKIH0KIAoraW50IEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpnZXRVaWRTdGF0ZSh1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKKyAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1A7CisgICAgfQorICAgIGNoZWNrUmVnaXN0ZXJlZCgpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVJdGVyLT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGVJdGVyLT5zZWNvbmQuc2Vjb25kICE9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZUl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjYWNoZUl0ZXIgPSBtQ2FjaGVkVWlkcy5maW5kKHVpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUl0ZXIgIT0gbUNhY2hlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCisgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1A7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjYWNoZUl0ZXIgPSBtQ2FjaGVkVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChjYWNoZUl0ZXIgIT0gbUNhY2hlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChjYWNoZUl0ZXItPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZUl0ZXItPnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBY3Rpdml0eU1hbmFnZXIgYW07CisgICAgYm9vbCBhY3RpdmUgPSBhbS5pc1VpZEFjdGl2ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICBpbnQgc3RhdGUgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIHN0YXRlID0gYW0uZ2V0VWlkUHJvY2Vzc1N0YXRlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1DYWNoZWRVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLCBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsIHN0YXRlKSkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0ZTsKK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRBY3RpdmUodWlkX3QgdWlkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCB0cnVlLCB0cnVlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIHRydWUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCB0cnVlKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRHb25lKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIGZhbHNlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIGZhbHNlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgZmFsc2UpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZElkbGUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgdHJ1ZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCBmYWxzZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIHRydWUpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdCB7Ci0gICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPCBBSURfQVBQX1NUQVJUOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsKLSAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgewotICAgICAgICBzZXJ2aWNlLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsICFhY3RpdmUpOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9jU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHByb2NTdGF0ZVNlcSBfX3VudXNlZCkgeworICAgIGlmIChwcm9jU3RhdGUgIT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCB0cnVlLCBwcm9jU3RhdGUsIHRydWUpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKLSAgICBib29sIHdhc092ZXJyaWRkZW4gPSBmYWxzZSwgd2FzQWN0aXZlID0gZmFsc2U7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB1cGRhdGVVaWRMb2NrZWQoJm1PdmVycmlkZVVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsICZ3YXNPdmVycmlkZGVuLCAmd2FzQWN0aXZlKTsKLSAgICB9Ci0gICAgaWYgKCF3YXNPdmVycmlkZGVuICYmIGluc2VydCkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIFN0YXJ0ZWQgdG8gb3ZlcnJpZGUuCi0gICAgfSBlbHNlIGlmICh3YXNPdmVycmlkZGVuICYmICFpbnNlcnQpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGlzVWlkQWN0aXZlKHVpZCkpOyAgLy8gT3ZlcnJpZGUgY2Vhc2VkLCBub3RpZnkgd2l0aCBncm91bmQgdHJ1dGguCi0gICAgfSBlbHNlIGlmICh3YXNBY3RpdmUgIT0gYWN0aXZlKSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gT3ZlcnJpZGUgdXBkYXRlZC4KKyAgICB1cGRhdGVVaWQoJm1PdmVycmlkZVVpZHMsIHVpZCwgYWN0aXZlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgaW5zZXJ0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6bm90aWZ5U2VydmljZSgpIHsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT51cGRhdGVVaWRTdGF0ZXMoKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47Ci0gICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnNlcnQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIHdhc0FjdGl2ZSA9IGlzVWlkQWN0aXZlKHVpZCk7CisgICAgaW50IHByZXZpb3VzU3RhdGUgPSBnZXRVaWRTdGF0ZSh1aWQpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtQ2FjaGVkVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgbnVsbHB0ciwgJndhc0FjdGl2ZSk7Ci0gICAgICAgIC8vIERvIG5vdCBub3RpZnkgc2VydmljZSBpZiBjdXJyZW50bHkgb3ZlcnJpZGRlbi4KLSAgICAgICAgaWYgKG1PdmVycmlkZVVpZHMuZmluZCh1aWQpICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHJldHVybjsKKyAgICAgICAgdXBkYXRlVWlkTG9ja2VkKHVpZHMsIHVpZCwgYWN0aXZlLCBzdGF0ZSwgaW5zZXJ0KTsKICAgICB9Ci0gICAgYm9vbCBub3dBY3RpdmUgPSBhY3RpdmUgJiYgaW5zZXJ0OwotICAgIGlmICh3YXNBY3RpdmUgIT0gbm93QWN0aXZlKSBub3RpZnlTZXJ2aWNlKHVpZCwgbm93QWN0aXZlKTsKKyAgICBpZiAod2FzQWN0aXZlICE9IGlzVWlkQWN0aXZlKHVpZCkgfHwgc3RhdGUgIT0gcHJldmlvdXNTdGF0ZSkgeworICAgICAgICBub3RpZnlTZXJ2aWNlKCk7CisgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiAqdWlkcywKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpIHsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnNlcnQpIHsKICAgICBhdXRvIGl0ID0gdWlkcy0+ZmluZCh1aWQpOwogICAgIGlmIChpdCAhPSB1aWRzLT5lbmQoKSkgewotICAgICAgICBpZiAod2FzVGhlcmUgIT0gbnVsbHB0cikgKndhc1RoZXJlID0gdHJ1ZTsKLSAgICAgICAgaWYgKHdhc0FjdGl2ZSAhPSBudWxscHRyKSAqd2FzQWN0aXZlID0gaXQtPnNlY29uZDsKICAgICAgICAgaWYgKGluc2VydCkgewotICAgICAgICAgICAgaXQtPnNlY29uZCA9IGFjdGl2ZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuZmlyc3QgPSBhY3RpdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kID0gc3RhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aWRzLT5lcmFzZShpdCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGluc2VydCkgewotICAgICAgICB1aWRzLT5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgIH0gZWxzZSBpZiAoaW5zZXJ0ICYmIChzdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikpIHsKKyAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLCBzdGF0ZSkpKTsKICAgICB9CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzQTExeU9uVG9wKCkgeworICAgIGZvciAoY29uc3QgYXV0byAmdWlkIDogbUNhY2hlZFVpZHMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+OjppdGVyYXRvciBpdCA9IGZpbmQobUExMXlVaWRzLmJlZ2luKCksIG1BMTF5VWlkcy5lbmQoKSwgdWlkLmZpcnN0KTsKKyAgICAgICAgaWYgKGl0ID09IG1BMTF5VWlkcy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpZC5zZWNvbmQuc2Vjb25kID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1AgfHwKKyAgICAgICAgICAgIHVpZC5zZWNvbmQuc2Vjb25kID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9GT1JFR1JPVU5EX1NFUlZJQ0UgfHwKKyAgICAgICAgICAgIHVpZC5zZWNvbmQuc2Vjb25kID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9CT1VORF9GT1JFR1JPVU5EX1NFUlZJQ0UpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBMTF5VWlkKHVpZF90IHVpZCkKK3sKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQTExeVVpZHMuYmVnaW4oKSwgbUExMXlVaWRzLmVuZCgpLCB1aWQpOworICAgIHJldHVybiBpdCAhPSBtQTExeVVpZHMuZW5kKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lTZXJ2aWNlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKKyAgICBzcG0ucmVtb3ZlU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpIHsKKyAgICByZXR1cm4gbVNlbnNvclByaXZhY3lFbmFibGVkOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT51cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQogCiBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKICAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQogewotICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7CiB9CiAKIApAQCAtNjQ5LDcgKzkzNSw2IEBACiAgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKLSAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTY3NCw2OCArOTU5LDU0IEBACiAgICAgICAgICAgICAgICAgbUxhc3RDb21tYW5kID0gY29tbWFuZDsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRvbmVEYXRhICpkYXRhID0gKFRvbmVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdGFydCB0b25lICVkIG9uIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVR5cGUsIGRhdGEtPm1TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBuZXcgVG9uZUdlbmVyYXRvcihkYXRhLT5tU3RyZWFtLCAxLjApOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0YXJ0VG9uZShkYXRhLT5tVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIHRvbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZUdlbmVyYXRvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKICAgICAgICAgICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVZvbHVtZSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGRhdGEtPm1TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGRhdGEtPm1JTywgZGF0YS0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0lDRV9WT0xVTUU6IHsKICAgICAgICAgICAgICAgICAgICAgVm9pY2VWb2x1bWVEYXRhICpkYXRhID0gKFZvaWNlVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogewogICAgICAgICAgICAgICAgICAgICBTdG9wT3V0cHV0RGF0YSAqZGF0YSA9IChTdG9wT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7CiAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gKFJlbGVhc2VPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgcG9ydElkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7CkBAIC03NDUsNyArMTAxNiw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+Y3JlYXRlQXVkaW9QYXRjaCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKQEAgLTc1NSw3ICsxMDI4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5yZWxlYXNlQXVkaW9QYXRjaChkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0FVRElPUE9SVF9MSVNUOiB7CkBAIC03ODUsNyArMTA2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZkYXRhLT5tQ29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFOiB7CkBAIC04MTEsOCArMTA4OCw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZGF0YS0+bUV2ZW50LCAmZGF0YS0+bUNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsICZkYXRhLT5tRGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1DbGllbnRDb25maWcsIGRhdGEtPm1DbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tRGV2aWNlQ29uZmlnLCBkYXRhLT5tRWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUsIGRhdGEtPm1Tb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTkwMCwyNyArMTE3OCw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOwotICAgIHNwPFRvbmVEYXRhPiBkYXRhID0gbmV3IFRvbmVEYXRhKCk7Ci0gICAgZGF0YS0+bVR5cGUgPSB0eXBlOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0b3AiKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC05NjcsMzMgKzEyMjQsMjUgQEAKICAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKICAgICBzcDxTdG9wT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7CiAgICAgc3A8UmVsZWFzZU91dHB1dERhdGE+IGRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZGF0YS0+bVBvcnRJZCA9IHBvcnRJZDsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgcG9ydElkICVkIiwgcG9ydElkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApAQCAtMTA3Niw5ICsxMzI1LDE0IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CkBAIC0xMDg2LDggKzEzNDAsMTEgQEAKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKICAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOworICAgIGRhdGEtPm1DbGllbnRFZmZlY3RzID0gY2xpZW50RWZmZWN0czsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKKyAgICBkYXRhLT5tRWZmZWN0cyA9IGVmZmVjdHM7CiAgICAgZGF0YS0+bVBhdGNoSGFuZGxlID0gcGF0Y2hIYW5kbGU7CisgICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwogICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQgdWlkICV1IiwKICAgICAgICAgICAgIGV2ZW50LCBjbGllbnRJbmZvLT5zb3VyY2UsIGNsaWVudEluZm8tPnVpZCk7CkBAIC0xMjEyLDYgKzE0NjksNyBAQAogICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG1lbXNldCgmcGF0Y2gsIDAsIHNpemVvZihwYXRjaCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CkBAIC0xMjU2LDggKzE1MTQsNiBAQAogCiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBTVEFSVF9UT05FOgotICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzMwLDI3ICsxNTg2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgZGVsYXlNcyk7CiB9CiAKLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgaWYgKHRvbmUgIT0gQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04pIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCB0b25lIHJlcXVlc3RlZCAoJWQpIiwgdG9uZSk7Ci0gICAgfQotICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCBzdHJlYW0gKCVkKSByZXF1ZXN0ZWQgZm9yIHRvbmUgJWQiLCBzdHJlYW0sCi0gICAgICAgICAgICB0b25lKTsKLSAgICB9Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BUb25lKCkKLXsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdG9wVG9uZUNvbW1hbmQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQogaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKIHsKICAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2ljZVZvbHVtZUNvbW1hbmQodm9sdW1lLCBkZWxheU1zKTsKQEAgLTE0MDYsOSArMTY0MSw2IEBACiBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcyk7Ci1pbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSk7CiBpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggNDA3ZDdhNS4uYzQ0ZDgxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0zMywxMyArMzMsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgogI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5TZW5zb3JQcml2YWN5TGlzdGVuZXIuaD4KIAogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgpAQCAtODMsMTUgKzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTEwMiw4ICs5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0xMzQsNiArMTI2LDIxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtMTU5LDEwICsxNjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7CisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xOTQsOCArMjAxLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTIwOSwxMiArMjE2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCkBAIC0yMjQsNyArMjMyLDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogCi0gICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpOworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwpAQCAtMjMyLDEyICsyNDAsMjIgQEAKIAogICAgICAgICAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICB2b2lkIGRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwotICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOwpAQCAtMjQ5LDcgKzI2Nyw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gVUlEIHJlY29yZHMgb25seSBzaWxlbmNlCi0gICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlX2wodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CkBAIC0yNjUsNiArMjgzLDE3IEBACiAKICAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpOworCisgICAgYXBwX3N0YXRlX3QgYXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKTsKKworICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzKCk7CisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXNfbCgpOworCisgICAgdm9pZCBzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKwogICAgIC8vIElmIHJlY29yZGluZyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgVUlEIGlzIGFsbG93ZWQgdG8gZG8gdGhhdC4gSWYgdGhlIFVJRCBpcyBpZGxlCiAgICAgLy8gdGhlbiBpdCBjYW5ub3QgcmVjb3JkIGFuZCBnZXRzIGJ1ZmZlcnMgd2l0aCB6ZXJvcyAtIHNpbGVuY2UuIEFzIHNvb24gYXMgdGhlIFVJRAogICAgIC8vIHRyYW5zaXRpb25zIHRvIGFuIGFjdGl2ZSBzdGF0ZSB3ZSB3aWxsIHN0YXJ0IHJlcG9ydGluZyBidWZmZXJzIHdpdGggZGF0YS4gVGhpcyBhcHByb2FjaApAQCAtMjc0LDcgKzMwMyw3IEBACiAgICAgY2xhc3MgVWlkUG9saWN5IDogcHVibGljIEJuVWlkT2JzZXJ2ZXIsIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFVpZFBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCi0gICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSkge30KKyAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSwgbUFzc2lzdGFudFVpZCgwKSB7fQogCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CiAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKQEAgLTI4MywzNCArMzEyLDYzIEBACiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSBvdmVycmlkZTsKIAogICAgICAgICBib29sIGlzVWlkQWN0aXZlKHVpZF90IHVpZCk7CisgICAgICAgIGludCBnZXRVaWRTdGF0ZSh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgbUFzc2lzdGFudFVpZCA9IHVpZDsgfQorICAgICAgICBib29sIGlzQXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyByZXR1cm4gdWlkID09IG1Bc3Npc3RhbnRVaWQ7IH0KKyAgICAgICAgdm9pZCBzZXRBMTF5VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsgbUExMXlVaWRzLmNsZWFyKCk7IG1BMTF5VWlkcyA9IHVpZHM7IH0KKyAgICAgICAgYm9vbCBpc0ExMXlVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgYm9vbCBpc0ExMXlPblRvcCgpOwogCiAgICAgICAgIC8vIEJuVWlkT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24KICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxKTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUsIHRydWUpOyB9CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgZmFsc2UsIGZhbHNlKTsgfQogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdDsKLSAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKCk7CiAgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwotICAgICAgICB2b2lkIHVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiAqdWlkcywKLSAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBpbnQgc3RhdGUsIGJvb2wgaW5zZXJ0KTsKKyAgICAgICAgdm9pZCBjaGVja1JlZ2lzdGVyZWQoKTsKIAogICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwogICAgICAgICBNdXRleCBtTG9jazsKICAgICAgICAgYm9vbCBtT2JzZXJ2ZXJSZWdpc3RlcmVkOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7Ci0gICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbUNhY2hlZFVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1PdmVycmlkZVVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1DYWNoZWRVaWRzOworICAgICAgICB1aWRfdCBtQXNzaXN0YW50VWlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUExMXlVaWRzOwogICAgIH07CiAKLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSByZWNvcmRpbmcuIFRoaXMgaXMgaGFuZGxlZCBzaW1pbGFyIHRvIGlkbGUgVUlEcywgYW55IGFwcCB0aGF0IGF0dGVtcHRzCisgICAgLy8gdG8gcmVjb3JkIHdoaWxlIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgd2lsbCByZWNlaXZlIGJ1ZmZlcnMgd2l0aCB6ZXJvcy4gQXMgc29vbiBhcworICAgIC8vIHNlbnNvciBwcml2YWN5IGlzIGRpc2FibGVkIGFjdGl2ZSBhcHBzIHdpbGwgcmVjZWl2ZSB0aGUgZXhwZWN0ZWQgZGF0YSB3aGVuIHJlY29yZGluZy4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlbnNvclByaXZhY3lQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworCisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKKyAgICB9OworCisgICAgLy8gVGhyZWFkIHVzZWQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwogICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KICAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTMxOSw4ICszNzcsNiBAQAogCiAgICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAogICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCiAgICAgICAgICAgICBTRVRfVk9MVU1FLAogICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCiAgICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLApAQCAtMzQ1LDIwICs0MDEsMTMgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNzAsMTMgKzQxOSwxNyBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwpAQCAtMzkwLDcgKzQ0Myw3IEBACiAKICAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKIAotICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KKyAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTRVRfVk9MVU1FLCBTRVRfUEFSQU1FVEVSUy4uLgogICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKICAgICAgICAgICAgIE11dGV4IG1Mb2NrOyAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHRvIG1Db25kCiAgICAgICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgpAQCAtNDA2LDEyICs0NTksNiBAQAogICAgICAgICAgICAgQXVkaW9Db21tYW5kRGF0YSgpIHt9CiAgICAgICAgIH07CiAKLSAgICAgICAgY2xhc3MgVG9uZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCi0gICAgICAgIH07Ci0KICAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwpAQCAtNDMyLDE2ICs0NzksMTIgQEAKIAogICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CkBAIC00NzEsMTQgKzUxNCwxNiBAQAogICAgICAgICAgICAgaW50IG1FdmVudDsKICAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBtQ2xpZW50RWZmZWN0czsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtRGV2aWNlQ29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUVmZmVjdHM7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBtU291cmNlOwogICAgICAgICB9OwogCiAgICAgICAgIE11dGV4ICAgbUxvY2s7CiAgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKLSAgICAgICAgVG9uZUdlbmVyYXRvciAqbXBUb25lR2VuZXJhdG9yOyAgICAgLy8gdGhlIHRvbmUgZ2VuZXJhdG9yCiAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gbUxhc3RDb21tYW5kOyAgICAgIC8vIGxhc3QgcHJvY2Vzc2VkIGNvbW1hbmQgKHVzZWQgYnkgZHVtcCkKICAgICAgICAgU3RyaW5nOCBtTmFtZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHVzZWQgYnkgd2FrZSBsb2NrIGZvIGRlbGF5ZWQgY29tbWFuZHMKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKQEAgLTU1MywxMSArNTk4LDYgQEAKICAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCiAgICAgICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKIAotICAgICAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKLQogICAgICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CiAKQEAgLTU4Miw5ICs2MjIsMTMgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSk7CiAKQEAgLTU5NywxOSArNjQxLDI4IEBACiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKQEAgLTYxOSwzNCArNjcyLDYwIEBACiAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CiAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOwogICAgIH07CiAKKyAgICBjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgaW8oaW8pLCB1aWQodWlkKSwgcGlkKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24oc2Vzc2lvbiksIGRldmljZUlkKGRldmljZUlkKSwgYWN0aXZlKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgorICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbzsgICAgICAgICAgLy8gYXVkaW8gSEFMIHN0cmVhbSBJTyBoYW5kbGUKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKKyAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247ICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBQbGF5YmFjay9DYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQorICAgIH07CisKICAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAogICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKLSAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaW5wdXQpLCB1aWQodWlkKSwgcGlkKHBpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZShmYWxzZSksIGlzQ29uY3VycmVudChmYWxzZSksIGlzVmlydHVhbERldmljZShmYWxzZSkge30KLSAgICAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRDbGllbnQoKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkgOgorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIGRldmljZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc3RhcnRUaW1lTnMoMCkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9SZWNvcmRDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OyAgICAgICAvLyBhdWRpbyBIQUwgaW5wdXQgSU8gaGFuZGxlCi0gICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECi0gICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECiAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWU7ICAgICAgICAvLyBjbGllbnQgcGFja2FnZSBuYW1lCi0gICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQotICAgICAgICBib29sIGlzQ29uY3VycmVudDsgICAgICAgICAgICAgLy8gaXMgYWxsb3dlZCB0byBjb25jdXJyZW50IGNhcHR1cmUKLSAgICAgICAgYm9vbCBpc1ZpcnR1YWxEZXZpY2U7ICAgICAgICAgIC8vIHVzZXMgdmlydHVhbCBkZXZpY2U6IHVwZGF0ZWQgYnkgQVBNOjpnZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgbnNlY3NfdCBzdGFydFRpbWVOczsKKyAgICB9OworCisgICAgLy8gLS0tIEF1ZGlvUGxheWJhY2tDbGllbnQgLS0tCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvVHJhY2sgY2xpZW50CisgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0T3V0cHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlT3V0cHV0KCkpCisgICAgY2xhc3MgQXVkaW9QbGF5YmFja0NsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLCBzdHJlYW0oc3RyZWFtKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb1BsYXliYWNrQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogICAgIH07CiAKICAgICAvLyBBIGNsYXNzIGF1dG9tYXRpY2FsbHkgY2xlYXJpbmcgYW5kIHJlc3RvcmluZyBiaW5kZXIgY2FsbGVyIGlkZW50aXR5IGluc2lkZQpAQCAtNjc2LDIxICs3NTUsMjMgQEAKICAgICAvLyBtTG9jayBwcm90ZWN0cyBBdWRpb1BvbGljeU1hbmFnZXIgbWV0aG9kcyB0aGF0IGNhbiBjYWxsIGludG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIGFuZCBwb3NzaWJseSBiYWNrIGluIHRvIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGFuZCBhY3F1aXJlIG1FZmZlY3RzTG9jay4KICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOwogICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CiAKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQ2NF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CiAgICAgTXV0ZXggbU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrOyAgLy8gcHJvdGVjdHMgbU5vdGlmaWNhdGlvbkNsaWVudHMKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOwogCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHNwPFNlbnNvclByaXZhY3lQb2xpY3k+IG1TZW5zb3JQcml2YWN5UG9saWN5OworCiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1JlY29yZENsaWVudD4gPiAgIG1BdWRpb1JlY29yZENsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiA+ICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYTQzZGFlYS4uMmNjYjU0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC02LDcgKzYsNyBAQAogICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCBcCkBAIC0zMCwzICszMCwyOSBAQAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCisjIHN5c3RlbS9hdWRpby5oIHV0aWxpdGllcyB0ZXN0CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICBsaWJtZWRpYV9oZWFkZXJzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIHN5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBcCisKK0xPQ0FMX01PRFVMRSA6PSBzeXN0ZW1hdWRpb190ZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAorCitMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IGViODIyMmMuLjZhZTM1NGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC02MCw5ICs2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyB9CiAgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfQotICAgIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IC8qdG9uZSovLAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KLSAgICBzdGF0dXNfdCBzdG9wVG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCAvKnZvbHVtZSovLCBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgLypzZXNzaW9uKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypzcmNPdXRwdXQqLywKQEAgLTc4LDExICs3NSwxNCBAQAogICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQogICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IC8qdXNlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggLypyZWdJZCovLCBpbnQzMl90IC8qc3RhdGUqLykgb3ZlcnJpZGUgeyB9Ci0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IC8qZXZlbnQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCogLypjbGllbnRJbmZvKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmNsaWVudENvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypkZXZpY2VDb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAvKnBhdGNoSGFuZGxlKi8pIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgX191bnVzZWQpIG92ZXJyaWRlIHsgfQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKaW5kZXggYTk1OTNiOC4uNTZhZjE1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0xNiw5ICsxNiwxNSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2RlZmluZSBMT0dfVEFHICJBUE1fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RDbGllbnQuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgiCiAKQEAgLTEzMiw2ICsxMzgsMzYgQEAKICAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCiB9CiAKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBEdW1wKSB7CisgICAgaW50IHBpcGVmZFsyXTsKKyAgICBBU1NFUlRfTkUoLTEsIHBpcGUocGlwZWZkKSk7CisgICAgcGlkX3QgY3BpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfTkUoLTEsIGNwaWQpOworICAgIGlmIChjcGlkID09IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSBwaXBlIGFuZCBsb2dzLgorICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBjaGFyIGJ1ZjsKKyAgICAgICAgd2hpbGUgKHJlYWQocGlwZWZkWzBdLCAmYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYnVmICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBsaW5lICs9IGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGFyZW50IGRvZXMgdGhlIGR1bXAgYW5kIGNoZWNrcyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmR1bXAocGlwZWZkWzFdKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHdhaXQoTlVMTCk7ICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyAgICB9Cit9CisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgewogICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CkBAIC0xNjYsMjkgKzIwMiwxNCBAQAogfQogCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZyb21NaXgpIHsKLSAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIHVpZF90IHVpZCA9IDQyOwogICAgIGNvbnN0IHNpemVfdCBwYXRjaENvdW50QmVmb3JlID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc3JjID0gcGF0Y2guc291cmNlc1swXTsKLSAgICAgICAgc3JjLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgICAgICBzcmMudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7Ci0gICAgICAgIHNyYy5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXS0+Z2V0SWQoKTsKLSAgICAgICAgLy8gTm90ZTogdGhlc2UgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgICAgICBzcmMuc2FtcGxlX3JhdGUgPSA0NDEwMDsKLSAgICAgICAgc3JjLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBzcmMuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIH0KLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc2luayA9IHBhdGNoLnNpbmtzWzBdOwotICAgICAgICBzaW5rLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICAgICAgc2luay50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICAgICAgc2luay5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmdldElkKCk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCB1aWQpKTsKKyAgICBBU1NFUlRfRkFMU0UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXSkuCisgICAgICAgICAgICBhZGRTaW5rKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZoYW5kbGUsIHVpZCkpOwogICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKICAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFhZTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvc3lzdGVtYXVkaW9fdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiU3lzQXVkaW9fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hJbnZhbGlkKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDA7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaFZhbGlkKSB7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIC8vIEl0J3MgT0sgbm90IHRvIGhhdmUgc2lua3MuCisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc2luayA9IHsKKyAgICAgICAgLmlkID0gMiwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLgorICAgICAgICAgICAgICAgICAgICBhZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hId0F2U3luYykgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnIGRldmljZV9zcmNfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NyY19jZmcpKTsKKyAgICBkZXZpY2Vfc3JjX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc2lua19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5mbGFncy5pbnB1dCA9IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NpbmtfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBtaXhfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7CisgICAgbWl4X3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaEVxdWFsKSB7CisgICAgY29uc3QgYXVkaW9fcGF0Y2ggcGF0Y2gxe30sIHBhdGNoMnt9OworICAgIC8vIEludmFsaWQgcGF0Y2hlcyBhcmUgbm90IGVxdWFsLgorICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgmcGF0Y2gxLCAmcGF0Y2gyKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtfaHdfYXZfc3luYyA9IHNpbms7CisgICAgc2lua19od19hdl9zeW5jLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtfaHdfYXZfc3luYy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1ZjBiMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vCisvLyBsaWJjYW1lcmFzZXJ2aWNlCisvLworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2UiLAorCisgICAgLy8gQ2FtZXJhIHNlcnZpY2Ugc291cmNlCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJDYW1lcmFGbGFzaGxpZ2h0LmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCIsCisgICAgICAgICJhcGkxL0NhbWVyYUNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAiLAorICAgICAgICAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCIsCisgICAgICAgICJndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIiwKKyAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAorICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCIsCisgICAgICAgICJ1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAiLAorICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAorICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDk2MjYxYWIuLjRjZmVjZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTQsOTEgKzE0LDkgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMKLSMgbGliY2FtZXJhc2VydmljZQotIwotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDYW1lcmEgc2VydmljZSBzb3VyY2UKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICBcCi0gICAgQ2FtZXJhU2VydmljZS5jcHAgXAotICAgIENhbWVyYUZsYXNobGlnaHQuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIFwKLSAgICBjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBcCi0gICAgYXBpMS9DYW1lcmFDbGllbnQuY3BwIFwKLSAgICBhcGkxL0NhbWVyYTJDbGllbnQuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBcCi0gICAgZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIFwKLSAgICBkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIFwKLSAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCi0gICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCi0gICAgdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIFwKLSAgICB1dGlscy9UYWdNb25pdG9yLmNwcCBcCi0gICAgdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJ1aSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlsc2NhbGxzdGFjayBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJmbXEgXAotICAgIGxpYmd1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJtZW11bnJlYWNoYWJsZSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40Ci0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIEJ1aWxkIHRlc3RzIHRvbworIyBCdWlsZCB0ZXN0cwogCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGJhMDI0NGUuLjYwMDM2MDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC00Nyw2ICs0Nyw4IEBACiAjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTY5LDYgKzcxLDcgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgewogICAgIGNvbnN0IGNoYXIqIGtQZXJtaXNzaW9uU2VydmljZU5hbWUgPSAicGVybWlzc2lvbiI7CkBAIC03Nyw2ICs4MCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmE7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYUNsaWVudDsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OwpAQCAtMTQxLDYgKzE0NSwxMSBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKKyAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlZmF1bHQgYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAxLjAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZW51bWVyYXRlUHJvdmlkZXJzKCkgewpAQCAtMzM3LDcgKzM0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVELAogICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogICAgICAgICAgICAgLy8gRW5zdXJlIG5vdCBpbiBiaW5kZXIgUlBDIHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpLAorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpLAogICAgICAgICAgICAgICAgICAgICAib25EZXZpY2VTdGF0dXNDaGFuZ2VkIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGNhbWVyYSBzZXJ2aWNlIHByb2Nlc3MhIik7CiAgICAgICAgICAgICBjbGllbnRUb0Rpc2Nvbm5lY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgfQpAQCAtNDk4LDE3ICs1MDcsMzcgQEAKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICB9CiAKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRhZ3NSZW1vdmVkOworICAgIC8vIElmIGl0J3Mgbm90IGNhbGxpbmcgZnJvbSBjYW1lcmFzZXJ2ZXIsIGNoZWNrIHRoZSBwZXJtaXNzaW9uLgorICAgIGlmICgoY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSkgJiYKKyAgICAgICAgICAgICFjaGVja1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiKSwgY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+cmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoCisgICAgICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSksCisgICAgICAgICAgICAgICAgJnRhZ3NSZW1vdmVkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgY2FtZXJhSW5mby0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCAiRmFpbGVkIHRvIHJlbW92ZSBjYW1lcmEiCisgICAgICAgICAgICAgICAgICAgICIgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcgY2FtZXJhIHBlcm1pc3Npb24gZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGFnc1JlbW92ZWQuZW1wdHkoKSkgeworICAgICAgICByZXMgPSBjYW1lcmFJbmZvLT51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0NIQVJBQ1RFUklTVElDX0tFWVNfTkVFRElOR19QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLmRhdGEoKSwgdGFnc1JlbW92ZWQuc2l6ZSgpKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgY2FtZXJhSW5mby0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCAiRmFpbGVkIHRvIGluc2VydCBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgICAia2V5cyBuZWVkaW5nIHBlcm1pc3Npb24gZm9yIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KLWludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nVWlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci19Ci0KIFN0cmluZzggQ2FtZXJhU2VydmljZTo6Z2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUobnVsbHB0cik7CiAgICAgY2hhciBmb3JtYXR0ZWRUaW1lWzY0XTsKQEAgLTU4OSw3ICs2MTgsNyBAQAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKIAogICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKQEAgLTYwMSw3ICs2MzAsNyBAQAogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7CiAgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCkBAIC02MTQsMTIgKzY0MywxMyBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKj4oY2FtZXJhQ2IuZ2V0KCkpOwpAQCAtNjQzLDcgKzY3Myw3IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgYXBpMUNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCiAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCkBAIC03MzIsNyArNzYyLDcgQEAKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmluaXRpYWxpemVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIFN0cmluZzE2IGludGVybmFsUGFja2FnZU5hbWUoImNhbWVyYXNlcnZlciIpOwogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOwpAQCAtNzQyLDggKzc3Miw3IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIGNhbWVyYUlkLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwKICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHVpZCwgVVNFX0NBTExJTkdfUElELAotICAgICAgICAgICAgQVBJXzEsIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gdG1wKQorICAgICAgICAgICAgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyB0cnVlLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGE6ICVzIiwgX19GVU5DVElPTl9fLCByZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTc4Miw5ICs4MTEsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIHJldCA9IGluaXRpYWxpemVTaGltTWV0YWRhdGEoY2FtZXJhSWQpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC04NDEsNyArODcwLDcgQEAKICAgICB9CiAjZW5kaWYgIC8vIF9fQlJJTExPX18KIAotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbWVyYSBIQUwgbW9kdWxlIG5vdCBsb2FkZWQpIiwKQEAgLTg3NSw4ICs5MDQsOCBAQAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ2xpZW50UGVybWlzc2lvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNsaWVudE5hbWU4LCBpbnQmIGNsaWVudFVpZCwgaW50JiBjbGllbnRQaWQsCiAgICAgICAgIC8qb3V0Ki9pbnQmIG9yaWdpbmFsQ2xpZW50UGlkKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaW50IGNhbGxpbmdVaWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAogICAgIC8vIENoZWNrIGlmIHdlIGNhbiB0cnVzdCBjbGllbnRVaWQKICAgICBpZiAoY2xpZW50VWlkID09IFVTRV9DQUxMSU5HX1VJRCkgewpAQCAtOTQ1LDcgKzk3NCw3IEBACiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNoZWNrSWZEZXZpY2VJc1VzYWJsZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgY29uc3QgewogICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYW1lcmFTdGF0ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGludmFsaWQgY2FtZXJhIElEICVzKSIsIGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOwpAQCAtMTE0OSw3ICsxMTc4LDcgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIC8vIERlc3Ryb3kgZXZpY3RlZCBjbGllbnRzCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKQEAgLTExNTcsNyArMTE4Niw3IEBACiAgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CiAgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLApAQCAtMTIwNywxMSArMTIzNiwxMCBAQAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjM0LDEyICsxMjYyLDExIEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIHRydWUsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyNjMsMTIgKzEyOTAsMTAgQEAKICAgICByZXQgPSBjb25uZWN0SGVscGVyPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAogICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAotICAgICAgICAgICAgLypvdXQqL2NsaWVudCk7CisgICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTI4MCw3ICsxMzA1LDcgQEAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKIApAQCAtMTM2NSw3ICsxMzkwLDcgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgZmFjaW5nLAotICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSwKKyAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgICAgICAgICAgLypvdXQqLyZ0bXApKS5pc09rKCkpIHsKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xNDQ5LDcgKzE0NzQsNyBAQAogICAgIH0KIAogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgLy8gdmVyaWZ5IGlkIGlzIHZhbGlkLgogICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CkBAIC0xNTU2LDcgKzE1ODEsNyBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncykgewotICAgIGNvbnN0IGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKIAogICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCkBAIC0xNTY1LDcgKzE1OTAsNyBAQAogICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX1NFTkRfU1lTVEVNX0VWRU5UUyIpKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSIKICAgICAgICAgICAgICAgICAgICAgIiBldmVudHMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELApAQCAtMTcxNyw3ICsxNzQyLDcgQEAKICAgICB9CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oaWQpOwotICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CkBAIC0xNzM0LDYgKzE3NTksNyBAQAogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKQEAgLTE3NTQsNiArMTc4MCwxOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgLypvdXQqLyBib29sICppc1N1cHBvcnRlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBjb25zdCBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZCk7CisKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICppc1N1cHBvcnRlZCA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoaWQuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgewpAQCAtMTkwMSwxMyArMTkzOSwxMyBAQAogICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKIAogICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZCkgewogICAgICAgICBpLT5kaXNjb25uZWN0KCk7CiAgICAgfQogCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jawogICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CkBAIC0xOTc1LDcgKzIwMTMsNiBAQAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAKLQogICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0hFTExfQ09NTUFORF9UUkFOU0FDVElPTjogewpAQCAtMjA5MSw3ICsyMTI4LDcgQEAKICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICAgICAgbUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwpAQCAtMjE3OCw2ICsyMjE1LDggQEAKICAgICBzQ2FtZXJhU2VydmljZS0+cmVtb3ZlQnlDbGllbnQodGhpcyk7CiAgICAgc0NhbWVyYVNlcnZpY2UtPmxvZ0Rpc2Nvbm5lY3RlZChtQ2FtZXJhSWRTdHIsIG1DbGllbnRQaWQsCiAgICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkpOworICAgIHNDYW1lcmFTZXJ2aWNlLT5tQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5yZW1vdmVSZWYoQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpEZXZpY2VNb2RlOjpDQU1FUkEsCisgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuY19zdHIoKSk7CiAKICAgICBzcDxJQmluZGVyPiByZW1vdGUgPSBnZXRSZW1vdGUoKTsKICAgICBpZiAocmVtb3RlICE9IG51bGxwdHIpIHsKQEAgLTIyMDAsNyArMjIzOSw3IEBACiAgICAgLy8gTm8gZHVtcGluZyBvZiBjbGllbnRzIGRpcmVjdGx5IG92ZXIgQmluZGVyLAogICAgIC8vIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpkdW1wCiAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coU05fRVZFTlRfTE9HX0lELCAiMjYyNjU0MDMiLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIE5VTEwsIDApOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjMzNyw3ICsyMzc2LDcgQEAKIAogICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVELCByZXN1bHRFeHRyYXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTI2OTgsOCArMjczNyw4IEBACiAKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKICAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIENhbWVyYVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOwpAQCAtMjg3Miw3ICsyOTExLDcgQEAKICAgICAgICogYmluZGVyIGRyaXZlcgogICAgICAgKi8KICAgICAvLyBQSUQgaGVyZSBpcyBhcHByb3hpbWF0ZSBhbmQgY2FuIGJlIHdyb25nLgotICAgIGxvZ0NsaWVudERpZWQoZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KCJCaW5kZXIgZGllZCB1bmV4cGVjdGVkbHkiKSk7CisgICAgbG9nQ2xpZW50RGllZChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KCJCaW5kZXIgZGllZCB1bmV4cGVjdGVkbHkiKSk7CiAKICAgICAvLyBjaGVjayB0b3JjaCBjbGllbnQKICAgICBoYW5kbGVUb3JjaENsaWVudEJpbmRlckRpZWQod2hvKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA2MjRkMWNhLi5kMzMyZjZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0xNTksNiArMTU5LDExIEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC01MzEsNiArNTM2LDcgQEAKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCBfX3VudXNlZCwgaW50MzJfdCBwcm9jU3RhdGUgX191bnVzZWQsIGludDY0X3QgcHJvY1N0YXRlU2VxIF9fdW51c2VkKSB7fQogCiAgICAgICAgIHZvaWQgYWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUpOwogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpOwpAQCAtNTg1LDggKzU5MSw3IEBACiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKIAogICAgIC8vIExvY2sgZ3VhcmRpbmcgY2FtZXJhIHNlcnZpY2Ugc3RhdGUKQEAgLTgzMiwxMCArODM3LDYgQEAKICAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAogICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKIAotICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgYXMgYSBmb3JtYXR0ZWQgc3RyaW5nLgogICAgICAqLwpAQCAtODQ0LDcgKzg0NSw3IEBACiAgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0NhbWVyYUFjY2Vzcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkYWM2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiY2FtZXJhc2VydmljZV90ZXN0IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggOGJiMjRkNC4uYzljMjE2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogI2RlZmluZSBBTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIEFMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKQEAgLTQ0LDEwICs0NSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogQ2FtZXJhMkNsaWVudDo6Q2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKQEAgLTU4LDggKzU1LDcgQEAKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCkBAIC02OSw4ICs2NSw2IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpESVNDT05ORUNURUQ7Ci0KLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewpAQCAtNDA1LDcgKzM5OSw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIGNhbWVyYXNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBtQ2xpZW50UGlkICYmIGNhbGxpbmdQaWQgIT0gbVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gcmVzOwpAQCAtNDYwLDggKzQ1NCw2IEBACiAKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIAogICAgIHJldHVybiByZXM7CkBAIC00NzIsMTQgKzQ2NCwxNCBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBnZXRDYWxsaW5nUGlkKCkgIT0gbUNsaWVudFBpZCkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKQEAgLTQ5MiwxNiArNDg0LDE2IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudCBjbGllbnQgcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogCiAgICAgaWYgKG1DbGllbnRQaWQgPT0gMCkgewotICAgICAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtQ2xpZW50UGlkICE9IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEVCVVNZOwogICAgIH0KIApAQCAtNTEzLDkgKzUwNSw5IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKLSAgICBpZiAobUNsaWVudFBpZCA9PSBnZXRDYWxsaW5nUGlkKCkpIHsKKyAgICBpZiAobUNsaWVudFBpZCA9PSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKSB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlJFQ09SRCB8fAogICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1QpIHsKQEAgLTUyOSw3ICs1MjEsNyBAQAogICAgIH0KIAogICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmxvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgcmV0dXJuIEVCVVNZOwogfQogCkBAIC0xNDQ3LDEzICsxNDM5LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6dGFrZVBpY3R1cmUoaW50IC8qbXNnVHlwZSovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIGludCB0YWtlUGljdHVyZUNvdW50ZXI7CisgICAgYm9vbCBzaG91bGRTeW5jV2l0aERldmljZSA9IHRydWU7CiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgICAgICBzd2l0Y2ggKGwubVBhcmFtZXRlcnMuc3RhdGUpIHsKQEAgLTE1MzksMTQgKzE1MzIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBzeW5jIHdpdGggdGhlIGRldmljZSBpbiBjYXNlIGZsYXNoIGlzIHR1cm5lZCBvbiwKKyAgICAgICAgLy8gdGhlIGNhbWVyYSBkZXZpY2Ugc3VnZ2VzdHMgdGhhdCBmbGFzaCBpcyBuZWVkZWQgKEFFIHN0YXRlIEZMQVNIX1JFUVVJUkVEKQorICAgICAgICAvLyBvciB3ZSBhcmUgaW4gc29tZSBvdGhlciBBRSBzdGF0ZSBkaWZmZXJlbnQgZnJvbSBDT05WRVJHRUQgdGhhdCBtYXkgbmVlZAorICAgICAgICAvLyBwcmVjYXB0dXJlIHRyaWdnZXIuCisgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLmZsYXNoTW9kZSAhPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09OICYmCisgICAgICAgICAgICAgICAgKGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfQ09OVkVSR0VEKSkgeworICAgICAgICAgICAgc2hvdWxkU3luY1dpdGhEZXZpY2UgID0gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oa1Rha2VwaWN0dXJlTGFiZWwsIHRha2VQaWN0dXJlQ291bnRlcik7CiAKLSAgICAvLyBOZWVkIEhBTCB0byBoYXZlIGNvcnJlY3Qgc2V0dGluZ3MgYmVmb3JlIChwb3NzaWJseSkgdHJpZ2dlcmluZyBwcmVjYXB0dXJlCi0gICAgc3luY1dpdGhEZXZpY2UoKTsKKyAgICAvLyBNYWtlIHN1cmUgSEFMIGhhcyBjb3JyZWN0IHNldHRpbmdzIGluIGNhc2UgcHJlY2FwdHVyZSB0cmlnZ2VyIGlzIG5lZWRlZC4KKyAgICBpZiAoc2hvdWxkU3luY1dpdGhEZXZpY2UpIHsKKyAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKKyAgICB9CiAKLSAgICByZXMgPSBtQ2FwdHVyZVNlcXVlbmNlci0+c3RhcnRDYXB0dXJlKG1zZ1R5cGUpOworICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUoKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc3RhcnQgY2FwdHVyZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTU4Myw3ICsxNTg3LDcgQEAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcwotICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6UmVhZExvY2sgbChtUGFyYW1ldGVycyk7CiAKQEAgLTE2NjYsMjcgKzE2NzAsNiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAotICAgIGlmIChtTGVnYWN5TW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQotICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKLSAgICBpZiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLAotICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTkzNCw2ICsxOTE3LDExIEBACiB2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSB7CiAgICAgQUxPR1YoIiVzOiBBdXRvZXhwb3N1cmUgc3RhdGUgbm93ICVkLCBsYXN0IHRyaWdnZXIgJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKKyAgICB7CisgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CisgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgICAgICBsLm1QYXJhbWV0ZXJzLmFlU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICB9CiAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeUF1dG9FeHBvc3VyZShuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCA0NDkyOWMzLi5hOWVhMjcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtOTYsOCArOTYsNyBAQAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBmMTIwM2Y5Li5kNjVhYzdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC0yNSwyNyArMjUsMjQgQEAKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgogI2luY2x1ZGUgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAjZGVmaW5lIExPRzEoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOwogI2RlZmluZSBMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIENhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCiB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogCiAgICAgbUhhcmR3YXJlID0gTlVMTDsKQEAgLTU3LDE0ICs1NCwxMyBAQAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAogICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplIEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNhbWVyYUlkKTsKQEAgLTEwNSw3ICsxMDEsNyBAQAogLy8gdGVhciBkb3duIHRoZSBjbGllbnQKIENhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCgpIHsKICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIAogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTE0OCw3ICsxNDQsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkKCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKICAgICBBTE9HVygiYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE1OCw3ICsxNTQsOCBAQAogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdCB7CiAgICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICBBTE9HRSgiYXR0ZW1wdCB0byB1c2UgYSBjYW1lcmEgYWZ0ZXIgZGlzY29ubmVjdCgpIChwaWQgJWQpIiwKKyAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKQEAgLTE2Nyw3ICsxNjQsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE4Miw3ICsxNzksNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnVubG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgidW5sb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMDQsNyArMjAxLDcgQEAKIAogLy8gY29ubmVjdCBhIG5ldyBjbGllbnQgdG8gdGhlIGNhbWVyYQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojpjb25uZWN0KGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImNvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMjQwLDcgKzIzNyw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYUNsaWVudDo6ZGlzY29ubmVjdCgpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiZGlzY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0zMzQsNyArMzMxLDcgQEAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UHJldmlld1RhcmdldCgKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSB7CiAgICAgTE9HMSgic2V0UHJldmlld1RhcmdldCglcCkgKHBpZCAlZCkiLCBidWZmZXJQcm9kdWNlci5nZXQoKSwKLSAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CkBAIC0zNTEsNyArMzQ4LDcgQEAKIC8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCiAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgogdm9pZCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGNhbGxiYWNrX2ZsYWcpIHsKLSAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic2V0UHJldmlld0NhbGxiYWNrRmxhZyglZCkgKHBpZCAlZCkiLCBjYWxsYmFja19mbGFnLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCkBAIC0zNzIsMTMgKzM2OSwxMyBAQAogCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRQcmV2aWV3KCkgewotICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUFJFVklFV19NT0RFKTsKIH0KIAogLy8gc3RhcnQgcmVjb3JkaW5nIG1vZGUKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRSZWNvcmRpbmcoKSB7Ci0gICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUkVDT1JESU5HX01PREUpOwogfQogCkBAIC00NjEsNyArNDU4LDcgQEAKIAogLy8gc3RvcCBwcmV2aWV3IG1vZGUKIHZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUHJldmlldygpIHsKLSAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RvcFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCkBAIC00NzcsNyArNDc0LDcgQEAKIAogLy8gc3RvcCByZWNvcmRpbmcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BSZWNvcmRpbmcoKSB7Ci0gICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CkBAIC01MDMsNyArNTAwLDcgQEAKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAgICAgaWYgKG1lbSA9PSBudWxscHRyKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKENhbWVyYVNlcnZpY2U6OlNOX0VWRU5UX0xPR19JRCwgIjI2MTY0MjcyIiwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC02MTUsNyArNjEyLDcgQEAKIH0KIAogYm9vbCBDYW1lcmFDbGllbnQ6OnByZXZpZXdFbmFibGVkKCkgewotICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJwcmV2aWV3RW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKQEAgLTYyMyw3ICs2MjAsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cmVjb3JkaW5nRW5hYmxlZCgpIHsKLSAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjMxLDcgKzYyOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6YXV0b0ZvY3VzKCkgewotICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjQxLDcgKzYzOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2FuY2VsQXV0b0ZvY3VzKCkgewotICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjUyLDcgKzY0OSw3IEBACiAKIC8vIHRha2UgYSBwaWN0dXJlIC0gaW1hZ2UgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2sKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKLSAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIGdldENhbGxpbmdQaWQoKSwgbXNnVHlwZSk7CisgICAgTE9HMSgidGFrZVBpY3R1cmUgKHBpZCAlZCk6IDB4JXgiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02ODEsNyArNjc4LDcgQEAKIAogLy8gc2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSB7Ci0gICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOworICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjk2LDE2ICs2OTMsMTggQEAKIFN0cmluZzggQ2FtZXJhQ2xpZW50OjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CisgICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQogCiAgICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKLSAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKICAgICByZXR1cm4gcGFyYW1zOwogfQogCiAvLyBlbmFibGUgc2h1dHRlciBzb3VuZAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjplbmFibGVTaHV0dGVyU291bmQoYm9vbCBlbmFibGUpIHsKLSAgICBMT0cxKCJlbmFibGVTaHV0dGVyU291bmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CkBAIC03MTUsMzIgKzcxNCwxMiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAotICAgIGlmIChtTGVnYWN5TW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJjbXAodmFsdWUsICIwIikgIT0gMCkgewotICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAotICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KLSAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikgewotICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIGludCBvcmllbnRhdGlvbjsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggMTkxMDUzNi4uOTUzMGI2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02OCw4ICs2OCw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB+Q2FtZXJhQ2xpZW50KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IDcwMzQxYzUuLjUwMjlkNGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTUwLDggKzUwLDcgQEAKICAgICAgICAgbVN0YXRlVHJhbnNpdGlvbkNvdW50KDApLAogICAgICAgICBtVHJpZ2dlcklkKDApLAogICAgICAgICBtVGltZW91dENvdW50KDApLAotICAgICAgICBtQ2FwdHVyZUlkKENhbWVyYTJDbGllbnQ6OmtDYXB0dXJlUmVxdWVzdElkU3RhcnQpLAotICAgICAgICBtTXNnVHlwZSgwKSB7CisgICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKQEAgLTY0LDcgKzYzLDcgQEAKICAgICBtWnNsUHJvY2Vzc29yID0gcHJvY2Vzc29yOwogfQogCi1zdGF0dXNfdCBDYXB0dXJlU2VxdWVuY2VyOjpzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpIHsKK3N0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZSgpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNzMsNyArNzIsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmICghbVN0YXJ0Q2FwdHVyZSkgewotICAgICAgICBtTXNnVHlwZSA9IG1zZ1R5cGU7CiAgICAgICAgIG1TdGFydENhcHR1cmUgPSB0cnVlOwogICAgICAgICBtU3RhcnRDYXB0dXJlU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KQEAgLTM4Niw3ICszODQsNyBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKICAgICBtVGltZW91dENvdW50ID0ga01heFRpbWVvdXRzRm9yQ2FwdHVyZUVuZDsKICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRV9XQUlUOwpAQCAtNjA2LDcgKzYwNCw3IEBACiAgICAgICAgIGlmICghbVNodXR0ZXJOb3RpZmllZCkgewogICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAgICAgICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKKyAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICAgICAgICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtVGltZW91dENvdW50IDw9IDApIHsKQEAgLTcyMywxMiArNzIxLDExIEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKSB7CisgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIGlmIChwYXJhbXMuc3RhdGUgPT0gUGFyYW1ldGVyczo6U1RJTExfQ0FQVFVSRQotICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZAotICAgICAgICAmJiAobXNnVHlwZSAmIENBTUVSQV9NU0dfU0hVVFRFUikpIHsKKyAgICAgICAgJiYgcGFyYW1zLnBsYXlTaHV0dGVyU291bmQpIHsKICAgICAgICAgY2xpZW50LT5nZXRDYW1lcmFTZXJ2aWNlKCktPnBsYXlTb3VuZChDYW1lcmFTZXJ2aWNlOjpTT1VORF9TSFVUVEVSKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IGYyZTM3NTAuLmMyM2IxMmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIHZvaWQgc2V0WnNsUHJvY2Vzc29yKGNvbnN0IHdwPFpzbFByb2Nlc3Nvcj4mIHByb2Nlc3Nvcik7CiAKICAgICAvLyBCZWdpbiBzdGlsbCBpbWFnZSBjYXB0dXJlCi0gICAgc3RhdHVzX3Qgc3RhcnRDYXB0dXJlKGludCBtc2dUeXBlKTsKKyAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoKTsKIAogICAgIC8vIFdhaXQgdW50aWwgY3VycmVudCBpbWFnZSBjYXB0dXJlIGNvbXBsZXRlczsgcmV0dXJucyBpbW1lZGlhdGVseSBpZiBubwogICAgIC8vIGNhcHR1cmUgaXMgYWN0aXZlLiBSZXR1cm5zIFRJTUVEX09VVCBpZiBjYXB0dXJlIGRvZXMgbm90IGNvbXBsZXRlIGR1cmluZwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgYm9vbCBtQWVJblByZWNhcHR1cmU7CiAKICAgICBpbnQzMl90IG1DYXB0dXJlSWQ7Ci0gICAgaW50IG1Nc2dUeXBlOwogCiAgICAgLy8gTWFpbiBpbnRlcm5hbCBtZXRob2RzCiAKQEAgLTE3Miw3ICsxNzEsNyBAQAogCiAgICAgLy8gRW1pdCBTaHV0dGVyL1JhdyBjYWxsYmFjayB0byBqYXZhLCBhbmQgbWF5YmUgcGxheSBhIHNodXR0ZXIgc291bmQKICAgICBzdGF0aWMgdm9pZCBzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCmluZGV4IDBjNzM4ZTcuLjY4M2U4NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcApAQCAtMzMsNyArMzMsMTAgQEAKICAgICBGcmFtZVByb2Nlc3NvckJhc2UoZGV2aWNlKSwKICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgbUxhc3RGcmFtZU51bWJlck9mRmFjZXMoMCksCi0gICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSB7CisgICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFFRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFXQkZyYW1lTnVtYmVyKC0xKSB7CiAKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkID0gZGV2aWNlLnByb21vdGUoKTsKICAgICBtU3ludGhlc2l6ZTNBTm90aWZ5ID0gIShkLT53aWxsTm90aWZ5M0EoKSk7CkBAIC0yNjIsMjQgKzI2NSw3MyBAQAogICAgIGJvb2wgZ290QWxsU3RhdGVzID0gdHJ1ZTsKIAogICAgIC8vIFRPRE86IEFsc28gdXNlIEFFIG1vZGUsIEFFIHRyaWdnZXIgSUQKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBib29sIGdvdEFGU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgYm9vbCBnb3RBV0JTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGJvb2wgZ290QUVTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAorICAgIGdvdEFGU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFXQlN0YXRlICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYXdiU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkOwogICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKIAorICAgIGlmIChnb3RBRVN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QUVGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFFIHN0YXRlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0V4cG9zdXJlKHBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlID0gcGVuZGluZ1N0YXRlLmFlU3RhdGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZVRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUVGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdvdEFGU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYWZTdGF0ZSAhPSBtM2FTdGF0ZS5hZlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWZTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSA9IHBlbmRpbmdTdGF0ZS5hZk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QVdCU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBV0JGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSAhPSBtM2FTdGF0ZS5hd2JTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBV0Igc3RhdGUgJWQtPiVkLiBBV0IgbW9kZSAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlLCBwZW5kaW5nU3RhdGUuYXdiTW9kZSk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlID0gcGVuZGluZ1N0YXRlLmF3Yk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZTsKKyAgICAgICAgICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdvdEFsbFN0YXRlcyAmPSBnb3RBRVN0YXRlICYgZ290QUZTdGF0ZSAmIGdvdEFXQlN0YXRlOwogICAgIGlmICghZ290QWxsU3RhdGVzKSB7CiAgICAgICAgIC8vIElmIG5vdCBhbGwgc3RhdGVzIGFyZSByZWNlaXZlZCwgcHV0IHRoZSBwZW5kaW5nIHN0YXRlIHRvIG1QZW5kaW5nM0FTdGF0ZXMuCiAgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewpAQCAtMjkwLDQwICszNDIsMTAgQEAKICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKLSAgICAvLyBPbmNlIGFsbCAzQSBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCAzQSBjaGFuZ2VzLgotICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8Ci0gICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkICE9IG0zYVN0YXRlLmFmVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZTdGF0ZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0ZvY3VzKHBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOwotICAgIH0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvV2hpdGViYWxhbmNlKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKLSAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOwotICAgIH0KLQogICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBtUGVuZGluZzNBU3RhdGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgIH0KIAotICAgIG0zYVN0YXRlID0gcGVuZGluZ1N0YXRlOwogICAgIG1MYXN0M0FGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAppbmRleCA2MmE0ZTkxLi44MTgzYzEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaApAQCAtMTA0LDggKzEwNCw3IEBACiAgICAgLy8gVHJhY2sgbW9zdCByZWNlbnQgZnJhbWUgbnVtYmVyIGZvciB3aGljaCAzQSBub3RpZmljYXRpb25zIHdlcmUgc2VudCBmb3IuCiAgICAgLy8gVXNlZCB0byBmaWx0ZXIgYWdhaW5zdCBzZW5kaW5nIDNBIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzYW1lIGZyYW1lCiAgICAgLy8gc2V2ZXJhbCB0aW1lcy4KLSAgICBpbnQzMl90IG1MYXN0M0FGcmFtZU51bWJlcjsKLQorICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyLCBtTGFzdEFFRnJhbWVOdW1iZXIsIG1MYXN0QUZyYW1lTnVtYmVyLCBtTGFzdEFXQkZyYW1lTnVtYmVyOwogICAgIC8vIEVtaXQgRmFjZURldGVjdGlvbiBldmVudCB0byBqYXZhIGlmIGZhY2VzIGNoYW5nZWQKICAgICB2b2lkIGNhbGxiYWNrRmFjZURldGVjdGlvbihjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9mcmFtZV9tZXRhZGF0YSAmbWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDI4ZDE4NmEuLjE4YWRkYjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICByZXMgPSBidWlsZFF1aXJrcygpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKLSAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBTaXplIG1heFByZXZpZXdTaXplID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CiAgICAgLy8gVHJlYXQgdGhlIEguMjY0IG1heCBzaXplIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZpZGVvIHNpemUuCiAgICAgTWVkaWFQcm9maWxlcyAqdmlkZW9FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwogICAgIFZlY3Rvcjx2aWRlb19lbmNvZGVyPiBlbmNvZGVycyA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJzKCk7CkBAIC05MCwxMSArOTAsMTYgQEAKICAgICAgICAgfQogICAgIH0KICAgICAvLyBUaGlzIGlzIGp1c3QgYW4gdXBwZXIgYm91bmQgYW5kIG1heSBub3QgYmUgYW4gYWN0dWFsbHkgdmFsaWQgdmlkZW8gc2l6ZQotICAgIGNvbnN0IFNpemUgVklERU9fU0laRV9VUFBFUl9CT1VORCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CisgICAgU2l6ZSB2aWRlb1NpemVVcHBlckJvdW5kID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKIAotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBtYXhQcmV2aWV3U2l6ZSA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkpOworICAgICAgICB2aWRlb1NpemVVcHBlckJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkpOworICAgIH0KKworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMobWF4UHJldmlld1NpemUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7Ci0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhWSURFT19TSVpFX1VQUEVSX0JPVU5ELCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyh2aWRlb1NpemVVcHBlckJvdW5kLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZApAQCAtMjk2LDkgKzMwMSwxMyBAQAogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVKcGVnU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKICAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCkpIHJldHVybiBOT19JTklUOwogCi0gICAgLy8gVE9ETzogUGljayBtYXhpbXVtCiAgICAgcGljdHVyZVdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLndpZHRoOwogICAgIHBpY3R1cmVIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0uaGVpZ2h0OworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgU2l6ZSBzdWdnZXN0ZWRKcGVnU2l6ZSA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkSnBlZ1NpemVzKCkpOworICAgICAgICBwaWN0dXJlV2lkdGggPSBzdWdnZXN0ZWRKcGVnU2l6ZS53aWR0aDsKKyAgICAgICAgcGljdHVyZUhlaWdodCA9IHN1Z2dlc3RlZEpwZWdTaXplLmhlaWdodDsKKyAgICB9CiAgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKICAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CiAgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKQEAgLTc1Nyw2ICs3NjYsNyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCisgICAgYWVTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9JTkFDVElWRTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKICAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOwogICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xMDEwLDYgKzEwMjAsOSBAQAogICAgICAgICBhcnJheUhlaWdodCA9IGFjdGl2ZUFycmF5U2l6ZS5kYXRhLmkzMlszXTsKICAgICB9IGVsc2UgcmV0dXJuIE5PX0lOSVQ7CiAKKyAgICBmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MgPQorICAgICAgICBpbmZvLT5leGlzdHMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisKICAgICAvLyBXZSdsbCBzZXQgdGhlIHRhcmdldCBGUFMgcmFuZ2UgZm9yIHN0aWxsIGNhcHR1cmVzIHRvIGJlIGFzIHdpZGUKICAgICAvLyBhcyBwb3NzaWJsZSB0byBnaXZlIHRoZSBIQUwgbWF4aW11bSBsYXRpdHVkZSBmb3IgZXhwb3N1cmUgc2VsZWN0aW9uCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRnBzUmFuZ2VzID0KQEAgLTEwMjEsOCArMTAzNCwxMSBAQAogICAgIC8vIEdldCBzdXBwb3J0ZWQgcHJldmlldyBmcHMgcmFuZ2VzLCB1cCB0byBkZWZhdWx0IG1heGltdW0uCiAgICAgVmVjdG9yPFNpemU+IHN1cHBvcnRlZFByZXZpZXdTaXplczsKICAgICBWZWN0b3I8RnBzUmFuZ2U+IHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZXM7Ci0gICAgY29uc3QgU2l6ZSBQUkVWSUVXX1NJWkVfQk9VTkQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKLSAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFBSRVZJRVdfU0laRV9CT1VORCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisgICAgU2l6ZSBwcmV2aWV3U2l6ZUJvdW5kID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBwcmV2aWV3U2l6ZUJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMocHJldmlld1NpemVCb3VuZCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGcHNSYW5nZXMuY291bnQ7IGkgKz0gMikgewogICAgICAgICBpZiAoIWlzRnBzU3VwcG9ydGVkKHN1cHBvcnRlZFByZXZpZXdTaXplcywKQEAgLTMxMDYsNiArMzEyMiw2NyBAQAogICAgIHJldHVybiBqcGVnU2l6ZXM7CiB9CiAKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgICAgaW50MzJfdCB1c2VjYXNlSWQpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDU7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAwOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3M7CisKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPSBzdGF0aWNJbmZvKAorICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IHN1cHBvcnRlZFVzZWNhc2VzID0KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkVXNlY2FzZXMgJiAoMSA8PCB1c2VjYXNlSWQpKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiBzYyA9IHtmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlzSW5wdXR9OworICAgICAgICAgICAgICAgIHNjcy5hZGQoc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNjczsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsCisgICAgICAgIGludDMyX3QgZm9ybWF0KSBjb25zdCB7CisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IHNpemVzOworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyh1c2VjYXNlSWQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBzY3MpIHsKKyAgICAgICAgaWYgKGl0LmZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHNpemVzLmFkZCh7aXQud2lkdGgsIGl0LmhlaWdodH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemVzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkSnBlZ1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19TTkFQU0hPVCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BSRVZJRVcsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkVDT1JELAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKK30KKwogUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbiBQYXJhbWV0ZXJzOjpjYWxjdWxhdGVDcm9wUmVnaW9uKGJvb2wgcHJldmlld09ubHkpIGNvbnN0IHsKIAogICAgIGZsb2F0IHpvb21MZWZ0LCB6b29tVG9wLCB6b29tV2lkdGgsIHpvb21IZWlnaHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCA0MmU3YTQ3Li4zYTcwOWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTEyMiw2ICsxMjIsNyBAQAogICAgICAgICBpbnQzMl90IGhpZ2g7CiAgICAgfTsKIAorICAgIHVpbnQ4X3QgYWVTdGF0ZTsgLy9sYXRlc3QgQUUgc3RhdGUgZnJvbSBIYWwKICAgICBpbnQzMl90IGV4cG9zdXJlQ29tcGVuc2F0aW9uOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9jazsKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2tBdmFpbGFibGU7CkBAIC0yNDcsNiArMjQ4LDcgQEAKICAgICAgICAgYm9vbCB1c2VGbGV4aWJsZVl1djsKICAgICAgICAgU2l6ZSBtYXhKcGVnU2l6ZTsKICAgICAgICAgU2l6ZSBtYXhac2xTaXplOworICAgICAgICBib29sIHN1cHBvcnRzUHJlZmVycmVkQ29uZmlnczsKICAgICB9IGZhc3RJbmZvOwogCiAgICAgLy8gUXVpcmtzIGluZm9ybWF0aW9uOyB0aGVzZSBhcmUgc2hvcnQtbGl2ZWQgZmxhZ3MgdG8gZW5hYmxlIHdvcmthcm91bmRzIGZvcgpAQCAtNDE3LDYgKzQxOSw5IEBACiAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAogICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIHN1Z2dlc3RlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoaW50MzJfdCB1c2VjYXNlSWQpIGNvbnN0OworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIGpwZWcgc2l6ZQogICAgIC8vIHJldHVybiAtMSBpZiBpbnB1dCBqcGVnIHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKICAgICBpbnQ2NF90IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKTsKQEAgLTQzOCw2ICs0NDMsMTUgQEAKICAgICAvLyBUaGUgbWF4aW11bSBzaXplIGlzIGRlZmluZWQgYnkgY29tcGFyaW5nIHdpZHRoIGZpcnN0LCB3aGVuIHdpZHRoIHRpZXMgY29tcGFyaW5nIGhlaWdodC4KICAgICBTaXplIGdldE1heFNpemUoY29uc3QgVmVjdG9yPFNpemU+JiBzaXplcyk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZmlsdGVyIGFuZCBzb3J0IHN1Z2dlc3RlZCBzaXplcworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKGludDMyX3QgdXNlY2FzZUlkLCBpbnQzMl90IGZvcm1hdCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIGpwZWcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkSnBlZ1NpemVzKCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHByZXZpZXcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHZpZGVvIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSBjb25zdDsKKwogICAgIGludCBtRGV2aWNlVmVyc2lvbjsKICAgICB1aW50OF90IG1EZWZhdWx0U2NlbmVNb2RlOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCA1NjdiMTVmLi40NmZiYzNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtMjYsNiArMjcsOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgpAQCAtMTIyLDYgKzEyNSw3IEBACiAgICAgICAgICAgICAgICAgcGh5c2ljYWxLZXlzRW50cnkuZGF0YS5pMzIgKyBwaHlzaWNhbEtleXNFbnRyeS5jb3VudCk7CiAgICAgfQogCisgICAgbVByb3ZpZGVyTWFuYWdlciA9IHByb3ZpZGVyUHRyOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNDY5LDYgKzQ3Myw2OCBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCisgICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKG9wZXJhdGluZ01vZGUpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBFcnJvciBjb25maWd1cmluZyBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1N1cmZhY2VUeXBlTG9ja2VkKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciwgaW50IHN1cmZhY2VUeXBlKSBjb25zdCB7CisgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKKyAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgeworICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOworICAgIH0KKworICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKKyAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CisKKyAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgeworICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCkgeworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPQorICAgICAgICAgICAgbVByb3ZpZGVyTWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhIHx8CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKSA9PSBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSkgY29uc3QgewogICAgIGlmIChvcGVyYXRpbmdNb2RlIDwgMCkgewogICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKICAgICAgICAgICAgICJDYW1lcmEgJXM6IEludmFsaWQgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlKTsKQEAgLTQ3Nyw3ICs1NDMsNiBAQAogICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CiAgICAgfQogCi0gICAgLy8gU2FuaXRpemUgdGhlIGhpZ2ggc3BlZWQgc2Vzc2lvbiBhZ2FpbnN0IG5lY2Vzc2FyeSBjYXBhYmlsaXR5IGJpdC4KICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQgPSAob3BlcmF0aW5nTW9kZSA9PSBJQ2FtZXJhRGV2aWNlVXNlcjo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFKTsKICAgICBpZiAoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgewogICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwpAQCAtNTAwLDE3ICs1NjUsMTYzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25QYXJhbXMsIG9wZXJhdGluZ01vZGUpOwotICAgIGlmIChlcnIgPT0gQkFEX1ZBTFVFKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuc3VwcG9ydGVkIHNldCBvZiBpbnB1dHMvb3V0cHV0cyBwcm92aWRlZCIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50OjptYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pIHsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmVhbS0+djNfMi5zdHJlYW1UeXBlID0gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpPVVRQVVQ7CisgICAgc3RyZWFtLT52M18yLndpZHRoID0gc3RyZWFtSW5mby53aWR0aDsKKyAgICBzdHJlYW0tPnYzXzIuaGVpZ2h0ID0gc3RyZWFtSW5mby5oZWlnaHQ7CisgICAgc3RyZWFtLT52M18yLmZvcm1hdCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc3RyZWFtSW5mby5mb3JtYXQpOworICAgIGF1dG8gdSA9IHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZTsKKyAgICBjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoc3RyZWFtSW5mby5mb3JtYXQsICZ1KTsKKyAgICBzdHJlYW0tPnYzXzIudXNhZ2UgPSBDYW1lcmEzRGV2aWNlOjptYXBUb0NvbnN1bWVyVXNhZ2UodSk7CisgICAgc3RyZWFtLT52M18yLmRhdGFTcGFjZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZShzdHJlYW1JbmZvLmRhdGFTcGFjZSk7CisgICAgc3RyZWFtLT52M18yLnJvdGF0aW9uID0gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Sb3RhdGlvbihyb3RhdGlvbik7CisgICAgc3RyZWFtLT5waHlzaWNhbENhbWVyYUlkID0gc3RkOjpzdHJpbmcocGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgc3RyZWFtLT5idWZmZXJTaXplID0gMDsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sIGJvb2wgKnN0YXR1cyAvKm91dCovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGJpbmRlcjo6U3RhdHVzIHJlczsKKyAgICBpZiAoIShyZXMgPSBjaGVja1BpZFN0YXR1cyhfX0ZVTkNUSU9OX18pKS5pc09rKCkpIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOworICAgIH0KKworICAgIGF1dG8gb3BlcmF0aW5nTW9kZSA9IHNlc3Npb25Db25maWd1cmF0aW9uLmdldE9wZXJhdGluZ01vZGUoKTsKKyAgICByZXMgPSBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCAiQ2FtZXJhICVzOiBJbnZhbGlkIHN0YXR1cyEiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBFcnJvciBjb25maWd1cmluZyBzdHJlYW1zOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247CisgICAgYXV0byByZXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Q+IChvcGVyYXRpbmdNb2RlKSwKKyAgICAgICAgICAgIC8qb3V0Ki8gJnN0cmVhbUNvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBtYXBwaW5nIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZDogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKKyAgICAgICAgICAgIG9wZXJhdGluZ01vZGUsIHN0cmVycm9yKC1yZXQpLCByZXQpOwogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNJbnB1dFZhbGlkID0gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSA+IDApICYmCisgICAgICAgICAgICAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSA+IDApICYmCisgICAgICAgICAgICAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSA+IDApOworICAgIGF1dG8gb3V0cHV0Q29uZmlncyA9IHNlc3Npb25Db25maWd1cmF0aW9uLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisgICAgc2l6ZV90IHN0cmVhbUNvdW50ID0gb3V0cHV0Q29uZmlncy5zaXplKCk7CisgICAgc3RyZWFtQ291bnQgPSBpc0lucHV0VmFsaWQgPyBzdHJlYW1Db3VudCArIDEgOiBzdHJlYW1Db3VudDsKKyAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICBzaXplX3Qgc3RyZWFtSWR4ID0gMDsKKyAgICBpZiAoaXNJbnB1dFZhbGlkKSB7CisgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10gPSB7ey8qc3RyZWFtSWQqLzAsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1UeXBlOjpJTlBVVCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0V2lkdGgoKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICBDYW1lcmEzRGV2aWNlOjptYXBUb1BpeGVsRm9ybWF0KHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkpLAorICAgICAgICAgICAgICAgIC8qdXNhZ2UqLyAwLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMH0sCisgICAgICAgICAgICAgICAgLypwaHlzaWNhbElkKi8gbnVsbHB0ciwgLypidWZmZXJTaXplKi8wfTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogb3V0cHV0Q29uZmlncykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGJ1ZmZlclByb2R1Y2VycyA9CisgICAgICAgICAgICBpdC5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IGl0LmlzRGVmZXJyZWQoKTsKKyAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChpdC5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworICAgICAgICBzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKKyAgICAgICAgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCA9IGZhbHNlOworICAgICAgICBPdXRwdXRTdHJlYW1JbmZvIHN0cmVhbUluZm87CisKKyAgICAgICAgcmVzID0gY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsIGl0LmdldFN1cmZhY2VUeXBlKCkpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZlcnJlZENvbnN1bWVyKSB7CisgICAgICAgICAgICBzdHJlYW1JbmZvLndpZHRoID0gaXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ID0gaXQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gYW5kcm9pZF9kYXRhc3BhY2VfdDo6SEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICAgICAgICAgYXV0byBzdXJmYWNlVHlwZSA9IGl0LmdldFN1cmZhY2VUeXBlKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFOworICAgICAgICAgICAgaWYgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGJ1ZmZlclByb2R1Y2VyIDogYnVmZmVyUHJvZHVjZXJzKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAoc3RyZWFtSW5mbywgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkKTsKKworICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgcmV0ID0gbVByb3ZpZGVyTWFuYWdlci0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAvLyBFeHBlY3RlZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOiB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgbm90IHN1cHBvcnRlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogRXJyb3I6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNjAzLDQxICs4MTQsMjMgQEAKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzRGVmZXJyZWQoKTsKICAgICBib29sIGlzU2hhcmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc1NoYXJlZCgpOwogICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwotCi0gICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclByb2R1Y2Vycy5zaXplKCksIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0KICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKLSAgICBpbnQgc3VyZmFjZVR5cGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCk7Ci0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKIAotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaXMgaW52YWxpZDogYnVmZmVyUHJvZHVjZXIgPSAlcCwgc3VyZmFjZVR5cGUgPSAlZC4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzWzBdLmdldCgpLCBzdXJmYWNlVHlwZSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKLSAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxJZChwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KLSAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlLT5pbmZvKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAotICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxJZCkgPT0KLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICB9CisgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiBzdXJmYWNlczsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gYmluZGVyczsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC0xNzI0LDcgKzE5MTcsNyBAQAogLy8gVE9ETzogbW92ZSB0byBDYW1lcmEyQ2xpZW50QmFzZQogYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CiAKLSAgICBjb25zdCBpbnQgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CiAKQEAgLTE3NjMsNyArMTk1Niw3IEBACiAgICAgICAgIFN0cmluZzE2IHBlcm1pc3Npb25TdHJpbmcgPQogICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfRElTQUJMRV9UUkFOU01JVF9MRUQiKTsKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb25TdHJpbmcpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKICAgICAgICAgICAgICAgICAgICJjYW4ndCBkaXNhYmxlIHRyYW5zbWl0IExFRCBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGMzMDU2MWQuLjE3YTA5ODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKQEAgLTg5LDYgKzkwLDEyIEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMpIG92ZXJyaWRlOwogCisgICAgLy8gVmVyaWZ5IHNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sKiBzdHJlYW1TdGF0dXMpIG92ZXJyaWRlOworCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlIG9yIGluIGVycm9yIHN0YXRlCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIApAQCAtMjMwLDYgKzIzNywxMyBAQAogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChpbnQgb3BlcmF0aW5nTW9kZSkgY29uc3Q7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCk7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tTdXJmYWNlVHlwZUxvY2tlZChzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLCBib29sIGRlZmVycmVkQ29uc3VtZXIsCisgICAgICAgICAgICBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0OworICAgIHN0YXRpYyB2b2lkIG1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLyk7CiAgICAgYm9vbCBlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSk7CiAKICAgICAvLyBGaW5kIHRoZSBzcXVhcmUgb2YgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKQEAgLTMwMCw3ICszMTQsOCBAQAogICAgIC8vIHN0cmVhbSBJRCAtPiBvdXRwdXRTdHJlYW1JbmZvIG1hcHBpbmcKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50MzJfdCwgT3V0cHV0U3RyZWFtSW5mbz4gbVN0cmVhbUluZm9NYXA7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDI7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OworICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCBjZTAwNmE3Li43OGZlYjNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTMyLDE0ICszMiwxMSBAQAogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtNTcsMTMgKzU0LDEzIEBACiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAogICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpKSwKKyAgICAgICAgbURldmljZShuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCkpLAogICAgICAgICBtRGV2aWNlQWN0aXZlKGZhbHNlKSwgbUFwaTFDYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgQUxPR0koIkNhbWVyYSAlczogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZC5zdHJpbmcoKSwKICAgICAgICAgICAgIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBjbGllbnRQaWQsIGNsaWVudFVpZCk7CiAKICAgICBtSW5pdGlhbENsaWVudFBpZCA9IGNsaWVudFBpZDsKLSAgICBtRGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSA9PSAwLCAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBOVUxMIGhlcmUuIik7CiB9CiAKQEAgLTcxLDcgKzY4LDcgQEAKIHN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Y2hlY2tQaWQoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbikKICAgICAgICAgY29uc3QgewogCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKICAgICBBTE9HRSgiJXM6IGF0dGVtcHQgdG8gdXNlIGEgbG9ja2VkIGNhbWVyYSBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MiCkBAIC0xODYsNyArMTgzLDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgbWVkaWEgc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICYmCiAgICAgICAgIGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1TZXJ2aWNlUGlkKSByZXR1cm4gcmVzOwogCkBAIC0yMDYsOCArMjAzLDYgQEAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm47CiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwogCi0gICAgbURldmljZS5jbGVhcigpOwotCiAgICAgQUxPR1YoIkNhbWVyYSAlczogRGV0YWNoIGNvbXBsZXRlIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiB9CiAKQEAgLTIxOSwxOCArMjE0LDE4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCiAgICAgaWYgKFRDbGllbnRCYXNlOjptQ2xpZW50UGlkICE9IDAgJiYKLSAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSB7CisgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKIAogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogQ29ubmVjdGlvbiBhdHRlbXB0IGZyb20gcGlkICVkOyAiCiAgICAgICAgICAgICAgICAgImN1cnJlbnQgbG9ja2VkIHRvIHBpZCAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIFRDbGllbnRCYXNlOjptUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggZTc0ZmJkZi4uNjY5Mzg0NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTEzMCw3ICsxMzAsMTAgQEAKICAgICAvKiogQ2FtZXJhRGV2aWNlQmFzZSBpbnN0YW5jZSB3cmFwcGluZyBIQUwzKyBlbnRyeSAqLwogCiAgICAgY29uc3QgaW50IG1EZXZpY2VWZXJzaW9uOwotICAgIHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOworCisgICAgLy8gU2V0IHRvIGNvbnN0IHRvIGF2b2lkIG1EZXZpY2UgYmVpbmcgdXBkYXRlZCAodXBkYXRlIG9mIHNwPD4gaXMgcmFjeSkgZHVyaW5nCisgICAgLy8gZHVtcERldmljZSAod2hpY2ggaXMgaW1wb3J0YW50IHRvIGJlIGxvY2sgZnJlZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UpCisgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggMGNlNDMxOC4uYTljYmU3MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTIwLDI0ICsyMCw0MSBAQAogCiAjaW5jbHVkZSAiQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnV0dXJlPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA7Cit1c2luZyBzdGQ6OmxpdGVyYWxzOjpjaHJvbm9fbGl0ZXJhbHM6Om9wZXJhdG9yIiJzOwogCiBuYW1lc3BhY2UgewogLy8gSGFyZGNvZGVkIG5hbWUgZm9yIHRoZSBwYXNzdGhyb3VnaCBIQUwgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IGNhbid0IGJlIGRpc2NvdmVyZWQgdmlhIHRoZQogLy8gc2VydmljZSBtYW5hZ2VyCiBjb25zdCBzdGQ6OnN0cmluZyBrTGVnYWN5UHJvdmlkZXJOYW1lKCJsZWdhY3kvMCIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0V4dGVybmFsUHJvdmlkZXJOYW1lKCJleHRlcm5hbC8wIik7Citjb25zdCBib29sIGtFbmFibGVMYXp5SGFsKHByb3BlcnR5X2dldF9ib29sKCJyby5jYW1lcmEuZW5hYmxlTGF6eUhhbCIsIGZhbHNlKSk7CisKKy8vIFRoZSBleHRyYSBhbW91bnQgb2YgdGltZSB0byBob2xkIGEgcmVmZXJlbmNlIHRvIGFuIElDYW1lcmFQcm92aWRlciBhZnRlciBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorLy8gSG9sZCB0aGUgcmVmZXJlbmNlIGZvciB0aGlzIGV4dHJhIHRpbWUgc28gdGhhdCBpZiB0aGUgY2FtZXJhIGlzIHVucmVmZXJlbmNlZCBhbmQgdGhlbiByZWZlcmVuY2VkCisvLyBhZ2FpbiBxdWlja2x5LCB3ZSBkbyBub3QgbGV0IHRoZSBIQUwgZXhpdCBhbmQgdGhlbiBuZWVkIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgaXQuIEFuIGV4YW1wbGUKKy8vIHdoZW4gdGhpcyBjb3VsZCBoYXBwZW4gaXMgc3dpdGNoaW5nIGZyb20gYSBmcm9udC1mYWNpbmcgdG8gYSByZWFyLWZhY2luZyBjYW1lcmEuIElmIHRoZSBIQUwgd2VyZQorLy8gdG8gZXhpdCBkdXJpbmcgdGhlIGNhbWVyYSBzd2l0Y2gsIHRoZSBjYW1lcmEgY291bGQgYXBwZWFyIGphbmt5IHRvIHRoZSB1c2VyLgorY29uc3Qgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6ZHVyYXRpb24ga0NhbWVyYUtlZXBBbGl2ZURlbGF5ID0gM3M7CiAKIH0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCkBAIC03MSw2ICs4OCw4IEBACiAgICAgYWRkUHJvdmlkZXJMb2NrZWQoa0xlZ2FjeVByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKICAgICBhZGRQcm92aWRlckxvY2tlZChrRXh0ZXJuYWxQcm92aWRlck5hbWUsIC8qZXhwZWN0ZWQqLyBmYWxzZSk7CiAKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE3NCw2ICsxOTMsMTkgQEAKICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhSW5mbyhpbmZvKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZUluZm8tPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbiwgc3RhdHVzKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKQEAgLTIwMywyNiArMjM1LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIHsKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0gICAgYm9vbCBzdXBwb3J0ID0gZmFsc2U7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKICAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgICAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBhdXRvIHJldCA9IHByb3ZpZGVyLT5tSW50ZXJmYWNlLT5pc1NldFRvcmNoTW9kZVN1cHBvcnRlZCgKLSAgICAgICAgICAgICAgICBbJnN1cHBvcnRdKGF1dG8gc3RhdHVzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgPSBzdXBwb3J0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2hlY2tpbmcgdG9yY2ggbW9kZSBzdXBwb3J0ICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlci0+bVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gc3VwcG9ydDsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgYm9vbCBlbmFibGVkKSB7CkBAIC0yMzEsNiArMjUyLDE1IEBACiAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAorICAgIC8vIFBhc3MgdGhlIGNhbWVyYSBJRCB0byBzdGFydCBpbnRlcmZhY2Ugc28gdGhhdCBpdCB3aWxsIHNhdmUgaXQgdG8gdGhlIG1hcCBvZiBJQ2FtZXJhUHJvdmlkZXJzCisgICAgLy8gdGhhdCBhcmUgY3VycmVudGx5IGluIHVzZS4KKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgZGV2aWNlSW5mby0+bUlkLCBpbnRlcmZhY2UpOworCiAgICAgcmV0dXJuIGRldmljZUluZm8tPnNldFRvcmNoTW9kZShlbmFibGVkKTsKIH0KIApAQCAtMjM4LDM3ICsyNjgsNyBAQAogICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CiAKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewotICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOwotICAgICAgICBTdGF0dXMgc3RhdHVzOwotICAgICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICAgICAgcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmdldFZlbmRvclRhZ3MoCi0gICAgICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCi0gICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7Ci0gICAgICAgIHN0YXR1c190IHJlczsKLSAgICAgICAgaWYgKChyZXMgPSBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHZ0cywgLypvdXQqL2Rlc2MpKQotICAgICAgICAgICAgICAgICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKLSAgICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKLSAgICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQsIGRlc2MpOworICAgICAgICB0YWdDYWNoZS0+YWRkVmVuZG9yRGVzY3JpcHRvcihwcm92aWRlci0+bVByb3ZpZGVyVGFnaWQsIHByb3ZpZGVyLT5tVmVuZG9yVGFnRGVzY3JpcHRvcik7CiAgICAgfQogCiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0NhY2hlKHRhZ0NhY2hlKTsKQEAgLTI3Nyw5ICsyNzcsOSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgeworICAgICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbikgewogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMjg4LDEwICsyODgsMjIgQEAKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKICAgICBhdXRvICpkZXZpY2VJbmZvMyA9IHN0YXRpY19jYXN0PFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzMqPihkZXZpY2VJbmZvKTsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgcHJvdmlkZXIpOwogCiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBkZXZpY2VJbmZvMy0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjaywgWyZzdGF0dXMsICZzZXNzaW9uXQorICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0ID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCiAgICAgICAgICAgICAoU3RhdHVzIHMsIGNvbnN0IHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+JiBjYW1lcmFTZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKQEAgLTI5OSw2ICszMTEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CkBAIC0zMDcsOSArMzIwLDkgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIGNvbnN0IHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbikgeworICAgICAgICBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zMTgsMjQgKzMzMSw4OCBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8xID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMSo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOworICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzEtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAorICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAqc2Vzc2lvbiA9IGRldmljZUluZm8xLT5tSW50ZXJmYWNlOworICAgICAgICAqc2Vzc2lvbiA9IGludGVyZmFjZTsKICAgICB9CiAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwogfQogCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcikgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiU2F2aW5nIGNhbWVyYSBwcm92aWRlciAlcyBmb3IgY2FtZXJhIGRldmljZSAlcyIsIHByb3ZpZGVyLT5kZXNjcmlwdG9yLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJpbWFyeU1hcCwgKmFsdGVybmF0ZU1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworICAgICAgICBhbHRlcm5hdGVNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmltYXJ5TWFwID0gJm1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfQorICAgIGF1dG8gaWQgPSBjYW1lcmFJZC5jX3N0cigpOworICAgICgqcHJpbWFyeU1hcClbaWRdID0gcHJvdmlkZXI7CisgICAgYXV0byBzZWFyY2ggPSBhbHRlcm5hdGVNYXAtPmZpbmQoaWQpOworICAgIGlmIChzZWFyY2ggIT0gYWx0ZXJuYXRlTWFwLT5lbmQoKSkgeworICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBkZXZpY2UgJXMgaXMgdXNpbmcgYm90aCB0b3JjaCBtb2RlIGFuZCBjYW1lcmEgbW9kZSBzaW11bHRhbmVvdXNseS4gIgorICAgICAgICAgICAgICAgICJUaGF0IHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgZGV2aWNlICVzIGNvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXywgaWQpOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6cmVtb3ZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpIHsKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0koIlJlbW92aW5nIGNhbWVyYSBkZXZpY2UgJXMiLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAqcHJvdmlkZXJNYXA7CisgICAgaWYgKHVzYWdlVHlwZSA9PSBEZXZpY2VNb2RlOjpUT1JDSCkgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvdmlkZXJNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jayk7CisgICAgYXV0byBzZWFyY2ggPSBwcm92aWRlck1hcC0+ZmluZChjYW1lcmFJZC5jX3N0cigpKTsKKyAgICBpZiAoc2VhcmNoICE9IHByb3ZpZGVyTWFwLT5lbmQoKSkgeworICAgICAgICBhdXRvIHB0ciA9IHNlYXJjaC0+c2Vjb25kOworICAgICAgICBhdXRvIGZ1dHVyZSA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBbcHRyXSB7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa0NhbWVyYUtlZXBBbGl2ZURlbGF5KTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgfSk7CisgICAgICAgIHByb3ZpZGVyTWFwLT5lcmFzZShjYW1lcmFJZC5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEFza2VkIHRvIHJlbW92ZSByZWZlcmVuY2UgZm9yIGNhbWVyYSAlcywgYnV0IG5vIHJlZmVyZW5jZSB0byBpdCB3YXMgZm91bmQuIFRoaXMgIgorICAgICAgICAgICAgICAgICJjb3VsZCBtZWFuIHJlbW92ZVJlZiB3YXMgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBjYW1lcmEgSUQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIH0KK30KIAogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9uUmVnaXN0cmF0aW9uKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIC8qZnFOYW1lKi8sCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgbmFtZSwKICAgICAgICAgYm9vbCAvKnByZWV4aXN0aW5nKi8pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMzQ3LDYgKzQyNCw4IEBACiAgICAgICAgIGxpc3RlbmVyLT5vbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpOwogICAgIH0KIAorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIHJldHVybiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+KCk7CiB9CiAKQEAgLTM5MiwzNSArNDcxLDE4NCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKLSAgICBib29sIGlzTG9naWNhbENhbSA9IGZhbHNlOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5Q2FwOwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlDYXA7CiAKLSAgICBlbnRyeUNhcCA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZW50cnlDYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDYXAuY291bnQ7ICsraSkgewogICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeUNhcC5kYXRhLnU4W2ldOwogICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgewotICAgICAgICAgICAgaXNMb2dpY2FsQ2FtID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFpc0xvZ2ljYWxDYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghbUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlJZHMgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5SWRzID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKAorICAgICAgICAgICAgQU5EUk9JRF9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMpOwogICAgIGNvbnN0IHVpbnQ4X3QqIGlkcyA9IGVudHJ5SWRzLmRhdGEudTg7CiAgICAgc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5SWRzLmNvdW50OyArK2kpIHsKICAgICAgICAgaWYgKGlkc1tpXSA9PSAnXDAnKSB7CiAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gaSkgewotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLT5wdXNoX2JhY2soKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CisgICAgICAgICAgICAgICAgbVBoeXNpY2FsSWRzLnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXJ0ID0gaSsxOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisKKyAgICAvLyBPdmVycmlkZSBzdGF0aWMgbWV0YWRhdGEgZm9yIE1PTk9DSFJPTUUgY2FtZXJhIHdpdGggb2xkZXIgZGV2aWNlIHZlcnNpb24KKyAgICBpZiAobVZlcnNpb24uZ2V0X21ham9yKCkgPT0gMyAmJiBtVmVyc2lvbi5nZXRfbWlub3IoKSA8IDUpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGNhcCA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjYXAuZGF0YS51OFtpXSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKKyAgICAgICAgICAgICAgICB1aW50OF90IGNmYSA9IEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX01PTk87CisgICAgICAgICAgICAgICAgcmVzID0gYy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQsICZjZmEsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIENPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHNLZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVxS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVxS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHJlc0tleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9HUkVFTl9TUExJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHJlc0tleXMsIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IGMuZmluZChBTkRST0lEX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMTsgaiA8IGJsRW50cnkuY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBibEVudHJ5LmRhdGEuaTMyW2pdID0gYmxFbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpyZW1vdmVBdmFpbGFibGVLZXlzKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgYywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBrZXlzLCB1aW50MzJfdCBrZXlUYWcpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBrZXlzRW50cnkgPSBjLmZpbmQoa2V5VGFnKTsKKyAgICBpZiAoa2V5c0VudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCB0YWcgJXU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIGtleVRhZywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHZLZXlzOworICAgIHZLZXlzLnJlc2VydmUoa2V5c0VudHJ5LmNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleXNFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoa2V5cy5iZWdpbigpLCBrZXlzLmVuZCgpLCBrZXlzRW50cnkuZGF0YS5pMzJbaV0pID09IGtleXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHZLZXlzLnB1c2hfYmFjayhrZXlzRW50cnkuZGF0YS5pMzJbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJlcyA9IGMudXBkYXRlKGtleVRhZywgdktleXMuZGF0YSgpLCB2S2V5cy5zaXplKCkpOworICAgIHJldHVybiByZXM7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSAmJiBwaHlzaWNhbENhbWVyYUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICpwaHlzaWNhbENhbWVyYUlkcyA9IGRldmljZUluZm8tPm1QaHlzaWNhbElkczsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmE7Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgeworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1JZCA9PSBjYW1lcmFJZCkgeworICAgICAgICAgICAgICAgIC8vIGNhbWVyYUlkIGlzIGZvdW5kIGluIHB1YmxpYyBjYW1lcmEgSURzIGFkdmVydGlzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy8gcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCZpbmZvKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgZm9yIGlkICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsSWRzOworICAgICAgICAgICAgaWYgKGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5iZWdpbigpLCBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCkgIT0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogV3JvbmcgZGV2aWNlVmVyc2lvbiAleCBmb3IgaGlkZGVuUGh5c2ljYWxDYW1lcmFJZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbiwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIsIGJvb2wgZXhwZWN0ZWQpIHsKQEAgLTQ0NSw5ICs2NzMsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8UHJvdmlkZXJJbmZvPiBwcm92aWRlckluZm8gPQotICAgICAgICAgICAgbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgaW50ZXJmYWNlLCB0aGlzKTsKLSAgICBzdGF0dXNfdCByZXMgPSBwcm92aWRlckluZm8tPmluaXRpYWxpemUoKTsKKyAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIHRoaXMpOworICAgIHN0YXR1c190IHJlcyA9IHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZShpbnRlcmZhY2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC00NTgsNiArNjg1LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVQcm92aWRlcihjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gcHJvdmlkZXJMb2NrKG1Qcm92aWRlckxpZmVjeWNsZUxvY2spOwogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIHN0ZDo6dmVjdG9yPFN0cmluZzg+IHJlbW92ZWREZXZpY2VJZHM7CiAgICAgc3RhdHVzX3QgcmVzID0gTkFNRV9OT1RfRk9VTkQ7CkBAIC00OTgsMjcgKzcyNiwyNiBAQAogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6UHJvdmlkZXJJbmZvKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAogICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpIDoKICAgICAgICAgbVByb3ZpZGVyTmFtZShwcm92aWRlck5hbWUpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1Qcm92aWRlclRhZ2lkKGdlbmVyYXRlVmVuZG9yVGFnSWQocHJvdmlkZXJOYW1lKSksCiAgICAgICAgIG1VbmlxdWVEZXZpY2VDb3VudCgwKSwKICAgICAgICAgbU1hbmFnZXIobWFuYWdlcikgewogICAgICh2b2lkKSBtTWFuYWdlcjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemUoKSB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSkgewogICAgIHN0YXR1c190IHJlcyA9IHBhcnNlUHJvdmlkZXJOYW1lKG1Qcm92aWRlck5hbWUsICZtVHlwZSwgJm1JZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJvdmlkZXIgbmFtZSwgaWdub3JpbmciLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HSSgiQ29ubmVjdGluZyB0byBuZXcgY2FtZXJhIHByb3ZpZGVyOiAlcywgaXNSZW1vdGU/ICVkIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSk7CisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGludGVyZmFjZS0+aXNSZW1vdGUoKSk7CiAgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKICAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucwotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtNTMwLDcgKzc1Nyw3IEBACiAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IG1JbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOwogICAgIGlmICghbGlua2VkLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC01NDIsMTMgKzc2OSwyMiBAQAogCiAgICAgLy8gR2V0IGluaXRpYWwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcywgaWYgYW55CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsICZkZXZpY2VzXSgKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSWRMaXN0KFsmc3RhdHVzLCB0aGlzLCAmZGV2aWNlc10oCiAgICAgICAgICAgICBTdGF0dXMgaWRTdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpIHsKICAgICAgICAgc3RhdHVzID0gaWRTdGF0dXM7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYW1lcmFEZXZpY2VOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZXMucHVzaF9iYWNrKGNhbWVyYURldmljZU5hbWVzW2ldKTsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmFtZSA6IGNhbWVyYURldmljZU5hbWVzKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUsIGlkOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHBhcnNlRGV2aWNlTmFtZShuYW1lLCAmbWFqb3IsICZtaW5vciwgJnR5cGUsICZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHBhcnNpbmcgZGV2aWNlTmFtZTogJXM6ICVkIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKQEAgLTU2MiwxMSArNzk4LDI0IEBACiAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKKyAgICByZXQgPSBpbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAorICAgICAgICBbdGhpc10oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkID0gc3VwcG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1Jc1JlbW90ZSA9IGludGVyZmFjZS0+aXNSZW1vdGUoKTsKKwogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwogICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewogICAgICAgICBzdGQ6OnN0cmluZyBpZDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwgY29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGVudW1lcmF0ZSBjYW1lcmEgZGV2aWNlICclcyc6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTU3NCwxMyArODIzLDUzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBBTE9HSSgiQ2FtZXJhIHByb3ZpZGVyICVzIHJlYWR5IHdpdGggJXp1IGNhbWVyYSBkZXZpY2VzIiwKICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbURldmljZXMuc2l6ZSgpKTsKIAogICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCitjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPgorQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HSSgiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgYXV0byBpbnRlcmZhY2UgPSBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0koIkNvdWxkIG5vdCBwcm9tb3RlLCBjYWxsaW5nIGdldFNlcnZpY2UoJXMpIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgaW50ZXJmYWNlID0gbU1hbmFnZXItPm1TZXJ2aWNlUHJveHktPmdldFNlcnZpY2UobVByb3ZpZGVyTmFtZSk7CisgICAgICAgIGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIGhhcmR3YXJlOjpSZXR1cm48Ym9vbD4gbGlua2VkID0gaW50ZXJmYWNlLT5saW5rVG9EZWF0aCh0aGlzLCAvKmNvb2tpZSovIG1JZCk7CisgICAgICAgIGlmICghbGlua2VkLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBpbiBsaW5raW5nIHRvIGNhbWVyYSBwcm92aWRlciAnJXMnIGRlYXRoOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBsaW5rZWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGxpbmsgdG8gcHJvdmlkZXIgJyVzJyBkZWF0aCBub3RpZmljYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCiBjb25zdCBzdGQ6OnN0cmluZyYgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldFR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1UeXBlOwogfQpAQCAtNjYyLDcgKzk1MSw3IEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIGNvbnN0IHsKICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuNCwgJXMpIHN0YXRpYyBpbmZvOiAlenUgZGV2aWNlczogPT1cbiIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1JbnRlcmZhY2UtPmlzUmVtb3RlKCkgPyAicmVtb3RlIiA6ICJwYXNzdGhyb3VnaCIsCisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1Jc1JlbW90ZSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKICAgICAgICAgICAgIG1EZXZpY2VzLnNpemUoKSk7CiAKICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CkBAIC03MDMsNiArOTkyLDI0IEBACiAgICAgICAgICAgICBpbmZvMi5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIER1bXAgY2hhcmFjdGVyaXN0aWNzIG9mIG5vbi1zdGFuZGFsb25lIHBoeXNpY2FsIGNhbWVyYQorICAgICAgICBpZiAoZGV2aWNlLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogZGV2aWNlLT5tUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHBoeXNpY2FsIGlkIGlzIGFuIGluZGVwZW5kZW50IGNhbWVyYQorICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxJbmZvOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQsICZwaHlzaWNhbEluZm8pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgUGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczpcbiIsIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbEluZm8uZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBIQUwgZGV2aWNlICVzICh2JWQuJWQpIGR1bXBTdGF0ZTogPT1cbiIsIGRldmljZS0+bU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBkZXZpY2UtPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2UtPm1WZXJzaW9uLmdldF9taW5vcigpKTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5kdW1wU3RhdGUoZmQpOwpAQCAtNzcyLDYgKzEwNzksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdG9yY2hTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKICAgICAgICAgICAgICAgICBpZCA9IGRldmljZUluZm8tPm1JZDsKICAgICAgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OICE9IG5ld1N0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUmVmKERldmljZU1vZGU6OlRPUkNILCBpZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MDAsMTUgKzExMTAsNTUgQEAKICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRWZW5kb3JUYWdzKAorICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7CisgICAgICAgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCh2dHMsIC8qb3V0Ki9tVmVuZG9yVGFnRGVzY3JpcHRvcikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKKyAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CiBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8+CiAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemVEZXZpY2VJbmZvKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKIAogICAgIGF1dG8gY2FtZXJhSW50ZXJmYWNlID0KLSAgICAgICAgICAgIGdldERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7CiAgICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKIAogICAgIENhbWVyYVJlc291cmNlQ29zdCByZXNvdXJjZUNvc3Q7CkBAIC04MzUsMTMgKzExODUsMTMgQEAKICAgICB9CiAKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+KAotICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UpKTsKKyAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsIHRoaXMsCisgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLCBjYW1lcmFJbnRlcmZhY2UpKTsKIH0KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KIHNwPEludGVyZmFjZVQ+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5rbm93biBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIEludGVyZmFjZVQ6OnZlcnNpb24uZ2V0X21ham9yKCkpOwogICAgIHJldHVybiBudWxscHRyOwpAQCAtODQ5LDEyICsxMTk5LDE2IEBACiAKIHRlbXBsYXRlPD4KIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQorICAgICAgICA8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAogICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKQEAgLTg3NCwxMiArMTIyOCwxNiBAQAogCiB0ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKKyAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKICAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC05MDAsNiArMTI1OCwxOCBAQAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86On5EZXZpY2VJbmZvKCkge30KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KK3NwPEludGVyZmFjZVQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKKyAgICBzcDxJbnRlcmZhY2VUPiBkZXZpY2U7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgZGV2aWNlID0gbVBhcmVudFByb3ZpZGVyLT5zdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPihtTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlID0gKEludGVyZmFjZVQgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsCiAgICAgICAgIGJvb2wgZW5hYmxlZCkgewogICAgIFN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCA/IFRvcmNoTW9kZTo6T04gOiBUb3JjaE1vZGU6Ok9GRik7CkBAIC05MTAsMzAgKzEyODAsMzEgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7CiAgICAgLy8gR2V0IGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQogICAgIC8vIFJlcXVpcmVzIHBvd2VyaW5nIG9uIHRoZSBjYW1lcmEgZGV2aWNlCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihudWxscHRyKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9wZW4gY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKICAgICAgICAgICAgICAgICBtRGVmYXVsdFBhcmFtZXRlcnMudW5mbGF0dGVuKFN0cmluZzgocGFybXMuY19zdHIoKSkpOwogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgcmVhZGluZyBjYW1lcmEgZGV2aWNlICVzIHBhcmFtcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUgPQpAQCAtOTQyLDI3ICsxMzEzLDQzIEBACiAgICAgICAgIG1IYXNGbGFzaFVuaXQgPSB0cnVlOwogICAgIH0KIAotICAgIHJldCA9IG1JbnRlcmZhY2UtPmNsb3NlKCk7CisgICAgc3RhdHVzX3QgcmVzID0gY2FjaGVDYW1lcmFJbmZvKGludGVyZmFjZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBjYWNoZSBDYW1lcmFJbmZvIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldCA9IGludGVyZmFjZS0+Y2xvc2UoKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjbG9zaW5nIGNhbWVyYSBkZXZpY2UgJXMgYWZ0ZXIgY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKICAgICB9CiB9CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6fkRldmljZUluZm8xKCkge30KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShtSW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmdldENhbWVyYUluZm8oCiAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCB7CiAgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAqaW5mbyA9IG1JbmZvOworICAgIHJldHVybiBPSzsKK30KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpjYWNoZUNhbWVyYUluZm8oCisgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY0luZm87CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjSW5mbyA9IGNhbUluZm87CiAgICAgICAgICAgICB9KTsKQEAgLTk3NywyNyArMTM2NCwzMSBAQAogCiAgICAgc3dpdGNoKGNJbmZvLmZhY2luZykgewogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpCQUNLOgotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RVhURVJOQUw6CiAgICAgICAgICAgICAvLyBNYXAgZXh0ZXJuYWwgdG8gZnJvbnQgZm9yIGxlZ2FjeSBBUEkKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RlJPTlQ6Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiJXM6IERldmljZSAlczogVW5rbm93biBjYW1lcmEgZmFjaW5nOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIGNJbmZvLmZhY2luZyk7Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKICAgICB9Ci0gICAgaW5mby0+b3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKKyAgICBtSW5mby5vcmllbnRhdGlvbiA9IGNJbmZvLm9yaWVudGF0aW9uOwogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgewogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gcyA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgaWYgKCFzLmlzT2soKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMDA5LDE0ICsxNDAwLDE1IEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewogICAgIC8vIEdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFsmc3RhdHVzLCB0aGlzXShTdGF0dXMgcywKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewpAQCAtMTAzNSwxMyArMTQyNywxOSBAQAogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXMiCi0gICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwKICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CkBAIC0xMDUyLDEyICsxNDUwLDcwIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IGZhbHNlOwogICAgIH0KKworICAgIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKKyAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIGlmICghY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBVbmFibGUgdG8gY29udmVydCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIHZlcnNpb24gMy41IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb252ZXJ0ZWQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGZvciAoYXV0byYgaWQgOiBtUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkgIT0KKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgaGlkbElkKGlkKTsKKyAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGhpZGxJZCwKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZpZCwgdGhpc10oU3RhdHVzIHMsIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBpZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CiB9CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6fkRldmljZUluZm8zKCkge30KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShtSW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldENhbWVyYUluZm8oCkBAIC0xMTA4LDEwICsxNTY0LDE0IEBACiAgICAgcmV0dXJuIGlzQmFja3dhcmRDb21wYXRpYmxlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgewogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBhdXRvIHJldCA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byByZXQgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTExMjcsNiArMTU4Nyw2MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICBpZiAoY2hhcmFjdGVyaXN0aWNzID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKHBoeXNpY2FsQ2FtZXJhSWQpID09CisgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpjaGFyYWN0ZXJpc3RpY3MgPSBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuYXQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKworICAgIGNvbnN0IHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0KKyAgICAgICAgICAgIHRoaXMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgU3RhdHVzIGNhbGxTdGF0dXM7CisgICAgYXV0byByZXQgPSAgaW50ZXJmYWNlXzNfNS0+aXNTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgWyZjYWxsU3RhdHVzLCAmc3RhdHVzXSAoU3RhdHVzIHMsIGJvb2wgY29tYlN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpzdGF0dXMgPSBjb21iU3RhdHVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY2FzZSwgZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGFyc2VQcm92aWRlck5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICp0eXBlLCB1aW50MzJfdCAqaWQpIHsKICAgICAvLyBGb3JtYXQgbXVzdCBiZSAiPHR5cGU+LzxpZD4iCkBAIC0xMzY5LDcgKzE4ODQsNyBAQAogCiAKIHN0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpIHsKIApAQCAtMTM5Nyw3ICsxOTEyLDcgQEAKIAogICAgIGludCBpZHggPSAwOwogICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7Ci0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOwogICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHNlY3Rpb24uc2VjdGlvbk5hbWUuY19zdHIoKTsKICAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgc2VjdGlvbiAlenUuIiwgX19GVU5DVElPTl9fLCBzKTsKQEAgLTE0NTgsMTAgKzE5NzMsMjAgQEAKIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7Ci0gICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NCwwfSk7Ci0gICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezUsMH0pOworICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIH0KIAotICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAvLyBGaW5kIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQpIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiB9CiAKIHZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKApAQCAtMTQ3MCwyMCArMTk5NSwxNCBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gcmVtb3ZlZElkczsKIAogICAgIGZvciAoYXV0byYgZGV2aWNlSWQgOiBkZXZpY2VJZHMpIHsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGRldmljZUlkLCAmaW5mbyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3IgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGRldmljZUlkKTsKKyAgICAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgY29udGludWU7CiAKLSAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShpbmZvLCAmaWRDb21ibyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSkgeworICAgICAgICBpZiAoIWRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIC8vIGlkQ29tYm8gY29udGFpbnMgdGhlIGlkcyBvZiBhIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgY2FtZXJhcworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRDb21ibyA9IGRldmljZUluZm8tPm1QaHlzaWNhbElkczsKICAgICAgICAgaWRDb21iby5wdXNoX2JhY2soZGV2aWNlSWQpOwogCiAgICAgICAgIGZvciAoYXV0byYgaWQgOiBkZXZpY2VJZHMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAppbmRleCBiOGI4YjhjLi4wOTY2NzQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBUFJPVklERVJfSAogCiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bXV0ZXg+CkBAIC0yOCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNC9JQ2FtZXJhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAvLyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTm90aWZpY2F0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KQEAgLTExMCw2ICsxMTIsMTQgQEAKICAgICB9OwogCiAgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgbW9kZSBhIGNhbWVyYSBkZXZpY2UgaXMgY3VycmVudGx5IGluCisgICAgICovCisgICAgZW51bSBjbGFzcyBEZXZpY2VNb2RlIHsKKyAgICAgICAgVE9SQ0gsCisgICAgICAgIENBTUVSQQorICAgIH07CisKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBtYW5hZ2VyIGFuZCBnaXZlIGl0IGEgc3RhdHVzIGxpc3RlbmVyOyBvcHRpb25hbGx5IGFjY2VwdHMgYSBzZXJ2aWNlCiAgICAgICogaW50ZXJhY3Rpb24gcHJveHkuCiAgICAgICoKQEAgLTE2Niw2ICsxNzYsMTMgQEAKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGRldmljZSBzdXBwb3J0IG9mIHNwZWNpZmljIHN0cmVhbSBjb21iaW5hdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uIGZvciB0aGlzIElECiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLApAQCAtMTc0LDcgKzE5MSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBjYW1lcmEgZGV2aWNlIHN1cHBvcnQgc2V0VG9yY2hNb2RlIEFQSS4KICAgICAgKi8KLSAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKTsKKyAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFR1cm4gb24gb3Igb2ZmIHRoZSBmbGFzaGxpZ2h0IG9uIGEgZ2l2ZW4gY2FtZXJhIGRldmljZS4KQEAgLTIwNSw2ICsyMjIsMTcgQEAKICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pOwogCiAgICAgLyoqCisgICAgICogU2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgb3IgdG9yY2ggY2xpZW50CisgICAgICovCisgICAgdm9pZCBzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcik7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhhdCB0aGUgY2FtZXJhIG9yIHRvcmNoIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGJ5IGEgY2FtZXJhIGNsaWVudAorICAgICAqLworICAgIHZvaWQgcmVtb3ZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCisgICAgLyoqCiAgICAgICogSVNlcnZpY2VOb3RpZmljYXRpb246Om9uUmVnaXN0cmF0aW9uCiAgICAgICogSW52b2tlZCBieSB0aGUgaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIHdoZW4gYSBuZXcgY2FtZXJhIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKICAgICAgKi8KQEAgLTIzMSwxMiArMjU5LDEyIEBACiAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb24gPSBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEwMDAsMH0pIGNvbnN0OwogCiAgICAgLyoKLSAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSB3aXRoIHN0YXRpY0luZm8gaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCisgICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgaXMgYSBsb2dpY2FsIGNhbWVyYS4gQW5kIGlmIHllcywgcmV0dXJuCiAgICAgICogdGhlIHBoeXNpY2FsIGNhbWVyYSBpZHMuCiAgICAgICovCi0gICAgc3RhdGljIGJvb2wgaXNMb2dpY2FsQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKIAorICAgIGJvb2wgaXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpOwogcHJpdmF0ZToKICAgICAvLyBBbGwgcHJpdmF0ZSBtZW1iZXJzLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCBleHBlY3QgbUludGVyZmFjZU11dGV4IHRvIGJlIGxvY2tlZCBiZWZvcmUgdXNlCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1JbnRlcmZhY2VNdXRleDsKQEAgLTI0NiwyMiArMjc0LDQ4IEBACiAgICAgd3A8U3RhdHVzTGlzdGVuZXI+IG1MaXN0ZW5lcjsKICAgICBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogbVNlcnZpY2VQcm94eTsKIAorICAgIC8vIG1Qcm92aWRlckxpZmVjeWNsZUxvY2sgaXMgbG9ja2VkIGR1cmluZyBvblJlZ2lzdHJhdGlvbiBhbmQgcmVtb3ZlUHJvdmlkZXIKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVByb3ZpZGVyTGlmZWN5Y2xlTG9jazsKKwogICAgIHN0YXRpYyBIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5IHNIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5OwogCisgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCisgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciBjYW1lcmEKKyAgICAvLyBjYXBhYmlsaXRpZXMKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PgorICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKworICAgIC8vIE1hcHBpbmcgZnJvbSBDYW1lcmFEZXZpY2UgSURzIHRvIENhbWVyYVByb3ZpZGVycy4gVGhpcyBtYXAgaXMgdXNlZCB0byBrZWVwIHRoZQorICAgIC8vIElDYW1lcmFQcm92aWRlciBhbGl2ZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRCBmb3IgdG9yY2gKKyAgICAvLyBjYXBhYmlsaXRpZXMKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PgorICAgICAgICAgICAgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworCisgICAgLy8gTG9jayBmb3IgYWNjZXNzaW5nIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQgYW5kIG1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZAorICAgIHN0ZDo6bXV0ZXggbVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jazsKKwogICAgIHN0cnVjdCBQcm92aWRlckluZm8gOgogICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrLAogICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50CiAgICAgewogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJvdmlkZXJOYW1lOwotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtSW50ZXJmYWNlOwogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gbVZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGJvb2wgbVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKKyAgICAgICAgYm9vbCBtSXNSZW1vdGU7CisKKyAgICAgICAgLy8gVGhpcyBwb2ludGVyIGlzIHVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgSUNhbWVyYVByb3ZpZGVyIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQuCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1BY3RpdmVJbnRlcmZhY2U7CisKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbVNhdmVkSW50ZXJmYWNlOwogCiAgICAgICAgIFByb3ZpZGVySW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAotICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKTsKICAgICAgICAgflByb3ZpZGVySW5mbygpOwogCi0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKKyAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlKTsKKworICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CiAKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFR5cGUoKSBjb25zdDsKIApAQCAtMjgzLDg0ICszMzcsMTQxIEBACiAgICAgICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKICAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pIG92ZXJyaWRlOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXR1cCB2ZW5kb3IgdGFncyBmb3IgdGhpcyBwcm92aWRlcgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgc2V0VXBWZW5kb3JUYWdzKCk7CisKICAgICAgICAgLy8gQmFzaWMgZGV2aWNlIGluZm9ybWF0aW9uLCBjb21tb24gdG8gYWxsIGNhbWVyYSBkZXZpY2VzCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOyAgLy8gRnVsbCBpbnN0YW5jZSBuYW1lCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtSWQ7ICAgIC8vIElEIHNlY3Rpb24gb2YgZnVsbCBuYW1lCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1WZXJzaW9uOwogICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgICAgICBib29sIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOworICAgICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gbUluZm87CisgICAgICAgICAgICBzcDxJQmFzZT4gbVNhdmVkSW50ZXJmYWNlOwogCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBtUmVzb3VyY2VDb3N0OwogCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBtU3RhdHVzOwogCisgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IG1QYXJlbnRQcm92aWRlcjsKKwogICAgICAgICAgICAgYm9vbCBoYXNGbGFzaFVuaXQoKSBjb25zdCB7IHJldHVybiBtSGFzRmxhc2hVbml0OyB9CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCA9IDA7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgewogICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgICAgICAgICAgICAgICh2b2lkKSBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKiAvKnN0YXR1cyovKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiYgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCkgOgorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlcikgOgogICAgICAgICAgICAgICAgICAgICBtTmFtZShuYW1lKSwgbUlkKGlkKSwgbVZlcnNpb24odmVyc2lvbiksIG1Qcm92aWRlclRhZ2lkKHRhZ0lkKSwKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAogICAgICAgICAgICAgICAgICAgICBtU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UKSwKLSAgICAgICAgICAgICAgICAgICAgbUhhc0ZsYXNoVW5pdChmYWxzZSkge30KKyAgICAgICAgICAgICAgICAgICAgbVBhcmVudFByb3ZpZGVyKHBhcmVudFByb3ZpZGVyKSwgbUhhc0ZsYXNoVW5pdChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMocHVibGljQ2FtZXJhSWRzKSB7fQogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbygpOwogICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICBib29sIG1IYXNGbGFzaFVuaXQ7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG1QdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiAgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwgYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KKyAgICAgICAgICAgIHN0YXR1c190IHNldFRvcmNoTW9kZUZvckRldmljZShib29sIGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBzYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgaW50ZXJmYWNlIGhlcmUgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGlzIHdhcworICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKCksIHdoaWNoIGRvZXMgc2F2ZSBpdC4KKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgICAgICAgICAgICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoaW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+PiBtRGV2aWNlczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQ2FtZXJhSWRzOwogICAgICAgICBpbnQgbVVuaXF1ZURldmljZUNvdW50OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzOworICAgICAgICAvLyBUaGUgaW5pdGlhbCBwdWJsaWMgY2FtZXJhIElEcyBwdWJsaXNoZWQgYnkgdGhlIGNhbWVyYSBwcm92aWRlci4KKyAgICAgICAgLy8gQ3VycmVudGx5IGxvZ2ljYWwgbXVsdGktY2FtZXJhIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdC1wbHVnIGNhbWVyYS4KKyAgICAgICAgLy8gQW5kIHdlIHVzZSB0aGlzIGxpc3QgdG8ga2VlcCB0cmFjayBvZiBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzCisgICAgICAgIC8vIGFkdmVydGlzZWQgYnkgdGhlIHByb3ZpZGVyLCBhbmQgdG8gZGlzdGluZ3Vpc2ggYWdhaW5zdCAiaGlkZGVuIgorICAgICAgICAvLyBwaHlzaWNhbCBjYW1lcmEgSURzLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzOwogCiAgICAgICAgIC8vIEhBTHYxLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8xIDogcHVibGljIERldmljZUluZm8gewogICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKLSAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IG1JbnRlcmZhY2U7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgLy9JbiBjYXNlIG9mIERldmljZTFJbmZvIGFzc3VtZSB0aGF0IHdlIGFyZSBhbHdheXMgQVBJMSBjb21wYXRpYmxlCiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOwogICAgICAgICAgICAgRGV2aWNlSW5mbzEoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgICAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvMSgpOwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczIgbURlZmF1bHRQYXJhbWV0ZXJzOworICAgICAgICAgICAgc3RhdHVzX3QgY2FjaGVDYW1lcmFJbmZvKHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgIH07CiAKICAgICAgICAgLy8gSEFMdjMtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzMgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwotICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gbUludGVyZmFjZTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgIERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzMoKTsKICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICB2b2lkIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF2YWlsYWJsZUtleXMoQ2FtZXJhTWV0YWRhdGEmIGMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYga2V5cywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5VGFnKTsKICAgICAgICAgfTsKIAogICAgIHByaXZhdGU6CkBAIC0zNzgsMTEgKzQ4OSwxMSBAQAogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pOwogCiAgICAgICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICBzcDxJbnRlcmZhY2VUPiBnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0OworICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CiAKICAgICAgICAgLy8gUGFyc2UgcHJvdmlkZXIgaW5zdGFuY2UgbmFtZSBmb3IgdHlwZSBhbmQgaWQKICAgICAgICAgc3RhdGljIHN0YXR1c190IHBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLApAQCAtNDE2LDYgKzUyNywxNCBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKIAorICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyLAorICAgICAgICAgICAgYm9vbCBpc1RvcmNoVXNhZ2UpOworICAgIHZvaWQgcmVtb3ZlQ2FtZXJhSWRGcm9tTWFwKAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAmbWFwLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRldmljZVN0YXR1c1RvU3RyaW5nKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyYpOwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b3JjaFN0YXR1c1RvU3RyaW5nKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggNjE2NjVhYy4uMTJmYmY4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKQEAgLTc4LDExICs3OSwxMCBAQAogICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxpc3RlbmVyKE5VTEwpLAogICAgICAgICBtVmVuZG9yVGFnSWQoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lEKSwKLSAgICAgICAgbUxhc3RUZW1wbGF0ZUlkKC0xKQorICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpLAorICAgICAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MoZmFsc2UpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6bm90aWZ5ID0gJnNOb3RpZnk7Ci0gICAgY2FtZXJhM19jYWxsYmFja19vcHM6OnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgPSAmc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OwogICAgIEFMT0dWKCIlczogQ3JlYXRlZCBkZXZpY2UgZm9yIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKIH0KIApAQCAtOTAsNyArOTAsNyBAQAogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBUZWFyaW5nIGRvd24gZm9yIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKLSAgICBkaXNjb25uZWN0KCk7CisgICAgZGlzY29ubmVjdEltcGwoKTsKIH0KIAogY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0RldmljZTo6Z2V0SWQoKSBjb25zdCB7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgYm9vbCBpc0xvZ2ljYWwgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlSW5mbywgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgaWYgKGlzTG9naWNhbCkgewogICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgewogICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKHBoeXNpY2FsSWQsICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKQEAgLTE4MSw3ICsxODEsMTQgQEAKICAgICAgICAgICAgIH0pOwogICAgIH0KIAotICAgIG1JbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYnVmTWdyTW9kZSA9CisgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTik7CisgICAgaWYgKGJ1Zk1nck1vZGUuY291bnQgPiAwKSB7CisgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciA9IChidWZNZ3JNb2RlLmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTl9ISURMX0RFVklDRV8zXzUpOworICAgIH0KKworICAgIG1JbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgc3RkOjpzdHJpbmcgcHJvdmlkZXJUeXBlOwogICAgIG1WZW5kb3JUYWdJZCA9IG1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQobUlkLnN0cmluZygpKTsKICAgICBtVGFnTW9uaXRvci5pbml0aWFsaXplKG1WZW5kb3JUYWdJZCk7CkBAIC0xODksNiArMTk2LDI4IEBACiAgICAgICAgIG1UYWdNb25pdG9yLnBhcnNlVGFnc1RvTW9uaXRvcihTdHJpbmc4KG1vbml0b3JUYWdzKSk7CiAgICAgfQogCisgICAgLy8gTWV0YWRhdGEgdGFncyBuZWVkcyBmaXh1cCBmb3IgbW9ub2Nocm9tZSBjYW1lcmEgZGV2aWNlIHZlcnNpb24gbGVzcworICAgIC8vIHRoYW4gMy41LgorICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbnswLDB9OworICAgIHJlcyA9IG1hbmFnZXItPmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKG1JZC5zdHJpbmcoKSwgJm1heFZlcnNpb24pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBnZXR0aW5nIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBpZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaW50IGRldmljZVZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oCisgICAgICAgICAgICBtYXhWZXJzaW9uLmdldF9tYWpvcigpLCBtYXhWZXJzaW9uLmdldF9taW5vcigpKTsKKworICAgIGJvb2wgaXNNb25vY2hyb21lID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgeworICAgICAgICAgICAgaXNNb25vY2hyb21lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MgPSAoaXNNb25vY2hyb21lICYmIGRldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNSk7CisKICAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbW1vbkxvY2tlZCgpOwogfQogCkBAIC0yMDgsNiArMjM3LDE3IEBACiAgICAgLyoqIFJlZ2lzdGVyIGluLWZsaWdodCBtYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyICovCiAgICAgbUluRmxpZ2h0U3RhdHVzSWQgPSBtU3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiAKKyAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgcmVzID0gbVJlcXVlc3RCdWZmZXJTTS5pbml0aWFsaXplKG1TdGF0dXNUcmFja2VyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBidWZmZXIgc3RhdGUgbWFjaGluZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbUludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIENyZWF0ZSBidWZmZXIgbWFuYWdlciAqLwogICAgIG1CdWZmZXJNYW5hZ2VyID0gbmV3IENhbWVyYTNCdWZmZXJNYW5hZ2VyKCk7CiAKQEAgLTIxNyw4ICsyNTcsMTAgQEAKICAgICBpZiAoc2Vzc2lvbktleXNFbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgc2Vzc2lvblBhcmFtS2V5cy5pbnNlcnRBcnJheUF0KHNlc3Npb25LZXlzRW50cnkuZGF0YS5pMzIsIDAsIHNlc3Npb25LZXlzRW50cnkuY291bnQpOwogICAgIH0KKwogICAgIC8qKiBTdGFydCB1cCByZXF1ZXN0IHF1ZXVlIHRocmVhZCAqLwotICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQodGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMpOworICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQoCisgICAgICAgICAgICB0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cywgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lcy1SZXFRdWV1ZSIsIG1JZC5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBxdWV1ZSB0aHJlYWQ6ICVzICglZCkiLApAQCAtMjcwLDExICszMTIsMTQgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgcmV0dXJuIGRpc2Nvbm5lY3RJbXBsKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmRpc2Nvbm5lY3RJbXBsKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKIApAQCAtMzQxLDYgKzM4Niw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLmNsZWFyKCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBzdExvY2sobVRyYWNrZXJMb2NrKTsKICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKICAgICAgICAgaW50ZXJmYWNlID0gbUludGVyZmFjZS5nZXQoKTsKICAgICB9CkBAIC05MTMsNiArOTU5LDIyMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdFN0YXR1czsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJldDsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OlN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jayk7CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBidWZSZXRzOworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZW1lbnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IHN0cmVhbUlkczsKKyAgICBzc2l6ZV90IHN6ID0gc3RyZWFtSWRzLnNldENhcGFjaXR5KGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICBpZiAoc3ogPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4oc3opICE9IGJ1ZlJlcXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJXp1IGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGlmIChidWZSZXFzLnNpemUoKSA+IG1PdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHRvbyBtYW55IGJ1ZmZlciByZXF1ZXN0cyAoJXp1ID4gIyBvZiBvdXRwdXQgc3RyZWFtcyAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpLCBtT3V0cHV0U3RyZWFtcy5zaXplKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgcmVwZWF0ZWQgc3RyZWFtSWQKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZlJlcSA6IGJ1ZlJlcXMpIHsKKyAgICAgICAgaWYgKHN0cmVhbUlkcy5pbmRleE9mKGJ1ZlJlcS5zdHJlYW1JZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiBidWZmZXIgcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtSWRzLmFkZChidWZSZXEuc3RyZWFtSWQpOworICAgIH0KKworICAgIGlmICghbVJlcXVlc3RCdWZmZXJTTS5zdGFydFJlcXVlc3RCdWZmZXIoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgYnVmZmVyIGRpc2FsbG93ZWQgd2hpbGUgY2FtZXJhIHNlcnZpY2UgaXMgY29uZmlndXJpbmciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9DT05GSUdVUklORywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGJ1ZlJldHMucmVzaXplKGJ1ZlJlcXMuc2l6ZSgpKTsKKworICAgIGJvb2wgYWxsUmVxc1N1Y2NlZWRzID0gdHJ1ZTsKKyAgICBib29sIG9uZVJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZSZXFzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIGJ1ZlJlcSA9IGJ1ZlJlcXNbaV07CisgICAgICAgIGF1dG8mIGJ1ZlJldCA9IGJ1ZlJldHNbaV07CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBidWZSZXEuc3RyZWFtSWQ7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGVtcHR5QnVmUmV0czsKKyAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgZW1wdHlCdWZSZXRzKTsKKyAgICAgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00uZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgICAgIH0KKworICAgICAgICBidWZSZXQuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gb3V0cHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgaWYgKHRvdGFsSGFuZG91dCA+IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIE5vdCBhYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBidWZmZXIuIEV4aXQgZWFybHkgZm9yIHRoaXMgc3RyZWFtCisgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6TUFYX0JVRkZFUl9FWENFRURFRCk7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlcj4gdG1wUmV0QnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgYm9vbCBjdXJyZW50UmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgc2l6ZV90IG51bUFsbG9jYXRlZEJ1ZmZlcnMgPSAwOworICAgICAgICBzaXplX3QgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1CdWZmZXJzUmVxdWVzdGVkOyBiKyspIHsKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlcXVlc3QgdGhyZWFkCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgd2FpdCBkdXJhdGlvbiBldmVyeXRpbWUgd2UgY2FsbCBnZXRidWZmZXIKKyAgICAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0ga0Jhc2VHZXRCdWZmZXJXYWl0ICsgZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmc2IsIHdhaXREdXJhdGlvbik7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IFRJTUVEX09VVCB8fCByZXMgPT0gTk9fTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpOT19CVUZGRVJfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtQWxsb2NhdGVkQnVmZmVycysrOworCisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IHNiLmJ1ZmZlcjsKKyAgICAgICAgICAgIGF1dG8gcGFpciA9IG1JbnRlcmZhY2UtPmdldEJ1ZmZlcklkKCpidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisKKyAgICAgICAgICAgIGhCdWYuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/ICpidWZmZXIgOiBudWxscHRyOworICAgICAgICAgICAgaEJ1Zi5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOworICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc2IuYWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc2IuYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhCdWYuYWNxdWlyZUZlbmNlLnNldFRvKGFjcXVpcmVGZW5jZSwgLypzaG91bGRPd24qL3RydWUpOworICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IHJlZ2lzdGVyIHJlcXVlc3QgYnVmZmVycyBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycysrOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyZW50UmVxU3VjY2VlZHMpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuYnVmZmVycyhzdGQ6Om1vdmUodG1wUmV0QnVmZmVycykpOworICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQnVmZmVyJiBoQnVmID0gdG1wUmV0QnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoaEJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCIlczogcG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyIGZhaWxlZCBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAgICAgc2IuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIHNiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoc3RyZWFtQnVmZmVycy5kYXRhKCksIG51bUFsbG9jYXRlZEJ1ZmZlcnMsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgX2hpZGxfY2IoYWxsUmVxc1N1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6T0sgOgorICAgICAgICAgICAgb25lUmVxU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfUEFSVElBTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9VTktOT1dOLAorICAgICAgICAgICAgYnVmUmV0cyk7CisgICAgbVJlcXVlc3RCdWZmZXJTTS5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgeworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXMgZG9lcyBub3Qgc3VwcG9ydCBIQUwgYnVmZmVyIG1hbmFnZXJtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgYnVmIDogYnVmZmVycykgeworICAgICAgICBpZiAoYnVmLmJ1ZmZlcklkID09IEhhbEludGVyZmFjZTo6QlVGRkVSX0lEX05PX0JVRkZFUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgYnVmZmVyIHdpdGhvdXQgYnVmZmVySWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1Zi5idWZmZXJJZCwgJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgYnVmZmVyICUiIFBSSXU2NCAiIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5idWZmZXJJZCwgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOworICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOworICAgICAgICBzdHJlYW1CdWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBzdHJlYW1CdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworCisgICAgICAgIGlmIChidWYucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmLnJlbGVhc2VGZW5jZS0+bnVtRmRzID09IDEpIHsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gZHVwKGJ1Zi5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLnJlbGVhc2VGZW5jZS0+bnVtRmRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKCZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwKTsKKyAgICB9CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewpAQCAtMTA2MSwyNyArMTMyMiw1MSBAQAogICAgICAgICBhdXRvJiBiRHN0ID0gb3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgY29uc3QgU3RyZWFtQnVmZmVyICZiU3JjID0gcmVzdWx0Lm91dHB1dEJ1ZmZlcnNbaV07CiAKLSAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGJTcmMuc3RyZWFtSWQpOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBJbnZhbGlkIG91dHB1dCBzdHJlYW0gaWQgJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgYkRzdC5zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgIGJEc3Quc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyOwotICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIGJTcmMuc3RyZWFtSWQsICZidWZmZXIpOworICAgICAgICBib29sIG5vQnVmZmVyUmV0dXJuZWQgPSBmYWxzZTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgc3VzcGljaW91cyBtb3N0IG9mIHRoZSB0aW1lIGJ1dCBjYW4gYmUgY29ycmVjdCBkdXJpbmcgZmx1c2ggd2hlcmUgSEFMCisgICAgICAgICAgICAvLyBoYXMgdG8gcmV0dXJuIGNhcHR1cmUgcmVzdWx0IGJlZm9yZSBhIGJ1ZmZlciBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIChiU3JjLmJ1ZmZlcklkID09IEhhbEludGVyZmFjZTo6QlVGRkVSX0lEX05PX0JVRkZFUikgeworICAgICAgICAgICAgICAgIGlmIChiU3JjLnN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGJ1ZmZlcklkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RpbGwgcHJvY2VlZHMgc28gb3RoZXIgYnVmZmVycyBjYW4gYmUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9CdWZmZXJSZXR1cm5lZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYlNyYy5idWZmZXJJZCwgJmJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodEJ1ZmZlcihyZXN1bHQuZnJhbWVOdW1iZXIsIGJTcmMuc3RyZWFtSWQsICZidWZmZXIpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gaW4tZmxpZ2h0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKICAgICAgICAgYkRzdC5idWZmZXIgPSBidWZmZXI7CiAgICAgICAgIGJEc3Quc3RhdHVzID0gbWFwSGlkbEJ1ZmZlclN0YXR1cyhiU3JjLnN0YXR1cyk7CiAgICAgICAgIGJEc3QuYWNxdWlyZV9mZW5jZSA9IC0xOwogICAgICAgICBpZiAoYlNyYy5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gLTE7CiAgICAgICAgIH0gZWxzZSBpZiAoYlNyYy5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7CisgICAgICAgICAgICBpZiAobm9CdWZmZXJSZXR1cm5lZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZ290IHJlbGVhc2VGZW5jZSB3aXRob3V0IG91dHB1dCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IGR1cChiU3JjLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIHJlbGVhc2UgZmVuY2UgZm9yIGJ1ZmZlciAlenUsIGZkIGNvdW50IGlzICVkLCBub3QgMSIsCkBAIC0xMTU3LDEzICsxNDQyLDEzIEBACiAgICAgICAgICAgICBtLnR5cGUgPSBDQU1FUkEzX01TR19FUlJPUjsKICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLmVycm9yLmZyYW1lTnVtYmVyOwogICAgICAgICAgICAgaWYgKG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBJbnZhbGlkIGVycm9yIHN0cmVhbSBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG51bGxwdHI7CiAgICAgICAgICAgICB9CkBAIC0xMzQ0LDYgKzE2MjksNTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6YWRkKAorICAgICAgICBpbnQgc3RyZWFtSWQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSkgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBhZGQgbnVsbCBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmFkZChzdHJlYW1JZCwgc3RyZWFtKTsKK30KKworc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OnJlbW92ZShpbnQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLnJlbW92ZUl0ZW0oc3RyZWFtSWQpOworfQorCitzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPgorQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpnZXQoaW50IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHNzaXplX3QgaWR4ID0gbURhdGEuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1EYXRhLmVkaXRWYWx1ZUF0KGlkeCk7Cit9CisKK3NwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+CitDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6Om9wZXJhdG9yW10gKHNpemVfdCBpbmRleCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuZWRpdFZhbHVlQXQoaW5kZXgpOworfQorCitzaXplX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpzaXplKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuc2l6ZSgpOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Y2xlYXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5jbGVhcigpOworfQorCitzdGQ6OnZlY3RvcjxpbnQ+IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Z2V0U3RyZWFtSWRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN0cmVhbUlkcyhtRGF0YS5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RyZWFtSWRzW2ldID0gbURhdGEua2V5QXQoaSk7CisgICAgfQorICAgIHJldHVybiBzdHJlYW1JZHM7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCkBAIC0xNDUwLDcgKzE3ODUsOCBAQAogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNTI3LDIwICsxODYzLDIwIEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgaWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbUluZm8tPndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7Ci0gICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOwotICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKLSAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7Ci0gICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPndpZHRoICA9IHN0cmVhbS0+Z2V0V2lkdGgoKTsKKyAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBzdHJlYW0tPmdldEhlaWdodCgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IHN0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gc3RyZWFtLT5nZXREYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE1NjcsMTQgKzE5MDMsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsCi0gICAgICAgICAgICAgICAgaWQpOworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCktPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHJldHVybiBzdHJlYW0tPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkZWxldGVTdHJlYW0oaW50IGlkKSB7CkBAIC0xNTk5LDIxICsxOTMzLDIxIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCi0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLSAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBzdHJlYW07CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CiAgICAgfQogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KQEAgLTE2OTYsNyArMjAzMCw3IEBACiAKICAgICBpZiAodGVtcGxhdGVJZCA8PSAwIHx8IHRlbXBsYXRlSWQgPj0gQ0FNRVJBM19URU1QTEFURV9DT1VOVCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjg2NjExMCIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTE4NTAsNiArMjE4NCwxNSBAQAogCiAgICAgbVN0YXR1c1dhaXRlcnMrKzsKIAorICAgIC8vIE5vdGlmeSBIQUwgdG8gc3RhcnQgZHJhaW5pbmcuIFdlIG5lZWQgdG8gbm90aWZ5IHRoZSBIYWxJbnRlcmZhY2UgbGF5ZXIKKyAgICAvLyBldmVuIHdoZW4gdGhlIGRldmljZSBpcyBhbHJlYWR5IElETEUsIHNvIEhhbEludGVyZmFjZSBjYW4gcmVqZWN0IGluY29taW5nCisgICAgLy8gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbC4KKyAgICBpZiAoIWFjdGl2ZSAmJiBtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBhdXRvIHN0cmVhbUlkcyA9IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpOworICAgICAgICBtUmVxdWVzdFRocmVhZC0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uV2FpdFVudGlsSWRsZSgpOworICAgIH0KKwogICAgIGJvb2wgc3RhdGVTZWVuID0gZmFsc2U7CiAgICAgZG8gewogICAgICAgICBpZiAoYWN0aXZlID09IChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpKSB7CkBAIC0yMDA5LDYgKzIzNTIsMTMgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgICAgIC8vIGIvMTE2NTE0MTA2ICJkaXNjb25uZWN0KCkiIGNhbiBnZXQgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBkZXZpY2UuIFRoZQorICAgICAgICAvLyBjYW1lcmEgZGV2aWNlIHdpbGwgbm90IGJlIGluaXRpYWxpemVkIGR1cmluZyB0aGUgc2Vjb25kIHJ1bi4KKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcigvKm91dCovZnJhbWVOdW1iZXIpOwogICAgIH0KIApAQCAtMjAyNSwxNSArMjM3NSwxMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLQogICAgIGlmIChzdHJlYW0tPmlzVW5wcmVwYXJhYmxlKCkgfHwgc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSApIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBoYXMgYWxyZWFkeSBiZWVuIGEgcmVxdWVzdCB0YXJnZXQiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMDUzLDE1ICsyNDAwLDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotCiAgICAgaWYgKHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgfHwgbVJlcXVlc3RUaHJlYWQtPmlzU3RyZWFtUGVuZGluZyhzdHJlYW0pKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgYSB0YXJnZXQgb2YgYSBpbi1wcm9ncmVzcyByZXF1ZXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjA3NywxNCArMjQyMSwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKICAgICBzdHJlYW0tPmFkZEJ1ZmZlckxpc3RlbmVyKGxpc3RlbmVyKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTIxNDMsMTIgKzI0ODQsMTEgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBzdHJlYW1JZCk7Ci0gICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2lkeF07CiAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT5zZXRDb25zdW1lcnMoY29uc3VtZXJzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgc2V0IGNvbnN1bWVyIGZhaWxlZCAoZXJyb3IgJWQgJXMpICIsIHN0cmVhbUlkLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKQEAgLTIxOTMsMTAgKzI1MzMsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogcmVtb3ZlZFN1cmZhY2VJZHMpIHsKQEAgLTIyMDYsNyArMjU0Niw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpZHhdOwogICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+dXBkYXRlU3RyZWFtKG5ld1N1cmZhY2VzLCBvdXRwdXRJbmZvLCByZW1vdmVkU3VyZmFjZUlkcywgb3V0cHV0TWFwKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZmFpbGVkIHRvIHVwZGF0ZSBzdHJlYW0gKGVycm9yICVkICVzKSAiLApAQCAtMjIyNSwxMyArMjU2NCwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgaW50IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBpcyBub3QgZm91bmQuIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKICAgICByZXR1cm4gc3RyZWFtLT5kcm9wQnVmZmVycyhkcm9wcGluZyk7CiB9CiAKQEAgLTIyODUsMTUgKzI2MjIsMTIgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbXMuY291bnQ7IGkrKykgewotICAgICAgICBpbnQgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1zLmRhdGEuaTMyW2ldKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtcy5kYXRhLmkzMltpXSk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3QgcmVmZXJlbmNlcyB1bmtub3duIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbXMuZGF0YS51OFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbXMuZGF0YS5pMzJbaV0pOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KLSAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOwotCiAgICAgICAgIC8vIEl0IGlzIGlsbGVnYWwgdG8gaW5jbHVkZSBhIGRlZmVycmVkIGNvbnN1bWVyIG91dHB1dCBzdHJlYW0gaW50byBhIHJlcXVlc3QKICAgICAgICAgYXV0byBpdGVyID0gc3VyZmFjZU1hcC5maW5kKHN0cmVhbXMuZGF0YS5pMzJbaV0pOwogICAgICAgICBpZiAoaXRlciAhPSBzdXJmYWNlTWFwLmVuZCgpKSB7CkBAIC0yMzA1LDcgKzI2MzksNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbaV0gPSBzdXJmYWNlczsKKyAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1zLmRhdGEuaTMyW2ldXSA9IHN1cmZhY2VzOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTGF6eSBjb21wbGV0aW9uIG9mIHN0cmVhbSBjb25maWd1cmF0aW9uIChhbGxvY2F0aW9uL3JlZ2lzdHJhdGlvbikKQEAgLTIzNTQsNyArMjY4OCw3IEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgewogICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNDg5LDcgKzI4MjMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqb3V0cHV0U3RyZWFtOwotICAgICAgICBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+c3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBDTE9HRSgiQ2FuJ3Qgc3RhcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgICBjYW5jZWxTdHJlYW1zQ29uZmlndXJhdGlvbkxvY2tlZCgpOwpAQCAtMjU0Nyw4ICsyODgxLDcgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSAmJiAhb3V0cHV0U3RyZWFtLT5pc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKCkpIHsKICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+ZmluaXNoQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjYxMSw2ICsyOTQ0LDEwIEBACiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25TdHJlYW1zQ29uZmlndXJlZCgpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjY1NSwxNSArMjk5MiwxMiBAQAogICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAogICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1EdW1teVN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtRHVtbXlTdHJlYW1JZCk7CisgICAgaWYgKGRlbGV0ZWRTdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBTRVRfRVJSX0woIkR1bW15IHN0cmVhbSAlZCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QiLCBtRHVtbXlTdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KLSAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLSAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtc0F0KG91dHB1dFN0cmVhbUlkeCk7CisgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlKG1EdW1teVN0cmVhbUlkKTsKIAogICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCiAgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOwpAQCAtMjczNywxOCArMzA3MSwyMSBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLAotICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogCiAgICAgc3NpemVfdCByZXM7CiAgICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KG51bUJ1ZmZlcnMsIHJlc3VsdEV4dHJhcywgaGFzSW5wdXQsCi0gICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMpKTsKKyAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIC8vIGhvbGQgbUxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIC8vIEhvbGQgYSBzZXBhcmF0ZSBkZWRpY2F0ZWQgdHJhY2tlciBsb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QgYW5kIGFsc28KKyAgICAgICAgLy8gYXZvaWQgYSBkZWFkbG9jayBkdXJpbmcgcmVwcm9jZXNzIHJlcXVlc3RzLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtVHJhY2tlckxvY2spOwogICAgICAgICBpZiAobVN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobUluRmxpZ2h0U3RhdHVzSWQpOwogICAgICAgICB9CkBAIC0yNzYwLDE3ICszMDk3LDY1IEBACiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6cmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsIHNpemVfdCBudW1CdWZmZXJzLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmaW5SZXN1bHRFeHRyYXMpIHsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKQogICAgIHsKLSAgICAgICAgQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChvdXRwdXRCdWZmZXJzW2ldLnN0cmVhbSk7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCk7CisgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzW2ldLmJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gV2l0aCBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgQVBJLCBIQUwgc29tZXRpbWVzIHdpbGwgaGF2ZSB0byByZXR1cm4gYnVmZmVycyB0aGF0CisgICAgICAgICAgICAgICAgLy8gaGFzIG5vdCBnb3QgYSBvdXRwdXQgYnVmZmVyIGhhbmRsZSBmaWxsZWQgeWV0LiBUaGlzIGlzIHRob3VnaCBpbGxlZ2FsIGlmIEhBTAorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBtYW5hZ2VtZW50IEFQSSBpcyBub3QgYmVpbmcgdXNlZC4KKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBudWxsIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlICpzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KG91dHB1dEJ1ZmZlcnNbaV0uc3RyZWFtKTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOworICAgICAgICBjb25zdCBhdXRvJiBpdCA9IG91dHB1dFN1cmZhY2VzLmZpbmQoc3RyZWFtSWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaWYgKGl0ICE9IG91dHB1dFN1cmZhY2VzLmVuZCgpKSB7CisgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBpdC0+c2Vjb25kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcpOworICAgICAgICB9CisKICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKICAgICAgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIExvbmcgcHJvY2Vzc2luZyBjb25zdW1lcnMgY2FuIGNhdXNlIHJldHVybkJ1ZmZlciB0aW1lb3V0IGZvciBzaGFyZWQgc3RyZWFtCisgICAgICAgIC8vIElmIHRoYXQgaGFwcGVucywgY2FuY2VsIHRoZSBidWZmZXIgYW5kIHNlbmQgYSBidWZmZXIgZXJyb3IgdG8gY2xpZW50CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSAmJiByZXMgPT0gVElNRURfT1VUICYmCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyc1tpXS5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKSB7CisgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc2IgPSBvdXRwdXRCdWZmZXJzW2ldOworICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLCB0aW1lc3RhbXBJbmNyZWFzaW5nKTsKKworICAgICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBidWZmZXIgZXJyb3IKKyAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzID0gaW5SZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTI3ODEsOCArMzE2NiwxMCBAQAogCiAgICAgLy8gSW5kaWNhdGUgaWRsZSBpbkZsaWdodE1hcCB0byB0aGUgc3RhdHVzIHRyYWNrZXIKICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIC8vIGhvbGQgbUxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25JbmZsaWdodE1hcEVtcHR5KCk7CisgICAgICAgIC8vIEhvbGQgYSBzZXBhcmF0ZSBkZWRpY2F0ZWQgdHJhY2tlciBsb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QgYW5kIGFsc28KKyAgICAgICAgLy8gYXZvaWQgYSBkZWFkbG9jayBkdXJpbmcgcmVwcm9jZXNzIHJlcXVlc3RzLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtVHJhY2tlckxvY2spOwogICAgICAgICBpZiAobVN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1JbkZsaWdodFN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICB9CkBAIC0yODA3LDYgKzMxOTQsMTAgQEAKICAgICBpZiAocmVxdWVzdC5udW1CdWZmZXJzTGVmdCA9PSAwICYmCiAgICAgICAgICAgICAocmVxdWVzdC5za2lwUmVzdWx0TWV0YWRhdGEgfHwKICAgICAgICAgICAgIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiBzaHV0dGVyVGltZXN0YW1wICE9IDApKSkgeworICAgICAgICBpZiAocmVxdWVzdC5zdGlsbENhcHR1cmUpIHsKKyAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoInN0aWxsIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CisgICAgICAgIH0KKwogICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHNlbnNvciB0aW1lc3RhbXAgbWF0Y2hlcyBzaHV0dGVyIHRpbWVzdGFtcCBpbiB0aGUKQEAgLTI4MjMsNyArMzIxNCw4IEBACiAgICAgICAgIGFzc2VydChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgIT0gT0sgfHwKICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpID09IDApOwogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwKTsKKyAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCisgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAKICAgICAgICAgcmVtb3ZlSW5GbGlnaHRNYXBFbnRyeUxvY2tlZChpZHgpOwogICAgICAgICBBTE9HVlYoIiVzOiByZW1vdmVkIGZyYW1lICVkIGZyb20gSW5GbGlnaHRNYXAiLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKQEAgLTI4NDcsNyArMzIzOSw5IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IG1JbkZsaWdodE1hcC5zaXplKCk7IGlkeCsrKSB7CiAgICAgICAgICAgICBjb25zdCBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDApOworICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLAorICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgIH0KICAgICAgICAgbUluRmxpZ2h0TWFwLmNsZWFyKCk7CiAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwpAQCAtMjkyMiwxMiArMzMxNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOwogICAgICAgICB9CiAgICAgfQpAQCAtMjk3NSw2ICszMzY5LDEzIEBACiAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwogICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gcGFydGlhbFJlc3VsdDsKIAorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGluc2VydFJlc3VsdExvY2tlZCgmY2FwdHVyZVJlc3VsdCwgZnJhbWVOdW1iZXIpOwogfQogCkBAIC0zMDQ2LDYgKzM0NDcsMjEgQEAKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZXJyb3IocmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobVBoeXNpY2FsRGV2aWNlSW5mb01hcC5hdChjYW1lcmFJZDguY19zdHIoKSksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1UYWdNb25pdG9yLm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVNVTFQsCiAgICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLmRhdGEuaTY0WzBdLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CkBAIC0zMjAzLDggKzM2MTksMTAgQEAKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXBwZW5kQXJyYXkocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKICAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycyk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHJlcXVlc3QuenNsQ2FwdHVyZSB8fCByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKLSAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewpAQCAtMzIxNyw3ICszNjM1LDcgQEAKICAgICAgICAgICAgIGlmIChzaHV0dGVyVGltZXN0YW1wID09IDApIHsKICAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdNZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdCA9IGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChtZXRhZGF0YSwgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCkBAIC0zMzM3LDYgKzM3NTUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtaXNzaW5nIHJlc3VsdCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZC4gSWYgdGhleSByZXR1cm5lZCwgdGhlbiByZW1vdmUgaW5mbGlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2FsbCB0aGlzIGZvciBFUlJPUl9DQU1FUkFfUkVRVUVTVCBhcyB3ZWxsPworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgb3RoZXJ3aXNlIHdlIGFyZSBkZXBlbmRpbmcgb24gSEFMIHRvIHNlbmQgdGhlIGJ1ZmZlcnMgYmFjayBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgY2FsbGluZyBub3RpZnlFcnJvci4gTm90IHN1cmUgaWYgdGhhdCdzIGluIHRoZSBzcGVjLgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM0MTAsOCArMzgzMSwxMCBAQAogICAgICAgICAgICAgICAgICAgICByLmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIG1zZy5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIHIuaGFzSW5wdXRCdWZmZXIsIHIucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyLnpzbENhcHR1cmUgfHwgci5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgci5vdXRwdXRTdXJmYWNlcywgci5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5jbGVhcigpOwogCiAgICAgICAgICAgICByZW1vdmVJbkZsaWdodFJlcXVlc3RJZlJlYWR5TG9ja2VkKGlkeCk7CkBAIC0zNDQ3LDExICszODcwLDE3IEBACiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgLy8gQ2hlY2sgd2l0aCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaWYgd2UgY2FuIGRvd25jYXN0IHRoZXNlIGludGVyZmFjZXMKICAgICAvLyBTb21ld2hhdCBleHBlbnNpdmUsIHNvIGNhY2hlIHRoZSByZXN1bHRzIGF0IHN0YXJ0dXAKKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICB9CiAgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CiAgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgewogICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CkBAIC0zNDYyLDE3ICszODkxLDE5IEBACiAgICAgfQogfQogCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIHt9CitDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIDogbVVzZUhhbEJ1Zk1hbmFnZXIoZmFsc2UpIHt9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSYgb3RoZXIpIDoKICAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpIHt9CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvdGhlci5tVXNlSGFsQnVmTWFuYWdlcikge30KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnZhbGlkKCkgewogICAgIHJldHVybiAobUhpZGxTZXNzaW9uICE9IG51bGxwdHIpOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y2xlYXIoKSB7CisgICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CkBAIC0zNjI4LDI2ICs0MDU5LDQ5IEBACiAKICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwogICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247CisgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CiAKLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My40IG9yIHYzLjMgSEFMCi0gICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewotICAgICAgICAvLyBXZSBkbzsgdXNlIHYzLjQgZm9yIHRoZSBjYWxsCi0gICAgICAgIEFMT0dWKCIlczogdjMuNCBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwotICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzQtPmNvbmZpZ3VyZVN0cmVhbXNfM180KHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQsCi0gICAgICAgICAgICBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICBhdXRvIGNvbmZpZ1N0cmVhbTM0Q2IgPSBbJnN0YXR1cywgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24mIGhhbENvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24zXzQgPSBoYWxDb25maWd1cmF0aW9uOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9OworCisgICAgYXV0byBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM0ID0gWyZmaW5hbENvbmZpZ3VyYXRpb24sICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCisgICAgICAgICAgICAoaGFyZHdhcmU6OlJldHVybjx2b2lkPiYgZXJyKSAtPiBzdGF0dXNfdCB7CisgICAgICAgICAgICAgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldID0gZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV0udjNfMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfTsKKworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNSBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZXZpY2U6OlYzXzU6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNTsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS52M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNS5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+Y29uZmlndXJlU3RyZWFtc18zXzUoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNSwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQoCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwgY29uZmlnU3RyZWFtMzRDYik7CisgICAgICAgIHJlcyA9IHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQoZXJyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUhpZGxTZXNzaW9uXzNfMyAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuMyBmb3IgdGhlIGNhbGwKQEAgLTM3NTksMTQgKzQyMTMsMTQgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6d3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCwKICAgICAgICAgLypvdXQqL2RldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0LAogICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoY2FwdHVyZVJlcXVlc3QgPT0gbnVsbHB0ciB8fCBoYW5kbGVzQ3JlYXRlZCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogY2FwdHVyZVJlcXVlc3QgKCVwKSBhbmQgaGFuZGxlc0NyZWF0ZWQgKCVwKSBtdXN0IG5vdCBiZSBudWxsIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhcHR1cmVSZXF1ZXN0LCBoYW5kbGVzQ3JlYXRlZCk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CkBAIC0zODA3LDI2ICs0MjYxLDM3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOwogICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKLSAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwotICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKLSAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwogICAgICAgICAgICAgZHN0LnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CiAKICAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAogICAgICAgICAgICAgICAgICAgICBzcmMtPmJ1ZmZlciwgc3JjLT5hY3F1aXJlX2ZlbmNlKTsKICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKApAQCAtMzg1MCwxMiArNDMxNSwxNyBAQAogICAgIH0KICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKIAorICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCiAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzkzNywxOCArNDQwNywxNyBAQAogICAgIH0KIAogICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKKyAgICBhdXRvIHJlc3VsdENhbGxiYWNrID0KKyAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CisgICAgICAgIH07CiAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CiAgICAgICAgIGVyciA9IGhpZGxTZXNzaW9uXzNfNC0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0XzNfNChjYXB0dXJlUmVxdWVzdHNfM180LCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKICAgICB9CiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTQwMTksNiArNDQ4OCwyMCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnNpZ25hbFBpcGVsaW5lRHJhaW4iKTsKKyAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+c2lnbmFsU3RyZWFtRmx1c2goc3RyZWFtSWRzLCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIpOworICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpnZXRJbmZsaWdodEJ1ZmZlcktleXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbmZsaWdodExvY2spOwpAQCAtNDA1OSw2ICs0NTQyLDMzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBwYWlyID0gbVJlcXVlc3RlZEJ1ZmZlcnMuaW5zZXJ0KHtidWZmZXJJZCwgYnVmfSk7CisgICAgaWYgKCFwYWlyLnNlY29uZCkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIGFscmVhZHkgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBGaW5kIGFuZCBwb3AgYSBidWZmZXJfaGFuZGxlX3QgYmFzZWQgb24gYnVmZmVySWQKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICB1aW50NjRfdCBidWZmZXJJZCwgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIGF1dG8gaXQgPSBtUmVxdWVzdGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBpZiAoaXQgPT0gbVJlcXVlc3RlZEJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZJZCAlIiBQUkl1NjQgIiBpcyBub3QgaW5mbGlnaHQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKmJ1ZmZlciA9IGl0LT5zZWNvbmQ7CisgICAgbVJlcXVlc3RlZEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIHJldHVybiBPSzsKK30KKwogc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEJ1ZmZlcklkKAogICAgICAgICBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7CkBAIC00MTA3LDcgKzQ2MTcsOCBAQAogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cykgOgorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTQxMTcsNiArNDYyOCw3IEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQoZmFsc2UpLAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluKGZhbHNlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKQEAgLTQxMjcsNyArNDYzOSw4IEBACiAgICAgICAgIG1Db25zdHJhaW5lZE1vZGUoZmFsc2UpLAogICAgICAgICBtUmVxdWVzdExhdGVuY3koa1JlcXVlc3RMYXRlbmN5QmluU2l6ZSksCiAgICAgICAgIG1TZXNzaW9uUGFyYW1LZXlzKHNlc3Npb25QYXJhbUtleXMpLAotICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSkgeworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtNDc0Miw2ICs1MjU1LDEzIEBACiAgICAgbnNlY3NfdCB0UmVxdWVzdEVuZCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKICAgICBtUmVxdWVzdExhdGVuY3kuYWRkKHRSZXF1ZXN0U3RhcnQsIHRSZXF1ZXN0RW5kKTsKIAorICAgIGlmIChzdWJtaXRSZXF1ZXN0U3VjY2VzcykgeworICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0U3VibWl0dGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAodXNlRmx1c2hMb2NrKSB7CiAgICAgICAgIG1GbHVzaExvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtNDc1OCw2ICs1Mjc4LDcgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnByZXBhcmVIYWxSZXF1ZXN0cygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCisgICAgYm9vbCBiYXRjaGVkUmVxdWVzdCA9IG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1CYXRjaFNpemUgPiAxOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5leHRSZXF1ZXN0cy5zaXplKCk7IGkrKykgewogICAgICAgICBhdXRvJiBuZXh0UmVxdWVzdCA9IG1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0ID0gbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3Q7CkBAIC00NzgxLDcgKzUzMDIsMTAgQEAKICAgICAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAogICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyB0aGUgc2FtZSBhcyBsYXN0LCBvciB3ZSBoYWQgdHJpZ2dlcnMgbGFzdCB0aW1lCi0gICAgICAgIGJvb2wgbmV3UmVxdWVzdCA9IG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW47CisgICAgICAgIGJvb2wgbmV3UmVxdWVzdCA9IChtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluKSAmJgorICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgc2V0dGluZ3MgYXJlIGFsbCB0aGUgc2FtZSB3aXRoaW4gb25lIGJhdGNoLCBzbyBvbmx5IHRyZWF0IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgaW4gYSBiYXRjaCBhcyBuZXcKKyAgICAgICAgICAgICAgICAhKGJhdGNoZWRSZXF1ZXN0ICYmIGkgPiAwKTsKICAgICAgICAgaWYgKG5ld1JlcXVlc3QpIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSEFMIHdvcmthcm91bmQ6CkBAIC00ODgyLDggKzU0MDYsMTEgQEAKICAgICAgICAgfQogICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIHBhcmVudC0+Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAKKyAgICAgICAgU3VyZmFjZU1hcCB1bmlxdWVTdXJmYWNlSWRNYXA7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gb3V0cHV0U3RyZWFtLT5nZXRJZCgpOwogCiAgICAgICAgICAgICAvLyBQcmVwYXJlIHZpZGVvIGJ1ZmZlcnMgZm9yIGhpZ2ggc3BlZWQgcmVjb3JkaW5nIG9uIHRoZSBmaXJzdCB2aWRlbyByZXF1ZXN0LgogICAgICAgICAgICAgaWYgKG1QcmVwYXJlVmlkZW9TdHJlYW0gJiYgb3V0cHV0U3RyZWFtLT5pc1ZpZGVvU3RyZWFtKCkpIHsKQEAgLTQ5MDIsMTcgKzU0MjksNDUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAotICAgICAgICAgICAgICAgICAgICB3YWl0RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbal0pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCi0gICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAotICAgICAgICAgICAgICAgIC8vIGVycm9yCi0gICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiB1bmlxdWVTdXJmYWNlSWRzOworICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbUlkXSwKKyAgICAgICAgICAgICAgICAgICAgJnVuaXF1ZVN1cmZhY2VJZHMpOworICAgICAgICAgICAgLy8gSU5WQUxJRF9PUEVSQVRJT04gaXMgbm9ybWFsIG91dHB1dCBmb3Igc3RyZWFtcyBub3Qgc3VwcG9ydGluZyBzdXJmYWNlSWRzCisgICAgICAgICAgICBpZiAocmVzICE9IE9LICYmIHJlcyAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHF1ZXJ5IHN0cmVhbSAlZCB1bmlxdWUgc3VyZmFjZSBJRHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB1bmlxdWVTdXJmYWNlSWRNYXAuaW5zZXJ0KHtzdHJlYW1JZCwgc3RkOjptb3ZlKHVuaXF1ZVN1cmZhY2VJZHMpfSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCBpcyBhYmFuZG9uZWQuIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEhBTCB3aWxsIHJlcXVlc3QgYnVmZmVyIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgYnVmZmVyID0gb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RyZWFtID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0s7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CkBAIC00OTM0LDE1ICs1NDg5LDMyIEBACiAgICAgICAgIC8vIHByZXZpZXcpLCBhbmQgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBub3QgdGhlIGxhc3Qgb25lIGluIHRoZSBiYXRjaCwKICAgICAgICAgLy8gZG8gbm90IHNlbmQgY2FsbGJhY2sgdG8gdGhlIGFwcC4KICAgICAgICAgYm9vbCBoYXNDYWxsYmFjayA9IHRydWU7Ci0gICAgICAgIGlmIChtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMSAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKKyAgICAgICAgaWYgKGJhdGNoZWRSZXF1ZXN0ICYmIGkgIT0gbU5leHRSZXF1ZXN0cy5zaXplKCktMSkgewogICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGlmICghbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGUgPSBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCgpOworICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSkpIHsKKyAgICAgICAgICAgICAgICBpc1N0aWxsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJzdGlsbCBjYXB0dXJlIiwgbU5leHRSZXF1ZXN0c1tpXS5oYWxSZXF1ZXN0LmZyYW1lX251bWJlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTF9UUlVFKSkgeworICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oaGFsUmVxdWVzdC0+c2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIChtVXNlSGFsQnVmTWFuYWdlcikgPyB1bmlxdWVTdXJmYWNlSWRNYXAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlTWFwe30pOwogICAgICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTUwMTgsNyArNTU5MCw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTAyOSw3ICs1NjAxLDcgQEAKICAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDM4LDYgKzU2MTAsMjIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgZm9yIGNhbWVyYSBkZXZpY2Ugbm90IHN1cHBvcnRpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBwbChtUGF1c2VMb2NrKTsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgcmVxdWVzdCB0aHJlYWQgaXMgc3RpbGwgYnVzeSwgd2FpdCB1bnRpbCBwYXVzZWQgdGhlbiBub3RpZnkgSEFMCisgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSB0cnVlOworICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZCA9IHN0cmVhbUlkczsKK30KKwogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CkBAIC01MjE1LDYgKzU4MDMsMTUgQEAKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gU3RvcCB3YWl0aW5nIGZvciBub3cgYW5kIGxldCB0aHJlYWQgbWFuYWdlbWVudCBoYXBwZW4KICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTI5OSw2ICs1ODk2LDE1IEBACiAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IG1Eb1BhdXNlU2lnbmFsLndhaXRSZWxhdGl2ZShtUGF1c2VMb2NrLCBrUmVxdWVzdFRpbWVvdXQpOwpAQCAtNTc1NCwyMyArNjM2MCwxNzIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLyoqCi0gKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gKi8KK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmluaXRpYWxpemUoCisgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKKyAgICBpZiAoc3RhdHVzVHJhY2tlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RhdHVzVHJhY2tlciBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6c1Byb2Nlc3NDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KSB7Ci0gICAgQ2FtZXJhM0RldmljZSAqZCA9Ci0gICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKLQotICAgIGQtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXNUcmFja2VyID0gc3RhdHVzVHJhY2tlcjsKKyAgICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNOb3RpZnkoY29uc3QgY2FtZXJhM19jYWxsYmFja19vcHMgKmNiLAotICAgICAgICBjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZykgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0gICAgZC0+bm90aWZ5KG1zZyk7Citib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OnN0YXJ0UmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1JFQURZIHx8IG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSB0cnVlOworICAgICAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi90cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjplbmRSZXF1ZXN0QnVmZmVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIHdpdGhvdXQgYSBzdWNjZXNzZnVsIHN0YXJ0UmVxdWVzdEJ1ZmZlciBjYWxsIGZpcnN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi9mYWxzZSk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdHJlYW1zQ29uZmlndXJlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25SZXF1ZXN0U3VibWl0dGVkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IGZhbHNlOworICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1NUT1BQRUQpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uUmVxdWVzdFRocmVhZFBhdXNlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uSW5mbGlnaHRNYXBFbXB0eSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uV2FpdFVudGlsSWRsZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUEVORElOR19TVE9QOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6bm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSkgeworICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVJlcXVlc3RCdWZmZXJTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpIHsKKyAgICBpZiAobUluZmxpZ2h0TWFwRW1wdHkgJiYgbVJlcXVlc3RUaHJlYWRQYXVzZWQgJiYgIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICghbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRhZ3MgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgaW50MzJfdCB0YWdzVG9SZW1vdmVbXSA9IHsKKyAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsCisgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgfTsKKyAgICBmb3IgKGF1dG8gdGFnIDogdGFnc1RvUmVtb3ZlKSB7CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLmVyYXNlKHRhZyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlbW92ZSB0YWcgJWQgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTCk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBibEVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgYmxFbnRyeS5kYXRhLmZbaV0gPSBibEVudHJ5LmRhdGEuZlswXTsKKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG5wRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUpOworICAgIGlmIChucEVudHJ5LmNvdW50ID4gMCAmJiBucEVudHJ5LmNvdW50ICUgMiA9PSAwKSB7CisgICAgICAgIGRvdWJsZSBucFtdID0ge25wRW50cnkuZGF0YS5kWzBdLCBucEVudHJ5LmRhdGEuZFsxXX07CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFLCBucCwgMik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgU0VOU09SX05PSVNFX1BST0ZJTEU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGxzU2l6ZUVudHJ5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsc0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCk7CisgICAgaWYgKGxzU2l6ZUVudHJ5LmNvdW50ID09IDIgJiYgbHNFbnRyeS5jb3VudCA+IDAKKyAgICAgICAgICAgICYmIChpbnQzMl90KWxzRW50cnkuY291bnQgPT0gNCAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV0pIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbHNTaXplRW50cnkuZGF0YS5pMzJbMF0gKiBsc1NpemVFbnRyeS5kYXRhLmkzMlsxXTsgaSsrKSB7CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrMV0gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzJdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSszXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRQorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTgorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNiRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNnRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTik7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjckVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVEKTsKKyAgICBpZiAodGNiRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiB0Y2JFbnRyeS5jb3VudCA9PSB0Y2dFbnRyeS5jb3VudAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNyRW50cnkuY291bnQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0Y2JFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICB0Y2JFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgICAgICB0Y2dFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCAxMzFkNjJmLi5lNWEzOGJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMzMsMTAgKzMzLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCkBAIC01MCwyMCArNTEsNiBAQAogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwogCi0vKioKLSAqIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgd2l0aCBDIGNhbGxpbmcgY29udmVudGlvbiB0bwotICogdXNlIGZvciBIQUwgY2FsbGJhY2sgZnVuY3Rpb25zLgotICovCi1leHRlcm4gIkMiIHsKLSAgICB0eXBlZGVmIHZvaWQgKGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdF90ICopOwotCi0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3Nfbm90aWZ5X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnX3QgKik7Ci19Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtODAsOCArNjcsNyBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCi0gICAgICAgICAgICBwcml2YXRlIGNhbWVyYTNfY2FsbGJhY2tfb3BzIHsKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrIHsKICAgcHVibGljOgogCiAgICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCk7CkBAIC0yMDgsOCArMTk0LDMyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgZHJvcFN0cmVhbUJ1ZmZlcnMoYm9vbCBkcm9wcGluZywgaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIAorICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcworICAgICAqLworICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CisgICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisgICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKwogICBwcml2YXRlOgogCisgICAgc3RhdHVzX3QgZGlzY29ubmVjdEltcGwoKTsKKwogICAgIC8vIGludGVybmFsIHR5cGVkZWZzCiAgICAgdXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKICAgICB1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlICA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwpAQCAtMjY4LDcgKzI3OCw4IEBACiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyIHsKICAgICAgIHB1YmxpYzoKICAgICAgICAgSGFsSW50ZXJmYWNlKHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSk7CisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIApAQCAtMjk3LDE0ICszMDgsMjcgQEAKICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogICAgICAgICBzdGF0dXNfdCBjbG9zZSgpOwogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworCisgICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAorICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCisgICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CisKICAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBmcmFtZSBudW1iZXIgYW5kIHN0cmVhbSBJRAogICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodEJ1ZmZlcihpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKIAorICAgICAgICAvLyBSZWdpc3RlciBhIGJ1ZklkL2J1ZmZlcl9oYW5kbGVfdCB0byBpbmZsaWdodCByZXF1ZXN0IGJ1ZmZlcgorICAgICAgICBzdGF0dXNfdCBwdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1Zik7CisKKyAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIodWludDY0X3QgYnVmZmVySWQsIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKKwogICAgICAgICAvLyBHZXQgYSB2ZWN0b3Igb2YgKGZyYW1lTnVtYmVyLCBzdHJlYW1JZCkgcGFpciBvZiBjdXJyZW50bHkgaW5mbGlnaHQKICAgICAgICAgLy8gYnVmZmVycwogICAgICAgICB2b2lkIGdldEluZmxpZ2h0QnVmZmVyS2V5cyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpOwogCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEFsd2F5cyB2YWxpZAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CkBAIC0zMTIsNiArMzM2LDggQEAKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKICAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTMxOSw3ICszNDUsNyBAQAogCiAgICAgICAgIC8vIFRoZSBvdXRwdXQgSElETCByZXF1ZXN0IHN0aWxsIGRlcGVuZHMgb24gaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdAogICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0Ci0gICAgICAgIHZvaWQgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCisgICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAogICAgICAgICAgICAgICAgIC8qb3V0Ki9oYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBvdXQsCiAgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCk7CiAKQEAgLTM2MywxOSArMzg5LDE4IEBACiAgICAgICAgIC8vIHN0cmVhbSBJRCAtPiBwZXIgc3RyZWFtIGJ1ZmZlciBJRCBtYXAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgQnVmZmVySWRNYXA+IG1CdWZmZXJJZE1hcHM7CiAgICAgICAgIHVpbnQ2NF90IG1OZXh0QnVmZmVySWQgPSAxOyAvLyAwIG1lYW5zIG5vIGJ1ZmZlcgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7Ci0KLSAgICAgICAgLy8gbWV0aG9kIHRvIGV4dHJhY3QgYnVmZmVyJ3MgdW5pcXVlIElECi0gICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBzd2l0Y2ggdG8gdXNlIGdyYWxsb2MgbWFwcGVyJ3MgZ2V0QmFja2luZ1N0b3JlIEFQSQotICAgICAgICAvLyAgICAgICBvbmNlIHdlIHJhbiBpbiBiaW5kZXJpemVkIGdyYWxsb2MgbW9kZSwgYnV0IGJlZm9yZSB0aGF0IGlzIHJlYWR5LAotICAgICAgICAvLyAgICAgICB3ZSBuZWVkIHRvIHJlbHkgb24gdGhlIGNvbnZlbnRpb25hbCBidWZmZXIgcXVldWUgYmVoYXZpb3Igd2hlcmUKLSAgICAgICAgLy8gICAgICAgYnVmZmVyX2hhbmRsZV90J3MgRkQgd29uJ3QgY2hhbmdlLgotICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCi0gICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyRnJlZWQoaW50IHN0cmVhbUlkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgdWludDY0X3Q+PiBtRnJlZWRCdWZmZXJzOworCisgICAgICAgIC8vIEJ1ZmZlcnMgZ2l2ZW4gdG8gSEFMIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgc3RkOjptdXRleCBtUmVxdWVzdGVkQnVmZmVyc0xvY2s7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgYnVmZmVyX2hhbmRsZV90Kj4gbVJlcXVlc3RlZEJ1ZmZlcnM7CisKKyAgICAgICAgdWludDMyX3QgbU5leHRTdHJlYW1Db25maWdDb3VudGVyID0gMTsKKworICAgICAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOwogICAgIH07CiAKICAgICBzcDxIYWxJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CkBAIC00MTAsOSArNDM1LDIyIEBACiAgICAgLy8gVHJhY2tpbmcgY2F1c2Ugb2YgZmF0YWwgZXJyb3JzIHdoZW4gaW4gU1RBVFVTX0VSUk9SCiAgICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgICAgbUVycm9yQ2F1c2U7CiAKLSAgICAvLyBNYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcwotICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+Ci0gICAgICAgICAgICBTdHJlYW1TZXQ7CisgICAgLy8gU3luY2hyb25pemVkIG1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCisgICAgY2xhc3MgU3RyZWFtU2V0IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgYWRkKGludCBzdHJlYW1JZCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4pOworICAgICAgICBzc2l6ZV90IHJlbW92ZShpbnQgc3RyZWFtSWQpOworICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBnZXQoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgLy8gZ2V0IGJ5ICh1bmRlcmx5aW5nKSB2ZWN0b3IgaW5kZXgKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KTsKKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBnZXRTdHJlYW1JZHMoKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgICBwcml2YXRlOgorICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4+IG1EYXRhOworICAgIH07CiAKICAgICBTdHJlYW1TZXQgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtczsKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CkBAIC00ODEsOCArNTE5LDkgQEAKIAogCiAgICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawogICAgICAqLworCiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwpAQCAtNDkzLDYgKzUzMiwxNSBAQAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6Ok5vdGlmeU1zZz4mIG1zZ3MpIG92ZXJyaWRlOwogCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0dXJuU3RyZWFtQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSBvdmVycmlkZTsKKwogICAgIC8vIEhhbmRsZSBvbmUgY2FwdHVyZSByZXN1bHQuIEFzc3VtZSB0aGF0IG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sgaXMgaGVsZC4KICAgICB2b2lkIHByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCkBAIC02NTMsMjcgKzcwMSw2IEBACiAgICAgICovCiAgICAgc3RhdGljIG5zZWNzX3QgZ2V0TW9ub1RvQm9vdHRpbWVPZmZzZXQoKTsKIAotICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcwotICAgICAqLwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7Ci0gICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCi0gICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKLSAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7Ci0gICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKTsKLSAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7Ci0gICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7Ci0gICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0gICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7Ci0KICAgICBzdHJ1Y3QgUmVxdWVzdFRyaWdnZXIgewogICAgICAgICAvLyBNZXRhZGF0YSB0YWcgbnVtYmVyLCBlLmcuIGFuZHJvaWQuY29udHJvbC5hZVByZWNhcHR1cmVUcmlnZ2VyCiAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhVGFnOwpAQCAtNzAwLDcgKzcyNyw5IEBACiAKICAgICAgICAgUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzKTsKKyAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgflJlcXVlc3RUaHJlYWQoKTsKIAogICAgICAgICB2b2lkICAgICBzZXROb3RpZmljYXRpb25MaXN0ZW5lcih3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIpOwpAQCAtNzg4LDYgKzgxNyw4IEBACiAgICAgICAgICAgICBtUmVxdWVzdExhdGVuY3kuZHVtcChmZCwgbmFtZSk7CiAgICAgICAgIH0KIAorICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKwogICAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CkBAIC04OTcsMTIgKzkyOCwxMyBAQAogCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUmVjb25maWd1cmVkOwogCi0gICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIGFuZCB3YWl0VW50aWxQYXVzZWQKKyAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgd2FpdFVudGlsUGF1c2VkLCBhbmQgc2lnbmFsUGlwZWxpbmVEcmFpbgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgbVBhdXNlTG9jazsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Eb1BhdXNlOwogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbURvUGF1c2VTaWduYWw7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUGF1c2VkOwotICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVBhdXNlZFNpZ25hbDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkOwogCiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBtUHJldlJlcXVlc3Q7CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICBtUHJldlRyaWdnZXJzOwpAQCAtOTM1LDYgKzk2Nyw4IEBACiAKICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICAgIG1TZXNzaW9uUGFyYW1LZXlzOwogICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXM7CisKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTk5NSw2ICsxMDI5LDE1IEBACiAgICAgICAgIC8vIE1hcCBvZiBwaHlzaWNhbENhbWVyYUlkIDwtPiBNZXRhZGF0YQogICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbE1ldGFkYXRhczsKIAorICAgICAgICAvLyBJbmRpY2F0ZXMgYSBzdGlsbCBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGJvb2wgc3RpbGxDYXB0dXJlOworCisgICAgICAgIC8vIEluZGljYXRlcyBhIFpTTCBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgYm9vbCB6c2xDYXB0dXJlOworCisgICAgICAgIC8vIFdoYXQgc2hhcmVkIHN1cmZhY2VzIGFuIG91dHB1dCBzaG91bGQgZ28gdG8KKyAgICAgICAgU3VyZmFjZU1hcCBvdXRwdXRTdXJmYWNlczsKKwogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKQEAgLTEwMDUsMTIgKzEwNDgsMTYgQEAKICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSksCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2sodHJ1ZSksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24pLAotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSkgeworICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGZhbHNlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGZhbHNlKSB7CiAgICAgICAgIH0KIAogICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQpIDoKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCwgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLApAQCAtMTAyMSw3ICsxMDY4LDEwIEBACiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2soaGFzQXBwQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24obWF4RHVyYXRpb24pLAogICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCkgeworICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzKHBoeXNpY2FsQ2FtZXJhSWRTZXQpLAorICAgICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShpc1N0aWxsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgenNsQ2FwdHVyZShpc1pzbENhcHR1cmUpLAorICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKG91dFN1cmZhY2VzKSB7CiAgICAgICAgIH0KICAgICB9OwogCkBAIC0xMDM1LDEwICsxMDg1LDExIEBACiAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uID0gMDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgIG1JbkZsaWdodFN0YXR1c0lkOwogCi0KICAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgIGJvb2wgY2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGV4cGVjdGVkIHRpbWUgaXQnbGwgdGFrZSBmb3IgYWxsIGN1cnJlbnRseSBpbi1mbGlnaHQKQEAgLTExNDgsNyArMTE5OSwxMSBAQAogCiAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlIHN0cmVhbXMuCiAgICAgdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvbmx5IG1lYW50IGZvciBzdXJmYWNlIHNoYXJpbmcgdXNlIGNhc2UKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9LAorICAgICAgICAgICAgLy8gVXNlZCB0byBzZW5kIGJ1ZmZlciBlcnJvciBjYWxsYmFjayB3aGVuIGZhaWxpbmcgdG8gcmV0dXJuIGJ1ZmZlcgorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzID0gQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKIAogICAgIC8vIFNlbmQgYSBwYXJ0aWFsIGNhcHR1cmUgcmVzdWx0LgogICAgIHZvaWQgc2VuZFBhcnRpYWxDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICogcGFydGlhbFJlc3VsdCwKQEAgLTEyMDQsMTMgKzEyNTksODggQEAKICAgICAvLyBDYWNoZWQgbGFzdCByZXF1ZXN0ZWQgdGVtcGxhdGUgaWQKICAgICBpbnQgbUxhc3RUZW1wbGF0ZUlkOwogCi0gICAgLyoqCi0gICAgICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICAgICAqLwotICAgIHN0YXRpYyBjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90IHNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKKyAgICAvLyBTeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHN0YXR1cyB0cmFja2VyIGJldHdlZW4gaW5mbGlnaHQgdXBkYXRlcyBhbmQgZGlzY29ubmVjdC4KKyAgICAvLyBiLzc5OTcyODY1CisgICAgTXV0ZXggbVRyYWNrZXJMb2NrOwogCi0gICAgc3RhdGljIGNhbGxiYWNrc19ub3RpZnlfdCBzTm90aWZ5OworICAgIC8vIFdoZXRoZXIgSEFMIHJlcXVlc3QgYnVmZmVycyB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXJzIEFQSQorICAgIGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZTsKIAorICAgIC8vIExvY2sgdG8gZW5zdXJlIHJlcXVlc3RTdHJlYW1CdWZmZXJzKCkgY2FsbGJhY2tzIGFyZSBzZXJpYWxpemVkCisgICAgc3RkOjptdXRleCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2s7CisKKyAgICAvLyBUaGUgc3RhdGUgbWFjaGluZSB0byBjb250cm9sIHdoZW4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgc2hvdWxkIGFsbG93CisgICAgLy8gSEFMIHRvIHJlcXVlc3QgYnVmZmVycy4KKyAgICBlbnVtIFJlcXVlc3RCdWZmZXJTdGF0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcmV0dXJuIEZBSUxFRF9DT05GSUdVUklORyBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaWxsIHN3aXRjaCB0byBSQl9TVEFUVVNfUkVBRFkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbmZpZ3VyZVN0cmVhbXMgb3IKKyAgICAgICAgICogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IGNhbGwuCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfU1RPUFBFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogV2hlbiBkZXZpY2UgaXMgYXNrZWQgdG8gc3RheSBpZGxlIHZpYSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKSBjYWxsOgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1NUT1BQRUQgaWYgdGhlcmUgaXMgbm8gaW5mbGlnaHQgcmVxdWVzdHMgYW5kCisgICAgICAgICAqICAgICAgIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KKyAgICAgICAgICogICAgIC0gU3dpdGNoIHRvIFJCX1NUQVRVU19QRU5ESU5HX1NUT1Agb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfUkVBRFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCBwcm9jZWVkIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCB3aGVuIGFsbCBpbmZsaWdodCByZXF1ZXN0cyBhcmUgZnVsZmlsbGVkCisgICAgICAgICAqIGFuZCByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19QRU5ESU5HX1NUT1AsCisgICAgfTsKKworICAgIGNsYXNzIFJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmUgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpOworCisgICAgICAgIC8vIFJldHVybiBpZiB0aGUgc3RhdGUgbWFjaGluZSBjdXJyZW50bHkgYWxsb3dzIGZvciByZXF1ZXN0QnVmZmVycworICAgICAgICAvLyBJZiB0aGUgc3RhdGUgYWxsb3dzIGZvciBpdCwgbVJlcXVlc3RCdWZmZXJPbmdvaW5nIHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgICAgLy8gYW5kIGNhbGxlciBtdXN0IGNhbGwgZW5kUmVxdWVzdEJ1ZmZlcigpIGxhdGVyIHRvIHVuc2V0IHRoZSBmbGFnCisgICAgICAgIGJvb2wgc3RhcnRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgIHZvaWQgZW5kUmVxdWVzdEJ1ZmZlcigpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgYXBwbGljYXRpb24gQVBJIGNhbGwKKyAgICAgICAgdm9pZCBvblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgICAgIHZvaWQgb25XYWl0VW50aWxJZGxlKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHVzdWFsbHkgdHJpZ2dlcmVkIGJ5IGh3QmluZGVyIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGxiYWNrIHRocmVhZAorICAgICAgICAvLyBCdXQgY2FuIGFsc28gYmUgdHJpZ2dlcmVkIG9uIHJlcXVlc3QgdGhyZWFkIGZvciBmYWlsZWQgcmVxdWVzdCwgb3Igb24KKyAgICAgICAgLy8gaHdiaW5kZXIgbm90aWZ5IGNhbGxiYWNrIHRocmVhZCBmb3Igc2h1dHRlci9lcnJvciBjYWxsYmFja3MKKyAgICAgICAgdm9pZCBvbkluZmxpZ2h0TWFwRW1wdHkoKTsKKworICAgICAgICAvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IFJlcXVlc3RUaHJlYWQKKyAgICAgICAgdm9pZCBvblJlcXVlc3RTdWJtaXR0ZWQoKTsKKyAgICAgICAgdm9pZCBvblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKTsKKworICAgICAgICAvLyBTd2l0Y2ggdG8gU1RPUFBFRCBzdGF0ZSBhbmQgcmV0dXJuIHRydWUgaWYgYWxsIGNvbmRpdGlvbnMgYWxsb3dzIGZvciBpdC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGRvIG5vdGhpbmcgYW5kIHJldHVybiBmYWxzZS4KKyAgICAgICAgYm9vbCBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworCisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIFJlcXVlc3RCdWZmZXJTdGF0ZSBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisKKyAgICAgICAgYm9vbCBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgICAgIGJvb2wgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgICAgICBib29sIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworCisgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOworICAgICAgICBpbnQgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQ7CisgICAgfSBtUmVxdWVzdEJ1ZmZlclNNOworCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgYm9vbCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3M7CisgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKTsKIH07IC8vIGNsYXNzIENhbWVyYTNEZXZpY2UKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCBmYjFmZjc3Li5iNjM3MTYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCkgeworICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAogICAgICAgICAgICAgbnNlY3NfdCwKICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggNDYyNzU0OC4uNGI2N2VhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC04Nyw2ICs4Nyw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xMDQsNiArMTA3LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0xMjgsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggM2MxZTQzZC4uMmU5MDlhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKLXNpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgewogICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogfQogCkBAIC0yMTksNyArMjE5LDggQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBib29sIG91dHB1dCkgeworICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICAvLyByZXR1cm5CdWZmZXIgbWF5IGJlIGNhbGxlZCBmcm9tIGEgcmF3IHBvaW50ZXIsIG5vdCBhIHNwPD4sIGFuZCB3ZSdsbCBiZQpAQCAtMjM1LDcgKzIzNiw3IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsCisgICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LCBzdXJmYWNlX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWxlYXNlRmVuY2UpOwogICAgIC8vIFJlcyBtYXkgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGRlY3JlbWVudCBvdXIgb3duZWQgY291bnQKICAgICAvLyB0byBlbmFibGUgY2xlYW4gc2h1dGRvd24uIFNvIHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDBhMzFkNDQuLjc1MGY2NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC02NiwxMiArNjYsMTQgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpID0gMDsKIApAQCAtODIsNyArODQsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMDE3ZDdiZS4uZmM4MzY4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCAwNzMyNDY0Li45N2E2MjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCAyYzAyMGEyLi44Y2Q1NzVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTE4NywxNiArMTg3LDE3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgcmV0dXJuIGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjEyLDYgKzIxMyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKQEAgLTIzNywxMiArMjM5LDE0IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGJ1ZmZlciBiYWNrIHRvIEFOYXRpdmVXaW5kb3cKICAgICAgKi8KLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCiAgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coIiVzOiBBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCBkdWUgdG8gYnVmZmVyIGVycm9yLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgc2hvdWxkbid0IGJlIDAiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmNhbmNlbEJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCkBAIC0yNzksNyArMjgzLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzogIgogICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC02NTksMTIgKzY2MywxMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgdWludDY0X3QgdSA9IDA7Cit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pIHsKKyAgICBpZiAoY29uc3VtZXJVc2FnZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKICAgICAvLyBJZiBhbiBvcGFxdWUgb3V0cHV0IHN0cmVhbSdzIGVuZHBvaW50IGlzIEltYWdlUmVhZGVyLCBhZGQKICAgICAvLyBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wgdG8gdGhlIHVzYWdlIHNvIEhBTCBrbm93cyBpdCB3aWxsIGJlIHVzZWQKICAgICAvLyBmb3IgdGhlIFpTTCB1c2UgY2FzZS4KQEAgLTY3MywxMiArNjc2LDIwIEBACiAgICAgLy8gICAgIDIuIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSCiAgICAgLy8gICAgIDMuIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIKICAgICAvLyAgICAgNC4gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSCi0gICAgaWYgKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCi0gICAgICAgICAgICAodSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8CisgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICgqY29uc3VtZXJVc2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8CiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKSkgPT0gMCkgewotICAgICAgICB1IHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKKyAgICAgICAgKmNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMOwogICAgIH0KK30KIAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgeworICAgIHN0YXR1c190IHJlczsKKyAgICB1aW50NjRfdCB1ID0gMDsKKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKSwgJnUpOworICAgIGFwcGx5WlNMVXNhZ2VRdWlyayhjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCAmdSk7CiAgICAgKnVzYWdlID0gdTsKICAgICByZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA2ZjM2ZjkyLi4yMTI4ZGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtMTkwLDYgKzE5MCw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xOTgsNiArMjAxLDExIEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKICAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKIAorICAgIC8qKgorICAgICAqIEFwcGx5IFpTTCByZWxhdGVkIGNvbnN1bWVyIHVzYWdlIHF1aXJrLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pOworCiAgIHByb3RlY3RlZDoKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LApAQCAtMjEzLDYgKzIyMSw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApAQCAtMjg1LDEwICsyOTQsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCBhNzExYTZkLi4yYmRlOTQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtNjcsNiArNjcsMTggQEAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqCisgICAgICogUmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGlmIGFuZCBvbmx5IGlmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHN1cmZhY2Ugc2hhcmluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpID0gMDsKKworICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKaW5kZXggZmIzY2U0Yy4uZTNiNzRkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLVNoYXJlZE91U3RybSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCiAjaW5jbHVkZSAiQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yOCwxNiArMzIsMTcgQEAKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgaW50IHNldElkKSA6CisgICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBzdGQ6Om1pbihzdXJmYWNlcy5zaXplKCksIGtNYXhPdXRwdXRzKTsKICAgICBpZiAoc3VyZmFjZXMuc2l6ZSgpID4gY29uc3VtZXJDb3VudCkgewogICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgbW9yZSBjb25zdW1lcnMgdGhhbiB0aGUgbWF4aW11bSAiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uc3VtZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgIG1TdXJmYWNlc1tpXSA9IHN1cmZhY2VzW2ldOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2VzW2ldLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiB9CiAKQEAgLTQ4LDE1ICs1MywxNSBAQAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Y29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcigpOworICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIobVVzZUhhbEJ1Zk1hbmFnZXIpOwogCiAgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+IGluaXRpYWxTdXJmYWNlczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZXNbaV0pOworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MSw2ICs3NiwzMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoCisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCisgICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQorICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KKyAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7CisgICAgbUxvY2subG9jaygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAorICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCisgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6bm90aWZ5QnVmZmVyUmVsZWFzZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW53QnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwpAQCAtODksNyArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIChtU3VyZmFjZXNbc3VyZmFjZV9pZF0gPT0gbnVsbHB0cik7CisgICAgcmV0dXJuIChtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlX2lkXS5maXJzdCA9PSBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMpIHsKQEAgLTExMiw3ICsxNDIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogCi0gICAgICAgIG1TdXJmYWNlc1tpZF0gPSBzdXJmYWNlOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKIAogICAgICAgICAvLyBPbmx5IGNhbGwgYWRkT3V0cHV0IGlmIHRoZSBzcGxpdHRlciBoYXMgYmVlbiBjb25uZWN0ZWQuCiAgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgewpAQCAtMTI4LDcgKzE1OCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBpbnQgZmVuY2VGZCA9IC0xOwogCkBAIC0xMzgsMjMgKzE2OCwxMSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCi0gICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQotICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KLSAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7Ci0gICAgbUxvY2subG9jaygpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCi0gICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChhbmIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OCw4ICsxODYsMzggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgewotICAgIHN0YXR1c190IHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBpZiAodW5pcXVlU3VyZmFjZUlkcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmlxdWVTdXJmYWNlSWRzIG11c3Qgbm90IGJlIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBzdXJmYWNlSWRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHVuaXF1ZUlkIDogdW5pcXVlU3VyZmFjZUlkcykgeworICAgICAgICAgICAgYm9vbCB1bmlxdWVJZEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uc2Vjb25kID09IHVuaXF1ZUlkKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VJZHMucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF1bmlxdWVJZEZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiB1bmtub3duIHVuaXF1ZSBzdXJmYWNlIElEICV6dSBmb3Igc3RyZWFtICVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVuaXF1ZUlkLCBtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYnVmZmVyLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogCiAgICAgLy8gQWZ0ZXIgcXVldWluZyBidWZmZXIgdG8gdGhlIGludGVybmFsIGNvbnN1bWVyIHF1ZXVlLCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgaXMKICAgICAvLyBzdWNjZXNzZnVsbHkgcXVldWVkIHRvIHRoZSBvdXRwdXQgcXVldWVzLgpAQCAtMjI4LDggKzI3Niw4IEBACiAgICAgICAgICp1c2FnZSA9IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwga01heE91dHB1dHM7IGlkKyspIHsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZXNbaWRdICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VzW2lkXSk7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0KTsKICAgICAgICAgICAgICAgICAqdXNhZ2UgfD0gdTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjQ1LDcgKzI5Myw3IEBACiBzc2l6ZV90IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldE5leHRTdXJmYWNlSWRMb2NrZWQoKSB7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNTgsNyArMzA2LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IHN1cmZhY2UpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IHN1cmZhY2UpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjcsNiArMzE1LDI2IEBACiAgICAgcmV0dXJuIGlkOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChvdXRVbmlxdWVJZHMgPT0gbnVsbHB0ciB8fCBzdXJmYWNlSWRzLnNpemUoKSA+IGtNYXhPdXRwdXRzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb3V0VW5pcXVlSWRzLT5jbGVhcigpOworICAgIG91dFVuaXF1ZUlkcy0+cmVzZXJ2ZShzdXJmYWNlSWRzLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1cmZhY2VJZCA6IHN1cmZhY2VJZHMpIHsKKyAgICAgICAgaWYgKHN1cmZhY2VJZCA+PSBrTWF4T3V0cHV0cykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBvdXRVbmlxdWVJZHMtPnB1c2hfYmFjayhtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdLnNlY29uZCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZCgKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlcywKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJmF0dGFjaGVkU3VyZmFjZXMpIHsKQEAgLTI4MCw3ICszNDgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSBudWxscHRyOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWRTdXJmYWNlcy5zaXplKCk7IGkrKykgewpAQCAtMjkxLDcgKzM1OSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtMzQzLDggKzQxMiw4IEBACiAKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaXRdID0gbnVsbHB0cjsKLSAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZXNbaXRdLCBpdCk7CisgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VVbmlxdWVJZHNbaXRdLmZpcnN0LCBpdCk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2l0XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIC8vTmV4dCBhZGQgdGhlIG5ldyBvdXRwdXRzCkBAIC0zNjksNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tzdXJmYWNlSWRdID0gaXQ7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0gPSBzdGQ6Om1ha2VfcGFpcihpdCwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgICAgIG91dHB1dE1hcC0+YWRkKGl0LCBzdXJmYWNlSWQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCAwMmIxYzA5Li5iNWUzN2MyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1TcGxpdHRlci5oIgogI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW0uaCIKIApAQCAtMzcsNyArMzgsOCBAQAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTQ5LDYgKzUxLDE1IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLApAQCAtNTgsOCArNjksMTcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE91dHB1dHMgPSA0OwogCi0gICAgLy8gTWFwIHN1cmZhY2VJZCAtPiBvdXRwdXQgc3VyZmFjZXMKLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZXNba01heE91dHB1dHNdOworICAgIC8vIFdoZXRoZXIgSEFMIGlzIGluIGNvbnRyb2wgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50LiBTdXJmYWNlIHNoYXJpbmcgYmVoYXZpb3IKKyAgICAvLyBkZXBlbmRzIG9uIHRoaXMgZmxhZy4KKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOworCisgICAgLy8gUGFpciBvZiBhbiBvdXRwdXQgU3VyZmFjZSBhbmQgaXRzIHVuaXF1ZSBJRAorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNwPFN1cmZhY2U+LCBzaXplX3Q+IFN1cmZhY2VVbmlxdWVJZDsKKworICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gKG91dHB1dCBzdXJmYWNlLCB1bmlxdWUgc3VyZmFjZSBJRCkKKyAgICBzdGQ6OmFycmF5PFN1cmZhY2VVbmlxdWVJZCwga01heE91dHB1dHM+IG1TdXJmYWNlVW5pcXVlSWRzOworCisgICAgc2l6ZV90IG1OZXh0VW5pcXVlU3VyZmFjZUlkID0gMDsKIAogICAgIHNzaXplX3QgZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOwogCkBAIC03OCwxMyArOTgsMjQgQEAKICAgICBzdGF0dXNfdCBjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEF0dGFjaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byBzdHJlYW0gc3BsaXR0ZXIuCisgICAgICogV2hlbiBjYW1lcmEgc2VydmljZSBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBoYW5kZWQgb3V0IHRvIEhBTCBpbiByZXF1ZXN0IHRocmVhZC4KKyAgICAgKiBXaGVuIEhBTCBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbgorICAgICAqIHRoZSBidWZmZXIgaXMgcmV0dXJuZWQgZnJvbSBIQUwgaW4gaHdiaW5kZXIgY2FsbGJhY2sgdGhyZWFkLgorICAgICAqLworICAgIHN0YXR1c190IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworCisgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggN2ViYzI5OS4uMjRkMWMxYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC02Nyw3ICs2Nyw4IEBACiAgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCiAgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAogICAgIG1PcmlnaW5hbEZvcm1hdCgtMSksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeworICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLAorICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIAogICAgIGNhbWVyYTNfc3RyZWFtOjpzdHJlYW1fdHlwZSA9IHR5cGU7CiAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoID0gd2lkdGg7CkBAIC02NTQsNyArNjU1LDggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtNjY2LDYgKzY2OCwxNSBAQAogCiAgICAgcmVtb3ZlT3V0c3RhbmRpbmdCdWZmZXIoYnVmZmVyKTsKIAorICAgIC8vIEJ1ZmZlciBzdGF0dXMgbWF5IGJlIGNoYW5nZWQsIHNvIG1ha2UgYSBjb3B5IG9mIHRoZSBzdHJlYW1fYnVmZmVyIHN0cnVjdC4KKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXIgYiA9IGJ1ZmZlcjsKKyAgICBpZiAodGltZXN0YW1wSW5jcmVhc2luZyAmJiB0aW1lc3RhbXAgIT0gMCAmJiB0aW1lc3RhbXAgPD0gbUxhc3RUaW1lc3RhbXApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IHRpbWVzdGFtcCAlIiBQUklkNjQgIiBpcyBub3QgaW5jcmVhc2luZy4gUHJldiB0aW1lc3RhbXAgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCB0aW1lc3RhbXAsIG1MYXN0VGltZXN0YW1wKTsKKyAgICAgICAgYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgfQorICAgIG1MYXN0VGltZXN0YW1wID0gdGltZXN0YW1wOworCiAgICAgLyoqCiAgICAgICogVE9ETzogQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaXMgdmFsaWQgZmlyc3QuCiAgICAgICoKQEAgLTY3NCw5ICs2ODUsOSBAQAogICAgICAqCiAgICAgICogRG8gdGhpcyBmb3IgZ2V0QnVmZmVyIGFzIHdlbGwuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYiwgdGltZXN0YW1wLCBzdXJmYWNlX2lkcyk7CiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChiLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUpOwogICAgIH0KIAogICAgIC8vIEV2ZW4gaWYgcmV0dXJuaW5nIHRoZSBidWZmZXIgZmFpbGVkLCB3ZSBzdGlsbCB3YW50IHRvIHNpZ25hbCB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIHRoZQpAQCAtNzg1LDYgKzc5NiwxMiBAQAogICAgIHJldHVybiBoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKTsKIH0KIAorc2l6ZV90IENhbWVyYTNTdHJlYW06OmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6c2V0U3RhdHVzVHJhY2tlcihzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNwPFN0YXR1c1RyYWNrZXI+IG9sZFRyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CkBAIC04MjcsNyArODQ0LDcgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQUxPR0UoIiVzOiBUaGlzIHR5cGUgb2Ygc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDAzNTU5NzguLmRkYmE5ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC0zMjIsMTEgKzMyMiwxNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIGJ1ZmZlciB0byB0aGUgc3RyZWFtIGFmdGVyIHVzZSBieSB0aGUgSEFMLgogICAgICAqCisgICAgICogTXVsdGlwbGUgc3VyZmFjZXMgY291bGQgc2hhcmUgdGhlIHNhbWUgSEFMIHN0cmVhbSwgYnV0IGEgcmVxdWVzdCBtYXkKKyAgICAgKiBiZSBvbmx5IGZvciBhIHN1YnNldCBvZiBzdXJmYWNlcy4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlIG9iamVjdCBuZWVkcyB0aGUgc3VyZmFjZSBJRCBpbmZvcm1hdGlvbiB0byBhdHRhY2gKKyAgICAgKiBidWZmZXJzIGZvciB0aG9zZSBzdXJmYWNlcy4KKyAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBmb3IgYnVmZmVycyBwcm92aWRlZCBieSBnZXRCdWZmZXIoKS4KICAgICAgKiBGb3IgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLCB0aGlzIG1ldGhvZCBhcHBsaWVzIHRvIHRoZSBvdXRwdXQtc2lkZSBidWZmZXJzCiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCkBAIC0zNjAsNiArMzY2LDExIEBACiAgICAgICovCiAgICAgYm9vbCAgICAgICAgICAgICBoYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICBzaXplX3QgICAgICAgICAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3Q7CisKICAgICBlbnVtIHsKICAgICAgICAgVElNRU9VVF9ORVZFUiA9IC0xCiAgICAgfTsKQEAgLTQ3Myw3ICs0ODQsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKQEAgLTQ5NSw3ICs1MDcsNyBAQAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBvdXRwdXQgYnVmZmVyIGNvdW50LgotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgaW5wdXQgYnVmZmVyIGNvdW50LgogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CkBAIC01NjYsNiArNTc4LDcgQEAKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CiAKICAgICBTdHJpbmc4IG1QaHlzaWNhbENhbWVyYUlkOworICAgIG5zZWNzX3QgbUxhc3RUaW1lc3RhbXA7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDNkNDVjODkuLmE4NDcyMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0yNDgsMTEgKzI0OCwxOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIGJ1ZmZlciB0byB0aGUgc3RyZWFtIGFmdGVyIHVzZSBieSB0aGUgSEFMLgogICAgICAqCisgICAgICogTXVsdGlwbGUgc3VyZmFjZXMgY291bGQgc2hhcmUgdGhlIHNhbWUgSEFMIHN0cmVhbSwgYnV0IGEgcmVxdWVzdCBtYXkKKyAgICAgKiBiZSBvbmx5IGZvciBhIHN1YnNldCBvZiBzdXJmYWNlcy4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlIG9iamVjdCBuZWVkcyB0aGUgc3VyZmFjZSBJRCBpbmZvcm1hdGlvbiB0byBhdHRhY2gKKyAgICAgKiBidWZmZXJzIGZvciB0aG9zZSBzdXJmYWNlcy4gRm9yIHRoZSBjYXNlIG9mIHNpbmdsZSBzdXJmYWNlIGZvciBhIEhBTAorICAgICAqIHN0cmVhbSwgc3VyZmFjZV9pZHMgcGFyYW1ldGVyIGhhcyBubyBlZmZlY3QuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApID0gMDsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpID0gMDsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpAQCAtMjg5LDYgKzI5NiwxMSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgY29uc3QgPSAwOwogCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBidWZmZXJzIGN1cnJlbnRseSBoYW5kZWQgb3V0IHRvIEhBTAorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdCA9IDA7CisKICAgICBlbnVtIHsKICAgICAgICAgVElNRU9VVF9ORVZFUiA9IC0xCiAgICAgfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCBlY2I5ODBhLi44NGMyZWM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0xNTIsNiArMTUyLDggQEAKICAgICBTUF9MT0dWKCIlczogRGlzY29ubmVjdGVkIiwgX19GVU5DVElPTl9fKTsKIH0KIAorQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6fkNhbWVyYTNTdHJlYW1TcGxpdHRlcigpIHsKICAgICBkaXNjb25uZWN0KCk7CkBAIC0yNDEsNyArMjQzLDkgQEAKICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKSwgJnVzYWdlKTsKICAgICBpZiAoISh1c2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSkpIHsKLSAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CisgICAgICAgIG5zZWNzX3QgdGltZW91dCA9IG1Vc2VIYWxCdWZNYW5hZ2VyID8KKyAgICAgICAgICAgICAgICBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgOiBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQ7CisgICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dCh0aW1lb3V0KTsKICAgICB9CiAKICAgICByZXMgPSBnYnAtPmFsbG93QWxsb2NhdGlvbihmYWxzZSk7CkBAIC00MzYsOCArNDQwLDkgQEAKICAgICAgICAgcmVzID0gZ2JwLT5hdHRhY2hCdWZmZXIoJnNsb3QsIGdiKTsKICAgICAgICAgbU11dGV4LmxvY2soKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhY3F1aXJlQnVmZmVyIGZyb20gR3JhcGhpY0J1ZmZlclByb2R1Y2VyICVwOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBDYW5ub3QgYXR0YWNoQnVmZmVyIGZyb20gR3JhcGhpY0J1ZmZlclByb2R1Y2VyICVwOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnYnAuZ2V0KCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgLy8gVE9ETzogbWlnaHQgbmVlZCB0byBkZXRhY2gvY2xlYW51cCB0aGUgYWxyZWFkeSBhdHRhY2hlZCBidWZmZXJzIGJlZm9yZSByZXR1cm4/CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIGlmICgoc2xvdCA8IDApIHx8IChzbG90ID4gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCAxZWFmMmJkLi45NjBmN2FhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIHB1YmxpYzoKIAogICAgIC8vIENvbnN0cnVjdG9yCi0gICAgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKCkgPSBkZWZhdWx0OworICAgIENhbWVyYTNTdHJlYW1TcGxpdHRlcihib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICAvLyBDb25uZWN0IHRvIHRoZSBzdHJlYW0gc3BsaXR0ZXIgYnkgY3JlYXRpbmcgYnVmZmVyIHF1ZXVlIGFuZCBjb25uZWN0aW5nIGl0CiAgICAgLy8gd2l0aCBvdXRwdXQgc3VyZmFjZXMuCkBAIC0yMjYsNyArMjI2LDEwIEBACiAgICAgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgbUZvcm1hdCA9IGFuZHJvaWQ6OlBJWEVMX0ZPUk1BVF9OT05FOwogICAgIHVpbnQ2NF90IG1Qcm9kdWNlclVzYWdlID0gMDsKIAotICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZXF1ZXVlQnVmZmVyVGltZW91dCAgID0gczJucygxKTsgLy8gMSBzZWMKKyAgICAvLyBUaGUgYXR0YWNoQnVmZmVyIGNhbGwgd2lsbCBoYXBwZW4gb24gZGlmZmVyZW50IHRocmVhZCBhY2NvcmRpbmcgdG8gbVVzZUhhbEJ1Zk1hbmFnZXIgYW5kIGhhdmUKKyAgICAvLyBkaWZmZXJlbnQgdGltaW5nIGNvbnN0cmFpbnQuCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga05vcm1hbERlcXVldWVCdWZmZXJUaW1lb3V0ICAgID0gczJucygxKTsgIC8vIDEgc2VjCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0hhbEJ1Zk1nckRlcXVldWVCdWZmZXJUaW1lb3V0ID0gbXMybnMoMSk7IC8vIDEgbXNlYwogCiAgICAgTXV0ZXggbU11dGV4OwogCkBAIC0yNzMsNiArMjc2LDggQEAKICAgICBzaXplX3QgbUFjcXVpcmVkSW5wdXRCdWZmZXJzOwogCiAgICAgU3RyaW5nOCBtQ29uc3VtZXJOYW1lOworCisgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCmluZGV4IDRkYWZlZmQuLmFlN2FmOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcApAQCAtMzEyLDggKzMxMiw4IEBACiAgICAgICAgIGludDMyX3QgY29vcmRzWzRdID0gewogICAgICAgICAgICAgcmVjdHNbaV0sCiAgICAgICAgICAgICByZWN0c1tpICsgMV0sCi0gICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSwKLSAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXQorICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0gLSAxLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdIC0gMQogICAgICAgICB9OwogCiAgICAgICAgIG1hcFJhd1RvQ29ycmVjdGVkKGNvb3JkcywgMiwgY2xhbXAsIHNpbXBsZSk7CkBAIC0zMjEsOCArMzIxLDggQEAKICAgICAgICAgLy8gTWFwIGJhY2sgdG8gKGwsIHQsIHdpZHRoLCBoZWlnaHQpCiAgICAgICAgIHJlY3RzW2ldID0gY29vcmRzWzBdOwogICAgICAgICByZWN0c1tpICsgMV0gPSBjb29yZHNbMV07Ci0gICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXTsKLSAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdOworICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF0gKyAxOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV0gKyAxOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTQwMCw4ICs0MDAsOCBAQAogICAgICAgICBpbnQzMl90IGNvb3Jkc1s0XSA9IHsKICAgICAgICAgICAgIHJlY3RzW2ldLAogICAgICAgICAgICAgcmVjdHNbaSArIDFdLAotICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0sCi0gICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10KKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdIC0gMSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAogICAgICAgICBtYXBDb3JyZWN0ZWRUb1Jhdyhjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOwpAQCAtNDA5LDggKzQwOSw4IEBACiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKICAgICAgICAgcmVjdHNbaSArIDFdID0gY29vcmRzWzFdOwotICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF07Ci0gICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdICsgMTsKKyAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdICsgMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU1MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKKworY29uc3QgY2hhciAqSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjprUmVzdWx0S2V5ID0gIkNhcHR1cmVSZXN1bHQiOworCitIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQorCitib29sIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6aW5pdGlhbGl6ZUxvb3BlcigpIHsKKyAgICBtQ2JMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ2JMb29wZXItPnNldE5hbWUoImNzLWxvb3BlciIpOworICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoLypydW5PbkNhbGxpbmdUaHJlYWQqLyBmYWxzZSwgLypjYW5DYWxsSmF2YSovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgaWYgKGVyciAhPU9LKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6On5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSB7CisgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtSGFuZGxlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkRldmljZUVycm9yKAorICAgIGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXMgPSBjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25EZXZpY2VFcnJvcihjb252ZXJ0VG9IaWRsKGVycm9yQ29kZSksIGhDYXB0dXJlUmVzdWx0RXh0cmFzKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uRGV2aWNlRXJyb3IgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uRGV2aWNlSWRsZSgpIHsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkRldmljZUlkbGUoKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICBBTE9HRSgiJXMgT25EZXZpY2VJZGxlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkNhcHR1cmVTdGFydGVkKGhDYXB0dXJlUmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25DYXB0dXJlQ2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Y29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgKmhSZXN1bHRNZXRhZGF0YSkgeworICAgIC8vIEZpcnN0IHRyeSB3cml0aW5nIHRvIGZtcS4KKyAgICBzaXplX3QgbWV0YWRhdGFfc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSk7CisgICAgaWYgKChtZXRhZGF0YV9zaXplID4gMCkgJiYKKyAgICAgICAgKG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpID4gMCkpIHsKKyAgICAgICAgaWYgKG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhSZXN1bHRNZXRhZGF0YS0+Zm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgICAgICBoUmVzdWx0TWV0YWRhdGEtPm1ldGFkYXRhKHN0ZDo6bW92ZShtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPFJlZkJhc2U+IG9iaiA9IG51bGxwdHI7CisgICAgc3A8UmVzdWx0V3JhcHBlcj4gcmVzdWx0V3JhcHBlciA9IG51bGxwdHI7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VsdFJlY2VpdmVkOgorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1Jlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IG9iaiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHJlc3VsdCBvYmplY3QgaW4gY2FsbGJhY2sgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFdyYXBwZXIgPSBzdGF0aWNfY2FzdDxSZXN1bHRXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBwcm9jZXNzUmVzdWx0TWVzc2FnZShyZXN1bHRXcmFwcGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FsbGJhY2sgc2VudCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbGxiYWNrSGFuZGxlcjo6cHJvY2Vzc1Jlc3VsdE1lc3NhZ2UoCisgICAgc3A8UmVzdWx0V3JhcHBlcj4gJnJlc3VsdFdyYXBwZXIpIHsKKyAgICBzcDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNvbnZlcnRlciA9IG1Db252ZXJ0ZXIucHJvbW90ZSgpOworICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2FsbGJhY2sgd3JhcHBlciBoYXMgZGllZCwgcmVzdWx0IGNhbGxiYWNrIGNhbm5vdCBiZSBtYWRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGFOYXRpdmUgJnJlc3VsdCA9IHJlc3VsdFdyYXBwZXItPm1SZXN1bHQ7CisgICAgYXV0byByZXN1bHRFeHRyYXMgPSByZXN1bHRXcmFwcGVyLT5tUmVzdWx0RXh0cmFzOworICAgIGF1dG8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zID0gcmVzdWx0V3JhcHBlci0+bVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhSZXN1bHRFeHRyYXMgPQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwoCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLCBjb252ZXJ0ZXItPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisKKyAgICAvLyBDb252ZXJ0IE1ldGFkYXRhIGludG8gSENhbWVyYU1ldGFkYXRhOworICAgIEZtcVNpemVPck1ldGFkYXRhIGhSZXN1bHQ7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gcmVzdWx0LmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0ZXItPmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChyYXdNZXRhZGF0YSwgJmhSZXN1bHQpOworICAgIHJlc3VsdC51bmxvY2socmF3TWV0YWRhdGEpOworICAgIGF1dG8gcmV0ID0gY29udmVydGVyLT5tQmFzZS0+b25SZXN1bHRSZWNlaXZlZChoUmVzdWx0LCBoUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgIEFMT0dFKCIlcyBPblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXN1bHRSZWNlaXZlZCgKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgcmVzdWx0LAorICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICBjb25zdCA6OnN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeworICAgIC8vIFdyYXAgQ2FtZXJhTWV0YWRhdGEsIHJlc3VsdEV4dHJhcyBhbmQgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgaW4gb24KKyAgICAvLyBzcDxSZWZCYXNlPi1hYmxlIHN0cnVjdHVyZSBhbmQgcG9zdCBpdC4KKyAgICBzcDxSZXN1bHRXcmFwcGVyPiByZXN1bHRXcmFwcGVyID0gbmV3IFJlc3VsdFdyYXBwZXIoY29uc3RfY2FzdDxDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmPihyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMsIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVzdWx0UmVjZWl2ZWQsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldE9iamVjdChrUmVzdWx0S2V5LCByZXN1bHRXcmFwcGVyKTsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25QcmVwYXJlZChpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgLy8gVG8gc2lsZW5jZSBXdW51c2VkLXBhcmFtZXRlci4KKyAgICAodm9pZCkgc3RyZWFtSWQ7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgIGludDMyX3QgcmVwZWF0aW5nUmVxdWVzdElkKSB7CisgICAgYXV0byByZXQgPQorICAgICAgICBtQmFzZS0+b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IobGFzdEZyYW1lTnVtYmVyLCByZXBlYXRpbmdSZXF1ZXN0SWQpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25SZXBlYXRpbmdSZXF1ZXN0RXJvciBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXF1ZXN0UXVldWVFbXB0eSgpIHsKKyAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmNTIwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxoaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGNhbWVyYWh5YnJpZDo6SDJCQ29udmVydGVyOwordXNpbmcgSENhbWVyYURldmljZUNhbGxiYWNrID0gY2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Rm1xU2l6ZU9yTWV0YWRhdGE7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpCbkNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmU7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OworCitzdHJ1Y3QgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDoKKyAgICBwdWJsaWMgSDJCQ29udmVydGVyPEhDYW1lcmFEZXZpY2VDYWxsYmFjaywgSUNhbWVyYURldmljZUNhbGxiYWNrcywgQm5DYW1lcmFEZXZpY2VDYWxsYmFja3M+IHsKKyAgICBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSk7CisKKyAgICB+SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCk7CisKKyAgICBib29sIGluaXRpYWxpemVMb29wZXIoKTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25EZXZpY2VFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVzdWx0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhTmF0aXZlJiByZXN1bHQsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25QcmVwYXJlZChpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlcGVhdGluZ1JlcXVlc3RJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVxdWVzdFF1ZXVlRW1wdHkoKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtZXRhZGF0YVF1ZXVlKSB7CisgICAgICAgIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG1ldGFkYXRhUXVldWU7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICAvLyBXcmFwcGVyIHN0cnVjdCBzbyB0aGF0IHBhcmFtZXRlcnMgdG8gb25SZXN1bHRSZWNlaXZlZCBjYWxsYmFjayBtYXkgYmUKKyAgICAvLyBzZW50IHRocm91Z2ggYW4gQU1lc3NhZ2UuCisgICAgc3RydWN0IFJlc3VsdFdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhTmF0aXZlIG1SZXN1bHQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgbVJlc3VsdEV4dHJhczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgICAgICBSZXN1bHRXcmFwcGVyKENhbWVyYU1ldGFkYXRhTmF0aXZlICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSA6CisgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc3RkOjptb3ZhYmxlCisgICAgICBtUmVzdWx0KHJlc3VsdCksIG1SZXN1bHRFeHRyYXMocmVzdWx0RXh0cmFzKSwgbVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7IH0KKyAgICB9OworCisgICAgc3RydWN0IENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyAqY29udmVydGVyKSA6IG1Db252ZXJ0ZXIoY29udmVydGVyKSB7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcHJvY2Vzc1Jlc3VsdE1lc3NhZ2Uoc3A8UmVzdWx0V3JhcHBlcj4gJnJlc3VsdFdyYXBwZXIpOworICAgICAgICAgICAgd3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBtQ29udmVydGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIE11dGV4IG1NZXRhZGF0YVF1ZXVlTG9jazsKKyAgICB9OworCisgICAgdm9pZCBjb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhICpyYXdNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YSAqcmVzdWx0TWV0YWRhdGEpOworICAgIGVudW0geworICAgICAgICBrV2hhdFJlc3VsdFJlY2VpdmVkLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa1Jlc3VsdEtleTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyID0gbnVsbHB0cjsKKyAgICBzcDxBTG9vcGVyPiBtQ2JMb29wZXIgPSBudWxscHRyOworfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBlZjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXM7CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgeworICBIQ2FtZXJhRGV2aWNlU3RhdHVzIGhDYW1lcmFEZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1cyk7CisgIENhbWVyYVN0YXR1c0FuZElkIGNhbWVyYVN0YXR1c0FuZElkOworICBjYW1lcmFTdGF0dXNBbmRJZC5kZXZpY2VTdGF0dXMgPSBoQ2FtZXJhRGV2aWNlU3RhdHVzOworICBjYW1lcmFTdGF0dXNBbmRJZC5jYW1lcmFJZCA9IFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpOworICBhdXRvIHJldCA9IG1CYXNlLT5vblN0YXR1c0NoYW5nZWQoY2FtZXJhU3RhdHVzQW5kSWQpOworICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlcyBPblN0YXR1c0NoYW5nZWQgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCis6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgaW50MzJfdCwgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYpIHsKKyAgLy8gV2UgZG9uJ3QgaW1wbGVtZW50IG9uVG9yY2hTdGF0dXNDaGFuZ2VkCisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGNvbW1vbgorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkxNDNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CcENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxoaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Qm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBoYXJkd2FyZTo6QnBDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBjYW1lcmFoeWJyaWQ6OkgyQkNvbnZlcnRlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit0eXBlZGVmIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgSENhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKKworc3RydWN0IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lciA6CisgICAgcHVibGljIEgyQkNvbnZlcnRlcjxIQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBJQ2FtZXJhU2VydmljZUxpc3RlbmVyLCBCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4geworICAgIEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IENCYXNlKGJhc2UpIHsgfQorCisgICAgfkgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcigpIHsgfQorCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uU3RhdHVzQ2hhbmdlZChpbnQzMl90IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSBvdmVycmlkZTsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBzZXJ2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYwMTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmFoeWJyaWQgewordHlwZWRlZiA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIEhJbnRlcmZhY2U7CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRSA+CitjbGFzcyBIMkJDb252ZXJ0ZXIgOiBwdWJsaWMgQk5JTlRFUkZBQ0UgeworcHVibGljOgorICAgIHR5cGVkZWYgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+IENCYXNlOyAvLyBDb252ZXJ0ZXIgQmFzZQorICAgIHR5cGVkZWYgSU5URVJGQUNFIEJhc2VJbnRlcmZhY2U7CisgICAgdHlwZWRlZiBISU5URVJGQUNFIEhhbEludGVyZmFjZTsKKworICAgIEgyQkNvbnZlcnRlcihjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKSA6IG1CYXNlKGJhc2UpIHt9CisgICAgdmlydHVhbCBzcDxIYWxJbnRlcmZhY2U+IGdldEhhbEludGVyZmFjZSgpIHsgcmV0dXJuIG1CYXNlOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICAgICAgdm9pZCogY29va2llID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAorICAgICAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQgPSBudWxscHRyKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEhhbEludGVyZmFjZT4gbUJhc2U7CisgICAgc3RydWN0IE9iaXR1YXJ5IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQ7CisgICAgICAgIHZvaWQqIGNvb2tpZTsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgIHdwPElCaW5kZXI+IHdobzsKKyAgICAgICAgT2JpdHVhcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByLAorICAgICAgICAgICAgICAgIHZvaWQqIGMsIHVpbnQzMl90IGYsCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIHcpIDoKKyAgICAgICAgICAgIHJlY2lwaWVudChyKSwgY29va2llKGMpLCBmbGFncyhmKSwgd2hvKHcpIHsKKyAgICAgICAgfQorICAgICAgICBPYml0dWFyeShjb25zdCBPYml0dWFyeSYgbykgOgorICAgICAgICAgICAgcmVjaXBpZW50KG8ucmVjaXBpZW50KSwKKyAgICAgICAgICAgIGNvb2tpZShvLmNvb2tpZSksCisgICAgICAgICAgICBmbGFncyhvLmZsYWdzKSwKKyAgICAgICAgICAgIHdobyhvLndobykgeworICAgICAgICB9CisgICAgICAgIE9iaXR1YXJ5JiBvcGVyYXRvcj0oY29uc3QgT2JpdHVhcnkmIG8pIHsKKyAgICAgICAgICAgIHJlY2lwaWVudCA9IG8ucmVjaXBpZW50OworICAgICAgICAgICAgY29va2llID0gby5jb29raWU7CisgICAgICAgICAgICBmbGFncyA9IG8uZmxhZ3M7CisgICAgICAgICAgICB3aG8gPSBvLndobzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90LCBjb25zdCB3cDxISW50ZXJmYWNlPiYpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiBkciA9IHJlY2lwaWVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGRyLT5iaW5kZXJEaWVkKHdobyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIHN0ZDo6bXV0ZXggbU9iaXR1YXJpZXNMb2NrOworICAgIHN0ZDo6dmVjdG9yPHNwPE9iaXR1YXJ5PiA+IG1PYml0dWFyaWVzOworfTsKKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFPgorc3RhdHVzX3QgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+OjoKKyAgICAgICAgbGlua1RvRGVhdGgoCisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZWNpcGllbnQgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICJsaW5rVG9EZWF0aCgpOiByZWNpcGllbnQgbXVzdCBiZSBub24tbnVsbHB0ciIpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU9iaXR1YXJpZXNMb2NrKTsKKyAgICAgICAgbU9iaXR1YXJpZXMucHVzaF9iYWNrKG5ldyBPYml0dWFyeShyZWNpcGllbnQsIGNvb2tpZSwgZmxhZ3MsIHRoaXMpKTsKKyAgICAgICAgaWYgKCFtQmFzZS0+bGlua1RvRGVhdGgobU9iaXR1YXJpZXMuYmFjaygpLCAwKSkgeworICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0U+CitzdGF0dXNfdCBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT46OgorICAgICAgICB1bmxpbmtUb0RlYXRoKAorICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+KiBvdXRSZWNpcGllbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT2JpdHVhcmllc0xvY2spOworICAgIGZvciAoYXV0byBpID0gbU9iaXR1YXJpZXMuYmVnaW4oKTsgaSAhPSBtT2JpdHVhcmllcy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmICgoZmxhZ3MgPSAoKmkpLT5mbGFncykgJiYgKAorICAgICAgICAgICAgICAgIChyZWNpcGllbnQgPT0gKCppKS0+cmVjaXBpZW50KSB8fAorICAgICAgICAgICAgICAgICgocmVjaXBpZW50ID09IG51bGxwdHIpICYmIChjb29raWUgPT0gKCppKS0+Y29va2llKSkpKSB7CisgICAgICAgICAgICBpZiAob3V0UmVjaXBpZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqb3V0UmVjaXBpZW50ID0gKCppKS0+cmVjaXBpZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gbUJhc2UtPnVubGlua1RvRGVhdGgoKmkpOworICAgICAgICAgICAgbU9iaXR1YXJpZXMuZXJhc2UoaSk7CisgICAgICAgICAgICByZXR1cm4gc3VjY2VzcyA/IE5PX0VSUk9SIDogREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworfQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmFoeWJyaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MmNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgdXRpbHMgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOmF0dGVtcHQgdG8gY29udmVydCBlbXB0eSBtZXRhZGF0YSB0byBIaWRsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUpOworICAgIHJldHVybjsKK30KKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKSB7CisgICAgc3dpdGNoIChzdHJlYW1Db25maWd1cmF0aW9uTW9kZSkgeworICAgICAgICBjYXNlIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU7CisgICAgICAgIGNhc2UgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Tk9STUFMX01PREU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBUT0RPOiBGaXggdGhpcworICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpWRU5ET1JfTU9ERV9TVEFSVDsKKyAgICB9Cit9CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhUZW1wbGF0ZUlkIHRlbXBsYXRlSWQpIHsKKyAgICBzd2l0Y2godGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpQUkVWSUVXOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9QUkVWSUVXOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpTVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9TVElMTF9DQVBUVVJFOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpSRUNPUkQ6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1JFQ09SRDsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6VklERU9fU05BUFNIT1Q6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpaRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpNQU5VQUw6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX01BTlVBTDsKKyAgICB9Cit9CisKK2ludCBjb252ZXJ0RnJvbUhpZGwoSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uIHJvdGF0aW9uKSB7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjkwOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMTgwOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMjcwOgorICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgfQorfQorCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiAmaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gaUdCUHM7CisgICAgYXV0byAmd2luZG93SGFuZGxlcyA9IGhPdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgaUdCUHMucmVzZXJ2ZSh3aW5kb3dIYW5kbGVzLnNpemUoKSk7CisgICAgZm9yIChhdXRvICZoYW5kbGUgOiB3aW5kb3dIYW5kbGVzKSB7CisgICAgICAgIGlHQlBzLnB1c2hfYmFjayhuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShoYW5kbGUpKSk7CisgICAgfQorICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaUdCUHMsIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbi5yb3RhdGlvbiksCisgICAgICAgIGhPdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0dyb3VwSWQsIE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9VTktOT1dOLCAwLCAwLAorICAgICAgICAod2luZG93SGFuZGxlcy5zaXplKCkgPiAxKSk7CisgICAgcmV0dXJuIG91dHB1dENvbmZpZ3VyYXRpb247Cit9CisKKy8vIFRoZSBjYW1lcmEgbWV0YWRhdGEgaGVyZSBpcyBjbG9uZWQuIFNpbmNlIHdlJ3JlIHJlYWRpbmcgbWV0YWRhdGEgb3ZlcgorLy8gaHdiaW5kZXIgd2Ugd291bGQgbmVlZCB0byBjbG9uZSBpdCBpbiBvcmRlciB0byBhdm9pZCBhbGlnbWVudCBpc3N1ZXMuCitib29sIGNvbnZlcnRGcm9tSGlkbChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJnNyYywgQ2FtZXJhTWV0YWRhdGEgKmRzdCkgeworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4oc3JjLmRhdGEoKSk7CisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHNyYy5zaXplKCk7CisgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICpkc3QgPSBidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitIQ2FtZXJhRGV2aWNlU3RhdHVzIGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoaW50MzJfdCBzdGF0dXMpIHsKKyAgICBIQ2FtZXJhRGV2aWNlU3RhdHVzIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19VTktOT1dOOworICAgIHN3aXRjaChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlU3RhdHVzOworfQorCitIQ2FwdHVyZVJlc3VsdEV4dHJhcyBjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmNhcHR1cmVSZXN1bHRFeHRyYXMpIHsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhczsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5idXJzdElkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkOworICAgIHJldHVybiBoQ2FwdHVyZVJlc3VsdEV4dHJhczsKK30KKworSEVycm9yQ29kZSBjb252ZXJ0VG9IaWRsKGludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgc3dpdGNoKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFIDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9TRVJWSUNFOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9SRVFVRVNUOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVI7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ESVNBQkxFRDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfSU5WQUxJRF9FUlJPUjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfVU5LTk9XTl9FUlJPUjsKKyAgICB9Cit9CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAmc3JjLAorICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4qIGRzdCkgeworICAgIGRzdC0+cmVzaXplKHNyYy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGF1dG8gJnN0YXR1c0FuZElkIDogc3JjKSB7CisgICAgICAgIGF1dG8gJmEgPSAoKmRzdClbaSsrXTsKKyAgICAgICAgYS5jYW1lcmFJZCA9IHN0YXR1c0FuZElkLmNhbWVyYUlkLmNfc3RyKCk7CisgICAgICAgIGEuZGV2aWNlU3RhdHVzID0gY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhzdGF0dXNBbmRJZC5zdGF0dXMpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gJnN1Ym1pdEluZm8sCisgICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvICpoU3VibWl0SW5mbykgeworICAgIGhTdWJtaXRJbmZvLT5yZXF1ZXN0SWQgPSBzdWJtaXRJbmZvLm1SZXF1ZXN0SWQ7CisgICAgaFN1Ym1pdEluZm8tPmxhc3RGcmFtZU51bWJlciA9IHN1Ym1pdEluZm8ubUxhc3RGcmFtZU51bWJlcjsKK30KKworSFN0YXR1cyBCMkhTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJmJTdGF0dXMpIHsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmIChiU3RhdHVzLmlzT2soKSkgeworICAgICAgICAvLyBOTyBFcnJvciBoZXJlCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN3aXRjaChiU3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpESVNDT05ORUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0NBTUVSQV9JTl9VU0U6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpDQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9NQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ERVBSRUNBVEVEX0hBTDoKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgcmVhY2ggaGVyZSBzaW5jZSB3ZSBmaWx0ZXJlZCBsZWdhY3kgSEFMcyBlYXJsaWVyCisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpERVBSRUNBVEVEX0hBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQUJMRUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpESVNBQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6VU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKSB7CisgICAgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CisgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFJZCA9CisgICAgICAgIFN0cmluZzgocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5tUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCk7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0KKyAgICAgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgLy8gVHJ5IHVzaW5nIGZtcSBhdCBmaXJzdC4KKyAgICBzaXplX3QgbWV0YWRhdGFfc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyYXdNZXRhZGF0YSk7CisgICAgaWYgKChtZXRhZGF0YV9zaXplID4gMCkgJiYgKGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPiAwKSkgeworICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPndyaXRlKCh1aW50OF90ICopcmF3TWV0YWRhdGEsIG1ldGFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYU1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZShtZXRhZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBDb3VsZG4ndCB1c2UgZm1xLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICAgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJm1ldGFkYXRhKTsKKyAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEubWV0YWRhdGEoc3RkOjptb3ZlKG1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK30KKworaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKSB7CisgICAgaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MucmVzaXplKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA6IHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7CisgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvc1tpKytdID0gY29udmVydFRvSGlkbChwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworICAgIH0KKyAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworfQorCit9IC8vY29udmVyc2lvbgorfSAvLyB1dGlscworfSAvL2NhbWVyYXNlcnZpY2UKK30gLy8gaGFyZHdhcmUKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkzN2EzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBU0VSVkVSX0NPTlZFUlRfSElETAorI2RlZmluZSBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgdXRpbHMgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworCit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIEhDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSEVycm9yQ29kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6RXJyb3JDb2RlOwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBIT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIEhQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBIU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBIVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KTsKKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKTsKKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFRlbXBsYXRlSWQgdGVtcGxhdGVJZCk7CisKK2Jvb2wgY29udmVydEZyb21IaWRsKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmc3JjLCBDYW1lcmFNZXRhZGF0YSAqZHN0KTsKKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24gJmhPdXRwdXRDb25maWd1cmF0aW9uKTsKKworSENhbWVyYURldmljZVN0YXR1cyBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKGludDMyX3Qgc3RhdHVzKTsKKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KTsKKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICAgICAgICAgICAgICAgICBIU3VibWl0SW5mbyAqaFN1Ym1pdEluZm8pOworCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpOworCitIQ2FwdHVyZVJlc3VsdEV4dHJhcyBjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmNhcHR1cmVSZXN1bHRFeHRyYXMpOworCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cyk7CisKK30gLy8gY29udmVyc2lvbgorfSAvLyB1dGlscworfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGhhcmR3YXJlCit9IC8vYW5kcm9pZAorCisjZW5kaWYgLy9DQU1FUkFTRVJWRVJfQ09OVkVSVF9UT19ISURMCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydEZyb21IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBIU3VibWl0SW5mbyA9IGRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb247CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBDQU1FUkFfUkVRVUVTVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRSA9IDEgPDwgMjAgLyogMSBNQiAqLzsKKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpkaXNjb25uZWN0KCkgeworICAgIG1EZXZpY2VSZW1vdGUtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6SGlkbENhbWVyYURldmljZVVzZXIoCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiAmZGV2aWNlUmVtb3RlKQorICA6IG1EZXZpY2VSZW1vdGUoZGV2aWNlUmVtb3RlKSB7CisgICAgbUluaXRTdWNjZXNzID0gaW5pdERldmljZSgpOworfQorCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjppbml0RGV2aWNlKCkgeworICAgIC8vIFRPRE86IEdldCByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgcXVldWUgc2l6ZSBmcm9tIGEgc3lzdGVtIHByb3BlcnR5LgorICAgIGludDMyX3QgcmVxRk1RU2l6ZSA9IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkU7CisKKyAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0KKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU+KHN0YXRpY19jYXN0PHNpemVfdD4ocmVxRk1RU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCByZXF1ZXN0IGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc0ZNUVNpemUgPSBDQU1FUkFfUkVTVUxUX01FVEFEQVRBX1FVRVVFX1NJWkU7CisgICAgbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXNGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm9uIGJsb2NraW5nICovKTsKKyAgICBpZiAoIW1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCByZXN1bHQgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+Z2V0RGVzYygpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW5pdFN1Y2Nlc3MpIHsKKyAgICAgICAgX2hpZGxfY2IoKm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+Z2V0RGVzYygpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLyoqCisgKiBUbyBiZSB1c2VkIG9ubHkgYnkgc3VibWl0UmVxdWVzdExpc3QgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IHJlcXVpcmVzCisgKiBjbGllbnRzIHRvIGNhbGwgdGhpcyBtZXRob2Qgc2VyaWFsbHksIGluY2FzZSBmbXEgaXMgdXNlZCB0byBzZW5kIG1ldGFkYXRhLgorICovCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICBjb25zdCBoaWRsX3ZlYzxIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gJmhQaHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgIHN0ZDo6dmVjdG9yPENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAqcGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgICAgZm9yIChhdXRvICZlIDogaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+ZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzICZwaHlzaWNhbENhbWVyYVNldHRpbmcgPQorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+YmFjaygpOworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmcuaWQgPSBlLmlkLmNfc3RyKCk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgc2V0dGluZ3MgZWl0aGVyIGZyb20gdGhlIGZtcSBvciBzdHJhaWdodGF3YXkgZnJvbSB0aGUKKyAgICAgICAgLy8gcmVxdWVzdC4gV2UgZG9uJ3QgbmVlZCBhbnkgc3luY2hyb25pemF0aW9uLCBzaW5jZSBzdWJtaXRSZXF1ZXN0TGlzdAorICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBzZXJpYWxseSBieSB0aGUgY2xpZW50IGlmIGl0IGRlY2lkZXMgdG8KKyAgICAgICAgLy8gdXNlIGZtcS4KKyAgICAgICAgaWYgKGUuc2V0dGluZ3MuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbXFNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogR2V0IHNldHRpbmdzIGZyb20gdGhlIGZtcS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIHNldHRpbmdzRm1xOworICAgICAgICAgICAgc2V0dGluZ3NGbXEucmVzaXplKGUuc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgYm9vbCByZWFkID0gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+cmVhZChzZXR0aW5nc0ZtcS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gY29udmVydEZyb21IaWRsKHNldHRpbmdzRm1xLCAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nLnNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHNldHRpbmdzIG1ldGFkYXRhIGlzIGNvbnRhaW5lZCBpbiByZXF1ZXN0IHNldHRpbmdzIGZpZWxkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb252ZXJ0ZWQgPQorICAgICAgICAgICAgICAgIGNvbnZlcnRGcm9tSGlkbChlLnNldHRpbmdzLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICB9CisgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29udmVydCBwaHlzaWNhbENhbWVyYVNldHRpbmdzIGZyb20gSElETCB0byBBSURMLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGNvbnN0IEhDYXB0dXJlUmVxdWVzdCAmaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0ICpyZXF1ZXN0KSB7CisgICAgLy8gTm8gcmVwcm9jZXNzaW5nIHN1cHBvcnQuCisgICAgcmVxdWVzdC0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW1BbmRXaW5kb3dJZCA6IGhSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcykgeworICAgICAgICByZXF1ZXN0LT5tU3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQuc3RyZWFtSWQpOworICAgICAgICByZXF1ZXN0LT5tU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKGhSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocmVxdWVzdC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiBoUmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdF9jYiBfaGlkbF9jYikgeworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBzdWJtaXRJbmZvOworICAgIEhTdWJtaXRJbmZvIGhTdWJtaXRJbmZvOworICAgIC8qKgorICAgICAqIENyZWF0ZSBBSURMIENhcHR1cmVSZXF1ZXN0IGZyb20gcmVxdWVzdExpc3QgYW5kIGdyYXBoaWNCdWZmZXJQcm9kdWNlcnMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0czsKKyAgICBmb3IgKGF1dG8gJmhSZXF1ZXN0IDogaFJlcXVlc3RMaXN0KSB7CisgICAgICAgIHJlcXVlc3RzLmVtcGxhY2VfYmFjaygpOworICAgICAgICBhdXRvICZyZXF1ZXN0ID0gcmVxdWVzdHMuYmFjaygpOworICAgICAgICBpZiAoIWNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoaFJlcXVlc3QsICZyZXF1ZXN0KSkgeworICAgICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwgaFN1Ym1pdEluZm8pOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRGV2aWNlUmVtb3RlLT5zdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0cywgc3RyZWFtaW5nLCAmc3VibWl0SW5mbyk7CisgICAgbVJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBjb252ZXJ0VG9IaWRsKHN1Ym1pdEluZm8sICZoU3VibWl0SW5mbyk7CisgICAgX2hpZGxfY2IoSFN0YXR1czo6Tk9fRVJST1IsIGhTdWJtaXRJbmZvKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoY2FuY2VsUmVwZWF0aW5nUmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jYW5jZWxSZXF1ZXN0KG1SZXF1ZXN0SWQsICZsYXN0RnJhbWVOdW1iZXIpOworICAgIF9oaWRsX2NiKEIySFN0YXR1cyhyZXQpLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6YmVnaW5Db25maWd1cmUoKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+YmVnaW5Db25maWd1cmUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcykgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIGlmICghY29udmVydEZyb21IaWRsKHNlc3Npb25QYXJhbXMsICZjYW1lcmFNZXRhZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZW5kQ29uZmlndXJlKGNvbnZlcnRGcm9tSGlkbChvcGVyYXRpbmdNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWV0YWRhdGEpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpkZWxldGVTdHJlYW0oaW50MzJfdCBzdHJlYW1JZCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgaGlkbF9jYl8pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPQorICAgICAgICBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGludDMyX3QgbmV3U3RyZWFtSWQgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRDb25maWd1cmF0aW9uLCAmbmV3U3RyZWFtSWQpOworICAgIEhTdGF0dXMgc3RhdHVzID0gQjJIU3RhdHVzKHJldCk7CisgICAgaGlkbF9jYl8oc3RhdHVzLCBuZXdTdHJlYW1JZCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChUZW1wbGF0ZUlkIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoY29udmVydEZyb21IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFNZXRhZGF0YSk7CisgICAgSFN0YXR1cyBoU3RhdHVzID0gQjJIU3RhdHVzKHJldCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2IoaFN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICBjYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6d2FpdFVudGlsSWRsZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT53YWl0VW50aWxJZGxlKCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmZsdXNoKCZsYXN0RnJhbWVOdW1iZXIpOworICAgIF9oaWRsX2NiKEIySFN0YXR1cyhyZXQpLGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKAorICAgIGludDMyX3Qgc3RyZWFtSWQsCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIGhPdXRwdXRDb25maWd1cmF0aW9uKSB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uID0gY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZThmMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBREVWSUNFVVNFUl9WMl8wX0NBTUVSQURFVklDRVVTRVJfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBREVWSUNFVVNFUl9WMl8wX0NBTUVSQURFVklDRVVTRVJfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIGhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyBoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7CisKK3VzaW5nIEhDYW1lcmFEZXZpY2VVc2VyID0gZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhcHR1cmVSZXF1ZXN0ID0gZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKworc3RydWN0IEhpZGxDYW1lcmFEZXZpY2VVc2VyIGZpbmFsIDogcHVibGljIEhDYW1lcmFEZXZpY2VVc2VyIHsKKyAgICBIaWRsQ2FtZXJhRGV2aWNlVXNlcihjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpOworCisgICAgfkhpZGxDYW1lcmFEZXZpY2VVc2VyKCkgeyB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgIGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gc3VibWl0UmVxdWVzdExpc3QoY29uc3QgaGlkbF92ZWM8SENhcHR1cmVSZXF1ZXN0PiYgcmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoY2FuY2VsUmVwZWF0aW5nUmVxdWVzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBiZWdpbkNvbmZpZ3VyZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgb3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3RyZWFtX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBjcmVhdGVEZWZhdWx0UmVxdWVzdChUZW1wbGF0ZUlkIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IHdhaXRVbnRpbElkbGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQsIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uKSBvdmVycmlkZTsKKworICAgIGJvb2wgaW5pdFN0YXR1cygpIHsgcmV0dXJuIG1Jbml0U3VjY2VzczsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICB9CisKKyBwcml2YXRlOgorICAgIGJvb2wgaW5pdERldmljZSgpOworCisgICAgYm9vbCBjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGNvbnN0IEhDYXB0dXJlUmVxdWVzdCAmaFJlcXVlc3QsIENhcHR1cmVSZXF1ZXN0ICpyZXF1ZXN0KTsKKworICAgIGJvb2wgY29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEhQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAmaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAqcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyk7CisKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+IG1EZXZpY2VSZW1vdGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIGJvb2wgbUluaXRTdWNjZXNzID0gZmFsc2U7CisgICAgaW50MzJfdCBtUmVxdWVzdElkID0gUkVRVUVTVF9JRF9OT05FOworfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorI2VuZGlmIC8vIEFORFJPSURfRlJBTUVPV09SS1NfQ0FNRVJBREVWSUNFVVNFUl9WMl8wX0NBTUVSQURFVklDRVVTRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGYxZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6QjJIU3RhdHVzOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIGRldmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkgyQkNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGRldmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgc2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YVR5cGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OkNhbWVyYU1ldGFkYXRhVHlwZTsKK3VzaW5nIEhWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKK3VzaW5nIEhWZW5kb3JUYWdTZWN0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWdTZWN0aW9uOwordXNpbmcgSFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyA9CisgICAgICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOworCitzcDxIaWRsQ2FtZXJhU2VydmljZT4gZ0hpZGxDYW1lcmFTZXJ2aWNlOworCitzcDxIaWRsQ2FtZXJhU2VydmljZT4gSGlkbENhbWVyYVNlcnZpY2U6OmdldEluc3RhbmNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKSB7CisgICAgZ0hpZGxDYW1lcmFTZXJ2aWNlID0gbmV3IEhpZGxDYW1lcmFTZXJ2aWNlKGNzKTsKKyAgICByZXR1cm4gZ0hpZGxDYW1lcmFTZXJ2aWNlOworfQorCitSZXR1cm48dm9pZD4KK0hpZGxDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NfY2IgX2hpZGxfY2IpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPQorICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksICZjYW1lcmFNZXRhZGF0YSk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICAgIHN3aXRjaChzZXJ2aWNlUmV0LnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKSB7CisgICAgICAgICAgICAvLyBObyBFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEIHNpbmNlIHdlJ3JlIGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBJRCAlcyBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VSZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gY2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZoaWRsTWV0YWRhdGEpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICBjYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZShjb25zdCBzcDxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBoQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3REZXZpY2VfY2IgX2hpZGxfY2IpIHsKKyAgICAvLyBIZXJlLCB3ZSBmaXJzdCBnZXQgSUNhbWVyYURldmljZVVzZXIgZnJvbSBtQWlkbElDYW1lcmFTZXJ2aWNlLCB0aGVuIHNhdmUKKyAgICAvLyB0aGF0IGludGVyZmFjZSBpbiB0aGUgbmV3bHkgY3JlYXRlZCBIaWRsQ2FtZXJhRGV2aWNlVXNlciBpbXBsIGNsYXNzLgorICAgIGlmIChtQWlkbElDYW1lcmFTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlID0gbnVsbHB0cjsKKyAgICAvLyBDcmVhdGUgYSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrIG9iamVjdCB3aGljaCBpbnRlcm5hbGx5CisgICAgLy8gY2FsbHMgY2FsbGJhY2sgZnVuY3Rpb25zIHBhc3NlZCB0aHJvdWdoIGhDYWxsYmFjay4KKyAgICBzcDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGh5YnJpZENhbGxiYWNrcyA9IG5ldyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoaENhbGxiYWNrKTsKKyAgICBpZiAoIWh5YnJpZENhbGxiYWNrcy0+aW5pdGlhbGl6ZUxvb3BlcigpKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaGFuZGxlIGNhbGxiYWNrcyBvbiBkZXZpY2UsIGNhbm5vdCBjb25uZWN0Iik7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2FsbGJhY2tzID0gaHlicmlkQ2FsbGJhY2tzOworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPSBtQWlkbElDYW1lcmFTZXJ2aWNlLT5jb25uZWN0RGV2aWNlKAorICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgU3RyaW5nMTYoIiIpLAorICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIC8qb3V0Ki8mZGV2aWNlUmVtb3RlKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBOb3cgd2UgY3JlYXRlIGEgSGlkbENhbWVyYURldmljZVVzZXIgY2xhc3MsIHN0b3JlIHRoZSBkZXZpY2VSZW1vdGUgaW4gaXQsCisgICAgLy8gYW5kIHJldHVybiB0aGF0IGJhY2suIEFsbCBjYWxscyBvbiB0aGF0IGludGVyZmFjZSB3aWxsIGJlIGZvcndhcmRlZCB0bworICAgIC8vIHRoZSBBSURMIGludGVyZmFjZS4KKyAgICBzcDxIaWRsQ2FtZXJhRGV2aWNlVXNlcj4gaERldmljZVJlbW90ZSA9IG5ldyBIaWRsQ2FtZXJhRGV2aWNlVXNlcihkZXZpY2VSZW1vdGUpOworICAgIGlmICghaERldmljZVJlbW90ZS0+aW5pdFN0YXR1cygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIGRldmljZSBISURMIHdyYXBwZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaHlicmlkQ2FsbGJhY2tzLT5zZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZShoRGV2aWNlUmVtb3RlLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgpKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhEZXZpY2VSZW1vdGUpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgSGlkbENhbWVyYVNlcnZpY2U6OmFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVycy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIoaExpc3RlbmVyLCBjc0xpc3RlbmVyKSk7Cit9CisKK3NwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPgorSGlkbENhbWVyYVNlcnZpY2U6OnNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRSZW1vdmUpIHsKKyAgICAvLyBHbyB0aHJvdWdoIHRoZSBtTGlzdGVuZXJzIGxpc3QgYW5kIGNvbXBhcmUgdGhlIGxpc3RlbmVyIHdpdGggdGhlIEhJREwKKyAgICAvLyBsaXN0ZW5lciByZWdpc3RlcmVkLgorICAgIGF1dG8gaXQgPSBtTGlzdGVuZXJzLmJlZ2luKCk7CisgICAgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgZm9yICg7aXQgIT0gbUxpc3RlbmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoaGFyZHdhcmU6OmludGVyZmFjZXNFcXVhbChpdC0+Zmlyc3QsIGhMaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpdCAhPSBtTGlzdGVuZXJzLmVuZCgpKSB7CisgICAgICAgIGNzTGlzdGVuZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlKSB7CisgICAgICAgICAgbUxpc3RlbmVycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNzTGlzdGVuZXI7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGhDc0xpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtQWlkbElDYW1lcmFTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBpZiAoaENzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgbGlzdGVuZXIgbXVzdCBub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIC8vIENoZWNrIHRoZSBjYWNoZSBmb3IgcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrcworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxpc3RlbmVyTGlzdExvY2spOworICAgICAgICBjc0xpc3RlbmVyID0gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lcik7CisgICAgICAgIGlmIChjc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFdyYXAgYW4gaENzTGlzdGVuZXIgd2l0aCBBaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyIGFuZCBwYXNzIGl0IHRvCisgICAgICAgICAgICAvLyBDYW1lcmFTZXJ2aWNlLgorICAgICAgICAgICAgY3NMaXN0ZW5lciA9IG5ldyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoaENzTGlzdGVuZXIpOworICAgICAgICAgICAgLy8gQWRkIHRvIGNhY2hlCisgICAgICAgICAgICBhZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIsIGNzTGlzdGVuZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gYWRkIGEgbGlzdGVuZXIgJXAgYWxyZWFkeSByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaENzTGlzdGVuZXIuZ2V0KCkpOworICAgICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwge30pOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiBjYW1lcmFTdGF0dXNBbmRJZHN7fTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gbUFpZGxJQ2FtZXJhU2VydmljZS0+YWRkTGlzdGVuZXIoY3NMaXN0ZW5lciwgJmNhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgY2FtZXJhIGRldmljZSBzdGF0dXMgbGlzdGVuZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgX2hpZGxfY2Ioc3RhdHVzLCB7fSk7CisgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+IGhDYW1lcmFTdGF0dXNBbmRJZHM7CisgICAgLy9Db252ZXJ0IGNhbWVyYVN0YXR1c0FuZElkcyB0byBISURMIGFuZCBjYWxsIGNhbGxiYWNrCisgICAgY29udmVydFRvSGlkbChjYW1lcmFTdGF0dXNBbmRJZHMsICZoQ2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhDYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhU2VydmljZTo6cmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGhDc0xpc3RlbmVyKSB7CisgICAgaWYgKGhDc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGxpc3RlbmVyIG11c3Qgbm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisgICAgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqL3RydWUpOworICAgIH0KKyAgICBpZiAoY3NMaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+cmVtb3ZlTGlzdGVuZXIoY3NMaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzIFJlbW92aW5nIHVucmVnaXN0ZXJlZCBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgaENzTGlzdGVuZXIuZ2V0KCkpOworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisgICAgcmV0dXJuIEhTdGF0dXM6Ok5PX0VSUk9SOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zKGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBnQ2FjaGUgPSBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgaWYgKGdDYWNoZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4KKyAgICAgICAgICAgICZ2ZW5kb3JJZHNBbmRUYWdEZXNjcyA9IGdDYWNoZS0+Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAodmVuZG9ySWRzQW5kVGFnRGVzY3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIGhpZGxfdmVjPEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM+IGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9uczsKKyAgICBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnMucmVzaXplKHZlbmRvcklkc0FuZFRhZ0Rlc2NzLnNpemUoKSk7CisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoYXV0byAmdmVuZG9ySWRBbmRUYWdEZXNjcyA6IHZlbmRvcklkc0FuZFRhZ0Rlc2NzKSB7CisgICAgICAgIGhpZGxfdmVjPEhWZW5kb3JUYWdTZWN0aW9uPiBoVmVuZG9yVGFnU2VjdGlvbnM7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSB2ZW5kb3JJZEFuZFRhZ0Rlc2NzLnNlY29uZDsKKyAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPFN0cmluZzg+KiBzZWN0aW9uTmFtZXMgPSBkZXNjLT5nZXRBbGxTZWN0aW9uTmFtZXMoKTsKKyAgICAgICAgc2l6ZV90IG51bVNlY3Rpb25zID0gc2VjdGlvbk5hbWVzLT5zaXplKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhWZW5kb3JUYWc+PiB0YWdzQnlTZWN0aW9uKG51bVNlY3Rpb25zKTsKKyAgICAgICAgaW50IHRhZ0NvdW50ID0gZGVzYy0+Z2V0VGFnQ291bnQoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3ModGFnQ291bnQpOworICAgICAgICBkZXNjLT5nZXRUYWdBcnJheSh0YWdzLmRhdGEoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7IGkrKykgeworICAgICAgICAgICAgSFZlbmRvclRhZyB2dDsKKyAgICAgICAgICAgIHZ0LnRhZ0lkID0gdGFnc1tpXTsKKyAgICAgICAgICAgIHZ0LnRhZ05hbWUgPSBkZXNjLT5nZXRUYWdOYW1lKHRhZ3NbaV0pOworICAgICAgICAgICAgdnQudGFnVHlwZSA9IChIQ2FtZXJhTWV0YWRhdGFUeXBlKSBkZXNjLT5nZXRUYWdUeXBlKHRhZ3NbaV0pOworICAgICAgICAgICAgc3NpemVfdCBzZWN0aW9uSWR4ID0gZGVzYy0+Z2V0U2VjdGlvbkluZGV4KHRhZ3NbaV0pOworICAgICAgICAgICAgdGFnc0J5U2VjdGlvbltzZWN0aW9uSWR4XS5wdXNoX2JhY2sodnQpOworICAgICAgICB9CisgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9ucy5yZXNpemUobnVtU2VjdGlvbnMpOworICAgICAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IG51bVNlY3Rpb25zOyBzKyspIHsKKyAgICAgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS5zZWN0aW9uTmFtZSA9ICgqc2VjdGlvbk5hbWVzKVtzXS5zdHJpbmcoKTsKKyAgICAgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS50YWdzID0gdGFnc0J5U2VjdGlvbltzXTsKKyAgICAgICAgfQorICAgICAgICBIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zICZoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zID0KKyAgICAgICAgICAgICAgICBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnNbal07CisgICAgICAgIGhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMucHJvdmlkZXJJZCA9IHZlbmRvcklkQW5kVGFnRGVzY3MuZmlyc3Q7CisgICAgICAgIGhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMudmVuZG9yVGFnU2VjdGlvbnMgPSBzdGQ6Om1vdmUoaFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICAgICAgaisrOworICAgIH0KKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZDBiYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47CisKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgSENhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKworc3RydWN0IEhpZGxDYW1lcmFTZXJ2aWNlIGZpbmFsIDogcHVibGljIEhDYW1lcmFTZXJ2aWNlIHsKKworICAgIH5IaWRsQ2FtZXJhU2VydmljZSgpIHsgfTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyLjA6OklDYW1lcmFTZXJ2aWNlIGZvbGxvdy4KKworICAgIFJldHVybjx2b2lkPiBjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gYWRkTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48SFN0YXR1cz4gcmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIGNhbWVyYXNlcnZlcnMgbWFpbiB0aHJlYWQgdG8KKyAgICAvLyBpbnN0YW50aWF0ZSB0aGUgaGlkbCBjYW1lcmFzZXJ2ZXIuCisgICAgc3RhdGljIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcyk7CisKK3ByaXZhdGU6CisgICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeyB9OworCisgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoCisgICAgICAgIHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqLyBib29sIHNob3VsZFJlbW92ZSA9IGZhbHNlKTsKKworICAgIHZvaWQgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcik7CisKKyAgICBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjb25zdCBtQWlkbElDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKKworICAgIE11dGV4IG1MaXN0ZW5lckxpc3RMb2NrOworCisgICAgdXNpbmcgSElMaXN0ZW5lcnMgPQorICAgICAgICBzdGQ6OnBhaXI8c3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4sIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PjsKKyAgICBzdGQ6Omxpc3Q8SElMaXN0ZW5lcnM+IG1MaXN0ZW5lcnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2Ugc2VydmljZQorfSAgLy8gbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBmcmFtZXdvcmtzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawppbmRleCBmNzcwNjljLi5hZDk5NjNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTMwLDcgKzMwLDggQEAKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40CiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKQEAgLTM4LDYgKzM5LDcgQEAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCBlZjkzZDlhLi4wMDg2YzZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgICAgIG1UZXN0Q2FtZXJhUHJvdmlkZXIgPSBwcm92aWRlcjsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lczsKIAogICAgIHZpcnR1YWwgflRlc3RJbnRlcmFjdGlvblByb3h5KCkge30KIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAKICAgICB2aXJ0dWFsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGdldFNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUpIG92ZXJyaWRlIHsKLSAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5wdXNoX2JhY2soc2VydmljZU5hbWUpOwogICAgICAgICByZXR1cm4gbVRlc3RDYW1lcmFQcm92aWRlcjsKICAgICB9CiAKQEAgLTIxMCw5ICsyMTAsMTggQEAKICAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUoc3RhdHVzTGlzdGVuZXIsICZzZXJ2aWNlUHJveHkpOwogICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbWFuYWdlciI7CiAKLSAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgbGVnYWN5SW5zdGFuY2VOYW1lID0gImxlZ2FjeS8wIjsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIGxlZ2FjeUluc3RhbmNlTmFtZSkgPDwKKyAgICBzdGQ6OnN0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOworICAgIHN0ZDo6c3RyaW5nIGV4dGVybmFsSW5zdGFuY2VOYW1lID0gImV4dGVybmFsLzAiOworICAgIGJvb2wgZ290TGVnYWN5ID0gZmFsc2U7CisgICAgYm9vbCBnb3RFeHRlcm5hbCA9IGZhbHNlOworICAgIGZvciAoYXV0byYgc2VydmljZU5hbWUgOiBzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IGxlZ2FjeUluc3RhbmNlTmFtZSkgZ290TGVnYWN5ID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IGV4dGVybmFsSW5zdGFuY2VOYW1lKSBnb3RFeHRlcm5hbCA9IHRydWU7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKGdvdExlZ2FjeSkgPDwKICAgICAgICAgICAgICJMZWdhY3kgaW5zdGFuY2Ugbm90IHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CisgICAgQVNTRVJUX1RSVUUoZ290RXh0ZXJuYWwpIDw8CisgICAgICAgICAgICAiRXh0ZXJuYWwgaW5zdGFuY2Ugbm90IHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lID0KICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CkBAIC0yMjEsNyArMjMwLDcgQEAKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwKICAgICAgICAgICAgIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwogCi0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIH0KIApAQCAtMjU1LDcgKzI2NCw3IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwogICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgc2VjdGlvbk5hbWVTZWNvbmQgPSAiU2Vjb25kVmVuZG9yVGVzdFNlY3Rpb24iOwpAQCAtMjczLDcgKzI4Miw3IEBACiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSA9ICJ0ZXN0Mi8wIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsCisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksCiAgICAgICAgICAgICAgIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCmluZGV4IDJhNjg5YzYuLjU0OTM1YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKQEAgLTE2Nyw2ICsxNjcsMzAgQEAKICAgICB9CiB9CiAKK1RFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIENsYW1wQ29uc2lzdGVuY3kpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBzdGQ6OmFycmF5PGludDMyX3QsIDQ+IGFjdGl2ZUFycmF5ID0gezAsIDAsIDQwMzIsIDMwMjR9OworICAgIERpc3RvcnRpb25NYXBwZXIgbTsKKyAgICBzZXR1cFRlc3RNYXBwZXIoJm0sIGlkZW50aXR5RGlzdG9ydGlvbiwgdGVzdElDYWwsIC8qYWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCksCisgICAgICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSk7CisKKyAgICBhdXRvIHJlY3RzT3JpZyA9IGFjdGl2ZUFycmF5OworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShhY3RpdmVBcnJheVtpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9CisKKyAgICByZXMgPSBtLm1hcFJhd1JlY3RUb0NvcnJlY3RlZChhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorfQorCiBURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBTaW1wbGVUcmFuc2Zvcm0pIHsKICAgICBzdGF0dXNfdCByZXM7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWUzNDRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ2FtZXJhVGhyZWFkU3RhdGUuaCIKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKK30KKworaW50IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgeworICAgIGlmIChoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworfQorCitpbnQ2NF90IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworfQorCit2b2lkIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGludDY0X3QgdG9rZW4pIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgfQorICAgIHJldHVybjsKK30KKworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE3MGRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBDYW1lcmFUaHJlYWRTdGF0ZSB7CitwdWJsaWM6CisgIHN0YXRpYyBpbnQ2NF90IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisKKyAgc3RhdGljIHZvaWQgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKTsKKworICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKKworICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKK307CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBjMGEzNTNmLi5mNGM0OWVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtNDksNyArNDksOCBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Nb25pdG9yTXV0ZXgpOwogCiAgICAgLy8gRXhwYW5kIHNob3J0aGFuZHMKLSAgICBpZiAoc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpICE9IC0xKSB7CisgICAgc3NpemVfdCBpZHggPSB0YWdOYW1lcy5maW5kKCIzYSIpOworICAgIGlmIChpZHggIT0gLTEpIHsKICAgICAgICAgc3NpemVfdCBlbmQgPSB0YWdOYW1lcy5maW5kKCIsIiwgaWR4KTsKICAgICAgICAgY2hhciogc3RhcnQgPSB0YWdOYW1lcy5sb2NrQnVmZmVyKHRhZ05hbWVzLnNpemUoKSk7CiAgICAgICAgIHN0YXJ0W2lkeF0gPSAnXDAnOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNGIwNTM5NS4uYWU4MzJiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtODAsMTEgKzgxLDE4IEBACiAgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNvbnRlbnQ6OnBtOwogCiAvLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnk6IGFnZSBvciBjb3VudAotLy8gYWdlOiA8PSAzNiBob3VycyAoMS41IGRheXMpCisvLyBhZ2U6IDw9IDI4IGhvdXJzICgxIDEvNiBkYXlzKQogLy8gY291bnQ6IGhhcmQgbGltaXQgb2YgIyByZWNvcmRzCiAvLyAoMCBmb3IgZWl0aGVyIG9mIHRoZXNlIGRpc2FibGVzIHRoYXQgdGhyZXNob2xkKQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heFJlY29yZEFnZU5zID0gIDM2ICogMzYwMCAqICgxMDAwKjEwMDAqMTAwMGxsKTsKLXN0YXRpYyBjb25zdCBpbnQga01heFJlY29yZHMgICAgPSAwOworLy8KK3N0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMjggKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFJlY29yZHMgICAgPSAwOworCisvLyBtYXggd2UgZXhwaXJlIGluIGEgc2luZ2xlIGNhbGwsIHRvIGNvbnN0cmFpbiBob3cgbG9uZyB3ZSBob2xkIHRoZQorLy8gbXV0ZXgsIHdoaWNoIGFsc28gY29uc3RyYWlucyBob3cgbG9uZyBhIGNsaWVudCBtaWdodCB3YWl0Lgorc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEV4cGlyZWRBdE9uY2UgPSA1MDsKKworLy8gVE9ETzogbmVlZCB0byBsb29rIGF0IHR1bmluZyBrTWF4UmVjb3JkcyBhbmQgZnJpZW5kcyBmb3IgbG93LW1lbW9yeSBkZXZpY2VzCiAKIHN0YXRpYyBjb25zdCBjaGFyICprU2VydmljZU5hbWUgPSAibWVkaWEubWV0cmljcyI7CiAKQEAgLTk2LDYgKzEwNCw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Ok1lZGlhQW5hbHl0aWNzU2VydmljZSgpCiAgICAgICAgIDogbU1heFJlY29yZHMoa01heFJlY29yZHMpLAogICAgICAgICAgIG1NYXhSZWNvcmRBZ2VOcyhrTWF4UmVjb3JkQWdlTnMpLAorICAgICAgICAgIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZShrTWF4RXhwaXJlZEF0T25jZSksCiAgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSwKICAgICAgICAgICBtRHVtcFByb3RvRGVmYXVsdChNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSB7CiAKQEAgLTQzMiwyMyArNDQxLDI5IEBACiAvLwogLy8gT3VyIENoZWFwIGluLWNvcmUsIG5vbi1wZXJzaXN0ZW50IHJlY29yZHMgbWFuYWdlbWVudC4KIAotLy8gaW5zZXJ0IGFwcHJvcHJpYXRlbHkgaW50byBxdWV1ZQotdm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0pCisKKy8vIHdlIGhvbGQgbUxvY2sgd2hlbiB3ZSBnZXQgaGVyZQorLy8gaWYgaXRlbSAhPSBOVUxMLCBpdCdzIHRoZSBpdGVtIHdlIGp1c3QgaW5zZXJ0ZWQKKy8vIHRydWUgPT0gbW9yZSBpdGVtcyBlbGlnaWJsZSB0byBiZSByZWNvdmVyZWQKK2Jvb2wgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpleHBpcmF0aW9uc19sKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCi0KLSAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAotICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisgICAgYm9vbCBtb3JlID0gZmFsc2U7CisgICAgaW50IGhhbmRsZWQgPSAwOwogCiAgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKKyAgICAvLyBzaW5jZSB3ZSBpbnZva2UgdGhpcyB3aXRoIGVhY2ggaW5zZXJ0aW9uLCBpdCBzaG91bGQgYmUgMC8xIGl0ZXJhdGlvbnMuCiAgICAgaWYgKG1NYXhSZWNvcmRzID4gMCkgewogICAgICAgICB3aGlsZSAobUl0ZW1zLnNpemUoKSA+IChzaXplX3QpIG1NYXhSZWNvcmRzKSB7CiAgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgaWYgKG9pdGVtID09IGl0ZW0pIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHVubGlrZWx5IGluIHRoaXMgbG9vcAorICAgICAgICAgICAgICAgIG1vcmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCsrOwogICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwpAQCAtNDU2LDggKzQ3MSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBrZWVwIHJlbW92aW5nIG9sZCByZWNvcmRzIHRoZSBmcm9udCB1bnRpbCB3ZSdyZSBpbi1ib3VuZHMgKGNvdW50KQotICAgIC8vIE5COiBleHBpcmVkIGVudHJpZXMgYXJlbid0IHJlbW92ZWQgdW50aWwgdGhlIG5leHQgaW5zZXJ0aW9uLCB3aGljaCBjb3VsZCBiZSBhIHdoaWxlCisgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChhZ2UpCisgICAgLy8gbGltaXRlZCB0byBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UgaXRlbXMgcGVyIGludm9jYXRpb24uCiAgICAgaWYgKG1NYXhSZWNvcmRBZ2VOcyA+IDApIHsKICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAwKSB7CkBAIC00NzEsMTggKzQ4Niw3MiBAQAogICAgICAgICAgICAgICAgIC8vIHRoaXMgKGFuZCB0aGUgcmVzdCkgYXJlIHJlY2VudCBlbm91Z2ggdG8ga2VlcAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZWQgPj0gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXByZXNlbnRzICJvbmUgdG9vIG1hbnkiOyB0ZWxsIGNhbGxlciB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAvLyBtb3JlIHRvIGJlIHJlY2xhaW1lZC4KKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZEV4cGlyZSsrOwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gd2Ugb25seSBpbmRpY2F0ZSB3aGV0aGVyIHRoZXJlJ3MgbW9yZSB0byBjbGVhbjsKKyAgICAvLyBjYWxsZXIgY2hvb3NlcyB3aGV0aGVyIHRvIHNjaGVkdWxlIGZ1cnRoZXIgY2xlYW51cC4KKyAgICByZXR1cm4gbW9yZTsKK30KKworLy8gcHJvY2VzcyBleHBpcmF0aW9ucyBpbiBiaXRlIHNpemVkIGNodW5rcywgYWxsb3dpbmcgbmV3IGluc2VydGlvbnMgdGhyb3VnaAorLy8gcnVucyBpbiBhIHB0aHJlYWQgc3BlY2lmaWNhbGx5IHN0YXJ0ZWQgZm9yIHRoaXMgKHdoaWNoIHRoZW4gZXhpdHMpCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6cHJvY2Vzc0V4cGlyYXRpb25zKCkKK3sKKyAgICBib29sIG1vcmU7CisgICAgZG8geworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1vcmUgPSBleHBpcmF0aW9uc19sKE5VTEwpOworICAgICAgICAgICAgaWYgKCFtb3JlKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChtb3JlKTsKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgIC8vIHZhbHVlIGlzIGZvciBzdGQ6OmZ1dHVyZSB0aHJlYWQgc3luY2hyb25pemF0aW9uCit9CisKKy8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQoreworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBtdXRleCBiZXR3ZWVuIGluc2VydGlvbiBhbmQgZHVtcGluZyB0aGUgY29udGVudHMKKworICAgIC8vIHdlIHdhbnQgdG8gZHVtcCAnaW4gRklGTyBvcmRlcicsIHNvIGluc2VydCBhdCB0aGUgZW5kCisgICAgbUl0ZW1zLnB1c2hfYmFjayhpdGVtKTsKKworICAgIC8vIGNsZWFuIG9sZCBzdHVmZiBmcm9tIHRoZSBxdWV1ZQorICAgIGJvb2wgbW9yZSA9IGV4cGlyYXRpb25zX2woaXRlbSk7CisKKyAgICAvLyBjb25zaWRlciBzY2hlZHVsaW5nIHNvbWUgYXN5bmNocm9ub3VzIGNsZWFuaW5nLCBpZiBub3QgcnVubmluZworICAgIGlmIChtb3JlKSB7CisgICAgICAgIGlmICghbUV4cGlyZUZ1dHVyZS52YWxpZCgpCisgICAgICAgICAgICB8fCBtRXhwaXJlRnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDApKSA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7CisKKyAgICAgICAgICAgIG1FeHBpcmVGdXR1cmUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgW3RoaXNdKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gdGhpcy0+cHJvY2Vzc0V4cGlyYXRpb25zKCk7fSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBhbGxvd2VkS2V5c1tdID0KIHsKICAgICAiYXVkaW9wb2xpY3kiLAogICAgICJhdWRpb3JlY29yZCIsCisgICAgImF1ZGlvdGhyZWFkIiwKICAgICAiYXVkaW90cmFjayIsCiAgICAgImNvZGVjIiwKICAgICAiZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKaW5kZXggYjNjOTAyYS4uNjMyYzY5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCisjaW5jbHVkZSA8ZnV0dXJlPgorCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NCw2ICs0Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogCisgICAgYm9vbCBwcm9jZXNzRXhwaXJhdGlvbnMoKTsKKwogIHByaXZhdGU6CiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBnZW5lcmF0ZVVuaXF1ZVNlc3Npb25JRCgpOwogCkBAIC02NSw2ICs2OSw4IEBACiAgICAgaW50MzJfdCBtTWF4UmVjb3JkczsKICAgICAvLyBieSB0aW1lIChub25lIG9sZGVyIHRoYW4gdGhpcyBsb25nIGFnYW4KICAgICBuc2Vjc190IG1NYXhSZWNvcmRBZ2VOczsKKyAgICAvLyBtYXggdG8gZXhwaXJlIHBlciBleHBpcmF0aW9uc19sKCkgaW52b2NhdGlvbgorICAgIGludDMyX3QgbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlOwogICAgIC8vCiAgICAgLy8gIyBvZiBzZXRzIG9mIHN1bW1hcmllcwogICAgIGludDMyX3QgbU1heFJlY29yZFNldHM7CkBAIC03OSw2ICs4NSw5IEBACiAgICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gbUl0ZW1zOwogICAgIHZvaWQgc2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICopOwogCisgICAgYm9vbCBleHBpcmF0aW9uc19sKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiBtRXhwaXJlRnV0dXJlOworCiAgICAgLy8gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBvdXRwdXQKICAgICBpbnQgbUR1bXBQcm90bzsKICAgICBpbnQgbUR1bXBQcm90b0RlZmF1bHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKaW5kZXggZGI1ZjBmZi4uM2I2ZGM4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawpAQCAtNjMsNiArNjMsNjAgQEAKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgc2VydmljZSBleGVjdXRhYmxlCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKyMgc2VjY29tcCBpcyBub3QgcmVxdWlyZWQgZm9yIGNvdmVyYWdlIGJ1aWxkLgoraWZuZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFjb2RlYy5wb2xpY3kKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhY29kZWMucG9saWN5CitlbmRpZgorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBtYWluX3N3Y29kZWNzZXJ2aWNlLmNwcCBcCisgICAgTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwIFwKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkc3VmZml4IC5zbyxcCisgICQoQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVUJTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVFNBTl9SVU5USU1FX0xJQlJBUlkpIFwKKyAgJCgyTkRfQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoMk5EX1VCU0FOX1JVTlRJTUVfTElCUkFSWSkgXAorICAkKDJORF9UU0FOX1JVTlRJTUVfTElCUkFSWSkpKQorCisjICQoaW5mbyBTYW5pdGl6ZXI6ICAkKHNhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcykpCisKK2xsbmRrX2xpYnJhcmllcyA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKGFkZHN1ZmZpeCAuc28sXAorICAkKExMTkRLX0xJQlJBUklFUykpKQorCisjICQoaW5mbyBMTE5ESzogICQobGxuZGtfbGlicmFyaWVzKSkKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETElOS0VEX0xJQlJBUklFUz0nIiQoc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzKTokKGxsbmRrX2xpYnJhcmllcykiJworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdnNlcnZpY2VzX21pbmlqYWlsIFwKKyAgICBsaWJiYXNlIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliaGlkbHRyYW5zcG9ydCBcCisgICAgbGliaHdiaW5kZXIgXAorICAgIGxpYmxvZyBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJ6aXBhcmNoaXZlIFwKKworTE9DQUxfTU9EVUxFIDo9IG1lZGlhc3djb2RlYworTE9DQUxfSU5JVF9SQyA6PSBtZWRpYXN3Y29kZWMucmMKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKK0xPQ0FMX1NBTklUSVpFIDo9IHNjdWRvCisKK3Nhbml0aXplcl9ydW50aW1lX2xpYnJhcmllcyA6PQorbGxuZGtfbGlicmFyaWVzIDo9CisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiAjIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTg5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjVXBkYXRlU2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvZGxleHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8emlwYXJjaGl2ZS96aXBfYXJjaGl2ZS5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJNZWRpYUNvZGVjVXBkYXRlU2VydmljZS5oIgorCisvLyBDb3BpZWQgZnJvbSBHcmFwaGljc0Vudi5jcHAKKy8vIFRPRE8oYi8zNzA0OTMxOSkgR2V0IHRoaXMgZnJvbSBhIGhlYWRlciBvbmNlIG9uZSBleGlzdHMKK2V4dGVybiAiQyIgeworICBhbmRyb2lkX25hbWVzcGFjZV90KiBhbmRyb2lkX2NyZWF0ZV9uYW1lc3BhY2UoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxkX2xpYnJhcnlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRfbGlicmFyeV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcm1pdHRlZF93aGVuX2lzb2xhdGVkX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX25hbWVzcGFjZV90KiBwYXJlbnQpOworICBib29sIGFuZHJvaWRfbGlua19uYW1lc3BhY2VzKGFuZHJvaWRfbmFtZXNwYWNlX3QqIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCogdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhcmVkX2xpYnNfc29uYW1lcyk7CisgIGVudW0geworICAgICBBTkRST0lEX05BTUVTUEFDRV9UWVBFX0lTT0xBVEVEID0gMSwKKyAgfTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworYmluZGVyOjpTdGF0dXMgTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2U6OmxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpIHsKKyAgICBBTE9HVigibG9hZFBsdWdpbnMgJXMiLCBhcGtQYXRoLmNfc3RyKCkpOworCisgICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7CisgICAgdm9pZCAqcmVnaXN0cmFudExpYiA9IE5VTEw7CisgICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLmNfc3RyKCksICZ6aXBIYW5kbGUpOworCisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGNoYXIgYWJpbGlzdDMyW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdDMyIiwgYWJpbGlzdDMyLCAiYXJtZWFiaS12N2EiKTsKKworICAgICAgICBhdXRvIGFiaXMgPSBiYXNlOjpTcGxpdChhYmlsaXN0MzIsICIsIik7CisgICAgICAgIGlmIChhYmlzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJhYmlsaXN0IGlzIGVtcHR5LCB0cnlpbmcgYXJtZWFiaS12N2EgLi4uIik7CisgICAgICAgICAgICBhYmlzLnB1c2hfYmFjaygiYXJtZWFiaS12N2EiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IE9ubHkgdHJ5IHRoZSBmaXJzdCBlbnRyeSBpbiBhYmlsaXN0MzIgZm9yIG5vdy4KKyAgICAgICAgLy8gV2UgcHJvYmFibHkgc2hvdWxkIHRyeSB0aGUgbmV4dCBpZiBpdCBmYWlscy4KKyAgICAgICAgU3RyaW5nOCBsaWJQYXRoSW5BcGsgPSBTdHJpbmc4KCJsaWIvIikgKyBTdHJpbmc4KGFiaXNbMF0uY19zdHIoKSk7CisgICAgICAgIFN0cmluZzggZGVmYXVsdExpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGguY19zdHIoKSkgKyAiIS8iICsgbGliUGF0aEluQXBrOworICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBkZWZhdWx0TGliUGF0aCArICIvbGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudC5zbyI7CisgICAgICAgIFN0cmluZzggemlwRW50cnlQYXRoID0gbGliUGF0aEluQXBrICsgIi9saWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50LnNvIjsKKworICAgICAgICBaaXBFbnRyeSBlbnRyeTsKKyAgICAgICAgcmV0ID0gRmluZEVudHJ5KHppcEhhbmRsZSwgWmlwU3RyaW5nKHppcEVudHJ5UGF0aCksICZlbnRyeSk7CisKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBhbmRyb2lkX25hbWVzcGFjZV90ICpjb2RlY05zID0gYW5kcm9pZF9jcmVhdGVfbmFtZXNwYWNlKCJjb2RlY3MiLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAgLy8gbGRfbGlicmFyeV9wYXRoCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMaWJQYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfTkFNRVNQQUNFX1RZUEVfSVNPTEFURUQsCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBwZXJtaXR0ZWRfd2hlbl9pc29sYXRlZF9wYXRoCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOyAvLyBwYXJlbnQKKworICAgICAgICAgICAgaWYgKGNvZGVjTnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIFN0cmluZzggbGlua2VkX2xpYnJhcmllcyhMSU5LRURfTElCUkFSSUVTKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5kcm9pZF9saW5rX25hbWVzcGFjZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05zLCBudWxscHRyLCBsaW5rZWRfbGlicmFyaWVzLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvIGRsZXh0aW5mbyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBBTkRST0lEX0RMRVhUX1VTRV9OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpYnJhcnlfbmFtZXNwYWNlID0gY29kZWNOcywKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICByZWdpc3RyYW50TGliID0gYW5kcm9pZF9kbG9wZW5fZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYlBhdGguc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCAmZGxleHRpbmZvKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cmFudExpYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvYWQgbGliIGZyb20gYXJjaGl2ZTogJXMiLCBkbGVycm9yKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsaW5rIG5hbWVzcGFjZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgY29kZWMgbmFtZXNwYWNlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZpbmQgZW50cnkgKHJldD0lZCkiLCByZXQpOworICAgICAgICB9CisKKyAgICAgICAgQ2xvc2VBcmNoaXZlKHppcEhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGFyY2hpdmUgKHJldD0lZCkiLCByZXQpOworICAgIH0KKworICAgIGlmIChyZWdpc3RyYW50TGliKSB7CisgICAgICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmMgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmM+KAorICAgICAgICAgICAgICAgIGRsc3ltKHJlZ2lzdHJhbnRMaWIsICJSZWdpc3RlckNvZGVjU2VydmljZXMiKSk7CisgICAgICAgIGlmIChyZWdpc3RlckNvZGVjU2VydmljZXMpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgY29kZWMgc2VydmljZXMgIgorICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBmaW5kIGNvZGVjIHNlcnZpY2UgcmVnaXN0cmFudC4iOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNVcGRhdGVTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3Y2VlOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfQ09ERUNfVVBEQVRFX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX0NPREVDX1VQREFURV9TRVJWSUNFX0gKKworI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhVXBkYXRlU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBNZWRpYUNvZGVjVXBkYXRlU2VydmljZQorICAgIDogcHVibGljIEJpbmRlclNlcnZpY2U8TWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYVVwZGF0ZVNlcnZpY2UKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUNvZGVjVXBkYXRlU2VydmljZT47CitwdWJsaWM6CisgICAgTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UoKSA6IEJuTWVkaWFVcGRhdGVTZXJ2aWNlKCkgeyB9CisgICAgdmlydHVhbCB+TWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UoKSB7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuY29kZWMudXBkYXRlIjsgfQorICAgIGJpbmRlcjo6U3RhdHVzIGxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9DT0RFQ19VUERBVEVfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCmluZGV4IDUxNjE5ZjYuLjZkNDdiZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCkBAIC00OCwzNyArNDgsMjEgQEAKIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKIAotICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBjdXN0b21pemVkIGNvZGVjIHNlcnZpY2VzCi0gICAgdm9pZCAqcmVnaXN0cmFudExpYiA9IGRsb3BlbigKLSAgICAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50LnNvIiwKLSAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7Ci0gICAgaWYgKHJlZ2lzdHJhbnRMaWIpIHsKLSAgICAgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYyByZWdpc3RlckNvZGVjU2VydmljZXMgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYz4oCi0gICAgICAgICAgICAgICAgZGxzeW0ocmVnaXN0cmFudExpYiwgIlJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyIpKTsKLSAgICAgICAgaWYgKHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcykgewotICAgICAgICAgICAgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCByZWdpc3RlciBhZGRpdGlvbmFsIHNlcnZpY2VzICIKLSAgICAgICAgICAgICAgICAgICAgIi0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiI7Ci0gICAgICAgIH0KKyAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgc3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214U3RvcmUoKTsKKyAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOworICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOworICAgIH0KKyAgICBzcDxJT214PiBvbXggPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teCgpOworICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKLSAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7Ci0gICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKLSAgICAgICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwotICAgICAgICB9CisgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7CiAgICAgfQogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmVhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKKyNpbmNsdWRlICJtaW5pamFpbC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5oPgorCisjaW5jbHVkZSAiTWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIFRPRE86IHJlcGxhY2UgcG9saWN5IHdpdGggc29mdHdhcmUgY29kZWMtb25seSBwb2xpY2llcworLy8gTXVzdCBtYXRjaCBsb2NhdGlvbiBpbiBBbmRyb2lkLm1rLgorc3RhdGljIGNvbnN0IGNoYXIga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy5wb2xpY3kiOworc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy5wb2xpY3kiOworCisvLyBEaXNhYmxlIFNjdWRvJ3MgbWlzbWF0Y2ggYWxsb2NhdGlvbiBjaGVjaywgYXMgaXQgaXMgYmVpbmcgdHJpZ2dlcmVkCisvLyBieSBzb21lIHRoaXJkIHBhcnR5IGNvZGUuCitleHRlcm4gIkMiIGNvbnN0IGNoYXIgKl9fc2N1ZG9fZGVmYXVsdF9vcHRpb25zKCkgeworICByZXR1cm4gIkRlYWxsb2NhdGlvblR5cGVNaXNtYXRjaD1mYWxzZSI7Cit9CisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogLyphcmd2Ki8pCit7CisgICAgTE9HKElORk8pIDw8ICJtZWRpYSBzd2NvZGVjIHNlcnZpY2Ugc3RhcnRpbmciOworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKKworICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gYmFzZTo6R2V0UHJvcGVydHkoInJvLmJ1aWxkLnR5cGUiLCAidW5rbm93biIpOworICAgIGlmICh2YWx1ZSA9PSAidXNlcmRlYnVnIiB8fCB2YWx1ZSA9PSAiZW5nIikgeworICAgICAgICBtZWRpYTo6TWVkaWFDb2RlY1VwZGF0ZVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgfQorCisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOworCisgICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKKyAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAorICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAorICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAocmVnaXN0cmFudExpYikgeworICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKKyAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOworICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7CisgICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGNvZGVjIHNlcnZpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgIi0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZmluZCBjb2RlYyBzZXJ2aWNlIHJlZ2lzdHJhbnQuIjsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUzMzgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKQEAgLTAsMCArMSw2IEBACitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL3N5c3RlbS9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMzE3YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTMgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIC8vIENvZGVjcworICAgIHJ1bnRpbWVfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wM2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfb3B1c2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDllbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfcmF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZmxhY2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCisgICAgXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZlYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKworZXh0ZXJuICJDIiB2b2lkIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOworICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgc29mdHdhcmUgQ29kZWMyIHNlcnZpY2UuLi4iOworICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmUgPQorICAgICAgICBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgic29mdHdhcmUiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlZ2lzdGVyIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwKKyAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlIGNyZWF0ZWQuIjsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQppbmRleCA2ZWM4ODk1Li5lZGY0ZGFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQpAQCAtNTUsNCArNTUsOCBAQAogZ2V0ZGVudHM2NDogMQogZ2V0cmFuZG9tOiAxCiAKKyMgVXNlZCBieSBVQlNhbiBkaWFnbm9zdGljIG1lc3NhZ2VzCityZWFkbGluazogMQorb3BlbjogMQorCiBAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKaW5kZXggODIxZTY5Zi4uOTY2ZTIxNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKQEAgLTI0LDYgKzI0LDcgQEAKIG1tYXAyOiAxCiBmc3RhdDY0OiAxCiBzdGF0NjQ6IDEKK3N0YXRmczY0OiAxCiBtYWR2aXNlOiAxCiBmc3RhdGF0NjQ6IDEKIGZ1dGV4OiAxCkBAIC01Nyw0ICs1OCw4IEBACiBnZXRwaWQ6IDEKIGdldHRpZDogMQogCisjIFVzZWQgYnkgVUJTYW4gZGlhZ25vc3RpYyBtZXNzYWdlcworcmVhZGxpbms6IDEKK29wZW46IDEKKwogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCBlODcwOTY1Li4yMjdhMjlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKICAgICBsaWJoaWRsbWVtb3J5IFwKICAgICBsaWJoaWRsdHJhbnNwb3J0IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMQorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKaW5kZXggMzdkNmNjOS4uZTMxZWFkYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCkBAIC05LDYgKzksMjQgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJzdGFnZWZyaWdodCBsaWJiaW5kZXIgbGlidXRpbHMgbGlibG9nCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UKKworc2FuaXRpemVyX3J1bnRpbWVfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkc3VmZml4IC5zbyxcCisgICQoQUREUkVTU19TQU5JVElaRVJfUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVUJTQU5fUlVOVElNRV9MSUJSQVJZKSBcCisgICQoVFNBTl9SVU5USU1FX0xJQlJBUlkpKSkKKworIyAkKGluZm8gU2FuaXRpemVyOiAgJChzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMpKQorCituZGtfbGlicmFyaWVzIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoYWRkcHJlZml4IGxpYiwkKGFkZHN1ZmZpeCAuc28sXAorICAkKE5ES19QUkVCVUlMVF9TSEFSRURfTElCUkFSSUVTKSkpKQorCisjICQoaW5mbyBOREs6ICAkKG5ka19saWJyYXJpZXMpKQorCitMT0NBTF9DRkxBR1MgKz0gLURMSU5LRURfTElCUkFSSUVTPSciJChzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMpOiQobmRrX2xpYnJhcmllcykiJworCitzYW5pdGl6ZXJfcnVudGltZV9saWJyYXJpZXMgOj0KK25ka19saWJyYXJpZXMgOj0KKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAKQEAgLTE4LDE5ICszNiw3IEBACiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2XzY0IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UgbGliYmluZGVyIGxpYnV0aWxzIFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IGYwZjQ0ZjUuLjhiMjYxNzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgpAQCAtMzAsNiArMjksMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitNZWRpYUV4dHJhY3RvclNlcnZpY2U6Ok1lZGlhRXh0cmFjdG9yU2VydmljZSgpCisgICAgICAgIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7CisgICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpTZXRMaW5rZWRMaWJyYXJpZXMoc3RkOjpzdHJpbmcoTElOS0VEX0xJQlJBUklFUykpOworfQorCiBzcDxJTWVkaWFFeHRyYWN0b3I+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvcigKICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZyZW1vdGVTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggOWRmM2VjZC4uNjAwNzAwNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclNlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKIHB1YmxpYzoKLSAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAppbmRleCA0MTE1ZjZkLi5lYTM0YzlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYVVwZGF0ZVNlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIG1lZGlhIHsKIAogY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCi0gICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKKyAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhVXBkYXRlU2VydmljZQogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT47CiBwdWJsaWM6Ci0gICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQorICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYVVwZGF0ZVNlcnZpY2UoKSB7IH0KICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KICAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KICAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjNjNzc4MC4uNmQ5ZWQ2ZgotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKQEAgLTIxLDYgKzIxLDcgQEAKIGdldHVpZDogMQogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCitmc3RhdGZzOiAxCiBuZXdmc3RhdGF0OiAxCiByZXN0YXJ0X3N5c2NhbGw6IDEKIGV4aXQ6IDEKQEAgLTMwLDI4ICszMSwyMSBAQAogc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBnZXRybGltaXQ6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCisKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycworZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi10Z2tpbGw6IDEKLXNvY2tldDogYXJnMCA9PSAxCi1jb25uZWN0OiAxCi1mY250bDogMQotcnRfc2lncHJvY21hc2s6IDEKLXJ0X3NpZ2FjdGlvbjogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQ6IDEKLWdldGdpZDogMQotZ2V0ZWdpZDogMQotZ2V0Z3JvdXBzOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLQogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKIHNjaGVkX3lpZWxkOiAxCiBnZXRwaWQ6IDEKIGdldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDI5ZTZkZmMuLmNhOTZmNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtOSw3ICs5LDkgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5iYWlvIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IDFiZTU1NDQuLjkwMmFmNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtMjAsOCArMjAsOSBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUzLDI3ICs1NCwyOCBAQAogCiB2b2lkIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDAgfHwKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDAgfHwKICAgICAgICAgICAgIHNpemUgPCBrTWluU2l6ZSB8fCBzaXplID4ga01heFNpemUgfHwgbmFtZSA9PSBOVUxMIHx8CiAgICAgICAgICAgICBzaGFyZWQtPnNpemUoKSA8IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUpKTsKLSAgICBOQkxvZzo6TmFtZWRSZWFkZXIgbmFtZWRSZWFkZXIocmVhZGVyLCBuYW1lKTsKKyAgICBzcDxOQkxvZzo6UmVhZGVyPiByZWFkZXIobmV3IE5CTG9nOjpSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSk7IC8vIFJlYWRlciBoYW5kbGVkIGJ5IG1lcmdlcgorICAgIHNwPE5CTG9nOjpEdW1wUmVhZGVyPiBkdW1wUmVhZGVyKG5ldyBOQkxvZzo6RHVtcFJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gZm9yIGR1bXBzeXMKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1OYW1lZFJlYWRlcnMuYWRkKG5hbWVkUmVhZGVyKTsKLSAgICBtTWVyZ2VyLmFkZFJlYWRlcihuYW1lZFJlYWRlcik7CisgICAgbUR1bXBSZWFkZXJzLmFkZChkdW1wUmVhZGVyKTsKKyAgICBtTWVyZ2VyLmFkZFJlYWRlcihyZWFkZXIpOwogfQogCiB2b2lkIE1lZGlhTG9nU2VydmljZTo6dW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkKQogewotICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgIT0gQUlEX0FVRElPU0VSVkVSIHx8IHNoYXJlZCA9PSAwKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHx8IHNoYXJlZCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OYW1lZFJlYWRlcnMuc2l6ZSgpOyApIHsKLSAgICAgICAgaWYgKG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmlzSU1lbW9yeShzaGFyZWQpKSB7Ci0gICAgICAgICAgICBtTmFtZWRSZWFkZXJzLnJlbW92ZUF0KGkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUR1bXBSZWFkZXJzLnNpemUoKTsgKSB7CisgICAgICAgIGlmIChtRHVtcFJlYWRlcnNbaV0tPmlzSU1lbW9yeShzaGFyZWQpKSB7CisgICAgICAgICAgICBtRHVtcFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAvLyBUT0RPIG1NZXJnZXIucmVtb3ZlUmVhZGVycyhzaGFyZWQpCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgIH0KQEAgLTk1LDEwICs5Nyw4IEBACiAKIHN0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgLy8gRklYTUUgbWVyZ2Ugd2l0aCBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsIGNvZGUgYXQgc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIGlmICghKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSA9PSBBSURfQVVESU9TRVJWRVIgfHwKLSAgICAgICAgICAgIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCkpKSB7CisgICAgaWYgKCEoaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKQorICAgICAgICAgICAgfHwgZHVtcEFsbG93ZWQoKSkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIG1lZGlhLmxvZyBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgewogICAgICAgICBjb25zdCBTdHJpbmc4IGFyZzAoYXJnc1swXSk7CiAgICAgICAgIGlmICghc3RyY21wKGFyZzAuc3RyaW5nKCksICItciIpKSB7Ci0gICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtTmFtZWRSZWFkZXJzIGlzIHByb3RlY3RlZCBieSBtTG9jaworICAgICAgICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgbVJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAgICAgICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKIAogICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBNZWRpYUxvZ1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZApAQCAtMTE5LDIxICsxMTksMjIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IiwgcmVzdWx0LnN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgaW5zdGVhZCBwcm9jZWVkIHRvIG1NZXJnZVJlYWRlci5kdW1wPyBkb2VzIGl0IG5lZWQgbG9jaz8KICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbmFtZWRSZWFkZXIgOiBtTmFtZWRSZWFkZXJzKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmR1bXBSZWFkZXIgOiBtRHVtcFJlYWRlcnMpIHsKICAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgZHVtcFJlYWRlci0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBkdW1wUmVhZGVyLT5kdW1wKGZkLCAwIC8qaW5kZW50Ki8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBuYW1lZFJlYWRlci5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgZHVtcFJlYWRlci0+bmFtZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAgICAgfQotICAgIG1NZXJnZVJlYWRlci5kdW1wKGZkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKaW5kZXggYzk0NWQxZi4uMjFkZjg5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTG9nU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTU1LDcgKzU2LDcgQEAKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CiAKLSAgICBWZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiBtTmFtZWRSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFZlY3RvcjxzcDxOQkxvZzo6RHVtcFJlYWRlcj4+IG1EdW1wUmVhZGVyczsgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKIAogICAgIC8vIEZJWE1FIE5lZWQgY29tbWVudHMgb24gYWxsIG9mIHRoZXNlLCBlc3BlY2lhbGx5IGFib3V0IGxvY2tpbmcKICAgICBOQkxvZzo6U2hhcmVkICptTWVyZ2VyU2hhcmVkOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKaW5kZXggZTBkYjI2MS4uYTFmYzBlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCkBAIC0xNDAsOSArMTQwLDggQEAKIH0KIAogc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6Om9wZW5FbmRwb2ludChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewotICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgeworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKICAgICAgICAgcmV0dXJuIG9wZW5FeGNsdXNpdmVFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBvcGVuU2hhcmVkRW5kcG9pbnQoYXVkaW9TZXJ2aWNlLCByZXF1ZXN0KTsKQEAgLTE3Myw3ICsxNzIsNyBAQAogCiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+b3BlbihyZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJvcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKICAgICAgICAgICAgIGVuZHBvaW50LmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRXhjbHVzaXZlU3RyZWFtcy5wdXNoX2JhY2soZW5kcG9pbnRNTWFwKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKaW5kZXggMTkzYmRlZS4uYmExNzg1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmgKQEAgLTU2LDggKzU2LDcgQEAKICAgICAgKiBAcmV0dXJuIGVuZHBvaW50IG9yIG51bGwKICAgICAgKi8KICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG9wZW5FbmRwb2ludChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KTsKIAogICAgIHZvaWQgY2xvc2VFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAppbmRleCBiMDMxODg4Li4xYzAzYjdmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcGFydEluZGV4Kys7CiAgICAgfQotICAgIGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGZyYW1lc0Rlc2lyZWQpOworICAgIGZpZm8tPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CiAKICNpZiBBQVVESU9fTUlYRVJfQVRSQUNFX0VOQUJMRUQKICAgICBBVFJBQ0VfRU5EKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDAxODJhMjcuLjJmYmFlYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCkBAIC0zMyw3ICszNCw2IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtMTE4LDE3ICsxMTgsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZAotICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRAotICAgICAgICAgfHwgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0ciAmJiAhc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKSkgeworICAgIC8vIFRyeSBTSEFSRUQgaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkLgorICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgewogICAgICAgICBzZXJ2aWNlU3RyZWFtID0gIG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCp0aGlzKTsKICAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKKyAgICB9IGVsc2UgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0ciAmJiAhc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKSB7CisgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCBtb2RpZmllZFJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIG9yaWdpbmFsIEVYQ0xVU0lWRSBtb2RlIHdpdGggU0hBUkVELgorICAgICAgICBtb2RpZmllZFJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7CisgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4obW9kaWZpZWRSZXF1ZXN0KTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtKCk6IGZhaWxlZCwgcmV0dXJuICVkID0gJXMiLAotICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBBTE9HVygib3BlblN0cmVhbSgpOiBmYWlsZWQsIHJldHVybiAlZCA9ICVzIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewogICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gbVN0cmVhbVRyYWNrZXIuYWRkU3RyZWFtRm9ySGFuZGxlKHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggNjkwNjhmNS4uNGRmYjYyYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zOCwxMCArMzgsNiBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKQEAgLTU5LDYgKzU1LDcgQEAKICAgICByZXN1bHQgPDwgIiAgICBEZXZpY2UgSWQ6ICAgICAgICAgICAgIiA8PCBnZXREZXZpY2VJZCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgU2FtcGxlIFJhdGU6ICAgICAgICAgICIgPDwgZ2V0U2FtcGxlUmF0ZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ2hhbm5lbCBDb3VudDogICAgICAgICIgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGb3JtYXQ6ICAgICAgICAgICAgICAgIiA8PCBnZXRGb3JtYXQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIEZyYW1lcyBQZXIgQnVyc3Q6ICAgICAiIDw8IG1GcmFtZXNQZXJCdXJzdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFVzYWdlOiAgICAgICAgICAgICAgICAiIDw8IGdldFVzYWdlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDb250ZW50VHlwZTogICAgICAgICAgIiA8PCBnZXRDb250ZW50VHlwZSgpIDw8ICJcbiI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCmluZGV4IGExMzRhMTMuLjQzYjBhMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgogCi0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCk7CisgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgPSBkZWZhdWx0OwogCiAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggY2M5NDJmNC4uMzdkMTA1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTgyLDggKzgyLDkgQEAKIAogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkgJiYgIWNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1dyaXR0ZW4gPSAwOworCiAgICAgICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHN0cmVhbVNoYXJlZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCAqPihjbGllbnRTdHJlYW0uZ2V0KCkpOwogCkBAIC0xMDIsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoZSBidWZmZXIgdG9vIGZ1bGwgdG8gd3JpdGUgYSBidXJzdD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5pbmNyZW1lbnRYUnVuQ291bnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAppbmRleCA1YTQyOWM5Li42YzI4MDgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtMTAxLDggKzEwMSw2IEBACiAgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAogICAgICAgICAgICAgLnRhZ3MgPSAiIgogICAgIH07Ci0gICAgQUxPR0QoIiVzKCVwKSBNTUFQIGF0dHJpYnV0ZXMudXNhZ2UgPSAlZCwgY29udGVudF90eXBlID0gJWQsIHNvdXJjZSA9ICVkIiwKLSAgICAgICAgICBfX2Z1bmNfXywgdGhpcywgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMuc291cmNlKTsKIAogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKQEAgLTExMSwxMSArMTA5LDExIEBACiAgICAgbVJlcXVlc3RlZERldmljZUlkID0gZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOwogCiAgICAgLy8gRmlsbCBpbiBjb25maWcKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fVU5TUEVDSUZJRUQgfHwgYWF1ZGlvRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kxNjsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCB8fCBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfQotICAgIGNvbmZpZy5mb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvRm9ybWF0KTsKKyAgICBjb25maWcuZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAKICAgICBpbnQzMl90IGFhdWRpb1NhbXBsZVJhdGUgPSBnZXRTYW1wbGVSYXRlKCk7CiAgICAgaWYgKGFhdWRpb1NhbXBsZVJhdGUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CkBAIC0xNjMsMTIgKzE2MSwxMiBAQAogICAgIEFMT0dEKCIlcygpIG1NYXBDbGllbnQudWlkID0gJWQsIHBpZCA9ICVkID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXMoKSBvcGVuTW1hcFN0cmVhbSgpIHJldHVybmVkIHN0YXR1cyAlZCIsICBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBvcGVuTW1hcFN0cmVhbSgpIHJldHVybmVkIHN0YXR1cyAlZCIsICBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKICAgICBpZiAoZGV2aWNlSWQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgLSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIHNldERldmljZUlkKGRldmljZUlkKTsKIApAQCAtMjEwLDkgKzIwOCw2IEBACiAgICAgICAgIHVpZF90IGF1ZGlvU2VydmljZVVpZCA9IGdldHVpZCgpOwogICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmNsaWVudFVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCiAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICAvLyBGYWxsYmFjayBpcyBoYW5kbGVkIGJ5IGNhbGxlciBidXQgaW5kaWNhdGUgd2hhdCBpcyBwb3NzaWJsZSBpbiBjYXNlCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOwogICAgICAgICAgICAgQUxPR1coIiVzKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50IiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTIzMyw3ICsyMjgsNyBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXM7Ci0gICAgc2V0Rm9ybWF0KEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChjb25maWcuZm9ybWF0KSk7CisgICAgc2V0Rm9ybWF0KGNvbmZpZy5mb3JtYXQpOwogICAgIHNldFNhbXBsZVJhdGUoY29uZmlnLnNhbXBsZV9yYXRlKTsKIAogICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCkBAIC0yNTMsNiArMjQ4LDkgQEAKICAgICAgICAgICAiLCBkZXZpY2VJZCA9ICVkLCBjYXBhY2l0eSA9ICVkXG4iLAogICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKKyAgICBBTE9HRCgiJXMoKSBmb3JtYXQgPSA9eCUwOHgsIGZyYW1lIHNpemUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldEZvcm1hdCgpLCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkpOworCiAgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCmluZGV4IGViYmEzMmQuLjFlMWM1NTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwCkBAIC00NywxMCArNDcsNiBAQAogICAgIG1TdHJlYW1JbnRlcm5hbCA9ICZtU3RyZWFtSW50ZXJuYWxQbGF5OwogfQogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSgpIHsKLSAgICBBTE9HRCgiJXMoJXApIGRlc3Ryb3llZCIsIF9fZnVuY19fLCB0aGlzKTsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewpAQCAtODgsNiArODQsMTAgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1JlYWQgPSAwOwogICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dVbmRlcmZsb3cgPSB0cnVlOwogCisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZGVhZCBzdHJlYW0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBjbGllbnRTdHJlYW0tPmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dVbmRlcmZsb3cgPSBmYWxzZTsgLy8ganVzdCByZWFkIHdoYXQgaXMgYWxyZWFkeSBpbiB0aGUgRklGTwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCmluZGV4IGEwYTM4M2MuLjk4MWU0MzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKQEAgLTM5LDcgKzM5LDYgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSk7Ci0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSgpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKaW5kZXggZmM5ZjE1NS4uMmYxZWM3ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCkBAIC03OCw2ICs3OCw3IEBACiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgc2V0U2Vzc2lvbklkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2Vzc2lvbklkKCkpOworICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsgLy8gZm9yY2UgZm9yIG1peGVyCiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKaW5kZXggZDY3MTcxMC4uYmZjMTc0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKQEAgLTUyLDggKzUyLDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAqY2FsbGJhY2tMb29wKCkgPSAwOwotCisgICAgdmlydHVhbCB2b2lkICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKIAogcHJvdGVjdGVkOgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKaW5kZXggOWFmOGFmMy4uZGVmYmI3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcApAQCAtNTEsNyArNTEsNiBAQAogfQogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6fkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgewotICAgIEFMT0dEKCJ+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTgxLDggKzgwLDcgQEAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC0xMDksMTAgKzEwNyw4IEBACiAgICAgICAgIC8vIHJlZmVyZW5jZWQgdW50aWwgdGhlIHNlcnZpY2UgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgY2xpZW50LgogICAgICAgICAvLyBTbyBvbmx5IG9uZSB0aHJlYWQgY2FuIG9wZW4gYSBzdHJlYW0uCiAgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QpOwogICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMoKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CkBAIC0xODMsNiArMTc5LDcgQEAKICAgICB9CiAKICAgICBzZXRGbG93aW5nKGZhbHNlKTsKKyAgICBzZXRTdXNwZW5kZWQoZmFsc2UpOwogCiAgICAgLy8gU3RhcnQgd2l0aCBmcmVzaCBwcmVzZW50YXRpb24gdGltZXN0YW1wcy4KICAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CkBAIC0zNDksNyArMzQ2LDkgQEAKICAgICB9CiAgICAgaW50MzJfdCBjb3VudCA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpLT53cml0ZShjb21tYW5kLCAxKTsKICAgICBpZiAoY291bnQgIT0gMSkgewotICAgICAgICBBTE9HRSgiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBkaWU/ICVzIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgICAgICBBTE9HVygiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBzdG9wPyBTdXNwZW5kaW5nIHN0cmVhbS4gd2hhdCA9ICV1LCAlcyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjb21tYW5kLT53aGF0LCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgc2V0U3VzcGVuZGVkKHRydWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAppbmRleCBhMTgxNWQwLi43OTA0YjI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKQEAgLTIwNCw2ICsyMDQsMjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXQgZmFsc2Ugd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBub3QgbG9uZ2VyIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYSBtZXNzYWdlIHF1ZXVlIG92ZXJmbG93LgorICAgICAqIFNldCB0cnVlIHdoZW4gc3RyZWFtIGlzIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHN1c3BlbmRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3VzcGVuZGVkKGJvb2wgc3VzcGVuZGVkKSB7CisgICAgICAgIG1TdXNwZW5kZWQgPSBzdXNwZW5kZWQ7CisgICAgfQorCisgICAgYm9vbCBpc1N1c3BlbmRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdXNwZW5kZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXRvbWljYWxseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3RyZWFtIGJ5IEFBdWRpb1NlcnZpY2UuCiAgICAgICoKICAgICAgKiBUaGlzIGlzIGNhbGxlZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCkBAIC0zMDQsNyArMzE4LDEyIEBACiAgICAgLy8gVGhpcyBpcyBtb2RpZmllZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUNhbGxpbmdDb3VudCA9IDA7CiAKKyAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgc3RyZWFtIHRoYXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBieSBhIGJpbmRlciBjYWxsIG5lZWRzIHRvIGNsb3NlZC4KICAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtQ2xvc2VOZWVkZWR7ZmFsc2V9OworCisgICAgLy8gVGhpcyBpbmRpY2F0ZSB0aGF0IGEgcnVubmluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSBvZiBhbiBlcnJvciwKKyAgICAvLyBmb3IgZXhhbXBsZSBhIGZ1bGwgbWVzc2FnZSBxdWV1ZS4gTm90ZSB0aGF0IHRoaXMgYXRvbWljIGlzIHVucmVsYXRlZCB0byBtQ2xvc2VOZWVkZWQuCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVN1c3BlbmRlZHtmYWxzZX07CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAppbmRleCBjODQ1MzA5Li45Mzc3OTQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCkBAIC02NCw4ICs2NCwxMyBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbU1NQVA+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgIT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgc2hhcmluZ01vZGUgbWlzbWF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDA1YzU3MzUuLmQ1NDUwZmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMjAsOSArMTIwLDE0IEBACiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIHJldHVybmVkICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0xMzYsMTAgKzE0MSwxMCBAQAogCiAgICAgLy8gSXMgdGhlIHJlcXVlc3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzaGFyZWQgZW5kcG9pbnQ/CiAgICAgc2V0Rm9ybWF0KGNvbmZpZ3VyYXRpb25JbnB1dC5nZXRGb3JtYXQoKSk7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKLSAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAoZ2V0Rm9ybWF0KCkgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRSgiJXMoKSBhdWRpb19mb3JtYXRfdCBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xNDgsNyArMTUzLDcgQEAKICAgICBpZiAoZ2V0U2FtcGxlUmF0ZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBzZXRTYW1wbGVSYXRlKGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOwogICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlUmF0ZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZVJhdGUgPSAlZCwgbmVlZCAlZCIsCisgICAgICAgIEFMT0dFKCIlcygpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE1OCw3ICsxNjMsNyBAQAogICAgIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0U2FtcGxlc1BlckZyYW1lKGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVzUGVyRnJhbWUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgQUxPR0UoIiVzKCkgbVNhbXBsZXNQZXJGcmFtZSA9ICVkLCBuZWVkICVkIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMTg1LDggKzE5MCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAotICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldERldmljZUlkKCkpOwogCiAgICAgcmVzdWx0ID0gZW5kcG9pbnQtPnJlZ2lzdGVyU3RyZWFtKGtlZXApOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA1ODRiMmVmLi4zZDVmMTQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTUzLDcgKzUzLDYgQEAKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIyODNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAiLAorICAgICAgICAiU291bmRUcmlnZ2VySGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlic291bmR0cmlnZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJhdWRpb2hhbCIsCisgICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM2NjZlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLWlmZXEgKCQoU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUpLCAxKQotICAgIGlmbmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSwgdHJ1ZSkKLSAgICAgICAgJChlcnJvciBSZXF1aXJlcyBidWlsZGluZyB3aXRoIFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMPXRydWUpCi0gICAgZW5kaWYKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQotZW5kaWYKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJoYXJkd2FyZSBcCi0gICAgbGlic291bmR0cmlnZ2VyIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGlic2VydmljZXV0aWxpdHkKLQotCi1pZmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSx0cnVlKQotIyBsaWJoYXJkd2FyZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcAotZWxzZQotIyBUcmVibGUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmh3YmluZGVyIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbG1lbW9yeSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGliYmFzZSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjEgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCBcCi0gICAgYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAgXAotICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wCi1lbmRpZgotCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCmluZGV4IGFkZjI1MmUuLjFkMzdhOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKQEAgLTM1Niw2ICszNTYsMzggQEAKICAgICByZXR1cm4gaGlkbFJldHVybjsKIH0KIAoraW50IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyID0gZ2V0U2VydmljZSgpOworICAgIGlmIChzb3VuZHRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOworICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBzcDxTb3VuZE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgbW9kZWwgbm90IGZvdW5kIGZvciBoYW5kbGUgJXUiLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUmV0dXJuPGludDMyX3Q+IGhpZGxSZXR1cm4oMCk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5nZXRNb2RlbFN0YXRlKG1vZGVsLT5tSGFsSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKCFoaWRsUmV0dXJuLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBlcnJvciAlcyIsIGhpZGxSZXR1cm4uZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpTb3VuZFRyaWdnZXJIYWxIaWRsKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCiAgICAgOiBtTW9kdWxlTmFtZShtb2R1bGVOYW1lKSwgbU5leHRVbmlxdWVJZCgxKQogewpAQCAtMzg4LDYgKzQyMCwxMiBAQAogICAgIHJldHVybiBjYXN0UmVzdWx0XzJfMS5pc09rKCkgPyBzdGF0aWNfY2FzdDxzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4+KGNhc3RSZXN1bHRfMl8xKSA6IG51bGxwdHI7CiB9CiAKK3NwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBTb3VuZFRyaWdnZXJIYWxIaWRsOjp0b1NlcnZpY2UyXzIoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcykKK3sKKyAgICBhdXRvIGNhc3RSZXN1bHRfMl8yID0gVjJfMl9JU291bmRUcmlnZ2VySHc6OmNhc3RGcm9tKHMpOworICAgIHJldHVybiBjYXN0UmVzdWx0XzJfMi5pc09rKCkgPyBzdGF0aWNfY2FzdDxzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4+KGNhc3RSZXN1bHRfMl8yKSA6IG51bGxwdHI7Cit9CisKIHNwPFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kTW9kZWw+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaAppbmRleCAwYjQ0YWUwLi5mYjllMzllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjEvSVNvdW5kVHJpZ2dlckh3Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4yL0lTb3VuZFRyaWdnZXJIdy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogCkBAIC00Niw2ICs0Nyw4IEBACiB1c2luZyBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwordXNpbmcgVjJfMl9JU291bmRUcmlnZ2VySHcgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzI6OklTb3VuZFRyaWdnZXJIdzsKIAogY2xhc3MgU291bmRUcmlnZ2VySGFsSGlkbCA6IHB1YmxpYyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgVjJfMV9JU291bmRUcmlnZ2VySHdDYWxsYmFjawpAQCAtOTIsNiArOTUsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKTsKIAorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBtb2RlbC4KKyAgICAgICAgICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUuIElmIHN1Y2Nlc3NmdWwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICogdmlhIGEgcmVjb2duaXRpb24gZXZlbnQgaW4gdGhlIGNhbGxiYWNrIG1ldGhvZCB0aGF0IHdhcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAgICAgKiBzdGFydFJlY29nbml0aW9uKCkgbWV0aG9kLgorICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzIgb3IgYWJvdmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGludCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKICAgICAgICAgLy8gSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFjaygKICAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKQEAgLTE4Miw2ICsxOTMsNyBAQAogICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBnZXRTZXJ2aWNlKCk7CiAgICAgICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiB0b1NlcnZpY2UyXzEoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcyk7CisgICAgICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiB0b1NlcnZpY2UyXzIoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcyk7CiAgICAgICAgIHNwPFNvdW5kTW9kZWw+IGdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAgICAgICAgIHNwPFNvdW5kTW9kZWw+IHJlbW92ZU1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAppbmRleCBjMDgzMTk1Li4wMTgzZWNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCkBAIC03MSw2ICs3MSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpID0gMDsKIAorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBtb2RlbC4KKyAgICAgICAgICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUuIElmIHN1Y2Nlc3NmdWwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICogdmlhIGEgcmVjb2duaXRpb24gZXZlbnQgaW4gdGhlIGNhbGxiYWNrIG1ldGhvZCB0aGF0IHdhcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAgICAgKiBzdGFydFJlY29nbml0aW9uKCkgbWV0aG9kLgorICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzIgb3IgYWJvdmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGludCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgICAgIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ODgxOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbExlZ2FjeS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKLXsKLSAgICByZXR1cm4gbmV3IFNvdW5kVHJpZ2dlckhhbExlZ2FjeShtb2R1bGVOYW1lKTsKLX0KLQotU291bmRUcmlnZ2VySGFsTGVnYWN5OjpTb3VuZFRyaWdnZXJIYWxMZWdhY3koY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKLSAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtSHdEZXZpY2UoTlVMTCkKLXsKLX0KLQotdm9pZCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6Om9uRmlyc3RSZWYoKQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKG1Nb2R1bGVOYW1lID09IE5VTEwpIHsKLSAgICAgICAgbU1vZHVsZU5hbWUgPSAicHJpbWFyeSI7Ci0gICAgfQotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgc291bmQgdHJpZ2dlciBtb2R1bGUgJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmMgPSBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9vcGVuKG1vZCwgJm1Id0RldmljZSk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gc291bmQgdHJpZ2dlciBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIG1Id0RldmljZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPCBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgfHwKLSAgICAgICAgICAgIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPiBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7Ci0gICAgICAgIEFMT0dFKCJ3cm9uZyBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotU291bmRUcmlnZ2VySGFsTGVnYWN5Ojp+U291bmRUcmlnZ2VySGFsTGVnYWN5KCkKLXsKLSAgICBpZiAobUh3RGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICB9Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OmdldFByb3BlcnRpZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfcHJvcGVydGllcyAqcHJvcGVydGllcykKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPmdldF9wcm9wZXJ0aWVzKG1Id0RldmljZSwgcHJvcGVydGllcyk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OmxvYWRTb3VuZE1vZGVsKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+bG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIHNvdW5kX21vZGVsLCBjYWxsYmFjaywgY29va2llLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5Ojp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+c3RhcnRfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUsIGNvbmZpZywgY2FsbGJhY2ssIGNvb2tpZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RvcEFsbFJlY29nbml0aW9ucygpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgJiYKLSAgICAgbUh3RGV2aWNlLT5zdG9wX2FsbF9yZWNvZ25pdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIG1Id0RldmljZS0+c3RvcF9hbGxfcmVjb2duaXRpb25zKG1Id0RldmljZSk7Ci0gICAgfQotICAgIHJldHVybiAtRU5PU1lTOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDg4ZGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSAotCi0jaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU291bmRUcmlnZ2VySGFsTGVnYWN5IDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZQotCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflNvdW5kVHJpZ2dlckhhbExlZ2FjeSgpOwotCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfcHJvcGVydGllcyAqcHJvcGVydGllcyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTG9hZCBhIHNvdW5kIG1vZGVsLiBPbmNlIGxvYWRlZCwgcmVjb2duaXRpb24gb2YgdGhpcyBtb2RlbCBjYW4gYmUgc3RhcnRlZCBhbmQgc3RvcHBlZC4KLSAgICAgICAgICogT25seSBvbmUgYWN0aXZlIHJlY29nbml0aW9uIHBlciBtb2RlbCBhdCBhIHRpbWUuIFRoZSBTb3VuZFRyaWdnZXIgc2VydmljZSB3aWxsIGhhbmRsZQotICAgICAgICAgKiBjb25jdXJyZW50IHJlY29nbml0aW9uIHJlcXVlc3RzIGJ5IGRpZmZlcmVudCB1c2Vycy9hcHBsaWNhdGlvbnMgb24gdGhlIHNhbWUgbW9kZWwuCi0gICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgdW5pcXVlIGhhbmRsZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyAodW5sb2FkX3NvdW5kX21vZGVsKCksCi0gICAgICAgICAqIHN0YXJ0X3JlY29nbml0aW9uKCksIGV0Yy4uLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgbG9hZFNvdW5kTW9kZWwoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVubG9hZCBhIHNvdW5kIG1vZGVsLiBBIHNvdW5kIG1vZGVsIGNhbiBiZSB1bmxvYWRlZCB0byBtYWtlIHJvb20gZm9yIGEgbmV3IG9uZSB0byBvdmVyY29tZQotICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgICAgICAvKiBTdGFydCByZWNvZ25pdGlvbiBvbiBhIGdpdmVuIG1vZGVsLiBPbmx5IG9uZSByZWNvZ25pdGlvbiBhY3RpdmUgYXQgYSB0aW1lIHBlciBtb2RlbC4KLSAgICAgICAgICogT25jZSByZWNvZ25pdGlvbiBzdWNjZWVkcyBvZiBmYWlscywgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC4KLSAgICAgICAgICogVE9ETzogZ3JvdXAgcmVjb2duaXRpb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gb25lIHN0cnVjdCBhbmQgYWRkIGtleSBwaHJhc2Ugb3B0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKTsKLQotICAgICAgICAvKiBTdG9wIHJlY29nbml0aW9uIG9uIGEgZ2l2ZW4gbW9kZWwuCi0gICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdoZW4gc3RvcHBlZCB2aWEgdGhpcyBtZXRob2QuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgICAgICAvKiBTdG9wIHJlY29nbml0aW9uIG9uIGFsbCBtb2RlbHMuCi0gICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMSBvciBhYm92ZS4KLSAgICAgICAgICogSWYgbm8gaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQsIHN0b3BfcmVjb2duaXRpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcnVubmluZyBtb2RlbC4KLSAgICAgICAgICovCi0gICAgICAgIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0KLXByaXZhdGU6Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNzIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZTsKLQotICAgICAgICBleHBsaWNpdCBTb3VuZFRyaWdnZXJIYWxMZWdhY3koY29uc3QgY2hhciAqbW9kdWxlTmFtZSA9IE5VTEwpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKm1Nb2R1bGVOYW1lOwotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqICAgICAgICBtSHdEZXZpY2U7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggYTdkNmU4My4uOTQ0YWJjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTI3LDIwICsyNywxNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+Ci0jaW5jbHVkZSA8U2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCi0jaWZkZWYgU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKLSNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAic3R1YiIKLSNlbHNlCiAjZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInByaW1hcnkiCi0jZW5kaWYKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQpAQCAtNTYyLDEwICs1NTgsNyBAQAogICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtb2RlbE1lbW9yeSA9PSAwIHx8IG1vZGVsTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibG9hZFNvdW5kTW9kZWwoKSBtb2RlbE1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKwogICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCA9CiAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKiltb2RlbE1lbW9yeS0+cG9pbnRlcigpOwogCkBAIC02NTksMTEgKzY1Miw2IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKGRhdGFNZW1vcnkgPT0gMCB8fCBkYXRhTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic3RhcnRSZWNvZ25pdGlvbigpIGRhdGFNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIH0KIAogICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKilkYXRhTWVtb3J5LT5wb2ludGVyKCk7CkBAIC03MjUsNiArNzEzLDI1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1IYWxJbnRlcmZhY2UtPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKIHsKICAgICBBTE9HVigib25DYWxsYmFja0V2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwpAQCAtNzU4LDcgKzc2NSwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZWNvZ25pdGlvbkV2ZW50LT5jYXB0dXJlX3Nlc3Npb24gPSBtb2RlbC0+bUNhcHR1cmVTZXNzaW9uOwotICAgICAgICAgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9JRExFOworICAgICAgICAgICAgLy8gRG9uJ3QgcmVzZXQgdGhlIG1vZGVsIHN0YXRlIGlmIHRoaXMgcmVjb2duaXRpb24gZXZlbnQgaXMgYSBnZXQtc3RhdGUgcmVzcG9uc2UKKyAgICAgICAgICAgIGlmIChyZWNvZ25pdGlvbkV2ZW50LT5zdGF0dXMgIT0gUkVDT0dOSVRJT05fU1RBVFVTX0dFVF9TVEFURV9SRVNQT05TRSkgeworICAgICAgICAgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsaWVudHMuYWRkKG1vZGVsLT5tTW9kdWxlQ2xpZW50KTsKICAgICAgICAgfQogICAgIH0gYnJlYWs7CkBAIC05NjYsNiArOTc2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisgICAgaWYgKGNoZWNrSU1lbW9yeShtb2RlbE1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtOTk3LDYgKzEwMTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KGRhdGFNZW1vcnkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKICAgICBpZiAobW9kdWxlID09IDApIHsKQEAgLTEwMjAsNiArMTAzNiwyMSBAQAogICAgIHJldHVybiBtb2R1bGUtPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSkKIHsKICAgICBBTE9HVigiTW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbCAlZCIsIGFjdGl2ZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKaW5kZXggNzA4ZmM5OC4uNDI1OGVjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICBzcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IGhhbEludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxJbnRlcmZhY2U7IH0KICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yKCkgeyByZXR1cm4gbURlc2NyaXB0b3I7IH0KQEAgLTE2OSw2ICsxNzAsNyBAQAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAppbmRleCAyNTMzMmE0Li5mNWI0YjU5IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAgICAgVU5MT0FEX1NPVU5EX01PREVMLAogICAgIFNUQVJUX1JFQ09HTklUSU9OLAogICAgIFNUT1BfUkVDT0dOSVRJT04sCisgICAgR0VUX01PREVMX1NUQVRFLAogfTsKIAogY2xhc3MgQnBTb3VuZFRyaWdnZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPgpAQCAtMTEzLDYgKzExNCwxOCBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01PREVMX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXIsICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXIiKTsKQEAgLTE2OSw2ICsxODIsMTcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTU9ERUxfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldE1vZGVsU3RhdGUoaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKaW5kZXggMjg5YjdiMS4uZDFlYjM2NyAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKQEAgLTE4OCw2ICsxODgsMTUgQEAKICAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogdm9pZCBTb3VuZFRyaWdnZXI6Om9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCiB7Cg==